Rako Lighting

That looks promising, I went for the simple solution and implemented control in HA through calling the bridge http endpoint with a shell script and the template light component. I get full on/off/dimming control, but there are a few features which I’m missing, some of them haven’t yet been implemented in HA, and some are due to Rako limitations.

Features Missing from HA

  • RGB colour picker for a LED strip light

Limitations from Rako hardware

  • 2-way feedback (so that HA can poll to get current status from the bridge) - AFAIK it’s not possible to query the bridge to get the status of a light, but it might be possible to keep a constant listening connection open to the bridge. HA could parse these and mirror the current bridge status in its DB.
  • Ability to use Rako switches as sensors in HA (related to the point above about 2-way feedback from the bridge) - if this were possible I could simplify the Rako programming and move that logic over to HA

There’s a new cloud gateway coming out soon which promises Alexa/IFTTT/API integration, but it’s £250, which seems pretty steep

Hi there, new to HA. Would you be willing to share your Rako implementation :slight_smile:

For simple on/off/brightness control I have the following bash script on my HA server (you’ll need to change the IP to that of your bridge):

#!/bin/bash

ROOM=$1
CHANNEL=$2
LEVEL=$3

curl -X POST "http://192.168.1.207/rako.cgi?room=${ROOM}&ch=${CHANNEL}&lev=${LEVEL}" > /dev/null 2>&1

I then have a HA config for shell command:

bash /home/homeassistant/.homeassistant/scripts/rako.sh {{room}} {{channel}} {{level}}

For each Rako circuit I have the following (with the room & channel changed to match the Rako config. I’m not using the Rako concept of masters):

- platform: template
  lights:
    bedroom1_ceiling:
      friendly_name: "Bedroom"
      turn_on:
        service: shell_command.rako
        data_template:
          room: 28
          channel: 1
          level: 255
      turn_off:
        service: shell_command.rako
        data_template:
           room: 28
           channel: 1
           level: 0
      set_level:
        service: shell_command.rako
        data_template:
          room: 28
          channel: 1
          level: "{{brightness}}"

This gives 1-way control, HA will update Rako and remember the state of what HA has set, but using the Rako app or a keypad means that things can get out of sync very quickly.

I’ve done some work on looking into hacking together 2-way control, but never got round to implementing it reliably, so I don’t use it.

You’ll need to check the spacing & indentation from the code snippets above, as I’ve got a lot of my config split out into separate files, it’s all up at https://github.com/anthonyangel/Home-AssistantConfig

Cheers, I’ll give that a go

Hi all,

Very new to all this. This looks ace.

How would I go about adding Rako Control to my homeassistant setup? Does this code need to be added to configuration.yarl?

Hi Anthony,

I’m new to HASS and programming in general. I have RAKO lighting system at home and would be interested in using my Harmony remote controller to assign buttons to control lights in one particular room. Are you able to advise how I might go about learning how to do this - using your github as a starting point?

Thanks in advance for any help or advice you could send my way.

Rich

helped me a lot, thnx verry much

hi all
i just published a rako light mqtt component which also watches for state updates (if you press the light switch instead of use HA to change the state of the light)


ive only implemented brightness (because thats all my rako lights can do)
happy for feedback and prs
cheers
ben

Hi Marengaz,

How do I connect this… I have had a look at your GitHub, but am not 100% sure how to implement. I have setup the MQTT integration in HA, but cannot progress beyond this point. Any assistance would be greatatefully received.

hey @Richard_Ellis

  • grab the username and password out of the mqtt settings in the hassio addon
  • set them as env vars along with all the others (see the config section of the readme)
  • use the compose file (see the Build and deploy section of the readme)
  • set up your lights in HA (see Home assistant light config section of the readme)

Thanks for coming back to me.

I’m not having much luck with this. Don’t suppose you’d be up for a remote session to get this up & running? Can pay for your time if reasonable?

hi all
i overhauled my code so it should now be very easy to install using portainer
let me know if it works in your environments!

Hi,

Thank you for this work, however I am having difficulty installing the integration based on your instructions.

After I create the container, Portainer is failing to run it. Log reports the following entry ;

standard_init_linux.go:211: exec user process caused “exec format error”

I have tested my Mosquitto MQTT which seems to be working fine, have I missed something ?

On the flip side, after manually installing the integration via “docker-compose” command it is working. Only issue is when I use the template I cannot define which channel to use for a given room id.

i.e.

  • platform: mqtt
    name: Hallway
    schema: json
    state_topic: “rako/room/42”
    command_topic: “rako/room/42/set”
    brightness: true

Where can we specify which channel to use for the above room (42) ?

Thank you!

hi erdem

sorry to hear of your portainer struggles. my code is written in python, so the go error must be somewhere else. open a issue on the github with the full logs if you’d like me to investigate further?

on the channel specification. annoyingly, i found that when i created a home assistant scene, changing multiple rako channels at the same time, the rako bridge just randomly ignores some of the commands without notice (maybe sent in too quick succession?). my work around for this was to set up 4 scenes per room in the rako app scene 1 being the brightest, 4 being the dimmest, then just map 100%-0% brightness scale to scene number. see these 2 functions for more detail. if you’d like me to consider implementing the channel granularity anyway, please open a github issue?

best regards
ben

Hi Ben,

Thank you very much for your prompt response, I have now updated the original issue to a feature request as I was able to manually install using docker-compose method.

It will be great if you can implement the possibility of controlling separate channels for a given room.

Best Regards,

Erdem

Hi Ben,

Did you had any time to see if multi channel operation can be implemented ?

Many Thanks,

Erdem

pushed a new container. let me know how you get on!

Hi Ben,

I just implemented your recent code changes, I confirm that granule control of rooms and channels is working for my requirements so a big “Thank you!” for this. However I have noticed that when I control the light switch from the physical wall plate, light states do not get updated on Home Assistant it seems it is still a one-way communication from Home Assistant to RakoBridge.

Please see below container log output for your information, I would appreciate if you can advise if this is how it was intended to work or 2-way communication is possible ?

Many Thanks

2020-05-27 22:37:33 DEBUG (MainThread) [commander] [paho.mqtt.client] Received PINGRESP,

2020-05-27 22:38:33 DEBUG (Thread-1) [watcher] [paho.mqtt.client] Sending PINGREQ,

2020-05-27 22:38:33 DEBUG (Thread-1) [watcher] [paho.mqtt.client] Received PINGRESP,

2020-05-27 22:38:33 DEBUG (MainThread) [commander] [paho.mqtt.client] Sending PINGREQ,

2020-05-27 22:38:33 DEBUG (MainThread) [commander] [paho.mqtt.client] Received PINGRESP,

2020-05-27 22:39:33 DEBUG (Thread-1) [watcher] [paho.mqtt.client] Sending PINGREQ,

2020-05-27 22:39:33 DEBUG (Thread-1) [watcher] [paho.mqtt.client] Received PINGRESP,

2020-05-27 22:39:33 DEBUG (MainThread) [commander] [paho.mqtt.client] Sending PINGREQ,

2020-05-27 22:39:33 DEBUG (MainThread) [commander] [paho.mqtt.client] Received PINGRESP,

2020-05-27 22:40:02 DEBUG (MainThread) [commander] [paho.mqtt.client] Received PUBLISH (d0, q0, r0, m0), ‘rako/room/9/channel/1/set’, … (15 bytes),

2020-05-27 22:40:02 DEBUG (MainThread) [commander] [rakomqtt.RakoBridge] payload {‘room’: 9, ‘ch’: 1, ‘lev’: 255},

2020-05-27 22:40:02 DEBUG (MainThread) [watcher] [rakomqtt.RakoBridge] received byte_list: [83, 7, 0, 9, 1, 52, 1, 255, 194],

2020-05-27 22:40:02 DEBUG (MainThread) [watcher] [paho.mqtt.client] Sending PUBLISH (d0, q0, r0, m1), ‘b’rako/room/9/channel/1’’, … (34 bytes),

2020-05-27 22:40:02 DEBUG (MainThread) [watcher] [rakomqtt.MQTTClient] published to rako/room/9/channel/1: {“state”: “ON”, “brightness”: 255}. response: (0, 1),

2020-05-27 22:40:07 DEBUG (MainThread) [commander] [paho.mqtt.client] Received PUBLISH (d0, q0, r0, m0), ‘rako/room/9/channel/1/set’, … (16 bytes),

