Index: dialin/common/alarm_defs.py =================================================================== diff -u -r50c8c54ce46c7236d650fb7a2576b0b2b5a8dd5a -r8e919412fc64235b5ae4d57dd523b8cfb1e4e4cb --- dialin/common/alarm_defs.py (.../alarm_defs.py) (revision 50c8c54ce46c7236d650fb7a2576b0b2b5a8dd5a) +++ dialin/common/alarm_defs.py (.../alarm_defs.py) (revision 8e919412fc64235b5ae4d57dd523b8cfb1e4e4cb) @@ -326,7 +326,7 @@ ALARM_ID_DG_DRAIN_PUMP_DIRECTION_FPGA_FAULT = 303 ALARM_ID_HD_INVALID_USAGE_RECORD_CRC = 304 ALARM_ID_HD_CPU_RAM_ERROR = 305 - ALARM_ID_AVAILABLE_50 = 306 + ALARM_ID_DG_TURN_OFF_INLET_WATER_VALVES = 306 ALARM_ID_HD_AC_POWER_LOST_IN_TREATMENT = 307 ALARM_ID_DG_CPI_COND_SENSOR_INVALID_CHAR = 308 ALARM_ID_DG_CPO_COND_SENSOR_INVALID_CHAR = 309 Index: dialin/dg/hd_proxy.py =================================================================== diff -u -r32e628abcbbd3fd70866505d9f2836a6f732ef06 -r8e919412fc64235b5ae4d57dd523b8cfb1e4e4cb --- dialin/dg/hd_proxy.py (.../hd_proxy.py) (revision 32e628abcbbd3fd70866505d9f2836a6f732ef06) +++ dialin/dg/hd_proxy.py (.../hd_proxy.py) (revision 8e919412fc64235b5ae4d57dd523b8cfb1e4e4cb) @@ -279,6 +279,37 @@ self.logger.debug("Timeout!!!!") return False + def cmd_start_stop_nocturnal_dg_heat_disinfect(self, start: bool = True) -> int: + """ + Constructs and sends the start/stop nocturnal DG heat disinfect command + + @param start: (bool) True = start nocturnal heat disinfect, False = stop nocturnal heat disinfect. + @return: non-zero integer if successful, False otherwise + """ + # 1 is to start + if start: + cmd = 1 + cmd_str = "Starting" + else: + cmd = 0 + cmd_str = "Stopping" + payload = integer_to_bytearray(cmd) + message = DenaliMessage.build_message(channel_id=DenaliChannels.dialin_to_dg_ch_id, + message_id=MsgIds.MSG_ID_DG_START_STOP_NOCTURNAL_HEAT_DISINFECT.value, + payload=payload) + + self.logger.debug(cmd_str + " nocturnal DG heat disinfect") + + received_message = self.can_interface.send(message) + + # If there is content... + if received_message is not None: + # response payload is OK or not OK + return received_message['message'][DenaliMessage.PAYLOAD_START_INDEX] + else: + self.logger.debug("Timeout!!!!") + return False + def cmd_start_stop_dg_heat_disinfect_active_cool(self, start: bool = True) -> int: """ Constructs and sends the start/stop DG heat disinfect active cool command Index: dialin/dg/heat_disinfect.py =================================================================== diff -u -r32e628abcbbd3fd70866505d9f2836a6f732ef06 -r8e919412fc64235b5ae4d57dd523b8cfb1e4e4cb --- dialin/dg/heat_disinfect.py (.../heat_disinfect.py) (revision 32e628abcbbd3fd70866505d9f2836a6f732ef06) +++ dialin/dg/heat_disinfect.py (.../heat_disinfect.py) (revision 8e919412fc64235b5ae4d57dd523b8cfb1e4e4cb) @@ -37,17 +37,19 @@ DG_HEAT_DISINFECT_STATE_FLUSH_DRAIN_R1 = 8 DG_HEAT_DISINFECT_STATE_FILL_WITH_WATER = 9 DG_HEAT_DISINFECT_STATE_DISINFECT_R1_TO_R2 = 10 - DG_HEAT_DISINFECT_STATE_FILL_R2_WITH_HOT_WATER = 11 - DG_HEAT_DISINFECT_STATE_DISINFECT_R2_TO_R1 = 12 - DG_HEAT_DISINFECT_STATE_COOL_DOWN_HEATERS = 13 - DG_HEAT_DISINFECT_STATE_MIX_DRAIN_R1 = 14 - DG_HEAT_DISINFECT_STATE_MIX_DRAIN_R2 = 15 - DG_HEAT_DISINFECT_STATE_RINSE_R1_TO_R2 = 16 - DG_HEAT_DISINFECT_STATE_RINSE_R2_TO_R1_AND_DRAIN_R1 = 17 - DG_HEAT_DISINFECT_STATE_RINSE_CIRCULATION = 18 - DG_HEAT_DISINFECT_STATE_CANCEL_BASIC_PATH = 19 - DG_HEAT_DISINFECT_STATE_CANCEL_WATER_PATH = 20 - DG_HEAT_DISINFECT_STATE_COMPLETE = 21 + DG_HEAT_DISINFECT_STATE_PREPARE_FOR_HOT_WATER_TRANSITION = 11 + DG_HEAT_DISINFECT_STATE_FILL_R2_WITH_HOT_WATER = 12 + DG_HEAT_DISINFECT_STATE_DISINFECT_R2_TO_R1 = 13 + DG_HEAT_DISINFECT_STATE_COOL_DOWN_HEATERS = 14 + DG_HEAT_DISINFECT_STATE_NOCTURNAL_COOL_IDLE = 15 + DG_HEAT_DISINFECT_STATE_NOCTURNAL_COOL_CHECK_WATER_TEMP = 16 + DG_HEAT_DISINFECT_STATE_NOCTURNAL_COOL_DRAIN_R1 = 17 + DG_HEAT_DISINFECT_STATE_NOCTURNAL_COOL_DRAIN_R2 = 18 + DG_HEAT_DISINFECT_STATE_MIX_DRAIN_R1 = 19 + DG_HEAT_DISINFECT_STATE_MIX_DRAIN_R2 = 20 + DG_HEAT_DISINFECT_STATE_CANCEL_BASIC_PATH = 21 + DG_HEAT_DISINFECT_STATE_CANCEL_WATER_PATH = 22 + DG_HEAT_DISINFECT_STATE_COMPLETE = 23 @unique @@ -94,6 +96,7 @@ self.r2_level = 0 self.dg_heat_disinfection_time_timestamp = 0.0 self.dg_heat_disinfection_data_timestamp = 0.0 + self.is_nocturnal_heat_disinfect_requested = 0 if self.can_interface is not None: channel_id = DenaliChannels.dg_sync_broadcast_ch_id @@ -122,6 +125,7 @@ self.r1_level = 0 self.r2_level = 0 self.heat_disinfect_ui_state = 0 + self.is_nocturnal_heat_disinfect_requested = 0 @publish(["dg_heat_disinfection_time_timestamp", "heat_disinfect_target_time", "heat_disinfect_count_down_time"]) def _handler_heat_disinfect_to_ui_sync(self, message, timestamp=0.0): @@ -155,7 +159,8 @@ self.dg_heat_disinfection_time_timestamp = timestamp @publish(["dg_heat_disinfection_data_timestamp","heat_disinfect_state", "overall_elapsed_time", - "state_elapsed_time", "cancellation_mode", "r1_level", "r2_level", "heat_disinfect_ui_state"]) + "state_elapsed_time", "cancellation_mode", "r1_level", "r2_level", "heat_disinfect_ui_state", + "is_nocturnal_heat_disinfect_requested"]) def _handler_heat_disinfect_sync(self, message, timestamp): """ Handles published heat disinfect message @@ -173,6 +178,7 @@ r1, index = bytearray_to_float(payload, index, False) r2, index = bytearray_to_float(payload, index, False) ui_state, index = bytearray_to_integer(payload, index, False) + noct_status, index = bytearray_to_integer(payload, index, False) self.heat_disinfect_state = state self.overall_elapsed_time = int(elapsed_time / 1000) @@ -181,6 +187,7 @@ self.r1_level = r1 self.r2_level = r2 self.heat_disinfect_ui_state = ui_state + self.is_nocturnal_heat_disinfect_requested = noct_status self.dg_heat_disinfection_data_timestamp = timestamp def get_heat_disinfect_state(self) -> int: