Emporia Energy rencontre Jeedom... le tuto

@LMQT : l’appareil compatible triphasé à 149€ pour 8 capteurs fonctionnent sans problème sur une installation monophasé. J’ai eu une confirmation sur ce même topic dans un précédent message et aussi directement par le constructeur.

Fait toi plaisir :wink:

1 « J'aime »

@geraldelbaze : toujours motivé pour faire un plugin surtout que mon électricien ne devrait plus tarder à tout installer dans mon tableau.
J’ai profité d’une réinstallation from scratch de mon tableau (mise au norme) pour installer mes 16 capteurs !

En tous les cas, je suis avec attention ce sujet et je vous tiendrais bien entendu au courant très prochainement de l’avancement du plugin

1 « J'aime »

à dispo :wink:
et je pense que @cstan77 peut aussi être intéressé !
on peut aussi s’inspirer si besoin de ce qui a été fait sur Home-Assistant

Merci de l’info.
Mais il n’y a pas un soucis de calcul quelconque avec les 3 pinces principales si on fait ça ?
Il me semble avoir lu ça sur un forum quelconque il y a quelques temps, mais je ne sais plus exactement ce que c’était.

Nota : si jamais vous faites un plugin, je veux bien être bêta testeur !!! :grinning:
Du coup, j’achèterai le kit exprès.

Il faut que ton électricien pense à choisir un tableau avec une bonne profondeur pour éviter d’être ennuyé par l’épaisse des pinces.

Bon … je viens de créer le sujet dédié pour la création du plugin…
yapluka :wink:

Question subsidiaire sur la taille du module… afin d’être sur que je puisse le mettre dans mon nouveau tableau. J’ai très peu de place car mon ancien tableau est encastré dans une niche en béton et impossible de l’agrandir sans faire des travaux conséquents.

La taille du boitier sur le site web indique les dimensions 105mmx80mmx30mm mais la largeur ne comprend la taille des fiches que l’on insère de chaque côté du boitier.
Quelqu’un pourrait au final me donner la largeur du boitier avec les fiches ?

Pour être franc, j’ai un maximum de 10cm en largeur au seule endroit ou je pourrais insérer le boitier.
Merci de votre retour !

Salut.
1- Garde à l’esprit que tu n’es pas obligé de caler l’appareil en tant que tel dans le tableau. La longeur des cables des prises te permet de l’éloigner.
2- L’antenne wifi dispose d’un cable également donc tu peux même mettre le boitier dans un endroit « fermé » et faire sortir l’antenne.
3- à l’usage c’est plus les prises qui sont dures à loger que le boitier… (cf photos)
4- si tu as 10 cms, tu ne pourras utiliser qu’un seul côté des fiches (soit 8 prises). Avec les jacks, on est plus près des 11.

Et oui c’est le bordel dans mon tableau… années 80 :wink:



:frowning:

Salut Gerald,

J’ai suivi votre tuto et appliqué à la lettre, sauf que je recontre un bug aléatoire il se produit une quinzaine de fois par jour. La tram ne remonte pas ! et j’ai le message suivant dans logs script : (auriez-vous une idée ??)

------------------------------------
Erreur exécution de la commande [Aucun][Empuria.sc][EmpuriaScr] : Erreur sur /var/www/html/plugins/script/data/PyEmVue/PyEmVue.PY 2>&1 valeur retournée : 1. Détails : Traceback (most recent call last): File "/usr/local/lib/python3.7/dist-packages/urllib3/connection.py", line 175, in _new_conn (self._dns_host, self.port), self.timeout, **extra_kw File "/usr/local/lib/python3.7/dist-packages/urllib3/util/connection.py", line 72, in create_connection for res in socket.getaddrinfo(host, port, family, socket.SOCK_STREAM): File "/usr/lib/python3.7/socket.py", line 748, in getaddrinfo for res in _socket.getaddrinfo(host, port, family, type, proto, flags): socket.gaierror: [Errno -3] Temporary failure in name resolution During handling of the above exception, another exception occurred: Traceback (most recent call last): File "/usr/local/lib/python3.7/dist-packages/urllib3/connectionpool.py", line 710, in urlopen chunked=chunked, File "/usr/local/lib/python3.7/dist-packages/urllib3/connectionpool.py", line 386, in _make_request self._validate_conn(conn) File "/usr/local/lib/python3.7/dist-packages/urllib3/connectionpool.py", line 1042, in _validate_conn conn.connect() File "/usr/local/lib/python3.7/dist-packages/urllib3/connection.py", line 358, in connect self.sock = conn = self._new_conn() File "/usr/local/lib/python3.7/dist-packages/urllib3/connection.py", line 187, in _new_conn self, "Failed to establish a new connection: %s" % e urllib3.exceptions.NewConnectionError: : Failed to establish a new connection: [Errno -3] Temporary failure in name resolution During handling of the above exception, another exception occurred: Traceback (most recent call last): File "/usr/local/lib/python3.7/dist-packages/requests/adapters.py", line 499, in send timeout=timeout, File "/usr/local/lib/python3.7/dist-packages/urllib3/connectionpool.py", line 788, in urlopen method, url, error=e, _pool=self, _stacktrace=sys.exc_info()[2] File "/usr/local/lib/python3.7/dist-packages/urllib3/util/retry.py", line 592, in increment raise MaxRetryError(_pool, url, error or ResponseError(cause)) urllib3.exceptions.MaxRetryError: HTTPSConnectionPool(host='api.emporiaenergy.com', port=443): Max retries exceeded with url: /customers/devices (Caused by NewConnectionError(': Failed to establish a new connection: [Errno -3] Temporary failure in name resolution')) During handling of the above exception, another exception occurred: Traceback (most recent call last): File "/var/www/html/plugins/script/data/PyEmVue/PyEmVue.PY", line 36, in devices = vue.get_devices() File "/usr/local/lib/python3.7/dist-packages/pyemvue/pyemvue.py", line 48, in get_devices response = self.auth.request('get', API_CUSTOMER_DEVICES) File "/usr/local/lib/python3.7/dist-packages/pyemvue/auth.py", line 84, in request method, f"{self.host}/{path}", **kwargs, headers=headers, File "/usr/local/lib/python3.7/dist-packages/requests/api.py", line 59, in request return session.request(method=method, url=url, **kwargs) File "/usr/local/lib/python3.7/dist-packages/requests/sessions.py", line 587, in request resp = self.send(prep, **send_kwargs) File "/usr/local/lib/python3.7/dist-packages/requests/sessions.py", line 701, in send r = adapter.send(request, **kwargs) File "/usr/local/lib/python3.7/dist-packages/requests/adapters.py", line 565, in send raise ConnectionError(e, request=request) requests.exceptions.ConnectionError: HTTPSConnectionPool(host='api.emporiaenergy.com', port=443): Max retries exceeded with url: /customers/devices (Caused by NewConnectionError(': Failed to establish a new connection: [Errno -3] Temporary failure in name resolution'))

bonjour.
désolé. pas très présent en ce moment sur le forum.
ça m’arrive moi aussi.
je pense que c’est lié à deux choses:
1- l’accès api n’est pas « piloté » côté emporia. Donc la qualité de l’accès à la donnée n’est pas top.
2- le modèle actuel génère pas mal de requêtes et j’ai pas eu le temps de regarder si tout cela toutes les minutes ça ne sature pas au milieu de tous les autres process.
Faudrait que je me penche là-dessus…

Bonjour à tous,
J’ai un soucis lors de l’install du pyemvue.
J’ai des erreurs d’accès à des dossiers comme cela par exemple : ERROR: Could not install packages due to an OSError: [Errno 13] Permission denied: ‹ /var/www/.local ›
J’ai pourtant remis les droits et redémarré mon jeedom Atlas mais cela ne fonctionne pas :sob:
quelqu’un aurait une idée ?

Edit :
J’ai refais une passe sur les droits avec les commandes suivantes :
Apache2
sudo chmod 775 -R /var/www/html
sudo chown -R www-data:www-data /var/www/html

Erreur sur le dossier tmp
sudo chmod 775 -R /tmp/jeedom/
sudo chown -R www-data:www-data /tmp/jeedom/

Avec cela, l’installation a fonctionné !! :grin:
Maintenant, le log se créé bien mais pas de json et les variables ne sont pas créées.
je cherche :face_with_monocle:

EDIT2 :
J’avance petit à petit : Jai modifier le fichier Emporia.PY pour fixer le chemin du json
token = ‹ /var/www/html/plugins/script/data/PyEmVue/keys.json ›
Même problème que MAYA

Edit 3 :
Je cale. Toujours pas de variable de créé … :persevere:

Pas la peine d’aller au bout, pour le moment ça n’est pas viable, il y a des trames qui ne remontent pas ce qui fausse totalement les données, certain jour j’arrive à 25 ou 30 trames, on a toujours une tendance mais rien de bien fiable. beau projet mais un peu abandonné !!!

@YODA69 : si tu as du temps, n’hésites pas… pour ce qui me concerne et comme indiqué dans le tuto, il s’agit d’une première marche. Le reste demande du temps. Si tu en disposes faut pas hésiter à t’impliquer.
@AurelTT : La première marche a été réalisée sur la base d’un RPI. Dans ton case on est sur un atlas qui a une gestion des dossiers et des droits différente. Je ne dispose pas de cet équipement, ni de la distribution installée. Donc à l’endroit où je suis ça revient à essayer de comprendre / trouver comment remonter une pièce sur une voiture que je n’ai pas sous les yeux… j’ai essayé de regarder mais pour le moment, je pense que c’est plus du côté d’atlas qu’il faut poser la question sur la manière dont il gère les installs des paquets qui ne sont pas préinstallés. Je suppose que pour pouvoir assurer la garantie, il n’autorise pas d’écrire dans certains dossiers. Même en sudo… mais ce n’est qu’une supposition.

Merci pour ta réponse.
Effectivement j’ai rapidement compris que comme j’étais sur l’Atlas, j’avais quelques divergences.
J’ai cependant avancé un peu en modifiant le premier code qui génère le fichier json. Vu que celui ci remonte Les valeurs, j’ai supposé que je pouvais les extraire pour les placer dans des variables virtuelles :

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

# import librairies
import sys, os
import requests
import json




# Variables de connexion
user = "user"
passuser = "password"
duree = "1MIN"
token = '/var/www/html/plugins/script/data/PyEmVue/keys.json'
resultat = "PyEmVue.log"

MaPuissance=""

# 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 ecriture_virtuel(Voie, Valeur):
    payload = {'plugin':'virtual', 'type':'event', 'apikey':'apikey'', 'id':Voie, 'value':Valeur}
    r = requests.post("http://192.168.X.X/core/api/jeeApi.php", params=payload)
    #fichier.write(f'Voie : {Voie} Valeur :{Valeur} \n')
    
def print_recursive(usage_dict, info, depth=0):
    global MaPuissance
    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 isinstance(channel.usage, type(None)):
                Valeur=0
            else:    
                Valeur=float(channel.usage)
                
            
            if Valeur>0:
                if channelnum == '1,2,3':
                    MaPuissance="{:.3f}".format(float(channel.usage)*100)
                    ecriture_virtuel(781,MaPuissance)

                
                else:
                    if channelnum.isnumeric():
                        #781 correspond à l'ID de la première variable. Il faut les créer à la suite pour que cela fonctionne. Il faut les faire correspondre à l'ordre des données reçues. Avec cette méthode, je renseigne uniquement les variables que je reçois
                        Mavoie = 781 + int(channelnum)
                        if Mavoie <= 797:
                            MaPuissance="{:.3f}".format(float(channel.usage)*100)
                            ecriture_virtuel(Mavoie,MaPuissance)

                
            if channel.nested_devices:
                print_recursive(channel.nested_devices, Puissance, 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("Début" + "\n")
#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 n’est pas une critique, simplement une constatation (pour le moment il y a des bugs ce qui est normal). J’étais bien content de suivre ton tuto et j’ai même essayé de pousser du coté Jeedom étant moi même agréer, pour qu’ils t’aident dans ton avancée. Sauf que voilà, ils sont sourds et ne voient pas le potentiel de cet objet. Moi demain le plugin sort, je commercialise à grande echelle dans l’industrie, car ils sont en plein dans l’analyse des surcoûts de consommation et faire ça pour le moment avec des rt2 eco device ne m’enchante guère car vu le coût pour 16 tors autant te dire qu’il ne s’en vend pas tous les jours. Donc je réitère ce n’était absolument pas une critique et si tu l’as pris comme cela j’en suis désolé, parfois l’écriture parait plus dure qu’il ni parait !!

1 « J'aime »

J’ai toujours le but de faire un plugin mais mon électricien est quelque peu surbooké !
Mon tableau électrique ne sera pas installé avant plusieurs semaines :frowning:

Pour information, j’ai analysé la librairie python pour récupérer les différentes informations et il n’y a rien de complexe.
On devrait pouvoir faire un plugin en beta plutôt rapidement.

@YODA69 : puis-je te contacter en MP pour en discuter ?

2 « J'aime »

Oui pas de souci

Je ne sais pas si l’API le permet mais si possible, ce serait bien de donner la possibilité de configurer la fréquence des refresh et de se baser sur les données 1MIN / 15MIN / 1H comme les fichiers exportées de Emporia Energy.
Perso, j’ai juste besoin du 15MIN, pas besoin d’un refresh toutes les minutes pour faire un ratio HP/HC de chaque équipement. Pour le moment je le fais dans Excel.

l’API ne le permet pas mais rien n’interdit d’integrer le résultat par cycle de 15’.
Un virtuel qui fait la moyenne sur 15’ peut faire le job.
Mais l’API ne fournit pas de résultats cumulés sur 15’

L’idée c’était surtout de ne pas stresser une interface avec des données trop détaillées pour les agréger ensuite. Tant pis, on fera une somme.