Created
August 25, 2018 14:50
-
-
Save raspberrytipsnl/74a28bb1b64a60b8313c13fec85a43ca to your computer and use it in GitHub Desktop.
Goodwe data LCD display
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment