mirror of
https://github.com/alexhopeoconnor/arduino-home-assistant.git
synced 2026-10-04 02:48:13 +10:00
Align ArduinoHA with current Home Assistant MQTT discovery expectations by adding default entity IDs, device discovery support, safer runtime discovery refresh behavior, expanded entity category coverage, and the tests/docs needed to support the migration away from legacy object_id payloads.
373 lines
9.5 KiB
Arduino
373 lines
9.5 KiB
Arduino
#include <AUnit.h>
|
|
#include <ArduinoHA.h>
|
|
|
|
using aunit::TestRunner;
|
|
|
|
static const char* testDeviceId = "testDevice";
|
|
static const char* testUniqueId = "uniqueTracker";
|
|
|
|
const char ConfigTopic[] PROGMEM = {
|
|
"homeassistant/device_tracker/testDevice/uniqueTracker/config"
|
|
};
|
|
const char DeviceConfigTopic[] PROGMEM = {"homeassistant/device/testDevice/config"};
|
|
const char StateTopic[] PROGMEM = {"testData/testDevice/uniqueTracker/stat_t"};
|
|
|
|
AHA_TEST(DeviceTrackerTest, invalid_unique_id) {
|
|
initMqttTest(testDeviceId)
|
|
|
|
HADeviceTracker tracker(nullptr);
|
|
tracker.buildSerializerTest();
|
|
HASerializer* serializer = tracker.getSerializer();
|
|
|
|
assertTrue(serializer == nullptr);
|
|
}
|
|
|
|
AHA_TEST(DeviceTrackerTest, default_params) {
|
|
initMqttTest(testDeviceId)
|
|
|
|
HADeviceTracker tracker(testUniqueId);
|
|
assertEntityConfig(
|
|
mock,
|
|
tracker,
|
|
(
|
|
"{"
|
|
"\"uniq_id\":\"uniqueTracker\","
|
|
"\"dev\":{\"ids\":\"testDevice\"},"
|
|
"\"stat_t\":\"testData/testDevice/uniqueTracker/stat_t\""
|
|
"}"
|
|
)
|
|
)
|
|
}
|
|
|
|
AHA_TEST(DeviceTrackerTest, extended_unique_id) {
|
|
initMqttTest(testDeviceId)
|
|
|
|
device.enableExtendedUniqueIds();
|
|
HADeviceTracker tracker(testUniqueId);
|
|
assertEntityConfig(
|
|
mock,
|
|
tracker,
|
|
(
|
|
"{"
|
|
"\"uniq_id\":\"testDevice_uniqueTracker\","
|
|
"\"dev\":{\"ids\":\"testDevice\"},"
|
|
"\"stat_t\":\"testData/testDevice/uniqueTracker/stat_t\""
|
|
"}"
|
|
)
|
|
)
|
|
}
|
|
|
|
AHA_TEST(DeviceTrackerTest, device_discovery_payload) {
|
|
initMqttTest(testDeviceId)
|
|
|
|
mqtt.enableDeviceDiscovery();
|
|
HADeviceTracker tracker(testUniqueId);
|
|
mqtt.loop();
|
|
|
|
assertSingleMqttMessage(
|
|
AHATOFSTR(DeviceConfigTopic),
|
|
(
|
|
"{"
|
|
"\"dev\":{\"ids\":\"testDevice\"},"
|
|
"\"o\":{\"name\":\"ArduinoHA\",\"sw\":\"2.1.0\"},"
|
|
"\"cmps\":{"
|
|
"\"uniqueTracker\":{"
|
|
"\"p\":\"device_tracker\","
|
|
"\"uniq_id\":\"uniqueTracker\","
|
|
"\"stat_t\":\"testData/testDevice/uniqueTracker/stat_t\""
|
|
"}"
|
|
"}"
|
|
"}"
|
|
),
|
|
true
|
|
)
|
|
}
|
|
|
|
AHA_TEST(DeviceTrackerTest, source_type_gps) {
|
|
initMqttTest(testDeviceId)
|
|
|
|
HADeviceTracker tracker(testUniqueId);
|
|
tracker.setSourceType(HADeviceTracker::SourceTypeGPS);
|
|
assertEntityConfig(
|
|
mock,
|
|
tracker,
|
|
(
|
|
"{"
|
|
"\"uniq_id\":\"uniqueTracker\","
|
|
"\"src_type\":\"gps\","
|
|
"\"dev\":{\"ids\":\"testDevice\"},"
|
|
"\"stat_t\":\"testData/testDevice/uniqueTracker/stat_t\""
|
|
"}"
|
|
)
|
|
)
|
|
}
|
|
|
|
AHA_TEST(DeviceTrackerTest, source_type_router) {
|
|
initMqttTest(testDeviceId)
|
|
|
|
HADeviceTracker tracker(testUniqueId);
|
|
tracker.setSourceType(HADeviceTracker::SourceTypeRouter);
|
|
assertEntityConfig(
|
|
mock,
|
|
tracker,
|
|
(
|
|
"{"
|
|
"\"uniq_id\":\"uniqueTracker\","
|
|
"\"src_type\":\"router\","
|
|
"\"dev\":{\"ids\":\"testDevice\"},"
|
|
"\"stat_t\":\"testData/testDevice/uniqueTracker/stat_t\""
|
|
"}"
|
|
)
|
|
)
|
|
}
|
|
|
|
AHA_TEST(DeviceTrackerTest, source_type_bluetooth) {
|
|
initMqttTest(testDeviceId)
|
|
|
|
HADeviceTracker tracker(testUniqueId);
|
|
tracker.setSourceType(HADeviceTracker::SourceTypeBluetooth);
|
|
assertEntityConfig(
|
|
mock,
|
|
tracker,
|
|
(
|
|
"{"
|
|
"\"uniq_id\":\"uniqueTracker\","
|
|
"\"src_type\":\"bluetooth\","
|
|
"\"dev\":{\"ids\":\"testDevice\"},"
|
|
"\"stat_t\":\"testData/testDevice/uniqueTracker/stat_t\""
|
|
"}"
|
|
)
|
|
)
|
|
}
|
|
|
|
AHA_TEST(DeviceTrackerTest, source_type_bluetooth_le) {
|
|
initMqttTest(testDeviceId)
|
|
|
|
HADeviceTracker tracker(testUniqueId);
|
|
tracker.setSourceType(HADeviceTracker::SourceTypeBluetoothLE);
|
|
assertEntityConfig(
|
|
mock,
|
|
tracker,
|
|
(
|
|
"{"
|
|
"\"uniq_id\":\"uniqueTracker\","
|
|
"\"src_type\":\"bluetooth_le\","
|
|
"\"dev\":{\"ids\":\"testDevice\"},"
|
|
"\"stat_t\":\"testData/testDevice/uniqueTracker/stat_t\""
|
|
"}"
|
|
)
|
|
)
|
|
}
|
|
|
|
AHA_TEST(DeviceTrackerTest, availability) {
|
|
initMqttTest(testDeviceId)
|
|
|
|
HADeviceTracker tracker(testUniqueId);
|
|
tracker.setAvailability(true);
|
|
mqtt.loop();
|
|
|
|
// availability is published after config in HADeviceTracker
|
|
assertMqttMessage(
|
|
1,
|
|
F("testData/testDevice/uniqueTracker/avty_t"),
|
|
"online",
|
|
true
|
|
)
|
|
}
|
|
|
|
AHA_TEST(DeviceTrackerTest, publish_initial_state) {
|
|
initMqttTest(testDeviceId)
|
|
|
|
HADeviceTracker tracker(testUniqueId);
|
|
tracker.setCurrentState(HADeviceTracker::StateHome);
|
|
mqtt.loop();
|
|
|
|
assertMqttMessage(1, AHATOFSTR(StateTopic), "home", true)
|
|
}
|
|
|
|
AHA_TEST(DeviceTrackerTest, name_setter) {
|
|
initMqttTest(testDeviceId)
|
|
|
|
HADeviceTracker tracker(testUniqueId);
|
|
tracker.setName("testName");
|
|
|
|
assertEntityConfig(
|
|
mock,
|
|
tracker,
|
|
(
|
|
"{"
|
|
"\"name\":\"testName\","
|
|
"\"uniq_id\":\"uniqueTracker\","
|
|
"\"dev\":{\"ids\":\"testDevice\"},"
|
|
"\"stat_t\":\"testData/testDevice/uniqueTracker/stat_t\""
|
|
"}"
|
|
)
|
|
)
|
|
}
|
|
|
|
AHA_TEST(DeviceTrackerTest, object_id_setter) {
|
|
initMqttTest(testDeviceId)
|
|
|
|
HADeviceTracker tracker(testUniqueId);
|
|
tracker.setObjectId("testId");
|
|
|
|
assertEntityConfig(
|
|
mock,
|
|
tracker,
|
|
(
|
|
"{"
|
|
"\"obj_id\":\"testId\","
|
|
"\"uniq_id\":\"uniqueTracker\","
|
|
"\"dev\":{\"ids\":\"testDevice\"},"
|
|
"\"stat_t\":\"testData/testDevice/uniqueTracker/stat_t\""
|
|
"}"
|
|
)
|
|
)
|
|
}
|
|
|
|
AHA_TEST(DeviceTrackerTest, default_entity_id_setter) {
|
|
initMqttTest(testDeviceId)
|
|
|
|
HADeviceTracker tracker(testUniqueId);
|
|
tracker.setDefaultEntityId("device_tracker.test_tracker");
|
|
|
|
assertEntityConfig(
|
|
mock,
|
|
tracker,
|
|
(
|
|
"{"
|
|
"\"def_ent_id\":\"device_tracker.test_tracker\","
|
|
"\"uniq_id\":\"uniqueTracker\","
|
|
"\"dev\":{\"ids\":\"testDevice\"},"
|
|
"\"stat_t\":\"testData/testDevice/uniqueTracker/stat_t\""
|
|
"}"
|
|
)
|
|
)
|
|
}
|
|
|
|
AHA_TEST(DeviceTrackerTest, entity_category_setter) {
|
|
initMqttTest(testDeviceId)
|
|
|
|
HADeviceTracker tracker(testUniqueId);
|
|
tracker.setEntityCategory("diagnostic");
|
|
|
|
assertEntityConfig(
|
|
mock,
|
|
tracker,
|
|
(
|
|
"{"
|
|
"\"uniq_id\":\"uniqueTracker\","
|
|
"\"ent_cat\":\"diagnostic\","
|
|
"\"dev\":{\"ids\":\"testDevice\"},"
|
|
"\"stat_t\":\"testData/testDevice/uniqueTracker/stat_t\""
|
|
"}"
|
|
)
|
|
)
|
|
}
|
|
|
|
AHA_TEST(DeviceTrackerTest, icon_setter) {
|
|
initMqttTest(testDeviceId)
|
|
|
|
HADeviceTracker tracker(testUniqueId);
|
|
tracker.setIcon("testIcon");
|
|
|
|
assertEntityConfig(
|
|
mock,
|
|
tracker,
|
|
(
|
|
"{"
|
|
"\"uniq_id\":\"uniqueTracker\","
|
|
"\"ic\":\"testIcon\","
|
|
"\"dev\":{\"ids\":\"testDevice\"},"
|
|
"\"stat_t\":\"testData/testDevice/uniqueTracker/stat_t\""
|
|
"}"
|
|
)
|
|
)
|
|
}
|
|
|
|
AHA_TEST(DeviceTrackerTest, default_state_unknown) {
|
|
initMqttTest(testDeviceId)
|
|
|
|
HADeviceTracker tracker(testUniqueId);
|
|
assertEqual(HADeviceTracker::StateUnknown, tracker.getState());
|
|
}
|
|
|
|
AHA_TEST(DeviceTrackerTest, default_state) {
|
|
initMqttTest(testDeviceId)
|
|
|
|
HADeviceTracker tracker(testUniqueId);
|
|
tracker.setCurrentState(HADeviceTracker::StateNotAvailable);
|
|
assertEqual(HADeviceTracker::StateNotAvailable, tracker.getState());
|
|
}
|
|
|
|
AHA_TEST(DeviceTrackerTest, publish_state_home) {
|
|
initMqttTest(testDeviceId)
|
|
|
|
mock->connectDummy();
|
|
HADeviceTracker tracker(testUniqueId);
|
|
bool result = tracker.setState(HADeviceTracker::StateHome);
|
|
|
|
assertSingleMqttMessage(AHATOFSTR(StateTopic), "home", true)
|
|
assertTrue(result);
|
|
}
|
|
|
|
AHA_TEST(DeviceTrackerTest, publish_state_not_home) {
|
|
initMqttTest(testDeviceId)
|
|
|
|
mock->connectDummy();
|
|
HADeviceTracker tracker(testUniqueId);
|
|
bool result = tracker.setState(HADeviceTracker::StateNotHome);
|
|
|
|
assertSingleMqttMessage(AHATOFSTR(StateTopic), "not_home", true)
|
|
assertTrue(result);
|
|
}
|
|
|
|
AHA_TEST(DeviceTrackerTest, publish_state_not_available) {
|
|
initMqttTest(testDeviceId)
|
|
|
|
mock->connectDummy();
|
|
HADeviceTracker tracker(testUniqueId);
|
|
bool result = tracker.setState(HADeviceTracker::StateNotAvailable);
|
|
|
|
assertSingleMqttMessage(AHATOFSTR(StateTopic), "offline", true)
|
|
assertTrue(result);
|
|
}
|
|
|
|
AHA_TEST(DeviceTrackerTest, publish_state_debounce) {
|
|
initMqttTest(testDeviceId)
|
|
|
|
mock->connectDummy();
|
|
HADeviceTracker tracker(testUniqueId);
|
|
tracker.setCurrentState(HADeviceTracker::StateHome);
|
|
bool result = tracker.setState(HADeviceTracker::StateHome);
|
|
|
|
// it shouldn't publish data if state doesn't change
|
|
assertEqual(mock->getFlushedMessagesNb(), 0);
|
|
assertTrue(result);
|
|
}
|
|
|
|
AHA_TEST(DeviceTrackerTest, publish_state_debounce_skip) {
|
|
initMqttTest(testDeviceId)
|
|
|
|
mock->connectDummy();
|
|
HADeviceTracker tracker(testUniqueId);
|
|
tracker.setCurrentState(HADeviceTracker::StateHome);
|
|
bool result = tracker.setState(HADeviceTracker::StateHome, true);
|
|
|
|
assertSingleMqttMessage(AHATOFSTR(StateTopic), "home", true)
|
|
assertTrue(result);
|
|
}
|
|
|
|
void setup()
|
|
{
|
|
delay(1000);
|
|
Serial.begin(115200);
|
|
while (!Serial);
|
|
}
|
|
|
|
void loop()
|
|
{
|
|
TestRunner::run();
|
|
delay(1);
|
|
}
|