File: notification.py

package info (click to toggle)
python-xknx 3.10.1-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 4,044 kB
  • sloc: python: 40,087; javascript: 8,556; makefile: 32; sh: 12
file content (76 lines) | stat: -rw-r--r-- 2,521 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
67
68
69
70
71
72
73
74
75
76
"""Module for managing a text via KNX."""

from __future__ import annotations

from collections.abc import Iterator
from typing import TYPE_CHECKING

from xknx.dpt import DPTString
from xknx.remote_value import GroupAddressesType, RemoteValueString
from xknx.typing import DPTParsable

from .device import Device, DeviceCallbackType

if TYPE_CHECKING:
    from xknx.telegram import Telegram
    from xknx.xknx import XKNX


class Notification(Device):
    """Class for managing a notification."""

    def __init__(
        self,
        xknx: XKNX,
        name: str,
        group_address: GroupAddressesType = None,
        group_address_state: GroupAddressesType = None,
        respond_to_read: bool = False,
        sync_state: bool | int | float | str = True,
        value_type: DPTParsable | type[DPTString] | None = None,
        device_updated_cb: DeviceCallbackType[Notification] | None = None,
    ) -> None:
        """Initialize notification class."""
        super().__init__(xknx, name, device_updated_cb)

        self.respond_to_read = respond_to_read
        self.remote_value = RemoteValueString(
            xknx,
            group_address=group_address,
            group_address_state=group_address_state,
            sync_state=sync_state,
            value_type=value_type,
            device_name=name,
            feature_name="Text",
            after_update_cb=self.after_update,
        )

    def _iter_remote_values(self) -> Iterator[RemoteValueString]:
        """Iterate the devices RemoteValue classes."""
        yield self.remote_value

    @property
    def message(self) -> str | None:
        """Return the current message."""
        return self.remote_value.value

    async def set(self, message: str) -> None:
        """Set message."""
        cropped_message = message[:14]
        self.remote_value.set(cropped_message)

    def process_group_write(self, telegram: Telegram) -> None:
        """Process incoming and outgoing GROUP WRITE telegram."""
        self.remote_value.process(telegram)

    def process_group_read(self, telegram: Telegram) -> None:
        """Process incoming GroupValueResponse telegrams."""
        if (
            self.respond_to_read
            and telegram.destination_address == self.remote_value.group_address
        ):
            self.remote_value.respond()

    def __str__(self) -> str:
        """Return object as readable string."""
        return f'<Notification name="{self.name}" message={self.remote_value.group_addr_str()} />'