AP System API down?

Oui,
-rwxrwxr-x 1 www-data www-data 11631 avril 28 20:22 APSystemsECUR.py
-rwxrwxr-x 1 www-data www-data 2042 févr. 1 2017 calcul.php
-rwxrwxr-x 1 www-data www-data 3573 janv. 30 2017 IDeviceLocmodified.php
-rwxrwxr-x 1 www-data www-data 4216 févr. 1 2017 iDeviceLoc.php
-rwxrwxr-x 1 www-data www-data 4221 janv. 30 2017 Idevice.php
-rwxrwxr-x 1 www-data www-data 1489 févr. 1 2017 ping.sh
drwxrwxr-x 2 www-data www-data 4096 avril 28 20:22 pycache
-rwxrwx— 1 www-data www-data 472 avril 28 20:23 test.py

root@Jeedom228:/var/www/html/plugins/script/data# type -a python
python is /usr/bin/python
python is /bin/python

J’en perds mon latin:


Je viens de creer le fichier APSystemsECUR.py en faisant un copier/coller de ton code.
:dizzy_face:

Peut-être que tu peux effacer le fichier APSystemsECUR.py.
En creer un nouveau avec un copier/coller de ton code plus haut :slight_smile:

On va effectivement passer au latin, car en effaçant le fichier et en le recréant avec le même code et bien ça marche :ok_hand:

en ssh c’est bon, j’ai le données par contre quand je lance le script dans le plugin script jeedom je suis sur qu’il me le lance en python et pas en python3 car j’ai la même erreur que si je le lance en python en ssh.
@olive je crois que tu avais constaté le pb ?

Python3 dans un plugin-script

Oulà que de messages … alors j’suis pas un pro de linux/python.

La seule chose que je peux dire c’est que mon système est sur un Debian 10, ça aide peut être …

Renais35000, du coup ça fonctionne c’est ça si tu changes le contenu du fichier ?

Si ça ne fonctionne pas sous jeedom c’est peut être juste un problème de droit sur le répertoire dans lequel se trouve ton code python ?

Perso voici les droits de mon dossier image pour un user autre que jeedom ou root sur cette machine.

Si le script est bien un executable au niveau des droits
et si c’est du python3 il ne faut pas mettre une extention py en minuscule si non il est executé en python2

@rennais35000 Comme l’a dit Olive, oui il faut bien que ton fichier test.py soit nommé test.PY.
Sinon c’est du python2 qui est executé.

Ouf on y voit peut etre le bout du tunnel!

Petite astuce si le fichier viens d’ailleurs pour re-mettre les droits
dans script éditer le fichier avec le crayon puis sauvegarder.

C’est ce que j’ai fais hier soir. Le fichier test ou Mesures était déjà avec PY depuis le début car j’avais bien vu ton avertissement @ovomaltin mais malgré ça j’ai eu les pb que vous avez suivi.
Hier soir suite à ton idée j’ai tout supprimé et téléchargé à nouveau dans le rep data avec jeexplorer, ça a fonctionné en ssh mais j’avais toujours l’erreur quand je sauvegardais dans le plugin script. Comme c’était la même erreur que si je lançais en python (2) en ssh j’ai cherché sur le forum et j’ai trouvé que @olive était déjà tombé sur ce pb, j’ai donc testé la solution en shell que t’avais soufflé jpty j’ai pu sauvegarder sans erreur, ensuite j’ai aussi lu dans un autre post que tu avais signalé cette astuce d’éditer dans script et de sauvegarder pour que les bons droits soient applqués. J’ai dons fait ça et c’est OKKKK.
j’ai surement eu un enchainement de « parasites ». Ce qui m’étonne c’est que les premiers fichiers, je les vais copié et collé dans l’éditeur de script pour justement qu’ils aient les bons droits et qu’ils se placent dans le bon répertoire, ça n’avait sans pas suffit à cause du copié collé qui doit ajouter des caractère cachés qui foutent le bazar. Je m’en rappellerais à l’avenir.
Une question au passage, on lance test.PY dans le plugin script pour qu’il soit exécuté en python 3. Si j’ai bien compris, lui il lance APSystemsECUR.py qu’on laisse en py et qui est donc exécuté en python 2 ? C’est d’une logique …
Bon maintenant je vais essayer de faire marcher ça dans jeedom.
Je vais faire ta solution ovomaltin et je ferais aussi celle de @Bandenabos s’il m’explique un peu plus ce qu’il fait de son json, il faut que je le questionne la-dessus.
Au passage je suis intéressé par tes stats, si tu peux envoyer éventuellement un template de ton scénario.
Merci pour vos interventions et votre aide.

non c’est une librarie c’est ton test.PY qui l’utilise et lui est en python3 !

il faut juste que ta librairie soit dans la même version de python

Ok je comprends, merci olive.
Pour que je sache faire la différence, on repère comment que c’est une librairie quand on édite un fichier python ?

Capture d’écran 2021-04-29 à 11.26.24

1 « J'aime »

ça fonctionne alors :+1:

il y a peut de différence la librarie est souvent appeler par un import depuis un autre fichier
elle comporte habituellement des functions …

Allé hop, la partie remontée des infos sur les inverters / panneaux, c’est fait :

le python n’a pas changé (ouf).

Par contre la partie script dans sa globalité (avec les bonnes balises pour le code si j’ai bien compris). J’ai ajouté en tête les différentes variables nécessaires :

//https://github.com/ksheumaker/homeassistant-apsystems_ecur

