|
1 | 1 | @using HomeSpeaker.Shared.Temperature |
| 2 | +@using HomeSpeaker.Shared.Forecast |
2 | 3 | @using HomeSpeaker.WebAssembly.Services |
3 | 4 | @inject ITemperatureService TemperatureService |
| 5 | +@inject IForecastService ForecastService |
4 | 6 | @inject ILogger<TemperatureMonitor> Logger |
5 | 7 | @implements IDisposable |
6 | 8 |
|
|
46 | 48 | @if (temperatureStatus != null) |
47 | 49 | { |
48 | 50 | <div class="row g-2"> |
49 | | - <div class="col-6"> <div class="text-center"> |
| 51 | + <div class="col-6 col-md-4"> |
| 52 | + <div class="text-center"> |
50 | 53 | <div class="mb-2"> |
51 | 54 | <i class="fas fa-cloud-sun fa-2x" style="color: @GetTemperatureColor(temperatureStatus.OutsideTemperature)"></i> |
52 | 55 | </div> |
|
56 | 59 | </div> |
57 | 60 | </div> |
58 | 61 | </div> |
59 | | - <div class="col-6"> <div class="text-center"> |
| 62 | + <div class="col-6 col-md-4"> |
| 63 | + <div class="text-center"> |
60 | 64 | <div class="mb-2"> |
61 | 65 | <i class="fas fa-female fa-2x" style="color: @GetTemperatureColor(temperatureStatus.YoungerGirlsRoomTemperature)"></i> |
62 | 66 | </div> |
|
66 | 70 | </div> |
67 | 71 | </div> |
68 | 72 | </div> |
69 | | - <div class="col-6"> <div class="text-center"> |
| 73 | + <div class="col-6 col-md-4"> |
| 74 | + <div class="text-center"> |
70 | 75 | <div class="mb-2"> |
71 | 76 | <i class="fas fa-male fa-2x" style="color: @GetTemperatureColor(temperatureStatus.BoysRoomTemperature)"></i> |
72 | 77 | </div> |
|
76 | 81 | </div> |
77 | 82 | </div> |
78 | 83 | </div> |
79 | | - <div class="col-6"> <div class="text-center"> |
| 84 | + <div class="col-6 col-md-4"> |
| 85 | + <div class="text-center"> |
80 | 86 | <div class="mb-2"> |
81 | 87 | <i class="fas fa-seedling fa-2x" style="color: @GetTemperatureColor(temperatureStatus.GreenhouseTemperature)"></i> |
82 | 88 | </div> |
83 | 89 | <div class="h6 text-muted mb-2">Greenhouse</div> |
84 | 90 | <div class="temperature-display"> |
85 | 91 | <span class="display-1 fw-bold" style="color: @GetTemperatureColor(temperatureStatus.GreenhouseTemperature)">@FormatTemperature(temperatureStatus.GreenhouseTemperature)</span> |
86 | 92 | </div> |
87 | | - </div></div> |
88 | | - </div> |
| 93 | + </div> |
| 94 | + </div> |
| 95 | + @if (forecastStatus != null) |
| 96 | + { |
| 97 | + @if (forecastStatus.TonightLow != null) |
| 98 | + { |
| 99 | + <div class="col-6 col-md-4"> |
| 100 | + <div class="text-center"> |
| 101 | + <div class="mb-2"> |
| 102 | + <i class="fas fa-moon fa-2x" style="color: @GetTemperatureColor(forecastStatus.TonightLow.Temperature)"></i> |
| 103 | + </div> |
| 104 | + <div class="h6 text-muted mb-2">Tonight's Low</div> |
| 105 | + <div class="temperature-display"> |
| 106 | + <span class="display-1 fw-bold" style="color: @GetTemperatureColor(forecastStatus.TonightLow.Temperature)">@FormatForecastTemperature(forecastStatus.TonightLow.Temperature)</span> |
| 107 | + </div> |
| 108 | + <div class="small text-muted mt-1">@forecastStatus.TonightLow.Conditions</div> |
| 109 | + </div> |
| 110 | + </div> |
| 111 | + } |
| 112 | + @if (forecastStatus.TomorrowHigh != null) |
| 113 | + { |
| 114 | + <div class="col-6 col-md-4"> |
| 115 | + <div class="text-center"> |
| 116 | + <div class="mb-2"> |
| 117 | + <i class="fas fa-sun fa-2x" style="color: @GetTemperatureColor(forecastStatus.TomorrowHigh.Temperature)"></i> |
| 118 | + </div> |
| 119 | + <div class="h6 text-muted mb-2">Tomorrow's High</div> |
| 120 | + <div class="temperature-display"> |
| 121 | + <span class="display-1 fw-bold" style="color: @GetTemperatureColor(forecastStatus.TomorrowHigh.Temperature)">@FormatForecastTemperature(forecastStatus.TomorrowHigh.Temperature)</span> |
| 122 | + </div> |
| 123 | + <div class="small text-muted mt-1">@forecastStatus.TomorrowHigh.Conditions</div> |
| 124 | + </div> |
| 125 | + </div> |
| 126 | + } |
| 127 | + } |
| 128 | + </div> |
89 | 129 | <div class="text-center mt-1"> |
90 | 130 | <small class="text-muted"> |
91 | 131 | Updated: @lastUpdated.ToString("HH:mm:ss") |
|
164 | 204 |
|
165 | 205 | @code { |
166 | 206 | private TemperatureStatus? temperatureStatus; |
| 207 | + private ForecastStatus? forecastStatus; |
167 | 208 | private DateTime lastUpdated = DateTime.Now; |
168 | 209 | private Timer? refreshTimer; |
169 | 210 | private bool isLoading = true; |
|
200 | 241 | isLoading = true; |
201 | 242 | StateHasChanged(); |
202 | 243 |
|
203 | | - temperatureStatus = await TemperatureService.GetTemperatureStatusAsync(); |
| 244 | + // Fetch both temperature and forecast data in parallel |
| 245 | + var temperatureTask = TemperatureService.GetTemperatureStatusAsync(); |
| 246 | + var forecastTask = ForecastService.GetForecastStatusAsync(); |
| 247 | + |
| 248 | + await Task.WhenAll(temperatureTask, forecastTask); |
| 249 | + |
| 250 | + temperatureStatus = await temperatureTask; |
| 251 | + forecastStatus = await forecastTask; |
204 | 252 | lastUpdated = DateTime.Now; |
205 | 253 | isLoading = false; |
206 | 254 | StateHasChanged(); |
|
212 | 260 | isLoading = false; |
213 | 261 | StateHasChanged(); |
214 | 262 | } |
215 | | - } private string FormatTemperature(double? temperature) |
| 263 | + } |
| 264 | + |
| 265 | + private string FormatTemperature(double? temperature) |
216 | 266 | { |
217 | 267 | return temperature.HasValue ? $"{temperature.Value:F1}°" : "N/A"; |
218 | 268 | } |
219 | 269 |
|
| 270 | + private string FormatForecastTemperature(double? temperature) |
| 271 | + { |
| 272 | + return temperature.HasValue ? $"{temperature.Value:F0}°" : "N/A"; |
| 273 | + } |
| 274 | + |
220 | 275 | private string GetTemperatureColor(double? temperature) |
221 | 276 | { |
222 | 277 | if (!temperature.HasValue) |
|
309 | 364 | isLoading = true; |
310 | 365 | StateHasChanged(); |
311 | 366 |
|
312 | | - temperatureStatus = await TemperatureService.RefreshAsync(); |
| 367 | + // Force refresh both temperature and forecast data in parallel |
| 368 | + var temperatureTask = TemperatureService.RefreshAsync(); |
| 369 | + var forecastTask = ForecastService.RefreshAsync(); |
| 370 | + |
| 371 | + await Task.WhenAll(temperatureTask, forecastTask); |
| 372 | + |
| 373 | + temperatureStatus = await temperatureTask; |
| 374 | + forecastStatus = await forecastTask; |
313 | 375 | lastUpdated = DateTime.Now; |
314 | 376 | isLoading = false; |
315 | 377 | StateHasChanged(); |
|
0 commit comments