@using HomeApi.Models @using System; @using System.Linq; @using System.Collections.Generic; @model HomeApi.Models.Image @functions { private string GetDayStatus(string input) { var date = DateTime.Parse(input); var today = DateTime.Today; var dayOfWeek = date.DayOfWeek.ToString(); if (date.Date == today) return "Today"; if (date.Date == today.AddDays(1)) return "Tomorrow"; if (date >= today.AddDays(1) && date < today.AddDays(7)) return dayOfWeek; return $"On {date:dddd, dd MMM yyyy}"; } private string GetTransPortIcon(string transportType) { var transportIcons = new Dictionary(StringComparer.OrdinalIgnoreCase) { { "buss", "fa-bus" }, { "bus", "fa-bus" }, { "tunnelbana", "fa-train-subway" }, { "metro", "fa-train-subway" }, { "tåg", "fa-train" }, { "train", "fa-train" }, { "båt", "fa-ferry" }, { "ferry", "fa-ferry" } }; foreach (var keyword in transportIcons.Keys) { if (transportType.Contains(keyword, StringComparison.OrdinalIgnoreCase)) return transportIcons[keyword]; } return "fa-question-circle"; } private string GetAirQualityStatus(AirQuality data) { var highestAqi = Math.Max(data.Us_Epa_Index, data.Gb_Defra_Index); return highestAqi switch { <= 50 => "Good", <= 100 => "Moderate", <= 150 => "Unhealthy for Sensitive Groups", <= 200 => "Unhealthy", <= 300 => "Very Unhealthy", _ => "Hazardous" }; } private static string GetWeatherIcon(int code, bool isNight = false) { var map = new Dictionary { // Clear/Sunny { 1000, isNight ? "fa-moon" : "fa-sun" }, // Partly cloudy { 1003, isNight ? "fa-cloud-moon" : "fa-cloud-sun" }, // Cloudy/Overcast { 1006, "fa-cloud" }, { 1009, "fa-cloud" }, // Mist/Fog { 1030, "fa-smog" }, { 1135, "fa-smog" }, { 1147, "fa-smog" }, // Rain/drizzle { 1063, "fa-cloud-rain" }, { 1150, "fa-cloud-drizzle" }, { 1153, "fa-cloud-drizzle" }, { 1180, "fa-cloud-rain" }, { 1183, "fa-cloud-rain" }, { 1186, "fa-cloud-showers-heavy" }, { 1189, "fa-cloud-showers-heavy" }, { 1240, "fa-cloud-showers-heavy" }, { 1243, "fa-cloud-showers-heavy" }, { 1246, "fa-cloud-showers-heavy" }, // Sleet, freezing drizzle/rain { 1069, "fa-cloud-meatball" }, { 1072, "fa-cloud-meatball" }, { 1168, "fa-cloud-meatball" }, { 1171, "fa-cloud-meatball" }, { 1198, "fa-cloud-meatball" }, { 1201, "fa-cloud-meatball" }, { 1204, "fa-cloud-meatball" }, { 1207, "fa-cloud-meatball" }, { 1249, "fa-cloud-meatball" }, { 1252, "fa-cloud-meatball" }, // Snow { 1066, "fa-snowflake" }, { 1114, "fa-snowflake" }, { 1117, "fa-snowflake" }, { 1210, "fa-snowflake" }, { 1213, "fa-snowflake" }, { 1216, "fa-snowflake" }, { 1219, "fa-snowflake" }, { 1222, "fa-snowflake" }, { 1225, "fa-snowflake" }, { 1255, "fa-snowflake" }, { 1258, "fa-snowflake" }, // Snow showers { 1261, "fa-snowflake" }, { 1264, "fa-snowflake" }, { 1279, "fa-snowflake" }, { 1282, "fa-snowflake" }, // Thunderstorms { 1087, "fa-bolt" }, { 1273, "fa-bolt" }, { 1276, "fa-bolt" }, // Ice pellets { 1237, "fa-icicles" }, }; return map.TryGetValue(code, out var value) ? value : "fa-question-circle"; } private static string UseHighContrast(bool isHighContrast) { return isHighContrast ? "high-contrast" : string.Empty; } } Weather Dashboard
@Model.Weather.CityName
@Model.Weather.Current.Temperature°C
Feels like @Model.Weather.Current.Feelslike°C
Clouds
@Model.Weather.Current.Cloud%
Wind
@Model.Weather.Current.WindPerMeterSecond.ToString("0.##") m/s @Model.Weather.Current.WindDirection
Gusts
@Model.Weather.Current.WindGustPerMeterSecond.ToString("0.##") m/s
Aurora
@Model.Weather.Current.AuroraProbability.Value%
Air Quality: @GetAirQualityStatus(Model.Weather.Current.AirQuality)

@Model.Weather.Forecast.Count-Day Forecast

@foreach (var day in Model.Weather.Forecast) {
@GetDayStatus(day.Date)
@(day.Day?.ConditionText ?? "Unspecified")
@day.MinTempC°/@day.MaxTempC°
Rain: @day.ChanceOfRain%
}
Sunrise
@Model.Weather.Forecast[0].Astro.Sunrise
Sunset
@Model.Weather.Forecast[0].Astro.Sunset
Moonrise
@Model.Weather.Forecast[0].Astro.Moonrise
Moonset
@Model.Weather.Forecast[0].Astro.Moonset
Moon phase @Model.Weather.Forecast[0].Astro.Moon_Illumination%

Upcoming Departures

@foreach (var transport in Model.TimeTable.Take(5)) { var departureTime = DateTime.Parse(transport.DepartureTime); var minutesUntilDeparture = (int)(departureTime - DateTime.Now).TotalMinutes;
@transport.LineNumber
to @transport.Direction
@DateTime.Parse(transport.DepartureTime).ToShortTimeString() (@minutesUntilDeparture min)
}
Last updated: