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



  • @cash

    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 sagte:

    mit der Objektstrucktur von Zigbee auskennt

    Zeigen !!





  • @Dominik-F
    Hast Du mehr als einen Wassermelder ? Wenn nicht, ist das verwendete Script viel zu komplex und für Deine Objektstruktur ungeeignet.



  • @paul53

    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...



  • @cash

    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...



  • @cash

    Vielen Dank, du bist mir eine große Hilfe.

    Nein, ich nutze nur Pushover.



  • @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);
    
    
    


  • @cash

    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!
    

    @Bluefox

    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



  • @Bluefox

    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.



  • @Bluefox

    Danke für dein schnelles Handeln


Log in to reply
 

Suggested Topics

1.9k
Online

32.1k
Users

38.7k
Topics

525.3k
Posts