From a3d0719c49c9aeea33eef7d538f82db92c7c83ed Mon Sep 17 00:00:00 2001
From: Glenn Waters <glenn@watrs.ca>
Date: Mon, 11 Jul 2022 03:11:37 -0400
Subject: [PATCH] Add binary_sensor to ElkM1 integration (#74485)

* Add binary_sensor to ElkM1 integration

* Update for review comments.

* Fix black.

* Fix pylint error.

Co-authored-by: J. Nick Koston <nick@koston.org>
---
 .coveragerc                                   |  1 +
 homeassistant/components/elkm1/__init__.py    |  1 +
 .../components/elkm1/alarm_control_panel.py   |  2 +-
 .../components/elkm1/binary_sensor.py         | 57 +++++++++++++++++++
 homeassistant/components/elkm1/climate.py     |  2 +-
 homeassistant/components/elkm1/light.py       |  2 +-
 homeassistant/components/elkm1/scene.py       |  2 +-
 homeassistant/components/elkm1/sensor.py      |  2 +-
 homeassistant/components/elkm1/switch.py      |  2 +-
 9 files changed, 65 insertions(+), 6 deletions(-)
 create mode 100644 homeassistant/components/elkm1/binary_sensor.py

diff --git a/.coveragerc b/.coveragerc
index 97f26d8adc5..4e252fb9c92 100644
--- a/.coveragerc
+++ b/.coveragerc
@@ -266,6 +266,7 @@ omit =
     homeassistant/components/eliqonline/sensor.py
     homeassistant/components/elkm1/__init__.py
     homeassistant/components/elkm1/alarm_control_panel.py
+    homeassistant/components/elkm1/binary_sensor.py
     homeassistant/components/elkm1/climate.py
     homeassistant/components/elkm1/discovery.py
     homeassistant/components/elkm1/light.py
diff --git a/homeassistant/components/elkm1/__init__.py b/homeassistant/components/elkm1/__init__.py
index 00fcadfe57a..472d31ccb93 100644
--- a/homeassistant/components/elkm1/__init__.py
+++ b/homeassistant/components/elkm1/__init__.py
@@ -74,6 +74,7 @@ _LOGGER = logging.getLogger(__name__)
 
 PLATFORMS = [
     Platform.ALARM_CONTROL_PANEL,
+    Platform.BINARY_SENSOR,
     Platform.CLIMATE,
     Platform.LIGHT,
     Platform.SCENE,
diff --git a/homeassistant/components/elkm1/alarm_control_panel.py b/homeassistant/components/elkm1/alarm_control_panel.py
index 6b6a5b44d55..3f5163a849d 100644
--- a/homeassistant/components/elkm1/alarm_control_panel.py
+++ b/homeassistant/components/elkm1/alarm_control_panel.py
@@ -69,7 +69,7 @@ async def async_setup_entry(
     elk = elk_data["elk"]
     entities: list[ElkEntity] = []
     create_elk_entities(elk_data, elk.areas, "area", ElkArea, entities)
-    async_add_entities(entities, True)
+    async_add_entities(entities)
 
     platform = entity_platform.async_get_current_platform()
 
diff --git a/homeassistant/components/elkm1/binary_sensor.py b/homeassistant/components/elkm1/binary_sensor.py
new file mode 100644
index 00000000000..38a72796482
--- /dev/null
+++ b/homeassistant/components/elkm1/binary_sensor.py
@@ -0,0 +1,57 @@
+"""Support for control of ElkM1 binary sensors."""
+from __future__ import annotations
+
+from typing import Any
+
+from elkm1_lib.const import ZoneLogicalStatus, ZoneType
+from elkm1_lib.elements import Element
+from elkm1_lib.zones import Zone
+
+from homeassistant.components.binary_sensor import BinarySensorEntity
+from homeassistant.config_entries import ConfigEntry
+from homeassistant.core import HomeAssistant
+from homeassistant.helpers.entity_platform import AddEntitiesCallback
+
+from . import ElkAttachedEntity, ElkEntity
+from .const import DOMAIN
+
+
+async def async_setup_entry(
+    hass: HomeAssistant,
+    config_entry: ConfigEntry,
+    async_add_entities: AddEntitiesCallback,
+) -> None:
+    """Create the Elk-M1 sensor platform."""
+
+    elk_data = hass.data[DOMAIN][config_entry.entry_id]
+    auto_configure = elk_data["auto_configure"]
+    elk = elk_data["elk"]
+
+    entities: list[ElkEntity] = []
+    for element in elk.zones:
+        # Don't create binary sensors for zones that are analog
+        if element.definition in {ZoneType.TEMPERATURE, ZoneType.ANALOG_ZONE}:
+            continue
+
+        if auto_configure:
+            if not element.configured:
+                continue
+        elif not elk_data["config"]["zone"]["included"][element.index]:
+            continue
+
+        entities.append(ElkBinarySensor(element, elk, elk_data))
+
+    async_add_entities(entities)
+
+
+class ElkBinarySensor(ElkAttachedEntity, BinarySensorEntity):
+    """Representation of ElkM1 binary sensor."""
+
+    _element: Zone
+    _attr_entity_registry_enabled_default = False
+
+    def _element_changed(self, _: Element, changeset: Any) -> None:
+        # Zone in NORMAL state is OFF; any other state is ON
+        self._attr_is_on = bool(
+            self._element.logical_status != ZoneLogicalStatus.NORMAL
+        )
diff --git a/homeassistant/components/elkm1/climate.py b/homeassistant/components/elkm1/climate.py
index 9f6dc359f6f..8bbf776c475 100644
--- a/homeassistant/components/elkm1/climate.py
+++ b/homeassistant/components/elkm1/climate.py
@@ -68,7 +68,7 @@ async def async_setup_entry(
     create_elk_entities(
         elk_data, elk.thermostats, "thermostat", ElkThermostat, entities
     )
-    async_add_entities(entities, True)
+    async_add_entities(entities)
 
 
 class ElkThermostat(ElkEntity, ClimateEntity):
diff --git a/homeassistant/components/elkm1/light.py b/homeassistant/components/elkm1/light.py
index 9e008359e8c..3db457761aa 100644
--- a/homeassistant/components/elkm1/light.py
+++ b/homeassistant/components/elkm1/light.py
@@ -26,7 +26,7 @@ async def async_setup_entry(
     entities: list[ElkEntity] = []
     elk = elk_data["elk"]
     create_elk_entities(elk_data, elk.lights, "plc", ElkLight, entities)
-    async_add_entities(entities, True)
+    async_add_entities(entities)
 
 
 class ElkLight(ElkEntity, LightEntity):
diff --git a/homeassistant/components/elkm1/scene.py b/homeassistant/components/elkm1/scene.py
index d8100c5bcb1..1869e5ba0f3 100644
--- a/homeassistant/components/elkm1/scene.py
+++ b/homeassistant/components/elkm1/scene.py
@@ -24,7 +24,7 @@ async def async_setup_entry(
     entities: list[ElkEntity] = []
     elk = elk_data["elk"]
     create_elk_entities(elk_data, elk.tasks, "task", ElkTask, entities)
-    async_add_entities(entities, True)
+    async_add_entities(entities)
 
 
 class ElkTask(ElkAttachedEntity, Scene):
diff --git a/homeassistant/components/elkm1/sensor.py b/homeassistant/components/elkm1/sensor.py
index 57f989d5cb5..1d84af259ee 100644
--- a/homeassistant/components/elkm1/sensor.py
+++ b/homeassistant/components/elkm1/sensor.py
@@ -51,7 +51,7 @@ async def async_setup_entry(
     create_elk_entities(elk_data, [elk.panel], "panel", ElkPanel, entities)
     create_elk_entities(elk_data, elk.settings, "setting", ElkSetting, entities)
     create_elk_entities(elk_data, elk.zones, "zone", ElkZone, entities)
-    async_add_entities(entities, True)
+    async_add_entities(entities)
 
     platform = entity_platform.async_get_current_platform()
 
diff --git a/homeassistant/components/elkm1/switch.py b/homeassistant/components/elkm1/switch.py
index 54588958e61..a17557b1507 100644
--- a/homeassistant/components/elkm1/switch.py
+++ b/homeassistant/components/elkm1/switch.py
@@ -24,7 +24,7 @@ async def async_setup_entry(
     entities: list[ElkEntity] = []
     elk = elk_data["elk"]
     create_elk_entities(elk_data, elk.outputs, "output", ElkOutput, entities)
-    async_add_entities(entities, True)
+    async_add_entities(entities)
 
 
 class ElkOutput(ElkAttachedEntity, SwitchEntity):
-- 
GitLab