Emporia Energy rencontre Jeedom... le tuto

Bonjour à tous.
Je vous l’avez promis dans ce premier sujet, comme en plus j’ai reçu de l’aide (infini merci à @stan77), rien de plus normal que de restituer ce que j’ai pu apprendre et finalement réussi à faire fonctionner.

Donc, avant tout je vous présente Emporia Energy Vue Gen 2

Je n’ai aucune action chez eux, évidemment. Mais juste, cet objet connecté me permet d’analyser plusieurs circuits pour :

  • Identifier mes circuits gourmands
  • Monitorer ma consommation d’énergie.
  • Améliorer ma consommation d’énergie.

À noter, même si je ne l’utilise pas pour ma part, que l’outil permet aussi de :

  • Gérer le triphasé
  • Gérer le photovoltaïque.

L’outil vient de UK et pour ma part, je l’ai acheté sur Amazon dans sa version 8 pinces.
Le principe est qu’il est livré avec 3 pinces « master » pour les phases d’arrivée (je n’en utilise donc qu’un)
Et 8 pinces pour les circuits que l’on veut monitorer.
Le boitier Emporia est évidemment à l’extérieur du boitier électrique (et il est livré avec une antenne SMA si le compteur est éloigné de la box). Idéalement les pinces de phases doivent être positionnées avant le disjoncteur général. Et les pinces dédiés aux circuits dans le coffret.
On ne va pas se mentir, faire rentrer tout cela dans le coffret électrique n’est pas d’une simplicité biblique. Mais on pousse avec du pain… et on finit pas y arriver.

L’outil permet d’afficher via un app mobile et web les consommations, les ratios etc…


Ainsi qu’une donnée nommée « Balance » qui correspond à l’écart entre le général et la somme de tous les circuits monitorés. Histoire de vérifier :wink:

Et maintenant, le lien avec Jeedom !
Je fournis ici les explications, mais on peut faire fonctionner tout cela sans pour autant tout comprendre et maitriser. Donc, allez jusqu’au bout !

Officiellement, Emporia Energie ne livre pas d’API. Officiellement. Car en réalité elle existe et elle même documenté, notamment grâce au boulot de fou de magico13 : GitHub - magico13/PyEmVue: Python Library for the Emporia Vue Energy Monitor.
Un bon script python, que nous allons utiliser en le détournant.
A noter j’étais très jaloux, car il a développé la brique Home Assistant.
Du coup dans un premier temps, pour éviter de coder, j’ai tenté l’énorme contournement : j’ai monté un HA, qui via un Node-Red, envoyait tout cela en MQTT. Oubliez… j’y ai laissé quelques neurones.

Donc je suis parti sur l’idée d’utiliser le plugin script et j’ai appelé la communauté à l’aide. (ici). Et grâce à @stan77, nous (surtout lui) sommes arrivés au bout du script.

Donc dans l’ordre :

Etape 1: installer le plugin « script »

Etape 2: installer les dépendances
ou l’équivalent ;-), le jour où le plugin tout fait existera :wink:
un simple accès SSH et comme le script de magico13 est disponible sur PyPI, un simple bash de ce type permet de tout faire :

python3 -m pip install "pyemvue"

L’install des dépendances se fait automatiquement (sur un RPI). Sinon c’est le même process à faire sur d’autres environnement.

Etape 3: installer le plugin JeeXplorer
Il va vous permettre d’installer le script au bon endroit.
Dans /plugins/scripts/datas, créer un dossier PyEmVue


Puis créer un nouveau fichier, pour y copier le code suivant.
Attention ! pensez à l’enregistrer en mettant l’extension PY en majuscule sinon, par défaut, jeedom va l’exécuter en python 2 :

#!/usr/bin/python3.7
# Script recupere infos de PyEmVue

# import librairies
import sys, os

# Variables de connexion
user = "votre-adresse-mail"
passuser = "votre_mdp"
duree = "1MIN"
token = 'keys.json'
resultat = "PyEmVue.log"

# recupere la date et l'heure actuelle
from datetime import datetime
now = datetime.now()
ma_date = now.strftime("%d/%m/%Y %H:%M:%S")

from pyemvue import PyEmVue

def print_recursive(usage_dict, info, depth=0):
    for gid, device in usage_dict.items():
        for channelnum, channel in device.channels.items():
            name = channel.name
            if name == 'Main':
                name = info[gid].device_name
            print('-'*depth, f'{gid} {channelnum} {name} {channel.usage} kwh')
            fichier.write(f'{gid} {channelnum} {name} {channel.usage} kwh\n')

            if channel.nested_devices:
                print_recursive(channel.nested_devices, depth+1)

vue = PyEmVue()
vue.login(username=user, password=passuser, token_storage_file=token)

devices = vue.get_devices()
device_gids = []
info = {}

# Fichier pour ecrire le resultat
PyEmVueFile = os.path.abspath(os.path.dirname(sys.argv[0])) + "/" + resultat
fichier = open(PyEmVueFile, "a")
#fichier.write("Date " + ma_date)
fichier.write("Date " + ma_date + "\n")

for device in devices:
    if not device.device_gid in device_gids:
        device_gids.append(device.device_gid)
        info[device.device_gid] = device
    else:
        info[device.device_gid].channels += device.channels

device_usage_dict = vue.get_device_list_usage(deviceGids=device_gids, instant=None, scale=duree, unit="KilowattHours")
print_recursive(device_usage_dict, info)

fichier.write("\n*** C'est fini ***")
fichier.close()

# Supprime le fichier si il n'y a pas d'infos PyEmVue
if not(device_gids):
  if os.path.exists(PyEmVueFile):
    os.remove(PyEmVueFile)

exit

Ce qu’il faut comprendre :

  1. l’api de emporia nécessite une authentification avec un token. Ce script permet de générer le fichier d’authentification. Il créé pour cela un fichier keys.json
    2- le script va d’abord aller chercher les devices (les appareils emporia, car on peut en avoir plusieurs), puis les pinces principales, puis les pinces liées, puis la balance.
    3- pour chaque pince trouvée, il va créer dans Jeedom une variable qui répond à une nomenclature pour ne pas se mélanger les pinces avec à l’id, le nom, l’unité et la consommation

    4- à chaque fois que le script s’exécute, il créer un fichier PyEmVue.log, dans lequel on va ensuite venir lire les données. Ne vous étonnez pas de ne pas le trouver, il va être effacer régulièrement pour ne pas se mélanger les pinceaux.

Vous aurez peut-être besoin de le rendre exécutable :

chmod +x PyEmVue.PY

Pour le tester vous pouvez aussi le lancer en ligne de commande :

python3 PyEmVue.PY

Etape 4: paramétrer le plugin script
Votre fichier étant installé, il vous reste à la mobiliser via le plugin :

Etape 5: paramétrer le scénario
L’objectif du scénario est de:

Voici le code du scénario :

$DEBUG=1;

if($DEBUG) { $scenario->setLog('[DEBUG] : DEBUT'); }

// Le script PyEmVue.py crée le fichier PyEmVue.log avec les infos de consommation
$file_PyEmVue='/var/www/html/plugins/script/data/PyEmVue/PyEmVue.log';

// Init les variables
$emporia=array();
$id_emporia=0;
$nb_prise=0;
$nom_eq=0;
$mesure_eq=0;
$n=0;
$i=0;

// test si le fichier speedtest existe
if(file_exists($file_PyEmVue)) {
  $scenario->setLog('  [INFO] : MAJ des infos emporia');

  // on lit le contenu des infos du fichier PyEmVue ligne par ligne
  $lines = file($file_PyEmVue);
  foreach($lines as $n => $ligne){
    // On décompose la ligne
    $valeurs = explode(" ", $ligne);

    if($DEBUG) {
      $scenario->setLog('    [DEBUG] : ['.$id_emporia.'] ['. $n.'] $ligne= ' . $ligne);
    }

    // La 1ere ligne c'est le datage
    if($n==0) {
      // on enregistre les infos de datage dans les variables Jeedom
      if($DEBUG) {
        $scenario->setLog('    [DEBUG] : PyEmVue_date = ' . $valeurs[1]);
        $scenario->setLog('    [DEBUG] : PyEmVue_heure = ' . $valeurs[2]);
      }
      $scenario->setData('PyEmVue_date', $valeurs[1]);
      $scenario->setData('PyEmVue_heure', $valeurs[2]);
    }
    else {
      // infos des l'equipements emporia
      // saute les lignes vides
      if(count($valeurs) > 2) {

        // regarde si c'est un appareil = arg[0]
        if($emporia[$id_emporia]['id_emporia'] != $valeurs[0]) {
          // Si c'est la fin du fichier on sort
          if ($valeurs[0]==='***') {
            if($DEBUG) { $scenario->setLog('    [DEBUG] : ON SORT !'); };
            break;
          }

          $id_emporia++;  // pointe l'emporia suivant
          $emporia[$id_emporia]['id_emporia']=$valeurs[0];  // id_emporia

          // id des prises ampermétrique = arg[1]
          $emporia[$id_emporia]['id_ampermetrique']=$valeurs[1];

          // nom de l'appareil = arg[2]
          $emporia[$id_emporia]['nom']=$valeurs[2];

          // conso totale de l'appareil = arg[3]
          $emporia[$id_emporia]['conso_totale']=$valeurs[3];
        }
        else {
          // c'est un équipement, on l'ajoute a l'appareil
          // Le nom pose problème si y a un espace dedans...
          if(count($valeurs)!==5) {
            // On concataine le nom
            $eq_nom='';
            for ($i=2; $i < count($valeurs)-2; $i++) {
              $eq_nom.=$valeurs[$i] . ' ';
            }
            $eq_nom=trim($eq_nom);

            // on refait l'array de l'equipement avec le nouveau nom
            array_splice($valeurs, 2, count($valeurs), array($eq_nom , $valeurs[count($valeurs)-2], $valeurs[count($valeurs)-1]));
          }

          // On enregistre les infos de l'equipement dans le tableau
          $emporia[$id_emporia][$valeurs[1]]['nom']=$valeurs[2];
          $emporia[$id_emporia][$valeurs[1]]['conso_eq']=$valeurs[3];
          $emporia[$id_emporia][$valeurs[1]]['unite']=$valeurs[4];
        }
      }
    }
  }

  // recupere les infos du tableau
  if($DEBUG) {
    $scenario->setLog('  [DEBUG]');
    $scenario->setLog('  [DEBUG] : Mise à jour des variables PyEmVue_*');
  }
  foreach($emporia as $app => $arrayAp) {
    foreach($arrayAp as $eq => $value) {
      if(is_array($value)) {
        foreach($value as $Eq => $valueEQ) {
          if($DEBUG) {
            $scenario->setLog('  [DEBUG] : PyEmVue_' . $app .'_'. $eq .'_' . $Eq . ' = '. $valueEQ);
          }
          // on enregistre les infos de l'emporia dans les variables Jeedom
          $scenario->setData('PyEmVue_'. $app .'_'. $eq .'_' . $Eq, $valueEQ );
        }
      }
      else {
        if($DEBUG) {
          $scenario->setLog('  [DEBUG] : PyEmVue_' . $app . '_' . $eq . ' = ' . $value);
        }
        // on enregistre les infos de l'equipement dans les variables Jeedom
        $scenario->setData('PyEmVue_'. $app .'_'. $eq, $value);
      }
    }
  }

  // supprime le fichier
  unlink($file_PyEmVue);
}
else {
  $scenario->setLog('  [ERREUR] : impossible de trouver le fichier : ' . $file_PyEmVue);
}

if($DEBUG) { $scenario->setLog('[DEBUG] : FIN'); };

** Etape 6: créer un virtuel par circuit monitorer.
Pensez à historiciser pour pouvoir afficher toutes les courbes que vous voulez


Et désormais vous avez toutes les données mises à jour toutes les minutes et vous avez plein de jolies courbes et autres usages pour améliorer votre consommation


Encore plein de trucs à faire, et plein d’amélioration.
Tant sur le tuto que sur l’install, mais déjà cela permet d’avoir pas mal de datas utiles.

10 « J'aime »

Hello
Je renouvelle mes remerciements déjà énoncés dans une autre discussion.
N’ayant pas encore la bête, je ne peux bien entendu encore rien tester, mais maintenant que je sais que c’est possible, je sens que je vais vite craquer.

