diff --git a/include/devices.h b/include/devices.h index 3c7ad82..100c7a6 100644 --- a/include/devices.h +++ b/include/devices.h @@ -12,7 +12,7 @@ auto roomSensor = Builder::instance(TEMP_SENSOR) .withArea("Basement") .withParent(gatewayDevice)) .withValueTemplate("{{ value_json.sensor.temperature }}") - .addPreconfigured(batterySensors(TEMP_SENSOR, 2.5, 4.5)) + .addPreconfigured(batterySensors(TEMP_SENSOR, BATTERY_PERCENTAGE_TEMPLATE(2.5, 2))) .build(); auto tankSensor = Builder::instance(new Sensor{ "Level", OIL_SENSOR }) @@ -34,7 +34,7 @@ auto tankSensor = Builder::instance(new Sensor{ "Level", OIL_SENSOR }) .withValueTemplate("{{ value_json.sensor.value }}") .build() ) - .addPreconfigured(batterySensors(OIL_SENSOR, 4.0, 6.4)) + .addPreconfigured(batterySensors(OIL_SENSOR, BATTERY_PERCENTAGE_TEMPLATE(4, 2.4))) .build(); auto presenceTracker = Builder::instance(PRESENCE_SENSOR) @@ -44,7 +44,7 @@ auto presenceTracker = Builder::instance(PRESENCE_SENSOR) .withModel("AtTiny85") .withParent(gatewayDevice)) .withValueTemplate("{{ value_json.sensor.state }}") - .addPreconfigured(batterySensors(PRESENCE_SENSOR, 2.7, 3.3)) + .addPreconfigured(batterySensors(PRESENCE_SENSOR, BATTERY_PERCENTAGE_TEMPLATE(2.7, 0.6))) .withOffDelaySeconds(5*60) .withDeviceClass("presence") .build(); diff --git a/include/rc_devices.h b/include/rc_devices.h index 32d5c90..c79ea06 100644 --- a/include/rc_devices.h +++ b/include/rc_devices.h @@ -1,6 +1,7 @@ #pragma once #define MAIN_DEVICE_ID "rc-gateway" +#define BATTERY_PERCENTAGE_TEMPLATE(min, diff) "{{ ((value_json.sensor.diagnostic.voltage|float-" #min ")|round(2)*100/" #diff ")|int }}" #include "esp.h" #include "ha.h" @@ -72,22 +73,13 @@ struct EasyHomeSwitch : Switch { } }; -VoltageSensor* createVoltageSensor(const char* id) { - return new VoltageSensor{id, "Battery voltage", "{{ value_json.sensor.diagnostic.voltage }}"}; -} - -#define BATTERY_PERCENTAGE_TEMPLATE "{{ ((value_json.sensor.diagnostic.voltage|float-%.2f)|round(2)*100/%.2f)|int }}" -BatterySensor* createBatterySensor(const char* id, float min, float max) { - auto len = snprintf(nullptr, 0, BATTERY_PERCENTAGE_TEMPLATE, min, max - min) + 1; - char* value_json = new char[len]; - snprintf(value_json, len, BATTERY_PERCENTAGE_TEMPLATE, min, max - min); - return new BatterySensor{id, "Battery level", value_json}; -} - template -auto batterySensors(const char* id, float min, float max) { - return [id, min, max](Builder& builder) -> Builder& { - builder.addDiagnostic(createVoltageSensor(id)).addDiagnostic(createBatterySensor(id, min, max)).build(); +auto batterySensors(const char* id, const char* batterySensorTemplate) { + return [id, batterySensorTemplate](Builder& builder) -> Builder& { + builder + .addDiagnostic(new VoltageSensor{id, "Battery voltage", "{{ value_json.sensor.diagnostic.voltage }}"}) + .addDiagnostic(new BatterySensor{id, "Battery level", batterySensorTemplate}) + .build(); return builder; }; }