|
Home IO Control
ESPHome add-on for IO-Homecontrol devices
|
Which IO-Homecontrol devices this project has been run against, what worked, and what the evidence for each entry is. If your device is not listed, that usually means nobody has reported it yet rather than that it fails β see Getting your device added.
Every row carries its evidence, so you can judge how much weight to put on it. The status words mean:
| Status | Meaning |
|---|---|
| β Confirmed | Worked end to end on real hardware. |
| β οΈ Partial | Some operations work and others reproducibly do not. The row says which. |
| π£ Reported | A field report says it works. Not reproduced here, and no capture in the corpus. |
| π Traffic captured only | Frames from this device are decoded in the corpus, but this project has never controlled it. |
| β Unsupported | Tried and failed. The cause is either understood or under investigation. |
"Corpus captures" are golden-frame recordings in tests/corpus/captures/ β real RF frames, replayed by the test suite. A row backed by captures is the strongest kind of evidence here.
A device's absence is not a verdict. The protocol is the same across the alliance's members, so an unlisted cover-like actuator has a good chance of working with io_device_type set to the closest match.
| Device | Type | Status | Route that worked | Key config | Evidence |
|---|---|---|---|---|---|
| Sunea IO awning motor | awning | β Confirmed | Discover & Pair | io_device_type: awning | 31 corpus captures, across all three radios |
| Sunea IO 70/17 | roller_shutter | β Confirmed | Discover & Pair | β | |
| Sunea IO 40/17 | roller_shutter | β Confirmed | Discover & Pair | β | |
| Sunilus IO 50/12 | roller_shutter | β Confirmed | Discover & Pair | β | corpus somfy_sunilus_pairing_key_transfer_rejected_error |
| Izymo IO dimmer | light | β Confirmed, including dimming | Discover & Pair, including repeated reset-and-repair cycles | dimmable: true | 39 corpus captures; the light: platform's hardware validation |
| J406 IO shutter motor | external_venetian_blind | β Confirmed | Discover & Pair | io_device_type: external_venetian_blind (enumerates as 0x11) | Corpus somfy_j406_discovery_1w_overheard |
| MAESTRIA+ IO | roller_shutter | β Confirmed | Key extraction β Discover & Pair did not succeed | accept_foreign_pairing: true | on a Heltec V3.2 / SX1262 |
| Horizontal awning (two units) | horizontal_awning | β Confirmed | Discover & Pair | Direction inversion is applied automatically for this family | Corpus somfy_awning_discovery_spe_paired_rollcall |
| Pergola io motor | horizontal_awning | β Confirmed | Discover & Pair, after a single PROG hold on its Situo | β | Heltec V3 / SX1262, issue #121 |
| White LED Receiver io (4-output LED dimmer) | light | β Never answered discovery | β | β | Discover & Pair failed in every state and setting tried, including right after a factory reset, while a Pergola io paired first try on the same board. 1W remotes register and control it normally. Heltec V3 / SX1262, issue #121 |
| Awning actuator (IO Vertical) | awning | β Confirmed for discovery | Discover & Pair | β | Corpus somfy_awning_discovery_lab_response |
| RS100 IO / RS100 Solar | awning / roller_shutter | β οΈ Partial β pairing needs a retried key exchange | Discover & Pair, retried | low_power: true | 7 corpus captures including both a success and a key-transfer stall |
| Oximo 40 Solar tubular motor | roller_shutter | π Traffic captured only | β | low_power: true | Corpus somfy_oximo40_statuspoll_sx1262, issue #45 |
| Sunea IO screen | screen | π Traffic captured only | β | β | Corpus somfy_awning_exchange_priority_level_sx1276 β a directed priority-level query from a real TaHoma Switch |
| Tilt-capable blind/shutter | tilt-capable cover | β Confirmed for tilt control | β | β | 8 corpus captures |
| Combined wind/rain protection station | sensor (1W) | β Confirmed for listening | Overheard; no pairing involved | exposed_senders: / linked_remotes: | 2 corpus captures |
| Eolis 3D WireFree IO wind sensor | sensor (1W) | π£ Reported β listen-only | Overheard; no pairing involved | exposed_senders: / linked_remotes: | A standalone wind sensor, distinct from the combined station above; links directly to its awning motor. |
Somfy motors are also sold under other brands. The two awnings this project was originally built for carry a "Heim & Haus" badge over a Somfy Sunea IO motor, so match your motor to a row by what is inside the tube rather than by the name on the awning.
low_power: true on the solar Somfy motors is a reasoned starting point rather than a confirmed setting: the option is meant for battery and solar actuators, and it is confirmed on VELUX hardware through issue #87, but no RS100 or Oximo report has confirmed it yet.
These are useful as key-extraction sources or as senders you can listen to, not as things this project controls.
| Device | Role | Status | Evidence |
|---|---|---|---|
| Smoove IO wall switch | 1W remote | β Confirmed for listening, and for re-pairing a reset Izymo | 8 corpus captures |
| TaHoma Switch | Third-party hub | β Confirmed as a key-extraction source | Corpus somfy_tahoma_pairing_key_extraction_success_sx1276 |
| Connectivity Kit | Third-party hub | β οΈ Partial β extraction stalled | Corpus somfy_connectivity_kit_pairing_key_extraction_stall |
| Smoove IO remote | 1W remote | β Confirmed for listening | Corpus somfy_smoove_enrollment_monitor_sx1276; issue #27 |
| Situo 5 io Pure II | 1W remote | β Confirmed for listening | Its PROG hold and its EXECUTE frames both decode, and a Somfy awning paired from that gesture |
| Device | Type | Status | Route that worked | Key config | Evidence |
|---|---|---|---|---|---|
| KLR 200 two-way control pad | Third-party hub | β Confirmed as a key-extraction source | Key extraction | accept_foreign_pairing: true | succeeded end to end on the first attempt, including the node verification round that follows it; corpus velux_klr200_pairing_key_extraction_success |
| KLR 100 two-way control pad | Third-party hub | π£ Reported as a key-extraction source | Key extraction | accept_foreign_pairing: true | Its "Register product" gesture opens the extraction window the same way the KLR 200's does; issue #87 |
| KIG 300 hub | Third-party hub | β οΈ Partial β one extraction succeeded, one stalled | Key extraction | accept_foreign_pairing: true | 4 corpus captures |
| INTEGRA roof-window actuator | window_opener | β Confirmed | β | io_device_type: window_opener, which adds the Ventilation Position button | 3 corpus captures; issue #98 |
| INTEGRA roller shutter, mains-wired | roller_shutter | π£ Reported | β | β | A 230 V installation β two window actuators and their shutters, driven alongside two KLR 200s; issue #57. Mains power is what separates this from the solar rows below |
| Devices behind an extracted KLR200 key | Mixed | β Confirmed | Key extraction, then scan_paired_devices | low_power: true on the affected devices | scan_paired_devices runs a low-power pass built to reach sleeping devices without any YAML declaration; low_power: true is still needed for directed commands once they are registered |
| MSU 100100 5070WL solar awning screen | screen | β οΈ Partial β open and close work; stop has no effect while it moves | β | low_power: true | Nothing the hub sends gets an answer while the motor runs; stop it mid-travel with its own remote β see VELUX INTEGRA |
| SSL solar roller shutter | roller_shutter | β οΈ Partial β Discover & Pair, open, close, position and status; stop reaches it mid-travel, but not on every attempt | Discover & Pair right after a motor-side reset | pairing_discovery_preamble: 32 (required); pairing_discovery_destination: "0x00003F" and pairing_discovery_ack_capable: true complete the confirmed setup but are not known to be required; low_power: true on the device entry | The reset removes the wall remote, so register it again afterwards. Press stop again if the shutter keeps moving, or use that remote. Step-by-step: VELUX INTEGRA |
| INTEGRA SOLAR blinds | blind | π£ Reported | β | low_power: true | Named as a canonical low-power case; no capture |
| KLI 313 remote (ships with the SML roller shutter) | 1W remote | π Traffic captured only | β | β | 3 corpus captures |
| KLI 310 universal wall remote | 1W remote | π Traffic captured only | β | β | Corpus velux_kli310_discovery_alt_sweep |
| KLI 312 interior-blind remote | 1W remote | π Traffic reported only | β | β | Gear 0x2E goes to blind and venetian_blind; no corpus capture |
| KUX 100 / PK03 / PK04 wired bridge | Bridge | π Traffic captured only | β | β | 3 corpus captures of KLR200 β KUX100 traffic |
| KLF 200 | Third-party hub | π£ Reported as a key source | β | β | Named in several issue threads; no capture |
| SML electric roller shutter | roller_shutter, 1W | β Confirmed β enrollment, open, close, stop (SX1276) | 1W enrollment: Gear on the existing KLI 310, then Enroll. Two-way Discover & Pair finds nothing (issue #17) | manufacturer: velux, execute_broadcast: all, enrollment: true, low_power: false | Mains-fed, e.g. through a KUX 110 power supply, which has no radio role; see Sending 1W commands |
| Interior blinds behind a KLI 312 | venetian_blind, 1W | β Confirmed β enrollment, open, close, stop (SX1262) | 1W enrollment: Gear on the existing KLI 312, then Enroll | manufacturer: velux, execute_broadcast: all, enrollment: true, enrollment_classes: [blind, venetian_blind], low_power: true |
| Device | Type | Status | Route that worked | Key config | Evidence |
|---|---|---|---|---|---|
| T3.5 E BHz DC solar tubular motor (Autosun 2 BHz) | roller_shutter | β Confirmed β Discover & Pair, open, close, live position, device name | Discover & Pair: hold PROG on the BHz transmitter that already controls the motor, release it at the first jog, then press Discover & Pair. | β | Reports its name as T3.5EBHZ DC; |
| BHz wall transmitter (1 channel) | 1W remote | β Confirmed for listening | β | β | Its PROG press decodes as an io add-controller frame and opens the motor's two-way pairing window |
SIMU also sells a T3.5 EHz DC, without the B. That motor uses SIMU-Hz at 433 MHz, not io-homecontrol, so this project cannot control it. Check the motor label or its box for "E BHz" before pairing.
| Device | Status | Evidence |
|---|---|---|
| Atlantic Thermor-style climate/heating actuator | π Traffic captured only β the climate: platform is built against it but has never run on hardware | Corpus atlantic_thermor_exchange_write_private_param |
| Honeywell, HΓΆrmann, Assa Abloy, Niko, WindowMaster, Renson, CIAT, Secuyou, Overkiz, Atlantic Group | Untested β these are names the schema accepts, not devices anyone has reported | Only somfy and velux have a verified 1W wire profile |
Both io_device_type and the class:<device_type> form of linked_remotes accept these named values:
| Name | Hex ID | Name | Hex ID |
|---|---|---|---|
| venetian_blind | 0x01 | on_off_switch | 0x0F |
| roller_shutter | 0x02 | horizontal_awning | 0x10 |
| awning | 0x03 | external_venetian_blind | 0x11 |
| window_opener | 0x04 | louvre_blind | 0x12 |
| garage_opener | 0x05 | curtain_track | 0x13 |
| light | 0x06 | intrusion_alarm | 0x17 |
| gate_opener | 0x07 | swinging_shutter | 0x18 |
| rolling_door_opener | 0x08 | ||
| lock | 0x09 | ||
| blind | 0x0A | ||
| screen | 0x0B | ||
| dual_shutter | 0x0D | ||
| heating_temperature_interface | 0x0E |
A device type not in this table can still be declared as a raw hex ID, in either place: io_device_type: 0x14 or linked_remotes: ["class:0x14"]. Named and raw-hex entries can be mixed freely within the same linked_remotes list.
Finding your device's type: the surest way is to pair it through Home Assistant and check the "Last Pairing Result" diagnostic sensor β its type= field reports the device's actual type name, e.g. type=awning. If you already know what the device is (say, a Somfy awning), use the matching name from the table above.
The manufacturer key on a 1W oneway_controllers: identity accepts these named values, the IO-Homecontrol alliance's own manufacturer IDs:
| Name | Hex ID | 1W profile | Name | Hex ID | 1W profile |
|---|---|---|---|---|---|
| velux | 0x01 | β | window_master | 0x07 | β |
| somfy | 0x02 | β | renson | 0x08 | β |
| honeywell | 0x03 | β | ciat | 0x09 | β |
| hormann | 0x04 | β | secuyou | 0x0A | β |
| assa_abloy | 0x05 | β | overkiz | 0x0B | β |
| niko | 0x06 | β | atlantic_group | 0x0C | β |
A manufacturer not in this table can still be declared as a raw hex ID, e.g. manufacturer: 0x0D.
1W profile marks the two vendors this project has a verified 1W CMD_EXECUTE wire profile for (the priority byte β somfy 0x43, velux 0x61). Any other value β named or raw β transmits with the somfy-shaped byte and, if it is an explicitly-set manufacturer on a transmitting identity, logs a build-time warning. Use execute_acei: to pin the byte yourself for an unprofiled vendor.
Four devices have enough evidence behind them to be worth a page of their own.
Somfy Izymo IO dimmer Somfy Sunea IO VELUX INTEGRA and the KLR/KLF/KUX family Somfy RS100 IO
A report is welcome whether the device worked or not β a clean failure is as useful as a success, and several rows above started as failures.
Open an issue with:
If the device is listed above with a status you can improve on β you got a π£ Reported row working, or you have a capture for a π row β that is worth an issue too. It is how rows move up.