19

Kleine LUA Scripte Teil 15: HUE Lampen mit Fibaro Taster dimmen

by Christian27. Januar 2017

HUE Lampen in Verbindung mit Fibaro sind eine häufig anzutreffende Kombination, und mit dem Fibaro HUE Plugin sind die HUE aus Szenen heraus auch leicht anzusprechen. Nun möchte man nicht für jedes An, Aus, Heller oder Dunkler das Telefon hervorholen oder Siri bemühen, und dazu gibt es ja auch noch diese praktischen Dinger an der richtigen Stelle direkt neben der Tür: Die Lichtschalter.

Hier stellen wir euch ein Skript vor, mit dem sich eure HUE, oder auch eine Gruppe von HUEs, über einen Taster am Dimmer 2 steuern lassen, als wären es „normale“ Leuchtmittel: An/Aus mit Klick, Heller/Dunkler im Wechsel mit Halten und volle Helligkeit mit Doppelklick. Was ihr dazu braucht sind HUE Lampen an einer HUE Bridge, das Fibaro HUE Plugin installiert im Home Center und ein Taster am Eingang S2 eines Fibaro Dimmers. Diesen Taster am zweiten Eingang des Dimmers zum Dimmen der HUE zu verwenden ist in wenigen Schritten erledigt. So geht’s:

Zuerst aktiviere in den Einstellungen des Fibaro Dimmers die „Scene activation functionality“ (Parameter 28). Dadurch kann ein Tastendruck am Dimmer das Dimmen der HUE über die Szene mit unserem Skript auslösen.

Lege anschließend im Home Center eine neue Szene an und kopiere den Code für die Szene dort hinein. Den Namen und Raum der Szene kannst du dir aussuchen, er hat keine Auswirkungen.

Konfiguration des HUE Skript

Jetzt musst du im Kopf der Szene die IDs deiner Geräte eintragen:

Die IDs des Dimmers und der HUEs findest im Home Center, wenn du beim Bearbeiten der Szene links in der Leiste mit dem Mauszeiger über die „Devices List“ fährst und das gesuchte Gerät auswählst. Nur gucken, nicht klicken! Die IDs der zu steuernden HUEs kommen mit Komma getrennt in die geschwungenen Klammern. Wenn es nur eine HUE ist, nur eine ID ohne Komma.

Die ID der Szene findest du, wenn du in der Szene auf den Reiter „General / Allgemein“ umschaltest. Wenn du fertig bist, Speichern nicht vergessen.

Damit das Skript sich merken kann, ob als nächstes hoch oder herunter gedimmt werden soll, legen wir noch zwei Variablen an: Gehe dazu im Home Center auf „Panels > Variables Panel“ und klicke im oberen Bereich „Variables“ (nicht bei „Predefined variables“) auf „Add“. Hier legst du zwei neue Einträge an:

„dimUpDown“ mit dem Wert 1
„lastDimToggle“ ebenfalls mit dem Wert 1

Du musst die Einträge genau so schreiben, ohne die Anführungszeichen. Auch hier das Speichern nicht vergessen.

Das war es schon. Jetzt sollte die bisher ungenutzte zweite Taste am Dimmer 2 deine HUE dimmen.

Die Tasten tauschen

Wahrscheinlich schaltet die erste Taste des Dimmers (S1) deine HUE bisher komplett aus und weiß mit voller Helligkeit wieder an. Diese Funktion brauchst du jetzt nicht mehr, so wie zuvor die nutzlose zweite Taste. Damit du dich nicht umgewöhnen musst, können wir einfach die Tasten tauschen: Aktiviere dazu im Home Center beim Dimmer die Option „Switch functionality of S1 and S2“ (Parameter 29). Jetzt macht die bisher gewohnte Taste, was man von ihr erwarten würde.

HUE Base Icon

HUE Base Icon

