Ankündigung

Einklappen
Keine Ankündigung bisher.

LBS Treppenhausautomat verursacht hohe CPU Last

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

    LBS Treppenhausautomat verursacht hohe CPU Last

    Hallo Liebe LBS Experten,

    habe mir vor einiger Zeit mal einen LBS erstellt, der sämtliche Lichter im Haus, die normalerweise keinen „Dauerbetrieb“ (WC, Keller, Gang,…) haben, nach einer gewissen Zeit - mit Vorwarnung - abschaltet. Während der Vorwarnung ist das Licht „Nachtriggerbar“.
    Quasi leicht abgeänderte Treppenhausfunktion (weil kann auch AUS geschaltet werden).

    Das Ganze sollte aber Parallel zur normalen KNX Lichtansteuerung laufen.
    Edomi bekommt dafür für jedes Licht eine eigene Gruppenadresse um das Licht EIN/AUS schalten zu können. Der EIN/AUS Befehl von den Schaltern kommt als Eingang an den LBS.
    Natürlich noch die Schaltzeit und die EIN- und Aus-Zeit der Vorwarnung:
    Unbenannt.PNG
    Der LBS funktioniert auch tadellos, aber leider erhöht ein laufender LBS meine CPU Auslastung um 80%. Wenn 2 Solche LBS gleichzeitig laufen bin ich natürlich auf 100% ???
    Was habe ich da so unschön gemacht, dass das dermaßen auf die CPU Last geht?
    Oder können 5 Zyklisch abzuarbeitende If…. Abfragen eine derartige Belastung ergeben?
    Ist ein wenig kompliziert gestaltet, da es anscheinend keine „refresh“ Oftion bei Internen Variablen bibt?
    Lass mich da jetzt in jerder Richtung belehren ;o)

    Code:
    ###[DEF]###
    [name        = Treppenhausautomat mit Vorwarnung (2x)    ]
    
    [e#1        =Trigger(schalten)    ]
    [e#2        =Schaltzeit (sek)    ]
    [e#3        =Vorw. AUS (sek)    ]
    [e#4        =Vorw. EIN (sek)    ]
    
    [v#0        =0    ] //
    [v#1        =0    ] // Zeitpunkt nach Schaltzeit -> AUS
    [v#2        =0    ] // Zeitpunkt 1. Vorw. AUS -> EIN
    [v#3        =0    ] // Zeitpunkt 1. Vorw. EIN -> AUS
    [v#4        =0    ] // Zeitpunkt 2. Vorw. AUS -> EIN
    [v#5        =0    ] // Zeitpunkt 2. Vorw. EIN -> AUS
    [v#6        =0    ] // Zeit
    [v#7        =0    ] //
    [v#8        =0    ] //
    [v#9        =0    ] //
    [v#10        =0    ] //
    [v#11        =0    ] // AUSGANG 1
    [v#12        =0    ] // AUSGANG 1 Schmierer
    
    [a#1        =AUS/EIN TH    ]
    [a#2        =Status TH    ]
    
    ###[/DEF]###
    
    
    ###[HELP]###
    LBS ist NICHT zwischen Schalter und Autor geschaltet. Arbeitet parallel dazu!
    ###[/HELP]###
    
    
    ###[LBS]###
    <?
    function LB_LBSID($id) {
      if ($E=logic_getInputs($id)) {
    
        $T=getMicrotime();
        setLogicElementVar($id,6,$T);
    
        if ($E[1]['value']!=0 && $E[1]['refresh']==1) {
            setLogicElementVar($id,1,(getMicrotime()+$E[2]['value'])); // Zeitpunkt nach Schaltzeit -> AUS
            setLogicElementVar($id,2,(getLogicElementVar($id,1)+$E[3]['value']));
            setLogicElementVar($id,3,(getLogicElementVar($id,2)+$E[4]['value']));
            setLogicElementVar($id,4,(getLogicElementVar($id,3)+$E[3]['value']));
            setLogicElementVar($id,5,(getLogicElementVar($id,4)+$E[4]['value']));
            setLogicElementStatus($id,1);   //LBS "starten"
            setLogicElementVar($id,11,1);    //Ausgang Status
            setLogicElementVar($id,12,1);    //Ausgang Schmierer
            setLogicLinkAusgang($id,2,1); // Status TH für UM
        }
    
        if ($T>=getLogicElementVar($id,1) && $T<getLogicElementVar($id,2) && getLogicElementVar($id,11)!=0) {
          setLogicElementVar($id,11,0);    //Ausgang Status
          setLogicLinkAusgang($id,2,0); // Status TH für UM
        }
    
        if ($T>=getLogicElementVar($id,2) && $T<getLogicElementVar($id,3)) {
          setLogicElementVar($id,11,1);    //Ausgang Status
        }
    
        if ($T>=getLogicElementVar($id,3) && $T<getLogicElementVar($id,4)) {
          setLogicElementVar($id,11,0);    //Ausgang Status
        }
    
        if ($T>=getLogicElementVar($id,4) && $T<getLogicElementVar($id,5)) {
          setLogicElementVar($id,11,1);    //Ausgang Status
        }
    
        if ($T>=getLogicElementVar($id,5)) {
          setLogicElementVar($id,11,0);    //Ausgang Status
          setLogicElementStatus($id,0); //LBS "stoppen"
        }
    
        // Ausgang Status bei Änderung auf Ausgang Schreiben
        if (getLogicElementVar($id,11)!=getLogicElementVar($id,12)) {
          setLogicLinkAusgang($id,1,getLogicElementVar($id,11));
        }
        setLogicElementVar($id,12,getLogicElementVar($id,11));
    
        if ($E[1]['value']==0 && $E[1]['refresh']==1) {
          setLogicElementStatus($id,0); //LBS "stoppen"
          setLogicLinkAusgang($id,1,0);
          setLogicLinkAusgang($id,2,0); //Status TH für UM
        }
    
      }
    }
    ?>
    ###[/LBS]###
    Vielen Dank und Gruß
    Seppl

    #2
    Die Ursache liegt vermutlich im

    PHP-Code:
    setLogicElementStatus($id,1); 
    dadurch wird dein LBS immer wieder, so schnell wie möglich aufgerufen. Und das macht EDOMI so schnell es der Prozessor zulässt.

    Es gibt aber einen Parameter in setLogicElementStatus() mit dem du angeben kannst, wann der LBS wieder aufgerufen werden soll, z.B. alle 5 Sekunden.
    Damit würde sich die Last dann in normalen Sphären bewegen. Einfach mal in die EDOMI Hilfe schauen, da sind die Parameter erklärt.
    Damit würdest du dann quasi die Genauigkeit des LBS einstellen, d.h. wenn du es auf 5 Sekunden stellst und an E2 600 Sekunden hast, dann würde der LBS den Ausgang zwischen 600 und 605 Sekunden triggern. Im Moment macht er es vermutlich fast Millisekunden genau.

    Kommentar


      #3
      Hi André,
      vielen Dank für deine Antwort.
      Super, genau das habe ich auch schon für was anderes gesucht.
      Habe bis jetzt immer nur im WIKI nachgesehen.
      Die Hilfe gibt da ordentlich mehr her

      Danke und Gruß
      Seppl

      Kommentar

      Lädt...
      X