def map_items(name, openhab_type: str, openhab_value: str): assert isinstance(openhab_type, str), type(openhab_type) assert isinstance(openhab_value, str), type(openhab_value) value: typing.Optional[str] = openhab_value if openhab_value == 'NULL' or openhab_value == 'UNDEF': value = None # Quantity types are like this: Number:Temperature and have a unit set: "12.3 °C". # We have to remove the dimension from the type and remove the unit from the value if ':' in openhab_type: openhab_type = openhab_type[:openhab_type.find(':')] # if the item is not initialized its None and has no dimension if value is not None: value, _ = QuantityValue.split_unit(value) # Specific classes if openhab_type == "Switch": return SwitchItem(name, value) if openhab_type == "Contact": return ContactItem(name, value) if openhab_type == "Rollershutter": if value is None: return RollershutterItem(name, value) return RollershutterItem(name, float(value)) if openhab_type == "Dimmer": return DimmerItem(name, value) if openhab_type == "Number": if value is None: return NumberItem(name, value) # Number items can be int or float try: return NumberItem(name, int(value)) except ValueError: return NumberItem(name, float(value)) if openhab_type == "DateTime": if value is None: return Item(name, value) dt = datetime.datetime.strptime(value.replace('+', '000+'), '%Y-%m-%dT%H:%M:%S.%f%z') # all datetimes from openhab have a timezone set so we can't easily compare them # --> TypeError: can't compare offset-naive and offset-aware datetimes dt = dt.astimezone(tz=None) # Changes datetime object so it uses system timezone dt = dt.replace(tzinfo=None) # Removes timezone awareness return Item(name, dt) if openhab_type == "Color": if value is None: return ColorItem(name) return ColorItem(name, *(float(k) for k in value.split(','))) return Item(name, value)
def test_add(clean_reg): added = Item('test') Items.add_item(added) assert Items.item_exists('test') # adding the same item multiple times will not cause an exception Items.add_item(added) Items.add_item(added) # adding a new item -> exception with pytest.raises(Items.ItemAlreadyExistsError): Items.add_item(Item('test'))
def test_search_oh(): item1 = OpenhabItem('oh_item_1', tags=frozenset(['tag1', 'tag2', 'tag3']), groups=frozenset(['grp1', 'grp2']), metadata={'meta1': MetaData('meta_v1')}) item2 = SwitchItem('oh_item_2', tags=frozenset(['tag1', 'tag2', 'tag4']), groups=frozenset(['grp2', 'grp3']), metadata={'meta2': MetaData('meta_v2', config={'a': 'b'})}) item3 = Item('item_2') assert Rule.get_items() == [] Items.add_item(item1) Items.add_item(item2) Items.add_item(item3) assert Rule.get_items() == [item1, item2, item3] assert Rule.get_items(tags='tag2') == [item1, item2] assert Rule.get_items(tags='tag4') == [item2] assert Rule.get_items(groups='grp1') == [item1] assert Rule.get_items(groups='grp2') == [item1, item2] assert Rule.get_items(groups='grp1', tags='tag1') == [item1] assert Rule.get_items(groups='grp2', tags='tag4') == [item2] assert Rule.get_items(metadata='meta1') == [item1] assert Rule.get_items(metadata='meta2') == [item2] assert Rule.get_items(metadata=r'meta\d') == [item1, item2] assert Rule.get_items(metadata_value='meta_v1') == [item1] assert Rule.get_items(metadata_value='meta_v2') == [item2] assert Rule.get_items(metadata_value=r'meta_v\d') == [item1, item2] assert Rule.get_items(groups='grp1', metadata_value=r'meta_v\d') == [item1]
async def test_watch_update(parent_rule: DummyRule, event_bus: TmpEventBus, sync_worker, caplog): for meth in ('watch_update', 'watch_change'): cb = MagicMock() cb.__name__ = 'MockName' secs = 0.2 i = Item('test') func = getattr(i, meth) func(secs / 2) w = func(timedelta(seconds=secs)) w.listen_event(cb) i.post_value(1) await asyncio.sleep(0.3) cb.assert_called_once() assert isinstance( cb.call_args[0][0], ItemNoUpdateEvent if meth == 'watch_update' else ItemNoChangeEvent) assert cb.call_args[0][0].name == 'test' assert cb.call_args[0][0].seconds == secs
def test_pop(clean_reg): Items.add_item(Item('test')) assert Items.item_exists('test') with pytest.raises(Items.ItemNotFoundException): Items.pop_item('asdfadsf') Items.pop_item('test') assert not Items.item_exists('test')
def test_search_name(): item1 = BaseValueItem('item_1a') item2 = Item('item_2a') assert Rule.get_items() == [] Items.add_item(item1) Items.add_item(item2) assert Rule.get_items() == [item1, item2] assert Rule.get_items(name=r'\da') == [item1, item2]
async def test_multiple_add(parent_rule: DummyRule): i = Item('test') w1 = i.watch_change(5) w2 = i.watch_change(5) assert w1 is w2 w1.fut.cancel() w2 = i.watch_change(5) assert w1 is not w2
def test_time_change(self): i = Item('test') i.set_value('test') i._last_change.set(pd_now(UTC) - timedelta(seconds=5)) i._last_update.set(pd_now(UTC) - timedelta(seconds=5)) i.set_value('test1') self.assertGreater(i._last_update.dt, pd_now(UTC) - timedelta(milliseconds=100)) self.assertGreater(i._last_change.dt, pd_now(UTC) - timedelta(milliseconds=100))
def test_multiple_add(monkeypatch): monkeypatch.setattr(HABApp.rule, 'get_parent_rule', lambda: DummyRule(), raising=True) i = Item('test') w1 = i.watch_change(5) w2 = i.watch_change(5) assert w1 is w2 w1._fut.cancel() w2 = i.watch_change(5) assert w1 is not w2
def test_time_change(self): i = Item('test') i.set_value('test') i._last_change.set(datetime.now(tz=pytz.utc) - timedelta(seconds=5)) i._last_update.set(datetime.now(tz=pytz.utc) - timedelta(seconds=5)) i.set_value('test1') self.assertGreater( i._last_update.dt, datetime.now(tz=pytz.utc) - timedelta(milliseconds=100)) self.assertGreater( i._last_change.dt, datetime.now(tz=pytz.utc) - timedelta(milliseconds=100))
def test_time_update(self): i = Item('test') i.set_value('test') i._last_change = datetime.now(tz=pytz.utc) - timedelta(seconds=5) i._last_update = datetime.now(tz=pytz.utc) - timedelta(seconds=5) i.set_value('test') self.assertGreater( i._last_update, datetime.now(tz=pytz.utc) - timedelta(milliseconds=100)) self.assertLess( i._last_change, datetime.now(tz=pytz.utc) - timedelta(milliseconds=100))
def test_item(self): NAME = 'test' created_item = Item(NAME) Items.add_item(created_item) self.assertTrue(Items.item_exists(NAME)) self.assertIs(created_item, Items.get_item(NAME)) self.assertEqual(Items.get_all_item_names(), [NAME]) self.assertEqual(Items.get_all_items(), [created_item]) self.assertIs(created_item, Items.pop_item(NAME)) self.assertEqual(Items.get_all_items(), [])
def test_search_type(): item1 = BaseValueItem('item_1') item2 = Item('item_2') assert Rule.get_items() == [] Items.add_item(item1) Items.add_item(item2) assert Rule.get_items() == [item1, item2] assert Rule.get_items(type=BaseValueItem) == [item1, item2] assert Rule.get_items(type=(BaseValueItem, Item)) == [item1, item2] assert Rule.get_items(type=Item) == [item2]
def test_repr(self): i = Item('test') self.assertGreater(len(str(i)), 23)