Envois des infos via ESPHome vers MQTT

Mon problème

Bonjour à tous,

Je cherche comment faire pour que mes infos ne sois plus envoyé en temps mais seulement si la distance de mon sensor varie de plus ou moins 1 cm,car cela permettrait d’envoyer seulemnt si besoin et non toutes les Xsec, surtout pour MQTT.
Merci d’avance de votre aide.

Ma configuration


System Information

version core-2023.12.3
installation_type Home Assistant OS
dev false
hassio true
docker true
user root
virtualenv false
python_version 3.11.6
os_name Linux
os_version 6.1.63-haos
arch x86_64
timezone Europe/Paris
config_dir /config
Home Assistant Community Store
GitHub API ok
GitHub Content ok
GitHub Web ok
GitHub API Calls Remaining 5000
Installed Version 1.31.0
Stage running
Available Repositories 1354
Downloaded Repositories 13
Home Assistant Cloud
logged_in false
can_reach_cert_server ok
can_reach_cloud_auth ok
can_reach_cloud ok
Home Assistant Supervisor
host_os Home Assistant OS 11.2
update_channel stable
supervisor_version supervisor-2023.12.0
agent_version 1.6.0
docker_version 24.0.7
disk_total 30.8 GB
disk_used 7.6 GB
healthy true
supported true
board ova
supervisor_api ok
version_api ok
installed_addons Samba share (12.2.0), Terminal & SSH (9.8.1), Studio Code Server (5.14.2), Duck DNS (1.15.0), ESPHome (2023.12.3)
Dashboards
dashboards 2
resources 10
views 4
mode storage
Recorder
oldest_recorder_run 23 décembre 2023 à 18:59
current_recorder_run 24 décembre 2023 à 15:02
estimated_db_size 78.62 MiB
database_engine sqlite
database_version 3.41.2
___

Salut,

Par défaut tu n’as pas besoin du MQTT pour faire fonctionner esphome+ha …
Et donc ça t’évite d’avoir un message … Et tu peux traiter les automatisations seulement si changement du coup.

Mais bon, ça reste assez générique, parce que ton coté : c’est léger comme infos, le code esphome aurait quand même permis de voir comment ton bidule est codé.
D’autant plus que tu as changé de méthode Retour d'état Tasmota

Idem sur le traitement que tu fais sur la mesure, ça donnerai des idées.

Salut,
Comme tu as pu le voir sur l’autre tropic je n’ai eu aucune réponse donc j’ai voulu tester ESPHome.
Ce detecteur de mouvement me sert pour voir quand la voiture est dans le garage et quand elle part, donc je n’ai pas besoin que l’état soit envoyé tout les Xsec mais seulement quand la distance change et vu que je suis entre deux systeme domotique j’ai besoin que ce soit envoyé en MQTT.
Pour l’instant le code est des plus basic :

esphome:
  name: detection-voiture
  friendly_name: Detection Voiture

esp8266:
  board: d1_mini_lite

# Enable logging
#logger:

# Enable Home Assistant API
api:
  encryption:
    key: "g/cn1sVRK8zPdU70ZAsI8U="

ota:
  password: "17f7c53051dedd981"

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

  # Enable fallback hotspot (captive portal) in case wifi connection fails
  ap:
    ssid: "Detection-Voiture"
    password: "pI6n7X2"

captive_portal:

# Server Web
web_server:
  port: 80
# Sensor Ultrasonic
sensor:
  - platform: ultrasonic
    trigger_pin: D7
    echo_pin: D6
    name: "Distance"
    update_interval: 1s
  - platform: uptime
    name: Uptime Sensor

Merci.

Logique, tahoma c’est pas vraiment la méthode principale pour HA

Mais tu peux

  • Utiliser les entités HA pour connaitre l’état de ton capteur dans HA et conserver le MQTT pour ton autre système

Par contre comment/pour quoi tu utilises l’info ? Dans une automatisation par exemple, tu peux ajouter des conditions (vérif de la variation) avant de déclencher les actions

Salut,
J’espère que tu as bien été gaté pour les fêtes :snowman_with_snow:
Effectivement j’utilise une automatisation qui dit que si la distance est superieur à Xcm pas de voiture et inversement. Mais est-il possible de limiter le nombre de trame envoyé que ce soit à HA ou MQTT car pour l’instant même si ma valeur ne change pas mon module envois des trames toutes les seconde.

L’envoie des trames, c’est pas tellement la bonne piste. Il est plus simple de traiter la répétition dans les traitements.
Pour l’instant tu fais ça via une automatisation pour juste dire si la voiture est là/pas là ?

Si c’est ça tu fais directement un template sensor :

template:
  - binary_sensor: 
    - name: "Présence voiture"
      state: >-
        {% if state('sensor.ultrasonic')|int(default=0) <= 70 %}
          true
        {% else %}
          false
        {% endif %}

Et éventuellement dans une automatisation, tu corriges le trigger pour faire

platform: state
entity_id:
  - sensor.presence_voiture
from: "off"
to: "on"

ou l’inverse

platform: state
entity_id:
  - sensor.presence_voiture
from: "on"
to: "off"

Ainsi ça ne déclenche qu’au changement d’état, peu importe les répétitions

Bonjour

Tu peux déjà commencer par augmenter le update_interval de ton sensor dans esphome à 10s ou autres.

On est d’accord tu mets les codes dans le firmware du sensor, car cela me met une erreur.

# Sensor Ultrasonic
sensor:
  - platform: ultrasonic
    trigger_pin: D7
    echo_pin: D6
    name: "Distance"
    update_interval: 300s
  - platform: uptime
    name: Uptime Sensor
template:
  - binary_sensor: 
  - name: "Présence voiture"
      state: >-
        {% if state('sensor.ultrasonic')|int(default=0) <= 70 %}
          true
        {% else %}
          false
        {% endif %}

Logique, c’est du code pour HA, pas pour esphome

Oui j’ai essayé d’augmenter l’interval, mais aprés tu n’as plus l’infos en temps réelle.

En lisant ce que tu m’as dis cela m’as rappelé un tuto que j’avais vu et qui perméttait davoir un bouton en fonction d’une distance, mais je n’arrive pas à le faire changer d’état.

# Sensor Ultrasonic
sensor:
  - platform: ultrasonic
    trigger_pin: D7
    echo_pin: D6
    name: "Distance"
    update_interval: 1s
  - platform: uptime
    name: Uptime Sensor
    internal: True
    on_value_range:
      - below: 0.1
        then:
          - switch.turn_on: detect_something
      - above: 0.1
        then:
          - switch.turn_off: detect_something
#Bouton pour dire si la voiture est présente ou pas
switch:
  - platform: template
    name: "Présence voiture"
    id: detect_something
    optimistic: True

Un bouton, ça sert à avoir une action manuelle…
Il est préférebale d’utiliser un binary_sensor (et retrouver la syntaxe esphome)

Non le bouton change d’état seul en fonction en fonction de la distance et envois l’info seulement au changement d’état. J’ai trouvé mon erreur fallait que je mette « on_value_range: » avant « uptime ».
C’est quoi un binary_sensor ?

Je dis pas que visuellement ça fait pas la même chose.
Juste que le bouton, dispose d'un service dans HA pour le basculer à on ou a off à la main.
Dans ton cas d'usage, c'est pas toi qui décide de la bascule, c'est la valeur mesurée par le capteur.
Donc c'est tout l'intérêt d'un binary_sensor

Je suis en train d’essayer le binary_sensor mais j’ai une erreur quand j’envois le firmware sur mon module :

Compiling .pioenvs/detection-voiture/src/main.cpp.o
<unicode string>: In lambda function:
<unicode string>:78:4: error: expected primary-expression before ')' token
<unicode string>: In function 'void setup()':
<unicode string>:112:2: error: expected ')' before 'void'
src/main.cpp:408:47: note: to match this '('
  408 |   template__templatebinarysensor->set_template([=]() -> optional<bool> {
      |                                               ^
<unicode string>:116:1: error: expected '}' at end of input
src/main.cpp:50:14: note: to match this '{'
   50 | void setup() {
      |              ^
*** [.pioenvs/detection-voiture/src/main.cpp.o] Error 1
========================== [FAILED] Took 3.15 seconds ==========================

Et voici mon code et si je comprends bien c’est le lambda qui pose problème :

# Example configuration entry
binary_sensor:
  - platform: template
    name: "Présence voiture2"
    lambda: |-
      if (id(presence).state < 80) {
        // Voiture présente.
        return true;
      } else {
        // Voiture absente.
        return false;

Merci encore pour on aide.

Déjà il manque la dernière ligne pour fermer les accolades (c’est écrit dans le message d’erreur)
Ensuite, je ne pense pas que présence existe, ton capteur s’appelle Distance

Merci j’avais pas vu qu’il me manquait « } » et pour « presence » je suis bien obligé de déclarer un id ?
Sinon cela fonctionne.

oui il faut un id, mais présence c’est pas très logique, vu que tu fais référence à une mesure.
Présence, ça serait plus adapté l’id du binary_sensor à ce moment là (et c’est pas utile )

Ok je vais changer pour mieux m’y retrouver.
Encore merci pour ton aide.