Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. Blockly
    5. Auslösen nur bei Falsch

    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

    Auslösen nur bei Falsch

    This topic has been deleted. Only users with topic management privileges can see it.
    • MartinP
      MartinP @xadox last edited by MartinP

      @xadox Das ist einfach eine Definition der Programmiersprache Javascript, dass true > false ist...

      Ich habe übrigens beide Varianten mit einem kleinen Example state in Userdata ausprobiert - auch die Variante mit der "=" Abfrage funktioniert... Die "Kleiner als" Variante braucht aber eine Klammerebene weniger ...

      b9025da7-ddad-46a6-8341-bf8c32349600-grafik.png

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

        @martinp sagt: Reed-Kontakte "prellen" ganz gerne

        Das vermute ich auch. Man sollte also entprellen:

        Blockly_temp.JPG

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

          Zum Beispiel von @paul53 Das Problem wird nicht das "Prellen" beim Wechsel True -> False sein, sondern ein "Prellen" beim Wechsel False -> True. Da ist der True-Zustand erstmal nicht stabil, sondern es wird noch einige Male kurz "false" gemeldet.
          ...

          Also muss erst in den zu erstellenden "Aktionen" Block die Abfrage, ob der Zustand False vorliegt. Der Timeout muss bei jedem Wechsel - egal in welche Richtung aufgezogen werden ...

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

            @martinp sagte: Der Timeout muss bei jedem Wechsel - egal in welche Richtung aufgezogen werden ...

            Weshalb? Es muss nur die Wirkung während des Prellens eingehender weiterer Trigger unterdrückt werden.

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

              @paul53 falls der Low-Zustand lange stabil angelegen hat, ist der Entprell-Timeout für den High->Low Übergang abgelaufen.

              Wenn dann beim darauf folgenden Low->High Übergang der Entprell-Timeout nicht aufgezogen wird, wird die fallende Flanke des ersten "Preller", der diesem Übergang folgt als regulärer High->Low Übergang interpretiert ...

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

                @martinp sagte: falls der Low-Zustand lange stabil angelegen hat

                ... dann prellt der Kontakt nicht mehr. Prellen bewirkt schnelle Änderungen in beide Richtungen.

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

                  @paul53 Es geht um die Preller die dem Low->High Übergang folgen - gibt es da Preller, enthalten diese natürlich auf "fake" High-Low-Übergänge, die ausgeblendet werden müssen.

                  Dein Beispiel-Schnipsel arbeitet da aber durchaus korrekt, er zieht den Timeout bei jeder Flanke auf ... Da der "Wenn" Block aber noch nicht enthalten war, habe ich nur auf die korrekte Platzierung von diesem hingewiesen...

                  1 Reply Last reply Reply Quote 0
                  • xadox
                    xadox last edited by

                    Ich habe eurer Diskussion nicht ganz folgen können aber dies hat das Problem auch nicht lösen können:

                    a8f997d6-5e0b-4491-b5ba-0d202e2a1e30-image.png

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

                      @xadox sagte in Auslösen nur bei Falsch:

                      dies hat das Problem auch nicht lösen können

                      heisst in beschreibender Sprache?

                      1 Reply Last reply Reply Quote 0
                      • xadox
                        xadox last edited by

                        Trigger löst nach wie vor bei jeder Änderung aus.
                        Sowohl auf false auch auch auf true.

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

                          @xadox sagte: Trigger löst nach wie vor bei jeder Änderung aus.
                          Sowohl auf false auch auch auf true.

                          Wie stellst du das fest? Mit entsprechenden Logs?

                          Blockly_temp.JPG

                          xadox 1 Reply Last reply Reply Quote 0
                          • MartinP
                            MartinP last edited by MartinP

                            @paul53 Durch die Nutzung von "ist kleiner als Letztes" kommt vom Prellen am Übergang Low->High der erste Impuls ungefiltert durch.

                            So etwas in der Art sollte das beheben. Habe ich mal für einen kurzen Test genutzt...

                            3f76698f-2f3f-4641-9270-9a0e2c7230d3-grafik.png

                            Hier ist aber die Sperrzeit, bevor wieder Änderungen angenommen werden mit 8000 ms sicherlich deutlich zu hoch...

                            Alternativ wäre natürlich zu fragen, ob nicht direkt im Shelly der Eingang entprellt werden kann, entweder per Konfiguration in der Shelly Firmware, oder in Form einer Vorschalt-Mimik zwischen Shelly und Reed-Kontakt ...
                            Da wird ja schon bei jedem Prellen unnötig ein Telegramm auf die Reise geschickt ...

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

                              @martinp sagte: kommt vom Prellen am Übergang Low->High der erste Impuls ungefiltert durch.

                              Das ist der Sinn von Entprellen: Die erste Flanke true --> false löst die gewünschte Aktion ohne Verzögerung aus und weitere Flanken (Prellen) werden während der Sperrdauer ignoriert.

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

                                @paul53 said in Auslösen nur bei Falsch:

                                Das ist der Sinn von Entprellen: Die erste Flanke true --> false löst die gewünschte Aktion ohne Verzögerung aus und weitere Flanken (Prellen) werden während der Sperrdauer ignoriert.

                                Nur, dass es auch beim Übergang false-->true durch das Prellen des Kontaktes zu Flanken true-->false kommt ... ich habe mal eine Skizze hingeschmiert. Verzeiht meine Sauklaue ...
                                bf249eee-c1f3-43d3-a5d7-dc08e0e176b9-grafik.png

                                Wenn man den Timeout sowohl an steigenden, als auch an fallenden Flanken startet ("wurde geändert" statt "ist kleiner als letztes") behebt man das Problem der Auslösung durch das Prellen an der steigenden Flanke

                                paul53 1 Reply Last reply Reply Quote 1
                                • paul53
                                  paul53 @MartinP last edited by paul53

                                  @martinp sagte: behebt man das Problem der Auslösung durch das Prellen an der steigenden Flanke

                                  Du hast recht. An das Prellen wenn von false --> true geschaltet wird, habe ich nicht gedacht. Also besser so:

                                  Blockly_temp.JPG

                                  EDIT: "stop timeout" ist seit JS-Version 7.0.5 überflüssig, da seitdem Blockly automatisch bei Ablauf des Timers die Variable timeout auf null zurück setzt.

                                  MartinP G 2 Replies Last reply Reply Quote 2
                                  • MartinP
                                    MartinP @paul53 last edited by MartinP

                                    So ganz gefällt mir das "späte" Entprellen aber nicht, da werden sinnlos viele MQTT Telegramme durch die Gegend geschickt. Das Filtern weiter vorne im Signalweg vom Reed-Kontakt zum Blockly Skript zu machen wäre sicherlich die sauberere Lösung ...

                                    Habe aber mal geschaut, und z. B. beim shelly plus i4 keine Möglichkeit gefunden, dort schon im Shelly-Device ein Entprellen (engl. deglitching/debouncing) zu konfigurieren https://kb.shelly.cloud/knowledge-base/shelly-plus-i4-web-interface-guide

                                    Wal 1 Reply Last reply Reply Quote 0
                                    • Wal
                                      Wal Developer @MartinP last edited by Wal

                                      @martinp @paul53,
                                      wie wäre es eine Variable zu nutzen die bei true->false gesetzt wird und nach dem Timeout wieder zurückgesetzt wird.

                                      Mache ich so bei meiner Klingel.

                                      on({id: "mqtt.0.piface.input.DoorBell_1", val: true}, function (obj) {
                                          if (bell) {
                                              snap = '/opt/iobroker/snapshots/snap_' + formatDate(obj.state.lc, 'TT.MM.JJJJ_hh:mm:ss') + '.jpg';
                                              sendImage();
                                          }
                                          bell = false;
                                          setTimeout(function() {
                                              bell = true;
                                            }, 120000);
                                      });
                                      
                                      MartinP 1 Reply Last reply Reply Quote 0
                                      • MartinP
                                        MartinP @Wal last edited by

                                        @wal Genau so macht das das Blockly Skript aus meinem Post etwas weiter oben ja, wenn man sich den Code des Blockly anschaut ...

                                        var timeout2;
                                        
                                        
                                        on({ id: '0_userdata.0.example_state' /* Example state */, change: 'ne' }, async (obj) => {
                                          let value = obj.state.val;
                                          let oldValue = obj.oldState.val;
                                          if (!timeout2) {
                                            timeout2 = setTimeout(async () => {
                                              timeout2 = null;
                                              (() => { if (timeout2) { clearTimeout(timeout2); timeout2 = null; }})();
                                              console.log('8 Sec Timeout abgelaufen');
                                            }, 8000);
                                            if ((obj.state ? obj.state.val : "") == false) {
                                              console.log('0 Sekunden');
                                              await wait(3000);
                                              console.log('3 Sekunden');
                                              await wait(3000);
                                              console.log('6 Sekunden');
                                            }
                                          }
                                        });
                                        
                                        1 Reply Last reply Reply Quote 0
                                        • xadox
                                          xadox @paul53 last edited by xadox

                                          @paul53 >>Wie stellst du das fest? Mit entsprechenden Logs?
                                          Indem ich sehe, dass die eigentliche Aktion sowohl bei true als auch bei false ausgelöst wird.

                                          Ich habe aber hier wieder den Faden verlohren 😂
                                          Und weiß nicht genau welchen dieser Vorschläge ich nun am ehesten nutzen soll.

                                          Ist denn überhaupt sichergestellt, dass der Reek Kontakt wirklich "prellt"?
                                          In der iob Übersicht sieht es zumindest mit dem bloßen Auge nach einer normalen schaltung von false auf true und von true auf false aus ohne mehrfach hin und her zu schalten.

                                          paul53 MartinP 2 Replies Last reply Reply Quote 0
                                          • paul53
                                            paul53 @xadox last edited by paul53

                                            @xadox sagte: mit dem bloßen Auge

                                            Mit dem bloßen Auge kann man Prellen nicht erkennen, denn es passiert im Abstand von wenigen ms. Eine Logausgabe des Trigger-Wertes zeigt, ob es prellt.

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

                                            Support us

                                            ioBroker
                                            Community Adapters
                                            Donate

                                            913
                                            Online

                                            31.9k
                                            Users

                                            80.1k
                                            Topics

                                            1.3m
                                            Posts

                                            8
                                            40
                                            2501
                                            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