Bonjour à tous
J’ai suivi les tuto expliquant comment faire un pont RF432 vers Home assistant à base d’ESP32.
GitHub - cpainchaud/RFLink32: RFLink for ESP, with MQTT client
Je reçois donc les messages typés RFLink via MQTT.
Soit ce type de messages:
Télécommande:
20;3A;NewKaku;ID=007ddec6;SWITCH=1;CMD=ON;
Mesure de la station météo:
20;05;Alecto V4;ID=5a90;TEMP=008e;HUM=29;BAT=OK;
Donc mon problème est de parser les différents messages et de les envoyer soit vers un sensor soit vers une automatisation.
J’ai identifié plusieurs méthodes qui seraient possibles, certaines existent peut être mais je ne sais pas… et j’aimerai savoir si il en existe une simple, efficace et universelle (pour toutes sorte de message)…
1/ automation avec trigger sur mqtt et condition sur la payload (fonctionne)
- id: RFcmdDecode
alias: RFcmdDecode
description: 'Decodage cmd RFLink32'
trigger:
- platform: mqtt
topic: /ESPrf/msg
condition:
condition: template
value_template: "{{ 'NewKaku;ID=007ddec6' in trigger.payload }}"
action:
- service: light.toggle
target:
entity_id: light.extended_color_light_6
Cette méthode fonctionne bien avec la télécommande mais, malheureusement, je n’ai pas réussi à la faire fonctionner avec un sensor car même si on peut trigger un sensor, la condition qui suit le trigger semble rejetée par HA.
2/ Connexion du topic mqtt aux intégrations RFLINK existante
Je ne vois pas quelle adresse mettre dans la déclaration RFLINK ni comment déclarer le topic…
3/ Conditions dans l’intégration mqtt
Par exemple, le trigger mqtt: Automation Trigger - Home Assistant
semble avoir tout ce qu’il faut pour ne se déclencher que sur certaines conditions mais… je peine à trouver le moyen de l’utiliser.
J’ai testé ces approches:
template:
- trigger:
- platform: mqtt
topic: /ESPrf/msg
value_template: "{{ trigger.payload.split(';')[3] }}"
payload: ID=5a90
sensor:
- name: Temp_ext_rflinlk
unit_of_measurement: "°C"
state: >
{% set temp_hexa = trigger.payload.split(';')[4].split('=')[1] -%}
{{ temp_hexa | int( temp_hexa, 16) / 10 }}
avec payload: ID=5a90
ou payload: "ID=5a90"
Mais ne fonctionne pas.
Ou cette approche:
template:
- trigger:
- platform: mqtt
topic: /ESPrf/msg
value_template: "{{ 'Alecto V4;ID=5a90' in trigger.payload }}"
sensor:
- name: Temp_ext_rflinlk
unit_of_measurement: "°C"
state: >
{% set temp_hexa = trigger.payload.split(';')[4].split('=')[1] -%}
{{ temp_hexa | int( temp_hexa, 16) / 10 }}
Mais là encore pas de résultats.
4/ Script de parsing du message avec écriture dans une variable puis trigger en fonction de la variable
Le petit script python qui attend vos réponses est le suivant:
# A tester avec la commande
# python .\RFlinkSensor.py "20;05;Alecto V4;ID=5a90;TEMP=008e;HUM=29;BAT=OK;"
# python .\RFlinkSensor.py "20;AF;LaCrosse-TX141THBv2;ID=0078;TEMP=006f;BAT=OK;"
import sys
try:
mytempChar = sys.argv[1].split('TEMP=')[1]
mytempHexa = mytempChar.split(';')[0]
mytempNum = int(mytempHexa,16) /10.
print(mytempNum)
except:
print("An exception occurred")
Evidemment, il faudrait faire en sorte que ce script parse le message pour tout type de source (télécommande, mesure,…).
5/ Faire en sorte que l’ESP32 envoie du jison plutôt que ce message.
Je crois qu’il y a des exemples montrant comment utiliser simplement un message en jison.
Et à relire le code du mqtt trigger ici: core/trigger.py at dev · home-assistant/core · GitHub
Je me rends compte qu’il est possible que cette fonction n’accepte que du jison… (ma compréhension du python est limitée)
def mqtt_automation_listener(mqttmsg):
"""Listen for MQTT messages."""
payload = mqttmsg.payload
if value_template is not None:
payload = value_template.async_render_with_possible_json_value(
payload,
error_value=None,
)
if wanted_payload is None or wanted_payload == payload:
data = {
**trigger_data,
"platform": "mqtt",
"topic": mqttmsg.topic,
"payload": mqttmsg.payload,
"qos": mqttmsg.qos,
"description": f"mqtt topic {mqttmsg.topic}",
}
with suppress(ValueError):
data["payload_json"] = json.loads(mqttmsg.payload)