Home IO Control
ESPHome add-on for IO-Homecontrol devices
Loading...
Searching...
No Matches
proto_device_model.h File Reference

IO-Homecontrol device-type model, capabilities and runtime device state. More...

#include "proto_heating.h"
#include "proto_sizes.h"
#include <cstdint>
#include <string>
Include dependency graph for proto_device_model.h:
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Classes

struct  esphome::home_io_control::OptimisticState
 What the hub predicted ahead of confirmation, kept apart from what the device reported. More...
struct  esphome::home_io_control::IoDevice
 Runtime state of a paired IO‑Homecontrol device. More...

Namespaces

namespace  esphome
namespace  esphome::home_io_control

Enumerations

enum class  esphome::home_io_control::DeviceType : uint16_t {
  esphome::home_io_control::UNKNOWN = 0 , esphome::home_io_control::INTERIOR_VENETIAN_BLIND = 1 , esphome::home_io_control::ROLLER_SHUTTER = 2 , esphome::home_io_control::VERTICAL_EXTERIOR_AWNING = 3 ,
  esphome::home_io_control::WINDOW_OPENER = 4 , esphome::home_io_control::GARAGE_OPENER = 5 , esphome::home_io_control::LIGHT = 6 , esphome::home_io_control::GATE_OPENER = 7 ,
  esphome::home_io_control::ROLLING_DOOR_OPENER = 8 , esphome::home_io_control::LOCK = 9 , esphome::home_io_control::VERTICAL_INTERIOR_BLIND = 10 , esphome::home_io_control::SECURE_CONFIGURATION_DEVICE = 11 ,
  esphome::home_io_control::BEACON = 12 , esphome::home_io_control::DUAL_ROLLER_SHUTTER = 13 , esphome::home_io_control::HEATING_TEMPERATURE_INTERFACE = 14 , esphome::home_io_control::ON_OFF_SWITCH = 15 ,
  esphome::home_io_control::HORIZONTAL_AWNING = 16 , esphome::home_io_control::EXTERIOR_VENETIAN_BLIND = 17 , esphome::home_io_control::LOUVRE_BLIND = 18 , esphome::home_io_control::CURTAIN_TRACK = 19 ,
  esphome::home_io_control::VENTILATION_POINT = 20 , esphome::home_io_control::EXTERIOR_HEATING = 21 , esphome::home_io_control::HEAT_PUMP = 22 , esphome::home_io_control::INTRUSION_ALARM = 23 ,
  esphome::home_io_control::SWINGING_SHUTTER = 24 , esphome::home_io_control::SLIDING_WINDOW = 27 , esphome::home_io_control::ZONE_CONTROL = 28 , esphome::home_io_control::BIOCLIMATIC_PERGOLA = 29 ,
  esphome::home_io_control::SIREN = 30 , esphome::home_io_control::DOMESTIC_HOT_WATER = 51 , esphome::home_io_control::ELECTRICAL_HEATER = 52 , esphome::home_io_control::HEAT_RECOVERY_VENTILATION = 53 ,
  esphome::home_io_control::CENTRAL_HOUSE_CONTROL = 255 , esphome::home_io_control::TEST_AND_EVALUATION = 1008 , esphome::home_io_control::REMOTE_CONTROLLER = 1023
}
 IO-Homecontrol node types. More...
enum class  esphome::home_io_control::DeviceCapabilityClass : uint8_t {
  esphome::home_io_control::UNKNOWN = 0x00 , esphome::home_io_control::COVER = 0x01 , esphome::home_io_control::LIGHT = 0x02 , esphome::home_io_control::SWITCH = 0x03 ,
  esphome::home_io_control::SENSOR = 0x04 , esphome::home_io_control::BEACON = 0x05 , esphome::home_io_control::CLIMATE = 0x06 , esphome::home_io_control::LOCK = 0x07 ,
  esphome::home_io_control::HEATER_LEVEL = 0x08
}
 High‑level capability class derived from DeviceType. More...
enum class  esphome::home_io_control::CoverCommand : uint8_t { esphome::home_io_control::STOP = 0 , esphome::home_io_control::FAVORITE = 1 , esphome::home_io_control::VENT = 2 , esphome::home_io_control::FORCE_OPEN = 3 }
 Named device commands for cover-type actuators. More...
