From 9744ec584ad765e1b5724bd964e35c1a68a6658a Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Sun, 16 Apr 2017 14:59:15 -0700 Subject: [PATCH 1/5] Version bump to 0.42.4 --- homeassistant/const.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/homeassistant/const.py b/homeassistant/const.py index e75dd5a2125..65b15797380 100644 --- a/homeassistant/const.py +++ b/homeassistant/const.py @@ -2,7 +2,7 @@ """Constants used by Home Assistant components.""" MAJOR_VERSION = 0 MINOR_VERSION = 42 -PATCH_VERSION = '3' +PATCH_VERSION = '4' __short_version__ = '{}.{}'.format(MAJOR_VERSION, MINOR_VERSION) __version__ = '{}.{}'.format(__short_version__, PATCH_VERSION) REQUIRED_PYTHON_VER = (3, 4, 2) From 1efa6eaf0f563aa7144031057f14fdfd55708d88 Mon Sep 17 00:00:00 2001 From: Martin Hjelmare Date: Wed, 12 Apr 2017 04:17:09 +0200 Subject: [PATCH 2/5] Fix mysensors callback (#7057) * Fix mysensors callback * All messages was not triggering proper updates. Fix by checking all child value types each update. * Upgrade mysensors dep * Fix pickle persistence when upgrading. --- .../components/device_tracker/mysensors.py | 54 +++++++++--------- homeassistant/components/mysensors.py | 56 +++++++++---------- requirements_all.txt | 2 +- 3 files changed, 56 insertions(+), 56 deletions(-) diff --git a/homeassistant/components/device_tracker/mysensors.py b/homeassistant/components/device_tracker/mysensors.py index e1a16a017e4..04801f834df 100644 --- a/homeassistant/components/device_tracker/mysensors.py +++ b/homeassistant/components/device_tracker/mysensors.py @@ -20,37 +20,39 @@ def setup_scanner(hass, config, see, discovery_info=None): """Callback for mysensors platform.""" node = gateway.sensors[msg.node_id] if node.sketch_name is None: - _LOGGER.info('No sketch_name: node %s', msg.node_id) + _LOGGER.debug('No sketch_name: node %s', msg.node_id) return pres = gateway.const.Presentation set_req = gateway.const.SetReq - for child in node.children.values(): - position = child.values.get(set_req.V_POSITION) - if child.type != pres.S_GPS or position is None: - continue - try: - latitude, longitude, _ = position.split(',') - except ValueError: - _LOGGER.error('Payload for V_POSITION %s is not of format ' - 'latitude,longitude,altitude', position) - continue - name = '{} {} {}'.format( - node.sketch_name, msg.node_id, child.id) - attr = { - mysensors.ATTR_CHILD_ID: child.id, - mysensors.ATTR_DESCRIPTION: child.description, - mysensors.ATTR_DEVICE: gateway.device, - mysensors.ATTR_NODE_ID: msg.node_id, - } - see( - dev_id=slugify(name), - host_name=name, - gps=(latitude, longitude), - battery=node.battery_level, - attributes=attr - ) + child = node.children.get(msg.child_id) + if child is None: + return + position = child.values.get(set_req.V_POSITION) + if child.type != pres.S_GPS or position is None: + return + try: + latitude, longitude, _ = position.split(',') + except ValueError: + _LOGGER.error('Payload for V_POSITION %s is not of format ' + 'latitude,longitude,altitude', position) + return + name = '{} {} {}'.format( + node.sketch_name, msg.node_id, child.id) + attr = { + mysensors.ATTR_CHILD_ID: child.id, + mysensors.ATTR_DESCRIPTION: child.description, + mysensors.ATTR_DEVICE: gateway.device, + mysensors.ATTR_NODE_ID: msg.node_id, + } + see( + dev_id=slugify(name), + host_name=name, + gps=(latitude, longitude), + battery=node.battery_level, + attributes=attr + ) gateways = hass.data.get(mysensors.MYSENSORS_GATEWAYS) diff --git a/homeassistant/components/mysensors.py b/homeassistant/components/mysensors.py index afe5fc11762..dbf66c2288b 100644 --- a/homeassistant/components/mysensors.py +++ b/homeassistant/components/mysensors.py @@ -46,7 +46,7 @@ MYSENSORS_GATEWAYS = 'mysensors_gateways' MQTT_COMPONENT = 'mqtt' REQUIREMENTS = [ 'https://github.com/theolind/pymysensors/archive/' - 'ff3476b70edc9c995b939cddb9d51f8d2d018581.zip#pymysensors==0.9.0'] + 'c6990eaaa741444a638608e6e00488195e2ca74c.zip#pymysensors==0.9.1'] def is_socket_address(value): @@ -206,12 +206,9 @@ def setup(hass, config): for node_id in gateway.sensors: node = gateway.sensors[node_id] for child_id in node.children: - child = node.children[child_id] - for value_type in child.values: - msg = mysensors.Message().modify( - node_id=node_id, child_id=child_id, type=1, - sub_type=value_type) - gateway.event_callback(msg) + msg = mysensors.Message().modify( + node_id=node_id, child_id=child_id) + gateway.event_callback(msg) gateway.start() hass.bus.listen_once(EVENT_HOMEASSISTANT_STOP, lambda event: gateway.stop()) @@ -274,32 +271,33 @@ def pf_callback_factory(map_sv_types, devices, entity_class, add_devices=None): _LOGGER.debug('No sketch_name: node %s', msg.node_id) return child = gateway.sensors[msg.node_id].children.get(msg.child_id) - if child is None or child.values.get(msg.sub_type) is None: + if child is None: return - key = msg.node_id, child.id, msg.sub_type - if child.type not in map_sv_types or \ - msg.sub_type not in map_sv_types[child.type]: - return - if key in devices: + for value_type in child.values: + key = msg.node_id, child.id, value_type + if child.type not in map_sv_types or \ + value_type not in map_sv_types[child.type]: + continue + if key in devices: + if add_devices: + devices[key].schedule_update_ha_state(True) + else: + devices[key].update() + continue + name = '{} {} {}'.format( + gateway.sensors[msg.node_id].sketch_name, msg.node_id, + child.id) + if isinstance(entity_class, dict): + device_class = entity_class[child.type] + else: + device_class = entity_class + devices[key] = device_class( + gateway, msg.node_id, child.id, name, value_type) if add_devices: - devices[key].schedule_update_ha_state(True) + _LOGGER.info('Adding new devices: %s', [devices[key]]) + add_devices([devices[key]], True) else: devices[key].update() - return - name = '{} {} {}'.format( - gateway.sensors[msg.node_id].sketch_name, msg.node_id, - child.id) - if isinstance(entity_class, dict): - device_class = entity_class[child.type] - else: - device_class = entity_class - devices[key] = device_class( - gateway, msg.node_id, child.id, name, msg.sub_type) - if add_devices: - _LOGGER.info('Adding new devices: %s', [devices[key]]) - add_devices([devices[key]], True) - else: - devices[key].update() return mysensors_callback diff --git a/requirements_all.txt b/requirements_all.txt index 07712308235..07088f8407c 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -314,7 +314,7 @@ https://github.com/tfriedel/python-lightify/archive/d6eadcf311e6e21746182d1480e9 https://github.com/thecynic/pylutron/archive/v0.1.0.zip#pylutron==0.1.0 # homeassistant.components.mysensors -https://github.com/theolind/pymysensors/archive/ff3476b70edc9c995b939cddb9d51f8d2d018581.zip#pymysensors==0.9.0 +https://github.com/theolind/pymysensors/archive/c6990eaaa741444a638608e6e00488195e2ca74c.zip#pymysensors==0.9.1 # homeassistant.components.sensor.modem_callerid https://github.com/vroomfonde1/basicmodem/archive/0.7.zip#basicmodem==0.7 From 904b0175525c45b43f70f54660f7bccf1bfee9e7 Mon Sep 17 00:00:00 2001 From: Fabian Affolter Date: Sat, 15 Apr 2017 00:18:39 +0200 Subject: [PATCH 3/5] Upgrade aiohttp to 2.0.7 (#7106) --- homeassistant/package_constraints.txt | 2 +- requirements_all.txt | 2 +- setup.py | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/homeassistant/package_constraints.txt b/homeassistant/package_constraints.txt index a8e8df3d250..343e17ff7b5 100644 --- a/homeassistant/package_constraints.txt +++ b/homeassistant/package_constraints.txt @@ -5,5 +5,5 @@ pip>=7.1.0 jinja2>=2.9.5 voluptuous==0.9.3 typing>=3,<4 -aiohttp==2.0.5 +aiohttp==2.0.7 async_timeout==1.2.0 diff --git a/requirements_all.txt b/requirements_all.txt index 07088f8407c..b0d909f74a6 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -6,7 +6,7 @@ pip>=7.1.0 jinja2>=2.9.5 voluptuous==0.9.3 typing>=3,<4 -aiohttp==2.0.5 +aiohttp==2.0.7 async_timeout==1.2.0 # homeassistant.components.nuimo_controller diff --git a/setup.py b/setup.py index cdc4c43e7a2..161484d1f83 100755 --- a/setup.py +++ b/setup.py @@ -22,7 +22,7 @@ REQUIRES = [ 'jinja2>=2.9.5', 'voluptuous==0.9.3', 'typing>=3,<4', - 'aiohttp==2.0.5', + 'aiohttp==2.0.7', 'async_timeout==1.2.0', ] From fadd33bcb2c958e46f911fec633a7c5cb80d85b4 Mon Sep 17 00:00:00 2001 From: Robbie Trencheny Date: Sun, 16 Apr 2017 14:53:03 -0700 Subject: [PATCH 4/5] Make version number optional and a string to fix identify issue introduced in iOS 1.0.1 (#7141) --- homeassistant/components/ios.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/homeassistant/components/ios.py b/homeassistant/components/ios.py index 22f8b832b3d..c5ffc34864c 100644 --- a/homeassistant/components/ios.py +++ b/homeassistant/components/ios.py @@ -138,7 +138,7 @@ IDENTIFY_DEVICE_SCHEMA_CONTAINER = vol.All(dict, IDENTIFY_DEVICE_SCHEMA) IDENTIFY_APP_SCHEMA = vol.Schema({ vol.Required(ATTR_APP_BUNDLE_IDENTIFER): cv.string, vol.Required(ATTR_APP_BUILD_NUMBER): cv.positive_int, - vol.Required(ATTR_APP_VERSION_NUMBER): cv.positive_int + vol.Optional(ATTR_APP_VERSION_NUMBER): cv.string }, extra=vol.ALLOW_EXTRA) IDENTIFY_APP_SCHEMA_CONTAINER = vol.All(dict, IDENTIFY_APP_SCHEMA) From 527223b99242017b237959c652120b1b24169dcc Mon Sep 17 00:00:00 2001 From: Adam Mills Date: Sun, 16 Apr 2017 18:06:59 -0400 Subject: [PATCH 5/5] Fix for zwave RGB setting (#7137) --- homeassistant/components/light/zwave.py | 16 +++++----- tests/components/light/test_zwave.py | 42 ++++++++++++------------- 2 files changed, 29 insertions(+), 29 deletions(-) diff --git a/homeassistant/components/light/zwave.py b/homeassistant/components/light/zwave.py index 45660474fde..ce85276cae9 100644 --- a/homeassistant/components/light/zwave.py +++ b/homeassistant/components/light/zwave.py @@ -310,25 +310,25 @@ class ZwaveColorLight(ZwaveDimmer): if self._zw098: if kwargs[ATTR_COLOR_TEMP] > TEMP_MID_HASS: self._ct = TEMP_WARM_HASS - rgbw = b'#000000ff00' + rgbw = '#000000ff00' else: self._ct = TEMP_COLD_HASS - rgbw = b'#00000000ff' + rgbw = '#00000000ff' elif ATTR_RGB_COLOR in kwargs: self._rgb = kwargs[ATTR_RGB_COLOR] if (not self._zw098 and ( self._color_channels & COLOR_CHANNEL_WARM_WHITE or self._color_channels & COLOR_CHANNEL_COLD_WHITE)): - rgbw = b'#' + rgbw = '#' for colorval in color_rgb_to_rgbw(*self._rgb): - rgbw += format(colorval, '02x').encode('utf-8') - rgbw += b'00' + rgbw += format(colorval, '02x') + rgbw += '00' else: - rgbw = b'#' + rgbw = '#' for colorval in self._rgb: - rgbw += format(colorval, '02x').encode('utf-8') - rgbw += b'0000' + rgbw += format(colorval, '02x') + rgbw += '0000' if rgbw and self.values.color: self.values.color.data = rgbw diff --git a/tests/components/light/test_zwave.py b/tests/components/light/test_zwave.py index 0afe9ec8f6a..9629744bc16 100644 --- a/tests/components/light/test_zwave.py +++ b/tests/components/light/test_zwave.py @@ -207,36 +207,36 @@ def test_set_rgb_color(mock_openzwave): """Test setting zwave light color.""" node = MockNode(command_classes=[const.COMMAND_CLASS_SWITCH_COLOR]) value = MockValue(data=0, node=node) - color = MockValue(data=b'#0000000000', node=node) + color = MockValue(data='#0000000000', node=node) # Suppoorts RGB only color_channels = MockValue(data=0x1c, node=node) values = MockLightValues(primary=value, color=color, color_channels=color_channels) device = zwave.get_device(node=node, values=values, node_config={}) - assert color.data == b'#0000000000' + assert color.data == '#0000000000' device.turn_on(**{ATTR_RGB_COLOR: (200, 150, 100)}) - assert color.data == b'#c896640000' + assert color.data == '#c896640000' def test_set_rgbw_color(mock_openzwave): """Test setting zwave light color.""" node = MockNode(command_classes=[const.COMMAND_CLASS_SWITCH_COLOR]) value = MockValue(data=0, node=node) - color = MockValue(data=b'#0000000000', node=node) + color = MockValue(data='#0000000000', node=node) # Suppoorts RGBW color_channels = MockValue(data=0x1d, node=node) values = MockLightValues(primary=value, color=color, color_channels=color_channels) device = zwave.get_device(node=node, values=values, node_config={}) - assert color.data == b'#0000000000' + assert color.data == '#0000000000' device.turn_on(**{ATTR_RGB_COLOR: (200, 150, 100)}) - assert color.data == b'#c86400c800' + assert color.data == '#c86400c800' def test_zw098_set_color_temp(mock_openzwave): @@ -244,29 +244,29 @@ def test_zw098_set_color_temp(mock_openzwave): node = MockNode(manufacturer_id='0086', product_id='0062', command_classes=[const.COMMAND_CLASS_SWITCH_COLOR]) value = MockValue(data=0, node=node) - color = MockValue(data=b'#0000000000', node=node) + color = MockValue(data='#0000000000', node=node) # Suppoorts RGB, warm white, cold white color_channels = MockValue(data=0x1f, node=node) values = MockLightValues(primary=value, color=color, color_channels=color_channels) device = zwave.get_device(node=node, values=values, node_config={}) - assert color.data == b'#0000000000' + assert color.data == '#0000000000' device.turn_on(**{ATTR_COLOR_TEMP: 200}) - assert color.data == b'#00000000ff' + assert color.data == '#00000000ff' device.turn_on(**{ATTR_COLOR_TEMP: 400}) - assert color.data == b'#000000ff00' + assert color.data == '#000000ff00' def test_rgb_not_supported(mock_openzwave): """Test value changed for rgb lights.""" node = MockNode(command_classes=[const.COMMAND_CLASS_SWITCH_COLOR]) value = MockValue(data=0, node=node) - color = MockValue(data=b'#0000000000', node=node) + color = MockValue(data='#0000000000', node=node) # Suppoorts color temperature only color_channels = MockValue(data=0x01, node=node) values = MockLightValues(primary=value, color=color, @@ -290,7 +290,7 @@ def test_no_color_channels_value(mock_openzwave): """Test value changed for rgb lights.""" node = MockNode(command_classes=[const.COMMAND_CLASS_SWITCH_COLOR]) value = MockValue(data=0, node=node) - color = MockValue(data=b'#0000000000', node=node) + color = MockValue(data='#0000000000', node=node) values = MockLightValues(primary=value, color=color) device = zwave.get_device(node=node, values=values, node_config={}) @@ -301,7 +301,7 @@ def test_rgb_value_changed(mock_openzwave): """Test value changed for rgb lights.""" node = MockNode(command_classes=[const.COMMAND_CLASS_SWITCH_COLOR]) value = MockValue(data=0, node=node) - color = MockValue(data=b'#0000000000', node=node) + color = MockValue(data='#0000000000', node=node) # Suppoorts RGB only color_channels = MockValue(data=0x1c, node=node) values = MockLightValues(primary=value, color=color, @@ -310,7 +310,7 @@ def test_rgb_value_changed(mock_openzwave): assert device.rgb_color == [0, 0, 0] - color.data = b'#c896640000' + color.data = '#c896640000' value_changed(color) assert device.rgb_color == [200, 150, 100] @@ -320,7 +320,7 @@ def test_rgbww_value_changed(mock_openzwave): """Test value changed for rgb lights.""" node = MockNode(command_classes=[const.COMMAND_CLASS_SWITCH_COLOR]) value = MockValue(data=0, node=node) - color = MockValue(data=b'#0000000000', node=node) + color = MockValue(data='#0000000000', node=node) # Suppoorts RGB, Warm White color_channels = MockValue(data=0x1d, node=node) values = MockLightValues(primary=value, color=color, @@ -329,7 +329,7 @@ def test_rgbww_value_changed(mock_openzwave): assert device.rgb_color == [0, 0, 0] - color.data = b'#c86400c800' + color.data = '#c86400c800' value_changed(color) assert device.rgb_color == [200, 150, 100] @@ -339,7 +339,7 @@ def test_rgbcw_value_changed(mock_openzwave): """Test value changed for rgb lights.""" node = MockNode(command_classes=[const.COMMAND_CLASS_SWITCH_COLOR]) value = MockValue(data=0, node=node) - color = MockValue(data=b'#0000000000', node=node) + color = MockValue(data='#0000000000', node=node) # Suppoorts RGB, Cold White color_channels = MockValue(data=0x1e, node=node) values = MockLightValues(primary=value, color=color, @@ -348,7 +348,7 @@ def test_rgbcw_value_changed(mock_openzwave): assert device.rgb_color == [0, 0, 0] - color.data = b'#c86400c800' + color.data = '#c86400c800' value_changed(color) assert device.rgb_color == [200, 150, 100] @@ -359,7 +359,7 @@ def test_ct_value_changed(mock_openzwave): node = MockNode(manufacturer_id='0086', product_id='0062', command_classes=[const.COMMAND_CLASS_SWITCH_COLOR]) value = MockValue(data=0, node=node) - color = MockValue(data=b'#0000000000', node=node) + color = MockValue(data='#0000000000', node=node) # Suppoorts RGB, Cold White color_channels = MockValue(data=0x1f, node=node) values = MockLightValues(primary=value, color=color, @@ -368,12 +368,12 @@ def test_ct_value_changed(mock_openzwave): assert device.color_temp == zwave.TEMP_MID_HASS - color.data = b'#000000ff00' + color.data = '#000000ff00' value_changed(color) assert device.color_temp == zwave.TEMP_WARM_HASS - color.data = b'#00000000ff' + color.data = '#00000000ff' value_changed(color) assert device.color_temp == zwave.TEMP_COLD_HASS