2020-05-27 22:40:07 DEBUG (MainThread) [commander] [rakomqtt.RakoBridge] payload {‘room’: 9, ‘ch’: 1, ‘lev’: 0},

2020-05-27 22:40:07 DEBUG (MainThread) [watcher] [rakomqtt.RakoBridge] received byte_list: [83, 7, 0, 9, 1, 52, 1, 0, 193],

2020-05-27 22:40:07 DEBUG (MainThread) [watcher] [paho.mqtt.client] Sending PUBLISH (d0, q0, r0, m2), ‘b’rako/room/9/channel/1’’, … (33 bytes),

2020-05-27 22:40:07 DEBUG (MainThread) [watcher] [rakomqtt.MQTTClient] published to rako/room/9/channel/1: {“state”: “OFF”, “brightness”: 0}. response: (0, 2),

2020-05-27 22:40:33 DEBUG (Thread-1) [watcher] [paho.mqtt.client] Sending PINGREQ,

2020-05-27 22:40:33 DEBUG (Thread-1) [watcher] [paho.mqtt.client] Received PINGRESP,

2020-05-27 22:40:34 DEBUG (MainThread) [commander] [paho.mqtt.client] Sending PINGREQ,

2020-05-27 22:40:34 DEBUG (MainThread) [commander] [paho.mqtt.client] Received PINGRESP,

2020-05-27 22:41:30 DEBUG (MainThread) [commander] [paho.mqtt.client] Received PUBLISH (d0, q0, r0, m0), ‘rako/room/9/channel/4/set’, … (16 bytes),

2020-05-27 22:41:30 DEBUG (MainThread) [commander] [rakomqtt.RakoBridge] payload {‘room’: 9, ‘ch’: 4, ‘lev’: 0},

2020-05-27 22:41:31 DEBUG (MainThread) [watcher] [rakomqtt.RakoBridge] received byte_list: [83, 7, 0, 9, 4, 52, 1, 0, 190],

2020-05-27 22:41:31 DEBUG (MainThread) [watcher] [paho.mqtt.client] Sending PUBLISH (d0, q0, r0, m3), ‘b’rako/room/9/channel/4’’, … (33 bytes),

2020-05-27 22:41:31 DEBUG (MainThread) [watcher] [rakomqtt.MQTTClient] published to rako/room/9/channel/4: {“state”: “OFF”, “brightness”: 0}. response: (0, 3),

2020-05-27 22:41:32 DEBUG (MainThread) [commander] [paho.mqtt.client] Received PUBLISH (d0, q0, r0, m0), ‘rako/room/17/channel/2/set’, … (16 bytes),

2020-05-27 22:41:32 DEBUG (MainThread) [commander] [rakomqtt.RakoBridge] payload {‘room’: 17, ‘ch’: 2, ‘lev’: 0},

2020-05-27 22:41:32 DEBUG (MainThread) [watcher] [rakomqtt.RakoBridge] received byte_list: [83, 7, 0, 17, 2, 52, 1, 0, 184],

2020-05-27 22:41:32 DEBUG (MainThread) [watcher] [paho.mqtt.client] Sending PUBLISH (d0, q0, r0, m4), ‘b’rako/room/17/channel/2’’, … (33 bytes),

2020-05-27 22:41:32 DEBUG (MainThread) [watcher] [rakomqtt.MQTTClient] published to rako/room/17/channel/2: {“state”: “OFF”, “brightness”: 0}. response: (0, 4),

2020-05-27 22:41:34 DEBUG (Thread-1) [watcher] [paho.mqtt.client] Sending PINGREQ,

2020-05-27 22:41:34 DEBUG (Thread-1) [watcher] [paho.mqtt.client] Received PINGRESP,

2020-05-27 22:41:36 DEBUG (MainThread) [commander] [paho.mqtt.client] Sending PINGREQ,

2020-05-27 22:41:36 DEBUG (MainThread) [commander] [paho.mqtt.client] Received PUBLISH (d0, q0, r0, m0), ‘rako/room/9/channel/2/set’, … (16 bytes),

2020-05-27 22:41:36 DEBUG (MainThread) [commander] [rakomqtt.RakoBridge] payload {‘room’: 9, ‘ch’: 2, ‘lev’: 0},

