Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. Blockly mit Bedingung und schedule

    NEWS

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

    • ioBroker goes Matter ... Matter Adapter in Stable

    • Monatsrückblick - April 2025

    Blockly mit Bedingung und schedule

    This topic has been deleted. Only users with topic management privileges can see it.
    • Homoran
      Homoran Global Moderator Administrators last edited by

      @Dutchman:

      meine glaskugel geht gerade nicht, wo ist dein Regenintensität-Blockly ? `
      um das geht es eigentlich die Ganze Zeit:

      http://forum.iobroker.net/posting.php?m … 87#pr88873

      Habe inzwischen ganz unten noch einen debug-Block drangehängt, der mir den Wert des regensensor States ausgibt.

      javascript.0	2017-10-08 16:10:03.336	info	script.js.Regenintensitaet: Check - fertig
      javascript.0	2017-10-08 16:10:03.336	info	script.js.Regenintensitaet: Der Zustand vom Regensensor ist: 0
      

      (Im Moment regnet es mal wieder nicht)

      Gruß

      Rainer

      1 Reply Last reply Reply Quote 0
      • Dutchman
        Dutchman Developer Most Active Administrators last edited by

        @Homoran:

        @Dutchman:

        meine glaskugel geht gerade nicht, wo ist dein Regenintensität-Blockly ? `
        um das geht es eigentlich die Ganze Zeit:

        http://forum.iobroker.net/posting.php?m … 87#pr88873

        Habe inzwischen ganz unten noch einen debug-Block drangehängt, der mir den Wert des regensensor States ausgibt.

        javascript.0	2017-10-08 16:10:03.336	info	script.js.Regenintensitaet: Check - fertig
        javascript.0	2017-10-08 16:10:03.336	info	script.js.Regenintensitaet: Der Zustand vom Regensensor ist: 0
        

        (Im Moment regnet es mal wieder nicht)

        Gruß

        Rainer `

        hast du meinen block als vorschlag mal probiert ? Also nicht wiederhohle sondern interval

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

          Noch nicht!

          Wollte es erst mit meiner Version testen. Ich denke der Fehler liegt woanders. Wenn du mir erklären kannst, warum in meiner Version der debug-block "es regnet" nicht ausgeführt wird wären ich schon ein Stück weiter.

          Selbst wenn der wiederhole-Block nicht funktioniert hätte doch der debug-Block "es regnet" ausgegeben werden müssen, ODER?

          Gruß

          Rainer

          1 Reply Last reply Reply Quote 0
          • Dutchman
            Dutchman Developer Most Active Administrators last edited by

            @Homoran:

            Selbst wenn der wiederhole-Block nicht funktioniert hätte doch der debug-Block "es regnet" ausgegeben werden müssen, ODER? `

            jup, verstehe ich auch nicht warum er fuer die ansagen geht aber nicht fuer den block mit berechnungen er ist ja gleich.

            DUe koennste mal zum spass den wert in eine variable schreiben und dan die variable als debug block auslesen vielleicht war er doch was anderes als 1 zu de zeitpunkt?

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

              Nachdem keiine Meldungen mehr im Blockly-log kamen und nach neustart des javascript-Adapters Error code7 already running kam, habe ich mir über die Konsole mit top die Prozesse angesehen.

              Sobald ich den Block mit falls… unten angehängt hatte, damit er immer läuft stieg der Adapter mit 100% CPU aus.

              Da muss ich erst mal nachdenken warum.

              Deine Version scheint keine Probleme zu machen.

              ...waiting for rain again.

              Rainer

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

                Bei dem nächsten Regen lief die neue Version nahezu komplett.

                nur nach dem Regen hörte sie nicht mehr auf mit dem "Auführen Intervall"

                Ich hatte das "sonst - clear interval" vergessen :oops:

                Warum der Wert in Liter / Minute immer auf 0 stand??

                Ich logge jetzt die Werte mal.

                insgesamt fielen 0,3mm Regen - nicht viel aber >0!

                Warum meine Version den js-Adapter an die Kapazitätsgrenzen brachte habe ich noch nicht herausbekommen.

                Danke für die Hilfe

                Rainer

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

                  @Homoran:

                  Warum meine Version den js-Adapter an die Kapazitätsgrenzen brachte habe ich noch nicht herausbekommen. `
                  Wenn Du den Javascript-Code (in Code-Tags) postest, kann Dir vielleicht geholfen werden.

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

                    Hallo Paul,

                    ich hoffe ich habe ihn wieder vollständig rekonstruiert:

                    on({id: 'hm-rpc.0.KEQ1022589.1.STATE', change: "ne"}, function (obj) {
                      var value = obj.state.val;
                      var oldValue = obj.oldState.val;
                      console.log('ist getriggert');
                      if (getState("hm-rpc.0.KEQ1022589.1.STATE").val == 1) {
                        console.log('es regnet');
                        while (!(getState("hm-rpc.0.KEQ1022589.1.STATE").val == 0)) {
                          schedule("*/3 * * * *", function () {
                            setState("Messwerte.0.Wetterdaten.Regenintensitaet"/*Regenintensitaet*/, ((getState("hm-rpc.0.JEQ0140901.1.RAIN_COUNTER").val - getState("Messwerte.0.Wetterdaten.Regenmenge_alt").val) / 3), true);
                            setStateDelayed("Messwerte.0.Wetterdaten.Regenmenge_alt"/*Regenmenge_alt*/, getState("hm-rpc.0.JEQ0140901.1.RAIN_COUNTER").val, true, 200, false);
                            console.log((String('Die Regenmenge der letzten drei Minuten betrug: ') + String(getState("hm-rpc.0.JEQ0140901.1.RAIN_COUNTER").val - getState("Messwerte.0.Wetterdaten.Regenmenge_alt").val)));
                          });
                        }
                        console.log('es regnet nicht mehr');
                      }
                      console.log('es regnet nicht');
                    });
                    console.log('Check - fertig');
                    console.log((String('Der Zustand vom Regensensor ist: ') + String(getState("hm-rpc.0.KEQ1022589.1.STATE").val)));
                    

                    144_regenintensitaet_blockly03.jpg

                    @paul53:

                    (in Code-Tags) ` 😄

                    Das ist der code, den Blockly ausspuckt.

                    Gruß

                    Rainer

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

                      while (!(getState("hm-rpc.0.KEQ1022589.1.STATE").val == 0))
                      

                      erzeugt den Dauerstress solange es regnet (Wert > 0). Eine Änderung des Wertes triggert erneut. Also nur

                      if(value) {
                         timer = schedule(...)
                      } else { 
                         clearSchedule(timer);
                      }
                      
                      console.log('Check - fertig');
                      console.log((String('Der Zustand vom Regensensor ist: ') + String(getState("hm-rpc.0.KEQ1022589.1.STATE").val)));
                      

                      wird nur einmal beim Skriptstart ausgeführt.

                        if (getState("hm-rpc.0.KEQ1022589.1.STATE").val == 1) {
                      

                      Es ist besser mit der Skriptvariablen value zu arbeiten (weniger CPU-Last)

                        if (value == 1) {
                      

                      Ein getState(id) auf die ID, mit der getriggert wurde, sollte man vermeiden.

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

                        Danke Paul,

                        das muss ich erst mal verdauen und sehen, wie ich das in Blockly umsetzen kann.

                        Danke

                        Rainer

                        1 Reply Last reply Reply Quote 0
                        • Dutchman
                          Dutchman Developer Most Active Administrators last edited by

                          @Homoran:

                          Danke Paul,

                          das muss ich erst mal verdauen und sehen, wie ich das in Blockly umsetzen kann.

                          Danke

                          Rainer `

                          Ich glaube was Paul da schreibt is genau mein Beispiel?

                          Nur triggern auf regen ja nein und den Intervall ausschalten wen es nicht mehr regnet

                          –-----------------------

                          Send from mobile device

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

                            Das folgende Blockly sollte das erledigen, was Du möchtest ?
                            493_regenintensit_t.jpg
                            Anmerkung: Mit Blockly dauert es bei mir mind. 5 mal solange als wenn ich es in Javascript eintippe.

                            1 Reply Last reply Reply Quote 0
                            • Dutchman
                              Dutchman Developer Most Active Administrators last edited by

                              @paul53:

                              Das folgende Blockly sollte das erledigen, was Du möchtest ?

                              Regenintensität.JPG

                              Anmerkung: Mit Blockly dauert es bei mir mind. 5 mal solange als wenn ich es in Javascript eintippe. `

                              🙂

                              genauso war mein erster vorschlag auf, Rainer moechte die berechnung aber nur laufen lassen wen es regnet daher war mein vorschlag das ueber einen interval zu loesen der getriggert wird durch true/false stand des regensensors.

                              Wie ist deine meinung dazu Paul ?

                              http://forum.iobroker.net/viewtopic.php … 387#p88853

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

                                @paul53:

                                Mit Blockly dauert es bei mir mind. 5 mal solange als wenn ich es in Javascript eintippe. `
                                Sorry Paul 😢

                                ich versuche mich so an js heranzu tasten.

                                Die Logik ist der erste Schritt, die Befehle (und Struktur) der zweite.

                                Bin jetzt ein paar Tage weg, werde baldmöglichst testen. Habe im Moment die Version mit interval. Mal sehen wann es wieder regnet.

                                Danke für eure Hilfe

                                Rainer

                                PS gibt es eigentlich (ähnlich zu Homematic) einen Trigger, der auf einen Wert im DP reagiert? - Wenn Leistung > 50W dann mache… oder muss man auf Änderung (Erhöhung) triggern und dann den falls... Block nehmen?

                                1 Reply Last reply Reply Quote 0
                                • Dutchman
                                  Dutchman Developer Most Active Administrators last edited by

                                  @Homoran:

                                  @paul53:

                                  PS gibt es eigentlich (ähnlich zu Homematic) einen Trigger, der auf einen Wert im DP reagiert? - Wenn Leistung > 50W dann mache… oder muss man auf Änderung (Erhöhung) triggern und dann den falls... Block nehmen?

                                  mit blockly nein da geht nur "hoeher als voriger, kleiner als voriger , ist true, ist false usw".

                                  Mit script geht es glaube ich wohl siehe pattern:

                                  on(pattern, callbackOrId, value)
                                  
                                  

                                  wobei man in dem "value" logic verarbeiten kan

                                  https://github.com/ioBroker/ioBroker.ja ... some-state

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

                                    @Homoran:

                                    gibt es eigentlich (ähnlich zu Homematic) einen Trigger, der auf einen Wert im DP reagiert? - Wenn Leistung > 50W dann mache `
                                    Ja.

                                    on({id: idLeistung, valGt: 50, oldValLe: 50} function(dp) {...});
                                    ````~~@Dutchman:~~ 
                                    
                                    > Rainer moechte die berechnung aber nur laufen lassen wen es regnet daher war mein vorschlag das ueber einen interval zu loesen der getriggert wird durch true/false stand des regensensors.
                                    > 
                                    > Wie ist deine meinung dazu Paul ? `  
                                    Funktioniert genauso. Durch die Abfrage auf Regen innerhalb des Schedule-Triggers ist das Ergebnis (fast) identisch. In Javascript würde ich es so machen:
                                    

                                    // Regenintensität
                                    const idCount = getIdByName('Wetterstation:1.RAIN_COUNTER');
                                    const idRegen = getIdByName('Regensensor:1.STATE');
                                    const idIntens = getIdByName('Regenintensitaet');
                                    const faktor = 1; // Umrechnung in mm/h

                                    // Skriptvariablen mit Initialisierung bei Skriptstart
                                    var menge = getState(idCount).val; // Merker Regenmenge für Differenz
                                    var timer = null; // für setInterval, clearInterval

                                    function intens() {
                                    var count = getState(idCount).val; // aktuelle Menge in lokale Skriptvariable, da mehr als einmal verwendet
                                    setState(idIntens, faktor * (count - menge), true);
                                    menge = count;
                                    }

                                    // Skriptstart
                                    if(getState(idRegen).val) {
                                    timer = setInterval(intens, 180000); // alle 3 Minuten
                                    }

                                    on(idRegen, function(dp) { // Triggern bei Wertänderung
                                    if(dp.state.val) { // es regnet
                                    timer = setInterval(intens, 180000); // alle 3 Minuten
                                    } else {
                                    if(timer) clearInterval(timer); // Stopp timer
                                    setState(idIntens, 0, true); // kein Regen, also Intensität 0
                                    }
                                    });

                                    Die Verwendung von setInterval() anstelle schedule() hat den Vorteil, dass auch nach Skriptstart die erste Berechnung nach genau 3 Minuten erfolgt.
                                    1 Reply Last reply Reply Quote 0
                                    • Homoran
                                      Homoran Global Moderator Administrators last edited by

                                      @paul53:

                                      Ja. `
                                      Also doch Javascript full statt Blockly 😞

                                      @paul53:

                                      Die Verwendung von setInterval() anstelle schedule() hat den Vorteil, dass auch nach Skriptstart die erste Berechnung nach genau 3 Minuten erfolgt. `
                                      und genau das ist passiert, lief nur unendlich weiter, weil ich depp das clear interval bei Ende Regen vergessen hatte.

                                      Gruß

                                      Rainer

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

                                        @Homoran:

                                        Also doch Javascript full statt Blockly `
                                        Blockly hat einige Einschränkungen. Wenn Du JS full einmal gelernt hast, bist Du damit auch schneller.

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

                                          Danke nochmals an alle Helfenden.

                                          Kurze Rückmeldung:

                                          Heute morgen hat es wohl geregnet ("leider" nur 0,3mm). Der js-Adpter läuft noch (mit 2,5% CPU-Last) und es hat Datenpunkte gegeben.
                                          144_dp_regen.jpg
                                          hier sieht man schön die exakt drei Minuten Intervall.

                                          seltsamerweise zeigt das log von der Wetterstation den Regen von 10:43 bis 10:48 (und das auf verschiedenen Installationen)

                                          Das aktuelle Blockly (aus dem ich bald die debug-Blöcke entferne)
                                          144_regenintensitaet_blockly_dutch01.jpg

                                          …und als code (für Paul53):

                                          var Intervall;
                                          
                                          on({id: 'hm-rpc.0.KEQ1022589.1.STATE', change: "ne"}, function (obj) {
                                            var value = obj.state.val;
                                            var oldValue = obj.oldState.val;
                                            console.log('ist getriggert');
                                            if (getState("hm-rpc.0.KEQ1022589.1.STATE").val == 1) {
                                              console.log('es regnet');
                                              Intervall = setInterval(function () {
                                                setState("Messwerte.0.Wetterdaten.Regenintensitaet"/*Regenintensitaet*/, ((getState("hm-rpc.0.JEQ0140901.1.RAIN_COUNTER").val - getState("Messwerte.0.Wetterdaten.Regenmenge_alt").val) / 3), true);
                                                setStateDelayed("Messwerte.0.Wetterdaten.Regenmenge_alt"/*Regenmenge_alt*/, getState("hm-rpc.0.JEQ0140901.1.RAIN_COUNTER").val, true, 200, false);
                                                console.log((String('Die Regenmenge der letzten drei Minuten betrug: ') + String(getState("hm-rpc.0.JEQ0140901.1.RAIN_COUNTER").val - getState("Messwerte.0.Wetterdaten.Regenmenge_alt").val)));
                                                console.log('noch einmal');
                                              }, 180000);
                                            } else {
                                              (function () {if (Intervall) {clearInterval(Intervall); Intervall = null;}})();
                                              console.log('es regnet nicht mehr');
                                            }
                                            console.log('es regnet nicht');
                                          });
                                          console.log('Check - fertig');
                                          console.log((String('Der Zustand vom Regensensor ist: ') + String(getState("hm-rpc.0.KEQ1022589.1.STATE").val)));
                                          

                                          Gruß

                                          Rainer

                                          1 Reply Last reply Reply Quote 0
                                          • Dutchman
                                            Dutchman Developer Most Active Administrators last edited by

                                            5 Minuten sind keine 6 (2x3), ich glaube unsere Logic hier ist falsch und wir machen es zu kompliziert:

                                            1. die Wetterstation sendet nur alle x Minuten, warum machen wir dan einen Intervall Risiko zu groß das der schneller abgelaufen ist als die Station neue Werte gesendet hat

                                            2. das script läuft nur wen es regnet und rechnet dan alle 3minuten

                                            3. logischer wäre doch: triggen wen Regenmenge (Rain Counter) geändert und dan Berechnung Ausführen

                                            Ich glaube das die ganze Kombination mit ermitteln regnet es ja oder nein überflüssig ist las uns doch einfach triggeren auf Changed Status Regenmenge und dan wert minus wert alt = jetziger Regenfall ?!

                                            ~Dutch

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

                                            Support us

                                            ioBroker
                                            Community Adapters
                                            Donate

                                            839
                                            Online

                                            31.7k
                                            Users

                                            79.8k
                                            Topics

                                            1.3m
                                            Posts

                                            3
                                            41
                                            5091
                                            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