Ankündigung

Einklappen
Keine Ankündigung bisher.

LBS Verzögerer/Wertsender 3-fach

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

    LBS Verzögerer/Wertsender 3-fach

    Nabend zusammen,

    ich habe mich mal dran gemacht, den Verzögerungs-LBS 16000112 auf unsere Bedürfnisse anzupassen / abzuändern und daraus einen 3-fach Verzögerer/Wertsender zu machen.
    Hintergrund:
    Per Visu sollen Leuchten 3-stufig nach einer vorgegebenen Zeit gedimmt bzw. ausgeschaltet werden. Hier geht es vorrangig um das "Vorwarnen" zur Schlafenszeit für die kiddies.

    So schaut es in der Visu aus:
    b.JPG
    (info: Daten aus Visu und Logik stimmen nicht überein, da der LBS auf ner VM läuft zum testen)

    Und so in der Logik:
    a.JPG


    Im Grunde funktioniert der LBS.
    Allerdings gibt es ein Problem, dass wenn der Rückmeldewert E2 bereits kleiner als alle der 3 Eingänge (E4, E6, E8) ist. Dann hängt der LBS in einer Dauerschleife.

    Hat jemand eine Ahnung/Tipp wie man den Durchlauf dann beenden kann?

    Danke und Gruß





    PHP-Code:
    ###[DEF]###
    [name =Verzögerung 3-fach ]

    [e#1 TRIGGER=Trigger ]
    [e#2 =RM Wert ]

    [e#3 =Dauer Verzögerung 1 ]
    [e#4 =Wert nach Verzögerung 1 ]
    [e#5 =Dauer Verzögerung 2 ]
    [e#6 =Wert nach Verzögerung 2 ]
    [e#7 =Dauer Verzögerung 3 ]
    [e#8 =Wert nach Verzögerung 3 ]

    [a#1 = ]
    [a#2 = ]
    [a#3 = ]

    [v#1 =10000 ]
    [v#2 =10000 ]
    [v#3 =10000 ]

    ###[/DEF]###


    ###[HELP]###
    ###[/HELP]###


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

    if (!isEmpty($E[1]['value']) && $E[1]['refresh']==1) {
    logic_setVar($id,1,(getMicrotime()+($E[3]['value']/1000)));
    logic_setVar($id,2,(getMicrotime()+($E[3]['value']/1000)+($E[5]['value']/1000)));
    logic_setVar($id,3,(getMicrotime()+($E[3]['value']/1000)+($E[5]['value']/1000)+($E[7]['value']/1000)));
    logic_setState($id,1,$E[3]['value']);
    }

    if (logic_getState($id)==1) {
    if (getMicrotime()>=logic_getVar($id,1) and ($E[2]['value']>=$E[4]['value'])) {
    logic_setOutput($id,1,$E[4]['value']);
    logic_setState($id,1,$E[5]['value']);
    }
    if (logic_getState($id)==1) {
    if (getMicrotime()>=logic_getVar($id,2) and ($E[2]['value']>=$E[6]['value'])) {
    logic_setOutput($id,2,$E[6]['value']);
    logic_setState($id,1,$E[7]['value']);
    }
    if (logic_getState($id)==1) {
    if (getMicrotime()>=logic_getVar($id,3) and ($E[2]['value']>=$E[8]['value'])) {
    logic_setOutput($id,3,$E[8]['value']);
    logic_setState($id,0);
    }
    } }}

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


    ###[EXEC]###
    <?

    ?>
    ###[/EXEC]###

    #2
    Zitat von ThomasCologne Beitrag anzeigen
    Hat jemand eine Ahnung/Tipp wie man den Durchlauf dann beenden kann?
    Du musst alle relevanten Situationen berücksichtigen, also auch die, dass der LBS getriggert wird, obwohl der Wert schon kleiner ist als der kleinste Wert.

    Zwei Varianten sind denkbar:

    1. Du startest die Verzögerung gar nicht, wenn E2<E8 und E1=1

    Code:
    WENN LBS via E1 getriggert UND E2<E8 DANN RETURN
    2. Du behandelst den Fall, dass der LBS läuft und E2<E8 ist

    Code:
    WENN E2<E8 dann Verzögerung stoppen

    Kommentar


      #3
      Hab ich Variante 2 für jeden Durchlauf nicht eigentlich erschlagen mit dem Zusatz:
      PHP-Code:
      and ($E[2]['value']>=$E[4]['value'
      in jedem Durchgang?

      Oder ist dies dort fehl am Platz? Denn der LBS soll ja auf jeden Fall alle 3 Soll´s durchlaufen und erst nach dem letzten stoppen.

      Kommentar

      Lädt...
      X