Problem mit Variablenabfrage im Script für Lüftungssteuerung IF ELSE

Hallo zusammen

Ich bin leider voll nicht der PHP Held :wink: aber das meiste kriegt man ja mit üben und überlegen hin. Jetzt scheitere ich jedoch an einem Script für die Gebäudelüftung. Diese soll anhand von den Netatmo CO2 Daten die Stufe wechseln falls notwendig.

Soweit so gut. Dies klappt auch soweit einwandfrei. Ich habe am Script ein Event angehängt, dass dieses bei Überschreitung von z.B. 900 ppm auslöst (folge Events auch).

Im Script möchte ich per IF abfragen ob die Stufe schon an ist, dann muss nicht mehr das ganze durch. Leider sass meine bessere Hälfte heute auf dem Hometrainer und dann gings los inkl Sonos… alle 5min… :wink: ups da war jemand nicht glücklich. Das Script kriegt die IF Abfrage ob der Schaltaktor schon ein ist irgendwie nicht gebacken denn es läuft tip top immer wieder die erste IF Schleife durch. Auch wenn ich z.B. die Lueftungssteuerung ändere das Selbe.

Das ursprüngliche Script habe ich aus dem Howto vom Forum.

Anbei mal mein Script, kann mal jemand von Euch PHP Gurus einen Blick drauf werfen und mich auf den richtigen Weg schubsen? THX

Script:

<?
// Ereignis-Trigger hinzufügen > Variablenänderung der Variablen von Bewegungsmelder1 und Bewegungsmelder2

$LueftSt = GetValue(13284 /*[Homematic\HM Systemvariablen\HomeMatic Systemvariablen\Lüftungssteuerung]*/);  // Bool Variable, welche Rollladensteuerung mit TRUE anzeigt
$Anwesend = GetValue(34137 /*[Homematic\HM Systemvariablen\HomeMatic Systemvariablen\Anwesenheit]*/);
$Stufe2Akt = GetValue(54843 /*[Homematic\HM Geräte\Gebäudelüftung\Gebäudelüftung Stufe 2\STATE]*/);
$Stufe3Akt = GetValue(26012 /*[Homematic\HM Geräte\Gebäudelüftung\Gebäudelüftung Stufe 3\STATE]*/);
$CO2WZ = GetValue(34174 /*[Netatmo\Netatmo\70:ee:50:01:5d:6c\MyNetatmo\Innen\CO2]*/);
$CO2BR = GetValue(34009 /*[Netatmo\Netatmo\70:ee:50:01:5d:6c\Outdoor\Buero\CO2]*/);
$CO2KZ = GetValue(35421 /*[Netatmo\Netatmo\70:ee:50:01:5d:6c\Outdoor\Tipsi Zimmer\CO2]*/);
$CO2SZ = GetValue(14099 /*[Netatmo\Netatmo\70:ee:50:01:5d:6c\Outdoor\Schlafzimmer\CO2]*/);


if (($LueftSt === true) AND ((($Stufe3Akt === false) AND ($Stufe2Akt === false)) AND (($CO2WZ>=900) AND ($CO2WZ<1200)) OR (($CO2BR>=900) AND ($CO2BR<1200)) OR (($CO2KZ>=900) AND ($CO2KZ<1200)) OR (($CO2SZ>=900) AND ($CO2SZ<1200)))) {  // Wenn bei einem Bewegungsmelder Bewegung erkannt wurde
   if ($Anwesend === true) {  // Wenn es Nacht oder Dunkel ist


			// Nachtsteuerung mit Sound

		  WFC_PushNotification(34504 /*[WebFront Test]*/, 'Info', 'Gebäudelüftung, CO2 Stufe 2 aktiviert.', '', 0);
//		  SNS_PlayFilesGrouping(59031 /*[Multimedia\Sonos\Speaker\Büro]*/ , array( 54449 => array( "volume" => 20),
//                                     30611 => array( "volume" => 20) ), array("http://192.168.100.55:3777/user/sounds/fixed/LueftCO2St2.mp3"), 0 ); // Büro Master, KZ und WZ in Gruppe dazu

//        IPS_Sleep(2000);   // 2 Sek Pause für Funkübertragung


		  HM_WriteValueBoolean(25297 /*[Homematic\HM Geräte\Gebäudelüftung\Gebäudelüftung Stufe 1]*/, "STATE", true);

		  IPS_Sleep(1500);

		  HM_WriteValueFloat(49121 /*[Homematic\HM Geräte\Gebäudelüftung\Gebäudelüftung Stufe 2]*/, "ON_TIME", 60*60);
		  IPS_Sleep(1500);
		  HM_WriteValueBoolean(49121 /*[Homematic\HM Geräte\Gebäudelüftung\Gebäudelüftung Stufe 2]*/, "STATE", true);

		}
        else {

		   // Nachtsteuerung ohne Sound

		  WFC_PushNotification(34504 /*[WebFront Test]*/, 'Info', 'Gebäudelüftung, CO2 Stufe 2 aktiviert.', '', 0);
        IPS_Sleep(2000);   // 2 Sek Pause für Funkübertragung

		  HM_WriteValueBoolean(25297 /*[Homematic\HM Geräte\Gebäudelüftung\Gebäudelüftung Stufe 1]*/, "STATE", true);

		  IPS_Sleep(1500);

		  HM_WriteValueFloat(49121 /*[Homematic\HM Geräte\Gebäudelüftung\Gebäudelüftung Stufe 2]*/, "ON_TIME", 60*60);
		  IPS_Sleep(1500);
		  HM_WriteValueBoolean(49121 /*[Homematic\HM Geräte\Gebäudelüftung\Gebäudelüftung Stufe 2]*/, "STATE", true);

		   }
    }

else {
   // LAMPE(N) AUSSCHALTEN
}
?>

Probier mal mit ein paar Ausgaben (echo) mehr einzugrenzen warum das Problem passiert. Damit findest du bestimmt auch das Problem. Die Ausgabe müsste bei Timern dann im Meldungsfenster landen :slight_smile:

paresy

so „echos“ eingebaut guter Tip!

Leider bin ich jetzt komplett verwirrt. Wenn die Variable auf ein ist kriege ich „1“ zurück was ja „true“ ist/wäre, hab ich mal gelernt :slight_smile: Bis hier alles klar und mein Script würde = true auch klappen denke ich

wenn ich jetzt aber egal welche von den Variablen auf „false“ stelle dann bekomme ich im echo nichts mehr zurück. Ist das by design, das „0“ quasi nicht angezeigt wird oder muss ich die Abfrage anders machen? Wenn ich ja nichts zurück bekomme kann ich ja auch nichts abfragen… daher wohl der Effekt mit meinem Script. Jedoch stehe ich absolut auf dem Schlauch grad.

Anbei mal mein Versuch falls ich Fehler drin habe.

<?
// Ereignis-Trigger hinzufügen > Variablenänderung der Variablen von Bewegungsmelder1 und Bewegungsmelder2

$LueftSt = GetValue(13284 /*[Homematic\HM Systemvariablen\HomeMatic Systemvariablen\Lüftungssteuerung]*/);  // Bool Variable, welche Rollladensteuerung mit TRUE anzeigt
//$Anwesend = GetValue(34137 /*[Homematic\HM Systemvariablen\HomeMatic Systemvariablen\Anwesenheit]*/);
$Stufe2Akt = GetValue(54843 /*[Homematic\HM Geräte\Gebäudelüftung\Gebäudelüftung Stufe 2\STATE]*/);
$Stufe3Akt = GetValue(26012 /*[Homematic\HM Geräte\Gebäudelüftung\Gebäudelüftung Stufe 3\STATE]*/);
//$CO2WZ = GetValue(34174 /*[Netatmo\Netatmo\70:ee:50:01:5d:6c\MyNetatmo\Innen\CO2]*/);
//$CO2BR = GetValue(34009 /*[Netatmo\Netatmo\70:ee:50:01:5d:6c\Outdoor\Buero\CO2]*/);
//$CO2KZ = GetValue(35421 /*[Netatmo\Netatmo\70:ee:50:01:5d:6c\Outdoor\Tipsi Zimmer\CO2]*/);
//$CO2SZ = GetValue(14099 /*[Netatmo\Netatmo\70:ee:50:01:5d:6c\Outdoor\Schlafzimmer\CO2]*/);

//echo "hallo welt";
//		  IPS_Sleep(1500);
//echo $Anwesend;
//		  IPS_Sleep(1500);
echo $Stufe2Akt;
//		  IPS_Sleep(1500);
//echo $Stufe3Akt;
//		  IPS_Sleep(1500);

if ($Stufe2Akt == false) {

echo "lueft ein";

}
else {

echo "lueft aus";

}


?>

Dies ergibt schön „111“ wenn alle aktiv aber bei inaktiv „“ nix…

Habs noch mit einem IF else gekoppelt, da funktionierts doch… hmm…

thx für die Hilfe

Nach etwas Testing zuerst nur Schalter Werte geprüft, dann ging das Script plötzlich sauber, dann Netatmo Werte dazu und jetzt läufts auch… hmmm

Wenn ich das über ein Ereignis ausführen lassen verhält sich dann das Script anders als über den ausführen Knopf? Wie bei HM z.B nur der Dann Teil?

Hier noch die laufende Version, muss es mal durch Ultracompare schmeissen ev ein Klammerfehler???

<?
// Ereignis-Trigger hinzufügen > Variablenänderung der Variablen von Bewegungsmelder1 und Bewegungsmelder2

