Ankündigung

Einklappen
Keine Ankündigung bisher.

Restzeit-Timer nach reboot Logikhilfe benötigt

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

    Restzeit-Timer nach reboot Logikhilfe benötigt

    Moin,

    ich wollte für meine Bewässerung die eingestellte Resttzeit bis zum ausschalten runterlaufen lassen. Derzeit nutze ich den LBS 19001117. Leider speichert er die Werte nicht, so dass dieser nach einer Aktivierung oder neustart ausgeschaltet ist.
    Gibt es eine Möglichkeit mit einer oder vielleicht sogar schon einen LBS der nach einer Aktivierung da weitermacht wo er war vor einer Akrtivierung?

    Mir fällt gerade so gar keine Lösung ein wie ich das sonst lösen könnte?

    Grüße

    #2
    Vermutlich würde es reichen, wenn du den Code bearbeitest und für V1 ein remanent hinzufügst.
    Code:
    [v#1  remanent    = 10 ]

    Kommentar


      #3
      Hi,

      leider klappte dies nicht. Der LBS fängt wieder von vorne an zu zählen und leider setzte der die Ausgänge auch vorher wieder auf 0.

      Kommentar


        #4
        Wie oft aktivierst Du Deinen Edomi? Meines Erachtens, ist das nur während der Implementierungsphase ein echtes Problem. Danach ist das doch nur noch relativ selten, wenn an der Logik oder iKOs was geändert werden. Das Problem ist, dass die Daten bei Neustart z.b. von den Initial-Werte überschrieben werden.

        Kommentar


          #5
          Also derzeit relativ oft. Ich vesuch auch meine Logiken so gut es geht neustartfest auszuarbeiten. Und in diesem Fall nutze ich halt den Ablauftimer für die Bewässerung und nach Ablauf der Zeit schalte ich diese halt aus. Ist halt ärgerlich wenn 1h eingestellt ist und diese dann wieder von vorne beginnt. Deswegen halt die Lösungssuche das er da weiter macht wo er aufgehört hat.

          Kommentar


            #6
            Ich seh gerad der Betriebstundenzähler ist remanent. Ich muss sonst mal versuchen mir aus den beiden LBSen was zusammenzubasteln...

            Kommentar


              #7
              Ich verstehe nie, wenn jemand nach einer Lösung für ein Problem sucht, warum dann immer Grundsatzfragen kommen.
              Einer fragt nach einem neustartfesten Timer, der "helfende" fragt wie oft startest du neu

              Genau diese Problemlösungen helfen doch an den unterschiedlichsten Stellen für diverse Aufgabenstellungen.

              Also ich wäre jedenfalls auch an einem remanenten Restzeittimer interessiert, da auch meine Logiken ansonsten neustartfest designed sind.

              LG,
              Wolfgang
              Gruß Wolfgang
              __________________________________________________ ____
              HS

              Kommentar


                #8
                zeig doch mal die ganze logik, dann ergibt sich vielleicht was.

                Kommentar


                  #9
                  Also bei mir sieht der Logikbereich der noch nicht sauber funktioniert nach dem Neustart so aus. Ich denke es ist recht selbsterklärend.
                  Beim senden einer 0 oder nach Ablauf der Zeit wird über A1 bei mir dir Bewässerung ausgeschaltet.
                  Angehängte Dateien

                  Kommentar


                    #10
                    Damit müsste es gehen:
                    PHP-Code:
                    ###[DEF]###
                    [name =Restzeit-Timer retriggerbar+abbrechbar remanent ]

                    [e#1 TRIGGER=Trigger ]
                    [e#2 =Dauer (s) #init=10 ]

                    [a#1 =0|1 ]
                    [a#2 =Restzeit (s) ]
                    [a#3 =Restzeit (%) ]

                    [v#1 remanent = 0 ]
                    [v#2 remanent = 0 ]
                    ###[/DEF]###


                    ###[HELP]###
                    Dieser Baustein bildet einen remanenten, retriggerbaren und abbrechbaren Timer mit Restzeitanzeige nach.
                    Nach einem EDOMI Neustart werden die Ausgänge wieder gesetzt, falls der Timer vor den EDOMI Neustart gelaufen ist und falls die Restzeit noch nicht abgelaufen ist.

                    Ein Telegramm ≠0 an E1 startet den Baustein, bzw. startet den Baustein neu:
                    Der Timer beginnt abzulaufen und wird durch jedes weitere Telegramm ≠0 an E1 neu gestartet.
                    Ausgang A1 wird bei JEDEM Telegramm ≠0 an E1 auf 1 gesetzt.
                    An Ausgang A2 wird sekündlich die verbleibende Restzeit in Sekunden, an A3 in Prozent ausgegeben.
                    Läuft der Timer vollständig ab, werden A2 bzw. A3 (Restzeit) auf 0 gesetzt. A1 wird ebenfalls auf 0 gesetzt.

                    Anwendungsbeispiel:
                    BWM-Signal verlängern und Restzeit visualisieren:
                    An A2 oder A3 (Restzeit) muss ein KO gesetzt werden - dieses KO kann dann z.B. in der Visu angezeigt werden oder ein dynamisches Design abrufen.

                    Hinweis:
                    Das Setzen von E2 beeinflusst einen bereits laufenden Timer nicht. Jedoch führt jedes Telegramm an E1 oder E2 zur Aktualsierung der Ausgänge A2 und A3.

                    E1: Sobald ein neues Telegramm ≠0 eintrifft, wird der Timer wieder neu gestartet (retriggern). Ein Telegramm &eq;0 stoppt den Timer.
                    E2: Zeit in Sekunden
                    A1: Bei jedem(!) Telegramm ≠0 an E1 wird A1 auf 1 gesetzt. Nach Ablauf der Zeit wird A1 auf 0 gesetzt.
                    A2: Hier wird sekündlich die verbleibende Restzeit in Sekunden ausgegeben. Nach Ablauf der Zeit wird A2 auf 0 gesetzt.
                    A3: wie A2, die Restzeit wird jedoch in Prozent ausgegeben (ganzzahlig)
                    ###[/HELP]###


                    ###[LBS]###
                    <?
                    function LB_LBSID($id)
                    {
                    if (($E = logic_getInputs($id)) && ($V = logic_getVars($id)))
                    {

                    $tmp = getMicrotime();

                    // Reboot
                    if (logic_getState($id) == 0 && $V[1] > $tmp && $V[2] > 0)
                    {
                    logic_setOutput($id, 1, 1);
                    logic_setOutput($id, 2, round($V[1] - $tmp));
                    logic_setOutput($id, 3, round(($V[1] - $tmp) / $V[2] * 100));
                    logic_setState($id, 1, 1000, true); //1-Sekunden-Takt als kleinsten gemeinsamen Nenner (Timer und Restzeit)

                    }

                    if (logic_getState($id) == 0)
                    {
                    if ($E[1]['value'] != 0 && $E[1]['refresh'] == 1)
                    {
                    logic_setVar($id, 1, ($tmp + $E[2]['value']));
                    logic_setVar($id, 2, $E[2]['value']);
                    logic_setOutput($id, 1, 1);
                    logic_setOutput($id, 2, $E[2]['value']);
                    logic_setOutput($id, 3, 100);
                    logic_setState($id, 1, 1000, true); //1-Sekunden-Takt als kleinsten gemeinsamen Nenner (Timer und Restzeit)

                    }

                    }
                    else
                    {

                    //Retriggern
                    if ($E[1]['value'] != 0 && $E[1]['refresh'] == 1)
                    {

                    logic_setVar($id, 1, ($tmp + $E[2]['value']));
                    logic_setVar($id, 2, $E[2]['value']);
                    logic_setOutput($id, 1, 1);
                    logic_setOutput($id, 2, $E[2]['value']);
                    logic_setOutput($id, 3, 100);

                    }
                    else
                    {
                    if ($tmp >= $V[1])
                    {
                    logic_setVar($id, 1, 0);
                    logic_setVar($id, 2, 0);
                    logic_setOutput($id, 1, 0);
                    logic_setOutput($id, 2, 0);
                    logic_setOutput($id, 3, 0);
                    logic_setState($id, 0);
                    }
                    else
                    {
                    logic_setOutput($id, 2, round($V[1] - $tmp));
                    logic_setOutput($id, 3, round(($V[1] - $tmp) / $V[2] * 100));
                    }
                    }

                    //Abbruch
                    if ($E[1]['value'] == 0 && $E[1]['refresh'] == 1)
                    {

                    logic_setVar($id, 1, 0);
                    logic_setVar($id, 2, 0);
                    logic_setOutput($id, 1, 0);
                    logic_setOutput($id, 2, 0);
                    logic_setOutput($id, 3, 0);
                    logic_setState($id, 0);

                    }

                    }
                    }
                    }
                    ?>
                    ###[/LBS]###


                    ###[EXEC]###
                    <?

                    ?>
                    ###[/EXEC]###
                    Gruß Wolfgang
                    __________________________________________________ ____
                    HS

                    Kommentar


                      #11
                      Das Thema Neustartfestigkeit bzw. Verlass auf IT-Infrastruktur bei "kritischen" Zeitfunktionen war mir persönlich ein zu heißes Eisen - und habe derlei auf KNX ausgelagert.

                      Dann ist im schlimmsten Fall nur meine Restzeit-Anzeige(!) mal falsch, aber das Gerät schaltet verlässlich ab. Völlig egal, ob edomi neu startet, stirbt, Boot-Schleife, das LAN stirbt, etc. Zu viele Faktoren, die letztlich durchaus auch mal fragil sein können - und dann ist im besten Fall nur die Zisterne leer, im blöden Fall hat im Urlaub die Bewässerung mit Frischwasser dauer-gelaufen, im blödsten Fall ist der Keller voll.

                      Lösung ist dafür: "Kritische" Aktoren in der ETS als Treppenlicht parametrisieren.
                      Solange der KNX-Bus an einer USV hängt, ist ein echtes Problem damit mit großer Wahrscheinlichkeit ausgeschlossen.

                      Dies habe ich für meine Ventile/Gartenbewässerung so gemacht oder z.B. auch die Stromversorgung meiner Sauna. Im Prinzip alles, was mit Wasser und zu viel Wärmenergie zu tun hat.

                      Für unkritische Dinge (z.B. Rasenmäher, etc) finde ich die Frage aber durchaus spannend und die vorgeschlagenen Lösungen...
                      Zuletzt geändert von saegefisch; 01.05.2021, 18:19.

                      Kommentar


                        #12
                        Bei mir gibt es z.B. in der Visu einen Knopf "Mähpause" für den Rasenroboter.
                        Dabei wird für diese Pause der Mäher auf HOME gestellt, fährt also nicht nach Timer, die verbleibende Zeit wird angezeigt.

                        Bisher blieb der Mäher auf "Mähpause" wenn ich während der Timer lief an EDOMI was gemacht und rebootet habe.

                        Jetzt läuft die Restzeit, sogar Sekundengenau nach dem Reboot weiter und stellt nach Ablauf wieder auf "AUTO" um.

                        In einem Aktor bilde ich solche Sachen nicht ab. Andere, wie die für die Gartenpumpe, schon.
                        Angehängte Dateien
                        Zuletzt geändert von woda; 01.05.2021, 16:15.
                        Gruß Wolfgang
                        __________________________________________________ ____
                        HS

                        Kommentar


                          #13
                          Hier mal eine remanente Version:

                          PHP-Code:

                          ###[DEF]###
                          [name        =    Restzeit remanent]
                          [titel        =    Restzeittimer remanent V 0.01]
                          [e#1        trigger =    Trigger]
                          [e#2        important =    Dauer (s)]


                          [a#1        =    0/1]
                          [a#2        =    Restzeit (s)]

                          [v#1 remanent =  ]     // Endzeit


                          ###[/DEF]###

                          ###[HELP]###
                          E1 &ne;0 Startet den Timer, A1 wird auf 1, A2 auf die Restzeit gesetzt.
                          E1 = 0 bricht den LBS ab.
                          Nach Ablauf, oder E1 = 0 werden A1 und A2 auf 0 gesetzt.
                          ###[/HELP]###

                          ###[LBS]###
                          <?
                          function LB_LBSID($id) {
                              if ($E=logic_getInputs($id)) {
                                  
                                  if($E[1]['refresh'] && $E[1]['value'] != 0 && $E[2]['value'] >= 1) {
                                      logic_setVar($id,1,time() + $E[2]['value']);
                                      
                                  }
                                  
                                  if($E[1]['refresh'] && $E[1]['value'] == 0 && logic_getStateExec($id) != 0){
                                      logic_setVar($id,1,0);
                                      logic_setOutput($id,1,0);
                                      logic_setOutput($id,2,0);
                                      logic_setState($id,0);
                                  }
                                  
                                  if(logic_getVar($id,1) > time() && logic_getStateExec($id)==0) {
                                      logic_setOutput($id,1,1);
                                      callLogicFunctionExec(LBSID,$id);
                                  }
                              
                              }
                          }


                          ?>
                          ###[/LBS]###


                          ###[EXEC]###
                          <?
                          require(dirname(__FILE__)."/../../../../main/include/php/incl_lbsexec.php");
                          sql_connect();
                          while (logic_getEdomiState()==1) {
                              while(time() < logic_getVar($id,1)){
                                  logic_setOutput($id,2,logic_getVar($id,1) - time());
                                  usleep(1000000);
                              }
                              logic_setOutput($id,1,0);
                              logic_setOutput($id,2,0);
                              exit();
                          }
                          sql_disconnect();

                          ?>
                          ###[/EXEC]###
                          Zuletzt geändert von vento66; 02.05.2021, 17:14.
                          Mfg Micha
                          Ich sage ja nicht, das wir alle dummen Menschen loswerden müssen, aber könnten wir nicht einfach alle Warnhinweise entfernen und den Dingen ihren Lauf lassen?

                          Kommentar


                            #14
                            Hallo vento66,

                            habe eben einmal deinen LBS Code getestet. Also der LBS triggert, obwohl er aus ist, an den Ausgängen im Sekundentakt seinen Status raus. Soll das so sein?

                            Grüße

                            Kommentar


                              #15
                              skyacer hab gestern noch den oberen Code als LBS eingestellt:
                              http://service.knx-user-forum.de/?co...ad&id=19000386
                              Du kannst den ja mal testen, bei mir funktioniert der.
                              LG
                              Gruß Wolfgang
                              __________________________________________________ ____
                              HS

                              Kommentar

                              Lädt...
                              X