Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. [gelöst] Gelegentlich Fehler bei Homematic

    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

    [gelöst] Gelegentlich Fehler bei Homematic

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

      Ich nutze RaspberryMatic (Charly = Raspi3 + große Funkplatine) und steuere die Geräte grundsätzlich vom ioBroker. Gelegentlich kommt es vor, dass einzelne Geräte nicht schalten. In dem Fall hier ist es ein Rollladenaktor. Im Log sehe ich dann

      2022-03-20 07:35:27.166 - error: hm-rpc.0 (503889) xmlrpc -> setValue ["MEQ0678097:1","LEVEL",1] FLOAT
      2022-03-20 07:35:27.186 - error: hm-rpc.0 (503889) Cannot call setValue: XML-RPC fault: Failure```
      

      Nach der Meldung würde ich vermuten, dass RaspberryMatic den Wert nicht an ioB zurückgeben kann. ABer wie gesagt, Rollladen fährt nicht! Da es sich hier um Funk handelt, und Funk quasi 'unberechenbar' ist, suche ich nach einem Workaround. Z.B. irgendwas in der Art "wenn nicht nach X Sekunden das ACK kommt, schick den Befehl nochmal. Mir fehlt dazu im Moment der erste Ansatz. Hat das Phänomen noch jemand und schon ne Lösung dazu?

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

        @rene55 sagte: "wenn nicht nach X Sekunden das ACK kommt, schick den Befehl nochmal.

        Ich verwende Verzögerungen von 1 und 5 s, um den Befehl zu wiederholen, wenn sich der Aktor in der Zwischenzeit nicht mit dem Sollzustand und Ack = true gemeldet hat.

        const idAktor = '...';
        
        var soll = ... // Sollzustand Aktor
        var ist = getState(idAktor).val;
        var timeout1 = null; // 1 s Verzögerung
        var timeout5 = null; // 5 s Verzögerung
        
        function Schalten() {
          if (ist != soll) {
            setState(idAktor, soll);
            timeout1 = setTimeout(function () {
              setState(idAktor, soll);
            }, 1000);
            timeout5 = setTimeout(function () {
              setState(idAktor, soll);
            }, 5000);
          } else {
            clearTimeout(timeout1);
            clearTimeout(timeout5);
          }
        }
        
        Schalten(); // Skripstart
        
        on({id: idAktor, ack: true}, function (dp) {
          ist = dp.state.val;
          Schalten();
        });
        
        Rene55 1 Reply Last reply Reply Quote 0
        • Rene55
          Rene55 @paul53 last edited by

          @paul53 Das sieht so aus, als könnte das die Lösung sein. Ich nehme an, dass bei 'idAktor' alle (in dem Fall) Rollladenaktoren eingetragen werden müssen. Bei 'soll' ist es ein bisschen schwieriger, da (insbesondere beim Zufahren) alle Aktoren verschiedene Werte haben. Wie stell ich das an?

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

            @rene55 sagte: dass bei 'idAktor' alle (in dem Fall) Rollladenaktoren eingetragen werden müssen.

            Das muss für jeden Aktor separat gemacht werden.

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

              @paul53 Ah, Ok, krieg ich hin. Hab nur ein Problem mit 'soll' und 'ist'. Der Sollwert steht ja im Datenpunkt des Aktors drin, allerdings rot (also nicht bestätigt). Das ist ja der, den du als 'ist' nimmst. Da hab ich noch nen Knoten im Script (Kopf).

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

                @rene55 sagte: Der Sollwert steht ja im Datenpunkt des Aktors drin,

                Erst einmal nicht, sondern es gibt irgendwelche Bedingungen, die zum Schalten führen sollen: Das Ergebnis dieser Bedingungen ist der Sollzustand in einer Variablen.

                @rene55 sagte in Gelegentlich Fehler bei Homematic:

                Das ist ja der, den du als 'ist' nimmst.

                "ist" ist der Zustand, der als "bestätigt" vom Aktor gesendet wird.

                EDIT: Bei mir ist der Sollzustand in einem virtuellen Datenpunkt vorhanden.

                const idSoll = '0_userdata.0.xyz'; 
                
                var soll = getState(idSoll).val;
                
                // und unten
                on(idSoll, function(dp) {
                   soll = dp.state.val;
                   Schalten();
                });
                
                Rene55 1 Reply Last reply Reply Quote 0
                • grrfield
                  grrfield @Rene55 last edited by

                  @rene55 Ich habe dasselbe Problem und mir dafür eine Funktion setHMStateSec() geschrieben, die in einem globalen Skript gespeichert ist und von überall aufgerufen werden kann. Die Funktion setzt den entsprechenden State und überprüft, dann, ob er ausgeführt wurde. War das nicht erfolgreich, wird einige Zeit immer wieder versucht, die Homematic-Komponente anzusprechen:

                  /**
                   * Setzt sicher einen State und überprüft die Ausführung.
                   * Überprüft nach _HMAckWait (2000 ms), ob der Befehl erfolgreich war. 
                   * Bei Mißerfolg wird der Befehl mit setState() jeweils nach _HMAckWait und  
                   * einem zufälligen Anteil so oft wiederholt, bis er ausgeführt wurde
                   * oder bis die Zeit HM_reptime (10000 ms) abgelaufen ist.
                   * @param   {string}            HM_id           ID der Homematic-Komponente
                   * @param   {boolean|number}    HM_value        zu schreibender Wert
                   * @param   {number}            [HM_reptime]    optional: maximale Zeit für die Versuche [ms]
                   * @param   {number}            [HM_ackwait]    optional: Verzögerung zwischen den Versuchen [ms]
                   * @returns {Object}            acksiID         setInterval ID - löschen mit clearInterval()
                   */
                  function setHMStateSec(HM_id, HM_value, HM_reptime, HM_ackwait)
                  {
                      // maximale Default-Zeit für Versuche [ms] (kann mit Parameter überschrieben werden)
                      let _HMreptime=10000;      //10000
                      // Default-Verzögerung zwischen den Versuchen [ms] (kann mit Parameter überschrieben werden)
                      let _HMackwait=2000;       //2000
                  
                      let _HMacksiID;
                  
                      setState(HM_id, HM_value);
                  
                      if(HM_reptime !== undefined && typeof(HM_reptime) == 'number') {
                          _HMreptime=HM_reptime;
                          if(HM_ackwait !== undefined && typeof(HM_ackwait) == 'number') _HMackwait=HM_ackwait;
                      }
                      let i=1;
                      _HMacksiID=setInterval(function() {
                          i++;
                          if(getState(HM_id).val == HM_value && getState(HM_id).ack === true) {
                              log('setHMStateSec '+HM_id+' Success.');
                              clearInterval(_HMacksiID);
                          } else if(i*_HMackwait > _HMreptime) {
                              log('setHMStateSec '+HM_id+' no success after trial '+(--i), 'error');
                              clearInterval(_HMacksiID);
                          } else {
                              log('setHMStateSec '+HM_id+' trial '+i, 'warn');
                              setStateDelayed(HM_id, HM_value, Math.floor(Math.random()*10)*_HMackwait/100);            
                          }
                      }, _HMackwait);
                      return _HMacksiID;
                  }
                  

                  Der Aufruf erfolgt wie bei setState():

                  setHMStateSec('hm-rpc.0.xxxxxxxx.1.STATE', true);
                  

                  Optional kann noch die Wartezeit zwischen dem erneuten Ausführen (hier 5 s) und die Zeitspanne, in der versucht wird, neu zu senden (hier 20 s), angegeben werden; ansonsten werden die Defaultwerte (2 s und 10 s) verwendet:

                  setHMStateSec('hm-rpc.0.xxxxxxxx.1.STATE', true, 20000, 5000);
                  

                  HM_reptime muß größer sein als HM_ackwait, sonst finden keine erneuten Versuche statt.
                  Ich verwende die Funktion nur für kritische Schaltvorgänge, die in jedem Fall ausgeführt werden müssen.
                  Einige Homematic-Komponentne brauchen recht lange, bis der Funkbefehl bestätigt wird (z. B. Heizungsgruppe mit Thermostat ca. 30 s) - dann muß HM_ackwait größer als diese Zeit gewählt werden, damit es nicht zu Konflikten kommt.

                  Rene55 1 Reply Last reply Reply Quote 0
                  • Rene55
                    Rene55 @grrfield last edited by

                    @grrfield sagte in Gelegentlich Fehler bei Homematic Funktion setHMStateSec():
                    Sauber. Das sieht auch gut aus. Ich hab mir das Script 'mal geklaut' und unter global gespeichert. Ich gehe davon aus, dass ich dann in meinem (Rollladen)Script den Aufruf ans HM-Device durch den Aufruf dieses Scriptes ersetzen muss. Und dann natürlich hoffen, dass der Gelegentlich-Fall bald wieder eintritt und das Script entsprechend reagiert. Zunächst mal Danke für die Idee.

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

                      @rene55 sagte in Gelegentlich Fehler bei Homematic:

                      unter global gespeichert.

                      du weisst wofür global ist?

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

                        @homoran Ich geh damit sehr vorsichtig um 😐 . Ich habs erstmal so übernommen, ums zu testen. In 5 Minuten gehen die ersten Rollläden zu - dann weiß ich mehr. Wenn ichs verstanden habe, werde ich das in mein Rollladenscript einbauen, so dass es nicht mehr global liegen muss.

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

                          @paul53 sagte in Gelegentlich Fehler bei Homematic:

                          virtuellen Datenpunkt

                          Danke, damit wirds für mich klarer. Hab diesen Ansatz auch noch im Hinterkopf.

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

                            @grrfield Erster Versuch ist gestartet:

                            19:57:39.036	error	script.js.common.Rollladen.RollControl: setHMStateSec hm-rpc.0.LEQ1439759.1.LEVEL no success after trial 5
                            javascript.2	2022-03-26 19:57:37.036	warn	script.js.common.Rollladen.RollControl: setHMStateSec hm-rpc.0.LEQ1439759.1.LEVEL trial 5
                            javascript.2	2022-03-26 19:57:35.036	warn	script.js.common.Rollladen.RollControl: setHMStateSec hm-rpc.0.LEQ1439759.1.LEVEL trial 4
                            javascript.2	2022-03-26 19:57:33.035	warn	script.js.common.Rollladen.RollControl: setHMStateSec hm-rpc.0.LEQ1439759.1.LEVEL trial 3
                            javascript.2	2022-03-26 19:57:31.035	warn	script.js.common.Rollladen.RollControl: setHMStateSec hm-rpc.0.LEQ1439759.1.LEVEL trial 2
                            javascript.2	2022-03-26 19:57:29.025	warn	script.js.common.Rollladen.RollControl: (f) setScheduler (6) wurde gesetzt auf (29 57 19 * * *)
                            

                            Muss noch die Zeiten anpassen 😊

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

                              @grrfield Die Änderung mit deinem Script hat nichts verschlimmbessert. 😊 Wenn ich die Funktionsweise des Scripts richtig verstanden habe, wird das setState grundsätzlich verzögert ans Device gegeben. Somit wird der Logeintrag aus " 'setHMStateSec '+HM_id+' Success.' " wohl nie zu sehen sein.
                              BTW: Da dieser Fehler überwiegend bei meinen Rollladen auftritt und es da besonders ärgerlich ist, habe ich die Funktion in mein Rollladenscript eingebaut so dass es (@Homoran) nicht im global liegen muss. Ich werd dann weiter beobachten, ob es noch Seiteneffekte gibt, wenn mehrere Rollladen zeitlich recht zusammenliegend gefahren werden (i, _HMacksiID) .

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

                                @homoran Ja das paßt - wenn Du die Funktion unter global speicherst, kannst Du sie aus jedem Skript heraus aufrufen und damit kritische HM-Devices ansteuern. Genau dafür ist global ja da - Funktionen, die ich in jedem Skript benötige, zu speichern.

                                1 Reply Last reply Reply Quote 0
                                • grrfield
                                  grrfield @Rene55 last edited by

                                  @rene55 Nein, der State wird in Zeile 22 sofort gesetzt. Dann wird in der setInterval-Schleife mit Verzögerung nachgeschaut, ob es geklappt hat. Wenn ja, wird 'Success.' ausgegeben, wenn nein, wird es wieder versucht. Du solltest also das 'Success' zu sehen bekommen. Vielleicht erstmal mit einem normalen Schalter versuchen.
                                  Bei den Rolläden hast Du das gleich Problem wie bei der Heizungssteuerung. Die Rollos melden während der Fahrt mehrmals ihren Status - HM_ackwait muß daher größer gewählt werden als die Rollolaufzeit.

                                  Rene55 1 Reply Last reply Reply Quote 0
                                  • Rene55
                                    Rene55 @grrfield last edited by

                                    @grrfield Tatsache, hatte ich übersehen. Klar, die Rollladen brauchen eine Weile, bis die ihre Position erreicht haben. Frage an den Fachmann: gibt es hier Beeinflussung, wenn zwei Rollläden gleichzeitig gefahren werden bezüglich i und _HMacksiID?

                                    grrfield 1 Reply Last reply Reply Quote 0
                                    • grrfield
                                      grrfield @Rene55 last edited by

                                      @rene55 Da sollte es keine Beeinflussung geben, da die Variablen ja nur innerhalb der aktuellen Funktion gelten. Zwei Rollos gleichzeitig zu fahren ist aber problematisch, da die beiden sich gegenseitig stören, wenn sie ihre Position ständig übermitteln. Besser ist es da, eine Direktverknüpfung mit einem virtuellen CCU-Kanal anzulegen und diesen anzusprechen:
                                      80b2c6cd-805f-48a5-ba58-3d0a85921b3d-image.png
                                      Das funktioniert eigentlich recht zuverlässig.

                                      Rene55 1 Reply Last reply Reply Quote 0
                                      • Rene55
                                        Rene55 @grrfield last edited by

                                        @grrfield Ah, ok. Dass dann der Funkkanal stark belegt ist, ist schon klar. Kommt auch eigentlich nicht vor, da ich alle Rollladenaktoren etwas zeitversetzt fahre (außer bei einer morgens - hier ist ein großes Fenster mit geteilten Rollladen). Zu dem Hinweis mit den Direktverknüpfungen - davon habe ich gar keine Ahnung. Ich hab mich darauf versteift, alles im ioBroker zu machen. Somit hab ich die RaspberryMatic eigentlich nur zum funken. Ich schau es mir trotzdem mal näher an.

                                        grrfield 1 Reply Last reply Reply Quote 0
                                        • grrfield
                                          grrfield @Rene55 last edited by

                                          @rene55 Der Vorteil ist auch, daß alle Rollos wirklich gleichzeitig und nicht nacheinander hoch- und runtergehen - sieht einfach besser aus! 😂

                                          Rene55 1 Reply Last reply Reply Quote 0
                                          • Rene55
                                            Rene55 @grrfield last edited by

                                            @grrfield Meinst Du grundsätzlich oder speziell bei einem Fenster? Ich persönlich finde es natürlicher, wenn in den verschiedenen Zimmern die Rollläden zu verschiedenen Zeiten rauf und runter gehen. Sieht dann nach außen auch nicht so vollautomatisiert aus. Dein Script läuft jetzt zur Probe und ich warte auf den nächsten "Gelegentlich-Fall". Daher erstmal als gelöst markiert.

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

                                            Support us

                                            ioBroker
                                            Community Adapters
                                            Donate

                                            877
                                            Online

                                            31.9k
                                            Users

                                            80.2k
                                            Topics

                                            1.3m
                                            Posts

                                            4
                                            21
                                            1094
                                            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