Assistants.voltage

Ассистент контроля напряжения в электросети.

Периодически опрашивает розетку с измерением напряжения и отправляет уведомления при выходе за установленные пороги.

  1#!/usr/bin/env python3
  2"""
  3Ассистент контроля напряжения в электросети.
  4
  5Периодически опрашивает розетку с измерением напряжения и
  6отправляет уведомления при выходе за установленные пороги.
  7"""
  8
  9from e_lib.assistants import ThresholdMonitorAssistant
 10from langfuse import observe
 11from loguru import logger
 12
 13from Controllers.smart_plug import SmartPlugController
 14
 15
 16class VoltageAssistant(ThresholdMonitorAssistant):
 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=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__(
 51            name,
 52            threshold_low=voltage_threshold_low,
 53            threshold_high=voltage_threshold_high,
 54            rounding=rounding,
 55            notifier=bot,
 56            logger=logger,
 57        )
 58        self.voltage_threshold_low = voltage_threshold_low
 59        self.voltage_threshold_high = voltage_threshold_high
 60        self.rounding = rounding
 61        self.smart_plug = smart_plug_controller
 62        self.bot = bot
 63
 64    def read_metric(self):
 65        """Получает текущее значение напряжения из розетки.
 66
 67        Returns:
 68            Напряжение в вольтах или None, если состояние получить не удалось.
 69        """
 70        state = self.smart_plug.get_state()
 71        if state is None:
 72            return None
 73        return state["voltage"]
 74
 75    @observe(name=f"Цикл контроля напряжения {__qualname__}")
 76    def run(self):
 77        """Выполняет один цикл контроля напряжения.
 78
 79        Получает состояние розетки, округляет напряжение и сравнивает
 80        с порогами. При выходе за пределы отправляет уведомление.
 81        """
 82        super().run()
 83
 84    def _format_high(self, value):
 85        """Формирует сообщение о превышении верхнего порога.
 86
 87        Args:
 88            value: Текущее значение напряжения.
 89
 90        Returns:
 91            Текст сообщения.
 92        """
 93        return f"Напряжение достигло порога: {value}V >= {self.voltage_threshold_high}V"
 94
 95    def _format_low(self, value):
 96        """Формирует сообщение о понижении напряжения ниже порога.
 97
 98        Args:
 99            value: Текущее значение напряжения.
100
101        Returns:
102            Текст сообщения.
103        """
104        return f"Напряжение достигла порога: {value}V <= {self.voltage_threshold_low}V"
class VoltageAssistant(e_lib.assistants.threshold.ThresholdMonitorAssistant):
 17class VoltageAssistant(ThresholdMonitorAssistant):
 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=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__(
 52            name,
 53            threshold_low=voltage_threshold_low,
 54            threshold_high=voltage_threshold_high,
 55            rounding=rounding,
 56            notifier=bot,
 57            logger=logger,
 58        )
 59        self.voltage_threshold_low = voltage_threshold_low
 60        self.voltage_threshold_high = voltage_threshold_high
 61        self.rounding = rounding
 62        self.smart_plug = smart_plug_controller
 63        self.bot = bot
 64
 65    def read_metric(self):
 66        """Получает текущее значение напряжения из розетки.
 67
 68        Returns:
 69            Напряжение в вольтах или None, если состояние получить не удалось.
 70        """
 71        state = self.smart_plug.get_state()
 72        if state is None:
 73            return None
 74        return state["voltage"]
 75
 76    @observe(name=f"Цикл контроля напряжения {__qualname__}")
 77    def run(self):
 78        """Выполняет один цикл контроля напряжения.
 79
 80        Получает состояние розетки, округляет напряжение и сравнивает
 81        с порогами. При выходе за пределы отправляет уведомление.
 82        """
 83        super().run()
 84
 85    def _format_high(self, value):
 86        """Формирует сообщение о превышении верхнего порога.
 87
 88        Args:
 89            value: Текущее значение напряжения.
 90
 91        Returns:
 92            Текст сообщения.
 93        """
 94        return f"Напряжение достигло порога: {value}V >= {self.voltage_threshold_high}V"
 95
 96    def _format_low(self, value):
 97        """Формирует сообщение о понижении напряжения ниже порога.
 98
 99        Args:
100            value: Текущее значение напряжения.
101
102        Returns:
103            Текст сообщения.
104        """
105        return f"Напряжение достигла порога: {value}V <= {self.voltage_threshold_low}V"

Контролирует напряжение в электросети.

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

Attributes: voltage_threshold_low: Нижний порог напряжения. voltage_threshold_high: Верхний порог напряжения. rounding: Количество знаков после запятой для округления. smart_plug: Контроллер розетки. bot: Бот для отправки уведомлений.

VoltageAssistant( name, smart_plug_controller: Controllers.smart_plug.SmartPlugController, voltage_threshold_low=200, voltage_threshold_high=250, rounding=0, bot=None)
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=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__(
52            name,
53            threshold_low=voltage_threshold_low,
54            threshold_high=voltage_threshold_high,
55            rounding=rounding,
56            notifier=bot,
57            logger=logger,
58        )
59        self.voltage_threshold_low = voltage_threshold_low
60        self.voltage_threshold_high = voltage_threshold_high
61        self.rounding = rounding
62        self.smart_plug = smart_plug_controller
63        self.bot = bot

Инициализирует ассистента контроля напряжения.

Args: name: Имя ассистента. smart_plug_controller: Контроллер розетки. voltage_threshold_low: Нижний порог напряжения. voltage_threshold_high: Верхний порог напряжения. rounding: Количество знаков после запятой для округления. bot: Бот для отправки уведомлений.

voltage_threshold_low
voltage_threshold_high
rounding
smart_plug
bot
def read_metric(self):
65    def read_metric(self):
66        """Получает текущее значение напряжения из розетки.
67
68        Returns:
69            Напряжение в вольтах или None, если состояние получить не удалось.
70        """
71        state = self.smart_plug.get_state()
72        if state is None:
73            return None
74        return state["voltage"]

Получает текущее значение напряжения из розетки.

Returns: Напряжение в вольтах или None, если состояние получить не удалось.

@observe(name=f'Цикл контроля напряжения {__qualname__}')
def run(self):
76    @observe(name=f"Цикл контроля напряжения {__qualname__}")
77    def run(self):
78        """Выполняет один цикл контроля напряжения.
79
80        Получает состояние розетки, округляет напряжение и сравнивает
81        с порогами. При выходе за пределы отправляет уведомление.
82        """
83        super().run()

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

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