75 lines
2.4 KiB
Python
75 lines
2.4 KiB
Python
from .dashboard_view_model import format_value, format_bool
|
|
|
|
|
|
class BatteryViewModel:
|
|
def __init__(self, state):
|
|
self.state = state
|
|
|
|
def as_dict(self):
|
|
battery = self.state.battery
|
|
|
|
return {
|
|
"soc": format_value(battery.get("soc"), "%", decimals=0),
|
|
"voltage": format_value(battery.get("voltage"), "V", decimals=1),
|
|
"current": format_value(battery.get("current"), "A", decimals=1),
|
|
"remaining_ah": format_value(battery.get("remaining_ah"), "Ah", decimals=1),
|
|
"runtime_hours": format_value(battery.get("runtime_hours"), " hr", decimals=1),
|
|
"temperature_f": format_value(battery.get("temperature_f"), "°F", decimals=1),
|
|
}
|
|
|
|
|
|
class TempsViewModel:
|
|
SENSOR_LABELS = {
|
|
"fridge_zone_1": "Fridge Zone 1",
|
|
"fridge_zone_2": "Fridge Zone 2",
|
|
"rear_seat": "Rear Seat",
|
|
"outside": "Outside Air",
|
|
}
|
|
|
|
def __init__(self, state):
|
|
self.state = state
|
|
|
|
def as_list(self):
|
|
rows = []
|
|
|
|
for key, label in self.SENSOR_LABELS.items():
|
|
online = self.state.sensor_health.get(key, False)
|
|
temp = self.state.temps.get(key)
|
|
|
|
rows.append({
|
|
"key": key,
|
|
"label": label,
|
|
"temperature": format_value(temp, "°F", decimals=1),
|
|
"status": "OK" if online else "FAULT",
|
|
})
|
|
|
|
return rows
|
|
|
|
|
|
class PowerViewModel:
|
|
def __init__(self, state):
|
|
self.state = state
|
|
|
|
def as_dict(self):
|
|
return {
|
|
"starlink": format_bool(self.state.relays.get("starlink")),
|
|
"fridge": format_bool(self.state.relays.get("fridge")),
|
|
}
|
|
|
|
|
|
class SystemViewModel:
|
|
def __init__(self, state):
|
|
self.state = state
|
|
|
|
def as_dict(self):
|
|
sensor_count = sum(1 for online in self.state.sensor_health.values() if online)
|
|
total_sensors = len(self.state.sensor_health)
|
|
|
|
return {
|
|
"esp32": "Online" if self.state.network.get("uart_connected") else "Unknown",
|
|
"uart": "Connected" if self.state.network.get("uart_connected") else "Disconnected",
|
|
"wifi_api": "Available" if self.state.network.get("wifi_enabled") else "Unavailable",
|
|
"sensors": f"{sensor_count} / {total_sensors} OK",
|
|
"ignition": "On" if self.state.vehicle.get("ignition_on") else "Off",
|
|
}
|