Ankündigung

Einklappen
Keine Ankündigung bisher.

HCL / Circadian Lighting Support für Zigbee-Leuchten

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

    [Codebeispiel] HCL / Circadian Lighting Support für Zigbee-Leuchten

    Hallo zusammen,

    ich habe die letzten Wochen damit verbracht, meine Beleuchtung von Deconz und dem HUE-Plugin auf Zigbee2Mqtt umzustellen.

    Da ich in einigen Räumen eine HCL Steuerung mit den MDT Aktoren und den Voltus Spots habe, wollte ich das natürlich auch für meine Zigbee Leuchten haben.
    Die Lösung funktioniert mit ein paar Einschränkungen sehr gut, daher möchte ich sie hier mit euch teilen.

    Hinweis:
    Für Smartvisu und SmarthomeNG habe ich zwei Pull Requests eingereicht, welche notwendig sind, damit die Lösung wie hier beschrieben funktioniert, ggf. muss auf die nächsten Releases gewartet werden. Dies betrifft den DPT 5003 Typ (für RGB Farbe) für das KNX Plugin und die Möglichkeit einen CSS Style an den Smartvisu Slider zu übergeben.


    Was kann die Lösung:
    - HCL / Circaridan Lighting für Zigbee Leuchten
    - Relatives DTP3 Dimming für Zigbee Leuchten (für Helligkeit, Farbtemperatur und Sättigung)
    - Erstellung von Visualisierungsobjekten für CCT- und RGB-Leuchten
    - Alexa Integration

    Visualisierungsobjekte:



    Zunächst werden zwei Zeitschaltuhren erstellt, die zur zeit- oder sonnenstandsabhängigen Steuerung von Farbtemperatur und Helligkeit verwendet werden:

    Code:
    settings:
        name: "Einstellungen"
        sv_page: category
        sv_img: edit_settings.svg
        lighting:
            hcl:
                name: "HCL"
                sv_blocksize: 3
                color_temperature:
                    name: "Farbtemperatur"
                    sv_widget: "{{ device.uzsuicon('uzsu3', 'settings.lighting.hcl.color_temperature.uzsu', 'Farbtemperatur', '', '', 'num', [0, 100, 1]) }}{{ device.uzsugraph('', 'settings.lighting.hcl.color_temperature.uzsu', '', 1, 'num', [0,100,1]) }}"
                    type: num
                    struct: uzsu.child
    
                brightness:
                    name: "Helligkeit"
                    sv_widget: "{{ device.uzsuicon('uzsu3', 'settings.lighting.hcl.brightness.uzsu', 'Helligkeit', '', '', 'num', [0, 100, 1]) }}{{ device.uzsugraph('', 'settings.lighting.hcl.brightness.uzsu', '', 1, 'num', [0,100,1]) }}"
    
                    type: num
                    struct: uzsu.child​



    Farbtemperatur USZU-Werte:
    Code:
    {'interpolation': {'type': 'cubic', 'initialized': False, 'interval': '1', 'initage': '0', 'itemtype': 'num'}, 'list': [{'active': True, 'value': '0', 'rrule': 'FREQ=WEEKLY;BYDAY=MO,TU,WE,TH,FR,SA,SU', 'time': '00:00'}, {'active': True, 'value': '0', 'rrule': 'FREQ=WEEKLY;BYDAY=MO,TU,WE,TH,FR,SA,SU', 'calculated': '07:11', 'time': 'sunrise'}, {'active': True, 'value': '100', 'rrule': 'FREQ=WEEKLY;BYDAY=MO,TU,WE,TH,FR,SA,SU', 'calculated': '11:55', 'time': 'sunrise+90'}, {'active': True, 'rrule': 'FREQ=WEEKLY;BYDAY=MO,TU,WE,TH,FR,SA,SU', 'value': '0', 'calculated': '16:41', 'time': 'sunset'}, {'active': True, 'rrule': 'FREQ=WEEKLY;BYDAY=MO,TU,WE,TH,FR,SA,SU', 'value': '0', 'time': '23:59'}], 'active': True, 'sunrise': '07:11', 'sunset': '16:41', 'SunCalculated': {'sunrise': {'TH': '07:09', 'FR': '07:11', 'SA': '07:12', 'SU': '07:14', 'MO': '07:16', 'TU': '07:18', 'WE': '07:20'}, 'sunset': {'TH': '16:43', 'FR': '16:41', 'SA': '16:39', 'SU': '16:37', 'MO': '16:36', 'TU': '16:34', 'WE': '16:32'}}, 'plugin_version': '1.6.5'}
    Helligkeit USZU-Werte:
    Code:
    {'interpolation': {'type': 'cubic', 'initialized': False, 'interval': '1', 'initage': '0', 'itemtype': 'num'}, 'list': [{'active': True, 'rrule': 'FREQ=WEEKLY;BYDAY=MO,TU,WE,TH,FR,SA,SU', 'value': '30', 'time': '00:00'}, {'active': True, 'rrule': 'FREQ=WEEKLY;BYDAY=MO,TU,WE,TH,FR,SA,SU', 'value': '30', 'time': '06:00'}, {'active': True, 'rrule': 'FREQ=WEEKLY;BYDAY=MO,TU,WE,TH,FR,SA,SU', 'value': '54', 'time': '07:30'}, {'active': True, 'rrule': 'FREQ=WEEKLY;BYDAY=MO,TU,WE,TH,FR,SA,SU', 'value': '100', 'time': '09:00'}, {'active': True, 'rrule': 'FREQ=WEEKLY;BYDAY=MO,TU,WE,TH,FR,SA,SU', 'value': '100', 'time': '18:00'}, {'active': True, 'rrule': 'FREQ=WEEKLY;BYDAY=MO,TU,WE,TH,FR,SA,SU', 'value': '80', 'time': '20:00'}, {'active': True, 'rrule': 'FREQ=WEEKLY;BYDAY=MO,TU,WE,TH,FR,SA,SU', 'value': '60', 'time': '21:00'}, {'active': True, 'rrule': 'FREQ=WEEKLY;BYDAY=MO,TU,WE,TH,FR,SA,SU', 'value': '50', 'time': '22:00'}, {'active': True, 'rrule': 'FREQ=WEEKLY;BYDAY=MO,TU,WE,TH,FR,SA,SU', 'value': '40', 'time': '23:00'}, {'active': True, 'rrule': 'FREQ=WEEKLY;BYDAY=MO,TU,WE,TH,FR,SA,SU', 'value': '30', 'time': '23:59'}], 'active': True, 'sunrise': '07:09', 'sunset': '16:43', 'SunCalculated': {'sunrise': {'TH': '07:09', 'FR': '07:11', 'SA': '07:12', 'SU': '07:14', 'MO': '07:16', 'TU': '07:18', 'WE': '07:20'}, 'sunset': {'TH': '16:43', 'FR': '16:41', 'SA': '16:39', 'SU': '16:37', 'MO': '16:36', 'TU': '16:34', 'WE': '16:32'}}, 'plugin_version': '1.6.5'}


    Weiterhin benötigt ihr einige neue Struktur Templates:

    zigbee_cct_light: Erzeugt eine Item Stuktur für Tunable White Leuchten
    zigbee_rgb_light: Erzeugt eine Item Stuktur für RGB white Leuchten

    Code:
    hcl_lighting:
        hcl_lighting:
            enabled:
                name: "Licht über HCL steuern"
                type: bool
                cache: true
                initial_value: true
            color_temperature:
                enabled:
                    name: "Farbetemperatur über HCL steuern"
                    type: bool
                    cache: true
                    initial_value: true
                minimal_value:
                    type: num
                    cache: true
                    initial_value: "2200"
                maximal_value:
                    type: num
                    cache: true
                    initial_value: "6500"
                
    
            brightness:
                enabled:
                    name: "Helligkeit über HCL steuern"
                    type: bool
                    cache: true
                    initial_value: true
                minimal_value:
                    type: num
                    cache: true
                    initial_value: "0"
                maximal_value:
                    type: num
                    cache: true
                    initial_value: "254"
                    
                    
    zigbee_cct_light:
        name: "CCT Light"
        alexa_name: "CCT Light"
        alexa_device: "CCT Light"
        alexa_description: "An Zigbee CCT Light"
        alexa_icon: LIGHT
        alexa_proactivelyReported: 'True'
        struct: hcl_lighting
        sv_widget: "{{ 'item.name' }}<br>
                    <table width='100%'>
                            <tr>
                                <td align=left width='50px'>{{ basic.stateswitch('', 'item.onoff', 'icon', '', 'light_light.svg') }}</td>
                                <td align=left>{{ basic.slider('', 'item.level', 0, 100, 1,  '', 'none', '', '', 1,) }}</td>
                            </tr>
                            <tr>
                                <td align=left></td>
                                <td align=left>{{ basic.slider('', 'item.color_temperature.normalized','0', '255', 1, '', 'none', '', '', 1, 'linear-gradient(90deg, rgb(255, 177, 111), rgb(229, 234, 255))') }}</td>
                            </tr>
                            </table>
                "
        transition_time:
            type: num
            cache: true
            initial_value: 0.5
        mqtt_get:
            type: dict
            mqtt_topic_in: 'dummy'
            on_change:
                - ..onoff = value['state']
                - ..level = 0 if value['brightness'] == 1 and value['state'] == 'OFF' else math.ceil((value['brightness'] / 254 ) * 100) if isinstance(value['brightness'], int) else None # brightness is 1 when off, so we nomalize to off == 0. (Fix for MDT Glastaster dimm icon)
                - ..color_temperature = 1000000.0/value['color_temp']
        mqtt_set:
            type: dict
            mqtt_topic_out: 'dummy/set'
            enforce_updates: 'true'
        onoff:
            type: bool
            knx_dpt: 1
            alexa_device: ..:.
            alexa_actions: TurnOn TurnOff
            on_change: "..mqtt_set =  {'transition': sh...transition_time(), 'state': 'ON' if value else 'OFF'} if not sh..property.last_update_by.endswith('mqtt_get') and not sh...hcl_lighting.enabled() else None"                        
            cache: true
        level:
            type: num
            knx_dpt: 5001
            on_change: "..mqtt_set =  {'brightness': int(value/100.0*254), 'transition': sh...transition_time()} if not sh..property.last_update_by.endswith('mqtt_get') else None"  
            alexa_device: ..:.
            alexa_actions: "AdjustBrightness SetBrightness"
            alexa_item_range: 0-100
            cache: true
        level_inc:
            type: num
            on_change: "..mqtt_set = {'state': 'ON', 'brightness_move': int(value)}"    
            enforce_updates: 'true'
            speed:
                type: num
                cache: true
                initial_value: 40
            dimdpt:
                type: list
                knx_dpt: 3
                enforce_updates: 'true'
                on_change: "..self = 0 if value[1] == 0 else sh...speed() if value[0] == 1 else -sh...speed()"    
                
        color_temperature:
            type: num
            on_change: "..mqtt_set =  {'color_mode': 'color_temp', 'color_temp': 1000000.0/value, 'transition': sh...transition_time()} if not sh..property.last_update_by.endswith('mqtt_get') else None"
            cache: true
            min:
                name: "minimal value for color temperature"
                type: num
                cache: true
                initial_value: 2000
            max:
                name: "maximum value for color temperature"
                type: num
                cache: true
                initial_value: 6500
            normalized:
                type: num
                alexa_device: ...:.
                alexa_item_range: 2000 - 6500
                alexa_actions: SetColorTemperature IncreaseColorTemperature DecreaseColorTemperature
                on_change: "..self = sh...min() + value/255.0 * (sh...max() -sh...min())"
    
        color_temperature_inc:
            type: num
            on_change: "..mqtt_set = {'color_temp_move': value}  if not sh..property.last_update_by.endswith('mqtt_get') else None"    
            enforce_updates: 'true'
            speed:
                type: num
                cache: true
                initial_value: 40
            dimdpt:
                type: list
                knx_dpt: 3
                enforce_updates: 'true'
                on_change: "..self = 0 if value[1] == 0 else sh...speed() if value[0] == 1 else -sh...speed()"
                
    zigbee_rgb_light:
        mqtt_get:
            type: dict
            mqtt_topic_in: 'dummy'
            on_change:
                - ..onoff = value['state']
                - ..level = int((value['brightness'] / 254 ) * 100)
                - ..color_temperature = 1000000.0/value['color_temp']
                - ..hue = value['color']['hue']
                - ..saturation = value['color']['saturation']
                
        sv_widget:
        #{{ 'item.name' }}
                "     <table width='100%'>
                            <tr>
                                <td align=left valign=middle width='50px'>
                                {{ basic.stateswitch('', 'item.onoff', 'icon', '', 'light_light.svg') }}
                                <br>
                                <br>
                                <br>
                                {{ basic.color('', 'item.hue', 'item.saturation', 'item.level', '', '', '', '', 'rect', 'hsv') }}
                                </td>
                                <td align=center>
                                Color:
                                {{ basic.slider('', 'item.hue','0', '360', 1, '', 'none', '', '', 1, 'linear-gradient(90deg, hsl(0,100%,50%), hsl(60,100%,50%), hsl(120,100%,50%), hsl(180,100%,50%), hsl(240,100%,50%), hsl(300,100%,50%), hsl(360,100%,50%))') }}
                                {{ basic.slider('', 'item.saturation','0', '100', 1, '', 'none', '', '', 1, 'linear-gradient(90deg, hsl(0,0%,50%), hsl(0,100%,50%))') }}
                                {{ basic.slider('', 'item.level','0', '100', 1, '', 'none', '', '', 1, 'linear-gradient(90deg, rgb(0,0,0), rgb(255,255,255))') }}
                                Color Temperature:
                                {{ basic.slider('', 'item.color_temperature.normalized','0', '255', 1, '', 'none', '', '', 1, 'linear-gradient(90deg, rgb(255, 177, 111), rgb(229, 234, 255))') }}
                                </td>
                            </tr>
        
                            </table>
                "
        struct: zigbee_cct_light
        
        hue:
            type: num
            knx_dpt: 5003
            cache: true
            on_change: "..mqtt_set = {'color_mode': 'hs', 'color': {'hue': value, 'saturation': sh...saturation()}} if not sh..property.last_update_by.endswith('mqtt_get') else None"
        
        hue_inc:
            type: num
            on_change: "..mqtt_set = {'color_mode': 'hs', 'hue_move': value}  if not sh..property.last_update_by.endswith('mqtt_get') else None"    
            enforce_updates: 'true'
            speed:
                type: num
                cache: true
                initial_value: 20
            dimdpt:
                type: list
                knx_dpt: 3
                enforce_updates: 'true'
                on_change: "..self = 0 if value[1] == 0 else sh...speed() if value[0] == 1 else -sh...speed()"
            
        saturation:
            type: num
            knx_dpt: 5001
            cache: true
            on_change: "..mqtt_set = {'color_mode': 'hs', 'color': {'hue': sh...hue(), 'saturation': value}} if not sh..property.last_update_by.endswith('mqtt_get') else None"    
        
        saturation_inc:
            type: num
            on_change: "..mqtt_set = {'color_mode': 'hs', 'saturation_move': value}  if not sh..property.last_update_by.endswith('mqtt_get') else None"    
            enforce_updates: 'true'
            speed:
                type: num
                cache: true
                initial_value: 40
            dimdpt:
                type: list
                knx_dpt: 3
                enforce_updates: 'true'
                on_change: "..self = 0 if value[1] == 0 else sh...speed() if value[0] == 1 else -sh...speed()"
            
    
            
            
        ​

    Die Struktur muss dann noch um die entsprechenden KNX Gruppenadressen und MQTT Topics ergänzt werden:
    Code:
    fassade_sued_zigbee:
        struct: zigbee_rgb_light
        alexa_name: "Licht Terrasse"
        alexa_device: "light_outdoor_south"
        name: "Licht Terrasse"
        mqtt_get:
            mqtt_topic_in: 'zigbee2mqtt/light/outdoor/south/wall1'
        mqtt_set:
            mqtt_topic_out: 'zigbee2mqtt/light/outdoor/south/group/set'
        onoff:
            knx_status: 1/3/5
            knx_listen: 1/3/6
        level:
            knx_status: 1/3/13
            knx_listen: 1/3/2
        level_inc:
            dimdpt:
                knx_listen: 1/3/16
        hue:
            knx_status: 1/3/20
        hue_inc:
            dimdpt:
                knx_listen: 1/3/21
        saturation:
            knx_status: 1/3/19
        saturation_inc:
            dimdpt:
                knx_listen: 1/3/18​

    Wenn ihr hcl_lighting.enabled auf false setzt, sollte die Leuchte nun schon funktionieren (alles außer HCL)


    Damit HCL funktioniert, braucht ihr noch eine Logik.

    Code:
    #!/usr/bin/env python3
    # licht_flur_hcl.py
    
    import threading
    import time
    
    
    def get_color_temperature(item):
        min_ct = items.return_item(item + "hcl_lighting.color_temperature.minimal_value")()
        max_ct = items.return_item(item + "hcl_lighting.color_temperature.maximal_value")()
        offset_ct = max_ct - min_ct
        color = min_ct + (sh.settings.lighting.hcl.color_temperature() / 100.0 * offset_ct)
        mired = float(1000000 / color)
        return mired
    
    def get_brightness(item):
        min_br = items.return_item(item + "hcl_lighting.brightness.minimal_value")()
        max_br = items.return_item(item + "hcl_lighting.brightness.maximal_value")()
        offset_br = max_br - min_br
        brightness = min_br + (sh.settings.lighting.hcl.brightness() / 100.0 * offset_br)
        return int(brightness)
    
    def update_item(item, lock):
        hcl_enabled = items.return_item(item + "hcl_lighting.enabled")()
        if not hcl_enabled:
            return
        with logic.lock:    
            on = items.return_item(item + "onoff")()
            if on:
                value = {"state": 'ON', "transition": 0.1}
                color_enabled = items.return_item(item + "hcl_lighting.color_temperature.enabled")()
                brightness_enabled = items.return_item(item + "hcl_lighting.brightness.enabled")()
                
                if color_enabled:
                    value["color_temp"] = get_color_temperature(item)
                
                if brightness_enabled:
                    value["brightness"] = get_brightness(item)
    
                if color_enabled or brightness_enabled:
                    items.return_item(item + "mqtt_set")(value)
                    
                        
    def turn_on_off_item(item, lock):
        on = copy.copy(trigger['value'])
        is_ikea = True
        hcl_enabled = items.return_item(item + "hcl_lighting.enabled")()
        if not hcl_enabled:
            return
        with logic.lock:
            transition_time = items.return_item(item + "transition_time")()
            value = {"transition": transition_time}
            if on:
                value["state"] = 'ON'
                color_enabled = items.return_item(item + "hcl_lighting.color_temperature.enabled")()
                brightness_enabled = items.return_item(item + "hcl_lighting.brightness.enabled")()
                
                if is_ikea:
                    if brightness_enabled:
                        value["brightness"] = get_brightness(item)
                        items.return_item(item + "mqtt_set")(value)
                        if color_enabled:
                            del value["brightness"]
                            time.sleep(0.1)
                    if color_enabled:
                        value["color_temp"] = get_color_temperature(item)
                        items.return_item(item + "mqtt_set")(value)
                else:
                    if color_enabled:
                        value["color_temp"] = get_color_temperature(item)
                        
                    if brightness_enabled:
                        value["brightness"] = get_brightness(item)
                        
                    items.return_item(item + "mqtt_set")(value)
                    
            else:
                value["state"] = 'OFF'
                items.return_item(item + "mqtt_set")(value)
    
    
    def threaded_update(items_to_update, lock):
        for item in items_to_update:
            update_item(item, lock)
            time.sleep(0.1)
    
    if not hasattr(logic, 'items_to_update'):
        logic.items_to_update = set()
    
    if not hasattr(logic, 'lock'):
        logic.lock = threading.Lock()
    
    if trigger['by'] == "Item":
        details = str(trigger['source_details'])
        src_str = str(trigger['source'])
        if src_str.endswith("hcl_lighting.enabled"):
            item = str(trigger['source'])[:-len("hcl_lighting.enabled")]
        else:
            item = str(trigger['source'])[:-5]
        logic.items_to_update.add(item)
        ## check trigger to prevent circular changes
        if details != ("On_Change:" + item + "mqtt_get"):
            turn_on_off_item(item, logic.lock)
    
    else:
        thread = threading.Thread(target=threaded_update, args=(logic.items_to_update, logic.lock))
        thread.name = 'HCL Thread'
        thread.start()
    ​
    Die Logik sollte zyklisch ausgelöst werden (z.B. alle 60 Sekunden).
    Zusätzlich muss die Logik von allen onoff und hcl_lighting.enabled Items getriggert werden.
    (Die Logik erkennt die Triggerquelle automatisch).


    Die Farbtemperatur des Lichts wird dann nicht nur beim Ein- und Ausschalten angepasst, sondern kontinuierlich nachgeregelt.
    Eventuell muss in der Logik noch der Pfad zu den zu verwendenden uzsu Items angepasst werden.

    Die Logik enthält einige Anpassungen für Ikea Tradfri Leuchten, da diese keine gleichzeitige Einstellung von Farbtemperatur und Helligkeit unterstützen.
    Eine weitere Einschränkung ist, dass Zigbee Lampen immer mit der zuletzt eingestellten Farbtemperatur eingeschaltet werden. Eine Änderung der Farbtemperatur im ausgeschalteten Zustand ist im ZigBee Standard nicht vorgesehen. Das Licht schaltet also immer mit der zuletzt verwendeten Farbe ein und faded dann auf die Zielfarbe und Helligkeit.

    Damit die Änderung der Farbtemperatur korrekt funktioniert, müssen noch die entsprechenden Maximalwerte für warmweiss und kaltweiss angegeben werden:
    Und zwar unter:
    .hcl_lighting.color_temperature.minimal_value / maximal_value
    als auch unter:
    .color_temperature.min / max

    Der Wert unter hcl_lighting kann von den letzteren abweichen, um z.B. den HCL-Bereich einzuschränken.

    Leider habe ich keine (einfache) Möglichkeit gefunden, diese Werte unter Zigbee2Mqtt automatisch auszulesen.
    Ich habe aber eine Logik gebastelt, die die Werte einmal automatisch füllen kann, dazu werden alle Lichter einmal durchlaufen und die Maximal- und Minimalwerte gesetzt und die entsprechenden Werte befüllt. Dabei gehen alle Lichter im Haus nacheinander an und aus, also Vorsicht!​

    Code:
    #!/usr/bin/env python3
    # color_temperature_updater.py
    
    for item in items.match_items('*hcl_lighting'):     # selects all items ending with 'hcl_lighting'
        light_item_name = item.id()[:-len("hcl_lighting'")]
        light_mqtt = items.return_item(light_item_name + ".mqtt_set")
        light_temp = items.return_item(light_item_name + ".color_temperature")
        light_temp_min = items.return_item(light_item_name + ".color_temperature.min")
        light_temp_max = items.return_item(light_item_name + ".color_temperature.max")
        hcl_min = items.return_item(light_item_name + ".hcl_lighting.color_temperature.minimal_value")
        hcl_max = items.return_item(light_item_name + ".hcl_lighting.color_temperature.maximal_value")
        
        logger.error("Updating light: \"" + light_item_name + "\"")
    
        value = {"state": 'ON', "transition": 0, "brightness": 254}
        light_mqtt(value)
        # set brighness 100%
        time.sleep(1)
        value = {"state": 'ON', "transition": 0, "color_temp": "warmest"}
        light_mqtt(value)
        time.sleep(1)
        warm = light_temp()
        light_temp_min(warm)
        hcl_min(warm)
        logger.error(warm)
        value = {"state": 'ON', "transition": 0, "color_temp": "coolest"}
        light_mqtt(value)
        time.sleep(1)
        cool = light_temp()
        logger.error(cool)
        light_temp_max(cool)
        hcl_max(cool)
        time.sleep(0.1)
        value = {"state": 'OFF', "transition": 0.1, "color_temp": "warmest"}
        light_mqtt(value)
      ​

    HCL kann natürlich auch in Szenen verwendet werden, z.B. so:
    Code:
    0:
        name: Warm Dunkel
        actions:
            - {item: world.haus.arbeit.licht.decke.hcl_lighting.enabled, value: false, learn: false}
            - {item: world.haus.arbeit.licht.decke.mqtt_set, value: {state: 'ON', transition: 0.5, brightness: 50, color_temp: "warmest"}, learn: false}
            
    1:
        name: Warm Hell
        actions:
            - {item: world.haus.arbeit.licht.decke.hcl_lighting.enabled, value: false, learn: false}
            - {item: world.haus.arbeit.licht.decke.mqtt_set, value: {state: 'ON', transition: 0.5, brightness: 254, color_temp: "warmest"}, learn: false}
            
    2:
        name: Neutral Hell
        actions:
            - {item: world.haus.arbeit.licht.decke.hcl_lighting.enabled, value: false, learn: false}
            - {item: world.haus.arbeit.licht.decke.mqtt_set, value: {state: 'ON', transition: 0.5, brightness: 254, color_temp: "neutral"}, learn: false}
            
    3:
        name: Kalt Hell
        actions:
            - {item: world.haus.arbeit.licht.decke.hcl_lighting.enabled, value: false, learn: false}
            - {item: world.haus.arbeit.licht.decke.mqtt_set, value: {state: 'ON', transition: 0.5, brightness: 254, color_temp: "coolest"}, learn: false}
    
    4:
        name: HCL
        actions:
            - {item: world.haus.arbeit.licht.decke.hcl_lighting.enabled, value: true, learn: false}​


    Alles aktuell noch im Testing, Nutzung daher auf eigene Gefahr

    Zuletzt geändert von jscholle; 02.11.2023, 22:59.
Lädt...
X