enum class  esphome::home_io_control::RainSensorState : uint8_t { esphome::home_io_control::UNKNOWN = 0 , esphome::home_io_control::DRY = 1 , esphome::home_io_control::RAIN = 2 }
 What the hub's latest minimum-limitation read says about a rain-protection limit. More...
enum class  esphome::home_io_control::BatteryState : uint8_t { esphome::home_io_control::NOT_REPORTED = 0 , esphome::home_io_control::LOW_CHARGE = 1 , esphome::home_io_control::NORMAL_CHARGE = 2 , esphome::home_io_control::FULL_CHARGE = 3 }
 A device's coarse battery level, as it reports it in byte 1 of its status payload. More...

Functions

const char * esphome::home_io_control::device_type_name (DeviceType type)
 Convert a DeviceType to a lowercase string identifier.
bool esphome::home_io_control::is_known_device_type (uint16_t raw)
 True when a raw 10-bit device-type value is a named DeviceType enumerator.
const char * esphome::home_io_control::yaml_device_type_name (DeviceType type)
 Return the YAML-friendly device-type name for types exposed in the Python schema.
DeviceCapabilityClass esphome::home_io_control::device_capability_class (DeviceType type)
 Map a raw IO‑Homecontrol type to the closest ESPHome/Home Assistant entity family.
const char * esphome::home_io_control::device_capability_class_name (DeviceType type)
 Get a human‑readable name for a capability class.
bool esphome::home_io_control::device_supports_position_control (DeviceType type)
 Does this device type support precise position control (0–100)?
bool esphome::home_io_control::device_supports_binary_control (DeviceType type)
 Does this device type support binary on/off control?
bool esphome::home_io_control::device_supports_status_requests (DeviceType type)
 Does this device type support status request commands (0x03)?
bool esphome::home_io_control::device_supports_lock_control (DeviceType type)
 Does this device type support binary lock/unlock control via execute commands?
bool esphome::home_io_control::device_supports_heat_level_control (DeviceType type)
 Does this device take a heat level as its position (exterior heating)?
bool esphome::home_io_control::device_has_no_motion (DeviceType type, uint8_t subtype)
 Does this device never move, so a status reply must not start the movement settle loop?
bool esphome::home_io_control::device_supports_climate_control (DeviceType type, uint8_t subtype)
 Can a climate entity drive this device?
bool esphome::home_io_control::device_supports_tilt (DeviceType type)
 Does this device type support tilt (slat angle) control?
bool esphome::home_io_control::device_supports_vent (DeviceType type)
 Does this device type support the ventilation position command?
bool esphome::home_io_control::device_takes_main_parameter_only (DeviceType type, uint8_t subtype)
 Does this device take movement commands as the main parameter only?
DeviceType esphome::home_io_control::decode_packed_device_type (uint8_t type_msb, uint8_t type_subtype)
 Decode the 10-bit node type from two packed metadata bytes.
uint8_t esphome::home_io_control::decode_packed_device_subtype (uint8_t type_subtype)
 Decode a protocol-packed device subtype from the second metadata byte.
void esphome::home_io_control::encode_packed_device_type (DeviceType type, uint8_t subtype, uint8_t &type_msb, uint8_t &type_subtype)
 Encode a DeviceType/subtype pair into the two-byte packed metadata format used by discovery responses — the inverse of decode_packed_device_type()/decode_packed_device_subtype().
const char * esphome::home_io_control::device_operation_profile_name (DeviceType type)
 Human‑readable operation profile name for a device type.
std::string esphome::home_io_control::format_device_type_diagnostic (DeviceType type)
 Human-readable device type string for diagnostics, including the raw numeric value.
std::string esphome::home_io_control::format_device_type_for_yaml (DeviceType type)
 Build the YAML value for a device's io_device_type key.
std::string esphome::home_io_control::build_device_yaml_snippet (DeviceType type, uint8_t subtype, const std::string &device_id, bool metadata_complete, bool inverted, bool low_power, const std::string &system_key_hex=std::string())
 Build the ready-to-paste YAML block describing a device, for both a fully-decoded device and one whose type/subtype wasn't reported.
const char * esphome::home_io_control::cover_command_name (CoverCommand cmd)
 Get a human-readable name for a CoverCommand.
const char * esphome::home_io_control::rain_sensor_state_name (RainSensorState state)
 Get a human-readable name for a RainSensorState.
const char * esphome::home_io_control::battery_state_name (BatteryState state)
 Get the name a battery level is published under.
BatteryState esphome::home_io_control::decode_battery_state (uint8_t status_byte)
 Decode the coarse battery level from byte 1 of a status payload (CMD_PRIVATE_RESP to a status poll, or CMD_STATUS_UPDATE).
void esphome::home_io_control::note_moving_evidence (IoDevice &dev, uint32_t now_ms)
 Record that a device is (believed to be) travelling right now.
void esphome::home_io_control::clear_moving_evidence (IoDevice &dev)
 Forget that a device was travelling: it reported itself stopped (including in the ack to a STOP), a linked remote was heard stopping it, or it stayed silent to an exchange sent while it was believed moving.
int16_t esphome::home_io_control::rssi_scaled_to_dbm (int16_t scaled)
 Convert an rssi_ema_scaled fixed-point value to whole dBm (round half away from zero).
int16_t esphome::home_io_control::device_rssi_ema_dbm (const IoDevice &dev)
 A device's smoothed RSSI in whole dBm.
float esphome::home_io_control::effective_target (const IoDevice &dev)
 The main-position target a consumer should act on: the prediction when one stands, otherwise the device's own last reported target.
float esphome::home_io_control::effective_tilt (const IoDevice &dev)
 The slat angle a consumer should act on, prediction first.
bool esphome::home_io_control::effective_is_stopped (const IoDevice &dev)
 Whether a consumer should treat the device as at rest, prediction first.
bool esphome::home_io_control::default_inverted_for_type (DeviceType type)
 Determine whether a device type has inverted position mapping by default.
void esphome::home_io_control::decode_position_report (uint16_t target_raw, uint16_t current_raw, bool is_stopped, float &target, float &position)
 Decode target/current position values from a status frame.
bool esphome::home_io_control::has_reached_target_position (float target, float position)
 Has the device reached its target within tolerance?
float esphome::home_io_control::decode_tilt_report (uint16_t tilt_raw)
 Decode tilt angle from raw 16‑bit value.

Variables

static constexpr uint16_t esphome::home_io_control::STATUS_POS_MAX = 0xC800
 In status responses, position is encoded as a 16-bit value where 0x0000 = fully open (0%) and 0xC800 = fully closed (100%).
static constexpr uint16_t esphome::home_io_control::STATUS_POS_TOLERANCE_RAW = 100
 Target-reached tolerance expressed in raw IO-homecontrol position units.
static constexpr uint8_t esphome::home_io_control::DEVICE_METADATA_SIZE = 2
 Packed device metadata uses two bytes where the high 8 bits carry the upper type bits and the low byte carries both the remaining type bits and the 6-bit manufacturer subtype.
static constexpr uint8_t esphome::home_io_control::DEVICE_TYPE_LOW_BITS_SHIFT = 2
static constexpr uint8_t esphome::home_io_control::DEVICE_TYPE_HIGH_BITS_SHIFT = 6
static constexpr uint16_t esphome::home_io_control::DEVICE_TYPE_WIRE_MASK = 0x3FF
 The node-type wire field is ten bits wide.
static constexpr uint8_t esphome::home_io_control::DEVICE_SUBTYPE_MASK = 0x3F
static constexpr float esphome::home_io_control::UNKNOWN_POSITION = 212.0F
 Sentinel value meaning "position is not known yet".
static constexpr uint8_t esphome::home_io_control::DEVICE_NAME_BUFFER_SIZE = 32
 Device name storage including null terminator.
static constexpr int16_t esphome::home_io_control::RSSI_UNKNOWN_DBM = INT16_MIN
 Sentinel value meaning "no RSSI sample recorded yet" for last_rssi_dbm/rssi_ema_scaled.
static constexpr int16_t esphome::home_io_control::RSSI_EMA_SCALE = 8
 EMA weight denominator and fixed-point scale for IoDevice::rssi_ema_scaled.

Detailed Description

IO-Homecontrol device-type model, capabilities and runtime device state.

DeviceType/DeviceCapabilityClass, the capability predicates, packed-metadata decoders, cover commands, position/tilt report decoding and the IoDevice runtime struct. The per-(type, subtype) names and flags live in the table in proto_device_types.h.

Definition in file proto_device_model.h.