# Switch

Input register

Logic block representing a wall switch

Switch
C
SP
LP
H
TG
ON
OFF

# Outputs

IDAbbrevNameTypeDefaultDescription
clickCClickBOOLEANfalseActive on a click
short_pressSPShort pressBOOLEANfalseActive on a short press
long_pressLPLong pressBOOLEANfalseActive on a long press
holdHHoldBOOLEANfalseActive on a hold
toggleTGToggleBOOLEANfalseToggle output, active after a click
onONONBOOLEANfalseActive when switch is on
offOFFOFFBOOLEANtrueActive when switch is off

# Configuration

IDNameTypeDefaultUnitDescription
click_duration_msclickDurationNUMBER500msDuration of a click in ms

Details:

≥ 0
short_press_duration_msshortPressDurationNUMBER1000msDuration of a short press in ms

Details:

≥ 0
> click_duration_ms
long_press_duration_mslongPressDurationNUMBER5000msDuration of a long press in ms

Details:

≥ 0
> short_press_duration_ms
hold_duration_msholdDurationNUMBER1000msDuration of a hold in ms

Details:

≥ 0

# State

IDNameTypeDefaultUnitDescription
last_change_time_mslastChangeTimeNUMBER0mssome description

# Source Code

View Volang source
callback_ms = 100
channel = input::channel()

extern fn onCallback(callback_id, callback_ms) {
    if (callback_id == 1) {
        output::set("click", false)
    } else if (callback_id == 2) {
        output::set("short_press", false)
    } else if (callback_id == 3) {
        output::set("long_press", false)
    } else if (callback_id == 10) { // hold check
        if (output::get("on") == true) {
            if (output::get("hold")) {
                output::set("hold", false)
                callback::set(config::get("hold_duration_ms"), "onCallback", 10, callback_ms)
            } else if (!output::get("hold")) {
                output::set("hold", true)
                callback::set(callback_ms, "onCallback", 10, callback_ms) // schedule callback to switch off the hold pulse
            }
        }
    }
}

pressed = input::value()
now = time::uptime()

if (pressed == 1) {
    state::set("last_change_time_ms", now)
    output::set("on", true)
    output::set("off", false)

    callback::set(config::get("hold_duration_ms"), "onCallback", 10, callback_ms)
} else {
    callback::clear()

    diff_ms = time::uptime() - state::get("last_change_time_ms")

    clicked = false
    if (diff_ms <= config::get("click_duration_ms")) {
        output::set("click", true)
        callback::set(callback_ms, "onCallback", 1, callback_ms)
        clicked = true
    } else if (diff_ms <= config::get("short_press_duration_ms")) {
        output::set("short_press", true)
        callback::set(callback_ms, "onCallback", 2, callback_ms)
    } else if (diff_ms <= config::get("long_press_duration_ms")) {
        output::set("long_press", true)
        callback::set(callback_ms, "onCallback", 3, callback_ms)
    }

    if (clicked) {
        output::toggle("toggle")
    }
    output::set("on", false)
    output::set("off", true)

    output::set("hold", false)
}
Logic block representing a wall switch