1 """Base entity for the Fully Kiosk Browser integration."""
3 from __future__
import annotations
16 from .const
import DOMAIN
17 from .coordinator
import FullyKioskDataUpdateCoordinator
21 """Check if a MAC address is valid, non-locally administered address."""
22 if not isinstance(mac, str):
25 first_octet =
int(mac.split(
":")[0], 16)
27 return not bool(first_octet & 0x2)
33 """Defines a Fully Kiosk Browser entity."""
35 _attr_has_entity_name =
True
37 def __init__(self, coordinator: FullyKioskDataUpdateCoordinator) ->
None:
38 """Initialize the Fully Kiosk Browser entity."""
39 super().
__init__(coordinator=coordinator)
42 scheme=
"https" if coordinator.use_ssl
else "http",
43 host=coordinator.data[
"ip4"],
48 identifiers={(DOMAIN, coordinator.data[
"deviceID"])},
49 name=coordinator.data[
"deviceName"],
50 manufacturer=coordinator.data[
"deviceManufacturer"],
51 model=coordinator.data[
"deviceModel"],
52 sw_version=coordinator.data[
"appVersionName"],
53 configuration_url=
str(url),
56 coordinator.data[
"Mac"]
58 device_info[ATTR_CONNECTIONS] = {
59 (CONNECTION_NETWORK_MAC, coordinator.data[
"Mac"])
64 self, event: str |
None, event_callback: CALLBACK_TYPE
65 ) -> CALLBACK_TYPE |
None:
66 """Subscribe to MQTT for a given event."""
67 data = self.coordinator.data
70 or not mqtt.mqtt_config_entry_enabled(self.
hasshasshass)
71 or not data[
"settings"][
"mqttEnabled"]
76 def message_callback(message: mqtt.ReceiveMessage) ->
None:
77 payload = json.loads(message.payload)
78 if "event" in payload
and payload[
"event"] == event:
79 event_callback(**payload)
81 topic_template = data[
"settings"][
"mqttEventTopic"]
83 topic_template.replace(
"$appId",
"fully")
84 .replace(
"$event", event)
85 .replace(
"$deviceId", data[
"deviceID"])
88 return await mqtt.async_subscribe(self.
hasshasshass, topic, message_callback)
None __init__(self, FullyKioskDataUpdateCoordinator coordinator)
CALLBACK_TYPE|None mqtt_subscribe(self, str|None event, CALLBACK_TYPE event_callback)
bool valid_global_mac_address(str|None mac)