Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. Blockly
    5. Blockly um Markise bei böigem Wind einzufahren

    NEWS

    • Wir empfehlen: Node.js 22.x

    • Neuer Blog: Fotos und Eindrücke aus Solingen

    • ioBroker goes Matter ... Matter Adapter in Stable

    Blockly um Markise bei böigem Wind einzufahren

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

      @SBorg Danke!
      Das hatte ich befürchtet - ist aber noch außer meiner Skills 😞
      kommt sicher irgendwann

      EDIT:
      sieht aber doch gar nicht so schwer aus.
      Warum hatte ich immer so einen Respekt vor Arrays??

      SBorg 1 Reply Last reply Reply Quote 0
      • SBorg
        SBorg Forum Testing Most Active @Homoran last edited by

        @Homoran Nicht nur Array, sogar eine RRD (Round Robin Datenbank)
        Damit steht der aktuellste Wert immer an 1. Stelle, der älteste an letzter 😉

        ...und wenn man es runter bricht sind es sogar nur zwei Anweisungen.

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

          @Homoran sagte:

          den kürzesten Abstand dieser Schläge ebenfalls über einen Zeitraum

          Das könnte prinzipiell so erfolgen:

          Blockly_temp.JPG

          @Homoran sagte in Blockly um Markise bei böigem Wind einzufahren:

          die Anzahl erfasste "Schläge" über einen fließenden Zeitraum

          Füge die "letzte Änderung" zu einem Array hinzu, und lösche alle Einträge im Array, die älter sind als "letzte Änderung" - Zeitraum. Die Länge des resultierende Arrays ist die Anzahl der Schläge im definierten Zeitraum. Etwa so:

          Blockly_temp.JPG

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

            @paul53 sagte in Blockly um Markise bei böigem Wind einzufahren:

            Füge die "letzte Änderung" zu einem Array hinzu, und lösche alle Einträge im Array, die älter sind als "letzte Änderung" - Zeitraum. Die Länge des resultierende Arrays ist die Anzahl der Schläge im definierten Zeitraum.

            das geht??
            Das ist ja das was ich will.

            EDIT:
            Du hast editiert! DANKE!

            Sieht im Moment bei mir so aus:
            Windboen02.png

            Testing ist jetzt erst mal sowieso nicht mehr, da die Markise jetzt drin ist

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

              @Homoran sagte:

              Sieht im Moment bei mir so aus:

              Gyro_time = Zeitstempel - vorheriger Zeitstempel
              ist die Dauer des Wertes falsch (Auschaltdauer), nicht der zeitliche Abstand zwischen 2 mal wahr. Ist es das was Du brauchst ?

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

                @paul53 sagte in Blockly um Markise bei böigem Wind einzufahren:

                @Homoran sagte:

                Sieht im Moment bei mir so aus:

                Gyro_time = Zeitstempel - vorheriger Zeitstempel
                ist die Dauer des Wertes falsch, nicht der zeitliche Abstand zwischen 2 mal wahr. Ist es das was Du brauchst ?

                Sorry, was willst du mir sagen?

                Heisst das dass der letzte Zeitstempel, der ist, wenn der Wert auf false springt? Also der in dem Device eingestellte Timeout?

                @paul53 sagte in Blockly um Markise bei böigem Wind einzufahren:

                nicht der zeitliche Abstand zwischen 2 mal wahr.

                Das wäre Mist!
                ich brauche natürlich den Abstand zwischen 2*true

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

                  @Homoran sagte:

                  ich brauche natürlich den Abstand zwischen 2*true

                  Dann brauchst Du eine Variable wie in meinem 1. Beispiel oben (lastWindschlag).

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

                    @paul53 sagte in Blockly um Markise bei böigem Wind einzufahren:

                    @Homoran sagte:

                    ich brauche natürlich den Abstand zwischen 2*true

                    Dann brauchst Du eine Variable wie in meinem 1. Beispiel oben (lastWindschlag).

                    Ok, dann baue ich komplett um

                    Danke (mal wieder!!)

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

                      Hallo @paul53

                      Gehirnjogging tut immer mal wieder gut.
                      Hat was länger gedauert, bis ich es vollstäündig nachvollziehen konnte, aber das ist ja Sinn der Sache.
                      Ich hoffe ich habe es verstanden. Das War genau das was ich mit dem fließenden Wert meinte und auch so realisieren wollte, aber nicht die Bausteine/Befehle kannte, die dazu notwendig waren.

                      Du hast natürlich zusätzlich noch ein paar Schmankerl reingesetzt

                      Wenn ich es richtig verstanden und umgesetzt habe müsste es dieses sein:
                      Windboen03.png

                      Habe ich das richtig verstanden dass die 600000 Millisekunden der "Beobachtungszeitraum" sein sollen, also 10 Minuten?
                      Wenn ja, habe ich das mal runtergesetzt und spiele an den Werten bis ich empirisch eine vernünftige Lösung habe.

                      Die Namen habe ich angepasst, da ich das Ganze auch noch für den Tilt-Sensor machen will.
                      da kommt dann (viel) später als Kirsche auf die Sahne noch ein Vergleich und/oder Addition beider Sensoren.

                      EDIT: sehe gerade die Variable "Gyro" kann weg - die wird nicht mehr benutzt

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

                        @Homoran sagte:

                        müsste es dieses sein:

                        Gyro_min_Time auf 0 zu initialisieren, ist keine gute Idee.

                        @Homoran sagte in Blockly um Markise bei böigem Wind einzufahren:

                        die 600000 Millisekunden der "Beobachtungszeitraum" sein sollen, also 10 Minuten?

                        Ja.

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

                          @paul53 sagte in Blockly um Markise bei böigem Wind einzufahren:

                          Gyro_min_Time auf 0 zu initialisieren, ist keine gute Idee.

                          Warum?
                          was wäre denn besser?

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

                            @Homoran sagte:

                            was wäre denn besser?

                            Der Beobachtungszeitraum, da der neue Wert nie kleiner 0 sein kann. Außerdem bei Initialisierung:

                            Blockly_temp.JPG

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

                              @paul53 sagte in Blockly um Markise bei böigem Wind einzufahren:

                              da der neue Wert nie kleiner 0 sein kann

                              Das leuchtet mir sogar auf Anhieb ein 😳

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

                                @paul53

                                Habe ich jetzt angepasst - Danke auch dafür!
                                Windboen03_initial.png

                                Markise wieder ausgefahren - mal sehen was heute noch kommt

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

                                  @Homoran sagte:

                                  müsste es dieses sein:

                                  Die Variable Gyro_min_Time wird zur Laufzeit nie wieder hochgesetzt (s. mein 1. Beispiel mit timeout).

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

                                    @paul53 sagte in Blockly um Markise bei böigem Wind einzufahren:

                                    @Homoran sagte:

                                    müsste es dieses sein:

                                    Die Variable Gyro_min_Time wird zur Laufzeit nie wieder hochgesetzt (s. mein 1. Beispiel mit timeout).

                                    Hast recht!
                                    immer nur kleiner

                                    Da lass ich mir noch was anderes einfallen als einen schnöden Timeout mit fixem Reset.

                                    Das hast du nun davon wenn du jemanden mit deiner Perfektion anfixest.
                                    Und ich will nichts von dir zu diesem "Problem" hören bevor ich nicht winselnd angekrochen kommen 😂

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

                                      Habe jetzt "eigentlich" alles soweit gelöst. - Finetuning und Reaktion auf die Werte kommt noch.

                                      Etwas hat mich allerdings irritiert:
                                      Markise eingefahren, dann kommt nocht:

                                      14:33:17.878	info	javascript.0 (27541) script.js.Markise_Sturm_v3: Wind registriert! Gyrosensor hat 1 counts, kürzester Abstand 739.8 sec, die Beobachtung beträgt 3 Min, mittlerer Wind 20.9 km/h; Markise ist 0% raus
                                      14:33:37.875	info	javascript.0 (27541) script.js.Markise_Sturm_v3: Wind registriert! Gyrosensor hat 2 counts, kürzester Abstand 0 sec, die Beobachtung beträgt 3 Min, mittlerer Wind 20.9 km/h; Markise ist 0% raus
                                      14:39:49.770	info	javascript.0 (27541) script.js.Markise_Sturm_v3: Wind registriert! Gyrosensor hat 3 counts, kürzester Abstand 0 sec, die Beobachtung beträgt 3 Min, mittlerer Wind 20.4 km/h; Markise ist 0% raus
                                      14:48:53.884	info	javascript.0 (27541) script.js.Markise_Sturm_v3: Wind registriert! Gyrosensor hat 4 counts, kürzester Abstand 0 sec, die Beobachtung beträgt 3 Min, mittlerer Wind 20.8 km/h; Markise ist 0% raus
                                      

                                      Gut. Die Markise gibt bei Abkühlung gerne mal knackende Geräusche die IMHO auch zum Auslösen des Sensors führen könnten.
                                      Aber warum ist dann der Abstand 0 sekunden???

                                      @paul53 für dich mal meine aktuelle Version als code:

                                      var Beobachtungsdauer, Tilt_count, Gyro_count, Tilt_time, Gyro_time, Tilt_min_time, Gyro_min_Time, Tilt_Liste, Gyro_Liste, Tilt_Time_median, Gyro_time_median, Tilt_zuletzt, Gyro_zuletzt;
                                      
                                      
                                      Beobachtungsdauer = 180000;
                                      Gyro_count = 0;
                                      Gyro_time = 0;
                                      Gyro_min_Time = Beobachtungsdauer;
                                      Gyro_Liste = [];
                                      Gyro_time_median = [];
                                      Gyro_zuletzt = getState('hm-rpc.1.000F18A98C91E3.1.MOTION').ts;
                                      on({id: 'hm-rpc.1.000F18A98C91E3.1.MOTION', val: true}, function (obj) {
                                       var value = obj.state.val;
                                       var oldValue = obj.oldState.val;
                                       if (getState('hm-rpc.0.JEQ0112571.1.WORKING').val == false && getState('hm-rpc.0.JEQ0112571.1.LEVEL').val < 99) {
                                         Gyro_Liste.push((obj.state ? obj.state.ts : ""));
                                         while (true) {
                                           if ((obj.state ? obj.state.lc : "") - Beobachtungsdauer > Gyro_Liste[0]) {
                                             Gyro_Liste.shift();
                                           } else {
                                             break;
                                           }
                                         }
                                         Gyro_count = Gyro_Liste.length;
                                         Gyro_time = (obj.state ? obj.state.lc : "") - Gyro_zuletzt;
                                         if (Gyro_time < Gyro_min_Time) {
                                           Gyro_min_Time = Gyro_time;
                                         }
                                         Gyro_zuletzt = (obj.state ? obj.state.lc : "");
                                         Gyro_time_median.push(Gyro_time);
                                         while (true) {
                                           if (Gyro_time_median.length > Gyro_Liste.length) {
                                             Gyro_time_median.shift();
                                           } else {
                                             break;
                                           }
                                         }
                                         if (Gyro_time > Gyro_min_Time) {
                                           if (Gyro_time_median.length > 0) {
                                             Gyro_min_Time = Math.round(Gyro_time_median.reduce(function(x, y) {return x + y;}) / Gyro_time_median.length);
                                           } else {
                                             Gyro_min_Time = Math.round((Gyro_min_Time + Gyro_time) / 3);
                                           }
                                         }
                                         console.log((['Wind registriert! Gyrosensor hat ',Gyro_count,' counts, kürzester Abstand ',Math.round((Gyro_min_Time / 1000)*10)/10,' sec, die Beobachtung beträgt ',Beobachtungsdauer / 60000,' Min, mittlerer Wind ',Math.round(getState('hm-rega.0.12770').val*10)/10,' km/h; Markise ist ',Math.round(100 - getState('hm-rpc.0.JEQ0112571.1.LEVEL').val),'% raus'].join('')));
                                       }
                                      });
                                      
                                      Tilt_count = 0;
                                      Tilt_time = 0;
                                      Tilt_min_time = Beobachtungsdauer;
                                      Tilt_Liste = [];
                                      Tilt_Time_median = [];
                                      Tilt_zuletzt = getState('hm-rpc.0.HEQ0105937.1.STATE').ts;
                                      on({id: 'hm-rpc.0.HEQ0105937.1.STATE', val: true}, function (obj) {
                                       var value = obj.state.val;
                                       var oldValue = obj.oldState.val;
                                       if (getState('hm-rpc.0.JEQ0112571.1.WORKING').val == false) {
                                         Tilt_Liste.push((obj.state ? obj.state.ts : ""));
                                         while (true) {
                                           if ((obj.state ? obj.state.lc : "") - Beobachtungsdauer > Tilt_Liste[0]) {
                                             Tilt_Liste.shift();
                                           } else {
                                             break;
                                           }
                                         }
                                         Tilt_count = Tilt_Liste.length;
                                         Tilt_time = (obj.state ? obj.state.lc : "") - Tilt_zuletzt;
                                         if (Tilt_time < Tilt_min_time) {
                                           Tilt_min_time = Tilt_time;
                                         }
                                         Tilt_zuletzt = (obj.state ? obj.state.lc : "");
                                         Tilt_Time_median.push(Tilt_time);
                                         while (true) {
                                           if (Tilt_Time_median.length > Beobachtungsdauer / getState('hm-rpc.0.HEQ0105937.1.STATE').ts) {
                                             Tilt_Time_median.shift();
                                           } else {
                                             break;
                                           }
                                         }
                                         if (Tilt_time > Tilt_min_time) {
                                           if (Tilt_Time_median.length > 0) {
                                             Tilt_min_time = Math.round(Tilt_Time_median.reduce(function(x, y) {return x + y;}) / Tilt_Time_median.length);
                                           } else {
                                             Tilt_min_time = Math.round((Tilt_min_time + Tilt_time) / 3);
                                           }
                                         }
                                         console.log((['Wind registriert! Tilt-Sensor hat ',Tilt_count,' counts, kürzester Abstand ',Math.round((Tilt_min_time / 1000)*10)/10,'sec, die Beobachtung beträgt ',Beobachtungsdauer / 60000,' Min, mittlerer Wind ',Math.round(getState('hm-rega.0.12770').val*10)/10,' km/h'].join('')));
                                       }
                                      });
                                      

                                      Im Falls beim Gyrosensor habe ich jetzt auch noch auf ausgefahren geprüft. Das war während des logs noch nicht so

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

                                        @Homoran sagte:

                                        warum ist dann der Abstand 0 sekunden???

                                        ?? Was treibst Du in Zeilen 37 bis 43 ? Da musst Du wohl noch ein paar Debug-Blöcke einbauen um zu sehen, woher die 0 Sekunden kommen.
                                        Übrigens: runden(wert / 1000 * 10) / 10 = runden(wert / 100) / 10 (1 Nachkommastelle)

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

                                          @paul53 sagte in Blockly um Markise bei böigem Wind einzufahren:

                                          Was treibst Du in Zeilen 37 bis 43

                                          Das ist mein Rücksetzen der minimalen Zeit auf einen halbwegs variablen Wert 😉

                                          @paul53 sagte in Blockly um Markise bei böigem Wind einzufahren:

                                          Da musst Du wohl noch ein paar Debug-Blöcke einbauen um zu sehen, woher die 0 Sekunden kommen.

                                          Hatte ich schon wieder rausgenommen, nachdem es im normalen Betrieb alles passte.
                                          Die 0 ist jetzt erst im "Ruhezustand" aufgetreten.

                                          Dann setze ich die Blöcke wieder

                                          Danke!

                                          EDIT:

                                          @paul53 sagte in Blockly um Markise bei böigem Wind einzufahren:

                                          Übrigens: runden(wert / 1000 * 10) / 10 = runden(wert / 100) / 10 (1 Nachkommastelle)

                                          Das passiert wenn man mit Werten spielt und es so wächst 😳

                                          EDIT2:
                                          ich bin unschuldig 😉 sieht ganz harmlos aus:
                                          Runden.png

                                          1 Reply Last reply Reply Quote 0
                                          • M
                                            muckel last edited by

                                            @Homoran
                                            Kannst du dein Blockly als Export nochmal reinstellen?
                                            Ich würde meines gerne verbessern und denke, du hast da ein paar gute Ideen eingebaut, welche ich übernehmen könnte.

                                            Danke im Voraus

                                            Erich

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

                                            Support us

                                            ioBroker
                                            Community Adapters
                                            Donate

                                            874
                                            Online

                                            32.0k
                                            Users

                                            80.4k
                                            Topics

                                            1.3m
                                            Posts

                                            climate
                                            4
                                            26
                                            1602
                                            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