From 89a8c599c71e34e70786f06401521e7316d290fd Mon Sep 17 00:00:00 2001 From: Sven van Heugten Date: Mon, 5 Jan 2026 17:51:57 +0100 Subject: [PATCH] Strongly type the device FriendlyName --- NightLight.Core.Tests/FakeHome.fs | 8 ++++++-- NightLight.Core/Models.fs | 19 +++++++++++++------ NightLight.Core/ZigbeeCommands.fs | 4 ++-- NightLight.Core/ZigbeeEvents.fs | 4 ++-- 4 files changed, 23 insertions(+), 12 deletions(-) diff --git a/NightLight.Core.Tests/FakeHome.fs b/NightLight.Core.Tests/FakeHome.fs index 6413cbd..3facd72 100644 --- a/NightLight.Core.Tests/FakeHome.fs +++ b/NightLight.Core.Tests/FakeHome.fs @@ -59,7 +59,11 @@ type FakeHome() = option { let! friendlyName = let m = Regex.Match(command.Topic, "^zigbee2mqtt/(.+)/set$") - if m.Success then Some m.Groups.[1].Value else None + + if m.Success then + Some(DeviceFriendlyName m.Groups.[1].Value) + else + None let! fakeLight = Map.tryFind friendlyName friendlyNameToFakeLight @@ -94,7 +98,7 @@ type FakeHome() = Payload = $@"{{ ""type"": ""device_announce"", - ""data"": {{ ""friendly_name"": ""{light.FriendlyName}"" }} + ""data"": {{ ""friendly_name"": ""{light.FriendlyName.Get}"" }} }}" } |> ReceivedZigbeeEvent |> onEventPublished.Trigger diff --git a/NightLight.Core/Models.fs b/NightLight.Core/Models.fs index 7452f6e..b9fa8db 100644 --- a/NightLight.Core/Models.fs +++ b/NightLight.Core/Models.fs @@ -30,24 +30,31 @@ type Bulb = | IkeaBulb | PaulmannBulb +type DeviceFriendlyName = + | DeviceFriendlyName of string + + member this.Get = + match this with + | DeviceFriendlyName deviceFriendlyName -> deviceFriendlyName + type Light = - { FriendlyName: string + { FriendlyName: DeviceFriendlyName Room: Room Bulb: Bulb } let lights = - [ { FriendlyName = "Vardagsrum - Fönsterlampa" + [ { FriendlyName = DeviceFriendlyName "Vardagsrum - Fönsterlampa" Room = LivingRoom Bulb = IkeaBulb } - { FriendlyName = "Vardagsrum - Vägglampa" + { FriendlyName = DeviceFriendlyName "Vardagsrum - Vägglampa" Room = LivingRoom Bulb = PaulmannBulb } - { FriendlyName = "Vardagsrum - Golvlampa" + { FriendlyName = DeviceFriendlyName "Vardagsrum - Golvlampa" Room = LivingRoom Bulb = PaulmannBulb } - { FriendlyName = "Badrum - Taklampa" + { FriendlyName = DeviceFriendlyName "Badrum - Taklampa" Room = Bathroom Bulb = IkeaBulb } - { FriendlyName = "Sovrum - Nattduksbordlampa" + { FriendlyName = DeviceFriendlyName "Sovrum - Nattduksbordlampa" Room = Bedroom Bulb = IkeaBulb } ] diff --git a/NightLight.Core/ZigbeeCommands.fs b/NightLight.Core/ZigbeeCommands.fs index 6df6e85..2d25c04 100644 --- a/NightLight.Core/ZigbeeCommands.fs +++ b/NightLight.Core/ZigbeeCommands.fs @@ -4,7 +4,7 @@ open System.Text.Json.Nodes open NightLight.Core.Models open NightLight.Core.Moods -let generateZigbeeCommand friendlyName targetColor targetBrightness = +let generateZigbeeCommand (friendlyName: DeviceFriendlyName) targetColor targetBrightness = let commandObj = JsonObject() match targetColor with @@ -19,7 +19,7 @@ let generateZigbeeCommand friendlyName targetColor targetBrightness = match targetBrightness with | Brightness b -> b - let topic = $"zigbee2mqtt/{friendlyName}/set" + let topic = $"zigbee2mqtt/{friendlyName.Get}/set" let payload = commandObj.ToJsonString() { Topic = topic; Payload = payload } diff --git a/NightLight.Core/ZigbeeEvents.fs b/NightLight.Core/ZigbeeEvents.fs index b435698..e6a9769 100644 --- a/NightLight.Core/ZigbeeEvents.fs +++ b/NightLight.Core/ZigbeeEvents.fs @@ -4,7 +4,7 @@ open NightLight.Core.Models open FsToolkit.ErrorHandling open FSharp.Data -type ZigbeeEvent = DeviceAnnounce of FriendlyName: string +type ZigbeeEvent = DeviceAnnounce of DeviceFriendlyName let parseZigbeeEvent (message: Message) = result { @@ -17,7 +17,7 @@ let parseZigbeeEvent (message: Message) = match messageType with | JsonValue.String "device_announce" -> match messageData.TryGetProperty "friendly_name" with - | Some(JsonValue.String friendlyName) -> Ok(DeviceAnnounce friendlyName) + | Some(JsonValue.String friendlyName) -> Ok <| DeviceAnnounce(DeviceFriendlyName friendlyName) | Some _ -> Error InvalidFriendlyNameField | None -> Error MissingFriendlyNameField | JsonValue.String _ -> Error UnknownType