Skip to content

Python script to monitor Huawei Sun2000 inverter and send data to emoncms, jeedom, pvoutput, bdpv

Notifications You must be signed in to change notification settings

sosandroid/sun2000_modbus

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

10 Commits
 
 
 
 
 
 
 
 

Repository files navigation

Sun2000 Modbus

Ce script Python connecte un onduleur Huawei Sun2000 via ModbusTCP pour lire les différents registres de l'onduleur et récupérer les données. Elles sont mise en forme et transmises à EmonCMS, Jeedom, PVOutput.org et/ou BDPV.fr

L'onduleur Sun2000 de Huawei propose une interface ModbusTCP. Il faut l'activer depuis l'application FusionSolar pour qu'elle soit accessible par tous. Le fichier de configuration permet de l'adapter à votre installation.

Pour ceux qui souhaitent aller plus loin, la doc Huawei et ModbusTool a bien servi pour vérifier la lecture correcte des données via le script Python.

Attention, la partie Jeedom n'est pas testée

Prérequis

  • Python 3.10+
  • pyModbus
  • à minima, un des quatre comptes ci-dessous
    • optionnel compte pvoutput.org
    • optionnel compte Emoncms
    • optionnel compte BDPV.fr
    • optionnel compte Jeedom
  • Interface Modbus activée sur l'onduleur

Installation

Python3

Python est proposé par défaut sur un serveur Ubuntu, veillez à le mettre à jour. Nous avons développé et testé avec une version 3.10

sudo apt update
sudo apt -y upgrade

Installez pip

sudo apt install -y python3-pip

pyModbus

C'est la biblothèque qui permet de communiquer avec l'onduleur.

sudo pip install pymodbus

Sun2000_modbus

Copiez le fichier sun2000_modbus.py et sun2000-sample.conf dans votre dossier /home/<user>

Le fichier de configuration

Le fichier de configuration se personnalise de la manière suivante

La partie general permet de

  • modbusdebug : active le debug de la bibliothèque Modbus
  • debug : active le renvoi des données lues et du dialogue avec les plateformes
  • senddata : active l'envoi réel des données (pour toutes les plateformes
[general]
#Manage debug level
modbusdebug = False
debug = True
senddata = False

La partie emoncms se personnalise avec:

  • Activation ou non de cette partie
  • L'adresse du serveur Emoncms (IP ou nom de domaine, http ou https)
  • La clef d'API de votre compte
  • Le nom du node sur lequel poster les données
[emoncms]
enabled = True
#set your EmonCMS address, api key, nodename, input labels
url = http://127.0.0.1/input/post
apikey = your-api-key
nodename = your-node-name

La partie jeedom se personnalise avec:

  • Activation ou non de cette partie
  • L'adresse du serveur Jeedom (IP ou nom de domaine, http ou https)
  • La clef d'API de votre compte
  • Le nom de la variable Puissance Instantannée
  • Le nom de la variable Energie du jour
  • Le nom de la variable Energie depuis démarrage
  • Le nom de la variable Température interne
[jeedom]
enabled = False
url = http://127.0.0.1/core/api/jeeApi.php
apikey = your-api-key
instantpowername = your-variable-name
dailyenergyname = your-variable-name
alltimeenergyname = your-variable-name
internaltempname = your-variable-name

La partie PVOutput.org

  • Activation ou non de cette partie
  • votre clef d'API pour poster les données
  • l'ID du site déclaré dans PVOutput
  • Le nombre d'envoi par heure en fonction de la souscription ou non
[pvoutput]
enabled = True
url = https://pvoutput.org/service/r2/addstatus.jsp
apikey = your-api-key
siteid = site-id-interger
#300 if paid plan. To be adapted to your setup
hitsperhour = 60
#used to manage next update according to above parameter - updates after each call
nextapicall_timestamp = 0

La partie BDPV

  • Activation ou non de cette partie
  • Votre nom d'utilisateur
  • Votre clef d'API
  • L'heure à laquelle envoyer l'index une fois par jour - exprimé en secondes depuis minuit
[bdpv]
enabled = True
url = https://www.bdpv.fr/webservice/majProd/expeditionProd_v3.php
user = your-user
api_key = you-api-key
source = perso
# 'onduleur' or 'compteur'
typereleve = onduleur
#Each day 2:00 am
dailyhour = 7200
#used to manage next update according to above parameter - updates after each call
nextapicall_timestamp = 0

