Bin ganz stolz auf mein erstes php-Skript in IP-Symcon. Das Skript soll die Komfortlüftung in unserem Haus ausschalten, sobald die Aussentemperatur über der Innentemperatur. Sobald (am Abend) die Aussentemperatur wieder kühler ist als die Innentemperatur soll die Lüftung wieder einschalten. Das Skript wird zurzeit alle 10 Sekunden abgerufen. Nach der Testphase werde ich diese Zeit erhöhen. Die Ausgabe von Zeit, Temperaturen und Status ist nur zu Testzwecken im Skript enthalten.
Leider funktioniert das Skript bisher nur für das Ausschalten der Lüftung. Das Einschalten will nicht funktionieren. Hat mir jemand einen Tipp?
<?
// Dieses Skript soll bei höherer Aussen- als Innentemperatur die Lüftung ausschalten
// und am Abend, wenn die Aussentemperatur wieder kühler ist als innen die Anlage
// wieder einschalten
IPS_SetScriptTimer(42665, 10); // Skript soll alle 10 Sekunden ausgeführt werden
$TempAussen = GetValue(45887 /*[Haus\HMS100 TF Temperatur Aussen\Temperatur]*/) ; // Float Variable
$TempInnen = GetValue(58176 /*[Haus\HMS100 TF Temperatur Innen\Temperatur]*/) ; //Float Variable
$StatusLueftung = GetValue(14521 /*[Lüftung\FS20 Lüftung EinAus\Status]*/) ; // Liest Zustand des Senders aus
echo strftime("%A, %d. %B %Y, %H:%M:%S,") ;
echo " Temp_Aussen: $TempAussen °C " ;
echo " Temp_Innen: $TempInnen °C " ;
echo " Status_Lueftung [ein=\"1\";aus=\" \"]: $StatusLueftung " ;
/*Ausschalten der Lüftung bei Aussentemp. grösser als Innentemp.*/
if($TempAussen >= $TempInnen and $StatusLueftung = true)
{
FS20_SwitchMode(50807 /*[Lüftung\FS20 Lüftung EinAus]*/, false);
}
/*Einschalten der Lüftung bei Aussentemp. grösser als Innentemp.*/
if($TempAussen <= $TempInnen and $StatusLueftung = false)
{
FS20_SwitchMode(50807 /*[Lüftung\FS20 Lüftung EinAus]*/, true);
}
?>
Ein = ist in PHP ein Zuweisungsoperator. Du möchstest aber vergleichen. Dazu musst Du $StatusLueftung == true bzw. false verwenden.
Im Vergleich ist die Kurzform von if($status = true) übrigens if($status) und für if($status == false) kannst Du mit dem verneinenden ! einfach if(!$status) benutzen. Diese Form wird Dir in hier im Forum verwendeten Skripten öfters begegnen.
Ja, komischerweise… ich habe ein ähnliches Script der email-Versendung, wenn die Außentemperatur… egal… hatte mit V.1 noch funktioniert, mit V.2 nicht mehr…
Mach aus diesem einem Script zwei Scripts…
<?
// Dieses Skript soll bei höherer Aussen- als Innentemperatur die Lüftung ausschalten
// und am Abend, wenn die Aussentemperatur wieder kühler ist als innen die Anlage
// wieder einschalten
IPS_SetScriptTimer(42665, 10); // Skript soll alle 10 Sekunden ausgeführt werden
$TempAussen = GetValue(45887 /*[Haus\HMS100 TF Temperatur Aussen\Temperatur]*/) ; // Float Variable
$TempInnen = GetValue(58176 /*[Haus\HMS100 TF Temperatur Innen\Temperatur]*/) ; //Float Variable
$StatusLueftung = GetValue(14521 /*[Lüftung\FS20 Lüftung EinAus\Status]*/) ; // Liest Zustand des Senders aus
echo strftime("%A, %d. %B %Y, %H:%M:%S,") ;
echo " Temp_Aussen: $TempAussen °C " ;
echo " Temp_Innen: $TempInnen °C " ;
echo " Status_Lueftung [ein=\"1\";aus=\" \"]: $StatusLueftung " ;
/*Ausschalten der Lüftung bei Aussentemp. grösser als Innentemp.*/
if($TempAussen >= $TempInnen and $StatusLueftung = true)
{
FS20_SwitchMode(50807 /*[Lüftung\FS20 Lüftung EinAus]*/, false);
}
?>
und
<?
// Dieses Skript soll bei höherer Aussen- als Innentemperatur die Lüftung ausschalten
// und am Abend, wenn die Aussentemperatur wieder kühler ist als innen die Anlage
// wieder einschalten
IPS_SetScriptTimer(42665, 10); // Skript soll alle 10 Sekunden ausgeführt werden
$TempAussen = GetValue(45887 /*[Haus\HMS100 TF Temperatur Aussen\Temperatur]*/) ; // Float Variable
$TempInnen = GetValue(58176 /*[Haus\HMS100 TF Temperatur Innen\Temperatur]*/) ; //Float Variable
$StatusLueftung = GetValue(14521 /*[Lüftung\FS20 Lüftung EinAus\Status]*/) ; // Liest Zustand des Senders aus
echo strftime("%A, %d. %B %Y, %H:%M:%S,") ;
echo " Temp_Aussen: $TempAussen °C " ;
echo " Temp_Innen: $TempInnen °C " ;
echo " Status_Lueftung [ein=\"1\";aus=\" \"]: $StatusLueftung " ;
/*Einschalten der Lüftung bei Aussentemp. grösser als Innentemp.*/
if($TempAussen <= $TempInnen and $StatusLueftung = false)
{
FS20_SwitchMode(50807 /*[Lüftung\FS20 Lüftung EinAus]*/, true);
}
?>
und >= oder <= … du solltest dich entscheiden…
Ist der Wert in beiden gleich, hat das zuletzt ausgeführte Script natürlich die Oberhand.
Also entweder > und <= oder < und >=
Aha… und ich sehe gerade, dass dem Horst wieder was aufgefallen ist, was mir auch schon öfters einen Fallstrick bedeutet hat… na das ist der Profi
Du kannst in IPS das Skript starten, sobald sich eine der Temperaturvariablen ändert. Dafür kannst du ein bzw in deinem Fall zwei Ereignisse anlegen, welche auf die Variablenänderung reagieren.
Du hast 2 Vergleiche, die jeweils den Fall Abdecken, dass beide Temperaturen gleich sind. D.h. bei dem Sonderfall wird deine Lüftung AN und dann sofort wieder AUS geschaltet.
Tut beides der eigentlich Funktion nichts und für dein erste Skript schonmal super!
Das mit der OnChange-Überwachung gefällt mir, kenne ich aber nicht. Hab’ schnell in der Doku danach gesucht ohne fündig zu werden. Wie könnte so ein Skript aussehen?
Das Verhalten einer Variable kann ein Script starten. Dazu im Script oben rechts auf Ereignis hinzufügen=>Ausgel. Ereign.=>Deine Variable(z.B. Temperatur) wählen=>Der Auslöser (z.B. bei Variableänderung)=> Starte Script
Und schon startet das Script immer wenn sich die angegebene Variable ändert.
wie ich lese funktioniert es jetzt, aber ich glaube dein innen aussen Vergleich ist noch nicht perfekt.
In dem Bereich wo innen und aussen die Temperatur gleich ist wird die Lüftung ständig ein und aus gehen.
Ich mach das bei mit über die Differenz:
$diff = $innen - $aussen
Dann kannst du sagen einschalten bei diff größer 5 und ausschalten bei diff kleiner 0.