Fix avoid event bus for updates

This commit is contained in:
MartinHjelmare 2015-12-24 02:14:58 +01:00
parent 77959341a3
commit be25ea4f09
3 changed files with 43 additions and 99 deletions

View File

@ -26,23 +26,6 @@ mysensors:
debug: true debug: true
persistence: true persistence: true
version: '1.5' version: '1.5'
mysensors:
port:
- '/dev/ttyUSB0'
- '/dev/ttyACM1'
debug: true
persistence: true
persistence_file:
- 'path/to/.homeassistant/mysensors.json'
- 'path/to/.homeassistant/mysensors2.json'
version: '1.5'
sensor:
platform: mysensors
switch:
platform: mysensors
""" """
import logging import logging
@ -70,11 +53,8 @@ REQUIREMENTS = [
'https://github.com/theolind/pymysensors/archive/' 'https://github.com/theolind/pymysensors/archive/'
'2aa8f32908e8c5bb3e5c77c5851db778f8635792.zip#pymysensors==0.3'] '2aa8f32908e8c5bb3e5c77c5851db778f8635792.zip#pymysensors==0.3']
_LOGGER = logging.getLogger(__name__) _LOGGER = logging.getLogger(__name__)
ATTR_PORT = 'port'
ATTR_DEVICES = 'devices'
ATTR_NODE_ID = 'node_id' ATTR_NODE_ID = 'node_id'
ATTR_CHILD_ID = 'child_id' ATTR_CHILD_ID = 'child_id'
ATTR_UPDATE_TYPE = 'update_type'
COMPONENTS_WITH_MYSENSORS_PLATFORM = [ COMPONENTS_WITH_MYSENSORS_PLATFORM = [
'sensor', 'sensor',
@ -84,11 +64,11 @@ COMPONENTS_WITH_MYSENSORS_PLATFORM = [
IS_METRIC = None IS_METRIC = None
CONST = None CONST = None
GATEWAYS = None GATEWAYS = None
EVENT_MYSENSORS_NODE_UPDATE = 'MYSENSORS_NODE_UPDATE'
def setup(hass, config): def setup(hass, config):
"""Setup the MySensors component.""" """Setup the MySensors component."""
# pylint: disable=too-many-locals
import mysensors.mysensors as mysensors import mysensors.mysensors as mysensors
if not validate_config(config, if not validate_config(config,
@ -119,18 +99,17 @@ def setup(hass, config):
if not bootstrap.setup_component(hass, component, mysensors_config): if not bootstrap.setup_component(hass, component, mysensors_config):
return False return False
def callback_factory(port, devices): import homeassistant.components.sensor.mysensors as mysensors_sensor
import homeassistant.components.switch.mysensors as mysensors_switch
def callback_factory(gateway, port, devices):
"""Return a new callback function. Run once per gateway setup.""" """Return a new callback function. Run once per gateway setup."""
def node_update(update_type, nid): def node_update(update_type, nid):
"""Callback for node updates from the MySensors gateway.""" """Callback for node updates from the MySensors gateway."""
_LOGGER.info('update %s: node %s', update_type, nid) _LOGGER.info('update %s: node %s', update_type, nid)
hass.bus.fire(EVENT_MYSENSORS_NODE_UPDATE, { mysensors_sensor.sensor_update(gateway, port, devices, nid)
ATTR_PORT: port, mysensors_switch.sensor_update(gateway, port, devices, nid)
ATTR_DEVICES: devices,
ATTR_UPDATE_TYPE: update_type,
ATTR_NODE_ID: nid
})
return node_update return node_update
@ -141,7 +120,7 @@ def setup(hass, config):
persistence=persistence, persistence=persistence,
persistence_file=persistence_file, persistence_file=persistence_file,
protocol_version=VERSION) protocol_version=VERSION)
gateway.event_callback = callback_factory(port, devices) gateway.event_callback = callback_factory(gateway, port, devices)
gateway.metric = IS_METRIC gateway.metric = IS_METRIC
gateway.debug = config[DOMAIN].get(CONF_DEBUG, False) gateway.debug = config[DOMAIN].get(CONF_DEBUG, False)
gateway.start() gateway.start()
@ -212,18 +191,3 @@ def mysensors_update(platform_type):
node[child_id][value_type].update_sensor( node[child_id][value_type].update_sensor(
child.values, gateway.sensors[nid].battery_level) child.values, gateway.sensors[nid].battery_level)
return wrapper return wrapper
def event_update(update):
"""Decorator for callback function for mysensor event updates."""
def wrapper(event):
"""Wrapper function in the decorator."""
_LOGGER.info(
'update %s: node %s', event.data[ATTR_UPDATE_TYPE],
event.data[ATTR_NODE_ID])
sensor_update = update(event)
sensor_update(GATEWAYS[event.data[ATTR_PORT]],
event.data[ATTR_PORT],
event.data[ATTR_DEVICES],
event.data[ATTR_NODE_ID])
return wrapper

View File

@ -20,11 +20,24 @@ import homeassistant.components.mysensors as mysensors
_LOGGER = logging.getLogger(__name__) _LOGGER = logging.getLogger(__name__)
DEPENDENCIES = [] DEPENDENCIES = []
ADD_DEVICES = None
S_TYPES = None
V_TYPES = None
@mysensors.mysensors_update
def sensor_update(gateway, port, devices, nid):
"""Internal callback for sensor updates."""
return (S_TYPES, V_TYPES, MySensorsSensor, ADD_DEVICES)
def setup_platform(hass, config, add_devices, discovery_info=None): def setup_platform(hass, config, add_devices, discovery_info=None):
"""Setup the mysensors platform for sensors.""" """Setup the mysensors platform for sensors."""
# Define the S_TYPES and V_TYPES that the platform should handle as states. # Define the S_TYPES and V_TYPES that the platform should handle as states.
s_types = [ global ADD_DEVICES
ADD_DEVICES = add_devices
global S_TYPES
S_TYPES = [
mysensors.CONST.Presentation.S_TEMP, mysensors.CONST.Presentation.S_TEMP,
mysensors.CONST.Presentation.S_HUM, mysensors.CONST.Presentation.S_HUM,
mysensors.CONST.Presentation.S_BARO, mysensors.CONST.Presentation.S_BARO,
@ -48,26 +61,15 @@ def setup_platform(hass, config, add_devices, discovery_info=None):
mysensors.CONST.SetReq.V_LOCK_STATUS, mysensors.CONST.SetReq.V_LOCK_STATUS,
] ]
if float(mysensors.VERSION) >= 1.5: if float(mysensors.VERSION) >= 1.5:
s_types.extend([ S_TYPES.extend([
mysensors.CONST.Presentation.S_COLOR_SENSOR, mysensors.CONST.Presentation.S_COLOR_SENSOR,
mysensors.CONST.Presentation.S_MULTIMETER, mysensors.CONST.Presentation.S_MULTIMETER,
]) ])
not_v_types.extend([mysensors.CONST.SetReq.V_STATUS, ]) not_v_types.extend([mysensors.CONST.SetReq.V_STATUS, ])
v_types = [member for member in mysensors.CONST.SetReq global V_TYPES
V_TYPES = [member for member in mysensors.CONST.SetReq
if member.value not in not_v_types] if member.value not in not_v_types]
@mysensors.mysensors_update
def _sensor_update(gateway, port, devices, nid):
"""Internal callback for sensor updates."""
return (s_types, v_types, MySensorsSensor, add_devices)
@mysensors.event_update
def event_update(event):
"""Callback for event updates from the MySensors component."""
return _sensor_update
hass.bus.listen(mysensors.EVENT_MYSENSORS_NODE_UPDATE, event_update)
class MySensorsSensor(Entity): class MySensorsSensor(Entity):
"""Represent the value of a MySensors child node.""" """Represent the value of a MySensors child node."""
@ -101,18 +103,6 @@ class MySensorsSensor(Entity):
self.battery_level = 0 self.battery_level = 0
self._values = {} self._values = {}
def as_dict(self):
"""Return a dict representation of this entity."""
return {
'port': self.port,
'name': self._name,
'node_id': self.node_id,
'child_id': self.child_id,
'battery_level': self.battery_level,
'value_type': self.value_type,
'values': self._values,
}
@property @property
def should_poll(self): def should_poll(self):
"""MySensor gateway pushes its state to HA.""" """MySensor gateway pushes its state to HA."""

View File

@ -19,11 +19,24 @@ import homeassistant.components.mysensors as mysensors
_LOGGER = logging.getLogger(__name__) _LOGGER = logging.getLogger(__name__)
DEPENDENCIES = [] DEPENDENCIES = []
ADD_DEVICES = None
S_TYPES = None
V_TYPES = None
@mysensors.mysensors_update
def sensor_update(gateway, port, devices, nid):
"""Internal callback for sensor updates."""
return (S_TYPES, V_TYPES, MySensorsSwitch, ADD_DEVICES)
def setup_platform(hass, config, add_devices, discovery_info=None): def setup_platform(hass, config, add_devices, discovery_info=None):
"""Setup the mysensors platform for switches.""" """Setup the mysensors platform for switches."""
# Define the S_TYPES and V_TYPES that the platform should handle as states. # Define the S_TYPES and V_TYPES that the platform should handle as states.
s_types = [ global ADD_DEVICES
ADD_DEVICES = add_devices
global S_TYPES
S_TYPES = [
mysensors.CONST.Presentation.S_DOOR, mysensors.CONST.Presentation.S_DOOR,
mysensors.CONST.Presentation.S_MOTION, mysensors.CONST.Presentation.S_MOTION,
mysensors.CONST.Presentation.S_SMOKE, mysensors.CONST.Presentation.S_SMOKE,
@ -31,32 +44,21 @@ def setup_platform(hass, config, add_devices, discovery_info=None):
mysensors.CONST.Presentation.S_BINARY, mysensors.CONST.Presentation.S_BINARY,
mysensors.CONST.Presentation.S_LOCK, mysensors.CONST.Presentation.S_LOCK,
] ]
v_types = [ global V_TYPES
V_TYPES = [
mysensors.CONST.SetReq.V_ARMED, mysensors.CONST.SetReq.V_ARMED,
mysensors.CONST.SetReq.V_LIGHT, mysensors.CONST.SetReq.V_LIGHT,
mysensors.CONST.SetReq.V_LOCK_STATUS, mysensors.CONST.SetReq.V_LOCK_STATUS,
] ]
if float(mysensors.VERSION) >= 1.5: if float(mysensors.VERSION) >= 1.5:
s_types.extend([ S_TYPES.extend([
mysensors.CONST.Presentation.S_SPRINKLER, mysensors.CONST.Presentation.S_SPRINKLER,
mysensors.CONST.Presentation.S_WATER_LEAK, mysensors.CONST.Presentation.S_WATER_LEAK,
mysensors.CONST.Presentation.S_SOUND, mysensors.CONST.Presentation.S_SOUND,
mysensors.CONST.Presentation.S_VIBRATION, mysensors.CONST.Presentation.S_VIBRATION,
mysensors.CONST.Presentation.S_MOISTURE, mysensors.CONST.Presentation.S_MOISTURE,
]) ])
v_types.extend([mysensors.CONST.SetReq.V_STATUS, ]) V_TYPES.extend([mysensors.CONST.SetReq.V_STATUS, ])
@mysensors.mysensors_update
def _sensor_update(gateway, port, devices, nid):
"""Internal callback for sensor updates."""
return (s_types, v_types, MySensorsSwitch, add_devices)
@mysensors.event_update
def event_update(event):
"""Callback for event updates from the MySensors component."""
return _sensor_update
hass.bus.listen(mysensors.EVENT_MYSENSORS_NODE_UPDATE, event_update)
class MySensorsSwitch(SwitchDevice): class MySensorsSwitch(SwitchDevice):
@ -91,18 +93,6 @@ class MySensorsSwitch(SwitchDevice):
self.battery_level = 0 self.battery_level = 0
self._values = {} self._values = {}
def as_dict(self):
"""Return a dict representation of this entity."""
return {
'port': self.port,
'name': self._name,
'node_id': self.node_id,
'child_id': self.child_id,
'battery_level': self.battery_level,
'value_type': self.value_type,
'values': self._values,
}
@property @property
def should_poll(self): def should_poll(self):
"""MySensor gateway pushes its state to HA.""" """MySensor gateway pushes its state to HA."""