def test_fast_change(self): if core.DETECT_FASTCHANGE: device = core.Device({'addr': '1234', 'ieee': '0123456789abcdef'}) device.set_attribute(1, 0x0006, { 'attribute': 0x0000, 'lqi': 255, 'data': True }) self.assertEqual(device.get_property_value('onoff'), True) device.set_attribute(1, 0x0006, { 'attribute': 0x0000, 'lqi': 255, 'data': False }) self.assertEqual(device.get_property_value('onoff'), True) time.sleep(core.DELAY_FASTCHANGE + 1) self.assertEqual(device.get_property_value('onoff'), False)
def test_device_dump(self): device = core.Device({'addr': '1234', 'ieee': '0123456789abcdef'}) device.set_attribute(1, 0, { 'attribute': 5, 'rssi': 255, 'data': 'test' }) last_seen = device.info['last_seen'] data = json.dumps(device, cls=core.DeviceEncoder, sort_keys=True) self.maxDiff = None self.assertEqual(data, ( '{"addr": "1234", "discovery": "", "endpoints": [{"clusters": [{"attributes": ' '[{"attribute": 5, "data": ' '"test", "name": "type", "type": "str", "value": "test"}], "cluster": 0}], "device": 0, ' '"endpoint": 1, "in_clusters": [], "out_clusters": [], "profile": 0}], "generictype": "", ' '"info": {"addr": "1234", "ieee": "0123456789abcdef", "last_seen": "' + last_seen + '", ' '"rssi": 255}}'))
def test_reset_attribute(self): device = core.Device({'addr': '1234', 'ieee': '0123456789abcdef'}) device.set_attribute(1, 0x0101, { 'attribute': 0x0503, 'rssi': 255, 'data': 12.0 }) self.assertEqual(device.get_property_value('rotation'), 12.0) device._reset_attribute(1, 0x0101, 0x0503) self.assertEqual(device.get_property_value('rotation'), 0.0) device.set_attribute(1, 0x0101, { 'attribute': 0x0503, 'rssi': 255, 'data': 'test' }) self.assertEqual(device.get_property_value('rotation'), 0.0) device._reset_attribute(1, 0x0101, 0x0503) self.assertEqual(device.get_property_value('rotation'), 0.0)
def test_assumed_state(self): device = core.Device({'addr': '1234', 'ieee': '0123456789abcdef'}) device.set_attribute(3, 6, {'attribute': 0, 'lqi': 255, 'data': False}) self.zigate._devices['1234'] = device self.zigate.connection.add_auto_response(0x0120, 0x8120, unhexlify(b'01123403000600')) r = self.zigate.reporting_request('1234', 3, 6, (0x0000, 0x20)) self.assertEqual(r.status, 0) self.assertFalse(device.assumed_state) self.assertDictEqual(device.get_attribute(3, 6, 0), {'attribute': 0, 'data': False, 'name': 'onoff', 'value': False, 'type': bool}) self.zigate.action_onoff('1234', 3, True) self.assertDictEqual(device.get_attribute(3, 6, 0), {'attribute': 0, 'data': False, 'name': 'onoff', 'value': False, 'type': bool}) self.assertFalse(device.assumed_state) self.zigate.connection.add_auto_response(0x0120, 0x8120, unhexlify(b'0112340300068c')) r = self.zigate.reporting_request('1234', 3, 6, (0x0000, 0x20)) self.assertEqual(r.status, 0x8c) self.assertTrue(device.assumed_state)
def test_templates(self): path = os.path.join(core.BASE_PATH, 'templates') files = os.listdir(path) for f in files: success = False try: print('Test template', f) with open(os.path.join(path, f)) as fp: json.load(fp) device = core.Device( { 'addr': '1234', 'ieee': '0123456789abcdef' }, self.zigate) device.set_attribute(1, 0, { 'attribute': 5, 'rssi': 255, 'data': f[:-5] }) self.assertTrue(device.load_template()) success = True except Exception as e: print(e) self.assertTrue(success)
def test_refresh(self): device = core.Device({'addr': '1234'}, self.zigate) device.endpoints[0x0001] = {'in_clusters': [0x0006], 'clusters': {0x0006: clusters.C0006()}} device.set_attribute(1, 0x0006, {'attribute': 0, 'lqi': 255, 'data': '0'}) device.set_attribute(1, 0x0006, {'attribute': 2, 'lqi': 255, 'data': '0'}) self.zigate._devices['1234'] = device device.refresh_device(force=True) self.assertEqual(hexlify(self.zigate.connection.get_last_cmd()), b'0212340101000600000000010000' ) device.refresh_device(full=True, force=True) self.assertEqual(hexlify(self.zigate.connection.get_last_cmd()), b'02123401010006000000000200000002' ) self.zigate.connection.sent = [] device.refresh_device() self.assertIsNone(self.zigate.connection.get_last_cmd()) device.info['last_seen'] = datetime.datetime(2020, 1 , 1).strftime('%Y-%m-%d %H:%M:%S') device.refresh_device() self.assertEqual(hexlify(self.zigate.connection.get_last_cmd()), b'0212340101000600000000010000' )
def test_remove_device_without_ieee(self): device = core.Device({'addr': '1234'}, self.zigate) self.zigate._devices['1234'] = device self.zigate.remove_device('1234') self.assertFalse('1234' in self.zigate._devices)
def test_template(self): device = core.Device({'addr': '1234', 'ieee': '0123456789abcdef'}) device.set_attribute(1, 0, { 'attribute': 5, 'rssi': 255, 'data': 'lumi.test' }) self.assertFalse(device.load_template()) device = core.Device({'addr': '1234', 'ieee': '0123456789abcdef'}) self.assertFalse(device.load_template()) device.set_attribute(1, 0, { 'attribute': 5, 'rssi': 255, 'data': 'lumi.weather' }) self.assertCountEqual(device.properties, [{ 'attribute': 5, 'data': 'lumi.weather', 'name': 'type', 'value': 'lumi.weather', 'type': str }]) device.set_attribute(1, 0x0402, { 'attribute': 0, 'rssi': 255, 'data': 1200 }) self.assertEqual(device.get_property_value('temperature'), 12.0) device.set_attribute(1, 0, { 'attribute': 1, 'rssi': 255, 'data': 'test' }) self.assertEqual(device.genericType, '') self.assertTrue(device.load_template()) self.assertEqual(device.discovery, 'templated') self.assertEqual(device.genericType, 'sensor') self.assertCountEqual(device.properties, [{ 'attribute': 1, 'data': 'test', 'name': 'application_version', 'value': 'test' }, { 'attribute': 4, 'data': 'LUMI', 'name': 'manufacturer', 'value': 'LUMI' }, { 'attribute': 5, 'data': 'lumi.weather', 'name': 'type', 'value': 'lumi.weather', 'type': str }, { 'attribute': 7, 'data': 3, 'name': 'power_source', 'value': 3 }, { 'attribute': 0, 'data': 1200, 'name': 'temperature', 'value': 12.0, 'unit': '°C', 'type': float }, { 'attribute': 0, 'name': 'pressure', 'unit': 'mb', 'value': 0, 'type': int }, { 'attribute': 16, 'name': 'pressure2', 'unit': 'mb', 'value': 0.0, 'type': float }, { 'attribute': 0, 'name': 'humidity', 'unit': '%', 'value': 0.0, 'type': float }]) device.set_attribute(1, 6, { 'attribute': 0, 'rssi': 255, 'data': False, 'inverse': True }) device.set_attribute(1, 0, { 'attribute': 1, 'rssi': 255, 'data': 'test' }) device.generate_template(self.test_dir) with open(os.path.join(self.test_dir, 'lumi.weather.json')) as fp: jdata = json.load(fp) self.assertCountEqual( jdata, { 'endpoints': [{ 'clusters': [{ 'attributes': [{ 'attribute': 4, 'data': 'LUMI' }, { 'attribute': 5, 'data': 'lumi.weather' }, { 'attribute': 7, 'data': 3 }], 'cluster': 0 }, { 'attributes': [{ 'attribute': 0 }], 'cluster': 1026 }, { 'attributes': [{ 'attribute': 0 }, { 'attribute': 16 }, { 'attribute': 20 }], 'cluster': 1027 }, { 'attributes': [{ 'attribute': 0 }], 'cluster': 1029 }, { 'attributes': [{ 'attribute': 0, 'inverse': True }], 'cluster': 6 }], 'device': 24321, 'endpoint': 1, 'in_clusters': [0, 3, 65535, 1026, 1027, 1029], 'out_clusters': [0, 4, 65535], 'profile': 260 }], 'generictype': 'sensor', 'info': { 'bit_field': '0100000000000010', 'descriptor_capability': '00000000', 'mac_capability': '10000000', 'manufacturer_code': '1037', 'power_type': 0, 'server_mask': 0 } }) # another test device = core.Device({'addr': '1234', 'ieee': '0123456789abcdef'}) self.assertFalse(device.load_template()) device.set_attribute(1, 0, { 'attribute': 5, 'rssi': 255, 'data': 'lumi.sensor_wleak.aq1' }) self.assertTrue(device.load_template()) self.assertEqual(device.discovery, 'templated') self.assertEqual(device.genericType, 'sensor') self.assertDictEqual( device.get_property_value('zone_status'), { 'alarm1': False, 'alarm2': False, 'tamper': False, 'low_battery': False, 'supervision': False, 'restore': False, 'trouble': False, 'ac_fault': False, 'test_mode': False, 'battery_defect': False })
def test_cluster_C0012(self): # xiaomi cube status device = core.Device({'addr': '1234', 'ieee': '0123456789abcdef'}) device.set_attribute(1, 0, { 'attribute': 5, 'lqi': 255, 'data': 'lumi.sensor_cube' }) endpoint = {'device': 24322} data = { "attributes": [{ "attribute": 85, "data": 4, "expire": 2, "expire_value": "", "name": "movement", "value": "" }], "cluster": 18 } c = clusters.C0012.from_json(data, endpoint, device) self.assertEqual( c.attributes, { 85: { 'attribute': 85, 'data': 4, 'expire': 2, 'expire_value': '', 'name': 'movement', 'value': 'flip90_84', 'type': str } }) # xiaomi lumi.remote.b1acn01 endpoint = {'device': 259} data = { "attributes": [{ "attribute": 85, "data": 4, "expire": 2, "expire_value": "", "name": "movement", "value": "" }], "cluster": 18 } c = clusters.C0012.from_json(data, endpoint) self.assertEqual( c.attributes, { 85: { 'attribute': 85, 'data': 4, 'expire': 2, 'name': 'multiclick', 'value': '4', 'type': str } }) # xiaomi lumi.remote.b286acn01 endpoint = {'device': 24321} data = { "attributes": [{ "attribute": 85, "data": 1, "expire": 2, "name": "multiclick", "value": "" }], "cluster": 18 } c = clusters.C0012.from_json(data, endpoint) self.assertEqual( c.attributes, { 85: { 'attribute': 85, 'data': 1, 'expire': 2, 'name': 'multiclick', 'value': '1', 'type': str } })