Praxis – Steuerung einer Beleuchtung

Steuerung einer Beleuchtung (hier „Farbstrahler genannt)

Aufgabe:

  1. die Beleuchtung soll bei Dämmerung eingeschaltet werden
  2. um Mitternacht wieder ausgehen
  3. bei einer Bewegung und Dunkelheit für 10 Minuten wieder angehen
  4. außerdem soll bei Tag und wenn sich keine Personen im Haus aufhalten die Temperatur um 2 Grad abgesenkt werden.

Lösung:

Im Timer Wizard (siehe Doku) fügen wir zwei Einträge hinzu:

  1. Sunrise - es führt das Skript „Morgen“ aus
  2. Sunset – es führt das Skript „Abend“ aus

Im Skript „Abend“ werden diverse Beleuchtungseinrichtungen eingeschaltet:


<?
/*
*******************************
IP-SYMCON Event Scripting
*******************************
*/
//File: Abend.ips.php
// Trigger: TimerEvent > Sunset
echo "Es wird Abend";
SetValueBoolean("Flag_Tag", FALSE);
//OG
IPS_RunScript("FS20_Büro_Decke");
IPS_RunScript("FS20_Fensterlampe_An");
IPS_RunScript("FS20_Strahler_Hof_An");
IPS_RunScript("FS20_Farbstrahler_An");
IPS_RunScript("FS20_FarbKreisel_An");
IPS_RunScript("FS20_Schlaf_LK_An");
// Hof
FS20_SetIntensity(45029, (int) 6, 40);   // Strahler Rechts
FS20_SetIntensity(24125, (int) 6, 40);   // Strahler Links
FS20_SetIntensity(52490, (int) 6, 40);   // Strahler Mitte
?>

Tipp:
Der jeweilige eigentliche Schaltbefehl befindet sich in einem separaten Skript.
Das hat den entscheidenden Vorteil, dass wenn sich die ID einer Instanz
sich ändert, muss diese nur an einer Stelle vorgenommen werden.


<?
/*
*******************************
IP-SYMCON Event Scripting
*******************************
*/
//File: FS20_Farbstrahler_An.ips.php
FS20_SwitchMode(14180, True);
?>

Im Treppen-Flur wurde ein Bewegungssensor (PIRI) installiert.
Bei einem erfassten Objekt triggert er über die Variable „IN_IR_Flur“ das folgende Skript:


<?
/*
*******************************
IP-SYMCON Event Scripting
*******************************
*/
// (C) by MST 04.05
//File: Anwesend.ips.php
// Trigger: "IN_IR_Flur" und Timer 600 sec
$somemove = GetValueBoolean("IN_IR_Flur");
$lastmove = GetValueInteger("Time_Move_Floor");
$jemandda = GetValueBoolean("Flag_Anwesend_OG");
$lichtflur = GetValueBoolean("OUT_Farbstrahler");
$tag_nacht = GetValueBoolean("Flag_Tag");                        // True = Tag

if ($somemove == True)  {                                        // Bewegung erkannt
   // TTS_Speak(37579, "Es ist jemand im Flur");                 // Sprachausgabe optional
   SetValueBoolean("IN_IR_Flur",False);                          // zurücksetzen
   SetValueInteger("Time_Move_Floor", time());                   // Zeit merken
   SetValueBoolean("Flag_Anwesend_OG",True);                     // Flag setzen
// Beleuchtung einschalten bei Bewegung und Dunkelheit
   if (($lichtflur == False) && ($tag_nacht == False)) {
      FS20_SwitchDuration(14180, True, 600);                     // True = Tag
   }
} else {                                                          // keine Bewegung dann:
  
// nach 30 Minuten > keiner da ! 30*60 = 1800
   if ((time() >= $lastmove + 1800) && ($jemandda == True)) {
   SetValueBoolean("IN_IR_Flur",False);
   SetValueBoolean("Flag_Anwesend_OG",False);                    // zurücksetzen
   }
}
?>

… und hier has Skript für den Heizkörper:


<?
/*
*******************************
IP-SYMCON Event Scripting
*******************************
*/
// (C) by MST 04.05
//File: Heizung_Regelung.ips.php
// Trigger: "Flag_Tag"  und "Flag_Anwesend_OG"
// da IPS die gesamte Heizungsregelung übernimmt > FHT immer auf "Manuell" stellen
// FHT_SetMode(40775,1) // Manuell
$tag_nacht = GetValueBoolean("Flag_Tag");          // Tag = TRUE
$solltemperatur = GetValueFloat("TEMP_Soll_OG");
$tagabsenktemperatur = GetValueFloat("TEMP_Absenk_Tag");
$nachtabsenktemperatur = GetValueFloat("TEMP_Absenk_Tag");
$jemandda = GetValueBoolean("Flag_Anwesend_OG");
// Tag - Absenkung, wenn keiner im Haus
If (($tag_nacht == True) && ($jemandda == False)) {
   echo "Tag - Absenkung
";
   FHT_SetTemperature(40775,$solltemperatur -$tagabsenktemperatur);
} else {
   echo "Heizung - Normalbetrieb
";
   FHT_SetTemperature(40775,$solltemperatur);
}
// Nacht - Absenkung
If ($tag_nacht == False) {
   echo "Nacht - Absenkung
";
   FHT_SetTemperature(40775,$solltemperatur -$nachtabsenktemperatur);
}
?>

… und um Mitternacht ausschalten.
Tipp:
In diesem Skript wird noch einmal alles ausgeschaltet, was AUS sein kann.
Dadurch werden auch Geräte ausgeschaltet, die ggf. durch einen nicht erkannten
Funkbefehl noch AN waren.
Aus sicherheitstechnischen Gründen sollte man bei einem Saunaofen, Heizstrahler
usw. immer den Befehl: „FS20_SwitchDuration“ verwenden.


