Contrôle par RS232

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.

1 « J'aime »