NEWS

js- Abfrage von Status an Ausgängen per Telegram


  • Hallo, vielleicht kann mir einer von euch helfen. Ich steuere meine Lampen über Telegram (WAGO) an. Steuern klappt gut soweit. Nur der Status zum Ausgang innerhalb der if-Schleife, wird immer falsch angezeigt.

    else if (befehl === "%WC_Licht") {
            setState("modbus.0.coils.12356_WC_VisuTaster_Licht_fhem",true);
            sendTo('telegram', {
            user: benutzer,
            text: 'Licht WC:                                               ' + getvalue('modbus.0.coils.573_WC_Licht').val,
        });
    }
    

    Vielen Dank vorab.


  • Sorry nun der richtige Ausschnitt.

    else if (befehl === "%WC_Licht") {
            setState("modbus.0.coils.12356_WC_VisuTaster_Licht_fhem",true);
            sendTo('telegram', {
            user: benutzer,
            text: 'Licht WC:                                               ' + getState('modbus.0.coils.573_WC_Licht').val,
        });
    }

  • @maerzpa probiere es mit callback

    else if (befehl === "%WC_Licht") {
        setState("modbus.0.coils.12356_WC_VisuTaster_Licht_fhem",true);
        getState('modbus.0.coils.573_WC_Licht', (err, state) => {
            sendTo('telegram', {
                user: benutzer,
                text: 'Licht WC:                                               ' + state.val
            });
        })
    }
    

  • @fastfoot Vielen Dank, ich werde es heute abend testen.


  • @fastfoot Ich habe es eben probiert. Führt leider zum selben Ergebnis. Das interessante ist:
    Wenn ich die Abfrage in einer weiteren else Schleife mache, dann geht es. Vielleicht zu wenig Zeit zwischen der Ansteuerung und der Abfrage des Ausgangs?


  • @maerzpa sagte in js- Abfrage von Status an Ausgängen per Telegram:

    @fastfoot Ich habe es eben probiert. Führt leider zum selben Ergebnis. Das interessante ist:
    Wenn ich die Abfrage in einer weiteren else Schleife mache, dann geht es. Vielleicht zu wenig Zeit zwischen der Ansteuerung und der Abfrage des Ausgangs?

    Wahrscheinlich müsste das setState() auch mit callback erfolgen und die restlichen Zeilen da mit rein. Da ist aber @paul53 wohl kompetenter und hat vlt. was Einfacheres auf Lager, callback im callback müsste zwar funktionieren, aber irgendwie denke ich das geht besser, ohne es aber zu wissen 🙂


  • @maerzpa so sollte es gehen, bis wer was Eleganteres hat

    else if (befehl === "%WC_Licht") {
        setState("modbus.0.coils.12356_WC_VisuTaster_Licht_fhem",true, () => {
            getState('modbus.0.coils.573_WC_Licht', (err, state) => {
                sendTo('telegram', {
                    user: benutzer,
                    text: 'Licht WC:                                               ' + state.val
                });
            })
        });
    }
    

  • @fastfoot Habe es eben probiert. Immernoch selbes Ergebnis. Lampe an, zeigt aber Status false.


  • @maerzpa dann fällt mir nur noch das hier ein

    else if (befehl === "%WC_Licht") {
        setState("modbus.0.coils.12356_WC_VisuTaster_Licht_fhem",true);
    }
    on({id:"modbus.0.coils.12356_WC_VisuTaster_Licht_fhem", change:"ne"}, function(obj) {
        sendTo('telegram', {
            user: benutzer,
            text: 'Licht WC:                                               ' + obj.state.val
        });
    })
    

  • @fastfoot Stimmen da die Klammern? Ich bekomme eine Fehlermeldung


  • @maerzpa sagte in js- Abfrage von Status an Ausgängen per Telegram:

    @fastfoot Stimmen da die Klammern? Ich bekomme eine Fehlermeldung

    sollten stimmen, du hast ja nur ein Fragment gepostet


  • @maerzpa sagte in js- Abfrage von Status an Ausgängen per Telegram:

    @fastfoot Stimmen da die Klammern? Ich bekomme eine Fehlermeldung

    änder "change": in change:


  • ich habe eine Schleife in der ich Anweisungen von Telegram abfrage:
    on({id: 'telegram.0.communicate.request', change: 'any'}, function (obj) {
    var stateval = getState('telegram.0.communicate.request').val; // Statevalue in Variable schreiben
    var benutzer = stateval.substring(1,stateval.indexOf("]")); // Benutzer aus Statevalue extrahieren
    var befehl = stateval.substring(stateval.indexOf("]")+1,stateval.length); // Befehl/Text aus Statevalue extrahieren
    var idSayIt = "sayit.0.tts.text";

     if (befehl.search(/(?=.*(\bmenu\b)).+/ig) != -1) {
        sendTo('telegram', {
            user: benutzer,
            text: 'Wähle das Gewerk',
            reply_markup: {
                inline_keyboard: [
                    [{ text: 'Einstellungen', callback_data: '%Einstellungen'}, { text: 'Fenster+Türe', callback_data: '%Fenster+Türe'}, { text: 'Licht', callback_data: '%Licht'}],
                    [{ text: 'Steckdosen', callback_data: '%Steckdosen'}, { text: 'Beregnung', callback_data: '%Beregnung'}, { text: 'Kameras', callback_data: '%Kameras'}],
                ]
             }
        });
    }
    

    else if (befehl === "%WC_Licht") {
    setState("modbus.0.coils.12356_WC_VisuTaster_Licht_fhem",true);
    on({id:"modbus.0.coils.12356_WC_VisuTaster_Licht_fhem", "change":"ne"}, function(obj) {
    sendTo('telegram', {
    user: benutzer,
    text: 'Licht WC: ' + obj.state.val
    });
    })
    }

    Wenn ich die Klammern so setzte wie oben in der Else Schleife--> bekomme ich den richtigen Status per Telegram gesendet. Allerdings mehrmals. Immer wieder ein vielfaches bei erneutem Wechsel des Statuses (EIN/AUS).


  • @maerzpa siehe nächsten Post


  • @maerzpa Du hast den Trigger nicht rausgenommen, ich hatte nur auf die Klammern geachtet. So sollte es jetzt funktionieren

    var stateval = getState('telegram.0.communicate.request').val; // Statevalue in Variable schreiben
    var benutzer = stateval.substring(1,stateval.indexOf("]")); // Benutzer aus Statevalue extrahieren
    var befehl = stateval.substring(stateval.indexOf("]")+1,stateval.length); // Befehl/Text aus Statevalue extrahieren
    var idSayIt = "sayit.0.tts.text";
    
    on({id: 'telegram.0.communicate.request', change: 'any'}, function (obj) {
    
        if (befehl.search(/(?=.*(\bmenu\b)).+/ig) != -1) {
            sendTo('telegram', {
                user: benutzer,
                text: 'Wähle das Gewerk',
                reply_markup: {
                    inline_keyboard: [
                        [{ text: 'Einstellungen', callback_data: '%Einstellungen'}, { text: 'Fenster+Türe', callback_data: '%Fenster+Türe'}, { text: 'Licht', callback_data: '%Licht'}],
                        [{ text: 'Steckdosen', callback_data: '%Steckdosen'}, { text: 'Beregnung', callback_data: '%Beregnung'}, { text: 'Kameras', callback_data: '%Kameras'}],
                    ]
                    }
            });
        } else if (befehl === "%WC_Licht") {
            setState("modbus.0.coils.12356_WC_VisuTaster_Licht_fhem",true);
        }
    })
    
    on({id:"modbus.0.coils.12356_WC_VisuTaster_Licht_fhem", "change":"ne"}, function(obj) {
        sendTo('telegram', {
        user: benutzer,
        text: 'Licht WC: ' + obj.state.val
        });
    })
    

  • @fastfoot sagte in js- Abfrage von Status an Ausgängen per Telegram:

    modbus.0.coils.573_WC_Licht

    Danke erstmal für die Mühe und Geduld. So bekomme ich die richtige Meldung. Doch leider bekomme ich auch wenn ich vor Ort Taster drücke (ohne Telegramm Button), eine Meldung per Telegramm.
    Sorry das ich nerve.


  • @maerzpa nee, nervt nicht 🙂 Ich überlege mir bis morgen etwas...


  • @maerzpa so, ein neuer Versuch, noch ein paar Fehler beseitigt, die ich aber selbst eingebaut hatte

    var benutzer,
        menu_cmd = false;
    
    on({id: 'telegram.0.communicate.request', change: 'any'}, function (obj) {
        var stateval = getState('telegram.0.communicate.request').val; // Statevalue in Variable schreiben
        var befehl = stateval.substring(stateval.indexOf("]")+1,stateval.length); // Befehl/Text aus Statevalue extrahieren
        var idSayIt = "sayit.0.tts.text";
    
        benutzer = stateval.substring(1,stateval.indexOf("]")); // Benutzer aus Statevalue extrahieren
    
        if (befehl.search(/(?=.*(\bmenu\b)).+/ig) != -1) {
            sendTo('telegram', {
                user: benutzer,
                text: 'Wähle das Gewerk',
                reply_markup: {
                    inline_keyboard: [
                        [{ text: 'Einstellungen', callback_data: '%Einstellungen'}, { text: 'Fenster+Türe', callback_data: '%Fenster+Türe'}, { text: 'Licht', callback_data: '%Licht'}],
                        [{ text: 'Steckdosen', callback_data: '%Steckdosen'}, { text: 'Beregnung', callback_data: '%Beregnung'}, { text: 'Kameras', callback_data: '%Kameras'}],
                    ]
                    }
            });
        } else if (befehl === "%WC_Licht") {
            setState("modbus.0.coils.12356_WC_VisuTaster_Licht_fhem",true);
            menu_cmd=true;
        }
    })
    
    on({id:"modbus.0.coils.573_WC_Licht", change:"ne"}, function(obj) {
        if(menu_cmd) {
            menu_cmd=false;
            sendTo('telegram', {
                user: benutzer,
                text: 'Licht WC: ' + obj.state.val
            });
        }
    })```

  • Hallo!

    Für genau diesen Fall gibt es die EIgenschaft from in der Subscription on(). Guck mal hier: https://www.iobroker.net/#de/documentation/basics/states.md

    Da kannst du neben zum Beispiel dem Wert, den der Datenpunkt haben soll (hier soll er sich ändern, daher change: "ne") auch angeben, von wo aus er geändert wurde.

    In diesem Falle wird die Änderung ja vom Javascript-Adapter gemacht, ich nehme an, von Instanz 0.

    on({
        id:"modbus.0.coils.573_WC_Licht", 
        change:"ne",
        from: "javascript.0"
    }, function(obj) {
        sendTo('telegram', {
                user: benutzer,
                text: 'Licht WC: ' + obj.state.val
         });
    });
    

    @fastfoot Sehr gute Idee, eine Variable zu verwenden. Das kann aber bei vielen Tastern schnell unübersichtlich werden.

    Gruß
    Pix


  • @pix sagte in js- Abfrage von Status an Ausgängen per Telegram:

    @fastfoot Sehr gute Idee, eine Variable zu verwenden. Das kann aber bei vielen Tastern schnell unübersichtlich werden.

    ich dachte dabei an diese eine Variable, die allerdings bei jedem setState() gesetzt würde. Das sollte im Ein-Mann-Betrieb kein Problem sein, sollte aber die Frau gleichzeitig das Licht im Wohnzimmer schalten(durch Telegram), funktioniert das nicht mehr. Allerdings gibt es dann auch Probleme mit dem benutzer, denke ich

    Was das from: angeht, Danke für den Tipp! Allerdings sagt mir mein Bauchgefühl, dass ein Adapter auf den Taster reagiert und dann entsprechend das Licht schaltet, da wäre dann beim manuellen Drücken kein Unterschied, der Trigger würde immer vom Adapter gefeuert.

    Bin gespannt, was @maerzpa sagt, das from: wäre schon viel cooler

Suggested Topics

1.1k
Online

38.3k
Users

43.7k
Topics

611.3k
Posts