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

Jendaw

Zitat von: Borkk am 25 August 2021, 23:05:03
Jetzt bin ich fast am Ziel nur eine Sache noch. Wie kann ich denn die Farbe eines Icons aus einem Reading setzen?

so geht es nicht.
iconreading#speak_volume:e_icon#500#150#40#0#[speak_volume:e_color]

Im Reading "e_color" steht je nach status ff0000 oder 00000

Je nach verwendetem Icon könnte ein Workaround sein, es bereits in der gewünschten Farbe in das Hintergrundbild zu malen und dann nur zu übermalen. Passt natürlich nicht immer.
FHEM/RaspberryMatic @RaspPi + nanoCUL 433 + Signalduino 433 + JeeLink-Clone + CC2531 + Slaesh-Stick
IT Funkschalter, HE-Sensoren, TX 29 DTH-IT, HMIP, HM-Wired, zigbee2mqtt
ESPEInk + waveshare 7.5inch_e-Paper_HAT_(B) + ESP8266 (Firmware von https://github.com/Yattien)

Borkk

Zitat von: Jendaw am 26 August 2021, 08:47:12
Je nach verwendetem Icon könnte ein Workaround sein, es bereits in der gewünschten Farbe in das Hintergrundbild zu malen und dann nur zu übermalen. Passt natürlich nicht immer.

Ist das echt die einzige Möglichkeit ?!?!
Docker@DS220+ FHEM, ConBeeII, Homebridge, Nginx ReverseProxy, ConfigDB, MQTT, NodeRed, InfluxDB, Grafana,
Raspberrymatic@Raspi3: HmIP Akt- /Sensoren, Shelly´s, Tibber Puls, Alexa, ASC, Gardena, Netatmo, E-Paper, FritzBox; Tado°, HOMEMODE, iBeacon, OLED ; ESP32/8266, SwitchBot ...

Jendaw

Zitat von: Borkk am 26 August 2021, 10:28:07
Ist das echt die einzige Möglichkeit ?!?!

Nein, es ist eine Möglichkeit. Du könntest auch unterschiedlich gefärbte Icons nehmen, da das jetzt/bald geht (als Workaround, wohlgemerkt).
FHEM/RaspberryMatic @RaspPi + nanoCUL 433 + Signalduino 433 + JeeLink-Clone + CC2531 + Slaesh-Stick
IT Funkschalter, HE-Sensoren, TX 29 DTH-IT, HMIP, HM-Wired, zigbee2mqtt
ESPEInk + waveshare 7.5inch_e-Paper_HAT_(B) + ESP8266 (Firmware von https://github.com/Yattien)

Borkk

Zitat von: Jendaw am 26 August 2021, 10:44:21
Nein, es ist eine Möglichkeit. Du könntest auch unterschiedlich gefärbte Icons nehmen, da das jetzt/bald geht (als Workaround, wohlgemerkt).

Ich habe die Änderungen von hajo23 in ekis Modul eingebaut und ich kann die Icons über den Farbwert in der definition einfärben. Mein Punkt ist eher eine reine Syntaxfrage, ob man in der definition anstelle eines festen Farbwertes auch eine Variable einsetzen könnte.
Docker@DS220+ FHEM, ConBeeII, Homebridge, Nginx ReverseProxy, ConfigDB, MQTT, NodeRed, InfluxDB, Grafana,
Raspberrymatic@Raspi3: HmIP Akt- /Sensoren, Shelly´s, Tibber Puls, Alexa, ASC, Gardena, Netatmo, E-Paper, FritzBox; Tado°, HOMEMODE, iBeacon, OLED ; ESP32/8266, SwitchBot ...

Borkk

Noch eine Info an eki.

Ich habe in deinem dev. Modul mit dem mininterval zusätzlich die Änderungen von hajo23 eingebaut und das ePaper läuft seit 2 Tagen ohne Probleme in Verbindung mit der original Waveshare Firmware.

Ich habe die folgenden Attribute gesetzt:


boardtype: ESP8266
colormode: color
convertmode: dithering
devicetype: 7.5inch_e-Paper_HAT_(B)_HD
interval: 0
maxretries: 0
mininterval: 30


Es kommt sich kein Upload ins gehege und es wird egal wann und wie man einen Event auslöst am Ende der letzte aktuelle Stand dargestellt.

Ich glaube du könntest das Modul so einchecken. 
Docker@DS220+ FHEM, ConBeeII, Homebridge, Nginx ReverseProxy, ConfigDB, MQTT, NodeRed, InfluxDB, Grafana,
Raspberrymatic@Raspi3: HmIP Akt- /Sensoren, Shelly´s, Tibber Puls, Alexa, ASC, Gardena, Netatmo, E-Paper, FritzBox; Tado°, HOMEMODE, iBeacon, OLED ; ESP32/8266, SwitchBot ...

eki

OK, danke für Eure Mithilfe. Das mit dem Lesen der Farben etc. aus Readings ließe sich auch einbauen, mache mit mal Gedanken über eine sinnvolle Syntax. Soll ich das mit den Device spezifischen mininterval Werten auch noch mit reinnehmen?

Borkk

Zitat von: eki am 26 August 2021, 14:28:36
OK, danke für Eure Mithilfe. Das mit dem Lesen der Farben etc. aus Readings ließe sich auch einbauen, mache mit mal Gedanken über eine sinnvolle Syntax. Soll ich das mit den Device spezifischen mininterval Werten auch noch mit reinnehmen?

Das mit den Farben wäre super, auch für "textreading" dann könnte man auch einen Status über die Farbe eines reinen Text darstellen.

Ich hatte zwar die Idee mit den Device spezifischen mininterval, es kommt aber auf deinen Aufand dafür an. Mininterval ist ja nur nötig bei Interval=0 und da genügt auch eine Zeile Erklärung und man kann sich seinen Werte da selbst eintragen. Aber im Grunde wäre es schon sinvoll bei Interval=0 den minintervall automatisch entsprechnd der Hersteller Spec. zu setzen um ein "Überschreiben" des laufenden Uploads zu verhindern. 

Docker@DS220+ FHEM, ConBeeII, Homebridge, Nginx ReverseProxy, ConfigDB, MQTT, NodeRed, InfluxDB, Grafana,
Raspberrymatic@Raspi3: HmIP Akt- /Sensoren, Shelly´s, Tibber Puls, Alexa, ASC, Gardena, Netatmo, E-Paper, FritzBox; Tado°, HOMEMODE, iBeacon, OLED ; ESP32/8266, SwitchBot ...

hajo23

Zitat von: eki am 26 August 2021, 14:28:36
OK, danke für Eure Mithilfe. Das mit dem Lesen der Farben etc. aus Readings ließe sich auch einbauen, mache mit mal Gedanken über eine sinnvolle Syntax. Soll ich das mit den Device spezifischen mininterval Werten auch noch mit reinnehmen?

Das (optionale) Lesen aller Parameter aus dem Reading fände ich auch super. So könnte man neben der Farbe auch die Größe und Position dynamisch gestalten, z.B. für einen Warnhinweis.

hajo23

Zitat von: hajo23 am 24 August 2021, 15:23:13
Die Lösung für das SVG-icon Problems liegt in der Auswertung des alpha-Wertes. Ich musste allerdings auch meine GD-lib updaten.


($r,$g,$b) = $icon_img->rgb($icon_img->getPixel($ix,$iy));                                       # get color values in source file
(my $alpha) = $icon_img->alpha($icon_img->getPixel($ix,$iy));                                    # get alpha-channel
$icon_img->setPixel($ix,$iy,$color) if ($alpha == 0 && $r<180 && $g<180 && $b<180 && $color>0);  # set color to given color if original color is black  *your favorite tresholds may be different


"&& $color>0" kann raus. Das war nur für meine Testphase wichtig.

hajo23

Hallo eki,

wegen der beiden fehlenden Style-Parameter ($s1, $s2) bei addsymbol habe ich folgendes geändert:


if ($definition) { # work on all definitions if definition attribute is defined
   foreach my $line (split(/\n/,$definition)) { # go through the definition line by line
      next if ($line =~ /^\s*\#.*/); # check for comment lines
      my ($type, $text, $x, $y, $size, $ang, $col, $fnt,$linegap,$blockwidth,$docolor,$symstyle1,$symstyle2);
      $type = undef;
      $text = undef;
#     ($type, $text, $x, $y, $size, $ang, $col, $fnt, $linegap, $blockwidth) = split("#",$line);
      ($type, $text, $x, $y, $size, $ang, $col, $fnt, $linegap, $blockwidth,$symstyle1,$symstyle2) = split("#",$line);   # Hajo 3


...

} else {                                                                                                                 # Hajo 3 AddSymbol
   my ($sym,$s1,$s2) = ("","","");
  ($sym,$s1,$s2) = split("-",$text);
  if (!defined $symstyle1) {$s1=""} else {$s1=$symstyle1};                                                               # Hajo 3
  if (!defined $symstyle2) {$s2=""} else {$s2=$symstyle2};                                                               # Hajo 3


Addsymbol wird also erweitert. Damit geht dann z.B. addsymbol#rectangle#0#243#1#0#FF0000#298#100##filled#filled 

*Ich habe bisher nur rectangle und filled im definitionFile getestet.

eki

Zitat von: hajo23 am 27 August 2021, 19:01:38
Hallo eki,

wegen der beiden fehlenden Style-Parameter ($s1, $s2) bei addsymbol habe ich folgendes geändert:


if ($definition) { # work on all definitions if definition attribute is defined
   foreach my $line (split(/\n/,$definition)) { # go through the definition line by line
      next if ($line =~ /^\s*\#.*/); # check for comment lines
      my ($type, $text, $x, $y, $size, $ang, $col, $fnt,$linegap,$blockwidth,$docolor,$symstyle1,$symstyle2);
      $type = undef;
      $text = undef;
#     ($type, $text, $x, $y, $size, $ang, $col, $fnt, $linegap, $blockwidth) = split("#",$line);
      ($type, $text, $x, $y, $size, $ang, $col, $fnt, $linegap, $blockwidth,$symstyle1,$symstyle2) = split("#",$line);   # Hajo 3


...

} else {                                                                                                                 # Hajo 3 AddSymbol
   my ($sym,$s1,$s2) = ("","","");
  ($sym,$s1,$s2) = split("-",$text);
  if (!defined $symstyle1) {$s1=""} else {$s1=$symstyle1};                                                               # Hajo 3
  if (!defined $symstyle2) {$s2=""} else {$s2=$symstyle2};                                                               # Hajo 3


Addsymbol wird also erweitert. Damit geht dann z.B. addsymbol#rectangle#0#243#1#0#FF0000#298#100##filled#filled 

*Ich habe bisher nur rectangle und filled im definitionFile getestet.

So, hier wäre jetzt mal eine Version, die Folgendes enthält:
- Die Änderungen bezüglich Farbe im Icon (es gab zwei Stellen an denen das eingebaut werden musste)
- Die Device spezifischen Intervalle (erst mal sind die Werte so wie in den Listen von Waveshare, eventuell kann man da auch noch ein Sicherheitsmargin dazu addiert werden. Für die Automatik muss das Attribut mininterval auf 'auto' gesetzt werden.
- Die Parameter aus den Readings, dazu muss irgendein Parameter (hoffe ich habe alle erwischt) anstatt direkt, als '[<device>:<reading>]' in eckigen Klammern gesetzt werden, dann holt sich das Modul beim 'set convert' die Daten aus den entsprechenden Readings.

Den oben zitierten Vorschlag habe ich nicht übernommen, weil ich den Sinn nicht so ganz verstehe. Aktuell kann man ein Symbol nach folgendem Beispiel angeben: 'symbol#x#y...', wenn man dabei für das Symbol z. B. rectangle-filled angibt, dann wird ein gefülltes Rechteck gezeichnet. Ich verstehe daher nicht, was da noch fehlt und warum man da was ändern sollte.

Ich bin leider nicht so intensiv zum Testen gekommen, aber dafür habe ich ja Euch  ;).

hajo23

Zitat von: eki am 29 August 2021, 15:00:13
So, hier wäre jetzt mal eine Version, die Folgendes enthält:
- Die Änderungen bezüglich Farbe im Icon (es gab zwei Stellen an denen das eingebaut werden musste)
- Die Device spezifischen Intervalle (erst mal sind die Werte so wie in den Listen von Waveshare, eventuell kann man da auch noch ein Sicherheitsmargin dazu addiert werden. Für die Automatik muss das Attribut mininterval auf 'auto' gesetzt werden.
- Die Parameter aus den Readings, dazu muss irgendein Parameter (hoffe ich habe alle erwischt) anstatt direkt, als '[<device>:<reading>]' in eckigen Klammern gesetzt werden, dann holt sich das Modul beim 'set convert' die Daten aus den entsprechenden Readings.

Den oben zitierten Vorschlag habe ich nicht übernommen, weil ich den Sinn nicht so ganz verstehe. Aktuell kann man ein Symbol nach folgendem Beispiel angeben: 'symbol#x#y...', wenn man dabei für das Symbol z. B. rectangle-filled angibt, dann wird ein gefülltes Rechteck gezeichnet. Ich verstehe daher nicht, was da noch fehlt und warum man da was ändern sollte.

Ich bin leider nicht so intensiv zum Testen gekommen, aber dafür habe ich ja Euch  ;).

Hallo eki,
mein Fehler, weiß der Geier wieso ich rectangle-filled (bzw. rectangle-filled-filled) übersehen habe.  :o

Hast Du bei iconreading ein "next" eingebaut, für den Fall dass iconreading leer ist?

hajo23

Hallo eki,
ein kurzes feedback: bei restart bekomme ich 3 Warnings, die ich vorher auch schon hatte:  :)
*definitionFile unverändert
*Timeout für convert und "next" für eine leeres iconreading musste ich im Modul wieder anpassen, sonst gibt es bei mir leider timeouts und fhem-icons  ;)


PERL WARNING: Use of uninitialized value $type in string eq at ./FHEM/89_ESPEInk.pm line 702. #vorher line 674
PERL WARNING: Use of uninitialized value $text in split at ./FHEM/89_ESPEInk.pm line 610. # vorher line 582
PERL WARNING: Use of uninitialized value $text in split at ./FHEM/89_ESPEInk.pm line 611. # vorher line 583


Bei set convert bekomme ich nun 2 neue Warnings:

2021.08.29 19:50:00 4: Start forked process to convert output picture
2021.08.29 19:50:00 1: PERL WARNING: Use of uninitialized value $value in pattern match (m//) at ./FHEM/89_ESPEInk.pm line 392.
2021.08.29 19:50:00 1: PERL WARNING: Use of uninitialized value $font in pattern match (m//) at ./FHEM/89_ESPEInk.pm line 826.
2021.08.29 19:51:56 4: File /media/m2/ssd/display/displayBackground.png opened, sizes is 880 x 528
2021.08.29 19:52:31 4: Finished conversion in background


Das Ergebnis von convert passt aber. Parameter aus readings muss ich noch testen.

eki

Danke für das schnelle Feedback. Die Warnungen schau ich mir noch mal an, sollte nichts kritisches sein. Kannst Du Deine beiden Änderungen noch mal posten (am Besten Deine Version des pm Files), dann packe ich das dazu.

hajo23

Zitat von: eki am 29 August 2021, 20:55:26
Danke für das schnelle Feedback. Die Warnungen schau ich mir noch mal an, sollte nichts kritisches sein. Kannst Du Deine beiden Änderungen noch mal posten (am Besten Deine Version des pm Files), dann packe ich das dazu.

Das Timeout für convert steht in Zeile 1687: *ein Attribut wäre hier meine Wahl

sub ESPEInk_Convert(@) {
    my ($hash,$upload) = @_;
    if (defined ($hash->{helper}{RUNNING_PID}))
    {
        BlockingKill($hash->{helper}{RUNNING_PID});
        delete( $hash->{helper}{DO_UPLOAD} );
        delete( $hash->{helper}{RUNNING_PID} );
        Log3 $hash, 4, "Killing old forked process";
    }

    unless (defined ($hash->{helper}{RUNNING_PID}))
    {
   $hash->{helper}{DO_UPLOAD} = $upload;
       $hash->{helper}{RUNNING_PID} =
               BlockingCall(
               "ESPEInk_DoConvert",      # callback worker task
               $hash,                    # hash of the device and upload trigger
               "ESPEInk_ConvertDone",    # callback result method
               290,                      # timeout seconds


Wenn icon = "" dann einfach weiter *Zeile 1296

if ($type eq "iconreading" || $type eq "textreading") {
my $eval=0;
($text,$eval) = split("{",$text);
my ($device,$reading) = split(':',$text,2);
$reading = "state" if (!$reading);
$text = ReadingsVal($device,$reading,'');
next if (($type eq 'iconreading') && (length($text) == 0)); # nothing to do, just skip - Hajo  2


update:
Farbwert aus readings-Test:
im definitionFile steht nun:

iconreading#di_DisplayZeit:BueroTischLampe#650#176#18#0#[di_DisplayZeit:BueroTischLampeColor] # mit di_DisplayZeit:BueroTischLampe=light_light_dim_100 und di_DisplayZeit:BueroTischLampeColor=ff0000

voila, das Icon wird wie erwartet rot angezeigt.  :D