From cdff42ddd4045e1c7b359991e17c77f99a85b12a Mon Sep 17 00:00:00 2001 From: root Date: Wed, 3 Jun 2026 00:22:57 -0600 Subject: [PATCH] Add sensor fault simulation and health display --- simulator/app.py | 14 +++++ simulator/esp32_sim.py | 40 +++++++++++--- simulator/static/style.css | 16 ++++++ simulator/templates/index.html | 95 ++++++++++++++++++++++++++-------- 4 files changed, 134 insertions(+), 31 deletions(-) diff --git a/simulator/app.py b/simulator/app.py index a9a04f6..773ca2c 100644 --- a/simulator/app.py +++ b/simulator/app.py @@ -68,5 +68,19 @@ def toggle_ignition(): }) +@app.route("/sensor//fault", methods=["POST"]) +def toggle_sensor_fault(name): + failed = esp32.toggle_sensor_fault(name) + + if failed is None: + return jsonify({"success": False, "error": "Unknown sensor"}), 404 + + return jsonify({ + "success": True, + "sensor": name, + "failed": failed + }) + + if __name__ == "__main__": app.run(host="0.0.0.0", port=5000, debug=True) diff --git a/simulator/esp32_sim.py b/simulator/esp32_sim.py index 02ace5a..464b754 100644 --- a/simulator/esp32_sim.py +++ b/simulator/esp32_sim.py @@ -13,6 +13,7 @@ class ESP32Simulator: self.wifi_override_until = 0 self.ignition_on = True + self.failed_sensors = set() self.soc = 82.0 self.last_update = time.time() @@ -43,18 +44,23 @@ class ESP32Simulator: starlink_on = self.relays["starlink"] wifi_override_active = time.time() < self.wifi_override_until + sensor_names = [ + "fridge_zone_1", + "fridge_zone_2", + "rear_seat", + "outside" + ] + temps = { - "fridge_zone_1": self.sensor(36, 2), - "fridge_zone_2": self.sensor(12, 3), - "rear_seat": self.sensor(78, 8), - "outside": self.sensor(88, 8) + "fridge_zone_1": None if "fridge_zone_1" in self.failed_sensors else self.sensor(36, 2), + "fridge_zone_2": None if "fridge_zone_2" in self.failed_sensors else self.sensor(12, 3), + "rear_seat": None if "rear_seat" in self.failed_sensors else self.sensor(78, 8), + "outside": None if "outside" in self.failed_sensors else self.sensor(88, 8) } sensor_health = { - "fridge_zone_1": True, - "fridge_zone_2": True, - "rear_seat": True, - "outside": True + name: name not in self.failed_sensors + for name in sensor_names } remaining_ah = round(self.soc, 1) @@ -108,5 +114,23 @@ class ESP32Simulator: self.ignition_on = not self.ignition_on return self.ignition_on + def toggle_sensor_fault(self, name): + valid = { + "fridge_zone_1", + "fridge_zone_2", + "rear_seat", + "outside" + } + + if name not in valid: + return None + + if name in self.failed_sensors: + self.failed_sensors.remove(name) + return False + + self.failed_sensors.add(name) + return True + esp32 = ESP32Simulator() diff --git a/simulator/static/style.css b/simulator/static/style.css index 2626d8a..60eb5bc 100644 --- a/simulator/static/style.css +++ b/simulator/static/style.css @@ -292,3 +292,19 @@ nav button { font-size: 1rem; color: #555; } + + +.sensor-fault { + border-color: #b00020; + background: #2a1010; +} + +.sensor-fault p { + font-size: 1.5rem; + color: #ffdddd; +} + +.sensor-fault small { + color: #ffaaaa; + font-weight: bold; +} diff --git a/simulator/templates/index.html b/simulator/templates/index.html index 20d256b..aaa9cee 100644 --- a/simulator/templates/index.html +++ b/simulator/templates/index.html @@ -35,14 +35,14 @@
-

Fridge A

--°F

-

Fridge B

--°F

-
+

Fridge A

--

OK
+

Fridge B

--

OK
+

👧 Kid Area

-

--°F

+

--

Normal
-

Outside

--°F

+

Outside

--

OK
@@ -66,10 +66,10 @@

Temperatures

-

Fridge Zone 1

--°F

-

Fridge Zone 2

--°F

-

Rear Seat

--°F

-

Outside

--°F

+

Fridge Zone 1

--

+

Fridge Zone 2

--

+

Rear Seat

--

+

Outside

--

@@ -90,6 +90,14 @@ +

Sensor Fault Simulation

+
+ + + + +
+

Alarm Settings