Eaton HALO Home Integration

My first post and I apologize if this is in here somewhere, but I’ve searched and could not find anything related to the Eaton HALO Home lighting system. I have several of these devices in my home. They are Bluetooth connected, but also have a WiFi bridge that allows integration to their cloud service including integration with Amazon and Google assistants.

I was wondering if anyone has integrated these devices into Home Assistant or if the HALO eco system is too closed to do so.

Thanks in advance for any info.

-Bill

1 Like

Hey Bill
I was scouring the internet for a solution here as well, and it occurred to me the other day that there is a path to success here. I noticed in my bluetooth settings the term “Avi-on”, and discovered that this is a company that white labels their lighting control systems (to EATON/HALO).

Avi-on actually has an integration with Homeassistant through bluetooth, but I wasn’t able to get this to work in my setup, I’d prefer a wifi route with the bridge.

They have some decent docs here: Public API

At a high level, you’ll run some curl commands on your machine to get the variables you need from the Avi-on API. You’ll:

  1. Login
  2. Get your location
  3. Get the devices at that location
  4. Use pids to setup your configuration.yaml

I’ve gotten this going with the following configuration:

light:
  - platform: group
    name: Living Room Lights
    entities:
      - light.living_room_front_left
      - light.living_room_front_right
      - light.living_room_back_left
      - light.living_room_back_right
  - platform: template
    lights:
      living_room_front_right:
        friendly_name: "Living Room - Front Right"
        turn_on:
          service: rest_command.turn_on
          data_template:
            pid: <PID>
        turn_off:
          service: rest_command.turn_off
          data_template:
            pid: <PID>
rest_command:
  turn_off:
    url: "https://api.avi-on.com/devices/{{ pid }}/state"
    method: POST
    headers:
      authorization: "Token <token>"
      accept: "application/json"
    payload: '{"state": {"name": "on_off", "value": "[0]"}}'
    content_type:  'application/json; charset=utf-8'
    verify_ssl: true
  turn_on:
    url: "https://api.avi-on.com/devices/{{ pid }}/state"
    method: POST
    headers:
      authorization: "Token <token>"
      accept: "application/json"
    payload: '{"state": {"name": "on_off", "value": "[1]"}}'
    content_type:  'application/json; charset=utf-8'
    verify_ssl: true
  daylight:
    url: "https://api.avi-on.com/devices/{{ pid }}/state"
    method: POST
    headers:
      authorization: "Token <token>"
      accept: "application/json"
    payload: '{"state": {"name": "white", "value": "[15,10,0]"}}'
    content_type:  'application/json; charset=utf-8'
    verify_ssl: true
  warm:
    url: "https://api.avi-on.com/devices/{{ pid }}/state"
    method: POST
    headers:
      authorization: "Token <token>"
      accept: "application/json"
    payload: '{"state": {"name": "white", "value": "[0,0,0]"}}'
    content_type:  'application/json; charset=utf-8'
    verify_ssl: true

To obtain a token:

curl -X POST -H "Content-Type: application/json" \
    -d '{"email": "your_email", "password": "your_password"}' \
    https://api.avi-on.com/sessions | jq

To get your PIDS:

curl -X GET -H "Content-Type: application/json" \
    -H "Authorization: Token <token>" \
    https://api.avi-on.com/locations/<location>/abstract_devices\?page\=1\&pagesize\=10  | jq

To get your location:

curl -X GET -H "Content-Type: application/json" \
    -H "Authorization: Token <token>" \
    https://api.avi-on.com/user/locations | jq

I still have some work to do to get the state of the lights, but I hope this helps!

Thanks. I will give this a try and get back to you here.

I’m wondering if you were able to get this working? I don’t think I have the model of light that I can connect to directly, but through the Halo app I can connect to the switches that control them and use that to set timers and all. The app connects to the switch via bluetooth so theoretically I should just be able to connect home assistant on my raspberry pi to all my switches if my pi’s bluetooth receiver is functional right?

It looks like there’s some recent action on this. Create new HALO Home integration by nayaverdier · Pull Request #58316 · home-assistant/core · GitHub hopefully we see this move forward. I really wish Halo had Zigbee lights but if there can at least be integration its better than nothing… or wifi. The Halo Can-less lights are the best option I can find for my home and I don’t want to be stuck controlling with some 3rd party app.

