def __tva_roof_floor_enable_cb(self, register: Register): if not register.data_type == "bool": GlobalErrorHandler.log_bad_register_data_type( self.__logger, register) return if register.value and self.__vcg_tva_roof_floor is None: # Floor East (RED and BLUE) self.__vcg_tva_roof_floor = ValveControlGroup(\ name="VCG tva roof floor", key="{}.tva_roof_floor".format(self.key), controller=self._controller, registers=self._registers, fw_valves=["cold_in", "cold_out"], rev_valves=["hot_in", "hot_out"], fw_pumps=["pump"]) self.__vcg_tva_roof_floor.mode = ValveControlGroupMode.DualSide if self.__vcg_tva_roof_floor is not None: self.__vcg_tva_roof_floor.init() elif not register.value and self.__vcg_tva_roof_floor is not None: self.__vcg_tva_roof_floor.shutdown() del self.__vcg_tva_roof_floor
def __loop2_flowmeter_settings_cb(self, register): # Check data type. if not register.data_type == "json": GlobalErrorHandler.log_bad_register_data_type(self.__logger, register) return if register.value != {} and self.__loop2_flowmeter is None: self.__loop2_flowmeter = FlowmetersFactory.create( name="Loop 2 flowmeter", controller=self._controller, vendor=register.value['vendor'], model=register.value['model'], options=register.value['options']) if self.__loop2_flowmeter is not None: self.__loop2_flowmeter.init() self.__loop2_leak_teat = LeakTest(self.__loop2_flowmeter, 20) self.__loop2_leak_teat.on_result(self.__loop2_leaktest_result) elif register.value == {} and self.__loop2_flowmeter is not None: self.__loop2_flowmeter.shutdown() del self.__loop2_flowmeter del self.__loop2_leak_teat
def __adjust_temp_cb(self, register): # Check data type. if not (register.data_type == "float" or register.data_type == "int"): GlobalErrorHandler.log_bad_register_data_type(self.__logger, register) return if self.__adjust_temp == register.value: return # @see https://experta.bg/L/S/122745/m/Fwntindd min_temp = 2.5 max_temp = -2.5 min_temp_reg = self._registers.by_name("{}.temp_{}.min".format(self.key, self.__identifier)) if min_temp_reg is not None: min_temp = min_temp_reg.value max_temp_reg = self._registers.by_name("{}.temp_{}.max".format(self.key, self.__identifier)) if max_temp_reg is not None: max_temp = max_temp_reg.value actual_temp = register.value if actual_temp < min_temp: actual_temp = min_temp if actual_temp > max_temp: actual_temp = max_temp self.__adjust_temp = actual_temp
def __vcg_pool_heating_enable_cb(self, register: Register): # Check data type. if not register.data_type == "bool": GlobalErrorHandler.log_bad_register_data_type( self.__logger, register) return if register.value and self.__vcg_pool_heating is None: # Consumers (RED) self.__vcg_pool_heating = ValveControlGroup( name="VCG Pool Heating", key="{}.vcg_pool_heating".format(self.key), controller=self._controller, registers=self._registers, fw_valves=["valve"], fw_pumps=["pump"]) self.__vcg_pool_heating.mode = ValveControlGroupMode.Proportional if self.__vcg_pool_heating is not None: self.__vcg_pool_heating.init() elif register.value == False and self.__vcg_pool_heating is not None: self.__vcg_pool_heating.shutdown() del self.__vcg_pool_heating
def __convectors_east_enable_cb(self, register: Register): if not register.data_type == "bool": GlobalErrorHandler.log_bad_register_data_type( self.__logger, register) return if register.value and self.__vcg_convectors_east is None: # Consumers (RED) self.__vcg_convectors_east = ValveControlGroup( name="VCG Convectors east", key="{}.convectors_east".format(self.key), controller=self._controller, registers=self._registers, fw_valves=["cold_in", "cold_out"], rev_valves=["hot_in", "hot_out"], fw_pumps=["pump"]) self.__vcg_convectors_east.mode = ValveControlGroupMode.Proportional if self.__vcg_convectors_east is not None: self.__vcg_convectors_east.init() elif register.value == False and self.__vcg_convectors_east is not None: self.__vcg_convectors_east.shutdown() del self.__vcg_convectors_east
def __blink_time_cb(self, register): # Check data type. if not (register.data_type == "int" or register.data_type == "float"): GlobalErrorHandler.log_bad_register_data_type(self.__logger, register) return self.__blink_timer.expiration_time = register.value
def __enable_err_msg_cb(self, register): # Check data type. if not register.data_type == "bool": GlobalErrorHandler.log_bad_register_data_type(self.__logger, register) return self.__enable_err_msg = register.value
def __window_closed_input_cb(self, register): # Check data type. if not register.data_type == "str": GlobalErrorHandler.log_bad_register_data_type(self.__logger, register) return self.__window_closed_input = register.value
def __is_empty_timeout_cb(self, register): # Check data type. if not register.data_type == "int": GlobalErrorHandler.log_bad_register_data_type( self.__logger, register) return self.__presence_timer.expiration_time = register.value
def __lower_fan_power_gpio_cb(self, register: Register): # Check data type. if not (register.data_type == "str"): GlobalErrorHandler.log_bad_register_data_type( self.__logger, register) return self.__lower_fan_power_gpio = register.value
def __envm_energy_cb(self, register): # Check data type. if not ((register.data_type == "int") or (register.data_type == "float")): GlobalErrorHandler.log_bad_register_data_type(self.__logger, register) return # TODO: Get energy mode for the building. pass
def __thermal_mode_cb(self, register): # Check data type. if not register.data_type == "int": GlobalErrorHandler.log_bad_register_data_type(self.__logger, register) return mode = ThermalMode(register.value) self.__thermal_mode.set_state(mode)
def __generators_cooling_calib_cb(self, register: Register): # Check data type. if not register.data_type == "bool": GlobalErrorHandler.log_bad_register_data_type( self.__logger, register) return if register.value: if self.__v_generators_cooling is not None: self.__v_generators_cooling.calibrate()
def __underfloor_east_bypass_calib_cb(self, register: Register): # Check data type. if not register.data_type == "bool": GlobalErrorHandler.log_bad_register_data_type( self.__logger, register) return if register.value: if self.__v_underfloor_east_bypass is not None: self.__v_underfloor_east_bypass.calibrate()
def __short_green_purple_calib_cb(self, register: Register): # Check data type. if not register.data_type == "bool": GlobalErrorHandler.log_bad_register_data_type( self.__logger, register) return if register.value: if self.__v_short_green_purple is not None: self.__v_short_green_purple.calibrate()
def __generators_cooling_pos_cb(self, register: Register): # Check data type. if not (register.data_type == "float" or register.data_type == "int"): GlobalErrorHandler.log_bad_register_data_type( self.__logger, register) return if register.value < 0 or register.value > 100: GlobalErrorHandler.log_bad_register_value(self.__logger, register) return if self.__v_generators_cooling is not None: self.__v_generators_cooling.target_position = register.value
def __lower_fan_max_cb(self, register: Register): # Check data type. if not (register.data_type == "float" or register.data_type == "int"): GlobalErrorHandler.log_bad_register_data_type( self.__logger, register) return if register.value > 100: GlobalErrorHandler.log_bad_register_value(self.__logger, register) return if self.__lower_fan_dev is not None: self.__lower_fan_dev.max_speed = register.value
def __short_green_purple_pos_cb(self, register: Register): # Check data type. if not (register.data_type == "float" or register.data_type == "int"): GlobalErrorHandler.log_bad_register_data_type( self.__logger, register) return if register.value < 0 or register.value > 100: GlobalErrorHandler.log_bad_register_value(self.__logger, register) return if self.__v_short_green_purple is not None: self.__v_short_green_purple.target_position = register.value
def __hp_hot_max_cb(self, register): """Heat pump control group hot maximum callback. Args: register (Register): Register container. """ # Check data type. if not register.data_type == "float": GlobalErrorHandler.log_bad_register_data_type( self.__logger, register) return self.__hot_max = register.value
def __pa_demand_time_cb(self, register): # Check data type. if not (register.data_type == "float" or register.data_type == "int"): GlobalErrorHandler.log_bad_register_data_type( self.__logger, register) return if register.value < 0.0: GlobalErrorHandler.log_bad_register_value(self.__logger, register) return if self.__demand_timer is not None: self.__demand_timer.expiration_time = register.value
def __delta_time_cb(self, register): # Check data type. if not (register.data_type == "float" or register.data_type == "int"): GlobalErrorHandler.log_bad_register_data_type(self.__logger, register) return # Check value. if register.value < 0: GlobalErrorHandler.log_bad_register_value(self.__logger, register) return if self.__delta_time != register.value: self.__delta_time = register.value
def __underfloor_east_bypass_pos_cb(self, register: Register): # Check data type. if not (register.data_type == "float" or register.data_type == "int"): GlobalErrorHandler.log_bad_register_data_type( self.__logger, register) return if register.value < 0 or register.value > 100: GlobalErrorHandler.log_bad_register_value(self.__logger, register) return if self.__v_underfloor_east_bypass is not None: self.__v_underfloor_east_bypass.target_position = register.value
def __enable_plugin_cb(self, register): # Check data type. if not register.data_type == "bool": GlobalErrorHandler.log_bad_register_data_type( self.__logger, register) return name = register.base_name if register.value and name not in self.__plugins: self.__plugins[name] = self.__load_plugin(name) self.__plugins[name].init() elif not register.value and name in self.__plugins: self.__plugins[name].shutdown() del self.__plugins[name]
def __thermal_force_limit_cb(self, register): # Check data type. if not (register.data_type == "float" or register.data_type == "int"): GlobalErrorHandler.log_bad_register_data_type(self.__logger, register) return # Check value. if register.value < 0: GlobalErrorHandler.log_bad_register_value(self.__logger, register) return if register.value > 100: GlobalErrorHandler.log_bad_register_value(self.__logger, register) return self.__thermal_force_limit = register.value
def __hp_index_cb(self, register): """Heat pump control group index callback. Args: register (Register): Register container. """ # Check data type. if not register.data_type == "int": GlobalErrorHandler.log_bad_register_data_type( self.__logger, register) return if register.value < 0: GlobalErrorHandler.log_bad_register_value(self.__logger, register) return self.__heat_pump_index = register.value
def __target_version_cb(self, register: Register): current_version = None target_version = None target_version_reg = register # Check data type of the current version. if not target_version_reg.data_type == "json": GlobalErrorHandler.log_bad_register_data_type(self.__logger, target_version_reg) return # Get target version value. if target_version_reg.value is not None: target_version = target_version_reg.value # Check the target version value. if target_version == None: GlobalErrorHandler.log_bad_register_value(self.__logger, target_version) return # Get current version register. current_version_reg = self.__registers.by_name("sys.software.current_version") # Check data type. if not ((current_version_reg.data_type == "json")): GlobalErrorHandler.log_bad_register_data_type(self.__logger, current_version_reg) return if current_version_reg is not None: current_version = current_version_reg.value # Check the current version value. if current_version == None: GlobalErrorHandler.log_bad_register_value(self.__logger, current_version) return # Update the software. software_update(current_version_reg.value, target_version_reg.value) # Save the current version. self.__app_settings.current_version = target_version_reg.value self.__app_settings.save()
def __allowed_attendees_cb(self, register): # Check data type. if not ((register.data_type == "json") or (register.data_type == "str")): GlobalErrorHandler.log_bad_register_data_type( self.__logger, register) return # If the register is str convert it to JSON. (This is fix.) content = [] if register.data_type == "str": content = json.loads(register.value) else: content = register.value # Add allowed attendees. for key in self.__zones: self.__zones[key].add_allowed_attendees(content)
def __ac_setpoint_cb(self, register: Register): # Check data type. if not (register.data_type == "float" or register.data_type == "int"): GlobalErrorHandler.log_bad_register_data_type( self.__logger, register) return temp_value = register.value if temp_value > 100: temp_value = 100 if temp_value < 0: temp_value = 0 self.__set_point_ac = temp_value self.__logger.info("Ventilation AC set point: {}".format( register.value))
def __goal_building_temp_cb(self, register): # Check data type. if not (register.data_type == "float" or register.data_type == "int"): GlobalErrorHandler.log_bad_register_data_type(self.__logger, register) return # @see https://experta.bg/L/S/122745/m/Fwntindd min_temp = 18 max_temp = 26 actual_temp = register.value if actual_temp < min_temp: actual_temp = min_temp if actual_temp > max_temp: actual_temp = max_temp if self.__goal_building_temp != actual_temp: self.__goal_building_temp = actual_temp
def __loop2_valve_settings_cb(self, register): # Check data type. if not register.data_type == "json": GlobalErrorHandler.log_bad_register_data_type(self.__logger, register) return if register.value != {} and self.__loop2_valve_dev is None: self.__loop2_valve_dev = ValveFactory.create( name="Loop 2 valve", controller=self._controller, vendor=register.value['vendor'], model=register.value['model'], options=register.value['options']) if self.__loop2_valve_dev is not None: self.__loop2_valve_dev.init() elif register.value == {} and self.__loop2_valve_dev is not None: self.__loop2_valve_dev.shutdown() del self.__loop2_valve_dev