7280 Zeichen
Score aktualisiert
100%
Code: 3347376f863049239e777d749e530fd8
Token in Entwicklung nicht aktualisiert
img-Tag in Entwicklung deaktiviert
Variablen in HomeMatic-Scripten
Die CCU hatte früher ein Limit von maximal 200 Variablen, das mit
Firmware-Version 2.29.18 aufgehoben wurde. Dieses Limit bezog sich auf alle
Variablen, die in allen Scripten verwendet werden. Gemeint sind Variablen,
die direkt im Script definiert werden: object x; object y;
var z;
Wenn Scripte nicht mehr funktionieren und bei der Prüfung unerklärliche
Syntax-Fehler auftreten, sollte versuchsweise dieses Programm wieder gelöscht
oder deaktiviert werden – oder, noch besser, auf die aktuelle
Firmware-Version aktualisiert werden.
Strings in HomeMatic-Scripten
Durch String-Verwendung in HomeMatic-Scripten kann die CCU fehlerhaft arbeiten,
instabil werden oder sogar abstürzen. Grundsätzlich gilt: Je öfter mit Strings
hantiert wird, desto eher führt dies zu Problemen.
Ich empfehle daher, nach Umsetzung dieser Anleitung die CCU unter Beobachtung
zu halten.
String-Verlängerung
In den Scripten auf dieser Seite werden Strings verlängert
(x = x # y).
Dies führt oft zu Störungen bei der Ausführung von Programmen:
- Scripte in Programmen werden nicht mehr ausgeführt
- bei der Fehlerprüfung erscheinen unerklärliche Syntax-Fehler
Durch einen Neustart werden diese Probleme (vorübergehend) behoben. Auch hier
hängt die Dauer, bis es zu Störungen kommt, davon ab, wie häufig diese
Programmschritte ausgeführt werden.
Man hat ja nicht immer Zeit, die WebUI der CCU aufzurufen, um nach aktuellen
Servicemeldungen zu schauen. Darum habe ich mir ein Script gebastelt, das mir täglich die
offenen Servicemeldungen per E-Mail zusendet.
Das WebUI-Programm ist sehr einfach aufgebaut: Täglich um 05:05 wird das Script
ausgeführt. Fertig.
Die gesamte „Intelligenz“ des Programms steckt im Script, das aufgrund der
hinterlegten Meldungen etwas umfangreicher geraten ist.
gesamtes Script markieren / kopieren
! HomeMatic-Script
! SERVICEMELDUNGEN PER E-MAIL SENDEN
! http://www.christian-luetgens.de/homematic/e-mail/servicemeldungen/Servicemeldungen.htm
! PSEUDO-ARRAY FÜR GENERISCHE UND KANALSPEZIFISCHE FEHLER
! Feldtenner der Reihe nach: Tab ? ; = :
string s_servicemeldungen =
"ERROR?" #
"CLIMATECONTROL_VENT_DRIVE=" # ".:Ventil blockiert:Ventil falsch montiert:Stellbereich zu klein:Batterie leer, Störposition angefahren;" #
"MOTION_DETECTOR:ROTARY_HANDLE_SENSOR:SHUTTER_CONTACT=" # ".:.:.:.:.:.:.:Sabotage erkannt;" #
"DIMMER:VIRTUAL_DIMMER=" # ".:.:.:Lastfehler;" #
"WINMATIC=" # ".:Fehler Drehgriff:Fehler Kippantrieb;" #
"KEYMATIC=" # ".:Fehler einkuppeln:Abbruch Motorlauf\t" #
"ERROR_OVERHEAT?" #
".=" # ".:Überhitzung\t" #
"ERROR_OVERLOAD?" #
".=" # ".:Überlast\t" #
"ERROR_REDUCED?" #
".=" # ".:Last zu gering\t" #
"ERROR_POWER?" #
".=" # ".:Stromversorgung ausgefallen\t" #
"ERROR_SABOTAGE?" #
".=" # ".:Sabotage erkannt\t" #
"ERROR_BATTERY?" #
".=" # ".:Batterie defekt\t" #
"STATE?" #
"WATERDETECTIONSENSOR=" # ".:Feuchtigkeit erkannt:Nässe erkannt;" #
"SMOKE_DETECTOR_TEAM=" # ".:Alarm ausgelöst;" #
"SENSOR_FOR_CARBON_DIOXIDE=" # ".:CO2-Belastung erhöht:CO2-Belastung stark erhöht\t" #
"U_SOURCE_FAIL?" #
".=" # "Netzteil ausgefallen\t" #
"USBH_POWERFAIL?" #
".=" # "USB-Host deaktiviert\t" #
"FAULT_REPORTING?" #
".=" # ".:Ventil blockiert:Ventil falsch montiert:Stellbereich zu klein:Kommunikationsfehler:.:Batteriestand niedrig:" #
"Batterie leer, Störposition angefahren\t" #
"LOWBAT?" #
".=" # "Batteriestand niedrig\t" #
"STICKY_UNREACH?" #
".=" # "Kommunikation war gestört\t" #
"UNREACH?" #
".=" # "Kommunikation ist zur Zeit gestört\t" #
"DEVICE_IN_BOOTLOADER?" #
".=" # "Gerät startet neu\t" #
"UPDATE_PENDING?" #
".=" # "Update verfügbar\t" #
"CONFIG_PENDING?" #
".=" # "Konfigurationsdaten stehen zur Übertragung an";
! VARIABLEN ...
! ... DURCH LISTEN ITERIEREN
object o_channel;
object o_dp;
object o_al_item;
string s_al_item;
string s_error_type;
integer i_error_param;
string s_list_1;
string s_list_2;
string s_list_3;
boolean b_found;
! ... MAIL AUFBAUEN
string s_lastdevice;
string s_device;
string s_title;
string s_body;
string s_subj = "Offene Servicemeldungen";
integer i_msgcount = dom.GetObject(41).Value();
! HAUPTPROGRAMM
if (i_msgcount == 0) {
s_body = "Keine Servicemeldungen";
} else {
s_body = i_msgcount # " Servicemeldung(en)";
}
foreach (s_al_item, dom.GetObject(ID_SERVICES).EnumUsedNames()) {
o_al_item = dom.GetObject (s_al_item);
if (o_al_item.AlState() == asOncoming) {
s_error_type = s_al_item.StrValueByIndex (".", 1).StrValueByIndex ("-", 0);
i_error_param = s_al_item.StrValueByIndex (".", 1).StrValueByIndex ("-", 1).ToInteger();
o_dp = dom.GetObject(o_al_item.AlTriggerDP());
o_channel = dom.GetObject (o_dp.Channel());
s_device = o_channel.Name().StrValueByIndex (":", 0);
if (s_device != s_lastdevice) {
s_lastdevice = s_device;
s_title = "\n\n" # s_device;
}
b_found = false;
foreach (s_list_1, s_servicemeldungen) {
s_list_2 = s_list_1.StrValueByIndex ("?", 0);
if (s_list_2 == s_error_type) {
foreach (s_list_2, s_list_1.StrValueByIndex("?", 1).Split(";")) {
s_list_3 = ":" # s_list_2.StrValueByIndex("=", 0) # ":";
if ((s_list_3 == ":.:") || (s_list_3.Find (":" # o_channel.HssType() # ":") != -1)) {
s_list_3 = s_list_2.StrValueByIndex("=", 1).StrValueByIndex(":", i_error_param);
b_found = (s_list_3 != "");
if (b_found) {
s_body = s_body # s_title # "\n " # s_list_3;
s_title = '';
}
}
}
}
}
if (!b_found) {
s_body = s_body # s_title # "\n " # "MESSAGE NOT DEFINED: " # s_error_type # "/" # o_channel.HssType() # "/" # i_error_param;
s_title = '';
}
}
}
dom.GetObject ("E-Mail.Subject").State (s_subj);
dom.GetObject ("E-Mail.Body").State (s_body);
dom.GetObject ("E-Mail.Versand").State (2);
! Ende des Scripts
Wenn Sie Doppelpunkte in Gerätenamen verwenden, funktioniert das Script nicht richtig.
Die CCU liefert den Gerätenamen mit Zusatzinformationen zurück, die durch einen
Doppelpunkt abgetrennt sind. Das Script verwendet daher nur den ersten Teil des
Gerätenamens bis zum (ersten) Doppelpunkt – egal, ob das der Doppelpunkt ist, den Sie
selbst als Gerätenamen vergeben haben, oder der Doppelpunkt, den die CCU zur Trennung der
Namensbestandteile verwendet.
Das Script lässt sich in vier Abschnitte aufteilen.
Definition von Fehlerzuständen und Texten
Um die Programmlogik übersichtlich zu halten, sind die möglichen Fehlerzustände in
einem String definiert.
Es gibt leider keine Arrays in der HomeMatic-Scriptsprache – schon gar keine
multidimensionalen. Darum wurstele ich hier mit verschiedensten Trennzeichen herum, um die
Pseudo-Arrays voneinander zu trennen.
Der Aufbau ist immer gleich: Zunächst wird ein Datenpunkt definiert. Hat dieser bei
verschiedenen Kanälen unterschiedliche Bedeutung, folgt die Definition der Kanäle sowie
die zugehörigen Fehlertexte. Universelle Fehlermeldungen kommen ohne Kanaldefinition aus.
Variablen können in HomeMatic-Scripten überall definiert werden. Ich fasse sie der
Übersichtlichkeit halber dennoch zusammen.
Im Hauptprogramm wird der E-Mail-Text zusammengestellt.
Zunächst wird die Anzahl der Servicemeldungen zum Body hinzugefügt. Danach werden
alle Servicemeldungen der Reihe nach abgearbeitet und die zugehörigen Fehlertexte
herausgesucht.
Wenn kein Fehlertext gefunden wird, wird die Rohfassung der Servicemeldung ausgegeben –
„MESSAGE NOT DEFINED“ in der Status-E-Mail ist ein deutlicher Hinweis darauf,
dass im Pseudo-Array was fehlt.
Am Ende wird die E-Mail an das Mini-Framework
übergeben und als Status-E-Mail versendet.
Die Servicemeldungen werden von der CCU nach Geräten sortiert – zumindest scheint das
recht zuverlässig so zu sein. Ich mache mir das zu Nutze und gruppiere die
Servicemeldungen entsprechend.
Bei meiner gut gefüllten CCU 2 dauert die Bearbeitung von 10 Servicemeldungen rund 3-4
Sekunden. Die CCU 1 könnte hier leicht an ihre Grenzen stoßen.
Das Script kann auch im Script-Parser getestet werden, um zu sehen, ob es in
annehmbarer Zeit abgearbeitet wird.