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 ?
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
<?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:
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 />
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 ?
$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.
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);
}
}
}
?>