1 """Support for control of ElkM1 sensors."""
3 from __future__
import annotations
7 from elkm1_lib.const
import SettingFormat, ZoneType
8 from elkm1_lib.counters
import Counter
9 from elkm1_lib.elements
import Element
10 from elkm1_lib.keypads
import Keypad
11 from elkm1_lib.panel
import Panel
12 from elkm1_lib.settings
import Setting
13 from elkm1_lib.util
import pretty_const
14 from elkm1_lib.zones
import Zone
15 import voluptuous
as vol
25 from .
import ElkM1ConfigEntry
26 from .const
import ATTR_VALUE, ELK_USER_CODE_SERVICE_SCHEMA
27 from .entity
import ElkAttachedEntity, ElkEntity, create_elk_entities
29 SERVICE_SENSOR_COUNTER_REFRESH =
"sensor_counter_refresh"
30 SERVICE_SENSOR_COUNTER_SET =
"sensor_counter_set"
31 SERVICE_SENSOR_ZONE_BYPASS =
"sensor_zone_bypass"
32 SERVICE_SENSOR_ZONE_TRIGGER =
"sensor_zone_trigger"
33 UNDEFINED_TEMPERATURE = -40
35 ELK_SET_COUNTER_SERVICE_SCHEMA: VolDictType = {
36 vol.Required(ATTR_VALUE): vol.All(vol.Coerce(int), vol.Range(0, 65535))
42 config_entry: ElkM1ConfigEntry,
43 async_add_entities: AddEntitiesCallback,
45 """Create the Elk-M1 sensor platform."""
46 elk_data = config_entry.runtime_data
48 entities: list[ElkEntity] = []
56 platform = entity_platform.async_get_current_platform()
58 platform.async_register_entity_service(
59 SERVICE_SENSOR_COUNTER_REFRESH,
61 "async_counter_refresh",
63 platform.async_register_entity_service(
64 SERVICE_SENSOR_COUNTER_SET,
65 ELK_SET_COUNTER_SERVICE_SCHEMA,
68 platform.async_register_entity_service(
69 SERVICE_SENSOR_ZONE_BYPASS,
70 ELK_USER_CODE_SERVICE_SCHEMA,
73 platform.async_register_entity_service(
74 SERVICE_SENSOR_ZONE_TRIGGER,
81 """Convert temperature to a state."""
82 return f
"{temperature}" if temperature > undefined_temperature
else None
86 """Base representation of Elk-M1 sensor."""
88 _attr_native_value: str |
None =
None
91 """Refresh the value of a counter from the panel."""
92 if not isinstance(self, ElkCounter):
96 async
def async_counter_set(self, value: int |
None =
None) ->
None:
97 """Set the value of a counter on the panel."""
98 if not isinstance(self, ElkCounter):
100 if value
is not None:
103 async
def async_zone_bypass(self, code: int |
None =
None) ->
None:
105 if not isinstance(self, ElkZone):
110 async
def async_zone_trigger(self) -> None:
112 if not isinstance(self, ElkZone):
118 """Representation of an Elk-M1 Counter."""
120 _attr_icon =
"mdi:numeric"
128 """Representation of an Elk-M1 Keypad."""
130 _attr_icon =
"mdi:thermometer-lines"
135 """Return the temperature unit."""
136 return self._temperature_unit
140 """Return the unit of measurement."""
141 return self._temperature_unit
145 """Attributes of the sensor."""
147 attrs[
"area"] = self.
_element_element.area + 1
149 attrs[
"last_user_time"] = self.
_element_element.last_user_time.isoformat()
150 attrs[
"last_user"] = self.
_element_element.last_user + 1
151 attrs[
"code"] = self.
_element_element.code
152 attrs[
"last_user_name"] = self.
_elk_elk.users.username(self.
_element_element.last_user)
153 attrs[
"last_keypress"] = self.
_element_element.last_keypress
158 self.
_element_element.temperature, UNDEFINED_TEMPERATURE
163 """Representation of an Elk-M1 Panel."""
165 _attr_translation_key =
"panel"
166 _attr_entity_category = EntityCategory.DIAGNOSTIC
171 """Attributes of the sensor."""
173 attrs[
"system_trouble_status"] = self.
_element_element.system_trouble_status
179 "Paused" if self.
_element_element.remote_programming_status
else "Connected"
186 """Representation of an Elk-M1 Setting."""
188 _attr_translation_key =
"setting"
196 """Attributes of the sensor."""
198 attrs[
"value_format"] = SettingFormat(self.
_element_element.value_format).name.lower()
203 """Representation of an Elk-M1 Zone."""
209 """Icon to use in the frontend."""
211 ZoneType.FIRE_ALARM:
"fire",
212 ZoneType.FIRE_VERIFIED:
"fire",
213 ZoneType.FIRE_SUPERVISORY:
"fire",
214 ZoneType.KEYFOB:
"key",
215 ZoneType.NON_ALARM:
"alarm-off",
216 ZoneType.MEDICAL_ALARM:
"medical-bag",
217 ZoneType.POLICE_ALARM:
"alarm-light",
218 ZoneType.POLICE_NO_INDICATION:
"alarm-light",
219 ZoneType.KEY_MOMENTARY_ARM_DISARM:
"power",
220 ZoneType.KEY_MOMENTARY_ARM_AWAY:
"power",
221 ZoneType.KEY_MOMENTARY_ARM_STAY:
"power",
222 ZoneType.KEY_MOMENTARY_DISARM:
"power",
223 ZoneType.KEY_ON_OFF:
"toggle-switch",
224 ZoneType.MUTE_AUDIBLES:
"volume-mute",
225 ZoneType.POWER_SUPERVISORY:
"power-plug",
226 ZoneType.TEMPERATURE:
"thermometer-lines",
227 ZoneType.ANALOG_ZONE:
"speedometer",
228 ZoneType.PHONE_KEY:
"phone-classic",
229 ZoneType.INTERCOM_KEY:
"deskphone",
231 return f
"mdi:{zone_icons.get(self._element.definition, 'alarm-bell')}"
235 """Attributes of the sensor."""
237 attrs[
"physical_status"] = self.
_element_element.physical_status.name.lower()
238 attrs[
"logical_status"] = self.
_element_element.logical_status.name.lower()
239 attrs[
"definition"] = self.
_element_element.definition.name.lower()
240 attrs[
"area"] = self.
_element_element.area + 1
241 attrs[
"triggered_alarm"] = self.
_element_element.triggered_alarm
246 """Return the temperature unit."""
247 if self.
_element_element.definition == ZoneType.TEMPERATURE:
248 return self._temperature_unit
253 """Return the unit of measurement."""
254 if self.
_element_element.definition == ZoneType.TEMPERATURE:
255 return self._temperature_unit
256 if self.
_element_element.definition == ZoneType.ANALOG_ZONE:
257 return UnitOfElectricPotential.VOLT
261 if self.
_element_element.definition == ZoneType.TEMPERATURE:
263 self.
_element_element.temperature, UNDEFINED_TEMPERATURE
265 elif self.
_element_element.definition == ZoneType.ANALOG_ZONE:
dict[str, Any] initial_attrs(self)
None _element_changed(self, Element _, Any changeset)
str temperature_unit(self)
str native_unit_of_measurement(self)
None _element_changed(self, Element _, Any changeset)
dict[str, Any] extra_state_attributes(self)
dict[str, Any] extra_state_attributes(self)
None _element_changed(self, Element _, Any changeset)
None async_counter_refresh(self)
None _element_changed(self, Element _, Any changeset)
dict[str, Any] extra_state_attributes(self)
str|None temperature_unit(self)
dict[str, Any] extra_state_attributes(self)
None _element_changed(self, Element _, Any changeset)
str|None native_unit_of_measurement(self)
web.Response get(self, web.Request request, str config_key)
list[ElkEntity]|None create_elk_entities(ELKM1Data elk_data, Iterable[Element] elk_elements, str element_type, Any class_, list[ElkEntity] entities)
str|None temperature_to_state(int temperature, int undefined_temperature)
None async_setup_entry(HomeAssistant hass, ElkM1ConfigEntry config_entry, AddEntitiesCallback async_add_entities)