// Variables à paramétrer : 
// Fichier json à parser
$srcFile="/mnt/Syno/Jeedom/production/current.json";
// fichier python à exécuter
$pythonFile="/home/dromobile/apsystems_ecur/getData.py";
//Nom du composant coté jdom. Ce composant doit porter des infos nommées Power, LastMaj, Jour, Total
$APSystemJeedomName="[APS][APSystem]";
/*Préfix du nom des composants inverter. Autant de composant que d'inverter doivent être créés sous Jeedom.
Chacun d'eux doit contenir les informations : 
	 "uid"
  	 "online"
	 "unknown"
	 "frequency"
	 "temperature"
	 "signal"
	 "model"
	 "channel_qty"
	 "powerX" avec X allant de 0 au nombre de panneaux sur l'inverter - 1 
	 "voltageX" avec X allant de 0 au nombre de panneaux sur l'inverter - 1
*/
$APSystemJeedomEcuPrefixName="[APS][APSystemEcu";




// création du fichier de données
shell_exec ("rm $srcFile");
shell_exec ("python3 " . $pythonFile);

//Récupération des données du json créé
$json = file_get_contents($srcFile);
$arr = json_decode($json, true);

//$error=json_last_error();
//$scenario->setLog("Error ". $error);

// récupération des colonnes à traiter (time et power)
$time  = $arr["timestamp"];
$power = $arr["current_power"];
$today = $arr["today_energy"];
$lifetime = $arr["lifetime_energy"];

cmd::byString("#" . $APSystemJeedomName . "[Power]#")->event($power);
cmd::byString("#" . $APSystemJeedomName . "[LastMaj]#")->event($time);
cmd::byString("#" . $APSystemJeedomName . "[Jour]#")->event($today);
cmd::byString("#" . $APSystemJeedomName . "[Total]#")->event($lifetime);

// récupération du dernier élément
$inverters = $arr["inverters"];
$i=0;

// Pour chaque inverter
foreach ($inverters as $currinverter) { 
   
  // Pour toutes les données de l'inverter courant
  foreach ($currinverter as $key => $val) {
    // Cas de power et voltage qui sont des tableaux
    if ($key == "power" || $key == "voltage") {
      $j = 0;
      foreach ($val as $powervoltage) {
        //Traitement des tableaux de puissance / voltage pour chaque panneau, on affecte les valeurs à power0, power1 ... ou voltage0, voltage1 ...
        cmd::byString("#" . $APSystemJeedomEcuPrefixName . $i ."][" . $key . $j . "]#")->event($val[$j]);
        $j = $j + 1;
      }
    } else {
      cmd::byString("#" . $APSystemJeedomEcuPrefixName . $i ."][" . $key . "]#")->event($val);
    }
  }
   $i = $i + 1;
}

Reste maintenant à faire un joli désign et des remontées d’alerte si un ano est constatée …

1 « J'aime »

Content de savoir que ca marche!
Le scenario fait un refresh de l’equipement de script toutes les 5 minutes et execute le code suivant

$cmdMesure = cmd::byString("#[Equipements IT][APSystemDirect][jsonMesures]#");
$mesuresFormatted = str_replace("'", "\"", $cmdMesure->execCmd());
$mesuresFormatted = str_replace("True", "\"True\"", $mesuresFormatted);
$mesuresFormatted = str_replace("False", "\"False\"", $mesuresFormatted);
$mesures = json_decode($mesuresFormatted);
$scenario->setLog($mesures->{'timestamp'});

$cmdPower = cmd::byString('#[Equipements IT][APSystemDirect Valeurs][power]#');
$cmdEnergy = cmd::byString('#[Equipements IT][APSystemDirect Valeurs][energy]#');

// constant
$d1=new DateTime("2012-07-08 10:00:00.000000");
$d2=new DateTime("2012-07-08 11:00:00.000000");
$diffOneHour = $d2->getTimestamp() - $d1->getTimestamp(); 

if ($scenario->getData(latestAPUpdateDateTime) <> $mesures->{'timestamp'}) {
    if ($cmdPower->execCmd() > 0) {
      // Calculate energy produced since last measure
      $time0 = DateTime::createFromFormat("Y-m-d H:i:s", $scenario->getData(latestAPUpdateDateTime));
      $time1 = DateTime::createFromFormat("Y-m-d H:i:s", $mesures->{'timestamp'});
      $timeDiff = $time1->getTimestamp() - $time0->getTimestamp();
      $productionInWh = round($cmdPower->execCmd() * ($timeDiff / $diffOneHour), 3);
      $scenario->setLog('Prod in Wh' . $productionInWh);
      $cmdEnergy->event($productionInWh);
    }
	$scenario->setData(latestAPUpdateDateTime, $mesures->{'timestamp'});
  	$cmdPower->event($mesures->{'current_power'});
	$scenario->setLog($mesures->{'today_energy'});
	$scenario->setLog($mesures->{'current_power'});
} else { 
  $scenario->setLog('deja a jour');
}

Apres j’ai un virtuel qui historise les prods (puissance et instantEnergy) et qui fait les stats suivantes:


en utilisant les fonctions de statistique de jeedom directement.

OvO

2 « J'aime »

Faut que je mette ce qu’il faut niveau stats et controles (panneau qui donnne bien, onduleurs bien présents …). Je vais regarder ton implem …

Pour les « composants » utilisés dans jeedom j’ai un Virtuel utilisé pour le commun (prod totale …) et un virtuel par onduleur.

Et bien sur des déclencheurs pour chauffe eau / zoé / pompe piscine …

Je vais pouvoir optimier la consommation de ma production !

Surtout laisser un minimum à Mr EDF !

@Bandenabos J’ai que 4 panneaux (1,2kW en crete) donc la prod est bouffée par la piscine quasi en integralité :wink:

OvO