From 506cf0c848933b97ee88d7d74e3fda0a6fce25cd Mon Sep 17 00:00:00 2001 From: Sven van Heugten Date: Sat, 3 Jan 2026 19:03:17 +0100 Subject: [PATCH] Accept TimeChanged events instead of PartOfDayChanged events --- NightLight.Core/Core.fs | 19 ++++++++++++++----- NightLight/Program.fs | 22 +++++++--------------- 2 files changed, 21 insertions(+), 20 deletions(-) diff --git a/NightLight.Core/Core.fs b/NightLight.Core/Core.fs index 9d233f2..888bc35 100644 --- a/NightLight.Core/Core.fs +++ b/NightLight.Core/Core.fs @@ -1,5 +1,6 @@ module NightLight.Core +open System open NightLight.PartsOfDay open NightLight.ZigbeeEvents open NightLight.ZigbeeCommands @@ -19,13 +20,13 @@ let internal generateZigbeeCommandToFixLight partOfDay light = type Event = | ReceivedZigbeeEvent of payload: string - | PartOfDayChanged of newPartOfDay: PartOfDay + | TimeChanged of DateTime -type State = { PartOfDay: PartOfDay } +type State = { Time: DateTime } let onEventReceived (state: State) (event: Event) = result { - let partOfDay = state.PartOfDay + let partOfDay = getPartOfDay state.Time match event with | ReceivedZigbeeEvent payload -> @@ -40,6 +41,14 @@ let onEventReceived (state: State) (event: Event) = match maybeLight with | Some light -> generateZigbeeCommandToFixLight partOfDay light |> Seq.singleton | None -> Seq.empty - | PartOfDayChanged newPartOfDay -> - return { PartOfDay = newPartOfDay }, lights |> Seq.map (generateZigbeeCommandToFixLight partOfDay) + | TimeChanged time -> + let newState = { Time = time } + let newPartOfDay = getPartOfDay time + + return + newState, + if partOfDay <> newPartOfDay then + lights |> Seq.map (generateZigbeeCommandToFixLight newPartOfDay) + else + Seq.empty } diff --git a/NightLight/Program.fs b/NightLight/Program.fs index 6c9121b..aa7128a 100644 --- a/NightLight/Program.fs +++ b/NightLight/Program.fs @@ -5,7 +5,6 @@ open System.Threading.Tasks open Microsoft.Extensions.Logging open MQTTnet open MQTTnet.Protocol -open NightLight.PartsOfDay open NightLight.ZigbeeEvents open NightLight.ZigbeeCommands open NightLight.Core @@ -86,7 +85,7 @@ let mainAsync _ = let mqttClientOptions = MqttClientOptionsBuilder().WithTcpServer(server).Build() let stateLock = new SemaphoreSlim(1, 1) - let mutable state = { PartOfDay = getPartOfDay DateTime.Now } + let mutable state = { Time = DateTime.Now } mqttClient.add_ApplicationMessageReceivedAsync (fun e -> async { @@ -108,21 +107,14 @@ let mainAsync _ = |> Async.AwaitTask |> Async.Ignore - let mutable previousPartOfDay: PartOfDay option = None - while true do - let currentPartOfDay = getPartOfDay DateTime.Now + do! stateLock.WaitAsync() |> Async.AwaitTask - if previousPartOfDay <> Some currentPartOfDay then - do! stateLock.WaitAsync() |> Async.AwaitTask - - try - let! newState = PartOfDayChanged currentPartOfDay |> handleEvent mqttClient logger state - state <- newState - finally - stateLock.Release() |> ignore - - previousPartOfDay <- Some currentPartOfDay + try + let! newState = TimeChanged DateTime.Now |> handleEvent mqttClient logger state + state <- newState + finally + stateLock.Release() |> ignore do! Async.Sleep 10_000