! Servicemeldungen auslesen und weiter verarbeiten zusammengetragen von Alchy & dtp
! v1.1
! Zum Benutzen: Neues Programm in der CCU wie folgt erstellen:
! WENN Systemzustand: Servicemeldungen im Wertebereich größer als 0 bei Aktualisierung auslösen
! DANN mit einer Sekunde Verzögerung Skript (und dann dieses Script komplett einfügen und mit o.k. bestätigen
! In den ersten Zeilen des Scriptes Setup durchführen !
! ++++++ Allgemeine Infos ++++++ UTF8
! Servicemeldungen bei Kommunikationsstörungen "war gestört" wird durch das Script bestätigt (konfigurierbar)
! Im Falle einer Batterieleermeldung, wird der Gerätename und der Batterietyp sowie die Anzahl der Batterien ,
! sonst bei einer anderen Servicemeldung wird der Gerätename und der Fehler (übersetzt) entweder
! ausgegeben / in Variable gespeichert / per prowl / pushover versendet und / oder per Mail verschickt
! das Ganze sollte sowohl als auch funktionieren.
! Bitte Infos bei den Setup durchlesen und beachten, im Zweifelsfalle einfach nachfragen.
! +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
! ++++++ ToDo ++++++
! Fehlermeldungen - Batterietypen aktualisieren
! prio für prowl und pushover besser integrieren
!++++++ SETUP ++++++
! Bitte in Ruhe die nächsten Zeilen durcharbeiten
var WITHTIME = "ja"; ! Wenn ja, wird die Alarmzeit Zeit mitgesendet
! +++++ Servicemeldungen "Kommunikation war gestört" bestätigen? ++++++
var ACCK = "ja"; ! ja oder nein, um anstehende "war Kommunikationsstörungen" zu bestätigen
! HM Gerät, wessen Systemmeldungen nicht verschickt werden sollen
var BLOCK = "JEQ012345678";
!++++++ PUSHBULLET +++++++++
var USE_PUSHBULLET = "nein"; ! ja oder nein für die Verwendung PUSHBULLET direkt im Script;
var USER ="++++++++++++++++++++"; ! selbsterklärend
var DEVICE_IDEN = "+++++++++++++++++++";
var PUSHBULLET_CUXD_ID = "CUX2801001:4"; !welches CUXD.EXEC Gerät mit Kanal soll verwendet werden ?
var TITEL = "Homematic"; !kann jeder nennen wie er will
!++++++ Prowl Setup fuer die Apfeljünger +++++++++
! 1. Prowl einrichten ( http://homematic-forum.de/forum/viewtopic.php?f=19&t=7797 )
! 2. cuxd Installation erforderlich
var USE_PROWL = "nein"; ! ja oder nein für die Verwendung prowl direkt im Script;
var API_KEY ="DEIN API KEY"; ! selbsterklärend
var PROWL_CUXD_ID = "CUX2801001:3"; !welches CUXD.EXEC Gerät mit Kanal soll verwendet werden ?
var ANWENDUNG = "Homematic"; !kann jeder nennen wie er will
var KATEGORIE ="Servicemeldung"; !kann jeder nennen wie er will
var TIME_OUT = "10";
!+++++++ Pushover Setup ++++++
! 1. pushover einrichten ( http://homematic-forum.de/forum/viewtopic.php?f=31&t=11579 )
! 2. cuxd Installation erforderlich
var USE_PUSHOVER = "nein"; ! das Übliche
var PUSH_CUXD_ID = "CUX2801001:2"; !welches CUXD.EXEC Gerät mit Kanal soll verwendet werden ?
var USERKENNUNG = "++++++++++++++++++++++";
var TOKEN = "+++++++++++++++++++++";
var USERDEVICE = ""; ! welches eingerichtete Gerät soll die Meldung bekommen? leer = alle Geräte sonst Namen komma separiert
var RETRY = "30"; !wiederholungen des Alarm bei prio >1
var EXPIRE = "120"; ! wie lange bis verfällt
var SOUND = "siren"; !Sound nach wahl siehe "https://pushover.net/api#sounds"
var HTML ="1"; ! 1 use html codes at the message
var PRIO = "1";
var PRIO_MAX = "-2"; ! siehe http://homematic-forum.de/forum/viewtopic.php?f=31&t=24618&start=530#p288205
!+++++++ Setup Mail verschicken mit CUXD und Emailaddon ++++++
! 1. CUXD incl. exec Gerät sind installiert ( http://homematic-forum.de/forum/viewtopic.php?f=37&t=15298 )
! 2. Mailaddon ist installiert eingestellt und funktioniert ( http://www.homematic-inside.de/software/email )
! 3. Im TCL Reiter im MailAddon wird als erste Zeile "set serviceliste [encoding convertfrom utf-8 [lindex $argv 1]]" ohne Anführungsstriche eingegeben
! 4. in Mailvorlage Nr deiner Wahl wird "$serviceliste" ohne Anführungsstriche im Mailtextfeld eingegeben (was da noch steht ist uninteressant)
var USE_MAIL = "nein"; ! ja / nein schicken einer Mail direkt über das Script
var MAIL_ID = "01"; ! die VORHER präparierte Mailvorlage 01 - 50 in der aktuellen Version des mailaddon
var MAIL_CUXD_ID = "CUX2801001:1"; ! die Serial des EXEC Geräte - wer nicht weiss was ich meine, einfach so lassen ist die Standard
!+++++++ Systemvariablen Setup ++++++
! 1. Vor Benutzung Systemvariable vom Typ Zeichenkette in CCU anlegen,
var USE_SYSVAR = "ja"; ! ja / nein Speichern der Ausgabe des Scriptes in Systemvariable
var SYSVAR_NAME = "AlchySysVar1"; ! hier den Namen dieser Variablen eintragen
!+++++++ Eigentlich schon fertig mit dem Setup +++++++++++
!+++++ Batteriezuweisungen inklusive Anzahl !Bitte helfen und fehlende Geräte posten ++++++++++++++++
!+++++ noch nicht integrierte Geräte werden mit unbekannt ausgegeben ++++++++++++++++
string cr2016 = "HM-RC-4\tHM-RC-4-B\tHM-RC-Sec3\tHM-RC-Sec3-B\tHM-RC-P1\tHM-RC-Key3\tHM-RC-Key3-B\tZEL_STG_RM_HS_4";
string cr2032 = "HM-SCI-3-FM\tHM-PBI-4-FM\tHM-PB-2-WM\tHM-SwI-3-FM\tHM-PBI-4-FM\tHM-Sec-TiS";
string lr14x2 = "HM-Sec-Sir-WM\tHM-OU-CFM-TW";
string lr44x2 = "HM-Sec-SC\tHM-Sec-SC2\tHM-Sec-SC-2\tHM-Sec-RHS";
string lr6x2 = "HM-CC-VD\tHM-CC-RT-DN\tHM-Sec-WDS\tHM-Sec-WDS-2\tHM-CC-TC\tHM-Dis-TD-T\tHB-UW-Sen-THPL-I\tHM-TC-IT-WM-W-EU\tHM-WDS40-TH-I\tHM-WDS40-TH-I-2\tHM-WDS10-TH-O\tHmIP-SMI\tHMIP-eTRV\tHM-WDS30-OT2-SM-2";
string lr6x3 = "HM-Sec-MDIR\tHM-Sec-MDIR-2\tHM-Sec-SD\tHM-Sec-Key\tHM-Sec-Key-S\tHM-Sec-Key-O\tHM-Sen-Wa-Od\tHM-Sen-MDIR\tHM-Sen-MDIR-O\tHM-Sen-MDIR-O-2\tHM-WDS100-C6-O\tHM-WDS100-C6-O-2";
string lr6x4 = "HM-ES-TX-WM\tHM-CCU-1";
string lr3x1 = "HMIP-SWDO\tHM-Sec-SCo\tHM-RC-4-2\tHM-RC-Key4-2\tHM-RC-Sec4-2\tHmIP-KRCA\tHMIP-SWDO";
string lr3x2 = "HM-Dis-EP-WM55\tHM-PB-6-WM55\tHM-Sen-MDIR-WM55\tHM-PBI-2-FM\tHM-RC-8\tHM-Sen-DB-PCB\tHB-UW-Sen-THPL-O\tHM-Sen-EP\tHM-WDS30-T-O\tHM-WDS30-OT2-SM\tHM-TC-IT-WM-W-EU\tHM-Dis-WM55\tHM-PB-2-WM55\tHM-PB-2-WM55-2\tHM-Sen-MDIR-SM\tHMIP-WTH\tHMIP-WRC2";
string lr3x3 = "HM-PB-4Dis-WM\tHM-Sen-LI-O";
string lr3x3a = "HM-RC-19\tHM-RC-19-B\tHM-RC-12\tHM-RC-12-B\tHM-RC-12-W";
string block9 = "HM-LC-Sw1-Ba-PCB\tHM-LC-Sw4-PCB\tHM-MOD-EM-8\tHM-MOD-Re-8\tHM-Sen-RD-O\tHM-OU-CM-PCB\tHM-LC-Sw4-WM";
!+++++++++ Setup nun aber wirklich zu Ende - ab hier Finger weg ;-) ++++++++++++++++++
! var SM_neu = dom.GetObject(41).Value();
! var SM_alt = dom.GetObject(41).LastValue();
string slist = "";
if (dom.GetObject(41).Value() > dom.GetObject(41).LastValue()) { boolean GO = true; string slist = "NEUE SERVICEMELDUNG:"; } else { string slist = "ALTE Servicemeldung:";}
var zaehler = 0;
! ausgelagert: Quittieren der war gestört Meldungen
object oTmpArray = dom.GetObject(ID_SERVICES);
if(oTmpArray) {
string sTmp;
string sdev;
string sdesc;
string styp;
foreach(sTmp, oTmpArray.EnumIDs()) {
object oTmp = dom.GetObject(sTmp);
if (oTmp){
if(oTmp.IsTypeOf(OT_ALARMDP) && (oTmp.AlState() == asOncoming)) {
var trigDP = dom.GetObject(oTmp.AlTriggerDP());
var ch = dom.GetObject(trigDP.Channel());
var sdev = dom.GetObject(ch.Device());
var ival = trigDP.Value();
var sdesc = trigDP.AlDestMapDP().Name().StrValueByIndex(".", 2);
if ((sdesc == "STICKY_UNREACH") && (ACCK == "ja")) { oTmp.AlReceipt();}
} } } }
! Ende Auslagerung war gestört Meldung
! wird ab 1.0 immer abgearbeitet
foreach(sTmp, oTmpArray.EnumIDs()) {
object oTmp = dom.GetObject(sTmp);
if (oTmp) {
if(oTmp.IsTypeOf(OT_ALARMDP) && (oTmp.AlState() == asOncoming)) {
var trigDP = dom.GetObject(oTmp.AlTriggerDP());
var ch = dom.GetObject(trigDP.Channel());
var sdev = dom.GetObject(ch.Device());
var ival = trigDP.Value();
var stime = ch.LastTimestamp().ToString("%d.%m.%y %H:%M Uhr");
var sdesc = trigDP.AlDestMapDP().Name().StrValueByIndex(".", 2);
var serial = (trigDP.AlDestMapDP().Name().StrValueByIndex(".", 1)).StrValueByIndex(":", 0);
if (!serial == BLOCK) {
! Übersetzen der Fehlermeldungen
if (sdesc == "CONFIG_PENDING") {sdesc = "Konfigurationsdaten stehen zur Übertragung an"; PRIO = 1; if (PRIO >= PRIO_MAX){PRIO_MAX = PRIO;}}
if (sdesc == "LOWBAT") {sdesc = "Batteriestand niedrig"; PRIO = 1; if (PRIO >= PRIO_MAX){PRIO_MAX = PRIO;}}
if (sdesc == "STICKY_UNREACH") {sdesc = "Kommunikation war gestört"; PRIO = 1; if (PRIO >= PRIO_MAX){PRIO_MAX = PRIO;}}
if (sdesc == "UNREACH") {sdesc = "Kommunikation zur Zeit gestört"; PRIO = 1; if (PRIO >= PRIO_MAX){PRIO_MAX = PRIO;}}
if (sdesc == "DEVICE_IN_BOOTLOADER"){sdesc = "Gerät startet neu"; PRIO = 1; if (PRIO >= PRIO_MAX){PRIO_MAX = PRIO;}}
if (sdesc == "UPDATE_PENDING") {sdesc = "Update verfügbar"; PRIO = 1; if (PRIO >= PRIO_MAX){PRIO_MAX = PRIO;}}
if (sdesc == "U_SOURCE_FAIL") {sdesc = "Netzteil ausgefallen"; PRIO = 1; if (PRIO >= PRIO_MAX){PRIO_MAX = PRIO;}}
if (sdesc == "USBH_POWERFAIL") {sdesc = "USB-Host deaktiviert"; PRIO = 1; if (PRIO >= PRIO_MAX){PRIO_MAX = PRIO;}}
if (sdesc == "ERROR_SABOTAGE") {sdesc = "Sabotage"; PRIO = 1; if (PRIO >= PRIO_MAX){PRIO_MAX = PRIO;}}
if (sdesc == "STICKY_SABOTAGE") {sdesc = "Sabotage war ausgelöst"; PRIO = 1; if (PRIO >= PRIO_MAX){PRIO_MAX = PRIO;}}
! Sonderfehler
if (sdesc == "ERROR") {
if((sdev.HssType()=="HM-Sec-RHS") || (sdev.HssType()=="HM-Sec-SC") || (sdev.HssType()=="HM-Sec-SC-2") || (sdev.HssType()=="HM-Sec-SCo") || (sdev.HssType()=="HM-Sec-MD") || (sdev.HssType()=="HM-Sec-MDIR") || (sdev.HssType()=="HM-Sec-MDIR-2") || (sdev.HssType()=="HM-Sec-Sir-WM"))
{
if (ival == 7){sdesc = "Sabotage."; PRIO = 1; if (PRIO >= PRIO_MAX){PRIO_MAX = PRIO;}}
}
if ((sdev.HssType()=="HM-Sec-Key") || (sdev.HssType()=="HM-Sec-Key-S") || (sdev.HssType()=="HM-Sec-Key-O"))
{
if (ival == 1){sdesc = "Einkuppeln fehlgeschlagen"; PRIO = 1; if (PRIO >= PRIO_MAX){PRIO_MAX = PRIO;}}
if (ival == 2){sdesc = "Motorlauf abgebrochen"; PRIO = 1; if (PRIO >= PRIO_MAX){PRIO_MAX = PRIO;}}
}
if (sdev.HssType()=="HM-CC-VD")
{
if (ival == 1){sdesc = "Ventil Antrieb blockiert"; PRIO = 1; if (PRIO >= PRIO_MAX){PRIO_MAX = PRIO;}}
if (ival == 2){sdesc = "Ventil nicht montiert"; PRIO = 1; if (PRIO >= PRIO_MAX){PRIO_MAX = PRIO;}}
if (ival == 3){sdesc = "Stellbereich zu klein"; PRIO = 1; if (PRIO >= PRIO_MAX){PRIO_MAX = PRIO;}}
if (ival == 4){sdesc = "Batteriestand niedrig"; PRIO = 1; if (PRIO >= PRIO_MAX){PRIO_MAX = PRIO;}}
}
}
if (sdesc == "FAULT_REPORTING") {
if (sdev.HssType()=="HM-CC-RT-DN")
{
if (ival == 1) {sdesc = "Ventil blockiert."; PRIO = 1; if (PRIO >= PRIO_MAX){PRIO_MAX = PRIO;}}
if (ival == 2) {sdesc = "Einstellbereich Ventil zu gross"; PRIO = 1; if (PRIO >= PRIO_MAX){PRIO_MAX = PRIO;}}
if (ival == 3) {sdesc = "Einstellbereich Ventil zu klein"; PRIO = 1; if (PRIO >= PRIO_MAX){PRIO_MAX = PRIO;}}
if (ival == 4) {sdesc = "Kommunikationsfehler"; PRIO = 1; if (PRIO >= PRIO_MAX){PRIO_MAX = PRIO;}}
if (ival == 6) {sdesc = "Batteriestand niedrig"; PRIO = 1; if (PRIO >= PRIO_MAX){PRIO_MAX = PRIO;}}
if (ival == 7) {sdesc = "Fehlstellung Ventil"; PRIO = 1; if (PRIO >= PRIO_MAX){PRIO_MAX = PRIO;}}
}
}
if (sdesc == "Batteriestand niedrig") {
string batlink = "unbekannt";
string index;
foreach (index, cr2016) {if (index == sdev.HssType()) {batlink = "1x leere CR2016";}}
foreach (index, cr2032) {if (index == sdev.HssType()) {batlink = "1x leere CR2032";}}
foreach (index, lr14x2) {if (index == sdev.HssType()) {batlink = "2x leere LR14";}}
foreach (index, lr44x2) {if (index == sdev.HssType()) {batlink = "2x leere LR44/AG13";}}
foreach (index, lr6x2) {if (index == sdev.HssType()) {batlink = "2x leere LR6/AA";}}
foreach (index, lr6x3) {if (index == sdev.HssType()) {batlink = "3x leere LR6/AA";}}
foreach (index, lr6x4) {if (index == sdev.HssType()) {batlink = "4x leere LR6/AA";}}
foreach (index, lr3x1) {if (index == sdev.HssType()) {batlink = "1x leere LR3/AAA";}}
foreach (index, lr3x2) {if (index == sdev.HssType()) {batlink = "2x leere LR3/AAA";}}
foreach (index, lr3x3) {if (index == sdev.HssType()) {batlink = "3x leere LR3/AAA";}}
foreach (index, lr3x3a) {if (index == sdev.HssType()) {batlink = "3x leere AAA Akkus - bitte laden";}}
foreach (index, block9) {if (index == sdev.HssType()) {batlink = "9V-Block leer oder unbestimmt";}}
zaehler = zaehler + 1;
slist = slist #"
(" # zaehler # ") " # sdev.Name() # " : " # batlink; if ( WITHTIME == "ja") { slist = slist #" seit "#stime ;}
}
else
{
zaehler = zaehler + 1;
slist = slist #"
(" # zaehler # ") " # sdev.Name() # " : " # sdesc; if ( WITHTIME == "ja") { slist = slist #" seit "#stime ;}
}
}
}
}
}
if (( USE_PUSHOVER == "ja") || ( USE_PROWL == "ja") || ( USE_PUSHBULLET == "ja")) {
string message;
string newmessage;
string messageindex;
message = "";
message = message # slist;
foreach(messageindex,message.Split(" ")) {newmessage = newmessage#messageindex#"%20";}
message = newmessage;
newmessage = "";
foreach(messageindex,message.Split("Ä")) {newmessage = newmessage#messageindex#"%C3%84";}
message = newmessage;
newmessage = "";
foreach(messageindex,message.Split("Ö")){newmessage = newmessage#messageindex#"%C3%96";}
message = newmessage;
newmessage = "";
foreach(messageindex,message.Split("Ü")){newmessage = newmessage#messageindex#"%C3%9C";}
message = newmessage;
newmessage = "";
foreach(messageindex,message.Split("ä")){newmessage = newmessage#messageindex#"%C3%A4";}
message = newmessage;
newmessage = "";
foreach(messageindex,message.Split("ö")){newmessage = newmessage#messageindex#"%C3%B6";}
message = newmessage;
newmessage = "";
foreach(messageindex,message.Split("ü")){newmessage = newmessage#messageindex#"%C3%BC";}
message = newmessage;
newmessage = "";
foreach(messageindex,message.Split("ß")){newmessage = newmessage#messageindex#"%C3%9F";}
message = newmessage;
newmessage = "";
foreach(messageindex,message.Split("°")){newmessage = newmessage#messageindex#"%C2%B0";}
message = newmessage;
newmessage = "";
! Kürzen der Nachricht um die jeweils am Ende angefügten Umwandlungscodes.
message = message.Substr(0, message.Length()-51);
}
if ( (GO) && (!slist == "") ) {
if ( USE_MAIL == "ja"){ dom.GetObject("CUxD."#MAIL_CUXD_ID#".CMD_EXEC").State("/etc/config/addons/email/email "#MAIL_ID#" '"#slist#"'"); }
if ( USE_PUSHOVER == "ja") { dom.GetObject("CUxD."#PUSH_CUXD_ID#".CMD_EXEC").State("/usr/local/addons/cuxd/extra/curl -s -k -d token='"#TOKEN#"' -d user='"#USERKENNUNG#"' -d device='"#USERDEVICE#"' -d html='"#HTML#"' -d message='"#message#"' -d priority='"#PRIO_MAX#"' -d sound='"#SOUND#"' -d retry='"#RETRY#"' -d expire='"#EXPIRE#"' https://api.pushover.net/1/messages.json"); }
if ( USE_PUSHBULLET == "ja") { dom.GetObject("CUxD."#PUSHBULLET_CUXD_ID#".CMD_EXEC").State("usr/local/addons/cuxd/extra/curl -u '"#USER#"'-k -d device_iden='"#DEVICE_IDEN#"' -d type=note -d title='"#TITEL#"' -d body='"#message#"' https://api.pushbullet.com/api/pushes"); }
if ( USE_PROWL == "ja"){ string url="http://prowl.weks.net/publicapi/add?apikey="#API_KEY#"&application="#ANWENDUNG#"&event="#KATEGORIE#"&priority="#PRIO_MAX#"&description="#message#"&timeout="#TIME_OUT#"";
dom.GetObject("CUxD."#PROWL_CUXD_ID#".CMD_EXEC").State("wget -q -O - '"#url#"'"); }
if ( USE_SYSVAR == "ja"){ dom.GetObject(SYSVAR_NAME).State(slist); }
} else { if ( USE_SYSVAR == "ja"){ dom.GetObject(SYSVAR_NAME).State(slist); } }