-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathbinary_sensor.py
More file actions
138 lines (117 loc) · 4.26 KB
/
binary_sensor.py
File metadata and controls
138 lines (117 loc) · 4.26 KB
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
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
"""SEM Solar Energy Management binary sensors."""
import logging
from typing import Any, Dict
from homeassistant.components.binary_sensor import (
BinarySensorEntity,
BinarySensorEntityDescription,
BinarySensorDeviceClass,
)
from homeassistant.config_entries import ConfigEntry
from homeassistant.core import HomeAssistant
from homeassistant.helpers.entity import EntityCategory
from homeassistant.helpers.entity_platform import AddEntitiesCallback
from homeassistant.helpers.update_coordinator import CoordinatorEntity
from .const import DOMAIN
from .coordinator import SEMCoordinator
_LOGGER = logging.getLogger(__name__)
PARALLEL_UPDATES = 0 # Coordinator handles all updates
BINARY_SENSOR_TYPES = [
BinarySensorEntityDescription(
key="ev_connected",
device_class=BinarySensorDeviceClass.PLUG,
),
BinarySensorEntityDescription(
key="ev_charging",
device_class=BinarySensorDeviceClass.BATTERY_CHARGING,
),
BinarySensorEntityDescription(
key="battery_charging",
device_class=BinarySensorDeviceClass.BATTERY_CHARGING,
),
BinarySensorEntityDescription(
key="battery_discharging",
device_class=BinarySensorDeviceClass.BATTERY,
),
BinarySensorEntityDescription(
key="grid_export_active",
device_class=BinarySensorDeviceClass.POWER,
),
BinarySensorEntityDescription(
key="solar_active",
device_class=BinarySensorDeviceClass.POWER,
),
# Phase 0: Forecast available
BinarySensorEntityDescription(
key="forecast_available",
device_class=BinarySensorDeviceClass.CONNECTIVITY,
),
# Phase 1: Dynamic tariff active
BinarySensorEntityDescription(
key="tariff_is_dynamic",
),
# Phase 2: Heat pump solar boost active
BinarySensorEntityDescription(
key="heat_pump_solar_boost",
),
# Phase 7: Utility signal active
BinarySensorEntityDescription(
key="utility_signal_active",
device_class=BinarySensorDeviceClass.PROBLEM,
),
]
async def async_setup_entry(
hass: HomeAssistant, entry: ConfigEntry, async_add_entities: AddEntitiesCallback
) -> None:
"""Set up SEM Solar Energy Management binary sensors."""
coordinator = hass.data[DOMAIN][entry.entry_id]
entities = [
SEMSolarBinarySensor(coordinator, description, entry)
for description in BINARY_SENSOR_TYPES
]
async_add_entities(entities)
class SEMSolarBinarySensor(CoordinatorEntity, BinarySensorEntity):
"""EMS Solar Optimizer binary sensor entity."""
_attr_has_entity_name = True
# Disabled by default
DISABLED_BY_DEFAULT = {
"forecast_available", "tariff_is_dynamic",
"heat_pump_solar_boost", "utility_signal_active",
}
# Diagnostic sensors
DIAGNOSTIC_SENSORS = {
"forecast_available", "tariff_is_dynamic", "utility_signal_active",
}
def __init__(
self,
coordinator: SEMCoordinator,
description: BinarySensorEntityDescription,
entry: ConfigEntry,
) -> None:
"""Initialize the binary sensor entity."""
super().__init__(coordinator)
self.entity_description = description
self._attr_unique_id = f"sem_{description.key}"
self._attr_translation_key = description.key
self._entry = entry
if description.key in self.DIAGNOSTIC_SENSORS:
self._attr_entity_category = EntityCategory.DIAGNOSTIC
if description.key in self.DISABLED_BY_DEFAULT:
self._attr_entity_registry_enabled_default = False
@property
def available(self) -> bool:
"""Return if entity is available."""
is_available = self.coordinator.last_update_success and self.coordinator.data is not None
if not is_available:
_LOGGER.debug("Binary sensor %s is unavailable", self.entity_description.key)
return is_available
@property
def is_on(self) -> bool | None:
"""Return true if the binary sensor is on."""
if not self.coordinator.data:
return None
key = self.entity_description.key
return self.coordinator.data.get(key, False)
@property
def device_info(self) -> Dict[str, Any]:
"""Return device information."""
return self.coordinator.device_info