Neues Modul: ESPEInk für e-Paper Displays (Name geändert, war ESP8266EInk)

Begonnen von eki, 02 Oktober 2019, 10:24:53

Vorheriges Thema - Nächstes Thema

eki

#15
Na gut, falls es weitere Infos aus dem Betrieb gibt, lass es mich wissen. Ich werde die Version also jetzt mal so im ersten Post "freigeben".

Als Beispiel für dynamische Inhalte siehe die Definition der Wetteranzeige für das 2.9 Inch Display:

  • Basis des Wettermoduls PROPLANTA mit em Devicenamen "AgroWeather" als Lieferanten der Daten
  • per attr testInk url <url> muss noch die IP addresse des ESP Treibers angegeben werden
  • das test_fhem.png file ist unten angehängt und muss ins entsprechende fhem Verzeichnis auf der Platte kopiert werden
  • In dem Beispiel werden true type fonts verwendet (kann man per "sudo apt install ttf-mscorefonts-installer" installieren), auch hier muss eventuell der Pfad angepasst werden)

defmod testInk ESPEInk /opt/fhem/www/images/test_fhem.png

attr testInk convertmode dithering
attr testInk devicetype 2.9inch_e-Paper_Module_(C)

set testInk addtext Wettervorhersage#10#100#12#0#FFFFFF#/usr/share/fonts/truetype/msttcorefonts/arialbd.ttf
set testInk textreading AgroWeather:fc0_date#10#10#12#0#000000#/usr/share/fonts/truetype/msttcorefonts/arialbd.ttf
set testInk iconreading AgroWeather:fc0_weatherDayIcon#170#0#90
set testInk addicon thermometer-full#10#30#25
set testInk addicon thermometer-empty#10#60#25
set testInk textreading AgroWeather:fc0_tempMax#35#32#14#0#000000#/usr/share/fonts/truetype/msttcorefonts/arialbd.ttf
set testInk textreading AgroWeather:fc0_tempMin#35#64#14#0#000000#/usr/share/fonts/truetype/msttcorefonts/arialbd.ttf
set testInk addtext °C#55#32#14#0#000000#/usr/share/fonts/truetype/msttcorefonts/arialbd.ttf
set testInk addtext °C#55#64#14#0#000000#/usr/share/fonts/truetype/msttcorefonts/arialbd.ttf
set testInk addicon tint#90#32#23
set testInk textreading AgroWeather:humidity#115#32#14#0#000000#/usr/share/fonts/truetype/msttcorefonts/arialbd.ttf
set testInk addtext %#150#32#14#0#000000#/usr/share/fonts/truetype/msttcorefonts/arialbd.ttf
set testInk addicon umbrella#90#64#23
set testInk textreading AgroWeather:fc0_chOfRainDay#115#64#14#0#000000#/usr/share/fonts/truetype/msttcorefonts/arialbd.ttf
set testInk addtext %#150#64#14#0#000000#/usr/share/fonts/truetype/msttcorefonts/arialbd.ttf

Icinger

Hab gestern endlich das ESP8266-Treiberboard und ein 7,5"-Waveshare-Display (Gelb/Schwarz/Weiß) bekommen.

Mal die Software auf den ESP geladen und dein Modul installiert.

Jetzt hab ich aber immer folgendes Problem (Egal, ob vom Modul aus oder von der Weboberfläche).
EINMAL kann ich das Display aktualisieren, danach reagiert der ESP nicht mehr. Also auch die Webseite kann nicht mehr geladen werden und läuft in ein Timeout.

Kennt das Problem jemand? Ideen/Lösungsansätze dazu?

lg, Stefan
Verwende deine Zeit nicht mit Erklärungen. Die Menschen hören (lesen) nur, was sie hören (lesen) wollen. (c) Paulo Coelho

Icinger

Also, ich habe das Thema jetzt so gelöst, dass ich im Sourcecode nach jedem Bild-Upload einfach mal den ESP resette. Funktioniert soweit.

Nach ein paar Stunden herumexperimentieren mit dem Modul hier mal ein paar Änderungswünsche / Verbesserungsvorschläge:
1) "set convert" nach Möglichkeit im Hintergrund ausführen. Die Umwandlung dauert auf meinem Cubietruck (der ansonsten recht performant ist) ca. 20-30 Sekunden, in dieser Zeit blockiert FHEM komplett.
2) Statt "set textreading" etc. würde ich EIN Attribut mit :textlong machen, in dem die ganzen Defs sind.
     Bei Änderung des Attributs einfach die Readings neu erstellen. Würde Änderungen immens erleichtern, gerade in der Experimentierphase.
     Ausserdem wären dann die ganzen UserReadings 1-x, 1-y etc. unnötig.
