initial commit.
This commit is contained in:
46
components/truma_inetbox/sensor/TrumaSensor.cpp
Normal file
46
components/truma_inetbox/sensor/TrumaSensor.cpp
Normal file
@@ -0,0 +1,46 @@
|
||||
#include "TrumaSensor.h"
|
||||
#include "esphome/core/log.h"
|
||||
#include "esphome/components/truma_inetbox/helpers.h"
|
||||
|
||||
namespace esphome {
|
||||
namespace truma_inetbox {
|
||||
|
||||
static const char *const TAG = "truma_inetbox.sensor";
|
||||
|
||||
void TrumaSensor::setup() {
|
||||
this->parent_->register_listener([this](const StatusFrameHeater *status_heater) {
|
||||
switch (this->type_) {
|
||||
case TRUMA_SENSOR_TYPE::CURRENT_ROOM_TEMPERATURE:
|
||||
this->publish_state(temp_code_to_decimal(status_heater->current_temp_room));
|
||||
break;
|
||||
case TRUMA_SENSOR_TYPE::CURRENT_WATER_TEMPERATURE:
|
||||
this->publish_state(temp_code_to_decimal(status_heater->current_temp_water));
|
||||
break;
|
||||
case TRUMA_SENSOR_TYPE::TARGET_ROOM_TEMPERATURE:
|
||||
this->publish_state(temp_code_to_decimal(status_heater->target_temp_room));
|
||||
break;
|
||||
case TRUMA_SENSOR_TYPE::TARGET_WATER_TEMPERATURE:
|
||||
this->publish_state(temp_code_to_decimal(status_heater->target_temp_water));
|
||||
break;
|
||||
case TRUMA_SENSOR_TYPE::HEATING_MODE:
|
||||
this->publish_state(static_cast<float>(status_heater->heating_mode));
|
||||
break;
|
||||
case TRUMA_SENSOR_TYPE::ELECTRIC_POWER_LEVEL:
|
||||
this->publish_state(static_cast<float>(status_heater->el_power_level_a));
|
||||
break;
|
||||
case TRUMA_SENSOR_TYPE::ENERGY_MIX:
|
||||
this->publish_state(static_cast<float>(status_heater->energy_mix_a));
|
||||
break;
|
||||
case TRUMA_SENSOR_TYPE::OPERATING_STATUS:
|
||||
this->publish_state(static_cast<float>(status_heater->operating_status));
|
||||
break;
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
void TrumaSensor::dump_config() {
|
||||
LOG_SENSOR("", "Truma Sensor", this);
|
||||
ESP_LOGCONFIG(TAG, "Type %u", this->type_);
|
||||
}
|
||||
} // namespace truma_inetbox
|
||||
} // namespace esphome
|
||||
32
components/truma_inetbox/sensor/TrumaSensor.h
Normal file
32
components/truma_inetbox/sensor/TrumaSensor.h
Normal file
@@ -0,0 +1,32 @@
|
||||
#pragma once
|
||||
|
||||
#include "esphome/components/sensor/sensor.h"
|
||||
#include "esphome/components/truma_inetbox/TrumaiNetBoxApp.h"
|
||||
|
||||
namespace esphome {
|
||||
namespace truma_inetbox {
|
||||
enum class TRUMA_SENSOR_TYPE {
|
||||
CURRENT_ROOM_TEMPERATURE,
|
||||
CURRENT_WATER_TEMPERATURE,
|
||||
TARGET_ROOM_TEMPERATURE,
|
||||
TARGET_WATER_TEMPERATURE,
|
||||
HEATING_MODE,
|
||||
ELECTRIC_POWER_LEVEL,
|
||||
ENERGY_MIX,
|
||||
OPERATING_STATUS,
|
||||
};
|
||||
|
||||
class TrumaSensor : public Component, public sensor::Sensor, public Parented<TrumaiNetBoxApp> {
|
||||
public:
|
||||
void setup() override;
|
||||
void dump_config() override;
|
||||
|
||||
void set_type(TRUMA_SENSOR_TYPE val) { this->type_ = val; }
|
||||
|
||||
protected:
|
||||
TRUMA_SENSOR_TYPE type_;
|
||||
|
||||
private:
|
||||
};
|
||||
} // namespace truma_inetbox
|
||||
} // namespace esphome
|
||||
82
components/truma_inetbox/sensor/__init__.py
Normal file
82
components/truma_inetbox/sensor/__init__.py
Normal file
@@ -0,0 +1,82 @@
|
||||
from esphome.components import sensor
|
||||
import esphome.config_validation as cv
|
||||
import esphome.codegen as cg
|
||||
from esphome.const import (
|
||||
CONF_ID,
|
||||
CONF_TYPE,
|
||||
DEVICE_CLASS_TEMPERATURE,
|
||||
CONF_UNIT_OF_MEASUREMENT,
|
||||
UNIT_CELSIUS,
|
||||
CONF_ICON,
|
||||
ICON_THERMOMETER,
|
||||
STATE_CLASS_MEASUREMENT,
|
||||
CONF_ACCURACY_DECIMALS,
|
||||
CONF_DEVICE_CLASS,
|
||||
UNIT_WATT,
|
||||
UNIT_EMPTY,
|
||||
ICON_GAS_CYLINDER,
|
||||
ICON_POWER,
|
||||
)
|
||||
from .. import truma_inetbox_ns, CONF_TRUMA_INETBOX_ID, TrumaINetBoxApp
|
||||
|
||||
DEPENDENCIES = ["truma_inetbox"]
|
||||
CODEOWNERS = ["@Fabian-Schmidt"]
|
||||
|
||||
TrumaSensor = truma_inetbox_ns.class_(
|
||||
"TrumaSensor", sensor.Sensor, cg.Component)
|
||||
|
||||
# `TRUMA_SENSOR_TYPE` is a enum class and not a namespace but it works.
|
||||
TRUMA_SENSOR_TYPE_dummy_ns = truma_inetbox_ns.namespace("TRUMA_SENSOR_TYPE")
|
||||
|
||||
# 0 - C++ enum
|
||||
# 1 - CONF_UNIT_OF_MEASUREMENT
|
||||
# 2 - CONF_ICON
|
||||
# 3 - CONF_ACCURACY_DECIMALS
|
||||
# 4 - CONF_DEVICE_CLASS
|
||||
CONF_SUPPORTED_TYPE = {
|
||||
"CURRENT_ROOM_TEMPERATURE": (TRUMA_SENSOR_TYPE_dummy_ns.CURRENT_ROOM_TEMPERATURE, UNIT_CELSIUS, ICON_THERMOMETER, 1, DEVICE_CLASS_TEMPERATURE),
|
||||
"CURRENT_WATER_TEMPERATURE": (TRUMA_SENSOR_TYPE_dummy_ns.CURRENT_WATER_TEMPERATURE, UNIT_CELSIUS, ICON_THERMOMETER, 1, DEVICE_CLASS_TEMPERATURE),
|
||||
"TARGET_ROOM_TEMPERATURE": (TRUMA_SENSOR_TYPE_dummy_ns.TARGET_ROOM_TEMPERATURE, UNIT_CELSIUS, ICON_THERMOMETER, 0, DEVICE_CLASS_TEMPERATURE),
|
||||
"TARGET_WATER_TEMPERATURE": (TRUMA_SENSOR_TYPE_dummy_ns.TARGET_WATER_TEMPERATURE, UNIT_CELSIUS, ICON_THERMOMETER, 0, DEVICE_CLASS_TEMPERATURE),
|
||||
"HEATING_MODE": (TRUMA_SENSOR_TYPE_dummy_ns.HEATING_MODE, UNIT_EMPTY, ICON_THERMOMETER, 0, DEVICE_CLASS_TEMPERATURE),
|
||||
"ELECTRIC_POWER_LEVEL": (TRUMA_SENSOR_TYPE_dummy_ns.ELECTRIC_POWER_LEVEL, UNIT_WATT, ICON_POWER, 0, DEVICE_CLASS_TEMPERATURE),
|
||||
"ENERGY_MIX": (TRUMA_SENSOR_TYPE_dummy_ns.ENERGY_MIX, UNIT_EMPTY, ICON_GAS_CYLINDER, 0, DEVICE_CLASS_TEMPERATURE),
|
||||
"OPERATING_STATUS": (TRUMA_SENSOR_TYPE_dummy_ns.OPERATING_STATUS, UNIT_EMPTY, ICON_POWER, 0, DEVICE_CLASS_TEMPERATURE),
|
||||
}
|
||||
|
||||
|
||||
def set_default_based_on_type():
|
||||
def set_defaults_(config):
|
||||
# set defaults based on sensor type:
|
||||
if CONF_UNIT_OF_MEASUREMENT not in config:
|
||||
config[CONF_UNIT_OF_MEASUREMENT] = CONF_SUPPORTED_TYPE[config[CONF_TYPE]][1]
|
||||
if CONF_ICON not in config:
|
||||
config[CONF_ICON] = CONF_SUPPORTED_TYPE[config[CONF_TYPE]][2]
|
||||
if CONF_ACCURACY_DECIMALS not in config:
|
||||
config[CONF_ACCURACY_DECIMALS] = CONF_SUPPORTED_TYPE[config[CONF_TYPE]][3]
|
||||
if CONF_DEVICE_CLASS not in config:
|
||||
config[CONF_DEVICE_CLASS] = CONF_SUPPORTED_TYPE[config[CONF_TYPE]][4]
|
||||
return config
|
||||
|
||||
return set_defaults_
|
||||
|
||||
|
||||
CONFIG_SCHEMA = sensor.sensor_schema(
|
||||
state_class=STATE_CLASS_MEASUREMENT
|
||||
).extend(
|
||||
{
|
||||
cv.GenerateID(): cv.declare_id(TrumaSensor),
|
||||
cv.GenerateID(CONF_TRUMA_INETBOX_ID): cv.use_id(TrumaINetBoxApp),
|
||||
cv.Required(CONF_TYPE): cv.enum(CONF_SUPPORTED_TYPE, upper=True),
|
||||
}
|
||||
).extend(cv.COMPONENT_SCHEMA)
|
||||
FINAL_VALIDATE_SCHEMA = set_default_based_on_type()
|
||||
|
||||
|
||||
async def to_code(config):
|
||||
var = cg.new_Pvariable(config[CONF_ID])
|
||||
await cg.register_component(var, config)
|
||||
await sensor.register_sensor(var, config)
|
||||
await cg.register_parented(var, config[CONF_TRUMA_INETBOX_ID])
|
||||
|
||||
cg.add(var.set_type(CONF_SUPPORTED_TYPE[config[CONF_TYPE]][0]))
|
||||
Reference in New Issue
Block a user