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

+

@@ -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 @@
Mains
- +
@@ -215,7 +234,7 @@
Absorption
- +
@@ -223,7 +242,7 @@
Bulk
- +
@@ -231,7 +250,7 @@
Float
- +
@@ -239,7 +258,7 @@
Inverter
- +
@@ -250,7 +269,7 @@
Overload
- +
@@ -258,7 +277,7 @@
Low Battery
- +
@@ -266,7 +285,7 @@
Temperature
- +
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; +}