IPSView_DimmerSwitch

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

Diese Konstante wird bei Dir noch verwendet, ist aber nirgends definiert :wink:

Merci,

das kommt davon, wenn man in Skripten von anderen herumpfuscht…
ich weiß aber auch wieder warum, weil es bei HmIP ja keine „Working“ Variable mehr gibt! :smiley:

Ich hab die Konstante mal rausgeschmissen, bei HomematicIP Dimmern funktioniert das Ganze,
nur bei Z2M Lampen (egal ob HUE, IKEA oder Anderen) springt die Switch Variable wieder auf „ON“, weil die Dimmer bzw Brightness Variable nicht schnell genug auf 0 geht.

Hat das eventuell schon wer umgebaut?

Liebe Grüße Andreas

Ich vermute das liegt daran das bei z2m der Dimmwert nicht auf den Wert 0 geht. Laut IPS ja, laut dem Dimkaktor steht er aber auf 1. So zumindest bei mir… das hat mich auch endlos Nerven gekostet.

1 „Gefällt mir“

Danke für den Hinweis, schaue ich mir an!

Liebe Grüße Andreas

Bin gespannt ob es damit zusammenhängt. Bei mir ist es so. Der IKEA Dimmer geht definitiv auf Wert 1 wenn ausgeschaltet wird. Manchmal springt er auch auf 0 und springt dann auf 1. Verhält sich recht merkwürdig und was ich nicht verstehe wieso IPS den Wert 0 ausgibt und der Dimmer aber 1.