Assistants.voltage
Ассистент контроля напряжения в электросети.
Периодически опрашивает розетку с измерением напряжения и отправляет уведомления при выходе за установленные пороги.
1""" 2Ассистент контроля напряжения в электросети. 3 4Периодически опрашивает розетку с измерением напряжения и 5отправляет уведомления при выходе за установленные пороги. 6""" 7 8from langfuse.decorators import observe 9from loguru import logger 10 11from Assistants.assistant import Assistant 12from Controllers.smart_plug import SmartPlugController 13from Messengers.bot import Bot 14 15 16class VoltageAssistant(Assistant): 17 """Контролирует напряжение в электросети. 18 19 Получает показания напряжения из розетки и сравнивает с 20 верхним и нижним порогами. При выходе за пределы отправляет 21 предупреждение через бота. 22 23 Attributes: 24 voltage_threshold_low: Нижний порог напряжения. 25 voltage_threshold_high: Верхний порог напряжения. 26 rounding: Количество знаков после запятой для округления. 27 smart_plug: Контроллер розетки. 28 bot: Бот для отправки уведомлений. 29 """ 30 31 def __init__( 32 self, 33 name, 34 smart_plug_controller: SmartPlugController, 35 voltage_threshold_low=200, 36 voltage_threshold_high=250, 37 rounding=0, 38 bot: Bot = None, 39 ): 40 """Инициализирует ассистента контроля напряжения. 41 42 Args: 43 name: Имя ассистента. 44 smart_plug_controller: Контроллер розетки. 45 voltage_threshold_low: Нижний порог напряжения. 46 voltage_threshold_high: Верхний порог напряжения. 47 rounding: Количество знаков после запятой для округления. 48 bot: Бот для отправки уведомлений. 49 """ 50 super().__init__(name) 51 self.voltage_threshold_low = voltage_threshold_low 52 self.voltage_threshold_high = voltage_threshold_high 53 self.rounding = rounding 54 self.smart_plug = smart_plug_controller 55 self.bot = bot 56 57 def handle_high_voltage(self, voltage): 58 """Обрабатывает превышение верхнего порога напряжения. 59 60 Args: 61 voltage: Текущее значение напряжения. 62 """ 63 logger.warning(f"Напряжение достигло порога: {voltage}V >= {self.voltage_threshold_high}V") 64 if self.bot: 65 self.bot.send_message( 66 f"Напряжение достигло порога: {voltage}V >= {self.voltage_threshold_high}V" 67 ) 68 # Дополнительные действия, например, отправка уведомления 69 70 def handle_low_voltage(self, voltage): 71 """Обрабатывает понижение напряжения ниже порога. 72 73 Args: 74 voltage: Текущее значение напряжения. 75 """ 76 logger.warning(f"Напряжение ниже, чем порог: {voltage}V < {self.voltage_threshold_low}V") 77 if self.bot: 78 self.bot.send_message( 79 f"Напряжение достигла порога: {voltage}V <= {self.voltage_threshold_low}V" 80 ) 81 # Дополнительные действия, например, отправка уведомления 82 83 @observe(name=f"Цикл контроля напряжения {__qualname__}") 84 def run(self): 85 """Выполняет один цикл контроля напряжения. 86 87 Получает состояние розетки, округляет напряжение и сравнивает 88 с порогами. При выходе за пределы вызывает соответствующие 89 обработчики. 90 """ 91 logger.debug(f'Запуск цикла контроля напряжения для "{self.name}"...') 92 state = self.smart_plug.get_state() 93 if state is None: 94 logger.error(f'Не удалось получить состояние розетки, пропускаем цикл "{self.name}"') 95 return 96 voltage = state["voltage"] 97 rounded_voltage = round(voltage, self.rounding) 98 rounded_voltage = int(voltage) if self.rounding == 0 else rounded_voltage 99 if rounded_voltage >= self.voltage_threshold_high: 100 self.handle_high_voltage(rounded_voltage) 101 elif rounded_voltage < self.voltage_threshold_low: 102 self.handle_low_voltage(rounded_voltage)
17class VoltageAssistant(Assistant): 18 """Контролирует напряжение в электросети. 19 20 Получает показания напряжения из розетки и сравнивает с 21 верхним и нижним порогами. При выходе за пределы отправляет 22 предупреждение через бота. 23 24 Attributes: 25 voltage_threshold_low: Нижний порог напряжения. 26 voltage_threshold_high: Верхний порог напряжения. 27 rounding: Количество знаков после запятой для округления. 28 smart_plug: Контроллер розетки. 29 bot: Бот для отправки уведомлений. 30 """ 31 32 def __init__( 33 self, 34 name, 35 smart_plug_controller: SmartPlugController, 36 voltage_threshold_low=200, 37 voltage_threshold_high=250, 38 rounding=0, 39 bot: Bot = None, 40 ): 41 """Инициализирует ассистента контроля напряжения. 42 43 Args: 44 name: Имя ассистента. 45 smart_plug_controller: Контроллер розетки. 46 voltage_threshold_low: Нижний порог напряжения. 47 voltage_threshold_high: Верхний порог напряжения. 48 rounding: Количество знаков после запятой для округления. 49 bot: Бот для отправки уведомлений. 50 """ 51 super().__init__(name) 52 self.voltage_threshold_low = voltage_threshold_low 53 self.voltage_threshold_high = voltage_threshold_high 54 self.rounding = rounding 55 self.smart_plug = smart_plug_controller 56 self.bot = bot 57 58 def handle_high_voltage(self, voltage): 59 """Обрабатывает превышение верхнего порога напряжения. 60 61 Args: 62 voltage: Текущее значение напряжения. 63 """ 64 logger.warning(f"Напряжение достигло порога: {voltage}V >= {self.voltage_threshold_high}V") 65 if self.bot: 66 self.bot.send_message( 67 f"Напряжение достигло порога: {voltage}V >= {self.voltage_threshold_high}V" 68 ) 69 # Дополнительные действия, например, отправка уведомления 70 71 def handle_low_voltage(self, voltage): 72 """Обрабатывает понижение напряжения ниже порога. 73 74 Args: 75 voltage: Текущее значение напряжения. 76 """ 77 logger.warning(f"Напряжение ниже, чем порог: {voltage}V < {self.voltage_threshold_low}V") 78 if self.bot: 79 self.bot.send_message( 80 f"Напряжение достигла порога: {voltage}V <= {self.voltage_threshold_low}V" 81 ) 82 # Дополнительные действия, например, отправка уведомления 83 84 @observe(name=f"Цикл контроля напряжения {__qualname__}") 85 def run(self): 86 """Выполняет один цикл контроля напряжения. 87 88 Получает состояние розетки, округляет напряжение и сравнивает 89 с порогами. При выходе за пределы вызывает соответствующие 90 обработчики. 91 """ 92 logger.debug(f'Запуск цикла контроля напряжения для "{self.name}"...') 93 state = self.smart_plug.get_state() 94 if state is None: 95 logger.error(f'Не удалось получить состояние розетки, пропускаем цикл "{self.name}"') 96 return 97 voltage = state["voltage"] 98 rounded_voltage = round(voltage, self.rounding) 99 rounded_voltage = int(voltage) if self.rounding == 0 else rounded_voltage 100 if rounded_voltage >= self.voltage_threshold_high: 101 self.handle_high_voltage(rounded_voltage) 102 elif rounded_voltage < self.voltage_threshold_low: 103 self.handle_low_voltage(rounded_voltage)
Контролирует напряжение в электросети.
Получает показания напряжения из розетки и сравнивает с верхним и нижним порогами. При выходе за пределы отправляет предупреждение через бота.
Attributes: voltage_threshold_low: Нижний порог напряжения. voltage_threshold_high: Верхний порог напряжения. rounding: Количество знаков после запятой для округления. smart_plug: Контроллер розетки. bot: Бот для отправки уведомлений.
32 def __init__( 33 self, 34 name, 35 smart_plug_controller: SmartPlugController, 36 voltage_threshold_low=200, 37 voltage_threshold_high=250, 38 rounding=0, 39 bot: Bot = None, 40 ): 41 """Инициализирует ассистента контроля напряжения. 42 43 Args: 44 name: Имя ассистента. 45 smart_plug_controller: Контроллер розетки. 46 voltage_threshold_low: Нижний порог напряжения. 47 voltage_threshold_high: Верхний порог напряжения. 48 rounding: Количество знаков после запятой для округления. 49 bot: Бот для отправки уведомлений. 50 """ 51 super().__init__(name) 52 self.voltage_threshold_low = voltage_threshold_low 53 self.voltage_threshold_high = voltage_threshold_high 54 self.rounding = rounding 55 self.smart_plug = smart_plug_controller 56 self.bot = bot
Инициализирует ассистента контроля напряжения.
Args: name: Имя ассистента. smart_plug_controller: Контроллер розетки. voltage_threshold_low: Нижний порог напряжения. voltage_threshold_high: Верхний порог напряжения. rounding: Количество знаков после запятой для округления. bot: Бот для отправки уведомлений.
58 def handle_high_voltage(self, voltage): 59 """Обрабатывает превышение верхнего порога напряжения. 60 61 Args: 62 voltage: Текущее значение напряжения. 63 """ 64 logger.warning(f"Напряжение достигло порога: {voltage}V >= {self.voltage_threshold_high}V") 65 if self.bot: 66 self.bot.send_message( 67 f"Напряжение достигло порога: {voltage}V >= {self.voltage_threshold_high}V" 68 ) 69 # Дополнительные действия, например, отправка уведомления
Обрабатывает превышение верхнего порога напряжения.
Args: voltage: Текущее значение напряжения.
71 def handle_low_voltage(self, voltage): 72 """Обрабатывает понижение напряжения ниже порога. 73 74 Args: 75 voltage: Текущее значение напряжения. 76 """ 77 logger.warning(f"Напряжение ниже, чем порог: {voltage}V < {self.voltage_threshold_low}V") 78 if self.bot: 79 self.bot.send_message( 80 f"Напряжение достигла порога: {voltage}V <= {self.voltage_threshold_low}V" 81 ) 82 # Дополнительные действия, например, отправка уведомления
Обрабатывает понижение напряжения ниже порога.
Args: voltage: Текущее значение напряжения.
84 @observe(name=f"Цикл контроля напряжения {__qualname__}") 85 def run(self): 86 """Выполняет один цикл контроля напряжения. 87 88 Получает состояние розетки, округляет напряжение и сравнивает 89 с порогами. При выходе за пределы вызывает соответствующие 90 обработчики. 91 """ 92 logger.debug(f'Запуск цикла контроля напряжения для "{self.name}"...') 93 state = self.smart_plug.get_state() 94 if state is None: 95 logger.error(f'Не удалось получить состояние розетки, пропускаем цикл "{self.name}"') 96 return 97 voltage = state["voltage"] 98 rounded_voltage = round(voltage, self.rounding) 99 rounded_voltage = int(voltage) if self.rounding == 0 else rounded_voltage 100 if rounded_voltage >= self.voltage_threshold_high: 101 self.handle_high_voltage(rounded_voltage) 102 elif rounded_voltage < self.voltage_threshold_low: 103 self.handle_low_voltage(rounded_voltage)
Выполняет один цикл контроля напряжения.
Получает состояние розетки, округляет напряжение и сравнивает с порогами. При выходе за пределы вызывает соответствующие обработчики.