diff --git a/frontend/root/index.html b/frontend/root/index.html
index 928a784..01a18e7 100644
--- a/frontend/root/index.html
+++ b/frontend/root/index.html
@@ -95,6 +95,9 @@
Inverter GUI
+
+ {{ error.error_message }}
+
@@ -105,14 +108,18 @@
Output Current
-
{{ output_current }} A
+
+ {{ state.output_current }} A
+
Output Voltage
-
{{ output_voltage }} V
+
+ {{ state.output_voltage }} V
+
@@ -120,7 +127,7 @@
Output Frequency
- {{ output_frequency }} Hz
+ {{ state.output_frequency }} Hz
@@ -128,7 +135,9 @@
Output Power
-
{{ output_power }} W
+
+ {{ state.output_power }} W
+
@@ -136,14 +145,18 @@
Input Current
-
{{ input_current }} A
+
+ {{ state.input_current }} A
+
Input Voltage
-
{{ input_voltage }} V
+
+ {{ state.input_voltage }} V
+
@@ -151,7 +164,7 @@
Input Frequency
- {{ input_frequency }} Hz
+ {{ state.input_frequency }} Hz
@@ -159,7 +172,9 @@
Input Power
-
{{ input_power }} W
+
+ {{ state.input_power }} W
+
@@ -168,7 +183,7 @@
Battery Current
- {{ battery_current }} A
+ {{ state.battery_current }} A
@@ -177,7 +192,7 @@
Battery Voltage
- {{ battery_voltage }} V
+ {{ state.battery_voltage }} V
@@ -185,14 +200,18 @@
Battery Charge
-
{{ battery_charge }} %
+
+ {{ state.battery_charge }} %
+
Battery Power
-
{{ battery_power }} W
+
+ {{ state.battery_power }} W
+
@@ -207,7 +226,7 @@
@@ -215,7 +234,7 @@
@@ -223,7 +242,7 @@
@@ -231,7 +250,7 @@
@@ -239,7 +258,7 @@
@@ -250,7 +269,7 @@
@@ -258,7 +277,7 @@
@@ -266,7 +285,7 @@
diff --git a/frontend/root/js/controller.js b/frontend/root/js/controller.js
index 50deeae..73223a6 100644
--- a/frontend/root/js/controller.js
+++ b/frontend/root/js/controller.js
@@ -1,69 +1,90 @@
-function loadContent() {
- var conn;
+var app;
+const timeoutMax = 30000;
+const timeoutMin = 1000;
+var timeout = timeoutMin;
- var app = new Vue({
+function loadContent() {
+ app = new Vue({
el: "#app",
data: {
- output_current: null,
- output_voltage: 0,
- output_frequency: 0,
- output_power: 0,
- input_current: 0,
- input_voltage: 0,
- input_frequency: 0,
- input_power: 0,
- battery_current: 0,
- battery_voltage: 0,
- battery_charge: 0,
- battery_power: 0,
- led_mains: "dot-off",
- led_absorb: "dot-off",
- led_bulk: "dot-off",
- led_float: "dot-off",
- led_inverter: "dot-off",
- led_overload: "dot-off",
- led_bat_low: "dot-off",
- led_over_temp: "dot-off"
+ error: {
+ has_error: false,
+ error_message: ""
+ },
+ state: {
+ output_current: null,
+ output_voltage: 0,
+ output_frequency: 0,
+ output_power: 0,
+ input_current: 0,
+ input_voltage: 0,
+ input_frequency: 0,
+ input_power: 0,
+ battery_current: 0,
+ battery_voltage: 0,
+ battery_charge: 0,
+ battery_power: 0,
+ led_map: [
+ { led_mains: "dot-off" },
+ { led_absorb: "dot-off" },
+ { led_bulk: "dot-off" },
+ { led_float: "dot-off" },
+ { led_inverter: "dot-off" },
+ { led_overload: "dot-off" },
+ { led_bat_low: "dot-off" },
+ { led_over_temp: "dot-off" }
+ ]
+ }
}
});
+ connect();
+}
+
+function connect() {
if (window["WebSocket"]) {
- conn = new WebSocket("ws://" + document.location.host + "/ws");
+ var conn = new WebSocket(getURI());
conn.onclose = function(evt) {
- var item = document.createElement("a");
- item.innerHTML = "Connection closed.";
+ app.error.has_error = true;
+ app.error.error_message =
+ "Server not reachable. Trying to reconnect in " +
+ timeout / 1000 +
+ " second(s).";
+
+ console.log(app.error.error_message, evt.reason);
+ setTimeout(function() {
+ connect();
+ }, timeout);
+ timeout = timeout * 2;
+ if (timeout > timeoutMax) {
+ timeout = timeoutMax;
+ }
+ };
+
+ conn.onopen = function(evt) {
+ timeout = timeoutMin;
+ app.error.has_error = false;
};
conn.onmessage = function(evt) {
var update = JSON.parse(evt.data);
- console.log(update);
- app.output_current = update.output_current;
- app.output_voltage = update.output_voltage;
- app.output_frequency = update.output_frequency;
- app.output_power = update.output_power;
-
- app.input_current = update.input_current;
- app.input_voltage = update.input_voltage;
- app.input_frequency = update.input_frequency;
- app.input_power = update.input_power;
-
- app.battery_charge = update.battery_charge;
- app.battery_voltage = update.battery_voltage;
- app.battery_power = update.battery_power;
- app.battery_current = update.battery_current;
-
- leds = update.led_map;
- app.led_mains = leds.led_mains;
- app.led_absorb = leds.led_absorb;
- app.led_bulk = leds.led_bulk;
- app.led_float = leds.led_float;
- app.led_inverter = leds.led_inverter;
- app.led_overload = leds.led_overload;
- app.led_bat_low = leds.led_bat_low;
- app.led_over_temp = leds.led_over_temp;
+ app.state = update;
};
} else {
- var item = document.createElement("a");
- item.innerHTML = "Your browser does not support WebSockets.";
+ app.error.has_error = true;
+ app.error.error_message = "Our browser does not support WebSockets.";
}
}
+
+function getURI() {
+ var loc = window.location,
+ new_uri;
+ if (loc.protocol === "https:") {
+ new_uri = "wss:";
+ } else {
+ new_uri = "ws:";
+ }
+ new_uri += "//" + loc.host;
+ new_uri += loc.pathname + "ws";
+ return new_uri;
+}