NEWS
[gelöst]Zigbee Wassermelder
-
Hallo zusammen,
ich habe versucht ein funktionierendes Skript von @cash für HM Wassermelder umzuschreiben, damit das für einen Zigbee Wassermelder von Aquara funktioniert.
Aus dem Log ist denke ich mal ersichtlich wo der Fehler liegen könnte, jedoch ist mir das ganze noch etwas zu hoch.Vielleicht hat ja jemand von euch eine Idee:
Hier das Skript:
// jshint maxerr:2000 /************************** Verschickt eine Pushmittteilung bei Meldungen vom Wassermelder 15.02.19 V1.00 Erste Version 03.03.19 V1.01 Push wurde micht verschickt Logging optimiert **************************/ var logging = true; var debugging = true; var observation = true; //Dauerhafte Überwachung der Geräte auf Servicemeldungen aktiv (true = aktiv // false =inaktiv) var onetime = true; //Prüft beim Script Start ob derzeit Geräte eine Servicemeldung haben //pro Fehlertyp kann eine andere Prio genutzt werden var prio_Water_leak = 0; //Variablen für Pushover var sendpush = true; //true = verschickt per Pushover Nachrchten // false = Pushover wird nicht benutzt var _prio; var _titel; var _message; //var _device = 'TPhone'; //Welches Gerät soll die Nachricht bekommen var _device = 'Handy_Domi'; //Ab hier eigentliches Script var cacheSelectorWater_leak_detected = $('zigbee.0.*.detected'); function send_pushover_V4 (_device, _message, _titel, _prio) { var pushover_Instanz = 'pushover.0'; if (_prio === 0){pushover_Instanz = 'pushover.0'} else if (_prio == 1){pushover_Instanz = 'pushover.1'} else if (_prio == 2){pushover_Instanz = 'pushover.2'} else {pushover_Instanz = 'pushover.3'} sendTo(pushover_Instanz, { device: _device, message: _message, title: _titel, priority: _prio, retry: 60, expire: 600, html: 1 }); } function water_detected(obj) { var meldungsart = 'Wasser'; 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 = 'Wasser erkannt'; } else{ status_text = 'kein Wasser'; } 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; } cacheSelectorWater_leak_detected.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 = 'Wasser erkannt'; } else{ status_text = 'kein Wasser'; } 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">Wasser 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_Water_leak; _titel = 'Wasser erkannt'; _message = _message_tmp; send_pushover_V4(_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){ cacheSelectorWater_leak_detected.on(function(obj) { water_detected(obj); }); } if(onetime){ //beim Start water_detected(); }
Hier mein Log:
javascript.0 2020-01-05 14:51:17.968 error (5821) at Script.runInContext (vm.js:133:20) javascript.0 2020-01-05 14:51:17.967 error (5821) at script.js.common.Geräte.IoBroker.Wassermelder_Zigbee:156:1 javascript.0 2020-01-05 14:51:17.967 error (5821) at water_detected (script.js.common.Geräte.IoBroker.Wassermelder_Zigbee:75:34) javascript.0 2020-01-05 14:51:17.966 error (5821) at Object.result.each (/opt/iobroker/node_modules/iobroker.javascript/lib/sandbox.js:846:29) javascript.0 2020-01-05 14:51:17.966 error (5821) at script.js.common.Geräte.IoBroker.Wassermelder_Zigbee:78:74 javascript.0 2020-01-05 14:51:17.966 error (5821) TypeError: Cannot read property 'common' of null javascript.0 2020-01-05 14:51:17.965 error (5821) ^ javascript.0 2020-01-05 14:51:17.965 error (5821) var common_name = getObject(id.substring(0, id.lastIndexOf('.') - 2)).common.name; javascript.0 2020-01-05 14:51:17.964 error (5821) script.js.common.Geräte.IoBroker.Wassermelder_Zigbee: script.js.common.Geräte.IoBroker.Wassermelder_Zigbee:78 javascript.0 2020-01-05 14:51:17.963 warn (5821) Object "zigbee.0.00158d00035983" does not exist javascript.0 2020-01-05 14:51:17.962 info (5821) script.js.common.Geräte.IoBroker.Wassermelder_Zigbee: [DEBUG] Function Wasser wird gestartet. javascript.0 2020-01-05 14:51:17.949 info (5821) Start javascript script.js.common.Geräte.IoBroker.Wassermelder_Zigbee javascript.0 2020-01-05 14:51:17.295 info (5821) Stop script script.js.common.Geräte.IoBroker.Wassermelder_Zigbee
-
@Dominik-F Zeile 78 bis zum Datumsfeld sind das Problem. Dort werden einige Infos vom Datenpunkt zusammen gesucht.
So ein Script ist kein universal Script. Deshalb sollte man es für seine Bedürfnisse entsprechend anpassen. Es hängt viel vom Aufbau der Objekte ab. Bei Homematic sind sie anders wie bei allen anderen und von daher ist es klar das das Script nicht läuft... Du solltest mehr logging einbauen um zu sehen was genau wo passiert evtl verstehst Du dann was das Script macht -
@Dominik-F Zeile 56 wird auch nicht funktionieren. Die Zeile wird aber nur aufgerufen wenn es eine Meldung gibt
-
Ja, ich hatte gehofft das es einfach wäre umzuschreiben Dein Script ist schon sehr komplex und für mich, der gerade mal die einfachsten Skripte etwas umschreiben kann, leider völlig unmöglich dieses umzuschreiben es hat mich schon allein stunden gekostet den Teil:
var cacheSelectorWater_leak_detected = $('zigbee.0.*.detected');
für Zigbee umzuschreiben. Vielleicht gibts hier ja jemanden der sich mit der Objektstrucktur von Zigbee auskennt und helfen kann, dies umzuschreiben
-
-
-
@Dominik-F
Hast Du mehr als einen Wassermelder ? Wenn nicht, ist das verwendete Script viel zu komplex und für Deine Objektstruktur ungeeignet. -
Ich habe nur einen Wassermelder der über Zigbee läuft. Habe noch einen von HMIP der mit dem ursprünglichem Skript von Cash läuft und auch funktioniert. Daher bin ich auf die Idee gekommen, dass ich das einfach umschreiben könnte und später in das andere Skript einfügen könnte um beide über ein Skript laufen zu lassen und hab in meiner unwissenheit nicht damit gerechnet, das es so komplex ist.
-
@Dominik-F Du hast nur einen Wassermelder von Homematic? Dann würde ich mein Script definitv nicht nutzen. Overkill.
Du kannst doch genau auf diesen einen Datenpunkt abfragen entweder per Java oder per Blockly....
Um nur ein Gerät zu überwachen braucht es nicht viele Zeilen. Auch der Name vom Auslöser muss nicht ermittelt werden. Es ist la klar welcher Wassermelder sich meldet. Mach ein Script pro Wassermelder und fertig...
-
Da hast du wahrscheinlich recht. Dann werde ich mich daran mal versuchen
-
@Dominik-F Nutzt Du Telegram? Ich schicke Dir Morgen ggf. mal ein Beispiel für den Homematic Wassermelder, das kann man dann leicht für das Zigbee-Teil erweitern...
-
-
@Dominik-F Gut macht es einfacher für mich...
-
@Dominik-F Du musst die drei Triggerpunkte anpassen und beim dritten weiß ich nicht wie der meldet ob z. B. mit true oder false oder mit Zahl? Das mußt Du dann auch anpassen. Texte nach belieben. Habe es nicht getestet, sollte aber funktionieren
/*****************************************+ * Push bei Wassermeldung * * 05.01.20 V1.00 Erste Version * ****************************************/ var logging = true; var debugging = false; var sendpush = true; // Push wenn Wasser erkannt wird var sendpush_1 = true; // Push wenn Wassermeldung beendet wurde let _prio; let _titel = 'Wasserschaden'; let _message; //let _device = 'TPhone'; let _device = 'All'; var tmp; var id_Trigger_1 = 'hm-rpc.2.001898A997FD42.1.WATERLEVEL_DETECTED'/*Küche Wassermelder:1 WATERLEVEL DETECTED*/ var id_Trigger_2 = 'hm-rpc.2.001898A997FD42.1.MOISTURE_DETECTED'/*Küche Wassermelder:1 MOISTURE DETECTED*/ var id_Trigger_3 = 'zigbee' function send_pushover (_device, _message, _titel, _prio) { var pushover_Instanz = 'pushover.0'; if (_prio === 0){pushover_Instanz = 'pushover.0';} else if (_prio == 1){pushover_Instanz = 'pushover.1';} else if (_prio == 2){pushover_Instanz = 'pushover.2';} else {pushover_Instanz = 'pushover.3';} sendTo(pushover_Instanz, { device: _device, message: _message, title: _titel, priority: _prio }); } function func_Wasser(){ var Status_1 = getState(id_Trigger_1).val; var Status_2 = getState(id_Trigger_2).val; var Status_3 = getState(id_Trigger_3).val; var status_text_1; var status_text_2; var status_text_3; if(Status_1){ status_text_1 = 'Wasser erkannt'; } else{ status_text_1 = 'keine Wasser'; } if(Status_2){ status_text_2 = 'Feuchtigkeit erkannt'; } else{ status_text_2 = 'keine Feuchtigkeit'; } if(Status_3 == 1){ status_text_3 = 'Wasser erkannt'; } else{ status_text_3 = 'keine Wasser'; } if(debugging){ log('Status1_' +Status_1 +' --- Status2: ' +Status_2 +' --- Status3: ' +Status_3) } if(Status_1 || Status_2 || Status_3 == 1){ tmp = 'Meldung vom Wassermelder. Status vom ersten Melder: '+status_text_1 +' --- Status vom zweiten Melder: '+status_text_2 +' --- Status vom dritten Melder: '+status_text_3; if(logging){ log(tmp); } if(sendpush){ _prio = 2; _message = tmp; send_pushover(_device, _message, _titel, _prio); } } else{ tmp = 'Meldung vom Wassermelder aufgehoben. Status vom ersten Melder: '+status_text_1 +' --- Status vom zweiten Melder: '+status_text_2 +' --- Status vom dritten Melder: '+status_text_3; if(logging){ log(tmp); } if(sendpush_1){ _prio = 0; _message = tmp; send_pushover(_device, _message, _titel, _prio); } } } on({id: id_Trigger_1, change: 'ne', ack: true}, func_Wasser); on({id: id_Trigger_2, change: 'ne', ack: true}, func_Wasser); on({id: id_Trigger_3, change: 'ne', ack: true}, func_Wasser);
-
Wow, vielen Dank für deine Mühe! Der erste Test mit dem Zigbee Wassermelder hat funktioniert.
Ich werde jetzt versuchen, das Skript soweit zu ändern, dass wenn der Zigbee Wassermelder auf True geht, auch nur der Status von diesem verschickt wird. Falls ich mich da verrenne, darf ich dich dazu noch einmal anschreiben?
Ich bekomme jedoch eine Warnung :(13457) adapter.getMessage is deprecated and will be removed in js-controller 2.3. Please report this warning to the developer of this adapter!
Ich hoffe du bist der richtige Ansprechpartner für die Warnung bei dem Skript?
-
@Dominik-F Welche Version von zigbee adapter bringt diese Fehlermeldung?
-
@Bluefox
0.11.5 -
Die Meldung spuckt der pushover Adapter Version 1.1.1 aus jedoch nur wenn es um zigbee geht
-
@Dominik-F Die Meldung wird in der Version 1.0.x verschwinden.
-
Danke für dein schnelles Handeln