Interface RS232 pour Beamer Benq

Bonjour la communauté Jeedom,

Je souhaite partager un projet d’interfaçage d’un Beamer Benq 1090W équipé d’une interface série RS232 (mais malheureusement pas réseau).

Les objectifs sont assez simples, pouvoir allumer et éteindre le projecteur et idéalement avoir un retour d’état.

Et cette fois (nota bene 1), j’ai opté pour cette bonne vieille interface RS232 avec le connecteur DB9.
Bref, Keep It Simple Stupid ! :nerd_face:
Et si possible en WiFi… mais ça, c’est surtout que j’avais la flemme de tirer un câble RJ45 (à ma décharge, la goulotte de câbles était pleine :innocent:).

En théorie (c’est une très belle région, je ne sais pas si vous connaissez ?), je me suis dit un petit serveur série, un brin de telnet et le tour serait joué :cowboy_hat_face:

En pratique (c’est une région beaucoup plus rude, mais à la longue, on apprécie… ?), j’ai rencontré deux difficultés:

  • Budget proportionné à la mission (on va éviter le serveur Moxa à 300€).
  • Interfaçage Telnet depuis Jeedom (comment envoyer mes commandes).

Bref… voilà comment j’ai fait.

Matériel
pour le serveur série (ou serveur console) j’ai trouvé Hi-Flying qui nous fait des mini-serveurs série. Plus spécialement la gamme Elfin, avec un prix raisonnable (nota bene 2).
Ensuite, j’ai ajouté un bout de câble USB de récup’ pour alimenter tout ça en 5V (il y a un port USB A prévu à cet effet sur le Beamer), un câble DB-9 femelle et une prise RJ45 permettant de sertir deux fils sur la même broche (le Gnd est commun à l’alim et au port série).

Quelques coups de pince à couper et j’ai serti ma RJ45 sur les deux câbles (Power USB et RS232 DB9) avec 20cm de marge pour cacher tout ça sur le Beamer.

Elfin

Configuration du Elfin
Deux options, soit se connecter en WiFi sur l’Elfin (il émet son propre SSID comme un Access Point) et ouvrir la page de config, soit se connecter en série et passer en mode config en envoyant d’un bloc « +++ » (115200-8-n-1).
Niveau config, le port série est en 115200-8-n-1 pour le Beamer sans Flow Control, et le serveur série est en « TCP Server ».

Configuration sur Jeedom
Côté Jeedom, à défaut d’un Plugin Telnet/Série qui soit fonctionnel, j’ai utilisé des scripts sur la base de ce post (en passant : merci @MnX ) mais en utilisant socat plutôt que telnet. Et pour les commandes du Beamer, j’ai trouvé cette documentation de Benq.

Finalement, voici quelques commandes / scripts que j’utilise:

Power Status (info):

#!/bin/bash
{
sleep 0.1
echo "*pow=?#"
sleep 0.1
} |socat - TCP:10.10.3.22:8888,cr

Power On (action):

#!/bin/bash
{
sleep 0.1
echo "*pow=on#"
sleep 0.1
} |socat - TCP:10.10.3.22:8888,cr

Power Off (action):

#!/bin/bash
{
sleep 0.1
echo "*pow=off#"
sleep 0.1
} |socat - TCP:10.10.3.22:8888,cr

Conclusions
Bah ça marche, et je suppose qu’on peut utiliser cette recette pour autre chose qu’un beamer.
Après, un plugin officiel qui serait bien ficelé pour du Telnet, ça ne serait probablement pas de trop.
Mais en tout cas, évitez le plugin Telnet à 2€, je ne pense pas qu’il soit très utile…

Nota Bene 1
Par le passé, j’avais utilisé un Broadlink Mini pour envoyer par IR les commandes.
Mais le fonctionnement n’était pas fiable (commande off ne passe pas chaque fois) et difficultés pour programmer le commande « off » sur le Broadlink (sans parler de l’App). Et finalement pas de retour d’état.

Note Bene 2
Je ne suis pas là pour faire de la pub, mais leurs produits m’ont donné d’autes idées.
Entre les micromodules WiFi ou GSM, des interfaces RS485… il y a de quoi faire :space_invader:

Bonjour à tous,

Je vous fais également part de ma solution pour piloter depuis jeedom un projecteur BenQ W1720 non équipé d’une prise rj45 mais bien d’un port mâle DB9 - RS232.

J’ai un peu ramé avant d’obtenir un résultat, c’est pourquoi si jamais mon petit résumé peut aider par la suite un passionné de l’automatisation à outrance et bien tant mieux.

Matériel
N’étant pas adapte du sans fil, j’ai opté pour un appareil filaire de chez Waveshare Rail-Mount Serial Server, RS232/485/422 to RJ45 Ethernet Module, TCP/IP to serial, POE Function Optional.
Je voulais un boitier:

  • Pas trop cher <50€;
  • Facile à obtenir « Amazon »;
  • Et qui pouvait être alimenté en POE pour ne pas rajouter une alimentation au niveau du vidéoprojecteur ou pire que celui-ci face office d’alimentation en USB pour l’appareil, je me méfie de ces petits engins :slight_smile: .