En attendant, j’ai 3 ou 4 questions - c’est ma spécialité, hélas, j’en ai beaucoup plus que de réponses.

  • Le fichier .PY à créer dans PyEmVue doit-il avoir un nom particulier ?
  • Je n’ai pas lu le scénario en détail, je doute du reste d’en être capable, mais j’ai compris qu’il gérait tous les circuits en même temps. J’ai du mal à comprendre comment le scénario affecte les bonnes variables au bon virtuel ? Avec l’ID ? Est-ce que le virtuel a un nom imposé pour correspondre au scénario (j’ai vu que les variables, oui).?
  • Vu que le nom des variables est imposé dans le scénario, je suppose qu’il n’y a pas moyen d’avoir tout dans le même virtuel (pour limiter le nombre de tâches cron à lancer toutes les minutes…)
  • Si je comprends bien le *60 des valeurs du virtuel, le scénario récupère une conso à un instant T et applique la même aux 60 secondes de la même minute ? L’équipement ne peut pas fournir de puissance à la minute déjà lissées ? Sur des équipements qui font varier la puissance en permanence, on pourrait avoir des valeurs incorrectes, je pense…
  • Je n’ai pas compris à quoi correspond la balance…
  • Grâce à l’utilisation du plugin, je suppose qu’on peut d’affranchir du cloud ? Et bloquer l’IP de l’équipement vers Internet ?

Quoi qu’il en soit, c’est un magnifique travail, j’ai hâte de le tester, tout en me demandant, doué comme je suis, si j’arriverai à installer ça sur ma machine physique Debian 10 (où tout ne marche pas toujours comme sur le Pi et j’ai quelquefois du mal à m’en sortir).

Merci encore pour ce partage

Pour faire dans l’ordre :

1- tu peux nommer le fichier comme tu l’entends. Il faut juste vérifier que tu reprends bien le même nom dans le script. C’est pour cela que le plus simple est d’aller chercher le fichier avec l’outil prévu pour dans le plugin script. Cela évite de faire des bêtises.
2- Le nom des variables est généré en prenant compte l’identifiant de la « prise » (elles sont numérotées de 1 à 16 sur l’appareil). Et via l’appli tu peux leur donner un nom. On récupère aussi ce nom parmi les données. Moi j’ai choisi de créer un virtuel par prise, mais tu peux faire comme tu veux. Tu indiques dans ton virtuel la variable que tu vas récupérer :


et à quelle fréquence:

Pour le moment j’avoue ne pas trop me prendre la tête en terme de charge système sur les taches cron.
On verra :wink:
3- oui on multiplie par 60 car c’est bien une valeur prise en lissée mais pas en cumul d’une minute (si j’ai bien tout compris). Donc si je veux ne pas me planter dans mes cumuls, je dois bien la multiplier par 60. Je retombe bien sur les chiffres d’Enedis en cumul. Donc je me dis que ça doit être bon (stratégie du tatonnement j’avoue…)
4- La balance c’est qui te permet de visualiser tous les équipements qui n’ont pas de prise amperemétrique… et pour ma part, ça me permet de « déplacer » mes prises pour « capter » la plus grosse partie de l’énergie : si je me rends compte qu’il manque une partie importante de l’énergie (différence entre le total énergie - grosse prise amperemétrique et la somme de toutes les prises, je me dis que mes prises ne sont pas placés sur les circuits les plus significatifs)
5- alors non … justement. Déjà parce que ce n’est hélas pas un plugin (mais je pense qu’il ne manque pas grand chose). Et ensuite parce que je vais chercher les données chez Emporia et non pas sur l’appareil, qui si j’ai bien tout compris n’a pas beaucoup de mémoire. Mais il faudrait que je regarde ça.

Là j’ai fais au plus simple avec ce que je savais faire.
Mais en me tapant 1000 docs, il semblerait que l’appareil dispose d’un serveur MQTT et que c’est ça qui est envoyé vers le cloud. Il faudrait donc voir pour l’intercepter. Et à ce moment-là, on serait les rois du monde (enfin presque :wink: )

Joli en plus ça a l’air de fonctionner :crazy_face:

1 « J'aime »

Hello
Merci pour le retour

Ca, ça n’est vraiment pas une bonne nouvelle.
Je suis vraiment hostile à tous ces services clouds qu’il est devenu impossible d’éviter, pour un tas de raisons que je développerai volontiers si c’était le lieu et l’occasion (service plus restreint, dépendant d’autres services sur lesquels on n’a pas de contrôle, gratuité devenant payante, disparition du service, rachat par un major, utilisation de nos données, pour résumer).

Bref, je comprends mieux le prix plancher de cet équipement.

Je suis un peu inquiet de la place que vont prendre toutes ces pinces dans mon tableau surchargé, sans compter les fils :

  • Serait-il possible d’avoir une photo de l’installation, si ça n’est as trop compliqué ou indiscret; afin de s’en rendre compte ?
  • Comment s’alimente l’appareil lui même ?
  • Est-il obligatoire de brancher les grosses pinces sur l’arrivée du courant (j’ai déjà cette mesure de deux autres manières que je peux utiliser dans Suivi Conso, et ça ferait gagner de la place…)

Merci beaucoup

Sans cloud, ça doit être possible, mais il faut intercepter les trames et/ou avoir un appareil qui est capable de mémoriser tout cela. Donc c’est pas non plus le même équipement.
La piste MQTT me semble interessante à approfondir.

  • Oui pour la photo, dès que je trouve le temps. (mais mon tableau est vraiment pas beau)
  • L’appareil s’alimente soit via un disjoncteur libre, soit en parallele sur un disjoncteur déjà pris.
  • Les grosses pince. Au moins une. Sinon il considère qu’il y a un pb de config. Mais je pense qu’on peut l’outrepasser.
1 « J'aime »

Hello
OK merci
Donc livraison Amazon samedi.
Ensuite on verra si j’y arrive ou pas.
J’ai commandé 8 pinces, mais je ne pense pas les utiliser toutes, je doute d’en avoir la place. Quand je vois la taille de ces pinces…
Encore merci pour toutes ces réponses

Hello
J’ai deux questions additionnelles avant de recevoir mon équipement et surtout de le monter.

  • N’ayant jamais installé de pince dans mon compteur, je pensais que celles ci bloquaient le fil qu’elles entouraient, mais quand je vois la taille du trou dans lequel on peut faire passer les câbles, je me dis que la pince doit flotter largement autour du fil. Est-ce normal ? Pourquoi l’espace pour faire passer le fil est-il si grand ?
  • Quand on parle de K → L je suppose que le K désigne le disjoncteur, donc pour les pinces à l’arrivée du courant, il faut mettre le K côté arrivée et le L vers le disjoncteur ? Et pour les petites pinces, le K côté sortie du disjoncteur et le L vers l’équipement à surveiller ?
    -Edit : La la pince sur la phase ?

Je préfère poser ces questions avant de ne faire sauter ma maison.
C’est surtout la question 1 qui m’intrique, de penser à ces fils électriques non bloqués dans les pinces, la pince qui se balade le long du fil… Ca me perturbe.

Merci

Salut.
Aucun risque avec un pince ampèremétrique de faire sauter quoique ce soit.
Le principe (de mémoire de mes cours lointains) c’est qu’on utilise le mécanisme d’induction pour mesurer la circulation des électrons donc le nombre d’électron par unité de temps, donc l’ampérage.
Pas besoin de contact pour cela !
Et c’est tout l’intérêt c’est tu n’as rien besoin de démonter et pas besoin de contact !

Oui c’est orienté, pour être cohérent avec le sens de circulation des électrons.

Hello

Bon, c’est encore moi
J’ai reçu l’emporia. Pas installé bien entendu, mais je l’ai branché quelques minutes en test sur mon bureau, la grosse pince sur un fil de rallonge et la petite sur un équipement. Pas beaucoup de W, mais quelques données… Ensuite j’ai débranché. Et j’ai voulu me lancer dans l’install…

C’est là que je suis coincé.
Je suis sur machne dédiée (Nuc Gigabyte) Debian 10.7
Tout d’abord, j’ai eu une erreur dans l’install des dépendances/

python3 -m pip install « pyemvue »

L’installation s’est bien déroulée, jusqu’à l’install de cryptography

 If you did intend to build this package from source, try installing a Rust compiler from your system package manager and ensure it is on the PATH during installation. Alternatively, rustup (available at https://rustup.rs) is the recommended way to download and update the Rust compiler toolchain.

  This package requires Rust >=1.41.0.

  ----------------------------------------
  Failed building wheel for cryptography
  Running setup.py clean for cryptography
  Complete output from command /usr/bin/python3 -u -c "import setuptools, tokenize;__file__='/tmp/pip-install-m67dv3h_/cryptography/setup.py';f=getattr(tokenize, 'open', open)(__file__);code=f.read().replace('\r\n', '\n');f.close();exec(compile(code, __file__, 'exec'))" clean --all:
  running clean
  removing 'build/lib.linux-x86_64-3.7' (and everything under it)
  'build/bdist.linux-x86_64' does not exist -- can't clean it
  'build/scripts-3.7' does not exist -- can't clean it
  removing 'build'
  running clean_rust

      =============================DEBUG ASSISTANCE=============================
      If you are seeing a compilation error please try the following steps to
      successfully install cryptography:
      1) Upgrade to the latest pip and try again. This will fix errors for most
         users. See: https://pip.pypa.io/en/stable/installing/#upgrading-pip
      2) Read https://cryptography.io/en/latest/installation/ for specific
         instructions for your platform.
      3) Check our frequently asked questions for more information:
         https://cryptography.io/en/latest/faq/
      4) Ensure you have a recent Rust toolchain installed:
         https://cryptography.io/en/latest/installation/#rust

      Python: 3.7.3
      platform: Linux-4.19.0-13-amd64-x86_64-with-debian-10.7
      pip: 18.1
      setuptools: 59.5.0
      setuptools_rust: 1.1.2
      =============================DEBUG ASSISTANCE=============================

  error: can't find Rust compiler

  If you are using an outdated pip version, it is possible a prebuilt wheel is available for this package but pip is not able to install from it. Installing from the wheel would avoid the need for a Rust compiler.

  To update pip, run:

      pip install --upgrade pip

  and then retry package installation.

  If you did intend to build this package from source, try installing a Rust compiler from your system package manager and ensure it is on the PATH during installation. Alternatively, rustup (available at https://rustup.rs) is the recommended way to download and update the Rust compiler toolchain.

  This package requires Rust >=1.41.0.

  ----------------------------------------
  Failed cleaning build dir for cryptography
Failed to build cryptography
Installing collected packages: python-dateutil, envs, pyasn1, rsa, ecdsa, cryptography, python-jose, jmespath, botocore, s3transfer, boto3, pycognito, pyemvue
  Found existing installation: cryptography 2.6.1
    Not uninstalling cryptography at /usr/lib/python3/dist-packages, outside environment /usr
    Can't uninstall 'cryptography'. No files were found to uninstall.
  Running setup.py install for cryptography ... error
    Complete output from command /usr/bin/python3 -u -c "import setuptools, tokenize;__file__='/tmp/pip-install-m67dv3h_/cryptography/setup.py';f=getattr(tokenize, 'open', open)(__file__);code=f.read().replace('\r\n', '\n');f.close();exec(compile(code, __file__, 'exec'))" install --record /tmp/pip-record-skwacjbn/install-record.txt --single-version-externally-managed --compile:
    running install
    /tmp/pip-build-env-hlybishk/lib/python3.7/site-packages/setuptools/command/install.py:37: SetuptoolsDeprecationWarning: setup.py install is deprecated. Use build and pip and other standards-based tools.
      setuptools.SetuptoolsDeprecationWarning,
    running build
    running build_py
    creating build
    creating build/lib.linux-x86_64-3.7
    creating build/lib.linux-x86_64-3.7/cryptography
    copying src/cryptography/__init__.py -> build/lib.linux-x86_64-3.7/cryptography
    copying src/cryptography/utils.py -> build/lib.linux-x86_64-3.7/cryptography
    copying src/cryptography/exceptions.py -> build/lib.linux-x86_64-3.7/cryptography
    copying src/cryptography/__about__.py -> build/lib.linux-x86_64-3.7/cryptography
    copying src/cryptography/fernet.py -> build/lib.linux-x86_64-3.7/cryptography
    creating build/lib.linux-x86_64-3.7/cryptography/x509
    copying src/cryptography/x509/ocsp.py -> build/lib.linux-x86_64-3.7/cryptography/x509
    copying src/cryptography/x509/extensions.py -> build/lib.linux-x86_64-3.7/cryptography/x509
    copying src/cryptography/x509/__init__.py -> build/lib.linux-x86_64-3.7/cryptography/x509
    copying src/cryptography/x509/name.py -> build/lib.linux-x86_64-3.7/cryptography/x509
    copying src/cryptography/x509/certificate_transparency.py -> build/lib.linux-x86_64-3.7/cryptography/x509
    copying src/cryptography/x509/general_name.py -> build/lib.linux-x86_64-3.7/cryptography/x509
    copying src/cryptography/x509/oid.py -> build/lib.linux-x86_64-3.7/cryptography/x509
    copying src/cryptography/x509/base.py -> build/lib.linux-x86_64-3.7/cryptography/x509
    creating build/lib.linux-x86_64-3.7/cryptography/hazmat
    copying src/cryptography/hazmat/__init__.py -> build/lib.linux-x86_64-3.7/cryptography/hazmat
    copying src/cryptography/hazmat/_oid.py -> build/lib.linux-x86_64-3.7/cryptography/hazmat
    creating build/lib.linux-x86_64-3.7/cryptography/hazmat/backends
    copying src/cryptography/hazmat/backends/__init__.py -> build/lib.linux-x86_64-3.7/cryptography/hazmat/backends
    copying src/cryptography/hazmat/backends/interfaces.py -> build/lib.linux-x86_64-3.7/cryptography/hazmat/backends
    creating build/lib.linux-x86_64-3.7/cryptography/hazmat/bindings
    copying src/cryptography/hazmat/bindings/__init__.py -> build/lib.linux-x86_64-3.7/cryptography/hazmat/bindings
    creating build/lib.linux-x86_64-3.7/cryptography/hazmat/primitives
    copying src/cryptography/hazmat/primitives/constant_time.py -> build/lib.linux-x86_64-3.7/cryptography/hazmat/primitives
    copying src/cryptography/hazmat/primitives/__init__.py -> build/lib.linux-x86_64-3.7/cryptography/hazmat/primitives
    copying src/cryptography/hazmat/primitives/_asymmetric.py -> build/lib.linux-x86_64-3.7/cryptography/hazmat/primitives
    copying src/cryptography/hazmat/primitives/hashes.py -> build/lib.linux-x86_64-3.7/cryptography/hazmat/primitives
    copying src/cryptography/hazmat/primitives/hmac.py -> build/lib.linux-x86_64-3.7/cryptography/hazmat/primitives
    copying src/cryptography/hazmat/primitives/poly1305.py -> build/lib.linux-x86_64-3.7/cryptography/hazmat/primitives
    copying src/cryptography/hazmat/primitives/padding.py -> build/lib.linux-x86_64-3.7/cryptography/hazmat/primitives
    copying src/cryptography/hazmat/primitives/_cipheralgorithm.py -> build/lib.linux-x86_64-3.7/cryptography/hazmat/primitives
    copying src/cryptography/hazmat/primitives/cmac.py -> build/lib.linux-x86_64-3.7/cryptography/hazmat/primitives
    copying src/cryptography/hazmat/primitives/keywrap.py -> build/lib.linux-x86_64-3.7/cryptography/hazmat/primitives
    copying src/cryptography/hazmat/primitives/_serialization.py -> build/lib.linux-x86_64-3.7/cryptography/hazmat/primitives
    creating build/lib.linux-x86_64-3.7/cryptography/hazmat/backends/openssl
    copying src/cryptography/hazmat/backends/openssl/decode_asn1.py -> build/lib.linux-x86_64-3.7/cryptography/hazmat/backends/openssl
    copying src/cryptography/hazmat/backends/openssl/aead.py -> build/lib.linux-x86_64-3.7/cryptography/hazmat/backends/openssl
    copying src/cryptography/hazmat/backends/openssl/rsa.py -> build/lib.linux-x86_64-3.7/cryptography/hazmat/backends/openssl
    copying src/cryptography/hazmat/backends/openssl/__init__.py -> build/lib.linux-x86_64-3.7/cryptography/hazmat/backends/openssl
    copying src/cryptography/hazmat/backends/openssl/ciphers.py -> build/lib.linux-x86_64-3.7/cryptography/hazmat/backends/openssl
    copying src/cryptography/hazmat/backends/openssl/ed448.py -> build/lib.linux-x86_64-3.7/cryptography/hazmat/backends/openssl
    copying src/cryptography/hazmat/backends/openssl/hashes.py -> build/lib.linux-x86_64-3.7/cryptography/hazmat/backends/openssl
    copying src/cryptography/hazmat/backends/openssl/encode_asn1.py -> build/lib.linux-x86_64-3.7/cryptography/hazmat/backends/openssl
    copying src/cryptography/hazmat/backends/openssl/hmac.py -> build/lib.linux-x86_64-3.7/cryptography/hazmat/backends/openssl
    copying src/cryptography/hazmat/backends/openssl/dsa.py -> build/lib.linux-x86_64-3.7/cryptography/hazmat/backends/openssl
    copying src/cryptography/hazmat/backends/openssl/x25519.py -> build/lib.linux-x86_64-3.7/cryptography/hazmat/backends/openssl
    copying src/cryptography/hazmat/backends/openssl/poly1305.py -> build/lib.linux-x86_64-3.7/cryptography/hazmat/backends/openssl
    copying src/cryptography/hazmat/backends/openssl/backend.py -> build/lib.linux-x86_64-3.7/cryptography/hazmat/backends/openssl
    copying src/cryptography/hazmat/backends/openssl/utils.py -> build/lib.linux-x86_64-3.7/cryptography/hazmat/backends/openssl
    copying src/cryptography/hazmat/backends/openssl/x448.py -> build/lib.linux-x86_64-3.7/cryptography/hazmat/backends/openssl
    copying src/cryptography/hazmat/backends/openssl/cmac.py -> build/lib.linux-x86_64-3.7/cryptography/hazmat/backends/openssl
    copying src/cryptography/hazmat/backends/openssl/ec.py -> build/lib.linux-x86_64-3.7/cryptography/hazmat/backends/openssl
    copying src/cryptography/hazmat/backends/openssl/x509.py -> build/lib.linux-x86_64-3.7/cryptography/hazmat/backends/openssl
    copying src/cryptography/hazmat/backends/openssl/dh.py -> build/lib.linux-x86_64-3.7/cryptography/hazmat/backends/openssl
    copying src/cryptography/hazmat/backends/openssl/ed25519.py -> build/lib.linux-x86_64-3.7/cryptography/hazmat/backends/openssl
    creating build/lib.linux-x86_64-3.7/cryptography/hazmat/bindings/openssl
    copying src/cryptography/hazmat/bindings/openssl/__init__.py -> build/lib.linux-x86_64-3.7/cryptography/hazmat/bindings/openssl
    copying src/cryptography/hazmat/bindings/openssl/_conditional.py -> build/lib.linux-x86_64-3.7/cryptography/hazmat/bindings/openssl
    copying src/cryptography/hazmat/bindings/openssl/binding.py -> build/lib.linux-x86_64-3.7/cryptography/hazmat/bindings/openssl
    creating build/lib.linux-x86_64-3.7/cryptography/hazmat/primitives/twofactor
    copying src/cryptography/hazmat/primitives/twofactor/totp.py -> build/lib.linux-x86_64-3.7/cryptography/hazmat/primitives/twofactor
    copying src/cryptography/hazmat/primitives/twofactor/__init__.py -> build/lib.linux-x86_64-3.7/cryptography/hazmat/primitives/twofactor
    copying src/cryptography/hazmat/primitives/twofactor/hotp.py -> build/lib.linux-x86_64-3.7/cryptography/hazmat/primitives/twofactor
    creating build/lib.linux-x86_64-3.7/cryptography/hazmat/primitives/kdf
    copying src/cryptography/hazmat/primitives/kdf/__init__.py -> build/lib.linux-x86_64-3.7/cryptography/hazmat/primitives/kdf
    copying src/cryptography/hazmat/primitives/kdf/pbkdf2.py -> build/lib.linux-x86_64-3.7/cryptography/hazmat/primitives/kdf
    copying src/cryptography/hazmat/primitives/kdf/x963kdf.py -> build/lib.linux-x86_64-3.7/cryptography/hazmat/primitives/kdf
    copying src/cryptography/hazmat/primitives/kdf/kbkdf.py -> build/lib.linux-x86_64-3.7/cryptography/hazmat/primitives/kdf
    copying src/cryptography/hazmat/primitives/kdf/scrypt.py -> build/lib.linux-x86_64-3.7/cryptography/hazmat/primitives/kdf
    copying src/cryptography/hazmat/primitives/kdf/concatkdf.py -> build/lib.linux-x86_64-3.7/cryptography/hazmat/primitives/kdf
    copying src/cryptography/hazmat/primitives/kdf/hkdf.py -> build/lib.linux-x86_64-3.7/cryptography/hazmat/primitives/kdf
    creating build/lib.linux-x86_64-3.7/cryptography/hazmat/primitives/ciphers
    copying src/cryptography/hazmat/primitives/ciphers/aead.py -> build/lib.linux-x86_64-3.7/cryptography/hazmat/primitives/ciphers
    copying src/cryptography/hazmat/primitives/ciphers/__init__.py -> build/lib.linux-x86_64-3.7/cryptography/hazmat/primitives/ciphers
    copying src/cryptography/hazmat/primitives/ciphers/modes.py -> build/lib.linux-x86_64-3.7/cryptography/hazmat/primitives/ciphers
    copying src/cryptography/hazmat/primitives/ciphers/algorithms.py -> build/lib.linux-x86_64-3.7/cryptography/hazmat/primitives/ciphers
    copying src/cryptography/hazmat/primitives/ciphers/base.py -> build/lib.linux-x86_64-3.7/cryptography/hazmat/primitives/ciphers
    creating build/lib.linux-x86_64-3.7/cryptography/hazmat/primitives/asymmetric
    copying src/cryptography/hazmat/primitives/asymmetric/rsa.py -> build/lib.linux-x86_64-3.7/cryptography/hazmat/primitives/asymmetric
    copying src/cryptography/hazmat/primitives/asymmetric/__init__.py -> build/lib.linux-x86_64-3.7/cryptography/hazmat/primitives/asymmetric
    copying src/cryptography/hazmat/primitives/asymmetric/ed448.py -> build/lib.linux-x86_64-3.7/cryptography/hazmat/primitives/asymmetric
    copying src/cryptography/hazmat/primitives/asymmetric/types.py -> build/lib.linux-x86_64-3.7/cryptography/hazmat/primitives/asymmetric
    copying src/cryptography/hazmat/primitives/asymmetric/dsa.py -> build/lib.linux-x86_64-3.7/cryptography/hazmat/primitives/asymmetric
    copying src/cryptography/hazmat/primitives/asymmetric/x25519.py -> build/lib.linux-x86_64-3.7/cryptography/hazmat/primitives/asymmetric
    copying src/cryptography/hazmat/primitives/asymmetric/padding.py -> build/lib.linux-x86_64-3.7/cryptography/hazmat/primitives/asymmetric
    copying src/cryptography/hazmat/primitives/asymmetric/utils.py -> build/lib.linux-x86_64-3.7/cryptography/hazmat/primitives/asymmetric
    copying src/cryptography/hazmat/primitives/asymmetric/x448.py -> build/lib.linux-x86_64-3.7/cryptography/hazmat/primitives/asymmetric
    copying src/cryptography/hazmat/primitives/asymmetric/ec.py -> build/lib.linux-x86_64-3.7/cryptography/hazmat/primitives/asymmetric
    copying src/cryptography/hazmat/primitives/asymmetric/dh.py -> build/lib.linux-x86_64-3.7/cryptography/hazmat/primitives/asymmetric
    copying src/cryptography/hazmat/primitives/asymmetric/ed25519.py -> build/lib.linux-x86_64-3.7/cryptography/hazmat/primitives/asymmetric
    creating build/lib.linux-x86_64-3.7/cryptography/hazmat/primitives/serialization
    copying src/cryptography/hazmat/primitives/serialization/__init__.py -> build/lib.linux-x86_64-3.7/cryptography/hazmat/primitives/serialization
    copying src/cryptography/hazmat/primitives/serialization/pkcs7.py -> build/lib.linux-x86_64-3.7/cryptography/hazmat/primitives/serialization
    copying src/cryptography/hazmat/primitives/serialization/pkcs12.py -> build/lib.linux-x86_64-3.7/cryptography/hazmat/primitives/serialization
    copying src/cryptography/hazmat/primitives/serialization/base.py -> build/lib.linux-x86_64-3.7/cryptography/hazmat/primitives/serialization
    copying src/cryptography/hazmat/primitives/serialization/ssh.py -> build/lib.linux-x86_64-3.7/cryptography/hazmat/primitives/serialization
    running egg_info
    writing src/cryptography.egg-info/PKG-INFO
    writing dependency_links to src/cryptography.egg-info/dependency_links.txt
    writing requirements to src/cryptography.egg-info/requires.txt
    writing top-level names to src/cryptography.egg-info/top_level.txt
    reading manifest file 'src/cryptography.egg-info/SOURCES.txt'
    reading manifest template 'MANIFEST.in'
    no previously-included directories found matching 'docs/_build'
    warning: no previously-included files found matching 'vectors'
    warning: no previously-included files matching '*' found under directory 'vectors'
    warning: no previously-included files matching '*' found under directory '.github'
    warning: no previously-included files found matching 'release.py'
    warning: no previously-included files found matching '.coveragerc'
    warning: no previously-included files found matching 'codecov.yml'
    warning: no previously-included files found matching '.readthedocs.yml'
    warning: no previously-included files found matching 'dev-requirements.txt'
    warning: no previously-included files found matching 'tox.ini'
    warning: no previously-included files found matching 'mypy.ini'
    warning: no previously-included files matching '*' found under directory '.zuul.d'
    warning: no previously-included files matching '*' found under directory '.zuul.playbooks'
    adding license file 'LICENSE'
    adding license file 'LICENSE.APACHE'
    adding license file 'LICENSE.BSD'
    adding license file 'LICENSE.PSF'
    writing manifest file 'src/cryptography.egg-info/SOURCES.txt'
    copying src/cryptography/py.typed -> build/lib.linux-x86_64-3.7/cryptography
    creating build/lib.linux-x86_64-3.7/cryptography/hazmat/bindings/_rust
    copying src/cryptography/hazmat/bindings/_rust/__init__.pyi -> build/lib.linux-x86_64-3.7/cryptography/hazmat/bindings/_rust
    copying src/cryptography/hazmat/bindings/_rust/asn1.pyi -> build/lib.linux-x86_64-3.7/cryptography/hazmat/bindings/_rust
    copying src/cryptography/hazmat/bindings/_rust/ocsp.pyi -> build/lib.linux-x86_64-3.7/cryptography/hazmat/bindings/_rust
    copying src/cryptography/hazmat/bindings/_rust/x509.pyi -> build/lib.linux-x86_64-3.7/cryptography/hazmat/bindings/_rust
    running build_ext
    running build_rust

        =============================DEBUG ASSISTANCE=============================
        If you are seeing a compilation error please try the following steps to
        successfully install cryptography:
        1) Upgrade to the latest pip and try again. This will fix errors for most

Vu mon niveau en Linux, inutile de dire que c’est absolument du charabia pour moi. C’est peut être normal, ou pas…

Donc j’ai continué.
J’ai créé le répertoire PyEmVue dans script/data; puis dans ce répertoire, j’ai collé un fichier appelé PyEmVue.PY (tu n’as pas précisé le nom du fichier à créer dans ta doc, et je ne sais pas à quoi il doit correspondre ensuite) depuis mon ordinateur, après avoir modifié dans le script de ta doc mon adresse mail et mot de passe Emporia Energy - les deux étant laissé entre guillemets…

Ensuite, péniblement (je répète; je suis nul en Linux, j’ai trouvé le chemin complet depuis la racine du fichier créé (/var/www/html… il faut le savoir). Je me suis positionné dans ce répertoire. J’ai appliqué le chmod et ai lancé l’exécution.

python3 PyEmVue.PY

Et là, j’ai cette erreur :

python3: can’t open file ‹ PyEmVue.PYpython3 ›: [Errno 2] No such file or directory

Qui correspond, je suppose à cette ligne :

from pyemvue import PyEmVue

Effectivement, je ne sais pas ce que sont ces fichiers/répertoires…

Du coup je suis coincé là, parce que je pense que j’ai loupé quelque chose (ma spécialité), ou qu’il me manque des billes…

Merci d’avance (une fois de plus)

Hello
J’essaie d’avancer mais moi et Linux…
J’ai mis a jour PIP
J’ai installé rust compiler (rustc)
Maintenant l’install se bloque sur :

Building wheels for collected packages: cryptography
Running setup.py bdist_wheel for cryptography … -

Ca freeze… Ca ne bouge plus…
Ca me stresse un peu je n’ai pas envie de perdre mon Jeedom pour un truc de cryptographie dont je n’ai que faire à priori…

J’ai interrompu l’install… Je vais me coucher !
Merci

Salut @phyllox .
Excellente nouvelle : tu as vraiment peu de chance de perdre ton Jeedom à cause de l’installation d’une librairie :wink:

Avant tout : est-ce que tu as installé l’application et créé ton compte sur Emporia. Effectivement je ne l’ai pas indiqué dans le tuto, il faut que je le rajoute. C’est grace à ce compte que tu vas pouvoir récupérer les datas via le script.

Donc apparemment tu as bien python3 installé.

Python: 3.7.3
      platform: Linux-4.19.0-13-amd64-x86_64-with-debian-10.7
      pip: 18.1
      setuptools: 59.5.0
      setuptools_rust: 1.1.2

Donc apparemment ton problème tourne autour de cette librairie cryptography.
Normalement c’est la lib qui permet de garantir les échanges en ssl (sécurisé)

Le log debug te recommande de mettre à jour ta version de pip. Ce doit être une bonne idée parce qu’il aurait du trouver automatiquement la dépendance de Rust.

 pip install --upgrade pip

Donc je pense que le mieux est de mettre à jour pip.
Puis de relancer l’install.

ok pour le nom de fichier dans le doc (effectivement c’est dans l’image mais pas dans la doc).

Que tu récupères ça me semble étonnant

python3: can’t open file ‹ PyEmVue.PYpython3 ›: [Errno 2] No such file or directory

J’ai du mal à comprendre pourquoi il colle python3 à la suite de ton nom de fichier.
Tu peux me copier coller le contenu de ton fichier PyEmVue.PY stp ? ça me parait étonnant

Hello
Merci de m’avoir répondu.
Oui, la création du compte chez Emporia, c’était évident.

L’installation de cryptography a fini par passer. Il fallait juste attendre un bon moment…
Le fichier .PY s’exécute normalement, à condition d’avoir le bon mot de passe, j’ai dû en faire un reset mais bon, c’est un détail

Du coup, avec l’install qui a été au bout (et le bon mot de passe), le .PY s’exécute normalement.

J’ai été un peu perdu au moment de la création du script, parce que je n’avais pas percuté qu’il fallait créer un script pour lancer le .PY, et ensuite, créer un scénario pour lancer le script.

J’ai lancé une première fois le scénario avant de créer le virtuel, il semble s’être bien exécuté, et c’est bizarre, parce que j’avais oublié d’activer le script. Mais il a quand même récupéré des données - mais c’est peut être parce que j’avais lancé manuellement le .PY avant ?

Ensuite j’ai créé le virtuel, et relancé le scénario, toujours avec le script désactivé. Il n’a plus rien trouvé, c’est normal ?
Je n’ai peut être pas tout compris ou pas bien lu ce que fait le .PY, il crée une log qui est effacée ensuite ? Je suis un peu perdu, parce que maintenant que j’ai activé le script, chaque fois que je lance le scénario, il me récupère la même chose (Emporia étant débranché, ça ne bouge plus). C’est comme ça que c’est prévu de fonctionner ? Du coup, je ne saisis pas bien cette histoire de log…

Tu parles d’une exécution toutes les minutes, et j’ai supposé au départ que le scénario s’auto lançait toutes les minutes, mais ça ne semble pas être le cas.
Tu ne l’a pas précisé, mais je suppose donc qu’il faut mettre un déclencheur au scénario, mode programmé, cron 1 minute ?
Le script lui n’a pas besoin de cron puisqu’il est exécuté par le scénario ?

Dernière question, je ne comprends pas comment s’alimente la balance. Tu mets :
« - variable(PyEmVue_1_Balance_conso_eq)*60 »
A quoi correspond le signe moins devant la variable ? Elle est soustraite de quoi ?

Pour le reste, il va falloir que je fasse un branchement de l’Emporia. Aujourd’hui, pas possible. Demain j’espère…

Merci d’avance pour les éclaircissements / confirmations

Question subsidiaire :
Je ne comprends pas bien à quoi ça sert que le scénario alimente des variables globales Jeedom, pour ensuite aller récupérer la valeur de ces variables dans un ou des virtuels ?
Pourquoi ne pas créer un virtuel global avec les 16 valeurs, les 16 noms etc, et alimenter les infos de ce virtuel directement via le code du scénario ?
Ca ferait des variables en moins dans Jeedom… (C’est le foutoir toutes ces variables globales…)
Ou au pire, utiliser des tags et mettre à jour le(s) virtuel(s) à la fin du scénario…

Je dis ça parce qu’il m’est arrivé plusieurs fois d’avoir des soucis de scénarios parce que les variables mettaient du temps à récupérer leur valeur et que de ce fait, la suite du scénario beuguait. Du coup, je n’utilise plus de variable, mais uniquement des commandes infos de virtuels mises à jour avec event.
Merci

re.
Pour répondre dans l’ordre :
1- le script lancé manuellement créé un fichier dans lequel il colle toutes les données collectées.
2- le scénario récupère les données, les affecte à des variables puis efface le fichier. Pour ne pas le relire une deuxième fois…et se mélanger les pinceaux.
3- oui il faut le demander de se déclencher toutes les minutes.
4- la balance est alimentée par l’écart entre ta mesure générale (la grosse pince) et la somme de toutes les autres pinces. Autrement dit c’est une information qui te permet de disposer de la data pour vérifier que somme des pinces + balance = conso totale.
5- Alors initialement on *60 car il s’agit d’une prise d’info « instantanée ». Donc on la multiplie par 60 pour avoir la conso sur une minute. Je dois t’avouer que c’était dans les éléments d’origine du script sur Home Assistant, donc ça mériterait d’être vérifié. Mais quand je fais la somme quotidienne de mon emporia général, je retombe bien sur l’info de mon linky. Donc je me dis que ça ne doit pas être trop déconnant. Mais il faut peut être que je regarde à nouveau.
6- non le script n’a pas besoin de cron. C’est le scénario qui le déclenche

Tu peux.
Pour ma part ça me permet de faire évoluer mes branchements. Et comme les variables sont recrées ça m’évite de me mélanger les pinceaux dans 6 mois que je replonge dedans.
De même que partant de ce premier fonctionnement, le chemin ne devrait pas être très grand pour faire un plugin qui serait 1000 plus pratique…
Disons que c’est un premier essai qui correspond à mes compétences, mes besoins et l’aide que j’ai pu trouver pour y arriver.

Merci pour les précisions.

Je comprends bien le *60 mais je ne comprends toujours pas le signe - …
Je verrai quand j’aurai installé le bazar et que j’aurai des valeurs. Pour l’instant c’est à 0. Reste que ça pourrait y rester, je ne suis pas certain que j’installerai les grosses pinces, je n’en ai pas besoin, j’ai un TIC qui me donne les données du compteur Linky. Et si Emporia accepte de s’en passer, moi aussi.

Merci encore. Je ferai un retour après l’install physique

Ah… je n’avais pas compris la question.
Le - devant c’est juste pour pouvoir artificiellement l’afficher en courbe négative et donc la soustraire de mes courbes. Rien d’autres.
La balance n’est pas le résultat d’une mesure, mais d’un calcul d’emporia.
Donc aucun obligation à l’utiliser

pour celles et ceux que cela intéresse, la communauté emporia vient de faire remonter une manipulation pour faire fonctionner l’appareil en mode ESP.
Et donc le rendre utilisable vraisemblablement en mode Lan. Ce qui serait un grande nouvelle et ouvrirait de nouveaux horizons à la bête.
Je vous laisse découvrir.

2 « J'aime »

Bonjour,

Merci pour ce travail et merci de le partager.

J’ai suivi le tuto mais je rencontre un problème lors de l’exécution de la commande
python3 PyEmVue.PY
J’ai la réponse suivante :

Traceback (most recent call last):
  File "PyEmVue.PY", line 19, in <module>
    from pyemvue import PyEmVue
ModuleNotFoundError: No module named 'pyemvue'

J’ai pourtant installé le module pyemvue à python (je crois). J’ai exécuté la commande :
‹ python3 › pour ouvrir une invite de commande python3
puis help('modules') pour avoir la liste des modules installés et j’ai bien pyemvue dedans.

Est-ce que quelqu’un a une idée s’il vous plaît ?

En vous remerciant,

Baptiste