File: multi_level_sensor_property.py

package info (click to toggle)
devolo-home-control-api 0.19.1-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 804 kB
  • sloc: python: 3,167; makefile: 3
file content (66 lines) | stat: -rw-r--r-- 2,310 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
"""Multi Level Sensors."""
from datetime import datetime, tzinfo
from typing import Any

from devolo_home_control_api.exceptions import WrongElementError

from .sensor_property import SensorProperty


class MultiLevelSensorProperty(SensorProperty):
    """
    Object for multi level sensors. It stores the multi level sensor state and additional information that help displaying the
    state in the right context.

    :param element_uid: Element UID, something like devolo.MultiLevelSensor:hdm:ZWave:CBC56091/24#MultilevelSensor(1)
    :param tz: Timezone the last activity is recorded in
    :key value: Multi level value
    :type value: float
    :key unit: Unit of that value
    :type unit: int
    """

    def __init__(self, element_uid: str, tz: tzinfo, **kwargs: Any) -> None:
        """Initialize the multi level sensor."""
        if not element_uid.startswith(
            (
                "devolo.DewpointSensor:",
                "devolo.MultiLevelSensor:",
                "devolo.ValveTemperatureSensor",
                "devolo.VoltageMultiLevelSensor:",
            )
        ):
            raise WrongElementError(element_uid, self.__class__.__name__)

        super().__init__(element_uid, tz, **kwargs)

        self._value: float = kwargs.pop("value", 0.0)
        self._unit: int = kwargs.pop("unit", 0)

    @property
    def unit(self) -> str:
        """Human readable unit of the property."""
        units = {
            "dewpoint": {0: "°C", 1: "°F"},
            "humidity": {0: "%", 1: "g/m³"},
            "light": {0: "%", 1: "lx"},
            "temperature": {0: "°C", 1: "°F"},
            "Seismic Intensity": {0: ""},
            "voltage": {0: "V", 1: "mV"},
        }
        try:
            return units[self.sensor_type].get(self._unit, str(self._unit))
        except KeyError:
            return str(self._unit)

    @property
    def value(self) -> float:
        """Multi level value."""
        return self._value

    @value.setter
    def value(self, value: float) -> None:
        """Update value of the multilevel sensor and set point in time of the last_activity."""
        self._value = value
        self._last_activity = datetime.now(tz=self._timezone)
        self._logger.debug("value of element_uid %s set to %s.", self.element_uid, value)