shelly-scripts/1PM-mini-gen4/detached-script.js

326 lines
No EOL
9.5 KiB
JavaScript
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# ============================================================
# ESPHome - Shelly 1PM Mini Gen4
# Gira System 55 aan-uit schakelaar
# ============================================================
#
# Schakelmodi:
# - Detached: Schakelaar stuurt events naar HA, relay wordt
# door HA-automations aangestuurd.
# - Toggle: Elke schakelactie togglet de lamp.
# - Volgen: Schakelaarstand = lampstatus (aan/uit).
#
# Fallback:
# Wanneer er GEEN verbinding is met Home Assistant (geen WiFi
# of API), valt de schakelaar automatisch terug op Toggle-modus
# zodat de lamp altijd lokaal bedienbaar blijft.
#
# ============================================================
# PINOUT Shelly 1PM Mini Gen4 (ESP32-C3)
# ============================================================
# GPIO3 - Relay
# GPIO10 - Switch input (wandschakelaar)
# GPIO4 - Deviceknop (op de Shelly zelf)
# GPIO0 - Status LED
# GPIO6 - UART TX (BL0942 energiemeting)
# GPIO7 - UART RX (BL0942 energiemeting)
#
# Controleer altijd de pinout voor jouw hardwareversie!
# ============================================================
substitutions:
device_name: "shelly-1pm-mini-gen4"
friendly_name: "Shelly 1PM Mini Gen4"
# Pas onderstaande aan per kamer/locatie:
light_name: "Lamp"
esphome:
name: ${device_name}
friendly_name: ${friendly_name}
esp32:
board: esp32-c3-devkitm-1
framework:
type: esp-idf
# ------------------------------------------------------------
# Logging
# ------------------------------------------------------------
logger:
baud_rate: 0 # Disable UART logging (UART wordt gebruikt voor BL0942)
# ------------------------------------------------------------
# WiFi
# ------------------------------------------------------------
wifi:
ssid: !secret wifi_ssid
password: !secret wifi_password
# Fallback Access Point als WiFi wegvalt
ap:
ssid: "${friendly_name} AP"
password: !secret ap_password
# Sneller reconnecten
fast_connect: true
power_save_mode: LIGHT
# Captive portal voor fallback AP
captive_portal:
# ------------------------------------------------------------
# Home Assistant API
# ------------------------------------------------------------
api:
encryption:
key: !secret api_key
# ------------------------------------------------------------
# OTA Updates
# ------------------------------------------------------------
ota:
- platform: esphome
password: !secret ota_password
# ------------------------------------------------------------
# Webserver (optioneel, handig voor debugging)
# ------------------------------------------------------------
web_server:
port: 80
# ------------------------------------------------------------
# Globale variabelen
# ------------------------------------------------------------
globals:
# Schakelmodus: 0 = Detached, 1 = Toggle, 2 = Volgen
- id: switch_mode
type: int
restore_value: yes
initial_value: "0"
# ------------------------------------------------------------
# Relay output
# ------------------------------------------------------------
output:
- platform: gpio
id: relay_output
pin: GPIO3
# ------------------------------------------------------------
# Lamp (als Light-entity voor volledige HA-integratie)
# ------------------------------------------------------------
light:
- platform: binary
id: lamp
name: "${light_name}"
output: relay_output
restore_mode: RESTORE_DEFAULT_OFF
# ------------------------------------------------------------
# Wandschakelaar (Gira System 55 aan-uit schakelaar)
# ------------------------------------------------------------
# Een aan-uit schakelaar heeft twee stabiele standen.
# Bij elke standswijziging (hooglaag of laaghoog) wordt
# een actie getriggerd. We gebruiken on_state zodat BEIDE
# overgangen als schakelmoment werken.
# ------------------------------------------------------------
binary_sensor:
- platform: gpio
id: wall_switch
name: "${light_name} Schakelaar"
pin:
number: GPIO10
mode:
input: true
pullup: true
inverted: true
filters:
- delayed_on: 30ms
- delayed_off: 30ms
on_state:
then:
- lambda: |-
// -----------------------------------------------
// FALLBACK: Geen API-verbinding → altijd Toggle
// -----------------------------------------------
if (!id(ha_connected).state) {
auto call = id(lamp).toggle();
call.perform();
ESP_LOGD("switch", "Geen HA-verbinding → fallback toggle");
return;
}
// -----------------------------------------------
// DETACHED (modus 0)
// -----------------------------------------------
if (id(switch_mode) == 0) {
// Stuur event naar HA; HA bepaalt wat er gebeurt
// De schakelaarstand wordt als binary_sensor zichtbaar
ESP_LOGD("switch", "Detached → event naar HA");
return;
}
// -----------------------------------------------
// TOGGLE (modus 1)
// -----------------------------------------------
if (id(switch_mode) == 1) {
auto call = id(lamp).toggle();
call.perform();
ESP_LOGD("switch", "Toggle → lamp omgeschakeld");
return;
}
// -----------------------------------------------
// VOLGEN (modus 2)
// -----------------------------------------------
if (id(switch_mode) == 2) {
if (x) {
auto call = id(lamp).turn_on();
call.perform();
} else {
auto call = id(lamp).turn_off();
call.perform();
}
ESP_LOGD("switch", "Volgen → lamp volgt schakelaar");
return;
}
# Knop op de Shelly zelf
- platform: gpio
id: device_button
name: "${light_name} Knop"
pin:
number: GPIO4
mode:
input: true
pullup: true
inverted: true
filters:
- delayed_on: 30ms
- delayed_off: 30ms
on_press:
then:
- light.toggle: lamp
# HA-verbindingsstatus (voor fallback-logica)
- platform: status
id: ha_connected
name: "${friendly_name} Status"
internal: true
# ------------------------------------------------------------
# Schakelmodus selector (instelbaar vanuit HA)
# ------------------------------------------------------------
select:
- platform: template
id: switch_mode_select
name: "${light_name} Schakelmodus"
icon: "mdi:light-switch"
options:
- "Detached"
- "Toggle"
- "Volgen"
initial_option: "Detached"
optimistic: true
restore_value: true
set_action:
- lambda: |-
if (x == "Detached") {
id(switch_mode) = 0;
ESP_LOGI("mode", "Schakelmodus → Detached");
} else if (x == "Toggle") {
id(switch_mode) = 1;
ESP_LOGI("mode", "Schakelmodus → Toggle");
} else if (x == "Volgen") {
id(switch_mode) = 2;
ESP_LOGI("mode", "Schakelmodus → Volgen");
}
# ------------------------------------------------------------
# UART voor BL0942 energiemeting
# ------------------------------------------------------------
uart:
tx_pin: GPIO6
rx_pin: GPIO7
baud_rate: 9600
# ------------------------------------------------------------
# Energiemeting (BL0942)
# ------------------------------------------------------------
sensor:
- platform: bl0942
voltage:
name: "${light_name} Spanning"
unit_of_measurement: "V"
accuracy_decimals: 1
filters:
- sliding_window_moving_average:
window_size: 5
send_every: 5
current:
name: "${light_name} Stroom"
unit_of_measurement: "A"
accuracy_decimals: 3
filters:
- sliding_window_moving_average:
window_size: 5
send_every: 5
power:
name: "${light_name} Vermogen"
unit_of_measurement: "W"
accuracy_decimals: 1
filters:
- sliding_window_moving_average:
window_size: 5
send_every: 5
energy:
name: "${light_name} Energie"
unit_of_measurement: "kWh"
accuracy_decimals: 3
frequency:
name: "${light_name} Frequentie"
unit_of_measurement: "Hz"
accuracy_decimals: 1
update_interval: 10s
# WiFi signaalsterkte
- platform: wifi_signal
name: "${friendly_name} WiFi Signaal"
update_interval: 60s
# Uptime
- platform: uptime
name: "${friendly_name} Uptime"
update_interval: 300s
# ------------------------------------------------------------
# Status LED
# ------------------------------------------------------------
status_led:
pin:
number: GPIO0
inverted: true
# ------------------------------------------------------------
# Diagnostische tekst-sensoren
# ------------------------------------------------------------
text_sensor:
- platform: wifi_info
ip_address:
name: "${friendly_name} IP"
ssid:
name: "${friendly_name} SSID"
- platform: version
name: "${friendly_name} ESPHome Versie"
# ------------------------------------------------------------
# Restart-knop vanuit HA
# ------------------------------------------------------------
button:
- platform: restart
name: "${friendly_name} Herstart"
icon: "mdi:restart"
- platform: safe_mode
name: "${friendly_name} Safe Mode"
icon: "mdi:shield-bug"