3) Möglichkeit, Texte links/zentriert/rechtsbündig anzuordnen.

Kommen sicher noch einige Vorschläge, falls gewünscht.

Vorerst wären mal 1) und 2) wichtig :)

lg, Stefan

Edit: Noch was ist mir grade aufgefallen:
Ich hab ein Farbdisplay. FHEM speichert die Attribute in alphabetischer Reihenfolge.
Somit bekomm ich beim starten einen Fehler, weil "colormode color" VOR dem Boardtype gesetzt wird.
Verwende deine Zeit nicht mit Erklärungen. Die Menschen hören (lesen) nur, was sie hören (lesen) wollen. (c) Paulo Coelho

Laffer72

Hallo Eki,

tolle Idee. Scheitere aber leider schon bei der Definition. Kann Modul nicht laden.

Wenn ich  ein Reload des Moduls mache kommt folgende Meldung:
Can't locate GD.pm in @INC (you may need to install the GD module) (@INC contains: fhem.p/lib fhem.p/FHEM/lib ./FHEM/lib ./lib ./FHEM ./ /usr/local/FHEM/share/fhem/FHEM/lib . /etc/perl /usr/local/lib/arm-linux-gnueabihf/perl/5.24.1 /usr/local/share/perl/5.24.1 /usr/lib/arm-linux-gnueabihf/perl5/5.24 /usr/share/perl5 /usr/lib/arm-linux-gnueabihf/perl/5.24 /usr/share/perl/5.24 /usr/local/lib/site_perl /usr/lib/arm-linux-gnueabihf/perl-base) at ./FHEM/89_ESPEInk.pm line 8.
BEGIN failed--compilation aborted at ./FHEM/89_ESPEInk.pm line 8.


Php-gd hab ich schon installiert. Muss ich noch was installieren?

Danke schonmal für die Mühe

Reinhard
Raspberry Pi Rev.B, FB7390 (FHEM2FHEM), Sonos, Smarter Coffee
Osram Lightify:2m LED-Streifen, 5m-LED-Streifen, Gartenspot, Surface 28W, Classic E14,E27, Classic RGBW E27, PAR16 GU10, Plug
CUL868:FS20-ST, FS20-DI, FS20-FMS, FS20-ES1
HMUSB:HM-Sec-RHS,HM-Sec-MDIR2
Jeelink868:TX-29-IT, TFA30.315

Icinger

Verwende deine Zeit nicht mit Erklärungen. Die Menschen hören (lesen) nur, was sie hören (lesen) wollen. (c) Paulo Coelho

Laffer72

Raspberry Pi Rev.B, FB7390 (FHEM2FHEM), Sonos, Smarter Coffee
Osram Lightify:2m LED-Streifen, 5m-LED-Streifen, Gartenspot, Surface 28W, Classic E14,E27, Classic RGBW E27, PAR16 GU10, Plug
CUL868:FS20-ST, FS20-DI, FS20-FMS, FS20-ES1
HMUSB:HM-Sec-RHS,HM-Sec-MDIR2
Jeelink868:TX-29-IT, TFA30.315

eki

Zitat von: Icinger am 16 November 2019, 19:50:34
Also, ich habe das Thema jetzt so gelöst, dass ich im Sourcecode nach jedem Bild-Upload einfach mal den ESP resette. Funktioniert soweit.

Nach ein paar Stunden herumexperimentieren mit dem Modul hier mal ein paar Änderungswünsche / Verbesserungsvorschläge:
1) "set convert" nach Möglichkeit im Hintergrund ausführen. Die Umwandlung dauert auf meinem Cubietruck (der ansonsten recht performant ist) ca. 20-30 Sekunden, in dieser Zeit blockiert FHEM komplett.
2) Statt "set textreading" etc. würde ich EIN Attribut mit :textlong machen, in dem die ganzen Defs sind.
     Bei Änderung des Attributs einfach die Readings neu erstellen. Würde Änderungen immens erleichtern, gerade in der Experimentierphase.
     Ausserdem wären dann die ganzen UserReadings 1-x, 1-y etc. unnötig.
3) Möglichkeit, Texte links/zentriert/rechtsbündig anzuordnen.

Kommen sicher noch einige Vorschläge, falls gewünscht.

Vorerst wären mal 1) und 2) wichtig :)

lg, Stefan

Edit: Noch was ist mir grade aufgefallen:
Ich hab ein Farbdisplay. FHEM speichert die Attribute in alphabetischer Reihenfolge.
Somit bekomm ich beim starten einen Fehler, weil "colormode color" VOR dem Boardtype gesetzt wird.

Kannst Du mal Deine Änderung in Source Code hier posten, dann würde ich das mit übernehmen und alle könnten profitieren  ;).

