From 492b866fe34e87875dbbb2bc7cc24357d0f8d87e Mon Sep 17 00:00:00 2001 From: bohdan-s Date: Mon, 16 Jan 2023 16:31:32 +1100 Subject: [PATCH] Move JSON into Webserver, readonly config site --- SunGather/exports/jsonserver.py | 51 --------------------- SunGather/exports/webserver.py | 79 ++++++++++++++++++++++++++------- 2 files changed, 63 insertions(+), 67 deletions(-) delete mode 100644 SunGather/exports/jsonserver.py diff --git a/SunGather/exports/jsonserver.py b/SunGather/exports/jsonserver.py deleted file mode 100644 index 8cf09a8..0000000 --- a/SunGather/exports/jsonserver.py +++ /dev/null @@ -1,51 +0,0 @@ -from http.server import BaseHTTPRequestHandler, HTTPServer -import json -from threading import Thread -from version import __version__ - - -import logging - -class export_jsonserver(object): - html_body = "Pending Data Retrieval" - def __init__(self): - False - - # Configure Webserver - def configure(self, config, inverter): - try: - self.webServer = HTTPServer(('', config.get('port',8082)), MyServer) - self.t = Thread(target=self.webServer.serve_forever) - self.t.daemon = True # Make it a deamon, so if main loop ends the webserver dies - self.t.start() - logging.info(f"JSON-Export: Configured") - except Exception as err: - logging.error(f"JSON-Export: Error: {err}") - return False - return True - - def publish(self, inverter): - json_cache={"registers":{}, "client_config":{}, "inverter_config":{}} - - for register, value in inverter.latest_scrape.items(): - json_cache["registers"][str(inverter.getRegisterAddress(register))]={"register": str(register), "value":str(value), "unit": str(inverter.getRegisterUnit(register))} - - # Client Config - for setting, value in inverter.client_config.items(): - json_cache["client_config"][str(setting)]=str(value) - - # Inverter Config - for setting, value in inverter.inverter_config.items(): - json_cache["inverter_config"][str(setting)]=str(value) - - export_jsonserver.html_body = json.dumps(json_cache) - return True - -class MyServer(BaseHTTPRequestHandler): - def do_GET(self): - self.send_response(200) - self.send_header("Content-type", "application/json") - self.end_headers() - self.wfile.write(bytes(export_jsonserver.html_body, "utf-8")) - def log_message(self, format, *args): - pass diff --git a/SunGather/exports/webserver.py b/SunGather/exports/webserver.py index f4f7778..5a13bcf 100644 --- a/SunGather/exports/webserver.py +++ b/SunGather/exports/webserver.py @@ -1,9 +1,11 @@ from http.server import BaseHTTPRequestHandler, HTTPServer from threading import Thread from version import __version__ +from urllib.parse import parse_qs, urlparse - +import json import logging +import urllib class export_webserver(object): html_body = "Pending Data Retrieval" @@ -22,36 +24,76 @@ class export_webserver(object): except Exception as err: logging.error(f"Webserver: Error: {err}") return False + pending_config = False + config_body = f""" +

SunGather v{__version__}

+

Configuration changes require a restart to take effect!

+
+
+ + """ + for setting, value in inverter.client_config.items(): + config_body += f'' + config_body += f'' + config_body += f'' + for setting, value in inverter.inverter_config.items(): + config_body += f'' + config_body += f'' + config_body += f'' + #config_body += f'
OptionSettingUpdate?
' + config_body += f'Currently ReadOnly, No save function yet :(' + export_webserver.config = config_body + return True def publish(self, inverter): - body = "

SunGather v" + __version__ + "

" - body += "

Need Help? https://github.com/bohdan-s/SunGather

" - body += "

NEW HomeAssistant Add-on: https://github.com/bohdan-s/SunGather

" - body += "" - metrics = "" + json_array={"registers":{}, "client_config":{}, "inverter_config":{}} + metrics_body = "" + main_body = f""" +

SunGather v{__version__}

+

Need Help? https://github.com/bohdan-s/SunGather

+

NEW HomeAssistant Add-on: https://github.com/bohdan-s/SunGather

+ """ + main_body += "
Address
RegisterValue
" for register, value in inverter.latest_scrape.items(): - body += f"" - metrics += f"{str(register)}{{address=\"{str(inverter.getRegisterAddress(register))}\", unit=\"{str(inverter.getRegisterUnit(register))}\"}} {str(value)}\n" - export_webserver.html_body = body + f"
Address
RegisterValue
{str(inverter.getRegisterAddress(register))}{str(register)}{str(value)} {str(inverter.getRegisterUnit(register))}

Total {len(inverter.latest_scrape)} registers" - export_webserver.metrics = metrics + main_body += f"{str(inverter.getRegisterAddress(register))}{str(register)}{str(value)} {str(inverter.getRegisterUnit(register))}" + metrics_body += f"{str(register)}{{address=\"{str(inverter.getRegisterAddress(register))}\", unit=\"{str(inverter.getRegisterUnit(register))}\"}} {str(value)}\n" + json_array["registers"][str(inverter.getRegisterAddress(register))]={"register": str(register), "value":str(value), "unit": str(inverter.getRegisterUnit(register))} + main_body += f"

Total {len(inverter.latest_scrape)} registers" - body = "

" + main_body += "

ConfigurationValue
" for setting, value in inverter.client_config.items(): - body = body + f"" + main_body += f"" + json_array["client_config"][str(setting)]=str(value) for setting, value in inverter.inverter_config.items(): - body = body + f"" - export_webserver.html_body = export_webserver.html_body + body + f"
ConfigurationValue
{str(setting)}{str(value)}
{str(setting)}{str(value)}
{str(setting)}{str(value)}

" + main_body += f"{str(setting)}{str(value)}" + json_array["inverter_config"][str(setting)]=str(value) + main_body += f"

" + export_webserver.main = main_body + export_webserver.metrics = metrics_body + export_webserver.json = json.dumps(json_array) return True class MyServer(BaseHTTPRequestHandler): def do_GET(self): - if self.path == '/metrics': + if self.path.startswith('/metrics'): self.send_response(200) self.send_header("Content-type", "text/plain") self.end_headers() self.wfile.write(bytes(export_webserver.metrics, "utf-8")) + elif self.path.startswith('/config'): + self.send_response(200) + self.send_header("Content-type", "text/html") + self.end_headers() + self.wfile.write(bytes(export_webserver.config, "utf-8")) + parsed_data = parse_qs(urlparse(self.path).query) + logging.info(f"{parsed_data}") + elif self.path.startswith('/json'): + self.send_response(200) + self.send_header("Content-type", "application/json") + self.end_headers() + self.wfile.write(bytes(export_webserver.json, "utf-8")) else: self.send_response(200) self.send_header("Content-type", "text/html") @@ -61,10 +103,15 @@ class MyServer(BaseHTTPRequestHandler): self.wfile.write(bytes('', "utf-8")) self.wfile.write(bytes("", "utf-8")) self.wfile.write(bytes("", "utf-8")) - self.wfile.write(bytes(export_webserver.html_body, "utf-8")) + self.wfile.write(bytes(export_webserver.main, "utf-8")) self.wfile.write(bytes("", "utf-8")) self.wfile.write(bytes("", "utf-8")) + def do_POST(self): + length = int(self.headers['Content-Length']) + post_data = urllib.parse.parse_qs(self.rfile.read(length).decode('utf-8')) + logging.info(f"{post_data}") + self.wfile.write(post_data.encode("utf-8")) def log_message(self, format, *args): pass