-
Notifications
You must be signed in to change notification settings - Fork 32
/
__init__.py
127 lines (107 loc) · 5.06 KB
/
__init__.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
"""The yi_hack component."""
import asyncio
import logging
from homeassistant.config_entries import ConfigEntry
from homeassistant.const import CONF_MAC, CONF_NAME
from homeassistant.core import HomeAssistant
from homeassistant.helpers.aiohttp_client import async_get_clientsession
from .common import get_mqtt_conf, get_system_conf
from .const import (ALLWINNER, ALLWINNERV2, CONF_BABY_CRYING_MSG,
CONF_BIRTH_MSG, CONF_HACK_NAME, CONF_HUMAN_DETECTION_MSG,
CONF_MOTION_START_MSG, CONF_MOTION_STOP_MSG,
CONF_MQTT_PREFIX, CONF_RTSP_PORT, CONF_SOUND_DETECTION_MSG,
CONF_TOPIC_MOTION_DETECTION,
CONF_TOPIC_MOTION_DETECTION_IMAGE,
CONF_TOPIC_SOUND_DETECTION, CONF_TOPIC_STATUS,
CONF_WILL_MSG, DEFAULT_BRAND, DOMAIN, END_OF_POWER_OFF,
END_OF_POWER_ON, MSTAR, PRIVACY, SONOFF, V5)
from .views import VideoProxyView
PLATFORMS = ["camera", "binary_sensor", "media_player", "switch"]
PLATFORMS_NOMEDIA = ["camera", "binary_sensor", "switch"]
_LOGGER = logging.getLogger(__name__)
async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool:
"""Set up yi-hack from a config entry."""
device_name=entry.data[CONF_NAME]
hass.data.setdefault(DOMAIN, {})
hass.data[DOMAIN][device_name] = {}
hass.data[DOMAIN][device_name][PRIVACY] = False
hass.data[DOMAIN][device_name][END_OF_POWER_OFF] = None
hass.data[DOMAIN][device_name][END_OF_POWER_ON] = None
conf = await hass.async_add_executor_job(get_system_conf, entry.data)
mqtt = await hass.async_add_executor_job(get_mqtt_conf, entry.data)
if conf is not None and mqtt is not None:
updated_data = {
**entry.data,
CONF_MQTT_PREFIX: mqtt[CONF_MQTT_PREFIX],
CONF_TOPIC_STATUS: mqtt[CONF_TOPIC_STATUS],
CONF_TOPIC_MOTION_DETECTION: mqtt[CONF_TOPIC_MOTION_DETECTION],
CONF_MOTION_START_MSG: mqtt[CONF_MOTION_START_MSG],
CONF_MOTION_STOP_MSG: mqtt[CONF_MOTION_STOP_MSG],
CONF_BIRTH_MSG: mqtt[CONF_BIRTH_MSG],
CONF_WILL_MSG: mqtt[CONF_WILL_MSG],
CONF_TOPIC_MOTION_DETECTION_IMAGE: mqtt[CONF_TOPIC_MOTION_DETECTION_IMAGE],
}
if (entry.data[CONF_HACK_NAME] == DEFAULT_BRAND) or (entry.data[CONF_HACK_NAME] == MSTAR):
updated_data.update(**{
CONF_RTSP_PORT: conf[CONF_RTSP_PORT],
CONF_BABY_CRYING_MSG: mqtt[CONF_BABY_CRYING_MSG],
})
elif (entry.data[CONF_HACK_NAME] == ALLWINNER) or (entry.data[CONF_HACK_NAME] == V5):
updated_data.update(**{
CONF_RTSP_PORT: conf[CONF_RTSP_PORT],
CONF_TOPIC_SOUND_DETECTION: mqtt[CONF_TOPIC_SOUND_DETECTION],
CONF_BABY_CRYING_MSG: mqtt[CONF_BABY_CRYING_MSG],
CONF_SOUND_DETECTION_MSG: mqtt[CONF_SOUND_DETECTION_MSG],
})
elif (entry.data[CONF_HACK_NAME] == ALLWINNERV2):
updated_data.update(**{
CONF_RTSP_PORT: conf[CONF_RTSP_PORT],
CONF_TOPIC_SOUND_DETECTION: mqtt[CONF_TOPIC_SOUND_DETECTION],
CONF_HUMAN_DETECTION_MSG: mqtt[CONF_HUMAN_DETECTION_MSG],
CONF_BABY_CRYING_MSG: mqtt[CONF_BABY_CRYING_MSG],
CONF_SOUND_DETECTION_MSG: mqtt[CONF_SOUND_DETECTION_MSG],
})
elif entry.data[CONF_HACK_NAME] == SONOFF:
updated_data.update(**{
CONF_RTSP_PORT: conf[CONF_RTSP_PORT],
})
hass.config_entries.async_update_entry(entry, data=updated_data)
if (entry.data[CONF_HACK_NAME] == SONOFF) or (entry.data[CONF_HACK_NAME] == V5):
for component in PLATFORMS_NOMEDIA:
hass.async_create_task(
hass.config_entries.async_forward_entry_setup(entry, component)
)
else:
for component in PLATFORMS:
hass.async_create_task(
hass.config_entries.async_forward_entry_setup(entry, component)
)
session = async_get_clientsession(hass)
hass.http.register_view(VideoProxyView(hass, session))
return True
else:
_LOGGER.error("Unable to get configuration from the cam")
return False
async def async_unload_entry(hass: HomeAssistant, entry: ConfigEntry):
"""Unload a config entry."""
if (entry.data[CONF_HACK_NAME] == SONOFF) or (entry.data[CONF_HACK_NAME] == V5):
unload_ok = all(
await asyncio.gather(
*[
hass.config_entries.async_forward_entry_unload(entry, component)
for component in PLATFORMS_NOMEDIA
]
)
)
else:
unload_ok = all(
await asyncio.gather(
*[
hass.config_entries.async_forward_entry_unload(entry, component)
for component in PLATFORMS
]
)
)
if unload_ok:
hass.data[DOMAIN].pop(entry.entry_id)
return unload_ok