diff --git a/README.rst b/README.rst index 7e6d5c8..1e91581 100644 --- a/README.rst +++ b/README.rst @@ -38,6 +38,7 @@ add a new user. present=True lock=None devicelock=None + is_group=False Alert: alert=True ############################## @@ -49,6 +50,7 @@ add a new user. present=True lock=False devicelock=False + is_group=False Temperature: temperature=19 offset=-3 @@ -63,6 +65,50 @@ add a new user. summer=False holiday=False ############################## + name=Wohnzimmer Couch + ain=09995 0523646 + id=17 + productname=FRITZ!DECT 301 + manufacturer=AVM + present=True + lock=False + devicelock=False + is_group=False + Temperature: + temperature=20.5 + Thermostat: + battery_low=False + battery_level=80 + actual=20.5 + target=21.5 + comfort=21.5 + eco=17.5 + window=False + summer=False + holiday=False + ############################## + name=Wohnzimmer Tisch + ain=09995 0517495 + id=18 + productname=FRITZ!DECT 301 + manufacturer=AVM + present=True + lock=False + devicelock=False + is_group=False + Temperature: + temperature=21.0 + Thermostat: + battery_low=False + battery_level=80 + actual=21.0 + target=21.5 + comfort=21.5 + eco=17.5 + window=False + summer=False + holiday=False + ############################## name=Schalter WC Heizung ain=08761 0402392 id=21 @@ -71,6 +117,7 @@ add a new user. present=True lock=True devicelock=False + is_group=False Switch: switch_state=False Powermeter: @@ -80,7 +127,27 @@ add a new user. Temperature: temperature=22 offset=3 - + ############################## + name=Wohnzimmer + ain=grp303E4F-3F7D9BE07 + id=900 + productname= + manufacturer=AVM + present=True + lock=False + devicelock=False + is_group=True + group_members=['17', '18'] + Thermostat: + battery_low=None + battery_level=None + actual=None + target=21.5 + comfort=21.5 + eco=17.5 + window=None + summer=None + holiday=None Fritzbox User ------------- diff --git a/pyfritzhome/cli.py b/pyfritzhome/cli.py index 81e6bb7..245b245 100644 --- a/pyfritzhome/cli.py +++ b/pyfritzhome/cli.py @@ -30,6 +30,9 @@ def list_all(fritz, args): print(" present=%s" % device.present) print(" lock=%s" % device.lock) print(" devicelock=%s" % device.device_lock) + print(" is_group=%s" % device.is_group) + if device.is_group: + print(" group_members=%s" % device.group_members) if device.present is False: continue diff --git a/pyfritzhome/devicetypes/fritzhomedevicebase.py b/pyfritzhome/devicetypes/fritzhomedevicebase.py index 5cd0f43..32c4992 100644 --- a/pyfritzhome/devicetypes/fritzhomedevicebase.py +++ b/pyfritzhome/devicetypes/fritzhomedevicebase.py @@ -15,7 +15,9 @@ class FritzhomeDeviceBase(FritzhomeEntityBase): """The Fritzhome Device class.""" identifier = None + is_group = None fw_version = None + group_members = None manufacturer = None productname = None present = None @@ -44,6 +46,11 @@ def _update_from_node(self, node): self.present = bool(int(node.findtext("present"))) + groupinfo = node.find("groupinfo") + self.is_group = groupinfo is not None + if self.is_group: + self.group_members = str(groupinfo.findtext("members")).split(",") + # General def get_present(self): """Check if the device is present.""" diff --git a/pyfritzhome/fritzhome.py b/pyfritzhome/fritzhome.py index 44bd333..a6550ca 100644 --- a/pyfritzhome/fritzhome.py +++ b/pyfritzhome/fritzhome.py @@ -143,7 +143,7 @@ def _get_listinfo_elements(self, entity_type): plain = self._aha_request("get" + entity_type + "listinfos") dom = ElementTree.fromstring(plain) _LOGGER.debug(dom) - return dom.findall(entity_type) + return dom.findall("*") def get_device_elements(self): """Get the DOM elements for the device list.""" diff --git a/tests/responses/groups/device_list_thermostat.xml b/tests/responses/groups/device_list_thermostat.xml new file mode 100644 index 0000000..9d6bd4b --- /dev/null +++ b/tests/responses/groups/device_list_thermostat.xml @@ -0,0 +1,101 @@ + + + + 1 + 0 + Wohnzimmer Couch + 80 + 0 + + 220 + -10 + + + 44 + 43 + 35 + 43 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 80 + + 0 + 43 + + 0 + 0 + 1 + 0 + + + + 1 + 0 + Wohnzimmer Tisch + 80 + 0 + + 220 + -10 + + + 44 + 43 + 35 + 43 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 80 + + 0 + 43 + + 0 + 0 + 1 + 0 + + + + 1 + 0 + Wohnzimmer + + + 43 + 35 + 43 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + 0 + 43 + + 0 + 0 + 1 + 0 + + + 0 + 16,17 + + + \ No newline at end of file diff --git a/tests/test_fritzhomedevicethermostat_group.py b/tests/test_fritzhomedevicethermostat_group.py new file mode 100644 index 0000000..e632ff1 --- /dev/null +++ b/tests/test_fritzhomedevicethermostat_group.py @@ -0,0 +1,27 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +from unittest.mock import MagicMock + +from pyfritzhome import Fritzhome + +from .helper import Helper + + +class TestFritzhomeDeviceThermostat(object): + def setup_method(self): + self.mock = MagicMock() + self.fritz = Fritzhome("10.0.0.1", "user", "pass") + self.fritz._request = self.mock + self.fritz._devices = {} + + def test_device_alert_on(self): + self.mock.side_effect = [ + Helper.response("groups/device_list_thermostat"), + ] + + self.fritz.update_devices() + group = self.fritz.get_device_by_ain("grp303E4F-3F7D9BE07") + assert group.has_thermostat + assert group.is_group + assert group.group_members == ["16", "17"]