#!/usr/bin/python # -*- coding:utf-8 -*- import sys import os import json config = json.load(open("config.json", "r")) picdir = os.path.join( os.path.dirname(os.path.dirname(os.path.realpath(__file__))), "pic" ) libdir = os.path.join( os.path.dirname(os.path.dirname(os.path.realpath(__file__))), "lib" ) if os.path.exists(libdir): sys.path.append(libdir) import logging from waveshare_epd import epd4in2b_V2 import time from PIL import Image, ImageDraw, ImageFont import traceback from sungrow_websocket import SungrowWebsocket from pprint import pprint from datetime import datetime from time import sleep import os import epaper from PIL import Image, ImageDraw, ImageFont host = config["host"] sg = SungrowWebsocket(host) data = sg.get_data() font24 = ImageFont.truetype(os.path.join(picdir, "Font.ttc"), 24) font18 = ImageFont.truetype(os.path.join(picdir, "Font.ttc"), 18) font35 = ImageFont.truetype(os.path.join(picdir, "Font.ttc"), 35) def build_energyfromstring(data): energyfrom = [] if float(data["config_key_3921"].value) > 0.00: energyfrom.append("Batterie") if float(data["total_dcpower"].value) > 0.00: energyfrom.append("Solar") if float(data["config_key_4060"].value) > 0.00: energyfrom.append("E.ON") energyfrom = ", ".join(energyfrom) return energyfrom def getBatteryAdditionString(drawblack, drawry, data, text): if float(data["config_key_3907"].value) > 0.00: drawblack.text( (font24.getlength(text), 120), " | + " + str(int(float(data["config_key_3907"].value) * 1000)) + " W", font=font24, fill=0, ) elif float(data["config_key_3921"].value) > 0.00: drawry.text( (font24.getlength(text), 120), " | - " + str(int(float(data["config_key_3921"].value) * 1000)) + " W", font=font24, fill=0, ) def getSolarAdditionString(drawblack, drawry, data, text): if float(data["config_key_3907"].value) > 0.00: drawblack.text( (font24.getlength(text), 150), " | + " + str(int(float(data["total_dcpower"].value) * 1000)) + " W", font=font24, fill=0, ) def getEngeryAdditionString(drawblack, drawry, data, text): if float(data["config_key_3907"].value) > 0.00: drawblack.text( (font24.getlength(text), 180), " | + " + str(int(float(data["config_key_4060"].value) * 1000)) + " W", font=font24, fill=0, ) elif float(data["config_key_3921"].value) > 0.00: drawry.text( (font24.getlength(text), 180), " | - " + str(int(float(data["config_key_4060"].value) * 1000)) + " W", font=font24, fill=0, ) def drawToEInc(): try: # epd.init() now = datetime.now() current_time = now.strftime("%H:%M:%S") current_date = now.strftime("%d.%m.%Y") batteryString = ( "Batterie: " + str(int(float(data["config_key_3921"].value) * 1000)) + " W" ) EnergyString = ( "E.ON: " + str(int(float(data["config_key_4060"].value) * 1000)) + " W" ) epd.Clear() HBlackimage = Image.new("1", (epd.width, epd.height), 255) # 298*126 HRYimage = Image.new( "1", (epd.width, epd.height), 255 ) # 298*126 ryimage: red or yellow image drawblack = ImageDraw.Draw(HBlackimage) drawry = ImageDraw.Draw(HRYimage) energyfrom = build_energyfromstring(data) drawblack.text((10, 0), "Engergie von: " + energyfrom, font=font24, fill=0) # drawblack.text((10, 30), build_batterystring(data), font=font24, fill=0) # = build_batterystringEInc(drawblack, 30) drawblack.text( (10, 30), "Batterie Stand: " + str(data["battery_soc"].value) + " %", font=font24, fill=0, ) # if float(data["config_key_3907"].value) > 0.00: # drawblack.text( # (10, 60), # "Batterie lädt mit: " # + str(int(float(data["config_key_3907"].value) * 1000)) # + " W", # font=font24, # fill=0, # ) # elif float(data["config_key_3921"].value) > 0.00: # drawry.text( # (10, 60), # "Batterie entlädt mit: " # + str(int(float(data["config_key_3921"].value) * 1000)) # + " W", # font=font24, # fill=0, # ) drawblack.text( (10, 90), "Momentaner Verbrauch: " + str(int(float(data["load_total_active_power"].value) * 1000)) + " W", font=font24, fill=0, ) drawblack.text( (10, 120), batteryString, font=font24, fill=0, ) getBatteryAdditionString(drawblack, drawry, data, batteryString) drawblack.text( (10, 150), "Solar: " + str(int(float(data["total_dcpower"].value) * 1000)) + " W", font=font24, fill=0, ) # getSolarAdditionString(drawblack, drawry, data) drawblack.text( (10, 180), EnergyString, font=font24, fill=0, ) getEngeryAdditionString(drawblack, drawry, data, EnergyString) drawry.text( (10, 240), str(current_date) + " " + str(current_time), font=font24, fill=0, ) # drawblack.text((10, 0), "hello world " + str(i), font=font24, fill=0) # drawblack.text((10, 20), "4.2inch e-Paper bc", font=font24, fill=0) # drawblack.text((150, 0), "微雪电子", font=font24, fill=0) # drawblack.line((20, 50, 70, 100), fill = 0) # drawblack.line((70, 50, 20, 100), fill = 0) # drawblack.rectangle((20, 50, 70, 100), outline = 0) # drawry.line((165, 50, 165, 100), fill = 0) # drawry.line((140, 75, 190, 75), fill = 0) # drawry.arc((140, 50, 190, 100), 0, 360, fill = 0) # drawry.rectangle((80, 50, 130, 100), fill = 0) # drawry.chord((200, 50, 250, 100), 0, 360, fill = 0) epd.display(epd.getbuffer(HBlackimage), epd.getbuffer(HRYimage)) except IOError as e: print(e) except KeyboardInterrupt: logging.info("ctrl + c:") epd4in2b_V2.epdconfig.module_exit(cleanup=True) exit() def initEInc(): epd = epd4in2b_V2.EPD() epd.init() epd.Clear() return epd if __name__ == "__main__": epd = initEInc() while True: try: data = sg.get_data() except: print("Connection lost") sleep(10) continue if data is not None: drawToEInc() # pprint(data) epd.sleep() sleep(600) # logging.basicConfig(level=logging.DEBUG) # try: # logging.info("epd4in2b_V2 Demo") # epd = epd4in2b_V2.EPD() # logging.info("init and Clear") # epd.init() # epd.Clear() # time.sleep(1) # font24 = ImageFont.truetype(os.path.join(picdir, "Font.ttc"), 24) # font18 = ImageFont.truetype(os.path.join(picdir, "Font.ttc"), 18) # font35 = ImageFont.truetype(os.path.join(picdir, "Font.ttc"), 35) # logging.info("1.Drawing on the Horizontal image...") # i = 0 # while True: # HBlackimage = Image.new("1", (epd.width, epd.height), 255) # 298*126 # HRYimage = Image.new( # "1", (epd.width, epd.height), 255 # ) # 298*126 ryimage: red or yellow image # drawblack = ImageDraw.Draw(HBlackimage) # drawry = ImageDraw.Draw(HRYimage) # drawblack.text((10, 0), "hello world " + str(i), font=font24, fill=0) # # drawblack.text((10, 20), "4.2inch e-Paper bc", font=font24, fill=0) # # drawblack.text((150, 0), "微雪电子", font=font24, fill=0) # # drawblack.line((20, 50, 70, 100), fill = 0) # # drawblack.line((70, 50, 20, 100), fill = 0) # # drawblack.rectangle((20, 50, 70, 100), outline = 0) # # drawry.line((165, 50, 165, 100), fill = 0) # # drawry.line((140, 75, 190, 75), fill = 0) # # drawry.arc((140, 50, 190, 100), 0, 360, fill = 0) # # drawry.rectangle((80, 50, 130, 100), fill = 0) # # drawry.chord((200, 50, 250, 100), 0, 360, fill = 0) # epd.display(epd.getbuffer(HBlackimage), epd.getbuffer(HRYimage)) # time.sleep(2) # epd.init() # epd.Clear() # i += 1