Home IO Control
ESPHome add-on for IO-Homecontrol devices
Loading...
Searching...
No Matches
platform_cover.h
Go to the documentation of this file.
1#pragma once
2
3/// @file platform_cover.h
4/// @brief ESPHome cover entity for IO‑Homecontrol devices.
5///
6/// Maps IO‑Homecontrol devices (shutters, awnings, blinds) to Home Assistant cover entities
7/// with position control and real‑time feedback.
8///
9/// Position mapping between Home Assistant and IO‑Homecontrol:
10/// HA: 1.0 = fully open, 0.0 = fully closed
11/// IO: 0 = fully open, 100 = fully closed
12/// The conversion is: ha_position = 1.0 - (io_position / 100.0)
13///
14/// @warning Some device types (e.g., horizontal awnings) have inverted position mapping
15/// by default (see default_inverted_for_type() in proto_frame.h). The invert
16/// flag flips the HA↔IO conversion accordingly. Ensure the device's actual
17/// behavior matches the mapping, or set invert_position accordingly.
18
19#include "esphome/core/component.h"
20#include "esphome/components/cover/cover.h"
21#include "hub_core.h"
22
23namespace esphome {
24namespace home_io_control {
25
26/// @brief Cover entity representing an IO‑Homecontrol shutter/awning/blind.
27class IOHomeCover : public cover::Cover, public Component {
28 public:
29 IOHomeCover() { this->position = UNKNOWN_POSITION; }
30 /// @brief Initialize the cover entity (register device, subscribe to updates, schedule initial status poll).
31 void setup() override;
32 /// @brief Dump configuration to log.
33 void dump_config() override;
34 /// @brief Get setup priority (DATA so we have device registry available).
35 /// @return setup_priority::DATA.
36 [[nodiscard]] float get_setup_priority() const override { return setup_priority::DATA; }
37
38 /// @brief Return the traits object describing this cover's capabilities.
39 /// @return CoverTraits configured for position, stop, and optional tilt.
40 cover::CoverTraits get_traits() override;
41
42 /// @brief Set the parent controller component.
43 /// @param parent Pointer to the IOHomeControlComponent instance.
44 void set_parent(IOHomeControlComponent *parent) { this->parent_ = parent; }
45 /// @brief Set the unique device ID (from YAML).
46 /// @param id Hexadecimal node ID string (e.g., "123ABC").
47 void set_device_id(const std::string &id) { this->device_id_ = id; }
48 /// @brief Set the declared device type (from YAML).
49 /// @param type Device type enum.
50 void set_device_type(DeviceType type) { this->device_type_ = type; }
51 /// @brief Set the declared device subtype (from YAML).
52 /// @param subtype Subtype value.
53 void set_subtype(uint8_t subtype) { this->subtype_ = subtype; }
54 /// @brief Enable or disable position inversion.
55 /// Some devices (e.g., horizontal awnings) report reversed open/close semantics.
56 /// @param invert True to invert the mapping (HA 1.0 → IO 0, HA 0.0 → IO 100).
57 void set_invert_position(bool invert) {
58 this->invert_ = invert;
59 this->invert_explicit_ = true;
60 }
61 /// @brief Configure bounded follow-up polling while a state change is expected.
62 /// @param poll_interval_ms Poll interval in milliseconds; zero keeps the default single settle poll only.
63 void set_status_poll_interval(uint32_t poll_interval_ms) { this->status_poll_interval_ms_ = poll_interval_ms; }
64 /// @brief Query whether this device supports tilt (slat angle) control.
65 /// @return true if the underlying device type supports tilt.
66 [[nodiscard]] bool supports_tilt() const;
67
68 protected:
69 /// @brief Handle cover commands from Home Assistant (open/close/stop/set_position).
70 /// @param call CoverCall containing the requested operation.
71 void control(const cover::CoverCall &call) override;
72 /// @brief Callback invoked when the underlying device state changes.
73 /// @param id Device ID that updated.
74 /// @param dev Updated IoDevice state.
75 void on_device_update_(const std::string &id, const IoDevice &dev);
76 /// @brief Resolve the current inversion mode.
77 /// @return Explicit YAML override when set, otherwise the runtime device profile.
78 [[nodiscard]] bool effective_invert_() const;
79
81 std::string device_id_;
83 uint8_t subtype_{0};
85 bool invert_{false};
86 bool invert_explicit_{false};
87};
88
89} // namespace home_io_control
90} // namespace esphome
The main IO-Homecontrol component.
Definition hub_core.h:60
void set_invert_position(bool invert)
Enable or disable position inversion.
void set_subtype(uint8_t subtype)
Set the declared device subtype (from YAML).
void set_parent(IOHomeControlComponent *parent)
Set the parent controller component.
bool supports_tilt() const
Query whether this device supports tilt (slat angle) control.
void on_device_update_(const std::string &id, const IoDevice &dev)
Callback invoked when the underlying device state changes.
void set_status_poll_interval(uint32_t poll_interval_ms)
Configure bounded follow-up polling while a state change is expected.
bool effective_invert_() const
Resolve the current inversion mode.
cover::CoverTraits get_traits() override
Return the traits object describing this cover's capabilities.
void setup() override
Initialize the cover entity (register device, subscribe to updates, schedule initial status poll).
void set_device_type(DeviceType type)
Set the declared device type (from YAML).
float get_setup_priority() const override
Get setup priority (DATA so we have device registry available).
void dump_config() override
Dump configuration to log.
void control(const cover::CoverCall &call) override
Handle cover commands from Home Assistant (open/close/stop/set_position).
void set_device_id(const std::string &id)
Set the unique device ID (from YAML).
IO-Homecontrol ESPHome component — protocol controller.
static constexpr float UNKNOWN_POSITION
Sentinel value meaning "position is not known yet".
DeviceType
Device type identifiers reported by IO‑Homecontrol products.
@ UNKNOWN
Unknown/unspecified device.
Runtime state of a paired IO‑Homecontrol device.