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 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.