Problem Installing EPEVER Controller / PC Tools Software

Peter Gambee

New member
Joined
Jul 28, 2019
Messages
2
Help!!

I'm attempting to install the EPEVER PC Tools softwre for my Tracer MPPT solar charge controller. I've downloaded everything. Installed the drivers. I click onthe PC Tools installer, it opens and then halts. I get this setup error message "Not enough storage is available to process this command."

I'm running windows 7 / 64 on an hp with an intel core i5, 16 G of ram and a 500 G Hard Drive which is FAR from full. How much "storage" does this software need? Is there a way I can get this software up and running? Is there an older Windows version of the software that doesn't require so much "storage." Am I better off just buying an inexpensive Android device and running the software off of that platform?

I need to set up the controller to charge LiFe 40 A/h batteries.

Thanks

Peter Gambee
 
if you have small coding /PC abilities i can post a very alpha gui to read live data.

nothing that you can use to program It at the Moment.

only to check if atleast It talk to your pc
 
emuland-metroman said:
if you have small coding /PC abilities i can post a very alpha gui to read live data.

nothing that you can use to program It at the Moment.

only to check if atleast It talk to your pc

Ok. I will give it a try. In the meantime, can I get this charge controller to work with LiFe / Lithium batteries? If so, how? I bought it because it was MPPT and could charge Lithium battery systems.

Please send me your gui and I will work with it. Thank you!
 
when you open gui window, you have to set port and ID

ID usually is 1 if you havent changed it.

for COM port you have to check with your pc

Code:
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()
 
Where's the download? I went on their site but the link in the manual wasn't right.
 
In the meantime, can I get this charge controller to work with LiFe / Lithium batteries?

Mppt charge controller (even if it claims to be lithium capable)will only work will with lithium if the battery is in perfect balance, I had to use active balancers on my 4s40p 220ah lifepo4. One thing I found out with my charge controller is I had to set the bulk setting way above the recommended setting. If its too low, the battery will charge very slowly. But if its set too high the bms will trip too early if the battery is out of balance.

You never want the bms to stop the charging, this will cause voltage surges which will destroy anything connected to the battery. Even after I added the active balancers every once in a while the bms would trip to stop charging, I had to get a12 volt voltage stabilizer to protect my devices.

I finally figure how to get lithium to work with any charge controller, I got a better bms. I upgraded to the chargery bms8t, now I don't have to worry about voltage surges. I recommend you get a chargery bms, it will work with any charge controller pwm/mppt. Its in the 100 dollar range but its the best investment you can make for your lithium. With the chargery bms, you don't have to worry too much about all the settings on the controller just set the bulk setting. The bms monitors battery overall voltage/ cell voltage and if it goes out of balance or reaches your cutoff voltage it disconnects the panel (using a mechanical relay). It even has temp sensors and a loud audio alarm, you can check battery voltage on the lcd screen.

If a charge controller can't monitor the lithium individual cell voltage, its no better then a dumb charger. The only charge controller I know that monitors cell balancing is the electrodacus.


image_expors.jpg
 
Back
Top