Eaton Halo does make some Zigbee lights. I have 28 or so of the RL56.
Pretty sure they were poor sellers and now we’re seeing them move to Bluetooth or WiFi.

1 Like

That makes sense, Zigbee has been so poorly adopted in the consumer space that it’s a hard sell for manufacturers I’d imagine

1 Like

I created a custom component, still a WIP, but its here if anyone is interested:

Jonathan,

I am very interested in trying this out and contributing if I can. I am not a Python or Java Script programmer so I have no idea how to integrate this to HA. Can you help me install this or point me to some instructions that might help me to get this working on my HA installation?

Thanks in advance…looking forward to maybe getting Halo integrated.

-Bill

Bill,

I’ve added a README here

Let me know how it goes!

Jonathan

Hey Johnathon. I did all the steps. I am just not sure how i use it now?

It should show up in your entities list, try searching for “Halo”… If not, you can share your log output and perhaps I can help

1 Like

I added my login to my config file and copied the files to the custom components folder. Am i missing anything?

Logger: homeassistant.components.websocket_api.http.connection
Source: util/async_.py:154
Integration: Home Assistant WebSocket API (documentation, issues)
First occurred: March 8, 2022, 8:35:57 PM (10 occurrences)
Last logged: 8:49:41 AM

[548044303184] Blocking calls must be done in the executor or a separate thread; Use `await hass.async_add_executor_job()` at custom_components/home-assistant-halo-main/halo.py, line 253: r = requests.post(self.API_GROUP_STATE.format(pid=pid),
[548031690064] Blocking calls must be done in the executor or a separate thread; Use `await hass.async_add_executor_job()` at custom_components/home-assistant-halo-main/halo.py, line 253: r = requests.post(self.API_GROUP_STATE.format(pid=pid),
[548044609088] Blocking calls must be done in the executor or a separate thread; Use `await hass.async_add_executor_job()` at custom_components/home-assistant-halo-main/halo.py, line 253: r = requests.post(self.API_GROUP_STATE.format(pid=pid),
[548020016416] Blocking calls must be done in the executor or a separate thread; Use `await hass.async_add_executor_job()` at custom_components/home-assistant-halo-main/halo.py, line 253: r = requests.post(self.API_GROUP_STATE.format(pid=pid),
[547985222720] Blocking calls must be done in the executor or a separate thread; Use `await hass.async_add_executor_job()` at custom_components/home-assistant-halo-main/halo.py, line 253: r = requests.post(self.API_GROUP_STATE.format(pid=pid),
Traceback (most recent call last):
  File "/usr/src/homeassistant/homeassistant/components/websocket_api/commands.py", line 190, in handle_call_service
    await hass.services.async_call(
  File "/usr/src/homeassistant/homeassistant/core.py", line 1630, in async_call
    task.result()
  File "/usr/src/homeassistant/homeassistant/core.py", line 1667, in _execute_service
    await cast(Callable[[ServiceCall], Awaitable[None]], handler.job.target)(
  File "/usr/src/homeassistant/homeassistant/helpers/entity_component.py", line 204, in handle_service
    await self.hass.helpers.service.entity_service_call(
  File "/usr/src/homeassistant/homeassistant/helpers/service.py", line 668, in entity_service_call
    future.result()  # pop exception if have
  File "/usr/src/homeassistant/homeassistant/helpers/entity.py", line 930, in async_request_call
    await coro
  File "/usr/src/homeassistant/homeassistant/helpers/service.py", line 705, in _handle_entity_call
    await result
  File "/usr/src/homeassistant/homeassistant/components/light/__init__.py", line 504, in async_handle_light_on_service
    await light.async_turn_on(**filter_turn_on_params(light, params))
  File "/config/custom_components/home-assistant-halo-main/light.py", line 121, in async_turn_on
    await self._device.async_turn_on()
  File "/config/custom_components/home-assistant-halo-main/halo.py", line 41, in async_turn_on
    await self._api.async_turn_on(self._pid, self._is_group)
  File "/config/custom_components/home-assistant-halo-main/halo.py", line 227, in async_turn_on
    return await self.async_set_group_state(pid, 'on_off', '[1]')
  File "/config/custom_components/home-assistant-halo-main/halo.py", line 253, in async_set_group_state
    r = requests.post(self.API_GROUP_STATE.format(pid=pid),
  File "/usr/local/lib/python3.9/site-packages/requests/api.py", line 117, in post
    return request('post', url, data=data, json=json, **kwargs)
  File "/usr/local/lib/python3.9/site-packages/requests/api.py", line 61, in request
    return session.request(method=method, url=url, **kwargs)
  File "/usr/local/lib/python3.9/site-packages/requests/sessions.py", line 529, in request
    resp = self.send(prep, **send_kwargs)
  File "/usr/local/lib/python3.9/site-packages/requests/sessions.py", line 645, in send
    r = adapter.send(request, **kwargs)
  File "/usr/local/lib/python3.9/site-packages/requests/adapters.py", line 440, in send
    resp = conn.urlopen(
  File "/usr/local/lib/python3.9/site-packages/urllib3/connectionpool.py", line 703, in urlopen
    httplib_response = self._make_request(
  File "/usr/local/lib/python3.9/site-packages/urllib3/connectionpool.py", line 398, in _make_request
    conn.request(method, url, **httplib_request_kw)
  File "/usr/local/lib/python3.9/site-packages/urllib3/connection.py", line 239, in request
    super(HTTPConnection, self).request(method, url, body=body, headers=headers)
  File "/usr/local/lib/python3.9/http/client.py", line 1279, in request
    self._send_request(method, url, body, headers, encode_chunked)
  File "/usr/local/lib/python3.9/http/client.py", line 1290, in _send_request
    self.putrequest(method, url, **skips)
  File "/usr/local/lib/python3.9/site-packages/urllib3/connection.py", line 219, in putrequest
    return _HTTPConnection.putrequest(self, method, url, *args, **kwargs)
  File "/usr/src/homeassistant/homeassistant/util/async_.py", line 166, in protected_loop_func
    check_loop(func, strict=strict)
  File "/usr/src/homeassistant/homeassistant/util/async_.py", line 154, in check_loop
    raise RuntimeError(
RuntimeError: Blocking calls must be done in the executor or a separate thread; Use `await hass.async_add_executor_job()` at custom_components/home-assistant-halo-main/halo.py, line 253: r = requests.post(self.API_GROUP_STATE.format(pid=pid),
Source: util/async_.py:144
First occurred: March 8, 2022, 8:35:57 PM (10 occurrences)
Last logged: 8:49:41 AM

Detected blocking call inside the event loop. This is causing stability issues. Please report issue to the custom component author for home-assistant-halo-main doing blocking calls at custom_components/home-assistant-halo-main/halo.py, line 253: r = requests.post(self.API_GROUP_STATE.format(pid=pid),

Hm, can you make sure you are using the latest commit: Convert configuration/setup. Clean up non-async · futbolpal/home-assistant-halo@5949da9 · GitHub

I think the line numbers don’t line up with the latest commit. I also updated the configuration example, as I converted from a light platform to something more generic to support scenes as switches.

I’m using this version of HA:
Home Assistant 2022.2.0b3

Hello, Jonathan.
Installed the integration. Thanks.
I see groups, but not individual lights. Is that correct?
Also, when I turn the lights on or off through the integration, the color temperature is changed to the a cold white. Interestingly, if I have Alexa change the brightness, the color temp is not altered.
Are you still developing this?

Hi, I am a new Home Assistant user and am wondering if you are still interested in creating a Hallo Home integration. I am in the process of understanding what you have done and how Home assistant works. I am not a Python expert but have done system programming for the last 30 years before retiring. I have gone through the API reference and made it work on curl successfully. Now I am going to dig into the developers documentation of home assistant and try to successfully dive into the development pratices.

1 Like

Speaking of Halo Home… what is the overall impression of the lights and platform. I am in the market for some smart 4" CCT downlights and Halo Home seems to be one of the few available… but not a fan of Bluetooth for control.

I have 15 of these units installed in my home. They seem to work fine and the app provided implements Groups, Scenes and Time of day schedules. I would like to get these fixtures into HomeAssist. I am currently trying to educate/learn what is there. It has been quite difficult to understand what I need to do to use the existing code and experiment with it. I have spent my life doing system administration, just not with what is here. A large project for a newbie to this to get educated…