Contrôle par RS232

Bonjour
Pas encore équipé de Jeedom mais intéressé j’ai quelques questions sur le thème de l’interface série. Il n’y a pas de fil à ce sujet.
Peut-on envoyer des commandes RS232 à Jeedom ( via un convertisseur USB -RS232 ?
Est-ce que Jeedom peut envoyer des messages sur la RS232 ?

Merci.

Bonjour,

Jeedom est composé d’un core (coeur), le moteur principal: il organise des « équipements », qui ont des commandes; permet l’exécution de scénario etc.
Lui même ne se connecte nul part, il n’implémente aucun protocole.
Commencez par lire la documentation ici: https://doc.jeedom.com/fr_FR/concept/

Pour cela il faut un plugin qui va gérer une connexion, un protocole particulier et là tout est possible.
En soit il n’existe pas à ma connaissance de plugin pour « envoyer des commandes sur une interface série » mais la question est mal posée: à quoi voulez-vous envoyer des messages? que voulez-vous connecter?

Bonjour

Je pense que c’est la premiere chose a definir

Totalment d’accord

Je ne voie pas de contrindication

Tout dépend de l’equipement, il n’existe pas de plugin RS232 (a ma connaissnce) mais c’est quelque chose que l’on sais faire

Merci pour vos réponses! (Super rapide)

J’ai un système fait maison à base de microcontrolleur qui gère toute ma partie audio/vidéo. Celui-ci peut communiquer avec l’extérieur par liaison série.
Je souhaiterais pouvoir déclencher des scénarios en envoyant une commande via la RS232.
De même dans l’autre sens. Qu’un scénario puisse envoyer une trame à mon interface pour lui signaler par exemple que tel ou tel scénario a été déclenché

Merci

Si c’est du montage maison alors il faudra cree un script / plugin.
Apres ce n’est pas tres compliqué d’ouvir une liaison sur un port serie

Effectivement, à votre place je ferais un script python pour communiquer avec votre port série;
Script à utiliser sous jeedom avec le plugin script.

Bonjour,

De mon côté j’utilise le #plugin-globalcache de @mika-nt28 avec un boîtier IP2SL qui me permet de contrôler ma tv en RS232 via Jeedom. Dans mon cas, je l’utilise uniquement pour envoyer des commandes depuis Jeedom vers ma tv. Je ne sais pas si c’est possible dans l’autre sens avec ce plugin.

Python ou PHP ca marche aussi.
Je pense que le net regorge d’exemple pour les 2 cas

Il peut ajouter effectivement une module globalcache pour faire une conversion IP / RS232
Je pense que sont module USB / RS422 coute beaucoup moins cher apres c’est une question de localisation entre jeedom et l’appareil a piloté

Merci pour vos infos. Je pense pouvoir me débrouiller en Python mais reste à l’intégrer en plugin c’est une autre chose.

Prenez le plug-in script et regardez sa documentation.
Vous n’avez pas absolument besoin de faire vous même un plug-in.

Tout a fait ce plugin permet d’executer toute sorte de script

J’utilise un esp pour avoir une conversion de la sortie console de mon compteur d’électricité. L’esp crée un serveur telnet. Je me connecte dessus a partir de jeedom. Il y a un fil qui parle de cela, une piste éventuelle … Il y en a pour moins de 5 € de matos

Bonsoir,

Je reviens sur ce sujet car je cherche à contrôler/relever les infos avec Jeedom de deux onduleurs solaires (WKS EVO II 5KVA) qui communiquent avec des ports RS232 ou/et en Bluetooth.
Quelle serait la liaison physique idéale entre les onduleurs et Jeedom :

  • adaptateur RS232 - USB (mais interprété via quel plugin) ?
  • ESP32 avec extension RJ45 (toujours interprété avec quel plugin) ?
  • en Bluetooth (via BLEA) ?
    Je suis perdu dans les connexions possibles et surtout qui fonctionneraient pour relever les infos en continu et pour transmettre des modifications de paramètres de fonctionnement en fonction de scénarios.

Si quelqu’un a déjà réaliser quelque chose qui fonctionne dans ce sens, je suis preneur :wink:

Merci par avance pour votre aide.
Bonne soirée.

Dom.

Je pense que vous devriez relire les premières réponses.
Interface rs232 ou bluetooth ne veut rien dire, il faut surtout connaître le protocole utilisé sur ces interfaces.

Cette réponse est une énigme supplémentaire pour moi !
Je possède la documentation sur la liaison série de mon onduleur, mais cela ne m’aide pas à réaliser dans un premier temps la liaison physique entre l’onduleur et Jeedom.
Je suis donc toujours perdu, même en relisant les premières réponses.
Si je passe par le plugin Script pour interpréter les trames des onduleurs (ce qui est aussi abstrait pour le moment, avec mes connaissances actuelles), il faudra bien pour cela une liaison physique entre l’onduleur et Jeedom par laquelle ces trames circuleront.
C’est ce que je cherche aujourd’hui.
Merci pour vos suggestions ;-).

