Suivi production sur carte ARM



zener
BDPV
BDPV
Messages : 126
Enregistré le : 26 mai 2017 10:12
BDPV : zener82
Departement/Region : 49
Professionnel PV : Non

Suivi production sur carte ARM

Messagepar zener » 22 mai 2018 22:11

Voici une possibilité pour pousser sa production journalière PV sur BDPV :

Ce que j'ai :
- une cubietruck (carte ARM, identique raspberry). (aujourd'hui je prendrais le dernier raspberry)
- un petit montage pour décoder la téléinformation
- une installation PV 7.2kWc d'autoconsommation en autoconstruction, onduleurs SMA, vente du surplus
- un compteur linky depuis janvier 2018 (mise en service de l'installation)
- 2 onduleurs SMA sunnyboy 3.0 qui permettent l'envoi de la production vers solar-yield ou vers une page publique de sunnyportal.

Je suis sur un linky en mode standard (il a fallu demander au technicien de modifier car les linky sont en mode historique par défaut). Attention, en mode standard, on peut avoir les nouvelles données d'injection, mais le mode standard n'est pas forcément compatible avec un gestionnaire d'énergie installé sur le tableau électrique...

Dans mon cas, je sais décoder le mode standard du linky.
Mais malheur, l'installateur ne m'a pas configuré le mode producteur PV sur la sortie téléinformation.
Pour le moment, je n'ai donc la téléinformation que pour la consommation de la maison (mais le linky est en mode producteur, donc je ne peux voir les infos que sur l'écran).

Il a donc fallu trouver un plan B pour avoir la production PV et l'envoyer sur BDPV. J'ai donc fait un script python qui parse:
- le site solar yield sur lequel j'ai configuré un compte. Le sunnyportal envoyait les données à solaryield. Je récupérais les données de solar yield car il n'y avait pas besoin d'authentification. Ca marchait super jusqu'à ce que le site soit HS ce mois, depuis le 5 mai.
- du coup, depuis, je suis passé sur une page publique à créer depuis le sunnyportal, que je parse tout pareil.

Code : Tout sélectionner

#!/usr/bin/env python

# import libraries
import urllib2
from bs4 import BeautifulSoup
import time
import hashlib
import urllib
#################################################
def bdpv_submit(t,idxWh,submit=True):
  #Envoi de donnees automatique au site BDPV.
  #t: temps en seconde depuis epoch
  #idxWh: production indiquee par le compteur (en Wh)
  #login_bdpv: login BDPV
  #password_bdpv: mot de passe BDPV (qui n'est pas envoye en clair, mais cache dans un hash md5)
  #api_demandeur et api_secret: codes a demander
  #adco: le numero du compteur, mais cela doit etre facultatif
  #submit: mettez False si vous voulez faire des tests.. sans saturer le serveur
  #
  #NB:
  # - envoyer les donnees une fois par jour en fin de nuit pour ne pas saturer le serveur
  # - pour le premier mois, il faut soumettre la production au debut du mois en cours en plus de la production courante
  #
  t=time.strftime("%d%m%Y%H%M",time.localtime(t))
  url="http://www.bdpv.fr/_service/z_teleinfov2.php?util=!!!!!USER_BDPV!!!!!&mdp=!!!!!PASSWORD_BDPV!!!!!&index=%s"%(idxWh)
  if submit:
    result=urllib.URLopener().open(url).read()
    assert int(result.split()[0])>0,"La soumission automatique a ete refusee:"+result
  else:
    # Pour tester
    print url

#################################################
# takeSolarYieldInfo : if yes, take values of solar yield website. Else, take values from sunnyportal public page
takeSolarYieldInfo=False
# installedPowerWc : float with installed power value in kWc : for 7200Wc installed, set installedPowerWc to 7.2
installedPowerWc = 7.2

# specify the url
if takeSolarYieldInfo:
    quote_page = 'http://www.solar-yield.eu/en/!!!!!END_OF_URL_SOLARYIELD!!!!!.html#tabs-3'
else:
    quote_page = 'https://www.sunnyportal.com/Templates/PublicPage.aspx?page=!!!!!ID_PUBLIC_PAGE_SUNNYPORTAL!!!!!'

# query the website and return the html to the variable page
page = urllib2.urlopen(quote_page)

# parse the html using beautiful soap and store in variable soup
soup = BeautifulSoup(page, 'html.parser')

# Take out the <div> of name and get its value
if takeSolarYieldInfo:
    rawData_container = soup.find('div', attrs={'id':'tabs-3'}).findNext('td', attrs={'class':'greybg'}).findNext('td', attrs={'class':'greybg'})
else:
    rawData_container = soup.find('div', attrs={'class':'widgetFooter'}).findNext('span', attrs={'id':'ctl00_ContentPlaceHolder1_PublicPagePlaceholder1_PageUserControl_ctl00_PublicPageLoadFixPage_energyYieldWidget_energyYieldTotalValue'})
rawData = rawData_container.text

# Convert values in Wh (<for solar yield, multiply by 1000 and by installed power kWc><for sunnyportal, multiply by 1000 to change kWh in Wh>
if takeSolarYieldInfo:
    nbWh=int(float(rawData.replace(",", "."))*1000.0*installedPowerWc)
else:
    nbWh=int(float(rawData)*1000.0)

# Log in file for debug
fileToWrite=open("envoiProdPV.log", "w")
fileToWrite.write("%d\n" % nbWh)
fileToWrite.close()

# Print and send to BDPV :)
print nbWh
bdpv_submit(time.time(), "%s" % nbWh)


Ce code nécessite la présence du module python bs4, à installer via la commande:

Code : Tout sélectionner

sudo apt-get install python-bs4


Pour configurer SunnyPortal :
- pour solarYield, bandeau de droite : Configuration -> Caractéristiques de l'installation. Onglet du haut : Partage de données. Activer Sonnenertrag.eu
- pour sunnyPortal, bandeau de droite : Nom de l'installation -> Aperçu de l'installation. Tout en bas de la page, déplier "Configuration- Apercu de l'installation". Cocher "Autoriser l'accès à la page...." et récupérer l'URL à mettre dans le script.

Le script peut être placé dans /etc/cron.daily pour une execution journalière.
Dans mon cas, il fait partie d'un script plus complet qui tourne en boucle 24h/24 et qui à 6h00 envoi les données vers BDPV (6h00 est la fin d'une journée tempo).

J'espère que ce script vous aidera :)

Retourner vers « BDPV : Demande améliorations »