Cet appareil est même compatible mqtt, ce qui a fait pencher le choix par rapport à d’autre. Et c’est justement cette fonction, n’étant pas expert, qui m’a embêtée.

Pour le câble, il faut pour les connectiques, dans mon cas, un femelle vers femelle et électriquement crossover ou dit Null Modem (important car la documentation technique de BenQ ne fait pas part de ce type de montage et peut être trompeuse). J’ai prit celui-ci de chez StarTech StarTech.com Câble null modem série DB9 RS232 de 1m - Cordon série DB9 vers DB9 - Femelle / Femelle - Noir (SCNM9FF1MBK)

Pout l’alimentation du boitier, soit vous possédez un switch POE, soit vous pouvez acheter un injecteur POE.

Configuration du Waveshare
Suivre les documentation techniques wiki/RS232/485/422_TO_POE_ETH_(B) et Waveshare MQTT and JSON Manual

Pour résumé, il vous faut le logiciel Vircom indispensable si vous utilisez la fonction mqtt et je dirais même également pour les autres fonction.

  1. Lancez Vircom
  2. Allez dans « Device »
  3. Identifie votre boitier → « Auto search » pour faire apparaitre les devices et double cliquer pour ouvrir celui qui vous intéresse.
  4. Configurez l’ip de votre device en « dhcp » ou « statique », comme vous le souhaitez
  5. Allez dans « Firmware/Config »
  6. Sélectionnez un dossier vide
  7. Cliquez « Clear all » puis « MQTT config »
  8. Renseignez:
  • l’ip du brocker mqtt dans mon cas un serveur mosquitto hébergé en dehors de jeedom.
  • Le port
  • Le nom d’utilisateur et mot de passe créer dans le brocker pour l’appareil pour que celui-ci puisse « subscribe » et « publish » a travers le brocker.
  • Un id → j’ai repris celui du device
  • Un nom de topic pour subscribe et un autre pour publish (bien les nommer différemment, je suis rentré plusieurs fois par mégarde dans des boucles infini ou l’appareil recevait (et donc exécutait) les messages qu’il envoyait, j’ai fait crasher deux-trois fois mon vidéoprojecteur avant de comprendre ce qui m’a obligé de débrancher l’alimentation du vidéoprojecteur, car plus rien ne répondait, dont une fois quand il était allumé :frowning: ( faites vos tests quand il est éteint et essayer les commandes types *pow=?# ou *modelname=?#)
  • Faites « Saves »
  1. Cliquez sur « Download »

Configuration sur jeedom
J’utilise jMQTT, ajouter un équipement et renseigner la racine du topic.
Et c’est la où ça se complique les commandes envoyer doivent être précédées et suivit du fameux <CR> du style <CR>*pow=?#<CR>, sauf que JMQTT l’interprète comme du texte et donc l’interface RS232 nous renvoie *Illegal format#, je n’ai pas réussi à partir de jMQTT à envoyer ces « return line ».
Ducoup, jMQTT me servira uniquement à récupérer la réponse du vidéoprojecteur à ma commande et pas à envoyer la commande. Pour cela, j’ai fait un petit script python pour envoyer mes propres commandes mqtt. Ensuite, je regrouperai mes commandes et les retours d’infos dans un virtuel.

Script python

#!/usr/bin/env python3
import sys
import time
from paho.mqtt import client as mqtt_client

msg=sys.argv[1]

brocker = "192.168.1.27"
port = 1883 #ou 8883 si tls configuré sur le brocker
topic = "WSDEV0001-28750D5530D7/sub"
client_id = "test" #Créer dans le brocker un utilisateur propre a jeedom différent de l'appareil waveshare
client_username = "test" #Créer dans le brocker un utilisateur propre a jeedom différent de l'appareil waveshare
client_pw = "test" #Créer dans le brocker un utilisateur propre a jeedom différent de l'appareil waveshare

client = mqtt_client.Client(mqtt_client.CallbackAPIVersion.VERSION2,client_id)
client.username_pw_set(client_username,client_pw)
#client.tls_set() décommenter si tls configuré sur le brocker
#client.tls_insecure_set(False) décommenter si tls configuré sur le brocker
client.connect(brocker,port)

msg = "\r"+msg+"\r"
result = client.publish(topic, msg)
time.sleep(0.1)
client.disconnect()

La commande à exécuter par le vidéoprojecteur est l’argument lors de l’appel du script.

Conclusion
Malheureusement, je n’ai pas réussi a me servir de jMQTT pour envoyer les commandes mais uniquement pour récupérer la réponse du vidéoprojecteur.
Il est probable de faire fonctionner jMQTT en bidouillant autour de la configuration du waveshare au niveau de la mise en forme du json, mais je n’ai pas tenté.
Malgré tout, avec le script on s’en sort. J’ai été obligé de rajouter un timer.sleep(0.1) avant de se déconnecter du broker sinon le système n’avait pas le temps d’envoyer au brocker la commande.

Il est indispensable d’avoir le <CR> avant la commande par contre le # peut être négligé sur mon projo.

Le défault du waveshare serait de ne pas pouvoir l’utiliser avec une connexion sécurisé mqtts.

N’hésitez pas à faire des remarques et proposer des solutions pour le <CR> sur jMQTT.