Le module "Portier".



Ma boite aux lettres, installée sur le mur d'enceinte, a la forme d'un petit chalet et posséde une niche qui peux abriter un appareil électronique ; d'autant que le 220v y arrive pour allumer les lampes extérieures. En débutant dans la domotique j'avais trouvé vraiment top la boite aux lettres qui prévient qu'elle contient du courrier ... Mais on peux en faire plus, beaucoup plus !

Voici donc toutes les fonctions que j'ai imaginé pour ce module avec quelques détails techniques pour chacun d'entre eux.
Je vais brancher tout ça sur un ESP32-WROOM-32D installé sur un «devkit» de 30 pins. Un petit module 220v Hi-link délivrera du 5v avec une puissance de 5w. La carte devkit, alimentée en 5v possède un régulateur fournissant du 3,3v.
Les périphériques seront reliés au C.I. par des connecteurs RJ9 (4P4C), c'est pratique pour monter et démonter le module. Il faudra soigneusement les numéroter pour éviter toute interversion.
Le schéma est un peu désordonné mais reste assez simple.

Le dessin du C.I. en cours de réalisation.
La maquette du bidule !

Les fichiers KiCad et PDF sont disponibles sous licence

Plusieurs fonctionnalités nécessitent de valider une autorisation dans HA sous Appareil --> Options

Reste à écrire le fichier YAML de l'appareil dans ESPHome builder; quelques comentaires avant de plonger dans le code.
esphome:
  name: portier-2eae50
  friendly_name: Portier
  min_version: 2025.11.0

esp32:
  variant: esp32
  framework:
    type: esp-idf

logger:

ota:
  - platform: esphome

wifi:
  ssid: !secret wifi_ssid
  password: !secret wifi_password
  ap:
    ssid: "Portier Hotspot"

captive_portal:

api:
  actions:
    - action: alarm_armed
      then:
        - switch.turn_off: LED_verte
        - switch.turn_on: LED_rouge
        - delay: 500ms
        - script.execute:
            id: bipbip
            nombre_bip: 2
        - script.execute:
            id: reset_pincode
    - action: alarm_disarmed
      then:
        - switch.turn_off: LED_rouge
        - switch.turn_on: LED_verte
        - delay: 500ms
        - script.execute:
            id: bipbip
            nombre_bip: 2
        - script.execute:
            id: reset_pincode
    - action: alarm_arm_error
      then:
        - script.execute:
            id: bipbip
            nombre_bip: 4
        - repeat:
            count: 5
            then:
              - switch.turn_on: LED_rouge
              - switch.turn_off: LED_verte
              - delay: 250ms
              - switch.turn_off: LED_rouge
              - switch.turn_on: LED_verte
              - delay: 250ms
        - text_sensor.template.publish:
            id: pincode
            state: ""
    - action: bipbip
      variables:
        nombre_bip: int
      then:
        - script.execute:
            id: bipbip
            nombre_bip: !lambda 'return nombre_bip;'

# Dans l'odre alphabétique des composants
binary_sensor:
  # Bouton sonnette
  - platform: gpio
    id: bouton_sonnette
    name: "bouton_sonnette"
    icon: mdi:button-pointer
    pin:
      number: GPIO34
      mode:
        input: true
    filters:
      - delayed_on: 20ms
      - delayed_off: 20ms
    on_press:
      - homeassistant.action:
          action: switch.turn_on
          data:
            entity_id: switch.relais_sonnette_relais
    on_release:
      - homeassistant.action:
          action: switch.turn_off
          data:
            entity_id: switch.relais_sonnette_relais
  # Détecteur de courier dans la B.A.L.
  - platform: gpio
    id: courrier
    name: "courrier"
    pin:
      number: GPIO33
      mode:
        input: true
    on_press:
      - script.execute:
          id: bipbip
          nombre_bip: 3
  # Détecteur de présence coté rue
  - platform: gpio
    id: presence_rue
    name: "presence_rue"
    device_class: "motion"
    pin:
      number: GPIO35
      mode:
        input: true
    on_press:
      - if:
          condition:
            lambda: 'return id(luminosite).state < 1.5;'
          then:
            - switch.turn_on: LEDs
  # Détecteur de présence coté maison
  - platform: gpio
    id: presence_maison
    name: "presence_maison"
    device_class: "motion"
    pin:
      number: GPIO36
      mode:
        input: true
    on_press:
      - if:
          condition:
            lambda: 'return id(luminosite).state < 1.5;'
          then:
            - switch.turn_on: relais

# Bus des capteurs NFC et météo
i2c:
  - id: bus_PN532
    sda: GPIO4
    scl: GPIO5
  - id: bus_BME280
    sda: GPIO26
    scl: GPIO27

key_collector:
  - id: pincode_reader
    source_id: clavier
    min_length: 4
    max_length: 4
    allowed_keys: "0123456789"
    timeout: 8s
    on_progress:
      - script.execute:
          id: bipbip
          nombre_bip: 1
    on_result:
      - text_sensor.template.publish:
          id: pincode
          state: !lambda "return x.c_str();"
      - script.execute:
          id: reset_pincode
    on_timeout:
      - script.execute:
          id: bipbip
          nombre_bip: 3

# Clavier numérique
matrix_keypad:
  id: clavier
  rows:
    - pin: 12
    - pin: 13
    - pin: 14
    - pin: 15
  columns:
    - pin: 16
    - pin: 17
    - pin: 18
  keys: "123456789*0#"
        
# Buzzer
output:
  - platform: ledc
    pin: GPIO25
    id: buzzer

# Capteur NFC
pn532_i2c:
  i2c_id: bus_PN532
  on_tag:
    - script.execute:
        id: bipbip
        nombre_bip: 1
    - text_sensor.template.publish:
        id: pincode
        state: !lambda "return x;"
    - script.execute:
        id: reset_pincode

script:
  - id: bipbip
    parameters:
      nombre_bip: int
    then:
      - repeat:
          count: !lambda return nombre_bip;
          then:
            - output.turn_on: buzzer
            - output.ledc.set_frequency:
                id: buzzer
                frequency: "1kHz"
            - output.set_level:
                id: buzzer
                level: 90%
            - delay: 200ms
            - output.turn_off: buzzer
            - delay: 200ms
  - id: reset_pincode
    then:
      - delay: 3s
      - text_sensor.template.publish:
          id: pincode
          state: ""

        
sensor:
  # LDR de mesure de la luminosité
  - platform: adc
    pin: GPIO39
    id: luminosite
    name: "luminosite"
    attenuation: auto
    filters:
      - sliding_window_moving_average:
          window_size: 10
          send_every: 10
  # Capteur météo
  - platform: bme280_i2c
    i2c_id: bus_BME280
    address: 0x76
    temperature:
      name: "Temperature rue"
    pressure:
      name: "Pression rue"
      filters:
        - offset: 25 # Pour altitude = 206m
    humidity:
      name: "Humidité rue"
    update_interval: 1min

switch:
  # Relais lumière 220v
  - platform: gpio
    id: relais
    name: relais
    pin: GPIO19
    on_turn_on: 
      - delay: 30s
      - switch.turn_off: relais
  # LEDs d'éclairage
  - platform: gpio
    id: LEDs
    name: LEDs
    pin: GPIO21
    on_turn_on: 
      - delay: 30s
      - switch.turn_off: LEDs
  # LEDs de signalisation clavier
  - platform: gpio
    id: LED_rouge
    name: LED_rouge
    pin: GPIO22
  - platform: gpio
    id: LED_verte
    name: LED_verte
    pin: GPIO23

text_sensor:
  - platform: template
    name: pincode
    id: pincode
    update_interval: never
			

En bonus voyons maintenant le module "Récepteur_sonnette" qui, placé dans la maison, actionne ma sonnette vintage.
C'est aussi un bon exemple de deux modules qui communiquent entre eux via HA.
La maquette connectée à la sonnette : rien ne va plus, l'ESP perd le WIFI et le relais reste collé ! Ma vénérable sonnette est composée d'un électro-aimant qui frappe une cloche : very simple mais c'est une mtrailleuse à parasites ! Mais je veux la garder car je l'entend dans toute la maison, y compris le sous-sol. En l'alimentant à travers un filtre antiparasite tout rentre dans l'ordre et elle ne perturbe plus mon ESP. Liste des composants : J'ai dessoudé les borniers du module relais pour l'installer sur mon C.I.. Je ressort aussi sur un bornier le GPIO2 et GND afin de brancher un bouton qui commandera le relais de lumière du module "portier".

Ci dessous le schéma et le dessin du C.I. Attention a bien souder un fil sur GPIO2 AVANT de placer le module relais sur le C.I. (Petit fil bleu sur la photo)

Les fichiers KiCad et PDF sont disponibles sous licence

Voici le code YAML de l'appareil ; attention il faudra aussi activer l'autorisation d'effectuer des actions dans HA afin de pouvoir commander le relais de lumière.
Une temporisation de 5s coupe la sonnette au cas ou un dysfonctionnement empêcherait le relais de retomber.
Pour commander la lumière j'ai actuellement un interrupteur; donc j'utilise "on_state_change" mais il faudrait un poussoir type télérupteur et utiliser "on_press" ...

esphome:
  name: relais-sonnette
  friendly_name: Relais sonnette

esp8266:
  board: esp01_1m

logger:
  esp8266_store_log_strings_in_flash: false

api:

wifi:
  ssid: !secret wifi_ssid
  password: !secret wifi_password
  ap:
    ssid: "Relais-sonnette Hotspot"

captive_portal:

ota:
  - platform: esphome

binary_sensor:
  - platform: gpio
    id: switch_lumiere
    name: switch_lumiere
    pin:
      number: GPIO2
      mode:
        input: true
        pullup: true
    filters:
      - delayed_on: 20ms
      - delayed_off: 20ms
    on_state_change:
      - homeassistant.action:
          action: switch.turn_on
          data:
            entity_id: switch.portier_relais

switch:
  - platform: gpio
    id: relais
    name: relais
    pin: GPIO0
    inverted: true
    on_turn_on:
    - delay: 5s
    - switch.turn_off: relais