Hallo zusammen,
ich habe brownsons DimmerSwitch Skript aus seiner Anleitung Toggle Switch für Dimmer – IPSView
angepasst, damit ich das auch für Zigbee2MQTT verwenden kann.
<?
/**
* @file IPSView_DimmerSynced.ips.php
* @author brownson - Erweiterung Andreas Thür
* @version
* Version 1.0, 2015-04-12 brownson: Initiale Version<br/>
* Version 1.5 2023-11-04 Andreas: Version um Z2M ertweitert
*
* Skript um eine Switch Variable für einen Dimmer zu realisieren
*
* Konfiguration Einstellungen:
* Das Script in die Instanz kopieren (HomematicIP :4 Z2M das Device)
*
* SET_DIMMER_LEVEL Einschaltlevel setzten, bei HmIP in % bei Z2M von 0-254
*/
/*
* Konfiguration:
* -------------------------------------------------------------------------
*/
$SET_DIMMER_LEVEL = "100"; /*Level, auf welchen bei ON geschaltet werden soll HmIP 1=100%, 0.8=80% Z2M 0-254 (10=4%)*/
/*
* Programmlogik:
* -------------------------------------------------------------------------
*/
$scriptID = $_IPS['SELF'];
$sender = $_IPS['SENDER'];
$parentID = IPS_GetParent($scriptID);
#################
$VarIDs = IPS_GetChildrenIDs($parentID ); // alle Links in's Körbchen
foreach($VarIDs as $Child_ID) // alle im Körbchen abklappern
{
if (IPS_GetObject($Child_ID) ["ObjectType"] == 2) { // Objekt ist Link - dadurch wird das script nicht irrtümlich verwendet - Objekt-Typ (0: Kategorie, 1: Instanz, 2: Variable, 3: Skript, 4: Ereignis, 5: Media, 6: Link)
$Var_name = IPS_GetName($Child_ID); // Original (verlinkte) ID auslesen
$ausloeser_name = IPS_GetName($Child_ID); // Den dazu benötigten Namen auslesen
if(($Var_name == "LEVEL") OR ($Var_name == "Helligkeit") OR ($Var_name == "Brightness"))
{
$level = $Child_ID;
$VarType = IPS_GetVariable($Child_ID)["VariableType"];
}
}
}
#################
# define ('DEVICE_DIMMER_ID', @IPS_GetVariableIDByName("LEVEL",$parentID )) OR define ('DEVICE_DIMMER_ID', @IPS_GetVariableIDByName("Helligkeit",$parentID)) OR define (@IPS_GetVariableIDByName("Brightness",$parentID) /*[Hardware\Homematic\Couch\LEVEL]*/);
define ('DEVICE_DIMMER_ID', $level);
$variableIDSwitch = CreateVariable('IPSView_Switch', 0, $parentID, 10,
'~Switch', $scriptID);
$variableIDDimmer = CreateVariable('IPSView_Dimmer', $VarType, $parentID, 20, '',
$scriptID, DEVICE_DIMMER_ID);
if ($sender=='Execute') {
CreateEvent ('IPSView_DimmerSync', DEVICE_DIMMER_ID, $scriptID);
# CreateEvent ('IPSView_WorkingSync', DEVICE_WORKING_ID, $scriptID);
} else if ($sender=='Variable') {
$value = GetValue(DEVICE_DIMMER_ID);
if (DEVICE_WORKING_ID==0 or !GetValue(DEVICE_WORKING_ID)) {
SetValue($variableIDSwitch, ($value > 0));
SetValue($variableIDDimmer, $value);
}
} else {
$variableId = $_IPS['VARIABLE'];
$value = $_IPS['VALUE'];
switch ($variableId) {
case $variableIDDimmer:
Dimmer_SetDeviceValue($value);
SetValue($variableIDSwitch, ($value > 0));
SetValue($variableIDDimmer, $value);
break;
case $variableIDSwitch:
if ($value && GetValue($variableIDDimmer)<= 0.05)
SetValue($variableIDDimmer, $SET_DIMMER_LEVEL);
if ($value)
Dimmer_SetDeviceValue(GetValue($variableIDDimmer));
else
Dimmer_SetDeviceValue(0);
SetValue($variableId, $value);
break;
default:
break;
}
}
/*
* Funktionen:
* -------------------------------------------------------------------------
*/
function Dimmer_SetDeviceValue($value) {
$instanceID = IPS_GetParent(DEVICE_DIMMER_ID);
$ident = IPS_GetObject(DEVICE_DIMMER_ID)['ObjectIdent'];
IPS_RequestAction($instanceID, $ident, $value);
}
function CreateVariable ($name, $type, $parentId, $position=0, $profile="",
$action=null, $referenceID=null) {
$variableId = @IPS_GetObjectIDByIdent($name, $parentId);
if ($variableId === false) {
$variableId = IPS_CreateVariable($type);
IPS_SetParent($variableId, $parentId);
IPS_SetName($variableId, $name);
IPS_SetIdent($variableId, $name);
IPS_SetPosition($variableId, $position);
if ($referenceID != null) {
$variable = IPS_GetVariable($referenceID);
$profile = $variable['VariableProfile'];
}
IPS_SetVariableCustomProfile($variableId, $profile);
IPS_SetVariableCustomAction($variableId, $action);
}
return $variableId;
}
function CreateEvent ($name, $variableId, $scriptId) {
$eventId = @IPS_GetObjectIDByIdent($name, $scriptId);
if ($eventId === false) {
$eventId = IPS_CreateEvent(0);
IPS_SetParent($eventId, $scriptId);
IPS_SetName($eventId, $name);
IPS_SetIdent($eventId, $name);
IPS_SetEventTrigger($eventId, 1/*ByChange*/, $variableId);
IPS_SetEventActive($eventId, true);
}
return $eventId;
}
?>
Grundsätzlich funktioniert das Script, die Variablen (IPSView_Switch und IPSView_Dimmer) werden angelegt uns lassen sich auch schalten.
Bei HomematicIP Dimmern funktioniert das Schalten einwandfrei, bei Z2M Dimmer leider nicht.
Wenn ich den Dimmer über IPSView_Switch ausschalte, dann wird der Dimmer auf „0“ gesetzt und die Variable kurzfristig auf „Aus“ gestellt, springt dann aber wieder retour aus „An“. Der Dimmer bleibt aus „0“.
Finde den Fehler leider nicht, eventuell könnt ihr mir hierbei helfen.
Danke euch,
Liebe Grüße Andreas