Move picnic sensor definitions (#91367)

* Move types and mixin to sensor

* Move types and mixin to sensor
This commit is contained in:
Joost Lekkerkerker 2023-04-13 16:46:10 +02:00 committed by GitHub
parent c40836b49f
commit a272f8dfb2
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 188 additions and 175 deletions

View file

@ -1,11 +1,18 @@
"""Definition of Picnic sensors."""
from __future__ import annotations
from collections.abc import Callable
from dataclasses import dataclass
from datetime import datetime
from typing import Any, cast
from typing import Any, Literal, cast
from homeassistant.components.sensor import SensorEntity
from homeassistant.components.sensor import (
SensorDeviceClass,
SensorEntity,
SensorEntityDescription,
)
from homeassistant.config_entries import ConfigEntry
from homeassistant.const import CURRENCY_EURO
from homeassistant.core import HomeAssistant
from homeassistant.helpers.device_registry import DeviceEntryType
from homeassistant.helpers.entity import DeviceInfo
@ -15,14 +22,189 @@ from homeassistant.helpers.update_coordinator import (
CoordinatorEntity,
DataUpdateCoordinator,
)
from homeassistant.util import dt as dt_util
from .const import (
ADDRESS,
ATTRIBUTION,
CONF_COORDINATOR,
DOMAIN,
SENSOR_TYPES,
PicnicSensorEntityDescription,
SENSOR_CART_ITEMS_COUNT,
SENSOR_CART_TOTAL_PRICE,
SENSOR_LAST_ORDER_DELIVERY_TIME,
SENSOR_LAST_ORDER_MAX_ORDER_TIME,
SENSOR_LAST_ORDER_SLOT_END,
SENSOR_LAST_ORDER_SLOT_START,
SENSOR_LAST_ORDER_STATUS,
SENSOR_LAST_ORDER_TOTAL_PRICE,
SENSOR_NEXT_DELIVERY_ETA_END,
SENSOR_NEXT_DELIVERY_ETA_START,
SENSOR_NEXT_DELIVERY_SLOT_END,
SENSOR_NEXT_DELIVERY_SLOT_START,
SENSOR_SELECTED_SLOT_END,
SENSOR_SELECTED_SLOT_MAX_ORDER_TIME,
SENSOR_SELECTED_SLOT_MIN_ORDER_VALUE,
SENSOR_SELECTED_SLOT_START,
)
@dataclass
class PicnicRequiredKeysMixin:
"""Mixin for required keys."""
data_type: Literal[
"cart_data", "slot_data", "next_delivery_data", "last_order_data"
]
value_fn: Callable[[Any], StateType | datetime]
@dataclass
class PicnicSensorEntityDescription(SensorEntityDescription, PicnicRequiredKeysMixin):
"""Describes Picnic sensor entity."""
entity_registry_enabled_default: bool = False
SENSOR_TYPES: tuple[PicnicSensorEntityDescription, ...] = (
PicnicSensorEntityDescription(
key=SENSOR_CART_ITEMS_COUNT,
icon="mdi:format-list-numbered",
data_type="cart_data",
value_fn=lambda cart: cart.get("total_count", 0),
),
PicnicSensorEntityDescription(
key=SENSOR_CART_TOTAL_PRICE,
native_unit_of_measurement=CURRENCY_EURO,
icon="mdi:currency-eur",
entity_registry_enabled_default=True,
data_type="cart_data",
value_fn=lambda cart: cart.get("total_price", 0) / 100,
),
PicnicSensorEntityDescription(
key=SENSOR_SELECTED_SLOT_START,
device_class=SensorDeviceClass.TIMESTAMP,
icon="mdi:calendar-start",
entity_registry_enabled_default=True,
data_type="slot_data",
value_fn=lambda slot: dt_util.parse_datetime(str(slot.get("window_start"))),
),
PicnicSensorEntityDescription(
key=SENSOR_SELECTED_SLOT_END,
device_class=SensorDeviceClass.TIMESTAMP,
icon="mdi:calendar-end",
entity_registry_enabled_default=True,
data_type="slot_data",
value_fn=lambda slot: dt_util.parse_datetime(str(slot.get("window_end"))),
),
PicnicSensorEntityDescription(
key=SENSOR_SELECTED_SLOT_MAX_ORDER_TIME,
device_class=SensorDeviceClass.TIMESTAMP,
icon="mdi:clock-alert-outline",
entity_registry_enabled_default=True,
data_type="slot_data",
value_fn=lambda slot: dt_util.parse_datetime(str(slot.get("cut_off_time"))),
),
PicnicSensorEntityDescription(
key=SENSOR_SELECTED_SLOT_MIN_ORDER_VALUE,
native_unit_of_measurement=CURRENCY_EURO,
icon="mdi:currency-eur",
entity_registry_enabled_default=True,
data_type="slot_data",
value_fn=lambda slot: (
slot["minimum_order_value"] / 100
if slot.get("minimum_order_value")
else None
),
),
PicnicSensorEntityDescription(
key=SENSOR_LAST_ORDER_SLOT_START,
device_class=SensorDeviceClass.TIMESTAMP,
icon="mdi:calendar-start",
data_type="last_order_data",
value_fn=lambda last_order: dt_util.parse_datetime(
str(last_order.get("slot", {}).get("window_start"))
),
),
PicnicSensorEntityDescription(
key=SENSOR_LAST_ORDER_SLOT_END,
device_class=SensorDeviceClass.TIMESTAMP,
icon="mdi:calendar-end",
data_type="last_order_data",
value_fn=lambda last_order: dt_util.parse_datetime(
str(last_order.get("slot", {}).get("window_end"))
),
),
PicnicSensorEntityDescription(
key=SENSOR_LAST_ORDER_STATUS,
icon="mdi:list-status",
data_type="last_order_data",
value_fn=lambda last_order: last_order.get("status"),
),
PicnicSensorEntityDescription(
key=SENSOR_LAST_ORDER_MAX_ORDER_TIME,
device_class=SensorDeviceClass.TIMESTAMP,
icon="mdi:clock-alert-outline",
entity_registry_enabled_default=True,
data_type="last_order_data",
value_fn=lambda last_order: dt_util.parse_datetime(
str(last_order.get("slot", {}).get("cut_off_time"))
),
),
PicnicSensorEntityDescription(
key=SENSOR_LAST_ORDER_DELIVERY_TIME,
device_class=SensorDeviceClass.TIMESTAMP,
icon="mdi:timeline-clock",
entity_registry_enabled_default=True,
data_type="last_order_data",
value_fn=lambda last_order: dt_util.parse_datetime(
str(last_order.get("delivery_time", {}).get("start"))
),
),
PicnicSensorEntityDescription(
key=SENSOR_LAST_ORDER_TOTAL_PRICE,
native_unit_of_measurement=CURRENCY_EURO,
icon="mdi:cash-marker",
data_type="last_order_data",
value_fn=lambda last_order: last_order.get("total_price", 0) / 100,
),
PicnicSensorEntityDescription(
key=SENSOR_NEXT_DELIVERY_ETA_START,
device_class=SensorDeviceClass.TIMESTAMP,
icon="mdi:clock-start",
entity_registry_enabled_default=True,
data_type="next_delivery_data",
value_fn=lambda next_delivery: dt_util.parse_datetime(
str(next_delivery.get("eta", {}).get("start"))
),
),
PicnicSensorEntityDescription(
key=SENSOR_NEXT_DELIVERY_ETA_END,
device_class=SensorDeviceClass.TIMESTAMP,
icon="mdi:clock-end",
entity_registry_enabled_default=True,
data_type="next_delivery_data",
value_fn=lambda next_delivery: dt_util.parse_datetime(
str(next_delivery.get("eta", {}).get("end"))
),
),
PicnicSensorEntityDescription(
key=SENSOR_NEXT_DELIVERY_SLOT_START,
device_class=SensorDeviceClass.TIMESTAMP,
icon="mdi:calendar-start",
data_type="next_delivery_data",
value_fn=lambda next_delivery: dt_util.parse_datetime(
str(next_delivery.get("slot", {}).get("window_start"))
),
),
PicnicSensorEntityDescription(
key=SENSOR_NEXT_DELIVERY_SLOT_END,
device_class=SensorDeviceClass.TIMESTAMP,
icon="mdi:calendar-end",
data_type="next_delivery_data",
value_fn=lambda next_delivery: dt_util.parse_datetime(
str(next_delivery.get("slot", {}).get("window_end"))
),
),
)