Äh - ne, das ist falsch. Wenn du das machst, dann gehts gar nicht. Er soll prüfen, ob blink_items_anticyclic eine Liste ist, und wenn nicht, eine leere Liste beisteuern.
Deine Änderung würde prüfen, ob es ein String ist, und wenn nicht (sondern z.B. eine korrekt befüllte Liste) eine leere Liste zurückgeben.
Sorry für das sequenzielle Debugging, aber ich kann gerade nicht das System umstricken für den Test, bin mitten in einer anderen Debugging-Session...
Deine Änderung würde prüfen, ob es ein String ist, und wenn nicht (sondern z.B. eine korrekt befüllte Liste) eine leere Liste zurückgeben.
Sorry für das sequenzielle Debugging, aber ich kann gerade nicht das System umstricken für den Test, bin mitten in einer anderen Debugging-Session...
Code:
#!/usr/bin/env python3 # vim: tabstop=4 softtabstop=4 shiftwidth=4 expandtab # LOGIC config # ------------------------------------------------------- # visual_alarm: # filename: blinker.py # watch_item: HOME.alarm.action.blinkinglight # set_items_cyclic: # - AUSSEN.south.light.outer # - AUSSEN.west.light.outer # set_items_anticyclic: # - AUSSEN.south.light.inner # - AUSSEN.east.light.door # - AUSSEN.west.light.nested # set_blink_cycles: -1 ' -1: endless # set_blink_interval: 2 # dry_run: 0 control_item_name = trigger['source'] control_item = sh.return_item(control_item_name) triggered_by = trigger['by'] if control_item is not None: logger.info(f'LOGIC blinker.py: {logic.name} triggered from source {control_item_name} by {triggered_by}') # control_item_active = trigger['value'] control_item_active = control_item() # set parameters from logic config blink_items_cyclic = [] if hasattr(logic, 'set_items_cyclic'): blink_items_cyclic = logic.set_items_cyclic if isinstance(blink_items_cyclic, str): blink_items_cyclic = [blink_items_cyclic, ] # do we have blink items? if not isinstance(blink_items_cyclic, list) or len(blink_items_cyclic) == 0: logger.info('LOGIC blinker.py: error, no cyclic blink items set. Aborting') else: blink_items_anticyclic = [] if hasattr(logic, 'set_items_anticyclic'): blink_items_anticyclic = logic.set_items_anticyclic if isinstance(blink_items_anticyclic, str): blink_items_anticyclic = [blink_items_anticyclic, ] # did we get strange data? if not isinstance(blink_items_anticyclic, list): blink_items_anticyclic = [] if hasattr(logic, 'set_blink_cycles'): blink_cycles = int(logic.set_blink_cycles) else: blink_cycles = 2 logger.info(f'LOGIC blinker.py: no blink cycles set, setting to default: {blink_cycles}') if hasattr(logic, 'set_blink_interval'): blink_interval = int(logic.set_blink_interval) else: blink_interval = 2 logger.info(f'LOGIC blinker.py: no blink interval set, setting to default: {blink_interval}') if hasattr(logic, 'dry_run'): dry_run = (int(logic.dry_run) > 0) else: dry_run = False if control_item_active: # first call? if not hasattr(logic, 'blink_init'): logger.info(f'LOGIC blinker.py: initiating {blink_cycles} blinks for {len(blink_items_cyclic)} cyclic and {len(blink_items_anticyclic)} anti-cyclic items') logic.blink_init = True blink_items = blink_items_cyclic + blink_items_anticyclic if len(blink_items) > 0: # SAVE item states logic.saved_items = {} for item_name in blink_items: item = sh.return_item(item_name) if item: logic.saved_items[item_name] = item() logger.info(f'LOGIC blinker.py: save {item_name} = {item()}') if dry_run: logger.warn('LOGIC blinker.py: test mode, dry run active') else: logger.warn('LOGIC blinker.py: no blink items set') # prepare blink if hasattr(logic, 'blink_value'): logic.blink_value = not logic.blink_value else: logic.blink_value = True if hasattr(logic, 'blink_countdown'): logic.blink_countdown -= 1 else: logic.blink_countdown = blink_cycles # any blinks left? if logic.blink_countdown > 0 or blink_cycles == -1: if blink_cycles == -1: logger.info('LOGIC blinker.py BLINK (endless)') else: logger.info(f'LOGIC blinker.py BLINK ({logic.blink_countdown} cycles remaining)') # set all cyclic items for item_name in blink_items_cyclic: item = sh.return_item(item_name) logger.info(f'LOGIC blinker.py SET {item_name} to {logic.blink_value}') if not dry_run: item(logic.blink_value) # set all anti-cyclic items for item_name in blink_items_anticyclic: item = sh.return_item(item_name) logger.info(f'LOGIC blinker.py SET {item_name} to {not logic.blink_value}') if not dry_run: item(not logic.blink_value) sh.trigger(f'logics.{logic.name}', by=trigger['by'], source=trigger['source'], value=trigger['value'], dt=sh.now() + datetime.timedelta(seconds=blink_interval)) else: logger.info('LOGIC blinker.py countdown finished, set control item to False') control_item(False) # this triggers logic again! else: logger.info('LOGIC blinker.py control item set to false: stop blink logic, restore saved item values') # RESTORE item states if hasattr(logic, 'saved_items'): for item_name in logic.saved_items: item = sh.return_item(item_name) value = logic.saved_items[item_name] logger.info(f'LOGIC blinker.py: restore {item_name} = {item()}') if not dry_run: item(value) # reset persistent values if hasattr(logic, 'saved_items'): delattr(logic, 'saved_items') if hasattr(logic, 'blink_countdown'): delattr(logic, 'blink_countdown') if hasattr(logic, 'blink_value'): delattr(logic, 'blink_value') if hasattr(logic, 'blink_init'): delattr(logic, 'blink_init') else: logger.info('LOGIC blinker.py triggered without source... ignoring...')
Kommentar