Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. Blockly
    5. PWM Steuerung mit Fade

    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

    PWM Steuerung mit Fade

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

      @paul53
      Echt Hut ab! Ich kenne ja nun einige Script Sprachen und hatte damals auch viel mit C++ am Hut wenn dir das vllt noch was sagt der IRC also Internet Relay Chat der vorgänger von ICQ alias Mirc.
      Aber einen Trick gibts da sicherlich auch nicht, um Blockly besser zu verstehen.
      Ich denke, entweder man schnallt es oder man schnallt es nicht.
      Wenn ich eine fertige Steuerung sehe, kann ich mir den Ablauf vorstellen aber selsbt programmieren klappt nicht so ganz.
      Zumindest wenn es um so komplexe Steuerungen geht.

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

        @paul53
        Ich hatte mir die Strömungen mal rausgeschrieben, dann siehst du vllt was ich vor habe an Strömungs Programmen.
        Ich hoffe du wirst schlau draus.

        IMG_5136.jpg
        IMG_5137.jpg
        Wie gesagt Sequenzial war falsch rum, so wie die jetzige Steuerung ist ist es perfekt.
        fehlen nur noch die drei anderen.
        Nur wie man von 30% dann zb in in 530 ms rauf geht auf 100% und dann abruppt runter auf 30% dort halten für 600 ms und dann wieder von vorne. weiß ich eher nicht.

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

          @Aphofis sagte:

          Nur wie man von 30% dann zb in in 530 ms rauf geht auf 100%

          Von 30% auf 100% wie gehabt - aber bitte nicht in 1 % Schritten (CPU-Last)

          und dann abruppt runter auf 30%

          falls spannung >= 100
          setze spannung auf 30
          steuere DP mit spannung

          dort halten für 600 ms und dann wieder von vorne.

          Timeout 600 ms: Funktion wieder aufrufen

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

            @Aphofis sagte:

            Ich kenne ja nun einige Script Sprachen und hatte damals auch viel mit C++ am Hut

            Dann sollte Javascript nicht schwer fallen. Meine ioBroker-Skripte erstelle ich nur in Javascript, denn Blockly hat Einschränkungen und finde ich umständlicher.

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

              @paul53
              Mann mann mann ne also blöcke da kann ich mir eher was vorstellen aber jeder wie er kann.
              Liegt vllt daran weil ich Handwerker bin aber dem einen liegt es mehr dem anderen weniger.
              Zu meinem Glück, gibt es ja nette Menschen wie dich, die mir bei sowas helfen.😁

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

                @paul53
                ist es möglich das man zb zwei Datenpunkte zu Sequenzial anlegt in die man dann zb Sequenzial_up und Sequenzial_down die 2000 ms und 1900 ms angibt und in der Steuerung werden die ms für 1 % errechnet und dann für die beiden Timeouts benutzt.

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

                  Also hab jetzt mal einen Datenpunkt in meinem Datenpunkt Ordner erstellt.
                  Dann einen ESP geflashed und 4 PWM Kanäle erstellt.
                  Den Datenpunkt Sequenzial als Logikwert switch eingestellt und in der steuerung verknüpft
                  genau so den Level Dimmer vom PWM Channel 1 verknüpft
                  wenn ich nun den Datenpunkt auf true setze läuft die Steuerung los und man sieht den PWM Channel los rennen doch lässt sich leider der Datenpunkt Sequenzial nicht mehr abschalten.
                  Wenn ich in der Weboberfläche vom Sonoff in die Konsole gucke sieht man wie die Werte per MQTT rein kommen und verabrietet werden.

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

                    @Aphofis sagte in PWM Steuerung mit Fade:

                    ist es möglich das man zb zwei Datenpunkte zu Sequenzial anlegt in die man dann zb Sequenzial_up und Sequenzial_down die 2000 ms und 1900 ms angibt und in der Steuerung werden die ms für 1 % errechnet und dann für die beiden Timeouts benutzt.

                    In Javascript kein Problem, aber in Blockly so nicht möglich, da Zeiten im Intervall Konstanten sind. In Blockly kann man nur die Stufenweite (1 %/-1,05 %) variabel gestalten.

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

                      @Aphofis
                      MIt einer festen Zykluszeit von 25 ms und einem variablen Delta sollte es so funktionieren:

                      Blockly_temp.JPG

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

                        @paul53
                        dh delta ist der variable wert der aus den Datenpunkten ermittelt wird und dann in der Steuerung zu den 25 ms dazu gezählt wird!?
                        Gebe ich in den Datenpunkten dann ms oder sek ein !?
                        Eine Lösung dazu das die Steuerung abgeschaltet werden kann hast du nicht!?
                        Kann es sein das der Pi überlastet ist mit der Art steuerung !?

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

                          @Aphofis sagte:

                          delta ist der variable wert der aus den Datenpunkten ermittelt wird

                          Ja.

                          @Aphofis sagte in PWM Steuerung mit Fade:

                          und dann in der Steuerung zu den 25 ms dazu gezählt wird!?

                          Nein, um den Wert delta ändert sich die Spannung (in %) alle 25 ms.

                          @Aphofis sagte in PWM Steuerung mit Fade:

                          Gebe ich in den Datenpunkten dann ms oder sek ein !?

                          Steht doch im Kommentar: ms

                          @Aphofis sagte in PWM Steuerung mit Fade:

                          Eine Lösung dazu das die Steuerung abgeschaltet werden kann hast du nicht!?

                          Mit stop zyklische Ausführung Intervall wird bei 30 % abgeschaltet, wenn der Datenpunkt "sonoff.0.Aqua_Float_Pumps.Sequenzial" false ist. Soll die Spannung auf 0 % gehen ?

                          @Aphofis sagte in PWM Steuerung mit Fade:

                          Kann es sein das der Pi überlastet ist mit der Art steuerung !?

                          Das ist gut möglich, denn eine Zykluszeit von 25 ms ist sehr ambitioniert.

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

                            @paul53
                            Also es ist ja nur eine von vier Steuerungen und jede für sich soll ja so lange in einer Schleife laufen bis ein anderer der Datenpunkte auf true gesetzt wird.
                            Es sollte dann nachher so aussehen:

                            Programm (Zeitsteuerung wann welcher Datenpunkt aktiv sein soll "Sequenzial, Intervall, Pulse und Wellengang)

                            Sequenzial (true/false)
                            Sequenzial_Wave_Up (Wellenlänge hoch in ms)
                            Sequenzial_Wave_Down (Wellenlänge runter in ms)

                            Intervall (true/false)
                            Intervall_Wave_Down (Wellenlänge runter in ms)
                            Intervall_Wave_Hold (Wellenlänge halten in ms)

                            Pulse (true/false)
                            Pulse_Wave_Up (Wellenlänge hoch in ms)
                            Pulse_Wave_Stop (Wellenlänge Stop in ms)

                            Wellengang (true/false)
                            Wellengang_Wave_Up (Wellenlänge hoch in ms)
                            Wellengang_Wave_Hold (Wellenlänge halten in ms)

                            Wie man es nun bewerkställigt das sich der Datenpunkt abschalten lässt, weiß ich auch nicht.
                            Im Test Modus mit einem virtuellen Datenpunkt funktionierte es aber mit einem verknüpften ESP über die Level Dimmer funktion bleibt der Datenpunkt im true und ich muss den ESP neustarten, damit ich den Datenpunkt stoppen kann. Ich hatte natürlich noch nicht versucht wenn es dann alle Datenpunkte gibt wie es dann ist wenn der Programm Ablauf die Datenpunkte schaltet ob das dann geht !?

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

                              @paul53
                              ist es so korrekt?

                              var inc, dec, sequenzial, spannung, delta, Intervall;
                              
                              
                              inc = 1750 / getState("Aqua_Control.0.Tunze_Steuerung.Sequenzial_Wave_Up").val;
                              dec = -1750 / getState("Aqua_Control.0.Tunze_Steuerung.Sequenzial_Wave_Down").val;
                              on({id: 'Aqua_Control.0.Tunze_Steuerung.Sequenzial', change: "ne"}, function (obj) {
                                var value = obj.state.val;
                                var oldValue = obj.oldState.val;
                                sequenzial = (obj.state ? obj.state.val : "");
                                if (sequenzial) {
                                  spannung = 30;
                                  setState("sonoff.0.Aqua_Wave.Channel1"/*Aqua_Wave_Pump_1*/, spannung);
                                  delta = inc;
                                  Intervall = setInterval(function () {
                                    spannung = (typeof spannung == 'number' ? spannung : 0) + delta;
                                    setState("sonoff.0.Aqua_Wave.Channel1"/*Aqua_Wave_Pump_1*/, spannung);
                                    if (spannung >= 100) {
                                      delta = dec;
                                    }
                                    if (spannung <= 30) {
                                      delta = inc;
                                      if (!sequenzial) {
                                        (function () {if (Intervall) {clearInterval(Intervall); Intervall = null;}})();
                                      }
                                    }
                                  }, 25);
                                }
                              });
                              // Sequenzial_Up (ms)
                              on({id: 'Aqua_Control.0.Tunze_Steuerung.Sequenzial_Wave_Up', change: "ne"}, function (obj) {
                                var value = obj.state.val;
                                var oldValue = obj.oldState.val;
                                inc = 1750 / (obj.state ? obj.state.val : "");
                              });
                              // Sequenzial_Down (ms)
                              on({id: 'Aqua_Control.0.Tunze_Steuerung.Sequenzial_Wave_Down', change: "ne"}, function (obj) {
                                var value = obj.state.val;
                                var oldValue = obj.oldState.val;
                                dec = -1750 + (obj.state ? obj.state.val : "");
                              });
                              
                              paul53 1 Reply Last reply Reply Quote 0
                              • paul53
                                paul53 @Aphofis last edited by

                                @Aphofis sagte:

                                ist es so korrekt?

                                Sieht gut aus.

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

                                  @paul53 OK
                                  Ich erstelle dann heute abend mal ein Programm was die Datenpunkte schaltet.

                                  wie ist es mit wellengang
                                  da geht die Steuerung in 0,53 sek von 30 auf 100 und stoppt dann auf 30 und wird da für 0,6 sek gehalten und geht dann wieder hoch auf 100%
                                  Dann kann ich zumindest diese zwei Steuerungen testen ob das Programm es dann schafft hin und her zu schalten oder ob es dann auch hängen bleibt

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

                                    @Aphofis sagte:

                                    Also es ist ja nur eine von vier Steuerungen und jede für sich soll ja so lange in einer Schleife laufen bis ein anderer der Datenpunkte auf true gesetzt wird.

                                    Weshalb verwendest Du keine Werteliste mit den 5 Zuständen Aus/Sequenzial/Intervall/Pulse/Wellengang, denn es kann immer nur einer der Zustände aktiv sein und es sollte zwischen zwei aktiven Zuständen immer für mind. 5 s der Zustand "Aus" (0) geschaltet werden.

                                    Werteliste_Wellen.JPG

                                    Die Abfrage bei "Sequenzial" lautet dann:
                                    falls Wert == 1 setze sequenzial auf true
                                    sonst setze sequential auf false

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

                                      @paul53
                                      Das ja mal ne coole Funktion!
                                      Bin noch auf einem Geburtstag
                                      Teste ich heute Abend mal und wenn die Strömung für 5 Sek. Inaktiv sind beim Wechsel zwischen den Programmen stört mich das nicht

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

                                        @paul53
                                        Also ich teste gerade etwas.
                                        Es gibt die Steuerung Intervall:

                                        var wellenauswahl, inc, dec, sequenzial, spannung, delta, Intervall;
                                        
                                        
                                        wellenauswahl = getState("Aqua_Control.0.Tunze_Steuerung.Tunze_Wellen_Auswahl").val;
                                        inc = 1750 / getState("Aqua_Control.0.Tunze_Steuerung.Intervall_Wave_Hold").val;
                                        dec = -1750 / getState("Aqua_Control.0.Tunze_Steuerung.Intervall_Wave_Down").val;
                                        on({id: wellenauswahl == 2, change: "ne"}, function (obj) {
                                          var value = obj.state.val;
                                          var oldValue = obj.oldState.val;
                                          sequenzial = (obj.state ? obj.state.val : "");
                                          if (sequenzial) {
                                            spannung = 30;
                                            setState("sonoff.0.Aqua_Wave.Channel1"/*Aqua_Wave_Pump_1*/, spannung);
                                            delta = inc;
                                            Intervall = setInterval(function () {
                                              spannung = (typeof spannung == 'number' ? spannung : 0) + delta;
                                              setState("sonoff.0.Aqua_Wave.Channel1"/*Aqua_Wave_Pump_1*/, spannung);
                                              if (spannung >= 100) {
                                                delta = dec;
                                              }
                                              if (spannung <= 30) {
                                                delta = inc;
                                                if (!sequenzial) {
                                                  (function () {if (Intervall) {clearInterval(Intervall); Intervall = null;}})();
                                                }
                                              }
                                            }, 25);
                                          }
                                        });
                                        // Sequenzial_Up (ms)
                                        on({id: 'Aqua_Control.0.Tunze_Steuerung.Intervall_Wave_Hold', change: "ne"}, function (obj) {
                                          var value = obj.state.val;
                                          var oldValue = obj.oldState.val;
                                          inc = 1750 / (obj.state ? obj.state.val : "");
                                        });
                                        // Sequenzial_Down (ms)
                                        on({id: 'Aqua_Control.0.Tunze_Steuerung.Intervall_Wave_Down', change: "ne"}, function (obj) {
                                          var value = obj.state.val;
                                          var oldValue = obj.oldState.val;
                                          dec = -1750 + (obj.state ? obj.state.val : "");
                                        });
                                        

                                        und die Steuerung Sequenzial:

                                        var wellenauswahl, inc, dec, sequenzial, spannung, delta, Intervall;
                                        
                                        
                                        wellenauswahl = getState("Aqua_Control.0.Tunze_Steuerung.Tunze_Wellen_Auswahl").val;
                                        inc = 1750 / getState("Aqua_Control.0.Tunze_Steuerung.Sequenzial_Wave_Up").val;
                                        dec = -1750 / getState("Aqua_Control.0.Tunze_Steuerung.Sequenzial_Wave_Down").val;
                                        on({id: wellenauswahl == 1, change: "ne"}, function (obj) {
                                          var value = obj.state.val;
                                          var oldValue = obj.oldState.val;
                                          sequenzial = (obj.state ? obj.state.val : "");
                                          if (sequenzial) {
                                            spannung = 30;
                                            setState("sonoff.0.Aqua_Wave.Channel1"/*Aqua_Wave_Pump_1*/, spannung);
                                            delta = inc;
                                            Intervall = setInterval(function () {
                                              spannung = (typeof spannung == 'number' ? spannung : 0) + delta;
                                              setState("sonoff.0.Aqua_Wave.Channel1"/*Aqua_Wave_Pump_1*/, spannung);
                                              if (spannung >= 100) {
                                                delta = dec;
                                              }
                                              if (spannung <= 30) {
                                                delta = inc;
                                                if (!sequenzial) {
                                                  (function () {if (Intervall) {clearInterval(Intervall); Intervall = null;}})();
                                                }
                                              }
                                            }, 25);
                                          }
                                        });
                                        // Sequenzial_Up (ms)
                                        on({id: 'Aqua_Control.0.Tunze_Steuerung.Sequenzial_Wave_Up', change: "ne"}, function (obj) {
                                          var value = obj.state.val;
                                          var oldValue = obj.oldState.val;
                                          inc = 1750 / (obj.state ? obj.state.val : "");
                                        });
                                        // Sequenzial_Down (ms)
                                        on({id: 'Aqua_Control.0.Tunze_Steuerung.Sequenzial_Wave_Down', change: "ne"}, function (obj) {
                                          var value = obj.state.val;
                                          var oldValue = obj.oldState.val;
                                          dec = -1750 + (obj.state ? obj.state.val : "");
                                        });
                                        

                                        Dann gibt es diese Datenpunkte:
                                        Bildschirmfoto 2019-09-14 um 17.03.11.png
                                        Die switch Datenpunkte mal bei seite lassen.
                                        Den Datenpunkt Tunze Wellen Auswahl erstellt mit 0:Aus;1:Sequenzial;2:Intervall;3:Pulse;4:Wellengang
                                        den hab ich verknüpft damit je nach dem was in dem Datenpunkt steht soll die jeweilige Steuerung anspringen. Nur Leider will die Zeitsteuerung nicht so wie ich das will.
                                        Sicherlich ist ein Fehler darin das man nur für 10 sek testet.
                                        Zeitsteuerung:

                                        var Wellenauswahl, Sequenzial, Intervall, timeout, timeout3, timeout4;
                                        
                                        
                                        Wellenauswahl = getState("Aqua_Control.0.Tunze_Steuerung.Tunze_Wellen_Auswahl").val;
                                        Sequenzial = schedule('59 16 * * *', function () {
                                          setState("Aqua_Control.0.Tunze_Steuerung.Tunze_Wellen_Auswahl"/*Tunze Wellen Auswahl*/, 1);
                                          timeout = setTimeout(function () {
                                            setState("Aqua_Control.0.Tunze_Steuerung.Tunze_Wellen_Auswahl"/*Tunze Wellen Auswahl*/, 0);
                                            (function () {if (timeout) {clearTimeout(timeout); timeout = null;}})();
                                          }, 10000);
                                          setState("Aqua_Control.0.Tunze_Steuerung.Tunze_Wellen_Auswahl"/*Tunze Wellen Auswahl*/, 0);
                                        });
                                        Intervall = schedule('0 17 * * *', function () {
                                          setState("Aqua_Control.0.Tunze_Steuerung.Tunze_Wellen_Auswahl"/*Tunze Wellen Auswahl*/, 2);
                                          timeout3 = setTimeout(function () {
                                            setState("Aqua_Control.0.Tunze_Steuerung.Tunze_Wellen_Auswahl"/*Tunze Wellen Auswahl*/, 0);
                                            (function () {if (timeout) {clearTimeout(timeout); timeout = null;}})();
                                          }, 10000);
                                          timeout4 = setTimeout(function () {
                                            setState("Aqua_Control.0.Tunze_Steuerung.Tunze_Wellen_Auswahl"/*Tunze Wellen Auswahl*/, 0);
                                            (function () {if (timeout2) {clearTimeout(timeout2); timeout2 = null;}})();
                                          }, 5000);
                                        });
                                        
                                        paul53 2 Replies Last reply Reply Quote 0
                                        • paul53
                                          paul53 @Aphofis last edited by paul53

                                          @Aphofis sagte:

                                          Dann gibt es diese Datenpunkte:

                                          Der Datenpunkt "Tunze Wellen Auswahl" ist keine Werteliste, denn der Wert einer Werteliste sieht so aus:
                                          Werteliste_Aus.JPG
                                          Poste mal die RAW-Daten des Datenpunktes in Code Tags.

                                          Man kann nicht auf Werte bzw. Vergleiche triggern, sondern nur auf Datenpunkt-IDs ! Der Vergleich muss mit einem falls-Logik-Baustein innerhalb des Triggers erfolgen.

                                          Blockly_temp.JPG

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

                                            @Aphofis
                                            Weshalb schaltest Du das Intervall 2 mal aus (nach 10 s und 5 s) ? Wozu dienen die stop timeout und stop timeout2 ?

                                            Sequenzial wird sofort nach dem Einschalten wieder ausgeschalten ?

                                            Aphofis 2 Replies Last reply Reply Quote 0
                                            • First post
                                              Last post

                                            Support us

                                            ioBroker
                                            Community Adapters
                                            Donate

                                            813
                                            Online

                                            31.9k
                                            Users

                                            80.1k
                                            Topics

                                            1.3m
                                            Posts

                                            2
                                            97
                                            5516
                                            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