In einem anderen Thread hatte ich die Möglichkeit schon gepostet, wie man den Auslöser eine zusammengeklicktem Programmes herausfindet.
Um die Übersicht zu wahren und weil ich das Script einwenig weiter entwickelt habe, hier eine zusammenfassende Anleitung unter Tipps & Tricks
Ich hoffe es ist würdig genug.
Neu in 0.99
- Bug beseitigt, wenn der Wert des Auslösers innerhalb des Programms vor Ausführung des Scriptes geändert wurde
- Danke an BadenPower für die Mail
Gerade, wer nicht so richtig mit der Logik der Programme zu Recht kommt, oder wer sich über mysteriöse Auslösungen seiner zusammengeklickten Programme wundert, erhält hier eine Möglichkeit seine Programme zu überprüfen. Da das Script auch den namen des Programmes mitloggt, kann man natürlich nicht nur ein Programm auf die Art überprüfen. Die Systemvariable bleibt dieselbe, einfach das Script in ein weiteres Programm einfügen.
Leider lässt die Klickibunti keine Filterung an der Stelle zu. Aber die Exportierenfunktion eröffnet da viele Wege.
Benutzung:
1. wir legen ein Systemvariable Typ: Zeichenkette an mit dem Namen: Programme_loggen in der Klickibunti an
2. wir benutzen den Haken protokolliert bei dieser Systemvariable
3. Wir fügen das nachfolgende Script in irgendeinen Programmablauf ein, den wir protokolliert haben wollen. Dabei ist es völlig unerheblich, was da so als möglicher Auslöser des Programmes zusammengeklickt wurde.
Nur zur Verdeutlichung habe hier ein sinnloses Programm zusammengeklickt:
die Zeile
string slist = " DANN ";
sollte noch auf
string slist = " SONST ";
angepasst werden, wenn man das Script im SONST bzw. im DANN eines Programmes einbaut. Man sollte es auch in allen Zweigen einbauen.
4. Am Script sind keine Änderungen ausser oberhalb ++++ Finger weg +++++ nötig - kopieren - einfügen - fertig
Code: Alles auswählen
! mit Programmname, Auslöser, Auslösewert und (Einheit falls vorhanden) und Zeit in Stringvariable schreiben
! v 1.00 (c) by alchy
! https://homematic-forum.de/forum/viewtopic.php?f=31&t=35686
! +++++++++++++++++
string slist = " DANN ";
string sysvarOut = "Programme_loggen"; ! Name Systemvariable Typ Zeichenkette zum Speichern der Ausgabe - auf Protokolliert stellen = Speicherung im Systemprotokoll
string sThis = "$this$";string sSrc = "$src$";string sVal = "$val$";object oThisPrg;object oSrc;string oSrcValue =" unbekannt";
if((sThis <> "") && (sThis <> "$" # "this" # "$")){
slist = slist # "Prg-ID: " # sThis; oThisPrg = dom.GetObject(sThis);
if(oThisPrg) {
if(oThisPrg.Type() == OT_PROGRAM) {
slist = slist # " / Prg-Name: " # oThisPrg.Name();
}else{ slist = slist # " / Prg durch anderes Objekt ersetzt";}
}else{ slist = slist # " / Prg geloescht"; }
if((sSrc <> "") && (sSrc <> "$" # "src" # "$")) {
slist = slist # " / Src-ID: " # sSrc;
oSrc = dom.GetObject(sSrc);
if(oSrc){ slist = slist # " / Src-Name: " # oSrc.Name();
}else{ slist = slist # " / Src geloescht"; }
slist = slist # " / Wert: " # sVal #" = "#oThisPrg.Name() #" ";
if(oSrc.TypeName() == "HSSDP") {
if ( (oSrc.ValueTypeStr() == "Float") || (oSrc.ValueTypeStr() == "Scaling") ) {oSrcValue = (sVal).ToString(2) #" "#oSrc.ValueUnit();}
if ( (oSrc.HssType() == "PRESS_SHORT") || (oSrc.HssType() == "PRESS_LONG") ) { oSrcValue = oSrc.HssType();}
if (oSrc.HssType() == "MOTION") { if (sVal == "1") { oSrcValue = "Bewegung erkannt"; } elseif (sVal == "0") {oSrcValue ="keine Bewegung";} }
if ( (oSrc.ValueTypeStr() == "Binary") && (dom.GetObject(((dom.GetObject(oSrc)).Channel())).HssType() == "SHUTTER_CONTACT") ) {
if (sVal == "1") { oSrcValue = "offen"; } elseif (sVal == "0") {oSrcValue ="geschlossen";} }
if (oSrc.ValueTypeStr() == "Binary") { if (sVal == "1") { oSrcValue = "ein"; } elseif (sVal == "0") {oSrcValue ="aus";} }
if (oSrc.ValueTypeStr() == "Integer") {oSrcValue = (sVal) #" "#oSrc.ValueUnit();}
if ( (oSrc.ValueTypeStr() == "Integer") && (dom.GetObject(((dom.GetObject(oSrc)).Channel())).HssType() == "SHUTTER_CONTACT") ) {
if (sVal == "1") { oSrcValue = "offen"; } elseif (sVal == "0") {oSrcValue ="geschlossen";} }
if ( (oSrc.ValueTypeStr() == "Integer") && (dom.GetObject(((dom.GetObject(oSrc)).Channel())).HssType() == "ROTARY_HANDLE_SENSOR") ) {
if (sVal == "0" ) { oSrcValue = "geschlossen"; }
if (sVal == "1" ) { oSrcValue = "gekippt"; }
if (sVal == "2" ) { oSrcValue = "offen"; } }
if ( (dom.GetObject(((dom.GetObject(oSrc)).Channel())).HssType() == "WATERDETECTIONSENSOR") || (dom.GetObject(((dom.GetObject(oSrc)).Channel())).HssType() == "WATER_DETECTION_TRANSMITTER") ) {
if (sVal == "0" ) { oSrcValue = "trocken"; }
if (sVal == "1" ) { oSrcValue = "feucht"; }
if (sVal == "2" ) { oSrcValue = "nass"; } }
if ( (dom.GetObject(((dom.GetObject(oSrc)).Channel())).HssType() == "HEATING_CLIMATECONTROL_TRANSCEIVER") || (dom.GetObject(((dom.GetObject(oSrc)).Channel())).HssType() == "CLIMATECONTROL_RT_TRANSCEIVER") || (dom.GetObject(((dom.GetObject(oSrc)).Channel())).HssType() == "THERMALCONTROL_TRANSMIT") ){
if (sVal == "0" ) { oSrcValue = "AUTO"; }
if (sVal == "1" ) { oSrcValue = "MANU"; }
if (sVal == "2" ) { oSrcValue = "URLAUB"; }
if (sVal == "3" ) { oSrcValue = "BOOST"; }}
slist = slist #"Geraet: "#(dom.GetObject((dom.GetObject(dom.GetObject(oSrc).Channel())).Device())).Name() #" durch Kanal: " #(dom.GetObject(dom.GetObject(oSrc).Channel())).Name() #" "#(dom.GetObject(dom.GetObject(oSrc).Channel())).HssType() #" mit DP: "#oSrc.HssType() #" und dem Wert: "#oSrcValue #" am: "#system.Date("%d.%m. %H:%M Uhr");
}elseif(oSrc.TypeName() == "VARDP") {
if (oSrc.ValueType() == ivtBinary) { oSrcValue = oSrc.ValueName() ;}
if (oSrc.ValueSubType() == istGeneric) {oSrcValue = (sVal).ToString(1)#" "#oSrc.ValueUnit(); if (sVal == "") { oSrcValue = "0"; }}
if (oSrc.ValueSubType() == istEnum) { oSrcValue = web.webGetValueFromList(oSrc.ValueList(),sVal)#" "#oSrc.ValueUnit();}
if (oSrc.ValueSubType() == istChar8859) {oSrcValue = sVal;}
slist = slist #" durch Systemvariable: " #oSrc.Name()#" mit dem Wert: "#oSrcValue;
}
elseif ( (oSrc.TypeName() == "ALARMDP") && (oSrc.ValueType() == ivtBinary) ) { oSrcValue = oSrc.ValueName() ;
slist = slist #" durch Alarm: " #oSrc.Name()#" mit dem Wert: "#oSrcValue #" am: "#system.Date("%d.%m. %H:%M Uhr");
}elseif(oSrc.TypeName() == "CALENDARDP"){
if (oSrc.ValueTypeStr() == "Binary") { if ( sVal ) { oSrcValue = "Zeitpunkt erreicht"; }else{ oSrcValue = "Zeitpunkt nicht erreicht";}}
slist = slist #" durch: " #oSrc.Name()#" mit dem Wert: "#oSrcValue #" am: "#system.Date("%d.%m. %H:%M Uhr");
}
}else{
slist = slist # " / kein Ausloeser";
if(sVal == ""){ slist = slist # " = nach CCU-Reboot (ReGaHss Neustart) oder durch Aktivieren gestartet"; }
else{
if(sVal == "1") { slist = slist # " = manuell oder per .ProgramExecute() oder per .State(1) gestartet";}
else{ slist = slist # " = Wert: " # sVal;}
}
slist = slist # " = " # sVal;
}
}else{
slist = "Das Script: Programmausloeser egal welchen Types... wurde nicht in einem Programm ausgefuehrt am: "#system.Date("%d.%m. %H:%M Uhr");
WriteLine(slist);
}
if ( (dom.GetObject(ID_SYSTEM_VARIABLES)).Get(sysvarOut) ) { dom.GetObject(ID_SYSTEM_VARIABLES).Get(sysvarOut).State( slist ); }
}
Erweiterung
will man die Ausgabe des Scriptes z.B. um die Versendung der Ausgabe per Telegramm erweitern, hängt man einfach ganz am Ende des Scriptes noch folgende Zeilen an:
Code: Alles auswählen
! Versand über Telegram mit wget und system.exec
string chatid = "xxxxxxxxx";
string botAPI = "XXXXXXXXXXXXXXXXXXXXXXX";
var url = "https://api.telegram.org/bot"#botAPI#"/sendMessage?chat_id="#chatid#"&parse_mode=html&text="#slist.ToUTF8();
system.Exec("wget -q -O - '"#url#"' &");
Code: Alles auswählen
! Versand über Pushover mit wget und system.exec
var USERKEY = "xxxxxxxxxxxxxxxxxxxx";
var TOKEN = "XXXXXXXXXXXXXXXX";
system.Exec("wget --no-check-certificate --post-data 'token='"#TOKEN#"'&user='"#USERKEY#"'&message="#slist.ToLatin().UriEncode() #"' -O - https://api.pushover.net/1/messages" );
oder eben auch per mail
Code: Alles auswählen
if(slist!="") { dom.GetObject(ID_DATAPOINTS).Get("CUxD.CUX2801001:1.CMD_EXEC").State("/etc/config/addons/email/email 01 '"#slist# "'"); }
Code: Alles auswählen
system.Exec("/etc/config/addons/email/email 01"#" &");
UND
das im TCL Reiter die folgende Zeile
Code: Alles auswählen
set serviceliste [encoding convertfrom utf-8 [lindex $argv 1]]
Code: Alles auswählen
Mit Parameter vom Script übergeben:
$serviceliste
usw.
Alchy