Projet ESP8266 Capteur PIR et Relais Autonome + HA

Bonjour a tous,

Je suis en train de créer un capteur PIR avec un ESP8266 et un relais.
Le but et d’avoir une lumière qui s’allume la nuit sur détection de présences, qui fonctionne de manière autonome et qui en plus remonte les informations sur HA. De plus on peut piloter aussi directement la lumière avec un bouton sur la page web du capteur et régler le temps que la lumière reste allumé.
Le fait que cela remonte les informations dans HA peut servir éventuellement de détecteur de présence pour un mode alarme, de pilotage pour allumer la lumières, pour régler le temps d’allumages de la lumière et bien sur pour faire des automations.
J’ai aussi une imprimante 3D, Et je ferais un boitier étanche qui puisse se fixer sur la lumière en extérieur.

Vous aller me dire, il y a déjà beaucoup de lumière qui sont piloté avec détecteur, par contre pas une seule ne remonte d’informations et est pilotable par HA .

Je Cherche des personnes que cela intéresserait de participer au projet.

  • Une personne qui pourrait dessiner un typon (pour rendre le système plus petit et améliorer peut être le Hardware).
  • Un codeur pour améliorer le code de ESPHOME.
  • Une personne sachant faire de la modélisation 3D pour dessiner un boitier étanche.

Dans l’absolu je peut faire l’ensemble tous seul, mais je pense que l’idée est bonne et que avec des spécialiste le projet serait plus abouti et pourrais profiter a beaucoup de personnes.

Les composant utilisés :
1 Mini Alim 220v / 3,3v et 5V
1 Esp8266 mini
1 capteur PIR HC-SR501
1 IRLZ34N (transistor MOS pilotage en tension pour piloter le relais)

