Moin,
bei Geräten die direkt am Strom hängen gibt es eigentlich immer eine Variable Status. Problem mit dieser Variable ist das sie nur wirklich richtig ist wenn Strom auch permanent an ist. Schaltet man z.B. mit einem altmodischen Lichschalter eine Zigbee-Birne/-Lampe aus die angeschaltet war behält sie ihren Status an da sie ja nicht wissen kann das sie gleich vom Strom getrennt wird.
Für Zigbee2MQTT und Z-Wave habe ich Scripte geschrieben die eine zusätzliche Power-Variable mit dem Ident RB_Power in den Instanzen anlegen. In dieser Variable steht true wenn das Gerät reagiert und damit Strom bekommt oder false wenn es nicht reagiert. Die Scripte setzen einen 5 Minuten-Timer. Sollte eine schnellere Reaktion benötigt werden einfach den Timer ändern.
Benutzt man einen Bewegungsmelder um Licht zu schalten aber die Lampe ist vom Strom getrennt könnte man Alexa z.B. „Du musst leider den Schalter benutzen“ sagen lasse wenn RB_Power false ist.
Hier das Script für Zigbee2MQTT:
<?php
// Alle Zigbee2MQTT Instanzen in ein Feld einlesen
$InstanzIDsList = IPS_GetInstanceListByModuleID('{E5BB36C6-A70B-EB23-3716-9151A09AC8A2}'); // Zigbee2MQTT
if($_IPS['SENDER'] == "TimerEvent"){
if (IPS_GetName($_IPS['EVENT']) == 'ScriptTimer'){
// aktuelle Zeit
$current_time = time();
// alle Z2M Instanzen untersuchen
foreach ($InstanzIDsList as $InstanzID) {
// Gibt es Status-Variable
$VarID = @IPS_GetObjectIDByIdent('Z2M_State', $InstanzID);
if ($VarID > 0) {
// Status abfragen
$PayloadGet['state'] = '';
$PayloadJSON = json_encode($PayloadGet, JSON_UNESCAPED_SLASHES);
Z2M_Command($InstanzID, 'get', $PayloadJSON);
// Power-Variable anlegen wenn nötig
$PowerID = @IPS_GetObjectIDByIdent('RB_Power', $InstanzID);
if ($PowerID == false) {
$PowerID = IPS_CreateVariable(0);
IPS_SetName($PowerID, "Power"); // Variable benennen
IPS_SetParent($PowerID, $InstanzID);
IPS_SetIdent($PowerID, "RB_Power");
}
// Änderungszeit der Statusvariable abfragen
$Variable = IPS_GetVariable($VarID);
// Status wurde länger als 90 Sekunden nicht aktualisiert also muss das Gerät stromlos sein
if (($current_time - $Variable['VariableUpdated']) > 90){
// wenn Gerät stromlos dann Status und Power auf false setzen
if (GetValue($VarID)) SetValue($VarID, false);
SetValue($PowerID, false);
}
// Gerät hat Strom also Power auf true setzen
else {
SetValue($PowerID, true);
}
}
}
}
}
// Timer starten
IPS_SetScriptTimer($_IPS['SELF'], 300);
?>
und hier das Script für Z-Wave:
<?php
// Alle Z-Wave Instanzen in ein Feld einlesen
$InstanzIDsList = IPS_GetInstanceListByModuleID('{101352E1-88C7-4F16-998B-E20D50779AF6}'); // Z-Wave
if($_IPS['SENDER'] == "TimerEvent"){
if (IPS_GetName($_IPS['EVENT']) == 'ScriptTimer'){
// aktuelle Zeit
$current_time = time();
// alle Z-Wave Instanzen untersuchen
foreach ($InstanzIDsList as $InstanzID) {
// Gibt es Status-Variable
$VarID = @IPS_GetObjectIDByIdent('StatusVariable', $InstanzID);
if ($VarID > 0) {
// Status abfragen
@ZW_RequestStatus($InstanzID);
// Power-Variable anlegen wenn nötig
$PowerID = @IPS_GetObjectIDByIdent('RB_Power', $InstanzID);
if ($PowerID == false) {
$PowerID = IPS_CreateVariable(0);
IPS_SetName($PowerID, "Power"); // Variable benennen
IPS_SetParent($PowerID, $InstanzID);
IPS_SetIdent($PowerID, "RB_Power");
}
// Änderungszeit der Statusvariable abfragen
$Variable = IPS_GetVariable($VarID);
// Status wurde länger als 90 Sekunden nicht aktualisiert also muss das Gerät stromlos sein
if (($current_time - $Variable['VariableUpdated']) > 90){
// wenn Gerät stromlos dann Status und Power auf false setzen
if (GetValue($VarID)) SetValue($VarID, false);
SetValue($PowerID, false);
}
// Gerät hat Strom also Power auf true setzen
else {
SetValue($PowerID, true);
}
}
}
}
}
// Timer starten
IPS_SetScriptTimer($_IPS['SELF'], 300);
?>
Viel Spaß Ralf