$LueftSt = GetValue(13284 /*[Homematic\HM Systemvariablen\HomeMatic Systemvariablen\Lüftungssteuerung]*/);  // Bool Variable, welche Rollladensteuerung mit TRUE anzeigt
$Anwesend = GetValue(34137 /*[Homematic\HM Systemvariablen\HomeMatic Systemvariablen\Anwesenheit]*/);
$Stufe2Akt = GetValue(54843 /*[Homematic\HM Geräte\Gebäudelüftung\Gebäudelüftung Stufe 2\STATE]*/);
$Stufe3Akt = GetValue(26012 /*[Homematic\HM Geräte\Gebäudelüftung\Gebäudelüftung Stufe 3\STATE]*/);
$CO2WZ = GetValue(34174 /*[Netatmo\Netatmo\70:ee:50:01:5d:6c\MyNetatmo\Innen\CO2]*/);
$CO2BR = GetValue(34009 /*[Netatmo\Netatmo\70:ee:50:01:5d:6c\Outdoor\Buero\CO2]*/);
$CO2KZ = GetValue(35421 /*[Netatmo\Netatmo\70:ee:50:01:5d:6c\Outdoor\Tipsi Zimmer\CO2]*/);
$CO2SZ = GetValue(14099 /*[Netatmo\Netatmo\70:ee:50:01:5d:6c\Outdoor\Schlafzimmer\CO2]*/);

//echo "hallo welt";
//		  IPS_Sleep(1500);
//echo $Anwesend;
//		  IPS_Sleep(1500);
//echo $Stufe2Akt,$Stufe3Akt;
//		  IPS_Sleep(1500);
//echo $Stufe3Akt;
//		  IPS_Sleep(1500);

if (($LueftSt == true) AND ($Stufe3Akt == false) AND ($Stufe2Akt == false) AND ((($CO2WZ>=900) AND ($CO2WZ<1200)) OR (($CO2BR>=900) AND ($CO2BR<1200)) OR (($CO2KZ>=900) AND ($CO2KZ<1200)) OR (($CO2SZ>=900) AND ($CO2SZ<1200))) ) {  // Wenn bei einem Bewegungsmelder Bewegung erkannt wurde
   if ($Anwesend == true) {  // Wenn es Nacht oder Dunkel ist


			// Nachtsteuerung mit Sound

		  WFC_PushNotification(34504 /*[WebFront Test]*/, 'Info', 'Gebäudelüftung, CO2 Stufe 2 aktiviert.', '', 0);
		  SNS_PlayFilesGrouping(59031 /*[Multimedia\Sonos\Speaker\Büro]*/ , array( 54449 => array( "volume" => 20),
                                     30611 => array( "volume" => 20) ), array("http://192.168.100.55:3777/user/sounds/fixed/LueftCO2St2.mp3"), 0 ); // Büro Master, KZ und WZ in Gruppe dazu

        IPS_Sleep(2000);   // 2 Sek Pause für Funkübertragung


		  HM_WriteValueBoolean(25297 /*[Homematic\HM Geräte\Gebäudelüftung\Gebäudelüftung Stufe 1]*/, "STATE", true);

		  IPS_Sleep(1500);

		  HM_WriteValueFloat(49121 /*[Homematic\HM Geräte\Gebäudelüftung\Gebäudelüftung Stufe 2]*/, "ON_TIME", 60*60);
		  IPS_Sleep(1500);
		  HM_WriteValueBoolean(49121 /*[Homematic\HM Geräte\Gebäudelüftung\Gebäudelüftung Stufe 2]*/, "STATE", true);

		}
        else {

		   // Nachtsteuerung ohne Sound

		  WFC_PushNotification(34504 /*[WebFront Test]*/, 'Info', 'Gebäudelüftung, CO2 Stufe 2 aktiviert.', '', 0);
        IPS_Sleep(2000);   // 2 Sek Pause für Funkübertragung

		  HM_WriteValueBoolean(25297 /*[Homematic\HM Geräte\Gebäudelüftung\Gebäudelüftung Stufe 1]*/, "STATE", true);

		  IPS_Sleep(1500);

		  HM_WriteValueFloat(49121 /*[Homematic\HM Geräte\Gebäudelüftung\Gebäudelüftung Stufe 2]*/, "ON_TIME", 60*60);
		  IPS_Sleep(1500);
		  HM_WriteValueBoolean(49121 /*[Homematic\HM Geräte\Gebäudelüftung\Gebäudelüftung Stufe 2]*/, "STATE", true);

		   }
    }

else {
   // LAMPE(N) AUSSCHALTEN
}
?>

und heute kriege ich niemand mehr dazu auf den Hometrainer zu steig und den proof of concept zu machen…:smiley:

thx für den Tip!

Ja, das ist eine PHP Besonderheit:
‚echo false‘ ergibt einen Leerstring.

Besser ist es, die Boolesche Variable bei der Ausgabe in Integer umzuwandeln.

Also ‚echo (int) false‘. Dann erhältst du die erwartete 0.

Alternativ könntest du dir die Werte auch mit var_dump ausgeben lassen.

Zu deiner zweiten Frage: das Skript verhält sich gleich, egal ob es direkt ausgeführt oder über ein Ereignis gestartet wird.

Gruß

Burkhard