Niveau de puits ou récupérateur d'eau node mcu ESP32-S et HCSR04

Bonjour,

Je possède un puits et un récupérateur d’eau.

Mon projet est de les équiper de capteurs de niveau d’eau , alimentés par cellule 18650.

Je compte faire un relevé toutes les 6 heures soit 4 par jour.

Donc je compte utiliser le « deep sleep » pour économiser les accus.

Pour l’instant, je fais les tests dans un bocal et les résultats sont bons.

Voici mon code (avec les formules pour le bocal et je n’ai pas intégré le deep sleep pour l’instant) :

# sensor niveau recuperateur Est trig sur pin33 et echo sur pin32
sensor:
  - platform: ultrasonic
    trigger_pin: A5
    echo_pin: A4
    id: "deltaest"
    name: "Delta"
    unit_of_measurement: "m"
    icon: "mdi:ruler"
    accuracy_decimals: 2
    update_interval: 5s
    pulse_time: 50us
  - platform: template
    name: "Niveau d'eau"
    id: niveaurecupestcm
    unit_of_measurement: 'cm'
    device_class: battery
    accuracy_decimals: 0
    icon: "mdi:waves-arrow-up"
    update_interval: 60s
    lambda: |-
      return (17-(id(deltaest).state *100));
  - platform: template
    name: "Niveau de récuperateur Est"
    id: niveaurecupestpourcent
    unit_of_measurement: '%'
    device_class: battery
    accuracy_decimals: 0
    icon: "mdi:car-coolant-level"
    update_interval: 60s
    lambda: |-
      return ((id(niveaurecupestcm).state /17*100));
  - platform: template
    name: "Litre de récuperateur Est"
    id: litrerecupest
    unit_of_measurement: 'L'
    device_class: battery
    accuracy_decimals: 1
    icon: "mdi:bottle-tonic"
    update_interval: 60s
    lambda: |-
      return (63.58*(id(niveaurecupestcm).state /1000));
  - platform: wifi_signal
    name: "RSSI recuperateur Est"
    id: rssi_recup_est
    unit_of_measurement: 'dB'
    device_class: signal_strength
    accuracy_decimals: 0
    icon: "mdi:bluetooth"
    update_interval: 60s
  - platform: adc
    pin: A7
    id: "VCC"
    internal: true
  - platform: template
    name: "Batterie Recuperateur Est"
    id: batterie_recup_est
    unit_of_measurement: '%'
    device_class: battery
    accuracy_decimals: 0
    icon: "mdi:battery"
    update_interval: 60s
    lambda: |-
      return ((id(VCC).state /0.307) * 100.00);

Cela fonctionne très bien sauf que si le node est éteint il met indisponible sur les valeurs.

Voici déjà la première problématique.

Donc comment faire pour qu’il remplace « indisponible » par la dernière valeur reçu ?

Merci de vos réponses.

Ps : demain, j’attaque les tests de batterie.

2 « J'aime »

recupeau

Dans lovelace

Salut,

Je crois que l’API de EspHome <> HA ne couvre pas deep sleep correctement et qu’il faudrait plutôt passer par MQTT à la place pour utiliser les options de « Retain » et « Last Will ».
Faudrait voir la doc de EspHome pour la gestion de deep sleep, s’il y a une sorte de rétention de données possible.

Autre possibilité, un peu plus bidouille mais qui devrait marcher, créer des sensors template qui prennent le valeur de ceux de ton Esp, si la valeur ne vaut pas Unavailable. Donc qui sont là en intermédiaire pour garder les dernières valeurs correctes connues.

Merci AlexHass de ta réponse.

Pour la fonction « deep sleep » j’ai vu que certain l’utilisé pour des projets similaire … je verrais cela en dernier.

Par contre il n’y a pas une fonction qui peut récupérer la dernière valeur (state ou autre…) ?

Ah ok quand tu disais que le module est « éteint » dans ton premier message j’avais compris que c’était déjà en sommeil!
Mais sinon effectivement quand un module ESPHome est éteint, il se met en indisponible et toutes les valeurs sont aussi en indispo… Je pense que ça vient de la même raison, l’API entre ESPHom et HA part du principe qu’un module doit être présent, sinon pas de valeur.

Quand je parlais de garder la dernière valeur, c’était soit en passant par une communication MQTT qui a l’option « retain » qui fait que le broker garde la dernière valeur connue et la republie si besoin dans HA.
Autre possibilité comme je disais c’est de créer à la main des sensor template en doublons de ceux forunis par ton ESPHome… qui auraient la même valeur que ceux de l’ESP. Mais qui garderaient cette valeur si l’ESP passe en Indisponible.

En effet AlexHass, c’est un peu l’idée que j’ai.

J’ai juste besoin de récupérer la dernière valeur de « deltaest »

Le reste n’ai que formule de calcul avec cette valeur.

Je parcours pas mal de doc mais je trouve pas

sais tu quelle plateform je dois utiliser ?

Quelque chose comme ça (que je n’ai pas testé :wink: )

  - platform: template
    sensors:
       deltaest_permanent:
          friendly_name: Delta
          unit_of_measurement: 'm'
          value_template: >
            {% if states('sensor.deltaest') == "unavailable" %}
              {{states('sensor.deltaest_permanent')}}
            {% else %}
              {{states('sensor.deltaest')}}
            {% endif %}

merci alexhass

