Anfängerfrage - Skript für Lüftung funktioniert nur teilweise

Hallo

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

?>

Christoph

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.

Hallo Christoph,

als erstes ist mir folgendes aufgefallen:

/*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);
    } 

So angepasst müsste dieses Script eigentlich laufen.

Da fehlte jeweils bei der zweiten Bedingung das zweite „=“.

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 >= :wink:

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 :smiley:

Du brauchst dafür das Script nicht alle x sec. laufen lassen.

Trigger deine Tempvariablen auf OnChange, das reicht.

2 Tipps:

  1. 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.

  2. 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!

paresy

EDIT: Pff… wiedermal zu langsam getippt :smiley:

Hallo Horst und Ernst

Super Service - jetzt funktionierts und ich hab auch wieder was gelernt. Herzlichen Dank!

Christoph

Mach dir nix draus. ich tippe zu langsam und habe die Erkennung nach fünf gefunden Pilzen(er) irgendwie auch verloren…:smiley:

Rainer und Paresy

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?

Christoph

Hallo Christoph,

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.:wink:

Ereignisse - IP-Symcon :: Automatisierungssoftware

Dort ist es beschrieben.

paresy

Vielen Dank Thomas und Paresy! Habe bereits die OnChange-Ereignisse eingebaut.

Christoph

Hallo,

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.

Schöne Grüße
Thomas