Skip to content

Commit

Permalink
feat: add device and events from it
Browse files Browse the repository at this point in the history
Now we may use "Device" trigger in automatizations.
  • Loading branch information
IATkachenko committed Dec 30, 2020
1 parent ca3a16a commit a69c0d0
Show file tree
Hide file tree
Showing 3 changed files with 122 additions and 3 deletions.
9 changes: 7 additions & 2 deletions README.md
Expand Up @@ -27,13 +27,18 @@ You will need:
* click "Install". Home assistant restart may be required;

### Configuration
* Name: name of sensor and prefix for events
* Name: name of device/sensor and prefix for events
* Topic: same as topic in Sleep As Android configuration
* QOS: quality of service for MQTT

## Usage
`<name>` is integration name in lower case without spaces from settings dialog.
List of vents is avaliable at [Sleep As Android documentation page](https://docs.sleep.urbandroid.org/services/automation.html#events)
List of vents is available at [Sleep As Android documentation page](https://docs.sleep.urbandroid.org/services/automation.html#events)

### on device event (recommended)
1. select "Device" in automatization trigger and use SleepAsAndroid device;
1. select trigger from list.

### on sensor state change
State of sensor `sensor.<name>` will have last event name, that published from application.
### on event
Expand Down
84 changes: 84 additions & 0 deletions custom_components/sleep_as_android/device_trigger.py
@@ -0,0 +1,84 @@
import logging
import voluptuous as vol
from homeassistant.components.device_automation import TRIGGER_BASE_SCHEMA
from homeassistant.const import (CONF_ENTITY_ID, CONF_TYPE, CONF_PLATFORM, CONF_DOMAIN, CONF_DEVICE_ID, )
from homeassistant.components.homeassistant.triggers import event as event_trigger
from homeassistant.core import HomeAssistant

from .const import DOMAIN

_LOGGER = logging.getLogger(__name__)

TRIGGERS = [
"sleep_tracking_started",
"sleep_tracking_stopped",
"sleep_tracking_paused",
"sleep_tracking_resumed",
"alarm_snooze_clicked",
"alarm_snooze_canceled",
"time_to_bed_alarm_alert",
"alarm_alert_start",
"alarm_alert_dismiss",
"alarm_skip_next",
"rem",
"smart_period",
"lullaby_start",
"lullaby_stop",
"lullaby_volume_down",
"deep_sleep",
"light_sleep",
"awake",
"not_awake",
"apnea_alarm",
"antisnoring",
"sound_event_snore",
"sound_event_talk",
"sound_event_cough",
"sound_event_baby",
"sound_event_laugh"
]

TRIGGER_SCHEMA = TRIGGER_BASE_SCHEMA.extend(
{
vol.Required(CONF_TYPE): vol.In(TRIGGERS),
}
)


async def async_get_triggers(hass, device_id):
"""Return a list of triggers."""
device_registry = await hass.helpers.device_registry.async_get_registry()
device = device_registry.async_get(device_id)

triggers = []

for t in TRIGGERS:
triggers.append({
# Required fields of TRIGGER_BASE_SCHEMA
CONF_PLATFORM: "device",
CONF_DOMAIN: DOMAIN,
CONF_DEVICE_ID: device_id,
# Required fields of TRIGGER_SCHEMA
CONF_TYPE: t,
})

return triggers


async def async_attach_trigger(hass: HomeAssistant, config, action, automation_info):
""" Attach a trigger. """
config = TRIGGER_SCHEMA(config)
_LOGGER.debug("Got subscription to trigger: %s", config)
event_config = event_trigger.TRIGGER_SCHEMA({
event_trigger.CONF_PLATFORM: "event",
event_trigger.CONF_EVENT_TYPE: DOMAIN + "_event",
event_trigger.CONF_EVENT_DATA: {
CONF_DEVICE_ID: config[CONF_DEVICE_ID],
CONF_TYPE: config[CONF_TYPE],
}
})

return await event_trigger.async_attach_trigger(
hass, event_config, action, automation_info, platform_type="device"
)

32 changes: 31 additions & 1 deletion custom_components/sleep_as_android/sensor.py
Expand Up @@ -10,6 +10,10 @@
from homeassistant.core import HomeAssistant, callback
from homeassistant.components.mqtt import subscription
from homeassistant.const import STATE_UNKNOWN
from homeassistant.helpers import device_registry as dr

from .const import DOMAIN
from .device_trigger import TRIGGERS

_LOGGER = logging.getLogger(__name__)

Expand All @@ -30,11 +34,15 @@ def __init__(self, hass: HomeAssistant, config_entry: ConfigEntry):
self._config = config_entry.data

self._state: str = STATE_UNKNOWN
self._device_id: str = "unknown"
self._sub_state = None # subscription state

async def async_added_to_hass(self):
"""Subscribe to MQTT events."""
await super().async_added_to_hass()
device_registry = await dr.async_get_registry(self._hass)
device = device_registry.async_get_device(identifiers=self.device_info['identifiers'], connections=set())
_LOGGER.debug("My device id is %s", device.id)
self._device_id = device.id
await self._subscribe_topics()

async def async_will_remove_from_hass(self):
Expand All @@ -59,6 +67,18 @@ def message_received(msg):
payload = {"event": new_state}
_LOGGER.debug("Firing '%s' with payload: '%s'", self.name, payload)
self.hass.bus.fire(self.name, payload)
if new_state in TRIGGERS:
self.hass.bus.async_fire(
DOMAIN + "_event",
{
"device_id": self.device_id,
"type": new_state
}
)
else:
_LOGGER.warning("Got %s event, but it is not in TRIGGERS list: will not fire this event for "
"trigger!")

self._state = new_state
self.async_write_ha_state()

Expand Down Expand Up @@ -95,3 +115,13 @@ def icon(self):
@property
def available(self) -> bool:
return self.state != STATE_UNKNOWN

@property
def device_id(self) -> str:
return self._device_id

@property
def device_info(self):
_LOGGER.debug("My identifiers is %s", {(DOMAIN, self.unique_id)})
info = {"identifiers": {(DOMAIN, self.unique_id)}, "name": self.name, "manufacturer": "SleepAsAndroid", "type": None}
return info

0 comments on commit a69c0d0

Please sign in to comment.