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!
+ '
+ 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 += "| Address | | Register | Value |
"
- 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 | | Register | Value |
"
for register, value in inverter.latest_scrape.items():
- body += f"| {str(inverter.getRegisterAddress(register))} | {str(register)} | {str(value)} {str(inverter.getRegisterUnit(register))} |
"
- metrics += f"{str(register)}{{address=\"{str(inverter.getRegisterAddress(register))}\", unit=\"{str(inverter.getRegisterUnit(register))}\"}} {str(value)}\n"
- export_webserver.html_body = body + f"
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 = "
| Configuration | Value |
"
+ main_body += "| Configuration | Value |
"
for setting, value in inverter.client_config.items():
- body = body + f"| {str(setting)} | {str(value)} |
"
+ main_body += f"| {str(setting)} | {str(value)} |
"
+ json_array["client_config"][str(setting)]=str(value)
for setting, value in inverter.inverter_config.items():
- body = body + f"| {str(setting)} | {str(value)} |
"
- export_webserver.html_body = export_webserver.html_body + body + f"
"
+ 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("