<?
/*
*******************************
IP-SYMCON Event Scripting
*******************************
*/
//File: Not_Nacht.ips.php
// Trigger: TimerEvent um Mitternacht
// Sicher ist sicher: Alles Aus!
IPS_RunScript("FS20_Heizung_Aus");
IPS_RunScript("FS20_Media_Aus");
IPS_RunScript("FS20_Heiz_Schlaf_Aus");
IPS_RunScript("FS20_Fensterlampe_Aus");
IPS_RunScript("FS20_Büro_Decke_Aus");
IPS_RunScript("FS20_Hofbeleuchtung_Aus");
IPS_RunScript("FS20_Farbstrahler_Aus");
IPS_RunScript("FS20_FrabKreisel_Aus");
IPS_RunScript("FS20_WLAN_Cam_Aus");
IPS_RunScript("FS20_Schlaf_LK_Aus");
IPS_RunScript("FS20_Sauna_All_Aus");
?>

Hallo,

ich habe mir dieses Script angesehen, und könnte es sein, das hier was falsch ist??

/*
*******************************
IP-SYMCON Event Scripting
*******************************
*/
// (C) by MST 04.05
//File: Anwesend.ips.php
// Trigger: "IN_IR_Flur" und Timer 600 sec
$somemove = GetValueBoolean("IN_IR_Flur");
$lastmove = GetValueInteger("Time_Move_Floor");
$jemandda = GetValueBoolean("Flag_Anwesend_OG");
$lichtflur = GetValueBoolean("OUT_Farbstrahler");
$tag_nacht = GetValueBoolean("Flag_Tag");                        // True = Tag

if ($somemove == True)  {                                        // Bewegung erkannt
   // TTS_Speak(37579, "Es ist jemand im Flur");                 // Sprachausgabe optional
   SetValueBoolean("IN_IR_Flur",False);                          // zurücksetzen
   SetValueInteger("Time_Move_Floor", time());                   // Zeit merken
   SetValueBoolean("Flag_Anwesend_OG",True);                     // Flag setzen
// Beleuchtung einschalten bei Bewegung und Dunkelheit
   if (($lichtflur == False) && ($tag_nacht == False)) {
      FS20_SwitchDuration(14180, True, 600);                     // True = Tag
   }
} else {                                                          // keine Bewegung dann:
  
// nach 30 Minuten > keiner da ! 30*60 = 1800
   if ((time() >= $lastmove + 1800) && ($jemandda == True)) {
   SetValueBoolean("IN_IR_Flur",False);
   SetValueBoolean("Flag_Anwesend_OG",False);                    // zurücksetzen
   }
}
?>

FS_SwitchDuration(14180, True, 600) : Hier wird das Licht eingeschaltet. Nun ist es aber so, das die Software nicht den reellen Zustand des Schalters erkennt, d.h. nach Ablauf der Zeit bleibt im Computer der Status des Lichtes auf „True“ obwohl das Licht ausging, nicht?

So, beim nächsten Trigger vom PIRI wird es spätestens hier nicht mehr klappen: if (($lichtflur == False) && ($tag_nacht == False))
> Hier steht die variable $lichtflur noch immer auf True !, obwohl das Licht ja aus ist? Also kann diese Kondition nie mehr erfüllt werden?

Oder irre ich mich da? T´schulding, bin noch Newbie.

Gut aufgepasst!

Hier ist wieder das „Problem“, dass man bei „FS20_SwitchDuration
die dazugehörige Status Variable selber zurücksetzen muss:

Für eine bestimmte (hier 15 Minuten) Zeit schalten:


FS20_SwitchDuration($iid, True, 15 * 60);
IPS_SetScriptTimer("Reset_Test_Variable", 15 * 60); // Timer auf 15 Minuten setzen

Rücksetzen: Name dieses Skript: z.B. Reset_Test_Variable


SetValueBoolean("Name_der_Status_Variable“", False); // ... vom o.g. Device: $iid
IPS_SetScriptTimer("Reset_Test_Variable“", 0); // und den Timer wieder ausschalten

Sorry aber : zu viele schaltbefehle wie das FHZ versenden kann…

mein tipp: unbedingt die aktoren die geschlatet werden sollen, sollten in ein array() reingefugt werden und nach ablauf aller scripte die array(member) gestellt werden sollen UND wenn array.count > 10 in mehrere ablaufe geschalltet werden sollen

[VB & PHP sprache - hab keine lust mehr PHP zu sprechen :mad:]
durchlaufe = ceiling(array().count / 10)
dieser_durchlauf = IPS_GetValueInteger("durchlauf")
while dieser_durchlauf < durchlaufe)
    // hier gibt es noch probleme : es sollen NUR 10 ausgefuhrt werden)
     for teller = dieserdurchlauf*10 to (durchlaufe * 10 - (dieser_durchlauf * 10))
          FS20_SwitchMode(array[$teller][$Iid],true)
    next teller
elseif (bottom((array().count-10) / 10) = 0 {
    for teller = 10 to 19
          FS20_SwitchMode(array[$teller][$Iid],true)
    next teller
else 
    ....
end if
// set scriptimer = now()+60s
IPS_SetValueInteger("ablaufe", dieser_ablauf + 1);
// ab nächster durchlauf : setze aktoren (diese + 10*durchlauf dieser script)

Unvolendete symphonie : ist schwer spät jetzt
bis morgen- schlafe gut
Fredje