#!/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')