コード例 #1
0
ファイル: map_items.py プロジェクト: petervoss2/HABApp
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)
コード例 #2
0
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'))
コード例 #3
0
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]
コード例 #4
0
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
コード例 #5
0
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')
コード例 #6
0
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]
コード例 #7
0
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
コード例 #8
0
ファイル: test_item.py プロジェクト: spacemanspiff2007/HABApp
    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))
コード例 #9
0
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
コード例 #10
0
ファイル: test_item.py プロジェクト: snpz/HABApp
    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))
コード例 #11
0
ファイル: test_item.py プロジェクト: petervoss2/HABApp
    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))
コード例 #12
0
    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(), [])
コード例 #13
0
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]
コード例 #14
0
ファイル: test_item.py プロジェクト: snpz/HABApp
 def test_repr(self):
     i = Item('test')
     self.assertGreater(len(str(i)), 23)