[Python] Interfacer un INA219 avec une passerelle Domoticz sous Raspberry Pi

Vous avez créé un script LUA dont vous êtes fier, un .sh génial, un programme Python hors du commun, un Tuto, c'est ici que vous pouvez les partager.
sbarbu
Messages : 1
Inscription : 30 nov. 2020, 10:09

[Python] Interfacer un INA219 avec une passerelle Domoticz sous Raspberry Pi

Message par sbarbu »

Bonjour,

Pour ceux qui souhaitent mesurer des consommations continues de faible puissance (~80W), comme par exemple sur un petit panneau photovoltaïque, il existe un composant intéressant qui est l'INA219.

En cherchant j'ai pas trouvé grand chose pour interfacer directement l'INA219 avec la passerelle sans passer par un arduino, ESP easy ou autre carte déportée.

Dans mon cas la passerelle Domoticz est une Raspberry Pi, mais la démarche peut s’adapter à toute autre plateforme linux capable de s'interfacer avec le capteur.

Voici les sources dont je me suis inspiré:
Tuto INA219 + raspberry pi
Interfacer un capteur DHT avec Domoticz

L'idée est donc de récupérer les données en I2C en branchant le capteur suivant le schéma:
cablage_INA219.png
cablage_INA219.png (96.75 Kio) Consulté 2639 fois
Dans une console de la Raspberry, activer l’I2C en tapant :

Code : Tout sélectionner

 sudo raspi-config
Aller dans interfacing option->I2C->Yes

Installation de i2c-tools pour vérifier le branchement du capteur:

Code : Tout sélectionner

sudo apt-get install -y  i2c-tools
Faire un reboot

Code : Tout sélectionner

sudo reboot

Scanner le bus I2C :

Code : Tout sélectionner

sudo i2cdetect -y 1

On voit apparaître l'INA219 à l'adresse 40:
adresse_INA219.png
adresse_INA219.png (30.42 Kio) Consulté 2639 fois
Le capteur est bien branché.

Installation de Python et des dépendances

Mise à jour générale:

Code : Tout sélectionner

sudo apt-get update
sudo apt-get upgrade
Installation de Python si ce n'est pas déjà fait:

Code : Tout sélectionner

sudo apt-get install build-essential python-dev python-openssl
sudo apt-get install python-pip
Installation de la librairie Python requests pour Domoticz:

Code : Tout sélectionner

sudo pip install requests
Installation de la librairie Python pour l'INA219:

Code : Tout sélectionner

 sudo pip install pi-ina219
Vérifier que les librairies sont bien installées:

Code : Tout sélectionner

pip list
Doivent apparaitre pi-ina219 et requests

Faire apparaître la puissance INA219 sous Domoticz

Sous Domoticz, créer un nouveau capteur en allant dans Configuration->Matériel, lui donner un nom (ex : « Puissance INA219 »), puis sélectionner le type « Dummy », cliquer sur « Ajouter » :
domoticz_INA219_1.png
domoticz_INA219_1.png (87.86 Kio) Consulté 2639 fois
Ensuite une nouvelle ligne apparaît au-dessus cliquer sur « créer un capteur virtuel » :
domoticz_INA219_2.png
domoticz_INA219_2.png (42.15 Kio) Consulté 2639 fois
Donner un nom au capteur (ex « Puissance INA219 »), choisir le type « Custom Sensor» et remplir « mW » comme nom de l’axe, puis cliquer sur OK :

domoticz_INA219_3.png
domoticz_INA219_3.png (22.35 Kio) Consulté 2639 fois
Aller dans Configuration->Dispositifs vérifier qu’il y a bien le nouveau capteur, et noter l’index « Idx » (ici 2) :
domoticz_INA219_4.png
domoticz_INA219_4.png (31.47 Kio) Consulté 2639 fois
Le nouveau capteur doit apparaitre dans l’onglet « Mesures » de Domoticz, on peut cliquer sur l’étoile pour l’ajouter sur la page d’accueil :
domoticz_INA219_5.png
domoticz_INA219_5.png (34.38 Kio) Consulté 2639 fois


Nous allons maintenant créer un script Python qui va lire la valeur de puissance de l’INA219 et l’envoyer via une requête à Domoticz.
Pour cela, dans la console de la Raspberry Pi, se placer dans le dossier :

Code : Tout sélectionner

cd ~/domoticz/scripts/
Créer un nouveau script, ici nommé « powersensor.py » (ne surtout pas l'appeler « ina219.py »!)

Code : Tout sélectionner

sudo nano powersensor.py
Coller le script suivant en prenant soin de bien renseigner l’index du capteur précédemment créé, et éventuellement l’utilisateur et mot de passe s’il y en a un (sinon laisser tel quel) :

Code : Tout sélectionner

#!/usr/bin/python
# -*- coding: latin-1 -*-

import os
import sys
import socket
from requests.auth import HTTPBasicAuth
from ina219 import INA219
import requests


############# Parametres #################################

#recupération de l'IP utilisée
from subprocess import check_output
host_return= check_output(['hostname', '-I'])
domoticz_ip=host_return.split()[0]
domoticz_port='8080'
# a changer si nécéssaire:
user=''
password=''
domoticz_idx=2 # a changer en fonction de l'index attribué par domoticz


#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# le fomat pour le capteur custom est celui ci:
#/json.htm?type=command&param=udevice&idx=IDX&nvalue=0&svalue=VALUE;

def maj_widget(val_url):
    requete='http://'+domoticz_ip+':'+domoticz_port+val_url
    r=requests.get(requete,auth=HTTPBasicAuth(user,password))
    if  r.status_code != 200:
          print "Erreur API Domoticz"

#recuperation de la puissance mesuree par l'INA219
ina = INA219(0.1)
ina.configure()
puissance=ina.power()

if puissance is not None:
    print('Puissance={0:0.1f}'.format(puissance))
    url='/json.htm?type=command&param=udevice&idx='+str(domoticz_idx)
    url+='&nvalue=0&svalue='
    url+=str('{0:0.1f};0').format(puissance)
    maj_widget(url)

else:
    print('Probleme avec la lecture de l INA219')
    sys.exit(1)
Sauvegarder puis quitter (Ctrl-S Ctrl-X)

Ensuite rendre le script exécutable :

Code : Tout sélectionner

sudo chmod +x powersensor.py
Tester le bon fonctionnement du script :

Code : Tout sélectionner

sudo python powersensor.py
Le script doit afficher la puissance mesurée (en mW) et la requête :
domoticz_INA219_6.png
domoticz_INA219_6.png (17.67 Kio) Consulté 2639 fois
Pour que le script s’exécute tout seul à intervalles réguliers, nous allons utiliser le planifieur des taches cron :

Code : Tout sélectionner

crontab –e
La première fois qu’on lance crontab il faut sélectionner l’éditeur, dans mon cas j’utilise nano
Puis le fichier des taches doit s’ouvrir, ajouter la ligne suivante qui permet de lancer le script toutes les 1 minutes:

Code : Tout sélectionner

*/1 * * * * sudo /home/pi/domoticz/scripts/powersensor.py


Sauvegarder puis quitter (Ctrl-S Ctrl-X)
Attendre quelques minutes et vérifier les valeurs sous Domoticz :
domoticz_INA219_7.png
domoticz_INA219_7.png (42.14 Kio) Consulté 2639 fois

Voilà !
fcBourgogne
Messages : 172
Inscription : 31 mars 2020, 14:22

Python URL

Message par fcBourgogne »

Bonjour,

J'installe un capteur de courant, voltage etc, le INA219 I2C.
J'ai trouvé ici le tuto et le code suivant:
https://www.easydomoticz.com/forum/view ... hp?t=10774

Code : Tout sélectionner

#!/usr/bin/python
# -*- coding: latin-1 -*-

import os
import sys
import socket
from requests.auth import HTTPBasicAuth
from ina219 import INA219
import requests


############# Parametres #################################

#recupération de l'IP utilisée
from subprocess import check_output
host_return= check_output(['hostname', '-I'])
domoticz_ip=host_return.split()[0]
domoticz_port='8080'
# a changer si nécéssaire:
user=''
password=''
domoticz_idx=2 # a changer en fonction de l'index attribué par domoticz


#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# le fomat pour le capteur custom est celui ci:
#/json.htm?type=command&param=udevice&idx=IDX&nvalue=0&svalue=VALUE;

def maj_widget(val_url):
    requete='http://'+domoticz_ip+':'+domoticz_port+val_url
    r=requests.get(requete,auth=HTTPBasicAuth(user,password))
    if  r.status_code != 200:
          print "Erreur API Domoticz"

#recuperation de la puissance mesuree par l'INA219
ina = INA219(0.1)
ina.configure()
puissance=ina.power()

if puissance is not None:
    print('Puissance={0:0.1f}'.format(puissance))
    url='/json.htm?type=command&param=udevice&idx='+str(domoticz_idx)
    url+='&nvalue=0&svalue='
    url+=str('{0:0.1f};0').format(puissance)
    maj_widget(url)

else:
    print('Probleme avec la lecture de l INA219')
    sys.exit(1)
Après avoir renseigné le port et l'IDX, suivi le tuto à la lettre, je lance la commande sous Putty:
sudo python currentsensor.py
Ca me retourne "SyntaxError: invalid syntax"
J'ai une erreur de syntax qui pointe sur "url" --> " url='/json.htm?type=command&param=udevice&idx='+str(domoticz_idx)
Que faire, comment résoudre cela?
Si quelqu'un pouvait m'aider, merci!
A+
Raspberry PI5+ 1WIRE + I2C +ESP8266 +esp32
Keros
Messages : 6638
Inscription : 23 juil. 2019, 20:57

Re: [Python] Interfacer un INA219 avec une passerelle Domoticz sous Raspberry Pi

Message par Keros »

fcBourgogne, je viens de déplacer ton message dans le sujet initial du tuto afin d'y regrouper les discussions.

Depuis les dernières versions de DomoticZ, les commandes API ont changé et le script utilise l'ancienne syntaxe. Voir les dernières notes de changement de version ou la documentation de l'API Json.
Comment bien utiliser le forum : Poser une question, Mettre un script, un fichier, une image ou des logs
Mes petits guides : Débuter en programmation, Le débogage, Le choix de matériel, Les sauvegardes
Ma présentation - Mes Tutos
fcBourgogne
Messages : 172
Inscription : 31 mars 2020, 14:22

Re: [Python] Interfacer un INA219 avec une passerelle Domoticz sous Raspberry Pi

Message par fcBourgogne »

Bonjour Keros,
Je n'ai pas posté ici car en bas de page il est noté:
Pas de questions ici, que des tutos

Alors???
En tout cas merci de ta réponse, je regarde de ce coté.
A+
Raspberry PI5+ 1WIRE + I2C +ESP8266 +esp32
fcBourgogne
Messages : 172
Inscription : 31 mars 2020, 14:22

Re: [Python] Interfacer un INA219 avec une passerelle Domoticz sous Raspberry Pi

Message par fcBourgogne »

Keros,
J'ai donc regardé là:
https://www.domoticz.com/wiki/Domoticz_ ... tom_Sensor
Capteur personnalisé
/json.htm?type=command&param=udevice&idx=IDX&nvalue=0&svalue=VALUE
IDX = id de votre appareil (Ce numéro se trouve dans l’onglet appareils dans la colonne « IDX »)
VALUE = Valeur (comme 12.345)
Je ne vois pas de différence avec le code de Sbarbu, il semble être à jour.
A+
Raspberry PI5+ 1WIRE + I2C +ESP8266 +esp32
Keros
Messages : 6638
Inscription : 23 juil. 2019, 20:57

Re: [Python] Interfacer un INA219 avec une passerelle Domoticz sous Raspberry Pi

Message par Keros »

Pour les questions à propos d'un tuto, on peut. C'est même fait pour.
Un autre membre souhaiterait utiliser ce tuto dans quelque temps, il rencontrera le même problème que toi. Si ta question était restée en dehors de la discussion sur le tuto, l'autre membre ne l'aurait certainement pas vu et il aurait, lui aussi, fait des recherches, passer du temps, poser des questions. Là, en parcourant la discussion, il pourra voir les différentes problématiques qui ont été rencontrées et les solutions apportées. Et si l'auteur initial le souhaite, il peut modifier son premier post pour prendre en compte les remarques.

Edit : En voyant l'api et la date du script, je pensais que ça venait de là. Désolé.

Edit 2 : Tu es sur quelle version de DomoticZ ?
Comment bien utiliser le forum : Poser une question, Mettre un script, un fichier, une image ou des logs
Mes petits guides : Débuter en programmation, Le débogage, Le choix de matériel, Les sauvegardes
Ma présentation - Mes Tutos
fcBourgogne
Messages : 172
Inscription : 31 mars 2020, 14:22

Re: [Python] Interfacer un INA219 avec une passerelle Domoticz sous Raspberry Pi

Message par fcBourgogne »

Ok, je comprends, mais pour moi cela était clair dans la formulation pas de question

Alors ma version Domoticz est la dernière 2023.2


Pour moi le souci est au niveau du programme python, bien que je ne suis pas expert en le domaine.

Il n'y a pas d'erreur de réponse, mais une erreur de syntax du programme, non?

L'erreur pointe vers "url"

Est ce une bibliothèque manquante qui ne permet pas de reconnaître "url"?

A+
Dernière modification par Keros le 18 nov. 2023, 14:01, modifié 1 fois.
Raison : Merci d'éditer votre message précédent pour y rajouter l'information complémentaire
Raspberry PI5+ 1WIRE + I2C +ESP8266 +esp32
fcBourgogne
Messages : 172
Inscription : 31 mars 2020, 14:22

Re: [Python] Interfacer un INA219 avec une passerelle Domoticz sous Raspberry Pi

Message par fcBourgogne »

Sous Putty la commande:
sudo curl -k 'http://192.168.1.**:****/json.htm?type=command&param=udevice&idx=**&nvalue=0&svalue=21'
Fonctionne, le device est mis à jour, la valeur est bien passée à "21"
A+
Raspberry PI5+ 1WIRE + I2C +ESP8266 +esp32
Keros
Messages : 6638
Inscription : 23 juil. 2019, 20:57

Re: [Python] Interfacer un INA219 avec une passerelle Domoticz sous Raspberry Pi

Message par Keros »

Dans ce cas, fais un print de l'URL afin de vérifier que c'est bien la bonne qu'il calcule.
Comment bien utiliser le forum : Poser une question, Mettre un script, un fichier, une image ou des logs
Mes petits guides : Débuter en programmation, Le débogage, Le choix de matériel, Les sauvegardes
Ma présentation - Mes Tutos
fcBourgogne
Messages : 172
Inscription : 31 mars 2020, 14:22

Re: [Python] Interfacer un INA219 avec une passerelle Domoticz sous Raspberry Pi

Message par fcBourgogne »

Pas si simple!

Keros, Si je place le "print url" comme ceci:

Code : Tout sélectionner

if voltage is not None:
    print('Voltage={0:0.1f}V'.format(ina.voltage())
    url ='/json.htm?type=command&param=udevice&idx='+str(domoticz_idx)
    url+ ='&nvalue=0&svalue='
    url+ =str('{0:0.1f};0').format(voltage)
 print (url)
   maj_widget(url)

else:
    print('Probleme avec la lecture de l INA219')
    sys.exit(1)
Réponse :
File "currentsensor.py", line 42
url ='/json.htm?type=command&param=udevice&idx='+str(domoticz_idx)
^
SyntaxError: invalid syntax
Donc toujours une erreur programme sur url.

Maintenant, si je déplace un peu plus haut le "print url":

Code : Tout sélectionner

if voltage is not None:
    print('Voltage={0:0.1f}V'.format(ina.voltage())
   print (url)
   url ='/json.htm?type=command&param=udevice&idx='+str(domoticz_idx)
    url+ ='&nvalue=0&svalue='
    url+ =str('{0:0.1f};0').format(voltage)
    maj_widget(url)
L'erreur se déplace et pointe maintenant sur print:
File "currentsensor.py", line 42
print (url)
^
SyntaxError: invalid syntax
C'est compliqué, non?
A+
Raspberry PI5+ 1WIRE + I2C +ESP8266 +esp32
Répondre