lifx-lan-0.8.2: LIFX LAN API
Safe HaskellSafe-Inferred
LanguageHaskell2010

Lifx.Lan

Description

-- these should be enabled by default in a future version of GHC
-- (they aren't entirely necessary here anyway - they just make the example even simpler)
{-# LANGUAGE BlockArguments #-}
{-# LANGUAGE NamedFieldPuns #-}

import Control.Monad.IO.Class (liftIO)
import Data.Foldable (for_)

import Lifx.Lan

-- | Find all devices on the network, print their addresses, and set their brightness to 50%.
main :: IO ()
main = runLifx do
    devs <- discoverDevices Nothing
    liftIO $ print devs
    for_ devs \d -> do
        LightState{hsbk} <- sendMessage d GetColor
        sendMessage d $ SetColor hsbk{brightness = maxBound `div` 2} 3
Synopsis

Documentation

data Device Source #

A LIFX device, such as a bulb.

Instances

Instances details
Show Device Source # 
Instance details

Defined in Lifx.Lan.Internal

Eq Device Source # 
Instance details

Defined in Lifx.Lan.Internal

Methods

(==) :: Device -> Device -> Bool #

(/=) :: Device -> Device -> Bool #

Ord Device Source # 
Instance details

Defined in Lifx.Lan.Internal

deviceFromAddress :: (Word8, Word8, Word8, Word8) -> Device Source #

>>> deviceFromAddress (192, 168, 0, 1)
192.168.0.1

If we know the IP address of a Device, we can create it directly, rather than calling discoverDevices.

data Message r where Source #

A message we can send to a Device. r is the type of the expected response.

Instances

Instances details
Show (Message r) Source # 
Instance details

Defined in Lifx.Lan

Methods

showsPrec :: Int -> Message r -> ShowS #

show :: Message r -> String #

showList :: [Message r] -> ShowS #

Eq (Message r) Source # 
Instance details

Defined in Lifx.Lan

Methods

(==) :: Message r -> Message r -> Bool #

(/=) :: Message r -> Message r -> Bool #

Ord (Message r) Source # 
Instance details

Defined in Lifx.Lan

Methods

compare :: Message r -> Message r -> Ordering #

(<) :: Message r -> Message r -> Bool #

(<=) :: Message r -> Message r -> Bool #

(>) :: Message r -> Message r -> Bool #

(>=) :: Message r -> Message r -> Bool #

max :: Message r -> Message r -> Message r #

min :: Message r -> Message r -> Message r #

data HSBK Source #

Constructors

HSBK 

Fields

Instances

Instances details
Generic HSBK Source # 
Instance details

Defined in Lifx.Lan.Internal

Associated Types

type Rep HSBK :: Type -> Type #

Methods

from :: HSBK -> Rep HSBK x #

to :: Rep HSBK x -> HSBK #

Show HSBK Source # 
Instance details

Defined in Lifx.Lan.Internal

Methods

showsPrec :: Int -> HSBK -> ShowS #

show :: HSBK -> String #

showList :: [HSBK] -> ShowS #

Eq HSBK Source # 
Instance details

Defined in Lifx.Lan.Internal

Methods

(==) :: HSBK -> HSBK -> Bool #

(/=) :: HSBK -> HSBK -> Bool #

Ord HSBK Source # 
Instance details

Defined in Lifx.Lan.Internal

Methods

compare :: HSBK -> HSBK -> Ordering #

(<) :: HSBK -> HSBK -> Bool #

(<=) :: HSBK -> HSBK -> Bool #

(>) :: HSBK -> HSBK -> Bool #

(>=) :: HSBK -> HSBK -> Bool #

max :: HSBK -> HSBK -> HSBK #

min :: HSBK -> HSBK -> HSBK #

type Rep HSBK Source # 
Instance details

Defined in Lifx.Lan.Internal

type Lifx = LifxT IO Source #

A simple implementation of MonadLifx.

runLifx :: Lifx a -> IO a Source #

Note that this throws LifxErrors as IOExceptions, and sets timeout to 5 seconds. Use runLifxT for more control.

data LifxT m a Source #

Instances

Instances details
MonadTrans LifxT Source # 
Instance details

Defined in Lifx.Lan.Internal

Methods

lift :: Monad m => m a -> LifxT m a #

MonadError e m => MonadError e (LifxT m) Source # 
Instance details

Defined in Lifx.Lan.Internal

Methods

throwError :: e -> LifxT m a #

catchError :: LifxT m a -> (e -> LifxT m a) -> LifxT m a #

MonadReader s m => MonadReader s (LifxT m) Source # 
Instance details

Defined in Lifx.Lan.Internal

Methods

ask :: LifxT m s #

local :: (s -> s) -> LifxT m a -> LifxT m a #

reader :: (s -> a) -> LifxT m a #

MonadState s m => MonadState s (LifxT m) Source # 
Instance details

Defined in Lifx.Lan.Internal

Methods

get :: LifxT m s #

put :: s -> LifxT m () #

state :: (s -> (a, s)) -> LifxT m a #

MonadIO m => MonadIO (LifxT m) Source # 
Instance details

Defined in Lifx.Lan.Internal

Methods

liftIO :: IO a -> LifxT m a #

Monad m => Applicative (LifxT m) Source # 
Instance details

Defined in Lifx.Lan.Internal

Methods

pure :: a -> LifxT m a #

(<*>) :: LifxT m (a -> b) -> LifxT m a -> LifxT m b #

liftA2 :: (a -> b -> c) -> LifxT m a -> LifxT m b -> LifxT m c #

(*>) :: LifxT m a -> LifxT m b -> LifxT m b #

(<*) :: LifxT m a -> LifxT m b -> LifxT m a #

Functor m => Functor (LifxT m) Source # 
Instance details

Defined in Lifx.Lan.Internal

Methods

fmap :: (a -> b) -> LifxT m a -> LifxT m b #

(<$) :: a -> LifxT m b -> LifxT m a #

Monad m => Monad (LifxT m) Source # 
Instance details

Defined in Lifx.Lan.Internal

Methods

(>>=) :: LifxT m a -> (a -> LifxT m b) -> LifxT m b #

(>>) :: LifxT m a -> LifxT m b -> LifxT m b #

return :: a -> LifxT m a #

MonadIO m => MonadLifx (LifxT m) Source # 
Instance details

Defined in Lifx.Lan

Associated Types

type MonadLifxError (LifxT m) Source #

MonadIO m => MonadLifxIO (LifxT m) Source # 
Instance details

Defined in Lifx.Lan.Internal

type MonadLifxError (LifxT m) Source # 
Instance details

Defined in Lifx.Lan

runLifxT Source #

Arguments

:: MonadIO m 
=> Int

Timeout for waiting for message responses, in microseconds.

-> LifxT m a 
-> m (Either LifxError a) 

data LifxError Source #

Instances

Instances details
Generic LifxError Source # 
Instance details

Defined in Lifx.Lan.Internal

Associated Types

type Rep LifxError :: Type -> Type #

Show LifxError Source # 
Instance details

Defined in Lifx.Lan.Internal

Eq LifxError Source # 
Instance details

Defined in Lifx.Lan.Internal

Ord LifxError Source # 
Instance details

Defined in Lifx.Lan.Internal

type Rep LifxError Source # 
Instance details

Defined in Lifx.Lan.Internal

type Rep LifxError = D1 ('MetaData "LifxError" "Lifx.Lan.Internal" "lifx-lan-0.8.2-L2CBs5j1EaoCTnQ2WVfAeP" 'False) (((C1 ('MetaCons "DecodeFailure" 'PrefixI 'False) (S1 ('MetaSel ('Nothing :: Maybe Symbol) 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 ByteString) :*: (S1 ('MetaSel ('Nothing :: Maybe Symbol) 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 ByteOffset) :*: S1 ('MetaSel ('Nothing :: Maybe Symbol) 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 String))) :+: C1 ('MetaCons "RecvTimeout" 'PrefixI 'False) (U1 :: Type -> Type)) :+: (C1 ('MetaCons "BroadcastTimeout" 'PrefixI 'False) (S1 ('MetaSel ('Nothing :: Maybe Symbol) 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 [HostAddress])) :+: C1 ('MetaCons "WrongPacketType" 'PrefixI 'False) (S1 ('MetaSel ('Nothing :: Maybe Symbol) 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 Word16) :*: S1 ('MetaSel ('Nothing :: Maybe Symbol) 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 Word16)))) :+: ((C1 ('MetaCons "WrongSender" 'PrefixI 'False) (S1 ('MetaSel ('Nothing :: Maybe Symbol) 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 Device) :*: S1 ('MetaSel ('Nothing :: Maybe Symbol) 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 HostAddress)) :+: C1 ('MetaCons "UnexpectedSockAddrType" 'PrefixI 'False) (S1 ('MetaSel ('Nothing :: Maybe Symbol) 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 SockAddr))) :+: (C1 ('MetaCons "UnexpectedPort" 'PrefixI 'False) (S1 ('MetaSel ('Nothing :: Maybe Symbol) 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 PortNumber)) :+: C1 ('MetaCons "ProductLookupError" 'PrefixI 'False) (S1 ('MetaSel ('Nothing :: Maybe Symbol) 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 ProductLookupError)))))

data ProductLookupError Source #

Instances

Instances details
Generic ProductLookupError Source # 
Instance details

Defined in Lifx.Internal.ProductInfoMap

Associated Types

type Rep ProductLookupError :: Type -> Type #

Show ProductLookupError Source # 
Instance details

Defined in Lifx.Internal.ProductInfoMap

Eq ProductLookupError Source # 
Instance details

Defined in Lifx.Internal.ProductInfoMap

Ord ProductLookupError Source # 
Instance details

Defined in Lifx.Internal.ProductInfoMap

type Rep ProductLookupError Source # 
Instance details

Defined in Lifx.Internal.ProductInfoMap

type Rep ProductLookupError = D1 ('MetaData "ProductLookupError" "Lifx.Internal.ProductInfoMap" "lifx-lan-0.8.2-L2CBs5j1EaoCTnQ2WVfAeP" 'False) (C1 ('MetaCons "UnknownVendorId" 'PrefixI 'False) (S1 ('MetaSel ('Nothing :: Maybe Symbol) 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 Word32)) :+: C1 ('MetaCons "UnknownProductId" 'PrefixI 'False) (S1 ('MetaSel ('Nothing :: Maybe Symbol) 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 Word32)))

class Monad m => MonadLifx m where Source #

Associated Types

type MonadLifxError m Source #

The type of errors associated with m.

Methods

liftProductLookupError :: ProductLookupError -> MonadLifxError m Source #

lifxThrow :: MonadLifxError m -> m a Source #

sendMessage :: Device -> Message r -> m r Source #

Send a message and wait for a response.

broadcastMessage :: Message r -> m [(Device, r)] Source #

Broadcast a message and wait for responses.

discoverDevices :: Maybe Int -> m [Device] Source #

Search for devices on the local network. If an integer argument is given, wait until we have found that number of devices - otherwise just keep waiting until timeout.

Instances

Instances details
MonadLifx Mock Source # 
Instance details

Defined in Lifx.Lan.Mock.Terminal

Associated Types

type MonadLifxError Mock Source #

MonadIO m => MonadLifx (LifxT m) Source # 
Instance details

Defined in Lifx.Lan

Associated Types

type MonadLifxError (LifxT m) Source #

MonadLifx m => MonadLifx (MaybeT m) Source # 
Instance details

Defined in Lifx.Lan

Associated Types

type MonadLifxError (MaybeT m) Source #

MonadLifx m => MonadLifx (ExceptT e m) Source # 
Instance details

Defined in Lifx.Lan

Associated Types

type MonadLifxError (ExceptT e m) Source #

MonadLifx m => MonadLifx (ReaderT e m) Source # 
Instance details

Defined in Lifx.Lan

Associated Types

type MonadLifxError (ReaderT e m) Source #

MonadLifx m => MonadLifx (StateT s m) Source # 
Instance details

Defined in Lifx.Lan

Associated Types

type MonadLifxError (StateT s m) Source #

(MonadLifx m, Monoid t) => MonadLifx (WriterT t m) Source # 
Instance details

Defined in Lifx.Lan

Associated Types

type MonadLifxError (WriterT t m) Source #

sendMessageAndWait :: (MonadLifx m, MonadIO m) => Device -> Message () -> m () Source #

Like sendMessage, but for messages whose effect is not instantaneous (e.g. SetColor), block (using threadDelay) until completion.

Responses

data StateService Source #

Constructors

StateService 

Instances

Instances details
Generic StateService Source # 
Instance details

Defined in Lifx.Lan

Associated Types

type Rep StateService :: Type -> Type #

Show StateService Source # 
Instance details

Defined in Lifx.Lan

Eq StateService Source # 
Instance details

Defined in Lifx.Lan

Ord StateService Source # 
Instance details

Defined in Lifx.Lan

type Rep StateService Source # 
Instance details

Defined in Lifx.Lan

type Rep StateService = D1 ('MetaData "StateService" "Lifx.Lan" "lifx-lan-0.8.2-L2CBs5j1EaoCTnQ2WVfAeP" 'False) (C1 ('MetaCons "StateService" 'PrefixI 'True) (S1 ('MetaSel ('Just "service") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 Service) :*: S1 ('MetaSel ('Just "port") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 PortNumber)))

data Service Source #

Instances

Instances details
Generic Service Source # 
Instance details

Defined in Lifx.Lan

Associated Types

type Rep Service :: Type -> Type #

Methods

from :: Service -> Rep Service x #

to :: Rep Service x -> Service #

Show Service Source # 
Instance details

Defined in Lifx.Lan

Eq Service Source # 
Instance details

Defined in Lifx.Lan

Methods

(==) :: Service -> Service -> Bool #

(/=) :: Service -> Service -> Bool #

Ord Service Source # 
Instance details

Defined in Lifx.Lan

type Rep Service Source # 
Instance details

Defined in Lifx.Lan

type Rep Service = D1 ('MetaData "Service" "Lifx.Lan" "lifx-lan-0.8.2-L2CBs5j1EaoCTnQ2WVfAeP" 'False) ((C1 ('MetaCons "ServiceUDP" 'PrefixI 'False) (U1 :: Type -> Type) :+: C1 ('MetaCons "ServiceReserved1" 'PrefixI 'False) (U1 :: Type -> Type)) :+: (C1 ('MetaCons "ServiceReserved2" 'PrefixI 'False) (U1 :: Type -> Type) :+: (C1 ('MetaCons "ServiceReserved3" 'PrefixI 'False) (U1 :: Type -> Type) :+: C1 ('MetaCons "ServiceReserved4" 'PrefixI 'False) (U1 :: Type -> Type))))

data StateHostFirmware Source #

Constructors

StateHostFirmware 

Fields

Instances

Instances details
Generic StateHostFirmware Source # 
Instance details

Defined in Lifx.Lan

Associated Types

type Rep StateHostFirmware :: Type -> Type #

Show StateHostFirmware Source # 
Instance details

Defined in Lifx.Lan

Eq StateHostFirmware Source # 
Instance details

Defined in Lifx.Lan

Ord StateHostFirmware Source # 
Instance details

Defined in Lifx.Lan

type Rep StateHostFirmware Source # 
Instance details

Defined in Lifx.Lan

type Rep StateHostFirmware = D1 ('MetaData "StateHostFirmware" "Lifx.Lan" "lifx-lan-0.8.2-L2CBs5j1EaoCTnQ2WVfAeP" 'False) (C1 ('MetaCons "StateHostFirmware" 'PrefixI 'True) (S1 ('MetaSel ('Just "build") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 Word64) :*: (S1 ('MetaSel ('Just "versionMinor") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 Word16) :*: S1 ('MetaSel ('Just "versionMajor") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 Word16))))

newtype StatePower Source #

Constructors

StatePower 

Fields

Instances

Instances details
Generic StatePower Source # 
Instance details

Defined in Lifx.Lan

Associated Types

type Rep StatePower :: Type -> Type #

Show StatePower Source # 
Instance details

Defined in Lifx.Lan

Eq StatePower Source # 
Instance details

Defined in Lifx.Lan

Ord StatePower Source # 
Instance details

Defined in Lifx.Lan

type Rep StatePower Source # 
Instance details

Defined in Lifx.Lan

type Rep StatePower = D1 ('MetaData "StatePower" "Lifx.Lan" "lifx-lan-0.8.2-L2CBs5j1EaoCTnQ2WVfAeP" 'True) (C1 ('MetaCons "StatePower" 'PrefixI 'True) (S1 ('MetaSel ('Just "power") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 Word16)))

data StateVersion Source #

Constructors

StateVersion 

Fields

  • vendor :: Word32

    For LIFX products this value is 1. There may be devices in the future with a different vendor value.

  • product :: Word32

    The product id of the device. The available products can be found in our Product Registry.

Instances

Instances details
Generic StateVersion Source # 
Instance details

Defined in Lifx.Lan

Associated Types

type Rep StateVersion :: Type -> Type #

Show StateVersion Source # 
Instance details

Defined in Lifx.Lan

Eq StateVersion Source # 
Instance details

Defined in Lifx.Lan

Ord StateVersion Source # 
Instance details

Defined in Lifx.Lan

type Rep StateVersion Source # 
Instance details

Defined in Lifx.Lan

type Rep StateVersion = D1 ('MetaData "StateVersion" "Lifx.Lan" "lifx-lan-0.8.2-L2CBs5j1EaoCTnQ2WVfAeP" 'False) (C1 ('MetaCons "StateVersion" 'PrefixI 'True) (S1 ('MetaSel ('Just "vendor") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 Word32) :*: S1 ('MetaSel ('Just "product") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 Word32)))

data LightState Source #

Constructors

LightState 

Fields

Instances

Instances details
Generic LightState Source # 
Instance details

Defined in Lifx.Lan

Associated Types

type Rep LightState :: Type -> Type #

Show LightState Source # 
Instance details

Defined in Lifx.Lan

Eq LightState Source # 
Instance details

Defined in Lifx.Lan

Ord LightState Source # 
Instance details

Defined in Lifx.Lan

type Rep LightState Source # 
Instance details

Defined in Lifx.Lan

type Rep LightState = D1 ('MetaData "LightState" "Lifx.Lan" "lifx-lan-0.8.2-L2CBs5j1EaoCTnQ2WVfAeP" 'False) (C1 ('MetaCons "LightState" 'PrefixI 'True) (S1 ('MetaSel ('Just "hsbk") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 HSBK) :*: (S1 ('MetaSel ('Just "power") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 Word16) :*: S1 ('MetaSel ('Just "label") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 Text))))

Product info

getProductInfo :: forall m. MonadLifx m => Device -> m Product Source #

Ask a device for its vendor and product ID, and look up info on it from the official database.

data Product Source #

Information about a particular LIFX product.

Constructors

Product 

Fields

Instances

Instances details
Generic Product Source # 
Instance details

Defined in Lifx.Internal.ProductInfoMap

Associated Types

type Rep Product :: Type -> Type #

Methods

from :: Product -> Rep Product x #

to :: Rep Product x -> Product #

Show Product Source # 
Instance details

Defined in Lifx.Internal.ProductInfoMap

Eq Product Source # 
Instance details

Defined in Lifx.Internal.ProductInfoMap

Methods

(==) :: Product -> Product -> Bool #

(/=) :: Product -> Product -> Bool #

Ord Product Source # 
Instance details

Defined in Lifx.Internal.ProductInfoMap

type Rep Product Source # 
Instance details

Defined in Lifx.Internal.ProductInfoMap

type Rep Product = D1 ('MetaData "Product" "Lifx.Internal.ProductInfoMap" "lifx-lan-0.8.2-L2CBs5j1EaoCTnQ2WVfAeP" 'False) (C1 ('MetaCons "Product" 'PrefixI 'True) (S1 ('MetaSel ('Just "name") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 Text) :*: (S1 ('MetaSel ('Just "id") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 Word32) :*: S1 ('MetaSel ('Just "features") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 Features))))

data Features Source #

Constructors

Features 

Fields

  • hev :: Bool

    The light supports emitting HEV light

  • color :: Bool

    The light changes physical appearance when the Hue value is changed

  • chain :: Bool

    The light may be connected to physically separated hardware (currently only the LIFX Tile)

  • matrix :: Bool

    The light supports a 2D matrix of LEDs (the Tile and Candle)

  • relays :: Bool

    The device has relays for controlling physical power to something (the LIFX Switch)

  • buttons :: Bool

    The device has physical buttons to press (the LIFX Switch)

  • infrared :: Bool

    The light supports emitting infrared light

  • multizone :: Bool

    The light supports a 1D linear array of LEDs (the Z and Beam)

  • temperatureRange :: Maybe (Word16, Word16)

    An array of the minimum and maximum kelvin values this device supports. If the numbers are the same then the device does not support variable kelvin values. It is null for devices that aren't lighting products (the LIFX Switch)

  • extendedMultizone :: Bool

    The more capable extended API for multizone control that lets us control all the zones on the device with a single message instead of many.

Instances

Instances details
Generic Features Source # 
Instance details

Defined in Lifx.Internal.Product

Associated Types

type Rep Features :: Type -> Type #

Methods

from :: Features -> Rep Features x #

to :: Rep Features x -> Features #

Show Features Source # 
Instance details

Defined in Lifx.Internal.Product

Eq Features Source # 
Instance details

Defined in Lifx.Internal.Product

Ord Features Source # 
Instance details

Defined in Lifx.Internal.Product

type Rep Features Source # 
Instance details

Defined in Lifx.Internal.Product

Message encoding

These are used internally by LifxT's sendMessage and broadcastMessage. They are exposed in order to support some advanced use cases.

encodeMessage Source #

Arguments

:: Bool

tagged

-> Bool

ackRequired

-> Word8

sequenceCounter

-> Word32

source

-> Message r 
-> ByteString 

data Header Source #

Instances

Instances details
Generic Header Source # 
Instance details

Defined in Lifx.Lan

Associated Types

type Rep Header :: Type -> Type #

Methods

from :: Header -> Rep Header x #

to :: Rep Header x -> Header #

Show Header Source # 
Instance details

Defined in Lifx.Lan

Binary Header Source # 
Instance details

Defined in Lifx.Lan

Methods

put :: Header -> Put #

get :: Get Header #

putList :: [Header] -> Put #

Eq Header Source # 
Instance details

Defined in Lifx.Lan

Methods

(==) :: Header -> Header -> Bool #

(/=) :: Header -> Header -> Bool #

Ord Header Source # 
Instance details

Defined in Lifx.Lan

type Rep Header Source # 
Instance details

Defined in Lifx.Lan