L'ultime sonnette intelligente base ESP32 S3 CAM

Bonjour tout le monde, un petit moment que je bidouille dans mon coin, et surtout un bon moment que je cherche a me faire une sonnette connectée intelligente. Cependant mon problème a l’époque c’est qu’il fallait pas mal de matos mais aujourd’hui les puces ont bien évoluées et la plupart sont bien gérer dans esphome. A la base je voulais juste un petit truc tout banal mais le choix d’un esp en particulier m’a confirmer que l’ont pouvait aller bien plus loin dans le ce petit concentré de technologie.

A la suite d’une autre discussion au sujet d’une puce esp32 que vous pouvez retrouver ici:
https://forum.hacf.fr/t/esp32-s3-n16r8-avec-cam-micro-et-haut-parleur/47411/2
je me suis remis a taffer dessus. une programmation en espidf pur me semblais intéressante mais esp home a visiblement quelques avantages supplémentaire.

Description du projet point par point:

  • puce: esp32S3 CAMERA/PSRAM
  • amplificateur pour HP/micro NS4168
  • pilotage gache electrique via MOSFET/relais
  • 2X Leds infrarouge 940nm 3W via driver led en pwm pour eviter la chauffe ( ces betes la chauffe beaucoup ) le choix des 940 est pour eviter que la lumiere soit visible ( et ne pas eveiller la curiosité des gens )
  • dissipateurs thermique FORTEMENT conseillé pour les leds IR
  • led RGB intégré WS2812 pour effets differents au bouton
  • utilisation d’un capteur de mouvement/présence via LD2420 pour prévenir Frigate et éviter les fausses détections (animaux/voitures) et n’enregistrer QUE lorsque necessaire ( vis a vis de la legislation en France)
  • utilisation de ha pour renseigner la hauteur du soleil et interagir avec l’éclairage du bouton
  • utilisation de frigate pour assurer la détection/identifier/enregistrer
  • ajout d’un buzzer pour confirmer l’appuis sur le bouton en plus de l’effet visuel ( en cours )

le pin du bouton central reste encore a etre identifier il n’est pour le moment pas fonctionnel!!!

!!! MISE EN GARDE !!!

l’installation d’une camera sur la voie publique est interdit en France

Cependant ici la camera ne filmera/enregistrera UNIQUEMENT lorsque une présence est détectée ( donc plusieurs secondes ), pour le moment aucun réglage n’a encore été fait pour régler la sensibilité du LD2420, c’est une partie a venir.

je vous partage le code encore actuellement en phase alpha, j’ai usé des substitutions pour que chacun puisse adapter a ces besoins. le pinout est “FORCER” par le PCB cependant j’ai indiquer les pins utilisés, non utilisés afin que vous puissiez la aussi adapter a vos besoins.

il me reste encore des essais a faire et surtout retrouver le pin du bouton qui n’est indiqué nul pars même dans les sources originelles de cette carte.

Suivra par la suite le coté Carillon

l’utilisation du lecteur SD étant encore très peu supporté par esphome autant en faire abstraction pour le moment.

place au code: ( encore en phase alpha )

PS: esphome fournissant deja l’etats des entités dans HA, vous pouvez desactiver MQTT pour eviter les doublons a moins que vous en ayez besoin pour interragir avec d’autres appareils connecté.

# PINS LIbres non utilisé sur cet esp s3:

# GPIO0 (strap pin → à éviter si possible)

# GPIO1 (souvent dispo, attention UART selon board)

# GPIO3, GPIO11, GPIO12, GPIO13, GPIO14, GPIO16, GPIO17, GPIO18,

# GPIO19, GPIO20, GPIO22, GPIO23, GPIO24, GPIO25,

# GPIO26, GPIO27, GPIO28, GPIO29, GPIO30, GPIO31,

# GPIO32, GPIO43, GPIO44

# (legacy code notes)

# SPI1 (old/unused):

#   CLK: GPIO4

#   MISO: GPIO13

#   MOSI: GPIO21

# SD Card (old/unused):

#   CLK: GPIO4

#   DAT0: GPIO13

#   CMD: GPIO21

#   CD: GPIO19




# ----------------------------------------------------

# PIN UTILISE sur ce projet:

# ----------------------------------------------------




# Système / statut

# !!!!! ATTENTION CE PIN est raccordé pour le status de la carte SD

# GPIO2 : status_led




# LED / IR / PWM

# GPIO21 : WS2812 (RMT)

# GPIO15 : PWM IR (LEDC)





# SPI/ SDCARD Réservé pour ne pas tout mélangé

# GPIO3, GPIO11, GPIO12,




# Caméra + I2C caméra

# GPIO33 : XCLK (external_clock)

# GPIO41 : PCLK (pixel_clock)

# GPIO34 : HREF

# GPIO35 : VSYNC

# GPIO4, 5, 6, 7, 8, 42, 47, 48 : D0..D7 (data_pins)

# GPIO36 (SCL), GPIO37 (SDA) : I2C cam (SCCB)




# Audio I2S

# GPIO38 : I2S DIN (micro)

# GPIO39 : I2S BCLK (micro)

# GPIO40 : I2S LRCLK/WS (micro)

# GPIO9 : I2S DOUT (speaker)

# GPIO10 : I2S BCLK (speaker)

# GPIO45 : I2S LRCLK (speaker)

# GPIO46 : PA_CTRL (ampli enable)

# ----------------------------------------------------

# SONNETTE ESP32-S3 CAM + AUDIO + LD2420 + IR + GÂCHE

# ----------------------------------------------------




substitutions:

  device_name: sonnette

  friendly_name: sonnette portail




  wifi_ssid: !secret wifi_ssid

  wifi_password: !secret wifi_password




  api_encryption_key: "!secret encryption_key"

  ota_password: "12345678"




  hotspot_ssid: "Sonnette Hotspot"

  hotspot_password: "12345678"




  static_ip: 192.168.10.127

  gateway_ip: 192.168.10.1

  subnet_mask: 255.255.255.0

  dns_ip: 192.168.10.1




  mqtt_broker: 192.168.10.21

  mqtt_username: sonnette

  mqtt_password: Sonnette!!




  media_url: "http://192.168.10.21:8123/media-browser/browser/app%2Cmedia-source%3A%2F%2Fmedia_source/%2Cmedia-source%3A%2F%2Fmedia_source%2Flocal%2FThe%20Prodigy/%2Cmedia-source%3A%2F%2Fmedia_source%2Flocal%2FThe%20Prodigy%2FBreathe"




  # --------- Seuils “nuit” basés sur l’élévation du soleil ----------

  # (rasant = soleil bas sur l’horizon, typiquement entre -6° et +6° selon ton goût)

  sun_on_elevation: "-2.0"     # devient "nuit" quand élévation <= -2°

  sun_off_elevation: "2.0"     # redevient "jour" quand élévation >= +2°




  # ---- IR ----

  ir_idle_night: "0.25"        # 25% la nuit

  ir_boost_night: "0.90"       # 90% pendant détection (nuit)

  ir_boost_ms: "15000"         # durée du boost après détection




  # ---- timings sonnette ----

  ring_antidouble_ms: "2000"

  ring_timeout_s: "30"

  strike_pulse_ms: "3000"




esphome:

  name: ${device_name}

  friendly_name: ${friendly_name}

  platformio_options:

    build_flags: -DBOARD_HAS_PSRAM

    board_build.arduino.memory_type: qio_opi

    board_build.f_flash: 80000000L

    board_build.flash_mode: qio

  on_boot:

    priority: -100

    then:

      - switch.turn_on: amp_enable

      - delay: 200ms

      - script.execute: update_daynight

      - script.execute: apply_idle_state




esp32:

  board: esp32-s3-devkitc-1

  flash_size: 16MB

  partitions: partitions_16mb_ota.csv

  framework:

    type: esp-idf

    sdkconfig_options:

      CONFIG_FATFS_LFN_STACK: "y" # inutilisé ici mais en prevision de l'utilisation du lecteur de carte sd




logger:




ota:

  - platform: esphome

    password: ${ota_password}




api:

  encryption:

    key: ${api_encryption_key}




# ----------------------------------------------------

# Services HA -> ESP (pratique)

# Tu appelles ça depuis une automation / bouton HA

# ----------------------------------------------------

  services:

    - service: call_answered

      then:

        - script.execute: on_call_answered




    - service: open_door

      then:

        - script.execute: open_strike




    - service: apply_idle

      then:

        - script.execute: apply_idle_state




    - service: ir_boost_now

      then:

        - script.execute: ir_boost




wifi:

  ssid: ${wifi_ssid}

  password: ${wifi_password}




  manual_ip:

    static_ip: ${static_ip}

    gateway: ${gateway_ip}

    subnet: ${subnet_mask}

    dns1: ${dns_ip}




  ap:

    ssid: ${hotspot_ssid}

    password: ${hotspot_password}




captive_portal:




web_server:

  port: 80




time:

  - platform: homeassistant

    id: homeassistant_time




mqtt:

  broker: ${mqtt_broker}

  port: 1883

  username: ${mqtt_username}

  password: ${mqtt_password}

  discovery: true




# ESPHome 2026.x: la camera exige psram:

psram:

  mode: quad

  speed: 80MHz




# ----------------------------------------------------

# Globals

# ----------------------------------------------------

globals:

  - id: last_ring_ms

    type: uint32_t

    restore_value: no

    initial_value: '0'




  - id: breathe_level

    type: float

    restore_value: no

    initial_value: '0.0'




  - id: call_answered_flag

    type: bool

    restore_value: no

    initial_value: "false"

# ----------------------------------------------------

# État Jour/Nuit basé sur le soleil (élévation)

# ----------------------------------------------------

  - id: is_night

    type: bool

    restore_value: no

    initial_value: "false"




# ----------------------------------------------------

# Soleil (élévation) depuis HA

# ----------------------------------------------------

sensor:

  - platform: homeassistant

    id: sun_elevation

    entity_id: sensor.sun_solar_elevation

    internal: true

    on_value:

      then:

        - script.execute: update_daynight




# (optionnel) capteurs distance LD2420

  - platform: ld2420

    moving_distance:

      name: "LD2420 Moving Distance"




# ----------------------------------------------------

# UART + LD2420

# (TX/RX à adapter si besoin)

# ----------------------------------------------------

uart:

  - id: uart_ld2420

    tx_pin: GPIO17

    rx_pin: GPIO16

    baud_rate: 115200




ld2420:

  uart_id: uart_ld2420




text_sensor:

  - platform: ld2420

    fw_version:

      name: "LD2420 Firmware"




# ----------------------------------------------------

# SPI réservé (pour plus tard)

# ----------------------------------------------------

spi:

  id: sd_spi

  clk_pin: GPIO11

  mosi_pin: GPIO3

  miso_pin: GPIO12




# ⚠️ WARNING:

# GPIO2 is physically wired as SD_CS on the PCB.

# status_led is used ONLY while SD card is NOT enabled.

# If SD (SPI) is enabled in the future, REMOVE status_led on GPIO2.

status_led:

  pin:

    number: GPIO2

    inverted: true




# ----------------------------------------------------

# Lumières/LED/Infra Rouge

# ----------------------------------------------------

light:

# --------------------------

# LED RGB WS2812 (GPIO21)

# --------------------------

  - platform: esp32_rmt_led_strip

    id: led_sonnette

    name: "LED RGB Sonnette"

    pin: GPIO21

    num_leds: 1

    chipset: WS2812

    rgb_order: GRB

    restore_mode: RESTORE_DEFAULT_OFF

    effects:

      - strobe:

          name: "Strobo Rouge"

          colors:

            - red: 100%

              green: 0%

              blue: 0%

              duration: 120ms

            - red: 0%

              green: 0%

              blue: 0%

              duration: 120ms

      - pulse:

          name: "Respiration Bleue"

          transition_length: 500ms

          update_interval: 1.2s




# --------------------------

# LED IR dimmable PWM via driver led

# --------------------------

  - platform: monochromatic

    id: ir_light

    name: "IR"

    output: ir_pwm

    restore_mode: ALWAYS_OFF




# ----------------------------------------------------

# Sorties

# ----------------------------------------------------

