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.
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
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.
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);
}
?>
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