Rflink group commands (#5969)

* Add support for group commands (allon/alloff).
Add 'group_aliasses' config attribute that only respond to group commands.
Add nogroup_aliases that only respond to 'on' 'off' commands.
Allow settings device id group behaviour.

* Fix linting.

* Fix lint.
This commit is contained in:
Johan Bloemberg 2017-03-29 07:04:25 +02:00 committed by Paulus Schoutsen
parent 63c15e997a
commit e1ed076015
4 changed files with 200 additions and 17 deletions

View file

@ -20,7 +20,7 @@ from homeassistant.exceptions import HomeAssistantError
import homeassistant.helpers.config_validation as cv
from homeassistant.helpers.entity import Entity
REQUIREMENTS = ['rflink==0.0.28']
REQUIREMENTS = ['rflink==0.0.31']
_LOGGER = logging.getLogger(__name__)
@ -28,6 +28,9 @@ ATTR_EVENT = 'event'
ATTR_STATE = 'state'
CONF_ALIASSES = 'aliasses'
CONF_GROUP_ALIASSES = 'group_aliasses'
CONF_GROUP = 'group'
CONF_NOGROUP_ALIASSES = 'nogroup_aliasses'
CONF_DEVICE_DEFAULTS = 'device_defaults'
CONF_DEVICES = 'devices'
CONF_FIRE_EVENT = 'fire_event'
@ -38,6 +41,7 @@ CONF_WAIT_FOR_ACK = 'wait_for_ack'
DATA_DEVICE_REGISTER = 'rflink_device_register'
DATA_ENTITY_LOOKUP = 'rflink_entity_lookup'
DATA_ENTITY_GROUP_LOOKUP = 'rflink_entity_group_only_lookup'
DEFAULT_RECONNECT_INTERVAL = 10
DEFAULT_SIGNAL_REPETITIONS = 1
CONNECTION_TIMEOUT = 10
@ -48,6 +52,8 @@ EVENT_KEY_ID = 'id'
EVENT_KEY_SENSOR = 'sensor'
EVENT_KEY_UNIT = 'unit'
RFLINK_GROUP_COMMANDS = ['allon', 'alloff']
DOMAIN = 'rflink'
DEVICE_DEFAULTS_SCHEMA = vol.Schema({
@ -94,6 +100,10 @@ def async_setup(hass, config):
EVENT_KEY_COMMAND: defaultdict(list),
EVENT_KEY_SENSOR: defaultdict(list),
}
hass.data[DATA_ENTITY_GROUP_LOOKUP] = {
EVENT_KEY_COMMAND: defaultdict(list),
EVENT_KEY_SENSOR: defaultdict(list),
}
# Allow platform to specify function to register new unknown devices
hass.data[DATA_DEVICE_REGISTER] = {}
@ -116,7 +126,14 @@ def async_setup(hass, config):
# Lookup entities who registered this device id as device id or alias
event_id = event.get('id', None)
entities = hass.data[DATA_ENTITY_LOOKUP][event_type][event_id]
is_group_event = (event_type == EVENT_KEY_COMMAND and
event[EVENT_KEY_COMMAND] in RFLINK_GROUP_COMMANDS)
if is_group_event:
entities = hass.data[DATA_ENTITY_GROUP_LOOKUP][event_type].get(
event_id, [])
else:
entities = hass.data[DATA_ENTITY_LOOKUP][event_type][event_id]
if entities:
# Propagate event to every entity matching the device id
@ -202,8 +219,8 @@ class RflinkDevice(Entity):
platform = None
_state = STATE_UNKNOWN
def __init__(self, device_id, hass, name=None,
aliasses=None, fire_event=False,
def __init__(self, device_id, hass, name=None, aliasses=None, group=True,
group_aliasses=None, nogroup_aliasses=None, fire_event=False,
signal_repetitions=DEFAULT_SIGNAL_REPETITIONS):
"""Initialize the device."""
self.hass = hass
@ -215,12 +232,6 @@ class RflinkDevice(Entity):
else:
self._name = device_id
# Generate list of device_ids to match against
if aliasses:
self._aliasses = aliasses
else:
self._aliasses = []
self._should_fire_event = fire_event
self._signal_repetitions = signal_repetitions
@ -375,9 +386,9 @@ class SwitchableRflinkDevice(RflinkCommand):
self.cancel_queued_send_commands()
command = event['command']
if command == 'on':
if command in ['on', 'allon']:
self._state = True
elif command == 'off':
elif command in ['off', 'alloff']:
self._state = False
def async_turn_on(self, **kwargs):