diff --git a/simulator/static/style.css b/simulator/static/style.css
index e590a02..7a8f1c3 100644
--- a/simulator/static/style.css
+++ b/simulator/static/style.css
@@ -206,3 +206,36 @@ nav button {
color: #300;
font-weight: bold;
}
+
+
+.settings-list {
+ background: #222;
+ border: 1px solid #333;
+ border-radius: 14px;
+ padding: 16px;
+}
+
+.settings-list label {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ gap: 16px;
+ padding: 12px 0;
+ font-size: 1.1rem;
+ border-bottom: 1px solid #333;
+}
+
+.settings-list label:last-of-type {
+ border-bottom: none;
+}
+
+.settings-list input {
+ width: 90px;
+ font-size: 1.2rem;
+ padding: 10px;
+ border-radius: 8px;
+ border: 1px solid #555;
+ background: #111;
+ color: white;
+ text-align: center;
+}
diff --git a/simulator/templates/index.html b/simulator/templates/index.html
index 093daae..0218026 100644
--- a/simulator/templates/index.html
+++ b/simulator/templates/index.html
@@ -76,6 +76,31 @@
WiFi Override --
+
+ Alarm Settings
+
+
+
+
+
+
+
+
+
+
+
@@ -92,6 +117,13 @@ let relayState = {};
let activeAlarmKey = null;
let acknowledgedAlarms = new Set();
+let alarmConfig = {
+ rear_seat_warning: 85,
+ rear_seat_critical: 95,
+ fridge_warm: 45,
+ battery_low: 20
+};
+
function showScreen(id) {
document.querySelectorAll('.screen').forEach(screen => {
screen.classList.remove('active');
@@ -106,13 +138,13 @@ function onOff(value) {
function checkAlarms(data) {
const alarms = [];
- if (data.temps.rear_seat >= 95) {
+ if (data.temps.rear_seat >= alarmConfig.rear_seat_critical) {
alarms.push({
key: 'rear_seat_critical',
title: 'REAR SEAT TEMP CRITICAL',
message: `${data.temps.rear_seat}°F detected near car seat area`
});
- } else if (data.temps.rear_seat >= 85) {
+ } else if (data.temps.rear_seat >= alarmConfig.rear_seat_warning) {
alarms.push({
key: 'rear_seat_warning',
title: 'REAR SEAT TEMP HIGH',
@@ -120,7 +152,7 @@ function checkAlarms(data) {
});
}
- if (data.temps.fridge_zone_1 >= 45) {
+ if (data.temps.fridge_zone_1 >= alarmConfig.fridge_warm) {
alarms.push({
key: 'fridge_zone_1_warm',
title: 'FRIDGE ZONE 1 WARM',
@@ -128,7 +160,7 @@ function checkAlarms(data) {
});
}
- if (data.temps.fridge_zone_2 >= 45) {
+ if (data.temps.fridge_zone_2 >= alarmConfig.fridge_warm) {
alarms.push({
key: 'fridge_zone_2_warm',
title: 'FRIDGE ZONE 2 WARM',
@@ -136,7 +168,7 @@ function checkAlarms(data) {
});
}
- if (data.battery.soc <= 20) {
+ if (data.battery.soc <= alarmConfig.battery_low) {
alarms.push({
key: 'battery_low',
title: 'BATTERY LOW',
@@ -167,6 +199,33 @@ function acknowledgeAlarm() {
document.getElementById('alarmOverlay').classList.add('hidden');
}
+function loadAlarmSettings() {
+ const saved = localStorage.getItem('alarmConfig');
+
+ if (saved) {
+ alarmConfig = JSON.parse(saved);
+ }
+
+ document.getElementById('rearWarningInput').value = alarmConfig.rear_seat_warning;
+ document.getElementById('rearCriticalInput').value = alarmConfig.rear_seat_critical;
+ document.getElementById('fridgeWarmInput').value = alarmConfig.fridge_warm;
+ document.getElementById('batteryLowInput').value = alarmConfig.battery_low;
+}
+
+function saveAlarmSettings() {
+ alarmConfig = {
+ rear_seat_warning: Number(document.getElementById('rearWarningInput').value),
+ rear_seat_critical: Number(document.getElementById('rearCriticalInput').value),
+ fridge_warm: Number(document.getElementById('fridgeWarmInput').value),
+ battery_low: Number(document.getElementById('batteryLowInput').value)
+ };
+
+ localStorage.setItem('alarmConfig', JSON.stringify(alarmConfig));
+
+ acknowledgedAlarms.clear();
+ alert('Alarm settings saved');
+}
+
async function loadStatus() {
const res = await fetch('/status');
const data = await res.json();
@@ -227,6 +286,7 @@ async function enableWifi() {
loadStatus();
}
+loadAlarmSettings();
loadStatus();
setInterval(loadStatus, 2000);