From 57160661ec3dc776e7b9cae5b87607029474488f Mon Sep 17 00:00:00 2001 From: Nicu Hodos Date: Fri, 6 Jun 2025 13:43:32 +0200 Subject: [PATCH] use type safe SensorStateClass-es --- src/enums.h | 26 ++++++++++++++++++++++++++ src/ha.h | 11 ++++++----- 2 files changed, 32 insertions(+), 5 deletions(-) create mode 100644 src/enums.h diff --git a/src/enums.h b/src/enums.h new file mode 100644 index 0000000..0dce396 --- /dev/null +++ b/src/enums.h @@ -0,0 +1,26 @@ +#pragma once + +class EnumClass { + const char* value = nullptr; +public: + EnumClass() {} + + EnumClass(const char* v) { + value = v; + } + + operator const char*() { + return value; + } + + operator bool() { + return value != nullptr; + } +}; + +namespace Ha { + struct SensorStateClass : EnumClass { + SensorStateClass() : EnumClass() {} + SensorStateClass(const char* value) : EnumClass(value) {} + } MEASUREMENT{ "measurement" }, MEASUREMENT_ANGLE{ "measurement_angle" }, TOTAL{ "total" }, TOTAL_INCREASING{ "total_increasing" }; +} diff --git a/src/ha.h b/src/ha.h index 7d436f3..4e702c5 100644 --- a/src/ha.h +++ b/src/ha.h @@ -2,6 +2,7 @@ #include #include "list.h" +#include "enums.h" using namespace std; @@ -289,7 +290,7 @@ namespace Ha { struct Sensor : Component, State { const char* unitMeasure = nullptr; unsigned int precision = 2; - const char* sensorStateClass = nullptr; + SensorStateClass sensorStateClass; inline static unordered_map mapSensors; Sensor(const char* name, const char* id) : Component(id, name, "sensor"), State(this) { @@ -302,7 +303,7 @@ namespace Ha { State::buildConfig(jsonDoc); if (unitMeasure) jsonDoc["unit_of_measurement"] = unitMeasure; if (isNumericSensor()) jsonDoc["suggested_display_precision"] = precision; - if (sensorStateClass) jsonDoc["state_class"] = sensorStateClass; + if (sensorStateClass) jsonDoc["state_class"] = static_cast(sensorStateClass); } private: @@ -315,7 +316,7 @@ namespace Ha { TemperatureSensor(const char* id, const char* name = "Temperature") : Sensor(name, id) { deviceClass = "temperature"; unitMeasure = "°C"; - sensorStateClass = "measurement"; + sensorStateClass = MEASUREMENT; } }; @@ -323,7 +324,7 @@ namespace Ha { HumiditySensor(const char* id, const char* name = "Humidity") : Sensor(name, id) { deviceClass = "humidity"; unitMeasure = "%"; - sensorStateClass = "measurement"; + sensorStateClass = MEASUREMENT; } }; @@ -411,7 +412,7 @@ namespace Ha { return *this; } - Builder& withSensorStateClass(const char* value) { + Builder& withSensorStateClass(SensorStateClass value) { cmp->sensorStateClass = value; return *this; }