hammerspoon/extensions/milight/milight.lua

172 lines
5.0 KiB
Lua

--- === hs.milight ===
---
--- Simple controls for the MiLight LED WiFi bridge (also known as LimitlessLED and EasyBulb)
local milight = require "hs.libmilight"
milight.cmd = milight._cacheCommands()
local milightObject = hs.getObjectMetatable("hs.milight")
--- hs.milight.minBrightness
--- Constant
--- Specifies the minimum brightness value that can be used. Defaults to 0
milight.minBrightness = 0
--
--- hs.milight.maxBrightness
--- Constant
--- Specifies the maximum brightness value that can be used. Defaults to 25
milight.maxBrightness = 25
-- Internal helper to set brightness
local function brightnessHelper(bridge, zonecmd, value)
if (bridge:send(milight.cmd[zonecmd])) then
if (value < milight.minBrightness) then
value = milight.minBrightness
elseif (value > milight.maxBrightness) then
value = milight.maxBrightness
end
value = value + 2 -- bridge accepts values between 2 and 27
local result = bridge:send(milight.cmd["brightness"], value)
if (result) then
return value - 2
else
return -1
end
else
return -1
end
end
-- Internal helper to set color
local function colorHelper(bridge, zonecmd, value)
if (bridge:send(milight.cmd[zonecmd])) then
if (value < 0) then
value = 0
elseif (value > 255) then
value = 255
end
return bridge:send(milight.cmd["rgbw"], value)
else
return false
end
end
-- Internal helper to map an integer and a string to a zone command key
local function zone2cmdkey(zone, cmdType)
local zoneString
if (zone == 0) then
zoneString = "all_"
else
zoneString = "zone"..zone.."_"
end
return zoneString..cmdType
end
--- hs.milight:zoneOff(zone) -> bool
--- Method
--- Turns off the specified zone
---
--- Parameters:
--- * zone - A number specifying which zone to operate on. 0 for all zones, 1-4 for zones one through four
---
--- Returns:
--- * True if the command was sent correctly, otherwise false
function milightObject:zoneOff(zone)
return self:send(milight.cmd[zone2cmdkey(zone, "off")])
end
--- hs.milight:zoneOn(zone) -> bool
--- Method
--- Turns on the specified zone
---
--- Parameters:
--- * zone - A number specifying which zone to operate on. 0 for all zones, 1-4 for zones one through four
---
--- Returns:
--- * True if the command was sent correctly, otherwise false
function milightObject:zoneOn(zone)
return self:send(milight.cmd[zone2cmdkey(zone, "on")])
end
--- hs.milight:disco() -> bool
--- Method
--- Cycles through the disco modes
---
--- Parameters:
--- * None
---
--- Returns:
--- * True if the command was sent correctly, otherwise false
function milightObject:discoCycle(zone)
if (self:zoneOn(zone)) then
return self:send(milight.cmd["disco"])
else
return false
end
end
--- hs.milight:zoneBrightness(zone, value) -> integer
--- Method
--- Sets brightness for the specified zone
---
--- Parameters:
--- * zone - A number specifying which zone to operate on. 0 for all zones, 1-4 for zones one through four
--- * value - A number containing the brightness level to set, between `hs.milight.minBrightness` and `hs.milight.maxBrightness`
---
--- Returns:
--- * A number containing the value that was sent to the WiFi bridge, or -1 if an error occurred
function milightObject:zoneBrightness(zone, value)
return brightnessHelper(self, zone2cmdkey(zone, "on"), value)
end
--- hs.milight:zoneColor(zone, value) -> bool
--- Method
--- Sets RGB color for the specified zone
---
--- Parameters:
--- * zone - A number specifying which zone to operate on. 0 for all zones, 1-4 for zones one through four
--- * value - A number between 0 and 255 that represents a color
---
--- Returns:
--- * True if the command was sent correctly, otherwise false
---
--- Notes:
--- * The color value is not a normal RGB colour, but rather a lookup in an internal table in the light hardware. While any number between 0 and 255 is valid, there are some useful values worth knowing:
--- * 00 - Violet
--- * 16 - Royal Blue
--- * 32 - Baby Blue
--- * 48 - Aqua
--- * 64 - Mint Green
--- * 80 - Seafoam Green
--- * 96 - Green
--- * 112 - Lime Green
--- * 128 - Yellow
--- * 144 - Yellowy Orange
--- * 160 - Orange
--- * 176 - Red
--- * 194 - Pink
--- * 210 - Fuscia
--- * 226 - Lilac
--- * 240 - Lavendar
function milightObject:zoneColor(zone, value)
return colorHelper(self, zone2cmdkey(zone, "on"), value)
end
--- hs.milight:zoneWhite(zone) -> bool
--- Method
--- Sets the specified zone to white
---
--- Parameters:
--- * zone - A number specifying which zone to operate on. 0 for all zones, 1-4 for zones one through four
---
--- Returns:
--- * True if the command was sent correctly, otherwise false
function milightObject:zoneWhite(zone)
if (self:zoneOn(zone)) then
return self:send(milight.cmd[zone2cmdkey(zone, "white")])
else
return false
end
end
return milight