Forum Programmation.c Envoi données vers API Domoticz en C

Posté par  . Licence CC By‑SA.
Étiquettes : aucune
1
26
avr.
2019

Bonjour,

Je dispose d'un onduleur solaire SMV II 3K et je souhaites récupérer les informations utiles via le port USB vers Domoticz. J'ai réussi à trouver un projet sur le GitHub qui pourrai surement aider à cette tache mais je n'y connais pas grand chose en C.

Le projet s'appelle : skymax-demo disponible ici https://github.com/manio/skymax-demo

Après avoir suivi les instructions de compilation, j'ai bien les informations de mon onduleur :

Titre de l'image

Je souhaite donc modifier le programme afin qu'il envoi les informations des variables vers domoticz avec une URL par exemple pour la tension de la batterie ce serait quelque chose comme :

http://192.168.10.12:8080/json.htm?type=command&param=udevice&idx=2284&nvalue=0&svalue=29
L'URL fonctionne tel quel mais il faut l'intégrer dans le code et remplacer 29 par la variable voltage_batt

Voici le bout de code en question :

    if (ups_data_changed)
    {
      ups_data_changed = false;

      string *reply = ups->GetStatus();
      if (reply)
      {
        //parse and display values
        sscanf(reply->c_str(), "%f %f %f %f %d %d %d %d %f %d %d %d %d %f %f %d", &voltage_grid, &freq_grid, &voltage_out, &freq_out, &load_va, &load_watt, &load_percent, &voltage_bus, &voltage_batt, &batt_charge_current, &batt_capacity, &temp_heatsink, &pv1, &pv2, &scc, &batt_discharge_current);
        printf("\tAC Grid voltage: %.1f\n", voltage_grid);
        printf("\tAC Grid frequency: %.1f\n", freq_grid);
        printf("\tAC out voltage: %.1f\n", voltage_out);
        printf("\tAC out frequency: %.1f\n", freq_out);
        printf("\tLoad [%]: %d\n", load_percent);
        printf("\tLoad [W]: %d\n", load_watt);
        printf("\tLoad [VA]: %d\n", load_va);
        printf("\tBus voltage: %d\n", voltage_bus);
        printf("\tHeatsink temperature: %d\n", temp_heatsink);
        printf("\tBattery capacity [%]: %d\n", batt_capacity);
        printf("\tBattery voltage: %.2f\n", voltage_batt);
        printf("\tBattery charge current [A]: %d\n", batt_charge_current);
        printf("\tBattery discharge current [A]: %d\n", batt_discharge_current);

        delete reply;
      }
    }

