Dies ist übrigens das Skript, mit dem ich den Fehler des HmIP-BROLLS umgehe:
…
EDIT: ich habe das Skript noch etwas erweitert
- Unterstützung auch von LEVEL_2 Variablen (Lamellen)
- Unterstützung auch von Mehrfachaktoren (HmIPW-DRBL4)
- Unterstüzung von Fernzugriffspassworten mit Sonderzeichen
<?php
// das Skript dient zur Umgehung eines "Fehlers" bei HmIp-BROLL und HmIp-FROLL Aktoren
// es sollte gestriggert werden, wenn die LEVEL Variable(n) des Statuskanals (z.B.3) aktualisiert wird.
// es wird dann der Wert in den Aktorkanal (z.B.4) geschrieben
declare(strict_types=1);
//Zugriff über RPC. Siehe https://www.symcon.de/service/dokumentation/entwicklerbereich/datenaustausch/
//'USER' und 'PASSWORD' sind zu setzen, wenn der Fernzugriff aktiviert ist
const USER = ''; //Lizenz-Benutzernamen
const PASSWORD = '' //Fernzugriff Kennwort
const LOGGING_ACTIVE = true;
if ($_IPS['SENDER'] !== 'Variable'){
echo 'Das Skript kann nur von einer Variablen getriggert werden.';
return;
}
$ident = IPS_GetObject($_IPS['VARIABLE'])['ObjectIdent'];
if (!in_array($ident, ['LEVEL', 'LEVEL_2'])){
echo 'Das Skript kann nur von einer LEVEL oder LEVEL_2 Variablen getriggert werden.';
return;
}
//wir warten 0.5 Sekunden, damit der Wert des Aktorkanals ebenfalls angekommen ist
usleep(500000);
if (LOGGING_ACTIVE){
IPS_LogMessage(__file__, sprintf('Variable: #%s, Value: %s', $_IPS['VARIABLE'], GetValueFloat($_IPS['VARIABLE'])));
}
//wir suchen den zugehörigen Wert des AKtorkanals ...
//die eigene Instanz suchen
$instanceID_status = IPS_GetObject($_IPS['VARIABLE'])['ParentID'];
//die HM Addresse der Status Instanz auslesen (als Wertepaar)
$address_status = explode(':', IPS_GetProperty($instanceID_status, 'Address'));
//dann lautet die Adresse des AKtorkanals:
$address_aktor_ch = (int) $address_status[1] + 1;
$address_aktor = [$address_status[0], $address_aktor_ch];
//nach der Instanz des Aktorkanals im Objektbaum suchen
// alle HM Devices durchgehen
$instanceID_aktor = 0;
foreach (IPS_GetInstanceListByModuleID('{EE4A81C6-5C90-4DB7-AD2F-F6BBD521412E}') as $instanceID){
if (IPS_GetProperty($instanceID, 'Address') === implode(':', $address_aktor)){
//Instanz gefunden
$instanceID_aktor = $instanceID;
break;
}
}
if ($instanceID_aktor === 0){
echo sprintf('Es wurde keine Homematic-Instanz mit der Adresse %s gefunden', implode(':', $address_aktor));
return;
}
//wenn die Instanz gefunden wurde, dann ID der LEVEL Variablen ermitteln
$levelId_aktor = 0;
if ($instanceID_aktor !== 0){
$levelId_aktor = IPS_GetObjectIDByIdent($ident, $instanceID_aktor);
} else {
echo sprintf('Die Aktor Instanz %s hat kein Objekt mit dem Ident %s', $instanceID_aktor_ch, 'LEVEL');
return;
}
//wenn die LEVEL Variable gefunden wurde und der neue Wert ungleich dem alten ist, dann den neuen Wert setzen
$status_ch_Value = GetValueFloat($_IPS['VARIABLE']);
$aktor_ch_Value = GetValueFloat($levelId_aktor);
if (LOGGING_ACTIVE){
IPS_LogMessage(__file__, sprintf('Der Vergleich von Kanal %s (%s) mit %s (%s) wird durchgeführt', $address_status[1], $status_ch_Value, $address_aktor_ch, $aktor_ch_Value));
}
if ($status_ch_Value !== $aktor_ch_Value){
if (USER !== ''){
$rpc = new JSONRPC('http://' . USER . ':' . urlencode(PASSWORD) . '@127.0.0.1:3777/api/');
} else {
$rpc = new JSONRPC('http://127.0.0.1:3777/api/');
}
if (LOGGING_ACTIVE){
IPS_LogMessage(__file__, sprintf('Der alte Wert von Kanal %s (#%s: %s) wird durch den neuen Wert ersetzt (#%s: %s)', $address_aktor_ch, $levelId_aktor, $aktor_ch_Value, $_IPS['VARIABLE'], $status_ch_Value));
}
$rpc->SetValueFloat($levelId_aktor, $status_ch_Value);
}