Falls du übrigens die schönen Flat Icons von Andreas Vichr benutzt (an dieser Stelle nochmal Danke, Andreas), findest du hier HUE Icons für den Fibaro Dimmer, der nur den Strom für deine HUE schaltet, und den du ja jetzt nicht mehr brauchst, damit du ihn zukünftig von den „echten“ Dimmern unterscheiden kannst. Es sind drei Icons: On (100%) und Off (0%), sowie ein „Low“ (10%-90%) um dir anzuzeigen, dass du die HUE gerade über den Dimmer dimmst, was diese gar nicht mögen.

Wenn du möchtest, kannst du jetzt noch über die weiteren Parameter im Kopf des Skriptes die Geschwindigkeit und die Schritte des Dimmens einstellen, sowie die Zeit in der man von Hoch- auf Herunter-Dimmen wechseln kann. Wähle die „stepTime“ nicht zu kurz, das überfordert das HUE Plugin. Sollte das Plugin nicht mehr reagieren, hilft ein Neustart des Home Centers.

Übrigens funktioniert das Skript auch am Eingang S1, mit einem Schalter statt Taster und auch mit anderen Fibaro Modulen. Dazu musst du die Szene Activation Codes im Skript auf die gewünschten Auslöser anpassen.

Hier das Skript. Viel Spaß!



Alternativ kannst du dir das Skript hier herunterladen:

Skript – DOWNLOAD ZIP

In der Zip-Datei befindet sich eine LUA-Datei mit dem oben geposteten Quellcode. Diese Zip muss nur entpackt werden und der Inhalt kann dann mit einem beliebigen Text-Editor bearbeitet werden.

