93 lines
2.8 KiB
Python
93 lines
2.8 KiB
Python
"""Support for the myStrom buttons."""
|
|
from http import HTTPStatus
|
|
import logging
|
|
|
|
from homeassistant.components.binary_sensor import DOMAIN, BinarySensorEntity
|
|
from homeassistant.components.http import HomeAssistantView
|
|
from homeassistant.core import callback
|
|
|
|
_LOGGER = logging.getLogger(__name__)
|
|
|
|
|
|
async def async_setup_platform(hass, config, async_add_entities, discovery_info=None):
|
|
"""Set up myStrom Binary Sensor."""
|
|
hass.http.register_view(MyStromView(async_add_entities))
|
|
|
|
return True
|
|
|
|
|
|
class MyStromView(HomeAssistantView):
|
|
"""View to handle requests from myStrom buttons."""
|
|
|
|
url = "/api/mystrom"
|
|
name = "api:mystrom"
|
|
supported_actions = ["single", "double", "long", "touch"]
|
|
|
|
def __init__(self, add_entities):
|
|
"""Initialize the myStrom URL endpoint."""
|
|
self.buttons = {}
|
|
self.add_entities = add_entities
|
|
|
|
async def get(self, request):
|
|
"""Handle the GET request received from a myStrom button."""
|
|
res = await self._handle(request.app["hass"], request.query)
|
|
return res
|
|
|
|
async def _handle(self, hass, data):
|
|
"""Handle requests to the myStrom endpoint."""
|
|
button_action = next(
|
|
(parameter for parameter in data if parameter in self.supported_actions),
|
|
None,
|
|
)
|
|
|
|
if button_action is None:
|
|
_LOGGER.error("Received unidentified message from myStrom button: %s", data)
|
|
return (
|
|
f"Received unidentified message: {data}",
|
|
HTTPStatus.UNPROCESSABLE_ENTITY,
|
|
)
|
|
|
|
button_id = data[button_action]
|
|
entity_id = f"{DOMAIN}.{button_id}_{button_action}"
|
|
if entity_id not in self.buttons:
|
|
_LOGGER.info(
|
|
"New myStrom button/action detected: %s/%s", button_id, button_action
|
|
)
|
|
self.buttons[entity_id] = MyStromBinarySensor(
|
|
f"{button_id}_{button_action}"
|
|
)
|
|
self.add_entities([self.buttons[entity_id]])
|
|
else:
|
|
new_state = self.buttons[entity_id].state == "off"
|
|
self.buttons[entity_id].async_on_update(new_state)
|
|
|
|
|
|
class MyStromBinarySensor(BinarySensorEntity):
|
|
"""Representation of a myStrom button."""
|
|
|
|
def __init__(self, button_id):
|
|
"""Initialize the myStrom Binary sensor."""
|
|
self._button_id = button_id
|
|
self._state = None
|
|
|
|
@property
|
|
def name(self):
|
|
"""Return the name of the sensor."""
|
|
return self._button_id
|
|
|
|
@property
|
|
def should_poll(self):
|
|
"""No polling needed."""
|
|
return False
|
|
|
|
@property
|
|
def is_on(self):
|
|
"""Return true if the binary sensor is on."""
|
|
return self._state
|
|
|
|
@callback
|
|
def async_on_update(self, value):
|
|
"""Receive an update."""
|
|
self._state = value
|
|
self.async_write_ha_state()
|