Home Assistant Unofficial Reference 2024.12.1
binary_sensor.py
Go to the documentation of this file.
1 """Binary sensor platform for Habitica integration."""
2 
3 from __future__ import annotations
4 
5 from collections.abc import Callable
6 from dataclasses import dataclass
7 from enum import StrEnum
8 from typing import Any
9 
11  BinarySensorEntity,
12  BinarySensorEntityDescription,
13 )
14 from homeassistant.core import HomeAssistant
15 from homeassistant.helpers.entity_platform import AddEntitiesCallback
16 
17 from .const import ASSETS_URL
18 from .entity import HabiticaBase
19 from .types import HabiticaConfigEntry
20 
21 
22 @dataclass(kw_only=True, frozen=True)
24  """Habitica Binary Sensor Description."""
25 
26  value_fn: Callable[[dict[str, Any]], bool | None]
27  entity_picture: Callable[[dict[str, Any]], str | None]
28 
29 
30 class HabiticaBinarySensor(StrEnum):
31  """Habitica Entities."""
32 
33  PENDING_QUEST = "pending_quest"
34 
35 
36 def get_scroll_image_for_pending_quest_invitation(user: dict[str, Any]) -> str | None:
37  """Entity picture for pending quest invitation."""
38  if user["party"]["quest"].get("key") and user["party"]["quest"]["RSVPNeeded"]:
39  return f"inventory_quest_scroll_{user["party"]["quest"]["key"]}.png"
40  return None
41 
42 
43 BINARY_SENSOR_DESCRIPTIONS: tuple[HabiticaBinarySensorEntityDescription, ...] = (
45  key=HabiticaBinarySensor.PENDING_QUEST,
46  translation_key=HabiticaBinarySensor.PENDING_QUEST,
47  value_fn=lambda user: user["party"]["quest"]["RSVPNeeded"],
48  entity_picture=get_scroll_image_for_pending_quest_invitation,
49  ),
50 )
51 
52 
54  hass: HomeAssistant,
55  config_entry: HabiticaConfigEntry,
56  async_add_entities: AddEntitiesCallback,
57 ) -> None:
58  """Set up the habitica binary sensors."""
59 
60  coordinator = config_entry.runtime_data
61 
63  HabiticaBinarySensorEntity(coordinator, description)
64  for description in BINARY_SENSOR_DESCRIPTIONS
65  )
66 
67 
69  """Representation of a Habitica binary sensor."""
70 
71  entity_description: HabiticaBinarySensorEntityDescription
72 
73  @property
74  def is_on(self) -> bool | None:
75  """If the binary sensor is on."""
76  return self.entity_descriptionentity_description.value_fn(self.coordinator.data.user)
77 
78  @property
79  def entity_picture(self) -> str | None:
80  """Return the entity picture to use in the frontend, if any."""
81  if entity_picture := self.entity_descriptionentity_description.entity_picture(
82  self.coordinator.data.user
83  ):
84  return f"{ASSETS_URL}{entity_picture}"
85  return None
web.Response get(self, web.Request request, str config_key)
Definition: view.py:88
None async_setup_entry(HomeAssistant hass, HabiticaConfigEntry config_entry, AddEntitiesCallback async_add_entities)
str|None get_scroll_image_for_pending_quest_invitation(dict[str, Any] user)