# Switch
Logic block representing a wall switch
Switch
C
SP
LP
H
TG
ON
OFF
# Outputs
| ID | Abbrev | Name | Type | Default | Description |
|---|---|---|---|---|---|
click | C | Click | BOOLEAN | false | Active on a click |
short_press | SP | Short press | BOOLEAN | false | Active on a short press |
long_press | LP | Long press | BOOLEAN | false | Active on a long press |
hold | H | Hold | BOOLEAN | false | Active on a hold |
toggle | TG | Toggle | BOOLEAN | false | Toggle output, active after a click |
on | ON | ON | BOOLEAN | false | Active when switch is on |
off | OFF | OFF | BOOLEAN | true | Active when switch is off |
# Configuration
| ID | Name | Type | Default | Unit | Description |
|---|---|---|---|---|---|
click_duration_ms | clickDuration | NUMBER | 500 | ms | Duration of a click in ms Details: ≥ 0 |
short_press_duration_ms | shortPressDuration | NUMBER | 1000 | ms | Duration of a short press in ms Details: ≥ 0 > click_duration_ms |
long_press_duration_ms | longPressDuration | NUMBER | 5000 | ms | Duration of a long press in ms Details: ≥ 0 > short_press_duration_ms |
hold_duration_ms | holdDuration | NUMBER | 1000 | ms | Duration of a hold in ms Details: ≥ 0 |
# State
| ID | Name | Type | Default | Unit | Description |
|---|---|---|---|---|---|
last_change_time_ms | lastChangeTime | NUMBER | 0 | ms | some 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)
}
