|
Home IO Control
ESPHome add-on for IO-Homecontrol devices
|
IO-Homecontrol command IDs, result codes and protocol enumerations. More...
Go to the source code of this file.
Classes | |
| struct | esphome::home_io_control::TransferObject |
| One object a CMD_TRANSFER_OPEN can name: its class byte and its 16-bit id. More... | |
Namespaces | |
| namespace | esphome |
| namespace | esphome::home_io_control |
Functions | |
| constexpr uint8_t | esphome::home_io_control::fp_bitmap_bit (uint8_t fp) |
| Bit of functional parameter fp (1-16) in its bitmap: FPI1 holds FP1-FP8 and FPI2 FP9-FP16, each with the lowest-numbered parameter in bit 7. | |
| const char * | esphome::home_io_control::command_name (uint8_t cmd) |
| Get a human-readable name for any IO-Homecontrol command ID. | |
| const char * | esphome::home_io_control::manufacturer_name (uint8_t id) |
| Get a human-readable manufacturer name from the protocol manufacturer byte. | |
| const char * | esphome::home_io_control::originator_name (uint8_t originator) |
| Get a human-readable name for a command originator byte. | |
| const char * | esphome::home_io_control::acei_level_name (uint8_t level) |
| Get a human-readable name for an ACEI priority level (0–7). | |
| constexpr uint8_t | esphome::home_io_control::discovery_att_class (uint8_t flags) |
| Extract the ATT class field from a discovery response's Multi Information Byte. | |
| constexpr uint32_t | esphome::home_io_control::att_class_ms (uint8_t att_class) |
| Turnaround time of an ATT class in milliseconds: 5, 10, 20 or 40 (each class doubles it). | |
| uint8_t | esphome::home_io_control::discovery_power_save_mode (uint8_t flags) |
| Extract the power save mode field from a discovery response's Multi Information Byte. | |
| const char * | esphome::home_io_control::att_class_name (uint8_t att_class) |
| Get a human-readable turnaround time string for an ATT class value. | |
| const char * | esphome::home_io_control::power_save_mode_name (uint8_t mode) |
| Get a human-readable power save mode name. | |
| constexpr uint8_t | esphome::home_io_control::error_resp_code (uint8_t result) |
| Result code (bits [7:3]) of a CMD_ERROR_RESP byte. | |
| constexpr uint8_t | esphome::home_io_control::error_resp_state (uint8_t result) |
| Execution state (bits [2:0]) of a CMD_ERROR_RESP byte. | |
| const char * | esphome::home_io_control::command_result_name (uint8_t result) |
| Return a stable symbolic name for a CMD_ERROR_RESP result code. | |
| const char * | esphome::home_io_control::command_result_description (uint8_t result) |
| Return a human-readable explanation for a CMD_ERROR_RESP result code. | |
| constexpr bool | esphome::home_io_control::command_result_is_transient (uint8_t result) |
| Check whether a result code describes one exchange rather than the device's state. | |
| bool | esphome::home_io_control::is_limitation_result (uint8_t result) |
| Check whether a result code represents an environmental or control limitation. | |
Variables | |
| static constexpr uint8_t | esphome::home_io_control::CMD_EXECUTE = 0x00 |
| Set position/open/close/stop — requires authentication. | |
| static constexpr uint8_t | esphome::home_io_control::CMD_ACTIVATE_MODE = 0x01 |
| Activate device mode (scene, ventilation) — requires auth. | |
| static constexpr uint8_t | esphome::home_io_control::CMD_PRIVATE = 0x03 |
| Get device status — no authentication needed. | |
| static constexpr uint8_t | esphome::home_io_control::CMD_PRIVATE_RESP = 0x04 |
| Response to 0x00 and 0x03 (contains position data). | |
| static constexpr uint8_t | esphome::home_io_control::CMD_PRIVATE2 |
| Content otherwise undecoded by the wire parser. | |
| static constexpr uint8_t | esphome::home_io_control::CMD_PRIVATE2_RESP = 0x0D |
| Response to CMD_PRIVATE2. See CMD_PRIVATE2's comment. | |
| static constexpr uint8_t | esphome::home_io_control::CMD_PRIORITY_LEVEL_REQ |
| Priority-level (lock) query: a one-byte priority level in, the device's lock state for that level out (CMD_PRIORITY_LEVEL_RESP). | |
| static constexpr uint8_t | esphome::home_io_control::CMD_PRIORITY_LEVEL_RESP = 0x1A |
| Reply to CMD_PRIORITY_LEVEL_REQ. | |
| static constexpr uint8_t | esphome::home_io_control::CMD_IDENTIFY = 0x1E |
| Device physical identification / jog — requires authentication. | |
| static constexpr uint8_t | esphome::home_io_control::CMD_WRITE_PRIVATE = 0x20 |
| Write private register (climate/heating devices). | |
| static constexpr uint8_t | esphome::home_io_control::CMD_WRITE_PRIVATE_ACK = 0x21 |
| Acknowledgment to CMD_WRITE_PRIVATE. | |
| static constexpr uint8_t | esphome::home_io_control::CMD_LIMITATION_STATUS_REQ |
| Limitation read: asks a device for its resulting minimum or maximum position limit, the value a protective function such as rain protection imposes (CMD_LIMITATION_STATUS_RESP). | |
| static constexpr uint8_t | esphome::home_io_control::CMD_LIMITATION_STATUS_RESP |
| Reply to CMD_LIMITATION_STATUS_REQ. | |
| static constexpr uint8_t | esphome::home_io_control::CMD_DISCOVER_REQ = 0x28 |
| Broadcast discovery request. | |
| static constexpr uint8_t | esphome::home_io_control::CMD_DISCOVER_RESP = 0x29 |
| Device responds with its ID and type. | |
| static constexpr uint8_t | esphome::home_io_control::CMD_DISCOVER_SPE_REQ |
| Broadcast roll-call answered by every device that already holds this controller's system key, regardless of device type. | |
| static constexpr uint8_t | esphome::home_io_control::CMD_DISCOVER_SPE_RESP |
| Roll-call reply to CMD_DISCOVER_SPE_REQ, sent only by devices that already hold the requesting controller's system key. | |
| static constexpr uint8_t | esphome::home_io_control::CMD_DISCOVER_CONFIRM = 0x2C |
| Confirm discovery to device. | |
| static constexpr uint8_t | esphome::home_io_control::CMD_DISCOVER_CONFIRM_ACK = 0x2D |
| Device acknowledges confirmation. | |
| static constexpr uint8_t | esphome::home_io_control::CMD_DISCOVER_ALT_REQ |
| Alternate discovery. | |
| static constexpr uint8_t | esphome::home_io_control::CMD_DISCOVER_ALT_RESP |
| Reply to an addressed (non-broadcast) CMD_DISCOVER_ALT_REQ, following a 0x3C/0x3D challenge-response. | |
| static constexpr uint8_t | esphome::home_io_control::CMD_ONEWAY_ADD_CONTROLLER |
| 1W "add controller" — a 1W device broadcasts this while its key-copy gesture is active, handing its network's wrapped system key to whichever controller is listening. | |
| static constexpr uint8_t | esphome::home_io_control::CMD_ONEWAY_REMOVE = 0x39 |
| 1W "remove controller" (un-pair a 1W remote from a device); same payload shape as 0x2E. | |
| static constexpr uint8_t | esphome::home_io_control::CMD_KEY_INIT = 0x31 |
| Initiate key transfer to device. | |
| static constexpr uint8_t | esphome::home_io_control::CMD_KEY_TRANSFER = 0x32 |
| Send encrypted system key to device. | |
| static constexpr uint8_t | esphome::home_io_control::CMD_KEY_CONFIRM = 0x33 |
| Device confirms key was received. | |
| static constexpr uint8_t | esphome::home_io_control::CMD_NODE_VERIFY_REQ |
| Node verification request: a controller checks that a node belongs to its system. | |
| static constexpr uint8_t | esphome::home_io_control::CMD_NODE_VERIFY_RESP |
| Node verification response: the device returns its own 3-byte backbone address, byte-identical to the one it reported at data[2..4] (DISCOVERY_RESP_BACKBONE_OFFSET) of its CMD_DISCOVER_RESP earlier in the same session — an independent confirmation of that offset. | |
| static constexpr uint8_t | esphome::home_io_control::CMD_LAUNCH_KEY_TRANSFER |
| Key transfer request ("pull"): a controller asks a device for its system key. | |
| static constexpr uint8_t | esphome::home_io_control::CMD_CHALLENGE_REQ |
| 6-byte random challenge. | |
| static constexpr uint8_t | esphome::home_io_control::CMD_CHALLENGE_RESP |
| HMAC proof answering a 0x3C. | |
| static constexpr uint8_t | esphome::home_io_control::CMD_TRANSFER_OPEN |
| Opens a read of one object: nine payload bytes <originator> <class> 00 <id hi> <id lo>
< 00 00 00 00. | |
| static constexpr uint8_t | esphome::home_io_control::CMD_TRANSFER_OPEN_RESP |
| Answer to CMD_TRANSFER_OPEN: <handle> <status> <length u16 BE>. | |
| static constexpr uint8_t | esphome::home_io_control::CMD_UNKNOWN4A_REQ |
| Reads chunk <handle><chunk u16> of a buffer opened by CMD_TRANSFER_OPEN, counting down from ceil(length/18) to 1, then <handle> 00 00 closes it. | |
| static constexpr uint8_t | esphome::home_io_control::CMD_UNKNOWN4A_RESP |
| Echoes <handle><chunk> followed by up to 18 bytes of data (none in the close echo). | |
| static constexpr TransferObject | esphome::home_io_control::TRANSFER_READABLE_OBJECTS [] |
| Every object the read_object probe can open, in probe-index order (ADR 0062). | |
| static constexpr uint8_t | esphome::home_io_control::TRANSFER_READABLE_OBJECT_COUNT |
| Number of entries in TRANSFER_READABLE_OBJECTS. | |
| static constexpr uint8_t | esphome::home_io_control::CMD_GET_NAME = 0x50 |
| Request device name. | |
| static constexpr uint8_t | esphome::home_io_control::CMD_GET_NAME_RESP = 0x51 |
| Device name response. | |
| static constexpr uint8_t | esphome::home_io_control::CMD_SET_NAME = 0x52 |
| Set device name (authenticated). | |
| static constexpr uint8_t | esphome::home_io_control::CMD_SET_NAME_RESP = 0x53 |
| Device-name write response. | |
| static constexpr uint8_t | esphome::home_io_control::CMD_GET_INFO1 |
| Request device general info 1. | |
| static constexpr uint8_t | esphome::home_io_control::CMD_GET_INFO1_RESP |
| Device general info 1 response. | |
| static constexpr uint8_t | esphome::home_io_control::CMD_GET_INFO2 = 0x56 |
| Request device type/model info. | |
| static constexpr uint8_t | esphome::home_io_control::CMD_GET_INFO2_RESP = 0x57 |
| Device type/model response. | |
| static constexpr uint8_t | esphome::home_io_control::CMD_GET_GENERAL_INFO3 |
| Observed on the wire (tests/corpus/captures/probe/velux_kig300_probe_capability_burst.yaml) with no payload. | |
| static constexpr uint8_t | esphome::home_io_control::CMD_GET_GENERAL_INFO3_RESP |
| Never captured on our own wire. | |
| static constexpr uint8_t | esphome::home_io_control::CMD_SET_CONFIG1 = 0x6F |
| Configure device to auto-send status updates. | |
| static constexpr uint8_t | esphome::home_io_control::CMD_SET_CONFIG1_RESP |
| Config response; meaning undecoded, never captured. | |
| static constexpr uint8_t | esphome::home_io_control::CMD_SUBSCRIBE_EVENT |
| Subscribe a device to one event: payload <action> <event hi> <event lo>, action EVENT_SUBSCRIPTION_SUBSCRIBE or EVENT_SUBSCRIPTION_UNSUBSCRIBE. | |
| static constexpr uint8_t | esphome::home_io_control::CMD_STATUS_UPDATE = 0x71 |
| Device status update, sent by the device on its own (authenticated, acknowledged with CMD_STATUS_UPDATE_RESP) or as the answer to a CMD_SUBSCRIBE_EVENT. | |
| static constexpr uint8_t | esphome::home_io_control::CMD_STATUS_UPDATE_RESP = 0x72 |
| Acknowledge status update. | |
| static constexpr uint8_t | esphome::home_io_control::SUBSCRIBE_EVENT_DATA_SIZE = 3 |
| CMD_SUBSCRIBE_EVENT payload size: the action byte and the big-endian event id. | |
| static constexpr uint16_t | esphome::home_io_control::EVENT_STATUS_CHANGE = 0x100A |
| The event a position-bearing CMD_STATUS_UPDATE carries (every captured one, e.g. | |
| static constexpr uint8_t | esphome::home_io_control::CMD_SEND_RAW_MESSAGE |
| Named "Send Raw Message" / "Find Hardware" — two candidate names, neither settled. | |
| static constexpr uint8_t | esphome::home_io_control::CMD_READ_GROUPS |
| Named "Actuator: Read Groups" / "ActuatorAnyConfigIsLocal" (uncertain) / "Service
ACK" — three candidate names, one itself flagged uncertain. | |
| static constexpr uint8_t | esphome::home_io_control::CMD_REBOOT |
| Named "Reboot" / "Service Status" — two candidate names, one of them destructive-sounding, on no field evidence at all. | |
| static constexpr uint8_t | esphome::home_io_control::CMD_SERVICE_STATUS_ACK = 0xF3 |
| No description available at all for this opcode, not even a hedge. | |
| static constexpr uint8_t | esphome::home_io_control::CMD_ERROR_RESP = 0xFE |
| Error response to any command. | |
| static constexpr uint8_t | esphome::home_io_control::ERROR_RESP_CODE_SHIFT = 3 |
| Result code sits in bits [7:3] of the 0xFE byte. | |
| static constexpr uint8_t | esphome::home_io_control::ERROR_RESP_STATE_MASK = 0x07 |
| Execution state sits in bits [2:0] of the 0xFE byte. | |
| static constexpr uint8_t | esphome::home_io_control::ERROR_RESP_CODE_MAX = 0x11 |
| Highest named result code (17, "already configured"). | |
| static constexpr uint8_t | esphome::home_io_control::RESULT_UNKNOWN_STATUS_REPLY = 0x00 |
| Device returned an unknown status reply. | |
| static constexpr uint8_t | esphome::home_io_control::RESULT_COMMAND_COMPLETED_OK = 0x01 |
| No errors detected. | |
| static constexpr uint8_t | esphome::home_io_control::RESULT_NO_CONTACT = 0x02 |
| No communication to node. | |
| static constexpr uint8_t | esphome::home_io_control::RESULT_MANUALLY_OPERATED = 0x03 |
| Manually operated by a user. | |
| static constexpr uint8_t | esphome::home_io_control::RESULT_BLOCKED = 0x04 |
| Node blocked by an object. | |
| static constexpr uint8_t | esphome::home_io_control::RESULT_WRONG_SYSTEMKEY = 0x05 |
| Node contains the wrong system key. | |
| static constexpr uint8_t | esphome::home_io_control::RESULT_PRIORITY_LEVEL_LOCKED = 0x06 |
| Node is locked on this priority level. | |
| static constexpr uint8_t | esphome::home_io_control::RESULT_REACHED_WRONG_POSITION = 0x07 |
| Node stopped in another position than expected. | |
| static constexpr uint8_t | esphome::home_io_control::RESULT_NO_EXECUTION = 0x09 |
| Node did not move. | |
| static constexpr uint8_t | esphome::home_io_control::RESULT_CALIBRATING = 0x0A |
| Node is calibrating. | |
| static constexpr uint8_t | esphome::home_io_control::RESULT_POWER_CONSUMPTION_TOO_HIGH = 0x0B |
| Node power consumption is too high. | |
| static constexpr uint8_t | esphome::home_io_control::RESULT_POWER_CONSUMPTION_TOO_LOW = 0x0C |
| Node power consumption is too low. | |
| static constexpr uint8_t | esphome::home_io_control::RESULT_LOCK_POSITION_OPEN = 0x0D |
| Lock command failed because the door is open. | |
| static constexpr uint8_t | esphome::home_io_control::RESULT_MOTION_TIME_TOO_LONG = 0x0E |
| Target was not reached in time. | |
| static constexpr uint8_t | esphome::home_io_control::RESULT_THERMAL_PROTECTION = 0x0F |
| Node entered thermal protection mode. | |
| static constexpr uint8_t | esphome::home_io_control::RESULT_FILTER_MAINTENANCE_NEEDED = 0x11 |
| Filter needs maintenance. | |
| static constexpr uint8_t | esphome::home_io_control::RESULT_BATTERY_LEVEL = 0x12 |
| Battery level is low. | |
| static constexpr uint8_t | esphome::home_io_control::RESULT_TARGET_MODIFIED = 0x13 |
| Node modified the requested target value. | |
| static constexpr uint8_t | esphome::home_io_control::RESULT_MODE_NOT_IMPLEMENTED = 0x14 |
| Mode is not supported by the node. | |
| static constexpr uint8_t | esphome::home_io_control::RESULT_COMMAND_INCOMPATIBLE_TO_MOVEMENT = 0x15 |
| Command cannot move the node that way. | |
| static constexpr uint8_t | esphome::home_io_control::RESULT_USER_ACTION = 0x16 |
| User action overrode the command. | |
| static constexpr uint8_t | esphome::home_io_control::RESULT_DEAD_BOLT_ERROR = 0x17 |
| Dead bolt error. | |
| static constexpr uint8_t | esphome::home_io_control::RESULT_WRONG_LOAD_CONNECTED = 0x19 |
| Wrong load connected to node. | |
| static constexpr uint8_t | esphome::home_io_control::RESULT_COLOUR_NOT_REACHABLE = 0x1A |
| Requested colour not reachable. | |
| static constexpr uint8_t | esphome::home_io_control::RESULT_TARGET_NOT_REACHABLE = 0x1B |
| Requested target not reachable. | |
| static constexpr uint8_t | esphome::home_io_control::RESULT_BAD_INDEX_RECEIVED = 0x1C |
| Invalid index received. | |
| static constexpr uint8_t | esphome::home_io_control::RESULT_COMMAND_OVERRULED = 0x1D |
| Command was overruled by a newer command. | |
| static constexpr uint8_t | esphome::home_io_control::RESULT_NODE_WAITING_FOR_POWER = 0x1E |
| Node is waiting for power. | |
| static constexpr uint8_t | esphome::home_io_control::RESULT_WRONG_POSITION = 0x21 |
| Node reports wrong position. | |
| static constexpr uint8_t | esphome::home_io_control::RESULT_LIMITS_NOT_SET = 0x22 |
| Device limits are not set. | |
| static constexpr uint8_t | esphome::home_io_control::RESULT_IP_NOT_SET = 0x23 |
| Intermediate position is not set. | |
| static constexpr uint8_t | esphome::home_io_control::RESULT_OUT_OF_RANGE = 0x24 |
| Requested value is out of range. | |
| static constexpr uint8_t | esphome::home_io_control::RESULT_COMMAND_UNKNOWN = 0x08 |
| Code 1: the device does not offer this command in its current state or class. | |
| static constexpr uint8_t | esphome::home_io_control::RESULT_MODE_OR_STATE_UNKNOWN = 0x10 |
| Code 2: mode or state number unknown. | |
| static constexpr uint8_t | esphome::home_io_control::RESULT_BAD_MAC = 0x18 |
| Code 3: challenge answer (MAC) did not verify. | |
| static constexpr uint8_t | esphome::home_io_control::RESULT_SETUP_REQUIRED = 0x20 |
| Code 4: the device needs setting up first. | |
| static constexpr uint8_t | esphome::home_io_control::RESULT_PARAMETER_UNKNOWN = 0x28 |
| Code 5: parameter, alias, access method or scenario unknown. | |
| static constexpr uint8_t | esphome::home_io_control::RESULT_ORIGINATOR_DISABLED = 0x30 |
| Code 6: command originator disabled. | |
| static constexpr uint8_t | esphome::home_io_control::RESULT_PRIORITY_LOCKED = 0x38 |
| Code 7: priority locked; the command's priority level is too low to run. | |
| static constexpr uint8_t | esphome::home_io_control::RESULT_PRIORITY_SERVICE_NOT_SUPPORTED = 0x40 |
| Code 8: priority service not supported. | |
| static constexpr uint8_t | esphome::home_io_control::RESULT_PARAMETER_LIMITATION_ADJUSTMENT = 0x48 |
| Code 9: parameter limitation adjustment. | |
| static constexpr uint8_t | esphome::home_io_control::RESULT_PARAMETER_INCOHERENCE_ADJUSTMENT |
| Code 10: parameter incoherence adjustment. | |
| static constexpr uint8_t | esphome::home_io_control::RESULT_TOTAL_INCOHERENCE = 0x58 |
| Code 11: the request does not fit what the device implements. | |
| static constexpr uint8_t | esphome::home_io_control::RESULT_SERVICE_FULL = 0x60 |
| Code 12: service full. | |
| static constexpr uint8_t | esphome::home_io_control::RESULT_ALIAS_INCOHERENCE = 0x68 |
| Code 13: alias incoherence. | |
| static constexpr uint8_t | esphome::home_io_control::RESULT_SESSION_INTERRUPTED = 0x70 |
| Code 14: session interrupted. | |
| static constexpr uint8_t | esphome::home_io_control::RESULT_NOT_IMPLEMENTED = 0x78 |
| Code 15: not implemented. | |
| static constexpr uint8_t | esphome::home_io_control::RESULT_COMMAND_REJECTED = 0x80 |
| Code 16: command rejected. | |
| static constexpr uint8_t | esphome::home_io_control::RESULT_ALREADY_CONFIGURED = 0x88 |
| Code 17: already configured. | |
| static constexpr uint8_t | esphome::home_io_control::RESULT_INFORMATION_CODE = 0xDF |
| Information-only code with unknown semantics. | |
| static constexpr uint8_t | esphome::home_io_control::RESULT_PARAMETER_LIMITED = 0xE0 |
| Parameter limited by an unknown device. | |
| static constexpr uint8_t | esphome::home_io_control::RESULT_LIMITATION_BY_LOCAL_USER = 0xE1 |
| Parameter limited by local button. | |
| static constexpr uint8_t | esphome::home_io_control::RESULT_LIMITATION_BY_USER = 0xE2 |
| Parameter limited by a remote control. | |
| static constexpr uint8_t | esphome::home_io_control::RESULT_LIMITATION_BY_RAIN = 0xE3 |
| Parameter limited by a rain sensor. | |
| static constexpr uint8_t | esphome::home_io_control::RESULT_LIMITATION_BY_TIMER = 0xE4 |
| Parameter limited by a timer. | |
| static constexpr uint8_t | esphome::home_io_control::RESULT_LIMITATION_BY_SCD = 0xE5 |
| Parameter limited by a security actuator. | |
| static constexpr uint8_t | esphome::home_io_control::RESULT_LIMITATION_BY_UPS = 0xE6 |
| Parameter limited by a power supply. | |
| static constexpr uint8_t | esphome::home_io_control::RESULT_LIMITATION_BY_UNKNOWN_DEVICE = 0xE7 |
| Parameter limited by an unknown device. | |
| static constexpr uint8_t | esphome::home_io_control::RESULT_LIMITATION_BY_SAAC = 0xEA |
| Parameter limited by a standalone automatic controller. | |
| static constexpr uint8_t | esphome::home_io_control::RESULT_LIMITATION_BY_WIND = 0xEB |
| Parameter limited by a wind sensor. | |
| static constexpr uint8_t | esphome::home_io_control::RESULT_LIMITATION_BY_MYSELF = 0xEC |
| Parameter limited by the node itself. | |
| static constexpr uint8_t | esphome::home_io_control::RESULT_LIMITATION_BY_AUTOMATIC_CYCLE = 0xED |
| Parameter limited by an automatic cycle. | |
| static constexpr uint8_t | esphome::home_io_control::RESULT_LIMITATION_BY_EMERGENCY = 0xEE |
| Parameter limited by an emergency. | |
| static constexpr uint8_t | esphome::home_io_control::POS_STOP = 0xD2 |
| Position values in the IO protocol. | |
| static constexpr uint8_t | esphome::home_io_control::POS_UNKNOWN = 0xD4 |
| Wire value: position unknown / keep current. | |
| static constexpr uint8_t | esphome::home_io_control::POS_FAVORITE = 0xD8 |
| Wire value: move to favorite/"My" position. | |
| static constexpr uint16_t | esphome::home_io_control::MAIN_PARAMETER_KEEP = static_cast<uint16_t>(POS_UNKNOWN) << BITS_PER_BYTE |
| 16-bit main parameter D400 (POS_UNKNOWN in the high byte): keep the current value. | |
| static constexpr uint8_t | esphome::home_io_control::EXECUTE_MAIN_BYTE_OFFSET = 2 |
| Offset of the main position/command byte in a CMD_EXECUTE payload — after the originator (first byte) and the ACEI (second byte). | |
| static constexpr uint8_t | esphome::home_io_control::POS_SECURED_TARGET = 0xD1 |
| Wire value for the secured target position command. | |
| static constexpr uint8_t | esphome::home_io_control::POS_DEFAULT = 0xD3 |
| Wire value for the default position command. | |
| static constexpr uint8_t | esphome::home_io_control::POS_FORCE_OPEN = 0x64 |
| Ambiguous wire value used only for passive 1W-traffic intent decoding (decode_1w_main_intent() / oneway_intent_to_target() in proto_codecs.cpp). | |
| static constexpr uint8_t | esphome::home_io_control::POS_VENT_MODIFIER = 0x03 |
| Modifier byte for the ventilation command. | |
| static constexpr uint8_t | esphome::home_io_control::POS_PEDESTRIAN_MODIFIER = 0x07 |
| Modifier byte for the pedestrian-position command (POS_FAVORITE main byte, as for ventilation). | |
| static constexpr uint8_t | esphome::home_io_control::POS_PARTIAL_MODIFIER = 0x09 |
| Modifier byte for the partial-position command (POS_FAVORITE main byte, as for ventilation). | |
| static constexpr uint8_t | esphome::home_io_control::POSITION_WIRE_SCALE = 2 |
| Scale factor between a 0-100 percent position and its CMD_EXECUTE main-byte wire value. | |
| static constexpr uint8_t | esphome::home_io_control::POSITION_WIRE_MAX = 200 |
| Highest doubled-position wire value: 100% * POSITION_WIRE_SCALE. | |
| static constexpr uint8_t | esphome::home_io_control::STATUS_STOPPED = 0x01 |
| Status byte flags in CMD_PRIVATE_RESP and CMD_STATUS_UPDATE. | |
| static constexpr uint8_t | esphome::home_io_control::STATUS_EXPECTED = 0x80 |
| Byte 1 bit 7: device will send auto status update. | |
| static constexpr uint8_t | esphome::home_io_control::STATUS_BATTERY_MASK = 0x60 |
| Byte 1 bits 5-6: the device's coarse battery level (BatteryState). | |
| static constexpr uint8_t | esphome::home_io_control::STATUS_BATTERY_SHIFT = 5 |
| Right shift that brings STATUS_BATTERY_MASK down to 0-3. | |
| static constexpr uint8_t | esphome::home_io_control::STATUS_TILT_SELECTOR |
| Extended status payload marker for tilt-capable devices: FPI1 with bit 5 set = functional parameter FP3 (FPI1 bit 7 = FP1 ... bit 0 = FP8). | |
| static constexpr uint8_t | esphome::home_io_control::PRIVATE_GET_POSITION_STATUS = 0x03 |
| CMD_PRIVATE (0x03) function ID for a position-status request — data[0] of the payload. | |
| static constexpr uint8_t | esphome::home_io_control::TRANSFER_KEY [AES_KEY_SIZE] |
| The transfer key is a hardcoded key used ONLY during pairing to obfuscate the system key during over-the-air transfer. | |
| static constexpr uint16_t | esphome::home_io_control::CRC_POLYNOMIAL_REVERSED = 0x8408 |
| Reversed CRC-CCITT polynomial used by IO-homecontrol. | |
| static constexpr uint16_t | esphome::home_io_control::CRC_LSB_MASK = 0x0001 |
| Least-significant-bit mask for reflected CRC update. | |
| static constexpr uint8_t | esphome::home_io_control::BROADCAST_DISCOVER [NODE_ID_SIZE] = {0x00, 0x00, 0x3B} |
| Broadcast address for device discovery (0x00003B). | |
| static constexpr uint8_t | esphome::home_io_control::BROADCAST_DISCOVER_ALT [NODE_ID_SIZE] = {0x00, 0x00, 0x3F} |
| Alternate discovery / 1W broadcast address (0x00003F). | |
| static constexpr uint8_t | esphome::home_io_control::MANUFACTURER_ID_MAX = 12 |
| Maximum manufacturer ID with a known name in the lookup table. | |
| static constexpr uint8_t | esphome::home_io_control::ONEWAY_EXECUTE_ACEI |
| ACEI byte for a 1W CMD_EXECUTE frame — the Somfy-shaped default. | |
| static constexpr uint8_t | esphome::home_io_control::ONEWAY_EXECUTE_ACEI_VELUX = (ACEI_LEVEL_USER_DEFAULT << ACEI_LEVEL_SHIFT) | ACEI_VALID_BIT |
| ACEI byte for a 1W CMD_EXECUTE frame from a VELUX KLI-class remote. | |
| static constexpr uint32_t | esphome::home_io_control::ATT_CLASS_5MS_TURNAROUND_MS = 5 |
| Turnaround time of ATT_CLASS_5MS, the shortest class; att_class_ms() doubles it per class. | |
| static constexpr uint8_t | esphome::home_io_control::KEY_EXTRACTION_DISCOVER_RESP_FLAGS = 0xDD |
| Default Multi Information Byte for our device-role CMD_DISCOVER_RESP (0x29): the turnaround-time class and power-save mode the key-extraction responder advertises to a foreign hub. | |
| static constexpr uint16_t | esphome::home_io_control::KEY_EXTRACTION_DISCOVER_RESP_TYPE_WORD = 0x0080 |
| Default packed device type word (type in bits [15:6], subtype in bits [5:0]) the key-extraction responder advertises in its 0x29 to an open discovery: 0x0080, roller shutter subtype 0, the same word a real Somfy RS100 io sends (tests/corpus/captures/pairing/somfy_rs100_pairing_key_transfer_timeout.yaml). | |
Objects the <tt>read_object</tt> probe can open (CMD_TRANSFER_OPEN) | |
Object class 0 ids. Allowlisted: create_transfer_open() refuses every other id. The actuator capacity record a Somfy controller reads after pairing (protocol version 4 or higher).
| |
| static constexpr uint16_t | esphome::home_io_control::TRANSFER_OBJECT_ACTUATOR_CAPACITY = 0x8100 |
| static constexpr uint16_t | esphome::home_io_control::TRANSFER_OBJECT_ACTUATOR_STATE = 0x8103 |
| The actuator state record read beside the capacity record. | |
| static constexpr uint16_t | esphome::home_io_control::TRANSFER_OBJECT_NAME = 0x8003 |
| A 16-byte name record: on a Somfy Izymo dimmer 00 followed by the ASCII text "MODULE DIMMER" and zero padding, read behind an authenticated block read. | |
| static constexpr uint16_t | esphome::home_io_control::TRANSFER_OBJECT_GENERAL_INFO1 = 0x8001 |
| Two further class-0 records beside the name record. | |
| static constexpr uint16_t | esphome::home_io_control::TRANSFER_OBJECT_GENERAL_INFO2 = 0x8002 |
Data transport payload layout (CMD_TRANSFER_OPEN .. CMD_UNKNOWN4A_RESP) | |
| static constexpr uint8_t | esphome::home_io_control::TRANSFER_OPEN_DATA_SIZE = 9 |
| CMD_TRANSFER_OPEN payload bytes. | |
| static constexpr uint8_t | esphome::home_io_control::TRANSFER_OBJECT_CLASS_DEVICE = 0 |
| Object class of the TRANSFER_OBJECT_* ids. | |
| static constexpr uint8_t | esphome::home_io_control::TRANSFER_OBJECT_CLASS_SOMFY = 2 |
| Object class of the Somfy manufacturer objects in TRANSFER_READABLE_OBJECTS. | |
| static constexpr uint8_t | esphome::home_io_control::TRANSFER_OPEN_RESP_DATA_SIZE = 4 |
| CMD_TRANSFER_OPEN_RESP payload bytes. | |
| static constexpr uint8_t | esphome::home_io_control::TRANSFER_READ_REQ_DATA_SIZE = 3 |
| CMD_UNKNOWN4A_REQ payload bytes: handle + chunk. | |
| static constexpr uint8_t | esphome::home_io_control::TRANSFER_BLOCK_SIZE = 18 |
| Data bytes per CMD_UNKNOWN4A_RESP; 18 fills a 32-byte frame. | |
| static constexpr uint8_t | esphome::home_io_control::TRANSFER_STATUS_ACCEPTED = 0 |
| CMD_TRANSFER_OPEN_RESP status: request accepted. | |
| static constexpr uint8_t | esphome::home_io_control::TRANSFER_STATUS_ADAPTED = 1 |
| CMD_TRANSFER_OPEN_RESP status: accepted with changes. | |
| static constexpr uint8_t | esphome::home_io_control::TRANSFER_STATUS_NOTHING_TO_READ = 7 |
| CMD_TRANSFER_OPEN_RESP status 7 with length 0: nothing to send for this object. | |
| static constexpr uint16_t | esphome::home_io_control::TRANSFER_CHUNK_CLOSE = 0 |
| Chunk number of the closing CMD_UNKNOWN4A_REQ. | |
Subscription action (first CMD_SUBSCRIBE_EVENT payload byte) | |
| static constexpr uint8_t | esphome::home_io_control::EVENT_SUBSCRIPTION_SUBSCRIBE = 0x01 |
| Ask the device to report the event. | |
| static constexpr uint8_t | esphome::home_io_control::EVENT_SUBSCRIPTION_UNSUBSCRIBE = 0x00 |
| Ask the device to stop reporting the event. | |
Subscribable device events (CMD_SUBSCRIBE_EVENT payload) | |
The only two event ids the subscribe_event probe can send; create_subscribe_event() refuses every other id. A battery-powered device reports its charge level. An RS100 Solar io answered the subscription with this event and one data byte, 100, while its status byte read full (tests/corpus/captures/probe/somfy_rs100_probe_subscribe_event_battery_sx1262.yaml); see decode_battery_level_event().
| |
| static constexpr uint16_t | esphome::home_io_control::EVENT_BATTERY_LEVEL_CHANGE = 0x2001 |
| static constexpr uint16_t | esphome::home_io_control::EVENT_LOCAL_SENSOR = 0x2005 |
| A device reports a sensor built into it (sun, window, ...). | |
Event data of the subscribable events | |
Layouts captured from one RS100 Solar io (issue #156); a report of any other shape is not decoded. | |
| static constexpr uint8_t | esphome::home_io_control::LOCAL_SENSOR_EVENT_DATA_LEN = 5 |
| EVENT_LOCAL_SENSOR data: 06 xx <hi> <lo> yy. | |
| static constexpr uint8_t | esphome::home_io_control::LOCAL_SENSOR_TYPE_SUN = 0x06 |
| First EVENT_LOCAL_SENSOR data byte on every capture. | |
| static constexpr uint8_t | esphome::home_io_control::LOCAL_SENSOR_VALUE_OFFSET = 2 |
| Offset of the big-endian value inside the event data. | |
| static constexpr uint8_t | esphome::home_io_control::BATTERY_LEVEL_EVENT_DATA_LEN = 1 |
| EVENT_BATTERY_LEVEL_CHANGE data: one level byte. | |
| static constexpr uint8_t | esphome::home_io_control::BATTERY_LEVEL_MAX_PERCENT = 100 |
| Highest level read as a percentage. | |
CMD_PRIVATE status read of the main parameter plus functional parameters (MP + FP1-FP7) | |
The payload create_status_mp_fp_read() sends is a replay of the status read a VELUX KLF 200 gateway sends to its devices (KLF 200 API specification v3.18 §10.3.1.4: status type 1 = current position, FPI1 selecting FP1-FP7). The bytes are on-air evidence, not a decoded request: the reply layout is not interpreted by this codebase. | |
| static constexpr uint8_t | esphome::home_io_control::PRIVATE_STATUS_MP_FP = 0x01 |
| CMD_PRIVATE function ID at data[0]. | |
| static constexpr uint8_t | esphome::home_io_control::STATUS_MP_FP_FPI1_MASK = 0xFE |
| FPI1: FP1..FP7 requested (bit 7 = FP1 ... bit 1 = FP7). | |
| static constexpr uint8_t | esphome::home_io_control::STATUS_MP_FP_PARAM_TYPE = 0x01 |
| Status type per requested parameter: current value. | |
| static constexpr uint8_t | esphome::home_io_control::STATUS_MP_FP_PARAM_COUNT |
| Largest selection seen on air (FP1-FP7), kept as a conservative cap across both bitmaps. | |
| static constexpr uint8_t | esphome::home_io_control::STATUS_MP_FP_FPI2 |
| FPI2: no FP9-FP16 requested (bit 7 = FP9 ... bit 0 = FP16 otherwise). | |
| static constexpr uint8_t | esphome::home_io_control::MANUFACTURER_VELUX = 1 |
| IO-Homecontrol manufacturer ID constants. | |
| static constexpr uint8_t | esphome::home_io_control::MANUFACTURER_SOMFY = 2 |
| Somfy (shutters, awnings, blinds). | |
| static constexpr uint8_t | esphome::home_io_control::MANUFACTURER_HONEYWELL = 3 |
| Honeywell. | |
| static constexpr uint8_t | esphome::home_io_control::MANUFACTURER_HORMANN = 4 |
| Hörmann (garage doors, gates). | |
| static constexpr uint8_t | esphome::home_io_control::MANUFACTURER_ASSA_ABLOY = 5 |
| ASSA ABLOY (locks, access). | |
| static constexpr uint8_t | esphome::home_io_control::MANUFACTURER_NIKO = 6 |
| Niko (switches, home automation). | |
| static constexpr uint8_t | esphome::home_io_control::MANUFACTURER_WINDOW_MASTER = 7 |
| WINDOW MASTER (ventilation). | |
| static constexpr uint8_t | esphome::home_io_control::MANUFACTURER_RENSON = 8 |
| Renson (ventilation, sun protection). | |
| static constexpr uint8_t | esphome::home_io_control::MANUFACTURER_CIAT = 9 |
| CIAT (HVAC). | |
| static constexpr uint8_t | esphome::home_io_control::MANUFACTURER_SECUYOU = 10 |
| Secuyou (security). | |
| static constexpr uint8_t | esphome::home_io_control::MANUFACTURER_OVERKIZ = 11 |
| OVERKIZ (Somfy connectivity platform). | |
| static constexpr uint8_t | esphome::home_io_control::MANUFACTURER_ATLANTIC_GROUP = 12 |
| Atlantic Group (heating, hot water). | |
| static constexpr uint8_t | esphome::home_io_control::ORIGINATOR_LOCAL_USER = 0x00 |
| Command originator codes indicating what or who triggered a command. | |
| static constexpr uint8_t | esphome::home_io_control::ORIGINATOR_USER_REMOTE = 0x01 |
| User sent command from a remote control. | |
| static constexpr uint8_t | esphome::home_io_control::ORIGINATOR_RAIN_SENSOR = 0x02 |
| Rain sensor triggered the movement. | |
| static constexpr uint8_t | esphome::home_io_control::ORIGINATOR_TIMER = 0x03 |
| Timer or schedule triggered the movement. | |
| static constexpr uint8_t | esphome::home_io_control::ORIGINATOR_SECURITY = 0x04 |
| Security controlling device (SCD) action. | |
| static constexpr uint8_t | esphome::home_io_control::ORIGINATOR_UPS = 0x05 |
| Uninterruptible power supply action. | |
| static constexpr uint8_t | esphome::home_io_control::ORIGINATOR_SMART_CONTROLLER = 0x06 |
| Smart function controller. | |
| static constexpr uint8_t | esphome::home_io_control::ORIGINATOR_LIFESTYLE = 0x07 |
| Lifestyle scenario controller. | |
| static constexpr uint8_t | esphome::home_io_control::ORIGINATOR_SAAC = 0x08 |
| Stand-alone automatic controller (SAAC). | |
| static constexpr uint8_t | esphome::home_io_control::ORIGINATOR_WIND_SENSOR = 0x09 |
| Wind sensor triggered the movement. | |
| static constexpr uint8_t | esphome::home_io_control::ORIGINATOR_LOAD_SHEDDING = 0x0B |
| Load-shedding manager. | |
| static constexpr uint8_t | esphome::home_io_control::ORIGINATOR_LOCAL_LIGHT = 0x0C |
| Local light sensor. | |
| static constexpr uint8_t | esphome::home_io_control::ORIGINATOR_ENVIRONMENT = 0x0D |
| Unspecified environment sensor. | |
| static constexpr uint8_t | esphome::home_io_control::ORIGINATOR_MYSELF = 0x10 |
| Actuator decided to move by itself. | |
| static constexpr uint8_t | esphome::home_io_control::ORIGINATOR_AUTOMATIC_CYCLE = 0xFE |
| Automatic cycle / external access. | |
| static constexpr uint8_t | esphome::home_io_control::ORIGINATOR_EMERGENCY = 0xFF |
| Emergency command (never disabled). | |
| static constexpr uint8_t | esphome::home_io_control::ACEI_VALID_BIT = 0x01 |
| ACEI byte bit-field definitions. | |
| static constexpr uint8_t | esphome::home_io_control::ACEI_EXTENDED_MASK = 0x06 |
| Bits [2:1]: extended field. | |
| static constexpr uint8_t | esphome::home_io_control::ACEI_EXTENDED_SHIFT = 1 |
| Shift for extended field extraction. | |
| static constexpr uint8_t | esphome::home_io_control::ACEI_SERVICE_MASK = 0x18 |
| Bits [4:3]: service type. | |
| static constexpr uint8_t | esphome::home_io_control::ACEI_SERVICE_SHIFT = 3 |
| Shift for service field extraction. | |
| static constexpr uint8_t | esphome::home_io_control::ACEI_LEVEL_MASK = 0xE0 |
| Bits [7:5]: priority level (0–7). | |
| static constexpr uint8_t | esphome::home_io_control::ACEI_LEVEL_SHIFT = 5 |
| Shift for priority level extraction. | |
| static constexpr uint8_t | esphome::home_io_control::ACEI_LEVEL_PROTECTION_HUMAN = 0 |
| ACEI priority level values (0–7). | |
| static constexpr uint8_t | esphome::home_io_control::ACEI_LEVEL_PROTECTION_SENSOR = 1 |
| Goods/environment protection via sensors. | |
| static constexpr uint8_t | esphome::home_io_control::ACEI_LEVEL_USER_HIGH = 2 |
| High-priority user controller. | |
| static constexpr uint8_t | esphome::home_io_control::ACEI_LEVEL_USER_DEFAULT = 3 |
| Default remote controller priority. | |
| static constexpr uint8_t | esphome::home_io_control::ACEI_LEVEL_COMFORT_1 = 4 |
| Comfort automation level 1. | |
| static constexpr uint8_t | esphome::home_io_control::ACEI_LEVEL_COMFORT_2 = 5 |
| Comfort automation level 2. | |
| static constexpr uint8_t | esphome::home_io_control::ACEI_LEVEL_AUTO_SAAC = 6 |
| Stand-alone automatic controller. | |
| static constexpr uint8_t | esphome::home_io_control::ACEI_LEVEL_AUTO_DEFAULT = 7 |
| Default automatic level (lowest). | |
| static constexpr uint8_t | esphome::home_io_control::DISCOVERY_RESP_BACKBONE_OFFSET = 2 |
| Byte offsets within CMD_DISCOVER_RESP (0x29) payload data. | |
| static constexpr uint8_t | esphome::home_io_control::DISCOVERY_RESP_MANUFACTURER_OFFSET = 5 |
| Manufacturer ID at data[5]. | |
| static constexpr uint8_t | esphome::home_io_control::DISCOVERY_RESP_FLAGS_OFFSET = 6 |
| Flags byte at data[6]. | |
| static constexpr uint8_t | esphome::home_io_control::DISCOVERY_RESP_TIMESTAMP_OFFSET = 7 |
| Timestamp starts at data[7] (2 bytes). | |
| static constexpr uint8_t | esphome::home_io_control::DISCOVERY_RESP_FULL_SIZE = 9 |
| Full discovery response payload size. | |
| static constexpr uint8_t | esphome::home_io_control::DISCOVERY_FLAGS_ATT_MASK = 0xC0 |
| Bit masks and shifts for the Multi Information Byte fields. | |
| static constexpr uint8_t | esphome::home_io_control::DISCOVERY_FLAGS_ATT_SHIFT = 6 |
| Shift for ATT field extraction. | |
| static constexpr uint8_t | esphome::home_io_control::DISCOVERY_FLAGS_SYNC_CTRL_GRP = 0x20 |
| Bit 5: supports sync control group. | |
| static constexpr uint8_t | esphome::home_io_control::DISCOVERY_FLAGS_RF_SUPPORT |
| Bit 3: 1 = the node has its own RF, 0 = it sits on a wired backbone only (VELUX KLF 200 API v3.18 §7.4.1.2.4-7, Table 52). | |
| static constexpr uint8_t | esphome::home_io_control::DISCOVERY_FLAGS_IO_MEMBERSHIP |
| Bit 2: io-homecontrol membership; always 1 (same table). | |
| static constexpr uint8_t | esphome::home_io_control::DISCOVERY_FLAGS_POWER_SAVE_MASK = 0x03 |
| Bits [1:0]: power save mode. | |
| static constexpr uint8_t | esphome::home_io_control::ATT_CLASS_5MS = 0 |
| Actuator Turnaround Time (ATT) class values. | |
| static constexpr uint8_t | esphome::home_io_control::ATT_CLASS_10MS = 1 |
| Response within 10 ms. | |
| static constexpr uint8_t | esphome::home_io_control::ATT_CLASS_20MS = 2 |
| Response within 20 ms. | |
| static constexpr uint8_t | esphome::home_io_control::ATT_CLASS_40MS = 3 |
| Response within 40 ms. | |
| static constexpr uint8_t | esphome::home_io_control::POWER_SAVE_ALWAYS_ALIVE = 0 |
| Power save mode values from the Multi Information Byte. | |
| static constexpr uint8_t | esphome::home_io_control::POWER_SAVE_LOW_POWER = 1 |
| Device sleeps — needs long preamble to wake. | |
Limitation read (CMD_LIMITATION_STATUS_REQ / CMD_LIMITATION_STATUS_RESP) | |
The layout is a hypothesis built from frames a VELUX KLF 200 was heard sending (issue #98) and the KLF 200 API specification v3.18, section 10.5 (get limitation: parameter id and limitation type, 0 = resulting minimum, 1 = resulting maximum). Confirm it against a reply captured under an active limitation before building on it. | |
| enum class | esphome::home_io_control::LimitationType : uint8_t { esphome::home_io_control::MINIMUM = 0x80 , esphome::home_io_control::MAXIMUM = 0xC0 } |
| On-air selector byte (request data[0]) choosing which resulting limit to read. More... | |
| static constexpr uint8_t | esphome::home_io_control::LIMITATION_PARAM_MP = 0x00 |
| Parameter id of the main parameter. | |
| static constexpr uint8_t | esphome::home_io_control::LIMITATION_PARAM_FP_FIRST = 1 |
| Parameter id of FP1. | |
| static constexpr uint8_t | esphome::home_io_control::LIMITATION_PARAM_FP_LAST = 16 |
| Parameter id of FP16. | |
| static constexpr uint8_t | esphome::home_io_control::LIMITATION_REQ_DATA_SIZE = 3 |
| Request data: selector, parameter id, 0x00. | |
| static constexpr uint8_t | esphome::home_io_control::LIMITATION_RESP_DATA_SIZE = 5 |
| Reply data: parameter id, value (2), originator, time. | |
| static constexpr uint8_t | esphome::home_io_control::LIMITATION_TIME_MAX_COUNTED = 252 |
| Remaining-time codes of a limitation reply's last byte (KLF 200 API specification v3.18, table 200): codes 0-252 count (n + 1) * 30 seconds, 253 means no time limit, and 254/255 are the timer values the set command uses to delete an entry (never a duration). | |
| static constexpr uint8_t | esphome::home_io_control::LIMITATION_TIME_UNLIMITED = 253 |
| Limitation without a time limit. | |
| static constexpr uint32_t | esphome::home_io_control::LIMITATION_TIME_STEP_S = 30 |
| Seconds per time-code step. | |
IO-Homecontrol command IDs, result codes and protocol enumerations.
Command bytes, CMD_ERROR_RESP result codes, wire position/status flags, cryptographic constants, and the manufacturer/originator/ACEI/discovery lookups. These describe what travels on the wire, independent of the frame container (proto_frame.h) and the device model (proto_device_model.h).
Definition in file proto_constants.h.