[MQTT] Comment créer un sensor?

Bonjour à tous,

Je débute sur l’intégration MQTT et je ne sais pas trop comment créer un sensor.cotech-367959_temperature (je ferai de même pour les autres entités) par rapport aux données que je reçois sur MQTT, notamment comment filtrer mon sensor sur le model et l’id:

Toute aide ou point de départ sera bienvenu. Merci d’avance.

A noter que la Toyota n’est pas à moi :slightly_smiling_face:

Hello @FillR2 ,

mqtt:
  sensor:
    name: "cotech-367959_temperature"
    unique_id: A toi d'en choisir un que tu renseigneras ici
    state_topic: "rtl_433"
    value_template: >
      {℅ if value_json.model == xxx and value_json.id == yyy %}
        {{ value_json.temperature_C }}
      {℅ else ℅}
        {{ states(sensor.cotech-367959_temperature }}
      {℅ endif %}
    unit_of_measurement: "°C"

Où xxx et yyy sont à remplacer par le modèle et l’id.

Plus d’info ici

1 « J'aime »

Merci pour la réponse à une telle heure :+1: , je testerai ça demain :grin:

C’est bon, ça marche avec ce code:

mqtt:
  sensor:
    - name: "Température Station Météo"
      unique_id: "sensor.temperature_station_meteo"
      unit_of_measurement: "°C"
      state_class: "measurement"
      device_class: "temperature"
      state_topic: "rtl_433"
      value_template: >
        {% if value_json.model == "Cotech-367959" and value_json.id == 208 %}
          {{ value_json.temperature_C | round(1) }}
        {% else %}
          {{ states(sensor.temperature_station_meteo) }}
        {% endif %}

A noter qu’après avoir copié ton code, j’ai bataillé longtemps sur ce piège, je ne comprenais pas pourquoi j’avais des erreurs:
{℅ endif %} le premier caractère n’est pas un pourcent, c’est un truc bizarre c/o :upside_down_face:

1 « J'aime »

Oups, désolé !
Je l’ai tapé sur mon tel et vu l’heure … :sweat_smile:

Cool que ça fonctionne en tout cas :+1:

1 « J'aime »

Et il y aurait moyen de regrouper tous les sensors dans le même appareil comme sur cet exemple ?

image

Oui, comme indiqué ici

Ca marche, c’est parfait, merci encore !

mqtt:
  sensor:
    - name: "Température Station Météo"
      unique_id: "sensor.temperature_station_meteo"
      unit_of_measurement: "°C"
      state_class: "measurement"
      device_class: "temperature"
      state_topic: "rtl_433"
      value_template: >
        {% if value_json.model == "Cotech-367959" and value_json.id == 208 %}
          {{ value_json.temperature_C | round(1) }}
        {% else %}
          {{ states(sensor.temperature_station_meteo) }}
        {% endif %}
      device:
        name: "Station Météo"
        identifiers: "station_meteo"
        manufacturer: "Curconsa"
        model: "FT-300"

Une question additionnelle, mon sensor fontionne très bien, par contre la log se remplit de messages d’erreurs:

2022-10-14 15:00:14.743 ERROR (MainThread) [homeassistant.helpers.template] Template variable error: 'sensor' is undefined when rendering '{% if value_json.model == "Cotech-367959" and value_json.id == 208 %}
  {{ value_json.temperature_C | round(1) }}
{% else %}
  {{ states(sensor.temperature_station_meteo) }}
{% endif %}

Il y aurait un moyen d’éviter ça ?

Salut,

Je pense que ce qui se passe, c’est que sur le même topic MQTT, tu as semble-t-il différents messages.
Un ou plusieurs de ces messages ne contiennent pas model et/ou id.
Ce qui fait qu’à la réception de ce(s) message(s), l’évaluation de ta condition est indéfinie, et donc par ricochet, ton sensor.

Idéalement, un topic = un message.

Si c’est bien ça le soucis, alors pour corriger, si tu as la main sur l’émetteur de ces messages, tu peux essayer de suivre la règle plus haut.
Si tu n’as pas la main là dessus, il y a le filtre is_defined qui permet de vérifier qu’un champ de value_json est bien défini.
Je ne l’ai jamais utilisé mais ça donnerait peut-être quelque chose comme ça:

{% if (value_json.model | is_defined) and (value_json.model == "Cotech-367959") and (value_json.id | is_defined) and (value_json.id == 208) %}
  {{ value_json.temperature_C | round(1) }}
{% else %}
  {{ states(sensor.temperature_station_meteo) }}
{% endif %}

Ça me paraît pas mal comme explication, à voir si c’est vraiment ça.

J’ai toujours l’erreur:

2022-10-14 16:39:10.500 ERROR (MainThread) [homeassistant.helpers.template] Template variable error: 'sensor' is undefined when rendering '{% if (value_json.model | is_defined) and (value_json.model == "Cotech-367959") and (value_json.id | is_defined) and (value_json.id == 208) %}
  {{ value_json.temperature_C | round(2) }}
{% else %}
  {{ states(sensor.temperature_station_meteo) }}
{% endif %}

A noter que je reçois aussi ces messages sur MQTT mais pas sur le même topic:
image

Oublions is_defined.
Ça ne fait pas vraiment ce que je voulais.
Ça déclenche plutôt une erreur quand la variable testée n’est pas définie :-1:

Comme en Python, peut être:

{% if (value_json.get('model', '') == 'Cotech-367959') and (value_json.get('id', '') == 208) %}
  {{ value_json.temperature_C | round(1) }}
{% else %}
  {{ states(sensor.temperature_station_meteo) }}
{% endif %}

à mon avis il y a 2 soucis …
La syntaxe, il manque les quotes
{{ states("sensor.temperature_station_meteo") }}

Après le sensor unique_id: "sensor.temperature_station_meteo"qui s’applique la valeur à lui-même je suis pas certain que ce soit une bonne pratique ni ce que c’est censé faire

2 « J'aime »

@Pulpy-Luke Effectivement j’ai oublié les quotes :confounded:

J’ai tout de suite pensé au soucis que j’ai indiqué parce que je l’ai déjà rencontré et je l’avais résolu en réagençant mes topics

Bonjour,

Je ne sais pas si tu utilises rtl433tomqtt pour recevoir tes senseurs, mais avec celui-ci je recoit les données sous 2 formats, un json qui regroupe tout les données d’un emetteur ou un topic pour une donnée

Dans cet exemple, il suffit de déclaré le topic rtl_433/rtl433tomqtt/devices/Nexus-TH/2/159/temperature_C pour avoir uniquement la température.
il suffit de repérer les bon ID => TH/2/159/

2022-10-15 08:45:13,569 0 0  rtl_433/rtl433tomqtt/events  {"time":"2022-10-15 08:45:11.810261","protocol":19,"model":"Nexus-TH","id":159,"channel":2,"battery_ok":1,"temperature_C":17.4,"humidity":51}
2022-10-15 08:45:13,569 0 0  rtl_433/rtl433tomqtt/devices/Nexus-TH/2/159/time  2022-10-15 08:45:11.810261
2022-10-15 08:45:13,569 0 0  rtl_433/rtl433tomqtt/devices/Nexus-TH/2/159/protocol  19
2022-10-15 08:45:13,569 0 0  rtl_433/rtl433tomqtt/devices/Nexus-TH/2/159/id  159
2022-10-15 08:45:13,570 0 0  rtl_433/rtl433tomqtt/devices/Nexus-TH/2/159/channel  2
2022-10-15 08:45:13,570 0 0  rtl_433/rtl433tomqtt/devices/Nexus-TH/2/159/battery_ok  1
2022-10-15 08:45:13,570 0 0  rtl_433/rtl433tomqtt/devices/Nexus-TH/2/159/temperature_C  17.4
2022-10-15 08:45:13,570 0 0  rtl_433/rtl433tomqtt/devices/Nexus-TH/2/159/humidity  51

Merci, mais je n’ai pas trop réussi à utiliser les passerelles json vers mqtt, à priori, j’ai résolu le problème avec ce code:

mqtt:
  sensor:
    - name: "Température Station Météo"
      unique_id: "sensor.temperature_station_meteo"
      unit_of_measurement: "°C"
      state_class: "measurement"
      device_class: "temperature"
      state_topic: "rtl_433"
      value_template: >
        {% if value_json.model == "Cotech-367959" and value_json.id == 208 %}
          {{ value_json.temperature_C | round(2) }}
        {% else %}
          {{ states(entity_id) }}
        {% endif %}
      device:
        name: "Station Météo"
        identifiers: "station_meteo"
        manufacturer: "Curconsa"
        model: "FT-300"

J’utilise
{{ states(entity_id) }}
plutôt que
{{ states(sensor.temperature_station_meteo) }}
pour faire référence à la valeur actuelle de l’entité