Ansteuern der Statusanzeige mit E-Paper-Display aus Script

Problemlösungen und Hinweise von allgemeinem Interesse zur Haussteuerung mit HomeMatic

Moderator: Co-Administratoren

DrTob
Beiträge: 3428
Registriert: 29.10.2010, 08:24
Danksagung erhalten: 6 Mal

Ansteuern der Statusanzeige mit E-Paper-Display aus Script

Beitrag von DrTob » 01.07.2016, 13:49

Wie auch die Statusanzeige mit OLED-Display lässt sich die Statusanzeige mit E-Paper-Display (HM-Disp-EP-WM55) aus einem Script heraus ansprechen. Im Gegensatz zur OLED-Variante gibt es folgende Unterschiede:

1. Die Statusanzeige kann jederzeit angesprochen werden. Man muss nicht auf einen Tastendruck reagieren.
2. Der gesendete Text wird dauerhaft angezeigt.
3. Es können Tonsignale wiedergegeben werden.
4. Die LED kann angesprochen werden.
5. Die erste und letzte Zeile ist fest und kann nicht geändert werden. Es sind nur drei Zeilen ansprechbar.


Zum Ansprechen der Statusanzeige habe ich das alte Script entsprechend angepasst:

Code: Alles auswählen

!! Universalprogramm zum Füllen des HM-Disp-EP-WM55
!! (c) DrTob
!! Version 1.01



! Symbole 
! 0x80 AUS
! 0x81 EIN
! 0x82 OFFEN
! 0x83 geschlossen
! 0x84 fehler
! 0x85 alles ok
! 0x86 information
! 0x87 neue nachricht
! 0x88 servicemeldung


! Zugriff auf vordefinierte Texte
!
! 0x80 Textblock  1
! 0x81 Textblock  2
! 0x82 Textblock  3
! 0x83 Textblock  4
! 0x84 Textblock  5
! 0x85 Textblock  6
! 0x86 Textblock  7
! 0x87 Textblock  8
! 0x88 Textblock  9
! 0x89 Textblock 10


! Tonfolgen 
! 0xC0 AUS
! 0xC1 LANG LANG
! 0xC2 LANG KURZ
! 0xC3 LANG KURZ KURZ
! 0xC4 KURZ
! 0xC5 KURZ KURZ
! 0xC6 LANG

!Signale
! 0xF0 AUS
! 0xF1 Rotes Blitzen
! 0xF2 Grünes Blitzen
! 0xF3 Orangenes Blitzen

!Seriennummer des HM-Disp-EP-WM55.
string seriennummer = "NEQ0000000";

!Variablen für die Texte und Icons
!Nicht verwendete Variablen nicht löschen, sondern auf "" setzen!
!Zeilen-Variablen können 0x80-0x89 für vordefinierte Texte oder bis zu 12 Zeichen Freitext sein. (längere Texte werden abgeschnitten)
string zeile2 = "0x80";
string icon2  = "0x86";

string zeile3 = "Freier Text";
string icon3  = "";

string zeile4 = "";
string icon4  = "";

string signal = "0xF0";

string tonfolge = "0xC0";

! 1 bis 15. 0 = Unendlich
integer wiederholungen = 1;

! es wird zum nächstmöglichen Abstand aufgerundet. Maximum ist 160s.
integer abstand = 10;



!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
! System Routine do not change anything below !
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

string splitter="|";
string msgBuffer = zeile2 # splitter # icon2 # "\t";
msgBuffer = msgBuffer # zeile3 # splitter # icon3 # "\t";
msgBuffer = msgBuffer # zeile4 # splitter # icon4;