output:

# --------------------------

# - driver led IR dimmable

# --------------------------

  - platform: ledc

    id: ir_pwm

    pin: GPIO15

    frequency: 2000 Hz




# --------------------------

# - Ampli NS4168 : PA_CTRL=GPIO46, LRCLK=GPIO45, BCLK=GPIO10, DOUT=GPIO9

# - Micro MSM261S4030 : WS=GPIO40, BCLK=GPIO39, DIN=GPIO38

# --------------------------

  - platform: gpio

    pin: GPIO46

    id: pa_ctrl




# ----------------------------------------------------

# Switchs

# ----------------------------------------------------

switch:

  - platform: output

    name: "Amplifier Enable (NS4168)"

    output: pa_ctrl

    id: amp_enable

    restore_mode: RESTORE_DEFAULT_ON




# ----------------------------------------------------

# Gâche électrique (GPIO14) — impulsion ~3s

# (⚠️ Mets un driver: MOSFET/relai + diode roue libre selon la gâche)

# ----------------------------------------------------

  - platform: gpio

    id: strike

    name: "Gâche (GPIO14)"

    pin: GPIO14

    restore_mode: ALWAYS_OFF

    on_turn_on:

      - delay: ${strike_pulse_ms}ms

      - switch.turn_off: strike




button:

  - platform: template

    name: "Ouvrir la gâche"

    icon: "mdi:lock-open"

    on_press:

      - switch.turn_on: strike

      

# --------------------------

# I2C caméra (SCCB) (pins EXACTS du firmware d'origine)

# --------------------------

i2c:

  - id: cam_i2c

    sda: GPIO37

    scl: GPIO36

    frequency: 100kHz




esp32_camera:

  name: camera_jardin




  # XCLK = GPIO33 (firmware d'origine)

  external_clock:

    pin: GPIO33

    frequency: 20MHz




  i2c_id: cam_i2c




  # data_pins DOIT être D0..D7 dans l'ordre

  data_pins: [GPIO7, GPIO5, GPIO4, GPIO6, GPIO8, GPIO42, GPIO48, GPIO47]

  vsync_pin: GPIO35

  href_pin: GPIO34




  # PCLK = GPIO41 (firmware d'origine)

  pixel_clock_pin: GPIO41




  resolution: 640x480

  jpeg_quality: 12

  max_framerate: 5 fps

  idle_framerate: 0.2 fps




  vertical_flip: false

  horizontal_mirror: false

  contrast: 2

  brightness: 2

  saturation: 0




esp32_camera_web_server:

  - port: 8080

    mode: stream

  - port: 8081

    mode: snapshot




# ----------------------------------------------------

# Audio I2S

# ----------------------------------------------------

i2s_audio:

  - id: i2s_in

    i2s_lrclk_pin: GPIO40

    i2s_bclk_pin: GPIO39




  - id: i2s_out

    i2s_lrclk_pin: GPIO45

    i2s_bclk_pin: GPIO10




microphone:

  - platform: i2s_audio

    id: mic

    i2s_audio_id: i2s_in

    adc_type: external

    i2s_din_pin: GPIO38

    pdm: false




speaker:

  - platform: i2s_audio

    id: spk

    i2s_audio_id: i2s_out

    dac_type: external

    i2s_dout_pin: GPIO9

    i2s_mode: primary




media_player:

  - platform: speaker

    name: "HP Sonnette"

    id: mp

    announcement_pipeline:

      speaker: spk

      format: WAV

      sample_rate: 16000

      num_channels: 1






# ----------------------------------------------------

# Bouton sonnette physique + anti-double + logique

# ----------------------------------------------------

binary_sensor:

  - platform: gpio

    id: doorbell_button

    name: "Bouton Sonnette (GPIO19)"

    pin:

      number: GPIO19

      mode: INPUT_PULLUP

      inverted: true

    on_press:

      then:

        - script.execute: on_button_pressed




  - platform: ld2420

    has_target:

      id: presence

      name: "Présence (LD2420)"

      on_press:

        then:

          - script.execute: on_presence

      on_release:

        then:

          - script.execute: on_presence_cleared




script:

  - id: breathe_blue

    mode: restart

    then:

      - repeat:

          count: 8

          then:

            - lambda: |-

                id(breathe_level) += 0.125f;

                if (id(breathe_level) > 1.0f) id(breathe_level) = 1.0f;

            - light.turn_on:

                id: led_sonnette

                red: 0%

                green: 0%

                blue: 100%

                brightness: !lambda "return id(breathe_level);"

            - delay: 150ms

      - repeat:

          count: 8

          then:

            - lambda: |-

                id(breathe_level) -= 0.125f;

                if (id(breathe_level) < 0.0f) id(breathe_level) = 0.0f;

            - light.turn_on:

                id: led_sonnette

                red: 0%

                green: 0%

                blue: 100%

                brightness: !lambda "return id(breathe_level);"

            - delay: 150ms




# ----------------------------------------------------

# Scripts “moteur” (ta logique complète)

# ----------------------------------------------------

  # 1) Calcul jour/nuit selon élévation

  - id: update_daynight

    mode: restart

    then:

      - lambda: |-

          if (!id(sun_elevation).has_state()) return;

          const float el = id(sun_elevation).state;

          const float on_th  = atof("${sun_on_elevation}");

          const float off_th = atof("${sun_off_elevation}");

          // Hystérésis: on devient nuit sous on_th, on redevient jour au-dessus de off_th

          if (!id(is_night) && el <= on_th) id(is_night) = true;

          else if (id(is_night) && el >= off_th) id(is_night) = false;




  # 2) Applique l’état idle (jour/nuit)

  - id: apply_idle_state

    mode: restart

    then:

      - if:

          condition:

            lambda: 'return id(is_night);'

          then:

            # Nuit: IR 25% + LED bouton bleu faible

            - light.turn_on:

                id: ir_light

                brightness: ${ir_idle_night}

            - light.turn_on:

                id: led_sonnette

                red: 0%

                green: 0%

                blue: 100%

                brightness: 25%

          else:

            # Jour: IR OFF + LED OFF (ou tu peux mettre bleu 25% si tu veux)

            - light.turn_off: ir_light

            - light.turn_off: led_sonnette




  # 3) Boost IR pendant détection présence (nuit)

  - id: ir_boost

    mode: restart

    then:

      - if:

          condition:

            lambda: 'return id(is_night);'

          then:

            - light.turn_on:

                id: ir_light

                brightness: ${ir_boost_night}

            - delay: ${ir_boost_ms}ms

            - script.execute: apply_idle_state




  # 4) Présence détectée -> IR boost + event HA + (option) snapshot

  - id: on_presence

    mode: restart

    then:

      - script.execute: ir_boost

      - homeassistant.event:

          event: esphome.sonnette_presence

          data:

            device: "${device_name}"

      # Pour snapshot: fais une automation HA sur cet event

      - homeassistant.event:

          event: esphome.sonnette_snapshot_request

          data:

            device: "${device_name}"




  - id: on_presence_cleared

    mode: restart

    then:

      - homeassistant.event:

          event: esphome.sonnette_presence_cleared

          data:

            device: "${device_name}"




  # 5) Bouton appuyé -> strobe rouge + son + notif + attente réponse 30s

  - id: on_button_pressed

    mode: restart

    then:

      - lambda: |-

          const uint32_t now = millis();

          if (now - id(last_ring_ms) < (uint32_t)atoi("${ring_antidouble_ms}")) return;

          id(last_ring_ms) = now;

          id(call_answered_flag) = false;  // reset à chaque appel




      # Feedback immédiat: le bouton a bien marché

      - light.turn_on:

          id: led_sonnette

          effect: "Strobo Rouge"




      # Event HA pour tout ce qui est “système” (notif téléphone, frigate record, etc.)

      - homeassistant.event:

          event: esphome.doorbell_pressed

          data:

            device: "${device_name}"




      # Sonnerie locale 1x (si tu veux garder ton media_url HA)

      - media_player.play_media:

          id: mp

          media_url: "${media_url}"




      # Attente “quelqu’un décroche” -> piloté par HA via un service (voir plus bas)

      - delay: ${ring_timeout_s}s

      # Si au bout de 30s personne n’a “répondu” (via HA), on stoppe tout et on déclenche la séquence message

      - if:

          condition:

            lambda: 'return !id(call_answered_flag);'

          then:

            - light.turn_off: led_sonnette

            - homeassistant.event:

                event: esphome.doorbell_no_answer

                data:

                  device: "${device_name}"




  # 6) Quand HA indique “quelqu’un a répondu” -> stop strobe + respiration bleue

  - id: on_call_answered

    mode: restart

    then:

      - light.turn_on:

          id: led_sonnette

          effect: "Respiration Bleue"

      - homeassistant.event:

          event: esphome.doorbell_answered

          data:

            device: "${device_name}"




  # 7) Ouverture gâche depuis HA (ou bouton interne) + arrêt effet

  - id: open_strike

    mode: restart

    then:

      - switch.turn_on: strike

      - light.turn_off: led_sonnette

      - script.execute: apply_idle_state

      - homeassistant.event:

          event: esphome.doorbell_strike_opened

          data:

            device: "${device_name}"

ici le code du fichier de partition pour du 16MB de flash: partitions_16mb_ota.csv

Name,   Type, SubType, Offset,   Size

nvs,      data, nvs,     0x9000,   0x5000
otadata,  data, ota,     0xE000,   0x2000
app0,     app,  ota_0,   0x10000,  0x700000
app1,     app,  ota_1,   0x710000, 0x700000
spiffs,   data, spiffs,  0xE10000, 0x1F0000

ici le code des scripts, automatisations, etc coté Home assistant ( a collé dans le dossier Packages de votre home assistant:

###############################################################################

Package Home Assistant — Sonnette Portail

Fichier: /config/packages/sonnette_portail.yaml

###############################################################################

input_select pour “voie publique / privé”

input_select:
sonnette_mode_enregistrement:
name: « Sonnette - Mode enregistrement »
options:
- « Voie publique (interdit) »
- « Privé (autorisé) »
initial: « Voie publique (interdit) »
icon: mdi:cctv

#(optionnel) input_boolean “appel en cours” pour un état simple
input_boolean:
sonnette_appel_en_cours:
name: « Sonnette - Appel en cours »
icon: mdi:phone-in-talk

⚠️ Je ne connais pas les entity_id exacts des entités Frigate dans HA (ça dépend de l’intégration Frigate). Dans HA tu verras souvent des entités du style :

switch.frigate_camerajardin_recordings

switch.frigate_camerajardin_detect

camera.frigate_camerajardin

###############################################################################

AUTOMATIONS

###############################################################################
automation:

###########################################################################

1) Présence détectée (LD2420) → snapshot + notif (optionnel)

###########################################################################

alias: « Sonnette - Présence → snapshot »
mode: restart
trigger:

platform: event
event_type: esphome.sonnette_presence
condition: 

action:

Exemple: snapshot HA sur la caméra ESPHome (si tu l’as en entity camera.xxx)

service: camera.snapshot
target:
entity_id: camera.camera_jardin   # ← à adapter
data:
filename: « /media/sonnette/snapshot_presence_{{ now().strftime(‹ %Y%m%d_%H%M%S ›) }}.jpg »

Option: envoyer une notif

service: notify.notify
data:
title: « Sonnette »
message: « Présence détectée (LD2420). »

###########################################################################

2) Bouton pressé → notif + (optionnel) lancer une vue / ouvrir dashboard

###########################################################################

Déclenchée par esphome.doorbell_pressed.

alias: « Sonnette - Bouton pressé → notifications »
mode: single
trigger:

platform: event
event_type: esphome.doorbell_pressed

action:

service: notify.notify
data:
title: « Sonnette »
message: « On sonne au portail. »

Option: marque appel en cours

service: input_boolean.turn_on
target:
entity_id: input_boolean.sonnette_appel_en_cours

###########################################################################

3) Mode voie publique / privé → activer/désactiver Frigate recordings

###########################################################################

alias: « Sonnette - Mode enregistrement → Frigate »
mode: restart
trigger:

platform: state
entity_id: input_select.sonnette_mode_enregistrement

action:

