Hello!
This thread saved my life, so here's what I did. Morningstar Tristar MPPT 60 with a raspberry pi via LAN and twitter client to keep me updated.
from __future__ import division
from pymodbus.client.sync import ModbusTcpClient
import schedule
import time
import tweepy
CONSUMER_KEY = ""
CONSUMER_SECRET = ""
ACCESS_KEY = ""
ACCESS_SECRET = ""
def get_data():
client = ModbusTcpClient("") #<--- local ip of tristar
client.connect()
rr = client.read_holding_registers(0, 60, unit=1)
client.close()
return rr.registers
def handle_data():
data = get_data()
charge_state = ["START", "NIGHT_CHECK", "DISCONNECT", "NIGHT",
"FAULT", "MPPT", "ABSORPTION", "FLOAT", "EQUALIZE", "SLAVE"]
alarms = ["RTS open", "RTS shorted", "RTS disconnected", "Heatsink temp sensor open",
"Heatsink temp sensor shorted", "High temperature current limit", "Current limit",
"Current offset", "Battery sense out of range", "Battery sense disconnected",
"Uncalibrated", "RTS miswire", "High voltage disconnect", "Undefined",
"system miswire", "MOSFET open", "P12 voltage off", "High input voltage current limit",
"ADC input max", "Controller was reset", "Alarm 21", "Alarm 22", "Alarm 23", "Alarm 24"]
faults = ["overcurrent", "FETs shorted", "software bug", "battery HVD", "array HVD",
"settings switch changed", "custom settings edit", "RTS shorted", "RTS disconnected",
"EEPROM retry limit", "Reserved", " Slave Control Timeout",
"Fault 13", "Fault 14", "Fault 15", "Fault 16"]
if data:
volt_scaling = data[0]
current_scaling = data[2]
battery_voltage = round(data[38] / volt_scaling, 2)
charging_current = round(data[39] / current_scaling, 2)
charging_state = data[50]
target_voltage = data[51]
output_power = data[58]
battery_temp = data[36]
total_kwh = data[56]
alarm = data[46]
fault = data[44]
text = "Battery {} V, temp {} C, power {} W, state {}. Total kWh {}.".format(
battery_voltage, battery_temp, output_power, charge_state[charging_state], total_kwh)
return text
def publish():
try:
text = handle_data()
if text:
auth = tweepy.OAuthHandler(CONSUMER_KEY, CONSUMER_SECRET)
auth.set_access_token(ACCESS_KEY, ACCESS_SECRET)
api = tweepy.API(auth)
api.update_status(text)
except:
pass
schedule.every(10).minutes.do(publish)
while True:
schedule.run_pending()
time.sleep(1)
Twitter: HolboxCalamar10
Hope it is all self-explanatory.
Regards,
Oscar