def timer_flushdone(log): log.info("Done acid pump backflush") sendCommand("pool_acidpumpflush", OFF) log.info("Acid injection secquence completed") sendCommand("pool_acidinject", OFF) global timer_acid timer_acid = None
def timer_fillflush(log): log.info("Acid injection done") sendCommand("pool_acidpump", OFF) log.info("Flushing water line") sendCommand("pool_waterfill", ON) global timer_acid timer_acid = createTimer(DateTime.now().plusSeconds(10), lambda: timer_acidflush(log))
def timer_acidflush(log): log.info("Done flushing water line") sendCommand("pool_waterfill", OFF) log.info("Backflushing acid pump") sendCommand("pool_acidpumpflush", ON) global timer_acid timer_acid = createTimer(DateTime.now().plusSeconds(10), lambda: timer_flushdone(log))
def timer_umbrlla_down(log): log.info("The umbrella is now Closing") sendCommand("pool_umbrellaup", OFF) log.info("Closeing the Umbrella") sendCommand("pool_umbrelladown", ON) global timer_umbrella timer_umbrella = createTimer(DateTime.now().plusSeconds(45), lambda: timer_umbrlla_down(log))
def rule_acidinject(event): global timer_acid if timer_acid is None: rule_acidinject.log.info("Injecting 250ml of acid") sendCommand("pool_acidpump", ON) timer_acid = createTimer(DateTime.now().plusSeconds(45), lambda: timer_fillflush(rule_acidinject.log)) else: rule_acidinject.log.warn( "Failed to start acid flush, an acid flush sequence is already running" )
def rotary_dimmer_handler(event): item_dimmer = get_value(event.itemName, 'controls') if not item_dimmer: rotary_dimmer_handler.log.warn("No 'controls' metadata for {}".format( event.itemName)) return if item_dimmer not in items: rotary_dimmer_handler.log.warn( "Controlled item {} for {} is not found".format( item_dimmer, event.itemName)) return value = event.itemState.toString() # Use a larger delta when the knob is being turned faster if value in ('rotate_left', 'rotate_right'): # Lookup table of (rotate action time_delta threshold, dimmer delta to use) delta_table = ((0.25, 10), (0.7, 5), (1, 2)) current_time = time.time() time_delta = current_time - last_update.get(event.itemName, 0) last_update[event.itemName] = current_time for threshold, delta in delta_table: if time_delta < threshold: break else: delta = 1 rotary_dimmer_handler.log.debug('timedelta: {}, delta: {}'.format( time_delta, delta)) if value == 'rotate_right': if items[item_dimmer] < PercentType(100): sendCommand(item_dimmer, min(100, items[item_dimmer].floatValue() + delta)) elif value == 'rotate_left': if items[item_dimmer] > PercentType(0): sendCommand(item_dimmer, max(0, items[item_dimmer].floatValue() - delta)) if value == 'play_pause': # single click sendCommand(item_dimmer, '2') elif value == 'skip_forward': # double click sendCommand(item_dimmer, '50') elif value == 'skip_backward': # triple click sendCommand(item_dimmer, '100')
def update_scene(item, scene=None): """ Updates all lights and subgroups, and propagates scene change to children with ``follow_parent`` set to ``True``. """ scene = scene or str(item.state).lower() log.info( "Changing '{group}' scene to '{scene}'".format( group=get_item_eos_group(item).name, scene=item.state ) ) for light_item in get_light_items(get_item_eos_group(item)): try: update_light(light_item, scene=scene) except: continue for group_item in get_group_items(get_item_eos_group(item)): if ( str(get_value(group_item.name, META_NAME_EOS)).lower() not in META_STRING_FALSE ): # set children to "parent" scene unless following is turned off if resolve_type( get_metadata(group_item.name, META_NAME_EOS) .get("configuration", {}) .get(META_KEY_FOLLOW_PARENT, True) ): log.debug( "Commanding '{group}' scene to 'parent'".format( group=group_item.name ) ) sendCommand(get_scene_item(group_item).name, SCENE_PARENT) else: update_group(group_item, True)
def relays_off(skip=None): for name in pit_relays: if name != skip: sendCommand(name, OFF)
def rule_pool_pit_control(event): def relays_off(skip=None): for name in pit_relays: if name != skip: sendCommand(name, OFF) log = rule_pool_pit_control.log # simplify log access state = str(items["pool_pit_state"]) # get currect state switch = { # get switch states "up": True if items["pool_pit_switch_up"] == ON else False, "down": True if items["pool_pit_switch_down"] == ON else False, "in": True if items["pool_pit_switch_in"] == ON else False, "out": True if items["pool_pit_switch_out"] == ON else False, } # a command was sent if event.itemName == "pool_pit_state": # already in the state requested if event.itemCommand == state: log.debug("Pool Pit is already {}".format(event.itemCommand)) return # new command state = event.itemCommand[:4] + "ing" # a switch changed else: switch[event.itemName.split("_") [-1]] = True if event.itemState == ON else False # pit is opening if state == "opening": # pit has finished opening if switch["up"] and switch["out"]: relays_off() postUpdate("pool_pit_state", "open") #log.info("Pool Pit is now open") # pit has finished moving up elif switch["up"]: relays_off("pool_pit_relay_out") sendCommand("pool_pit_relay_out", ON) postUpdate("pool_pit_state", "opening") log.debug("Pool Pit is moving out") # pit needs to move up else: relays_off("pool_pit_relay_up") sendCommand("pool_pit_relay_up", ON) postUpdate("pool_pit_state", "opening") log.debug("Pool Pit is moving up") # pit is closing elif state == "closing": # pit has finished closing if switch["down"] and switch["in"]: relays_off() postUpdate("pool_pit_state", "close") #log.info("Pool Pit is now closed") # pit has finished moving in elif switch["in"]: relays_off("pool_pit_relay_down") sendCommand("pool_pit_relay_down", ON) postUpdate("pool_pit_state", "closing") log.debug("Pool Pit is moving down") # pit needs to move in else: relays_off("pool_pit_relay_in") sendCommand("pool_pit_relay_in", ON) postUpdate("pool_pit_state", "closing") log.debug("Pool Pit is moving in") # stop requested elif state == "stoping": relays_off() postUpdate("pool_pit_state", "stop") log.info("Pool Pit is now stopped")
def rule_water_high(event): log = rule_water_high.log overfill_lower = True if ( event.itemState if getattr(event, "itemName", None) == "pool_floatSW_overfill_lower" else items["pool_floatSW_overfill_lower"]) == ON else False overfill_upper = True if ( event.itemState if getattr(event, "itemName", None) == "pool_floatSW_overfill_upper" else items["pool_floatSW_overfill_upper"]) == ON else False now = DateTime.now() # check if switch changed and update it's last changed time if it did if overfill_lower != float_last_change["overfill_lower"]["state"]: float_last_change["overfill_lower"]["time"] = now float_last_change["overfill_lower"]["state"] = overfill_lower if overfill_upper != float_last_change["overfill_upper"]["state"]: float_last_change["overfill_upper"]["time"] = now float_last_change["overfill_upper"]["state"] = overfill_upper # check if lower switch has changed within the delay period if now.isBefore(float_last_change["overfill_lower"]["time"].plusSeconds( float_delay)): if float_timer[ "overfill"] and not float_timer["overfill"].hasTerminated(): float_timer["overfill"].cancel() float_timer["overfill"] = createTimer( now.plusSeconds( seconds_between( now, float_last_change["overfill_lower"] ["time"].plusSeconds(float_delay + 1))), lambda: rule_water_high(None)) # check if upper switch has changed within the delay period elif now.isBefore(float_last_change["overfill_upper"]["time"].plusSeconds( float_delay)): if float_timer[ "overfill"] and not float_timer["overfill"].hasTerminated(): float_timer["overfill"].cancel() float_timer["overfill"] = createTimer( now.plusSeconds( seconds_between( now, float_last_change["overfill_upper"] ["time"].plusSeconds(float_delay + 1))), lambda: rule_water_high(None)) # neither switch changed recently, lets take action else: # lower and upper switches are on if overfill_lower and overfill_upper: # pump is off if items["pool_wateroverfill"] == OFF: log.warn("Pool water level is high!") log.info("Turning ON pool emptying relay") sendCommand("pool_wateroverfill", ON) # lower and upper switches are off elif not overfill_lower and not overfill_upper: # pump is on if items["pool_wateroverfill"] == ON: log.info("Turning OFF pool emptying relay") sendCommand("pool_wateroverfill", OFF) # incorrect state, warn and turn off pump if not overfill_lower and overfill_upper: log.error("Pool high level switches in an impossible state!") log.error( "Upper high level float switch is ON but lower float switch is OFF" ) sendCommand("pool_wateroverfill", OFF) sendCommand("pool_overfill_error", ON) else: sendCommand("pool_overfill_error", OFF)
def low_acid__level(event): if items["pool_floatSW_acid_lwvellow"] == OFF: sendCommand("pool_acid_level_low", ON) low_water_level.log.warn("Send Help, Low Acid Level!") else: sendCommand("pool_acid_levellow", OFF)
def low_water_level(event): if items["pool_floatSW_low_water"] == OFF: sendCommand("pool_low_water", ON) low_water_level.log.warn("Send Help, Low Water Level!") else: sendCommand("pool_low_water", OFF)
def umbrella_command(event): log = umbrella_command.log if str(event.itemCommand) == "open": if items["pool_umbrellaup"] == OFF: log.info("Opening Pool Umbrella") sendCommand("pool_umbrelladown", "OFF") sendCommand("pool_umbrellaup", "ON") #sendCommand("POOLCONTROL/umbrella/relay/down/set", "OFF") #sendCommand("POOLCONTROL/umbrella/relay/up/pulse", "120000, ON") elif str(event.itemCommand) == "close": if items["pool_umbrelladown"] == OFF: log.info("Closing Pool Umbrella") sendCommand("pool_umbrellaup", "OFF") sendCommand("pool_umbrelladown", "ON") #sendCommand("POOLCONTROL/umbrella/relay/down/pulse", "120000, ON") #sendCommand("POOLCONTROL/umbrella/relay/up/set", "OFF") elif str(event.itemCommand) == "stop": if items["pool_umbrelladown"] == ON: log.info("Stopping Pool Umbrella") sendCommand("pool_umbrellaup", "OFF") sendCommand("pool_umbrelladown", "OFF") elif str(event.itemCommand) == "stop": if items["pool_umbrellaup"] == ON: log.info("Stopping Pool Umbrella") sendCommand("pool_umbrellaup", "OFF") sendCommand("pool_umbrelladown", "OFF")