choose:

conditions:

condition: state
entity_id: input_select.sonnette_mode_enregistrement
state: « Privé (autorisé) »
sequence:

service: switch.turn_on
target:
entity_id:
- switch.frigate_camerajardin_recordings   # ← à adapter
- switch.frigate_camerajardin_detect       # ← à adapter

conditions:

condition: state
entity_id: input_select.sonnette_mode_enregistrement
state: « Voie publique (interdit) »
sequence:

service: switch.turn_off
target:
entity_id:
- switch.frigate_camerajardin_recordings   # ← à adapter

tu peux laisser detect ON si tu veux juste “live + détection sans enregistrement”

ou couper aussi detect si tu préfères:

service: switch.turn_off
target:
entity_id:
- switch.frigate_camerajardin_detect       # ← à adapter

###########################################################################

3) Pas de réponse (30s) → notif + (option) TTS sur une enceinte HA

###########################################################################

“no answer” (30s) → message “laissez un message”

déclenches esphome.doorbell_no_answer. Là on peux :

notifier le téléphone

lancer une annonce TTS quelque part

ou faire jouer un WAV sur la sonnette

Exemple notif + TTS sur un media_player HA (pas l’ESP) :

alias: « Sonnette - Pas de réponse → notifier »
mode: single
trigger:

platform: event
event_type: esphome.doorbell_no_answer
action:

service: notify.notify
data:
title: « Sonnette »
message: « Pas de réponse, le visiteur peut laisser un message. »

(Optionnel) TTS sur un media_player HA (à adapter)

- service: tts.google_translate_say

target:

entity_id: media_player.salon

data:

message: « Pas de réponse, vous pouvez laisser un message après le bip. »

###############################################################################

SCRIPTS (actions manuelles / dashboard)

###############################################################################

Ensuite, quand “décroches” (ex: tu appuies sur un bouton dans HA, ou un dashboard), tu appelles ton service ESPHome call_answered.

script:
sonnette_repondre:
alias: « Sonnette - Répondre »
sequence:
- service: esphome.sonnette_call_answered
- service: input_boolean.turn_on
target:
entity_id: input_boolean.sonnette_appel_en_cours

quelques photos du boitier qui a déjà évoluer, 2 versions une avec anneaux du bouton RGB et une autre sans anneaux, je vous partagerais les fichiers lorsque la conception serra stabilisé.

version SANS anneaux RGB:

version AVEC anneaux RGB:

la base commune aux 2 versions:

modelisation du bouton dans lequel se logera le LD2420 afin de gagner un max de place, vous remarquerez le leger airgap de 1mm devant les antennes radar afin de ne pas faussé la detection, idem pour les composants et les pins de soudure ils ne seront pas contrains. Les cotes sont TRES ajustées afin de ne pas avoir besoin de coller le capteur, l’effort d’appuis est du coup reparti sur les rebords grâce a la croix centrale qui permet de consolidé un peu tout ca. Le capteur aura une place definie ( ne pas se tromper d’orientation ) mais le bouton lui pourra être mis dans le sens que vous voulez selon votre câblage.

déflecteur qui viens chercher la led rgb au plus prêt de la source une version normale et une version fibre optique en PMMA de 1,6mm.
Il devra être imprimé en matière translucide PETG, remplissage a 100% vitesse pour tout: 30mm/s 50mm/s MAX au plus chaud possible de votre filament pour avoir une bonne cohésion de couche et éviter les effet de blanchiment. a imprimer seul ou si plusieurs objets choisir découpage par objet et non par couche. vous devrez peindre en noir MAT les faces non visible afin de bien “emprisonner” la lumière dans la pièce.

4 « J'aime »

Salut

Merci pour le partage et ce projet bien sympa :wink:

Concernant les caméras bien sûr elle ne peut pas être sur la voie publique mais surtout il est interdit d’enregistrer quoi que ce soit qui se passe hors des limites de ta propriété privée donc même filmer pendant quelques secondes devant chez toi c’est illégal ou configurer des caches logiciels si Frigate le supporte pour masquer de façon permanente les zones publiques :wink:

Vincèn

