Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. Blockly
    5. true Abfrage alle 2 Sek.

    NEWS

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

    • ioBroker goes Matter ... Matter Adapter in Stable

    • Monatsrückblick - April 2025

    true Abfrage alle 2 Sek.

    This topic has been deleted. Only users with topic management privileges can see it.
    • Asgothian
      Asgothian Developer @Aphofis last edited by

      @Aphofis
      Auch in diesem Fall würde ich NICHT über "Polling" Methoden arbeiten, sondern die Statusänderung abfangen. Die Einzusetzende Methode wäre:

      • variable für die Restlaufzeit definieren
      • Trigger auf den Datenpunkt, vergleich Größer als vorher (Wechsel false auf true, triggerA), darin:, Startzeitpunkt merken, timeout starten der nach Ablauf der Restlaufzeit die Pumpe abschaltet und die Restlaufzeit auf 0 setzt, Pumpe anschalten
      • Trigger auf den Datenpunkt, vergleich Kleiner als vorher (Wechsel true auf false, triggerB), darin: An-Zeit der Pumpe berechnen, gelaufene Zeit von der Restlaufzeit abziehen, Timeout loeschen, Pumpe abschalten.
      • Schedule definieren - jeweils um Mitternacht: timeout löschen wenn er laeuft, Restlaufzeit auf 300 sek, pruefen ob Datenpunkt = true, wenn ja: Pumpe an, timeout mit Restlaufzeit wie oben.

      Gegebenenfalls musst du die beiden Trigger noch gegen prellen sichern. Wenn du mal nach "Sensoren entprellen" im Forum suchst dann solltest du etwas finden. Ob das Notwendig ist hängt davon ab in wie weit dein Schwimmer eine Schalthysterese besitzt.

      Ein regelmäßiges Pollen des Eingangs alle x Sekunden ist so unnötig. Du kannst das aber auch damit machen, wenn du eine Shedule definierst, die alle 30 Sekunden den Wert holt und die Prüfung die im Trigger oben gemacht wird manuell durchführt (letzter Wert false, aktueller Wert true => das was oben triggerA genannt ist ausführen, letzter Wert true, aktueller Wert false => das was oben triggerB genannt ist ausführen.

      Ich hoffe mit diesem "pseudocode" kommst du zu Recht. Wenn nicht koennen wir das heute Abend gerne gemeinsam in JS Code verwandeln.

      A.

      Aphofis 1 Reply Last reply Reply Quote 0
      • Aphofis
        Aphofis @Asgothian last edited by Aphofis

        @Asgothian
        Das schon mal ein Anfang!
        Ob ich das hinbekomme weiß ich noch nicht.
        Das muss ich sehen.
        Was meinst du mit gegen prellen!?
        Die Schwimmer sind jeder über einen 10 kOhm widerstand verdrahtet.
        Wenn du das meinst?

        Asgothian 1 Reply Last reply Reply Quote 0
        • Asgothian
          Asgothian Developer @Aphofis last edited by

          @Aphofis es geht darum zu verhindern das die Pumpe ständig an und aus geschaltet wird wenn der Schwimmer Nähe am Schaltpunkt ist.

          A.

          Aphofis 1 Reply Last reply Reply Quote 0
          • Aphofis
            Aphofis @Asgothian last edited by

            @Asgothian
            Mehr oder minder, Das soll natürlich auch nicht passieren das dass Magentventil zu frü und somit zu lange schaltet.
            und es soll geprüft werden ob wirklich true ist und Tasmota ESP definitiv alive ist und nicht mehr als 300 sek am tag gepumpt wird. sprich nicht mehr als um und bei 10 Liter.

            Asgothian 1 Reply Last reply Reply Quote 0
            • Asgothian
              Asgothian Developer @Aphofis last edited by

              @Aphofis
              Wie sicher gestellt werden kann das der Tasmota ESP aktiv ist hängt davon ab wie die Kommunikation dazu organisiert ist. Vielleicht macht es Sinn das per TS kurz durchzusprechen, dann kann das Script darauf auch reagieren, aber:

              • solange wie der Schalter angesteuert werden kann ist sichergestellt das er pro Tag max. 300 s an ist.
              • Lässt er sich nicht einschalten, dann bekommt das Script das aktuell nicht mit, ähnlich ist es wenn er sich nicht abschalten lässt.
              • Zu beantworten wäre die Frage was passieren soll wenn der ESP nicht erreichbar ist - in diesem Fall kann wenn ich das richtig erinnere nicht geschaltet werden (weder ein noch aus)

              A.

              Aphofis 1 Reply Last reply Reply Quote 0
              • Aphofis
                Aphofis @Asgothian last edited by

                @Asgothian
                also alive muss nicht unbedingt sein.
                Es langt ja völlig wenn einfach geprüft wird ob true oder false und nicht mehr als 300 sek am tag.

                Asgothian 1 Reply Last reply Reply Quote 0
                • Asgothian
                  Asgothian Developer @Aphofis last edited by

                  @Aphofis
                  Das würde das in meinem Ablauf beschriebene Script durchaus leisten. (in beiden Varianten)

                  Aphofis 1 Reply Last reply Reply Quote 0
                  • Aphofis
                    Aphofis @Asgothian last edited by

                    @Asgothian
                    Das wäre ja was !? Ich habe mir den kram acuh aufgeschrieben, nur dann das ganze in Blockly umsetzen ist etwas kniffeliger.

                    Asgothian 1 Reply Last reply Reply Quote 0
                    • Asgothian
                      Asgothian Developer @Aphofis last edited by

                      @Aphofis Ich empfehle das nicht in Blockly zu tun.

                      Aktuell ist es anscheinend nicht möglich, den Timeout im Blockly durch eine Variable zu setzen. Ich kann Dir jetzt aber auch einen JS Script-stub schreiben, wo du nur die Namen der Datenpunkte anpassen musst.

                      A.

                      Aphofis 1 Reply Last reply Reply Quote 0
                      • Aphofis
                        Aphofis @Asgothian last edited by

                        @Asgothian
                        Kann man das script auch in blockly einbinden!? Damit ggf auch text nachrichten zb via telegram möglich sind !? Da pures Javascript komme ich null mit klar da was einzubauen. Klar Datenpunkte ändern bekomme ich hin.

                        Asgothian 1 Reply Last reply Reply Quote 0
                        • Asgothian
                          Asgothian Developer @Aphofis last edited by Asgothian

                          @Aphofis
                          Nicht ohne weiteres, aber es gibt da einen einfachen Trick: Bau dir die Aktionen die du haben willst als Blockly zusammen, und lass dir dann den JS code anzeigen. Den kannst du dann in das JS Script kopieren. Die relevanten Stellen hab ich im Script markiert

                          A.

                          var Restzeit, timeout, Nachricht, StartTime;
                          var Pump = "Pump Object ID"
                          var Schwimmer = 'Schwimmer Object ID'
                          
                          Restzeit = 300;
                          StartTime = -1;
                          function PumpOn()
                           {
                               if (timeout) { clearTimeout(timeout); timeout = null;};
                               timeout = setTimeout(function () {
                                  StartTime = -1;
                                 Restzeit = 0;
                                  setState(Pump, false);
                          // Hier wird die Pumpe abgeschaltet wenn die Zeit abgelaufen ist.
                              }, Restzeit * 1000);
                          // Hier wird die Pumpe eingeschaltet.
                              setState(Pump, true);
                              StartTime = (new Date().getSeconds())
                          }
                          
                          on({id: Schwimmer, change: "gt"}, function (obj) {
                            if (Restzeit > 0) { PumpOn() };
                          });
                          on({id: Schwimmer, change: "lt"}, function (obj) {
                            if (StartTime > 0) {
                              if (timeout) {
                                 clearTimeout(timeout); 
                                 timeout = null;
                             }
                             Restzeit = Restzeit - ((new Date().getSeconds()) - StartTime);
                            }
                            setState(Pump, false);
                          // Hier wird die Pumpe abgeschaltet wenn der Schwimmer "false" meldet. 
                          // Wichtig - die Pumpe wird hier auch dann abgeschaltet wenn sie nicht vorher über das Script eingeschaltet wurde.
                          });
                          schedule("0 0 * * *", function () {
                            Restzeit = 300;
                            if (getState(Schwimmer).val) {PumpOn(); }
                          });
                          
                          Aphofis 2 Replies Last reply Reply Quote 1
                          • Aphofis
                            Aphofis @Asgothian last edited by

                            @Asgothian
                            ok dan bastel ich das script mal in meine steuerung

                            Asgothian 1 Reply Last reply Reply Quote 0
                            • Asgothian
                              Asgothian Developer @Aphofis last edited by Asgothian

                              @Aphofis Viel Glück damit.

                              Noch ein Hinweis: Ich hab die Objekt ID's als Variablen nach oben geholt, so das du sie nur einmal anpassen musst. Und der Schedule ist auf Mitternacht jeden Tag eingestellt.

                              Nachtrag - es war noch ein Fehler drin, ist jetzt behoben.

                              A.

                              Aphofis 1 Reply Last reply Reply Quote 0
                              • Aphofis
                                Aphofis @Asgothian last edited by

                                @Asgothian
                                Das sehr nett!
                                Können das das normale Blockly und das JavaScript gemeinsam laufen oder kann man das bestehende mit einbauen!?
                                Da über mein bisheriges Blockly Script die Osmose Steuerung läuft und wiederrum über das Magnet Ventil der Osmose Tages und GEsamtzähler.

                                Asgothian 1 Reply Last reply Reply Quote 0
                                • Asgothian
                                  Asgothian Developer @Aphofis last edited by Asgothian

                                  @Aphofis
                                  Klar. Es ist egal wie die verschiedenen Scripte erstellt wurden. Du kannst Blockly, JS und Typescript scripte beliebig mischen.

                                  A.
                                  Nachtrag: Ich empfehle sogar die scripte in einzelne logische Blöcke aufzuteilen und als einzelne Scripte laufen zu lassen. Dann kannst du einzelne Funktionen temporär abschalten und die Fehlersuche wird auch einfacher.
                                  A.

                                  Aphofis 1 Reply Last reply Reply Quote 1
                                  • Aphofis
                                    Aphofis @Asgothian last edited by

                                    @Asgothian
                                    Das stimmt!
                                    Ich baue auch ungerne mega blocklys wo ich dann des späteren kaum noch überblick habe und mich erst lange ins script einlesen muss.
                                    übernimmt denn dein script nun die algemeine osmose steuerung für das magnet ventil !? Da Ja der Osmose Zähler über das magnetventil läuft muss das normale blockly zur osmose steuerung doch eigentlich ausgeschaltet werden.!?

                                    Asgothian 1 Reply Last reply Reply Quote 0
                                    • Aphofis
                                      Aphofis last edited by

                                      Das ist die normale Blockly Steuerung für die Osmose

                                      var value, status2;
                                      
                                      /**
                                       * Function um umsetzen von true / false nach offen / geschlossen
                                       */
                                      function umsetzen(value, status2) {
                                        if (value == true) {
                                          status2 = ' aktiv';
                                        } else {
                                          status2 = 'inaktiv';
                                        }
                                        return status2;
                                      }
                                      
                                      
                                      on({id: "sonoff.0.Aqua_Float.POWER1"/*Osmose_Niveau*/, change: "ne"}, function (obj) {
                                        var value = obj.state.val;
                                        var oldValue = obj.oldState.val;
                                        if (getState("sonoff.0.Aqua_Float.POWER1").val == true) {
                                          setState("sonoff.0.Aqua_Control.POWER1"/*Osmose_Magnetventil*/, true);
                                          console.log(('Magnetventil ist ' + String(umsetzen(getState("sonoff.0.Aqua_Control.POWER1").val, status2))));
                                        } else if (getState("sonoff.0.Aqua_Float.POWER1").val == false) {
                                          setState("sonoff.0.Aqua_Control.POWER1"/*Osmose_Magnetventil*/, false);
                                          console.log(('Magnetventil ist ' + String(umsetzen(getState("sonoff.0.Aqua_Control.POWER1").val, status2))));
                                        } else if (getState("sonoff.0.Aqua_Float.POWER4").val == true) {
                                          setState("javascript.0.scriptEnabled.Automatik_Steuerung.Osmose_Niveau_Normal"/*scriptEnabled.Automatik_Steuerung.Osmose_Niveau_Normal*/, false);
                                          setState("sonoff.0.Aqua_Control.POWER1"/*Osmose_Magnetventil*/, false);
                                        } else if (getState("sonoff.0.Aqua_Float.POWER4").val == false) {
                                          setState("javascript.0.scriptEnabled.Automatik_Steuerung.Osmose_Niveau_Normal"/*scriptEnabled.Automatik_Steuerung.Osmose_Niveau_Normal*/, true);
                                        }
                                      });
                                      
                                      
                                      1 Reply Last reply Reply Quote 0
                                      • Asgothian
                                        Asgothian Developer @Aphofis last edited by

                                        @Aphofis
                                        Die Frage kann ich dir nicht beantworten. Dafür kenne ich mich mit dem was du steuern willst einfach nicht genug aus. Prinzipiell können 2 Scripte die gleichen Objekte ansteuern, allerdings ist dann (in diesem Beispiel) nicht sichergestellt das die Pumpe wirklich nur 300 s läuft, diese Zeitabfrage gilt nur für die Zeit die durch den Schwimmer eingeschaltet ist.

                                        A.

                                        Aphofis 1 Reply Last reply Reply Quote 0
                                        • Aphofis
                                          Aphofis @Asgothian last edited by

                                          @Asgothian
                                          Das macht dann auch keinen Sinn beides laufen zu lassen.
                                          Dann lasse ich nur das JavaScript laufen und werde beobachten und testen. Dann melde ich mich wie es läuft.
                                          Vielen Dank

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

                                            Also was ich sagen kann Magnetvetil reagiert auf den Schwimmer und Osmose wird fleißig weter gezählt.
                                            Das blockly zum steuern vom magnetventil hab ich abgeschaltet.
                                            Kann man eine telegram nachricht einbauen wenn die 300 sek bzw 10 liter am tag erreicht sind !?
                                            denn davon ist auch abhängig wann ich den Salzgehalt im Becken angleichen muss.

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

                                            Support us

                                            ioBroker
                                            Community Adapters
                                            Donate

                                            887
                                            Online

                                            31.6k
                                            Users

                                            79.6k
                                            Topics

                                            1.3m
                                            Posts

                                            7
                                            87
                                            4975
                                            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