string substitutions = "A,0x41\tB,0x42\tC,0x43\tD,0x44\tE,0x45\tF,0x46\tG,0x47\tH,0x48\tI,0x49\tJ,0x4A\tK,0x4B\tL,0x4C\tM,0x4D\tN,0x4E\tO,0x4F\tP,0x50\tQ,0x51\tR,0x52\tS,0x53\tT,0x54\tU,0x55\tV,0x56\tW,0x57\tX,0x58\tY,0x59\tZ,0x5A";
substitutions = substitutions # "\ta,0x61\tb,0x62\tc,0x63\td,0x64\te,0x65\tf,0x66\tg,0x67\th,0x68\ti,0x69\tj,0x6A\tk,0x6B\tl,0x6C\tm,0x6D\tn,0x6E\to,0x6F\tp,0x70\tq,0x71\tr,0x72\ts,0x73\tt,0x74\tu,0x75\tv,0x76\tw,0x77\tx,0x78\ty,0x79\tz,0x7A";
substitutions = substitutions # "\t0,0x30\t1,0x31\t2,0x32\t3,0x33\t4,0x34\t5,0x35\t6,0x36\t7,0x37\t8,0x38\t9,0x39\t ,0x20\t!,0x21\t\",0x22\t%,0x25\t&,0x26\t=,0x27\t(,0x28\t),0x29\t*,0x2A\t+,0x2B\t,,0x2C\t-,0x2D\t.,0x2E\t/,0x2F";
substitutions = substitutions # "\tÄ,0x5B\tÖ,0x23\tÜ,0x24\tä,0x7B\tö,0x7C\tü,0x7D\tß,0x5F\t:,0x3A\t;,0x3B\t@,0x40\t>,0x3E"; 

string bufferLine;
string substEntry;
integer i;
string char;
string line;
string icon;

