Per-entity availability, deferred discovery publish, suggested precision

- Add HAAvailabilityConfig for per-entity availability_topic and payloads
- Defer discovery until MQTT connected; publish availability after discovery
- HASensor/HANumber: optional suggested_display_precision in discovery
- HASerializer/HADictionary: extend for new keys; update device types and mocks
- Docs and examples reflect availability and precision usage
- Tests updated for discovery and availability behavior
- Ignore .cursor/ in repo root
This commit is contained in:
2026-05-05 17:47:55 +10:00
parent 8ba5482892
commit b9f4fd7f4b
62 changed files with 2705 additions and 283 deletions
@@ -29,10 +29,19 @@ void setup() {
// set device's details (optional)
device.setName("Arduino");
device.setSoftwareVersion("1.0.0");
mqtt.setOriginSupportUrl("https://example.com/device-help");
sensor.setCurrentState(lastInputState); // optional
sensor.setName("Door sensor"); // optional
sensor.setDeviceClass("door"); // optional
sensor.setPayloadAvailable("ready");
sensor.setPayloadNotAvailable("lost");
// Optional multi-topic discovery metadata for external health sources.
// Runtime availability publishing still uses sensor.setAvailability(...).
// sensor.setAvailabilityMode("all");
// sensor.addAvailabilityEntry("bridge/status");
// sensor.addAvailabilityEntry("sensor/health", "{{ value_json.state }}");
// This method enables availability for all device types registered on the device.
// For example, if you have 5 sensors on the same device, you can enable
+2
View File
@@ -33,6 +33,8 @@ void setup() {
// optional properties
buttonA.setIcon("mdi:fire");
buttonA.setName("Click me A");
// buttonA.setPayloadPress("PRESS_A");
// buttonA.setCommandTemplate("{{ value_json.command }}");
buttonB.setIcon("mdi:home");
buttonB.setName("Click me B");
+5
View File
@@ -33,6 +33,11 @@ void setup() {
// set icon (optional)
led.setIcon("mdi:lightbulb");
led.setName("My LED");
// led.setPayloadOn("ENABLE");
// led.setPayloadOff("DISABLE");
// led.setStateOn("running");
// led.setStateOff("stopped");
// led.setCommandTemplate("{{ value_json.command }}");
// handle switch state
led.onCommand(onSwitchCommand);
+3
View File
@@ -52,6 +52,9 @@ void setup() {
// number.setStep(0.5f); // minimum step: 0.001f
// number.setMode(HANumber::ModeBox);
// number.setMode(HANumber::ModeSlider);
// number.setValueTemplate("{{ value_json.level }}");
// number.setPayloadReset("RESET");
// number.setCommandTemplate("{{ value | float | round(1) }}");
// You can set retain flag for the HA commands
// number.setRetain(true);
+2
View File
@@ -30,6 +30,8 @@ void setup() {
analogSensor.setIcon("mdi:home");
analogSensor.setName("Analog voltage");
analogSensor.setUnitOfMeasurement("V");
analogSensor.setSuggestedDisplayPrecision(2);
// analogSensor.setValueTemplate("{{ value_json.voltage }}");
mqtt.begin(BROKER_ADDR);
}
+4
View File
@@ -23,6 +23,10 @@ void setup() {
// configure sensor (optional)
valve.setIcon("mdi:home");
valve.setName("Water valve");
// valve.setValueTemplate("{{ value_json.state }}");
// valve.setDeviceClass("enum");
// valve.setOptions("open;opening;closed");
// valve.setDefaultEntityId("sensor.water_valve");
mqtt.begin(BROKER_ADDR);
}