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);