Zu 1) Das ist leicht gesagt. Dazu fällt mir aktuell nur ein, die Konvertierung in ein extra script auszulagern und dann per "system" Kommando aufzurufen (das wäre eine ziemlich große Änderung) oder ein fork (damit habe ich aber keine Erfahrung). Oder hast Du eine andere Idee wie das gehen soll (bin leider auch nicht so der Perl Guru)?
Zu 2) Lässt sich machen, würde ich aber nur als zusätzliche Möglichkeit zur Definition vorsehen und trotzdem die readings belassen. Ansonsten müsste ich das ganze Modul mehr oder weniger neu machen.
Zu 3) Das ist wahrscheinlich der Einfachste von den 3 Wünschen (ist ja wie bei Kinderüberraschung  ;) ). Mache ich bei Gelegenheit.

Ergänzung zu 1). Habe gerade gesehen, dass es da etwas in FHEM gibt (Blocking Modul). Muss ich mir mal genauer anschauen.

Icinger

Hi Eki,

also, zum Thema SourceCode beim ESP. Da hab ich direkt in dem Waveshare-Treiber ein ESP.restart eingefügt:
void EPD_Show()
{
  Serial.println("SHOW");
  // Show results and Sleep
  EPD_dispMass[EPD_dispIndex].show();
  server.send(200, "text/plain", "Show ok\r\n");
  Serial.println("Back from SHOW");
  ESP.restart();
}


Ist also leider nichts, was du im Modul übernehmen könntest.
Eigentlich bin ich absolut gegen solche Holzhammer-Methoden, genauso wie gegen irgendwelche regelmäßigen Reboots von Pi's oder so. Da gehört die Ursache selbst gelöst, nicht das Problem.
Aber aktuell hab ich einfach keine Zeit, mich damit weiter zu beschäftigen.

Zu 1):
Stichwort Non-Blocking-Modul, ja genau. Hab zwar selbst noch nciht damit gearbeitet, ist aber schon ziemlich verbreitet, sollte also problemlos zum laufen zu bekommen sein.

Zu 2) Wenn du die Readings lässt, brauchst du ja nur zusätzlich in der AttrFn auf ein Attribut lauschen, und bei dessen Änderung halt immer die Readings löschen und neu anlegen.
Ist halt einfach vom Bearbeiten her leichter. Ausserdem gilt ja immer der Grundtenor "Attribute gehören den Usern!" :)
Und es ist halt einfacher, EIN Attribut zu ändern, als zig einzelne, um zB Einen Text anders zu formatieren oder so.

lg, Stefan
Verwende deine Zeit nicht mit Erklärungen. Die Menschen hören (lesen) nur, was sie hören (lesen) wollen. (c) Paulo Coelho

eki

Zu 1) läuft bei mir schon war tatsächlich nicht schwer. Wenn ich es ein bisschen getestet habe, füge ich es an.

Icinger

Guten Morgen,

noch einen Vorschlag/Wunsch: ein x-format-Eintrag, um Readings zu formatieren. Im Idealfall mit "eval" ausgewertet, um auch Perl-Code ausführen zu können.
So wie beim FReplacer das "RepxxExpr".

attr fr_EInk Rep03Expr {sprintf("%.1f°C",ReadingsVal("Temp_Aussen","statTemperatureDayMin",0))}

lg, Stefan

Edit: Oder vlt. ganz einfach: Das x-def-Reading mit RegEx auswerten....Wenn in {} eingeschlossen, ists ein Perl-Ausdruck, also mit "eval" behandeln....Andernfalls ists ein Device:Readings-Name, also wie bisher auswerten.
Verwende deine Zeit nicht mit Erklärungen. Die Menschen hören (lesen) nur, was sie hören (lesen) wollen. (c) Paulo Coelho

eki

Zu 2) hätte ich einen Vorschlag. Es gibt ja schon die Readings, die die gesamte Definition enthalten (habe ich dafür angelegt, die Attributbasierten Änderungen zurück zu nehmen, wenn man die Attribute wieder löscht (dann wird das Ganze wieder auf die Startdefinition gesetzt).
Wenn ich nun ein Attribut vorsehen würde das genau diese x-def Werte setzt, wäre das dann entsprechend das, was Du Dir dachtest?

Edit: Ich habe jetzt mal eine Version zum testen angehängt. Kann 1) und 2). Für 2) gibt es ein Attribut "definition" in dem Zeilenweise mit genau der gleichen Syntax wie bei den anderen defs (siehe x-def) Objekte definiert werden können, die dann zusätzlich zu denen, die es bisher gab, dargestellt werden.

Beispiel:

addicon#icoTemp#190#100#12#0#FFFFFF
addtext#Hallo#210#100#12#0#FFFFFF#giant

Icinger

