Bonjour,
J’ai terminé de domotiser mon portail Sentinel OpenGate 1 en 24V qui repose sur sur une carte PCB100.
Comme beaucoup je le contrôle à l’aide de 2 modules relays reliés à un ESP32 et branchés sur les contacts sec. J’alimente le tout par un petit transfo usb d’un viel iPhone(j’avais commencé par prendre les 5v sur le port série la carte PCB100 mais mes relais tiraient trop de courant).
En parlant du port série(du moins ce qui en ressemble), je n’ai rien pu en tirer quelque soit le baudrate…
J’ai ensuite mis en place un Reed swicth avec un aimant sur la charnière pour savoir si le portail était ouvert, simple et efficace mais je ne trouvais pas ça suffisant(même si parfait pour savoir si le portail à été ouvert par exemple après avoir débrayé les moteurs).
Donc avec mon mulltimètre j’ai analysé ce qui passait entre les différentes bornes à disposition(moteurs et lumière clignottante):
Pour les moteurs c’est du -24V à 24V (avec des pics jusqu’à presque +/- 36V). Le sens de la tension indique la direction du moteur, ouvrant ou fermant.
J’avais commencé à faire des simulations de montages qui auraient pu me permettre d’exploiter ça en convertissant du -36v en 0v, 0v en 1.5v et 36 en 3v mais j’ai préférer ne pas mettre ça en oeuvre car en fin de compte je me suis rendu compte qu’il y avait plus simple à faire(opinion personnelle).
Pour la lumière clignotante c’est environ 0-24V(avec des pics de plus que 28V, précision douteuse de mon multimètre ?..) donc très bien tension toujours positive et selon moi avec mon petit niveau d’électronique plus simplement exploitable/sécurisant.
Ca n’y parait pas comme ça au premier abord, mais en observant bien le fonctionnement du portail et la lumière, bah exploiter cette simple « mesure » permet en connaitre en live l’état de fonctionnement du portail pour peu que l’on active la fermeture automatique (dip switch 4 auto sur ON) !
Clignotements : portail ouvert dans tous les cas(ouverture ou fermeture)
Clignotements lents : moteurs en action(ouverture ou fermeture)
Clignotements rapides :moteurs en pause(ouverture ou fermeture), démarrage du timer de fermeture auto
Plus de clignotements : portail fermé
Avec un petit montage de réducteur de tension(2 résistances, 100K et 6.8K) suivi d’un transistor NPN S8050 relié à une carte de développement ESP32 je récupère désormais l’état du portail quasi complet (OPENING, CLOSING, OPENING_PAUSED, CLOSING_PAUSED, AUTO_CLOSING) !
Ces composants sont des plus communs et coûtent moins de 1€ le tout je dirais, moi je les avais déjà sous la main donc j’ai fait avec et j’ai pas cherché à savoir si un autre transistor ferait mieux l’affaire ou pas, mes tests « à blanc » avec une alim 19V fonctionnaient donc je suis parti la dessus.
Pas de ACD à poller à interval régulier ici car grace au transistor je ne cherche pas à lire une tension mais cela m’active un GPIO en live à chaque changement d’état, ce qui est crucial pour pouvoir détecter la fréquence du clignotement.
Voici le schéma de montage:
J’ai dimensionné mon réducteur de tension pour réduire jusqu’à 36V en étant toujours très en dessous des 3.3v max de la logique de l’ESP32.
Et la petite breadboard faite à l’arrache mais qui fonctionne très bien:
Et l’intégration dans le boitier:
Coté intégration tout se passe donc dans ESPHome avec pour résultat les entités suivantes:
Comme je suis un grand adapte du pont HomeKit et de Siri sur mon téléphone pour piloter ma maison par la voix j’ai choisi de mapper des Lock sur mes switch relais comme ça m’oblige à avoir mon téléphone déverrouillé pour pouvoir ouvrir le portail mais rien d’obligatoire.
La logique est entièrement dans ESPHome, principalement grace à la gestion multi-click et ses option de timing, et enfin une gestion de timeout pour l’autoclose.
Dans le principe :
Je considère que le portail est fermé au 1er démarrage, puis j’applique la logique du séquencement du contrôle à 1 bouton de la télécommande.
Si clignotement lent → ouverture manuelle
Si clignotement rapide → ouverture pause + démarrage timeout
Si clignotement lent et timeout non écoulé → fermeture manuelle
Si clignotement lent et timeout → fermeture auto
Si clignotement rapide → fermeture pause + démarrage timeout
Et la logique reboucle à partir de là
Si clignotement lent → ouverture manuelle…
…
Je n’ai pas pris la peine de me faire le même circuit électronique pour la détection de rupture de faisceau pour la fermeture donc la durée du timeout est fixe. Je verrais à l’usage si je ressens le besoin d’atteindre la « perfection » mais j’en doute.
Pour la fermeture vraiment casse pied en mode OU exclusif(si bouton gauche utilisé pour ouvrir bah pour fermer il faut aussi réutiliser ce même bouton) j’ai aussi gommé ce défaut dans ESPHome, qu’importe si j’ai ouvert le mode pieton ou double battant, que je ferme via l’un de mes 2 switch bah ça ferme point barre.
Voilà ma config ESPHome, j’ai mis de coté la partie smartlocks, sonde de température, puissance wifi car ce n’est pas le but et c’est déjà assez long comme ça:
binary_sensor:
- platform: gpio
pin:
number: GPIO33
mode: INPUT_PULLUP
name: "Reed Portail"
- platform: gpio
id: light_portal_internal
internal: true
pin:
number: GPIO32
mode: INPUT_PULLUP
filters:
- invert:
name: "Light Portal"
on_multi_click:
- timing:
- ON for at most 0.4s
- OFF for at most 0.4s
then:
- logger.log: "Pause autoclose, next action is to close if 30s timeout or manual open/close"
- lambda: |-
if( not id(timer_started)){
id(timer_started)=true;
id(timer_started_time) = id(ha_time).now().timestamp;
id(portail_auto_close_in).publish_state(String(30).c_str());
}else{
id(timer_elapsed_seconds)= id(ha_time).now().timestamp - id(timer_started_time);
id(portail_auto_close_in).publish_state(String(30 - id(timer_elapsed_seconds)).c_str());
}
if(id(is_opening_paused) ){
id(is_opening)=false;
}
if( id(is_opening) ){
id(is_opening_paused)=true;
id(is_closing_paused)=false;
id(portail_state_text).publish_state("OPENING PAUSED");
}
if( id(is_closing_paused) ){
id(is_closing)=false;
}
if( id(is_closing) ){
id(is_closing_paused)=true;
id(is_opening_paused)=false;
id(portail_state_text).publish_state("CLOSING PAUSED");
}
- timing:
- ON for 0.3s to 0.9s
- OFF for 0.3s to 0.9s
then:
- logger.log: "OPENING/CLOSING"
- lambda: |-
if( id(timer_started)){
id(timer_started)=false;
if( id(timer_elapsed_seconds) >=28 ){
// AUTOCLOSE AFTER 30s
id(portail_state_text).publish_state("AUTOCLOSING");
id(portail_auto_close_in).publish_state(String(0).c_str());
id(is_closing)=true;
id(is_opening)=false;
id(is_opening_paused)=false;
id(is_closing_paused)=false;
id(is_closed)=false;
}
}
if( id(is_closed) ){
id(portail_state_text).publish_state("OPENING");
id(is_opening)=true;
id(is_closing)=false;
id(is_opening_paused)=false;
id(is_closing_paused)=false;
id(is_closed)=false;
}
if( id(is_opening_paused) ){
id(portail_state_text).publish_state("CLOSING");
id(is_closing)=true;
id(is_opening)=false;
id(is_opening_paused)=false;
id(is_closing_paused)=false;
id(is_closed)=false;
}
if( id(is_closing_paused) ){
id(portail_state_text).publish_state("OPENING");
id(is_opening)=true;
id(is_closing)=false;
id(is_opening_paused)=false;
id(is_closing_paused)=false;
id(is_closed)=false;
}
- timing:
- OFF for at least 1.5s
then:
- lambda: |-
id(portail_state_text).publish_state("CLOSED");
id(is_opening)=false;
id(is_closing)=false;
id(is_opening_paused)=false;
id(is_closing_paused)=false;
id(is_closed)=true;
- platform: copy
source_id: light_portal_internal
name: "Light Portail"
id: portail_state
filters:
- delayed_off: 1.5s
on_state:
then:
- lambda: |-
if( ! id(portail_state).state ){
id(portail_state_text).publish_state("CLOSED");
id(is_opening)=false;
id(is_closing)=false;
id(is_opening_paused)=false;
id(is_closing_paused)=false;
id(is_closed)=true;
}
switch:
- platform: gpio
pin: GPIO27
id: relay_pieton
name: "Portillon"
icon: "mdi:gate"
on_turn_on:
- delay: 500ms
- switch.turn_off: relay_pieton
- platform: template
name: "pieton partiel"
id: pieton_partiel
turn_on_action:
then:
- if:
condition:
lambda: 'return id(portail_state).state;'
then:
# Si ouvert on referme
lambda: |-
if ( id(portail_last_mode).state=="DOUBLE BATTANT" ) {
// on ferme DOUBLE BATTANT
id(relay_portail_voiture).turn_on();
ESP_LOGD("main", "FERMETURE DOUBLE BATTANT");
} else {
// on ferme PIETON
ESP_LOGD("main", "FERMETURE PIETON");
id(relay_pieton).turn_on();
}
else:
- lambda : 'id(portail_last_mode).publish_state("PIETON");'
# Sinon on ouvre
- logger.log: "OPENING quick partial"
- switch.turn_on: relay_pieton
- delay: 7s
- switch.turn_on: relay_pieton
- platform: gpio
pin:
number: GPIO26
id: relay_portail_voiture
name: "en_grand"
icon: "mdi:gate"
on_turn_on:
- delay: 500ms
- switch.turn_off: relay_portail_voiture
- platform: template
name: "portail voiture"
id: portail_voiture
turn_on_action:
then:
- if:
condition:
lambda: 'return id(portail_state).state;'
then:
# Si ouvert on referme
lambda: |-
if ( id(portail_last_mode).state=="DOUBLE BATTANT" ) {
// on ferme DOUBLE BATTANT
id(relay_portail_voiture).turn_on();
ESP_LOGD("main", "FERMETURE DOUBLE BATTANT");
} else {
// on ferme PIETON
ESP_LOGD("main", "FERMETURE PIETON");
id(relay_pieton).turn_on();
}
else:
- lambda : 'id(portail_last_mode).publish_state("DOUBLE BATTANT");'
# Sinon on ouvre
- logger.log: "OPENING quick partial"
- switch.turn_on: relay_portail_voiture
Coté réalisation je suis conscient qu’il faille un minimum de connaissance en ESP32/ESPHome et être capable de faire 3~4 soudures et savoir ce que l’on fait, c’est pourquoi je ne cherche pas à faire un tutoriel de A à Z qui encouragerait un néophyte à se lancer dans ce projet.
Je pense cependant avoir correctement documenté pour que ce soit suffisamment clair pour tout un chacun ayant suffisamment de bagages/confiance pour se lancer s’il le souhaite, en engageant sa propre responsabilité et sa propre garantie matérielle.
A noter que cette logique doit également pouvoir être appliquée à d’autres marques de portail avec quelques adaptations sur les timings…