60 lines
1.8 KiB
Python
60 lines
1.8 KiB
Python
def format_value(value, suffix="", decimals=1, missing="--"):
|
|
if value is None:
|
|
return missing
|
|
|
|
if isinstance(value, int):
|
|
return f"{value}{suffix}"
|
|
|
|
if isinstance(value, float):
|
|
return f"{value:.{decimals}f}{suffix}"
|
|
|
|
return f"{value}{suffix}"
|
|
|
|
|
|
def format_bool(value, true_text="ON", false_text="OFF"):
|
|
return true_text if value else false_text
|
|
|
|
|
|
class DashboardViewModel:
|
|
def __init__(self, state, alarms=None):
|
|
self.state = state
|
|
self.alarms = alarms or []
|
|
|
|
def top_bar(self):
|
|
soc = format_value(self.state.battery.get("soc"), "%", decimals=0)
|
|
uart = "UART OK" if self.state.network.get("uart_connected") else "UART LOST"
|
|
alarm_count = len(self.alarms)
|
|
|
|
return {
|
|
"soc": soc,
|
|
"comms": uart,
|
|
"alarms": alarm_count,
|
|
}
|
|
|
|
def battery_summary(self):
|
|
return {
|
|
"voltage": format_value(self.state.battery.get("voltage"), "V", decimals=1),
|
|
"current": format_value(self.state.battery.get("current"), "A", decimals=1),
|
|
"runtime": format_value(self.state.battery.get("runtime_hours"), " hr", decimals=1),
|
|
}
|
|
|
|
def fridge_summary(self):
|
|
return {
|
|
"zone_1": format_value(self.state.temps.get("fridge_zone_1"), "°F", decimals=1),
|
|
"zone_2": format_value(self.state.temps.get("fridge_zone_2"), "°F", decimals=1),
|
|
}
|
|
|
|
def power_summary(self):
|
|
return {
|
|
"starlink": format_bool(self.state.relays.get("starlink")),
|
|
"fridge": format_bool(self.state.relays.get("fridge")),
|
|
}
|
|
|
|
def as_dict(self):
|
|
return {
|
|
"top_bar": self.top_bar(),
|
|
"battery": self.battery_summary(),
|
|
"fridge": self.fridge_summary(),
|
|
"power": self.power_summary(),
|
|
}
|