From 6b73e32cdae2efa9a7c919863ba27b168b3db329 Mon Sep 17 00:00:00 2001 From: Sven van Heugten Date: Sat, 17 Jan 2026 18:01:14 +0100 Subject: [PATCH] Implement fading alarm --- NightLight.Core/Models.fs | 7 ++++++- NightLight.Core/NightLightStateMachine.fs | 6 +++++- NightLight.Core/PartsOfDay.fs | 20 +++++++++++++++----- 3 files changed, 26 insertions(+), 7 deletions(-) diff --git a/NightLight.Core/Models.fs b/NightLight.Core/Models.fs index 10fe7f8..18e4ef3 100644 --- a/NightLight.Core/Models.fs +++ b/NightLight.Core/Models.fs @@ -79,7 +79,12 @@ type internal State = | On | Off -type internal Brightness = Brightness of int +type internal Brightness = + | Brightness of int + + member this.Scale(b: float) = + match this with + | Brightness brightness -> Brightness <| int (float brightness * b) type internal Color = | ColorByCoordinates of float * float diff --git a/NightLight.Core/NightLightStateMachine.fs b/NightLight.Core/NightLightStateMachine.fs index a91b4be..f68d66d 100644 --- a/NightLight.Core/NightLightStateMachine.fs +++ b/NightLight.Core/NightLightStateMachine.fs @@ -48,7 +48,11 @@ let internal createOrUpdateNightLightState light, { Color = color - Brightness = brightness + Brightness = + if alarm && light.ControlledWithRemote <> NonRemote then + brightness.Scale(getAlarmWeight time) + else + brightness State = if alarm then On else previousState }) |> Map.ofSeq diff --git a/NightLight.Core/PartsOfDay.fs b/NightLight.Core/PartsOfDay.fs index ac430f4..621ae14 100644 --- a/NightLight.Core/PartsOfDay.fs +++ b/NightLight.Core/PartsOfDay.fs @@ -6,11 +6,21 @@ type PartOfDay = | Day | Night +let private startOfDay = TimeSpan.FromHours 6 +let private endOfDay = TimeSpan.FromHours 20.5 + let getPartOfDay (dateTime: DateTime) = match dateTime with - | _ when - dateTime.TimeOfDay >= TimeSpan.FromHours 6 - && dateTime.TimeOfDay < TimeSpan.FromHours 20.5 - -> - Day + | _ when dateTime.TimeOfDay >= startOfDay && dateTime.TimeOfDay < endOfDay -> Day | _ -> Night + +let getAlarmWeight (dateTime: DateTime) = + let currentTime = dateTime.TimeOfDay + let alarmEnd = startOfDay + TimeSpan(0, 15, 0) + let totalSeconds = (alarmEnd - startOfDay).TotalSeconds + + if startOfDay <= currentTime && currentTime <= alarmEnd then + let elapsedSeconds = (currentTime - startOfDay).TotalSeconds + elapsedSeconds / totalSeconds + else + 1.0