mirror of
https://github.com/home-assistant/core.git
synced 2025-07-16 01:37:08 +00:00
Add should_fire_event in rfxtrx component
This commit is contained in:
parent
3e60c4801c
commit
4bd0db30c9
@ -8,10 +8,16 @@ https://home-assistant.io/components/light.rfxtrx/
|
|||||||
"""
|
"""
|
||||||
import logging
|
import logging
|
||||||
import homeassistant.components.rfxtrx as rfxtrx
|
import homeassistant.components.rfxtrx as rfxtrx
|
||||||
|
import RFXtrx as rfxtrxmod
|
||||||
|
|
||||||
from homeassistant.components.light import Light
|
from homeassistant.components.light import Light
|
||||||
from homeassistant.util import slugify
|
from homeassistant.util import slugify
|
||||||
|
|
||||||
|
from homeassistant.const import ATTR_ENTITY_ID
|
||||||
|
from homeassistant.components.rfxtrx import ATTR_STATE, ATTR_FIREEVENT, ATTR_PACKETID, \
|
||||||
|
ATTR_NAME, EVENT_BUTTON_PRESSED
|
||||||
|
|
||||||
|
|
||||||
DEPENDENCIES = ['rfxtrx']
|
DEPENDENCIES = ['rfxtrx']
|
||||||
|
|
||||||
_LOGGER = logging.getLogger(__name__)
|
_LOGGER = logging.getLogger(__name__)
|
||||||
@ -19,16 +25,22 @@ _LOGGER = logging.getLogger(__name__)
|
|||||||
|
|
||||||
def setup_platform(hass, config, add_devices_callback, discovery_info=None):
|
def setup_platform(hass, config, add_devices_callback, discovery_info=None):
|
||||||
""" Setup the RFXtrx platform. """
|
""" Setup the RFXtrx platform. """
|
||||||
import RFXtrx as rfxtrxmod
|
|
||||||
|
|
||||||
lights = []
|
lights = []
|
||||||
devices = config.get('devices', None)
|
devices = config.get('devices', None)
|
||||||
|
|
||||||
if devices:
|
if devices:
|
||||||
for entity_id, entity_info in devices.items():
|
for entity_id, entity_info in devices.items():
|
||||||
if entity_id not in rfxtrx.RFX_DEVICES:
|
if entity_id not in rfxtrx.RFX_DEVICES:
|
||||||
_LOGGER.info("Add %s rfxtrx.light", entity_info['name'])
|
_LOGGER.info("Add %s rfxtrx.light", entity_info[ATTR_NAME])
|
||||||
rfxobject = rfxtrx.get_rfx_object(entity_info['packetid'])
|
|
||||||
new_light = RfxtrxLight(entity_info['name'], rfxobject, False)
|
# Check if i must fire event
|
||||||
|
fire_event = entity_info.get(ATTR_FIREEVENT, False)
|
||||||
|
datas = {ATTR_STATE: False, ATTR_FIREEVENT: fire_event}
|
||||||
|
|
||||||
|
rfxobject = rfxtrx.get_rfx_object(entity_info[ATTR_PACKETID])
|
||||||
|
new_light = RfxtrxLight(
|
||||||
|
entity_info[ATTR_NAME], rfxobject, datas
|
||||||
|
)
|
||||||
rfxtrx.RFX_DEVICES[entity_id] = new_light
|
rfxtrx.RFX_DEVICES[entity_id] = new_light
|
||||||
lights.append(new_light)
|
lights.append(new_light)
|
||||||
|
|
||||||
@ -54,12 +66,14 @@ def setup_platform(hass, config, add_devices_callback, discovery_info=None):
|
|||||||
)
|
)
|
||||||
pkt_id = "".join("{0:02x}".format(x) for x in event.data)
|
pkt_id = "".join("{0:02x}".format(x) for x in event.data)
|
||||||
entity_name = "%s : %s" % (entity_id, pkt_id)
|
entity_name = "%s : %s" % (entity_id, pkt_id)
|
||||||
new_light = RfxtrxLight(entity_name, event, False)
|
datas = {ATTR_STATE: False, ATTR_FIREEVENT: False}
|
||||||
|
new_light = RfxtrxLight(entity_name, event, datas)
|
||||||
rfxtrx.RFX_DEVICES[entity_id] = new_light
|
rfxtrx.RFX_DEVICES[entity_id] = new_light
|
||||||
add_devices_callback([new_light])
|
add_devices_callback([new_light])
|
||||||
|
|
||||||
# Check if entity exists or previously added automatically
|
# Check if entity exists or previously added automatically
|
||||||
if entity_id in rfxtrx.RFX_DEVICES:
|
if entity_id in rfxtrx.RFX_DEVICES \
|
||||||
|
and isinstance(rfxtrx.RFX_DEVICES[entity_id], RfxtrxLight):
|
||||||
_LOGGER.debug(
|
_LOGGER.debug(
|
||||||
"EntityID: %s light_update. Command: %s",
|
"EntityID: %s light_update. Command: %s",
|
||||||
entity_id,
|
entity_id,
|
||||||
@ -67,10 +81,22 @@ def setup_platform(hass, config, add_devices_callback, discovery_info=None):
|
|||||||
)
|
)
|
||||||
if event.values['Command'] == 'On'\
|
if event.values['Command'] == 'On'\
|
||||||
or event.values['Command'] == 'Off':
|
or event.values['Command'] == 'Off':
|
||||||
if event.values['Command'] == 'On':
|
|
||||||
rfxtrx.RFX_DEVICES[entity_id].turn_on()
|
# Update the rfxtrx device state
|
||||||
else:
|
is_on = event.values['Command'] == 'On'
|
||||||
rfxtrx.RFX_DEVICES[entity_id].turn_off()
|
# pylint: disable=protected-access
|
||||||
|
rfxtrx.RFX_DEVICES[entity_id]._state = is_on
|
||||||
|
rfxtrx.RFX_DEVICES[entity_id].update_ha_state()
|
||||||
|
|
||||||
|
# Fire event
|
||||||
|
if rfxtrx.RFX_DEVICES[entity_id].should_fire_event:
|
||||||
|
rfxtrx.RFX_DEVICES[entity_id].hass.bus.fire(
|
||||||
|
EVENT_BUTTON_PRESSED, {
|
||||||
|
ATTR_ENTITY_ID:
|
||||||
|
rfxtrx.RFX_DEVICES[entity_id].entity_id,
|
||||||
|
ATTR_STATE: event.values['Command'].lower()
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
# Subscribe to main rfxtrx events
|
# Subscribe to main rfxtrx events
|
||||||
if light_update not in rfxtrx.RECEIVED_EVT_SUBSCRIBERS:
|
if light_update not in rfxtrx.RECEIVED_EVT_SUBSCRIBERS:
|
||||||
@ -79,10 +105,11 @@ def setup_platform(hass, config, add_devices_callback, discovery_info=None):
|
|||||||
|
|
||||||
class RfxtrxLight(Light):
|
class RfxtrxLight(Light):
|
||||||
""" Provides a RFXtrx light. """
|
""" Provides a RFXtrx light. """
|
||||||
def __init__(self, name, event, state):
|
def __init__(self, name, event, datas):
|
||||||
self._name = name
|
self._name = name
|
||||||
self._event = event
|
self._event = event
|
||||||
self._state = state
|
self._state = datas[ATTR_STATE]
|
||||||
|
self._should_fire_event = datas[ATTR_FIREEVENT]
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def should_poll(self):
|
def should_poll(self):
|
||||||
@ -94,6 +121,11 @@ class RfxtrxLight(Light):
|
|||||||
""" Returns the name of the light if any. """
|
""" Returns the name of the light if any. """
|
||||||
return self._name
|
return self._name
|
||||||
|
|
||||||
|
@property
|
||||||
|
def should_fire_event(self):
|
||||||
|
""" Returns is the device must fire event"""
|
||||||
|
return self._should_fire_event
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def is_on(self):
|
def is_on(self):
|
||||||
""" True if light is on. """
|
""" True if light is on. """
|
||||||
@ -115,4 +147,4 @@ class RfxtrxLight(Light):
|
|||||||
self._event.device.send_off(rfxtrx.RFXOBJECT.transport)
|
self._event.device.send_off(rfxtrx.RFXOBJECT.transport)
|
||||||
|
|
||||||
self._state = False
|
self._state = False
|
||||||
self.update_ha_state()
|
self.update_ha_state()
|
@ -4,7 +4,7 @@ homeassistant.components.rfxtrx
|
|||||||
Provides support for RFXtrx components.
|
Provides support for RFXtrx components.
|
||||||
|
|
||||||
For more details about this component, please refer to the documentation at
|
For more details about this component, please refer to the documentation at
|
||||||
https://home-assistant.io/components/rfxtrx/
|
https://home-assistant.io/components/rfxtrx.html
|
||||||
"""
|
"""
|
||||||
import logging
|
import logging
|
||||||
from homeassistant.util import slugify
|
from homeassistant.util import slugify
|
||||||
@ -14,8 +14,16 @@ REQUIREMENTS = ['https://github.com/Danielhiversen/pyRFXtrx/archive/0.2.zip' +
|
|||||||
'#RFXtrx==0.2']
|
'#RFXtrx==0.2']
|
||||||
|
|
||||||
DOMAIN = "rfxtrx"
|
DOMAIN = "rfxtrx"
|
||||||
CONF_DEVICE = 'device'
|
|
||||||
CONF_DEBUG = 'debug'
|
ATTR_DEVICE = 'device'
|
||||||
|
ATTR_DEBUG = 'debug'
|
||||||
|
ATTR_STATE = 'state'
|
||||||
|
ATTR_NAME = 'name'
|
||||||
|
ATTR_PACKETID = 'packetid'
|
||||||
|
ATTR_FIREEVENT = 'fire_event'
|
||||||
|
|
||||||
|
EVENT_BUTTON_PRESSED = 'button_pressed'
|
||||||
|
|
||||||
RECEIVED_EVT_SUBSCRIBERS = []
|
RECEIVED_EVT_SUBSCRIBERS = []
|
||||||
RFX_DEVICES = {}
|
RFX_DEVICES = {}
|
||||||
_LOGGER = logging.getLogger(__name__)
|
_LOGGER = logging.getLogger(__name__)
|
||||||
@ -50,15 +58,15 @@ def setup(hass, config):
|
|||||||
# Init the rfxtrx module
|
# Init the rfxtrx module
|
||||||
global RFXOBJECT
|
global RFXOBJECT
|
||||||
|
|
||||||
if CONF_DEVICE not in config[DOMAIN]:
|
if ATTR_DEVICE not in config[DOMAIN]:
|
||||||
_LOGGER.exception(
|
_LOGGER.exception(
|
||||||
"can found device parameter in %s YAML configuration section",
|
"can found device parameter in %s YAML configuration section",
|
||||||
DOMAIN
|
DOMAIN
|
||||||
)
|
)
|
||||||
return False
|
return False
|
||||||
|
|
||||||
device = config[DOMAIN][CONF_DEVICE]
|
device = config[DOMAIN][ATTR_DEVICE]
|
||||||
debug = config[DOMAIN].get(CONF_DEBUG, False)
|
debug = config[DOMAIN].get(ATTR_DEBUG, False)
|
||||||
|
|
||||||
RFXOBJECT = rfxtrxmod.Core(device, handle_receive, debug=debug)
|
RFXOBJECT = rfxtrxmod.Core(device, handle_receive, debug=debug)
|
||||||
|
|
||||||
@ -86,4 +94,4 @@ def get_rfx_object(packetid):
|
|||||||
|
|
||||||
return obj
|
return obj
|
||||||
|
|
||||||
return None
|
return None
|
@ -8,10 +8,16 @@ https://home-assistant.io/components/switch.rfxtrx/
|
|||||||
"""
|
"""
|
||||||
import logging
|
import logging
|
||||||
import homeassistant.components.rfxtrx as rfxtrx
|
import homeassistant.components.rfxtrx as rfxtrx
|
||||||
|
import RFXtrx as rfxtrxmod
|
||||||
|
|
||||||
from homeassistant.components.switch import SwitchDevice
|
from homeassistant.components.switch import SwitchDevice
|
||||||
from homeassistant.util import slugify
|
from homeassistant.util import slugify
|
||||||
|
|
||||||
|
from homeassistant.const import ATTR_ENTITY_ID
|
||||||
|
from homeassistant.components.rfxtrx import ATTR_STATE, ATTR_FIREEVENT, ATTR_PACKETID, \
|
||||||
|
ATTR_NAME, EVENT_BUTTON_PRESSED
|
||||||
|
|
||||||
|
|
||||||
DEPENDENCIES = ['rfxtrx']
|
DEPENDENCIES = ['rfxtrx']
|
||||||
|
|
||||||
_LOGGER = logging.getLogger(__name__)
|
_LOGGER = logging.getLogger(__name__)
|
||||||
@ -19,7 +25,6 @@ _LOGGER = logging.getLogger(__name__)
|
|||||||
|
|
||||||
def setup_platform(hass, config, add_devices_callback, discovery_info=None):
|
def setup_platform(hass, config, add_devices_callback, discovery_info=None):
|
||||||
""" Setup the RFXtrx platform. """
|
""" Setup the RFXtrx platform. """
|
||||||
from RFXtrx import LightingDevice
|
|
||||||
|
|
||||||
# Add switch from config file
|
# Add switch from config file
|
||||||
switchs = []
|
switchs = []
|
||||||
@ -27,9 +32,15 @@ def setup_platform(hass, config, add_devices_callback, discovery_info=None):
|
|||||||
if devices:
|
if devices:
|
||||||
for entity_id, entity_info in devices.items():
|
for entity_id, entity_info in devices.items():
|
||||||
if entity_id not in rfxtrx.RFX_DEVICES:
|
if entity_id not in rfxtrx.RFX_DEVICES:
|
||||||
_LOGGER.info("Add %s rfxtrx.switch", entity_info['name'])
|
_LOGGER.info("Add %s rfxtrx.switch", entity_info[ATTR_NAME])
|
||||||
rfxobject = rfxtrx.get_rfx_object(entity_info['packetid'])
|
|
||||||
newswitch = RfxtrxSwitch(entity_info['name'], rfxobject, False)
|
# Check if i must fire event
|
||||||
|
fire_event = entity_info.get(ATTR_FIREEVENT, False)
|
||||||
|
datas = {ATTR_STATE: False, ATTR_FIREEVENT: fire_event}
|
||||||
|
|
||||||
|
rfxobject = rfxtrx.get_rfx_object(entity_info[ATTR_PACKETID])
|
||||||
|
newswitch = RfxtrxSwitch(
|
||||||
|
entity_info[ATTR_NAME], rfxobject, datas)
|
||||||
rfxtrx.RFX_DEVICES[entity_id] = newswitch
|
rfxtrx.RFX_DEVICES[entity_id] = newswitch
|
||||||
switchs.append(newswitch)
|
switchs.append(newswitch)
|
||||||
|
|
||||||
@ -37,7 +48,7 @@ def setup_platform(hass, config, add_devices_callback, discovery_info=None):
|
|||||||
|
|
||||||
def switch_update(event):
|
def switch_update(event):
|
||||||
""" Callback for sensor updates from the RFXtrx gateway. """
|
""" Callback for sensor updates from the RFXtrx gateway. """
|
||||||
if isinstance(event.device, LightingDevice):
|
if not isinstance(event.device, rfxtrxmod.LightingDevice):
|
||||||
return
|
return
|
||||||
|
|
||||||
# Add entity if not exist and the automatic_add is True
|
# Add entity if not exist and the automatic_add is True
|
||||||
@ -55,12 +66,14 @@ def setup_platform(hass, config, add_devices_callback, discovery_info=None):
|
|||||||
)
|
)
|
||||||
pkt_id = "".join("{0:02x}".format(x) for x in event.data)
|
pkt_id = "".join("{0:02x}".format(x) for x in event.data)
|
||||||
entity_name = "%s : %s" % (entity_id, pkt_id)
|
entity_name = "%s : %s" % (entity_id, pkt_id)
|
||||||
new_switch = RfxtrxSwitch(entity_name, event, False)
|
datas = {ATTR_STATE: False, ATTR_FIREEVENT: False}
|
||||||
|
new_switch = RfxtrxSwitch(entity_name, event, datas)
|
||||||
rfxtrx.RFX_DEVICES[entity_id] = new_switch
|
rfxtrx.RFX_DEVICES[entity_id] = new_switch
|
||||||
add_devices_callback([new_switch])
|
add_devices_callback([new_switch])
|
||||||
|
|
||||||
# Check if entity exists or previously added automatically
|
# Check if entity exists or previously added automatically
|
||||||
if entity_id in rfxtrx.RFX_DEVICES:
|
if entity_id in rfxtrx.RFX_DEVICES \
|
||||||
|
and isinstance(rfxtrx.RFX_DEVICES[entity_id], RfxtrxSwitch):
|
||||||
_LOGGER.debug(
|
_LOGGER.debug(
|
||||||
"EntityID: %s switch_update. Command: %s",
|
"EntityID: %s switch_update. Command: %s",
|
||||||
entity_id,
|
entity_id,
|
||||||
@ -68,10 +81,22 @@ def setup_platform(hass, config, add_devices_callback, discovery_info=None):
|
|||||||
)
|
)
|
||||||
if event.values['Command'] == 'On'\
|
if event.values['Command'] == 'On'\
|
||||||
or event.values['Command'] == 'Off':
|
or event.values['Command'] == 'Off':
|
||||||
if event.values['Command'] == 'On':
|
|
||||||
rfxtrx.RFX_DEVICES[entity_id].turn_on()
|
# Update the rfxtrx device state
|
||||||
else:
|
is_on = event.values['Command'] == 'On'
|
||||||
rfxtrx.RFX_DEVICES[entity_id].turn_off()
|
# pylint: disable=protected-access
|
||||||
|
rfxtrx.RFX_DEVICES[entity_id]._state = is_on
|
||||||
|
rfxtrx.RFX_DEVICES[entity_id].update_ha_state()
|
||||||
|
|
||||||
|
# Fire event
|
||||||
|
if rfxtrx.RFX_DEVICES[entity_id].should_fire_event:
|
||||||
|
rfxtrx.RFX_DEVICES[entity_id].hass.bus.fire(
|
||||||
|
EVENT_BUTTON_PRESSED, {
|
||||||
|
ATTR_ENTITY_ID:
|
||||||
|
rfxtrx.RFX_DEVICES[entity_id].entity_id,
|
||||||
|
ATTR_STATE: event.values['Command'].lower()
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
# Subscribe to main rfxtrx events
|
# Subscribe to main rfxtrx events
|
||||||
if switch_update not in rfxtrx.RECEIVED_EVT_SUBSCRIBERS:
|
if switch_update not in rfxtrx.RECEIVED_EVT_SUBSCRIBERS:
|
||||||
@ -80,10 +105,11 @@ def setup_platform(hass, config, add_devices_callback, discovery_info=None):
|
|||||||
|
|
||||||
class RfxtrxSwitch(SwitchDevice):
|
class RfxtrxSwitch(SwitchDevice):
|
||||||
""" Provides a RFXtrx switch. """
|
""" Provides a RFXtrx switch. """
|
||||||
def __init__(self, name, event, state):
|
def __init__(self, name, event, datas):
|
||||||
self._name = name
|
self._name = name
|
||||||
self._event = event
|
self._event = event
|
||||||
self._state = state
|
self._state = datas[ATTR_STATE]
|
||||||
|
self._should_fire_event = datas[ATTR_FIREEVENT]
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def should_poll(self):
|
def should_poll(self):
|
||||||
@ -95,9 +121,14 @@ class RfxtrxSwitch(SwitchDevice):
|
|||||||
""" Returns the name of the device if any. """
|
""" Returns the name of the device if any. """
|
||||||
return self._name
|
return self._name
|
||||||
|
|
||||||
|
@property
|
||||||
|
def should_fire_event(self):
|
||||||
|
""" Returns is the device must fire event"""
|
||||||
|
return self._should_fire_event
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def is_on(self):
|
def is_on(self):
|
||||||
""" True if device is on. """
|
""" True if light is on. """
|
||||||
return self._state
|
return self._state
|
||||||
|
|
||||||
def turn_on(self, **kwargs):
|
def turn_on(self, **kwargs):
|
||||||
@ -114,4 +145,4 @@ class RfxtrxSwitch(SwitchDevice):
|
|||||||
self._event.device.send_off(rfxtrx.RFXOBJECT.transport)
|
self._event.device.send_off(rfxtrx.RFXOBJECT.transport)
|
||||||
|
|
||||||
self._state = False
|
self._state = False
|
||||||
self.update_ha_state()
|
self.update_ha_state()
|
Loading…
x
Reference in New Issue
Block a user