Documentation
¶
Overview ¶
Package lifxlan provides API implemented in Go for LIFX LAN Protocol:
https://lan.developer.lifx.com/docs/
This package focuses on the base stuff, device discovery, and capabilities shared by all types of devices. For more concreted capabilities like light control and tile control, please refer to the subpackages.
Currently this package and its subpackages are not complete and implement all possible LIFX LAN Protocols is not the current goal of this package. The design choice for this package is that it exposes as much as possible, so another package can implement missing device APIs by wrapping a device returned by discovery using only exported functions. Please refer to the subpackages for an example of extending device capabilities.
The API is unstable right now, but the maintainer tries very hard not to break them.
Example (DeviceDiscovery) ¶
This example demonstrates how to do device discovery.
package main import ( "context" "log" "sync" "time" "go.yhsif.com/lifxlan" ) func main() { // Config values that should be initialized with proper args in real code. var ( // The target device you want to find. target lifxlan.Target // The discover timeout. timeout time.Duration ) // It's important to be able to cancel the context. var ctx context.Context var cancel context.CancelFunc if timeout > 0 { ctx, cancel = context.WithTimeout(context.Background(), timeout) } else { ctx, cancel = context.WithCancel(context.Background()) } defer cancel() deviceChan := make(chan lifxlan.Device) var wg sync.WaitGroup wg.Add(1) go func() { defer wg.Done() if err := lifxlan.Discover(ctx, deviceChan, ""); err != nil { if err != nil && err != context.Canceled && err != context.DeadlineExceeded { log.Fatalf("Discover failed: %v", err) } } }() for device := range deviceChan { if !device.Target().Matches(target) { continue } wg.Add(1) go func(device lifxlan.Device) { defer wg.Done() // TODO: handle device // If you are satisfied with the device(s) found, // you can cancel the context now: cancel() }(device) } wg.Wait() }
Output:
Example (SendMessageWithAck) ¶
This example demonstrates how to send a message and wait for the ack.
Please note that this example assumes that no other replies besides ack are expected. If this message will cause a response, you should write your own read loop instead of using WaitForAcks.
package main import ( "context" "log" "go.yhsif.com/lifxlan" ) func main() { // Should actually be a proper struct according to the Protocol definition. type payloadType struct{} // Config values that should be initialized with proper args in real code. var ( // Should come with a timeout, or WaitForAcks might wait forever. ctx context.Context // The discovered device to use. device lifxlan.Device // The actual message type to be sent. message lifxlan.MessageType // The actual payload values. payload payloadType ) conn, err := device.Dial() if err != nil { log.Fatal(err) } defer conn.Close() if ctx.Err() != nil { log.Fatal(ctx.Err()) } seq, err := device.Send( ctx, conn, lifxlan.FlagAckRequired, message, &payload, // could be nil if this message doesn't need payload. ) if err != nil { log.Fatal(err) } if err := lifxlan.WaitForAcks(ctx, conn, device.Source(), seq); err != nil { log.Fatal(err) } }
Output:
Example (SendMessageWithResponse) ¶
This example demonstrates how to send a message and read the response.
package main import ( "bytes" "context" "encoding/binary" "log" "go.yhsif.com/lifxlan" ) func main() { // Should actually be proper structs according to the Protocol definition. type ( payloadType struct{} respPayloadType struct{} ) // Config values that should be initialized with proper args in real code. var ( // Should come with a timeout, or we might wait forever. ctx context.Context // The discovered device to use. device lifxlan.Device // The actual message type to be sent. message lifxlan.MessageType // The actual payload values. payload payloadType // The response message type. respMessage lifxlan.MessageType ) conn, err := device.Dial() if err != nil { log.Fatal(err) } defer conn.Close() if ctx.Err() != nil { log.Fatal(ctx.Err()) } seq, err := device.Send( ctx, conn, 0, // flags, not requiring ack because this message will get a response. message, &payload, // could be nil if this message doesn't need payload. ) if err != nil { log.Fatal(err) } for { resp, err := lifxlan.ReadNextResponse(ctx, conn) if err != nil { log.Fatal(err) } if resp.Sequence != seq || resp.Source != device.Source() { continue } if resp.Message != respMessage { continue } var raw respPayloadType r := bytes.NewReader(resp.Payload) if err := binary.Read(r, binary.LittleEndian, &raw); err != nil { log.Fatal(err) } // TODO: handle payload value in raw return } }
Output:
Index ¶
- Constants
- Variables
- func CheckTimeoutError(err error) bool
- func Discover(ctx context.Context, devices chan Device, broadcastHost string) error
- func GenerateMessage(tagged TaggedHeader, source uint32, target Target, flags AckResFlag, ...) ([]byte, error)
- func GetReadDeadline() time.Time
- func ProductMapKey(vendor, product uint32) uint64
- func RandomSource() uint32
- func WaitForAcks(ctx context.Context, conn net.Conn, source uint32, sequences ...uint8) error
- type AckResFlag
- type Color
- type Device
- type Features
- type FirmwareUpgrade
- type HardwareVersion
- type Label
- type MessageType
- type OptionalBool
- type Power
- type Product
- type RawEchoResponsePayload
- type RawHeader
- type RawSetPowerPayload
- type RawStateHostFirmwarePayload
- type RawStateLabelPayload
- type RawStatePowerPayload
- type RawStateServicePayload
- type RawStateUnhandledPayload
- type RawStateVersionPayload
- type Response
- type ServiceType
- type TaggedHeader
- type Target
- type TemperatureRange
- type Timestamp
- type TransitionTime
- type Upgrades
- type Vendor
- type WaitForAcksError
Examples ¶
Constants ¶
const ( KelvinWarm uint16 = 2500 KelvinCool uint16 = 9000 KelvinMin uint16 = KelvinWarm KelvinMax uint16 = KelvinCool )
Color value boundaries and constants.
const ( DefaultBroadcastHost = "255.255.255.255" DefaultBroadcastPort = "56700" )
Default broadcast host and port.
const (
EchoPayloadLength = 64
)
const EmptyFirmware = "(0, 0)"
EmptyFirmware is the constant to be compared against Device.Firmware().String().
const EmptyHardwareVersion = "(0, 0, 0)"
EmptyHardwareVersion is the constant to be compared against Device.HardwareVersion().String().
const EmptyLabel = ""
EmptyLabel is the constant to be compared against Device.Label().String().
const HeaderLength = 36
HeaderLength is the length of the header
const LabelLength = 32
LabelLength is the length of the raw label used in messages.
const ResponseReadBufferSize = 4096
ResponseReadBufferSize is the recommended buffer size to read UDP responses. It's big enough for all the payloads.
const (
ValidTemperatureRangeLength = 2
)
The magic length of TemperatureRange to be considered as valid (min, max).
Variables ¶
var ColorBlack = *FromColor(color.Black, 0)
ColorBlack is the black color.
var ProductMap = map[uint64]Product{ ProductMapKey(1, 1): { VendorName: "LIFX", VendorID: 1, ProductName: "LIFX Original 1000", ProductID: 1, Features: Features{ HEV: OptionalBoolPtr(false), Color: OptionalBoolPtr(true), Chain: OptionalBoolPtr(false), Matrix: OptionalBoolPtr(false), Relays: OptionalBoolPtr(false), Buttons: OptionalBoolPtr(false), Infrared: OptionalBoolPtr(false), Multizone: OptionalBoolPtr(false), ExtendedMultizone: OptionalBoolPtr(false), TemperatureRange: TemperatureRange{2500, 9000}, }, }, ProductMapKey(1, 3): { VendorName: "LIFX", VendorID: 1, ProductName: "LIFX Color 650", ProductID: 3, Features: Features{ HEV: OptionalBoolPtr(false), Color: OptionalBoolPtr(true), Chain: OptionalBoolPtr(false), Matrix: OptionalBoolPtr(false), Relays: OptionalBoolPtr(false), Buttons: OptionalBoolPtr(false), Infrared: OptionalBoolPtr(false), Multizone: OptionalBoolPtr(false), ExtendedMultizone: OptionalBoolPtr(false), TemperatureRange: TemperatureRange{2500, 9000}, }, }, ProductMapKey(1, 10): { VendorName: "LIFX", VendorID: 1, ProductName: "LIFX White 800 (Low Voltage)", ProductID: 10, Features: Features{ HEV: OptionalBoolPtr(false), Color: OptionalBoolPtr(false), Chain: OptionalBoolPtr(false), Matrix: OptionalBoolPtr(false), Relays: OptionalBoolPtr(false), Buttons: OptionalBoolPtr(false), Infrared: OptionalBoolPtr(false), Multizone: OptionalBoolPtr(false), ExtendedMultizone: OptionalBoolPtr(false), TemperatureRange: TemperatureRange{2700, 6500}, }, }, ProductMapKey(1, 11): { VendorName: "LIFX", VendorID: 1, ProductName: "LIFX White 800 (High Voltage)", ProductID: 11, Features: Features{ HEV: OptionalBoolPtr(false), Color: OptionalBoolPtr(false), Chain: OptionalBoolPtr(false), Matrix: OptionalBoolPtr(false), Relays: OptionalBoolPtr(false), Buttons: OptionalBoolPtr(false), Infrared: OptionalBoolPtr(false), Multizone: OptionalBoolPtr(false), ExtendedMultizone: OptionalBoolPtr(false), TemperatureRange: TemperatureRange{2700, 6500}, }, }, ProductMapKey(1, 15): { VendorName: "LIFX", VendorID: 1, ProductName: "LIFX Color 1000", ProductID: 15, Features: Features{ HEV: OptionalBoolPtr(false), Color: OptionalBoolPtr(true), Chain: OptionalBoolPtr(false), Matrix: OptionalBoolPtr(false), Relays: OptionalBoolPtr(false), Buttons: OptionalBoolPtr(false), Infrared: OptionalBoolPtr(false), Multizone: OptionalBoolPtr(false), ExtendedMultizone: OptionalBoolPtr(false), TemperatureRange: TemperatureRange{2500, 9000}, }, }, ProductMapKey(1, 18): { VendorName: "LIFX", VendorID: 1, ProductName: "LIFX White 900 BR30 (Low Voltage)", ProductID: 18, Features: Features{ HEV: OptionalBoolPtr(false), Color: OptionalBoolPtr(false), Chain: OptionalBoolPtr(false), Matrix: OptionalBoolPtr(false), Relays: OptionalBoolPtr(false), Buttons: OptionalBoolPtr(false), Infrared: OptionalBoolPtr(false), Multizone: OptionalBoolPtr(false), ExtendedMultizone: OptionalBoolPtr(false), TemperatureRange: TemperatureRange{2500, 9000}, }, }, ProductMapKey(1, 19): { VendorName: "LIFX", VendorID: 1, ProductName: "LIFX White 900 BR30 (High Voltage)", ProductID: 19, Features: Features{ HEV: OptionalBoolPtr(false), Color: OptionalBoolPtr(false), Chain: OptionalBoolPtr(false), Matrix: OptionalBoolPtr(false), Relays: OptionalBoolPtr(false), Buttons: OptionalBoolPtr(false), Infrared: OptionalBoolPtr(false), Multizone: OptionalBoolPtr(false), ExtendedMultizone: OptionalBoolPtr(false), TemperatureRange: TemperatureRange{2500, 9000}, }, }, ProductMapKey(1, 20): { VendorName: "LIFX", VendorID: 1, ProductName: "LIFX Color 1000 BR30", ProductID: 20, Features: Features{ HEV: OptionalBoolPtr(false), Color: OptionalBoolPtr(true), Chain: OptionalBoolPtr(false), Matrix: OptionalBoolPtr(false), Relays: OptionalBoolPtr(false), Buttons: OptionalBoolPtr(false), Infrared: OptionalBoolPtr(false), Multizone: OptionalBoolPtr(false), ExtendedMultizone: OptionalBoolPtr(false), TemperatureRange: TemperatureRange{2500, 9000}, }, }, ProductMapKey(1, 22): { VendorName: "LIFX", VendorID: 1, ProductName: "LIFX Color 1000", ProductID: 22, Features: Features{ HEV: OptionalBoolPtr(false), Color: OptionalBoolPtr(true), Chain: OptionalBoolPtr(false), Matrix: OptionalBoolPtr(false), Relays: OptionalBoolPtr(false), Buttons: OptionalBoolPtr(false), Infrared: OptionalBoolPtr(false), Multizone: OptionalBoolPtr(false), ExtendedMultizone: OptionalBoolPtr(false), TemperatureRange: TemperatureRange{2500, 9000}, }, }, ProductMapKey(1, 27): { VendorName: "LIFX", VendorID: 1, ProductName: "LIFX A19", ProductID: 27, Features: Features{ HEV: OptionalBoolPtr(false), Color: OptionalBoolPtr(true), Chain: OptionalBoolPtr(false), Matrix: OptionalBoolPtr(false), Relays: OptionalBoolPtr(false), Buttons: OptionalBoolPtr(false), Infrared: OptionalBoolPtr(false), Multizone: OptionalBoolPtr(false), ExtendedMultizone: OptionalBoolPtr(false), TemperatureRange: TemperatureRange{2500, 9000}, }, Upgrades: Upgrades{ { Major: 2, Minor: 80, Features: Features{ TemperatureRange: TemperatureRange{1500, 9000}, }, }, }, }, ProductMapKey(1, 28): { VendorName: "LIFX", VendorID: 1, ProductName: "LIFX BR30", ProductID: 28, Features: Features{ HEV: OptionalBoolPtr(false), Color: OptionalBoolPtr(true), Chain: OptionalBoolPtr(false), Matrix: OptionalBoolPtr(false), Relays: OptionalBoolPtr(false), Buttons: OptionalBoolPtr(false), Infrared: OptionalBoolPtr(false), Multizone: OptionalBoolPtr(false), ExtendedMultizone: OptionalBoolPtr(false), TemperatureRange: TemperatureRange{2500, 9000}, }, Upgrades: Upgrades{ { Major: 2, Minor: 80, Features: Features{ TemperatureRange: TemperatureRange{1500, 9000}, }, }, }, }, ProductMapKey(1, 29): { VendorName: "LIFX", VendorID: 1, ProductName: "LIFX A19 Night Vision", ProductID: 29, Features: Features{ HEV: OptionalBoolPtr(false), Color: OptionalBoolPtr(true), Chain: OptionalBoolPtr(false), Matrix: OptionalBoolPtr(false), Relays: OptionalBoolPtr(false), Buttons: OptionalBoolPtr(false), Infrared: OptionalBoolPtr(true), Multizone: OptionalBoolPtr(false), ExtendedMultizone: OptionalBoolPtr(false), TemperatureRange: TemperatureRange{2500, 9000}, }, Upgrades: Upgrades{ { Major: 2, Minor: 80, Features: Features{ TemperatureRange: TemperatureRange{1500, 9000}, }, }, }, }, ProductMapKey(1, 30): { VendorName: "LIFX", VendorID: 1, ProductName: "LIFX BR30 Night Vision", ProductID: 30, Features: Features{ HEV: OptionalBoolPtr(false), Color: OptionalBoolPtr(true), Chain: OptionalBoolPtr(false), Matrix: OptionalBoolPtr(false), Relays: OptionalBoolPtr(false), Buttons: OptionalBoolPtr(false), Infrared: OptionalBoolPtr(true), Multizone: OptionalBoolPtr(false), ExtendedMultizone: OptionalBoolPtr(false), TemperatureRange: TemperatureRange{2500, 9000}, }, Upgrades: Upgrades{ { Major: 2, Minor: 80, Features: Features{ TemperatureRange: TemperatureRange{1500, 9000}, }, }, }, }, ProductMapKey(1, 31): { VendorName: "LIFX", VendorID: 1, ProductName: "LIFX Z", ProductID: 31, Features: Features{ HEV: OptionalBoolPtr(false), Color: OptionalBoolPtr(true), Chain: OptionalBoolPtr(false), Matrix: OptionalBoolPtr(false), Relays: OptionalBoolPtr(false), Buttons: OptionalBoolPtr(false), Infrared: OptionalBoolPtr(false), Multizone: OptionalBoolPtr(true), ExtendedMultizone: OptionalBoolPtr(false), TemperatureRange: TemperatureRange{2500, 9000}, }, }, ProductMapKey(1, 32): { VendorName: "LIFX", VendorID: 1, ProductName: "LIFX Z", ProductID: 32, Features: Features{ HEV: OptionalBoolPtr(false), Color: OptionalBoolPtr(true), Chain: OptionalBoolPtr(false), Matrix: OptionalBoolPtr(false), Relays: OptionalBoolPtr(false), Buttons: OptionalBoolPtr(false), Infrared: OptionalBoolPtr(false), Multizone: OptionalBoolPtr(true), ExtendedMultizone: OptionalBoolPtr(false), TemperatureRange: TemperatureRange{2500, 9000}, }, Upgrades: Upgrades{ { Major: 2, Minor: 80, Features: Features{ TemperatureRange: TemperatureRange{1500, 9000}, }, }, { Major: 2, Minor: 77, Features: Features{ ExtendedMultizone: OptionalBoolPtr(true), }, }, }, }, ProductMapKey(1, 36): { VendorName: "LIFX", VendorID: 1, ProductName: "LIFX Downlight", ProductID: 36, Features: Features{ HEV: OptionalBoolPtr(false), Color: OptionalBoolPtr(true), Chain: OptionalBoolPtr(false), Matrix: OptionalBoolPtr(false), Relays: OptionalBoolPtr(false), Buttons: OptionalBoolPtr(false), Infrared: OptionalBoolPtr(false), Multizone: OptionalBoolPtr(false), ExtendedMultizone: OptionalBoolPtr(false), TemperatureRange: TemperatureRange{2500, 9000}, }, Upgrades: Upgrades{ { Major: 2, Minor: 80, Features: Features{ TemperatureRange: TemperatureRange{1500, 9000}, }, }, }, }, ProductMapKey(1, 37): { VendorName: "LIFX", VendorID: 1, ProductName: "LIFX Downlight", ProductID: 37, Features: Features{ HEV: OptionalBoolPtr(false), Color: OptionalBoolPtr(true), Chain: OptionalBoolPtr(false), Matrix: OptionalBoolPtr(false), Relays: OptionalBoolPtr(false), Buttons: OptionalBoolPtr(false), Infrared: OptionalBoolPtr(false), Multizone: OptionalBoolPtr(false), ExtendedMultizone: OptionalBoolPtr(false), TemperatureRange: TemperatureRange{2500, 9000}, }, Upgrades: Upgrades{ { Major: 2, Minor: 80, Features: Features{ TemperatureRange: TemperatureRange{1500, 9000}, }, }, }, }, ProductMapKey(1, 38): { VendorName: "LIFX", VendorID: 1, ProductName: "LIFX Beam", ProductID: 38, Features: Features{ HEV: OptionalBoolPtr(false), Color: OptionalBoolPtr(true), Chain: OptionalBoolPtr(false), Matrix: OptionalBoolPtr(false), Relays: OptionalBoolPtr(false), Buttons: OptionalBoolPtr(false), Infrared: OptionalBoolPtr(false), Multizone: OptionalBoolPtr(true), ExtendedMultizone: OptionalBoolPtr(false), TemperatureRange: TemperatureRange{2500, 9000}, }, Upgrades: Upgrades{ { Major: 2, Minor: 80, Features: Features{ TemperatureRange: TemperatureRange{1500, 9000}, }, }, { Major: 2, Minor: 77, Features: Features{ ExtendedMultizone: OptionalBoolPtr(true), }, }, }, }, ProductMapKey(1, 39): { VendorName: "LIFX", VendorID: 1, ProductName: "LIFX Downlight White to Warm", ProductID: 39, Features: Features{ HEV: OptionalBoolPtr(false), Color: OptionalBoolPtr(false), Chain: OptionalBoolPtr(false), Matrix: OptionalBoolPtr(false), Relays: OptionalBoolPtr(false), Buttons: OptionalBoolPtr(false), Infrared: OptionalBoolPtr(false), Multizone: OptionalBoolPtr(false), ExtendedMultizone: OptionalBoolPtr(false), TemperatureRange: TemperatureRange{2500, 9000}, }, Upgrades: Upgrades{ { Major: 2, Minor: 80, Features: Features{ TemperatureRange: TemperatureRange{1500, 9000}, }, }, }, }, ProductMapKey(1, 40): { VendorName: "LIFX", VendorID: 1, ProductName: "LIFX Downlight", ProductID: 40, Features: Features{ HEV: OptionalBoolPtr(false), Color: OptionalBoolPtr(true), Chain: OptionalBoolPtr(false), Matrix: OptionalBoolPtr(false), Relays: OptionalBoolPtr(false), Buttons: OptionalBoolPtr(false), Infrared: OptionalBoolPtr(false), Multizone: OptionalBoolPtr(false), ExtendedMultizone: OptionalBoolPtr(false), TemperatureRange: TemperatureRange{2500, 9000}, }, Upgrades: Upgrades{ { Major: 2, Minor: 80, Features: Features{ TemperatureRange: TemperatureRange{1500, 9000}, }, }, }, }, ProductMapKey(1, 43): { VendorName: "LIFX", VendorID: 1, ProductName: "LIFX A19", ProductID: 43, Features: Features{ HEV: OptionalBoolPtr(false), Color: OptionalBoolPtr(true), Chain: OptionalBoolPtr(false), Matrix: OptionalBoolPtr(false), Relays: OptionalBoolPtr(false), Buttons: OptionalBoolPtr(false), Infrared: OptionalBoolPtr(false), Multizone: OptionalBoolPtr(false), ExtendedMultizone: OptionalBoolPtr(false), TemperatureRange: TemperatureRange{2500, 9000}, }, Upgrades: Upgrades{ { Major: 2, Minor: 80, Features: Features{ TemperatureRange: TemperatureRange{1500, 9000}, }, }, }, }, ProductMapKey(1, 44): { VendorName: "LIFX", VendorID: 1, ProductName: "LIFX BR30", ProductID: 44, Features: Features{ HEV: OptionalBoolPtr(false), Color: OptionalBoolPtr(true), Chain: OptionalBoolPtr(false), Matrix: OptionalBoolPtr(false), Relays: OptionalBoolPtr(false), Buttons: OptionalBoolPtr(false), Infrared: OptionalBoolPtr(false), Multizone: OptionalBoolPtr(false), ExtendedMultizone: OptionalBoolPtr(false), TemperatureRange: TemperatureRange{2500, 9000}, }, Upgrades: Upgrades{ { Major: 2, Minor: 80, Features: Features{ TemperatureRange: TemperatureRange{1500, 9000}, }, }, }, }, ProductMapKey(1, 45): { VendorName: "LIFX", VendorID: 1, ProductName: "LIFX A19 Night Vision", ProductID: 45, Features: Features{ HEV: OptionalBoolPtr(false), Color: OptionalBoolPtr(true), Chain: OptionalBoolPtr(false), Matrix: OptionalBoolPtr(false), Relays: OptionalBoolPtr(false), Buttons: OptionalBoolPtr(false), Infrared: OptionalBoolPtr(true), Multizone: OptionalBoolPtr(false), ExtendedMultizone: OptionalBoolPtr(false), TemperatureRange: TemperatureRange{2500, 9000}, }, Upgrades: Upgrades{ { Major: 2, Minor: 80, Features: Features{ TemperatureRange: TemperatureRange{1500, 9000}, }, }, }, }, ProductMapKey(1, 46): { VendorName: "LIFX", VendorID: 1, ProductName: "LIFX BR30 Night Vision", ProductID: 46, Features: Features{ HEV: OptionalBoolPtr(false), Color: OptionalBoolPtr(true), Chain: OptionalBoolPtr(false), Matrix: OptionalBoolPtr(false), Relays: OptionalBoolPtr(false), Buttons: OptionalBoolPtr(false), Infrared: OptionalBoolPtr(true), Multizone: OptionalBoolPtr(false), ExtendedMultizone: OptionalBoolPtr(false), TemperatureRange: TemperatureRange{2500, 9000}, }, Upgrades: Upgrades{ { Major: 2, Minor: 80, Features: Features{ TemperatureRange: TemperatureRange{1500, 9000}, }, }, }, }, ProductMapKey(1, 49): { VendorName: "LIFX", VendorID: 1, ProductName: "LIFX Mini Color", ProductID: 49, Features: Features{ HEV: OptionalBoolPtr(false), Color: OptionalBoolPtr(true), Chain: OptionalBoolPtr(false), Matrix: OptionalBoolPtr(false), Relays: OptionalBoolPtr(false), Buttons: OptionalBoolPtr(false), Infrared: OptionalBoolPtr(false), Multizone: OptionalBoolPtr(false), ExtendedMultizone: OptionalBoolPtr(false), TemperatureRange: TemperatureRange{1500, 9000}, }, }, ProductMapKey(1, 50): { VendorName: "LIFX", VendorID: 1, ProductName: "LIFX Mini White to Warm", ProductID: 50, Features: Features{ HEV: OptionalBoolPtr(false), Color: OptionalBoolPtr(false), Chain: OptionalBoolPtr(false), Matrix: OptionalBoolPtr(false), Relays: OptionalBoolPtr(false), Buttons: OptionalBoolPtr(false), Infrared: OptionalBoolPtr(false), Multizone: OptionalBoolPtr(false), ExtendedMultizone: OptionalBoolPtr(false), TemperatureRange: TemperatureRange{1500, 6500}, }, Upgrades: Upgrades{ { Major: 3, Minor: 70, Features: Features{ TemperatureRange: TemperatureRange{1500, 9000}, }, }, }, }, ProductMapKey(1, 51): { VendorName: "LIFX", VendorID: 1, ProductName: "LIFX Mini White", ProductID: 51, Features: Features{ HEV: OptionalBoolPtr(false), Color: OptionalBoolPtr(false), Chain: OptionalBoolPtr(false), Matrix: OptionalBoolPtr(false), Relays: OptionalBoolPtr(false), Buttons: OptionalBoolPtr(false), Infrared: OptionalBoolPtr(false), Multizone: OptionalBoolPtr(false), ExtendedMultizone: OptionalBoolPtr(false), TemperatureRange: TemperatureRange{2700, 2700}, }, }, ProductMapKey(1, 52): { VendorName: "LIFX", VendorID: 1, ProductName: "LIFX GU10", ProductID: 52, Features: Features{ HEV: OptionalBoolPtr(false), Color: OptionalBoolPtr(true), Chain: OptionalBoolPtr(false), Matrix: OptionalBoolPtr(false), Relays: OptionalBoolPtr(false), Buttons: OptionalBoolPtr(false), Infrared: OptionalBoolPtr(false), Multizone: OptionalBoolPtr(false), ExtendedMultizone: OptionalBoolPtr(false), TemperatureRange: TemperatureRange{1500, 9000}, }, }, ProductMapKey(1, 53): { VendorName: "LIFX", VendorID: 1, ProductName: "LIFX GU10", ProductID: 53, Features: Features{ HEV: OptionalBoolPtr(false), Color: OptionalBoolPtr(true), Chain: OptionalBoolPtr(false), Matrix: OptionalBoolPtr(false), Relays: OptionalBoolPtr(false), Buttons: OptionalBoolPtr(false), Infrared: OptionalBoolPtr(false), Multizone: OptionalBoolPtr(false), ExtendedMultizone: OptionalBoolPtr(false), TemperatureRange: TemperatureRange{1500, 9000}, }, }, ProductMapKey(1, 55): { VendorName: "LIFX", VendorID: 1, ProductName: "LIFX Tile", ProductID: 55, Features: Features{ HEV: OptionalBoolPtr(false), Color: OptionalBoolPtr(true), Chain: OptionalBoolPtr(true), Matrix: OptionalBoolPtr(true), Relays: OptionalBoolPtr(false), Buttons: OptionalBoolPtr(false), Infrared: OptionalBoolPtr(false), Multizone: OptionalBoolPtr(false), ExtendedMultizone: OptionalBoolPtr(false), TemperatureRange: TemperatureRange{2500, 9000}, }, }, ProductMapKey(1, 57): { VendorName: "LIFX", VendorID: 1, ProductName: "LIFX Candle", ProductID: 57, Features: Features{ HEV: OptionalBoolPtr(false), Color: OptionalBoolPtr(true), Chain: OptionalBoolPtr(false), Matrix: OptionalBoolPtr(true), Relays: OptionalBoolPtr(false), Buttons: OptionalBoolPtr(false), Infrared: OptionalBoolPtr(false), Multizone: OptionalBoolPtr(false), ExtendedMultizone: OptionalBoolPtr(false), TemperatureRange: TemperatureRange{1500, 9000}, }, }, ProductMapKey(1, 59): { VendorName: "LIFX", VendorID: 1, ProductName: "LIFX Mini Color", ProductID: 59, Features: Features{ HEV: OptionalBoolPtr(false), Color: OptionalBoolPtr(true), Chain: OptionalBoolPtr(false), Matrix: OptionalBoolPtr(false), Relays: OptionalBoolPtr(false), Buttons: OptionalBoolPtr(false), Infrared: OptionalBoolPtr(false), Multizone: OptionalBoolPtr(false), ExtendedMultizone: OptionalBoolPtr(false), TemperatureRange: TemperatureRange{1500, 9000}, }, }, ProductMapKey(1, 60): { VendorName: "LIFX", VendorID: 1, ProductName: "LIFX Mini White to Warm", ProductID: 60, Features: Features{ HEV: OptionalBoolPtr(false), Color: OptionalBoolPtr(false), Chain: OptionalBoolPtr(false), Matrix: OptionalBoolPtr(false), Relays: OptionalBoolPtr(false), Buttons: OptionalBoolPtr(false), Infrared: OptionalBoolPtr(false), Multizone: OptionalBoolPtr(false), ExtendedMultizone: OptionalBoolPtr(false), TemperatureRange: TemperatureRange{1500, 6500}, }, Upgrades: Upgrades{ { Major: 3, Minor: 70, Features: Features{ TemperatureRange: TemperatureRange{1500, 9000}, }, }, }, }, ProductMapKey(1, 61): { VendorName: "LIFX", VendorID: 1, ProductName: "LIFX Mini White", ProductID: 61, Features: Features{ HEV: OptionalBoolPtr(false), Color: OptionalBoolPtr(false), Chain: OptionalBoolPtr(false), Matrix: OptionalBoolPtr(false), Relays: OptionalBoolPtr(false), Buttons: OptionalBoolPtr(false), Infrared: OptionalBoolPtr(false), Multizone: OptionalBoolPtr(false), ExtendedMultizone: OptionalBoolPtr(false), TemperatureRange: TemperatureRange{2700, 2700}, }, }, ProductMapKey(1, 62): { VendorName: "LIFX", VendorID: 1, ProductName: "LIFX A19", ProductID: 62, Features: Features{ HEV: OptionalBoolPtr(false), Color: OptionalBoolPtr(true), Chain: OptionalBoolPtr(false), Matrix: OptionalBoolPtr(false), Relays: OptionalBoolPtr(false), Buttons: OptionalBoolPtr(false), Infrared: OptionalBoolPtr(false), Multizone: OptionalBoolPtr(false), ExtendedMultizone: OptionalBoolPtr(false), TemperatureRange: TemperatureRange{1500, 9000}, }, }, ProductMapKey(1, 63): { VendorName: "LIFX", VendorID: 1, ProductName: "LIFX BR30", ProductID: 63, Features: Features{ HEV: OptionalBoolPtr(false), Color: OptionalBoolPtr(true), Chain: OptionalBoolPtr(false), Matrix: OptionalBoolPtr(false), Relays: OptionalBoolPtr(false), Buttons: OptionalBoolPtr(false), Infrared: OptionalBoolPtr(false), Multizone: OptionalBoolPtr(false), ExtendedMultizone: OptionalBoolPtr(false), TemperatureRange: TemperatureRange{1500, 9000}, }, }, ProductMapKey(1, 64): { VendorName: "LIFX", VendorID: 1, ProductName: "LIFX A19 Night Vision", ProductID: 64, Features: Features{ HEV: OptionalBoolPtr(false), Color: OptionalBoolPtr(true), Chain: OptionalBoolPtr(false), Matrix: OptionalBoolPtr(false), Relays: OptionalBoolPtr(false), Buttons: OptionalBoolPtr(false), Infrared: OptionalBoolPtr(true), Multizone: OptionalBoolPtr(false), ExtendedMultizone: OptionalBoolPtr(false), TemperatureRange: TemperatureRange{1500, 9000}, }, }, ProductMapKey(1, 65): { VendorName: "LIFX", VendorID: 1, ProductName: "LIFX BR30 Night Vision", ProductID: 65, Features: Features{ HEV: OptionalBoolPtr(false), Color: OptionalBoolPtr(true), Chain: OptionalBoolPtr(false), Matrix: OptionalBoolPtr(false), Relays: OptionalBoolPtr(false), Buttons: OptionalBoolPtr(false), Infrared: OptionalBoolPtr(true), Multizone: OptionalBoolPtr(false), ExtendedMultizone: OptionalBoolPtr(false), TemperatureRange: TemperatureRange{1500, 9000}, }, }, ProductMapKey(1, 66): { VendorName: "LIFX", VendorID: 1, ProductName: "LIFX Mini White", ProductID: 66, Features: Features{ HEV: OptionalBoolPtr(false), Color: OptionalBoolPtr(false), Chain: OptionalBoolPtr(false), Matrix: OptionalBoolPtr(false), Relays: OptionalBoolPtr(false), Buttons: OptionalBoolPtr(false), Infrared: OptionalBoolPtr(false), Multizone: OptionalBoolPtr(false), ExtendedMultizone: OptionalBoolPtr(false), TemperatureRange: TemperatureRange{2700, 2700}, }, }, ProductMapKey(1, 68): { VendorName: "LIFX", VendorID: 1, ProductName: "LIFX Candle", ProductID: 68, Features: Features{ HEV: OptionalBoolPtr(false), Color: OptionalBoolPtr(true), Chain: OptionalBoolPtr(false), Matrix: OptionalBoolPtr(true), Relays: OptionalBoolPtr(false), Buttons: OptionalBoolPtr(false), Infrared: OptionalBoolPtr(false), Multizone: OptionalBoolPtr(false), ExtendedMultizone: OptionalBoolPtr(false), TemperatureRange: TemperatureRange{1500, 9000}, }, }, ProductMapKey(1, 70): { VendorName: "LIFX", VendorID: 1, ProductName: "LIFX Switch", ProductID: 70, Features: Features{ HEV: OptionalBoolPtr(false), Color: OptionalBoolPtr(false), Chain: OptionalBoolPtr(false), Matrix: OptionalBoolPtr(false), Relays: OptionalBoolPtr(true), Buttons: OptionalBoolPtr(true), Infrared: OptionalBoolPtr(false), Multizone: OptionalBoolPtr(false), ExtendedMultizone: OptionalBoolPtr(false), }, }, ProductMapKey(1, 71): { VendorName: "LIFX", VendorID: 1, ProductName: "LIFX Switch", ProductID: 71, Features: Features{ HEV: OptionalBoolPtr(false), Color: OptionalBoolPtr(false), Chain: OptionalBoolPtr(false), Matrix: OptionalBoolPtr(false), Relays: OptionalBoolPtr(true), Buttons: OptionalBoolPtr(true), Infrared: OptionalBoolPtr(false), Multizone: OptionalBoolPtr(false), ExtendedMultizone: OptionalBoolPtr(false), }, }, ProductMapKey(1, 81): { VendorName: "LIFX", VendorID: 1, ProductName: "LIFX Candle White to Warm", ProductID: 81, Features: Features{ HEV: OptionalBoolPtr(false), Color: OptionalBoolPtr(false), Chain: OptionalBoolPtr(false), Matrix: OptionalBoolPtr(false), Relays: OptionalBoolPtr(false), Buttons: OptionalBoolPtr(false), Infrared: OptionalBoolPtr(false), Multizone: OptionalBoolPtr(false), ExtendedMultizone: OptionalBoolPtr(false), TemperatureRange: TemperatureRange{2200, 6500}, }, }, ProductMapKey(1, 82): { VendorName: "LIFX", VendorID: 1, ProductName: "LIFX Filament Clear", ProductID: 82, Features: Features{ HEV: OptionalBoolPtr(false), Color: OptionalBoolPtr(false), Chain: OptionalBoolPtr(false), Matrix: OptionalBoolPtr(false), Relays: OptionalBoolPtr(false), Buttons: OptionalBoolPtr(false), Infrared: OptionalBoolPtr(false), Multizone: OptionalBoolPtr(false), ExtendedMultizone: OptionalBoolPtr(false), TemperatureRange: TemperatureRange{2100, 2100}, }, }, ProductMapKey(1, 85): { VendorName: "LIFX", VendorID: 1, ProductName: "LIFX Filament Amber", ProductID: 85, Features: Features{ HEV: OptionalBoolPtr(false), Color: OptionalBoolPtr(false), Chain: OptionalBoolPtr(false), Matrix: OptionalBoolPtr(false), Relays: OptionalBoolPtr(false), Buttons: OptionalBoolPtr(false), Infrared: OptionalBoolPtr(false), Multizone: OptionalBoolPtr(false), ExtendedMultizone: OptionalBoolPtr(false), TemperatureRange: TemperatureRange{2000, 2000}, }, }, ProductMapKey(1, 87): { VendorName: "LIFX", VendorID: 1, ProductName: "LIFX Mini White", ProductID: 87, Features: Features{ HEV: OptionalBoolPtr(false), Color: OptionalBoolPtr(false), Chain: OptionalBoolPtr(false), Matrix: OptionalBoolPtr(false), Relays: OptionalBoolPtr(false), Buttons: OptionalBoolPtr(false), Infrared: OptionalBoolPtr(false), Multizone: OptionalBoolPtr(false), ExtendedMultizone: OptionalBoolPtr(false), TemperatureRange: TemperatureRange{2700, 2700}, }, }, ProductMapKey(1, 88): { VendorName: "LIFX", VendorID: 1, ProductName: "LIFX Mini White", ProductID: 88, Features: Features{ HEV: OptionalBoolPtr(false), Color: OptionalBoolPtr(false), Chain: OptionalBoolPtr(false), Matrix: OptionalBoolPtr(false), Relays: OptionalBoolPtr(false), Buttons: OptionalBoolPtr(false), Infrared: OptionalBoolPtr(false), Multizone: OptionalBoolPtr(false), ExtendedMultizone: OptionalBoolPtr(false), TemperatureRange: TemperatureRange{2700, 2700}, }, }, ProductMapKey(1, 89): { VendorName: "LIFX", VendorID: 1, ProductName: "LIFX Switch", ProductID: 89, Features: Features{ HEV: OptionalBoolPtr(false), Color: OptionalBoolPtr(false), Chain: OptionalBoolPtr(false), Matrix: OptionalBoolPtr(false), Relays: OptionalBoolPtr(true), Buttons: OptionalBoolPtr(true), Infrared: OptionalBoolPtr(false), Multizone: OptionalBoolPtr(false), ExtendedMultizone: OptionalBoolPtr(false), }, }, ProductMapKey(1, 90): { VendorName: "LIFX", VendorID: 1, ProductName: "LIFX Clean", ProductID: 90, Features: Features{ HEV: OptionalBoolPtr(true), Color: OptionalBoolPtr(true), Chain: OptionalBoolPtr(false), Matrix: OptionalBoolPtr(false), Relays: OptionalBoolPtr(false), Buttons: OptionalBoolPtr(false), Infrared: OptionalBoolPtr(false), Multizone: OptionalBoolPtr(false), ExtendedMultizone: OptionalBoolPtr(false), TemperatureRange: TemperatureRange{1500, 9000}, }, }, ProductMapKey(1, 91): { VendorName: "LIFX", VendorID: 1, ProductName: "LIFX Color", ProductID: 91, Features: Features{ HEV: OptionalBoolPtr(false), Color: OptionalBoolPtr(true), Chain: OptionalBoolPtr(false), Matrix: OptionalBoolPtr(false), Relays: OptionalBoolPtr(false), Buttons: OptionalBoolPtr(false), Infrared: OptionalBoolPtr(false), Multizone: OptionalBoolPtr(false), ExtendedMultizone: OptionalBoolPtr(false), TemperatureRange: TemperatureRange{1500, 9000}, }, }, ProductMapKey(1, 92): { VendorName: "LIFX", VendorID: 1, ProductName: "LIFX Color", ProductID: 92, Features: Features{ HEV: OptionalBoolPtr(false), Color: OptionalBoolPtr(true), Chain: OptionalBoolPtr(false), Matrix: OptionalBoolPtr(false), Relays: OptionalBoolPtr(false), Buttons: OptionalBoolPtr(false), Infrared: OptionalBoolPtr(false), Multizone: OptionalBoolPtr(false), ExtendedMultizone: OptionalBoolPtr(false), TemperatureRange: TemperatureRange{1500, 9000}, }, }, ProductMapKey(1, 93): { VendorName: "LIFX", VendorID: 1, ProductName: "LIFX A19 US", ProductID: 93, Features: Features{ HEV: OptionalBoolPtr(false), Color: OptionalBoolPtr(true), Chain: OptionalBoolPtr(false), Matrix: OptionalBoolPtr(false), Relays: OptionalBoolPtr(false), Buttons: OptionalBoolPtr(false), Infrared: OptionalBoolPtr(false), Multizone: OptionalBoolPtr(false), ExtendedMultizone: OptionalBoolPtr(false), TemperatureRange: TemperatureRange{1500, 9000}, }, }, ProductMapKey(1, 94): { VendorName: "LIFX", VendorID: 1, ProductName: "LIFX BR30", ProductID: 94, Features: Features{ HEV: OptionalBoolPtr(false), Color: OptionalBoolPtr(true), Chain: OptionalBoolPtr(false), Matrix: OptionalBoolPtr(false), Relays: OptionalBoolPtr(false), Buttons: OptionalBoolPtr(false), Infrared: OptionalBoolPtr(false), Multizone: OptionalBoolPtr(false), ExtendedMultizone: OptionalBoolPtr(false), TemperatureRange: TemperatureRange{1500, 9000}, }, }, ProductMapKey(1, 96): { VendorName: "LIFX", VendorID: 1, ProductName: "LIFX Candle White to Warm", ProductID: 96, Features: Features{ HEV: OptionalBoolPtr(false), Color: OptionalBoolPtr(false), Chain: OptionalBoolPtr(false), Matrix: OptionalBoolPtr(false), Relays: OptionalBoolPtr(false), Buttons: OptionalBoolPtr(false), Infrared: OptionalBoolPtr(false), Multizone: OptionalBoolPtr(false), ExtendedMultizone: OptionalBoolPtr(false), TemperatureRange: TemperatureRange{2200, 6500}, }, }, ProductMapKey(1, 97): { VendorName: "LIFX", VendorID: 1, ProductName: "LIFX A19", ProductID: 97, Features: Features{ HEV: OptionalBoolPtr(false), Color: OptionalBoolPtr(true), Chain: OptionalBoolPtr(false), Matrix: OptionalBoolPtr(false), Relays: OptionalBoolPtr(false), Buttons: OptionalBoolPtr(false), Infrared: OptionalBoolPtr(false), Multizone: OptionalBoolPtr(false), ExtendedMultizone: OptionalBoolPtr(false), TemperatureRange: TemperatureRange{1500, 9000}, }, }, ProductMapKey(1, 98): { VendorName: "LIFX", VendorID: 1, ProductName: "LIFX BR30", ProductID: 98, Features: Features{ HEV: OptionalBoolPtr(false), Color: OptionalBoolPtr(true), Chain: OptionalBoolPtr(false), Matrix: OptionalBoolPtr(false), Relays: OptionalBoolPtr(false), Buttons: OptionalBoolPtr(false), Infrared: OptionalBoolPtr(false), Multizone: OptionalBoolPtr(false), ExtendedMultizone: OptionalBoolPtr(false), TemperatureRange: TemperatureRange{1500, 9000}, }, }, ProductMapKey(1, 99): { VendorName: "LIFX", VendorID: 1, ProductName: "LIFX Clean", ProductID: 99, Features: Features{ HEV: OptionalBoolPtr(true), Color: OptionalBoolPtr(true), Chain: OptionalBoolPtr(false), Matrix: OptionalBoolPtr(false), Relays: OptionalBoolPtr(false), Buttons: OptionalBoolPtr(false), Infrared: OptionalBoolPtr(false), Multizone: OptionalBoolPtr(false), ExtendedMultizone: OptionalBoolPtr(false), TemperatureRange: TemperatureRange{1500, 9000}, }, }, ProductMapKey(1, 100): { VendorName: "LIFX", VendorID: 1, ProductName: "LIFX Filament Clear", ProductID: 100, Features: Features{ HEV: OptionalBoolPtr(false), Color: OptionalBoolPtr(false), Chain: OptionalBoolPtr(false), Matrix: OptionalBoolPtr(false), Relays: OptionalBoolPtr(false), Buttons: OptionalBoolPtr(false), Infrared: OptionalBoolPtr(false), Multizone: OptionalBoolPtr(false), ExtendedMultizone: OptionalBoolPtr(false), TemperatureRange: TemperatureRange{2100, 2100}, }, }, ProductMapKey(1, 101): { VendorName: "LIFX", VendorID: 1, ProductName: "LIFX Filament Amber", ProductID: 101, Features: Features{ HEV: OptionalBoolPtr(false), Color: OptionalBoolPtr(false), Chain: OptionalBoolPtr(false), Matrix: OptionalBoolPtr(false), Relays: OptionalBoolPtr(false), Buttons: OptionalBoolPtr(false), Infrared: OptionalBoolPtr(false), Multizone: OptionalBoolPtr(false), ExtendedMultizone: OptionalBoolPtr(false), TemperatureRange: TemperatureRange{2000, 2000}, }, }, ProductMapKey(1, 109): { VendorName: "LIFX", VendorID: 1, ProductName: "LIFX A19 Night Vision", ProductID: 109, Features: Features{ HEV: OptionalBoolPtr(false), Color: OptionalBoolPtr(true), Chain: OptionalBoolPtr(false), Matrix: OptionalBoolPtr(false), Relays: OptionalBoolPtr(false), Buttons: OptionalBoolPtr(false), Infrared: OptionalBoolPtr(true), Multizone: OptionalBoolPtr(false), ExtendedMultizone: OptionalBoolPtr(false), TemperatureRange: TemperatureRange{1500, 9000}, }, }, ProductMapKey(1, 110): { VendorName: "LIFX", VendorID: 1, ProductName: "LIFX BR30 Night Vision", ProductID: 110, Features: Features{ HEV: OptionalBoolPtr(false), Color: OptionalBoolPtr(true), Chain: OptionalBoolPtr(false), Matrix: OptionalBoolPtr(false), Relays: OptionalBoolPtr(false), Buttons: OptionalBoolPtr(false), Infrared: OptionalBoolPtr(true), Multizone: OptionalBoolPtr(false), ExtendedMultizone: OptionalBoolPtr(false), TemperatureRange: TemperatureRange{1500, 9000}, }, }, ProductMapKey(1, 111): { VendorName: "LIFX", VendorID: 1, ProductName: "LIFX A19 Night Vision", ProductID: 111, Features: Features{ HEV: OptionalBoolPtr(false), Color: OptionalBoolPtr(true), Chain: OptionalBoolPtr(false), Matrix: OptionalBoolPtr(false), Relays: OptionalBoolPtr(false), Buttons: OptionalBoolPtr(false), Infrared: OptionalBoolPtr(true), Multizone: OptionalBoolPtr(false), ExtendedMultizone: OptionalBoolPtr(false), TemperatureRange: TemperatureRange{1500, 9000}, }, }, ProductMapKey(1, 112): { VendorName: "LIFX", VendorID: 1, ProductName: "LIFX BR30 Night Vision Intl", ProductID: 112, Features: Features{ HEV: OptionalBoolPtr(false), Color: OptionalBoolPtr(true), Chain: OptionalBoolPtr(false), Matrix: OptionalBoolPtr(false), Relays: OptionalBoolPtr(false), Buttons: OptionalBoolPtr(false), Infrared: OptionalBoolPtr(true), Multizone: OptionalBoolPtr(false), ExtendedMultizone: OptionalBoolPtr(false), TemperatureRange: TemperatureRange{1500, 9000}, }, }, ProductMapKey(1, 113): { VendorName: "LIFX", VendorID: 1, ProductName: "LIFX Mini WW US", ProductID: 113, Features: Features{ HEV: OptionalBoolPtr(false), Color: OptionalBoolPtr(false), Chain: OptionalBoolPtr(false), Matrix: OptionalBoolPtr(false), Relays: OptionalBoolPtr(false), Buttons: OptionalBoolPtr(false), Infrared: OptionalBoolPtr(false), Multizone: OptionalBoolPtr(false), ExtendedMultizone: OptionalBoolPtr(false), TemperatureRange: TemperatureRange{1500, 9000}, }, }, ProductMapKey(1, 114): { VendorName: "LIFX", VendorID: 1, ProductName: "LIFX Mini WW Intl", ProductID: 114, Features: Features{ HEV: OptionalBoolPtr(false), Color: OptionalBoolPtr(false), Chain: OptionalBoolPtr(false), Matrix: OptionalBoolPtr(false), Relays: OptionalBoolPtr(false), Buttons: OptionalBoolPtr(false), Infrared: OptionalBoolPtr(false), Multizone: OptionalBoolPtr(false), ExtendedMultizone: OptionalBoolPtr(false), TemperatureRange: TemperatureRange{1500, 9000}, }, }, ProductMapKey(1, 115): { VendorName: "LIFX", VendorID: 1, ProductName: "LIFX Switch", ProductID: 115, Features: Features{ HEV: OptionalBoolPtr(false), Color: OptionalBoolPtr(false), Chain: OptionalBoolPtr(false), Matrix: OptionalBoolPtr(false), Relays: OptionalBoolPtr(true), Buttons: OptionalBoolPtr(true), Infrared: OptionalBoolPtr(false), Multizone: OptionalBoolPtr(false), ExtendedMultizone: OptionalBoolPtr(false), }, }, ProductMapKey(1, 116): { VendorName: "LIFX", VendorID: 1, ProductName: "LIFX Switch", ProductID: 116, Features: Features{ HEV: OptionalBoolPtr(false), Color: OptionalBoolPtr(false), Chain: OptionalBoolPtr(false), Matrix: OptionalBoolPtr(false), Relays: OptionalBoolPtr(true), Buttons: OptionalBoolPtr(true), Infrared: OptionalBoolPtr(false), Multizone: OptionalBoolPtr(false), ExtendedMultizone: OptionalBoolPtr(false), }, }, ProductMapKey(1, 117): { VendorName: "LIFX", VendorID: 1, ProductName: "LIFX Z US", ProductID: 117, Features: Features{ HEV: OptionalBoolPtr(false), Color: OptionalBoolPtr(true), Chain: OptionalBoolPtr(false), Matrix: OptionalBoolPtr(false), Relays: OptionalBoolPtr(false), Buttons: OptionalBoolPtr(false), Infrared: OptionalBoolPtr(false), Multizone: OptionalBoolPtr(true), ExtendedMultizone: OptionalBoolPtr(true), TemperatureRange: TemperatureRange{1500, 9000}, }, }, ProductMapKey(1, 118): { VendorName: "LIFX", VendorID: 1, ProductName: "LIFX Z Intl", ProductID: 118, Features: Features{ HEV: OptionalBoolPtr(false), Color: OptionalBoolPtr(true), Chain: OptionalBoolPtr(false), Matrix: OptionalBoolPtr(false), Relays: OptionalBoolPtr(false), Buttons: OptionalBoolPtr(false), Infrared: OptionalBoolPtr(false), Multizone: OptionalBoolPtr(true), ExtendedMultizone: OptionalBoolPtr(true), TemperatureRange: TemperatureRange{1500, 9000}, }, }, ProductMapKey(1, 119): { VendorName: "LIFX", VendorID: 1, ProductName: "LIFX Beam US", ProductID: 119, Features: Features{ HEV: OptionalBoolPtr(false), Color: OptionalBoolPtr(true), Chain: OptionalBoolPtr(false), Matrix: OptionalBoolPtr(false), Relays: OptionalBoolPtr(false), Buttons: OptionalBoolPtr(false), Infrared: OptionalBoolPtr(false), Multizone: OptionalBoolPtr(true), ExtendedMultizone: OptionalBoolPtr(true), TemperatureRange: TemperatureRange{1500, 9000}, }, }, ProductMapKey(1, 120): { VendorName: "LIFX", VendorID: 1, ProductName: "LIFX Beam Intl", ProductID: 120, Features: Features{ HEV: OptionalBoolPtr(false), Color: OptionalBoolPtr(true), Chain: OptionalBoolPtr(false), Matrix: OptionalBoolPtr(false), Relays: OptionalBoolPtr(false), Buttons: OptionalBoolPtr(false), Infrared: OptionalBoolPtr(false), Multizone: OptionalBoolPtr(true), ExtendedMultizone: OptionalBoolPtr(true), TemperatureRange: TemperatureRange{1500, 9000}, }, }, ProductMapKey(1, 123): { VendorName: "LIFX", VendorID: 1, ProductName: "LIFX Color US", ProductID: 123, Features: Features{ HEV: OptionalBoolPtr(false), Color: OptionalBoolPtr(true), Chain: OptionalBoolPtr(false), Matrix: OptionalBoolPtr(false), Relays: OptionalBoolPtr(false), Buttons: OptionalBoolPtr(false), Infrared: OptionalBoolPtr(false), Multizone: OptionalBoolPtr(false), ExtendedMultizone: OptionalBoolPtr(false), TemperatureRange: TemperatureRange{1500, 9000}, }, }, ProductMapKey(1, 124): { VendorName: "LIFX", VendorID: 1, ProductName: "LIFX Color Intl", ProductID: 124, Features: Features{ HEV: OptionalBoolPtr(false), Color: OptionalBoolPtr(true), Chain: OptionalBoolPtr(false), Matrix: OptionalBoolPtr(false), Relays: OptionalBoolPtr(false), Buttons: OptionalBoolPtr(false), Infrared: OptionalBoolPtr(false), Multizone: OptionalBoolPtr(false), ExtendedMultizone: OptionalBoolPtr(false), TemperatureRange: TemperatureRange{1500, 9000}, }, }, ProductMapKey(1, 125): { VendorName: "LIFX", VendorID: 1, ProductName: "LIFX White to Warm US", ProductID: 125, Features: Features{ HEV: OptionalBoolPtr(false), Color: OptionalBoolPtr(false), Chain: OptionalBoolPtr(false), Matrix: OptionalBoolPtr(false), Relays: OptionalBoolPtr(false), Buttons: OptionalBoolPtr(false), Infrared: OptionalBoolPtr(false), Multizone: OptionalBoolPtr(false), ExtendedMultizone: OptionalBoolPtr(false), TemperatureRange: TemperatureRange{1500, 9000}, }, }, ProductMapKey(1, 126): { VendorName: "LIFX", VendorID: 1, ProductName: "LIFX White to Warm Intl", ProductID: 126, Features: Features{ HEV: OptionalBoolPtr(false), Color: OptionalBoolPtr(false), Chain: OptionalBoolPtr(false), Matrix: OptionalBoolPtr(false), Relays: OptionalBoolPtr(false), Buttons: OptionalBoolPtr(false), Infrared: OptionalBoolPtr(false), Multizone: OptionalBoolPtr(false), ExtendedMultizone: OptionalBoolPtr(false), TemperatureRange: TemperatureRange{1500, 9000}, }, }, ProductMapKey(1, 127): { VendorName: "LIFX", VendorID: 1, ProductName: "LIFX White US", ProductID: 127, Features: Features{ HEV: OptionalBoolPtr(false), Color: OptionalBoolPtr(false), Chain: OptionalBoolPtr(false), Matrix: OptionalBoolPtr(false), Relays: OptionalBoolPtr(false), Buttons: OptionalBoolPtr(false), Infrared: OptionalBoolPtr(false), Multizone: OptionalBoolPtr(false), ExtendedMultizone: OptionalBoolPtr(false), TemperatureRange: TemperatureRange{2700, 2700}, }, }, ProductMapKey(1, 128): { VendorName: "LIFX", VendorID: 1, ProductName: "LIFX White Intl", ProductID: 128, Features: Features{ HEV: OptionalBoolPtr(false), Color: OptionalBoolPtr(false), Chain: OptionalBoolPtr(false), Matrix: OptionalBoolPtr(false), Relays: OptionalBoolPtr(false), Buttons: OptionalBoolPtr(false), Infrared: OptionalBoolPtr(false), Multizone: OptionalBoolPtr(false), ExtendedMultizone: OptionalBoolPtr(false), TemperatureRange: TemperatureRange{2700, 2700}, }, }, ProductMapKey(1, 129): { VendorName: "LIFX", VendorID: 1, ProductName: "LIFX Color US", ProductID: 129, Features: Features{ HEV: OptionalBoolPtr(false), Color: OptionalBoolPtr(true), Chain: OptionalBoolPtr(false), Matrix: OptionalBoolPtr(false), Relays: OptionalBoolPtr(false), Buttons: OptionalBoolPtr(false), Infrared: OptionalBoolPtr(false), Multizone: OptionalBoolPtr(false), ExtendedMultizone: OptionalBoolPtr(false), TemperatureRange: TemperatureRange{1500, 9000}, }, }, ProductMapKey(1, 130): { VendorName: "LIFX", VendorID: 1, ProductName: "LIFX Color Intl", ProductID: 130, Features: Features{ HEV: OptionalBoolPtr(false), Color: OptionalBoolPtr(true), Chain: OptionalBoolPtr(false), Matrix: OptionalBoolPtr(false), Relays: OptionalBoolPtr(false), Buttons: OptionalBoolPtr(false), Infrared: OptionalBoolPtr(false), Multizone: OptionalBoolPtr(false), ExtendedMultizone: OptionalBoolPtr(false), TemperatureRange: TemperatureRange{1500, 9000}, }, }, ProductMapKey(1, 131): { VendorName: "LIFX", VendorID: 1, ProductName: "LIFX White To Warm US", ProductID: 131, Features: Features{ HEV: OptionalBoolPtr(false), Color: OptionalBoolPtr(false), Chain: OptionalBoolPtr(false), Matrix: OptionalBoolPtr(false), Relays: OptionalBoolPtr(false), Buttons: OptionalBoolPtr(false), Infrared: OptionalBoolPtr(false), Multizone: OptionalBoolPtr(false), ExtendedMultizone: OptionalBoolPtr(false), TemperatureRange: TemperatureRange{1500, 9000}, }, }, ProductMapKey(1, 132): { VendorName: "LIFX", VendorID: 1, ProductName: "LIFX White To Warm Intl", ProductID: 132, Features: Features{ HEV: OptionalBoolPtr(false), Color: OptionalBoolPtr(false), Chain: OptionalBoolPtr(false), Matrix: OptionalBoolPtr(false), Relays: OptionalBoolPtr(false), Buttons: OptionalBoolPtr(false), Infrared: OptionalBoolPtr(false), Multizone: OptionalBoolPtr(false), ExtendedMultizone: OptionalBoolPtr(false), TemperatureRange: TemperatureRange{1500, 9000}, }, }, ProductMapKey(1, 133): { VendorName: "LIFX", VendorID: 1, ProductName: "LIFX White US", ProductID: 133, Features: Features{ HEV: OptionalBoolPtr(false), Color: OptionalBoolPtr(false), Chain: OptionalBoolPtr(false), Matrix: OptionalBoolPtr(false), Relays: OptionalBoolPtr(false), Buttons: OptionalBoolPtr(false), Infrared: OptionalBoolPtr(false), Multizone: OptionalBoolPtr(false), ExtendedMultizone: OptionalBoolPtr(false), TemperatureRange: TemperatureRange{2700, 2700}, }, }, ProductMapKey(1, 134): { VendorName: "LIFX", VendorID: 1, ProductName: "LIFX White Intl", ProductID: 134, Features: Features{ HEV: OptionalBoolPtr(false), Color: OptionalBoolPtr(false), Chain: OptionalBoolPtr(false), Matrix: OptionalBoolPtr(false), Relays: OptionalBoolPtr(false), Buttons: OptionalBoolPtr(false), Infrared: OptionalBoolPtr(false), Multizone: OptionalBoolPtr(false), ExtendedMultizone: OptionalBoolPtr(false), TemperatureRange: TemperatureRange{2700, 2700}, }, }, ProductMapKey(1, 135): { VendorName: "LIFX", VendorID: 1, ProductName: "LIFX GU10 Color US", ProductID: 135, Features: Features{ HEV: OptionalBoolPtr(false), Color: OptionalBoolPtr(true), Chain: OptionalBoolPtr(false), Matrix: OptionalBoolPtr(false), Relays: OptionalBoolPtr(false), Buttons: OptionalBoolPtr(false), Infrared: OptionalBoolPtr(false), Multizone: OptionalBoolPtr(false), ExtendedMultizone: OptionalBoolPtr(false), TemperatureRange: TemperatureRange{1500, 9000}, }, }, ProductMapKey(1, 136): { VendorName: "LIFX", VendorID: 1, ProductName: "LIFX GU10 Color Intl", ProductID: 136, Features: Features{ HEV: OptionalBoolPtr(false), Color: OptionalBoolPtr(true), Chain: OptionalBoolPtr(false), Matrix: OptionalBoolPtr(false), Relays: OptionalBoolPtr(false), Buttons: OptionalBoolPtr(false), Infrared: OptionalBoolPtr(false), Multizone: OptionalBoolPtr(false), ExtendedMultizone: OptionalBoolPtr(false), TemperatureRange: TemperatureRange{1500, 9000}, }, }, ProductMapKey(1, 137): { VendorName: "LIFX", VendorID: 1, ProductName: "LIFX Candle Color US", ProductID: 137, Features: Features{ HEV: OptionalBoolPtr(false), Color: OptionalBoolPtr(true), Chain: OptionalBoolPtr(false), Matrix: OptionalBoolPtr(true), Relays: OptionalBoolPtr(false), Buttons: OptionalBoolPtr(false), Infrared: OptionalBoolPtr(false), Multizone: OptionalBoolPtr(false), ExtendedMultizone: OptionalBoolPtr(false), TemperatureRange: TemperatureRange{1500, 9000}, }, }, ProductMapKey(1, 138): { VendorName: "LIFX", VendorID: 1, ProductName: "LIFX Candle Color Intl", ProductID: 138, Features: Features{ HEV: OptionalBoolPtr(false), Color: OptionalBoolPtr(true), Chain: OptionalBoolPtr(false), Matrix: OptionalBoolPtr(true), Relays: OptionalBoolPtr(false), Buttons: OptionalBoolPtr(false), Infrared: OptionalBoolPtr(false), Multizone: OptionalBoolPtr(false), ExtendedMultizone: OptionalBoolPtr(false), TemperatureRange: TemperatureRange{1500, 9000}, }, }, }
ProductMap is the map of all known hardwares.
If a new product is added and this file is not updated yet, you can add it to the map by yourself, for example:
func init() { key := lifxlan.ProductMapKey(newVID, newPID) lifxlan.ProductMap[key] = Product{ // Fill in values } }
The content of this map was fetched from https://github.com/LIFX/products/blob/master/products.json and generated by https://github.com/fishy/lifxlan/tree/master/cmd/gen-product-map
var UDPReadTimeout = time.Millisecond * 100
UDPReadTimeout is the read timeout we use to read all the UDP messages.
In some functions (e.g. Discover), the function will simply use the timeout to check context cancellation and continue reading, instead of return upon timeout.
It's intentionally defined as variable instead of constant, so the user could adjust it if needed.
Functions ¶
func CheckTimeoutError ¶
CheckTimeoutError returns true if err is caused by timeout in net package.
func Discover ¶
Discover discovers lifx products in the lan.
When broadcastHost is empty (""), DefaultBroadcastHost will be used instead. In most cases that should just work. But if your network has special settings, you can override it via the arg.
The function will write discovered devices into devices channel. It's the caller's responsibility to read from channel timely to avoid blocking writing. The function is guaranteed to close the channel upon retuning, so the caller could just range over the channel for reading, e.g.
devices := make(chan Device) go func() { if err := Discover(ctx, devices, ""); err != nil { if err != context.DeadlineExceeded { // handle error } } }() for device := range devices { // Do something with device }
The function will only return upon error or when ctx is cancelled. It's the caller's responsibility to make sure that the context is cancelled (e.g. Use context.WithTimeout).
func GenerateMessage ¶
func GenerateMessage( tagged TaggedHeader, source uint32, target Target, flags AckResFlag, sequence uint8, message MessageType, payload []byte, ) ([]byte, error)
GenerateMessage generates the message to send.
func GetReadDeadline ¶
GetReadDeadline returns a value can be used in net.Conn.SetReadDeadline from UDPReadTimeout value.
func ProductMapKey ¶
ProductMapKey generates key for ProductMap based on vendor and product ids.
func RandomSource ¶
func RandomSource() uint32
RandomSource generates a random number to be used as source. It's guaranteed to be non-zero.
func WaitForAcks ¶
WaitForAcks helps device API implementations to wait for acks.
It blocks until acks for all sequences are received, in which case it returns nil error. It also returns when the context is cancelled.
This function drops all received messages that is not an ack, or ack messages that the sequence and source don't match. Therefore, there shouldn't be more than one WaitForAcks functions running for the same connection at the same time, and this function should only be used when no other responses are expected.
If this function returns an error, the error would be of type *WaitForAcksError.
Types ¶
type AckResFlag ¶
type AckResFlag uint8
AckResFlag is the 8-bit header that could include:
- ack_required: if set all sent messages will expect an ack response.
- res_required: if set all sent messages will expect a response.
const ( FlagResRequired AckResFlag = 1 << iota FlagAckRequired )
AckResFlag values.
type Color ¶
Color is the HSBK color type used in lifx lan API.
https://lan.developer.lifx.com/docs/representing-color-with-hsbk
type Device ¶
type Device interface { // Target returns the target of this device, usually it's the MAC address. Target() Target // Dial tries to establish a connection to this device. Dial() (net.Conn, error) // Source returns a consistent random source to be used with API calls. // It's guaranteed to be non-zero. Source() uint32 // NextSequence returns the next sequence value to be used with API calls. NextSequence() uint8 // Send generates and sends a message to the device. // // conn must be pre-dialed or this function will fail. // // It calls the device's Target(), Source(), and NextSequence() functions to // fill the appropriate headers. // // The sequence used in this message will be returned. Send(ctx context.Context, conn net.Conn, flags AckResFlag, message MessageType, payload interface{}) (seq uint8, err error) // SanitizeColor tries to sanitize (keep values inside appropriate boundaries) // color based on the device's feature, if available. // // Both the device's hardware version and firmware version can affect the // boundaries used for sanitization. // If the device's hardware version was never fetched and cached, // it uses default boundaries (see doc for Color.Sanitize). // If the device's firmware version was never fetched and cached, // it uses the hardware's default boundaries (without potential firmware // upgrades). SanitizeColor(color Color) Color // Echo sends a message to the device and waits for a response to ensure that // the device is online and responding. A payload can optionally be provided // to define the data that is sent to the device and expected to be returned // in the echo response. // // If conn is nil, // a new connection will be made and guaranteed to be closed before returning. // You should pre-dial and pass in the conn if you plan to call APIs on this // device repeatedly. Echo(ctx context.Context, conn net.Conn, payload []byte) error // GetPower returns the current power level of the device. // // If conn is nil, // a new connection will be made and guaranteed to be closed before returning. // You should pre-dial and pass in the conn if you plan to call APIs on this // device repeatedly. GetPower(ctx context.Context, conn net.Conn) (Power, error) // SetPower sets the power level of the device. // (Turn it on or off.) // // If conn is nil, // a new connection will be made and guaranteed to be closed before returning. // You should pre-dial and pass in the conn if you plan to call APIs on this // device repeatedly. // // If ack is false, // this function returns nil error after the API is sent successfully. // If ack is true, // this function will only return nil error after it received ack from the // device. SetPower(ctx context.Context, conn net.Conn, power Power, ack bool) error // The label of the device. Label() *Label GetLabel(ctx context.Context, conn net.Conn) error // The hardware version info of the device. HardwareVersion() *HardwareVersion GetHardwareVersion(ctx context.Context, conn net.Conn) error // The firmware version of the device. Firmware() *FirmwareUpgrade GetFirmware(ctx context.Context, conn net.Conn) error }
Device defines the common interface between lifxlan devices.
For the Foo() and GetFoo() function pairs (e.g. Label() and GetLabel()), the Foo() one will return an pointer to the cached property, guaranteed to be non-nil but could be the zero value, while the GetFoo() one will use an API call to update the cached property.
There will also be an EmptyFoo string constant defined, so that you can compare against Device.Foo().String() to determine if a GetFoo() call is needed. Here is an example code snippet to get a device's label:
func GetLabel(ctx context.Context, d lifxlanDevice) (string, error) { if d.Label().String() != lifxlan.EmptyLabel { return d.Label().String(), nil } if err := d.GetLabel(ctx, nil); err = nil { return "", nil } return d.Label().String(), nil }
If you are extending a device code and you got the property as part of another API's return payload, you can also use the Foo() function to update the cached value. Here is an example code snippet to update a device's cached label:
func UpdateLabel(d lifxlanDevice, newLabel *lifxlan.RawLabel) { *d.Label() = *newLabel }
The conn arg in GetFoo() functions can be nil. In such cases, a new connection will be made and guaranteed to be closed before returning. You should pre-dial and pass in the conn if you plan to call APIs on this device repeatedly.
In case of network error (e.g. response packet loss), the GetFoo() functions might block until the context is cancelled, as a result, it's a good idea to set a timeout to the context.
type Features ¶ added in v0.3.0
type Features struct { HEV *OptionalBool `json:"hev,omitempty"` Color *OptionalBool `json:"color,omitempty"` Chain *OptionalBool `json:"chain,omitempty"` Matrix *OptionalBool `json:"matrix,omitempty"` Relays *OptionalBool `json:"relays,omitempty"` Buttons *OptionalBool `json:"buttons,omitempty"` Infrared *OptionalBool `json:"infrared,omitempty"` Multizone *OptionalBool `json:"multizone,omitempty"` ExtendedMultizone *OptionalBool `json:"extended_multizone,omitempty"` TemperatureRange TemperatureRange `json:"temperature_range,omitempty"` }
Features defines the json format of features of a product.
func MergeFeatures ¶ added in v0.3.0
MergeFeatures merges the features defined in features, Each feature falls back to the next one in features if it's unset.
type FirmwareUpgrade ¶ added in v0.3.0
type FirmwareUpgrade struct { Major uint16 `json:"major"` Minor uint16 `json:"minor"` Features Features `json:"features"` }
FirmwareUpgrade defines a firmware version with optional upgrade features.
func (FirmwareUpgrade) Less ¶ added in v0.3.0
func (fu FirmwareUpgrade) Less(other FirmwareUpgrade) bool
Less returns true if fu's firmware version is smaller than other's firmware version.
func (FirmwareUpgrade) String ¶ added in v0.3.0
func (fu FirmwareUpgrade) String() string
type HardwareVersion ¶
HardwareVersion defines raw version info in message payloads according to:
https://lan.developer.lifx.com/docs/information-messages#stateversion---packet-33
func (HardwareVersion) Parse ¶
func (raw HardwareVersion) Parse() *Product
Parse parses the raw hardware version info by looking up ProductMap.
If this hardware version info is not in ProductMap, nil will be returned.
func (HardwareVersion) ProductMapKey ¶
func (raw HardwareVersion) ProductMapKey() uint64
ProductMapKey generates key for ProductMap.
func (HardwareVersion) String ¶
func (raw HardwareVersion) String() string
type Label ¶
type Label [LabelLength]byte
Label defines raw label in message payloads according to:
https://lan.developer.lifx.com/docs/information-messages#statelabel---packet-25
type MessageType ¶
type MessageType uint16
MessageType is the 16-bit header indicates the type of the message.
const ( Acknowledgement MessageType = 45 StateUnhandled MessageType = 223 GetService MessageType = 2 StateService MessageType = 3 GetHostFirmware MessageType = 14 StateHostFirmware MessageType = 15 GetPower MessageType = 20 StatePower MessageType = 22 SetPower MessageType = 21 GetLabel MessageType = 23 StateLabel MessageType = 25 GetVersion MessageType = 32 StateVersion MessageType = 33 EchoRequest MessageType = 58 EchoResponse MessageType = 59 )
MessageType values.
type OptionalBool ¶ added in v0.3.0
type OptionalBool bool
OptionalBool defines a helper type for optional boolean fields
func OptionalBoolPtr ¶ added in v0.3.0
func OptionalBoolPtr(v OptionalBool) *OptionalBool
OptionalBoolPtr is a helper function for writing *OptionalBool literal.
func (*OptionalBool) Fallback ¶ added in v0.3.0
func (ob *OptionalBool) Fallback(fallback *OptionalBool) *OptionalBool
Fallback returns, in this order:
- ob, if it's set,
- a copy of fallback if fallback is set,
- nil if neither ob nor fallback is set.
func (*OptionalBool) Get ¶ added in v0.3.0
func (ob *OptionalBool) Get() bool
Get returns false when ob is unset, otherwise it returns the set value.
type Power ¶
type Power uint16
Power is the raw power level value in messages.
https://lan.developer.lifx.com/docs/changing-a-device#setpower---packet-21 https://lan.developer.lifx.com/docs/information-messages#statepower---packet-22
type Product ¶ added in v0.3.0
type Product struct { VendorID uint32 `json:"-"` VendorName string `json:"-"` ProductID uint32 `json:"pid"` ProductName string `json:"name"` Features Features `json:"features"` Upgrades Upgrades `json:"upgrades"` }
Product defines a product.
func (Product) FeaturesAt ¶ added in v0.3.0
func (p Product) FeaturesAt(firmware FirmwareUpgrade) Features
FeaturesAt gets the features at the given firmware version, with appropriate upgrades applied.
Calling with zero firmware will return the same features as the Features field.
type RawEchoResponsePayload ¶ added in v0.3.2
type RawEchoResponsePayload struct {
Echoing [EchoPayloadLength]byte
}
RawEchoResponsePayload defines echo response payload according to:
https://lan.developer.lifx.com/docs/information-messages#echoresponse---packet-59
type RawHeader ¶
type RawHeader struct { Size uint16 Tagged TaggedHeader Source uint32 Target Target Flags AckResFlag Sequence uint8 Type MessageType // contains filtered or unexported fields }
RawHeader defines the struct to be used for encoding and decoding.
type RawSetPowerPayload ¶
type RawSetPowerPayload struct {
Level Power
}
RawSetPowerPayload defines the struct to be used for encoding and decoding.
https://lan.developer.lifx.com/docs/changing-a-device#setpower---packet-21
type RawStateHostFirmwarePayload ¶ added in v0.3.0
type RawStateHostFirmwarePayload struct { VersionMinor uint16 VersionMajor uint16 // contains filtered or unexported fields }
RawStateHostFirmwarePayload defines the struct to be used for encoding and decoding.
https://lan.developer.lifx.com/docs/information-messages#statehostfirmware---packet-15
func (RawStateHostFirmwarePayload) ToFirmware ¶ added in v0.3.0
func (raw RawStateHostFirmwarePayload) ToFirmware() FirmwareUpgrade
ToFirmware converts RawStateHostFirmwarePayload into FirmwareUpgrade with empty Features.
type RawStateLabelPayload ¶
type RawStateLabelPayload struct {
Label Label
}
RawStateLabelPayload defines the struct to be used for encoding and decoding.
https://lan.developer.lifx.com/docs/information-messages#statelabel---packet-25
type RawStatePowerPayload ¶
type RawStatePowerPayload struct {
Level Power
}
RawStatePowerPayload defines the struct to be used for encoding and decoding.
https://lan.developer.lifx.com/docs/information-messages#statepower---packet-22
type RawStateServicePayload ¶
type RawStateServicePayload struct { Service ServiceType Port uint32 }
RawStateServicePayload defines the struct to be used for encoding and decoding.
https://lan.developer.lifx.com/docs/information-messages#stateservice---packet-3
type RawStateUnhandledPayload ¶
type RawStateUnhandledPayload struct {
UnhandledType MessageType
}
RawStateUnhandledPayload defines the struct to be used for encoding and decoding.
https://lan.developer.lifx.com/docs/information-messages#stateunhandled---packet-223
func (RawStateUnhandledPayload) Error ¶ added in v0.3.0
func (p RawStateUnhandledPayload) Error() string
type RawStateVersionPayload ¶
type RawStateVersionPayload struct {
Version HardwareVersion
}
RawStateVersionPayload defines the struct to be used for encoding and decoding.
https://lan.developer.lifx.com/docs/information-messages#stateversion---packet-33
type Response ¶
type Response struct { Message MessageType Flags AckResFlag Source uint32 Target Target Sequence uint8 Payload []byte }
Response is the parsed response from a lifxlan device.
func ParseResponse ¶
ParseResponse parses the response received from a lifxlan device.
type ServiceType ¶
type ServiceType uint8
ServiceType define the type of the service this device provides.
const (
ServiceUDP ServiceType = 1
)
Documented values for ServiceType.
func (ServiceType) String ¶
func (s ServiceType) String() string
type TaggedHeader ¶
type TaggedHeader uint16
TaggedHeader is the 16-bit header including:
- origin: 2 bits, must be 0
- tagged: 1 bit
- addressable: 1 bit, must be 1
- protocol: 12 bits, must be 1024
const ( NotTagged TaggedHeader = 1<<12 + 1024 Tagged TaggedHeader = 1<<13 + NotTagged )
Tagged and non-tagged versions of TaggedHeader.
type Target ¶
type Target uint64
Target defines a target by its MAC address.
const AllDevices Target = 0
AllDevices is the special Target value means all devices.
func ParseTarget ¶
ParseTarget parses s into a Target.
s should be in the format of a MAC address, e.g. "01:23:45:67:89:ab", or the special values for AllDevices: "00:00:00:00:00:00" and "".
func (Target) Matches ¶
Matches returns true if either target is AllDevices, or both targets have the same value.
func (*Target) Set ¶
Set implements flag.Value interface.
It calls ParseTarget to parse the string. Refer to the doc of ParseTarget for more details.
Example ¶
package main import ( "flag" "go.yhsif.com/lifxlan" ) func main() { var target lifxlan.Target flag.Var( &target, "target", "The MAC address of the target device. Empty value means any device.", ) flag.Parse() }
Output:
type TemperatureRange ¶ added in v0.3.0
type TemperatureRange []uint16
TemperatureRange defines the json format of temperature range of a product.
It would be either a slice of length 0 (meaning this is not a light device), or length 2 (min, max).
func (TemperatureRange) Fallback ¶ added in v0.3.0
func (tr TemperatureRange) Fallback(fallback TemperatureRange) TemperatureRange
Fallback returns, in this order:
- tr if it's valid,
- a copy of fallback if it's valid,
- nil if neither tr nor fallback is valid.
func (TemperatureRange) Max ¶ added in v0.3.0
func (tr TemperatureRange) Max() uint16
Max returns the max temperature if tr is valid, 0 otherwise.
func (TemperatureRange) Min ¶ added in v0.3.0
func (tr TemperatureRange) Min() uint16
Min returns the min temperature if tr is valid, 0 otherwise.
func (TemperatureRange) Valid ¶ added in v0.3.0
func (tr TemperatureRange) Valid() bool
Valid returns true if tr has a length of exactly 2.
type Timestamp ¶
type Timestamp uint64
Timestamp is the type used in messages to represent a timestamp.
It's defined as nanoseconds since UNIX EPOCH.
func ConvertTime ¶
ConvertTime converts a time.Time into Timestamp.
type TransitionTime ¶
type TransitionTime uint32
TransitionTime is the type used in messages to represent transition time.
Its unit is milliseconds.
func ConvertDuration ¶
func ConvertDuration(d time.Duration) TransitionTime
ConvertDuration converts a time.Duration into TransitionTime.
The max uint32 value can represent a transition time of more than 1,193 hours[1] (or, in other words, more than a month). So although an overflow is technically possible, we don't really do any special handlings here (it's not a security risk and won't crash anything[2]). If you feed in a duration that overflows TransitionTime, you should feel bad (or great, it's totally up to you) about it. Do you really want your light(s) to take more than a month to turn on/off?
func (TransitionTime) Duration ¶
func (tt TransitionTime) Duration() time.Duration
Duration converts a TransitionTime into time.Duration.
func (TransitionTime) String ¶
func (tt TransitionTime) String() string
type Upgrades ¶ added in v0.3.0
type Upgrades []FirmwareUpgrade
Upgrades defines sortable interface of FirmwareUpgrade.
type WaitForAcksError ¶
WaitForAcksError defines the error returned by WaitForAcks.
func (*WaitForAcksError) Error ¶
func (e *WaitForAcksError) Error() string
func (*WaitForAcksError) Unwrap ¶
func (e *WaitForAcksError) Unwrap() error
Unwrap returns the underlying error.
Source Files
¶
Directories
¶
Path | Synopsis |
---|---|
cmd
|
|
gen-product-map
Command gen-product-map is the helper tool to generate lifxlan ProductMap.
|
Command gen-product-map is the helper tool to generate lifxlan ProductMap. |
Package light implements LIFX LAN Protocol for LIFX light devices: https://lan.developer.lifx.com/docs/light-messages Please refer to its parent package for more background/context.
|
Package light implements LIFX LAN Protocol for LIFX light devices: https://lan.developer.lifx.com/docs/light-messages Please refer to its parent package for more background/context. |
Package mock implements a mocked lifxlan device listening on localhost, which can be used in test code to test API calls.
|
Package mock implements a mocked lifxlan device listening on localhost, which can be used in test code to test API calls. |
Package relay implements LIFX LAN Protocol for LIFX relay devices (switches): https://lan.developer.lifx.com/docs/the-lifx-switch Please refer to its parent package for more background/context.
|
Package relay implements LIFX LAN Protocol for LIFX relay devices (switches): https://lan.developer.lifx.com/docs/the-lifx-switch Please refer to its parent package for more background/context. |
Package tile implements LIFX LAN Protocol for LIFX Tile devices: https://lan.developer.lifx.com/docs/tile-control A tile device is also a light device and implements all light APIs.
|
Package tile implements LIFX LAN Protocol for LIFX Tile devices: https://lan.developer.lifx.com/docs/tile-control A tile device is also a light device and implements all light APIs. |