Ä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