Example #1
0
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
Example #2
0
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))
Example #3
0
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))
Example #4
0
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))
Example #5
0
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"
        )
Example #6
0
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')
Example #7
0
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)
Example #8
0
 def relays_off(skip=None):
     for name in pit_relays:
         if name != skip:
             sendCommand(name, OFF)
Example #9
0
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")
Example #10
0
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)
Example #11
0
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)
Example #12
0
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)
Example #13
0
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")