Un script tout prêt pour récupérer des données : comment l'intégrer?

Bon à tous.
Je cherche un peu d’aide car :

  • je dispose d’un script python complet permettant d’interroger une API, pour rapatrier des données de consommation électrique.
  • je dispose de plug-in « script ».

Mais avant de me lancer je veux être sûr que j’ai bien compris le principe de l’utilisation de ce plugin et que c’est faisable.

Voici les scripts.

Est-ce que si je l’intègre j’ai une chance de récupérer la data ?

Merci d’avance aux âmes charitables qui voudront bien me laisser un avis, avant que je me lance… :crazy_face:

Bonjour @geraldelbaze,
J’ai pas regardé en détail ton script mais il n’y a pas de problème.
Si il te manque des librairies tu peux tout à fait les installer :+1:

J’utilise du bash, du json et du python dans mes scripts et je traite les datas dans Jeedom

Alors go

1 « J'aime »

je regarde, je regarde, mais c’est pas gagné quand même l’histoire. L’environnement de jeedom est loin d’être comparable à un terminal … :frowning:

hello
tu peux essayer avec le plugin script je pense

1 « J'aime »

je suis en train…
mais typiquement normalement, il y a un fichier setup.py à executer pour vérifier et installer les dépendances, et de coup, je ne suis pas convaincu qu’il ne faudrait pas le faire depuis un bon vieux terminal…

Bha tu te connectes sur Jeedom avec MobaXterm ou WinSCP
Apres t’as accès au système Jeedom/Debian en SSH avec le terminal Putty
Dans le terminal, tu peux tes scripts et installer les dépendances
Fait une image de ton DIY et de Jeedom si t’es pas sur de ton coup, c’est plus facile à restaurer.

1 « J'aime »

oui oui c’est ce que j’ai fini par faire hier soir.
C’est installé. C’est pas pour autant que c’est abouti… mais je chemine :wink:
D’autant que j’ai découvert que le script était directement dispo dans PyPi
Je dispose des méthodes pour invoquer désormais le script. Mais du coup je touche du doigt qu’il me reste à concevoir les appels… et c’est que c’est pas gagné… J’étais parti sur le fait de scripter directement dans la fenetre jeedom, mais si j’ai bien compris, il faut que je mettes tout cela dans un fichier et que j’y fasse appel.

C’est ça, oui.

Tu crées un un script dans le plugin scripts

Ensuite dans le chemin du met ton script à exécuter

Merci.
Je suis preneur d’une édition de ton code sh stp.
juste pour comprendre si tu déclares toutes les variables dans ce fichier ou si tu as juste l’invoquation.
dernière chose : où et comment est stocké le résultat de ce script. Dans ton cas, si tu veux faire une courbe avec les résultats toutes les heures de ton script, j’ai du mal à voir comment cela se passe…
Merci !

1 « J'aime »

Pour être très concret : j’arrive désormais à interroger le script et je récupère ce type de réponse :

81992 1,2,3 TazVue 0.07472568806966146 kwh
 81992 1 Four 0.0 kwh
 81992 2 Luminaires Couloir 0.0012260294130113387 kwh
 81992 3 Atelier 0.010072698296440972 kwh
 81992 4 Convecteur Salon 5.7742802434497406e-05 kwh
 81992 5 Etage 0.0327604241265191 kwh
 81992 6 Annexe 0.018151298048231335 kwh
 81992 7 Table de Cuisson 2.317856987317403e-05 kwh
 81992 8 Cumulus 2.392050782839457e-05 kwh
 81992 Balance Balance 0.012410396305322651 kwh
 82028 1,2,3 TazAnnexe 0.01785136506822374 kwh
 82028 1 Piscine 0.010969003668891059 kwh
 82028 2 2 4.936026599672106e-06 kwh
 82028 3 3 1.0912692017025418e-05 kwh
 82028 4 Convecteur + Prise Xbox 0.007196556462181939 kwh
 82028 Balance Balance -0.0003300437814659548 kwh

Mon sujet est de stocker cela tout les minutes pour en faire un observateur de mes consommations électriques…

Et mon script est là… je sais que je ne suis pas loin mais bon…

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')
            if channel.nested_devices:
                print_recursive(channel.nested_devices, depth+1)

vue = PyEmVue()
vue.login(username='put_username_here', password='put_password_here', token_storage_file='keys.json')

devices = vue.get_devices()
device_gids = []
info = {}
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="1MIN", unit="KilowattHours")
print_recursive(device_usage_dict, info)
1 « J'aime »

Voici le code de mon script bash :

# speedtest 1.1.1.28
# Récupere le debit de la connexion internet dans un fichier
# NOW=`date`

# Je lance le test de la connexion Internet
DEBIT=`sudo speedtest --accept-gdpr -f json`

# Je met le résultat du test dans le fichier log
echo ${DEBIT} > /var/www/html/plugins/script/data/SPEEDTEST/speedtest.log

Apres j’utilise un scénario qui lit le fichier log pour récupérer toutes les infos et les mettre en variables Jeedom.

1 « J'aime »

si tu t’y connais en code PHP, tu peux te faire un plugin, c’est ce que j’ai fait pour ma VMC et ma voiture électrique.
t’as un template vide Jeedom qui permet de faire ça, mais faut connaitre, tout est bien expliqué sur l’aide Plugins.

Sinon, tu peux faire par scénario comme je t’ai montré en déclenchement cron pour l’exécution automatique.

1 « J'aime »

top … je regarde tout cela… merci !

hummm… sauf erreur de ma part, toi tu récupères déjà une data au format json via ta requête non ?
J’ai bon ?
Pour le moment moi je ne fais qu’un print_recursive…
Faut que j’arrive à le stocker au format json si je veux pouvoir m’appuyer sur ton exemple.

Oui j’ai forcé la sortie du résultat en JSON mais toi tu rediriges ton printf dans ton fichier de sortie :

print('-'*depth, f'{gid} {channelnum} {name} {channel.usage} kwh')
fichier = open("<CHEMIN_OU_FAUT_ECRIRE>/test.log", "a")
fichier.write("\nBonjour ")
fichier.write("geraldelbaze")
fichier.write("\n*** C'est fini ***")
fichier.close()

Essai ce script en modifiant CHEMIN_DE_SORTIE par le répertoire de ton script :

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('-'*depth, f'{gid} {channelnum} {name} {channel.usage} kwh')

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

vue = PyEmVue()
vue.login(username='put_username_here', password='put_password_here', token_storage_file='keys.json')

devices = vue.get_devices()
device_gids = []
info = {}
fichier = open("CHEMIN_DE_SORTIE/PyEmVue.log", "a")

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="1MIN", unit="KilowattHours")
print_recursive(device_usage_dict, info)
fichier.write("\n*** C'est fini ***")
fichier.close()

Hummm…
on n’est pas loin …
je dois résoudre cette erreur :

Traceback (most recent call last):
  File "connect.PY", line 34, in <module>
    print_recursive(device_usage_dict, info)
  File "connect.PY", line 12, in print_recursive
    fichier.write('-'*depth, f'{gid} {channelnum} {name} {channel.usage} kwh')
TypeError: write() takes exactly one argument (2 given)

Remplace

fichier.write(‹ - ›*depth, f’{gid} {channelnum} {name} {channel.usage} kwh’)

par

fichier.write(f’{gid} {channelnum} {name} {channel.usage} kwh\n’)

arggg…

  File "connect.PY", line 12
    fichier.write(f’{gid} {channelnum} {name} {channel.usage} kwh’)
                   ^
SyntaxError: invalid character in identifier