Added support for object_id in all device types (#223)

* added support for the object_id property in all device types

* added tests
This commit is contained in:
Dawid Chyrzyński
2024-02-07 00:03:30 +01:00
committed by GitHub
parent 5c7acd7e39
commit 9e17dda50b
34 changed files with 368 additions and 15 deletions
+1
View File
@@ -13,6 +13,7 @@
* Added support for the `expire_after` property in the `HASensor` [#171](https://github.com/dawidchyrzynski/arduino-home-assistant/issues/171)
* Added support for the `expire_after` property in the `HABinarySensor` [#159](https://github.com/dawidchyrzynski/arduino-home-assistant/issues/159)
* Added support for the JSON attributes in the `HASensor`
* Added support for the `object_id` property in all device types
**Fixes:**
* Fixed a bug with the maximum number of device types ([#190](https://github.com/dawidchyrzynski/arduino-home-assistant/issues/190) by [@martaisty](https://github.com/martaisty))
+1
View File
@@ -11,6 +11,7 @@ HABaseDeviceType::HABaseDeviceType(
_componentName(componentName),
_uniqueId(uniqueId),
_name(nullptr),
_objectId(nullptr),
_serializer(nullptr),
_availability(AvailabilityDefault)
{
+19
View File
@@ -78,6 +78,22 @@ public:
inline const char* getName() const
{ return _name; }
/**
* Sets object ID that will be used by HA to generate entity ID.
* Keep the ID short to save the resources.
*
* @param objectId The object ID.
*/
inline void setObjectId(const char* objectId)
{ _objectId = objectId; }
/**
* Returns the object ID that was set by setObjectId method.
* It can be nullptr if there is no ID assigned.
*/
inline const char* getObjectId() const
{ return _objectId; }
/**
* Sets availability of the device type.
* Setting the initial availability enables availability reporting for this device type.
@@ -209,6 +225,9 @@ protected:
/// The name that was set using setName method. It can be nullptr.
const char* _name;
/// The object ID that was set using setObjectId method. It can be nullptr.
const char* _objectId;
/// HASerializer that belongs to this device type. It can be nullptr.
HASerializer* _serializer;
+2 -1
View File
@@ -42,8 +42,9 @@ void HABinarySensor::buildSerializer()
return;
}
_serializer = new HASerializer(this, 8); // 8 - max properties nb
_serializer = new HASerializer(this, 9); // 9 - max properties nb
_serializer->set(AHATOFSTR(HANameProperty), _name);
_serializer->set(AHATOFSTR(HAObjectIdProperty), _objectId);
_serializer->set(HASerializer::WithUniqueId);
_serializer->set(AHATOFSTR(HADeviceClassProperty), _class);
_serializer->set(AHATOFSTR(HAIconProperty), _icon);
+2 -1
View File
@@ -20,8 +20,9 @@ void HAButton::buildSerializer()
return;
}
_serializer = new HASerializer(this, 8); // 8 - max properties nb
_serializer = new HASerializer(this, 9); // 9 - max properties nb
_serializer->set(AHATOFSTR(HANameProperty), _name);
_serializer->set(AHATOFSTR(HAObjectIdProperty), _objectId);
_serializer->set(HASerializer::WithUniqueId);
_serializer->set(AHATOFSTR(HADeviceClassProperty), _class);
_serializer->set(AHATOFSTR(HAIconProperty), _icon);
+2 -1
View File
@@ -27,8 +27,9 @@ void HACamera::buildSerializer()
return;
}
_serializer = new HASerializer(this, 7); // 7 - max properties nb
_serializer = new HASerializer(this, 8); // 8 - max properties nb
_serializer->set(AHATOFSTR(HANameProperty), _name);
_serializer->set(AHATOFSTR(HAObjectIdProperty), _objectId);
_serializer->set(HASerializer::WithUniqueId);
_serializer->set(AHATOFSTR(HAIconProperty), _icon);
_serializer->set(
+2 -1
View File
@@ -54,8 +54,9 @@ void HACover::buildSerializer()
return;
}
_serializer = new HASerializer(this, 11); // 11 - max properties nb
_serializer = new HASerializer(this, 12); // 12 - max properties nb
_serializer->set(AHATOFSTR(HANameProperty), _name);
_serializer->set(AHATOFSTR(HAObjectIdProperty), _objectId);
_serializer->set(HASerializer::WithUniqueId);
_serializer->set(AHATOFSTR(HADeviceClassProperty), _class);
_serializer->set(AHATOFSTR(HAIconProperty), _icon);
+2 -1
View File
@@ -33,8 +33,9 @@ void HADeviceTracker::buildSerializer()
return;
}
_serializer = new HASerializer(this, 7); // 7 - max properties nb
_serializer = new HASerializer(this, 8); // 8 - max properties nb
_serializer->set(AHATOFSTR(HANameProperty), _name);
_serializer->set(AHATOFSTR(HAObjectIdProperty), _objectId);
_serializer->set(HASerializer::WithUniqueId);
_serializer->set(AHATOFSTR(HAIconProperty), _icon);
_serializer->set(
+2 -1
View File
@@ -55,8 +55,9 @@ void HAFan::buildSerializer()
return;
}
_serializer = new HASerializer(this, 13); // 13 - max properties nb
_serializer = new HASerializer(this, 14); // 14 - max properties nb
_serializer->set(AHATOFSTR(HANameProperty), _name);
_serializer->set(AHATOFSTR(HAObjectIdProperty), _objectId);
_serializer->set(HASerializer::WithUniqueId);
_serializer->set(AHATOFSTR(HAIconProperty), _icon);
+2 -1
View File
@@ -183,8 +183,9 @@ void HAHVAC::buildSerializer()
return;
}
_serializer = new HASerializer(this, 27); // 27 - max properties nb
_serializer = new HASerializer(this, 28); // 28 - max properties nb
_serializer->set(AHATOFSTR(HANameProperty), _name);
_serializer->set(AHATOFSTR(HAObjectIdProperty), _objectId);
_serializer->set(HASerializer::WithUniqueId);
_serializer->set(AHATOFSTR(HAIconProperty), _icon);
+2 -1
View File
@@ -128,8 +128,9 @@ void HALight::buildSerializer()
return;
}
_serializer = new HASerializer(this, 18); // 18 - max properties nb
_serializer = new HASerializer(this, 19); // 19 - max properties nb
_serializer->set(AHATOFSTR(HANameProperty), _name);
_serializer->set(AHATOFSTR(HAObjectIdProperty), _objectId);
_serializer->set(HASerializer::WithUniqueId);
_serializer->set(AHATOFSTR(HAIconProperty), _icon);
+2 -1
View File
@@ -35,8 +35,9 @@ void HALock::buildSerializer()
return;
}
_serializer = new HASerializer(this, 9); // 9 - max properties nb
_serializer = new HASerializer(this, 10); // 10 - max properties nb
_serializer->set(AHATOFSTR(HANameProperty), _name);
_serializer->set(AHATOFSTR(HAObjectIdProperty), _objectId);
_serializer->set(HASerializer::WithUniqueId);
_serializer->set(AHATOFSTR(HAIconProperty), _icon);
+2 -2
View File
@@ -42,9 +42,9 @@ void HANumber::buildSerializer()
return;
}
_serializer = new HASerializer(this, 15); // 15 - max properties nb
_serializer = new HASerializer(this, 16); // 16 - max properties nb
_serializer->set(AHATOFSTR(HANameProperty), _name);
_serializer->set(AHATOFSTR(HAObjectIdProperty), _objectId);
_serializer->set(HASerializer::WithUniqueId);
_serializer->set(AHATOFSTR(HADeviceClassProperty), _class);
_serializer->set(AHATOFSTR(HAIconProperty), _icon);
+2 -1
View File
@@ -19,8 +19,9 @@ void HAScene::buildSerializer()
return;
}
_serializer = new HASerializer(this, 7); // 7 - max properties nb
_serializer = new HASerializer(this, 8); // 8 - max properties nb
_serializer->set(AHATOFSTR(HANameProperty), _name);
_serializer->set(AHATOFSTR(HAObjectIdProperty), _objectId);
_serializer->set(HASerializer::WithUniqueId);
_serializer->set(AHATOFSTR(HAIconProperty), _icon);
+2 -1
View File
@@ -96,8 +96,9 @@ void HASelect::buildSerializer()
return;
}
_serializer = new HASerializer(this, 10); // 10 - max properties nb
_serializer = new HASerializer(this, 11); // 11 - max properties nb
_serializer->set(AHATOFSTR(HANameProperty), _name);
_serializer->set(AHATOFSTR(HAObjectIdProperty), _objectId);
_serializer->set(HASerializer::WithUniqueId);
_serializer->set(AHATOFSTR(HAIconProperty), _icon);
_serializer->set(
+2 -1
View File
@@ -46,8 +46,9 @@ void HASensor::buildSerializer()
return;
}
_serializer = new HASerializer(this, 12); // 12 - max properties nb
_serializer = new HASerializer(this, 13); // 13 - max properties nb
_serializer->set(AHATOFSTR(HANameProperty), _name);
_serializer->set(AHATOFSTR(HAObjectIdProperty), _objectId);
_serializer->set(HASerializer::WithUniqueId);
_serializer->set(AHATOFSTR(HADeviceClassProperty), _deviceClass);
_serializer->set(AHATOFSTR(HAStateClassProperty), _stateClass);
+2 -1
View File
@@ -36,8 +36,9 @@ void HASwitch::buildSerializer()
return;
}
_serializer = new HASerializer(this, 10); // 10 - max properties nb
_serializer = new HASerializer(this, 11); // 11 - max properties nb
_serializer->set(AHATOFSTR(HANameProperty), _name);
_serializer->set(AHATOFSTR(HAObjectIdProperty), _objectId);
_serializer->set(HASerializer::WithUniqueId);
_serializer->set(AHATOFSTR(HADeviceClassProperty), _class);
_serializer->set(AHATOFSTR(HAIconProperty), _icon);
+1
View File
@@ -39,6 +39,7 @@ const char HADeviceSoftwareVersionProperty[] PROGMEM = {"sw"};
const char HADeviceConfigurationUrlProperty[] PROGMEM = {"cu"};
const char HANameProperty[] PROGMEM = {"name"};
const char HAUniqueIdProperty[] PROGMEM = {"uniq_id"};
const char HAObjectIdProperty[] PROGMEM = {"obj_id"};
const char HADeviceProperty[] PROGMEM = {"dev"};
const char HADeviceClassProperty[] PROGMEM = {"dev_cla"};
const char HAStateClassProperty[] PROGMEM = {"stat_cla"};
+1
View File
@@ -39,6 +39,7 @@ extern const char HADeviceSoftwareVersionProperty[];
extern const char HADeviceConfigurationUrlProperty[];
extern const char HANameProperty[];
extern const char HAUniqueIdProperty[];
extern const char HAObjectIdProperty[];
extern const char HADeviceProperty[];
extern const char HADeviceClassProperty[];
extern const char HAStateClassProperty[];
@@ -53,6 +53,13 @@ AHA_TEST(BaseDeviceTypeTest, name_setter) {
assertEqual(name, deviceType.getName());
}
AHA_TEST(BaseDeviceTypeTest, object_id_setter) {
const char* objectId = "testId";
DummyDeviceType deviceType(AHATOFSTR(ComponentNameStr), testUniqueId);
deviceType.setObjectId(objectId);
assertEqual(objectId, deviceType.getObjectId());
}
AHA_TEST(BaseDeviceTypeTest, default_availability) {
DummyDeviceType deviceType(AHATOFSTR(ComponentNameStr), testUniqueId);
assertFalse(deviceType.isAvailabilityConfigured());
@@ -100,6 +100,26 @@ AHA_TEST(BinarySensorTest, name_setter) {
)
}
AHA_TEST(BinarySensorTest, object_id_setter) {
initMqttTest(testDeviceId)
HABinarySensor sensor(testUniqueId);
sensor.setObjectId("testId");
assertEntityConfig(
mock,
sensor,
(
"{"
"\"obj_id\":\"testId\","
"\"uniq_id\":\"uniqueSensor\","
"\"dev\":{\"ids\":\"testDevice\"},"
"\"stat_t\":\"testData/testDevice/uniqueSensor/stat_t\""
"}"
)
)
}
AHA_TEST(BinarySensorTest, device_class) {
initMqttTest(testDeviceId)
+20
View File
@@ -129,6 +129,26 @@ AHA_TEST(ButtonTest, name_setter) {
)
}
AHA_TEST(ButtonTest, object_id_setter) {
prepareTest
HAButton button(testUniqueId);
button.setObjectId("testId");
assertEntityConfig(
mock,
button,
(
"{"
"\"obj_id\":\"testId\","
"\"uniq_id\":\"uniqueButton\","
"\"dev\":{\"ids\":\"testDevice\"},"
"\"cmd_t\":\"testData/testDevice/uniqueButton/cmd_t\""
"}"
)
)
}
AHA_TEST(ButtonTest, device_class) {
prepareTest
+41
View File
@@ -70,6 +70,47 @@ AHA_TEST(CameraTest, availability) {
)
}
AHA_TEST(CameraTest, name_setter) {
initMqttTest(testDeviceId)
HACamera camera(testUniqueId);
camera.setName("testName");
assertEntityConfig(
mock,
camera,
(
"{"
"\"name\":\"testName\","
"\"uniq_id\":\"uniqueCamera\","
"\"dev\":{\"ids\":\"testDevice\"},"
"\"t\":\"testData/testDevice/uniqueCamera/t\""
"}"
)
)
}
AHA_TEST(CameraTest, object_id_setter) {
initMqttTest(testDeviceId)
HACamera camera(testUniqueId);
camera.setObjectId("testId");
assertEntityConfig(
mock,
camera,
(
"{"
"\"obj_id\":\"testId\","
"\"uniq_id\":\"uniqueCamera\","
"\"dev\":{\"ids\":\"testDevice\"},"
"\"t\":\"testData/testDevice/uniqueCamera/t\""
"}"
)
)
}
AHA_TEST(CameraTest, icon_setter) {
initMqttTest(testDeviceId)
+21
View File
@@ -196,6 +196,27 @@ AHA_TEST(CoverTest, name_setter) {
)
}
AHA_TEST(CoverTest, object_id_setter) {
prepareTest
HACover cover(testUniqueId);
cover.setObjectId("testId");
assertEntityConfig(
mock,
cover,
(
"{"
"\"obj_id\":\"testId\","
"\"uniq_id\":\"uniqueCover\","
"\"dev\":{\"ids\":\"testDevice\"},"
"\"stat_t\":\"testData/testDevice/uniqueCover/stat_t\","
"\"cmd_t\":\"testData/testDevice/uniqueCover/cmd_t\""
"}"
)
)
}
AHA_TEST(CoverTest, device_class) {
prepareTest
@@ -178,6 +178,26 @@ AHA_TEST(DeviceTrackerTest, name_setter) {
)
}
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, icon_setter) {
initMqttTest(testDeviceId)
+21
View File
@@ -240,6 +240,27 @@ AHA_TEST(FanTest, name_setter) {
)
}
AHA_TEST(FanTest, object_id_setter) {
prepareTest
HAFan fan(testUniqueId);
fan.setObjectId("testId");
assertEntityConfig(
mock,
fan,
(
"{"
"\"obj_id\":\"testId\","
"\"uniq_id\":\"uniqueFan\","
"\"dev\":{\"ids\":\"testDevice\"},"
"\"stat_t\":\"testData/testDevice/uniqueFan/stat_t\","
"\"cmd_t\":\"testData/testDevice/uniqueFan/cmd_t\""
"}"
)
)
}
AHA_TEST(FanTest, icon_setter) {
prepareTest
+20
View File
@@ -548,6 +548,26 @@ AHA_TEST(HVACTest, name_setter) {
)
}
AHA_TEST(HVACTest, object_id_setter) {
prepareTest
HAHVAC hvac(testUniqueId);
hvac.setObjectId("testId");
assertEntityConfig(
mock,
hvac,
(
"{"
"\"obj_id\":\"testId\","
"\"uniq_id\":\"uniqueHVAC\","
"\"curr_temp_t\":\"testData/testDevice/uniqueHVAC/curr_temp_t\","
"\"dev\":{\"ids\":\"testDevice\"}"
"}"
)
)
}
AHA_TEST(HVACTest, icon_setter) {
prepareTest
+21
View File
@@ -423,6 +423,27 @@ AHA_TEST(LightTest, name_setter) {
)
}
AHA_TEST(LightTest, object_id_setter) {
prepareTest
HALight light(testUniqueId);
light.setObjectId("testId");
assertEntityConfig(
mock,
light,
(
"{"
"\"obj_id\":\"testId\","
"\"uniq_id\":\"uniqueLight\","
"\"dev\":{\"ids\":\"testDevice\"},"
"\"stat_t\":\"testData/testDevice/uniqueLight/stat_t\","
"\"cmd_t\":\"testData/testDevice/uniqueLight/cmd_t\""
"}"
)
)
}
AHA_TEST(LightTest, icon_setter) {
prepareTest
+21
View File
@@ -160,6 +160,27 @@ AHA_TEST(LockTest, name_setter) {
)
}
AHA_TEST(LockTest, object_id_setter) {
prepareTest
HALock lock(testUniqueId);
lock.setObjectId("testId");
assertEntityConfig(
mock,
lock,
(
"{"
"\"obj_id\":\"testId\","
"\"uniq_id\":\"uniqueLock\","
"\"dev\":{\"ids\":\"testDevice\"},"
"\"stat_t\":\"testData/testDevice/uniqueLock/stat_t\","
"\"cmd_t\":\"testData/testDevice/uniqueLock/cmd_t\""
"}"
)
)
}
AHA_TEST(LockTest, icon_setter) {
prepareTest
+21
View File
@@ -335,6 +335,27 @@ AHA_TEST(NumberTest, name_setter) {
)
}
AHA_TEST(NumberTest, object_id_setter) {
prepareTest
HANumber number(testUniqueId);
number.setObjectId("testId");
assertEntityConfig(
mock,
number,
(
"{"
"\"obj_id\":\"testId\","
"\"uniq_id\":\"uniqueNumber\","
"\"dev\":{\"ids\":\"testDevice\"},"
"\"stat_t\":\"testData/testDevice/uniqueNumber/stat_t\","
"\"cmd_t\":\"testData/testDevice/uniqueNumber/cmd_t\""
"}"
)
)
}
AHA_TEST(NumberTest, device_class) {
prepareTest
+20
View File
@@ -129,6 +129,26 @@ AHA_TEST(SceneTest, name_setter) {
)
}
AHA_TEST(SceneTest, object_id_setter) {
prepareTest
HAScene scene(testUniqueId);
scene.setObjectId("testId");
assertEntityConfig(
mock,
scene,
(
"{"
"\"obj_id\":\"testId\","
"\"uniq_id\":\"uniqueScene\","
"\"pl_on\":\"ON\","
"\"cmd_t\":\"testData/testDevice/uniqueScene/cmd_t\""
"}"
)
)
}
AHA_TEST(SceneTest, icon_setter) {
prepareTest
+23
View File
@@ -244,6 +244,29 @@ AHA_TEST(SelectTest, name_setter) {
)
}
AHA_TEST(SelectTest, object_id_setter) {
prepareTest
HASelect select(testUniqueId);
select.setOptions("Option A;B;C");
select.setObjectId("testId");
assertEntityConfig(
mock,
select,
(
"{"
"\"obj_id\":\"testId\","
"\"uniq_id\":\"uniqueSelect\","
"\"options\":[\"Option A\",\"B\",\"C\"],"
"\"dev\":{\"ids\":\"testDevice\"},"
"\"stat_t\":\"testData/testDevice/uniqueSelect/stat_t\","
"\"cmd_t\":\"testData/testDevice/uniqueSelect/cmd_t\""
"}"
)
)
}
AHA_TEST(SelectTest, icon_setter) {
prepareTest
+20
View File
@@ -90,6 +90,26 @@ AHA_TEST(SensorTest, name_setter) {
)
}
AHA_TEST(SensorTest, object_id_setter) {
initMqttTest(testDeviceId)
HASensor sensor(testUniqueId);
sensor.setObjectId("testId");
assertEntityConfig(
mock,
sensor,
(
"{"
"\"obj_id\":\"testId\","
"\"uniq_id\":\"uniqueSensor\","
"\"dev\":{\"ids\":\"testDevice\"},"
"\"stat_t\":\"testData/testDevice/uniqueSensor/stat_t\""
"}"
)
)
}
AHA_TEST(SensorTest, device_class_setter) {
initMqttTest(testDeviceId)
+21
View File
@@ -160,6 +160,27 @@ AHA_TEST(SwitchTest, name_setter) {
)
}
AHA_TEST(SwitchTest, object_id_setter) {
prepareTest
HASwitch testSwitch(testUniqueId);
testSwitch.setObjectId("testId");
assertEntityConfig(
mock,
testSwitch,
(
"{"
"\"obj_id\":\"testId\","
"\"uniq_id\":\"uniqueSwitch\","
"\"dev\":{\"ids\":\"testDevice\"},"
"\"stat_t\":\"testData/testDevice/uniqueSwitch/stat_t\","
"\"cmd_t\":\"testData/testDevice/uniqueSwitch/cmd_t\""
"}"
)
)
}
AHA_TEST(SwitchTest, device_class) {
prepareTest