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)
class ClimateAssistant(Assistants.assistant.Assistant):
 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: Бот для отправки уведомлений.

ClimateAssistant( name, temperature_controller: Controllers.climate.ClimateController, temperature_threshold_low=23, temperature_threshold_high=25, humidity_threshold_low=25, humidity_threshold_high=50, rounding=0, bot: Messengers.bot.Bot = None)
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: Бот для отправки уведомлений.

temp_threshold_low
temp_threshold_high
humidity_threshold_low
humidity_threshold_high
rounding
temperature_controller
bot
def handle_high_temp(self, temp):
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: Текущее значение температуры.

def handle_low_temp(self, 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: Текущее значение температуры.

def handle_high_humidity(self, humidity):
 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: Текущее значение влажности.

def handle_low_humidity(self, temp):
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: Текущее значение влажности.

@observe(name=f'Цикл контроля температуры и влажности {__qualname__}')
def run(self):
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)

Выполняет один цикл контроля температуры и влажности.

Получает показания с датчика, округляет их и сравнивает с заданными порогами. При выходе за пределы вызывает соответствующие обработчики.