Circadian Lighting [Custom Component]

Not sure if this is quite what you want but I have my lights set up for 3 modes:ON, OFF, AUTO (motion controlled) where in AUTO I have Circadian Lighting turned ON, but in ON mode I have CL OFF. This way if I want the kitchen light ON for cooking etc, I’m not trying to do so in low, orange light. This is all done with automations, CL switches and Xiaomi wireless buttons. I have the same for the ensuite light so my girlfriend can do her make-up in decent light for example, but later at night the light would generally be in AUTO mode so it turns ON with motion and is set low and reddish.

As I say, I’m not sure that it is quite what you are chasing but maybe an idea to think about.

1 Like

How do you achieve this?

I use packages. Here is my ensuite light one:

ensuite_light.yaml

# All code relating to the ensuite light

automation:
  - alias: Ensuite Remote Button
    initial_state: 'on'
    trigger:
      - platform: event
        event_type: xiaomi_aqara.click
        event_data:
          entity_id: binary_sensor.switch_158d00016bf679
          click_type: single
      - platform: event
        event_type: xiaomi_aqara.click
        event_data:
          entity_id: binary_sensor.switch_158d00016bf679
          click_type: double
      - platform: event
        event_type: xiaomi_aqara.click
        event_data:
          entity_id: binary_sensor.switch_158d00016bf679
          click_type: long_click_press

    action:
      - service_template: >
          {% if trigger.event.data.click_type == 'single' %}
            script.ensuite_button_single_click
          {% elif trigger.event.data.click_type == 'double' %}
            script.ensuite_button_double_click
          {% elif trigger.event.data.click_type == 'long_click_press' %}
            script.ensuite_button_long_press
          {% endif %}
          


  - alias: Ensuite light auto ON motion
    initial_state: 'on'
    trigger:
      - platform: state
        entity_id: binary_sensor.motion_sensor_158d0001ad43db
        to: 'on'
    condition:
      condition: or
      conditions:
      - condition: sun
        after: sunset
        after_offset: '-00:10:00'
      - condition: sun
        before: sunrise
        before_offset: '-01:00:00'
    action:
      service: light.turn_on
      entity_id: light.ensuite_light


  - alias: Ensuite light OFF after 2mins
    initial_state: 'on'
    trigger:
      - platform: state
        entity_id: binary_sensor.motion_sensor_158d0001ad43db
        to: 'off'
        for:
          minutes: 1
    action:
      - service: homeassistant.turn_off
        entity_id: light.ensuite_light

script:
  ensuite_button_single_click:
    alias: Ensuite button single click
    sequence:
    - service: switch.turn_off
      data:
        entity_id: switch.circadian_lighting_ensuite_circadian_lighting
    - service: light.turn_on
      data:
        entity_id: light.ensuite_light
        brightness: 255
        rgb_color: [255,255,255]
    - service: automation.turn_off
      data:
        entity_id: 
          - automation.ensuite_light_auto_on_motion
          - automation.ensuite_light_off_after_2mins
  
  ensuite_button_double_click:
    alias: Ensuite button double click
    sequence:
    - service: light.turn_off
      data: 
        entity_id: light.ensuite_light
    - service: automation.turn_off
      data:
        entity_id: 
          - automation.ensuite_light_auto_on_motion
          - automation.ensuite_light_off_after_2mins
  
  ensuite_button_long_press:
    alias: Ensuite button long press
    sequence:
    - service: switch.turn_on
      data:
        entity_id: switch.circadian_lighting_ensuite_circadian_lighting
    - service: automation.turn_on
      data:
        entity_id: 
          - automation.ensuite_light_auto_on_motion
          - automation.ensuite_light_off_after_2mins
2 Likes

I just upgraded to version 0.86.4 and now get errors that circadian_lighting cannot load anymore. From the log file:;

2019-01-31 08:03:41 ERROR (MainThread) [homeassistant.loader] Error loading custom_components.switch.circadian_lighting. Make sure all dependencies are installed
Traceback (most recent call last):
  File "/srv/homeassistant/lib/python3.5/site-packages/homeassistant/loader.py", line 117, in _load_file
    module = importlib.import_module(path)
  File "/usr/lib/python3.5/importlib/__init__.py", line 126, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
  File "<frozen importlib._bootstrap>", line 986, in _gcd_import
  File "<frozen importlib._bootstrap>", line 969, in _find_and_load
  File "<frozen importlib._bootstrap>", line 958, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 673, in _load_unlocked
  File "<frozen importlib._bootstrap_external>", line 673, in exec_module
  File "<frozen importlib._bootstrap>", line 222, in _call_with_frames_removed
  File "/home/homeassistant/.homeassistant/custom_components/switch/circadian_lighting.py", line 16, in <module>
    from homeassistant.helpers.restore_state import async_get_last_state
ImportError: cannot import name 'async_get_last_state'
2019-01-31 08:03:41 ERROR (MainThread) [homeassistant.loader] Error loading custom_components.circadian_lighting.switch. Make sure all dependencies are installed
Traceback (most recent call last):
  File "/srv/homeassistant/lib/python3.5/site-packages/homeassistant/loader.py", line 117, in _load_file
    module = importlib.import_module(path)
  File "/usr/lib/python3.5/importlib/__init__.py", line 126, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
  File "<frozen importlib._bootstrap>", line 986, in _gcd_import
  File "<frozen importlib._bootstrap>", line 969, in _find_and_load
  File "<frozen importlib._bootstrap>", line 953, in _find_and_load_unlocked
ImportError: No module named 'custom_components.circadian_lighting.switch'; 'custom_components.circadian_lighting' is not a package
2019-01-31 08:03:41 ERROR (MainThread) [homeassistant.loader] Unable to find platform circadian_lighting

any ideas what is going wrong?

Not sure, it’s working for me.

This line is interesting:
ImportError: No module named 'custom_components.circadian_lighting.switch'; 'custom_components.circadian_lighting' is not a package

Do you have the latest version from GitHub? If so, I would try reorganizing the files as described here: Circadian Lighting [Custom Component]

I am not sure which version I have. The date stamp is from Dec 6.What is the latest version?

Setting the file up as tepprr proposes does not change the issue. It did work for 0.85 and before so maybe I should report an issues at home assistant.

For some reason the component ignores the transition time. It seems to fire non stop and changes the lights instantly. I’m not entirely sure why this happens. I’ve added the transition time to the configuration file after not including it and altered the value, but this seems to make no difference. I’m using Philips Hue lights with the 2nd generation Hue Hub.

The way I found out is trying to change the lights manually but they only budge for like half a second, before it’s back to the circadian setting. I see absolutely no errors at all. When I focus on the lights when they’re scheduled to change, I notice they too change instantly.

What could cause this behavior?

Edit: Setting the interval and transition doesn’t change anything. I’m currently on 300/30 but tried several options.

That should be latest (I really need to implement some sort of versioning).

Is the sensor.circadian_values entity initialized? Are you sure that’s everything in the logs relating to CL?

It shouldn’t be firing non-stop, you can verify by turning on debug logging:

logger:
  logs:
    custom_components.circadian_lighting: debug
    custom_components.sensor.circadian_lighting: debug
    custom_components.switch.circadian_lighting: debug

It will however respond immediately if a light is adjusted because it listens for lights to turn on so they can be immediately set to the correct values. In this case it also ignores the transition time.

That being said, I do think something isn’t working properly. I also have almost exclusively Hue lights and the second generation bridge - I recently installed a Hue fixture in the kitchen where a lot of time is spent throughout the day on weekends, and I noticed that transitions in color temperature were quite noticeable when they should be gradual and imperceptible with the default transition and interval settings. I plan on troubleshooting when I have the time.

1 Like

I should probably add that I’m also using a custom component to include Hue Motion Sensor data and Hue Tap buttons. Hue motion sensors + remotes: custom component.

I’m using that too :+1:

My issue with 00.86.4 is solved. Now all the modules are loading again!

So what did I do to get this solved? I redid the upgrade of HA but that did not work, however there was a warning that pip needed to be upgraded to 19.0.1 so I did that and upgarded HA again. Restarted HA and now it is fine! I have no clue why this happened, maybe an bug in the old 18.0 pip?

Thank you!

It gave me an idea how make a better implementation for my case.
What I ended up doing, using 2 automations:

  • I kept the 2 switches, a “high brightness” and a “low brightness” switch for the same group of bulbs.
  • I switch off the “high brightness” switch at the (re)start of HA.
  • And finally I toggle both switches (switch.toggle) when a movement (binary sensor switches to the “on” state) is detected, and toggle both switches again when the binary sensor switches to the “off” state.

Actually quite simple, works like a charm with interval = 300 and transition = 10.

Hi I have various light bulb, if I understand correctly
each has to be assigned differently in circadian component?

Hue colour bulb
Hue white ambience
Hue standard white
Dresden led strip (5 pins controls white separately from RGB)
Yeelight colours

All Zigbee lights controlled by Conbee (not Hue bridge)

Great component! Thanks!

I wanted to have brightness and color temp change throughout the whole day, so I made the following edits. If anyone wants this here are the changes.

circadian_lighting.py: line 267
def calc_colortemp(self):
return ((self.data[‘max_colortemp’] - self.data[‘min_colortemp’]) * (( self.data[‘percent’] + 100) / 200)) + self.data[‘min_colortemp’]

in the switch component: starting on line 234 modify calc_brightness as below.

def calc_brightness(self):
    if self._attributes['disable_brightness_adjust'] is True:
        return None
    else:
        if self.is_sleep():
            _LOGGER.debug(self._name + " in Sleep mode")
            return self._attributes['sleep_brightness']
        else:
            return ((self._attributes['max_brightness'] - self._attributes['min_brightness']) * ((100+self._cl.data['percent']) / 200)) + self._attributes['min_brightness']

Hi Klagio,

There are basically 4 options:

  • lights_ct
  • lights_rgb
  • lights_xy
  • lights-brightness

The first 3 are for lights that can change the color or the white-balance.
The last one is for lights that can only change the brightness.

You will need to find out yourself which lines to use.

I have Yeelight colorbulbs 2 and Ikea Tradfri lights that can change the whitebalance. For me they work when put under light_ct.

You can look at the attributes for each light in the HA Developer Tools: click on <> and find your lights.
If it shows min_mired and max_mired, then you can use lights_ct, I think.

1 Like

I’m trying to configure a template switch called ‘Auto brightness on/off’. When I turn it on, I would like the lights that are currently on to automagically tune to the circadian brightness and color. But they don’t, I think because they are not changing state so the Circadian Light component does not trigger.

I saw a mention about a service ‘circadian_lighting.values_update’ that would seem appropriate, but what is the correct syntax for triggering that? Right now, it doesn’t seem to have any effect.

  - platform: template
    switches:
      auto_brightness:
        friendly_name: 'Auto brightness'
        value_template: "{{ is_state('switch.circadian_lighting_colors_and_brightness', 'on') }}"
        turn_on:
          - service: switch.turn_off
            entity_id: switch.circadian_lighting_just_colors
          - service: switch.turn_on
            entity_id: switch.circadian_lighting_colors_and_brightness
          - service: circadian_lighting.values_update
            entity_id: sensor.circadian_lighting_colors_and_brightness
        turn_off:
          - service: switch.turn_off
            entity_id: switch.circadian_lighting_colors_and_brightness
          - service: switch.turn_on
            entity_id: switch.circadian_lighting_just_colors
          - service: circadian_lighting.values_update
            entity_id: sensor.circadian_lighting_just_colors

The service gets called like any other service and doesn’t take any data, so just service: circadian_lighting.values_update without the entity_id should work in regards to that?

Ultimately it looks like you’re trying to have sometimes the color and brightness adjust and other times just color, is that correct?

That is correct. Thanks for your info, I will try.

Hi, does it matter which of this 3 option I choose?