Passerelle port série vers broker MQTT

Bonjour,

Je cherche un moyen de rediriger les messages reçus sur le port série vers un broker MQTT installé sur la même machine.
Les messages sont de ce type :
T P1P2/P/T/TempRoom1:26.59
T P1P2/P/T/TempLWT:23.56
T P1P2/P/T/TempDHW:47.28
T P1P2/P/T/TempOut1:3.50
T P1P2/P/T/TempRWT:23.73
Cela correspond visiblement à ce qu’un broker est célèbre d’interpréter.

J’ai essayé différentes options avec la commande socat, je ne suis pas arrivé à un résultat pertinent.
Je souhaiterais aussi envoyer des messages vers le port série.

Merci d’avance

Je ne connaissais pas ce machin d’internet of shit, “broker MQTT” et tu risques d’avoir peu de monde, j’imagine, qui soit vraiment compétent en IOT ici, mais si tu indiquais déjà ce que tu utilises comme broker, et comment tu as essayé de communiquer avec lui avec socat, on pourrait essayer de t’aider à créer le canal entre ton port série et le point d’entrée sans vraiment connaitre ton broker.
Mais il faudrait plus d’infos.
Ca ne serait pas un mosquitto, que tu essayes d’alimenter avec mosquitto_pub, genre ?

Ben tout bêtement echo "bla bla" >/dev/ttyS0, si c’est ce port série là, non ?

Internet of shit, c’est assez bien vu. Je débute avec ça, je suis un peu perdu.

C’est bien ce truc (serveur mosquitto) que je cherche à alimenter, à défaut de savoir développer autre chose.
J’ai essayé différentes options avec socat, mais ça ne fonctionne visiblement pas (ça se termine en broken pipe).
Effectivement, utiliser mosquitto_client est probablement plus pertinent.

En regardant comment ça fonctionnait, je me disais qu’on pouvait transformer (avec sed par exemple) chaque ligne des messages qui arrive par le ttyS (avec une boucle qui surveille un tail -qf) en une instruction mosquitto_pub -h localhost -t ... dont tu lances l’execution à chaque réception de message, et j’ai (trés) vaguement un script ou un pipeline bash en tête pour faire ça, mais je suis loin d’avoir une idée claire de ce qu’il faudrait faire.
Du coup, si tu es parti sur une mécanique avec socat, c’est que toi aussi tu avais une idée, et je pense que si tu filais quelques exemples de ce que tu as voulu faire socat et qui n’a pas marché, on pourrait t’aider à faire marcher ta solution, ça me semble plus simple

Je n’ai pas vraiment d’idée précise avec socat.
Je crois qu’effectivement il faut un script bash pour générer des envois vers mosquitto_pub.

Merci

Oui, mais non, je ne vais pas te l’écrire là comme ça, d’abord parce que ce n’est pas d’une totale évidence à pondre pour moi, même si j’ai des pistes, donc ça me prendrait un temps de réflexion dont je ne dispose pas, et en plus, je n’ai pas les moyens de tester si ça marche chez moi, donc on se retrouverait à faire des allers/retours de scripts de test, toussa.

D’autant plus qu’il me semble que quelqu’un a déjà traité le probléme:

Je comprends bien, je vais essayer de creuser ce que je peux faire comme script.
Concernant le lien joint, j’avais déjà consulté ce site et je m’étais arrêté à ça :

> For now, this adapter supports only for MySensors

Merci pour la réponse précédente.

Ah zut, j’avais pas vu ça.
Et en plus, c’est du java, ça doit forcément être une usine à gaz. :stuck_out_tongue_winking_eye:

Bon, sinon, autre piste, le 2e sur la requète “serial to mosquitto”, indique qu’il y a une lib python chez mosquitto (pas trouvée) pour causer avec le port série.

Mais en lisant le man mosquitto_pub, je me demande si ce n’est pas aussi simple à faire que mosquitto_pub -t my/topic -f </dev/ttyS0

Visiblement, utiliser mosquitto_pub sera le plus simple. Malheureusement, celui-ci veut un fichier dont la longueur est connue :

sudo mosquitto_pub -h localhost -t P1P2 -f /dev/ttyACM0 -d
Error: Unable to determine size of file “/dev/ttyACM0”.
Error loading input file “/dev/ttyACM0”

Il y peut-être l’option --stdin-line qui pourrait-être utilisée. Je vais faire des recherches.

Il faut probablement que je crée un script qui sélectionne la dernière ligne de la sortie série(vue via cat /dev/ttyACM0), renvoit celle-ci vers la commande mosquitto_pub (mosquitto_pub -h localhost -t P1P2 -m “$portsérie”), et se relance à chaque nouvelle valeur de la sortie série.

J’y suis presque :

sudo cat /dev/ttyACM0 | mosquitto_pub -h localhost -t P1P2 -l -d
Client mosqpub|25916-maison sending CONNECT
Client mosqpub|25916-maison received CONNACK (0)
Client mosqpub|25916-maison sending PUBLISH (d0, q0, r0, m1, ‘P1P2’, … (10 bytes))
Client mosqpub|25916-maison sending PUBLISH (d0, q0, r0, m2, ‘P1P2’, … (77 bytes))

Je répond quand j’ai la solution.

Je crois avoir vu la mention d’un -r aussi pour passer des cas de dispositifs peu verbeux, dans les exemples de la page de man (l’explication du rôle du flag n’est pas super claire, faut tester).

Merci beaucoup pour l’aide fournie, je suis arrivé à surveiller ma machine.
Je vais tester l’autre flag.

Dernier “sinon”:
je vois que tu fais des cat que tu pipe ensuite, mais cat, ça doit te lire le buffer du port et sortir ensuite.
Je crois qu’un tail -qf | … devrait être mieux.

Et ajoutes l’user qui doit accèder à /dev/ttyACM0 au groupe dialout (vérifie si c’est bien ce groupe avec ls -l /dev/ttyACM0) ça devrait t’éviter de faire les choses en sudo.

Bizarrement " tail -qf" ne renvoit aucune sortie.

Il ne me reste plus qu’à le faire tourner en daemon et j’ai fini.

Ca me semble normal, parce que le buffer du port série ne conserve pas d’historique de ce qui est passé avant s’il a été flushé, mais le tail -qf ne rend pas la main comme s’il avait reçu un EOF quand il arrive à la fin du flux, comme cat, et la prochaine fois que ton dispositif enverra un message, ton tail -qf, qui n’a pas décroché malgré le fait qu’il soit arrivé au bout du contenu de ttyACM0, te le sortira sur sa sortie standard.
Un tail -qf, c’est un cat de fin de fichier qui ne décroche pas quand il arrive à la fin.
Mais bon, si ça marche avec cat:smiley:

[edit: erreur, ce n’est pas tail -qf, mais tail -q !
le f, c’est pour prendre un fichier au lieu de l’entrée standard, je suis bête…
tail -q = tail -qf - ]