Zentral AUS über Verlinkte Objekte

Guten Morgen zusammen,

Ich möchte bei mir alle Lichter mit einem Tastendruck auf einen Tastsensor ausschalten.

Hierzu dachte ich an folgenden Lösungsansatz:

Ich lege mir eine Kategorie an in meinem Falle zum Test erst mal „Zentral AUS“
dorthin verlinkte ich die Instanz aller zu schaltenden Objekte.
Im Skript lese ich alle Objekte in dieser Kategorie aus und schaue über den Link auf die Objekt ID und schalte dort dann die Variable „STATE“.

Das hat anfangs auch mal geklappt mit nur einer Variable, dann habe ich das Skript etwas umgebaut und das oben beschriebene in eine Funktion gepackt, nun bekomme ich es irgendwie nicht zum laufen…
Mein Fehler lautet immer „unexpected end of file“.

Anbei mal mein Skript:

<?php

$catid = (43961);
$alldevices = IPS_GetChildrenIDs($catid);
if ($_IPS['VARIABLE'] = 33581)

{
hm_switch ($alldevices);
}



function hm_switch ($lightarray)

{


$state = IPS_GetValue(IPS_GetObjectIDByIdent( "STATE", $devices['TargetID'] )); //Abfrage des aktuellen Schaltaktor Zustandes

foreach($lightArray as $key => $value)
{
if ($state == true)
{
    HM_WriteValueBoolean(devices['TragetID'], "STATE", false);
{
}


}

?>

Kann mir hier jemand auf die Sprünge helfen?

Bzgl. des Skriptes noch eine Frage, ich habe ja nicht nur Schaltaktoren sondern auch Dimmer, kann man das ganze universell in eine Funktion packen oder müsste ich 2 Funktionen und 2 Kategorien für Dimmer und Switches anlegen ?

Gruß, Adrian

Da fehlt eine Klammer zu fuer das foreach

foreach($lightArray as $key => $value)
	{
	if ($state == true)
		{
          HM_WriteValueBoolean(devices['TragetID'], "STATE", false);
		{
		}
		}

Hallo 1007,

Danke für den Hinweis, aber der Fehler besteht nun leider dennoch.

Gruß,

Dann poste dein Skript noch mal.

Hallo Burkhard,

Hier nochmal mein Skript:

<?php

$catid = (43961);
$alldevices = IPS_GetChildrenIDs($catid);
if ($_IPS['VARIABLE'] = 33581)

{
hm_switch ($alldevices);
}



function hm_switch ($lightarray)

{


$state = IPS_GetValue(IPS_GetObjectIDByIdent( "STATE", $devices['TargetID'] )); //Abfrage des aktuellen Schaltaktor Zustandes

foreach($lightArray as $key => $value)
{
if ($state == true)
{
    HM_WriteValueBoolean(devices['TragetID'], "STATE", false);
{
}
}

}

?>

Das hier ist auch nicht richtig ( == )

if ($_IPS['VARIABLE'] = 33581)

Der Fehler ist leider immer noch da, ich finds einfach nicht wo der Wurm drin sein soll…

Da fehlt noch eine Klammer. So muss das sein:

function hm_switch ($lightarray) 
	{ 
	$state = IPS_GetValue(IPS_GetObjectIDByIdent( "STATE", $devices['TargetID'] )); //Abfrage des aktuellen Schaltaktor Zustandes 

	foreach($lightArray as $key => $value) 
		{ 
		if ($state == true) 
			{ 
    		HM_WriteValueBoolean(devices['TragetID'], "STATE", false); 
		
			{ 
			} 
		
			} 

		} 
	}

Ja habe es gerade eben gesehen,
Ich hab das Skript etwas abgeändert, ich hatte hier wohl glaube ich einen Denkfehler nun habe ich nicht mehr diese Fehlermeldung, dafür eine andere :banghead:

<?php
$catid = (43961);
$alldevices = IPS_GetChildrenIDs($catid);
if ($_IPS['VARIABLE'] == 33581)


{
hm_switch ($alldevices);
}

function hm_switch ($lightArray)

{
foreach($lightArray as $key => $value)
{

$state = GetValue(IPS_GetObjectIDByIdent( "STATE", $lightArray['TargetID'] )); //Abfrage des aktuellen Schaltaktor Zustandes
if ($state == true)
{
    HM_WriteValueBoolean(devices['TragetID'], "STATE", false);
}
}

}



?>

Die Fehlermeldung lautet: Undefined index: TargetID in /var/lib/symcon/scripts/14058.ips.php on line 16

Ich möchte eigentlich folgendes erreichen:

Wie oben Beschrieben alle Schalt und Dimmaktoren in einer Kategorie Verlinken, den Link dann auslesen, auf die Instanz ID verweisen und den aktuellen Status der Variable „STATE“ oder „LEVEL“ überprüfen, wenn diese z.B. true ist möchte ich ihn hiermit auf false setzten.

Das ganze habe ich gemäß Doku / Forenbeiträgen und testen so zusammen gebaut.
Wenn ich den Status der Variable haben möchte und das ohne Array mache dann komme ich mit folgendem Befehl wie oben im Skript auch zum Ziel:

$state = GetValue(IPS_GetObjectIDByIdent( "STATE", $lightArray['TargetID'] ))

nur scheint mir das gerade hier nicht zu klappen.

Ich denke dies ist falsch,weil wo kommt das „devices“ her?

HM_WriteValueBoolean(devices['TragetID'], "STATE", false);

wahrscheinlich eher

HM_WriteValueBoolean($lightArray['TragetID'], "STATE", false);

Und noch eine Rechtschreibfehler ( TargetID ) !

 HM_WriteValueBoolean(devices['TragetID'], "STATE", false);

Leider bekomme ich immer noch den selben Fehler, wobei er ja bereits bei der Überprüfung des aktuellen Zustandes motzt… also in Line 17 das er mit TargetID nichts anfangen kann… aber der Befehl müsste ja der richtige sein, oder liege ich hier falsch ?

Über TagetID komme ich ja zur ID der verlinkten Instanz??
Und da sich unter der Instanz ID eine „STATE“ befindet müsste ich ja auch deren Status so herausbekommen ?

22.06.2019, 14:12:05 | ScriptEngine | Result for Event 23155
<br />
<b>Notice</b>: Undefined index: TargetID in <b>/var/lib/symcon/scripts/14058.ips.php</b> on line <b>17</b><br />
<br />
<b>Warning</b>: Objekt mit Ident STATE wurde nicht gefunden in <b>/var/lib/symcon/scripts/14058.ips.php</b> on line <b>17</b><br />
<br />
<b>Warning</b>: Variable #0 existiert nicht in <b>/var/lib/symcon/scripts/14058.ips.php</b> on line <b>17</b><br />

Das sollte so gehen . Bei dir aber mit „STATE“. Habs bei mir nur mal so getestet.

	foreach($alldevices as $device)
		{
		
		$object = IPS_GetLink($device);		
		$id = IPS_GetObjectIDByIdent( "StatusVariable", $object['TargetID'] ); 
		$state = GetValue($id);
		
		}

Ok, sauber jetzt läufts! Danke :slight_smile:

Ich habs jetzt mal wie folgt eingebaut so siehts fertig aus:

<?php


$catid = (43961); 
$alldevices = IPS_GetChildrenIDs($catid);


if ($_IPS['VARIABLE'] == 33581)
{
    hm_switch($alldevices);
}




function hm_switch($alldevices)
{
    foreach($alldevices as $device) 
        { 
         
        $object = IPS_GetLink($device);          
        $id = IPS_GetObjectIDByIdent( "STATE", $object['TargetID'] );  
        $state = GetValue($id); 
        
        if ($state == true)
            {
                HM_WriteValueBoolean($object['TargetID'], "STATE", false);
            }
        }  
  } 

?>

Zum verstehen für mich, mit der jetzigen Änderung

    foreach($alldevices as $device) 

Sage ich einfach nur das aus $alldevices die variable $device wird ?

und

        $id = IPS_GetObjectIDByIdent( "STATE", $object['TargetID'] );  
        $state = GetValue($id

muss ich getrennt verarbeiten nicht wie ich es zuvor hatte in einer Zeile ?

Hast du eventuell auch einen Ansatz wie ich das lösen könnte mit switches und Dimmer ?
Ich müsste ja einmal

HM_WriteValueBoolean und das andere mal HM_WriteValueInteger machen, könnte ich hierzu 2 Funktionen anlegen und in der Funktion noch hinzufügen das es nur nach Verlinkten Instanzen mit „STATE“ sucht und die andere Funktion nur nach verlinkten Instanzen mit „LEVEL“ oder führt das zu Fehlern ?

Ist es möglich den TYP einer Instanz auszulesen, also sprich ob HUELight oder HomeMatic Device ?

Somit könnte man eine einzige Funktion anlegen für Hue und HomeMatic, da die Befehle zum setzen der Variablen unterschiedlich sind müsste man das im Vorfeld herausfinden und den entsprechenden Befehl verwenden, oder würde ihr eher für jeden Geräte Typ ( HomeMatic Dimmer / Switch ) und Hue Dimmer / Switch jeweils eigene Funktionen und Link Kategorien anlegen ?

Gesendet von iPhone mit Tapatalk

Du kannst RequestAction nutzen. Dafür brauchst du den Instanzentyp nicht zu wissen.

$alldevices ist eine array mit alle deinen Links. foreach ist eine Schleife das ganze array durchgeht und
in $device ist nur der aktuelle Link.
Musst du nicht getrennt machen. War nur der besseren Uebersicht wegen.

Guten Tag zusammen,

Herzlichen Dank für die vielen Hilfestellungen, ich habe das Skript nun mal etwas umgebaut, möchte jedoch wenns geht das ganze noch universeller gestalten, derzeit habe ich eine getrennte Kategorie für Dimmer und für Switches wäre es möglich das ganze in eine Kategorie zu packen und in der Funktion noch eine Abfrage mit einzubauen ob es sich bei der Variabel um einen Switch oder einen Dimmer handelt ?

Mir fehlt hier gerade der Ansatz nach was ich suchen soll, könnte ich mir eventuell ein eigene Profil Anlegen ( Switch und Dimmer ) und dann in der Instanz des Schaltaktors nach einer Variable mit dem Profil „Switch“ suchen?
Wenn dies Zutrifft und die Instanz eine Variable Switch enthält frage ich deren Status ab, sollte dieser True sein setzte ich ihn mit dem Skript auf FALSE, ist das in der Art möglich?

Anbei noch das aktuelle Skript:

<?php

/*-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------*/
/*Zentral AUS ( Beleuchtung / Sonos / Multimedia )*/
/*-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------*/


//Zuweisung der Kategorien HomeMatic Schaltaktoren / Dimmer & Hue Lights

$cat_switch_id = (43961);       //Kategorie der verlinkten Schaltaktoren
$allswitches = IPS_GetChildrenIDs($cat_switch_id);            //Auslesen der untergeordneten Links

$cat_dim_id = (23378);              //Kategorie der verlinkten Dimmer
$alldimmers = IPS_GetChildrenIDs($cat_dim_id);                //Auslesen der untergeordneten Links





if ($_IPS['VARIABLE'] == 33581)         //Auslöse Variable des Skriptes
    {
        switches($allswitches);                                                       
        dimmer($alldimmers);
        IPS_LogMessage("Zentral AUS", "Die gesamte Beleuchtung wurde durch betätigen der Leaving - Home Taste ausgeschalten");
    }






/*-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------*/
/*FUNKTIONEN*/
/*-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------*/


//Schaltaktor:

function switches($alldevices)                         
{
    foreach($alldevices as $device)         
    { 
            $object = IPS_GetLink($device);                                                       
            $id = IPS_GetObjectIDByIdent( "STATE", $object['TargetID'] );       
            $state = GetValue($id); 
        
        if ($state == true)
        {
           RequestAction($id, false);
        }
    }  
} 


//dimmer

function dimmer($alldevices)

{
    foreach($alldevices as $device) 
        { 
         
        $object = IPS_GetLink($device);          
        $id = IPS_GetObjectIDByIdent( "LEVEL", $object['TargetID']);  
        $state = GetValue($id); 
        
        if ($state > 0.0)
            {
                RequestAction($id, 0.0);
            }
        }  
  } 
?>

Gruß, Adrian

Guten Tag zusammen,

Hat hier niemand einen Ansatz ?

Gruß,

Über GetVariable kannst du ermitteln ob es sich um eine bool oder float handelt.
Schau Mal hier bei GetVariable:
Etagenlicht
Michael