Compare commits

...

19 Commits

Author SHA1 Message Date
Paulus Schoutsen 2ac16b12c1 Merge pull request #16770 from home-assistant/rc
0.78.2
2018-09-21 11:40:04 +02:00
Paulus Schoutsen 44a98fb77a Bumped version to 0.78.2 2018-09-20 20:26:25 +02:00
Fabian Affolter 03d93bea34 Upgrade zeroconf to 0.21.2 (#16730) 2018-09-20 20:25:39 +02:00
Fabian Affolter 9dbac9b033 Upgrade zeroconf to 0.21.1 (#16687) 2018-09-20 20:25:38 +02:00
tadly 9e86f0498b Upgrade zeroconf to 0.21.0 (#16647) 2018-09-20 20:25:38 +02:00
Paulus Schoutsen 0d0d5c8c2c Merge pull request #16742 from home-assistant/rc
0.78.1
2018-09-20 13:55:09 +02:00
Paulus Schoutsen c7d5f7698e Bumped version to 0.78.1 2018-09-20 11:32:26 +02:00
Jason Hu 9bbd61cbe4 Upgrade netdisco to 2.1.0 (#16735) 2018-09-20 11:32:16 +02:00
Jason Hu 7a7a164cb8 Handle chromecast CONNECTION_STATUS_DISCONNECTED event (#16732) 2018-09-20 11:32:15 +02:00
Andreas Oberritter 8379567636 SnmpSensor: Fix async_update (#16679) (#16716)
Bugfix provided by awarecan.
2018-09-20 11:32:14 +02:00
Paulus Schoutsen 9e59fc5d05 Merge pull request #16666 from home-assistant/rc
0.78.0
2018-09-17 19:03:37 +02:00
Paulus Schoutsen 366e270e94 Bump frontend to 20180916.0 2018-09-17 18:33:41 +02:00
Paulus Schoutsen f918d62571 version bump to 0.78.0 2018-09-17 10:48:09 +02:00
Paulus Schoutsen 18ce5092b4 Bumped version to 0.78.0b3 2018-09-15 12:46:02 +02:00
Paulus Schoutsen 7f7372198a Update translations 2018-09-15 12:45:54 +02:00
Pascal Vizeli abe61c5529 Rewrite bluetooth le (#16592)
* Rewrite bluetooth le

* Update requirements_all.txt

* Update gen_requirements_all.py

* Update bluetooth_le_tracker.py

* Update bluetooth_le_tracker.py

* Update bluetooth_le_tracker.py

* Update bluetooth_le_tracker.py

* Update bluetooth_le_tracker.py

* Update bluetooth_le_tracker.py
2018-09-15 12:45:23 +02:00
Jason Hu b231fa2616 Fix broken bluetooth tracker (#16589) 2018-09-15 12:45:23 +02:00
Jason Hu 336289d7e7 Add retry limit for chromecast connection (#16471) 2018-09-15 12:45:22 +02:00
Franck Nijhof 7a5e828f6b Updates documentation repo URL in PR template (#16537) 2018-09-10 14:28:21 +02:00
32 changed files with 240 additions and 59 deletions
+2 -2
View File
@@ -3,7 +3,7 @@
**Related issue (if applicable):** fixes #<home-assistant issue number goes here>
**Pull request in [home-assistant.github.io](https://github.com/home-assistant/home-assistant.github.io) with documentation (if applicable):** home-assistant/home-assistant.github.io#<home-assistant.github.io PR number goes here>
**Pull request in [home-assistant.io](https://github.com/home-assistant/home-assistant.io) with documentation (if applicable):** home-assistant/home-assistant.io#<home-assistant.io PR number goes here>
## Example entry for `configuration.yaml` (if applicable):
```yaml
@@ -15,7 +15,7 @@
- [ ] Local tests pass with `tox`. **Your PR cannot be merged unless tests pass**
If user exposed functionality or configuration variables are added/changed:
- [ ] Documentation added/updated in [home-assistant.github.io](https://github.com/home-assistant/home-assistant.github.io)
- [ ] Documentation added/updated in [home-assistant.io](https://github.com/home-assistant/home-assistant.io)
If the code communicates with devices, web services, or third-party tools:
- [ ] New dependencies have been added to the `REQUIREMENTS` variable ([example][ex-requir]).
@@ -2,7 +2,7 @@
"mfa_setup": {
"totp": {
"error": {
"invalid_code": "Code invalide. S'il vous pla\u00eet essayez \u00e0 nouveau. Si cette erreur persiste, assurez-vous que l'horloge de votre syst\u00e8me Home Assistant est correcte."
"invalid_code": "Code invalide. Veuillez essayez \u00e0 nouveau. Si cette erreur persiste, assurez-vous que l'horloge de votre syst\u00e8me Home Assistant est correcte."
},
"step": {
"init": {
@@ -2,7 +2,7 @@
"config": {
"abort": {
"no_devices_found": "No s'han trobat dispositius de Google Cast a la xarxa.",
"single_instance_allowed": "Nom\u00e9s cal una \u00fanica configuraci\u00f3 de Google Cast."
"single_instance_allowed": "Nom\u00e9s cal una sola configuraci\u00f3 de Google Cast."
},
"step": {
"confirm": {
@@ -2,7 +2,7 @@
"config": {
"abort": {
"no_devices_found": "Aucun appareil Google Cast trouv\u00e9 sur le r\u00e9seau.",
"single_instance_allowed": "Seulement une seule configuration de Google Cast est n\u00e9cessaire."
"single_instance_allowed": "Une seule configuration de Google Cast est n\u00e9cessaire."
},
"step": {
"confirm": {
@@ -6,35 +6,25 @@ https://home-assistant.io/components/device_tracker.bluetooth_le_tracker/
"""
import logging
import voluptuous as vol
from homeassistant.helpers.event import track_point_in_utc_time
from homeassistant.components.device_tracker import (
YAML_DEVICES, CONF_TRACK_NEW, CONF_SCAN_INTERVAL, DEFAULT_SCAN_INTERVAL,
PLATFORM_SCHEMA, load_config, SOURCE_TYPE_BLUETOOTH_LE
load_config, SOURCE_TYPE_BLUETOOTH_LE
)
import homeassistant.util.dt as dt_util
import homeassistant.helpers.config_validation as cv
_LOGGER = logging.getLogger(__name__)
REQUIREMENTS = ['gattlib==0.20150805']
REQUIREMENTS = ['pygatt==3.2.0']
BLE_PREFIX = 'BLE_'
MIN_SEEN_NEW = 5
CONF_SCAN_DURATION = 'scan_duration'
CONF_BLUETOOTH_DEVICE = 'device_id'
PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({
vol.Optional(CONF_SCAN_DURATION, default=10): cv.positive_int,
vol.Optional(CONF_BLUETOOTH_DEVICE, default='hci0'): cv.string
})
def setup_scanner(hass, config, see, discovery_info=None):
"""Set up the Bluetooth LE Scanner."""
# pylint: disable=import-error
from gattlib import DiscoveryService
import pygatt
new_devices = {}
def see_device(address, name, new_device=False):
@@ -61,17 +51,17 @@ def setup_scanner(hass, config, see, discovery_info=None):
"""Discover Bluetooth LE devices."""
_LOGGER.debug("Discovering Bluetooth LE devices")
try:
service = DiscoveryService(ble_dev_id)
devices = service.discover(duration)
adapter = pygatt.GATTToolBackend()
devs = adapter.scan()
devices = {x['address']: x['name'] for x in devs}
_LOGGER.debug("Bluetooth LE devices discovered = %s", devices)
except RuntimeError as error:
_LOGGER.error("Error during Bluetooth LE scan: %s", error)
devices = []
return {}
return devices
yaml_path = hass.config.path(YAML_DEVICES)
duration = config.get(CONF_SCAN_DURATION)
ble_dev_id = config.get(CONF_BLUETOOTH_DEVICE)
devs_to_track = []
devs_donot_track = []
@@ -102,11 +92,11 @@ def setup_scanner(hass, config, see, discovery_info=None):
"""Lookup Bluetooth LE devices and update status."""
devs = discover_ble_devices()
for mac in devs_to_track:
_LOGGER.debug("Checking %s", mac)
result = mac in devs
if not result:
# Could not lookup device name
if mac not in devs:
continue
if devs[mac] is None:
devs[mac] = mac
see_device(mac, devs[mac])
if track_new:
@@ -119,5 +109,4 @@ def setup_scanner(hass, config, see, discovery_info=None):
track_point_in_utc_time(hass, update_ble, dt_util.utcnow() + interval)
update_ble(dt_util.utcnow())
return True
@@ -80,7 +80,7 @@ def setup_scanner(hass, config, see, discovery_info=None):
request_rssi = config.get(CONF_REQUEST_RSSI, False)
def update_bluetooth():
def update_bluetooth(_):
"""Update Bluetooth and set timer for the next update."""
update_bluetooth_once()
track_point_in_utc_time(
@@ -111,7 +111,7 @@ def setup_scanner(hass, config, see, discovery_info=None):
"""Update bluetooth devices on demand."""
update_bluetooth_once()
update_bluetooth()
update_bluetooth(dt_util.utcnow())
hass.services.register(
DOMAIN, "bluetooth_tracker_update", handle_update_bluetooth)
+1 -1
View File
@@ -21,7 +21,7 @@ from homeassistant.helpers.event import async_track_point_in_utc_time
from homeassistant.helpers.discovery import async_load_platform, async_discover
import homeassistant.util.dt as dt_util
REQUIREMENTS = ['netdisco==2.0.0']
REQUIREMENTS = ['netdisco==2.1.0']
DOMAIN = 'discovery'
@@ -26,7 +26,7 @@ from homeassistant.helpers.translation import async_get_translations
from homeassistant.loader import bind_hass
from homeassistant.util.yaml import load_yaml
REQUIREMENTS = ['home-assistant-frontend==20180912.0']
REQUIREMENTS = ['home-assistant-frontend==20180916.0']
DOMAIN = 'frontend'
DEPENDENCIES = ['api', 'websocket_api', 'http', 'system_log',
@@ -5,10 +5,15 @@
"unknown": "Une erreur inconnue s'est produite"
},
"error": {
"invalid_2fa": "Authentification \u00e0 2 facteurs invalide, veuillez r\u00e9essayer.",
"invalid_2fa_method": "M\u00e9thode 2FA non valide (v\u00e9rifiez sur le t\u00e9l\u00e9phone).",
"invalid_login": "Login invalide, veuillez r\u00e9essayer."
},
"step": {
"2fa": {
"data": {
"2fa": "Code PIN d'authentification \u00e0 2 facteurs"
},
"title": "Authentification \u00e0 2 facteurs"
},
"user": {
@@ -4,12 +4,13 @@
"already_configured": "Le point d'acc\u00e8s est d\u00e9j\u00e0 configur\u00e9",
"conection_aborted": "Impossible de se connecter au serveur HMIP",
"connection_aborted": "Impossible de se connecter au serveur HMIP",
"unknown": "Une erreur inconnue s'est produite"
"unknown": "Une erreur inconnue s'est produite."
},
"error": {
"invalid_pin": "Code PIN invalide, veuillez r\u00e9essayer.",
"press_the_button": "Veuillez appuyer sur le bouton bleu.",
"register_failed": "\u00c9chec d'enregistrement. Veuillez r\u00e9essayer."
"register_failed": "\u00c9chec d'enregistrement. Veuillez r\u00e9essayer.",
"timeout_button": "D\u00e9lai d'attente expir\u00e9, veuillez r\u00e9\u00e9ssayer."
},
"step": {
"init": {
@@ -17,8 +18,14 @@
"hapid": "ID du point d'acc\u00e8s (SGTIN)",
"name": "Nom (facultatif, utilis\u00e9 comme pr\u00e9fixe de nom pour tous les p\u00e9riph\u00e9riques)",
"pin": "Code PIN (facultatif)"
}
},
"title": "Choisissez le point d'acc\u00e8s HomematicIP"
},
"link": {
"description": "Appuyez sur le bouton bleu du point d'acc\u00e8s et sur le bouton Envoyer pour enregistrer HomematicIP avec Home Assistant. \n\n ![Emplacement du bouton sur le pont](/static/images/config_flows/config_homematicip_cloud.png)",
"title": "Lier le point d'acc\u00e8s"
}
}
},
"title": "HomematicIP Cloud"
}
}
@@ -24,6 +24,6 @@
"title": "Hub de liaison"
}
},
"title": "Pont Philips Hue"
"title": "Philips Hue"
}
}
@@ -0,0 +1,14 @@
{
"config": {
"abort": {
"single_instance_allowed": "Nom\u00e9s cal una sola configuraci\u00f3 de Home Assistant iOS."
},
"step": {
"confirm": {
"description": "Voleu configurar el component Home Assistant iOS?",
"title": "Home Assistant iOS"
}
},
"title": "Home Assistant iOS"
}
}
@@ -0,0 +1,10 @@
{
"config": {
"step": {
"confirm": {
"title": "Home Assistant iOS"
}
},
"title": "Home Assistant iOS"
}
}
@@ -0,0 +1,14 @@
{
"config": {
"abort": {
"single_instance_allowed": "Seule une configuration de Home Assistant iOS est n\u00e9cessaire."
},
"step": {
"confirm": {
"description": "Voulez-vous configurer le composant Home Assistant iOS?",
"title": "Home Assistant iOS"
}
},
"title": "Home Assistant iOS"
}
}
@@ -0,0 +1,14 @@
{
"config": {
"abort": {
"single_instance_allowed": "\ud558\ub098\uc758 Home Assistant iOS \uad6c\uc131\ub9cc \ud544\uc694\ud569\ub2c8\ub2e4."
},
"step": {
"confirm": {
"description": "Home Assistant iOS \ucef4\ud3ec\ub10c\ud2b8\uc758 \uc124\uc815\uc744 \ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c?",
"title": "Home Assistant iOS"
}
},
"title": "Home Assistant iOS"
}
}
@@ -0,0 +1,14 @@
{
"config": {
"abort": {
"single_instance_allowed": "Er is slechts \u00e9\u00e9n configuratie van Home Assistant iOS nodig."
},
"step": {
"confirm": {
"description": "Wilt u het Home Assistant iOS component instellen?",
"title": "Home Assistant iOS"
}
},
"title": "Home Assistant iOS"
}
}
@@ -0,0 +1,14 @@
{
"config": {
"abort": {
"single_instance_allowed": "Wymagana jest tylko jedna konfiguracja Home Assistant iOS."
},
"step": {
"confirm": {
"description": "Czy chcesz skonfigurowa\u0107 Home Assistant iOS?",
"title": "Home Assistant iOS"
}
},
"title": "Home Assistant iOS"
}
}
@@ -0,0 +1,14 @@
{
"config": {
"abort": {
"single_instance_allowed": "Home Assistant iOS \u53ea\u9700\u8981\u914d\u7f6e\u4e00\u6b21\u3002"
},
"step": {
"confirm": {
"description": "\u662f\u5426\u8981\u8bbe\u7f6e Home Assistant iOS \u7ec4\u4ef6\uff1f",
"title": "Home Assistant iOS"
}
},
"title": "Home Assistant iOS"
}
}
+23 -8
View File
@@ -62,6 +62,10 @@ PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({
vol.All(cv.ensure_list, [cv.string]),
})
CONNECTION_RETRY = 3
CONNECTION_RETRY_WAIT = 2
CONNECTION_TIMEOUT = 10
@attr.s(slots=True, frozen=True)
class ChromecastInfo:
@@ -365,19 +369,18 @@ class CastDevice(MediaPlayerDevice):
if self._chromecast is not None:
if old_cast_info.host_port == cast_info.host_port:
# Nothing connection-related updated
_LOGGER.debug("No connection related update: %s",
cast_info.host_port)
return
await self._async_disconnect()
# Failed connection will unfortunately never raise an exception, it
# will instead just try connecting indefinitely.
# pylint: disable=protected-access
_LOGGER.debug("Connecting to cast device %s", cast_info)
chromecast = await self.hass.async_add_job(
pychromecast._get_chromecast_from_host, (
cast_info.host, cast_info.port, cast_info.uuid,
cast_info.model_name, cast_info.friendly_name
))
), CONNECTION_RETRY, CONNECTION_RETRY_WAIT, CONNECTION_TIMEOUT)
self._chromecast = chromecast
self._status_listener = CastStatusListener(self, chromecast)
# Initialise connection status as connected because we can only
@@ -401,7 +404,12 @@ class CastDevice(MediaPlayerDevice):
await self.hass.async_add_job(self._chromecast.disconnect)
# Invalidate some attributes
self._invalidate()
self.async_schedule_update_ha_state()
def _invalidate(self):
"""Invalidate some attributes."""
self._chromecast = None
self.cast_status = None
self.media_status = None
@@ -410,8 +418,6 @@ class CastDevice(MediaPlayerDevice):
self._status_listener.invalidate()
self._status_listener = None
self.async_schedule_update_ha_state()
# ========== Callbacks ==========
def new_cast_status(self, cast_status):
"""Handle updates of the cast status."""
@@ -426,7 +432,16 @@ class CastDevice(MediaPlayerDevice):
def new_connection_status(self, connection_status):
"""Handle updates of connection status."""
from pychromecast.socket_client import CONNECTION_STATUS_CONNECTED
from pychromecast.socket_client import CONNECTION_STATUS_CONNECTED, \
CONNECTION_STATUS_DISCONNECTED
_LOGGER.debug("Received cast device connection status: %s",
connection_status.status)
if connection_status.status == CONNECTION_STATUS_DISCONNECTED:
self._available = False
self._invalidate()
self.schedule_update_ha_state()
return
new_available = connection_status.status == CONNECTION_STATUS_CONNECTED
if new_available != self._available:
@@ -0,0 +1,23 @@
{
"config": {
"abort": {
"single_instance_allowed": "Nom\u00e9s es permet una \u00fanica configuraci\u00f3 de MQTT."
},
"error": {
"cannot_connect": "No es pot connectar amb el broker."
},
"step": {
"broker": {
"data": {
"broker": "Broker",
"password": "Contrasenya",
"port": "Port",
"username": "Nom d'usuari"
},
"description": "Introdu\u00efu la informaci\u00f3 de connexi\u00f3 del vostre broker MQTT.",
"title": "MQTT"
}
},
"title": "MQTT"
}
}
@@ -0,0 +1,23 @@
{
"config": {
"abort": {
"single_instance_allowed": "Une seule configuration de MQTT est autoris\u00e9e."
},
"error": {
"cannot_connect": "Impossible de se connecter au broker."
},
"step": {
"broker": {
"data": {
"broker": "Broker",
"password": "Mot de passe",
"port": "Port",
"username": "Nom d'utilisateur"
},
"description": "Veuillez entrer les informations de connexion de votre broker MQTT.",
"title": "MQTT"
}
},
"title": "MQTT"
}
}
@@ -0,0 +1,23 @@
{
"config": {
"abort": {
"single_instance_allowed": "\ud558\ub098\uc758 MQTT \ube0c\ub85c\ucee4\ub9cc \uad6c\uc131\uc774 \uac00\ub2a5\ud569\ub2c8\ub2e4."
},
"error": {
"cannot_connect": "MQTT \ube0c\ub85c\ucee4\uc5d0 \uc5f0\uacb0\ud560 \uc218 \uc5c6\uc74c"
},
"step": {
"broker": {
"data": {
"broker": "\ube0c\ub85c\ucee4",
"password": "\ube44\ubc00\ubc88\ud638",
"port": "\ud3ec\ud2b8",
"username": "\uc0ac\uc6a9\uc790 \uc774\ub984"
},
"description": "MQTT \ube0c\ub85c\ucee4\uc640\uc758 \uc5f0\uacb0 \uc815\ubcf4\ub97c \uc785\ub825\ud558\uc138\uc694.",
"title": "MQTT"
}
},
"title": "MQTT"
}
}
@@ -2,18 +2,22 @@
"config": {
"abort": {
"already_setup": "Vous ne pouvez configurer qu'un seul compte Nest.",
"authorize_url_fail": "Erreur inconnue lors de la g\u00e9n\u00e9ration d'une URL d'autorisation.",
"authorize_url_timeout": "D\u00e9lai de g\u00e9n\u00e9ration de l'URL d'authentification d\u00e9pass\u00e9.",
"no_flows": "Vous devez configurer Nest avant de pouvoir vous authentifier avec celui-ci. [Veuillez lire les instructions] (https://www.home-assistant.io/components/nest/)."
},
"error": {
"internal_error": "Erreur interne lors de la validation du code",
"invalid_code": "Code invalide"
"invalid_code": "Code invalide",
"timeout": "D\u00e9lai de la validation du code expir\u00e9",
"unknown": "Erreur inconnue lors de la validation du code"
},
"step": {
"init": {
"data": {
"flow_impl": "Fournisseur"
},
"description": "S\u00e9lectionnez via quel fournisseur d'authentification vous souhaitez vous authentifier avec Nest.",
"title": "Fournisseur d'authentification"
},
"link": {
@@ -1,6 +1,7 @@
{
"config": {
"error": {
"identifier_exists": "Co\u00f6rdinaten al geregistreerd",
"invalid_api_key": "Ongeldige API-sleutel"
},
"step": {
+1 -1
View File
@@ -182,7 +182,7 @@ class SnmpSensor(Entity):
if value is None:
value = STATE_UNKNOWN
elif self._value_template is not None:
value = self._value_template.render_with_possible_json_value(
value = self._value_template.async_render_with_possible_json_value(
value, STATE_UNKNOWN)
self._state = value
@@ -2,7 +2,7 @@
"config": {
"abort": {
"no_devices_found": "No s'han trobat dispositius Sonos a la xarxa.",
"single_instance_allowed": "Nom\u00e9s cal una \u00fanica configuraci\u00f3 de Sonos."
"single_instance_allowed": "Nom\u00e9s cal una sola configuraci\u00f3 de Sonos."
},
"step": {
"confirm": {
@@ -2,7 +2,7 @@
"config": {
"abort": {
"no_devices_found": "Aucun p\u00e9riph\u00e9rique Sonos trouv\u00e9 sur le r\u00e9seau.",
"single_instance_allowed": "Seulement une seule configuration de Sonos est n\u00e9cessaire."
"single_instance_allowed": "Une seule configuration de Sonos est n\u00e9cessaire."
},
"step": {
"confirm": {
+1 -1
View File
@@ -12,7 +12,7 @@ import voluptuous as vol
from homeassistant import util
from homeassistant.const import (EVENT_HOMEASSISTANT_STOP, __version__)
REQUIREMENTS = ['zeroconf==0.20.0']
REQUIREMENTS = ['zeroconf==0.21.2']
_LOGGER = logging.getLogger(__name__)
+1 -1
View File
@@ -2,7 +2,7 @@
"""Constants used by Home Assistant components."""
MAJOR_VERSION = 0
MINOR_VERSION = 78
PATCH_VERSION = '0b2'
PATCH_VERSION = '2'
__short_version__ = '{}.{}'.format(MAJOR_VERSION, MINOR_VERSION)
__version__ = '{}.{}'.format(__short_version__, PATCH_VERSION)
REQUIRED_PYTHON_VER = (3, 5, 3)
+4 -6
View File
@@ -385,9 +385,6 @@ fritzhome==1.0.4
# homeassistant.components.tts.google
gTTS-token==1.1.1
# homeassistant.components.device_tracker.bluetooth_le_tracker
# gattlib==0.20150805
# homeassistant.components.sensor.gearbest
gearbest_parser==1.0.7
@@ -452,7 +449,7 @@ hole==0.3.0
holidays==0.9.6
# homeassistant.components.frontend
home-assistant-frontend==20180912.0
home-assistant-frontend==20180916.0
# homeassistant.components.homekit_controller
# homekit==0.10
@@ -614,7 +611,7 @@ ndms2_client==0.0.4
netdata==0.1.2
# homeassistant.components.discovery
netdisco==2.0.0
netdisco==2.1.0
# homeassistant.components.sensor.neurio_energy
neurio==0.3.1
@@ -874,6 +871,7 @@ pyfritzhome==0.3.7
# homeassistant.components.ifttt
pyfttt==0.3
# homeassistant.components.device_tracker.bluetooth_le_tracker
# homeassistant.components.sensor.skybeacon
pygatt==3.2.0
@@ -1525,7 +1523,7 @@ youtube_dl==2018.09.10
zengge==0.2
# homeassistant.components.zeroconf
zeroconf==0.20.0
zeroconf==0.21.2
# homeassistant.components.climate.zhong_hong
zhong_hong_hvac==1.0.9
+1 -1
View File
@@ -84,7 +84,7 @@ hbmqtt==0.9.4
holidays==0.9.6
# homeassistant.components.frontend
home-assistant-frontend==20180912.0
home-assistant-frontend==20180916.0
# homeassistant.components.homematicip_cloud
homematicip==0.9.8
-1
View File
@@ -19,7 +19,6 @@ COMMENT_REQUIREMENTS = (
'bluepy',
'opencv-python',
'python-lirc',
'gattlib',
'pyuserinput',
'evdev',
'pycups',