j’ai essayé de mettre le code il fait une erreur sur « sensors: »

j’ai déjà au dessus des « - plateform », « sensor: »

j’ai donc enlever « sensors: » et il me fait une erreur sur « deltaest_permanent: »

j’ai donc créer ce code :

- platform: template
    name: "Delta est permanent"
    id: delta_estpermanent
    unit_of_measurement: 'm'
    value_template: >
            {% if states('sensor.deltaest') == "unavailable" %}
              {{states('sensor.deltaest_permanent')}}
            {% else %}
              {{states('sensor.deltaest')}}
            {% endif %}

sauf que « value_template: » n’est pas reconnu.

Je suis pas très doué en code et je te remercie de ta patience…

C’est du Yaml pour HA que j’ai donné, pas pour ESPHome, on est d’accord? :slight_smile:

je travaille dans le module esphome dans le fichier recupest.yaml

Me dit pas que le language est différent du yaml de ha lol

Je pense avoir compris ce que tu voulais m’expliquer AlexHass je dois créer un nouveau fichier yaml avec le code dedans ?

Peut-être utiliser un fichier existant …configuration.yaml ?

Désolé de ces question

Oui :wink:

Alors ce n’est pas forcément un nouveau fichier, mais dans le fichier configuration.yaml
Tu as peut-être déjà une section « sensor », si non il faut un ajouter une et mettre le code après!

exemple:
image

Et sinon le code en ESPHome et HA à la même syntaxe de base mais c’est tout de même différent, tous les champs n’existent pas et les logique perso template ne sont pas dans le même langage (ESPHom c’est des lambda en C++ et HA c’est du script Jinja2)
Par exemple c’est quand j’ai vu ton « id: » que je remarqué que t’avais mis ça dans ESPHome.
Il n’y a pas d’ID dans HA.

1 « J'aime »

cela fonctionne super.

Je suis sur les formule de calcul que j’ajoute à configuration.yaml

Le projet avance, actuellement cela fonctionne avec 2 cellules 18650.

voici mon code sous esphome :

# sensor niveau recuperateur Est trig sur pin33 et echo sur pin32
sensor:
  - platform: ultrasonic
    trigger_pin: A5
    echo_pin: A4
    id: "deltaest"
    name: "Delta Est"
    unit_of_measurement: "m"
    icon: "mdi:ruler"
    accuracy_decimals: 2
    update_interval: 5s
    pulse_time: 50us
  - platform: wifi_signal
    name: "RSSI recuperateur Est"
    id: rssi_recup_est
    unit_of_measurement: 'dB'
    device_class: signal_strength
    accuracy_decimals: 0
    icon: "mdi:bluetooth"
    update_interval: 60s
  - platform: adc
    pin: A7
    id: "VCC"
    internal: true
  - platform: template
    name: "Batterie Recuperateur Est"
    id: batterie_recup_est
    unit_of_measurement: '%'
    device_class: battery
    accuracy_decimals: 0
    icon: "mdi:battery"
    update_interval: 60s
    lambda: |-
      return ((id(VCC).state /0.307) * 100.00);

Je dois améliorer le niveau de batterie

et le code actuel dans configuration.yaml

- platform: template
    sensors:
     niveau_per_recupest:
        friendly_name: niveau permanent Récup Est
        unit_of_measurement: cm
        value_template: '{{ 17 - (states("sensor.deltaest_permanent") | float * 100) | round(0) }}'
  - platform: template
    sensors:
     niveau_per_recupestl:
        friendly_name: niveau permanent Récup Est L
        unit_of_measurement: l
        value_template: '{{ ( 63.58 * (states("sensor.niveau_per_recupest") | float ) / 1000) | round(1) }}'
  - platform: template
    sensors:
     niveau_per_recupestpourcent:
        friendly_name: niveau Récup Est 
        unit_of_measurement: '%'
        value_template: '{{ (states("sensor.niveau_per_recupest") | float / 17 * 100 ) | round(0) }}'

quand le capteur est allumé :
recupmarche

quand le capteur est éteint :
recupindis

je vais me pencher maintenant sur le « deep sleep »
peut être rajouter une date et heure du dernier relevé

Il faut aussi que je fasse ce type de capteur,
tu est parti sur un JSN-SR04T, c’est bien ça ?

si oui, as-tu des relever fausse (comme la messure du fond de la cuve au lieu du niveau d’eau ? )

J’ai fait avec un HCSR04 j’ai l’impression que c’est à peu prêt la même chose.

Le date du dernier relevé tu peux l’avoir dans lovelace.

Je suis tjrs dans mon bocal.

Pour l’instant pas d’erreur.

J’ai modélisé la box hier, l’impression est bientot fini.

Je place mes éléments cet apres midi. et je fais le couvercle.

Normalement à la fin du week end c’est en place.

niceau mesure le JSN-SR04T est la meme que le HCSR04, par contre le HCSR04 n’est pas waterproof, donc j’ai un peut peur de sa durée de vie dans un puits ou récupérateur d’eau, ou je me trompe ?

tu as certainement raison avec la condensation dans un récupérateur d’eau…

Je verrais à l’usage.

Ce qui m’inquiète le plus c’est la durée de mes accus. je vais bien voir à l’usage avec le deepsleep.

voici la box du boîtier. il me reste à faire le top

1 « J'aime »

et voici le projet fini


interfacepuit
jaugepuit

2 « J'aime »