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(), }