Avant de vouloir faire la liaison, il faut connaître le protocole.
J’ai du rs232 chez moi pour deux appareils. L’un fonctionne en modbus rtu et le second en serial, c’est complètement différent et m’a demandé deux adapteurs rs232 différents.
Plutôt que rester vague, si vous ne comprenez pas ce qu’il faut faire, donnez les informations que vous avez:

  1. marque et modèle des appareils
  2. lien ou copie de la documentation qui décrit ce protocole
  3. etc

Antoine

Pour la liaison, vous l’avez déjà dit un cable rs232-usb, mais comme dit tonio il y en existe de plusieurs type, câblé différemment.
Ma vmc est aussi relié avec une interface rs232, j’ai fait un plugin qui implémente le protocole pour intégrer à jeedom mais ca ne vous sera d’aucune utilité: ce n’est pas le même protocole.

Sinon aucun plugin n’existe à ma connaissance qui vous permettra de faire du plugnplay.

Soit vous trouvez un tool sur le net qui a déjà implémenté le protocole, soit vous le codé vous même.

Pour l’intégration avec jeedom, on peut imaginer plein de choses. Par exemple un pi branché en usb avec votre matos qui décode ce qui arrive et publie via mqtt. Avec ça jeedom pourra aller chercher les données.
Ou tout ce qui a été dit plus haut (c’est pour ca que je vous renvoyais la dessus)

Mais on revient au même point: vous devez trouver plus de détails sur les messages qui arriveront, sur le protocole.

Bonjour à tous,
Je reviens ici pour vous annoncer que j’ai réussi (enfin) à faire remonter les infos des onduleurs dans Jeedom.
C’est la présentation de @divervince qui m’a servi de référence car il avait le même matériel (mêmes onduleurs, Jeedom et IPX800).
Ce n’est pas l’unique solution possible, mais c’est celle qui m’a paru la plus simple à mettre en œuvre pour une communication filaire avec peu de matériel (pas de Rpi devenu cher ou de nécessité de faire tourner un NAS pour y créer une Virtual Machine, faible consommation électrique…),
La partie hardware se compose donc de :
1 carte Mega 2560 Arduino,
1 carte W5100 ethernet,
2 adaptateurs RS232-TTL,
2 câbles série (fournis avec les onduleurs),
Le logiciel Arduino IDE pour téléverser le code sur la carte,
Le code utilisé pour interpréter les données sortant des onduleurs (légèrement modifié par rapport à celui de @divervince) :

#include <SPI.h> // Libairie communication SPI avec le Shield éthernet
#include <Ethernet.h> // Librairie communication Ethernet sur un réseau local
String QPIGS = "\x51\x50\x49\x47\x53\xB7\xA9\x0D"; //Lecture live des data
/*
String QPIWS = "\x51\x50\x49\x57\x53\xB4\xDA\x0D"; 
String QDI = "\x51\x44\x49\x71\x1B\x0D";
String QMOD = "\x51\x4D\x4F\x44\x49\xC1\x0D";
String QVFW =  "\x51\x56\x46\x57\x62\x99\x0D";
String QVFW2 = "\x51\x56\x46\x57\x32\xC3\xF5\x0D";
String POP02 = "\x50\x4F\x50\x30\x32\xE2\x0B\x0D";  //SBU priority
String POP01 = "\x50\x4F\x50\x30\x32\xE2\xD2\x69";  //solar first
String POP00 = "\x50\x4F\x50\x30\x30\xC2\x48\x0D";  //utility first
*/
//définitions des variables, possible de mettre ce qu'on veut en texte, ici PIP1 (pour onduleur 1) puis le nom anglais de la variable, mais A1,A2 fonctionneraient tout aussi bien, ce qui compte c'est de savoir ce que ca veut dire pour vous.
float PIP1_Grid_Voltage=0;
float PIP1_Grid_frequence=0;
float PIP1_output_Voltage=0;
float PIP1_output_frequence=0;
int PIP1_output_apparent_power=0;
int PIP1_output_active_power=0;
int PIP1_output_load_percent=0;
int PIP1_BUS_voltage=0;
float PIP1_Battery_voltage=0;
float PIP1_battery_charge_current=0;
float PIP1_battery_capacity=0;
float PIP1_Inverter_heat_sink_temperature =0;
float PIP1_PV_current=0;
float PIP1_PV_voltage=0;
float PIP1_Battery_voltage_from_SCC =0;
float PIP1_battery_discharge_current=0;
int PIP1_status;
float PIP2_Grid_Voltage=0;
float PIP2_Grid_frequence=0;
float PIP2_output_Voltage=0;
float PIP2_output_frequence=0;
int PIP2_output_apparent_power=0;
int PIP2_output_active_power=0;
int PIP2_output_load_percent=0;
int PIP2_BUS_voltage=0;
float PIP2_Battery_voltage=0;
float PIP2_battery_charge_current=0;
float PIP2_battery_capacity=0;
float PIP2_Inverter_heat_sink_temperature =0;
float PIP2_PV_current=0;
float PIP2_PV_voltage=0;
float PIP2_Battery_voltage_from_SCC =0;
float PIP2_battery_discharge_current=0;
int PIP2_status;
byte MAC[] = { 0xDE, 0xAD, 0xAF, 0xBA, 0xEE, 0xDF }; // Adresse MAC du shield Ethernet
IPAddress IP(192,168,X,XX); // Adresse IP donné au Shield Ethernet compatible avec votre réseau
EthernetServer server(80); // Le Shield devient un serveur sur le port 80 (port HTTP)

void setup()
  {
  Ethernet.begin(MAC, IP); //Lancement connexion Ethernet avec l'adresse MAC et l'adresse IP 
  Serial1.begin(2400); // pour branchement de l'onduleur 1 sur les broches 19 et 18
  Serial2.begin(2400);  // pour branchement de l'onduleur 2 sur les broches 17 et 16
  Serial.print("server is at "); // pour connexion en USB uniquement pour vérifier le fonctionnement.
  Serial.println(Ethernet.localIP());
  server.begin();
  }

void loop()
  {
//verificaition si un client est connecté (si vous avez appelé la page internet ou si votre jeedom lance la requête)
  EthernetClient client = server.available();
  if (client) 
    {
    Serial.println("new client");
    boolean currentLineIsBlank = true;
    while (client.connected()) {
      if (client.available()) {
        char c = client.read();
        Serial.write(c);
       if (c == '\n' && currentLineIsBlank) {
     
//interrogation des onduleurs en cas de connexion:
Serial1.print(QPIGS);   //interrogation onduleur 1
Serial1.flush(); // attente que l'envoi soit terminé
     if (Serial1.find("(")) { // si réception d'un message, mise dans les valeurs en fonction des varialbles définies en 1er partie
        Serial.println("DATA-1er onduleur-------");
        PIP1_Grid_Voltage=Serial1.parseFloat();
        PIP1_Grid_frequence=Serial1.parseFloat();
        PIP1_output_Voltage=Serial1.parseFloat();
        PIP1_output_frequence=Serial1.parseFloat();
        PIP1_output_apparent_power=Serial1.parseInt();
        PIP1_output_active_power=Serial1.parseInt();
        PIP1_output_load_percent=Serial1.parseInt();
        PIP1_BUS_voltage=Serial1.parseFloat();
        PIP1_Battery_voltage=Serial1.parseFloat();
        PIP1_battery_charge_current=Serial1.parseFloat();
        PIP1_battery_capacity=Serial1.parseInt();
        PIP1_Inverter_heat_sink_temperature =Serial1.parseInt();
        PIP1_PV_current=Serial1.parseFloat();
        PIP1_PV_voltage=Serial1.parseFloat();
        PIP1_Battery_voltage_from_SCC =Serial1.parseFloat();
        PIP1_battery_discharge_current=Serial1.parseFloat();
        PIP1_status=Serial1.parseInt();
     }
     
Serial2.print(QPIGS);   //interrogation onduleur 2
Serial2.flush();
     if (Serial2.find("(")) {
        Serial.println("DATA-2eme onduleur-------");
        PIP2_Grid_Voltage=Serial2.parseFloat();
        PIP2_Grid_frequence=Serial2.parseFloat();
        PIP2_output_Voltage=Serial2.parseFloat();
        PIP2_output_frequence=Serial2.parseFloat();
        PIP2_output_apparent_power=Serial2.parseInt();
        PIP2_output_active_power=Serial2.parseInt();
        PIP2_output_load_percent=Serial2.parseInt();
        PIP2_BUS_voltage=Serial2.parseFloat();
        PIP2_Battery_voltage=Serial2.parseFloat();
        PIP2_battery_charge_current=Serial2.parseFloat();
        PIP2_battery_capacity=Serial2.parseInt();
        PIP2_Inverter_heat_sink_temperature =Serial2.parseInt();
        PIP2_PV_current=Serial2.parseFloat();
        PIP2_PV_voltage=Serial2.parseFloat();
        PIP2_Battery_voltage_from_SCC =Serial2.parseFloat();
        PIP2_battery_discharge_current=Serial2.parseFloat();
        PIP2_status=Serial2.parseInt();
     }


          // pour affichage dans la page HTML:
          client.println("HTTP/1.1 200 OK");
          client.println("Content-Type: text/html");
          client.println("Connection: close");  // permet de fermer la connexion quand la transmission est terminée
          client.println("Refresh: 40");  // rafraichissement de la page toutes les 40s
          client.println();
          client.println("<!DOCTYPE HTML>");
          client.println("<html>");
    // ecriture des valeurs
          client.print("<div class='A1'>");client.print(PIP1_Grid_Voltage);client.println("</div>");
          client.print("<div class='B1'>");client.print(PIP1_Grid_frequence);client.println("</div>");
          client.print("<div class='C1'>");client.print(PIP1_output_Voltage);client.println("</div>");
          client.print("<div class='D1'>");client.print(PIP1_output_apparent_power);client.println("</div>");
          client.print("<div class='E1'>");client.print(PIP1_output_active_power);client.println("</div>");
          client.print("<div class='F1'>");client.print(PIP1_output_load_percent);client.println("</div>");
          client.print("<div class='G1'>");client.print(PIP1_battery_capacity);client.println("</div>");
          client.print("<div class='H1'>");client.print(PIP1_BUS_voltage);client.println("</div>");
          client.print("<div class='I1'>");client.print(PIP1_Battery_voltage);client.println("</div>");
          client.print("<div class='J1'>");client.print(PIP1_battery_charge_current);client.println("</div>");
          client.print("<div class='L1'>");client.print(PIP1_Inverter_heat_sink_temperature);client.println("</div>");
          client.print("<div class='M1'>");client.print(PIP1_PV_current);client.println("</div>");
          client.print("<div class='N1'>");client.print(PIP1_PV_voltage);client.println("</div>");
          client.print("<div class='O1'>");client.print(PIP1_Battery_voltage_from_SCC);client.println("</div>");
          client.print("<div class='P1'>");client.print(PIP1_battery_discharge_current);client.println("</div>");
          client.print("<div class='Q1'>");client.print(PIP1_status);client.println("</div>");
                   
          client.print("<div class='A2'>");client.print(PIP2_Grid_Voltage);client.println("</div>");
          client.print("<div class='B2'>");client.print(PIP2_Grid_frequence);client.println("</div>");
          client.print("<div class='C2'>");client.print(PIP2_output_Voltage);client.println("</div>");
          client.print("<div class='D2'>");client.print(PIP2_output_apparent_power);client.println("</div>");
          client.print("<div class='E2'>");client.print(PIP2_output_active_power);client.println("</div>");
          client.print("<div class='F2'>");client.print(PIP2_output_load_percent);client.println("</div>");
          client.print("<div class='G2'>");client.print(PIP2_battery_capacity);client.println("</div>");
          client.print("<div class='H2'>");client.print(PIP2_BUS_voltage);client.println("</div>");
          client.print("<div class='I2'>");client.print(PIP2_Battery_voltage);client.println("</div>");
          client.print("<div class='J2'>");client.print(PIP2_battery_charge_current);client.println("</div>");
          client.print("<div class='L2'>");client.print(PIP2_Inverter_heat_sink_temperature);client.println("</div>");
          client.print("<div class='M2'>");client.print(PIP2_PV_current);client.println("</div>");
          client.print("<div class='N2'>");client.print(PIP2_PV_voltage);client.println("</div>");
          client.print("<div class='O2'>");client.print(PIP2_Battery_voltage_from_SCC);client.println("</div>");
          client.print("<div class='P2'>");client.print(PIP2_battery_discharge_current);client.println("</div>");
          client.print("<div class='Q2'>");client.print(PIP2_status);client.println("</div>");

          
          client.println("</html>");
          break;
        }
        if (c == '\n') {
                   currentLineIsBlank = true;
        } else if (c != '\r') {
                    currentLineIsBlank = false;
        }
      }
    }
      delay(1);
       client.stop();
    Serial.println("client disconnected");
  }
  }

En espérant que cela pourra servir à d’autres.
Encore merci pour votre aide.
Bonne journée.
Dom.