string command = "0x02,0x0A";
foreach(bufferLine, msgBuffer) {
	line = bufferLine.StrValueByIndex(splitter, 0);
	icon = bufferLine.StrValueByIndex(splitter, 1);
	if ((line <> "") || (icon <> "")) {
		command = command # ",0x12";
		if ((line.Substr(0,2) == "0x") && (line.Length() == 4)) {
			command = command # "," # line;
			i = 12;
		}
		else {
			i = 0;
		}
		while ((i < line.Length()) && (i < 12)) { 
			char = line.Substr(i, 1);	  
			foreach(substEntry, substitutions){
				if (char == substEntry.Substr(0,1)){command = command # substEntry.Substr(1,5);}
			}
			i = i + 1; 
		}
		if (icon <> "") {
			command = command # ",0x13," # icon;
		}
	}
	command = command # ",0x0A";
}

command = command # ",0x14," # tonfolge # ",0x1C,";

if (wiederholungen < 1){
	command = command # "0xDF,0x1D,";
}
else { 
	if (wiederholungen < 11) {
		command = command # "0xD" # (wiederholungen - 1) # ",0x1D,";
	}
	else {
		if (wiederholungen == 11) {
			command = command # "0xDA,0x1D,";
		}
		else {
			if (wiederholungen == 12) {
				command = command # "0xDB,0x1D,";
			}
			else {
				if (wiederholungen == 13) {
					command = command # "0xDC,0x1D,";
				}
				else {
					if (wiederholungen == 14) {
						command = command # "0xDD,0x1D,";
					}
					else {
						command = command # "0xDE,0x1D,";
					}
				}
			}
		}
	}
}


if (abstand <= 10) {
	command = command # "0xE0,0x16,";
}
else {
	if (abstand <= 100) {
		command = command # "0xE" # (abstand - 1 / 10) # ",0x16,";
	}
	else {
		if (abstand <= 110) {
			command = command # "0xEA,0x16,";
		}
		else {
			if (abstand <= 120) {
				command = command # "0xEB,0x16,";
			}
			else {
				if (abstand <= 130) {
					command = command # "0xEC,0x16,";
				}
				else {
					if (abstand <= 140) {
						command = command # "0xED,0x16,";
					}
					else {
						if (abstand <= 150) {
							command = command # "0xEE,0x16,";
						}
						else {
							command = command # "0xEF,0x16,";
						}
					}
				}
			}
		}
	}
}


command = command # signal # ",0x03"; 

dom.GetObject("BidCos-RF." # seriennummer # ":3.SUBMIT").State(command);
Im Script muss die Seriennummer der Statusanzeige eingetragen werden.

für die Zeilen + Icons müssen die entsprechenden Variablen gesetzt werden. Beim text ist entweder ein Freier Text, oder einer der vordefinierten verwendbar. (Für vordefinierte 0x80 bis 0x89 angeben).
Außerdem kann das LED-Signal (Variable "signal") die Tonfolge (Variable "tonfolge") gesetzt werden. Die Verfügbaren Werte sind als Kommentar aufgeführt. Die Variablen "wiederholungen" und "abstand" sind Zahlen, hier können beliebige Werte angegeben werden, es wird auf die im Display verfügbaren umgerechnet.
Zuletzt geändert von DrTob am 02.07.2016, 18:52, insgesamt 1-mal geändert.

Atlantis
Beiträge: 6
Registriert: 04.12.2013, 18:31
Hat sich bedankt: 3 Mal

Re: Ansteuern der Statusanzeige mit E-Paper-Display aus Scri

Beitrag von Atlantis » 02.07.2016, 18:28

Ich habe mein E-Paper-Display gestern erhalten und sofort zusammengebaut. Da ich damit auch Systemvariablen anzeigen wollte, habe ich mich im Forum umgeschaut und bin dann auf diesen Beitrag gestoßen. Mit dem Script konnte ich mein Vorhaben sofort in die Tat umsetzen. Ohne diesen Script hätte ich es alleine nicht geschafft. Vielen Dank somit auch an DrTob für die schnelle Bereitstellung dieses Scripts. :D

Benutzeravatar
vowill
Beiträge: 30
Registriert: 05.06.2016, 18:30
System: Alternative CCU (auf Basis OCCU)
Wohnort: Ortenaukreis, Baden.-W.
Hat sich bedankt: 26 Mal
Danksagung erhalten: 1 Mal

Re: Ansteuern der Statusanzeige mit E-Paper-Display aus Scri

Beitrag von vowill » 02.07.2016, 19:58

Ein schönes Gerät!

Danke an DrTob für das Skript.

Ein Problem habe ich:
Wenn mit dem o. g. Script die Anzeige geändert wurde, dann wird sie nach jedem Tastendruck durch die in der CCU2 abgelegten Geräteparameter wieder überschrieben. Diese Anzeige wird seltsamerweise beim nächsten Tastendruck nicht überschrieben. Nur wenn man die Anzeige per Script ändert, erfolgt beim nächsten Tastendruck wieder das Überschreiben.
--> Ist dies ein Firmware-Fehler, oder kann dies im Script abgestellt werden?

vowill
------------
80 Geräte an der CCU2
RasperryMatic RPi4 mit 3 LAN-Gateways, 1 HMIP-HAP und 170 Geräten. Homematic-IP mit 18 Geräten. Bosch SmartHome Controller. ioBroker auf QNAP mit vis für die Visualisierung an 6 Android-Tablets (mit FullyKioskBrowser)

Benutzeravatar
vowill
Beiträge: 30
Registriert: 05.06.2016, 18:30
System: Alternative CCU (auf Basis OCCU)
Wohnort: Ortenaukreis, Baden.-W.
Hat sich bedankt: 26 Mal
Danksagung erhalten: 1 Mal

Re: Ansteuern der Statusanzeige mit E-Paper-Display aus Scri

Beitrag von vowill » 02.07.2016, 20:35

Und noch ein weiteres Problem:
Ein kurzer Tastendruck führt in einem Programm nicht zu einer Aktion (wohl aber wird das Display mit den in der CCU2 hinterlegten Geräteeinstellungen überschrieben).
--> Dies muss vermutlich im nächsten CCU2-Firmwareupdate behoben werden.

vowill
------------
80 Geräte an der CCU2
RasperryMatic RPi4 mit 3 LAN-Gateways, 1 HMIP-HAP und 170 Geräten. Homematic-IP mit 18 Geräten. Bosch SmartHome Controller. ioBroker auf QNAP mit vis für die Visualisierung an 6 Android-Tablets (mit FullyKioskBrowser)

Dentec
Beiträge: 1
Registriert: 03.07.2016, 13:56

Re: Ansteuern der Statusanzeige mit E-Paper-Display aus Scri

Beitrag von Dentec » 03.07.2016, 14:04

Hallo,

vielen Dank an DrTob für das Beispiel-Skript.

Genau das habe ich gesucht, nachdem ich mit dem Skript für das Oled-Display keinen Erfolg hatte.

Was noch nervt ist das 3-malige Blinken des E-Paper-Display, wenn die Anzeige aktualisiert wird.

Ausserdem kommt man beim Testen und Anpassen des Skriptes sehr schnell an das "DutyCycleLimit" und dann heisst es wieder warten :-(

Dentec
CCU2 mit 32 Geräten - RaspberryPi mit Volkszähler.

inidona
Beiträge: 395
Registriert: 17.09.2013, 18:30
Hat sich bedankt: 1 Mal
Danksagung erhalten: 2 Mal

Re: Ansteuern der Statusanzeige mit E-Paper-Display aus Scri

Beitrag von inidona » 03.07.2016, 21:45

Super Script, dummerweise habe ich jetzt die 200 variabeln überschritten. Jetzt muss ich erstmal umbauen


Gesendet mit Tapatalk

Thialf
Beiträge: 20
Registriert: 25.09.2013, 10:44
Hat sich bedankt: 1 Mal
Danksagung erhalten: 4 Mal

Re: Ansteuern der Statusanzeige mit E-Paper-Display aus Scri

Beitrag von Thialf » 04.07.2016, 21:50

Super, vielen Dank fürs Skript!
Ich hab noch ein paar Performance-Verbesserungen dran gemacht. Die Stringlängenberechnungen muss er pro Zeile ja nur einmalig durchführen und bei der Substitution merkt er sich, ob er das Zeichen schon gefunden hat. Aber trotzdem braucht die Abarbeitung des Skripts noch ganze 7s (vorher 9s), (das Senden ans Display hab ich für die Messung deaktiviert). Immernoch recht viel. Die ganzen Kommentare im Skript benötigen allerdings auch viel Zeit zur Abarbeitung. Das ist schon eine sehr komische und ineffiziente Skriptsprache.
Eigtl. sollte ELV uns eine Funktion ähnlich system.Date zur Verfügung stellen, die die Konvertierung durchführt. Mit einer ordentlichen Programmiersprache sollte das in Millisekunden zu erledigen sein. Wenn ich mal Zeit finde, bau ich ein bash-Script, damit kämen wir vielleicht auf unter eine Sekunde.

Code: Alles auswählen

!! Universalprogramm zum Füllen des HM-Disp-EP-WM55
!! (c) DrTob
!! Version 1.10

string zeile2 = system.Date("%H:%M ");
string icon2  = "0x87";

integer wd = system.Date("%u").ToInteger();
string wdstr;
if (wd == 1){wdstr = "Mo";}
if (wd == 2){wdstr = "Di";}
if (wd == 3){wdstr = "Mi";}
if (wd == 4){wdstr = "Do";}
if (wd == 5){wdstr = "Fr";}
if (wd == 6){wdstr = "Sa";}
if (wd == 7){wdstr = "So";}

string zeile3 = wdstr # system.Date(" %d.%m.%y");
string icon3  = "";

! Symbole
! 0x80 AUS
! 0x81 EIN
! 0x82 OFFEN
! 0x83 geschlossen
! 0x84 fehler
! 0x85 alles ok
! 0x86 information
! 0x87 neue nachricht
! 0x88 servicemeldung

! Zugriff auf vordefinierte Texte
! 0x80 Textblock  1
! 0x81 Textblock  2
! 0x82 Textblock  3
! 0x83 Textblock  4
! 0x84 Textblock  5
! 0x85 Textblock  6
! 0x86 Textblock  7
! 0x87 Textblock  8
! 0x88 Textblock  9
! 0x89 Textblock 10

! Tonfolgen
! 0xC0 AUS
! 0xC1 LANG LANG
! 0xC2 LANG KURZ
! 0xC3 LANG KURZ KURZ
! 0xC4 KURZ
! 0xC5 KURZ KURZ
! 0xC6 LANG
! 0xC7
! 0xC9
! 0xCA

!Signale
! 0xF0 AUS
! 0xF1 Rotes Blitzen
! 0xF2 Grünes Blitzen
! 0xF3 Orangenes Blitzen

!Seriennummer des HM-Disp-EP-WM55.
string seriennummer = "NEQ0000000";

! string temp = dom.GetObject("BidCos-RF.LEQ0000000:1.TEMPERATURE").Value().ToString(1);
string temp = "23.0";
string zeile4 = temp # "C";
string icon4  = "";

string signal = "0xF0";

string tonfolge = "0xC0";

! 1 bis 15. 0 = Unendlich
integer wiederholungen = 2;

! es wird zum naechstmoeglichen Abstand aufgerundet. Maximum ist 160s.
integer abstand = 10;

!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
! System Routine do not change anything below !
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

string splitter="|";
string msgBuffer = zeile2 # splitter # icon2 # "\t";
msgBuffer = msgBuffer # zeile3 # splitter # icon3 # "\t";
msgBuffer = msgBuffer # zeile4 # splitter # icon4;

string substitutions = "A,0x41\tB,0x42\tC,0x43\tD,0x44\tE,0x45\tF,0x46\tG,0x47\tH,0x48\tI,0x49\tJ,0x4A\tK,0x4B\tL,0x4C\tM,0x4D\tN,0x4E\tO,0x4F\tP,0x50\tQ,0x51\tR,0x52\tS,0x53\tT,0x54\tU,0x55\tV,0x56\tW,0x57\tX,0x58\tY,0x59\tZ,0x5A";
substitutions = substitutions # "\ta,0x61\tb,0x62\tc,0x63\td,0x64\te,0x65\tf,0x66\tg,0x67\th,0x68\ti,0x69\tj,0x6A\tk,0x6B\tl,0x6C\tm,0x6D\tn,0x6E\to,0x6F\tp,0x70\tq,0x71\tr,0x72\ts,0x73\tt,0x74\tu,0x75\tv,0x76\tw,0x77\tx,0x78\ty,0x79\tz,0x7A";
substitutions = substitutions # "\t0,0x30\t1,0x31\t2,0x32\t3,0x33\t4,0x34\t5,0x35\t6,0x36\t7,0x37\t8,0x38\t9,0x39\t ,0x20\t!,0x21\t\",0x22\t%,0x25\t&,0x26\t=,0x27\t(,0x28\t),0x29\t*,0x2A\t+,0x2B\t,,0x2C\t-,0x2D\t.,0x2E\t/,0x2F";
substitutions = substitutions # "\tÄ,0x5B\tÖ,0x23\tÜ,0x24\tä,0x7B\tö,0x7C\tü,0x7D\tß,0x5F\t:,0x3A\t;,0x3B\t@,0x40\t>,0x3E";

string bufferLine;
string substEntry;
integer i;
string char;
string line;
string icon;

string command = "0x02,0x0A";
foreach(bufferLine, msgBuffer) {
   line = bufferLine.StrValueByIndex(splitter, 0);
   icon = bufferLine.StrValueByIndex(splitter, 1);
   integer linelength = line.Length();
   integer iconlength = icon.Length();
   if ((linelength > 0) || (iconlength > 0)) {
      command = command # ",0x12";
      if ((linelength == 4) && (line.Substr(0,2) == "0x")) {
         command = command # "," # line;
         i = 12;
      }
      else {
         i = 0;
      }
      if (linelength > 12) {
        linelength = 12;
      }
      while (i < linelength) {
        char = line.Substr(i, 1);   
        boolean b = true;
        foreach(substEntry, substitutions){
          if (b == true){
            if (char == substEntry.Substr(0,1)){
              command = command # substEntry.Substr(1,5);
              b = false;
            }
          }
        }
        i = i + 1;
      }
      if (iconlength > 0) {
         command = command # ",0x13," # icon;
      }
   }
   command = command # ",0x0A";
}

command = command # ",0x14," # tonfolge # ",0x1C,";

if (wiederholungen < 1){
   command = command # "0xDF,0x1D,";
}
else {
   if (wiederholungen < 11) {
      command = command # "0xD" # (wiederholungen - 1) # ",0x1D,";
   }
   else {
      if (wiederholungen == 11) {
         command = command # "0xDA,0x1D,";
      }
      else {
         if (wiederholungen == 12) {
            command = command # "0xDB,0x1D,";
         }
         else {
            if (wiederholungen == 13) {
               command = command # "0xDC,0x1D,";
            }
            else {
               if (wiederholungen == 14) {
                  command = command # "0xDD,0x1D,";
               }
               else {
                  command = command # "0xDE,0x1D,";
               }
            }
         }
      }
   }
}


if (abstand <= 10) {
   command = command # "0xE0,0x16,";
}
else {
   if (abstand <= 100) {
      command = command # "0xE" # (abstand - 1 / 10) # ",0x16,";
   }
   else {
      if (abstand <= 110) {
         command = command # "0xEA,0x16,";
      }
      else {
         if (abstand <= 120) {
            command = command # "0xEB,0x16,";
         }
         else {
            if (abstand <= 130) {
               command = command # "0xEC,0x16,";
            }
            else {
               if (abstand <= 140) {
                  command = command # "0xED,0x16,";
               }
               else {
                  if (abstand <= 150) {
                     command = command # "0xEE,0x16,";
                  }
                  else {
                     command = command # "0xEF,0x16,";
                  }
               }
            }
         }
      }
   }
}

command = command # signal # ",0x03";
dom.GetObject("BidCos-RF." # seriennummer # ":3.SUBMIT").State(command);

BadenPower

Re: Ansteuern der Statusanzeige mit E-Paper-Display aus Scri

Beitrag von BadenPower » 05.07.2016, 09:34

Thialf hat geschrieben:Die Stringlängenberechnungen muss er pro Zeile ja nur einmalig durchführen und bei der Substitution merkt er sich, ob er das Zeichen schon gefunden hat. Aber trotzdem braucht die Abarbeitung des Skripts noch ganze 7s (vorher 9s),
Die 7 Sekunden benötigt das Skript nur, wenn Du es unter Skript testen ausführst. In einem Programm intergriert ist es wesentlich schneller.

Was das parsen des Skriptes langsam macht, dass sind die ellenlangen if..else..if..else Konstrukte, welche man auch mit einer Liste und .StrValueByIndex umgehen könnte.

Xel66
Beiträge: 14967
Registriert: 08.05.2013, 23:33
System: Alternative CCU (auf Basis OCCU)
Wohnort: Nordwürttemberg
Hat sich bedankt: 665 Mal
Danksagung erhalten: 1658 Mal

Re: Ansteuern der Statusanzeige mit E-Paper-Display aus Scri

Beitrag von Xel66 » 05.07.2016, 11:49

BadenPower hat geschrieben:Was das parsen des Skriptes langsam macht, dass sind die ellenlangen if..else..if..else Konstrukte, welche man auch mit einer Liste und .StrValueByIndex umgehen könnte.
Hat jemand Erfahrung, ob dieses mit TCL schneller abläuft? Das geht zwar auch zur Laufzeit über einen Interpreter, aber vielleicht ists schneller!? TCL läuft ja auch der CCU.

Gruß Xel66
-------------------------------------------------------------------------------------------
617 Kanäle in 166 Geräten und 242 CUxD-Kanäle in 45 CUxD-Geräten:
366 Programme, 357 Systemvariablen und 209 Direktverknüpfungen,
RaspberryMatic Version: 3.75.7.20240420 (rpi3) + Testsystem: CCU2 2.61.7
-------------------------------------------------------------------------------------------
Einsteigerthread, Programmlogik-Thread, WebUI-Handbuch, Logging von Programmläufen

zap
Beiträge: 67
Registriert: 05.12.2014, 17:57

Re: Ansteuern der Statusanzeige mit E-Paper-Display aus Scri

Beitrag von zap » 08.07.2016, 18:40

Woher stammen die Infos, die dem Script zugrunde liegen? Gibt es irgendwo eine Doku, wie das Display programmtechnisch angesprochen werden muss?

Antworten

Zurück zu „HomeMatic Tipps & Tricks - keine Fragen!“