use type safe SensorStateClass-es

This commit is contained in:
Nicu Hodos 2025-06-06 13:43:32 +02:00
parent 391fa927ba
commit 57160661ec
2 changed files with 32 additions and 5 deletions

26
src/enums.h Normal file
View File

@ -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" };
}

View File

@ -2,6 +2,7 @@
#include <ArduinoJson.h> #include <ArduinoJson.h>
#include "list.h" #include "list.h"
#include "enums.h"
using namespace std; using namespace std;
@ -289,7 +290,7 @@ namespace Ha {
struct Sensor : Component, State { struct Sensor : Component, State {
const char* unitMeasure = nullptr; const char* unitMeasure = nullptr;
unsigned int precision = 2; unsigned int precision = 2;
const char* sensorStateClass = nullptr; SensorStateClass sensorStateClass;
inline static unordered_map<string, Sensor*> mapSensors; inline static unordered_map<string, Sensor*> mapSensors;
Sensor(const char* name, const char* id) : Component(id, name, "sensor"), State(this) { Sensor(const char* name, const char* id) : Component(id, name, "sensor"), State(this) {
@ -302,7 +303,7 @@ namespace Ha {
State::buildConfig(jsonDoc); State::buildConfig(jsonDoc);
if (unitMeasure) jsonDoc["unit_of_measurement"] = unitMeasure; if (unitMeasure) jsonDoc["unit_of_measurement"] = unitMeasure;
if (isNumericSensor()) jsonDoc["suggested_display_precision"] = precision; if (isNumericSensor()) jsonDoc["suggested_display_precision"] = precision;
if (sensorStateClass) jsonDoc["state_class"] = sensorStateClass; if (sensorStateClass) jsonDoc["state_class"] = static_cast<const char*>(sensorStateClass);
} }
private: private:
@ -315,7 +316,7 @@ namespace Ha {
TemperatureSensor(const char* id, const char* name = "Temperature") : Sensor(name, id) { TemperatureSensor(const char* id, const char* name = "Temperature") : Sensor(name, id) {
deviceClass = "temperature"; deviceClass = "temperature";
unitMeasure = "°C"; unitMeasure = "°C";
sensorStateClass = "measurement"; sensorStateClass = MEASUREMENT;
} }
}; };
@ -323,7 +324,7 @@ namespace Ha {
HumiditySensor(const char* id, const char* name = "Humidity") : Sensor(name, id) { HumiditySensor(const char* id, const char* name = "Humidity") : Sensor(name, id) {
deviceClass = "humidity"; deviceClass = "humidity";
unitMeasure = "%"; unitMeasure = "%";
sensorStateClass = "measurement"; sensorStateClass = MEASUREMENT;
} }
}; };
@ -411,7 +412,7 @@ namespace Ha {
return *this; return *this;
} }
Builder& withSensorStateClass(const char* value) { Builder& withSensorStateClass(SensorStateClass value) {
cmp->sensorStateClass = value; cmp->sensorStateClass = value;
return *this; return *this;
} }