From 11d67bd4caac6bdb4187badd9291f4f4dfa5f5bd Mon Sep 17 00:00:00 2001 From: eriknn <82818949+eriknn@users.noreply.github.com> Date: Sun, 13 Oct 2024 02:30:05 +0200 Subject: [PATCH] Changed to base device datamoints, modified R15 --- custom_components/swegon/__init__.py | 3 +- custom_components/swegon/coordinator.py | 4 +- .../swegon/pyswegon/devices/casa_base.py | 133 ++++++++++++++++++ .../swegon/pyswegon/devices/casa_r15.py | 129 ++--------------- .../swegon/pyswegon/devices/casa_r4.py | 128 ++--------------- custom_components/swegon/pyswegon/swegon.py | 26 ++-- 6 files changed, 169 insertions(+), 254 deletions(-) create mode 100644 custom_components/swegon/pyswegon/devices/casa_base.py diff --git a/custom_components/swegon/__init__.py b/custom_components/swegon/__init__.py index 36f25e9..87cb43d 100644 --- a/custom_components/swegon/__init__.py +++ b/custom_components/swegon/__init__.py @@ -51,8 +51,7 @@ async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool: ) # Set up coordinator - coordinator = SwegonCoordinator(hass, dev, ip, port, slave_id,scan_interval, scan_interval_fast) - await coordinator._swegonDevice.async_load_device_data(device_model) + coordinator = SwegonCoordinator(hass, dev, device_model, ip, port, slave_id,scan_interval, scan_interval_fast) hass.data[DOMAIN][entry.entry_id] = coordinator # Forward the setup to the platforms. diff --git a/custom_components/swegon/coordinator.py b/custom_components/swegon/coordinator.py index 9a3f53b..2e33ed4 100644 --- a/custom_components/swegon/coordinator.py +++ b/custom_components/swegon/coordinator.py @@ -16,7 +16,7 @@ class SwegonCoordinator(DataUpdateCoordinator): _normal_poll_interval = 60 _fast_poll_interval = 10 - def __init__(self, hass, device, ip, port, slave_id, scan_interval, scan_interval_fast): + def __init__(self, hass, device, device_module:str, ip, port, slave_id, scan_interval, scan_interval_fast): """Initialize coordinator parent""" super().__init__( hass, @@ -31,7 +31,7 @@ def __init__(self, hass, device, ip, port, slave_id, scan_interval, scan_interva self._fast_poll_interval = scan_interval_fast self._device = device - self._swegonDevice = Swegon(ip, port, slave_id) + self._swegonDevice = Swegon(device_module, ip, port, slave_id) # Initialize states self._measurements = None diff --git a/custom_components/swegon/pyswegon/devices/casa_base.py b/custom_components/swegon/pyswegon/devices/casa_base.py new file mode 100644 index 0000000..4d88261 --- /dev/null +++ b/custom_components/swegon/pyswegon/devices/casa_base.py @@ -0,0 +1,133 @@ +import logging + +from ..swegon import Modbus_Datapoint +from ..swegon import COMMANDS,SETPOINTS,DEVICE_INFO,ALARMS,SENSORS,SENSORS2,VIRTUALSENSORS,UNIT_STATUSES,CONFIG + +_LOGGER = logging.getLogger(__name__) + +class CasaBase: + def __init__(self): + self.Datapoints = {} + + # Read / Write - Holding registers + self.Datapoints[COMMANDS] = {} + self.Datapoints[COMMANDS]["Op_Mode"] = Modbus_Datapoint(5000) + self.Datapoints[COMMANDS]["Fireplace_Mode"] = Modbus_Datapoint(5001) + self.Datapoints[COMMANDS]["Unused"] = Modbus_Datapoint(5002) + self.Datapoints[COMMANDS]["Travelling_Mode"] = Modbus_Datapoint(5003) + + # Read / Write - Holding registers + self.Datapoints[SETPOINTS] = {} + self.Datapoints[SETPOINTS]["Temp_SP"] = Modbus_Datapoint(5100, 0.1) + + # Read only - Input registers + self.Datapoints[DEVICE_INFO] = {} + self.Datapoints[DEVICE_INFO]["FW_Maj"] = Modbus_Datapoint(6000) + self.Datapoints[DEVICE_INFO]["FW_Min"] = Modbus_Datapoint(6001) + self.Datapoints[DEVICE_INFO]["FW_Build"] = Modbus_Datapoint(6002) + self.Datapoints[DEVICE_INFO]["Par_Maj"] = Modbus_Datapoint(6003) + self.Datapoints[DEVICE_INFO]["Par_Min"] = Modbus_Datapoint(6004) + self.Datapoints[DEVICE_INFO]["Model_Name"] = Modbus_Datapoint(6007) # 15 Bytes + self.Datapoints[DEVICE_INFO]["Serial_Number"] = Modbus_Datapoint(6023) # 24 Bytes + + # Read only - Input registers + self.Datapoints[ALARMS] = {} + self.Datapoints[ALARMS]["T1_Failure"] = Modbus_Datapoint(6100) + self.Datapoints[ALARMS]["T2_Failure"] = Modbus_Datapoint(6101) + self.Datapoints[ALARMS]["T3_Failure"] = Modbus_Datapoint(6102) + self.Datapoints[ALARMS]["T4_Failure"] = Modbus_Datapoint(6103) + self.Datapoints[ALARMS]["T5_Failure"] = Modbus_Datapoint(6104) + self.Datapoints[ALARMS]["T6_Failure"] = Modbus_Datapoint(6105) + self.Datapoints[ALARMS]["T7_Failure"] = Modbus_Datapoint(6106) + self.Datapoints[ALARMS]["T8_Failure"] = Modbus_Datapoint(6107) + self.Datapoints[ALARMS]["T1_Failure_Unconf"] = Modbus_Datapoint(6108) + self.Datapoints[ALARMS]["T2_Failure_Unconf"] = Modbus_Datapoint(6109) + self.Datapoints[ALARMS]["T3_Failure_Unconf"] = Modbus_Datapoint(6110) + self.Datapoints[ALARMS]["T4_Failure_Unconf"] = Modbus_Datapoint(6111) + self.Datapoints[ALARMS]["T5_Failure_Unconf"] = Modbus_Datapoint(6112) + self.Datapoints[ALARMS]["T6_Failure_Unconf"] = Modbus_Datapoint(6113) + self.Datapoints[ALARMS]["T7_Failure_Unconf"] = Modbus_Datapoint(6114) + self.Datapoints[ALARMS]["T8_Failure_Unconf"] = Modbus_Datapoint(6115) + self.Datapoints[ALARMS]["Afterheater_Failure"] = Modbus_Datapoint(6116) + self.Datapoints[ALARMS]["Afterheater_Failure_Unconf"] = Modbus_Datapoint(6117) + self.Datapoints[ALARMS]["Preheater_Failure"] = Modbus_Datapoint(6118) + self.Datapoints[ALARMS]["Preheater_Failure_Unconf"] = Modbus_Datapoint(6119) + self.Datapoints[ALARMS]["Freezing_Danger"] = Modbus_Datapoint(6120) + self.Datapoints[ALARMS]["Freezing_Danger_Unconf"] = Modbus_Datapoint(6121) + self.Datapoints[ALARMS]["Internal_Error"] = Modbus_Datapoint(6122) + self.Datapoints[ALARMS]["Internal_Error_Unconf"] = Modbus_Datapoint(6123) + self.Datapoints[ALARMS]["Supply_Fan_Failure"] = Modbus_Datapoint(6124) + self.Datapoints[ALARMS]["Supply_Fan_Failure_Unconf"] = Modbus_Datapoint(6125) + self.Datapoints[ALARMS]["Exhaust_Fan_Failure"] = Modbus_Datapoint(6126) + self.Datapoints[ALARMS]["Exhaust_Fan_Failure_Unconf"] = Modbus_Datapoint(6127) + self.Datapoints[ALARMS]["Service_Info"] = Modbus_Datapoint(6128) + self.Datapoints[ALARMS]["Filter_Guard_Info"] = Modbus_Datapoint(6129) + self.Datapoints[ALARMS]["Emergency_Stop"] = Modbus_Datapoint(6130) + self.Datapoints[ALARMS]["Active_Alarms"] = Modbus_Datapoint(6131) + self.Datapoints[ALARMS]["Info_Unconf"] = Modbus_Datapoint(6132) + + # Read only - Input registers + self.Datapoints[SENSORS] = {} + self.Datapoints[SENSORS]["Fresh_Temp"] = Modbus_Datapoint(6200, 0.1) + self.Datapoints[SENSORS]["Supply_Temp1"] = Modbus_Datapoint(6201, 0.1) + self.Datapoints[SENSORS]["Supply_Temp2"] = Modbus_Datapoint(6202, 0.1) + self.Datapoints[SENSORS]["Extract_Temp"] = Modbus_Datapoint(6203, 0.1) + self.Datapoints[SENSORS]["Exhaust_Temp"] = Modbus_Datapoint(6204, 0.1) + self.Datapoints[SENSORS]["Room_Temp"] = Modbus_Datapoint(6205, 0.1) + self.Datapoints[SENSORS]["UP1_Temp"] = Modbus_Datapoint(6206, 0.1) + self.Datapoints[SENSORS]["UP2_Temp"] = Modbus_Datapoint(6207, 0.1) + self.Datapoints[SENSORS]["WR_Temp"] = Modbus_Datapoint(6208, 0.1) + self.Datapoints[SENSORS]["PreHeat_Temp"] = Modbus_Datapoint(6209, 0.1) + self.Datapoints[SENSORS]["ExtFresh_Temp"] = Modbus_Datapoint(6210, 0.1) + self.Datapoints[SENSORS]["C02_Unf"] = Modbus_Datapoint(6211, 1.0) + self.Datapoints[SENSORS]["CO2_Fil"] = Modbus_Datapoint(6212, 1.0) + self.Datapoints[SENSORS]["RH"] = Modbus_Datapoint(6213, 1.0) + self.Datapoints[SENSORS]["AH"] = Modbus_Datapoint(6214, 0.1) + self.Datapoints[SENSORS]["AH_SP"] = Modbus_Datapoint(6215, 0.1) + self.Datapoints[SENSORS]["VOC"] = Modbus_Datapoint(6216, 1.0) + self.Datapoints[SENSORS]["Supply_Pressure"] = Modbus_Datapoint(6217, 1.0) + self.Datapoints[SENSORS]["Exhaust_Pressure"] = Modbus_Datapoint(6218, 1.0) + self.Datapoints[SENSORS]["Supply_Flow"] = Modbus_Datapoint(6219, 3.6) + self.Datapoints[SENSORS]["Exhaust_Flow"] = Modbus_Datapoint(6220, 3.6) + + # Read only - Input registers + self.Datapoints[SENSORS2] = {} + self.Datapoints[SENSORS2]["Heat_Exchanger"] = Modbus_Datapoint(6233, 1.0) + + # Virtual sensors (calculated) + self.Datapoints[VIRTUALSENSORS] = {} + self.Datapoints[VIRTUALSENSORS]["Efficiency"] = Modbus_Datapoint(0, 1) + + # Read only - Input registers + self.Datapoints[UNIT_STATUSES] = {} + self.Datapoints[UNIT_STATUSES]["Unit_state"] = Modbus_Datapoint(6300) + self.Datapoints[UNIT_STATUSES]["Speed_state"] = Modbus_Datapoint(6301) + self.Datapoints[UNIT_STATUSES]["Supply_Fan"] = Modbus_Datapoint(6302) + self.Datapoints[UNIT_STATUSES]["Exhaust_Fan"] = Modbus_Datapoint(6303) + self.Datapoints[UNIT_STATUSES]["Supply_Fan_RPM"] = Modbus_Datapoint(6304) + self.Datapoints[UNIT_STATUSES]["Exhaust_Fan_RPM"] = Modbus_Datapoint(6305) + self.Datapoints[UNIT_STATUSES]["NotUsed1"] = Modbus_Datapoint(6306) + self.Datapoints[UNIT_STATUSES]["NotUsed2"] = Modbus_Datapoint(6307) + self.Datapoints[UNIT_STATUSES]["NotUsed3"] = Modbus_Datapoint(6308) + self.Datapoints[UNIT_STATUSES]["NotUsed4"] = Modbus_Datapoint(6309) + self.Datapoints[UNIT_STATUSES]["NotUsed5"] = Modbus_Datapoint(6310) + self.Datapoints[UNIT_STATUSES]["NotUsed6"] = Modbus_Datapoint(6311) + self.Datapoints[UNIT_STATUSES]["NotUsed7"] = Modbus_Datapoint(6312) + self.Datapoints[UNIT_STATUSES]["NotUsed8"] = Modbus_Datapoint(6313) + self.Datapoints[UNIT_STATUSES]["NotUsed9"] = Modbus_Datapoint(6314) + self.Datapoints[UNIT_STATUSES]["Temp_SP2"] = Modbus_Datapoint(6315) + self.Datapoints[UNIT_STATUSES]["Heating_Output"] = Modbus_Datapoint(6316) + + # Read / Write - Holding registers + self.Datapoints[CONFIG] = {} + self.Datapoints[CONFIG]["Reset_Alarms"] = Modbus_Datapoint(5406) #5406 + self.Datapoints[CONFIG]["Travelling_Mode_Speed_Drop"] = Modbus_Datapoint(5105) #5105 + self.Datapoints[CONFIG]["Fireplace_Run_Time"] = Modbus_Datapoint(5103) #5103 + self.Datapoints[CONFIG]["Fireplace_Max_Speed_Difference"] = Modbus_Datapoint(5104) #5104 + self.Datapoints[CONFIG]["Night_Cooling"] = Modbus_Datapoint(5163) #5163 + self.Datapoints[CONFIG]["Night_Cooling_FreshAir_Max"] = Modbus_Datapoint(5164) #5164 + self.Datapoints[CONFIG]["Night_Cooling_FreshAir_Start"] = Modbus_Datapoint(5165) #5165 + self.Datapoints[CONFIG]["Night_Cooling_RoomTemp_Start"] = Modbus_Datapoint(5166) #5166 + self.Datapoints[CONFIG]["Night_Cooling_SupplyTemp_Min"] = Modbus_Datapoint(5167) #5167 + + _LOGGER.debug("Loaded base datapoints for Swegon Casa") \ No newline at end of file diff --git a/custom_components/swegon/pyswegon/devices/casa_r15.py b/custom_components/swegon/pyswegon/devices/casa_r15.py index 3f77a2a..8e70b91 100644 --- a/custom_components/swegon/pyswegon/devices/casa_r15.py +++ b/custom_components/swegon/pyswegon/devices/casa_r15.py @@ -1,125 +1,14 @@ +import logging + +from .casa_base import CasaBase from ..swegon import Modbus_Datapoint from ..swegon import COMMANDS,SETPOINTS,DEVICE_INFO,ALARMS,SENSORS,SENSORS2,VIRTUALSENSORS,UNIT_STATUSES,CONFIG -Datapoints = {} - -# Read / Write - Holding registers -Datapoints[COMMANDS] = {} -Datapoints[COMMANDS]["Op_Mode"] = Modbus_Datapoint(5000) -Datapoints[COMMANDS]["Fireplace_Mode"] = Modbus_Datapoint(5001) -Datapoints[COMMANDS]["Unused"] = Modbus_Datapoint(5002) -Datapoints[COMMANDS]["Travelling_Mode"] = Modbus_Datapoint(5003) - -# Read / Write - Holding registers -Datapoints[SETPOINTS] = {} -Datapoints[SETPOINTS]["Temp_SP"] = Modbus_Datapoint(5100, 0.01) - -# Read only - Input registers -Datapoints[DEVICE_INFO] = {} -Datapoints[DEVICE_INFO]["FW_Maj"] = Modbus_Datapoint(6000) -Datapoints[DEVICE_INFO]["FW_Min"] = Modbus_Datapoint(6001) -Datapoints[DEVICE_INFO]["FW_Build"] = Modbus_Datapoint(6002) -Datapoints[DEVICE_INFO]["Par_Maj"] = Modbus_Datapoint(6003) -Datapoints[DEVICE_INFO]["Par_Min"] = Modbus_Datapoint(6004) -Datapoints[DEVICE_INFO]["Model_Name"] = Modbus_Datapoint(6007) # 15 Bytes -Datapoints[DEVICE_INFO]["Serial_Number"] = Modbus_Datapoint(6023) # 24 Bytes - -# Read only - Input registers -Datapoints[ALARMS] = {} -Datapoints[ALARMS]["T1_Failure"] = Modbus_Datapoint(6100) -Datapoints[ALARMS]["T2_Failure"] = Modbus_Datapoint(6101) -Datapoints[ALARMS]["T3_Failure"] = Modbus_Datapoint(6102) -Datapoints[ALARMS]["T4_Failure"] = Modbus_Datapoint(6103) -Datapoints[ALARMS]["T5_Failure"] = Modbus_Datapoint(6104) -Datapoints[ALARMS]["T6_Failure"] = Modbus_Datapoint(6105) -Datapoints[ALARMS]["T7_Failure"] = Modbus_Datapoint(6106) -Datapoints[ALARMS]["T8_Failure"] = Modbus_Datapoint(6107) -Datapoints[ALARMS]["T1_Failure_Unconf"] = Modbus_Datapoint(6108) -Datapoints[ALARMS]["T2_Failure_Unconf"] = Modbus_Datapoint(6109) -Datapoints[ALARMS]["T3_Failure_Unconf"] = Modbus_Datapoint(6110) -Datapoints[ALARMS]["T4_Failure_Unconf"] = Modbus_Datapoint(6111) -Datapoints[ALARMS]["T5_Failure_Unconf"] = Modbus_Datapoint(6112) -Datapoints[ALARMS]["T6_Failure_Unconf"] = Modbus_Datapoint(6113) -Datapoints[ALARMS]["T7_Failure_Unconf"] = Modbus_Datapoint(6114) -Datapoints[ALARMS]["T8_Failure_Unconf"] = Modbus_Datapoint(6115) -Datapoints[ALARMS]["Afterheater_Failure"] = Modbus_Datapoint(6116) -Datapoints[ALARMS]["Afterheater_Failure_Unconf"] = Modbus_Datapoint(6117) -Datapoints[ALARMS]["Preheater_Failure"] = Modbus_Datapoint(6118) -Datapoints[ALARMS]["Preheater_Failure_Unconf"] = Modbus_Datapoint(6119) -Datapoints[ALARMS]["Freezing_Danger"] = Modbus_Datapoint(6120) -Datapoints[ALARMS]["Freezing_Danger_Unconf"] = Modbus_Datapoint(6121) -Datapoints[ALARMS]["Internal_Error"] = Modbus_Datapoint(6122) -Datapoints[ALARMS]["Internal_Error_Unconf"] = Modbus_Datapoint(6123) -Datapoints[ALARMS]["Supply_Fan_Failure"] = Modbus_Datapoint(6124) -Datapoints[ALARMS]["Supply_Fan_Failure_Unconf"] = Modbus_Datapoint(6125) -Datapoints[ALARMS]["Exhaust_Fan_Failure"] = Modbus_Datapoint(6126) -Datapoints[ALARMS]["Exhaust_Fan_Failure_Unconf"] = Modbus_Datapoint(6127) -Datapoints[ALARMS]["Service_Info"] = Modbus_Datapoint(6128) -Datapoints[ALARMS]["Filter_Guard_Info"] = Modbus_Datapoint(6129) -Datapoints[ALARMS]["Emergency_Stop"] = Modbus_Datapoint(6130) -Datapoints[ALARMS]["Active_Alarms"] = Modbus_Datapoint(6131) -Datapoints[ALARMS]["Info_Unconf"] = Modbus_Datapoint(6132) - -# Read only - Input registers -Datapoints[SENSORS] = {} -Datapoints[SENSORS]["Fresh_Temp"] = Modbus_Datapoint(6200, 0.1) -Datapoints[SENSORS]["Supply_Temp1"] = Modbus_Datapoint(6201, 0.1) -Datapoints[SENSORS]["Supply_Temp2"] = Modbus_Datapoint(6202, 0.1) -Datapoints[SENSORS]["Extract_Temp"] = Modbus_Datapoint(6203, 0.1) -Datapoints[SENSORS]["Exhaust_Temp"] = Modbus_Datapoint(6204, 0.1) -Datapoints[SENSORS]["Room_Temp"] = Modbus_Datapoint(6205, 0.1) -Datapoints[SENSORS]["UP1_Temp"] = Modbus_Datapoint(6206, 0.1) -Datapoints[SENSORS]["UP2_Temp"] = Modbus_Datapoint(6207, 0.1) -Datapoints[SENSORS]["WR_Temp"] = Modbus_Datapoint(6208, 0.1) -Datapoints[SENSORS]["PreHeat_Temp"] = Modbus_Datapoint(6209, 0.1) -Datapoints[SENSORS]["ExtFresh_Temp"] = Modbus_Datapoint(6210, 0.1) -Datapoints[SENSORS]["C02_Unf"] = Modbus_Datapoint(6211, 1.0) -Datapoints[SENSORS]["CO2_Fil"] = Modbus_Datapoint(6212, 1.0) -Datapoints[SENSORS]["RH"] = Modbus_Datapoint(6213, 1.0) -Datapoints[SENSORS]["AH"] = Modbus_Datapoint(6214, 0.1) -Datapoints[SENSORS]["AH_SP"] = Modbus_Datapoint(6215, 0.1) -Datapoints[SENSORS]["VOC"] = Modbus_Datapoint(6216, 1.0) -Datapoints[SENSORS]["Supply_Pressure"] = Modbus_Datapoint(6217, 1.0) -Datapoints[SENSORS]["Exhaust_Pressure"] = Modbus_Datapoint(6218, 1.0) -Datapoints[SENSORS]["Supply_Flow"] = Modbus_Datapoint(6219, 3.6) -Datapoints[SENSORS]["Exhaust_Flow"] = Modbus_Datapoint(6220, 3.6) - -# Read only - Input registers -Datapoints[SENSORS2] = {} -Datapoints[SENSORS2]["Heat_Exchanger"] = Modbus_Datapoint(6233, 1.0) - -# Virtual sensors (calculated) -Datapoints[VIRTUALSENSORS] = {} -Datapoints[VIRTUALSENSORS]["Efficiency"] = Modbus_Datapoint(0, 1) +_LOGGER = logging.getLogger(__name__) -# Read only - Input registers -Datapoints[UNIT_STATUSES] = {} -Datapoints[UNIT_STATUSES]["Unit_state"] = Modbus_Datapoint(6300) -Datapoints[UNIT_STATUSES]["Speed_state"] = Modbus_Datapoint(6301) -Datapoints[UNIT_STATUSES]["Supply_Fan"] = Modbus_Datapoint(6302) -Datapoints[UNIT_STATUSES]["Exhaust_Fan"] = Modbus_Datapoint(6303) -Datapoints[UNIT_STATUSES]["Supply_Fan_RPM"] = Modbus_Datapoint(6304) -Datapoints[UNIT_STATUSES]["Exhaust_Fan_RPM"] = Modbus_Datapoint(6305) -Datapoints[UNIT_STATUSES]["NotUsed1"] = Modbus_Datapoint(6306) -Datapoints[UNIT_STATUSES]["NotUsed2"] = Modbus_Datapoint(6307) -Datapoints[UNIT_STATUSES]["NotUsed3"] = Modbus_Datapoint(6308) -Datapoints[UNIT_STATUSES]["NotUsed4"] = Modbus_Datapoint(6309) -Datapoints[UNIT_STATUSES]["NotUsed5"] = Modbus_Datapoint(6310) -Datapoints[UNIT_STATUSES]["NotUsed6"] = Modbus_Datapoint(6311) -Datapoints[UNIT_STATUSES]["NotUsed7"] = Modbus_Datapoint(6312) -Datapoints[UNIT_STATUSES]["NotUsed8"] = Modbus_Datapoint(6313) -Datapoints[UNIT_STATUSES]["NotUsed9"] = Modbus_Datapoint(6314) -Datapoints[UNIT_STATUSES]["Temp_SP2"] = Modbus_Datapoint(6315) -Datapoints[UNIT_STATUSES]["Heating_Output"] = Modbus_Datapoint(6316) +class CasaR15(CasaBase): + def __init__(self): + super().__init__() + self.Datapoints[SETPOINTS]["Temp_SP"] = Modbus_Datapoint(5100, 0.01) -# Read / Write - Holding registers -Datapoints[CONFIG] = {} -Datapoints[CONFIG]["Reset_Alarms"] = Modbus_Datapoint(5406) #5406 -Datapoints[CONFIG]["Travelling_Mode_Speed_Drop"] = Modbus_Datapoint(5105) #5105 -Datapoints[CONFIG]["Fireplace_Run_Time"] = Modbus_Datapoint(5103) #5103 -Datapoints[CONFIG]["Fireplace_Max_Speed_Difference"] = Modbus_Datapoint(5104) #5104 -Datapoints[CONFIG]["Night_Cooling"] = Modbus_Datapoint(5163) #5163 -Datapoints[CONFIG]["Night_Cooling_FreshAir_Max"] = Modbus_Datapoint(5164) #5164 -Datapoints[CONFIG]["Night_Cooling_FreshAir_Start"] = Modbus_Datapoint(5165) #5165 -Datapoints[CONFIG]["Night_Cooling_RoomTemp_Start"] = Modbus_Datapoint(5166) #5166 -Datapoints[CONFIG]["Night_Cooling_SupplyTemp_Min"] = Modbus_Datapoint(5167) #5167 \ No newline at end of file + _LOGGER.debug("Loaded datapoints for Swegon Casa R15") \ No newline at end of file diff --git a/custom_components/swegon/pyswegon/devices/casa_r4.py b/custom_components/swegon/pyswegon/devices/casa_r4.py index a190970..4706fda 100644 --- a/custom_components/swegon/pyswegon/devices/casa_r4.py +++ b/custom_components/swegon/pyswegon/devices/casa_r4.py @@ -1,125 +1,13 @@ +import logging + +from .casa_base import CasaBase from ..swegon import Modbus_Datapoint from ..swegon import COMMANDS,SETPOINTS,DEVICE_INFO,ALARMS,SENSORS,SENSORS2,VIRTUALSENSORS,UNIT_STATUSES,CONFIG -Datapoints = {} - -# Read / Write - Holding registers -Datapoints[COMMANDS] = {} -Datapoints[COMMANDS]["Op_Mode"] = Modbus_Datapoint(5000) -Datapoints[COMMANDS]["Fireplace_Mode"] = Modbus_Datapoint(5001) -Datapoints[COMMANDS]["Unused"] = Modbus_Datapoint(5002) -Datapoints[COMMANDS]["Travelling_Mode"] = Modbus_Datapoint(5003) - -# Read / Write - Holding registers -Datapoints[SETPOINTS] = {} -Datapoints[SETPOINTS]["Temp_SP"] = Modbus_Datapoint(5100, 0.1) - -# Read only - Input registers -Datapoints[DEVICE_INFO] = {} -Datapoints[DEVICE_INFO]["FW_Maj"] = Modbus_Datapoint(6000) -Datapoints[DEVICE_INFO]["FW_Min"] = Modbus_Datapoint(6001) -Datapoints[DEVICE_INFO]["FW_Build"] = Modbus_Datapoint(6002) -Datapoints[DEVICE_INFO]["Par_Maj"] = Modbus_Datapoint(6003) -Datapoints[DEVICE_INFO]["Par_Min"] = Modbus_Datapoint(6004) -Datapoints[DEVICE_INFO]["Model_Name"] = Modbus_Datapoint(6007) # 15 Bytes -Datapoints[DEVICE_INFO]["Serial_Number"] = Modbus_Datapoint(6023) # 24 Bytes - -# Read only - Input registers -Datapoints[ALARMS] = {} -Datapoints[ALARMS]["T1_Failure"] = Modbus_Datapoint(6100) -Datapoints[ALARMS]["T2_Failure"] = Modbus_Datapoint(6101) -Datapoints[ALARMS]["T3_Failure"] = Modbus_Datapoint(6102) -Datapoints[ALARMS]["T4_Failure"] = Modbus_Datapoint(6103) -Datapoints[ALARMS]["T5_Failure"] = Modbus_Datapoint(6104) -Datapoints[ALARMS]["T6_Failure"] = Modbus_Datapoint(6105) -Datapoints[ALARMS]["T7_Failure"] = Modbus_Datapoint(6106) -Datapoints[ALARMS]["T8_Failure"] = Modbus_Datapoint(6107) -Datapoints[ALARMS]["T1_Failure_Unconf"] = Modbus_Datapoint(6108) -Datapoints[ALARMS]["T2_Failure_Unconf"] = Modbus_Datapoint(6109) -Datapoints[ALARMS]["T3_Failure_Unconf"] = Modbus_Datapoint(6110) -Datapoints[ALARMS]["T4_Failure_Unconf"] = Modbus_Datapoint(6111) -Datapoints[ALARMS]["T5_Failure_Unconf"] = Modbus_Datapoint(6112) -Datapoints[ALARMS]["T6_Failure_Unconf"] = Modbus_Datapoint(6113) -Datapoints[ALARMS]["T7_Failure_Unconf"] = Modbus_Datapoint(6114) -Datapoints[ALARMS]["T8_Failure_Unconf"] = Modbus_Datapoint(6115) -Datapoints[ALARMS]["Afterheater_Failure"] = Modbus_Datapoint(6116) -Datapoints[ALARMS]["Afterheater_Failure_Unconf"] = Modbus_Datapoint(6117) -Datapoints[ALARMS]["Preheater_Failure"] = Modbus_Datapoint(6118) -Datapoints[ALARMS]["Preheater_Failure_Unconf"] = Modbus_Datapoint(6119) -Datapoints[ALARMS]["Freezing_Danger"] = Modbus_Datapoint(6120) -Datapoints[ALARMS]["Freezing_Danger_Unconf"] = Modbus_Datapoint(6121) -Datapoints[ALARMS]["Internal_Error"] = Modbus_Datapoint(6122) -Datapoints[ALARMS]["Internal_Error_Unconf"] = Modbus_Datapoint(6123) -Datapoints[ALARMS]["Supply_Fan_Failure"] = Modbus_Datapoint(6124) -Datapoints[ALARMS]["Supply_Fan_Failure_Unconf"] = Modbus_Datapoint(6125) -Datapoints[ALARMS]["Exhaust_Fan_Failure"] = Modbus_Datapoint(6126) -Datapoints[ALARMS]["Exhaust_Fan_Failure_Unconf"] = Modbus_Datapoint(6127) -Datapoints[ALARMS]["Service_Info"] = Modbus_Datapoint(6128) -Datapoints[ALARMS]["Filter_Guard_Info"] = Modbus_Datapoint(6129) -Datapoints[ALARMS]["Emergency_Stop"] = Modbus_Datapoint(6130) -Datapoints[ALARMS]["Active_Alarms"] = Modbus_Datapoint(6131) -Datapoints[ALARMS]["Info_Unconf"] = Modbus_Datapoint(6132) - -# Read only - Input registers -Datapoints[SENSORS] = {} -Datapoints[SENSORS]["Fresh_Temp"] = Modbus_Datapoint(6200, 0.1) -Datapoints[SENSORS]["Supply_Temp1"] = Modbus_Datapoint(6201, 0.1) -Datapoints[SENSORS]["Supply_Temp2"] = Modbus_Datapoint(6202, 0.1) -Datapoints[SENSORS]["Extract_Temp"] = Modbus_Datapoint(6203, 0.1) -Datapoints[SENSORS]["Exhaust_Temp"] = Modbus_Datapoint(6204, 0.1) -Datapoints[SENSORS]["Room_Temp"] = Modbus_Datapoint(6205, 0.1) -Datapoints[SENSORS]["UP1_Temp"] = Modbus_Datapoint(6206, 0.1) -Datapoints[SENSORS]["UP2_Temp"] = Modbus_Datapoint(6207, 0.1) -Datapoints[SENSORS]["WR_Temp"] = Modbus_Datapoint(6208, 0.1) -Datapoints[SENSORS]["PreHeat_Temp"] = Modbus_Datapoint(6209, 0.1) -Datapoints[SENSORS]["ExtFresh_Temp"] = Modbus_Datapoint(6210, 0.1) -Datapoints[SENSORS]["C02_Unf"] = Modbus_Datapoint(6211, 1.0) -Datapoints[SENSORS]["CO2_Fil"] = Modbus_Datapoint(6212, 1.0) -Datapoints[SENSORS]["RH"] = Modbus_Datapoint(6213, 1.0) -Datapoints[SENSORS]["AH"] = Modbus_Datapoint(6214, 0.1) -Datapoints[SENSORS]["AH_SP"] = Modbus_Datapoint(6215, 0.1) -Datapoints[SENSORS]["VOC"] = Modbus_Datapoint(6216, 1.0) -Datapoints[SENSORS]["Supply_Pressure"] = Modbus_Datapoint(6217, 1.0) -Datapoints[SENSORS]["Exhaust_Pressure"] = Modbus_Datapoint(6218, 1.0) -Datapoints[SENSORS]["Supply_Flow"] = Modbus_Datapoint(6219, 3.6) -Datapoints[SENSORS]["Exhaust_Flow"] = Modbus_Datapoint(6220, 3.6) - -# Read only - Input registers -Datapoints[SENSORS2] = {} -Datapoints[SENSORS2]["Heat_Exchanger"] = Modbus_Datapoint(6233, 1.0) - -# Virtual sensors (calculated) -Datapoints[VIRTUALSENSORS] = {} -Datapoints[VIRTUALSENSORS]["Efficiency"] = Modbus_Datapoint(0, 1) +_LOGGER = logging.getLogger(__name__) -# Read only - Input registers -Datapoints[UNIT_STATUSES] = {} -Datapoints[UNIT_STATUSES]["Unit_state"] = Modbus_Datapoint(6300) -Datapoints[UNIT_STATUSES]["Speed_state"] = Modbus_Datapoint(6301) -Datapoints[UNIT_STATUSES]["Supply_Fan"] = Modbus_Datapoint(6302) -Datapoints[UNIT_STATUSES]["Exhaust_Fan"] = Modbus_Datapoint(6303) -Datapoints[UNIT_STATUSES]["Supply_Fan_RPM"] = Modbus_Datapoint(6304) -Datapoints[UNIT_STATUSES]["Exhaust_Fan_RPM"] = Modbus_Datapoint(6305) -Datapoints[UNIT_STATUSES]["NotUsed1"] = Modbus_Datapoint(6306) -Datapoints[UNIT_STATUSES]["NotUsed2"] = Modbus_Datapoint(6307) -Datapoints[UNIT_STATUSES]["NotUsed3"] = Modbus_Datapoint(6308) -Datapoints[UNIT_STATUSES]["NotUsed4"] = Modbus_Datapoint(6309) -Datapoints[UNIT_STATUSES]["NotUsed5"] = Modbus_Datapoint(6310) -Datapoints[UNIT_STATUSES]["NotUsed6"] = Modbus_Datapoint(6311) -Datapoints[UNIT_STATUSES]["NotUsed7"] = Modbus_Datapoint(6312) -Datapoints[UNIT_STATUSES]["NotUsed8"] = Modbus_Datapoint(6313) -Datapoints[UNIT_STATUSES]["NotUsed9"] = Modbus_Datapoint(6314) -Datapoints[UNIT_STATUSES]["Temp_SP2"] = Modbus_Datapoint(6315) -Datapoints[UNIT_STATUSES]["Heating_Output"] = Modbus_Datapoint(6316) +class CasaR4(CasaBase): + def __init__(self): + super().__init__() -# Read / Write - Holding registers -Datapoints[CONFIG] = {} -Datapoints[CONFIG]["Reset_Alarms"] = Modbus_Datapoint(5406) #5406 -Datapoints[CONFIG]["Travelling_Mode_Speed_Drop"] = Modbus_Datapoint(5105) #5105 -Datapoints[CONFIG]["Fireplace_Run_Time"] = Modbus_Datapoint(5103) #5103 -Datapoints[CONFIG]["Fireplace_Max_Speed_Difference"] = Modbus_Datapoint(5104) #5104 -Datapoints[CONFIG]["Night_Cooling"] = Modbus_Datapoint(5163) #5163 -Datapoints[CONFIG]["Night_Cooling_FreshAir_Max"] = Modbus_Datapoint(5164) #5164 -Datapoints[CONFIG]["Night_Cooling_FreshAir_Start"] = Modbus_Datapoint(5165) #5165 -Datapoints[CONFIG]["Night_Cooling_RoomTemp_Start"] = Modbus_Datapoint(5166) #5166 -Datapoints[CONFIG]["Night_Cooling_SupplyTemp_Min"] = Modbus_Datapoint(5167) #5167 \ No newline at end of file + _LOGGER.debug("Loaded datapoints for Swegon Casa R4") \ No newline at end of file diff --git a/custom_components/swegon/pyswegon/swegon.py b/custom_components/swegon/pyswegon/swegon.py index 4b851db..de507f0 100644 --- a/custom_components/swegon/pyswegon/swegon.py +++ b/custom_components/swegon/pyswegon/swegon.py @@ -3,6 +3,7 @@ import asyncio import importlib import logging +import sys from pymodbus.client import ModbusTcpClient from pymodbus.exceptions import ModbusException @@ -32,20 +33,25 @@ class Modbus_Datapoint: MODE_HOLDING = 4 class Swegon(): - def __init__(self, host:str, port:int, slave_id:int): + def __init__(self, device_module:str, host:str, port:int, slave_id:int): self._client = ModbusTcpClient(host, port) self._slave_id = slave_id - async def async_load_device_data(self, device_module): - module_name = f"custom_components.swegon.pyswegon.devices.{device_module.lower().replace(' ', '_')}" + # Load correct datapoints + self.load_datapoints(device_module) - try: - # Import the module using importlib - module = await asyncio.to_thread(importlib.import_module, module_name) - self.Datapoints = module.Datapoints - except ImportError as e: - _LOGGER.error(f"Failed to import module {module_name}: {e}") - self.Datapoints = {} + + def load_datapoints(self, device_module:str): + module_name = f"{device_module.lower().replace(' ', '_')}" + + if module_name == 'casa_r4': + from .devices.casa_r4 import CasaR4 + self.Datapoints = CasaR4().Datapoints + elif module_name == 'casa_r15': + from .devices.casa_r15 import CasaR15 + self.Datapoints = CasaR15().Datapoints + else: + self.Datapoints = {} def twos_complement(self, number) -> int: if number >> 15: