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

Offline Jendaw

  • Full Member
  • ***
  • Beiträge: 111
    • Alternative ESPEInk-Firmware
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)

Offline Borkk

  • Full Member
  • ***
  • Beiträge: 464
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 ?!?!
2xDocker@Raspi4: FHEM1 (Main) / FHEM2 (Connect)/ ConBeeII / Homebridge / Nginx ReverseProxy / ConfigDB / DBLog / Grafana usw.
Raspberrymatic@Raspi3: div. HmIP Akt- und Sensoren
Alexa; ASC; Gardena; Netatmo; Withings; Pioneer; LG; Harmony; FritzBox; Tado°; HOMEMODE; iBeacon, OLED ; ESP8266 ...

Offline Jendaw

  • Full Member
  • ***
  • Beiträge: 111
    • Alternative ESPEInk-Firmware
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).
« Letzte Änderung: 26 August 2021, 10:46:18 von Jendaw »
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)

Offline Borkk

  • Full Member
  • ***
  • Beiträge: 464
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.
2xDocker@Raspi4: FHEM1 (Main) / FHEM2 (Connect)/ ConBeeII / Homebridge / Nginx ReverseProxy / ConfigDB / DBLog / Grafana usw.
Raspberrymatic@Raspi3: div. HmIP Akt- und Sensoren
Alexa; ASC; Gardena; Netatmo; Withings; Pioneer; LG; Harmony; FritzBox; Tado°; HOMEMODE; iBeacon, OLED ; ESP8266 ...
Zustimmung Zustimmung x 1 Liste anzeigen

Offline Borkk

  • Full Member
  • ***
  • Beiträge: 464
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. 
2xDocker@Raspi4: FHEM1 (Main) / FHEM2 (Connect)/ ConBeeII / Homebridge / Nginx ReverseProxy / ConfigDB / DBLog / Grafana usw.
Raspberrymatic@Raspi3: div. HmIP Akt- und Sensoren
Alexa; ASC; Gardena; Netatmo; Withings; Pioneer; LG; Harmony; FritzBox; Tado°; HOMEMODE; iBeacon, OLED ; ESP8266 ...

Offline eki

  • Developer
  • Hero Member
  • ****
  • Beiträge: 1407
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?

Offline Borkk

  • Full Member
  • ***
  • Beiträge: 464
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. 

 
« Letzte Änderung: 26 August 2021, 14:56:00 von Borkk »
2xDocker@Raspi4: FHEM1 (Main) / FHEM2 (Connect)/ ConBeeII / Homebridge / Nginx ReverseProxy / ConfigDB / DBLog / Grafana usw.
Raspberrymatic@Raspi3: div. HmIP Akt- und Sensoren
Alexa; ASC; Gardena; Netatmo; Withings; Pioneer; LG; Harmony; FritzBox; Tado°; HOMEMODE; iBeacon, OLED ; ESP8266 ...

Offline hajo23

  • New Member
  • *
  • Beiträge: 45
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.

Offline hajo23

  • New Member
  • *
  • Beiträge: 45
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.

Offline hajo23

  • New Member
  • *
  • Beiträge: 45
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.

Offline eki

  • Developer
  • Hero Member
  • ****
  • Beiträge: 1407
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  ;).
« Letzte Änderung: 29 August 2021, 15:03:11 von eki »

Offline hajo23

  • New Member
  • *
  • Beiträge: 45
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?
« Letzte Änderung: 29 August 2021, 16:22:52 von hajo23 »

Offline hajo23

  • New Member
  • *
  • Beiträge: 45
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.

Offline eki

  • Developer
  • Hero Member
  • ****
  • Beiträge: 1407
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.

Offline hajo23

  • New Member
  • *
  • Beiträge: 45
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
« Letzte Änderung: 29 August 2021, 23:24:53 von hajo23 »