1 """Support for Plaato devices."""
3 from datetime
import timedelta
6 from aiohttp
import web
7 from pyplaato.models.airlock
import PlaatoAirlock
8 from pyplaato.plaato
import (
22 import voluptuous
as vol
43 DEFAULT_SCAN_INTERVAL,
53 from .coordinator
import PlaatoCoordinator
55 _LOGGER = logging.getLogger(__name__)
57 DEPENDENCIES = [
"webhook"]
59 SENSOR_UPDATE = f
"{DOMAIN}_sensor_update"
60 SENSOR_DATA_KEY = f
"{DOMAIN}.{SENSOR}"
62 WEBHOOK_SCHEMA = vol.Schema(
64 vol.Required(ATTR_DEVICE_NAME): cv.string,
65 vol.Required(ATTR_DEVICE_ID): cv.positive_int,
66 vol.Required(ATTR_TEMP_UNIT): vol.In(
67 [UnitOfTemperature.CELSIUS, UnitOfTemperature.FAHRENHEIT]
69 vol.Required(ATTR_VOLUME_UNIT): vol.In(
70 [UnitOfVolume.LITERS, UnitOfVolume.GALLONS]
72 vol.Required(ATTR_BPM): cv.positive_int,
73 vol.Required(ATTR_TEMP): vol.Coerce(float),
74 vol.Required(ATTR_SG): vol.Coerce(float),
75 vol.Required(ATTR_OG): vol.Coerce(float),
76 vol.Required(ATTR_ABV): vol.Coerce(float),
77 vol.Required(ATTR_CO2_VOLUME): vol.Coerce(float),
78 vol.Required(ATTR_BATCH_VOLUME): vol.Coerce(float),
79 vol.Required(ATTR_BUBBLES): cv.positive_int,
81 extra=vol.ALLOW_EXTRA,
86 """Configure based on config entry."""
87 hass.data.setdefault(DOMAIN, {})
89 if entry.data[CONF_USE_WEBHOOK]:
94 await hass.config_entries.async_forward_entry_setups(
95 entry, [platform
for platform
in PLATFORMS
if entry.options.get(platform,
True)]
103 """Init webhook based on config entry."""
104 webhook_id = entry.data[CONF_WEBHOOK_ID]
105 device_name = entry.data[CONF_DEVICE_NAME]
109 webhook.async_register(
110 hass, DOMAIN, f
"{DOMAIN}.{device_name}", webhook_id, handle_webhook
115 """Init auth token based on config entry."""
116 auth_token = entry.data[CONF_TOKEN]
117 device_type = entry.data[CONF_DEVICE_TYPE]
119 if entry.options.get(CONF_SCAN_INTERVAL):
120 update_interval =
timedelta(minutes=entry.options[CONF_SCAN_INTERVAL])
122 update_interval =
timedelta(minutes=DEFAULT_SCAN_INTERVAL)
125 await coordinator.async_config_entry_first_refresh()
129 for platform
in PLATFORMS:
130 if entry.options.get(platform,
True):
131 coordinator.platforms.append(platform)
136 DEVICE_NAME: entry.data[CONF_DEVICE_NAME],
137 DEVICE_TYPE: entry.data[CONF_DEVICE_TYPE],
138 DEVICE_ID: device_id,
141 hass.data[DOMAIN][entry.entry_id] = {
142 COORDINATOR: coordinator,
145 UNDO_UPDATE_LISTENER: entry.add_update_listener(_async_update_listener),
150 """Unload a config entry."""
151 use_webhook = entry.data[CONF_USE_WEBHOOK]
152 hass.data[DOMAIN][entry.entry_id][UNDO_UPDATE_LISTENER]()
161 """Unload webhook based entry."""
162 if entry.data[CONF_WEBHOOK_ID]
is not None:
163 webhook.async_unregister(hass, entry.data[CONF_WEBHOOK_ID])
168 """Unload auth token based entry."""
169 coordinator = hass.data[DOMAIN][entry.entry_id][COORDINATOR]
174 """Unload platforms."""
175 unloaded = await hass.config_entries.async_unload_platforms(entry, PLATFORMS)
177 hass.data[DOMAIN].pop(entry.entry_id)
183 """Handle options update."""
184 await hass.config_entries.async_reload(entry.entry_id)
188 hass: HomeAssistant, webhook_id: str, request: web.Request
189 ) -> web.Response |
None:
190 """Handle incoming webhook from Plaato."""
193 except vol.MultipleInvalid
as error:
194 _LOGGER.warning(
"An error occurred when parsing webhook data <%s>", error)
198 sensor_data = PlaatoAirlock.from_web_hook(data)
202 return web.Response(text=f
"Saving status for {device_id}")
206 """Return name of device sensor."""
207 return f
"{data.get(ATTR_DEVICE_NAME)}_{data.get(ATTR_DEVICE_ID)}"
def async_unload_webhook(HomeAssistant hass, ConfigEntry entry)
def async_unload_platforms(HomeAssistant hass, ConfigEntry entry, platforms)
bool async_setup_entry(HomeAssistant hass, ConfigEntry entry)
def async_unload_coordinator(HomeAssistant hass, ConfigEntry entry)
web.Response|None handle_webhook(HomeAssistant hass, str webhook_id, web.Request request)
def async_setup_coordinator(HomeAssistant hass, ConfigEntry entry)
bool async_unload_entry(HomeAssistant hass, ConfigEntry entry)
None _async_update_listener(HomeAssistant hass, ConfigEntry entry)
def async_setup_webhook(HomeAssistant hass, ConfigEntry entry)
def _set_entry_data(entry, hass, coordinator=None, device_id=None)
None async_dispatcher_send(HomeAssistant hass, str signal, *Any args)