Page 1 sur 1

Envoi données vers API en C

Publié : 26 avr. 2019, 09:53
par kekemar
Bonjour,

Je dispose d'un onduleur solaire SMV II 3K et je souhaitais 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 :

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 :

Code : Tout sélectionner

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 :

Code : Tout sélectionner

    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 beaucoup pour votre aide

Re: Envoi données vers API en C

Publié : 02 mai 2019, 14:43
par Amenophiks
Salut,

Au niveau du langage C, tu peux te baser sur le code en lien pour effectuer une requête POST:
https://curl.haxx.se/libcurl/c/http-post.html

Si tu n'es pas à l'aise avec le C, tu peux essayer avec un script shell.
Tu lances ta commande, tu récupères les données que tu parses pour obtenir ce que tu souhaite, et enfin tu fait un appel http en utilisant curl.

Ce n'est qu'un exemple.

Re: Envoi données vers API en C

Publié : 04 mai 2019, 13:03
par kekemar
Bonjour,

Merci pour votre réponse,

Effectivement je ne suis pas du tout à l'aise avec le C

Pour la seconde solution proposée, j'y avais pensé mais le problème c'est que lorsque je redirige la sortie vers un fichier ou une variable, c'est vide.

Re: Envoi données vers API en C

Publié : 05 mai 2019, 08:58
par kekemar
J'ai trouvé une solution,

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

Code : Tout sélectionner

{
    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 :

Code : Tout sélectionner

#!/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