2020-05-27 22:41:36 DEBUG (MainThread) [watcher] [rakomqtt.RakoBridge] received byte_list: [83, 7, 0, 9, 2, 52, 1, 0, 192],

2020-05-27 22:41:36 DEBUG (MainThread) [watcher] [paho.mqtt.client] Sending PUBLISH (d0, q0, r0, m5), ‘b’rako/room/9/channel/2’’, … (33 bytes),

2020-05-27 22:41:36 DEBUG (MainThread) [watcher] [rakomqtt.MQTTClient] published to rako/room/9/channel/2: {“state”: “OFF”, “brightness”: 0}. response: (0, 5),

2020-05-27 22:41:36 DEBUG (MainThread) [commander] [paho.mqtt.client] Received PUBLISH (d0, q0, r0, m0), ‘rako/room/17/channel/1/set’, … (16 bytes),

2020-05-27 22:41:36 DEBUG (MainThread) [commander] [rakomqtt.RakoBridge] payload {‘room’: 17, ‘ch’: 1, ‘lev’: 0},

2020-05-27 22:41:36 DEBUG (MainThread) [watcher] [rakomqtt.RakoBridge] received byte_list: [83, 7, 0, 17, 1, 52, 1, 0, 185],

2020-05-27 22:41:36 DEBUG (MainThread) [watcher] [paho.mqtt.client] Sending PUBLISH (d0, q0, r0, m6), ‘b’rako/room/17/channel/1’’, … (33 bytes),

2020-05-27 22:41:36 DEBUG (MainThread) [watcher] [rakomqtt.MQTTClient] published to rako/room/17/channel/1: {“state”: “OFF”, “brightness”: 0}. response: (0, 6),

2020-05-27 22:41:37 DEBUG (MainThread) [commander] [paho.mqtt.client] Received PUBLISH (d0, q0, r0, m0), ‘rako/room/9/channel/3/set’, … (16 bytes),

2020-05-27 22:41:37 DEBUG (MainThread) [commander] [rakomqtt.RakoBridge] payload {‘room’: 9, ‘ch’: 3, ‘lev’: 0},

2020-05-27 22:41:37 DEBUG (MainThread) [watcher] [rakomqtt.RakoBridge] received byte_list: [83, 7, 0, 9, 3, 52, 1, 0, 191],

2020-05-27 22:41:37 DEBUG (MainThread) [watcher] [paho.mqtt.client] Sending PUBLISH (d0, q0, r0, m7), ‘b’rako/room/9/channel/3’’, … (33 bytes),

2020-05-27 22:41:37 DEBUG (MainThread) [watcher] [rakomqtt.MQTTClient] published to rako/room/9/channel/3: {“state”: “OFF”, “brightness”: 0}. response: (0, 7),

2020-05-27 22:41:39 DEBUG (MainThread) [commander] [paho.mqtt.client] Received PINGRESP,

2020-05-27 22:42:34 DEBUG (Thread-1) [watcher] [paho.mqtt.client] Sending PINGREQ,

2020-05-27 22:42:34 DEBUG (Thread-1) [watcher] [paho.mqtt.client] Received PINGRESP,

2020-05-27 22:42:37 DEBUG (MainThread) [commander] [paho.mqtt.client] Sending PINGREQ,

2020-05-27 22:42:37 DEBUG (MainThread) [commander] [paho.mqtt.client] Received PINGRESP,

2020-05-27 22:43:34 DEBUG (Thread-1) [watcher] [paho.mqtt.client] Sending PINGREQ,

2020-05-27 22:43:34 DEBUG (Thread-1) [watcher] [paho.mqtt.client] Received PINGRESP,

2020-05-27 22:43:37 DEBUG (MainThread) [commander] [paho.mqtt.client] Sending PINGREQ,

2020-05-27 22:43:37 DEBUG (MainThread) [commander] [paho.mqtt.client] Received PINGRESP,

2020-05-27 22:43:39 DEBUG (MainThread) [watcher] [rakomqtt.RakoBridge] received byte_list: [83, 10, 0, 9, 0, 49, 1, 3, 0, 0, 0, 194],

2020-05-27 22:43:39 DEBUG (MainThread) [watcher] [paho.mqtt.client] Sending PUBLISH (d0, q0, r0, m8), ‘b’rako/room/9’’, … (34 bytes),

2020-05-27 22:43:39 DEBUG (MainThread) [watcher] [rakomqtt.MQTTClient] published to rako/room/9: {“state”: “ON”, “brightness”: 128}. response: (0, 8),

2020-05-27 22:44:35 DEBUG (Thread-1) [watcher] [paho.mqtt.client] Sending PINGREQ,

2020-05-27 22:44:35 DEBUG (Thread-1) [watcher] [paho.mqtt.client] Received PINGRESP,

2020-05-27 22:44:37 DEBUG (MainThread) [commander] [paho.mqtt.client] Sending PINGREQ,

2020-05-27 22:44:37 DEBUG (MainThread) [commander] [paho.mqtt.client] Received PINGRESP,

2020-05-27 22:45:09 DEBUG (MainThread) [watcher] [rakomqtt.RakoBridge] received byte_list: [83, 10, 0, 9, 0, 49, 1, 4, 0, 0, 0, 193],

2020-05-27 22:45:09 DEBUG (MainThread) [watcher] [paho.mqtt.client] Sending PUBLISH (d0, q0, r0, m9), ‘b’rako/room/9’’, … (33 bytes),

2020-05-27 22:45:09 DEBUG (MainThread) [watcher] [rakomqtt.MQTTClient] published to rako/room/9: {“state”: “ON”, “brightness”: 64}. response: (0, 9),

2020-05-27 22:45:11 DEBUG (MainThread) [watcher] [rakomqtt.RakoBridge] received byte_list: [83, 10, 0, 9, 0, 50, 128, 0, 0, 1, 0, 68],

2020-05-27 22:45:11 DEBUG (MainThread) [watcher] [rakomqtt.RakoBridge] unhandled bytestring: 50 is not a valid RakoCommandType,

2020-05-27 22:45:12 DEBUG (MainThread) [watcher] [rakomqtt.RakoBridge] received byte_list: [83, 5, 0, 9, 0, 15, 232],

2020-05-27 22:45:12 DEBUG (MainThread) [watcher] [rakomqtt.RakoBridge] unhandled bytestring: 15 is not a valid RakoCommandType,

2020-05-27 22:45:12 DEBUG (MainThread) [watcher] [rakomqtt.RakoBridge] received byte_list: [83, 10, 0, 9, 0, 50, 128, 0, 0, 1, 0, 68],

2020-05-27 22:45:12 DEBUG (MainThread) [watcher] [rakomqtt.RakoBridge] unhandled bytestring: 50 is not a valid RakoCommandType,

2020-05-27 22:45:12 DEBUG (MainThread) [watcher] [rakomqtt.RakoBridge] received byte_list: [83, 5, 0, 9, 0, 15, 232],

2020-05-27 22:45:12 DEBUG (MainThread) [watcher] [rakomqtt.RakoBridge] unhandled bytestring: 15 is not a valid RakoCommandType,

2020-05-27 22:45:13 DEBUG (MainThread) [watcher] [rakomqtt.RakoBridge] received byte_list: [83, 10, 0, 9, 0, 50, 128, 0, 0, 1, 0, 68],

2020-05-27 22:45:13 DEBUG (MainThread) [watcher] [rakomqtt.RakoBridge] unhandled bytestring: 50 is not a valid RakoCommandType,

2020-05-27 22:45:13 DEBUG (MainThread) [watcher] [rakomqtt.RakoBridge] received byte_list: [83, 5, 0, 9, 0, 15, 232],

2020-05-27 22:45:13 DEBUG (MainThread) [watcher] [rakomqtt.RakoBridge] unhandled bytestring: 15 is not a valid RakoCommandType,

2020-05-27 22:45:35 DEBUG (Thread-1) [watcher] [paho.mqtt.client] Sending PINGREQ,

2020-05-27 22:45:35 DEBUG (Thread-1) [watcher] [paho.mqtt.client] Received PINGRESP,

2020-05-27 22:45:37 DEBUG (MainThread) [commander] [paho.mqtt.client] Sending PINGREQ,

2020-05-27 22:45:37 DEBUG (MainThread) [commander] [paho.mqtt.client] Received PINGRESP,

2020-05-27 22:46:35 DEBUG (Thread-1) [watcher] [paho.mqtt.client] Sending PINGREQ,

2020-05-27 22:46:35 DEBUG (Thread-1) [watcher] [paho.mqtt.client] Received PINGRESP,

2020-05-27 22:46:37 DEBUG (MainThread) [commander] [paho.mqtt.client] Sending PINGREQ,

2020-05-27 22:46:37 DEBUG (MainThread) [commander] [paho.mqtt.client] Received PINGRESP,

2020-05-27 22:47:24 DEBUG (MainThread) [watcher] [rakomqtt.RakoBridge] received byte_list: [83, 10, 0, 9, 0, 49, 1, 4, 0, 0, 0, 193],

2020-05-27 22:47:24 DEBUG (MainThread) [watcher] [paho.mqtt.client] Sending PUBLISH (d0, q0, r0, m10), ‘b’rako/room/9’’, … (33 bytes),

2020-05-27 22:47:24 DEBUG (MainThread) [watcher] [rakomqtt.MQTTClient] published to rako/room/9: {“state”: “ON”, “brightness”: 64}. response: (0, 10),

2020-05-27 22:47:26 DEBUG (MainThread) [watcher] [rakomqtt.RakoBridge] received byte_list: [83, 10, 0, 9, 0, 49, 1, 3, 0, 0, 0, 194],

2020-05-27 22:47:26 DEBUG (MainThread) [watcher] [paho.mqtt.client] Sending PUBLISH (d0, q0, r0, m11), ‘b’rako/room/9’’, … (34 bytes),

2020-05-27 22:47:26 DEBUG (MainThread) [watcher] [rakomqtt.MQTTClient] published to rako/room/9: {“state”: “ON”, “brightness”: 128}. response: (0, 11),

2020-05-27 22:47:36 DEBUG (Thread-1) [watcher] [paho.mqtt.client] Sending PINGREQ,

2020-05-27 22:47:36 DEBUG (Thread-1) [watcher] [paho.mqtt.client] Received PINGRESP,

2020-05-27 22:47:37 DEBUG (MainThread) [commander] [paho.mqtt.client] Sending PINGREQ,

2020-05-27 22:47:37 DEBUG (MainThread) [commander] [paho.mqtt.client] Received PINGRESP,’

Thanks for the debug logs

These are the status updates that are failing to make it through to home assistant:

2020-05-27 22:45:11 DEBUG (MainThread) [watcher] [rakomqtt.RakoBridge] received byte_list: [83, 10, 0, 9, 0, 50, 128, 0, 0, 1, 0, 68],
2020-05-27 22:45:11 DEBUG (MainThread) [watcher] [rakomqtt.RakoBridge] unhandled bytestring: 50 is not a valid RakoCommandType,

2020-05-27 22:45:12 DEBUG (MainThread) [watcher] [rakomqtt.RakoBridge] received byte_list: [83, 5, 0, 9, 0, 15, 232],
2020-05-27 22:45:12 DEBUG (MainThread) [watcher] [rakomqtt.RakoBridge] unhandled bytestring: 15 is not a valid RakoCommandType,

The first one (50) is a FADE command. I’m not exactly sure how to decipher if it was a fade up or a fade down (ie you pressed the button on the wall plate)
The second one (15) is a STOP_FADING command (ie you released the button on the wall plate).

Neither of them show data about how what brightness level you were fading from or to.

Out of interest, which wall plates do you have? We only have the RCM-070s and we never ever use the fade buttons, only the scene buttons, so i never bothered trying to implement fade status updates!

ill see if i can recreate locally and have a think about possible work arounds to support fading…

Hi Ben,

I also have the RCM-070 wall plates, I believe developers configure the 4 buttons like scenes. So to give an example the logs are from my living room where I have a ceiling light and also spots both on a separate channel; (Room 9, Ch1:Ceiling Lights, Ch2:Spots).

Than on the wall plate scenes are configured like this;

Button 1 : 100% Ceiling Light & Spot Lights
Button 2 : 50% Ceiling Light & Spot Lights
Button 3 : 50% Spot lights only
Button 4 : 25% Ceiling Light
Button 5 : Off

I did not use fading buttons, but I guess you are right about the fading because I used the preconfigured wall plate buttons and they are programmed to fade to certain percentage depending on which scene is selected.

Let me know if I can provide more data ?

Once again thank you so very much!

Regards,

Erdem