alors je penses que je vais tout bonnement ajouté un choix a faire pour l’utilisateur finale:
si la camera est sur voie publique => enregistrement interdit
si la camera n’est pas sur la voie publique => enregistrement autorisé.

cela évite de casser tout le code et surtout cela permet a chacun de choisir selon sa configuration.

ensuite pour clarifier ce qu’il est interdit de filmer ou pas je me demande si le fait que ce soit une personne qui se trouve frontalement et donc forcement obstrue la vue de la voie publique peut être acceptable… un floue subsiste et si quelqu’un a un peu plus de renseignements a ce sujet cela peut être intéressant de le savoir.

et dans l’absolu, ce device serait aussi illégal qu’un smartphone ou une dash-cam.

dans l’absolu, efforçons nous de respecter l’esprit de la loi, à savoir « ne pas diffuser des enregistrements de personnes pris à leur insu ».

oui c’est certain que de toute facon de tels equipements sont controversés, cependant je tire la couverture de mon coté ayant deja subit des degats materiel dans mon allé suite a des livreurs peu respectueux, et que lorsque l’entreprise responssable te repond avez vous des preuves? bah ca bloque.

maintenant quelque soit l’équipement vidéos il est obligatoire de le mentionné a l’entrée de la propriété. On essaiera d’eclaircir ce sujet car je viens de passer un peu de temp a lire quelques articles a ce propo.

Mais ce n’est pas le sujet principal pour le moment donc j’ai tout de meme ajouter cette option de choisir mode public/privée.

AJOUT, du fichier “Package” pour le coté Home assistant comprenant tous les automatismes, scrip, etc il y aura surement quelques ameliorations/modifications a faire.

AJOUT du fichier de partitionnement pour du 16MB de fash

CORRECTION de certaines parties du code, d’autres a venir.

HESITEZ PAS a faire des propositions, partager vos idées.

bonjour, j’ai bien regarder le shema de cet esp32, et j’ai au final remarquer que aucun des boutons sur le pcb sont exploitable, il faut donc ajouter un petit poussoir derrière ce bouton, mais peut etre qu’un truc tactile pourrais faire l’affaire.

Bonsoir ici, faut que je reprenne une bonne partie du design car j’ai complètement omis de penser a la mise en place de l’ensemble, donc il faut que tout soit fixer sur la face avant afin de simplifier la pose. il faut que je revois aussi le bouton, c’est lui qui me demande le plus de réflexion a vrai dire.
ici on voit le support du micro contact qui rentre dans une petite coiffe/tampon en TPU qui prend appuis sur le ld2420, lui même coiffé du bouton en lui même, je me demande si le tpu ne serais pas de trop ici même si celui ci permettrais de pouvoir amortir un peu l’effort en cas d’appuis un peu violent.

donc je vois revoir un peu le design de tout ca. si vous avez des suggestions pour le coup je suis preneur.

1 « J'aime »

Franchement l’impression 3d sympa pour prototyper , mais pour un produit qui vas passer son temps a l’extérieur aux UV a la pluie je donne pas cher de sa survie

Par contre super projet

Pourquoi le pas utiliser un bouton anti vandalisme avec un anneau de couleur

J’ai de bonnes expériences avec l’ASA en extérieur.

Ça prend pas l’humidité, ne craint pas les UV et les couleurs ont l’air de tenir correc.

Sinon ma station météo est en PLA mais avec une couche de résine et de la peinture anti UV. Elle a pas bougé depuis 2 ans pour l’instant.

1 « J'aime »

Alors j’ai justement un de ces boutons et ils sont sacrément profond, je voulais justement utilisé ça. Ensuite c’est sur que l’impression 3d est toujours moins fiable pour un produit fini, mais on peu toujours faire une boite en ferraille genre dans une tube carré 40x40 ou 50X50; tiens ça me donne une idée le coup de la ferraille :sweat_smile:.

Après pour ce qui est de l’impression 3D je déconseille le PLA, le PETG est plus adapté voir de l’’abs/asa.

Du coup je travailler sur le bouton et ce qui va autour de tout ça histoire qu’il soit un peu plus solide.

Effectivement ils sont sacrément profond ces boutons