! 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); } }