{"id":1176,"date":"2022-06-01T13:59:42","date_gmt":"2022-06-01T11:59:42","guid":{"rendered":"https:\/\/www.domedia.net\/?p=1176"},"modified":"2024-02-23T11:50:20","modified_gmt":"2024-02-23T10:50:20","slug":"home-assistant-et-controle-en-mode-serie-rs-232-422-485-comment-faire","status":"publish","type":"post","link":"https:\/\/www.domedia.net\/?p=1176&lang=fr","title":{"rendered":"Home-Assistant et contr\u00f4le en mode s\u00e9rie (RS-232\/422\/485): comment faire ?"},"content":{"rendered":"<p>M\u00eame si cela devient de plus en plus rare aux fils des ann\u00e9es, il existe encore des appareils dans le domaine de l&rsquo;audiovisuel pro qui se pilotent via un port s\u00e9rie (RS-232, 422, 485). Cela permet un contr\u00f4le tr\u00e8s fin et efficace des appareils, et la gestion \u00e9ventuel des \u00e9tats par les retours des appareils, ce qui permet une automatisation efficace et stable.<\/p>\r\n<p><!--more--><\/p>\r\n<p>La principale probl\u00e9matique va \u00eatre d&rsquo;avoir une interface permettant de communiquer physiquement en s\u00e9rie avec les appareils concern\u00e9s. Une solution \u00e9vidente est d&rsquo;utiliser un ESP, qui permet de faire beaucoup de choses ais\u00e9ment en terme d&rsquo;interface avec des appareils. Malheureusement les ESP fonctionnent avec une logique \u00e0 3V3 alors que les ports s\u00e9rie type RS-232 entre autres communiquent avec une tension variant entre -25V et +25V pour les cas plus extr\u00eames, ce qui est totalement incompatible avec l&rsquo;ESP. La connexion directe d&rsquo;un port RS-232 \u00e0 des ports GPIO de l&rsquo;ESP entra\u00eenerait imm\u00e9diatement la destruction de l&rsquo;ESP ! Il est indispensable recourir \u00e0 un interfa\u00e7age entre l&rsquo;ESP et le port s\u00e9rie avec un circuit int\u00e9gr\u00e9 type <a href=\"https:\/\/www.analog.com\/en\/products\/MAX232.html\" target=\"_blank\" rel=\"noopener\">MAX232<\/a>\u00a0de chez Maxim qui s&rsquo;occupe de \u00ab\u00a0convertir\u00a0\u00bb les niveaux logiques. Une autre solution plus pratique est d&rsquo;utiliser un circuit tout fait, comme par exemple, le <a href=\"https:\/\/www.kincony.com\/esp32-tuya-iot-adapter.html\" target=\"_blank\" rel=\"noopener\">Tuya Adapter<\/a> (moins de 20\u20ac sur Internet) de Kincony.<\/p>\r\n\r\n<figure class=\"wp-block-table\">\r\n<table>\r\n<tbody>\r\n<tr>\r\n<td><img loading=\"lazy\" decoding=\"async\" class=\"size-medium wp-image-1179 alignleft\" src=\"https:\/\/www.domedia.net\/wp-content\/uploads\/2022\/06\/kincony-tuya-adapter-4-300x300.jpeg\" alt=\"Kincony Tuya Adapter\" width=\"300\" height=\"300\" \/><\/td>\r\n<td><img loading=\"lazy\" decoding=\"async\" class=\"size-medium wp-image-1180 alignright\" src=\"https:\/\/www.domedia.net\/wp-content\/uploads\/2022\/06\/Screenshot_20240220_113838-300x148.png\" alt=\"Kincony Tuya Adapter (Schematic)\" width=\"300\" height=\"148\" \/><\/td>\r\n<\/tr>\r\n<\/tbody>\r\n<\/table>\r\n<\/figure>\r\n\r\n<p>Cette carte pr\u00e9vue au d\u00e9part pour faire de l&rsquo;interfa\u00e7age avec des \u00e9quipements Tuya va \u00eatre d\u00e9tourn\u00e9e pour faire au choix du 232 ou du 485 selon la position d&rsquo;un jumper sur la carte ! Pour l&rsquo;alimentation de la carte cela se fait facilement via le bornier \u00e0 vis ou le connecteur d&rsquo;alimentation. La connexion en RS-232 se fait via la sub-d9 et le 485 via le bornier \u00e0 vis.<\/p>\r\n<p>Il nous suffit alors de pr\u00e9parer un sketch ESPHome pour \u00e9craser le firmware d&rsquo;origine du fabricant et rendre cette carte facilement int\u00e9grable dans Home-Assistant.<\/p>\r\n<p>La configuration sera assez simple et je vais vous partager quelques exemples. On va commencer par le pilotage d&rsquo;un processeur audio Meridian. Le protocole fourni par le fabricant est disponible sur <a href=\"https:\/\/www.domedia.net\/wp-content\/uploads\/2024\/02\/ControlInterfaceSpecification_SL1xx_V3-0-0_20100623.pdf\" target=\"_blank\" rel=\"noopener\">ce lien<\/a>. La premi\u00e8re chose dont on a besoin c&rsquo;est les param\u00e8tres de communication: pour une liaison s\u00e9rie il s&rsquo;agit de la vitesse en bauds, le bit d&rsquo;arr\u00eat et la parit\u00e9. Ici il nous est indiqu\u00e9 9600 bauds, 1 bit d&rsquo;arr\u00eat et aucune parit\u00e9. Cela tombe bien, c&rsquo;est quasiment les r\u00e9glages par d\u00e9faut d&rsquo;ESPHome donc on aura juste besoin de pr\u00e9ciser la vitesse \u00e0 9600 bauds.<\/p>\r\n<p>Pour le c\u00e2blage il suffira de relier les 3 fils suivants: RX, TX et GND(Masse). Selon les appareils, RX et TX devront \u00eatre crois\u00e9s ou non entre le Kincony et l&rsquo;appareil pilot\u00e9 (aucune r\u00e8gle scientifique \u00e0 ce niveau l\u00e0 !).<\/p>\r\n<p>Il est n\u00e9cessaire maintenant de d\u00e9terminer les \u00ab\u00a0messages\u00a0\u00bb \u00e0 envoyer pour piloter cet appareil. Le protocole indique qu&rsquo;il suffit d&rsquo;envoyer 2 caract\u00e8res parfois suivi d&rsquo;un argument et fini par un \u00ab\u00a0Carriage Return\u00a0\u00bb. On mettra donc simplement la chaine de caract\u00e8res en question dans le uart.write du code ESPHome. Le Carriage Return est un caract\u00e8re invisible car il correspond au Retour Chariot et donc il s&rsquo;encode souvent en CR ou ici pour ESPHome avec le caract\u00e8re d&rsquo;\u00e9chappement: \\r Il est courant que les commandes soient termin\u00e9es par un CR ou un LF (Line Feed ou Saut de Ligne) voire les deux. Ici le programmeur par habitude a mis automatiquement les deux.<\/p>\r\n<p>On obtient donc tout simplement la commande suivante pour commuter le processeur Meridian sur l&rsquo;entr\u00e9e TV: <strong>TV\\r\\n<\/strong><\/p>\r\n<pre><strong>esphome:\r\n  name: esp-meridian\r\n  platform: ESP32\r\n  board: esp32dev\r\n\r\nlogger:\r\n\r\nweb_server:\r\n\r\nota:\r\n\r\nwifi:\r\n  networks:\r\n  - ssid: !secret wifi_ssid\r\n    password: !secret wifi_passwd\r\n\r\ncaptive_portal:\r\n\r\napi:\r\n  reboot_timeout: 10min\r\n\r\nbutton:\r\n  - platform: template\r\n    name: Meridian CD input\r\n    on_press:\r\n      - uart.write: \"TV\\r\\n\"\r\n      - delay: 1s\r\n      - uart.write: \"VN90\\r\\n\"\r\n      - delay: 20s\r\n      - uart.write: \"VN90\\r\\n\"\r\n  - platform: template\r\n    name: Meridian DV input\r\n    on_press:\r\n      - uart.write: \"DV\\r\\n\"\r\n  - platform: template\r\n    name: Meridian Stanby\r\n    on_press:\r\n      - uart.write: \"SB\\r\\n\"\r\n\r\nswitch:\r\n  - platform: template\r\n    name: Meridian Audio Direct\r\n    id: direct\r\n    optimistic: true\r\n    restore_mode: restore_default_off\r\n    internal: false\r\n    on_turn_on:\r\n      - uart.write: \"PN0\\r\\n\"\r\n      - switch.turn_off: cinema\r\n      - switch.turn_off: music \r\n      - switch.turn_off: thx\r\n  - platform: template\r\n    name: Meridian Audio Cinema\r\n    id: cinema\r\n    optimistic: true\r\n    restore_mode: restore_default_off\r\n    internal: false\r\n    on_turn_on:\r\n      - uart.write: \"PN12\\r\\n\"\r\n      - switch.turn_off: direct\r\n      - switch.turn_off: music\r\n      - switch.turn_off: thx\r\n  - platform: template\r\n    name: Meridian Audio Music\r\n    id: music\r\n    optimistic: true\r\n    restore_mode: restore_default_off\r\n    internal: false\r\n    on_turn_on:\r\n      - uart.write: \"PN1\\r\\n\"\r\n      - switch.turn_off: cinema\r\n      - switch.turn_off: direct\r\n      - switch.turn_off: thx\r\n  - platform: template\r\n    name: Meridian Audio THX\r\n    id: thx\r\n    optimistic: true\r\n    restore_mode: restore_default_off\r\n    internal: false\r\n    on_turn_on:\r\n      - uart.write: \"PN13\\r\\n\"\r\n      - switch.turn_off: cinema\r\n      - switch.turn_off: music\r\n      - switch.turn_off: direct\r\n\r\nuart:\r\n  tx_pin: GPIO17\r\n  rx_pin: GPIO16\r\n  baud_rate: 9600\r\n<\/strong><\/pre>\r\n<p>Dans ce nouvel exemple, on va piloter une TV Loewe qui pr\u00e9sente un port RS sur une RJ-11 (connecteur assez inhabituel pour de la RS-232). Le protocole tel que fourni par le fabricant est disponible sur <a href=\"https:\/\/www.domedia.net\/wp-content\/uploads\/2024\/02\/ControlInterfaceSpecification_SL1xx_V3-0-0_20100623.pdf\" target=\"_blank\" rel=\"noopener\">ce lien<\/a>. On va donc reprendre la m\u00eame logique que pr\u00e9c\u00e9demment.<\/p>\r\n<p>Pour les param\u00e8tres du port s\u00e9rie, on est dans la m\u00eame configuration que le cas pr\u00e9c\u00e9dent.<\/p>\r\n<p>Pour les commandes \u00e0 envoyer, on reste \u00e9galement dans un cas assez similaire. Par contre ici, on va contr\u00f4ler le volume de la TV ce qui implique d&rsquo;envoyer une valeur de fa\u00e7on dynamique. Via un lambda, on va pouvoir construire dynamiquement la chaine \u00e0 envoyer \u00e0 la TV (\u00ab\u00a0data volume XX\u00a0\u00bb o\u00f9 XX sera la valeur du niveau de volume souhait\u00e9). Cette valeur sera stock\u00e9e dans une variable locale dans ESPHome et cela permettra de faire varier cette variable directement depuis HA pour faire varier le volume comme souhait\u00e9 (typiquement via un bargraph par exemple).<\/p>\r\n<pre><strong>esphome:\r\n  name: esp-tv-loewe\r\n  platform: ESP32\r\n  board: esp32dev\r\n\r\nlogger:\r\n\r\nweb_server:\r\n\r\nota:\r\n\r\nwifi:\r\n  networks:\r\n  - ssid: !secret wifi_ssid\r\n    password: !secret wifi_passwd\r\n\r\ncaptive_portal:\r\n\r\napi:\r\n  reboot_timeout: 10min\r\n\r\nbutton:\r\n  - platform: template\r\n    name: TV HDMI1\r\n    on_press:\r\n      - uart.write: \"prog -6\\r\\n\"\r\n  - platform: template\r\n    name: TV HDMI2\r\n    on_press:\r\n      - uart.write: \"prog -7 \\r\\n\"\r\n\r\nswitch:\r\n  - platform: template\r\n    name: \"TV mute\"\r\n    optimistic: True\r\n    turn_on_action: \r\n      - uart.write: \"data mute 1\\r\\n\"\r\n    turn_off_action: \r\n      - uart.write: \"data mute 0\\r\\n\"\r\n  - platform: template\r\n    name: \"Power tv\"\r\n    assumed_state: True\r\n    optimistic: True\r\n    turn_on_action: \r\n      - uart.write: \"power tv\\r\\n\"\r\n    turn_off_action: \r\n      - uart.write: \"power off\\r\\n\"\r\n\r\nnumber:\r\n  - platform: template\r\n    name: \"TV Volume\"\r\n    id: test\r\n    optimistic: true\r\n    min_value: 0\r\n    max_value: 95\r\n    step: 1\r\n    on_value:\r\n       - uart.write: !lambda  \r\n                      char buf[128];\r\n                      sprintf(buf, \"data volume %.1f\\r\\n\", id(test).state);\r\n                      std::string s = buf;\r\n                      return std::vector( s.begin(), s.end() );\r\n\r\nuart:\r\n  tx_pin: GPIO17\r\n  rx_pin: GPIO16\r\n  baud_rate: 9600\r\n<\/strong><\/pre>\r\n<p><strong>Quelques points importants pour un pilotage s\u00e9rie fonctionel:<\/strong><\/p>\r\n<ul>\r\n<li>le c\u00e2blage RS-232 entre la carte ESP et l&rsquo;appareil <strong>peut n\u00e9cessiter d&rsquo;intervertir RX et TX<\/strong> (selon les appareils il faudra un c\u00e2blage droit ou crois\u00e9 !). Le cablage se fera la plupart du temps sur une SUB-D9 sur l&rsquo;appareil \u00e0 piloter mais cela peut \u00eatre sur des connecteurs plus exotiques comme une RJ-11 par exemple dans le cas de notre TV Loewe.<\/li>\r\n<li>Faire attention \u00e0 bien <strong>configurer la vitesse voire la parit\u00e9 et la longueur des mots<\/strong> (selon les indications du fabricant de l&rsquo;appareil \u00e0 piloter).<\/li>\r\n<li><strong>disposer du protocole de pilotage<\/strong> fourni par le fabricant (il est impossible de deviner un protocole de pilotage si vous ne l&rsquo;avez pas car chaque fabricant d\u00e9cide de la syntaxe de pilotage).<\/li>\r\n<\/ul>","protected":false},"excerpt":{"rendered":"<p>M\u00eame si cela devient de plus en plus rare aux fils des ann\u00e9es, il existe encore des appareils dans le domaine de l&rsquo;audiovisuel pro qui se pilotent via un port s\u00e9rie (RS-232, 422, 485). Cela permet un contr\u00f4le tr\u00e8s fin et efficace des appareils, et la gestion \u00e9ventuel des \u00e9tats par les retours des appareils, [&hellip;]<\/p>\n","protected":false},"author":3,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_et_pb_use_builder":"","_et_pb_old_content":"","_et_gb_content_width":"","footnotes":""},"categories":[30],"tags":[689,138,114,665,657,659,661,663,653,655,667],"class_list":["post-1176","post","type-post","status-publish","format-standard","hentry","category-technique","tag-esphome-fr","tag-ha","tag-home-assistant","tag-kincony","tag-port-serie","tag-rs-232","tag-rs-422","tag-rs-485","tag-serial","tag-serie","tag-tuya-adapter"],"_links":{"self":[{"href":"https:\/\/www.domedia.net\/index.php?rest_route=\/wp\/v2\/posts\/1176","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.domedia.net\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.domedia.net\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.domedia.net\/index.php?rest_route=\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"https:\/\/www.domedia.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=1176"}],"version-history":[{"count":15,"href":"https:\/\/www.domedia.net\/index.php?rest_route=\/wp\/v2\/posts\/1176\/revisions"}],"predecessor-version":[{"id":1187,"href":"https:\/\/www.domedia.net\/index.php?rest_route=\/wp\/v2\/posts\/1176\/revisions\/1187"}],"wp:attachment":[{"href":"https:\/\/www.domedia.net\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1176"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.domedia.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=1176"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.domedia.net\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=1176"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}