Merci

  • # Et sans connaitre le C

    Posté par  (site web personnel) . Évalué à 1.

    A défaut de C, si ton programme retourne le résultat sur stdin, tu peux pas genre faire un grep ou sed et appeler un curl (ou wget) ?

    Un petit peu comme ça ?

    curl -Lks http://192.168.10.12:8080/json.htm?type=command&param=udevice&idx=2284&nvalue=0&svalue=$( nom_du_binaire | sed -e '/battery[[:space:]]*voltage/I !d;s/^[^:]*://g' )
    • [^] # Re: Et sans connaitre le C

      Posté par  . Évalué à 1. Dernière modification le 05 mai 2019 à 10:16.

      Bonjour,

      Merci pour votre réponse,

      Voici comment j'ai procédé :

      Dans le code C, j'écris les données dans un fichier stocké dans la RAM :

          {
              FILE* fichier = NULL;
      
              fichier = fopen("/mnt/mytmpfs/ups.txt", "w");
      
              if (fichier != NULL)
              {
                  fprintf(fichier, "%.1f\n", voltage_grid);
              fprintf(fichier, "%.1f\n", freq_grid);
              fprintf(fichier, "%.1f\n", voltage_out);
              fprintf(fichier, "%.1f\n", freq_out);
              fprintf(fichier, "%d\n", load_percent);
              fprintf(fichier, "%d\n", load_watt);
              fprintf(fichier, "%d\n", load_va);
              fprintf(fichier, "%d\n", temp_heatsink);
              fprintf(fichier, "%d\n", batt_capacity);
              fprintf(fichier, "%.2f\n", voltage_batt);
              fprintf(fichier, "%d\n", batt_charge_current);
              fprintf(fichier, "%d\n", batt_discharge_current);
              fprintf(fichier, "%d\n", pv1);
              fprintf(fichier, "%f\n", pv2);
              fprintf(fichier, "%f\n", scc);
              fprintf(fichier, "%d\n", voltage_bus);
      
                  fclose(fichier);
              }
          }

      Ensuite via un script j'ouvre le fichier, je récupère les informations utiles dans des variables et j'envoi l'URL avec la variable :

          #!/bin/sh
      
          tension_reseau_entrant=$(sed q /mnt/mytmpfs/ups.txt)
          freq_reseau_entrant=$(sed -n 2p /mnt/mytmpfs/ups.txt)
          tension_sortie=$(sed -n 3p /mnt/mytmpfs/ups.txt)
          freq_sortie=$(sed -n 4p /mnt/mytmpfs/ups.txt)
          usage_pc=$(sed -n 5p /mnt/mytmpfs/ups.txt)
          usage_w=$(sed -n 6p /mnt/mytmpfs/ups.txt)
          usage_va=$(sed -n 7p /mnt/mytmpfs/ups.txt)
          temp_int=$(sed -n 8p /mnt/mytmpfs/ups.txt)
          cap_bat=$(sed -n 9p /mnt/mytmpfs/ups.txt)
          tension_bat=$(sed -n 10p /mnt/mytmpfs/ups.txt)
          charge_bat=$(sed -n 11p /mnt/mytmpfs/ups.txt)
          decharge_bat=$(sed -n 12p /mnt/mytmpfs/ups.txt)
          tension_bus=$(sed -n 16p /mnt/mytmpfs/ups.txt)
      
          /usr/bin/curl --silent "http://192.168.10.12:8080/json.htm?type=command&param=udevice&idx=2287&nvalue=0&svalue=$tension_reseau_entrant" > /dev/null
          /usr/bin/curl --silent "http://192.168.10.12:8080/json.htm?type=command&param=udevice&idx=2294&nvalue=0&svalue=$freq_reseau_entrant" > /dev/null
          /usr/bin/curl --silent "http://192.168.10.12:8080/json.htm?type=command&param=udevice&idx=2288&nvalue=0&svalue=$tension_sortie" > /dev/null
          /usr/bin/curl --silent "http://192.168.10.12:8080/json.htm?type=command&param=udevice&idx=2293&nvalue=0&svalue=$freq_sortie" > /dev/null
          /usr/bin/curl --silent "http://192.168.10.12:8080/json.htm?type=command&param=udevice&idx=2295&nvalue=0&svalue=$usage_pc"  > /dev/null
          /usr/bin/curl --silent "http://192.168.10.12:8080/json.htm?type=command&param=udevice&idx=2289&svalue=$usage_w"  > /dev/null
          /usr/bin/curl --silent "http://192.168.10.12:8080/json.htm?type=command&param=udevice&idx=2286&nvalue=0&svalue=$temp_int"  > /dev/null
          /usr/bin/curl --silent "http://192.168.10.12:8080/json.htm?type=command&param=udevice&idx=2290&nvalue=0&svalue=$cap_bat"  > /dev/null
          /usr/bin/curl --silent "http://192.168.10.12:8080/json.htm?type=command&param=udevice&idx=2284&nvalue=0&svalue=$tension_bat" > /dev/null
          /usr/bin/curl --silent "http://192.168.10.12:8080/json.htm?type=command&param=udevice&idx=2291&nvalue=0&svalue=$charge_bat" > /dev/null
          /usr/bin/curl --silent "http://192.168.10.12:8080/json.htm?type=command&param=udevice&idx=2292&nvalue=0&svalue=$decharge_bat" > /dev/null
          /usr/bin/curl --silent "http://192.168.10.12:8080/json.htm?type=command&param=udevice&idx=2296&nvalue=0&svalue=$tension_bus" > /dev/null

      ça marche

      • [^] # Re: Et sans connaitre le C

        Posté par  . Évalué à 2.

        si tu veux remplacer ton script qui fait des curls directement par du code C

        regarde simplement la libcurl
        qui permet de faire du curl depuis les programmes en C :p

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.