Assistants.climate
Ассистент контроля температуры и влажности.
Периодически опрашивает датчик температуры/влажности и отправляет уведомления через бота при выходе показателей за установленные пороги.
1""" 2Ассистент контроля температуры и влажности. 3 4Периодически опрашивает датчик температуры/влажности и отправляет 5уведомления через бота при выходе показателей за установленные пороги. 6""" 7 8from langfuse.decorators import observe 9from loguru import logger 10 11from Assistants.assistant import Assistant 12from Controllers.climate import ClimateController 13from Messengers.bot import Bot 14 15 16class ClimateAssistant(Assistant): 17 """Контролирует температуру и влажность в помещении. 18 19 При выходе температуры или влажности за заданные пороги 20 отправляет предупреждение через Telegram-бота. 21 22 Attributes: 23 temp_threshold_low: Нижний порог температуры. 24 temp_threshold_high: Верхний порог температуры. 25 humidity_threshold_low: Нижний порог влажности. 26 humidity_threshold_high: Верхний порог влажности. 27 rounding: Количество знаков после запятой для округления. 28 temperature_controller: Контроллер датчика температуры/влажности. 29 bot: Бот для отправки уведомлений. 30 """ 31 32 def __init__( 33 self, 34 name, 35 temperature_controller: ClimateController, 36 temperature_threshold_low=23, 37 temperature_threshold_high=25, 38 humidity_threshold_low=25, 39 humidity_threshold_high=50, 40 rounding=0, 41 bot: Bot = None, 42 ): 43 """Инициализирует ассистента контроля климата. 44 45 Args: 46 name: Имя ассистента. 47 temperature_controller: Контроллер датчика температуры/влажности. 48 temperature_threshold_low: Нижний порог температуры. 49 temperature_threshold_high: Верхний порог температуры. 50 humidity_threshold_low: Нижний порог влажности. 51 humidity_threshold_high: Верхний порог влажности. 52 rounding: Количество знаков после запятой для округления. 53 bot: Бот для отправки уведомлений. 54 """ 55 super().__init__(name) 56 self.temp_threshold_low = temperature_threshold_low 57 self.temp_threshold_high = temperature_threshold_high 58 self.humidity_threshold_low = humidity_threshold_low 59 self.humidity_threshold_high = humidity_threshold_high 60 self.rounding = rounding 61 self.temperature_controller = temperature_controller 62 self.bot = bot 63 64 def handle_high_temp(self, temp): 65 """Обрабатывает превышение верхнего порога температуры. 66 67 Args: 68 temp: Текущее значение температуры. 69 """ 70 logger.warning(f"Температура превысила порог: {temp}°C > {self.temp_threshold_high}°C") 71 if self.bot: 72 self.bot.send_message( 73 f"Температура превысила порог: {temp}°C больше {self.temp_threshold_high}°C" 74 ) 75 # Дополнительные действия, например, отправка уведомления 76 77 def handle_low_temp(self, temp): 78 """Обрабатывает понижение температуры ниже порога. 79 80 Args: 81 temp: Текущее значение температуры. 82 """ 83 logger.warning(f"Температура ниже, чем порог: {temp}°C < {self.temp_threshold_low}°C") 84 if self.bot: 85 self.bot.send_message( 86 f"Температура ниже, чем порог: {temp}°C меньше {self.temp_threshold_low}°C" 87 ) 88 # Дополнительные действия, например, отправка уведомления 89 90 def handle_high_humidity(self, humidity): 91 """Обрабатывает превышение верхнего порога влажности. 92 93 Args: 94 humidity: Текущее значение влажности. 95 """ 96 logger.warning(f"Влажность превысила порог: {humidity}% > {self.humidity_threshold_high}%") 97 if self.bot: 98 self.bot.send_message( 99 f"Влажность превысила порог: {humidity}% больше {self.humidity_threshold_high}%" 100 ) 101 # Дополнительные действия, например, отправка уведомления 102 103 def handle_low_humidity(self, temp): 104 """Обрабатывает понижение влажности ниже порога. 105 106 Args: 107 temp: Текущее значение влажности. 108 """ 109 logger.warning(f"Влажность ниже, чем порог: {temp}% < {self.humidity_threshold_low}%") 110 if self.bot: 111 self.bot.send_message( 112 f"Влажность ниже, чем порог: {temp}% меньше {self.humidity_threshold_low}%" 113 ) 114 # Дополнительные действия, например, отправка уведомления 115 116 @observe(name=f"Цикл контроля температуры и влажности {__qualname__}") 117 def run(self): 118 """Выполняет один цикл контроля температуры и влажности. 119 120 Получает показания с датчика, округляет их и сравнивает 121 с заданными порогами. При выходе за пределы вызывает 122 соответствующие обработчики. 123 """ 124 logger.debug(f'Запуск цикла контроля температуры и влажности для "{self.name}"...') 125 state = self.temperature_controller.get_state() 126 temp = state["temperature"] 127 humidity = state["humidity"] 128 rounded_temp = round(temp, self.rounding) 129 rounded_humidity = round(humidity, self.rounding) 130 rounded_temp = int(temp) if self.rounding == 0 else rounded_temp 131 rounded_humidity = int(humidity) if self.rounding == 0 else rounded_humidity 132 if rounded_temp > self.temp_threshold_high: 133 self.handle_high_temp(rounded_temp) 134 elif rounded_temp < self.temp_threshold_low: 135 self.handle_low_temp(rounded_temp) 136 if rounded_humidity > self.humidity_threshold_high: 137 self.handle_high_humidity(rounded_humidity) 138 elif rounded_humidity < self.humidity_threshold_low: 139 self.handle_low_humidity(rounded_humidity)
17class ClimateAssistant(Assistant): 18 """Контролирует температуру и влажность в помещении. 19 20 При выходе температуры или влажности за заданные пороги 21 отправляет предупреждение через Telegram-бота. 22 23 Attributes: 24 temp_threshold_low: Нижний порог температуры. 25 temp_threshold_high: Верхний порог температуры. 26 humidity_threshold_low: Нижний порог влажности. 27 humidity_threshold_high: Верхний порог влажности. 28 rounding: Количество знаков после запятой для округления. 29 temperature_controller: Контроллер датчика температуры/влажности. 30 bot: Бот для отправки уведомлений. 31 """ 32 33 def __init__( 34 self, 35 name, 36 temperature_controller: ClimateController, 37 temperature_threshold_low=23, 38 temperature_threshold_high=25, 39 humidity_threshold_low=25, 40 humidity_threshold_high=50, 41 rounding=0, 42 bot: Bot = None, 43 ): 44 """Инициализирует ассистента контроля климата. 45 46 Args: 47 name: Имя ассистента. 48 temperature_controller: Контроллер датчика температуры/влажности. 49 temperature_threshold_low: Нижний порог температуры. 50 temperature_threshold_high: Верхний порог температуры. 51 humidity_threshold_low: Нижний порог влажности. 52 humidity_threshold_high: Верхний порог влажности. 53 rounding: Количество знаков после запятой для округления. 54 bot: Бот для отправки уведомлений. 55 """ 56 super().__init__(name) 57 self.temp_threshold_low = temperature_threshold_low 58 self.temp_threshold_high = temperature_threshold_high 59 self.humidity_threshold_low = humidity_threshold_low 60 self.humidity_threshold_high = humidity_threshold_high 61 self.rounding = rounding 62 self.temperature_controller = temperature_controller 63 self.bot = bot 64 65 def handle_high_temp(self, temp): 66 """Обрабатывает превышение верхнего порога температуры. 67 68 Args: 69 temp: Текущее значение температуры. 70 """ 71 logger.warning(f"Температура превысила порог: {temp}°C > {self.temp_threshold_high}°C") 72 if self.bot: 73 self.bot.send_message( 74 f"Температура превысила порог: {temp}°C больше {self.temp_threshold_high}°C" 75 ) 76 # Дополнительные действия, например, отправка уведомления 77 78 def handle_low_temp(self, temp): 79 """Обрабатывает понижение температуры ниже порога. 80 81 Args: 82 temp: Текущее значение температуры. 83 """ 84 logger.warning(f"Температура ниже, чем порог: {temp}°C < {self.temp_threshold_low}°C") 85 if self.bot: 86 self.bot.send_message( 87 f"Температура ниже, чем порог: {temp}°C меньше {self.temp_threshold_low}°C" 88 ) 89 # Дополнительные действия, например, отправка уведомления 90 91 def handle_high_humidity(self, humidity): 92 """Обрабатывает превышение верхнего порога влажности. 93 94 Args: 95 humidity: Текущее значение влажности. 96 """ 97 logger.warning(f"Влажность превысила порог: {humidity}% > {self.humidity_threshold_high}%") 98 if self.bot: 99 self.bot.send_message( 100 f"Влажность превысила порог: {humidity}% больше {self.humidity_threshold_high}%" 101 ) 102 # Дополнительные действия, например, отправка уведомления 103 104 def handle_low_humidity(self, temp): 105 """Обрабатывает понижение влажности ниже порога. 106 107 Args: 108 temp: Текущее значение влажности. 109 """ 110 logger.warning(f"Влажность ниже, чем порог: {temp}% < {self.humidity_threshold_low}%") 111 if self.bot: 112 self.bot.send_message( 113 f"Влажность ниже, чем порог: {temp}% меньше {self.humidity_threshold_low}%" 114 ) 115 # Дополнительные действия, например, отправка уведомления 116 117 @observe(name=f"Цикл контроля температуры и влажности {__qualname__}") 118 def run(self): 119 """Выполняет один цикл контроля температуры и влажности. 120 121 Получает показания с датчика, округляет их и сравнивает 122 с заданными порогами. При выходе за пределы вызывает 123 соответствующие обработчики. 124 """ 125 logger.debug(f'Запуск цикла контроля температуры и влажности для "{self.name}"...') 126 state = self.temperature_controller.get_state() 127 temp = state["temperature"] 128 humidity = state["humidity"] 129 rounded_temp = round(temp, self.rounding) 130 rounded_humidity = round(humidity, self.rounding) 131 rounded_temp = int(temp) if self.rounding == 0 else rounded_temp 132 rounded_humidity = int(humidity) if self.rounding == 0 else rounded_humidity 133 if rounded_temp > self.temp_threshold_high: 134 self.handle_high_temp(rounded_temp) 135 elif rounded_temp < self.temp_threshold_low: 136 self.handle_low_temp(rounded_temp) 137 if rounded_humidity > self.humidity_threshold_high: 138 self.handle_high_humidity(rounded_humidity) 139 elif rounded_humidity < self.humidity_threshold_low: 140 self.handle_low_humidity(rounded_humidity)
Контролирует температуру и влажность в помещении.
При выходе температуры или влажности за заданные пороги отправляет предупреждение через Telegram-бота.
Attributes: temp_threshold_low: Нижний порог температуры. temp_threshold_high: Верхний порог температуры. humidity_threshold_low: Нижний порог влажности. humidity_threshold_high: Верхний порог влажности. rounding: Количество знаков после запятой для округления. temperature_controller: Контроллер датчика температуры/влажности. bot: Бот для отправки уведомлений.
33 def __init__( 34 self, 35 name, 36 temperature_controller: ClimateController, 37 temperature_threshold_low=23, 38 temperature_threshold_high=25, 39 humidity_threshold_low=25, 40 humidity_threshold_high=50, 41 rounding=0, 42 bot: Bot = None, 43 ): 44 """Инициализирует ассистента контроля климата. 45 46 Args: 47 name: Имя ассистента. 48 temperature_controller: Контроллер датчика температуры/влажности. 49 temperature_threshold_low: Нижний порог температуры. 50 temperature_threshold_high: Верхний порог температуры. 51 humidity_threshold_low: Нижний порог влажности. 52 humidity_threshold_high: Верхний порог влажности. 53 rounding: Количество знаков после запятой для округления. 54 bot: Бот для отправки уведомлений. 55 """ 56 super().__init__(name) 57 self.temp_threshold_low = temperature_threshold_low 58 self.temp_threshold_high = temperature_threshold_high 59 self.humidity_threshold_low = humidity_threshold_low 60 self.humidity_threshold_high = humidity_threshold_high 61 self.rounding = rounding 62 self.temperature_controller = temperature_controller 63 self.bot = bot
Инициализирует ассистента контроля климата.
Args: name: Имя ассистента. temperature_controller: Контроллер датчика температуры/влажности. temperature_threshold_low: Нижний порог температуры. temperature_threshold_high: Верхний порог температуры. humidity_threshold_low: Нижний порог влажности. humidity_threshold_high: Верхний порог влажности. rounding: Количество знаков после запятой для округления. bot: Бот для отправки уведомлений.
65 def handle_high_temp(self, temp): 66 """Обрабатывает превышение верхнего порога температуры. 67 68 Args: 69 temp: Текущее значение температуры. 70 """ 71 logger.warning(f"Температура превысила порог: {temp}°C > {self.temp_threshold_high}°C") 72 if self.bot: 73 self.bot.send_message( 74 f"Температура превысила порог: {temp}°C больше {self.temp_threshold_high}°C" 75 ) 76 # Дополнительные действия, например, отправка уведомления
Обрабатывает превышение верхнего порога температуры.
Args: temp: Текущее значение температуры.
78 def handle_low_temp(self, temp): 79 """Обрабатывает понижение температуры ниже порога. 80 81 Args: 82 temp: Текущее значение температуры. 83 """ 84 logger.warning(f"Температура ниже, чем порог: {temp}°C < {self.temp_threshold_low}°C") 85 if self.bot: 86 self.bot.send_message( 87 f"Температура ниже, чем порог: {temp}°C меньше {self.temp_threshold_low}°C" 88 ) 89 # Дополнительные действия, например, отправка уведомления
Обрабатывает понижение температуры ниже порога.
Args: temp: Текущее значение температуры.
91 def handle_high_humidity(self, humidity): 92 """Обрабатывает превышение верхнего порога влажности. 93 94 Args: 95 humidity: Текущее значение влажности. 96 """ 97 logger.warning(f"Влажность превысила порог: {humidity}% > {self.humidity_threshold_high}%") 98 if self.bot: 99 self.bot.send_message( 100 f"Влажность превысила порог: {humidity}% больше {self.humidity_threshold_high}%" 101 ) 102 # Дополнительные действия, например, отправка уведомления
Обрабатывает превышение верхнего порога влажности.
Args: humidity: Текущее значение влажности.
104 def handle_low_humidity(self, temp): 105 """Обрабатывает понижение влажности ниже порога. 106 107 Args: 108 temp: Текущее значение влажности. 109 """ 110 logger.warning(f"Влажность ниже, чем порог: {temp}% < {self.humidity_threshold_low}%") 111 if self.bot: 112 self.bot.send_message( 113 f"Влажность ниже, чем порог: {temp}% меньше {self.humidity_threshold_low}%" 114 ) 115 # Дополнительные действия, например, отправка уведомления
Обрабатывает понижение влажности ниже порога.
Args: temp: Текущее значение влажности.
117 @observe(name=f"Цикл контроля температуры и влажности {__qualname__}") 118 def run(self): 119 """Выполняет один цикл контроля температуры и влажности. 120 121 Получает показания с датчика, округляет их и сравнивает 122 с заданными порогами. При выходе за пределы вызывает 123 соответствующие обработчики. 124 """ 125 logger.debug(f'Запуск цикла контроля температуры и влажности для "{self.name}"...') 126 state = self.temperature_controller.get_state() 127 temp = state["temperature"] 128 humidity = state["humidity"] 129 rounded_temp = round(temp, self.rounding) 130 rounded_humidity = round(humidity, self.rounding) 131 rounded_temp = int(temp) if self.rounding == 0 else rounded_temp 132 rounded_humidity = int(humidity) if self.rounding == 0 else rounded_humidity 133 if rounded_temp > self.temp_threshold_high: 134 self.handle_high_temp(rounded_temp) 135 elif rounded_temp < self.temp_threshold_low: 136 self.handle_low_temp(rounded_temp) 137 if rounded_humidity > self.humidity_threshold_high: 138 self.handle_high_humidity(rounded_humidity) 139 elif rounded_humidity < self.humidity_threshold_low: 140 self.handle_low_humidity(rounded_humidity)
Выполняет один цикл контроля температуры и влажности.
Получает показания с датчика, округляет их и сравнивает с заданными порогами. При выходе за пределы вызывает соответствующие обработчики.