Raspberry Pi: Goodwe zonnepaneel omvormer uitlezen

Wanneer je zonnepanelen heb geplaatst dan wil je natuurlijk ook weten hoeveel deze aan elektriciteit opbrengen. Bij het plaatsing van zonnepanelen kan een omvormer van het merk Goodwe worden aangesloten op het internet. Hierdoor kun je de opbrengst van de zonnepanelen met behulp van een speciale portal-website of app bekijken.

Als je over een omvormer van het merk Goodwe beschikt dan kun je de statistieken van de omvormer ook met behulp van een Raspberry Pi uitlezen en weergeven op een LCD scherm. Hiervoor maken we gebruik van de Goodwe API en een pythonscript. Voor de weergave van de informatie gebruiken we een LCD scherm van 20×4 karakters.

Gebruikte componenten

20×4 Character LCD met IIC/I2C Backpack Module
Logic Level Shifter Bi-directioneel
10x Dupont verbindingskabel (female/female)

Raspberry Pi Zero, Raspberry Pi 2, Raspberry Pi 3
Raspbian Jessie of hoger

LCD scherm

Een LCD scherm kan op de Raspberry Pi worden aangesloten met behulp van de standaard aanwezige I2C interface. Hoe je het LCD scherm kunt aansluiten lees je terug in een eerdere post op raspberrytips: LCD scherm 20×4 met behulp van I2C aansturen

Goodwe omvormer API

De gegevens van je omvormer kun je heel simpel in je webbrowser op vragen door naar de volgende URL te gaan:

https://eu.goodwe-power.com/Mobile/GetMyPowerStationByUser?userName=RASPBERRYTIPS

GEBRUIKERSNAAM vervang je door de gebruikersnaam waarmee je inlogt in de PV Master app of de Goodwe Portal. Dit kan een gebruikersnaam zijn maar ook een e-mailadres, dit is afhankelijk van hoe het account is aangemaakt.

Als je de goede gebruikersnaam gebruikt krijg je in je webbrowser de data te zien in JSON formaat:

[
{"stationId":"8d7a7806-3dd3-...-9640-c025662d10c0",
"stationName":"Ranselberg",
"station_pic":"/files/20180825135235_8d7a7806-3dd3-...-c025662d10c0.jpg",
"currentPower":"0.464kW",
"capacity":"3.000kW",
"value_eDayTotal":"12.7kWh",
"value_eTotal":"98.4kWh",
"value_dayIncome":"EUR2.92",
"value_totalIncome":"EUR22.63"}
]

stationId ▸ ID van de omvormer.
stationName ▸ Toegekende naam.
station_pic ▸ Foto van het object.

currentPower ▸ Hoeveel kW er op dit moment wordt opgewekt.
capacity ▸ Maximale capaciteit van de omvormer.
value_eDayTotal ▸ Opbrengst huidige dag in kWh.
value_eTotal ▸ Opbrengst sinds in gebruiksname in kWh.

value_dayIncome ▸ Opbrengst huidige dag in euro.
value_totalIncome ▸ Opbrengst huidige dag in euro.

Al deze data kunnen we in Python eenvoudig verwerken en doorsturen naar het aangesloten LCD scherm.

Goodwe data verwerken met python

Met behulp van het eenvoudige onderstaand voorbeeld kun je de waarden inlezen met behulp van JSON, de data kun je hierna verder verwerken in Python.

#!/usr/bin/python
import json
import urllib
try:
jsonfile = json.load(urllib.urlopen('https://eu.goodwe-power.com/Mobile/GetMyPowerStationByUser?userName=GEBRUIKERSNAAM'))
except ValueError:
print 'Error data kan niet geladen worden...'
else:
print 'Current: ' + jsonfile[0]['currentPower']
print 'capacity: ' + jsonfile[0]['capacity']
print 'Today: ' + jsonfile[0]['value_eDayTotal']
print 'Total: ' + jsonfile[0]['value_eTotal']
view raw Goodwe.py hosted with ❤ by GitHub

goodwe omvormer

Goodwe data weergeven op LCD scherm

Het onderstaande script is een uitgebreide versie van het bovenstaande basis script. Het zorgt ervoor dat het aangesloten LCD scherm wordt aangestuurd en dat de informatie wordt weergeven.

goodwe solar LCD 20x4 raspberry pi

Het scherm zal de datum/tijd, currentPower (Power), value_eDayTotal (Today) en value_eTotal (Total) weergeven. Achter currentPower wordt procentueel de currentpower ten opzichte van de capaciteit weergegeven.

De data wordt iedere 60 seconden automatisch ververst, dit kun je eventueel aanpassen in regelnummer 93 ▸ time.sleep(60). Vergeet niet in regelnummer 14 je gebruikersnaam aan te passen!

#!/usr/bin/python
# https://raspberrytips.nl/raspberry-pi-goodwe-zonnepaneel-omvormer/
# 25/08/2018 - Richard IJzermans
import sys
import smbus
import time
import datetime
import json
import urllib
# Vul hier je Goodwe PV master gebruikersnaam in
USERNAME = 'GEBRUIKERSNAAM'
I2C_ADDR = 0x3F # I2C device address
LCD_WIDTH = 20 # Maximum characters per line
LCD_CHR = 1 # Mode - Sending data
LCD_CMD = 0 # Mode - Sending command
LCD_LINE_1 = 0x80 # LCD RAM address for the 1st line
LCD_LINE_2 = 0xC0 # LCD RAM address for the 2nd line
LCD_LINE_3 = 0x94 # LCD RAM address for the 3rd line
LCD_LINE_4 = 0xD4 # LCD RAM address for the 4th line
LCD_BACKLIGHT = 0x08 # On 0X08 / Off 0x00
ENABLE = 0b00000100 # Enable bit
E_PULSE = 0.0005
E_DELAY = 0.0005
bus = smbus.SMBus(1) # Rev 2 Pi uses 1
def lcd_init():
lcd_byte(0x33,LCD_CMD) # 110011 Initialise
lcd_byte(0x32,LCD_CMD) # 110010 Initialise
lcd_byte(0x06,LCD_CMD) # 000110 Cursor move direction
lcd_byte(0x0C,LCD_CMD) # 001100 Display On,Cursor Off, Blink Off
lcd_byte(0x28,LCD_CMD) # 101000 Data length, number of lines, font size
lcd_byte(0x01,LCD_CMD) # 000001 Clear display
time.sleep(E_DELAY)
def lcd_byte(bits, mode):
bits_high = mode | (bits & 0xF0) | LCD_BACKLIGHT
bits_low = mode | ((bits<<4) & 0xF0) | LCD_BACKLIGHT
bus.write_byte(I2C_ADDR, bits_high)
lcd_toggle_enable(bits_high)
bus.write_byte(I2C_ADDR, bits_low)
lcd_toggle_enable(bits_low)
def lcd_toggle_enable(bits):
time.sleep(E_DELAY)
bus.write_byte(I2C_ADDR, (bits | ENABLE))
time.sleep(E_PULSE)
bus.write_byte(I2C_ADDR,(bits & ~ENABLE))
time.sleep(E_DELAY)
def lcd_string(message,line):
message = message.ljust(LCD_WIDTH," ")
lcd_byte(line, LCD_CMD)
for i in range(LCD_WIDTH):
lcd_byte(ord(message[i]),LCD_CHR)
def main():
lcd_init()
while True:
try:
jsonfile = json.load(urllib.urlopen('https://eu.goodwe-power.com/Mobile/GetMyPowerStationByUser?userName='+USERNAME))
except ValueError:
line1 = '***'
line2 = 'Error kan data niet'
line3 = 'inladen...'
line4 = '***'
else:
percent = int(float(jsonfile[0]['currentPower'][:-2]) / (float(jsonfile[0]['capacity'][:-2])/100))
line1 = time.strftime("%d.%m.%Y %H:%M")
line2 = 'Power: ' + jsonfile[0]['currentPower'] + ' ' + str(percent) + '%'
line3 = 'Today: ' + jsonfile[0]['value_eDayTotal']
line4 = 'Total: ' + jsonfile[0]['value_eTotal']
lcd_string( line1 ,LCD_LINE_1)
lcd_string( line2 ,LCD_LINE_2)
lcd_string( line3 ,LCD_LINE_3)
lcd_string( line4 ,LCD_LINE_4)
time.sleep(60)
if __name__ == '__main__':
try:
main()
except KeyboardInterrupt:
pass
finally:
lcd_byte(0x01, LCD_CMD)
view raw goodwe-lcd.py hosted with ❤ by GitHub

Een reactie plaatsen

%d bloggers liken dit: