Accept TimeChanged events instead of PartOfDayChanged events

This commit is contained in:
Sven van Heugten 2026-01-03 19:03:17 +01:00
parent e226d092d8
commit 506cf0c848
2 changed files with 21 additions and 20 deletions

View file

@ -1,5 +1,6 @@
module NightLight.Core module NightLight.Core
open System
open NightLight.PartsOfDay open NightLight.PartsOfDay
open NightLight.ZigbeeEvents open NightLight.ZigbeeEvents
open NightLight.ZigbeeCommands open NightLight.ZigbeeCommands
@ -19,13 +20,13 @@ let internal generateZigbeeCommandToFixLight partOfDay light =
type Event = type Event =
| ReceivedZigbeeEvent of payload: string | 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) = let onEventReceived (state: State) (event: Event) =
result { result {
let partOfDay = state.PartOfDay let partOfDay = getPartOfDay state.Time
match event with match event with
| ReceivedZigbeeEvent payload -> | ReceivedZigbeeEvent payload ->
@ -40,6 +41,14 @@ let onEventReceived (state: State) (event: Event) =
match maybeLight with match maybeLight with
| Some light -> generateZigbeeCommandToFixLight partOfDay light |> Seq.singleton | Some light -> generateZigbeeCommandToFixLight partOfDay light |> Seq.singleton
| None -> Seq.empty | None -> Seq.empty
| PartOfDayChanged newPartOfDay -> | TimeChanged time ->
return { PartOfDay = newPartOfDay }, lights |> Seq.map (generateZigbeeCommandToFixLight partOfDay) let newState = { Time = time }
let newPartOfDay = getPartOfDay time
return
newState,
if partOfDay <> newPartOfDay then
lights |> Seq.map (generateZigbeeCommandToFixLight newPartOfDay)
else
Seq.empty
} }

View file

@ -5,7 +5,6 @@ open System.Threading.Tasks
open Microsoft.Extensions.Logging open Microsoft.Extensions.Logging
open MQTTnet open MQTTnet
open MQTTnet.Protocol open MQTTnet.Protocol
open NightLight.PartsOfDay
open NightLight.ZigbeeEvents open NightLight.ZigbeeEvents
open NightLight.ZigbeeCommands open NightLight.ZigbeeCommands
open NightLight.Core open NightLight.Core
@ -86,7 +85,7 @@ let mainAsync _ =
let mqttClientOptions = MqttClientOptionsBuilder().WithTcpServer(server).Build() let mqttClientOptions = MqttClientOptionsBuilder().WithTcpServer(server).Build()
let stateLock = new SemaphoreSlim(1, 1) let stateLock = new SemaphoreSlim(1, 1)
let mutable state = { PartOfDay = getPartOfDay DateTime.Now } let mutable state = { Time = DateTime.Now }
mqttClient.add_ApplicationMessageReceivedAsync (fun e -> mqttClient.add_ApplicationMessageReceivedAsync (fun e ->
async { async {
@ -108,22 +107,15 @@ let mainAsync _ =
|> Async.AwaitTask |> Async.AwaitTask
|> Async.Ignore |> Async.Ignore
let mutable previousPartOfDay: PartOfDay option = None
while true do while true do
let currentPartOfDay = getPartOfDay DateTime.Now
if previousPartOfDay <> Some currentPartOfDay then
do! stateLock.WaitAsync() |> Async.AwaitTask do! stateLock.WaitAsync() |> Async.AwaitTask
try try
let! newState = PartOfDayChanged currentPartOfDay |> handleEvent mqttClient logger state let! newState = TimeChanged DateTime.Now |> handleEvent mqttClient logger state
state <- newState state <- newState
finally finally
stateLock.Release() |> ignore stateLock.Release() |> ignore
previousPartOfDay <- Some currentPartOfDay
do! Async.Sleep 10_000 do! Async.Sleep 10_000
do! mqttClient.DisconnectAsync() |> Async.AwaitTask do! mqttClient.DisconnectAsync() |> Async.AwaitTask