using Evergreen.Health.Application.Health.Integrations.HomeAssistant; using Evergreen.Health.Application.Health.Scenes; using System.Globalization; namespace Evergreen.Health.Application.Health.Devices.Dehumidifier; internal static class DehumidifierHumidityCondition { private static readonly TimeSpan MaxHumidityAge = TimeSpan.FromMinutes(30); public static bool SupportsTarget(HomeAssistantOptions configuration, string entityId) => configuration.Enabled && configuration.SleepScene.TargetHumidity is >= 40 and <= 70 && entityId?.StartsWith("humidifier.", StringComparison.Ordinal) == true && entityId == configuration.Entities.Dehumidifier && configuration.Entities.Humidity?.StartsWith("sensor.", StringComparison.Ordinal) == true; public static string? SkipReason(IReadOnlyList states, HomeAssistantOptions configuration, DateTimeOffset now) { var humidity = states.FirstOrDefault(state => string.Equals(state.EntityId, configuration.Entities.Humidity, StringComparison.OrdinalIgnoreCase)); if (humidity is null || !DeviceActionRunner.IsAvailable(humidity)) return "humidity-unavailable"; var observedAt = humidity.LastReported ?? humidity.LastUpdated; if (observedAt is null || now - observedAt > MaxHumidityAge || observedAt > now.AddMinutes(1)) return "humidity-stale"; if (humidity.GetStringAttribute("unit_of_measurement") != "%" || !double.TryParse(humidity.State, NumberStyles.Float, CultureInfo.InvariantCulture, out var percent) || !double.IsFinite(percent) || percent is < 0 or > 100) return "humidity-invalid"; return percent > configuration.SleepScene.TargetHumidity ? null : "humidity-normal"; } }