Einzelne Etagen und ganzes Haus über Skript schalten

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

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


???

ja in etwa …

die Frage ist doch: funktioniert es?

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.

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

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…

  1. Eine kleine Pause 1-2 Sekunden zwischen den einzelnen Schaltvorgängen
  2. 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);
	}

?>