ZitatIch habe jetzt mal eine Version zum testen angehängt. Kann 1) und 2). Für 2) gibt es ein Attribut "definition" in dem Zeilenweise mit genau der gleichen Syntax wie bei den anderen defs (siehe x-def) Objekte definiert werden können, die dann zusätzlich zu denen, die es bisher gab, dargestellt werden.

Cool, genau so war's gemeint :)

lg, Stefan

PS: Empfehlung: Ersetze das Modul im ersten Post, statt die neuere Version in dem Beitrag hier drüber zu posten.
Wenn mal jemand das Modul runterladen will, hat er so immer die aktuellste Version, statt den ganzen Thread durchsuchen zu müssen.
Verwende deine Zeit nicht mit Erklärungen. Die Menschen hören (lesen) nur, was sie hören (lesen) wollen. (c) Paulo Coelho

Icinger

Also, irgendwie klappt das noch nicht, oder ich mach was falsch.

Neues Modul geladen, reload gemacht (Convert im Hintergrund funktioniert)
Die alten Readings alle gelöscht, dann ein
attr EInk definition textreading#Weather2:current_date_time#100#29#12#0#DDFF00#/usr/share/fonts/truetype/msttcorefonts/arialbd.ttf\
iconreading#Weather2:fc1_icon#130#235#90\
textreading#Weather2:HeuteMax#95#247#12#0#000000#/usr/share/fonts/truetype/msttcorefonts/arialbd.ttf\
textreading#Weather2:HeuteMin#35#247#12#0#000000#/usr/share/fonts/truetype/msttcorefonts/arialbd.ttf\
textreading#Weather2:fc1_condition#35#320#12#0#000000#/usr/share/fonts/truetype/msttcorefonts/arialbd.ttf\
textreading#Temp_Aussen:TempText#80#85#28#0#000000#/usr/share/fonts/truetype/msttcorefonts/arialbd.ttf\
textreading#Temp_Aussen:statTemperatureDayMin#75#150#12#0#000000#/usr/share/fonts/truetype/msttcorefonts/arialbd.ttf\
textreading#Temp_Aussen:statTemperatureDayMax#75#165#12#0#000000#/usr/share/fonts/truetype/msttcorefonts/arialbd.ttf\
textreading#myAstro:MoonPhaseS#190#180#12#0#000000#/usr/share/fonts/truetype/msttcorefonts/arialbd.ttf\
textreading#myAstro:SunRise#240#150#12#0#000000#/usr/share/fonts/truetype/msttcorefonts/arialbd.ttf\
textreading#myAstro:SunSet#240#165#12#0#000000#/usr/share/fonts/truetype/msttcorefonts/arialbd.ttf\
textreading#myAstro:MoonRise#320#150#12#0#000000#/usr/share/fonts/truetype/msttcorefonts/arialbd.ttf\
textreading#myAstro:MoonSet#320#165#12#0#000000#/usr/share/fonts/truetype/msttcorefonts/arialbd.ttf\
addicon#weather_moon_phases_3_half#290#150#25\
addicon#weather_sun#210#150#25#0#DDFF00\
textreading#myLuftdaten:pressure#180#120#12#0#000000#/usr/share/fonts/truetype/msttcorefonts/arialbd.ttf

hinzugefügt.

Danach ein Convert angestossen.
Ergebnis siehe Bild. :(
Die Icons werden geladen, aber die textreadings nicht richtig umgewandelt.

lg, Stefan
Verwende deine Zeit nicht mit Erklärungen. Die Menschen hören (lesen) nur, was sie hören (lesen) wollen. (c) Paulo Coelho

eki

ups, ich habe bisher nur addicon und addtext eingebaut. Neue Version folgt und wenn die einigermaßen stabil ist und ich die anderen Sachen auch noch drin habe, ersetze ich natürlich auch den Link im ersten Post.

eki

Angehängte Version müsste jetzt eigentlich auch mit "textreading" und "iconreading" gehen.
Darüber hinaus habe ich die Möglichkeit eingebaut, dass man bei den event basierten Objekten auch ein Format angeben kann (eval auf einen vom Nutzer eingegebenen Text gefällt mir nicht so, das macht jede Menge Türen für komische Dinge auf und ich habe keine Lust da 1000 Prüfungen einzubauen). Man kann jetzt normale Formatierungen wie bei sprintf in "{}" nach dem Reading eingeben also z.B.


textreading#AgroWeather:fc0_tempMax{%.1f °C}#35#32#14#0#000000#C:\Windows\Fonts\arial.ttf


Das mit rechtsbündig/zentriert etc. ist etwas tricky (weil man bei nichtproportionalen Fonts erst mal heraus bekommen muss, wie lang der Text wird, da muss ich noch forschen) und kommt später.