About The Author
Christian
Christian
Ich bin Cristian. Mit einer gehörigen Portion Neugier beschäftige ich mich seit vielen Jahren mit der Digitalisierung von Lichtsteuerung und Home Automation über die Systeme LCN, Empirbus NXT und jetzt Z-Wave Fibaro. Ich schreibe hier als Gastautor und freue mich, meine Erfahrungen mit euch teilen zu können.
19 Comments
  • Eldar
    28. Januar 2017 at 12:16

    Super Beitrag, danke! Eine Frage: Geht das auch mit dem RGBW-Modul? Ich habe nämlich 3 Dimmer verbaut mit denen ich jeweils über S2 meine sich im Raum befindlichen RGBWs steuere. Aktuell dimme ich mit Doppelklick hoch und mit gedrückt halten herunter. Jetzt wäre es natürlich richtig gut, wenn ich eben wie beim Script oben, das mit gedrückthalten hinbekomme. Ich hätte dann nämlich den Doppelklick für eine andere Aktion, wie z.B. Sonos an/aus, frei. Das wäre mega :)

    • Eldar
      28. Januar 2017 at 12:53

      Geht :) Hab HUE einfach durch RGWB ersetzt und die auszulesenden Daten an die Befehle des RGBWs angepasst. Anbei das Script

      --[[
      %% properties
      sceneActivation
      %% events
      %% globals
      --]]

      local RGBWs = {RGBW} -- IDs of RGBW as Array {X, Y, Z}
      local fibaroID = -- Set ID of Device which shall dim RGBW
      local sceneID = -- Set ID of this scene

      local stepPercentage = 3 -- Dimmer step in percent
      local stepTime = 0.05 -- Dimmer step duration in seconds
      local toggleTime = 5 -- Time to toggle dim up/down

      ---- Do not modify code below that line ----

      function dimRgbw (rgbwID, step)

      local valueDimmer = tonumber(fibaro:getValue(rgbwID, "brightness")) + step

      if valueDimmer 255 then
      if valueDimmer == 255 + step then return end;
      valueDimmer = 255
      end

      -- fibaro:debug("RGBW " .. rgbwID ..": ".. valueDimmer)
      fibaro:call(rgbwID, "setBrightness", valueDimmer)

      end

      local startSource = fibaro:getSourceTrigger();
      if (
      ( tonumber(fibaro:getValue(fibaroID, "sceneActivation")) == 26 )
      or
      startSource["type"] == "other"
      )
      then
      -- Click
      local deviceValue1 = tonumber(fibaro:getValue(RGBWs[1], "on"));

      if (deviceValue1 > 0) then
      for i, iRGBW in ipairs(RGBWs) do
      fibaro:call(iRGBW, "turnOff")
      end
      else
      for i, iRGBW in ipairs(RGBWs) do
      fibaro:call(iRGBW, "turnOn")
      end
      end

      elseif ( tonumber(fibaro:getValue(fibaroID, "sceneActivation")) == 22 ) then

      -- Hold
      local dimUpDown = fibaro:getGlobal("dimUpDown")
      local lastDimToggle = fibaro:getGlobal("lastDimToggle")

      -- always start a new dim with dimming up
      if os.time() - lastDimToggle > toggleTime then dimUpDown = 1 end

      -- if off, switch on and dim up from darkest
      local deviceValue1 = tonumber(fibaro:getValue(RGBWs[1], "on"));
      if (deviceValue1 == 0) then
      for i, iRGBW in ipairs(RGBWs) do
      fibaro:call(iRGBW, "setBrightness", 1)
      fibaro:call(iRGBW, "turnOn")
      end
      dimUpDown = 1
      end

      -- if maximum brighntess start wich dimming down
      if tonumber(fibaro:getValue(RGBWs[1], "brightness")) == 255 then dimUpDown = -1 end

      fibaro:setGlobal("dimUpDown", dimUpDown * -1)
      local step = math.floor(255 / 100 * stepPercentage * dimUpDown)

      -- Start dim loop
      print ("Start dim",step)
      repeat
      for i, iRGBW in ipairs(RGBWs) do
      dimRgbw (iRGBW, step)
      end
      fibaro:sleep(1000 * stepTime)
      until false

      elseif ( tonumber(fibaro:getValue(fibaroID, "sceneActivation")) == 23 ) then

      -- Release
      print ("Stop")
      fibaro:setGlobal("lastDimToggle", os.time())
      fibaro:killScenes(sceneID)

      elseif ( tonumber(fibaro:getValue(fibaroID, "sceneActivation")) == 24 ) then

      -- Double Click
      print ("Setting maximum")
      for i, iRGBW in ipairs(RGBWs) do
      dimRgbw (iRGBW, 255)
      fibaro:call(iRGBW, "turnOn")
      end

      end

      • Christian
        Christian
        28. Januar 2017 at 12:55

        Ja, das geht so. Allerdings arbeitet das Fibaro RGB Modul mit dem Dimbereich 0-100 statt 0-255. Die angepasst Version ist unterwegs.

  • Christian
    Christian
    28. Januar 2017 at 13:11

    Auf die gleiche Weise lassen sich auch RGB Module über einen Dimmer 2 steuern. Es bedarf nur kleinerer Änderungen. Hier die angepasst Version des Skriptes:

    --[[
    %% properties
    98 sceneActivation
    %% events
    %% globals
    --]]

    local RGBs = {175, 176, 177} -- IDs of RGB as Array {X, Y, Z}
    local fibaroID = 98 -- Set ID of Device which shall dim RGB
    local sceneID = 8 -- Set ID of this scene

    local stepPercentage = 7 -- Dimmer step in percent
    local stepTime = 0.05 -- Dimmer step duration in seconds
    local toggleTime = 5 -- Time to toggle dim up/down

    ---- Do not modify code below that line ----

    function dimRGB (rgbID, step)

    local valueDimmer = tonumber(fibaro:getValue(rgbID, "brightness")) + step

    if valueDimmer 100 then
    if valueDimmer == 100 + step then return end;
    valueDimmer = 100
    end

    -- fibaro:debug("RGB " .. rgbID ..": ".. valueDimmer)
    fibaro:call(rgbID, "setBrightness", valueDimmer)

    end

    local startSource = fibaro:getSourceTrigger();
    if (
    ( tonumber(fibaro:getValue(fibaroID, "sceneActivation")) == 26 )
    or
    startSource["type"] == "other"
    )
    then
    -- Click
    local deviceValue1 = tonumber(fibaro:getValue(RGBs[1], "brightness"))

    if (deviceValue1 > 0) then
    for i, iRGB in ipairs(RGBs) do
    fibaro:call(iRGB, "turnOff")
    end
    else
    for i, iRGB in ipairs(RGBs) do
    fibaro:call(iRGB, "turnOn")
    end
    end

    elseif ( tonumber(fibaro:getValue(fibaroID, "sceneActivation")) == 22 ) then

    -- Hold
    local dimUpDown = fibaro:getGlobal("dimUpDown")
    local lastDimToggle = fibaro:getGlobal("lastDimToggle")

    -- always start a new dim with dimming up
    if os.time() - lastDimToggle > toggleTime then dimUpDown = 1 end

    -- if off, switch on and dim up from darkest
    local deviceValue1 = tonumber(fibaro:getValue(RGBs[1], "brightness"))
    if (deviceValue1 == 0) then
    for i, iRGB in ipairs(RGBs) do
    fibaro:call(iRGB, "setBrightness", "1")
    end
    dimUpDown = 1
    end

    -- if maximum brighntess start wich dimming down
    if tonumber(fibaro:getValue(RGBs[1], "brightness")) == 100 then dimUpDown = -1 end

    fibaro:setGlobal("dimUpDown", dimUpDown * -1)
    local step = math.floor(100 / 100 * stepPercentage * dimUpDown)

    -- Start dim loop
    print ("Start dim",step)
    repeat
    for i, iRGB in ipairs(RGBs) do
    dimRGB (iRGB, step)
    end
    fibaro:sleep(1000 * stepTime)
    until false

    elseif ( tonumber(fibaro:getValue(fibaroID, "sceneActivation")) == 23 ) then

    -- Release
    print ("Stop")
    fibaro:setGlobal("lastDimToggle", os.time())
    fibaro:killScenes(sceneID)

    elseif ( tonumber(fibaro:getValue(fibaroID, "sceneActivation")) == 24 ) then

    -- Double Click
    print ("Setting maximum")
    for i, iRGB in ipairs(RGBs) do
    dimRGB (iRGB, 100)
    end

    end

  • Markus Hintzsche
    1. Februar 2017 at 4:45

    Hi, ich bin neu im Bereich FIbaro und habe eine Frage.
    Verstehe ich das richtig, dass die Hue Lampen durch Verwendung des Hue AddOn gedimmt werden, die Lampen also von der Bridge den Befehl bekommen, sich zu dimmen? Oder werden sie durch den Fibaro Dimmer gedimmt? Falls ersteres der Fall ist, wozu brauche ich dann den Fibaro Dimmer? Geht das nicht auch mit einem x-beliebigen Z-Wave Taster?

    Liebe Grüße und vielen Dank,
    Markus

    • boomx
      1. Februar 2017 at 8:57

      Hi,

      die HUE-Lampen können über Fibaro nur durch das Plugin (welches die Bridge ansteuert) gesteuert werden, da Fibaro kein ZigBee-Chip verbaut. Das funktioniert auch mit einem x-beliebigen Z-Wave Taster ;)

      Gruß

    • Christian
      Christian
      1. Februar 2017 at 9:28

      Der Befehl an die HUE kommt von der HUE Bridge. Das vorgestellte Skript bedient den Wunsch, in einer Fibaro-Umgebung die „systemfremden“ HUE Lampen mit dem zweiten Taster der an an den Wänden ohnehin vorhandenen Schalter an Fibaro Dimmern zu dimmen. Das geht auch mit anderen Z-Wave Modulen und Tasten, wenn man die Szene Activation Codes entsprechend anpasst.

  • TT
    24. Februar 2017 at 18:25

    Hi,
    tolles Script, vielen Dank. Funktioniert super mit dem Schalter!

    Nun habe ich versucht, das auch auf die neue Fibaro KeyFob zu übertragen, da hapert es bei mir etwas mit dem Verständnis….
    Ich habe ein Script, dass via CentralSceneEvent die Tastendrücke in Zahlen wandelt und darauf hin Aktionen auslöst. Wie integriere ich da die SceneActivation? Auch als extra-Szene, sozusagen parallel zu SceneEvent läuft das bei mir nicht. Ich bin mir aber auch nicht sicher, welche Codes die KeyFob für die einzelnen Tasten sendet. Mein Wallmote-Script (https://www.siio.de/board/thema/aeotec-wallmote/) konnte ich 1 zu 1 übernehmen, aber auch da war mir das Dimmen mit diesem Script nicht gelungen.

    Ist sicher ein Denkfehler von mir, aber welcher????
    LG TT

    • Christian
      Christian
      24. Februar 2017 at 22:09

      Hi, danke für das Lob :-)

      Versuche mal die Szene statt mit Szene Activation direkt über CentralSceneEvent zu starten und dann die Codes der Tastendrücke abzufragen, die du bisher auch in Zahlen umwandelst.

      Also das SzeneActivation + Activation Codes der Dimmer zu ersetzen durch das CentralSceneEvent und die Codes der KeyFob.

      Grüße, Christian

  • Christian
    Christian
    24. Februar 2017 at 23:03

    Ah, jetzt erst dein Script studiert. CentralSceneEvent und Codes der Tastendrücke abfragen hast du ja gemacht.

    Das Dimmen geht nur in Richtung „Heller“ ganz auf hell und erst bei voller Helligkeit dann wieder dunkler, oder? – Du speicherst die nächste Dimm-Richtung nicht mehr in einer globalen Variable, sondern beginnst immer mit „Heller“:
    local dimUpDo = 1
    ---
    if tonumber(fibaro:getValue(HUEs[1], "ui.brightness.value")) == 255 then dimUpDo = -1 end

    Mein Script speichert die nächste Dimm-Richtung und den Zeitpunkt des letzten Dimm-Stops in einer globalen Variable.
    fibaro:setGlobal("dimUpDown", dimUpDown * -1)
    ---
    fibaro:setGlobal("lastDimToggle", os.time())

    Vor dem Dimmen werden die Richtung und der Zeitpunkt des letzten Dimmens aus der globalen Variable geholt.
    local dimUpDown = fibaro:getGlobal("dimUpDown")
    local lastDimToggle = fibaro:getGlobal("lastDimToggle")

    Wenn das letzte Dimmer länger her ist, wird immer mit „heller“ begonnen:
    -- always start a new dim with dimming up
    if os.time() - lastDimToggle > toggleTime then dimUpDown = 1 end

    Und wenn die Lampen ausgeschaltet sind, wird auch immer mit „heller“ begonnen:
    -- if off, switch on and dim up from darkest
    local deviceValue1 = tonumber(fibaro:getValue(HUEs[1], "on"));
    if (deviceValue1 == 0) then
    for i, iHUE in ipairs(HUEs) do
    fibaro:call(iHUE, "changeBrightness", 1)
    fibaro:call(iHUE, "turnOn")
    end
    dimUpDown = 1
    end

    Diese Funktion musst du in deinem Script wiederherstellen. Dann sollte das Dimmen gehen.

    Grüße, Christian

  • TT
    25. Februar 2017 at 17:14

    Hi Christian,

    vielen Dank, das Du Dich damit noch mal beschäftigt hast.
    Habe jetzt die globalen Variablen wieder reingenommen, also original Dein Script in meine functions eingesetzt.
    Beim ersten mal drücken ist alles super, Licht dimmt hoch.
    Beim 2. mal drücken regeln dann die Hues unabhängig hoch und runter, das dauert auch etwas länger als ich die Taste drücke. To many instances wird nicht angezeigt. Wirkt, als ob das HC2 nicht klarkommt, der Debug ist aber zeitnah und korrekt, er erkennt Taste3 HeldDown und verändert die Helligkeit (lasse ich mir auch ausgeben), aber alle Lampen geben unterschiedliche Werte und die Reihenfolge im Debug wechselt auch. Leider kann ich hier keinen Screenshot anfügen, aber Du verstehst, was ich meine? Die globalen Variablen werden dem Script entsprechend gesetzt.
    Hast Du noch eine Idee?

    LG TT

    • Christian
      Christian
      3. März 2017 at 9:34

      Nein, ich verstehe leider nicht genau, was du meinst.
      Wenn das Dimmen zu schnell geht, verschluckt sich das Fibaro HUE Plugin und arbeite die Dimm Befehle im Puffer langsam nacheinander ab. Das hat sehr merkwürdige Effekte zwischen nicht mehr reagieren und dann plötzlich nach einer Weile wild dimmen. Ist es das? Neustart des Homecenters hilft hier.

      Andere Möglichkeit, wenn die Lampen gegeneinander hoch und runter dimmen: Das Speichern der dimUpDown, das sich die Richtung für das nächste Dimmen merkt ist ein der Schleife, die die Gruppe der HUE abarbeitet. Dann drehst du die Richtung für jede Lampe um.

      Poste nochmal dein Script hier, dann schaue ich es mit an.

      Grüße, Christian

  • Eike
    3. März 2017 at 8:29

    Guten morgen zusammen,

    bei mir kommt im debugg immer der Fehler “ line 8: unexpected symbol near < "
    so sieht meine Zeile 8 aus :
    local HUEs = — IDs of HUE as Array {X, Y, Z}

    kann ich diese einzelne Szene für alle meine Schalter gemeinsam nutzen, oder muss ich sie für jeden Schalter einzeln anlegen?

    Vielen Danke für die Hilfe und schon mal ein schönes Wochenende.

    Grüße Eike

    • Christian
      Christian
      3. März 2017 at 9:37

      Hallo Eike.

      In der Zeile 8 fehlt die Angabe der HUES, die du dimmen möchtest in geschweiften Klammern mit Komma getrennt, so wie im Kommentar dahinter gezeigt. z.B.

      local HUEs = {23, 105, 213} -- IDs of HUE as Array {X, Y, Z}

      Du must die Szene für jeden Schalter einzeln anlegen, mit dem du dann eine Gruppe von mehreren HUE dimmen kannst.

      Viele Grüße, Christian

  • Eike
    3. März 2017 at 17:58

    Hey Christian,
    jetzt kommt diese Meldung:

    [DEBUG] 18:09:18: line 115: attempt to concatenate local ‚deviceId‘ (a table value)

    Liebe Grüße

    Eike

  • Narkose09
    4. März 2017 at 8:44

    Hoi,
    Das Skript läuft jetzt, Danke schon mal für die Hilfe.
    Welche Parameter und wie, muss ich noch ändern wenn ich nur eine Taste am Schalter habe?

    Liebe Grüße und ein schönes Wochenende,

    Eike

  • Eike
    4. März 2017 at 8:46

    Hoi,
    Das Skript läuft jetzt, Danke schon mal für die Hilfe.
    Welche Parameter und wie, muss ich noch ändern wenn ich nur eine Taste am Schalter habe?

    Liebe Grüße und ein schönes Wochenende,

    Eike

    • Christian
      Christian
      4. März 2017 at 12:32

      Gerne.
      Um die Funktion auf die Taste S1 zu legen kannst du die Szene Activation Codes anpassen: Mache aus den Zwanzigern Zehner, z.B. für „Halten“

      elseif ( tonumber(fibaro:getValue(fibaroID, "sceneActivation")) == 12 ) then

      Allerdings wird die direkt an den Dimmer angeschlossene Lampe ebenfalls reagieren. Die Szene Activation Codes für andere Ereignisse und Geräte findest du hier: http://manuals.fibaro.com/document/fgr-scene-activation/

Leave a Response