Mix MQTT/AUTOMATISATION

Bonsoir,

Je travaille sur la solution sofar2mqtt pour récupérer mes valeurs d’onduleur. J’ai réussi à me dépatouiller avec le topic MQTT, je dispatch mes informations mais il y a une valeur que je voudrais améliorer, à savoir l’état de service de l’onduleur.
A ce jour je reçois soit 0, soit 1 ou 2 ou 3… mais je voudrais convertir ces états en « texte » type WAITING, CHECKING, ON GRID, FAULT, etc…

Je ne vois pas trop comment m’y prendre. J’ai pensé à faire un automatisation :
Quoi mettre en déclencheur ?
Condition aucune
Action
Si Etat_onduleur = 0 alors écrire Waiting
Si Etat_onduleur = 1 alors écrire Checking
Si Etat_onduleur = 2 alors écrire Sur secteur

Mais écrire ces valeurs où et comment svp ?

Merci,


System Information

version core-2023.11.1
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.21-v8
arch aarch64
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.33.0
Stage running
Available Repositories 1342
Downloaded Repositories 2
HACS Data ok
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.1
update_channel stable
supervisor_version supervisor-2023.11.3
agent_version 1.6.0
docker_version 24.0.6
disk_total 28.6 GB
disk_used 8.4 GB
healthy true
supported true
board rpi4-64
supervisor_api ok
version_api ok
installed_addons Terminal & SSH (9.8.1), File editor (5.7.0), Mosquitto broker (6.4.0), Log Viewer (0.16.0), Frigate (0.12.1), Z-Wave JS (0.3.0), SQLite Web (4.0.0), Samba Backup (5.2.0), ESPHome (2023.11.2)
Dashboards
dashboards 1
resources 0
views 3
mode storage
Recorder
oldest_recorder_run 13 novembre 2023 à 16:15
current_recorder_run 20 novembre 2023 à 21:24
estimated_db_size 76.92 MiB
database_engine sqlite
database_version 3.41.2
___

Salut,

donc si je comprends bien tu as créé un Texte MQTT qui récupère cette valeur. (le Yaml que tu as partagé)

Si c’est bien ça, la solution est un peu plus simple et directe.
Dans value_template, tu peux ajouter de la logique pour convertir le chiffre en texte.

value_template:>
{% if value_json.running_state == "0"  %}
Waiting
{% elif value_json.running_state == "1" %}
Checking
{% elif value_json.running_state == "2" %}
Sur Secteur
{% else %}
Inconnu
{% endif %}

Bonjour @AlexHass

Merci pour ce rretour rapide !
J’ai cela en erreur :

Invalid config for [text]: invalid template (TemplateSyntaxError: expected token ‹ end of statement block ›, got ‹ value_json ›) for dictionary value @ data[‹ value_template ›]. Got ‹ {% if value_json.running_state == « 0 » %} Waiting {% elif value_json.running_state == « 1 » %} Checking {% elif value_json.running_state == « 2 » %} Sur Secteur {% elif value_json.running_state == « 3 » %} Emergency Mode {% elif value_json.running_state == « 4 » %} Defaut {% elif value_json.running_state == « 5 » %} Defaut {% elif value_json.running_state == « 6 » %} Mise à jour {% else value_json.running_state == « 7 » %} Recharge par secteur {% endif %}\n ›. (See /config/mqtt.yaml, line 37)

Pour compléter, voici ce que j’ai tapé :

- text:
    command_topic: "-"
    state_topic: "Sofar2MQTT-DP-PV/state"
    name: "Etat onduleur"
#    value_template: "{{ value_json.running_state }}"
    value_template: >-
      {% if value_json.running_state == "0"  %}
      Waiting
      {% elif value_json.running_state == "1" %}
      Checking
      {% elif value_json.running_state == "2" %}
      Sur Secteur
      {% elif value_json.running_state == "3" %}
      Emergency Mode
      {% elif value_json.running_state == "4" %}
      Defaut
      {% elif value_json.running_state == "5" %}
      Defaut
      {% elif value_json.running_state == "6" %}
      Mise à jour
      {% else value_json.running_state == "7" %}
      Recharge par secteur
      {% endif %}

Je vais voir si je trouve le pourquoi du comment et la signification.

« else » ne peut pas avoir de condition.
Soit c’est un « elif » que tu met pour faire le test avec « 7 ».
Soit tu met un else sans test. D’ailleurs vaut mieux ajouter une else quoi qu’il arrive, si jamais ton intégration ne marche pas ou n’est pas démarrée au moins tu aura une valeur.

Ok merci de cette précision.
J’avais toujours l’erreur, j’ai modifié le % par ce caractère : ℅ comme un C slash O, l’erreur a disparu mais l’information n’est pas remontée, j’ai « unavailable »
:thinking:

Ca ressemble plus a une histoire de copier/coller. Tu es sur PC windows ou autre chose?
℅ je ne sais même pas d’où sort ce caractère.

Le « unavailable » c’est soit que tu n’as pas encore reçu de nouvelle valeur depuis le redémarrage, soit une erreur qui se retrouve dans le journal…

Avant de mettre toutes les conditions, je vais faire une par une.
Ok pour le copié collé, mais j’ai dégagé ce caractère bizarre pour un pourcentage.

J’arrive à faire remonter une valeur mais qui n’est pas bonne et HA me crée une autre entité.

Mon entité créée s’appelle etat_onduleur, HA me sort etat_onduleur_2, pourquoi ??

Je confirme par mqtt explorer que mon onduleur envoie bien l’information runningstate : 0

:thinking: :thinking:

La 2eme entité créée c’est surement si tu as enlevé le « unique_id » que tu avais dans ton premier screenshot.

Alors en effet j’ai supprimé le unique id (mis en commentaire à vrai dire). Par contre je ne comprend pas… le fait de mettre ou pas « unique_id » provoque quoi finalement ? Car le topic mqtt est le même et mon entité également ? Désolé pour cette question bête probablement…

Deuxième point, j’ai dégagé les " " et ça fonctionne.

{% if value_json.running_state == 0 %}
  Waiting
{% else %}

J’ai plus qu’à rajouter les autres test logique alors.

unique_id de base tu n’as pas vraiment besoin de le définir. Mais c’est ce qui en arrière plan permet au système de savoir si on parle de la même entité ou pas… Donc comme tu avais créé au début avec une id… et une 2eme fois sans, il a considérié que ce n’était plus la même entitié.

Pour les " " comme c’était du MQTT et ne connaissant pas ton JSON, je pensais que c’était du texte, mais visiblement c’est un entier, donc normal qu’il n’y en ait pas besoin…

ok, merci beaucoup du temps et explications :pray:

dans le cas où je suis en défaut N°4 et 5, je crée une automatisation de ce style :
Selon entité « etat_onduleur »
passe de n’importe état
à « Defaut »
Alors envoie notif telegram.

Ca semble correct ?


alias: Onduleur-check-state
description: ""
trigger:
  - platform: state
    entity_id:
      - text.etat_onduleur
    from: null
    to: Defaut
condition: []
action:
  - service: telegram_bot.send_message
    data:
      message: Onduleur en défaut
mode: single
1 « J'aime »