mirror of
https://github.com/home-assistant/core.git
synced 2026-02-15 07:36:16 +00:00
129 lines
4.2 KiB
Python
129 lines
4.2 KiB
Python
"""Binary sensor platform for the Mastodon integration."""
|
|
|
|
from __future__ import annotations
|
|
|
|
from collections.abc import Callable
|
|
from dataclasses import dataclass
|
|
from enum import StrEnum
|
|
|
|
from mastodon.Mastodon import Account
|
|
|
|
from homeassistant.components.binary_sensor import (
|
|
BinarySensorEntity,
|
|
BinarySensorEntityDescription,
|
|
)
|
|
from homeassistant.const import EntityCategory
|
|
from homeassistant.core import HomeAssistant
|
|
from homeassistant.helpers.entity_platform import AddConfigEntryEntitiesCallback
|
|
|
|
from .coordinator import MastodonConfigEntry
|
|
from .entity import MastodonEntity
|
|
|
|
# Coordinator is used to centralize the data updates
|
|
PARALLEL_UPDATES = 0
|
|
|
|
|
|
class MastodonBinarySensor(StrEnum):
|
|
"""Mastodon binary sensors."""
|
|
|
|
BOT = "bot"
|
|
SUSPENDED = "suspended"
|
|
DISCOVERABLE = "discoverable"
|
|
LOCKED = "locked"
|
|
INDEXABLE = "indexable"
|
|
LIMITED = "limited"
|
|
MEMORIAL = "memorial"
|
|
MOVED = "moved"
|
|
|
|
|
|
@dataclass(frozen=True, kw_only=True)
|
|
class MastodonBinarySensorEntityDescription(BinarySensorEntityDescription):
|
|
"""Mastodon binary sensor description."""
|
|
|
|
is_on_fn: Callable[[Account], bool | None]
|
|
|
|
|
|
ENTITY_DESCRIPTIONS: tuple[MastodonBinarySensorEntityDescription, ...] = (
|
|
MastodonBinarySensorEntityDescription(
|
|
key=MastodonBinarySensor.BOT,
|
|
translation_key=MastodonBinarySensor.BOT,
|
|
is_on_fn=lambda account: account.bot,
|
|
entity_category=EntityCategory.DIAGNOSTIC,
|
|
),
|
|
MastodonBinarySensorEntityDescription(
|
|
key=MastodonBinarySensor.DISCOVERABLE,
|
|
translation_key=MastodonBinarySensor.DISCOVERABLE,
|
|
is_on_fn=lambda account: account.discoverable,
|
|
entity_category=EntityCategory.DIAGNOSTIC,
|
|
),
|
|
MastodonBinarySensorEntityDescription(
|
|
key=MastodonBinarySensor.LOCKED,
|
|
translation_key=MastodonBinarySensor.LOCKED,
|
|
is_on_fn=lambda account: account.locked,
|
|
entity_category=EntityCategory.DIAGNOSTIC,
|
|
),
|
|
MastodonBinarySensorEntityDescription(
|
|
key=MastodonBinarySensor.MOVED,
|
|
translation_key=MastodonBinarySensor.MOVED,
|
|
is_on_fn=lambda account: account.moved is not None,
|
|
entity_category=EntityCategory.DIAGNOSTIC,
|
|
),
|
|
MastodonBinarySensorEntityDescription(
|
|
key=MastodonBinarySensor.INDEXABLE,
|
|
translation_key=MastodonBinarySensor.INDEXABLE,
|
|
is_on_fn=lambda account: account.indexable,
|
|
entity_registry_enabled_default=False,
|
|
entity_category=EntityCategory.DIAGNOSTIC,
|
|
),
|
|
MastodonBinarySensorEntityDescription(
|
|
key=MastodonBinarySensor.LIMITED,
|
|
translation_key=MastodonBinarySensor.LIMITED,
|
|
is_on_fn=lambda account: account.limited is True,
|
|
entity_registry_enabled_default=False,
|
|
entity_category=EntityCategory.DIAGNOSTIC,
|
|
),
|
|
MastodonBinarySensorEntityDescription(
|
|
key=MastodonBinarySensor.MEMORIAL,
|
|
translation_key=MastodonBinarySensor.MEMORIAL,
|
|
is_on_fn=lambda account: account.memorial is True,
|
|
entity_registry_enabled_default=False,
|
|
entity_category=EntityCategory.DIAGNOSTIC,
|
|
),
|
|
MastodonBinarySensorEntityDescription(
|
|
key=MastodonBinarySensor.SUSPENDED,
|
|
translation_key=MastodonBinarySensor.SUSPENDED,
|
|
is_on_fn=lambda account: account.suspended is True,
|
|
entity_registry_enabled_default=False,
|
|
entity_category=EntityCategory.DIAGNOSTIC,
|
|
),
|
|
)
|
|
|
|
|
|
async def async_setup_entry(
|
|
hass: HomeAssistant,
|
|
entry: MastodonConfigEntry,
|
|
async_add_entities: AddConfigEntryEntitiesCallback,
|
|
) -> None:
|
|
"""Set up the binary sensor platform."""
|
|
coordinator = entry.runtime_data.coordinator
|
|
|
|
async_add_entities(
|
|
MastodonBinarySensorEntity(
|
|
coordinator=coordinator,
|
|
entity_description=entity_description,
|
|
data=entry,
|
|
)
|
|
for entity_description in ENTITY_DESCRIPTIONS
|
|
)
|
|
|
|
|
|
class MastodonBinarySensorEntity(MastodonEntity, BinarySensorEntity):
|
|
"""Mastodon binary sensor entity."""
|
|
|
|
entity_description: MastodonBinarySensorEntityDescription
|
|
|
|
@property
|
|
def is_on(self) -> bool | None:
|
|
"""Return true if the binary sensor is on."""
|
|
return self.entity_description.is_on_fn(self.coordinator.data)
|