# ============================================================ # 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 (hoog→laag of laag→hoog) 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"