j’ai bien avancé sur le code sur ESPHOME avec l’aide de notre ami CHATGPT (il fait pas mal d’erreur mais maitrise mieux le code de ESPHOME que moi :grinning: et au final cela fonctionne.

Le montage:

La page web de l’esp:

Voici le code fonctionnel :



            esphome:
              name: new-pir
              friendly_name: NEW_PIR

            esp8266:
              board: d1_mini

            # Configuration du logger (pour les messages de débogage)
            logger:

            # Enable Home Assistant API
            api:
              encryption:
                key: "xxxxxxxxx" #clé api

            ota:
              - platform: esphome
                password: "xxxxxx" # mot de passe

            #wifi:
            #  ssid: !secret wifi_ssid
            # password: !secret wifi_password

            wifi:
              ssid: "xxxxxxx" #votre SSID
              password: "xxxxxx" #votre mot de passe

              # Enable fallback hotspot (captive portal) in case wifi connection fails
              ap:
                ssid: "New-Pir Fallback Hotspot"
                password: "xxxxxxxx"

            captive_portal:


            # Enable esp web server
            web_server:
              port: 80


            # Définir une variable globale avec une valeur par défaut
            globals:
              - id: stored_delay
                type: float
                restore_value: true
                initial_value: '60000'  # Valeur par défaut en millisecondes (60 secondes)

              - id: is_night
                type: bool
                restore_value: true
                initial_value: 'false'  # Initialise à faux (jour)

            # Configurer les pins
            binary_sensor:
              - platform: gpio
                pin: GPIO5  # Capteur PIR
                name: "Capteur PIR"
                device_class: motion
                on_press:
                  - logger.log: "Capteur PIR détecté, vérification de l'état jour/nuit..."  # Message de log
                  - if:
                      condition:
                        lambda: 'return id(is_night);'  # Vérifie si c'est la nuit
                      then:
                        - logger.log: "Il fait nuit, activation du relais..."
                        - switch.turn_on: relais
                        - delay: !lambda "return id(stored_delay);"
                        - switch.turn_off: relais
                      else:
                        - logger.log: "Il fait jour, le relais ne s'active pas."

            switch:
              - platform: gpio
                pin: GPIO4  # Relais
                id: relais
                name: "Relais"

            # Synchroniser l'heure avec un serveur NTP
            time:
              - platform: sntp
                id: sntp_time
                timezone: Europe/Paris  # Ajustez selon votre fuseau horaire

            # Détection jour/nuit basée sur le lever et coucher du soleil
            sun:
              latitude: xx.xxxxx  # Ta latitude
              longitude: x.xxxxx  # Ta longitude
              id: my_sun
              on_sunrise:
                then:
                  - lambda: |-
                      id(is_night) = false;  // C'est le jour
                      ESP_LOGD("main", "C'est le lever du soleil, jour activé.");
                      id(sunrise_time).publish_state(id(sntp_time).now().strftime("%H:%M"));  // Publie l'heure du lever du soleil
              on_sunset:
                then:
                  - lambda: |-
                      id(is_night) = true;  // C'est la nuit
                      ESP_LOGD("main", "C'est le coucher du soleil, nuit activée.");
                      id(sunset_time).publish_state(id(sntp_time).now().strftime("%H:%M"));  // Publie l'heure du coucher du soleil

            text_sensor:
              - platform: template
                name: "État du jour/nuit"
                id: day_night_status
                lambda: |-
                  if (id(is_night)) {
                    return std::string("Nuit");
                  } else {
                    return std::string("Jour");
                  }
                icon: "mdi:weather-sunset-up"

              - platform: template
                name: "Heure du lever du soleil"
                id: sunrise_time
                lambda: |-
                  auto sunrise = id(my_sun).sunrise(0.0);  // Utiliser une élévation de 0.0 pour obtenir l'heure
                  if (sunrise.has_value()) {
                    return sunrise.value().strftime("%H:%M");
                  } else {
                    return std::string("N/A");
                  }
                icon: "mdi:weather-sunrise"
                
              - platform: template
                name: "Heure du coucher du soleil"
                id: sunset_time
                lambda: |-
                  auto sunset = id(my_sun).sunset(0.0);  // Utiliser une élévation de 0.0 pour obtenir l'heure
                  if (sunset.has_value()) {
                    return sunset.value().strftime("%H:%M");
                  } else {
                    return std::string("N/A");
                  }
                icon: "mdi:weather-sunset-down"

              - platform: template
                name: "Heure actuelle"
                id: current_time
                lambda: |-
                  return id(sntp_time).now().strftime("%H:%M");
                icon: "mdi:clock"
            text:
              - platform: template
                name: "Durée du délai (secondes)"
                id: duree_input
                optimistic: true
                min_length: 1
                max_length: 5
                mode: text
                on_value:
                  then:
                    - lambda: |-
                        // Convertir la valeur du champ de texte en float
                        float input_value = atof(x.c_str()); // Utilisation de atof pour convertir la chaîne en float
                        id(stored_delay) = input_value * 1000;  // Conversion en millisecondes et stockage
                        id(duree_display).publish_state(input_value);  // Afficher en secondes
                        // Afficher la nouvelle valeur stockée dans les logs
                        ESP_LOGD("main", "Délai mis à jour: %f ms", id(stored_delay));

            # Afficher la durée stockée dans les logs
            sensor:
              - platform: template
                id: duree_display
                name: "Délai affiché"
                unit_of_measurement: "s"
                accuracy_decimals: 0
                icon: "mdi:timer"

            # Initialiser la valeur de `duree_display` au démarrage
            interval:
              - interval: 1s
                then:
                  - lambda: |-
                      static bool initialized = false;
                      if (!initialized) {
                        // Publier la valeur restaurée de `stored_delay` pour initialiser `duree_display`
                        float restored_value = id(stored_delay) / 1000.0;
                        id(duree_display).publish_state(restored_value);
                        // Afficher la valeur restaurée dans les logs
                        ESP_LOGD("main", "Délai restauré après redémarrage: %f s", restored_value);
                        initialized = true;
                      }

A dispo pour plus de détails.

1 « J'aime »

Bonjour,

Pourquoi utiliser un transistor pour commander le relai, une sortie de l’ESP8266 peut alimenter la bobine du relai sans problème.

Bonjour
Mon esp est commandé en 3,3v et lors de mes essais la commande du relais ne fonctionnais pas systématiquement (probablement matériel chinois :-).
Du coup comme cela mon relais est commandé en 5v et là cela fonctionne toujours…

Ok, mais pour la version définitive, tu peux alimenter l’ESP en 5V et plus besoin du transistor.

https://onedrive.live.com/redir?resid=7A8AD26CF5E25D52!178138&authkey=!AgVMmoM0tuLpdcs&page=Edit&wd=target(Tutos%20ESPHOME.one|eb605830-2965-4941-b5be-3de136882d3c%2FUn%20ESP8266%20D1%20Mini%20c'est%20quoi%20|a69011d0-eb8e-4c34-9480-e5fc0f8808ff%2F)&wdorigin=NavigationUrl

Super ton one note
Dans l’état actuel des chose cela ne changera rien que l’esp soit alimenter en 3v ou 5v sa sortie est toujours en 3,3v si je ne me trompe pas hors le relais que j’ai a une commande en 5V (il y a une diode dans le circuit du relais qui fait chuter sa tension d’alimentation de 0,6 donc on se retrouve avec de 2,7v max en entrée et ca mon relais a du mal) je n’ai pas de relais en commande 3,3 v.
Du coup comme ça le circuit fonctionne toujours (j’avais directement relié mon esp sur le relais pour un projet de commande de ventilation en fonction de l’humidité et quand je suis passé sur plaque avec soudure cela ne marchait plus… et quand c’est souder c’est chiant de modifier :-).

La solution serait d’avoir un relais sans tous ces circuit et de faire le branchement minimum sur l’esp. il y a moyen de gagner beaucoup de place en utilisant des composant brut mais cela dépasse mes capacités.

je peux faire le typon (Même si cela prend pas mal de temps … ce n 'est pas mon métier) mais je n’ai pas la capacité a réduire au minimum les composants.
Si tu l’as cela serait un plaisir de travail ensemble.
ou pour l’optimisation du code de l’esp sur ESPHOME