NEWS
Rauchmelder Skript
-
Hallo zusammen,
ich habe mit etwas Unterstützung ein Rauchmelder Skript laufen, dass mit, im Falle eines Alarms, per Push eine Nachricht schickt, welcher Rauchmelder von HM ausgelöst hat.
Da dort alle Rauchmelder im Log erkannt werden bin ich davon ausgegangen das es funktioniert. Gestern habe ich jedoch durch meine E-Zigarette ausversehen den im Wohnzimmer ausgelöst und festgestellt, dass das Skript nicht funktioniert. Kann mir da jemand helfen?var logging = true; var debugging = true; var observation = true; //Dauerhafte Überwachung der Geräte auf Rauch (true = aktiv // false =inaktiv) var onetime = true; //Prüft beim Script Start ob derzeit Geräte Rauch erkennen const prio_Rauchmelder = 0; //Variablen für Pushover const sendpush = true; //true = verschickt per Pushover Nachrchten // false = Pushover wird nicht benutzt const pushover_Instanz0 = 'pushover.0'; // Pushover instance für HM Alarme const pushover_Instanz1 = 'pushover.1'; // Pushover instance für HM Warnungen const pushover_Instanz2 = 'pushover.2'; // Pushover instance für Zigbee Alarme const pushover_Instanz3 = 'pushover.3'; // Pushover instance für Zigbee Warnung var prio = -2; //nicht verändern die höchste Prio nach Fehlertyp wird verwendet var titel; var message; var device = 'Handy_Domi'; //Welches Gerät soll die Nachricht bekommen //var device = 'All'; function send_pushover (device, message, titel, prio) { var pushover_Instanz; if (prio === 0){pushover_Instanz = pushover_Instanz0;} else if (prio == 1){pushover_Instanz = pushover_Instanz1;} else if (prio == 2){pushover_Instanz = pushover_Instanz2;} else {pushover_Instanz = pushover_Instanz3;} sendTo(pushover_Instanz, { device: device, message: message, title: titel, priority: 0, }); } //Ab hier eigentliches Script var cacheSelectorSmoke = $('channel[state.id=hm-rpc.0.*.1.ERROR_SMOKE_CHAMBER-1_ALARM$]'); function Smoke(obj) { var meldungsart = 'Rauch erkannt'; var Gesamt = 0; var Betroffen = 0; var text = []; var _message_tmp = ' '; var log_manuell = false; if (obj) { var common_name = obj.common.name.substr(0, obj.common.name.indexOf(':')); var status = obj.newState.val; var status_text; if(status){ status_text = 'Rauch erkannt'; } else{ status_text = 'kein Rauch'; } var id_name = obj.id.split('.')[2]; log(common_name +' ('+id_name +') ' +'--- Typ: '+meldungsart +' --- Status: ' +status_text); } else { if(debugging){ log('[DEBUG] '+'Function ' +meldungsart +' wird gestartet.'); } log_manuell = true; } cacheSelectorSmoke.each(function (id, i) {// Schleife für jedes gefundenen Element *.LOWBAT var obj = getObject(id); //var common_name = getObject(id).common.name.substr(0, obj.common.name.indexOf(':')); var common_name = getObject(id.substring(0, id.lastIndexOf('.') - 2)).common.name; var id_name = id.split('.')[2]; var native_type = getObject(id.substring(0, id.lastIndexOf('.') - 2)).native.TYPE; var meldungsart = id.split('.')[4]; var datum = formatDate(getState(id).lc, "TT.MM.JJ SS:mm:ss"); var datum_neu; var datum_seit; if(datum < '01.01.71 01:00:00'){ datum_seit = ''; datum_neu = ''; }else{ datum_seit= ' --- seit: '; datum_neu = datum +' Uhr'; } var status = getState(id).val; var status_text; if(status){ status_text = 'Rauch erkannt'; } else{ status_text = 'kein Rauch'; } if (status === true) { // wenn Zustand = true, dann wird die Anzahl der Geräte hochgezählt ++Betroffen; text.push(common_name +' ('+id_name +')'); // Zu Array hinzufügen _message_tmp = _message_tmp +common_name +' ('+id_name +')' + ' - <font color="red">Rauch erkannt</font> '+'\n'; } ++Gesamt; // Zählt die Anzahl der vorhandenen Geräte unabhängig vom Status if(debugging){ log('[DEBUG] '+'Geräte Nr. ' +i +' Name: '+ common_name +' ('+id_name+') --- '+native_type +' --- Typ: '+meldungsart +' --- Status: ' +status +' ' +status_text +datum_seit +datum_neu); } }); // Schleife ist durchlaufen. Im Log wird der aktuelle Status ausgegeben if(Betroffen > 0){ if(debugging || log_manuell){ log('Es gibt: '+Gesamt +' Geräte im Gewerk ' +meldungsart+'. Derzeit: '+Betroffen +' Meldung(en).'); } if(Betroffen >1){ if(logging){ log('Übersicht aller Meldungen im Gewerk: ' +meldungsart +': '+ text.join(', ')); } } //Push verschicken if(sendpush && !log_manuell){ prio = prio_Rauchmelder; titel = 'Rauch erkannt'; message = _message_tmp; send_pushover (device, message, titel, prio); } } else{ if((debugging) || (onetime && log_manuell)){ if(Gesamt === 0){ log('Keine Geräte zum überwachen gefunden.'); } else{ log(Gesamt +' Geräte mit dem Datenpunkt ' +meldungsart+' werden überwacht.'); } } } } //Auslösen durch Zustandsänderung if(observation){ cacheSelectorSmoke.on(function(obj) { Smoke(obj); }); } if(onetime){ //beim Start Smoke(); }
Hier der Log beim Starten des Skriptes:
javascript.0 2020-02-16 17:54:32.984 info (13024) script.js.common.Rauchmelder: registered 7 subscriptions and 0 schedules javascript.0 2020-02-16 17:54:32.984 info (13024) script.js.common.Rauchmelder: 7 Geräte mit dem Datenpunkt Rauch erkannt werden überwacht. javascript.0 2020-02-16 17:54:32.984 info (13024) script.js.common.Rauchmelder: [DEBUG] Geräte Nr. 6 Name: OG_Treppenhaus_Rauchmelder (NEQ1029056) --- HM-Sec-SD-2 --- Typ: ERROR_SMOKE_CHAMBER-1_ALARM --- Status: 0 kein Rauch javascript.0 2020-02-16 17:54:32.984 info (13024) script.js.common.Rauchmelder: [DEBUG] Geräte Nr. 5 Name: EG_Diele_Rauchmelder (NEQ1029037) --- HM-Sec-SD-2 --- Typ: ERROR_SMOKE_CHAMBER-1_ALARM --- Status: 0 kein Rauch javascript.0 2020-02-16 17:54:32.983 info (13024) script.js.common.Rauchmelder: [DEBUG] Geräte Nr. 4 Name: EG_Wohnzimmer_Rauchmelder (NEQ1028984) --- HM-Sec-SD-2 --- Typ: ERROR_SMOKE_CHAMBER-1_ALARM --- Status: 0 kein Rauch javascript.0 2020-02-16 17:54:32.983 info (13024) script.js.common.Rauchmelder: [DEBUG] Geräte Nr. 3 Name: OG_Schlafzimmer_Rauchmelder (NEQ1028652) --- HM-Sec-SD-2 --- Typ: ERROR_SMOKE_CHAMBER-1_ALARM --- Status: 0 kein Rauch javascript.0 2020-02-16 17:54:32.983 info (13024) script.js.common.Rauchmelder: [DEBUG] Geräte Nr. 2 Name: OG_Diele_Rauchmelder (NEQ1028645) --- HM-Sec-SD-2 --- Typ: ERROR_SMOKE_CHAMBER-1_ALARM --- Status: 0 kein Rauch javascript.0 2020-02-16 17:54:32.982 info (13024) script.js.common.Rauchmelder: [DEBUG] Geräte Nr. 1 Name: OG_Kinderzimmer_Hinten_Rauchmelder (NEQ1028635) --- HM-Sec-SD-2 --- Typ: ERROR_SMOKE_CHAMBER-1_ALARM --- Status: 0 kein Rauch javascript.0 2020-02-16 17:54:32.982 info (13024) script.js.common.Rauchmelder: [DEBUG] Geräte Nr. 0 Name: OG_Kinderzimmer_Vorne_Rauchmelder (NEQ1028629) --- HM-Sec-SD-2 --- Typ: ERROR_SMOKE_CHAMBER-1_ALARM --- Status: 0 kein Rauch javascript.0 2020-02-16 17:54:32.981 info (13024) script.js.common.Rauchmelder: [DEBUG] Function Rauch erkannt wird gestartet. javascript.0 2020-02-16 17:54:32.833 info (13024) Start javascript script.js.common.Rauchmelder
Edit:
Hier nun die aktuelle funktionierende Version (wird wenn es Veränderungen gibt aktualisiert) :var logging = true; var debugging = false; var observation = true; //Dauerhafte Überwachung der Geräte auf Rauch (true = aktiv // false =inaktiv) var onetime = true; //Prüft beim Script Start ob derzeit Geräte Rauch erkennen const prio_Rauchmelder = 0; //Variablen für Pushover const sendpush = true; //true = verschickt per Pushover Nachrchten // false = Pushover wird nicht benutzt const pushover_Instanz0 = 'pushover.0'; // Pushover instance für HM Alarme const pushover_Instanz1 = 'pushover.1'; // Pushover instance für HM Warnungen const pushover_Instanz2 = 'pushover.2'; // Pushover instance für Zigbee Alarme const pushover_Instanz3 = 'pushover.3'; // Pushover instance für Zigbee Warnung var prio = -2; //nicht verändern die höchste Prio nach Fehlertyp wird verwendet var titel; var message; var device = 'All'; //Welches Gerät soll die Nachricht bekommen function send_pushover (device, message, titel, prio) { var pushover_Instanz; if (prio === 0){pushover_Instanz = pushover_Instanz0;} else if (prio == 1){pushover_Instanz = pushover_Instanz1;} else if (prio == 2){pushover_Instanz = pushover_Instanz2;} else {pushover_Instanz = pushover_Instanz3;} sendTo(pushover_Instanz, { device: device, message: message, title: titel, priority: 2, retry: 60, expire: 600, html: 1 }); } //Ab hier eigentliches Script var cacheSelectorSmoke = $('*.STATE(functions=rauchmelder)'); function Smoke(obj) { var meldungsart = 'Rauch erkannt'; var Gesamt = 0; var Betroffen = 0; var text = []; var _message_tmp = ' '; var log_manuell = false; if (obj) { var common_name = obj.common.name.substr(0, obj.common.name.indexOf(':')); var status = obj.newState.val; var status_text; if(status){ status_text = 'Rauch erkannt'; } else{ status_text = 'kein Rauch'; } var id_name = obj.id.split('.')[2]; log(common_name +' ('+id_name +') ' +'--- Typ: '+meldungsart +' --- Status: ' +status_text); } else { if(debugging){ log('[DEBUG] '+'Function ' +meldungsart +' wird gestartet.'); } log_manuell = true; } cacheSelectorSmoke.each(function (id, i) {// Schleife für jedes gefundenen Element *.LOWBAT var obj = getObject(id); //var common_name = getObject(id).common.name.substr(0, obj.common.name.indexOf(':')); var common_name = getObject(id.substring(0, id.lastIndexOf('.') - 2)).common.name; var id_name = id.split('.')[2]; var native_type = getObject(id.substring(0, id.lastIndexOf('.') - 2)).native.TYPE; var meldungsart = id.split('.')[4]; var datum = formatDate(getState(id).lc, "TT.MM.JJ SS:mm:ss"); var datum_neu; var datum_seit; if(datum < '01.01.71 01:00:00'){ datum_seit = ''; datum_neu = ''; }else{ datum_seit= ' --- seit: '; datum_neu = datum +' Uhr'; } var status = getState(id).val; var status_text; if(status){ status_text = 'Rauch erkannt'; } else{ status_text = 'kein Rauch'; } if (status === true) { // wenn Zustand = true, dann wird die Anzahl der Geräte hochgezählt ++Betroffen; text.push(common_name +' ('+id_name +')'); // Zu Array hinzufügen _message_tmp = _message_tmp +common_name +' ('+id_name +')' + ' - <font color="red">Rauch erkannt</font> '+'\n'; } ++Gesamt; // Zählt die Anzahl der vorhandenen Geräte unabhängig vom Status if(debugging){ log('[DEBUG] '+'Geräte Nr. ' +i +' Name: '+ common_name +' ('+id_name+') --- '+native_type +' --- Typ: '+meldungsart +' --- Status: ' +status +' ' +status_text +datum_seit +datum_neu); } }); // Schleife ist durchlaufen. Im Log wird der aktuelle Status ausgegeben if(Betroffen > 0){ if(debugging || log_manuell){ log('Es gibt: '+Gesamt +' Geräte im Gewerk ' +meldungsart+'. Derzeit: '+Betroffen +' Meldung(en).'); } if(Betroffen >1){ if(logging){ log('Übersicht aller Meldungen im Gewerk: ' +meldungsart +': '+ text.join(', ')); } } //Push verschicken if(sendpush && !log_manuell){ prio = prio_Rauchmelder; titel = 'Rauch erkannt'; message = _message_tmp; send_pushover (device, message, titel, prio); } } else{ if((debugging) || (onetime && log_manuell)){ if(Gesamt === 0){ log('Keine Geräte zum überwachen gefunden.'); } else{ log(Gesamt +' Geräte mit dem Datenpunkt ' +meldungsart+' werden überwacht.'); } } } } //Auslösen durch Zustandsänderung if(observation){ cacheSelectorSmoke.on(function(obj) { Smoke(obj); }); } if(onetime){ //beim Start Smoke(); }
-
@Dominik-F Die Frage ist ja eher was das Log gesagt hat als der Melder ausgelöst wurde und welcher Datenpunkt in io. Broker welchen Status hatte?
-
Der Log hat gar nichts gesagt, als ob nie was passiert wäre^^
Mein Skript auf der CCU3 was ich Sicherheitshalber noch nicht gelöscht habe, hat funktioniert und mir eine Email geschickt. -
@Dominik-F Bleibt noch die Frage welches Objekt welchen Status hatte als er ausgelöst wurde? Das Script kann nur reagieren wenn in ioBroker etwas passiert...
-
Ja da hatte ich jetzt nicht nachgeschaut weil es 23:30 Uhr war und ich das Ding so schnell wie möglich aus haben wollte
-
@Dominik-F Der Fehler wird in Zeile 37 liegen nur ohne das man weiß welcher State sich ändert wird man es nicht lösen können...
-
Kannst du aus diesem Skript, das in meiner CCU läuft vielleicht den State herrausfinden?
! HomeMatic-Script ! AUSGELöSTEN RAUCHMELDER FINDEN ! http://www.christian-luetgens.de/homematic/e-mail/rauchmelder/Rauchmelder.htm ! VARIABLEN DEFINIEREN string s_chn; object o_chn; object o_dp; string s_true = ""; string s_false = ""; string s_subj; string s_body; integer i_template; ! RAUCHMELDER FINDEN UND STATUS ABFRAGEN foreach (s_chn, dom.GetObject(ID_CHANNELS).EnumUsedIDs()) { o_chn = dom.GetObject (s_chn); if (o_chn.HssType() == "SMOKE_DETECTOR") { o_dp = o_chn.DPByHssDP ("STATE"); if (o_dp.Value()) { s_true = s_true # " " # o_chn.Name() # "\n"; } else { s_false = s_false # " " # o_chn.Name() # "\n"; } } } ! SUBJECT, BODY UND ALARMIERUNG (FEHLER/STATUS) VORBEREITEN if (s_true == "") { s_subj = "Rauchmelder sind OK"; s_true = " keine\n"; i_template = 2; } else { s_subj = "Rauchmelder haben ausgeloest"; i_template = 1; } if (s_false == "") { s_false = " keine\n"; } s_body = "Rauchmelder ausgelöst:\n" # s_true # "\nRauchmelder OK:\n" # s_false; ! MAIL VERSENDEN dom.GetObject ("E-Mail.Subject").State (s_subj); dom.GetObject ("E-Mail.Body").State (s_body); dom.GetObject ("E-Mail.Versand").State (i_template); ! Ende des Scripts
-
@Dominik-F sagte:
o_dp = o_chn.DPByHssDP ("STATE");
Das HM-Script wertet den STATE aus, nicht den ERROR_SMOKE_CHAMBER-1_ALARM.
-
also müsste ich dann im obrigen Skript auch den State auswerten und nochmal testen oder`?
-
@Dominik-F sagte:
also müsste ich dann im obrigen Skript auch den State auswerten und nochmal testen oder`?
Ja, wobei eine zusätzliche Selektion erforderlich ist, da viele HM-Geräte einen Datenpunkt haben, dessen ID auf STATE endet. Verwende das Gewerk(enum.functions) für die 7 STATE-Datenpunkte und selektiere danach.
$('*.STATE(functions=smoke)').each(function(id, i) {log(id);});
-
ich habs jetzt geändert. hast du eine idee wie ich es testen kann ohne das die Rauchmelder losgehen und extrem laut sind?
-
@Dominik-F sagte:
wie ich es testen kann ohne das die Rauchmelder losgehen und extrem laut sind?
Im Tab "Objekte" im Expertenmodus den Wert von STATE auf true ändern und anschließend wieder zurück auf false.
-
sehr gut. Es kam sofort eine Pushnachricht an. Ich hoffe dann mal, dass es im ernstfall auch funktioniert
-
Ich habe noch eine Frage zur Pushnachricht in dem Skript.
Normalerweise sollte die Schrift"Rauch erkannt" rot sein, jedoch wird sie nicht Rot angezeigt sondern so- <font color="red">Rauch erkannt</font>
-
@Dominik-F Dir fehlt da noch was:
retry: 60,
expire: 600,
html: 1Das hinzufügen. Dann funktionieren Prio 2 Meldungen auch besser. Denn wenn der Rauchmelder anspringt würde ich auf Prio2 gehen so dass man in Pushover bestätigen muss das man die Meldung wahrgenommen hat....
-
ah, ich hab mich schon immer gefragt warum
retry: 60,
expire: 600,
html: 1
bei dir mit drin war Kannst du mir kurz erklären was die 3 Einträge genau bewirken?Prio hab ich jetzt auch geändert und Push funktioniert nun.
-
@Dominik-F html sollte klar sein damit Dein red auch rot ist.
Der 600er wert ist die Zeit wie lange Pushover Dich errinnert bevor es verfällt. Die 60 Die Pause zwischen den Pushnachrichten. Sobald Du in der App natürlich die Push bestätigt ist der Spuk vorbei.
Mit der Einstellung bekommst Du wenn ich nicht ganz falsch liege max 10 Minuten jede Minute eine Push das Dein Rauchmelder an ist. Wenn Du bis dahin die Push nicht hörst wird auch ein höherer Wert nicht mehr helfen. Bitte dort nicht übertreiben. Dazu ggf. auch die FAQ von Pushover lesen. -
@Dominik-F Setzt du die Homematic IP Rauchmelder HMIP-SWSD ein? Ich hätte Interesse an deinem Skript. Könntest du in deinem ersten Beitrag die aktuelle Version deines Skriptes einstellen bzw. bei neuen Erkenntnissen das Skript dort aktualisieren?
-
@cash
Gerade das mit dem html war mir nicht klar Danke für deine Erklärung@Feuersturm
Nein, ich nutze keine HM IP, falls der Datenpunkt STATE dort auch existiert würde ich es einfach mal testen. Falls es nicht funktioniert kann man es vielleicht so umschreiben, dass es auch damit funktioniert.
Hab das aktuelle Skript oben eingestellt -
@Dominik-F sagte:
var cacheSelectorSmoke = $('*.STATE(functions=rauchmelder)').each(function(id, i) {log(id);});
Zeile 39: Das ist eine Testfunktion. Richtige Variable:
var cacheSelectorSmoke = $('*.STATE(functions=rauchmelder)');