notify.homematic (#16973)

* Add notify.homematic_signalgen

* Update homematic_signalgen.py, test_homematic_signalgen.py

* Added new files to .coveragerc

* Fixed review comments from houndci-bot

* Fixed pylint errors

* Regenerate requirements_test_all.txt by script/gen_requirements_all.py

* Fix flake8 warnings

* Renamed notify.homematic_signalgen to notify.homematic and made it generic

* Update .coveragerc and requirements_test_all.txt

* Removed the terms signal generator from the sources.
pull/17358/head
Martin Mois 2018-10-12 09:36:52 +02:00 committed by Pascal Vizeli
parent 241d87e9d3
commit cb3d62eeef
5 changed files with 157 additions and 0 deletions

View File

@ -610,6 +610,7 @@ omit =
homeassistant/components/notify/gntp.py
homeassistant/components/notify/group.py
homeassistant/components/notify/hipchat.py
homeassistant/components/notify/homematic.py
homeassistant/components/notify/instapush.py
homeassistant/components/notify/kodi.py
homeassistant/components/notify/lannouncer.py

View File

@ -0,0 +1,74 @@
"""
Notification support for Homematic.
For more details about this platform, please refer to the documentation at
https://home-assistant.io/components/notify.homematic/
"""
import logging
import voluptuous as vol
from homeassistant.components.notify import (
BaseNotificationService, PLATFORM_SCHEMA, ATTR_DATA)
import homeassistant.helpers.config_validation as cv
from homeassistant.components.homematic import (
DOMAIN, SERVICE_SET_DEVICE_VALUE, ATTR_ADDRESS, ATTR_CHANNEL, ATTR_PARAM,
ATTR_VALUE, ATTR_INTERFACE)
import homeassistant.helpers.template as template_helper
_LOGGER = logging.getLogger(__name__)
DEPENDENCIES = ["homematic"]
PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({
vol.Required(ATTR_ADDRESS): vol.All(cv.string, vol.Upper),
vol.Required(ATTR_CHANNEL): vol.Coerce(int),
vol.Required(ATTR_PARAM): vol.All(cv.string, vol.Upper),
vol.Required(ATTR_VALUE): cv.match_all,
vol.Optional(ATTR_INTERFACE): cv.string,
})
def get_service(hass, config, discovery_info=None):
"""Get the Homematic notification service."""
data = {
ATTR_ADDRESS: config[ATTR_ADDRESS],
ATTR_CHANNEL: config[ATTR_CHANNEL],
ATTR_PARAM: config[ATTR_PARAM],
ATTR_VALUE: config[ATTR_VALUE]
}
if ATTR_INTERFACE in config:
data[ATTR_INTERFACE] = config[ATTR_INTERFACE]
return HomematicNotificationService(hass, data)
class HomematicNotificationService(BaseNotificationService):
"""Implement the notification service for Homematic."""
def __init__(self, hass, data):
"""Initialize the service."""
self.hass = hass
self.data = data
def send_message(self, message="", **kwargs):
"""Send a notification to the device."""
attr_data = kwargs.get(ATTR_DATA)
if attr_data is not None:
if 'address' in attr_data:
self.data[ATTR_ADDRESS] = attr_data['address']
if 'channel' in attr_data:
self.data[ATTR_CHANNEL] = attr_data['channel']
if 'param' in attr_data:
self.data[ATTR_PARAM] = attr_data['param']
if 'value' in attr_data:
self.data[ATTR_VALUE] = attr_data['value']
if 'interface' in attr_data:
self.data[ATTR_INTERFACE] = attr_data['interface']
if self.data[ATTR_VALUE] is not None:
templ = template_helper.Template(self.data[ATTR_VALUE], self.hass)
self.data[ATTR_VALUE] = template_helper.render_complex(templ, None)
_LOGGER.debug("Calling service: domain=%s;service=%s;data=%s",
DOMAIN, SERVICE_SET_DEVICE_VALUE, str(self.data))
self.hass.services.call(DOMAIN, SERVICE_SET_DEVICE_VALUE, self.data)

View File

@ -153,6 +153,9 @@ pydeconz==47
# homeassistant.components.zwave
pydispatcher==2.0.5
# homeassistant.components.homematic
pyhomematic==0.1.50
# homeassistant.components.litejet
pylitejet==0.1

View File

@ -76,6 +76,7 @@ TEST_REQUIREMENTS = (
'pyblackbird',
'pydeconz',
'pydispatcher',
'pyhomematic',
'pylitejet',
'pymonoprice',
'pynx584',

View File

@ -0,0 +1,78 @@
"""The tests for the Homematic notification platform."""
import unittest
from homeassistant.setup import setup_component
import homeassistant.components.notify as notify_comp
from tests.common import assert_setup_component, get_test_home_assistant
class TestHomematicNotify(unittest.TestCase):
"""Test the Homematic notifications."""
def setUp(self): # pylint: disable=invalid-name
"""Set up things to be run when tests are started."""
self.hass = get_test_home_assistant()
def tearDown(self): # pylint: disable=invalid-name
"""Stop down everything that was started."""
self.hass.stop()
def test_setup_full(self):
"""Test valid configuration."""
setup_component(self.hass, 'homematic', {
'homematic': {
'hosts': {
'ccu2': {
'host': '127.0.0.1'
}
}
}
})
with assert_setup_component(1) as handle_config:
assert setup_component(self.hass, 'notify', {
'notify': {
'name': 'test',
'platform': 'homematic',
'address': 'NEQXXXXXXX',
'channel': 2,
'param': 'SUBMIT',
'value': '1,1,108000,2',
'interface': 'my-interface'}
})
assert handle_config[notify_comp.DOMAIN]
def test_setup_without_optional(self):
"""Test valid configuration without optional."""
setup_component(self.hass, 'homematic', {
'homematic': {
'hosts': {
'ccu2': {
'host': '127.0.0.1'
}
}
}
})
with assert_setup_component(1) as handle_config:
assert setup_component(self.hass, 'notify', {
'notify': {
'name': 'test',
'platform': 'homematic',
'address': 'NEQXXXXXXX',
'channel': 2,
'param': 'SUBMIT',
'value': '1,1,108000,2'}
})
assert handle_config[notify_comp.DOMAIN]
def test_bad_config(self):
"""Test invalid configuration."""
config = {
notify_comp.DOMAIN: {
'name': 'test',
'platform': 'homematic'
}
}
with assert_setup_component(0) as handle_config:
assert setup_component(self.hass, notify_comp.DOMAIN, config)
assert not handle_config[notify_comp.DOMAIN]