The Haptique RS90 is a smart remote pitched as a replacement for the Logitech Harmony. It has a touchscreen at the top, proper buttons underneath, an IR blaster and a charging dock. The hardware is excellent. The software I found clunky and dated.
I set it up with the Haptique iOS app, tried their Home Assistant integration, and it fell over. I have too many entities for it to cope with. The RS90 went in a drawer.
In the meantime I built a remote for our phones, which I wrote about here. That has worked well, but a phone is not a remote with real buttons.
Then Haptique added MQTT support and the RS90 came back out of the drawer.

How it works
Two apps run side by side on the remote:
- The Haptique app looks after the hardware. It sends the IR commands and it publishes every physical button press to MQTT
- Fully Kiosk Browser sits in front of it and shows a Home Assistant dashboard on the touchscreen
So the buttons go to Home Assistant over MQTT, Home Assistant decides what each one does, and the screen is just a Lovelace view. Haptique’s own interface hardly gets a look in.
A huge thank you to Willis Desai and the team at Haptique for adding MQTT. None of this works without it.
Thank you also to daangel27 for the Haptique RS90 integration on HACS, which gives me the ring light, the battery level and a button to restart the browser.
The buttons
Every press arrives on one topic as button:N. A single automation picks it up and decides what to do based on what the room is doing.
For that I have a template sensor, sensor.family_room_activity, which looks at the Yamaha amp, the LG TV and the Sonos and comes out as Smart TV, Freesat, Nintendo, Sonos or Off. The amp source is the most reliable of the three so it gets the casting vote.
The same button then does different things depending on the activity:
- The D-pad and OK send webOS button presses to the TV. If Freesat is on, Home Assistant publishes back to the RS90 over MQTT instead and the remote fires the IR command at the Humax box
- Play, pause and skip go to the Sonos, the TV or the Humax
- Volume and mute always go to the amp and the Sonos speakers
- The power button turns the TV on if the room is off, and turns everything off if it isn’t
- One button cycles the screen between Remote, Lights and Sound
Every press also flashes the RGB ring light around the D-pad, so you know it registered.
Here it is in use, with me talking through how it works. I start the TV from the activity picker, move around the LG home screen with the D-pad, launch Prime Video from the touchscreen and then go back to the lights.
The D-pad part of the automation looks like this:
- conditions: "{{ activity == 'Freesat' and button in [6,7,8,9,10,13,14] }}"
sequence:
- action: mqtt.publish
data:
topic: Haptique/<your-remote-id>/device/Humax - 2430/trigger
payload: >-
{% if button == 6 %}UP{% elif button == 7 %}DOWN
{% elif button == 8 %}LEFT{% elif button == 9 %}RIGHT
{% elif button == 10 %}OK{% elif button == 13 %}BACK
{% elif button == 14 %}MENU{% endif %}
- conditions: "{{ activity in ['Smart TV','Nintendo','Sonos'] and button in [6,7,8,9,10,13,14] }}"
sequence:
- action: webostv.button
data:
entity_id: media_player.family_room_tv
button: >-
{% if button == 6 %}UP{% elif button == 7 %}DOWN
{% elif button == 8 %}LEFT{% elif button == 9 %}RIGHT
{% elif button == 10 %}ENTER{% elif button == 13 %}BACK
{% elif button == 14 %}MENU{% endif %}
activity and button are variables set at the top of the automation from the sensor and the MQTT payload.
The screen
The dashboard is one panel view, 790px high, split into three fixed zones:
- A thin strip at the top with one shortcut on it, either the lamps or all lights off. When the Sonos is playing it turns into volume and mute buttons
- The main area in the middle
- Three tabs at the bottom for Remote, Lights and Sound
The main area follows the activity sensor. Smart TV on, you get the streaming apps. Freesat on, you get the Freesat remote. Sonos playing, you get the Sonos controls. Nothing on, you get a picker to choose what to start. The dashboard only ever reads the activity. The scripts change the amp and the TV, the sensor follows them, and the screen follows the sensor.


I use kiosk_mode in Home Assistant to hide the header and sidebar. I did not put Fully Kiosk into full kiosk lockdown. With the back and home buttons locked out there is no way back if the dashboard crashes, and I did not want to risk upsetting whatever Android does underneath to get the button presses out over MQTT.
The only other app involved is Button Mapper. The volume buttons send Android volume keys, which pops the Android volume slider up over the dashboard. Button Mapper catches them first.
Things that caught me out
- Haptique publishes the button presses with retain on. Every time Home Assistant restarted, the broker replayed the last press and the automation fired as if somebody had just pressed it. I now clear the retained message when Home Assistant starts, and the automation ignores anything that does not start with
button: - One button restarts the browser through the Fully Kiosk API. When Fully Kiosk had already crashed, that call threw an error, the whole automation stopped and every other button went dead with it.
continue_on_error: trueon that one step fixed it - The V3.4 firmware update reset a setting called OPUS1UI and the remote booted to a bare Android app grid. It looked bricked. It wasn’t. Turn OPUS1UI back on in the Haptique settings
- Fully Kiosk 10.6.2 broke my Sonos display. I rolled back to 10.5 and have stayed there
- Fully Kiosk grabs the Back and menu keys before anything else sees them, so pressing Back flashes up the Fully Kiosk settings screen. Button Mapper can’t stop it and neither can the new key mapping in V3.4. I have not solved this one
- On my remote the centre OK button needs a firm press. I logged the MQTT traffic and a soft press never leaves the remote at all, so that one is with Haptique
Was it worth it
I think it is great, but there is still some clunkiness. Pressing Back does what it should, but it also brings up the Fully Kiosk menu, which is frustrating. I love having the light settings on it exactly where I want them, and being able to raise and lower the blinds from it.
The family? When Claudia watches TV she uses the LG remote. No surround sound, no light controls, and not in the slightest bit bothered!
The full YAML is on GitHub: github.com/shawwellpete/rs90-home-assistant-remote. As ever, if you have questions or improvements, leave a comment or open an issue. I would love to hear from anybody who has solved the Back button.