La partie sun2000_ se personnalise avec son adresse IP uniquement. Si vous le désactivez (enabled = False) des données nulles seront envoyées.

[sun2000]
enabled = True
#Set your Sun2000 IP address
address = 127.0.0.1
port = 502
unit = 1
#Start register
registers_start = 32069
#Number of registers read
registers_len = 47
#Indexes in modbus response
voltagel1_index = 0
voltagel2_index = 1
voltagel3_index = 2
voltage_ratio = 10
currentl1_index = 3
currentl2_index = 5
currentl3_index = 7
current_ratio = 1000
internaltemp_index = 18
internaltemp_ratio = 10
dailyenergy_index = 45
dailyenergy_ratio = 100
lifeenergy_index = 37
lifeenergy_ratio = 100
activepower_index = 11
activepower_ratio = 1000
gridfrequency_index = 16
gridfrequency_ratio = 100
efficiency_index = 17
efficiency_ratio = 100
devicestatus_index = 20
devicestatus_ratio = 1

Sauvegardez ce fichier sous le nom sun2000.conf à coté du script.

Fonctionnement

Test

Modifiez les droits pour permettre l'exécution

chmod a+x sun2000_modbus.py

Lancez le script

python3 ./sun2000_modbus.py

Vous devriez obtenir une réponse comme cella là :

{'InstantPower': 0.0, 'InternalTemp': 0.0, 'AllTimeEnergy': 4239.09, 'DailyEnergy': 20.36, 'VoltageL1': 0.0, 'VoltageL2': 0.0, 'VoltageL3': 0.0, 'CurrentL1': 0.0, 'CurrentL2': 0.0, 'CurrentL3': 0.0, 'ActivePower': 0.0, 'GridFrequency': 0.0, 'Efficiency': 0.0, 'DeviceStatusCode': '0xa000'}

Emondata: {'PUI_PROD': 0.0, 'TEMP_INT': 0.0, 'AllTimeEnergy': 4239.09, 'DailyEnergy': 20.36, 'VoltageL1': 0.0, 'VoltageL2': 0.0, 'VoltageL3': 0.0, 'CurrentL1': 0.0, 'CurrentL2': 0.0, 'CurrentL3': 0.0, 'ActivePower': 0.0, 'GridFrequency': 0.0, 'Efficiency': 0.0}

Emon data sent <Response [200]>

Elle donne les données lues sur l'onduleur, la mise en forme EmonCMS, le résultat de l'envoi. Si PVOutput et BDPV sont actifs, les données transmises sont également affichées ainsi que le résultat de transmission.
Vérifiez que les données arrivent correctement sur chaque plateforme. Si c'est OK, il suffit d'automatiser

Automatisation

Désactivez le mode débug dans le fichier de configuration.

Vérifiez le chemin complet dans lequel se trouve le script. Comme vu ci-dessous, dans notre cas nous sommes dans /home/emoncms/onduleur

emoncms@emoncms:~/onduleur$ pwd
/home/emoncms/onduleur

Créer un fichier sun2000.sh dans lequel vous ajoutez les lignes ci-dessous (à adapter). Appelé chaque minute, il lance 4 exécutions séparées de 15 secondes.

#!/bin/bash
/usr/bin/python3 /home/emoncms/onduleur/sun2000_modbus.py &
sleep 15 && /usr/bin/python3 /home/emoncms/onduleur/sun2000_modbus.py &
sleep 30 && /usr/bin/python3 /home/emoncms/onduleur/sun2000_modbus.py &
sleep 45 && /usr/bin/python3 /home/emoncms/onduleur/sun2000_modbus.py &

Rendez le exécutable chmod a+x sun2000.sh Vérifiez le fonctionnement ./sun2000.sh, 4 jeux de données devraient arriver en 1 minute.

Ajoutez le au crontab crontab -e
* * * * * /usr/bin/sh /home/emoncms/onduleur/sun2000.sh

C'est terminé, les données arrivent toutes les 15 secondes.

A faire

  • Améliorer le script en diminuant les appels Global
  • Mieux utiliser la variable Config pour en faire un seul élément

About

Python script to monitor Huawei Sun2000 inverter and send data to emoncms, jeedom, pvoutput, bdpv

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published