9#include "esphome/core/hal.h"
10#include "esphome/core/log.h"
23constexpr float MS_PER_SECOND = 1000.0F;
27constexpr uint32_t HEARTBEAT_INTERVAL_MS = 60000;
49 this->publish_state(ema_dbm);
54 static const char *
const TAG =
"home_io_control.rssi";
55 LOG_SENSOR(
"",
"IO-Homecontrol RSSI",
this);
56 ESP_LOGCONFIG(TAG,
" Device ID: %s", this->
device_id_.c_str());
62 this->set_interval(
"heartbeat", HEARTBEAT_INTERVAL_MS, [
this]() {
65 if (
const auto *dev = this->
parent_->
get_device(this->device_id_); dev !=
nullptr)
72 this->publish_state(
static_cast<float>(millis() - dev.
last_seen_ms) / MS_PER_SECOND);
76 static const char *
const TAG =
"home_io_control.last_contact";
77 LOG_SENSOR(
"",
"IO-Homecontrol Last Contact",
this);
78 ESP_LOGCONFIG(TAG,
" Device ID: %s", this->
device_id_.c_str());
87 static const char *
const TAG =
"home_io_control.exchange_failures";
88 LOG_SENSOR(
"",
"IO-Homecontrol Exchange Failures",
this);
89 ESP_LOGCONFIG(TAG,
" Device ID: %s", this->
device_id_.c_str());
93 static const char *
const TAG =
"home_io_control.unconfirmed_exchanges";
94 LOG_SENSOR(
"",
"IO-Homecontrol Unconfirmed Exchanges",
this);
95 ESP_LOGCONFIG(TAG,
" Device ID: %s", this->
device_id_.c_str());
104 this->set_timeout(
"init_name", INITIAL_STATUS_REQUEST_DELAY_MS,
109 static const char *
const TAG =
"home_io_control.device_name";
110 LOG_TEXT_SENSOR(
"",
"IO-Homecontrol Device Name",
this);
111 ESP_LOGCONFIG(TAG,
" Device ID: %s", this->
device_id_.c_str());
127 }
else if (
const char *issue = execution_state_issue(dev.
execution_state)) {
128 this->publish_state(issue);
130 this->publish_state(
"");
136 static const char *
const TAG =
"home_io_control.active_issue";
137 LOG_TEXT_SENSOR(
"",
"IO-Homecontrol Active Issue",
this);
138 ESP_LOGCONFIG(TAG,
" Device ID: %s", this->
device_id_.c_str());
151 static const char *
const TAG =
"home_io_control.last_commanded_by";
152 LOG_TEXT_SENSOR(
"",
"IO-Homecontrol Last Commanded By",
this);
153 ESP_LOGCONFIG(TAG,
" Device ID: %s", this->
device_id_.c_str());
162 static const char *
const TAG =
"home_io_control.last_command_source";
163 LOG_TEXT_SENSOR(
"",
"IO-Homecontrol Last Command Source",
this);
164 ESP_LOGCONFIG(TAG,
" Device ID: %s", this->
device_id_.c_str());
void register_companion_binding_(const std::function< void(const IoDevice &)> &publish)
Shared setup() body: subscribe to this device's updates and publish the initial state.
IOHomeControlComponent * parent_
void setup() override
Register the device-update subscription and publish the initial cached state.
void dump_config() override
Dump text-sensor configuration to the log.
std::string describe_last_commander(const IoDevice &dev) const
Render a device's "last commanded by" string, resolving this hub's own node ID.
virtual IoDevice * get_device(const std::string &device_id)
Retrieve a device by ID; returns nullptr if not found.
virtual void queue_request_device_name(const std::string &device_id)
Queue an async device-name request; returns immediately, executed in loop().
bool radio_stopped_responding() const
True once loop() has seen the radio latch a failure after setup (a runtime BUSY timeout,...
void setup() final
Register the device-update subscription and publish the initial cached count.
virtual uint16_t counter_value(const IoDevice &dev) const =0
Return the counter this sensor publishes.
void setup() override
Register the device-update subscription and schedule an initial name fetch.
void dump_config() override
Dump text-sensor configuration to the log.
void dump_config() override
Dump sensor configuration to the log.
void dump_config() override
void dump_config() override
void dump_config() override
Dump sensor configuration to the log.
Conversions and renderers shared by the hub and its Home Assistant entities.
std::string describe_last_command_source(const IoDevice &dev)
Render the "Last Command Source" sensor string.
constexpr const char * ACTIVE_ISSUE_RADIO_STOPPED_RESPONDING
Active Issue value while the hub's radio has stopped responding, in the style of the symbolic result ...
const char * command_result_name(uint8_t result)
Return a stable symbolic name for a CMD_ERROR_RESP result code.
ExecutionState
What a device says it is doing, from bits [2:0] of byte 0 of a status reply (CMD_PRIVATE_RESP,...
@ WAITING_FOR_POWER
Accepted, waiting for power (queued behind another device on a shared supply).
@ NON_EXECUTING
Unable to execute under the given conditions (example: temperature too high).
@ EXECUTION_ERROR
An error occurred during the previous execution; cleared when the next starts.
constexpr const char * ACTIVE_ISSUE_NOT_EXECUTING
Active Issue value while a device's status reports execution state 0: it cannot run its last command ...
constexpr bool command_result_is_transient(uint8_t result)
Check whether a result code describes one exchange rather than the device's state.
int16_t device_rssi_ema_dbm(const IoDevice &dev)
A device's smoothed RSSI in whole dBm.
constexpr const char * ACTIVE_ISSUE_EXECUTION_ERROR
Active Issue value while a device's status reports execution state 1: an error occurred during its la...
IO-Homecontrol command IDs, result codes and protocol enumerations.
Runtime state of a paired IO‑Homecontrol device.
ExecutionState execution_state
Execution state of the last status report that carried one; UNDEFINED until then, and for a device th...
uint8_t last_result_code
Last CMD_ERROR_RESP result byte (0 = none recorded).
char name[DEVICE_NAME_BUFFER_SIZE]
Cached UTF-8 device name decoded from Latin-1 wire payloads.
bool limited_by_rain
Derived from observed status replies, never from a prediction (decisions::is_rain_limited(); ADR 0030...
uint32_t last_seen_ms
millis() of the last frame received from this device (any command), 0 = never.