dpoessl
1. November 2012 um 17:14
1
Hallo,
ich möchte mich nun an die wirklichen Skripte wagen.
Habe schon mal ein ganz einfaches für einen HM Aktor gebaut. Hat auch geklappt.
Nun möchte ich bspw. alle Deckenlampen im Obergeschoss ein bzw. ausschalten.
<?
$id_aktor = 34810 /*[OG/Kinderzimmer]*/;
$id_state = 17491 /*[OG/Kinderzimmer\STATE]*/;
$id_aktor = 37891 /*[OG/Schlafzimmer]*/;
$id_state = 29570 /*[OG/Schlafzimmer\STATE]*/;
$id_aktor = 23391 /*[OG/Foyer]*/;
$id_state = 17987 /*[OG/Foyer\STATE]*/;
$id_aktor = 11849 /*[OG/Bad]*/;
$id_state = 42090 /*[OG/Bad\STATE]*/;
HM_WriteValueBoolean($id_aktor, "STATE" , !GetValue($id_state));
?>
Wie müsste die HM_WriteValueBoolean Zeile dafür aussehen?
Oder macht man solche Sequenzen ganz anders?
Besten Dank.
Hallo,
ich schalte diese einfach nacheinander durch.
Es gibt hier bestimmt smartere Lösungen aber meine funktioniert und ich verstehe sie…
Gruß
boris
Gesendet von meinem XT910 mit Tapatalk 2
ernie
1. November 2012 um 18:51
3
du kannst ein Array machen, da alle IDs reinpushen und dann eine foreach Schleife alle setzen …
ist ein wenig eleganter, aber mit 10x HM-WriteValue geht es auch …
pseudo Code ohne ihn getestet zu haben:
$alleIDs = array();
array_push($alleIDs,25123);
array_push($alleIDs,25124);
array_push($alleIDs,12456);
foreach ($alleIDs as $key => $value) {
HM_WriteValueBoolean($value, "STATE" , !GetValue($id_state));
}
dpoessl
1. November 2012 um 19:47
4
ernie:
du kannst ein Array machen, da alle IDs reinpushen und dann eine foreach Schleife alle setzen …
ist ein wenig eleganter, aber mit 10x HM-WriteValue geht es auch …
pseudo Code ohne ihn getestet zu haben:
$alleIDs = array();
array_push($alleIDs,25123);
array_push($alleIDs,25124);
array_push($alleIDs,12456);
foreach ($alleIDs as $key => $value) {
HM_WriteValueBoolean($value, "STATE" , !GetValue($id_state));
}
Also so…
$alleIDs = array();
array_push($alleIDs,34810 );
array_push($alleIDs,37891 );
array_push($alleIDs,23391 );
array_push($alleIDs,11849 );
foreach ($alleIDs as $key => $value) {
HM_WriteValueBoolean($value, "STATE" , !GetValue($id_state));
}
???
ernie
1. November 2012 um 20:21
5
ja in etwa …
die Frage ist doch: funktioniert es?
dpoessl
2. November 2012 um 22:03
6
Also das hier…
<?
$alleIDs = array();
array_push($alleIDs,34810 );
array_push($alleIDs,37891 );
array_push($alleIDs,23391 );
array_push($alleIDs,11849 );
foreach ($alleIDs as $key => $value) {
HM_WriteValueBoolean($value, "STATE" , !GetValue($id_state));
}
?>
Schaltet alle Lampen nahezu gleichzeitig an. Nur kommt eine Fehlermeldung nach dem Schalten.
Notice: Undefined variable: id_state in C:\IP-Symcon\scripts\22316.ips.php on line 10
Warning: Variable #0 existiert nicht in C:\IP-Symcon\scripts\22316.ips.php on line 10
[0] in function GetValue in C:\IP-Symcon\scripts\22316.ips.php on line 10
Was könnte da der Fehler sein? Bin leider noch bisschen PHP Neuling.
PS: Mit dem o.g. Skript kann ich ja nun alle Lampen einschalten. Was müsste ich in einem anderen Skript abändern, um nun alle Lampen auszuschalten? Oder kann ich mit dem gleichen Skript sowohl An- als auch Ausschalten?
Hi
Also die 1. Meldung stammt von der nicht vorhandenen Variable id_state im GetValue-Funktionsaufruf. Die zweite Meldung kommt von der Funktion GetValue an sich - sie meldet ordnungsgemäß das eine Variable mit der ID 0 nicht existiert. Damit ist der Rückgabewert ein Boolean mit dem Wert FALSCH. Durch das Ausrufezeichen vor dem Funktionsaufruf wird der Rückgabewert zu WAHR. Und damit wird dein Ausgang eingeschaltet.
dpoessl:
Also das hier…
Notice: Undefined variable: id_state in C:\IP-Symcon\scripts\22316.ips.php on line 10
Warning: Variable #0 existiert nicht in C:\IP-Symcon\scripts\22316.ips.php on line 10
[0] in function GetValue in C:\IP-Symcon\scripts\22316.ips.php on line 10
Was könnte da der Fehler sein?
Um zum Beispiel abhängig vom Zustand des ersten Objekts ein oder aus zu schalten kann der folgende Code benutzt werden:
<?
$alleIDs = array();
array_push($alleIDs,34810 );
array_push($alleIDs,37891 );
array_push($alleIDs,23391 );
array_push($alleIDs,11849 );
$newstate = !GetValue(reset($alleIDs)); // reset liefert den ersten Eintrag eines Arrays
foreach ($alleIDs as $instanzID) {
HM_WriteValueBoolean($instanzID, "STATE" , $newstate);
}
?>
Gesendet von meinem GT-P7500 mit Tapatalk 2
dpoessl
3. November 2012 um 22:06
8
Hallo ich habe es jetzt so gebaut…
<?
$alleIDs = array();
array_push($alleIDs,55594 /*[Haus\Keller\Abstellraum\Beleuchtung\Deckenlampe]*/ );
array_push($alleIDs,47649 /*[Haus\Keller\Bad\Beleuchtung\Deckenlampe]*/ );
array_push($alleIDs,30527 /*[Haus\Keller\Flur\Beleuchtung\Deckenlampe]*/ );
array_push($alleIDs,11330 /*[Haus\Keller\Gästezimmer\Beleuchtung\Deckenlampe]*/ );
array_push($alleIDs,56997 /*[Haus\Keller\Werkstatt\Beleuchtung\Deckenlampe]*/ );
foreach ($alleIDs as $instanzID) {
HM_WriteValueBoolean($instanzID, "STATE" , true);
}
?>
Es wäre jetzt noch folgendes schön…
Eine kleine Pause 1-2 Sekunden zwischen den einzelnen Schaltvorgängen
Ein Feedback wäre auch noch gut
Wie könnte ich die beiden Punkte bewerkstelligen?
Moin,
Mein Vorschlag:
<?
$alleIDs = array();
$id_wfc = 43803 /*[WebFront Configurator]*/;
array_push($alleIDs,37351 /*[Flure\Licht\Lampe Flur EG]*/ );
array_push($alleIDs,56337 /*[Flure\Licht\Lampe Flur OG]*/ );
array_push($alleIDs,29527 /*[Flure\Licht\Lampe Treppe EG-OG]*/ );
array_push($alleIDs,45996 /*[Flure\Licht\Lampe Treppe OG-DG]*/ );
foreach ($alleIDs as $instanzID)
{
$aktueller_status = GetValue(IPS_GetVariableIDByName("STATE", $instanzID));
HM_WriteValueBoolean($instanzID, "STATE" , !$aktueller_status);
//statusabhängige Meldung erzeugen
if (!$aktueller_status)
{
$meldung = IPS_GetLocation($instanzID)." wurde eingeschaltet.";
}
else
{
$meldung = IPS_GetLocation($instanzID)." wurde ausgeschaltet.";
}
// Meldung im Webfront einblenden
WFC_SendNotification($id_wfc, "LICHT", $meldung, "Information", 5);
// Meldung ins Log schreiben
IPS_LogMessage ($_IPS['SELF'], $meldung);
// weitere Ausführung um 2 sek. = 2000 ms verzögern
IPS_Sleep(2000);
}
?>
Damit werden die aktuellen Zustände gelesen, eine dazu passenden Meldung erzeugt, diese im WF und im Log ausgegeben und in den entgegengesetzten Zustand geschaltet.
Wenn es nur dem Einschalten dienen soll, dann etwas so:
<?
$alleIDs = array();
$id_wfc = 43803 /*[WebFront Configurator]*/;
array_push($alleIDs,37351 /*[Flure\Licht\Lampe Flur EG]*/ );
array_push($alleIDs,56337 /*[Flure\Licht\Lampe Flur OG]*/ );
array_push($alleIDs,29527 /*[Flure\Licht\Lampe Treppe EG-OG]*/ );
array_push($alleIDs,45996 /*[Flure\Licht\Lampe Treppe OG-DG]*/ );
foreach ($alleIDs as $instanzID)
{
HM_WriteValueBoolean($instanzID, "STATE" , true);
// Meldung erzeugen
$meldung = IPS_GetLocation($instanzID)." wurde eingeschaltet.";
// Meldung im Webfront einblenden
WFC_SendNotification($id_wfc, "LICHT", $meldung, "Information", 5);
// Meldung ins Log schreiben
IPS_LogMessage ($_IPS['SELF'], $meldung);
// weitere Ausführung um 2 sek. = 2000 ms verzögern
IPS_Sleep(2000);
}
?>