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/// @ingroup hioc_platforms
6///
7/// Maps IO‑Homecontrol devices (shutters, awnings, blinds) to Home Assistant cover entities
8/// with position control and real‑time feedback.
9///
10/// Position mapping between Home Assistant and IO‑Homecontrol:
11/// HA: 1.0 = fully open, 0.0 = fully closed
12/// IO: 0 = fully open, 100 = fully closed
13/// The conversion is: ha_position = 1.0 - (io_position / 100.0)
14///
15/// @warning Some device types (e.g., horizontal awnings) have inverted position mapping
16/// by default (see default_inverted_for_type() in proto_frame.h). The invert
17/// flag flips the HA↔IO conversion accordingly. Ensure the device's actual
18/// behavior matches the mapping, or set invert_position accordingly.
19
20#include "esphome/core/component.h"
21#include "esphome/components/cover/cover.h"
23
24namespace esphome {
25namespace home_io_control {
26
27/// @brief Cover entity representing an IO‑Homecontrol shutter/awning/blind.
28/// @ingroup hioc_platforms
29///
30/// The device-binding setters, setup() registration ritual and poll-interval dump line come
31/// from DeviceBoundEntity; the richer position/tilt/movement mapping and the invert option
32/// stay here.
33class IOHomeCover : public cover::Cover, public Component, public DeviceBoundEntity {
34 public:
35 IOHomeCover() = default;
36 /// @brief Initialize the cover entity (register device, subscribe to updates, schedule initial status poll).
37 void setup() override;
38 /// @brief Dump configuration to log.
39 void dump_config() override;
40 /// @brief Get setup priority (DATA so we have device registry available).
41 /// @return setup_priority::DATA.
42 [[nodiscard]] float get_setup_priority() const override { return setup_priority::DATA; }
43
44 /// @brief Return the traits object describing this cover's capabilities.
45 /// @return CoverTraits configured for position, stop, and optional tilt.
46 cover::CoverTraits get_traits() override;
47
48 /// @brief Enable or disable position inversion.
49 /// Some devices (e.g., horizontal awnings) report reversed open/close semantics.
50 /// @param invert True to invert the mapping (HA 1.0 → IO 0, HA 0.0 → IO 100).
51 void set_invert_position(bool invert) {
52 this->invert_ = invert;
53 this->invert_explicit_ = true;
54 }
55 /// @brief Query whether this device supports tilt (slat angle) control.
56 /// @return true if the YAML‑declared device type is tilt‑capable.
57 [[nodiscard]] bool supports_tilt() const;
58
59 protected:
60 /// @brief Handle cover commands from Home Assistant (open/close/stop/set_position).
61 /// @param call CoverCall containing the requested operation.
62 void control(const cover::CoverCall &call) override;
63 /// @brief Callback invoked when the underlying device state changes.
64 /// @param id Device ID that updated.
65 /// @param dev Updated IoDevice state.
66 void on_device_update_(const std::string &id, const IoDevice &dev);
67 /// @brief Resolve the current inversion mode.
68 /// @return Explicit YAML override when set, otherwise the runtime device profile.
69 [[nodiscard]] bool effective_invert_() const;
70 /// @brief Infer HA movement direction from successive IO positions when the protocol target is unknown.
71 /// @param invert Effective inversion mode for this device.
72 /// @param current_io_position Latest reported IO position (0=open, 100=closed).
73 /// @return OPENING, CLOSING, or IDLE when no direction can be inferred yet.
74 [[nodiscard]] cover::CoverOperation infer_operation_from_position_delta_(bool invert,
75 float current_io_position) const;
76
77 bool invert_{false};
78 bool invert_explicit_{false};
80};
81
82} // namespace home_io_control
83} // namespace esphome
Mixin holding the hub-device binding shared by all IO-Homecontrol entity platforms.
void set_invert_position(bool invert)
Enable or disable position inversion.
cover::CoverOperation infer_operation_from_position_delta_(bool invert, float current_io_position) const
Infer HA movement direction from successive IO positions when the protocol target is unknown.
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.
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).
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).
static constexpr float UNKNOWN_POSITION
Sentinel value meaning "position is not known yet".
Shared device-binding mixins for IO-Homecontrol entity platforms.
Runtime state of a paired IO‑Homecontrol device.