An ESPHome external component for reading and decoding pulse trains from the Actron Air ESP32 keypad display, plus a Home Assistant integration with climate entity and custom Lovelace card.
- Interrupt-driven reading: Accurate pulse train capture
- 40-bit decoding: Full status from keypad display
- Temperature display: 7-segment decoder for setpoint
- 18 binary sensors: Mode, fan, zones, timers
- Error tracking: Bit count for monitoring reliability
- Type-safe config: ESPHome validation for all settings
- Climate entity: Full HVAC control with zone presets
- Custom Lovelace card: Retro keypad-style control interface
- ESP32 (ESP-IDF framework)
- GPIO pin for pulse train input
- Connection to air conditioner keypad display output
- MCP4725 or MCP4726 DAC (I2C) for keypad button emulation
- BC548 NPN transistor
- Resistors: 20kΩ, 4.7kΩ, 1.2kΩ (0.5W or higher)
See the forum thread for detailed build instructions and wiring diagrams.
This integration works with Actron Air ducted systems that use the older-style wall controllers with a 4-wire interface (SENS, KEY, COMM, POWER).
| Controller | Status | Notes |
|---|---|---|
| LM24 | Confirmed | Multi-zone controller |
| LM7 / LM7-2W / LM7-2G | Community reported | 7-day programmable, up to 8 zones |
| LM7-D | Community reported | Ultima Zone Control Master |
| AM7 | Community reported | Original older controller |
Compatible:
- SRA series (e.g., SRA22C, SRA25C) - older multi-zone ducted systems
- SRD series (e.g., SRD175C, SRD22C) - older ducted systems
- ESP Plus, ESP Platinum, ESP Ultima with LM7/LM24 controllers
- Classic series (SRG models) with LM7/LM24 controllers
Not compatible:
- Systems with QUE controllers (different architecture)
- Systems with ActronConnect/ACM WiFi modules (post-2013)
- Serene Series with Easy Connect app
This project has two parts:
- ESPHome component - Runs on your ESP32 to read the keypad and control the AC
- Home Assistant integration - Provides climate entity and Lovelace card
Set up the ESPHome device first, then install the Home Assistant integration.
See ESPHome Configuration below for detailed setup instructions. The quickest way is to use the ESPHome package - just copy example_actron_air_keypad.yaml and customise for your setup.
Once your ESPHome device is running, install the integration:
Or manually:
- Open HACS in Home Assistant
- Go to "Integrations" section
- Click the three dots menu and select "Custom repositories"
- Add
https://github.com/johnf/actron-air-esphomewith category "Integration" - Install "Actron Air ESPHome"
- Restart Home Assistant
- Go to Settings > Devices & Services > Add Integration
- Search for "Actron Air ESPHome" and configure
The integration will automatically register the Lovelace card.
- Copy the
custom_components/actron_air_esphomefolder to your Home Assistantconfig/custom_components/directory - Restart Home Assistant
- Go to Settings > Devices & Services > Add Integration
- Search for "Actron Air ESPHome" and configure
Add the card to your dashboard:
type: custom:actron-air-esphome-card
entity_prefix: actron_air| Option | Type | Default | Description |
|---|---|---|---|
entity_prefix |
string | required | Prefix for ESPHome entities (e.g., actron_air) |
name |
string | - | Card title (optional) |
show_timer |
boolean | true |
Show timer controls |
show_zones |
boolean | true |
Show zone buttons |
zone_count |
number | 4 |
Number of zones to display (1-7) |
zones |
array | - | Custom zone names |
type: custom:actron-air-esphome-card
entity_prefix: actron_air
name: Air Conditioning
show_timer: true
show_zones: true
zone_count: 4
zones:
- name: Bedrooms
- name: Living Room
- name: Kitchen
- name: OfficeThe card expects entities with the following naming pattern based on your entity_prefix:
Sensors:
sensor.{prefix}_setpoint_temperature
Switches:
switch.{prefix}_powerswitch.{prefix}_zone_1throughswitch.{prefix}_zone_8
Binary Sensors:
binary_sensor.{prefix}_coolbinary_sensor.{prefix}_heatbinary_sensor.{prefix}_autobinary_sensor.{prefix}_runbinary_sensor.{prefix}_fan_lowbinary_sensor.{prefix}_fan_midbinary_sensor.{prefix}_fan_highbinary_sensor.{prefix}_fan_continuousbinary_sensor.{prefix}_insidebinary_sensor.{prefix}_timerbinary_sensor.{prefix}_zone_1throughbinary_sensor.{prefix}_zone_8
Buttons:
button.{prefix}_modebutton.{prefix}_fanbutton.{prefix}_temp_upbutton.{prefix}_temp_downbutton.{prefix}_timerbutton.{prefix}_timer_upbutton.{prefix}_timer_down
The easiest way to get started is to use the ESPHome package, which includes all sensors, DAC controls, and button definitions. See example_actron_air_keypad.yaml for a complete example.
packages:
actron_air: github://johnf/actron-air-esphome/actron_air_keypad.yaml@main
esphome:
name: "my-aircon"
friendly_name: My Air Conditioner
wifi:
ssid: !secret wifi_ssid
password: !secret wifi_password
# Enable auto-discovery in Home Assistant
mdns:
services:
- service: "_actron_air"
protocol: "_tcp"
port: 6053
txt:
version: "1.0.0"
name: "my-aircon"That's it! The package includes everything you need:
- All 7 zones (remove unused ones with
!removeif desired) - DAC output for button emulation
- All binary sensors, switches, and buttons
- Configurable GPIO pins and voltage calibration via substitutions
Override any defaults by adding a substitutions section before the package:
substitutions:
gpio_keypad_pin: "GPIO32" # Pin for keypad signal
gpio_i2c_sda: "GPIO21" # I2C SDA pin
gpio_i2c_scl: "GPIO22" # I2C SCL pin
dac_output_address: "0x60" # MCP4725 DAC I2C address
# Voltage calibration (millivolts)
voltage_zone_1: "725.0"
voltage_zone_2: "663.0"
# ... see actron_air_keypad.yaml for all options
packages:
actron_air: github://johnf/actron-air-esphome/actron_air_keypad.yaml@mainIf you have fewer than 7 zones, you can remove the unused ones:
packages:
actron_air: github://johnf/actron-air-esphome/actron_air_keypad.yaml@main
# Remove zones 5-8 for a 4-zone system
switch:
- id: !remove zone_5_switch
- id: !remove zone_6_switch
- id: !remove zone_7_switch
- id: !remove zone_8_switch
- id: !remove zone_5
- id: !remove zone_6
- id: !remove zone_7
- id: !remove zone_8If you prefer more control, you can use the external component directly:
external_components:
- source:
type: git
url: https://github.com/johnf/actron-air-esphome
ref: main
components: [actron_air_esphome]
actron_air_esphome:
pin: GPIO32
sensor:
- platform: actron_air_esphome
setpoint_temp:
name: "Temperature"
binary_sensor:
- platform: actron_air_esphome
cool:
name: "Cool Mode"
heat:
name: "Heat Mode"
fan_high:
name: "Fan High"
zone_1:
name: "Zone 1"
zone_2:
name: "Zone 2"The Home Assistant integration provides a climate entity with:
- HVAC Modes: Off, Cool, Heat, Auto, Fan Only
- Fan Modes: High, Medium, Low, High Cont, Medium Cont, Low Cont, Off
- Zone Presets: Individual zones and "All Zones"
- Optional: Current temperature and humidity from external sensors
Configure via Settings > Devices & Services after installing the integration.
setpoint_temp- Temperature from 7-segment display (C)error_count- Error counter for monitoring
- Mode:
cool,heat,auto_mode,run - Fan:
fan_high,fan_mid,fan_low,fan_cont - Zones:
zone_1throughzone_8 - Other:
inside,timer
bit_string- Raw 40-bit pulse train (internal use)
There are 4 wires inside the wall unit that connect to the main supply:
- SENS - sensor line is directly connected to a thermistor
- KEY - connected to the keypad, it changes resistance to a different value when keys are pressed. This drops the voltage from 5V to different levels
- COMM - ground
- POWER - 19V and also data line that gets shifted into the LED. The protocol in this wire is quite simple: Data is transmitted every 200ms or so. It starts with a 16V->0V transition, followed by 41 other pulses, a zero or a one is determined by the time between the pulses. Each value is then shifted through the leds in the board.
- An interrupt handler captures falling edges on the ADC pin
- Timing between edges determines if the pulse represents a '0' or '1'
- 40 bits are collected to form a complete frame
- The frame is decoded to extract display and LED status
- Changes are published to Home Assistant sensors
The circuit connects the ESP32 to the Actron Air keypad interface. Fritzing source files are available in the fritzing/ directory.
- Check ADC pin connection
- Verify pulse train voltage levels
- Monitor
error_countsensor for errors
- Check 7-segment wiring/decoding
- Look at
bit_stringfor raw data - Verify display is showing temperature
- Ensure ESP-IDF framework is selected
- Check all Python files are present
- Validate YAML indentation
- Clear browser cache
- Check browser console for errors
- Verify the resource is loaded in Settings > Dashboards > Resources
Need Help?
- Check ESPHome logs:
esphome logs your-device.yaml - Validate config:
esphome config your-device.yaml - Review example_actron_air_keypad.yaml for complete setup
MIT License - Feel free to use and modify
This builds on the work of many others:


