Skriptausführung bei Variablenänderung nicht zuverlässig

Hallo,

ich habe folgende Situation:

  • Anwesenheitserkennung per FritzProject (funktioniert astrein)
  • Skript, das abhängig von Anwesenheitserkennung die Zirkulationspumpe an oder aus schaltet (niemand da = aus)
<?

//37251 Variable Anwesenheit
//52915 Variable Leistung Zirkulation

$Anwesenheit = GetValueBoolean(37251);

if ($Anwesenheit == 'true'){
    IPS_Sleep(2000);
    shell_exec('ebusctl -p 8889 w -c cc CirPumpED 15'); // Pumpe einschalten
    IPS_Sleep(5000);
    $Zirkulation_Status = trim(shell_exec('ebusctl -p 8889 r CirPumpED')); // Status der Pumpe lesen und auf Webfront setzen
    IPS_Sleep(1000);
    SetValueFloat(52915, $Zirkulation_Status);
}

elseif ($Anwesenheit == 'false'){
    IPS_Sleep(2000);
    shell_exec('ebusctl -p 8889 w -c cc CirPumpED 0'); // Pumpe ausschalten
    IPS_Sleep(5000);
    $Zirkulation_Status = trim(shell_exec('ebusctl -p 8889 r CirPumpED')); // Status der Pumpe lesen und auf Webfront setzen
    IPS_Sleep(1000);
    SetValueFloat(52915, $Zirkulation_Status);
}

else $Anwesenheit = true;

?>

Ich habe es erst mit der Wartezeit versucht, hilft aber nichts.
Manchmal funktioniert die Schaltung, manchmal auch nicht. Hat jemand eine Idee?
Ich konnte noch kein Muster feststellen. Auffällig ist, dass das Skript direkt nach Auslösung fertig sein soll laut Zeitstempel. Wenn es korrekt klappt, hat der Zeitstempel einige Sekunden Differenz.

Soweit ich weiss werden Strings , also zb ´falsé , immer als
TRUE angesehen. Nimm mal die Anfuehrungszeichen raus.

Gesendet von iPad mit Tapatalk

Wird das Script nur durch die Variable 37251 gestartet?
Dann braucht es kein GetBoolean.
$IPS[‚VALUE‘] enthält dann immer den neuen Wert von 37251.
Michael

Hallo Peter,

du solltest dir über das ganze Script nochmal Gedanken machen.

if ($Anwesenheit == true)

oder einfach

if ($Anwesenheit )

ist das gleiche.

Würde dann so aussehen.

if ($Anwesenheit ) {
///
} else {
///
}

Deine ganzen sleeps sind eher unpassend, da sie dir das Script entsprechend lange blockieren. Bei etlichen Scripten dieser Art steht dein IPS irgendwann still.

else $Anwesenheit = true;

soll was bewirken? Im Moment nichts. Wenn müsstest Du mit SetValue setzen.

Das hat leider nichts verändert.

Würde ich dann die Schleife so schreiben?

if ($IPS['37251']=true)

Die Sleeps hatte ich nur drinnen, da ich vermutet hatte, das shell_exec zu lange braucht, um den Wert in die Wärmepumpe zu schreiben. Habe sie wieder rausgenommen.

Die else-Bedingung habe ich auch wieder raus, da ich dachte, das auf jeden Fall eine drin sein muss. Habe die Doku missverstanden.

Was mir inzwischen aufgefallen ist: Führe ich das Skript manuell aus, klappt es.

Ab und an passiert aber folgendes (Zeitstempel beachten):

Dann reagiert der Auslöser, das Skript läuft aber scheinbar nicht.

Aktuell sieht das Skript so aus:

<?
$Anwesenheit = GetValueBoolean(37251);

if ($Anwesenheit==true){
    shell_exec('ebusctl -p 8889 w -c cc CirPumpED 15'); // Pumpe einschalten
    $Zirkulation_Status = trim(shell_exec('ebusctl -p 8889 r CirPumpED')); // Status der Pumpe lesen und auf Webfront setzen
    SetValueFloat(52915, $Zirkulation_Status);
}

else{
    shell_exec('ebusctl -p 8889 w -c cc CirPumpED 0'); // Pumpe ausschalten
    $Zirkulation_Status = trim(shell_exec('ebusctl -p 8889 r CirPumpED')); // Status der Pumpe lesen und auf Webfront setzen
    SetValueFloat(52915, $Zirkulation_Status);
}
?>

Wenn, wäre es so richtig.

if($_IPS['VALUE'])

Dein Script läuft doch nur ein paar ms.

Bau dir doch mal ein LogMessage in if und else ein.

Hier nachzulesen.

https://www.symcon.de/service/dokumentation/konzepte/skripte/systemvariablen/#Variable

und hier.

https://www.symcon.de/service/dokumentation/befehlsreferenz/programminformationen/ips-logmessage/

Hallo zusammen,

Im Logfile ist mir nichts aufgefallen.
Ich habe das Problem jetzt so gelöst, das ich den Teil der die Einstellung vom Bus liest in ein anderes Skript ausgelagert habe, das eh 1x pro Minute den Status zahlreicher Werte vom Ebus liest.
Ich vermute der Fehler kam daher dass auf dem Bus erst geschrieben und direkt danach der Wert vom Bus gelesen werden sollte. Evtl Zuviel für den Buskoppler?

Habe es jetzt 10x probiert, hat immer funktioniert.
Dank eurer Hilfe ist das Skript jetzt wenigstens schön :wink: