Contents

glennschmidt/swift-lifx

A modern Swift library for controlling [LIFX smart lights](https://www.lifx.com).

Installation

Use Swift Package Manager to add this repository to your Xcode project.

Usage

Basic usage

import Lifx

let client = try! LifxLanClient()

func example() {
    
    //To control a device with a known address
    let device = LifxDevice(macAddress: MacAddr("D0:73:D5:15:00:00"), ipAddress: "10.0.0.44")

    //Turn the light on
    client.setPower(true, for: device)

    //Set the color to red
    client.setColor(.red, for: device)
    
    //Set a custom color and brightness level
    client.setColor(HSBK(hue: 240/360, saturation: 1.0, brightness: 0.75), for: device)

    //Set the color to white with a specific color temperature
    client.setColor(HSBK(brightness: 1.0, colorTemperature: .coolDaylight), for: device)

}

Discovery example

import Lifx

class Example: LifxLanClientDelegate {
    let client: LifxLanClient
    
    init() throws {
        client = try LifxLanClient()
        client.delegate = self
        client.startRefreshing()
    }
    
    func lifxClient(_ client: LifxLanClient, didAdd device: LifxDevice) {
        print("Discovered device \(device)")
    }
    
    func lifxClient(_ client: LifxLanClient, didUpdate device: LifxDevice) {
        if let label = device.label, let location = device.location {
            print("Device \(device) is named \(label) and located at \(location)")
        }
    }
}

SwiftUI example

The library can provide its discovery state as an ObservableObject, and supports two-way dynamic state updates. If you modify a property on a LifxDevice object, it will affect the real light, and vice versa.

import Lifx
import SwiftUI

struct ExampleView: View {
    @EnvironmentObject var lifx: LifxState
    
    var body: some View {
        List(lifx.devices) { device in
            PowerSwitch(device: device)
        }
    }
}

struct PowerSwitch: View {
    @ObservedObject var device: LifxDevice
    
    var isOn: Binding<Bool> {
        Binding(get: {
            return self.device.powerOn == true
        }, set: {
            self.device.powerOn = $0
        })
    }
    
    var body: some View {
        Toggle(isOn: isOn) {
            Text(device.label ?? device.ipAddress)
        }
            .toggleStyle(SwitchToggleStyle())
            .disabled(device.powerOn == nil)
    }
}

You would instantiate the above view hierarchy like this (eg. in your AppDelegate):

let client = try! LifxLanClient()

let view = ExampleView()
    .environmentObject(client.state)

client.startRefreshing()

Package Metadata

Repository: glennschmidt/swift-lifx

Default branch: master

README: README.md