Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. Blockly
    5. Telegram wenn Bedingung eine bestimmte Zeit wahr

    NEWS

    • Neuer Blog: Fotos und Eindrücke aus Solingen

    • ioBroker@Smart Living Forum Solingen, 14.06. - Agenda added

    • ioBroker goes Matter ... Matter Adapter in Stable

    Telegram wenn Bedingung eine bestimmte Zeit wahr

    This topic has been deleted. Only users with topic management privileges can see it.
    • M
      markusn78 last edited by markusn78

      Hallo zusammen,
      ich habe da ein kleines Verständnissproblem bei den Verzögerungen:

      Folgende Situation:
      Ich messe per Steckdose die Leistung meiner Spülmaschine, wenn die >10W ist dann setze ich mir
      eine Variable: Spuelmaschine_aktiv
      Nun möchte ich, dass wenn die Spülmaschine 10 Minuten <5W ist, mir eine Telegramnachricht geschickt wird.

      Der einfache Part ist der mit <5W, nun meine Frage: Wie setze ich das mit den 10 Minuten um?
      Mein Ansatz ist folgender, ich bin mir aber nicht sicher ob das so richtig ist:

      var Spuelmaschine_aktiv, timeout;
      
      
      Spuelmaschine_aktiv = false;
      on({id: 'alias.0.Steckdosen.Spuelmaschine.ENERGY_Power', change: "ne"}, async function (obj) {
        var value = obj.state.val;
        var oldValue = obj.oldState.val;
        if ((obj.state ? obj.state.val : "") > 10 && Spuelmaschine_aktiv == false) {
          Spuelmaschine_aktiv = true;
        } else if ((obj.state ? obj.state.val : "") < 5 && Spuelmaschine_aktiv == true) {
          timeout = setTimeout(async function () {
            sendTo("telegram", "send", {
                text: 'Die Spülmaschine ist fertig!'
            });
            Spuelmaschine_aktiv = false;
          }, 300000);
        } else if ((obj.state ? obj.state.val : "") >= 5) {
          (function () {if (timeout) {clearTimeout(timeout); timeout = null;}})();
        }
      });
      

      Screenshot 2021-12-14 155612.png

      Mein Problem aktuell ist, dass ich Mehrfachmeldungen bekomme, und da könnten es halt zwei Verursacher sein:

      1. Die Timeoutzeit ist zu kurz gewählt
      2. Ein Denkfehler im Script

      Vielleicht habt ihr ja eine Idee?

      B Homoran 2 Replies Last reply Reply Quote 0
      • B
        badsnoopy667 @markusn78 last edited by badsnoopy667

        @markusn78
        Ich glaube Du bekommst aktuell immer eine Nachricht, wenn der Wert unter 5W fällt...nur halt mit 5 Minuten Verzögerung.
        Nimm mal den telegram-Block aus dem timeout-Block raus und pack es separat mit einer if-Abfrage auf spuelmaschine aktiv = false, dann telegram senden (außerhalt deiner if-Abfragen). In dem timeout Block musst du dann nur noch das spuelmaschine = false setzen drinn lassen. Und ich würde innerhalb des timeout-Blocks nochmal abfragen, ob der Wert immer noch <5W ist und danach erst spuelmaschine auf false setzen.
        So kriegst Du nur eine Nachricht, wenn die Spuelmaschine wirklich fertig ist und nciht jedesmal wenn der Wert unter 5W fällt.

        M 1 Reply Last reply Reply Quote 0
        • M
          markusn78 @badsnoopy667 last edited by

          @badsnoopy667
          Ich dachte eigentlich der else if block, der auf >5 abfragt, würde den Timeout wieder löschen, und er würde dann wieder von neuem starten, solange bis halt irgendwann der Time-out mal abgelaufen ist?

          B 2 Replies Last reply Reply Quote 0
          • B
            badsnoopy667 @markusn78 last edited by

            @markusn78
            Ja, da kann ich jetzt gar nicht so viel gegen sagen... das sehe ich auch so... sorry, hab den letzten Teil irgendwie "übersehen". 😉

            1 Reply Last reply Reply Quote 0
            • B
              badsnoopy667 @markusn78 last edited by

              @markusn78 Achso, kannst Du das Blockly mal als Blockly-Export posten? Du hast nur das Javascrip gepostet, das kann man nicht wieder importieren. Würd mal gerne was testen!

              1 Reply Last reply Reply Quote 0
              • Homoran
                Homoran Global Moderator Administrators @markusn78 last edited by

                @markusn78 du hast ein ganz großes Problem:

                Dein Timeout kann mehrfach gestartet werden, ohne dass der Timeout vorher beendet wird.
                Danach kann der Timeout nicht mehr gestoppt werden, weil er mehrfach läuft

                Bei zwei (und mehr) unterschiedlichen Messungen <5 kommt es jedesmal zum Start des Timeouts

                M 1 Reply Last reply Reply Quote 0
                • M
                  markusn78 @Homoran last edited by

                  @homoran
                  Danke, das ist auf jedenfall schon mal richtig.
                  Ich habe das nun wie folgt geändert:

                  var Spuelmaschine_aktiv, Timeout_laeuft, timeout;
                  
                  
                  Spuelmaschine_aktiv = false;
                  on({id: 'alias.0.Steckdosen.Spuelmaschine.ENERGY_Power', change: "ne"}, async function (obj) {
                    var value = obj.state.val;
                    var oldValue = obj.oldState.val;
                    if ((obj.state ? obj.state.val : "") > 10 && Spuelmaschine_aktiv == false) {
                      Spuelmaschine_aktiv = true;
                    } else if ((obj.state ? obj.state.val : "") < 5 && Spuelmaschine_aktiv == true && Timeout_laeuft == false) {
                      Timeout_laeuft = true;
                      timeout = setTimeout(async function () {
                        sendTo("telegram", "send", {
                            text: 'Die Spülmaschine ist fertig!'
                        });
                        Spuelmaschine_aktiv = false;
                      }, 300000);
                    } else if ((obj.state ? obj.state.val : "") >= 5 && Timeout_laeuft == true) {
                      (function () {if (timeout) {clearTimeout(timeout); timeout = null;}})();
                      Timeout_laeuft = false;
                    }
                  });
                  

                  Screenshot 2021-12-14 164432.png

                  Damit startet der Timeout nur einmalig.

                  Mal schauen ob es dass jetzt war... erstmal die Spülmaschine voll bekommen 🙂

                  Homoran 1 Reply Last reply Reply Quote 0
                  • Homoran
                    Homoran Global Moderator Administrators @markusn78 last edited by

                    @markusn78 sagte in Telegram wenn Bedingung eine bestimmte Zeit wahr:

                    Mal schauen ob es dass jetzt war... erstmal die Spülmaschine voll bekommen

                    sieht gut aus

                    paul53 1 Reply Last reply Reply Quote 0
                    • paul53
                      paul53 @Homoran last edited by paul53

                      @homoran sagte: sieht gut aus

                      Aber sehr kompliziert. Es sollte auch so funktionieren:

                      Bild_2021-12-14_165231.png

                      Anmerkung: Wichtig ist

                      else if not timer-variable
                      

                      um den Mehrfachstart des Timers zu verhindern.

                      Homoran 1 Reply Last reply Reply Quote 1
                      • Homoran
                        Homoran Global Moderator Administrators @paul53 last edited by

                        @paul53 sagte:

                        Aber sehr kompliziert.

                        richtig. Aber ich wollte erst einmal nicht zu viel auf einmal ändern.

                        @paul53 sagte in Telegram wenn Bedingung eine bestimmte Zeit wahr:

                        Es sollte auch so funktionieren:

                        Ist das eine Witz? 🙂

                        1 Reply Last reply Reply Quote 0
                        • First post
                          Last post

                        Support us

                        ioBroker
                        Community Adapters
                        Donate

                        528
                        Online

                        31.9k
                        Users

                        80.2k
                        Topics

                        1.3m
                        Posts

                        4
                        10
                        347
                        Loading More Posts
                        • Oldest to Newest
                        • Newest to Oldest
                        • Most Votes
                        Reply
                        • Reply as topic
                        Log in to reply
                        Community
                        Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen
                        The ioBroker Community 2014-2023
                        logo