diff --git a/custom_50x/solar_monitor.py b/custom_50x/solar_monitor.py new file mode 100644 index 0000000..fddbf72 --- /dev/null +++ b/custom_50x/solar_monitor.py @@ -0,0 +1,68 @@ +#!/usr/bin/python3 +# -*- coding: utf-8 -*- + +# https://github.com/karioja/vedirect +# Command: python3 solar_monitor.py --port /dev/ttyUSB0 + +import argparse +from vedirect import Vedirect + +from datetime import datetime + +# DB 1 is used as DB 0 is used by mastodon +import redis +r = redis.Redis(host='localhost', port=6379, db=1, decode_responses=True) + +import logging +logging.basicConfig(encoding='utf-8', level=logging.INFO) + +from apscheduler.schedulers.background import BackgroundScheduler +scheduler = BackgroundScheduler() +scheduler.start() + +def print_data_callback(packet): + r.set('batt_v', packet['V']) + r.set('main_current', packet['I']) + r.set('panel_voltage',packet['VPV']) + r.set('panel_power',packet['PPV']) + r.set('load_current',packet['IL']) + r.set('yield_today',packet['H20']) + r.set('max_power_today',packet['H21']) + r.set('yield_yesterday',packet['H22']) + r.set('max_power_yesterday',packet['H23']) + +def write_html(): + batt_v_V = int(r.get('batt_v')) / 1000 + main_current = r.get('main_current') + panel_voltage = int(r.get('panel_voltage')) / 1000 + panel_power = r.get('panel_power') + load_current = int(r.get('load_current')) / 1000 + yield_today = int(r.get('yield_today')) / 100 + max_power_today = r.get('max_power_today') + load_power = load_current * batt_v_V + + Func = open("/usr/share/nginx/html/custom_50x.html","w") + # Adding input data to the HTML file + Func.write("\n
\nsolarcene.community is a solar powered webserver, if you are seeing this page it means that it is currently sleeping (as the battery is low), once the sun comes up it will be back online so please check back tomorrow.
\n \ + \nBattery Voltage | {}V |
Panel Voltage | {}V |
Panel Power | {}W |
Load Power | {:.2f}W |
Last update: {} UTC
".format(batt_v_V, panel_voltage, panel_power, load_power, datetime.utcnow().strftime('%Y-%m-%d %H:%M:%S') )) + + # Saving the data into the HTML file + Func.close() + +if __name__ == '__main__': + + parser = argparse.ArgumentParser(description='Process VE.Direct protocol') + parser.add_argument('--port', help='Serial port') + parser.add_argument('--timeout', help='Serial port read timeout', type=int, default='60') + args = parser.parse_args() + + scheduler.add_job(write_html, 'interval', minutes=10) + + ve = Vedirect(args.port, args.timeout) + logging.info('Starting...') + ve.read_data_callback(print_data_callback) + + logging.info('Exit') \ No newline at end of file