Hi everyone ![]()
I’d like to share a DIY project I’m working on to integrate IR-controlled heaters into Home Assistant, starting from an Olimpia Splendid unit but designed to be vendor-agnostic.
The context
The heater itself is smart, but:
- it relies on a closed and proprietary cloud
- there’s no local API
- no official Home Assistant integration
From a Home Assistant perspective, this prevents local control and reliable automations.
The approach
The solution is a local-first IR bridge based on ESP32:
- the ESP32 learns IR codes directly from the original remote
- learned codes are replayed on demand
- all communication with Home Assistant happens via MQTT
Home Assistant remains the single source of truth for logic and automations, while the ESP32 acts as a smart but stateless IR endpoint.
Supported commands
The current firmware supports a structured IR command set, including:
- Power ON / OFF
- Operating mode selection
- Temperature setpoint commands
- Fan / power level commands
- Device reset and initialization sequences
Once IR codes are captured, the same approach works with any IR-controlled heater or device.
Reliability: power-loss recovery
One practical issue with IR-only devices is loss of state after a power outage.
To address this, the firmware includes a startup macro that:
- detects ESP32 reboot
- republishes availability via MQTT
- executes a predefined IR initialization sequence
This allows Home Assistant to re-establish a known device state after power is restored.
What’s next
As soon as the remaining electronic components arrive, the device will be extended with:
- temperature sensor
- humidity sensor
This will enable closed-loop automations based on real environmental data rather than blind IR control.
Why I’m sharing this
The goal of the project is to provide a solution that is:
- fully local
- cloud-independent
- cheap and reproducible
- useful for many legacy or cloud-locked IR devices
If there’s interest, I’ll be happy to:
- share schematics
- share the ESP32 firmware
- publish everything on GitHub once it’s cleaned up a bit
Feedback and suggestions are very welcome ![]()