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:
parent
63c15e997a
commit
e1ed076015
4 changed files with 200 additions and 17 deletions
|
@ -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):
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue