import tkinter as tk
import datetime
import time
import csv
from pathlib import Path
import pymodbus
import serial
import time
from threading import Timer
from pymodbus.client.sync import ModbusSerialClient as ModbusClient
window = tk.Tk()
window.geometry ("1024x768")
window.title("EPSOLAR INTERFACE")
#window.resizable(False,False)
global pvVolts,pvAmps,powerlow,e4,batterlow,loadcurrent,loadwatts,batterytemp,regulatortemp,othertemp,PVmax,PVmin,batterySOC,powerToday,powerMonth,powerYear,powerTot,ports
global client2
#with open('employee_birthday.txt') as csv_file:
# csv_reader = csv.reader(csv_file, delimiter=',')
# line_count = 0
# for row in csv_reader:
# if line_count == 0:
# print(f'Column names are {", ".join(row)}')
# line_count += 1
# else:
# print(f'\t{row[0]} works in the {row[1]} department, and was born in {row[2]}.')
# line_count += 1
# print(f'Processed {line_count} lines.')
percorso=Path('./start.txt')
ports="COM4"
def readModbus():
global client2
global unitID
unitID=regulatorID.get()
unitID=int(unitID)
lblIDSELECT.config(text=unitID)
# read 6 registers starting at 0x3000
result = client2.read_input_registers(0x3100, 1, unit=unitID)
pvVolt = float(result.registers[0] / 100.0)
pvVolts.config(text=pvVolt)
#pvVolts.update()
result = client2.read_input_registers(0x3101, 1, unit=unitID)
pvAmp = float(result.registers[0] / 100.0)
pvAmps.config (text=pvAmp)
result = client2.read_input_registers(0x3102, 1, unit=unitID)
power=float(result.registers[0] / 100.0)
powerlow.config (text=power)
result = client2.read_input_registers(0x3106, 1, unit=unitID)
battery= float(result.registers[0] / 100.0)
batterylow.config (text=battery)
result = client2.read_input_registers(0x331A, 1, unit=unitID)
loadC = float(result.registers[0] / 100.0)
loadcurrent.config(text=loadC)
result = client2.read_input_registers(0x310E, 1, unit=unitID)
loadW = float(result.registers[0] / 100.0)
loadwatts.config(text=loadW)
result = client2.read_input_registers(0x3110, 1, unit=unitID)
batteryT = float(result.registers[0] / 100.0)
batterytemp.config(text=batteryT)
result = client2.read_input_registers(0x3111, 1, unit=unitID)
regulatorT = float(result.registers[0] / 100.0)
regulatortemp.config(text=regulatorT)
result = client2.read_input_registers(0x311B, 1, unit=unitID)
otherT = float(result.registers[0] / 100.0)
othertemp.config(text=otherT)
result = client2.read_input_registers(0x3200, 1, unit=unitID)
btryStatus = float(result.registers[0] / 100.0)
result = client2.read_input_registers(0x3201, 1, unit=unitID)
regulatorstatus = float(result.registers[0] / 100.0)
result = client2.read_input_registers(0x3300, 1, unit=unitID)
PVMax = float(result.registers[0] / 100.0)
PVmax.config(text=PVMax)
result = client2.read_input_registers(0x3301, 1, unit=unitID)
PVMin = float(result.registers[0] / 100.0)
PVmin.config(text=PVMin)
# read the battery SOC
result = client2.read_input_registers(0x311A, 1, unit=unitID)
batterysoc = result.registers[0]
batterySOC.config(text=batterysoc)
result = client2.read_input_registers(0x330C, 1, unit=unitID)
PwrToday = float(result.registers[0] / 100.0)
powerToday.config(text=PwrToday)
result = client2.read_input_registers(0x330E, 1, unit=unitID)
PwrMonth = float(result.registers[0] / 100.0)
powerMonth.config(text=PwrMonth)
result = client2.read_input_registers(0x3310, 1, unit=unitID)
PwrYear = float(result.registers[0] / 100.0)
powerYear.config(text= PwrYear)
result = client2.read_input_registers(0x3312, 1, unit=unitID)
PwrTotal = float(result.registers[0] / 100.0)
powerTot.config(text=PwrTotal)
def tick():
readModbus()
window.after(1000,tick)
def btn1click():
global client2,ports
ports=comport.get()
lblCOMPORTSELECT.config(text=ports)
client2 = ModbusClient(method = 'rtu', port = ports, baudrate = 115200)
client2.connect()
tick()
#window.withdraw()
def btn13click():
pvVolts.delete(0, tk.END)
loadwatts.delete(0, tk.END)
batterytemp.delete(0, tk.END)
pvAmps.delete(0, tk.END)
powerlow.delete(0, tk.END)
loadcurrent.delete(0, tk.END)
# PV STATISTICS
lbl1= tk.Label (text="PV VOLT",font = "Helvetica 9 bold")
lbl1.grid(column=0,row=1 , sticky="WE")
pvVolts = tk.Label(window, bd =2)
pvVolts.grid(column=1,row=1 , sticky="WE")
lbl2= tk.Label (text="PV AMPS",font = "Helvetica 9 bold")
lbl2.grid(column=0,row=2 , sticky="WE")
pvAmps = tk.Label(window, bd =2)
pvAmps.grid(column=1,row=2 , sticky="WE")
lbl3= tk.Label (text="PV WATTS",font = "Helvetica 9 bold")
lbl3.grid(column=0,row=3 , sticky="WE")
powerlow = tk.Label(window, bd =2, text=" ")
powerlow.grid(column=1,row=3 , sticky="WE")
lbl4= tk.Label (text="REGULATOR TEMP",font = "Helvetica 9 bold")
lbl4.grid(column=0,row=4 , sticky="WE")
regulatortemp = tk.Label(window, bd =2)
regulatortemp.grid(column=1,row=4 , sticky="WE")
lbl5= tk.Label (text="ROOM TEMP",font = "Helvetica 9 bold")
lbl5.grid(column=0,row=5 , sticky="WE")
othertemp = tk.Label(window, bd =2)
othertemp.grid(column=1,row=5 , sticky="WE")
lblx= tk.Label (text="",font = "Helvetica 9 bold")
lblx.grid(column=0,row=6 , sticky="WE")
#System STATS
lbl6= tk.Label (text="PV MAX VOLTS",font = "Helvetica 9 bold")
lbl6.grid(column=0,row=7 , sticky="WE")
PVmax= tk.Label(window, bd =2)
PVmax.grid(column=1,row=7 , sticky="WE")
lbl7= tk.Label (text="PV MIN VOLTS",font = "Helvetica 9 bold")
lbl7.grid(column=0,row=8 , sticky="WE")
PVmin = tk.Label(window, bd =2)
PVmin.grid(column=1,row=8 , sticky="WE")
lbl8= tk.Label (text="POW TODAY",font = "Helvetica 9 bold")
lbl8.grid(column=0,row=9 , sticky="WE")
powerToday = tk.Label(window, bd =2)
powerToday.grid(column=1,row=9 , sticky="WE")
lbl9= tk.Label (text="POW MONTH",font = "Helvetica 9 bold")
lbl9.grid(column=3,row=7 , sticky="WE")
powerMonth = tk.Label(window, bd =2)
powerMonth.grid(column=4,row=7 , sticky="WE")
lbl9= tk.Label (text="POW YEAR",font = "Helvetica 9 bold")
lbl9.grid(column=3,row=8 , sticky="WE")
powerYear = tk.Label(window, bd =2)
powerYear.grid(column=4,row=8 , sticky="WE")
lbl9= tk.Label (text="POW TOTAL",font = "Helvetica 9 bold")
lbl9.grid(column=3,row=9 , sticky="WE")
powerTot = tk.Label(window, bd =2)
powerTot.grid(column=4,row=9 , sticky="WE")
#BATTERY STATISTICS
lbl11= tk.Label (text="BATTERY WATTS",font = "Helvetica 9 bold")
lbl11.grid(column=3,row=1 , sticky="WE")
batterylow = tk.Label(window, bd =2)
batterylow.grid(column=4,row=1 , sticky="WE")
lbl12= tk.Label (text="BATTERY VOLTAGE",font = "Helvetica 9 bold")
lbl12.grid(column=3,row=2 , sticky="WE")
loadcurrent = tk.Label(window, bd =2,text="")
loadcurrent.grid(column=4,row=2 , sticky="WE")
#lbllogo= tk.Label (text="insertlogo",font = "Helvetica 9 bold")
#lbllogo.grid(column=0,row=1 , sticky="WE")
lbl13= tk.Label (text="LOAD WATTS",font = "Helvetica 9 bold")
lbl13.grid(column=3,row=3 , sticky="WE")
loadwatts = tk.Label(window, bd =2,text="")
loadwatts.grid(column=4,row=3 , sticky="WE")
lbl14= tk.Label (text="BATTERY TEMP" ,font = "Helvetica 9 bold")
lbl14.grid(column=3,row=4 , sticky="WE")
batterytemp = tk.Label(window, bd =2,text="")
batterytemp.grid(column=4,row=4 , sticky="WE")
lbl15= tk.Label (text="BATTERY SOC %" ,font = "Helvetica 9 bold")
lbl15.grid(column=3,row=5 , sticky="WE")
batterySOC = tk.Label(window, bd =2,text=" ")
batterySOC.grid(column=4,row=5 , sticky="WE")
# buttons
btn1 = tk.Button(window,height=2, width=7, text="START",padx=2 ,pady=2,command=btn1click )
btn1.grid(column=7, row=4)
lblcom= tk.Label (text="INSERT COM PORT" ,font = "Helvetica 9 bold")
lblcom.grid(column=5,row=4 , sticky="WE")
lblID= tk.Label (text="INSERT REGULATOR ID" ,font = "Helvetica 9 bold")
lblID.grid(column=5,row=5 , sticky="WE")
comport= tk.Entry(window, bd =2)
comport.grid(column=6,row=4 , sticky="WE")
regulatorID= tk.Entry(window, bd =2)
regulatorID.grid(column=6,row=5 , sticky="WE")
lblCOMPORTSELECT= tk.Label (text="PORT" ,font = "Helvetica 9 bold")
lblCOMPORTSELECT.grid(column=5,row=6 , sticky="WE")
lblIDSELECT= tk.Label (text="ID" ,font = "Helvetica 9 bold")
lblIDSELECT.grid(column=6,row=7 , sticky="WE")
def select(value,e):
if value == "BACK":
#allText = entry.get()[:-1]
#entry.delete(0, tkinter,END)
#entry.insert(0,allText)
e.delete(len(e.get())-1,tk.END)
elif value == "SPACE":
e.insert(tk.END, ' ')
elif value == "SHIFT":
e.insert(tk.END, ' ')
else :
e.insert(tk.END,value)
buttons = [
'1', '2', '3', '4', '5', '6', '7', '8', '9','0','',
'Q', 'W', 'E', 'R', 'T', 'Y', 'U', 'I', 'O', 'P','BACK',
'A', 'S', 'D', 'F', 'G', 'H', 'J', 'K', 'L','-','',
'Z', 'X', 'C', 'V', 'B', 'N', 'M', '', '','_','SPACE',
]
def HosoPop(e):
varRow = 2
varColumn = 6
for button in buttons:
command = lambda x=button: select(x,e)
if button == "SPACE" or button == "SHIFT" or button == "BACK":
tk.Button(window,text= button,height=2,width=6, bg="#3c4987", fg="#ffffff",
activebackground = "#ffffff", activeforeground="#3c4987", relief='raised', padx=1,
pady=1, bd=1,command=command).grid(row=varRow,column=varColumn)
else:
tk.Button(window,text= button,height=2,width=4,bg="#3c4987", fg="#ffffff",
activebackground = "#ffffff", activeforeground="#3c4987", relief='raised', padx=1,
pady=1, bd=1,command=command).grid(row=varRow,column=varColumn)
varColumn +=1
if varColumn > 16 and varRow == 2:
varColumn = 6
varRow+=1
if varColumn > 16 and varRow == 3:
varColumn = 6
varRow+=1
if varColumn > 16 and varRow == 4:
varColumn = 6
varRow+=1
#d = OSKeyboard(window, 'On Screen Keyboard', 800, 100)
#pvVolts.bind("<Button-1>", lambda e: HosoPop(pvVolts))
#pvAmps.bind("<Button-1>", lambda e: HosoPop(pvAmps))
#powerlow.bind("<Button-1>", lambda e: HosoPop(powerlow))
#loadcurrent.bind("<Button-1>", lambda e: HosoPop(loadcurrent))
#loadwatts.bind("<Button-1>", lambda e: HosoPop(loadwatts))
#batterytemp.bind("<Button-1>", lambda e: HosoPop(batterytemp))
#if __name== "__main__":
window.mainloop()