Replies: 3 comments 13 replies
|
I have the WPL-25 and I was wondering where the "Inverter Power" was, so that I can track when the energy is used through the day, rather than look at Heat or Water energy produced, so I am keen to see the full set of my HPs ISG data presented in the integration |
|
With the ISG Version 5.12.2.3 the ISG has the Power Consumption Values integrated. Also the Power Consumption of the Heatpump These registers are also availiable via Modbus (WPM/LWZ). The values are different because i was too slow with the screenshots :-( for the secondarys (WPM only): |
|
Hallo @pail23 ,
binary_sensor.py """Binary sensor platform for stiebel_eltron_isg."""
"""Change 18.02.2025 JG - V.2025.2.0 - Extended register scope"""
from homeassistant.components.binary_sensor import (
BinarySensorEntity,
BinarySensorEntityDescription,
)
from homeassistant.const import EntityCategory
from homeassistant.core import HomeAssistant
from homeassistant.helpers.entity_platform import AddEntitiesCallback
from .const import (
BUFFER_1_CHARGING_PUMP,
BUFFER_2_CHARGING_PUMP,
BUFFER_3_CHARGING_PUMP,
BUFFER_4_CHARGING_PUMP,
BUFFER_5_CHARGING_PUMP,
BUFFER_6_CHARGING_PUMP,
BUS_STATUS,
CAN_BUS_STATUS_ERROR_1,
CAN_BUS_STATUS_ERROR_2,
CAN_BUS_STATUS_FAULT,
CAN_BUS_STATUS_LINE_FAULT,
CAN_BUS_STATUS_OK,
COMPRESSOR_FAULT,
COMPRESSOR_ON,
COOLING_MODE,
DEFROST_LL_WT,
DEFROST_STATUS,
DEVICE_TYPE_504INV,
DEVICE_TYPE_5CS,
DEVICE_TYPE_8CS,
DEVICE_TYPE_8CSE,
DHW_CHARGING_PUMP,
DIFF_CONTROLLER_1_PUMP,
DIFF_CONTROLLER_2_PUMP,
DOMAIN,
ELECTRIC_REHEATING,
EMERGENCY_HEATING_1,
EMERGENCY_HEATING_1_2,
EMERGENCY_HEATING_2,
ENERGYMANAGEMENT,
ERROR_STATUS,
EVAPORATOR_DEFROST,
FILTER,
FILTER_EXTRACT_AIR,
FILTER_VENTILATION_AIR,
HEATING_CIRCUIT_1_PUMP,
HEATING_CIRCUIT_2_PUMP,
HEATING_CIRCUIT_3_PUMP,
HEATING_CIRCUIT_4_PUMP,
HEATING_CIRCUIT_5_PUMP,
HEAT_PUMP_1_ON,
HEAT_PUMP_2_ON,
HEAT_PUMP_3_ON,
HEAT_PUMP_4_ON,
HEAT_PUMP_5_ON,
HEAT_PUMP_6_ON,
HEAT_UP_PROGRAM,
IS_COOLING,
IS_HEATING,
IS_HEATING_WATER,
IS_SUMMER_MODE,
MIXER_CLOSE_HTG_CIRCUIT_2,
MIXER_CLOSE_HTG_CIRCUIT_3,
MIXER_CLOSE_HTG_CIRCUIT_4,
MIXER_CLOSE_HTG_CIRCUIT_5,
MIXER_OPEN_HTG_CIRCUIT_2,
MIXER_OPEN_HTG_CIRCUIT_3,
MIXER_OPEN_HTG_CIRCUIT_4,
MIXER_OPEN_HTG_CIRCUIT_5,
NHZ_STAGES_RUNNING,
OVEN_FIREPLACE_ACTIV,
POOL_PRIMARY_PUMP,
POOL_SECONDARY_PUMP,
POWER_OFF,
PUMP_ON_HK1,
PUMP_ON_HK2,
SECOND_GENERATOR_DHW,
SECOND_GENERATOR_HEATING,
SERVICE,
SOURCE_PUMP,
SWITCHING_PROGRAM_ENABLED,
VENTILATION,
)
from .data import StiebelEltronISGIntegrationConfigEntry
from .entity import StiebelEltronISGEntity
BINARY_SENSOR_TYPES = [
BinarySensorEntityDescription(
name="Is heating",
key=IS_HEATING,
icon="mdi:heat-wave",
has_entity_name=True,
),
BinarySensorEntityDescription(
name="Is heating boiler",
key=IS_HEATING_WATER,
icon="mdi:water-boiler",
has_entity_name=True,
),
BinarySensorEntityDescription(
name="Is in summer mode",
key=IS_SUMMER_MODE,
icon="mdi:weather-sunny",
has_entity_name=True,
),
BinarySensorEntityDescription(
name="Is cooling",
key=IS_COOLING,
icon="mdi:snowflake",
has_entity_name=True,
),
BinarySensorEntityDescription(
name="Pump HK1",
key=PUMP_ON_HK1,
icon="mdi:pump",
has_entity_name=True,
),
BinarySensorEntityDescription(
name="Pump HK2",
key=PUMP_ON_HK2,
icon="mdi:pump",
has_entity_name=True,
),
BinarySensorEntityDescription(
name="Compressor",
key=COMPRESSOR_ON,
icon="mdi:heat-pump",
has_entity_name=True,
),
BinarySensorEntityDescription(
name="Switching Program Enabled",
key=SWITCHING_PROGRAM_ENABLED,
icon="mdi:clock-outline",
has_entity_name=True,
),
BinarySensorEntityDescription(
name="Electric Heating",
key=ELECTRIC_REHEATING,
icon="mdi:fence-electric",
has_entity_name=True,
),
BinarySensorEntityDescription(
name="Service",
key=SERVICE,
icon="mdi:account-wrench",
has_entity_name=True,
),
BinarySensorEntityDescription(
name="Power Off (EVU)",
key=POWER_OFF,
icon="mdi:power-off",
has_entity_name=True,
),
BinarySensorEntityDescription(
name="Filter",
key=FILTER,
icon="mdi:air-filter",
has_entity_name=True,
),
BinarySensorEntityDescription(
name="Ventilation",
key=VENTILATION,
icon="mdi:fan",
has_entity_name=True,
),
BinarySensorEntityDescription(
name="Evaporator Defrost",
key=EVAPORATOR_DEFROST,
icon="mdi:snowflake-melt",
has_entity_name=True,
),
BinarySensorEntityDescription(
name="Filter Extract Air",
key=FILTER_EXTRACT_AIR,
icon="mdi:air-filter",
has_entity_name=True,
),
BinarySensorEntityDescription(
name="Filter Ventilation Air",
key=FILTER_VENTILATION_AIR,
icon="mdi:air-filter",
has_entity_name=True,
),
BinarySensorEntityDescription(
name="Heat-up Program",
key=HEAT_UP_PROGRAM,
icon="mdi:clock-outline",
has_entity_name=True,
),
BinarySensorEntityDescription(
name="NHZ Stages Running",
key=NHZ_STAGES_RUNNING,
icon="mdi:fence-electric",
has_entity_name=True,
),
BinarySensorEntityDescription(
name="Error Status",
key=ERROR_STATUS,
entity_category=EntityCategory.DIAGNOSTIC,
icon="mdi:alert",
has_entity_name=True,
),
BinarySensorEntityDescription(
name="Energymanagement",
key=ENERGYMANAGEMENT,
entity_category=EntityCategory.DIAGNOSTIC,
icon="mdi:information",
has_entity_name=True,
),
BinarySensorEntityDescription(
name="BUS Status",
key=BUS_STATUS,
entity_category=EntityCategory.DIAGNOSTIC,
icon="mdi:information",
has_entity_name=True,
),
BinarySensorEntityDescription(
name="Defrost Status",
key=DEFROST_STATUS,
entity_category=EntityCategory.DIAGNOSTIC,
icon="mdi:information",
has_entity_name=True,
),
BinarySensorEntityDescription(
name="Defrost_LL_WT",
key=DEFROST_LL_WT,
entity_category=EntityCategory.DIAGNOSTIC,
icon="mdi:information",
has_entity_name=True,
),
BinarySensorEntityDescription(
name="Oven Fireplace Activ",
key=OVEN_FIREPLACE_ACTIV,
entity_category=EntityCategory.DIAGNOSTIC,
icon="mdi:information",
has_entity_name=True,
),
BinarySensorEntityDescription(
name="Heating circuit 1 pump",
key=HEATING_CIRCUIT_1_PUMP,
icon="mdi:pump",
has_entity_name=True,
),
BinarySensorEntityDescription(
name="Heating circuit 2 pump",
key=HEATING_CIRCUIT_2_PUMP,
icon="mdi:pump",
has_entity_name=True,
),
BinarySensorEntityDescription(
name="Heating circuit 3 pump",
key=HEATING_CIRCUIT_3_PUMP,
icon="mdi:pump",
has_entity_name=True,
),
BinarySensorEntityDescription(
name="Heating circuit 4 pump",
key=HEATING_CIRCUIT_4_PUMP,
icon="mdi:pump",
has_entity_name=True,
),
BinarySensorEntityDescription(
name="Heating circuit 5 pump",
key=HEATING_CIRCUIT_5_PUMP,
icon="mdi:pump",
has_entity_name=True,
),
BinarySensorEntityDescription(
name="Buffer 1 charging pump",
key=BUFFER_1_CHARGING_PUMP,
icon="mdi:pump",
has_entity_name=True,
),
BinarySensorEntityDescription(
name="Buffer 2 charging pump",
key=BUFFER_2_CHARGING_PUMP,
icon="mdi:pump",
has_entity_name=True,
),
BinarySensorEntityDescription(
name="Buffer 3 charging pump",
key=BUFFER_3_CHARGING_PUMP,
icon="mdi:pump",
has_entity_name=True,
),
BinarySensorEntityDescription(
name="Buffer 4 charging pump",
key=BUFFER_4_CHARGING_PUMP,
icon="mdi:pump",
has_entity_name=True,
),
BinarySensorEntityDescription(
name="Buffer 5 charging pump",
key=BUFFER_5_CHARGING_PUMP,
icon="mdi:pump",
has_entity_name=True,
),
BinarySensorEntityDescription(
name="Buffer 6 charging pump",
key=BUFFER_6_CHARGING_PUMP,
icon="mdi:pump",
has_entity_name=True,
),
BinarySensorEntityDescription(
name="DHW charging pump",
key=DHW_CHARGING_PUMP,
icon="mdi:pump",
has_entity_name=True,
),
BinarySensorEntityDescription(
name="Source pump",
key=SOURCE_PUMP,
icon="mdi:pump",
has_entity_name=True,
),
BinarySensorEntityDescription(
name="Diff. controller 1 pump",
key=DIFF_CONTROLLER_1_PUMP,
icon="mdi:pump",
has_entity_name=True,
),
BinarySensorEntityDescription(
name="Diff. controller 2 pump",
key=DIFF_CONTROLLER_2_PUMP,
icon="mdi:pump",
has_entity_name=True,
),
BinarySensorEntityDescription(
name="Pool primary pump",
key=POOL_PRIMARY_PUMP,
icon="mdi:pump",
has_entity_name=True,
),
BinarySensorEntityDescription(
name="Pool secondary pump",
key=POOL_SECONDARY_PUMP,
icon="mdi:pump",
has_entity_name=True,
),
BinarySensorEntityDescription(
name="Heat pump 1 ON",
key=HEAT_PUMP_1_ON,
icon="mdi:heat-pump",
has_entity_name=True,
),
BinarySensorEntityDescription(
name="Heat pump 2 ON",
key=HEAT_PUMP_2_ON,
icon="mdi:heat-pump",
has_entity_name=True,
),
BinarySensorEntityDescription(
name="Heat pump 3 ON",
key=HEAT_PUMP_3_ON,
icon="mdi:heat-pump",
has_entity_name=True,
),
BinarySensorEntityDescription(
name="Heat pump 4 ON",
key=HEAT_PUMP_4_ON,
icon="mdi:heat-pump",
has_entity_name=True,
),
BinarySensorEntityDescription(
name="Heat pump 5 ON",
key=HEAT_PUMP_5_ON,
icon="mdi:heat-pump",
has_entity_name=True,
),
BinarySensorEntityDescription(
name="Heat pump 6 ON",
key=HEAT_PUMP_6_ON,
icon="mdi:heat-pump",
has_entity_name=True,
),
BinarySensorEntityDescription(
name="Second generator for DHW",
key=SECOND_GENERATOR_DHW,
icon="mdi:water-boiler",
has_entity_name=True,
),
BinarySensorEntityDescription(
name="Second generator for heating",
key=SECOND_GENERATOR_HEATING,
icon="mdi:water-boiler",
has_entity_name=True,
),
BinarySensorEntityDescription(
name="Cooling active",
key=COOLING_MODE,
icon="mdi:snowflake",
has_entity_name=True,
),
BinarySensorEntityDescription(
name="Mixer opening heating circuit 2",
key=MIXER_OPEN_HTG_CIRCUIT_2,
icon="mdi:valve-open",
has_entity_name=True,
),
BinarySensorEntityDescription(
name="Mixer opening heating circuit 3",
key=MIXER_OPEN_HTG_CIRCUIT_3,
icon="mdi:valve-open",
has_entity_name=True,
),
BinarySensorEntityDescription(
name="Mixer opening heating circuit 4",
key=MIXER_OPEN_HTG_CIRCUIT_4,
icon="mdi:valve-open",
has_entity_name=True,
),
BinarySensorEntityDescription(
name="Mixer opening heating circuit 5",
key=MIXER_OPEN_HTG_CIRCUIT_5,
icon="mdi:valve-open",
has_entity_name=True,
),
BinarySensorEntityDescription(
name="Mixer closing heating circuit 2",
key=MIXER_CLOSE_HTG_CIRCUIT_2,
icon="mdi:valve-closed",
has_entity_name=True,
),
BinarySensorEntityDescription(
name="Mixer closing heating circuit 3",
key=MIXER_CLOSE_HTG_CIRCUIT_3,
icon="mdi:valve-closed",
has_entity_name=True,
),
BinarySensorEntityDescription(
name="Mixer closing heating circuit 4",
key=MIXER_CLOSE_HTG_CIRCUIT_4,
icon="mdi:valve-closed",
has_entity_name=True,
),
BinarySensorEntityDescription(
name="Mixer closing heating circuit 5",
key=MIXER_CLOSE_HTG_CIRCUIT_5,
icon="mdi:valve-closed",
has_entity_name=True,
),
BinarySensorEntityDescription(
name="Emergency heating 1",
key=EMERGENCY_HEATING_1,
icon="mdi:fence-electric",
has_entity_name=True,
),
BinarySensorEntityDescription(
name="Emergency heating 2",
key=EMERGENCY_HEATING_2,
icon="mdi:fence-electric",
has_entity_name=True,
),
BinarySensorEntityDescription(
name="Emergency heating 1 & 2",
key=EMERGENCY_HEATING_1_2,
icon="mdi:fence-electric",
has_entity_name=True,
),
BinarySensorEntityDescription(
name="Compressor Fault",
key=COMPRESSOR_FAULT,
icon="mdi:information",
has_entity_name=True,
),
BinarySensorEntityDescription(
name="Device Type 504INV",
key=DEVICE_TYPE_504INV,
icon="mdi:information",
has_entity_name=True,
),
BinarySensorEntityDescription(
name="Device Type 5CS",
key=DEVICE_TYPE_5CS,
icon="mdi:information",
has_entity_name=True,
),
BinarySensorEntityDescription(
name="Device Type 8CS",
key=DEVICE_TYPE_8CS,
icon="mdi:information",
has_entity_name=True,
),
BinarySensorEntityDescription(
name="Device Type 8CSE",
key=DEVICE_TYPE_8CSE,
icon="mdi:information",
has_entity_name=True,
),
BinarySensorEntityDescription(
name="CAN-BUS Status OK",
key=CAN_BUS_STATUS_OK,
icon="mdi:information",
has_entity_name=True,
),
BinarySensorEntityDescription(
name="CAN-BUS Status Fault",
key=CAN_BUS_STATUS_FAULT,
icon="mdi:information",
has_entity_name=True,
),
BinarySensorEntityDescription(
name="CAN-BUS Status Error 1",
key=CAN_BUS_STATUS_ERROR_1,
icon="mdi:information",
has_entity_name=True,
),
BinarySensorEntityDescription(
name="CAN-BUS Status Error 2",
key=CAN_BUS_STATUS_ERROR_2,
icon="mdi:information",
has_entity_name=True,
),
BinarySensorEntityDescription(
name="CAN-BUS Status Line Fault",
key=CAN_BUS_STATUS_LINE_FAULT,
icon="mdi:information",
has_entity_name=True,
),
]
async def async_setup_entry(
hass: HomeAssistant, # Unused function argument: `hass`
entry: StiebelEltronISGIntegrationConfigEntry,
async_add_devices: AddEntitiesCallback,
):
"""Set up the binary_sensor platform."""
coordinator = entry.runtime_data.coordinator
entities = []
for description in BINARY_SENSOR_TYPES:
sensor = StiebelEltronISGBinarySensor(
coordinator,
entry,
description,
)
entities.append(sensor)
async_add_devices(entities)
class StiebelEltronISGBinarySensor(StiebelEltronISGEntity, BinarySensorEntity):
"""integration_blueprint binary_sensor class."""
def __init__(
self,
coordinator,
config_entry,
description,
):
"""Initialize the binary sensor."""
self.entity_description = description
super().__init__(coordinator, config_entry)
@property
def unique_id(self) -> str | None:
"""Return the unique id of the sensor."""
return f"{DOMAIN}_{self.coordinator.name}_{self.entity_description.key}"
@property
def is_on(self):
"""Return true if the binary_sensor is on."""
return self.coordinator.data.get(self.entity_description.key)
@property
def available(self) -> bool:
"""Return True if entity is available."""
return self.coordinator.data.get(self.entity_description.key) is not Noneconst.py """Constants for stiebel_eltron_isg."""
"""Change 18.02.2025 JG - V.2025.2.0 - Extended register scope"""
from homeassistant.const import Platform
# Base component constants
DEFAULT_NAME = "Stiebel Eltron ISG"
NAME = DEFAULT_NAME
ATTR_MANUFACTURER = "Stiebel Eltron"
DOMAIN = "stiebel_eltron_isg"
DOMAIN_DATA = f"{DOMAIN}_data"
VERSION = "0.3.0"
ISSUE_URL = "https://github.com/pail23/stiebel_eltron_isg/issues"
DEFAULT_HOST_NAME = ""
DEFAULT_SCAN_INTERVAL = 30
DEFAULT_PORT = 502
# Platforms
PLATFORMS: list[Platform] = [
Platform.BUTTON,
Platform.SENSOR,
Platform.BINARY_SENSOR,
Platform.NUMBER,
Platform.SWITCH,
Platform.SELECT,
Platform.CLIMATE,
]
ACTIVE_ERROR = "active_error"
ACTUAL_HUMIDITY = "actual_humidity"
ACTUAL_HUMIDITY_HK1 = "actual_humidity_hk1"
ACTUAL_HUMIDITY_HK2 = "actual_humidity_hk2"
ACTUAL_HUMIDITY_HK3 = "actual_humidity_hk3"
ACTUAL_MODE_EVE = "actual_mode_EVE"
ACTUAL_MODE_IWS = "actual mode IWS"
ACTUAL_ROOM_TEMPERATURE_HK1 = "actual_room_temperature_hk1"
ACTUAL_ROOM_TEMPERATURE_HK2 = "actual_room_temperature_hk2"
ACTUAL_ROOM_TEMPERATURE_HK3 = "actual_room_temperature_hk3"
ACTUAL_TEMPERATURE = "actual_temperature"
ACTUAL_TEMPERATURE_BUFFER = "actual_temperature_buffer"
ACTUAL_TEMPERATURE_COOLING_FANCOIL = "actual_temperature_cooling_fancoil"
ACTUAL_TEMPERATURE_COOLING_SURFACE = "actual_temperature_cooling_surface"
ACTUAL_TEMPERATURE_FEK = "actual_temperature_fek"
ACTUAL_TEMPERATURE_HK1 = "actual_temperature_hk1"
ACTUAL_TEMPERATURE_HK2 = "actual_temperature_hk2"
ACTUAL_TEMPERATURE_HK3 = "actual_temperature_hk3"
ACTUAL_TEMPERATURE_WATER = "actual_temperature_water"
AREA_COOLING_TARGET_FLOW_TEMPERATURE = "area_cooling_target_flow_temperature"
AREA_COOLING_TARGET_ROOM_TEMPERATURE = "area_cooling_target_room_temperature"
BUFFER_1_CHARGING_PUMP = "buffer_1_charging_pump"
BUFFER_2_CHARGING_PUMP = "buffer_2_charging_pump"
BUFFER_3_CHARGING_PUMP = "buffer_3_charging_pump"
BUFFER_4_CHARGING_PUMP = "buffer_4_charging_pump"
BUFFER_5_CHARGING_PUMP = "buffer_5_charging_pump"
BUFFER_6_CHARGING_PUMP = "buffer_6_charging_pump"
BUS_STATUS = "bus_state"
CAN_BUS_STATUS_ERROR_1 = "can_bus_status_error_1"
CAN_BUS_STATUS_ERROR_2 = "can_bus_status_error_2"
CAN_BUS_STATUS_FAULT = "can_bus_status_fault"
CAN_BUS_STATUS_LINE_FAULT = "can_bus_status_line_fault"
CAN_BUS_STATUS_OK = "can_bus_status_ok"
CIRCULATION_PUMP = "circulation_pump"
COLLECTOR_TEMPERATURE = "collector_temperature"
COMFORT_COOLING_TEMPERATURE_TARGET_HK1 = "comfort_cooling_temperature_target_hk1"
COMFORT_COOLING_TEMPERATURE_TARGET_HK2 = "comfort_cooling_temperature_target_hk2"
COMFORT_COOLING_TEMPERATURE_TARGET_HK3 = "comfort_cooling_temperature_target_hk3"
COMFORT_TEMPERATURE_TARGET_HK1 = "comfort_temperature_target_hk1"
COMFORT_TEMPERATURE_TARGET_HK2 = "comfort_temperature_target_hk2"
COMFORT_TEMPERATURE_TARGET_HK3 = "comfort_temperature_target_hk3"
COMFORT_WATER_TEMPERATURE_TARGET = "comfort_water_temperature_target"
COMMUTE_REL = "commute_rel"
COMPRESSOR_COOLING = "compresor_cooling"
COMPRESSOR_CURRENT = "compressor_current"
COMPRESSOR_FAULT = "compressor_fault"
COMPRESSOR_HEATING = "compressor_heating"
COMPRESSOR_HEATING_WATER = "compressor_heating_water"
COMPRESSOR_ON = "compressor_on"
COMPRESSOR_PERFORMANCE_TARGET = "compressor performance target"
COMPRESSOR_POWER = "compressor_power"
COMPRESSOR_SPEED = "compressor_speed"
COMPRESSOR_STARTS = "compressor_starts"
COMPRESSOR_TARGET_CALCULATED = "compressor target calculated"
COMPRESSOR_TARGET_SENT = "compressor target sent"
COMPRESSOR_TEMPERATURE = "compressor_temperature"
COMPRESSOR_VOLTAGE = "compressor_voltage"
CONDENSER_TEMPERATURE = "condenser_temperature"
CONSUMED_HEATING = "consumed_heating"
CONSUMED_HEATING_TODAY = "consumed_heating_today"
CONSUMED_HEATING_TOTAL = "consumed_heating_total"
CONSUMED_WATER_HEATING = "consumed_water_heating"
CONSUMED_WATER_HEATING_TODAY = "consumed_water_heating_today"
CONSUMED_WATER_HEATING_TOTAL = "consumed_water_heating_total"
CONTROLLER_TYPE = "controller_type"
COOLING_MODE = "cooling_mode"
COOLING_TEMPERATURE = "cooling_temperature"
CURRENT_POWER_CONSUMPTION = "current_power_consumption"
DEFROST_LL_WT = "defrost_ll_wt"
DEFROST_STATUS = "defrost_state"
DEVICE_ID = "device_id"
DEVICE_TYPE_504INV = "device_type_504INV"
DEVICE_TYPE_5CS = "device_type_5CS"
DEVICE_TYPE_8CS = "device_type_8CS"
DEVICE_TYPE_8CSE = "device_type_8CSE"
DEWPOINT_TEMPERATURE = "dew_point_temperature"
DEWPOINT_TEMPERATURE_HK1 = "dew_point_temperature_hk1"
DEWPOINT_TEMPERATURE_HK2 = "dew_point_temperature_hk2"
DEWPOINT_TEMPERATURE_HK3 = "dew_point_temperature_hk3"
DHW_CHARGING_PUMP = "dhw_charging_pump"
DIFFERENT_PRESSURE_TXT = "different_pressure_text"
DIFF_CONTROLLER_1_PUMP = "diff_controller_1_pump"
DIFF_CONTROLLER_2_PUMP = "diff_controller_2_pump"
DOM_SENSOR = "dom_sensor"
DUALMODE_TEMPERATURE_HZG = "dualmode_temperature_hzg"
DUALMODE_TEMPERATURE_WW = "dualmode_temperature_ww"
DYNAMIC_FACTOR = "dynamic_factor"
D_FACTOR = "d_factor"
ECO_COOLING_TEMPERATURE_TARGET_HK1 = "eco_cooling_temperature_target_hk1"
ECO_COOLING_TEMPERATURE_TARGET_HK2 = "eco_cooling_temperature_target_hk2"
ECO_COOLING_TEMPERATURE_TARGET_HK3 = "eco_cooling_temperature_target_hk3"
ECO_TEMPERATURE_TARGET_HK1 = "eco_temperature_target_hk1"
ECO_TEMPERATURE_TARGET_HK2 = "eco_temperature_target_hk2"
ECO_TEMPERATURE_TARGET_HK3 = "eco_temperature_target_hk3"
ECO_WATER_TEMPERATURE_TARGET = "eco_water_temperature_target"
ELECTRICAL_BOOSTER_HEATING = "electrical_booster_heating"
ELECTRICAL_BOOSTER_HEATING_WATER = "electrical_booster_heating_water"
ELECTRIC_REHEATING = "electric_reheating"
EMERGENCY_HEATING_1 = "emergency_heating_1"
EMERGENCY_HEATING_1_2 = "emergency_heating_1_2"
EMERGENCY_HEATING_2 = "emergency_heating_2"
ENERGYMANAGEMENT = "energymanagement"
ERROR_NUMBER = "error_number"
ERROR_STATUS = "error_status"
EVAPORATOR_DEFROST = "evaporator_defrost"
EVAPORATOR_DIFFERENCE_PRESSURE = "evaporator_difference_pressure"
EVAPORATOR_OUTPUT_TEMPERATURE = "evaporator_output_temperature"
EVAPORATOR_TEMPERATURE = "evaporator_temperature"
EXHAUST_AIR_ACTUAL_FAN_SPEED = "exhaust_air_actual_fan_speed"
EXHAUST_AIR_TARGET_FLOW_RATE = "exthaust_air_target_flow_rate"
EXTRACT_AIR_ACTUAL_FAN_SPEED = "extract_air_actual"
EXTRACT_AIR_DEW_POINT = "extract_air_dew_point"
EXTRACT_AIR_HUMIDITY = "extract_air_humidity"
EXTRACT_AIR_TARGET_FLOW_RATE = "extract_air_target_flowrate"
EXTRACT_AIR_TEMPERATURE = "extract_air_temperature"
FAN_COOLING_TARGET_FLOW_TEMPERATURE = "fan_cooling_target_flow_temperature"
FAN_COOLING_TARGET_ROOM_TEMPERATURE = "fan_cooling_target_room_temperature"
FAN_LEVEL_DAY = "fan_level_comfort"
FAN_LEVEL_NIGHT = "fan_level_eco"
FAN_PRZ = "fan_prz"
FILTER = "filter"
FILTER_EXTRACT_AIR = "filter_extract_air"
FILTER_VENTILATION_AIR = "filter_ventilation_air"
FLOW_TEMPERATURE = "flow_temperature"
FLOW_TEMPERATURE_NHZ = "flow_temperature_nhz"
FLOW_TEMPERATURE_WP1 = "flow_temperature_wp1"
FLOW_TEMPERATURE_WP2 = "flow_temperature_wp2"
HEATER_PRESSURE = "heating_pressure"
HEATING_CIRCUIT_1_PUMP = "heating_circuit_1_pump"
HEATING_CIRCUIT_2_PUMP = "heating_circuit_2_pump"
HEATING_CIRCUIT_3_PUMP = "heating_circuit_3_pump"
HEATING_CIRCUIT_4_PUMP = "heating_circuit_4_pump"
HEATING_CIRCUIT_5_PUMP = "heating_circuit_5_pump"
HEATING_COOLING_POWER = "heating_cooling_power"
HEATING_CURVE_LOW_END_HK1 = "heating_curve_low_end_hk1"
HEATING_CURVE_LOW_END_HK2 = "heating_curve_low_end_hk2"
HEATING_CURVE_RISE_HK1 = "heating_curve_rise_hk1"
HEATING_CURVE_RISE_HK2 = "heating_curve_rise_hk2"
HEATING_CURVE_RISE_HK3 = "heating_curve_rise_hk3"
HEATPOWER_RELATIV = "heatpower_relativ"
HEAT_LEVEL = "heat_level"
HEAT_PUMP_1_ON = "heat_pump_1_on"
HEAT_PUMP_2_ON = "heat_pump_2_on"
HEAT_PUMP_3_ON = "heat_pump_3_on"
HEAT_PUMP_4_ON = "heat_pump_4_on"
HEAT_PUMP_5_ON = "heat_pump_5_on"
HEAT_PUMP_6_ON = "heat_pump_6_on"
HEAT_UP_PROGRAM = "heat_up_program"
HIGH_PRESSURE = "high_pressure"
HIGH_PRESSURE_WP1 = "high_pressure_wp1"
HIGH_PRESSURE_WP2 = "high_pressure_wp2"
HOT_GAS_TEMPERATURE = "hot_gas_temperature"
HOT_GAS_TEMPERATURE_WP1 = "hot_gas_temperature_wp1"
HOT_GAS_TEMPERATURE_WP2 = "hot_gas_temperature_wp2"
IS_COOLING = "is_cooling"
IS_HEATING = "is_heating"
IS_HEATING_WATER = "is_heating_water"
IS_SUMMER_MODE = "is_summer_mode"
I_FACTOR = "i_factor"
LOW_PRESSURE = "low_pressure"
LOW_PRESSURE_WP1 = "low_pressure_wp1"
LOW_PRESSURE_WP2 = "low_pressure_wp2"
MIXED_WATER_QUANTITY = "mixed_water_quantity"
MIXER_CLOSE_HTG_CIRCUIT_2 = "mixer_close_htg_circuit_2"
MIXER_CLOSE_HTG_CIRCUIT_3 = "mixer_close_htg_circuit_3"
MIXER_CLOSE_HTG_CIRCUIT_4 = "mixer_close_htg_circuit_4"
MIXER_CLOSE_HTG_CIRCUIT_5 = "mixer_close_htg_circuit_5"
MIXER_OPEN_HTG_CIRCUIT_2 = "mixer_open_htg_circuit_2"
MIXER_OPEN_HTG_CIRCUIT_3 = "mixer_open_htg_circuit_3"
MIXER_OPEN_HTG_CIRCUIT_4 = "mixer_open_htg_circuit_4"
MIXER_OPEN_HTG_CIRCUIT_5 = "mixer_open_htg_circuit_5"
MODEL_ID = "model_id"
ND_FILTERED = "nd_filtered"
NHZ_STAGES_RUNNING = "nhz_stages_running"
OPENING_EXV = "opening_exv"
OPENING_EXV_COOLING = "opening_exv_cooling"
OPENING_EXV_PRE = "opening_exv_pre"
OPERATION_MODE = "operation_mode"
OUTDOOR_TEMPERATURE = "outdoor_temperature"
OVEN_FIREPLACE_ACTIV = "oven_fireplace_activ"
OVERHEAT_COMPRESSOR_ACTUAL = "overheat_compressor_actual"
OVERHEAT_COMPRESSOR_TARGET = "overheat_compressor_target"
OVERHEAT_RECUP_ACTUAL = "overheat_recup_actual"
POOL_PRIMARY_PUMP = "pool_primary_pump"
POOL_SECONDARY_PUMP = "pool_secondary_pump"
POWER_OFF = "power_off"
PREVIOUS_CONSUMED_HEATING_TOTAL = "previous_consumed_heating_total"
PREVIOUS_CONSUMED_WATER_HEATING_TOTAL = "previous_consumed_water_heating_total"
PREVIOUS_PRODUCED_HEATING_TOTAL = "previous_produced_heating_total"
PREVIOUS_PRODUCED_WATER_HEATING_TOTAL = "previous_produced_water_heating_total"
PRODUCED_ELECTRICAL_HEAT_TOTAL = "produced_electrical_heat_total"
PRODUCED_ELECTRICAL_WATER_TOTAL = "produced_electrical_water_total"
PRODUCED_HEATING = "produced_heating"
PRODUCED_HEATING_TODAY = "produced_heating_today"
PRODUCED_HEATING_TODAY_VS_CONSUMED_HEATING_TODAY = "ratio_heating_today"
PRODUCED_HEATING_TOTAL = "produced_heating_total"
PRODUCED_HEATING_TOTAL_VS_CONSUMED_HEATING_TOTAL = "ratio_heating_total"
PRODUCED_RECOVERY = "produced_recovery"
PRODUCED_RECOVERY_TODAY = "produced_recovery_today"
PRODUCED_RECOVERY_TOTAL = "produced_recovery_total"
PRODUCED_SOLAR_HEATING = "produced_solar_heating"
PRODUCED_SOLAR_HEATING_TODAY = "produced_solar_heating_today"
PRODUCED_SOLAR_HEATING_TOTAL = "produced_solar_heating_total"
PRODUCED_SOLAR_WATER_HEATING = "produced_solar_water_heating"
PRODUCED_SOLAR_WATER_HEATING_TODAY = "produced_solar_water_heating_today"
PRODUCED_SOLAR_WATER_HEATING_TOTAL = "produced_solar_water_heating_total"
PRODUCED_WATER_HEATING = "produced_water_heating"
PRODUCED_WATER_HEATING_TODAY = "produced_water_heating_today"
PRODUCED_WATER_HEATING_TODAY_VS_CONSUMED_WATER_HEATING_TODAY = "ratio_water_heating_today"
PRODUCED_WATER_HEATING_TOTAL = "produced_water_heating_total"
PRODUCED_WATER_HEATING_TOTAL_VS_CONSUMED_WATER_HEATING_TOTAL = "ration_water_heating_total"
PUMP_ON_HK1 = "pump_on_hk1"
PUMP_ON_HK2 = "pump_on_hk2"
PWM_HEAT_PUMP = "pwm_heat_pump"
PWM_MIXER_PUMP = "pwm_mixer_pump"
PWM_SOLAR_PUMP = "pwm_solar_pump"
P_FACTOR = "p_factor"
RESET_HEATPUMP = "reset_heatpump"
RETURN_TEMPERATURE = "return_temperature"
RETURN_TEMPERATURE_WP1 = "return_temperature_wp1"
RETURN_TEMPERATURE_WP2 = "return_temperature_wp2"
SECOND_GENERATOR_DHW = "second_generator_dhw"
SECOND_GENERATOR_HEATING = "second_generator_heating"
SERVICE = "service"
SG_READY_ACTIVE = "sg_ready_active"
SG_READY_INPUT_1 = "sg_ready_input_1"
SG_READY_INPUT_2 = "sg_ready_input_2"
SG_READY_STATE = "sg_ready_state"
SOFTWARE_ID = "software_id"
SOFTWARE_REVISION = "software_revision"
SOLAR_COLLECTOR_TEMPERATURE = "solar_collector_temperature"
SOLAR_COLLECTOR_TEMPERATURE = "solar_collector_temperature"
SOLAR_CYLINDER_TEMPERATURE = "solar_cylinder_temperature"
SOLAR_RUNTIME = "solar_runtime"
SOURCE_PRESSURE = "source_pressure"
SOURCE_PUMP = "source_pump"
SOURCE_TEMPERATURE = "source_temperature"
SWITCHING_PROGRAM_ENABLED = "switching_program_enabled"
TARGET_ROOM_TEMPERATURE_HK1 = "target_room_temperature_hk1"
TARGET_ROOM_TEMPERATURE_HK2 = "target_room_temperature_hk2"
TARGET_ROOM_TEMPERATURE_HK3 = "target_room_temperature_hk3"
TARGET_TEMPERATURE = "target_temperature"
TARGET_TEMPERATURE_BUFFER = "target_temperature_buffer"
TARGET_TEMPERATURE_COOLING_FANCOIL = "target_temperature_cooling_fancoil"
TARGET_TEMPERATURE_COOLING_SURFACE = "target_temperature_cooling_surface"
TARGET_TEMPERATURE_FEK = "target_temperature_fek"
TARGET_TEMPERATURE_HK1 = "target_temperature_hk1"
TARGET_TEMPERATURE_HK2 = "target_temperature_hk2"
TARGET_TEMPERATURE_HK3 = "target_temperature_hk3"
TARGET_TEMPERATURE_WATER = "target_temperature_water"
VALVE_POSITION = "valve position"
VENTILATION = "ventilation"
VENTILATION_AIR_ACTUAL_FAN_SPEED = "ventilation_air_actual_fan_speed"
VENTILATION_AIR_TARGET_FLOW_RATE = "ventilation_air_target_flow_rate"
VOLUME_STREAM = "volume_stream"
VOLUME_STREAM_WP1 = "volume_stream_wp1"
VOLUME_STREAM_WP2 = "volume_stream_wp2"
WW_2_ACTUAL_TEMP = "ww_2_actual_temp"lwz_coordinator.py """Data Coordinator for the LWZ Stiebel Eltron heat pumps."""
"""Change 18.02.2025 JG - V.2025.2.0 - Extended register scope"""
"""For more details about this integration, please refer to
https://github.com/pail23/stiebel_eltron_isg
"""
# Stiebel Eltron ISG Ergaenzung auf erweiterten Registerumfang
# Tecalor THZ5.5 / THZ504 / Stiebel Eltron LWZ504
# Regler 504INV
# JG 12/2024
import logging
from pymodbus.constants import Endian
from pymodbus.payload import BinaryPayloadDecoder
from custom_components.stiebel_eltron_isg.coordinator import (
StiebelEltronModbusDataCoordinator,
get_isg_scaled_value,
)
from .const import (
ACTIVE_ERROR,
ACTUAL_HUMIDITY,
ACTUAL_HUMIDITY_HK1,
ACTUAL_HUMIDITY_HK2,
ACTUAL_MODE_EVE,
ACTUAL_MODE_IWS,
ACTUAL_ROOM_TEMPERATURE_HK1,
ACTUAL_ROOM_TEMPERATURE_HK2,
ACTUAL_TEMPERATURE,
ACTUAL_TEMPERATURE_FEK,
ACTUAL_TEMPERATURE_HK1,
ACTUAL_TEMPERATURE_HK2,
ACTUAL_TEMPERATURE_WATER,
COMFORT_COOLING_TEMPERATURE_TARGET_HK1,
COMFORT_COOLING_TEMPERATURE_TARGET_HK2,
COMFORT_TEMPERATURE_TARGET_HK1,
COMFORT_TEMPERATURE_TARGET_HK2,
COMFORT_WATER_TEMPERATURE_TARGET,
COMMUTE_REL,
COMPRESSOR_COOLING,
COMPRESSOR_CURRENT,
COMPRESSOR_FAULT,
COMPRESSOR_HEATING,
COMPRESSOR_HEATING_WATER,
COMPRESSOR_ON,
COMPRESSOR_PERFORMANCE_TARGET,
COMPRESSOR_POWER,
COMPRESSOR_SPEED,
COMPRESSOR_STARTS,
COMPRESSOR_TARGET_CALCULATED,
COMPRESSOR_TARGET_SENT,
COMPRESSOR_TEMPERATURE,
COMPRESSOR_VOLTAGE,
CONDENSER_TEMPERATURE,
CONSUMED_HEATING,
CONSUMED_HEATING_TODAY,
CONSUMED_HEATING_TOTAL,
CONSUMED_WATER_HEATING,
CONSUMED_WATER_HEATING_TODAY,
CONSUMED_WATER_HEATING_TOTAL,
COOLING_TEMPERATURE,
DEFROST_LL_WT,
DEFROST_STATUS,
DEVICE_ID,
DEWPOINT_TEMPERATURE_HK1,
DEWPOINT_TEMPERATURE_HK2,
DOM_SENSOR,
DYNAMIC_FACTOR,
ECO_COOLING_TEMPERATURE_TARGET_HK1,
ECO_COOLING_TEMPERATURE_TARGET_HK2,
ECO_TEMPERATURE_TARGET_HK1,
ECO_TEMPERATURE_TARGET_HK2,
ECO_WATER_TEMPERATURE_TARGET,
ELECTRICAL_BOOSTER_HEATING,
ELECTRICAL_BOOSTER_HEATING_WATER,
ELECTRIC_REHEATING,
ENERGYMANAGEMENT,
ERROR_STATUS,
EVAPORATOR_DEFROST,
EVAPORATOR_DIFFERENCE_PRESSURE,
EVAPORATOR_OUTPUT_TEMPERATURE,
EVAPORATOR_TEMPERATURE,
EXHAUST_AIR_ACTUAL_FAN_SPEED,
EXHAUST_AIR_TARGET_FLOW_RATE,
EXTRACT_AIR_ACTUAL_FAN_SPEED,
EXTRACT_AIR_DEW_POINT,
EXTRACT_AIR_HUMIDITY,
EXTRACT_AIR_TARGET_FLOW_RATE,
EXTRACT_AIR_TEMPERATURE,
FAN_LEVEL_DAY,
FAN_LEVEL_NIGHT,
FILTER,
FILTER_EXTRACT_AIR,
FILTER_VENTILATION_AIR,
FLOW_TEMPERATURE,
HEATER_PRESSURE,
HEATING_COOLING_POWER,
HEATING_CURVE_LOW_END_HK1,
HEATING_CURVE_LOW_END_HK2,
HEATING_CURVE_RISE_HK1,
HEATING_CURVE_RISE_HK2,
HEATPOWER_RELATIV,
HEAT_LEVEL,
HEAT_UP_PROGRAM,
HIGH_PRESSURE,
HOT_GAS_TEMPERATURE,
IS_COOLING,
IS_HEATING,
IS_HEATING_WATER,
IS_SUMMER_MODE,
LOW_PRESSURE,
MIXED_WATER_QUANTITY,
OPENING_EXV_COOLING,
OPERATION_MODE,
OUTDOOR_TEMPERATURE,
OVEN_FIREPLACE_ACTIV,
OVERHEAT_COMPRESSOR_ACTUAL,
OVERHEAT_COMPRESSOR_TARGET,
OVERHEAT_RECUP_ACTUAL,
POWER_OFF,
PRODUCED_ELECTRICAL_HEAT_TOTAL,
PRODUCED_ELECTRICAL_WATER_TOTAL,
PRODUCED_HEATING,
PRODUCED_HEATING_TODAY,
PRODUCED_HEATING_TODAY_VS_CONSUMED_HEATING_TODAY,
PRODUCED_HEATING_TOTAL,
PRODUCED_HEATING_TOTAL_VS_CONSUMED_HEATING_TOTAL,
P_FACTOR,
PRODUCED_RECOVERY,
PRODUCED_RECOVERY_TODAY,
PRODUCED_RECOVERY_TOTAL,
PRODUCED_SOLAR_HEATING,
PRODUCED_SOLAR_HEATING_TODAY,
PRODUCED_SOLAR_HEATING_TOTAL,
PRODUCED_SOLAR_WATER_HEATING,
PRODUCED_SOLAR_WATER_HEATING_TODAY,
PRODUCED_SOLAR_WATER_HEATING_TOTAL,
PRODUCED_WATER_HEATING,
PRODUCED_WATER_HEATING_TODAY,
PRODUCED_WATER_HEATING_TODAY_VS_CONSUMED_WATER_HEATING_TODAY,
PRODUCED_WATER_HEATING_TOTAL,
PRODUCED_WATER_HEATING_TOTAL_VS_CONSUMED_WATER_HEATING_TOTAL,
PUMP_ON_HK1,
PWM_HEAT_PUMP,
PWM_MIXER_PUMP,
PWM_SOLAR_PUMP,
RETURN_TEMPERATURE,
SERVICE,
SG_READY_ACTIVE,
SG_READY_INPUT_1,
SG_READY_INPUT_2,
SOFTWARE_ID,
SOFTWARE_REVISION,
SOURCE_TEMPERATURE,
SOLAR_COLLECTOR_TEMPERATURE,
SWITCHING_PROGRAM_ENABLED,
TARGET_ROOM_TEMPERATURE_HK1,
TARGET_ROOM_TEMPERATURE_HK2,
TARGET_TEMPERATURE,
TARGET_TEMPERATURE_FEK,
TARGET_TEMPERATURE_HK1,
TARGET_TEMPERATURE_HK2,
TARGET_TEMPERATURE_WATER,
VALVE_POSITION,
VENTILATION,
VENTILATION_AIR_ACTUAL_FAN_SPEED,
VENTILATION_AIR_TARGET_FLOW_RATE,
VOLUME_STREAM,
I_FACTOR,
D_FACTOR,
OPENING_EXV_PRE,
OPENING_EXV,
FAN_PRZ,
ND_FILTERED,
WW_2_ACTUAL_TEMP,
DIFFERENT_PRESSURE_TXT,
CAN_BUS_STATUS_OK,
CAN_BUS_STATUS_FAULT,
CAN_BUS_STATUS_ERROR_1,
CAN_BUS_STATUS_ERROR_2,
CAN_BUS_STATUS_LINE_FAULT,
DEVICE_TYPE_504INV,
DEVICE_TYPE_5CS,
DEVICE_TYPE_8CS,
DEVICE_TYPE_8CSE,
ERROR_NUMBER,
)
_LOGGER: logging.Logger = logging.getLogger(__package__)
class StiebelEltronModbusLWZDataCoordinator(StiebelEltronModbusDataCoordinator):
"""Thread safe wrapper class for pymodbus. Communicates with LWZ or LWA controller models."""
async def read_modbus_data(self) -> dict:
"""Read the ISG data through modbus."""
return {
**await self.read_modbus_energy(),
**await self.read_modbus_system_state(),
**await self.read_modbus_system_values(),
**await self.read_modbus_system_paramter(),
**await self.read_modbus_sg_ready(),
}
async def read_modbus_system_state(self) -> dict:
"""Read the system state values from the ISG."""
result = {}
inverter_data = await self.read_input_registers(slave=1, address=2000, count=7)
if not inverter_data.isError():
decoder = BinaryPayloadDecoder.fromRegisters(
inverter_data.registers,
byteorder=Endian.BIG,
)
#REGISTER OFFSET -1
#2001 THZ504 BETRIEBSSTATUS_TEXT_1 [B0] SCHALTPROGRAMM-AKTIV [B1] VERDICHTER [B2] HEIZEN [B3] KUEHLEN [B4]WARMWASSERBEREITUNG [B5] ELEKTRISCHE-NACHERWAERMUNG [B6] SERVICE [B7] EVU-SPERRE [B8] FILTERWECHSEL [B9] LUEFTUNG [B10] HEIZKREISPUMPE [B11] ABTAUEN-VERDAMPFER [B12] FILTERWECHSEL-ABLUFT [B13] FILTERWECHSEL-ZULUFT [B14] TROCKENHEIZPROGRAMM [B15] ENERGIEMANAGEMENT
state = decoder.decode_16bit_uint()
#SCHALTPROGRAMM-AKTIV
result[SWITCHING_PROGRAM_ENABLED] = (state & 1) != 0
#VERDICHTER
result[COMPRESSOR_ON] = (state & (1 << 1)) != 0
#HEIZEN
result[IS_HEATING] = (state & (1 << 2)) != 0
#KUEHLEN
result[IS_COOLING] = (state & (1 << 3)) != 0
#WARMWASSERBEREITUNG
result[IS_HEATING_WATER] = (state & (1 << 4)) != 0
#ELEKTRISCHE-NACHERWAERMUNG
result[ELECTRIC_REHEATING] = (state & (1 << 5)) != 0
#SERVICE
result[SERVICE] = (state & (1 << 6)) != 0
#EVU-SPERRE
result[POWER_OFF] = (state & (1 << 7)) != 0
#FILTERWECHSEL-BEIDE
result[FILTER] = (state & (1 << 8)) != 0
#LUETUNG
result[VENTILATION] = (state & (1 << 9)) != 0
#HEIZKREISPUMPE
result[PUMP_ON_HK1] = (state & (1 << 10)) != 0
#ABTAUEN-VERDAMPFER
result[EVAPORATOR_DEFROST] = (state & (1 << 11)) != 0
#FILTERWECHSEL-ABLUFT
result[FILTER_EXTRACT_AIR] = (state & (1 << 12)) != 0
#FILTERWECHSEL-ZULUFT
result[FILTER_VENTILATION_AIR] = (state & (1 << 13)) != 0
#TROCKENHEIZPROGRAMM-AKTIV
result[HEAT_UP_PROGRAM] = (state & (1 << 14)) != 0
#ENERGIEMANAGEMENT
result[ENERGYMANAGEMENT] = (state & (1 << 15)) != 0
#2002 THZ504 FEHLERSTATUS
result[ERROR_STATUS] = decoder.decode_16bit_uint()
#decoder.skip_bytes(4)
#2003 THZ504 CAN-BUS-STATUS [0] OK [-1] STOERUNG [-2] CAN_FEHLER [-3] CAN_FEHLER [-4] LEITUNGSFEHLER
state = decoder.decode_16bit_uint()
#CAN-BUS-STATUS OK
result[CAN_BUS_STATUS_OK] = (state & 1) != 0
#CAN-STATUS STOERUNG
result[CAN_BUS_STATUS_FAULT] = (state & 1) != -1
#CAN-STATUS CAN_FEHLER
result[CAN_BUS_STATUS_ERROR_1] = (state & 1) != -2
#CAN-STATUS CAN_FEHLER
result[CAN_BUS_STATUS_ERROR_2] = (state & 1) != -3
#CAN-STATUS LEITUNGSFEHLER
result[CAN_BUS_STATUS_LINE_FAULT] = (state & 1) != -4
#2004 THZ504 ABTAUEN EINGELEITET
result[DEFROST_STATUS] = decoder.decode_16bit_uint()
#2005 THZ504 BETRIEBSSTATUS_TEXT_2 [B0] SOMMERBETRIEB [B1] OFEN-KAMIN-AKTIV
state = decoder.decode_16bit_uint()
#SOMMERBETRIEB
result[IS_SUMMER_MODE] = (state & 1) != 0
#OFEN-KAMIN-AKTIV
result[OVEN_FIREPLACE_ACTIV] = (state & (1 << 1)) != 0
#2006 THZ504 FEHLER NUMMER
result[ERROR_NUMBER] = decoder.decode_16bit_uint()
#2007 THZ504 GERAETETYP [7] 504INV [16] 5CS [17] 8CS [18] 8CSE
state = decoder.decode_16bit_uint()
#504INV
result[DEVICE_TYPE_504INV] = (state & 1) != 7
#5CS
result[DEVICE_TYPE_5CS] = (state & 1) != 16
#8CS
result[DEVICE_TYPE_8CS] = (state & 1) != 17
#8CSE
result[DEVICE_TYPE_8CSE] = (state & 1) != 18
#2008 THZ504 PROZESSSTATUS_TEXT [B0] HD WAECHTER [B1] MOTORSCHUTZ [B2] ABTAUSIGNAL [B4] VERDICHTER [B5] DHC1 [B6] DHC2 [B7] DHC3 [B8] ABTAUVENTIL [B9] LUEFTER [B10] KUEHLEN [B11] EVU-SPERRE [B12] OFEN KAMIN
#2009 THZ504 HAUPTVERSIONSNUMMER
#2010 THZ504 NEBENVERSIONSNUMMER
#2011 THZ504 REVISIONSNUMMER
#2012 THZ504 LAUFZEIT-TAGE-?
#2013 THZ504 LAUFZEIT-STUNDEN-?
#2014 THZ504 FEHLER TIMESTAMP
#2015 THZ504 FATALER FEHLER TIMESTAMP
#2016 THZ504 ERWEITERUNG [1] SG-READY [2] KNX [3] EMI [4] MODBUS [9] TEST
#2017 THZ504 DAY_DBL
#2018 THZ504 WM_HZ_DBL
#2019 THZ504 WM_WW_DBL
#2020 THZ504 AUSSENTEMP_MAX_DBL
#2021 THZ504 AUSSENTEMP_AVG_DBL
#2022 THZ504 AUSSENTEMP_MIN_DBL
#2023 THZ504 BUILDNUMMER
#2024 THZ504 PV-LEISTUNG
#2025 THZ504 EMI-STATUS [0] EMI-NO-CONNECTION [1] EMI-OK [2] EMI-ACTIVE-ECO [3] EMI-ACTIVE-COMFORT [4] EMI-ACTIVE-HIGH [10] EMI-ERROR [11] EMI-ERROR
return result
async def read_modbus_system_values(self) -> dict:
"""Read the system related values from the ISG."""
result: dict = {}
inverter_data = await self.read_input_registers(slave=1, address=0, count=85)
if not inverter_data.isError():
decoder = BinaryPayloadDecoder.fromRegisters(
inverter_data.registers,
byteorder=Endian.BIG,
)
#REGISTER OFFSET -1
#1 actual room temperature for HC1
#THZ504 RAUMISTTEMP HK1
result[ACTUAL_TEMPERATURE] = get_isg_scaled_value(
decoder.decode_16bit_int(),
)
result[ACTUAL_ROOM_TEMPERATURE_HK1] = result[ACTUAL_TEMPERATURE]
#2 actual room setpoint for HC1
#THZ504 RAUMSOLLTEMP HK1
result[TARGET_TEMPERATURE] = get_isg_scaled_value(
decoder.decode_16bit_int(),
)
result[TARGET_ROOM_TEMPERATURE_HK1] = result[TARGET_TEMPERATURE]
#3 actual room humidity for HC1
#THZ504 RAUMFEUCHTE HK1
result[ACTUAL_HUMIDITY] = get_isg_scaled_value(decoder.decode_16bit_int())
result[ACTUAL_HUMIDITY_HK1] = result[ACTUAL_HUMIDITY]
#4 actual room temperature for HC2 - Should not refer to FEK
#THZ504 RAUMISTTEMP HK2
result[ACTUAL_TEMPERATURE_FEK] = get_isg_scaled_value(
decoder.decode_16bit_int(),
)
result[ACTUAL_ROOM_TEMPERATURE_HK2] = result[ACTUAL_TEMPERATURE_FEK]
#5 actual room setpoint for HC2 - Should not refer to FEK
#THZ504 RAUMSOLLTEMP HK2
result[TARGET_TEMPERATURE_FEK] = get_isg_scaled_value(
decoder.decode_16bit_int(),
)
result[TARGET_ROOM_TEMPERATURE_HK2] = result[TARGET_TEMPERATURE_FEK]
#6 actual room humidity for HC2
#THZ504 RAUMFEUCHTE HK2
result[ACTUAL_HUMIDITY_HK2] = get_isg_scaled_value(
decoder.decode_16bit_int(),
)
#7 outside temperature
#THZ504 AUSSENTEMPERATUR
result[OUTDOOR_TEMPERATURE] = get_isg_scaled_value(
decoder.decode_16bit_int(),
)
#8
#THZ504 ISTWERT HK1
result[ACTUAL_TEMPERATURE_HK1] = get_isg_scaled_value(
decoder.decode_16bit_int(),
)
#9
#THZ504 SOLLWERT HK1
result[TARGET_TEMPERATURE_HK1] = get_isg_scaled_value(
decoder.decode_16bit_int(),
)
#10
#THZ504 ISTWERT HK2
result[ACTUAL_TEMPERATURE_HK2] = get_isg_scaled_value(
decoder.decode_16bit_int(),
)
#11
#THZ504 SOLLWERT HK2
result[TARGET_TEMPERATURE_HK2] = get_isg_scaled_value(
decoder.decode_16bit_int(),
)
#12
#THZ504 VORLAUFTEMP
result[FLOW_TEMPERATURE] = get_isg_scaled_value(decoder.decode_16bit_int())
#13
#THZ504 RUECKLAUFTEMP
result[RETURN_TEMPERATURE] = get_isg_scaled_value(
decoder.decode_16bit_int(),
)
#14
#THZ504 DRUCK HEIZKREIS
result[HEATER_PRESSURE] = get_isg_scaled_value(decoder.decode_16bit_int())
#15
#THZ504 VOLUMENSTROM
result[VOLUME_STREAM] = get_isg_scaled_value(decoder.decode_16bit_int())
#16
#THZ504 WW IST TEMPERATUR
result[ACTUAL_TEMPERATURE_WATER] = get_isg_scaled_value(
decoder.decode_16bit_int(),
)
#17
#THZ504 WW SOLL TEMPERATUR
result[TARGET_TEMPERATURE_WATER] = get_isg_scaled_value(
decoder.decode_16bit_int(),
)
#18
#THZ504 ZULUFT IST LUEFTER DREHZAHL
result[VENTILATION_AIR_ACTUAL_FAN_SPEED] = decoder.decode_16bit_uint()
#19
#THZ504 ZULUFT SOLL VOLUMENSTROM
result[VENTILATION_AIR_TARGET_FLOW_RATE] = decoder.decode_16bit_uint()
#20
#THZ504 ABULUFT IST LUEFTER DREHZAHL
result[EXTRACT_AIR_ACTUAL_FAN_SPEED] = decoder.decode_16bit_uint()
#21
#THZ504 ABLUFT SOLL VOLUMENSTROM
result[EXTRACT_AIR_TARGET_FLOW_RATE] = decoder.decode_16bit_uint()
#22
#THZ504 ABLUFTFEUCHTE
result[EXTRACT_AIR_HUMIDITY] = decoder.decode_16bit_uint()
#23
#THZ504 ABLUFTTEMPERATUR
result[EXTRACT_AIR_TEMPERATURE] = get_isg_scaled_value(
decoder.decode_16bit_uint()
)
#24
#THZ504 ABLUFTTAUPUNKT
result[EXTRACT_AIR_DEW_POINT] = get_isg_scaled_value(
decoder.decode_16bit_uint()
)
#25
#THZ504 TAUPUNKTTEMPERATUR HK1
result[DEWPOINT_TEMPERATURE_HK1] = get_isg_scaled_value(
decoder.decode_16bit_int()
)
#26
#THZ504 TAUPUNKTTEMPERATUR HK2
result[DEWPOINT_TEMPERATURE_HK2] = get_isg_scaled_value(
decoder.decode_16bit_int()
)
#27
#THZ504 KOLLEKTORTEMP
result[SOLAR_COLLECTOR_TEMPERATURE] = get_isg_scaled_value(
decoder.decode_16bit_int()
)
#28
#THZ504 HEISSGASTEMP
result[HOT_GAS_TEMPERATURE] = get_isg_scaled_value(
decoder.decode_16bit_int()
)
#29
#THZ504 HOCHDRUCK
result[HIGH_PRESSURE] = get_isg_scaled_value(
decoder.decode_16bit_int(), 100
)
#30
#THZ504 NIEDERDRUCK
result[LOW_PRESSURE] = get_isg_scaled_value(
decoder.decode_16bit_int(), 100
)
#31
#THZ504 VERDICHTERSTARTS HIGH
compressor_starts_high = decoder.decode_16bit_uint()
#32
#THZ504 VERDICHTERDREHZAHL
result[COMPRESSOR_SPEED] = decoder.decode_16bit_uint()
#33
#THZ504 MISCHWASSERMENGE
result[MIXED_WATER_QUANTITY] = decoder.decode_16bit_uint()
#34
#THZ504 VERDICHTERSTARTS LOW
compressor_starts_low = decoder.decode_16bit_uint()
if compressor_starts_high == 32768:
result[COMPRESSOR_STARTS] = compressor_starts_high
else:
result[COMPRESSOR_STARTS] = (
compressor_starts_low + compressor_starts_high * 1000
)
#35
#THZ504 VERDAMPFERTEMP
result[EVAPORATOR_TEMPERATURE] = get_isg_scaled_value(
decoder.decode_16bit_int()
)
#36
#THZ504 SOFTWARESTAND
result[SOFTWARE_REVISION] = decoder.decode_16bit_uint()
#37
#THZ504 FORTLUFT SOLL VOLUMENSTROM
result[EXHAUST_AIR_TARGET_FLOW_RATE] = decoder.decode_16bit_uint()
#38
#THZ504 FORTLUFT IST LUEFTERDREHZAHL
result[EXHAUST_AIR_ACTUAL_FAN_SPEED] = decoder.decode_16bit_uint()
#39
#THZ504 VERFLUESSIGERTEMP
result[CONDENSER_TEMPERATURE] = get_isg_scaled_value(
decoder.decode_16bit_int()
)
#40
#THZ504 HEIZSTUFE
result[HEAT_LEVEL] = decoder.decode_16bit_uint()
#decoder.skip_bytes(18)
#41
#THZ504 ABTAUEN LL WT
result[DEFROST_LL_WT] = decoder.decode_16bit_uint()
#42
#THZ504 FEHLERLISTE
result[ACTIVE_ERROR] = decoder.decode_16bit_uint()
#skip 43-47
decoder.skip_bytes(10)
#48
#THZ504 GERAETEKENNUNG
result[DEVICE_ID] = decoder.decode_16bit_uint()
#49
#THZ504 KUEHLUNGSTEMP
result[COOLING_TEMPERATURE] = get_isg_scaled_value(
decoder.decode_16bit_int(), 10
)
#50
#THZ504 POSITION VENTIL
result[VALVE_POSITION] = decoder.decode_16bit_uint()
#51
#THZ504 VERDAMPFERAUSG TEMP
result[EVAPORATOR_OUTPUT_TEMPERATURE] = get_isg_scaled_value(
decoder.decode_16bit_int()
)
#52
#THZ504 OEFNUNG EXV KUEHLEN
result[OPENING_EXV_COOLING] = get_isg_scaled_value(
decoder.decode_16bit_int(), 10
)
#53
#THZ504 SOFTWARE ID
result[SOFTWARE_ID] = decoder.decode_16bit_uint()
#54
#THZ504 DOMSENSOR
result[DOM_SENSOR] = decoder.decode_16bit_uint()
#55
#THZ504 OELSUMPFTEMP
result[SOURCE_TEMPERATURE] = get_isg_scaled_value(
decoder.decode_16bit_int(), 10
)
#56
#THZ504 DIFF.DRUCK VERDAMPFER
result[EVAPORATOR_DIFFERENCE_PRESSURE] = get_isg_scaled_value(
decoder.decode_16bit_int(), 10
)
#57
#THZ504 PWM SOLARPUMPE
result[PWM_SOLAR_PUMP] = get_isg_scaled_value(
decoder.decode_16bit_int(), 10
)
#58
#THZ504 PWM HEIZKREISPUMPE
result[PWM_HEAT_PUMP] = get_isg_scaled_value(
decoder.decode_16bit_int(), 10
)
#59
#THZ504 PWM MISCHERPUMPE
result[PWM_MIXER_PUMP] = get_isg_scaled_value(
decoder.decode_16bit_int(), 10
)
#60
#THZ504 HEIZLEISTUNG RELATIV
result[HEATPOWER_RELATIV] = get_isg_scaled_value(
decoder.decode_16bit_int(), 1
)
#decoder.skip_bytes(6)
#61
#THZ504 LEISTUNGSVORGABE VERDICHTER
result[COMPRESSOR_PERFORMANCE_TARGET] = get_isg_scaled_value(
decoder.decode_16bit_int(), 1
)
#62
#THZ504 VERDICHTER SOLL ERRECHNET
result[COMPRESSOR_TARGET_CALCULATED] = get_isg_scaled_value(
decoder.decode_16bit_int(), 1
)
#63
#THZ504 VERDICHTER SOLL GESENDET
result[COMPRESSOR_TARGET_SENT] = get_isg_scaled_value(
decoder.decode_16bit_int(), 1
)
#64
#THZ504 HEIZ/KUEHL-LEISTUNG GEMESSEN
result[HEATING_COOLING_POWER] = get_isg_scaled_value(
decoder.decode_16bit_int(), 100
)
#65
#THZ504 MOTORSTROM
result[COMPRESSOR_CURRENT] = get_isg_scaled_value(
decoder.decode_16bit_int()
)
#66
#THZ504 MOTORLEISTUNG
result[COMPRESSOR_POWER] = get_isg_scaled_value(
decoder.decode_16bit_int(), 100
)
#67
#THZ504 MOTORSPANNUNG
result[COMPRESSOR_VOLTAGE] = get_isg_scaled_value(
decoder.decode_16bit_int(), 1
)
#68
#THZ504 INVERTERTEMP.
result[COMPRESSOR_TEMPERATURE] = get_isg_scaled_value(
decoder.decode_16bit_int()
)
#69
#THZ504 INVERTERFEHLER
result[COMPRESSOR_FAULT] = decoder.decode_16bit_uint()
#70
#THZ504 AKT.MODE IWS
result[ACTUAL_MODE_IWS] = decoder.decode_16bit_uint()
#71
#THZ504 AKT.MODE EVE
result[ACTUAL_MODE_EVE] = decoder.decode_16bit_uint()
#72
#THZ504 UEBERH.VERD.SOLL
result[OVERHEAT_COMPRESSOR_TARGET] = get_isg_scaled_value(
decoder.decode_16bit_uint(), 10
)
#73
#THZ504 UEBERH.VERD.IST
result[OVERHEAT_COMPRESSOR_ACTUAL] = get_isg_scaled_value(
decoder.decode_16bit_uint(), 10
)
#74
#THZ504 UEBERH.REKUP.IST
result[OVERHEAT_RECUP_ACTUAL] = get_isg_scaled_value(
decoder.decode_16bit_uint(), 10
)
#decoder.skip_bytes(2)
#75
#THZ504 PENDELN REL.
result[COMMUTE_REL] = get_isg_scaled_value(
decoder.decode_16bit_uint(), 10
)
#76
#THZ504 DYNAMIK-FAKTOR
result[DYNAMIC_FACTOR] = get_isg_scaled_value(
decoder.decode_16bit_uint(), 100
)
#77
#THZ504 P-FAKTOR
result[P_FACTOR] = get_isg_scaled_value(
decoder.decode_16bit_uint(), 100
)
#78
#THZ504 I-FAKTOR
result[I_FACTOR] = get_isg_scaled_value(
decoder.decode_16bit_uint(), 100
)
#79
#THZ504 D-FAKTOR
result[D_FACTOR] = get_isg_scaled_value(
decoder.decode_16bit_uint(), 100
)
#80
#THZ504 OEFNUNG EXV VORST.
result[OPENING_EXV_PRE] = get_isg_scaled_value(
decoder.decode_16bit_uint(), 10
)#81
#THZ504 OEFNUNG EXV
result[OPENING_EXV] = get_isg_scaled_value(
decoder.decode_16bit_uint(), 10
)#82
#THZ504 LUEFTER_PRZ
result[FAN_PRZ] = decoder.decode_16bit_uint()
#83
#THZ504 ND GEFILTERT
result[ND_FILTERED] = get_isg_scaled_value(
decoder.decode_16bit_int(), 100
)
#84
#THZ504 WW-2-ISTTEMP
result[WW_2_ACTUAL_TEMP] = decoder.decode_16bit_uint()
#85
#THZ504 DIFFERENZDRUCK_TEXT
result[DIFFERENT_PRESSURE_TXT] = decoder.decode_16bit_uint()
result["system_values"] = list(inverter_data.registers)
return result
async def read_modbus_system_paramter(self) -> dict:
"""Read the system paramters from the ISG."""
result: dict = {}
inverter_data = await self.read_holding_registers(
slave=1,
address=1000,
count=25,
)
if not inverter_data.isError():
decoder = BinaryPayloadDecoder.fromRegisters(
inverter_data.registers,
byteorder=Endian.BIG,
)
#1001
#THZ504 BETRIEBSART
result[OPERATION_MODE] = decoder.decode_16bit_uint()
#1002
#THZ504 RAUMTEMP KOMFORT/TAG SOLL HK1
result[COMFORT_TEMPERATURE_TARGET_HK1] = get_isg_scaled_value(
decoder.decode_16bit_int(),
)
#1003
#THZ504 RAUMTEMP ECO/NACHT SOLL HK1
result[ECO_TEMPERATURE_TARGET_HK1] = get_isg_scaled_value(
decoder.decode_16bit_int(),
)
#1004
decoder.skip_bytes(2)
#1005
#THZ504 RAUMTEMP KOMFORT/TAG SOLL HK2
result[COMFORT_TEMPERATURE_TARGET_HK2] = get_isg_scaled_value(
decoder.decode_16bit_int(),
)
#1006
#THZ504 RAUMTEMP ECO/NACHT SOLL HK2
result[ECO_TEMPERATURE_TARGET_HK2] = get_isg_scaled_value(
decoder.decode_16bit_int(),
)
#1007
decoder.skip_bytes(2)
#1008
#THZ504 HEIZKURVE STEIGUNG HK1
result[HEATING_CURVE_RISE_HK1] = get_isg_scaled_value(
decoder.decode_16bit_int(),
100,
)
#1009
#THZ504 HEIZKURVE FUSSPUNKT HK1
result[HEATING_CURVE_LOW_END_HK1] = get_isg_scaled_value(
decoder.decode_16bit_int(),
100,
)
#1010
#THZ504 HEIZKURVE STEIGUNG HK2
result[HEATING_CURVE_RISE_HK2] = get_isg_scaled_value(
decoder.decode_16bit_int(),
100,
)
#1011
#THZ504 HEIZKURVE FUSSPUNKT HK2
result[HEATING_CURVE_LOW_END_HK2] = get_isg_scaled_value(
decoder.decode_16bit_int(),
100,
)
#1012
#THZ504 WASSERTEMP KOMFORT SOLL
result[COMFORT_WATER_TEMPERATURE_TARGET] = get_isg_scaled_value(
decoder.decode_16bit_int(),
)
#1013
#THZ504 WASSERTEMP ECO SOLL
result[ECO_WATER_TEMPERATURE_TARGET] = get_isg_scaled_value(
decoder.decode_16bit_int(),
)
#1014-1017
decoder.skip_bytes(8)
#1018
#THZ504 LUEFTUNG STUFE TAG
result[FAN_LEVEL_DAY] = decoder.decode_16bit_uint()
#1019
#THZ504 LUEFTUNG STUFE NACHT
result[FAN_LEVEL_NIGHT] = decoder.decode_16bit_uint()
#1020-1021
decoder.skip_bytes(4)
#1022
#THZ504 KÜHLTEMP KOMFORT SOLL HK1
result[COMFORT_COOLING_TEMPERATURE_TARGET_HK1] = get_isg_scaled_value(
decoder.decode_16bit_int(),
)
#1023
#THZ504 KÜHLTEMP ECO SOLL HK1
result[ECO_COOLING_TEMPERATURE_TARGET_HK1] = get_isg_scaled_value(
decoder.decode_16bit_int(),
)
#1024
#THZ504 KÜHLTEMP KOMFORT SOLL HK2
result[COMFORT_COOLING_TEMPERATURE_TARGET_HK2] = get_isg_scaled_value(
decoder.decode_16bit_int(),
)
#1025
#THZ504 KÜHLTEMP ECO SOLL HK2
result[ECO_COOLING_TEMPERATURE_TARGET_HK2] = get_isg_scaled_value(
decoder.decode_16bit_int(),
)
result["system_paramaters"] = list(inverter_data.registers)
return result
async def read_modbus_energy(self) -> dict:
"""Read the energy consumption related values from the ISG."""
result = {}
inverter_data = await self.read_input_registers(slave=1, address=3000, count=37)
if not inverter_data.isError():
decoder = BinaryPayloadDecoder.fromRegisters(
inverter_data.registers,
byteorder=Endian.BIG,
)
#3001
#THZ504 WM HEIZEN TAG KWH
produced_heating_today_high = decoder.decode_16bit_uint()
#3002
#THZ504 WM HEIZEN SUMME KWH
produced_heating_total_low = decoder.decode_16bit_uint()
#3003
#THZ504 WM HEIZEN SUMME MWH
produced_heating_total_high = decoder.decode_16bit_uint()
#3004
#THZ504 WM WW TAG KWH
produced_water_today_high = decoder.decode_16bit_uint()
#3005
#THZ504 WM WW SUMME KWH
produced_water_total_low = decoder.decode_16bit_uint()
#3006
#THZ504 WM WW SUMME MWH
produced_water_total_high = decoder.decode_16bit_uint()
#3007
#THZ504 WM NE HEIZEN SUMME KWH
produced_electrical_heat_total_low = decoder.decode_16bit_uint()
#3008
#THZ504 WM NE HEIZEN SUMME MWH
produced_electrical_heat_total_high = decoder.decode_16bit_uint()
#3009
#THZ504 WM NE WW SUMME KWH
produced_electrical_water_total_low = decoder.decode_16bit_uint()
#3010
#THZ504 WM NE WW SUMME MWH
produced_electrical_water_total_high = decoder.decode_16bit_uint()
#3011
#THZ504 WM WRG TAG KWH
produced_recovery_today_high = decoder.decode_16bit_uint()
#3012
#THZ504 WM WRG SUMME KWH
produced_recovery_total_low = decoder.decode_16bit_uint()
#3013
#THZ504 WM WRG SUMME MWH
produced_recovery_total_high = decoder.decode_16bit_uint()
#3014
#THZ504 WM SOLAR HZ TAG
produced_solar_heating_today = self.assign_if_increased(
decoder.decode_16bit_uint(),
PRODUCED_SOLAR_HEATING_TODAY,
)
#3015
#THZ504 WM SOLAR HZ SUMME KWH
produced_solar_heating_total_low = decoder.decode_16bit_uint()
#3016
#THZ504 WM SOLAR HZ SUMME MWH
produced_solar_heating_total_high = decoder.decode_16bit_uint()
#3017
#THZ504 WM SOLAR WW TAG
produced_solar_water_heating_today = self.assign_if_increased(
decoder.decode_16bit_uint(),
PRODUCED_SOLAR_WATER_HEATING_TODAY,
)
#3018
#THZ504 WM SOLAR WW SUMME KWH
produced_solar_water_heating_total_low = decoder.decode_16bit_uint()
#3019
#THZ504 WM SOLAR WW SUMME MWH
produced_solar_water_heating_total_high = decoder.decode_16bit_uint()
#3020 - 3021
decoder.skip_bytes(4)
#3020
#THZ504 WM KUEHLEN SUMME KWH
#3021
#THZ504 WM KUEHLEN SUMME MWH
#3022
#THZ504 P HEIZUNG TAG KWH
consumed_heating_today_high = decoder.decode_16bit_uint()
#3023
#THZ504 P HEIZUNG SUMME KWH
consumed_heating_total_low = decoder.decode_16bit_uint()
#3024
#THZ504 P HEIZUNG SUMME MWH
consumed_heating_total_high = decoder.decode_16bit_uint()
#3025
#THZ504 P WW TAG KWH
consumed_water_today_high = decoder.decode_16bit_uint()
#3026
#THZ504 P WW SUMME KWH
consumed_water_total_low = decoder.decode_16bit_uint()
#3027
#THZ504 P WW SUMME MWH
consumed_water_total_high = decoder.decode_16bit_uint()
#3028
#THZ504 VERDICHTER HEIZEN
result[COMPRESSOR_HEATING] = decoder.decode_16bit_uint()
#3029
#THZ504 VERDICHTER KUEHLEN
result[COMPRESSOR_COOLING] = decoder.decode_16bit_uint()
#3030
#THZ504 VERDICHTER WW
result[COMPRESSOR_HEATING_WATER] = decoder.decode_16bit_uint()
#3031
#THZ504 ELEKTR NE HEIZEN
result[ELECTRICAL_BOOSTER_HEATING] = decoder.decode_16bit_uint()
#3032
#THZ504 ELEKTR NE WW
result[ELECTRICAL_BOOSTER_HEATING_WATER] = decoder.decode_16bit_uint()
#3033
#THZ504 WM HEIZEN TAG WH
produced_heating_today_low = decoder.decode_16bit_uint()
#3034
#THZ504 WM WW TAG WH
produced_water_today_low = decoder.decode_16bit_uint()
#3035
#THZ504 P HEIZUNG TAG WH
consumed_heating_today_low = decoder.decode_16bit_uint()
#3036
#THZ504 P WW TAG WH
consumed_water_today_low = decoder.decode_16bit_uint()
#3037
#THZ504 WM WRG TAG WH
produced_recovery_today_low = decoder.decode_16bit_uint()
#Energy Calculation
result[PRODUCED_HEATING_TOTAL] = (
produced_heating_total_high * 1000 + produced_heating_total_low
)
result[PRODUCED_HEATING_TODAY] = (
produced_heating_today_high + produced_heating_today_low * 0.001
)
result[PRODUCED_HEATING] = self.assign_if_increased(
result[PRODUCED_HEATING_TOTAL] + result[PRODUCED_HEATING_TODAY],
PRODUCED_HEATING,
)
result[PRODUCED_WATER_HEATING_TOTAL] = (
produced_water_total_high * 1000 + produced_water_total_low
)
result[PRODUCED_WATER_HEATING_TODAY] = (
produced_water_today_high + produced_water_today_low * 0.001
)
result[PRODUCED_WATER_HEATING] = self.assign_if_increased(
result[PRODUCED_WATER_HEATING_TOTAL] + result[PRODUCED_WATER_HEATING_TODAY],
PRODUCED_WATER_HEATING,
)
result[CONSUMED_HEATING_TOTAL] = (
consumed_heating_total_high * 1000 + consumed_heating_total_low
)
result[CONSUMED_HEATING_TODAY] = (
consumed_heating_today_high + consumed_heating_today_low * 0.001
)
result[CONSUMED_HEATING] = self.assign_if_increased(
result[CONSUMED_HEATING_TOTAL] + result[CONSUMED_HEATING_TODAY],
CONSUMED_HEATING,
)
result[CONSUMED_WATER_HEATING_TOTAL] = (
consumed_water_total_high * 1000 + consumed_water_total_low
)
result[CONSUMED_WATER_HEATING_TODAY] = (
consumed_water_today_high + consumed_water_today_low * 0.001
)
result[CONSUMED_WATER_HEATING] = self.assign_if_increased(
result[CONSUMED_WATER_HEATING_TOTAL]
+ result[CONSUMED_WATER_HEATING_TODAY],
CONSUMED_WATER_HEATING,
)
result[PRODUCED_RECOVERY_TOTAL] = (
produced_recovery_total_high * 1000 + produced_recovery_total_low
)
result[PRODUCED_RECOVERY_TODAY] = (
produced_recovery_today_high + produced_recovery_today_low * 0.001
)
result[PRODUCED_RECOVERY] = self.assign_if_increased(
result[PRODUCED_RECOVERY_TOTAL] + result[PRODUCED_RECOVERY_TODAY],
PRODUCED_RECOVERY,
)
result[PRODUCED_ELECTRICAL_HEAT_TOTAL] = (
produced_electrical_heat_total_high * 1000 + produced_electrical_heat_total_low
)
result[PRODUCED_ELECTRICAL_WATER_TOTAL] = (
produced_electrical_water_total_high * 1000 + produced_electrical_water_total_low
)
result[PRODUCED_SOLAR_HEATING_TOTAL] = (
produced_solar_heating_total_high * 1000 + produced_solar_heating_total_low
)
result[PRODUCED_SOLAR_HEATING_TODAY] = produced_solar_heating_today
result[PRODUCED_SOLAR_HEATING] = self.assign_if_increased(
result[PRODUCED_SOLAR_HEATING_TOTAL]
+ result[PRODUCED_SOLAR_HEATING_TODAY],
PRODUCED_SOLAR_HEATING,
)
result[PRODUCED_SOLAR_WATER_HEATING_TOTAL] = (
produced_solar_water_heating_total_high * 1000 + produced_solar_water_heating_total_low
)
result[PRODUCED_SOLAR_WATER_HEATING_TODAY] = (
produced_solar_water_heating_today
)
result[PRODUCED_SOLAR_WATER_HEATING] = self.assign_if_increased(
result[PRODUCED_SOLAR_WATER_HEATING_TOTAL]
+ result[PRODUCED_SOLAR_WATER_HEATING_TODAY],
PRODUCED_SOLAR_WATER_HEATING,
)
# Energy Ratio
# Heating Ratio Today
result[PRODUCED_HEATING_TODAY_VS_CONSUMED_HEATING_TODAY] = (
(produced_heating_today_high + produced_heating_today_low * 0.001) / (consumed_heating_today_high + consumed_heating_today_low * 0.001)
)
# Heating Ratio Total
result[PRODUCED_HEATING_TOTAL_VS_CONSUMED_HEATING_TOTAL] = (
(produced_heating_total_high * 1000 + produced_heating_total_low) / (consumed_heating_total_high * 1000 + consumed_heating_total_low)
)
# Water Heating Ratio Today
result[PRODUCED_WATER_HEATING_TODAY_VS_CONSUMED_WATER_HEATING_TODAY] = (
(produced_water_today_high + produced_water_today_low * 0.001) / (consumed_water_today_high + consumed_water_today_low * 0.001)
)
# Water Heating Ratio Total
result[PRODUCED_WATER_HEATING_TOTAL_VS_CONSUMED_WATER_HEATING_TOTAL] = (
(produced_water_total_high * 1000 + produced_water_total_low) / (consumed_water_total_high * 1000 + consumed_water_total_low)
)
return result
async def set_data(self, key, value) -> None:
"""Write the data to the modbus."""
_LOGGER.debug(f"set modbus register for {key} to {value}")
if key == SG_READY_ACTIVE:
await self.write_register(address=4000, value=value, slave=1)
elif key == SG_READY_INPUT_1:
await self.write_register(address=4001, value=value, slave=1)
elif key == SG_READY_INPUT_2:
await self.write_register(address=4002, value=value, slave=1)
elif key == OPERATION_MODE:
await self.write_register(address=1000, value=value, slave=1)
elif key == COMFORT_TEMPERATURE_TARGET_HK1:
await self.write_register(address=1001, value=int(value * 10), slave=1)
elif key == ECO_TEMPERATURE_TARGET_HK1:
await self.write_register(address=1002, value=int(value * 10), slave=1)
elif key == HEATING_CURVE_RISE_HK1:
await self.write_register(address=1007, value=int(value * 100), slave=1)
elif key == HEATING_CURVE_LOW_END_HK1:
await self.write_register(address=1008, value=int(value * 100), slave=1)
elif key == COMFORT_TEMPERATURE_TARGET_HK2:
await self.write_register(address=1004, value=int(value * 10), slave=1)
elif key == ECO_TEMPERATURE_TARGET_HK2:
await self.write_register(address=1005, value=int(value * 10), slave=1)
elif key == HEATING_CURVE_RISE_HK2:
await self.write_register(address=1009, value=int(value * 100), slave=1)
elif key == HEATING_CURVE_LOW_END_HK2:
await self.write_register(address=1010, value=int(value * 100), slave=1)
elif key == COMFORT_WATER_TEMPERATURE_TARGET:
await self.write_register(address=1011, value=int(value * 10), slave=1)
elif key == ECO_WATER_TEMPERATURE_TARGET:
await self.write_register(address=1012, value=int(value * 10), slave=1)
elif key == FAN_LEVEL_DAY:
await self.write_register(address=1017, value=int(value), slave=1)
elif key == FAN_LEVEL_NIGHT:
await self.write_register(address=1018, value=int(value), slave=1)
elif key == COMFORT_COOLING_TEMPERATURE_TARGET_HK1:
await self.write_register(address=1021, value=int(value * 10), slave=1)
elif key == ECO_COOLING_TEMPERATURE_TARGET_HK1:
await self.write_register(address=1022, value=int(value * 10), slave=1)
elif key == COMFORT_COOLING_TEMPERATURE_TARGET_HK2:
await self.write_register(address=1023, value=int(value * 10), slave=1)
elif key == ECO_COOLING_TEMPERATURE_TARGET_HK2:
await self.write_register(address=1024, value=int(value * 10), slave=1)
else:
return
self.data[key] = value
async def async_reset_heatpump(self) -> None:
"""Reset the heat pump."""
_LOGGER.debug("Reset the heat pump is not implemented of LWZ/LWA")sensor.py """Sensor platform for stiebel_eltron_isg."""
"""Change 18.02.2025 JG - V.2025.2.0 - Extended register scope"""
import datetime
import logging
import homeassistant.util.dt as dt_util
from homeassistant.components.sensor import (
SensorDeviceClass,
SensorEntity,
SensorEntityDescription,
SensorStateClass,
)
from homeassistant.const import (
PERCENTAGE,
EntityCategory,
UnitOfEnergy,
UnitOfFrequency,
UnitOfPressure,
UnitOfTemperature,
UnitOfVolumeFlowRate,
)
from homeassistant.core import HomeAssistant
from homeassistant.helpers.entity_platform import AddEntitiesCallback
from custom_components.stiebel_eltron_isg.data import (
StiebelEltronISGIntegrationConfigEntry,
)
from .const import (
ACTIVE_ERROR,
ACTUAL_HUMIDITY,
ACTUAL_HUMIDITY_HK1,
ACTUAL_HUMIDITY_HK2,
ACTUAL_HUMIDITY_HK3,
ACTUAL_MODE_EVE,
ACTUAL_MODE_IWS,
ACTUAL_ROOM_TEMPERATURE_HK1,
ACTUAL_ROOM_TEMPERATURE_HK2,
ACTUAL_ROOM_TEMPERATURE_HK3,
ACTUAL_TEMPERATURE,
ACTUAL_TEMPERATURE_BUFFER,
ACTUAL_TEMPERATURE_COOLING_FANCOIL,
ACTUAL_TEMPERATURE_COOLING_SURFACE,
ACTUAL_TEMPERATURE_FEK,
ACTUAL_TEMPERATURE_HK1,
ACTUAL_TEMPERATURE_HK2,
ACTUAL_TEMPERATURE_HK3,
ACTUAL_TEMPERATURE_WATER,
COLLECTOR_TEMPERATURE,
COMMUTE_REL,
COMPRESSOR_COOLING,
COMPRESSOR_CURRENT,
COMPRESSOR_FAULT,
COMPRESSOR_HEATING,
COMPRESSOR_HEATING_WATER,
COMPRESSOR_PERFORMANCE_TARGET,
COMPRESSOR_POWER,
COMPRESSOR_SPEED,
COMPRESSOR_STARTS,
COMPRESSOR_TARGET_CALCULATED,
COMPRESSOR_TARGET_SENT,
COMPRESSOR_TEMPERATURE,
COMPRESSOR_VOLTAGE,
CONDENSER_TEMPERATURE,
CONSUMED_HEATING,
CONSUMED_HEATING_TODAY,
CONSUMED_HEATING_TOTAL,
CONSUMED_WATER_HEATING,
CONSUMED_WATER_HEATING_TODAY,
CONSUMED_WATER_HEATING_TOTAL,
COOLING_TEMPERATURE,
DEVICE_ID,
DEWPOINT_TEMPERATURE_HK1,
DEWPOINT_TEMPERATURE_HK2,
DEWPOINT_TEMPERATURE_HK3,
DIFFERENT_PRESSURE_TXT,
DOMAIN,
DOM_SENSOR,
DYNAMIC_FACTOR,
D_FACTOR,
ELECTRICAL_BOOSTER_HEATING,
ELECTRICAL_BOOSTER_HEATING_WATER,
ERROR_NUMBER,
EVAPORATOR_DIFFERENCE_PRESSURE,
EVAPORATOR_OUTPUT_TEMPERATURE,
EVAPORATOR_TEMPERATURE,
EXHAUST_AIR_ACTUAL_FAN_SPEED,
EXHAUST_AIR_TARGET_FLOW_RATE,
EXTRACT_AIR_ACTUAL_FAN_SPEED,
EXTRACT_AIR_DEW_POINT,
EXTRACT_AIR_HUMIDITY,
EXTRACT_AIR_TARGET_FLOW_RATE,
EXTRACT_AIR_TEMPERATURE,
FAN_PRZ,
FLOW_TEMPERATURE,
FLOW_TEMPERATURE_NHZ,
FLOW_TEMPERATURE_WP1,
FLOW_TEMPERATURE_WP2,
HEATER_PRESSURE,
HEATING_COOLING_POWER,
HEATPOWER_RELATIV,
HEAT_LEVEL,
HIGH_PRESSURE,
HIGH_PRESSURE_WP1,
HIGH_PRESSURE_WP2,
HOT_GAS_TEMPERATURE,
HOT_GAS_TEMPERATURE_WP1,
HOT_GAS_TEMPERATURE_WP2,
I_FACTOR,
LOW_PRESSURE,
LOW_PRESSURE_WP1,
LOW_PRESSURE_WP2,
MIXED_WATER_QUANTITY,
ND_FILTERED,
OPENING_EXV,
OPENING_EXV_COOLING,
OPENING_EXV_PRE,
OUTDOOR_TEMPERATURE,
OVERHEAT_COMPRESSOR_ACTUAL,
OVERHEAT_COMPRESSOR_TARGET,
OVERHEAT_RECUP_ACTUAL,
PRODUCED_ELECTRICAL_HEAT_TOTAL,
PRODUCED_ELECTRICAL_WATER_TOTAL,
PRODUCED_HEATING,
PRODUCED_HEATING_TODAY,
PRODUCED_HEATING_TODAY_VS_CONSUMED_HEATING_TODAY,
PRODUCED_HEATING_TOTAL,
PRODUCED_HEATING_TOTAL_VS_CONSUMED_HEATING_TOTAL,
PRODUCED_RECOVERY,
PRODUCED_RECOVERY_TODAY,
PRODUCED_RECOVERY_TOTAL,
PRODUCED_SOLAR_HEATING,
PRODUCED_SOLAR_HEATING_TODAY,
PRODUCED_SOLAR_HEATING_TOTAL,
PRODUCED_SOLAR_WATER_HEATING,
PRODUCED_SOLAR_WATER_HEATING_TODAY,
PRODUCED_SOLAR_WATER_HEATING_TOTAL,
PRODUCED_WATER_HEATING,
PRODUCED_WATER_HEATING_TODAY,
PRODUCED_WATER_HEATING_TODAY_VS_CONSUMED_WATER_HEATING_TODAY,
PRODUCED_WATER_HEATING_TOTAL,
PRODUCED_WATER_HEATING_TOTAL_VS_CONSUMED_WATER_HEATING_TOTAL,
PWM_HEAT_PUMP,
PWM_MIXER_PUMP,
PWM_SOLAR_PUMP,
P_FACTOR,
RETURN_TEMPERATURE,
RETURN_TEMPERATURE_WP1,
RETURN_TEMPERATURE_WP2,
SG_READY_STATE,
SOFTWARE_ID,
SOFTWARE_REVISION,
SOURCE_PRESSURE,
SOLAR_COLLECTOR_TEMPERATURE,
SOLAR_CYLINDER_TEMPERATURE,
SOLAR_RUNTIME,
SOURCE_TEMPERATURE,
TARGET_ROOM_TEMPERATURE_HK1,
TARGET_ROOM_TEMPERATURE_HK2,
TARGET_ROOM_TEMPERATURE_HK3,
TARGET_TEMPERATURE,
TARGET_TEMPERATURE_BUFFER,
TARGET_TEMPERATURE_COOLING_FANCOIL,
TARGET_TEMPERATURE_COOLING_SURFACE,
TARGET_TEMPERATURE_FEK,
TARGET_TEMPERATURE_HK1,
TARGET_TEMPERATURE_HK2,
TARGET_TEMPERATURE_HK3,
TARGET_TEMPERATURE_WATER,
VALVE_POSITION,
VENTILATION_AIR_ACTUAL_FAN_SPEED,
VENTILATION_AIR_TARGET_FLOW_RATE,
VOLUME_STREAM,
VOLUME_STREAM_WP1,
VOLUME_STREAM_WP2,
WW_2_ACTUAL_TEMP,
)
from .entity import StiebelEltronISGEntity
_LOGGER = logging.getLogger(__name__)
def create_temperature_entity_description(name, key):
"""Create an entry description for a temperature sensor."""
return SensorEntityDescription(
key=key,
name=name,
native_unit_of_measurement=UnitOfTemperature.CELSIUS,
icon="mdi:thermometer",
state_class=SensorStateClass.MEASUREMENT,
device_class=SensorDeviceClass.TEMPERATURE,
has_entity_name=True,
)
def create_energy_entity_description(name, key, visible_default=True):
"""Create an entry description for a energy sensor."""
return SensorEntityDescription(
key=key,
name=name,
native_unit_of_measurement=UnitOfEnergy.KILO_WATT_HOUR,
icon="mdi:meter-electric",
has_entity_name=True,
state_class=SensorStateClass.TOTAL_INCREASING,
device_class=SensorDeviceClass.ENERGY,
entity_registry_visible_default=visible_default,
)
def create_daily_energy_entity_description(name, key, visible_default=True):
"""Create an entry description for a energy sensor."""
return SensorEntityDescription(
key=key,
name=name,
native_unit_of_measurement=UnitOfEnergy.KILO_WATT_HOUR,
icon="mdi:meter-electric",
has_entity_name=True,
state_class=SensorStateClass.TOTAL,
device_class=SensorDeviceClass.ENERGY,
entity_registry_visible_default=visible_default,
)
def create_humidity_entity_description(name, key):
"""Create an entry description for a humidity sensor."""
return SensorEntityDescription(
key=key,
name=name,
native_unit_of_measurement=PERCENTAGE,
icon="mdi:water-percent",
state_class=SensorStateClass.MEASUREMENT,
has_entity_name=True,
)
def create_pressure_entity_description(name, key):
"""Create an entry description for a pressure sensor."""
return SensorEntityDescription(
key=key,
name=name,
native_unit_of_measurement=UnitOfPressure.BAR,
icon="mdi:gauge",
state_class=SensorStateClass.MEASUREMENT,
has_entity_name=True,
)
def create_volume_stream_entity_description(name, key):
"""Create an entry description for a volume stream sensor."""
return SensorEntityDescription(
key=key,
name=name,
native_unit_of_measurement="l/min",
icon="mdi:gauge",
state_class=SensorStateClass.MEASUREMENT,
has_entity_name=True,
)
SYSTEM_VALUES_SENSOR_TYPES = [
create_temperature_entity_description("Actual Temperature", ACTUAL_TEMPERATURE),
create_temperature_entity_description("Target Temperature", TARGET_TEMPERATURE),
create_temperature_entity_description(
"Actual Temperature FEK",
ACTUAL_TEMPERATURE_FEK,
),
create_temperature_entity_description(
"Target Temperature FEK",
TARGET_TEMPERATURE_FEK,
),
create_humidity_entity_description("Humidity", ACTUAL_HUMIDITY),
create_humidity_entity_description("Humidity HK 1", ACTUAL_HUMIDITY_HK1),
create_humidity_entity_description("Humidity HK 2", ACTUAL_HUMIDITY_HK2),
create_humidity_entity_description("Humidity HK 3", ACTUAL_HUMIDITY_HK3),
create_temperature_entity_description(
"Dew Point Temperature HK 1",
DEWPOINT_TEMPERATURE_HK1,
),
create_temperature_entity_description(
"Dew Point Temperature HK 2",
DEWPOINT_TEMPERATURE_HK2,
),
create_temperature_entity_description(
"Dew Point Temperature HK 3",
DEWPOINT_TEMPERATURE_HK3,
),
create_temperature_entity_description(
"Cooling Temperature",
COOLING_TEMPERATURE,
),
create_temperature_entity_description("Outdoor Temperature", OUTDOOR_TEMPERATURE),
create_temperature_entity_description(
"Actual Temperature HK 1",
ACTUAL_TEMPERATURE_HK1,
),
create_temperature_entity_description(
"Target Temperature HK 1",
TARGET_TEMPERATURE_HK1,
),
create_temperature_entity_description(
"Actual Temperature HK 2",
ACTUAL_TEMPERATURE_HK2,
),
create_temperature_entity_description(
"Target Temperature HK 2",
TARGET_TEMPERATURE_HK2,
),
create_temperature_entity_description(
"Actual Temperature HK 3",
ACTUAL_TEMPERATURE_HK3,
),
create_temperature_entity_description(
"Target Temperature HK 3",
TARGET_TEMPERATURE_HK3,
),
create_temperature_entity_description(
"Actual Temperature Cooling Fancoil",
ACTUAL_TEMPERATURE_COOLING_FANCOIL,
),
create_temperature_entity_description(
"Target Temperature Cooling Fancoil",
TARGET_TEMPERATURE_COOLING_FANCOIL,
),
create_temperature_entity_description(
"Actual Temperature Cooling Surface",
ACTUAL_TEMPERATURE_COOLING_SURFACE,
),
create_temperature_entity_description(
"Target Temperature Cooling Surface",
TARGET_TEMPERATURE_COOLING_SURFACE,
),
create_temperature_entity_description(
"Solar Collector Temperature", SOLAR_COLLECTOR_TEMPERATURE
),
create_temperature_entity_description(
"Solar Cylinder Temperature", SOLAR_CYLINDER_TEMPERATURE
),
SensorEntityDescription(
key=SOLAR_RUNTIME,
name="Solar Runtime",
has_entity_name=True,
icon="mdi:hours-24",
native_unit_of_measurement="h",
state_class=SensorStateClass.MEASUREMENT,
),
create_temperature_entity_description(
"Actual Room Temperature HK 1",
ACTUAL_ROOM_TEMPERATURE_HK1,
),
create_temperature_entity_description(
"Target Room Temperature HK 1",
TARGET_ROOM_TEMPERATURE_HK1,
),
create_temperature_entity_description(
"Actual Room Temperature HK 2",
ACTUAL_ROOM_TEMPERATURE_HK2,
),
create_temperature_entity_description(
"Target Room Temperature HK 2",
TARGET_ROOM_TEMPERATURE_HK2,
),
create_temperature_entity_description(
"Actual Room Temperature HK 3",
ACTUAL_ROOM_TEMPERATURE_HK3,
),
create_temperature_entity_description(
"Target Room Temperature HK 3",
TARGET_ROOM_TEMPERATURE_HK3,
),
create_temperature_entity_description("Flow Temperature", FLOW_TEMPERATURE),
create_temperature_entity_description("Flow Temperature NHZ", FLOW_TEMPERATURE_NHZ),
create_temperature_entity_description("Return Temperature", RETURN_TEMPERATURE),
create_temperature_entity_description(
"Actual Temperature Buffer",
ACTUAL_TEMPERATURE_BUFFER,
),
create_temperature_entity_description(
"Target Temperature Buffer",
TARGET_TEMPERATURE_BUFFER,
),
create_pressure_entity_description("Heater Pressure", HEATER_PRESSURE),
create_volume_stream_entity_description("Volume Stream", VOLUME_STREAM),
create_temperature_entity_description(
"Actual Temperature Water",
ACTUAL_TEMPERATURE_WATER,
),
create_temperature_entity_description(
"Target Temperature Water",
TARGET_TEMPERATURE_WATER,
),
create_temperature_entity_description(
"Solar Collector Temperature",
SOLAR_COLLECTOR_TEMPERATURE,
),
create_temperature_entity_description("Source Temperature", SOURCE_TEMPERATURE),
create_pressure_entity_description("Source Pressure", SOURCE_PRESSURE),
create_temperature_entity_description("Hot Gas Temperature", HOT_GAS_TEMPERATURE),
create_pressure_entity_description("High Pressure", HIGH_PRESSURE),
create_pressure_entity_description("Low Pressure", LOW_PRESSURE),
create_pressure_entity_description("ND Filtered", ND_FILTERED),
create_temperature_entity_description(
"Return Temperature WP1",
RETURN_TEMPERATURE_WP1,
),
create_temperature_entity_description("Flow Temperature WP1", FLOW_TEMPERATURE_WP1),
create_temperature_entity_description(
"Hot Gas Temperature WP1",
HOT_GAS_TEMPERATURE_WP1,
),
create_pressure_entity_description("Low Pressure WP1", LOW_PRESSURE_WP1),
create_pressure_entity_description("High Pressure WP1", HIGH_PRESSURE_WP1),
create_volume_stream_entity_description("Volume Stream WP1", VOLUME_STREAM_WP1),
create_temperature_entity_description(
"Return Temperature WP2",
RETURN_TEMPERATURE_WP2,
),
create_temperature_entity_description("Flow Temperature WP2", FLOW_TEMPERATURE_WP2),
create_temperature_entity_description(
"Hot Gas Temperature WP2",
HOT_GAS_TEMPERATURE_WP2,
),
create_pressure_entity_description("Low Pressure WP2", LOW_PRESSURE_WP2),
create_pressure_entity_description("High Pressure WP2", HIGH_PRESSURE_WP2),
create_volume_stream_entity_description("Volume Stream WP2", VOLUME_STREAM_WP2),
create_temperature_entity_description("Collector Temperature", COLLECTOR_TEMPERATURE),
create_temperature_entity_description("Evaporator Temperature", EVAPORATOR_TEMPERATURE),
create_temperature_entity_description("Evaporator Output Temperature", EVAPORATOR_OUTPUT_TEMPERATURE),
create_temperature_entity_description("Condenser Temperature", CONDENSER_TEMPERATURE),
create_temperature_entity_description("Compressor Temperature", COMPRESSOR_TEMPERATURE),
SensorEntityDescription(
key=ACTIVE_ERROR,
name="Active Error",
has_entity_name=True,
entity_category=EntityCategory.DIAGNOSTIC,
icon="mdi:alert-circle",
),
SensorEntityDescription(
DEVICE_ID,
name="Device ID",
has_entity_name=True,
entity_category=EntityCategory.DIAGNOSTIC,
icon="mdi:information",
),
SensorEntityDescription(
SOFTWARE_REVISION,
name="Software Revision",
has_entity_name=True,
entity_category=EntityCategory.DIAGNOSTIC,
icon="mdi:information",
),
SensorEntityDescription(
SOFTWARE_ID,
name="Software ID",
has_entity_name=True,
entity_category=EntityCategory.DIAGNOSTIC,
icon="mdi:information",
),
SensorEntityDescription(
MIXED_WATER_QUANTITY,
name="Mixed Water Quantity",
icon="mdi:information",
has_entity_name=True,
native_unit_of_measurement=PERCENTAGE,
state_class=SensorStateClass.MEASUREMENT,
),
SensorEntityDescription(
OPENING_EXV_COOLING,
name="Opening EXV Cooling",
icon="mdi:information",
has_entity_name=True,
native_unit_of_measurement=PERCENTAGE,
state_class=SensorStateClass.MEASUREMENT,
),
SensorEntityDescription(
PWM_SOLAR_PUMP,
name="PWM Solar Pump",
icon="mdi:information",
has_entity_name=True,
native_unit_of_measurement=PERCENTAGE,
state_class=SensorStateClass.MEASUREMENT,
),
SensorEntityDescription(
PWM_HEAT_PUMP,
name="PWM Heat Pump",
icon="mdi:information",
has_entity_name=True,
native_unit_of_measurement=PERCENTAGE,
state_class=SensorStateClass.MEASUREMENT,
),
SensorEntityDescription(
PWM_MIXER_PUMP,
name="PWM Mixer Pump",
icon="mdi:information",
has_entity_name=True,
native_unit_of_measurement=PERCENTAGE,
state_class=SensorStateClass.MEASUREMENT,
),
SensorEntityDescription(
EXHAUST_AIR_TARGET_FLOW_RATE,
name="Exhaust Air Target Flow Rate",
icon="mdi:fan",
has_entity_name=True,
native_unit_of_measurement=PERCENTAGE,
state_class=SensorStateClass.MEASUREMENT,
),
SensorEntityDescription(
EXHAUST_AIR_ACTUAL_FAN_SPEED,
name="Exhaust Air Actual Fan Speed",
icon="mdi:speedometer",
has_entity_name=True,
native_unit_of_measurement=UnitOfFrequency.HERTZ,
device_class=SensorDeviceClass.FREQUENCY,
state_class=SensorStateClass.MEASUREMENT,
),
SensorEntityDescription(
HEAT_LEVEL,
name="Heat Level",
icon="mdi:heat-wave",
has_entity_name=True,
state_class=SensorStateClass.MEASUREMENT,
),
SensorEntityDescription(
PRODUCED_HEATING_TODAY_VS_CONSUMED_HEATING_TODAY,
name="Ratio Heating Today",
icon="mdi:set-left",
has_entity_name=True,
state_class=SensorStateClass.MEASUREMENT,
),
SensorEntityDescription(
PRODUCED_HEATING_TOTAL_VS_CONSUMED_HEATING_TOTAL,
name="Ratio Heating Total",
icon="mdi:set-left",
has_entity_name=True,
state_class=SensorStateClass.MEASUREMENT,
),
SensorEntityDescription(
PRODUCED_WATER_HEATING_TODAY_VS_CONSUMED_WATER_HEATING_TODAY,
name="Ratio Water Heating Today",
icon="mdi:set-left",
has_entity_name=True,
state_class=SensorStateClass.MEASUREMENT,
),
SensorEntityDescription(
PRODUCED_WATER_HEATING_TOTAL_VS_CONSUMED_WATER_HEATING_TOTAL,
name="Ratio Water Heating Total",
icon="mdi:set-left",
has_entity_name=True,
state_class=SensorStateClass.MEASUREMENT,
),
SensorEntityDescription(
VALVE_POSITION,
name="Valve Position",
icon="mdi:information",
has_entity_name=True,
state_class=SensorStateClass.MEASUREMENT,
),
SensorEntityDescription(
DOM_SENSOR,
name="DOM Sensor",
icon="mdi:information",
has_entity_name=True,
entity_category=EntityCategory.DIAGNOSTIC,
),
SensorEntityDescription(
HEATPOWER_RELATIV,
name="Heatpower relativ",
icon="mdi:flash",
has_entity_name=True,
native_unit_of_measurement=PERCENTAGE,
state_class=SensorStateClass.MEASUREMENT,
),
SensorEntityDescription(
COMPRESSOR_FAULT,
name="Compressor Fault",
icon="mdi:information",
has_entity_name=True,
entity_category=EntityCategory.DIAGNOSTIC,
),
SensorEntityDescription(
ACTUAL_MODE_IWS,
name="Actual Mode IWS",
icon="mdi:information",
has_entity_name=True,
state_class=SensorStateClass.MEASUREMENT,
),
SensorEntityDescription(
ACTUAL_MODE_EVE,
name="Actual Mode EVE",
icon="mdi:information",
has_entity_name=True,
state_class=SensorStateClass.MEASUREMENT,
),
SensorEntityDescription(
OVERHEAT_COMPRESSOR_TARGET,
name="Overheat Compressor Target",
icon="mdi:information",
has_entity_name=True,
native_unit_of_measurement="K",
device_class=SensorDeviceClass.TEMPERATURE,
state_class=SensorStateClass.MEASUREMENT,
),
SensorEntityDescription(
OVERHEAT_COMPRESSOR_ACTUAL,
name="Overheat Compressor Actual",
icon="mdi:information",
has_entity_name=True,
native_unit_of_measurement="K",
device_class=SensorDeviceClass.TEMPERATURE,
state_class=SensorStateClass.MEASUREMENT,
),
SensorEntityDescription(
OVERHEAT_RECUP_ACTUAL,
name="Overheat Recup Actual",
icon="mdi:information",
has_entity_name=True,
native_unit_of_measurement="K",
device_class=SensorDeviceClass.TEMPERATURE,
state_class=SensorStateClass.MEASUREMENT,
),
SensorEntityDescription(
DYNAMIC_FACTOR,
name="Dynamic Factor",
icon="mdi:information",
has_entity_name=True,
state_class=SensorStateClass.MEASUREMENT,
),
SensorEntityDescription(
P_FACTOR,
name="P-Factor",
icon="mdi:information",
has_entity_name=True,
state_class=SensorStateClass.MEASUREMENT,
),
SensorEntityDescription(
I_FACTOR,
name="I-Factor",
icon="mdi:information",
has_entity_name=True,
state_class=SensorStateClass.MEASUREMENT,
),
SensorEntityDescription(
D_FACTOR,
name="D-Factor",
icon="mdi:information",
has_entity_name=True,
state_class=SensorStateClass.MEASUREMENT,
),
SensorEntityDescription(
OPENING_EXV_PRE,
name="Opening EXV Pre",
icon="mdi:information",
has_entity_name=True,
native_unit_of_measurement=PERCENTAGE,
state_class=SensorStateClass.MEASUREMENT,
),
SensorEntityDescription(
OPENING_EXV,
name="Opening EXV",
icon="mdi:information",
has_entity_name=True,
native_unit_of_measurement=PERCENTAGE,
state_class=SensorStateClass.MEASUREMENT,
),
SensorEntityDescription(
FAN_PRZ,
name="Fan PRZ",
icon="mdi:information",
has_entity_name=True,
native_unit_of_measurement=PERCENTAGE,
state_class=SensorStateClass.MEASUREMENT,
),
SensorEntityDescription(
WW_2_ACTUAL_TEMP,
name="WW-2 actual temp",
icon="mdi:information",
has_entity_name=True,
state_class=SensorStateClass.MEASUREMENT,
),
SensorEntityDescription(
DIFFERENT_PRESSURE_TXT,
name="Different Pressure Text",
icon="mdi:information",
has_entity_name=True,
entity_category=EntityCategory.DIAGNOSTIC,
),
SensorEntityDescription(
EVAPORATOR_DIFFERENCE_PRESSURE,
name="Evaporator Difference Pressure",
icon="mdi:gauge",
has_entity_name=True,
native_unit_of_measurement="Pa",
device_class=SensorDeviceClass.PRESSURE,
state_class=SensorStateClass.MEASUREMENT,
),
SensorEntityDescription(
COMMUTE_REL,
name="Commute Rel",
icon="mdi:information",
has_entity_name=True,
native_unit_of_measurement=PERCENTAGE,
state_class=SensorStateClass.MEASUREMENT,
),
SensorEntityDescription(
HEATING_COOLING_POWER,
name="Heating/Cooling Power",
icon="mdi:flash",
has_entity_name=True,
native_unit_of_measurement="kW",
device_class=SensorDeviceClass.POWER,
state_class=SensorStateClass.MEASUREMENT,
),
SensorEntityDescription(
COMPRESSOR_PERFORMANCE_TARGET,
name="Compressor Performance Target",
icon="mdi:information",
has_entity_name=True,
native_unit_of_measurement=PERCENTAGE,
state_class=SensorStateClass.MEASUREMENT,
),
SensorEntityDescription(
COMPRESSOR_TARGET_CALCULATED,
name="Compressor Target Calculated",
icon="mdi:information",
has_entity_name=True,
native_unit_of_measurement=UnitOfFrequency.HERTZ,
device_class=SensorDeviceClass.FREQUENCY,
state_class=SensorStateClass.MEASUREMENT,
),
SensorEntityDescription(
COMPRESSOR_TARGET_SENT,
name="Compressor Target Sent",
icon="mdi:information",
has_entity_name=True,
native_unit_of_measurement=UnitOfFrequency.HERTZ,
device_class=SensorDeviceClass.FREQUENCY,
state_class=SensorStateClass.MEASUREMENT,
),
SensorEntityDescription(
ERROR_NUMBER,
name="Error Number",
icon="mdi:information",
has_entity_name=True,
entity_category=EntityCategory.DIAGNOSTIC,
),
]
ENERGYMANAGEMENT_SENSOR_TYPES = [
SensorEntityDescription(
key=SG_READY_STATE,
name="SG Ready State",
icon="mdi:solar-power",
has_entity_name=True,
),
]
ENERGY_SENSOR_TYPES = [
create_energy_entity_description(
"Produced Electrical Heating Total",
PRODUCED_ELECTRICAL_HEAT_TOTAL,
),
create_energy_entity_description(
"Produced Electrical Water Total",
PRODUCED_ELECTRICAL_WATER_TOTAL,
),
create_energy_entity_description(
"Produced Heating Total",
PRODUCED_HEATING_TOTAL,
),
create_energy_entity_description(
"Produced Heating",
PRODUCED_HEATING,
),
create_energy_entity_description(
"Produced Water Heating Total",
PRODUCED_WATER_HEATING_TOTAL,
),
create_energy_entity_description("Produced Water Heating", PRODUCED_WATER_HEATING),
create_energy_entity_description(
"Produced Recovery",
PRODUCED_RECOVERY,
),
create_energy_entity_description(
"Produced Recovery Total",
PRODUCED_RECOVERY_TOTAL,
),
create_energy_entity_description(
"Produced Solar Heating",
PRODUCED_SOLAR_HEATING,
),
create_energy_entity_description(
"Produced Solar Heating Total",
PRODUCED_SOLAR_HEATING_TOTAL,
),
create_energy_entity_description(
"Produced Solar Water Heating Total",
PRODUCED_SOLAR_WATER_HEATING_TOTAL,
),
create_energy_entity_description(
"Produced Solar Water Heating",
PRODUCED_SOLAR_WATER_HEATING,
),
create_energy_entity_description(
"Consumed Heating Total",
CONSUMED_HEATING_TOTAL,
),
create_energy_entity_description(
"Consumed Heating",
CONSUMED_HEATING,
),
create_energy_entity_description(
"Consumed Water Heating Total",
CONSUMED_WATER_HEATING_TOTAL,
),
create_energy_entity_description(
"Consumed Water Heating",
CONSUMED_WATER_HEATING,
),
]
ENERGY_DAILY_SENSOR_TYPES = [
create_daily_energy_entity_description(
"Produced Heating Today",
PRODUCED_HEATING_TODAY,
),
create_daily_energy_entity_description(
"Produced Water Heating Today",
PRODUCED_WATER_HEATING_TODAY,
),
create_daily_energy_entity_description(
"Produced Recovery Today",
PRODUCED_RECOVERY_TODAY,
),
create_daily_energy_entity_description(
"Produced Solar Heating Today",
PRODUCED_SOLAR_HEATING_TODAY,
),
create_daily_energy_entity_description(
"Produced Solar Water Heating Today",
PRODUCED_SOLAR_WATER_HEATING_TODAY,
),
create_daily_energy_entity_description(
"Consumed Heating Today",
CONSUMED_HEATING_TODAY,
),
create_daily_energy_entity_description(
"Consumed Water Heating Today",
CONSUMED_WATER_HEATING_TODAY,
),
]
COMPRESSOR_SENSOR_TYPES = [
SensorEntityDescription(
key=COMPRESSOR_STARTS,
name="Compressor starts",
icon="mdi:restart",
has_entity_name=True,
),
SensorEntityDescription(
COMPRESSOR_COOLING,
name="Compressor cooling",
icon="mdi:hours-24",
has_entity_name=True,
native_unit_of_measurement="h",
state_class=SensorStateClass.MEASUREMENT,
),
SensorEntityDescription(
key=COMPRESSOR_HEATING,
name="Compressor heating",
icon="mdi:hours-24",
has_entity_name=True,
native_unit_of_measurement="h",
state_class=SensorStateClass.MEASUREMENT,
),
SensorEntityDescription(
key=COMPRESSOR_HEATING_WATER,
name="Compressor heating water",
icon="mdi:hours-24",
has_entity_name=True,
native_unit_of_measurement="h",
state_class=SensorStateClass.MEASUREMENT,
),
SensorEntityDescription(
COMPRESSOR_SPEED,
name="Compressor speed",
icon="mdi:speedometer",
has_entity_name=True,
native_unit_of_measurement=UnitOfFrequency.HERTZ,
device_class=SensorDeviceClass.FREQUENCY,
state_class=SensorStateClass.MEASUREMENT,
),
SensorEntityDescription(
COMPRESSOR_CURRENT,
name="Compressor current",
icon="mdi:current-ac",
has_entity_name=True,
native_unit_of_measurement="A",
device_class=SensorDeviceClass.CURRENT,
state_class=SensorStateClass.MEASUREMENT,
),
SensorEntityDescription(
COMPRESSOR_VOLTAGE,
name="Compressor voltage",
icon="mdi:sine-wave",
has_entity_name=True,
native_unit_of_measurement="V",
device_class=SensorDeviceClass.VOLTAGE,
state_class=SensorStateClass.MEASUREMENT,
),
SensorEntityDescription(
COMPRESSOR_POWER,
name="Compressor power",
icon="mdi:flash",
has_entity_name=True,
native_unit_of_measurement="kW",
device_class=SensorDeviceClass.POWER,
state_class=SensorStateClass.MEASUREMENT,
),
SensorEntityDescription(
key=ELECTRICAL_BOOSTER_HEATING,
name="Electrical booster heating",
icon="mdi:hours-24",
has_entity_name=True,
native_unit_of_measurement="h",
state_class=SensorStateClass.MEASUREMENT,
),
SensorEntityDescription(
key=ELECTRICAL_BOOSTER_HEATING_WATER,
name="Electrical booster heating water",
icon="mdi:hours-24",
has_entity_name=True,
native_unit_of_measurement="h",
state_class=SensorStateClass.MEASUREMENT,
),
]
VENTILATION_SENSOR_TYPES = [
SensorEntityDescription(
key=VENTILATION_AIR_ACTUAL_FAN_SPEED,
name="Ventilation air actual fan speed",
icon="mdi:fan",
has_entity_name=True,
native_unit_of_measurement=UnitOfFrequency.HERTZ,
device_class=SensorDeviceClass.FREQUENCY,
state_class=SensorStateClass.MEASUREMENT,
),
SensorEntityDescription(
key=VENTILATION_AIR_TARGET_FLOW_RATE,
name="Ventilation air target fan speed",
icon="mdi:fan",
has_entity_name=True,
native_unit_of_measurement=UnitOfVolumeFlowRate.CUBIC_METERS_PER_HOUR,
state_class=SensorStateClass.MEASUREMENT,
),
SensorEntityDescription(
key=EXTRACT_AIR_ACTUAL_FAN_SPEED,
name="Extract air actual fan speed",
icon="mdi:fan",
has_entity_name=True,
native_unit_of_measurement=UnitOfFrequency.HERTZ,
device_class=SensorDeviceClass.FREQUENCY,
state_class=SensorStateClass.MEASUREMENT,
),
SensorEntityDescription(
key=EXTRACT_AIR_TARGET_FLOW_RATE,
name="Extract air target fan speed",
icon="mdi:fan",
has_entity_name=True,
native_unit_of_measurement=UnitOfVolumeFlowRate.CUBIC_METERS_PER_HOUR,
state_class=SensorStateClass.MEASUREMENT,
),
create_temperature_entity_description(
"Extract air dew point", EXTRACT_AIR_DEW_POINT
),
create_humidity_entity_description("Extract air humidity", EXTRACT_AIR_HUMIDITY),
create_temperature_entity_description(
"Extract air temperature", EXTRACT_AIR_TEMPERATURE
),
]
async def async_setup_entry(
_hass: HomeAssistant, # Unused function argument: `hass`
entry: StiebelEltronISGIntegrationConfigEntry,
async_add_devices: AddEntitiesCallback,
) -> None:
"""Set up the sensor platform."""
coordinator = entry.runtime_data.coordinator
entities = []
for description in SYSTEM_VALUES_SENSOR_TYPES:
sensor = StiebelEltronISGSensor(
coordinator,
entry,
description,
)
entities.append(sensor)
for description in ENERGYMANAGEMENT_SENSOR_TYPES:
sensor = StiebelEltronISGSensor(
coordinator,
entry,
description,
)
entities.append(sensor)
for description in ENERGY_SENSOR_TYPES:
sensor = StiebelEltronISGSensor(
coordinator,
entry,
description,
)
entities.append(sensor)
for description in ENERGY_DAILY_SENSOR_TYPES:
sensor = StiebelEltronISGEnergySensor(
coordinator,
entry,
description,
)
entities.append(sensor)
if not coordinator.is_wpm:
for description in COMPRESSOR_SENSOR_TYPES:
sensor = StiebelEltronISGSensor(
coordinator,
entry,
description,
)
entities.append(sensor)
for description in VENTILATION_SENSOR_TYPES:
sensor = StiebelEltronISGSensor(
coordinator,
entry,
description,
)
entities.append(sensor)
async_add_devices(entities)
class StiebelEltronISGSensor(StiebelEltronISGEntity, SensorEntity):
"""stiebel_eltron_isg Sensor class."""
def __init__(
self,
coordinator,
config_entry,
description,
):
"""Initialize the sensor."""
self.entity_description = description
super().__init__(coordinator, config_entry)
@property
def unique_id(self) -> str | None:
"""Return the unique id of the sensor."""
return f"{DOMAIN}_{self.coordinator.name}_{self.entity_description.key}"
@property
def native_value(self):
"""Return the state of the sensor."""
return self.coordinator.data.get(self.entity_description.key)
@property
def available(self) -> bool:
"""Return True if entity is available."""
return self.coordinator.data.get(self.entity_description.key) is not None
class StiebelEltronISGEnergySensor(StiebelEltronISGEntity, SensorEntity):
"""stiebel_eltron_isg Energy Sensor class."""
def __init__(
self,
coordinator,
config_entry,
description,
):
"""Initialize the sensor."""
self.entity_description = description
super().__init__(coordinator, config_entry)
@property
def unique_id(self) -> str | None:
"""Return the unique id of the sensor."""
return f"{DOMAIN}_{self.coordinator.name}_{self.entity_description.key}"
@property
def native_value(self):
"""Return the state of the sensor."""
return self.coordinator.data.get(self.entity_description.key)
@property
def available(self) -> bool:
"""Return True if entity is available."""
return self.coordinator.data.get(self.entity_description.key) is not None
@property
def last_reset(self) -> datetime.datetime | None:
"""Set Last Reset to now, if value is 0."""
value = self.coordinator.data.get(self.entity_description.key)
if value is not None and value == 0:
return dt_util.utcnow()
return None |


Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
Hello,
I have a request or suggestion about expanding the ISG integration. Some time ago I modified the ISG so that I can read out additional Modbus registers that are available according to the Stiebel-Eltron documentation. This means that further parameters of my heat pump LWZ/THZ 504 are available to me for evaluation. So far I have read out the ISG using my own Modbus queries in Home Assistant. If I switch to the integration you provided, I can no longer query these values.
Is it possible to include the complete register set of the ISG/heat pump in the integration?
This would require the following register range: 0-85, 1000-1029, 2000-2035, 3000-3036, 4000-4002 and 5000-5003.
For the output of the daily consumption and performance values, an output with a decimal place for the Wh would also be very nice (e.g. 2.346 kWh).
Best regards
Jo Kaan
All reactions