Skip to content

Instantly share code, notes, and snippets.

@isaacabraham
Last active August 31, 2021 17:52
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save isaacabraham/bff40a73049839128c048105e9f20651 to your computer and use it in GitHub Desktop.
Save isaacabraham/bff40a73049839128c048105e9f20651 to your computer and use it in GitHub Desktop.
#r "nuget: SchlenkR.FsHttp"
open FsHttp.DslCE
type Switch = On | Off member this.AsBool = match this with On -> true | Off -> false
type LightId = LightId of int
module Cmd =
let username = "<access username>"
let ip = "<local ip address>"
let run command devices =
devices
|> Array.map command
|> Async.Parallel
|> Async.Ignore
let coreRoute = $"http://{ip}/api/{username}/lights"
let makeCmd route jsonBody (LightId lightId) =
httpAsync {
PUT $"{coreRoute}/{lightId}/{route}"
body
json (System.Text.Json.JsonSerializer.Serialize jsonBody)
}
let setState jsonBody = makeCmd "state" jsonBody
let switch (switch:Switch) = setState {| on = switch.AsBool |}
let brightness (value:int) = setState {| bri = value |}
module Workflows =
let turnOnAndOff lights = async {
while true do
do! lights |> Cmd.run (Cmd.switch Off)
do! Async.Sleep 1000
do! lights |> Cmd.run (Cmd.switch On)
}
let brightAndDim lights = async {
let brightnesses = 0 :: [ 4 .. 10 .. 254 ]
for i in brightnesses @ (brightnesses |> List.rev |> List.skip 1) do
do! lights |> Cmd.run (Cmd.brightness i)
do! Async.Sleep 100
}
let flash lights = async {
let brightnesses = [ 0; 254; 0 ]
for i in brightnesses do
do! lights |> Cmd.run (Cmd.brightness i)
do! Async.Sleep 50
}
let lightOne, lightTwo = LightId 3, LightId 4
let allLights = [| lightOne; lightTwo |]
// Turn on all the lights
allLights |> Cmd.run (Cmd.switch Off) |> Async.Start
allLights |> Cmd.run (Cmd.switch On) |> Async.Start
// Make them brighter and dimmer
allLights |> Workflows.brightAndDim |> Async.Start
// Flash the lights on and off indefinitely
allLights |> Workflows.turnOnAndOff |> Async.Start
// Flash on and off, once
allLights |> Workflows.flash |> Async.Start
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment