diff --git a/.travis.yml b/.travis.yml
index 5110ef5f..01463f05 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -1,2 +1,13 @@
sudo: false
language: go
+go:
+ - 1.11.x
+ - master
+os:
+ - linux
+ - osx
+dist: trusty
+install: true
+script:
+ - env GO111MODULE=on go build
+ - env GO111MODULE=on go test
\ No newline at end of file
diff --git a/README.md b/README.md
index 98781bee..f63e3a93 100644
--- a/README.md
+++ b/README.md
@@ -1,38 +1,51 @@
-# HomeControl
+# hc
-[![Build Status](https://travis-ci.org/brutella/hc.svg)](https://travis-ci.org/brutella/hc)
+[![GoDoc Widget]][GoDoc] [![Travis Widget]][Travis]
-HomeControl is an implementation of the [HomeKit][homekit] Accessory Protocol (HAP) to create your own HomeKit accessory in [Go](https://golang.org). [HomeKit][homekit] is a set of protocols and libraries to access devices for Home Automation. ~~The actual protocol documentation is only available to MFi members.~~ A non-commercial version of the documentation is now available on the [HomeKit developer website](https://developer.apple.com/homekit/).
+`hc` is a lightweight framework to develop HomeKit accessories in Go.
+It abstracts the **H**omeKit **A**ccessory **P**rotocol (HAP) and makes it easy to work with [services](service/README.md) and [characteristics](characteristic/README.md).
-You can use this library to make existing Home Automation devices HomeKit compatible. I've already developed the following HomeKit bridges with in:
+`hc` handles the underlying communication between HomeKit accessories and clients.
+You can focus on implementing the business logic for your accessory, without having to worry about the protocol.
+
+Here are some projects which use `hc`.
- [LIFX](https://github.com/brutella/hklifx/)
- [UVR1611](https://github.com/brutella/hkuvr)
- [Fronius Symo](https://github.com/brutella/hksymo)
-## HomeKit on iOS
+**What is HomeKit?**
+
+[HomeKit][homekit] is a set of protocols and libraries from Apple. It is used by Apple's platforms to communicate with smart home appliances. A non-commercial version of the documentation is now available on the [HomeKit developer website](https://developer.apple.com/homekit/).
+
+HomeKit is fully integrated into iOS since iOS 8. Developers can use [HomeKit.framework](https://developer.apple.com/documentation/homekit) to communicate with accessories using high-level APIs.
+
+
-HomeKit is fully integrated since iOS 8. Developers can use the HomeKit framework to communicate with HomeKit using high-level APIs.
-I've developed the [Home][home] app (for iPhone, iPad, Apple Watch) to control HomeKit accessories. If you [purchase Home][home-appstore] on the App Store, you not only support my work but also get an awesome iOS app. Thank you.
+I've developed the [Home][home] app to control HomeKit accessories from iPhone, iPad, and Apple Watch.
+If you want to support `hc`, please purchase Home from the [App Store][home-appstore]. That would be awesome. ❤️
-Once you've setup HomeKit, you can use Siri to interact with your accessories using voice command (*Hey Siri, turn off the lights in the living room*).
+Checkout the official [website][home].
-[home]: http://hochgatterer.me/home/
+[home]: https://hochgatterer.me/home/
[home-appstore]: http://itunes.apple.com/app/id995994352
+[GoDoc]: https://godoc.org/github.com/brutella/hc
+[GoDoc Widget]: https://godoc.org/github.com/brutella/hc?status.svg
+[Travis]: https://travis-ci.org/brutella/hc
+[Travis Widget]: https://travis-ci.org/brutella/hc.svg
## Features
- Full implementation of the HAP in Go
- Supports all HomeKit [services and characteristics](service/README.md)
- Built-in service announcement via DNS-SD using [dnssd](http://github.com/brutella/dnssd)
-- Runs on multiple platforms (already in use on Linux and OS X)
+- Runs on linux and macOS
- Documentation: http://godoc.org/github.com/brutella/hc
## Getting Started
-1. [Install Go](http://golang.org/doc/install)
-2. [Setup Go workspace](http://golang.org/doc/code.html#Organization)
-3. Create your own HomeKit bridge or clone an existing one (e.g. [hklight](https://github.com/brutella/hklight))
+1. [Install](http://golang.org/doc/install) and [set up](http://golang.org/doc/code.html#Organization) Go
+2. Create your own HomeKit accessory or clone an existing one (e.g. [hklight](https://github.com/brutella/hklight))
cd $GOPATH/src
@@ -40,11 +53,20 @@ Once you've setup HomeKit, you can use Siri to interact with your accessories us
git clone https://github.com/brutella/hklight && cd hklight
# Run the project
- go run hklightd.go
+ make run
+
+3. Pair with your HomeKit App of choice (e.g. [Home][home-appstore])
+
+**Go Modules**
+
+`hc` supports [Go module](https://github.com/golang/go/wiki/Modules) since `v1.0.0`.
+Make sure to set the environment variable `GO111MODULE=on`.
-4. Pair with your HomeKit App of choice (e.g. [Home][home-appstore])
+## Example
-## API Example
+See [_example](_example) for a variety of examples.
+
+**Basic switch accessory**
Create a simple on/off switch, which is accessible via IP and secured using the pin *00102003*.
@@ -58,88 +80,76 @@ import (
)
func main() {
- info := accessory.Info{
- Name: "Lamp",
- }
- acc := accessory.NewSwitch(info)
+ // create an accessory
+ info := accessory.Info{Name: "Lamp"}
+ ac := accessory.NewSwitch(info)
+ // configure the ip transport
config := hc.Config{Pin: "00102003"}
- t, err := hc.NewIPTransport(config, acc.Accessory)
- if err != nil {
- log.Panic(err)
- }
+ t, err := hc.NewIPTransport(config, ac.Accessory)
+ if err != nil {
+ log.Panic(err)
+ }
hc.OnTermination(func(){
<-t.Stop()
})
- t.Start()
+ t.Start()
}
```
-You should change some default values for your own needs
+You can define more specific accessory info, if you want.
```go
info := accessory.Info{
- Name: "Lamp",
- SerialNumber: "051AC-23AAM1",
- Manufacturer: "Apple",
- Model: "AB",
- Firmware: "1.0.1",
+ Name: "Lamp",
+ SerialNumber: "051AC-23AAM1",
+ Manufacturer: "Apple",
+ Model: "AB",
+ Firmware: "1.0.1",
}
```
-### Callbacks
+### Events
-You get a callback when the power state of a switch changed by a client.
+The library provides callback functions, which let you know when a clients updates a characteristic value.
+The following example shows how to get notified when the [On](characteristic/on.go) characteristic value changes.
```go
-acc.Switch.On.OnValueRemoteUpdate(func(on bool) {
- if on == true {
- log.Println("Client changed switch to on")
- } else {
- log.Println("Client changed switch to off")
- }
+ac.Switch.On.OnValueRemoteUpdate(func(on bool) {
+ if on == true {
+ log.Println("Switch is on")
+ } else {
+ log.Println("Switch is off")
+ }
})
```
When the switch is turned on "the analog way", you should set the state of the accessory.
- acc.Switch.On.SetValue(true)
-
-A complete example is available in `_example/example.go`.
-
-## Model
-
-The HomeKit model hierarchy looks like this:
-
- Accessory
- |-- Accessory Info Service
- | |-- Identify Characteristic
- | |-- Manufacturer Characteristic
- | |-- Model Characteristic
- | |-- Name Characteristic
- | |-- Serial Characteristic
- |
- |-- * Service
- | |-- * Characteristic
+```go
+ac.Switch.On.SetValue(true)
+```
-HomeKit accessories are container for services. Every accessory must provide the `Accessory Information Service`. Every service provides one or more characteristics (a characteristic might be the power state of an outlet). HomeKit has predefined service and characteristic types, which are supported by iOS. You can define your own service and characteristic types, but it's recommended to use predefined ones.
+## Accessory Architecture
-## Dependencies
+HomeKit uses a hierarchical architecture for define accessories, services and characeristics.
+At the root level there is an accessory.
+Every accessory contains services.
+And every service contains characteristics.
-HomeControl uses vendor directories (`vendor/`) to integrate the following libraries
+For example a [lightbulb accessory](accessory/lightbulb.go) contains a [lightbulb service](service/lightbulb.go).
+This service contains characteristics like [on](characteristic/on.go) and [brightness](characteristic/brightness.go).
-- `github.com/tadglines/go-pkgs/crypto/srp` for *SRP* algorithm
-- `github.com/agl/ed25519` for *ed25519* signature
-- `github.com/gosexy/to` for type conversion
-- `github.com/brutella/dnssd` for DNS service discovery
+There are predefined accessories, services and characteristics available in HomeKit.
+Those types are defined in the packages [accessory](accessory), [service](service), [characteristic](characteristic).
# Contact
Matthias Hochgatterer
-Website: [http://hochgatterer.me](http://hochgatterer.me)
+Website: [https://hochgatterer.me](https://hochgatterer.me)
Github: [https://github.com/brutella](https://github.com/brutella/)
diff --git a/_example/example.go b/_example/example/main.go
similarity index 100%
rename from _example/example.go
rename to _example/example/main.go
diff --git a/_example/tv/main.go b/_example/tv/main.go
new file mode 100644
index 00000000..9e7695a5
--- /dev/null
+++ b/_example/tv/main.go
@@ -0,0 +1,160 @@
+package main
+
+import (
+ "fmt"
+
+ "github.com/brutella/hc"
+ "github.com/brutella/hc/accessory"
+ "github.com/brutella/hc/characteristic"
+ "github.com/brutella/hc/log"
+ "github.com/brutella/hc/service"
+)
+
+func addInputSource(t *accessory.Television, id int, name string, inputSourceType int) {
+ in := service.NewInputSource()
+
+ in.Identifier.SetValue(id)
+ in.ConfiguredName.SetValue(name)
+ in.Name.SetValue(name)
+ in.InputSourceType.SetValue(inputSourceType)
+ in.IsConfigured.SetValue(characteristic.IsConfiguredConfigured)
+
+ t.AddService(in.Service)
+ t.Television.AddLinkedService(in.Service)
+
+ in.ConfiguredName.OnValueRemoteUpdate(func(str string) {
+ fmt.Printf(" %s configured name => %s\n", name, str)
+ })
+ in.InputSourceType.OnValueRemoteUpdate(func(v int) {
+ fmt.Printf(" %s source type => %v\n", name, v)
+ })
+ in.IsConfigured.OnValueRemoteUpdate(func(v int) {
+ fmt.Printf(" %s configured => %v\n", name, v)
+ })
+ in.CurrentVisibilityState.OnValueRemoteUpdate(func(v int) {
+ fmt.Printf(" %s current visibility => %v\n", name, v)
+ })
+ in.Identifier.OnValueRemoteUpdate(func(v int) {
+ fmt.Printf(" %s identifier => %v\n", name, v)
+ })
+ in.InputDeviceType.OnValueRemoteUpdate(func(v int) {
+ fmt.Printf(" %s device type => %v\n", name, v)
+ })
+ in.TargetVisibilityState.OnValueRemoteUpdate(func(v int) {
+ fmt.Printf(" %s target visibility => %v\n", name, v)
+ })
+ in.Name.OnValueRemoteUpdate(func(str string) {
+ fmt.Printf(" %s name => %s\n", name, str)
+ })
+}
+
+// TODO
+// - Refactoring how to store characteristic values
+func main() {
+ log.Debug.Enable()
+
+ info := accessory.Info{
+ Name: "Television",
+ }
+ acc := accessory.NewTelevision(info)
+
+ acc.Television.Active.SetValue(characteristic.ActiveActive)
+ acc.Television.SleepDiscoveryMode.SetValue(characteristic.SleepDiscoveryModeAlwaysDiscoverable)
+ acc.Television.ActiveIdentifier.SetValue(1)
+ acc.Television.CurrentMediaState.SetValue(characteristic.CurrentMediaStatePause)
+ acc.Television.TargetMediaState.SetValue(characteristic.TargetMediaStatePause)
+
+ acc.Television.Active.OnValueRemoteUpdate(func(v int) {
+ fmt.Printf("active => %d\n", v)
+ })
+
+ acc.Television.ActiveIdentifier.OnValueRemoteUpdate(func(v int) {
+ fmt.Printf("active identifier => %d\n", v)
+ })
+
+ acc.Television.ConfiguredName.OnValueRemoteUpdate(func(v string) {
+ fmt.Printf("configured name => %s\n", v)
+ })
+ acc.Television.SleepDiscoveryMode.OnValueRemoteUpdate(func(v int) {
+ fmt.Printf("sleep discovery mode => %d\n", v)
+ })
+ acc.Television.Brightness.OnValueRemoteUpdate(func(v int) {
+ fmt.Printf("brightness => %d\n", v)
+ })
+ acc.Television.ClosedCaptions.OnValueRemoteUpdate(func(v int) {
+ fmt.Printf("closed captions => %d\n", v)
+ })
+ acc.Television.DisplayOrder.OnValueRemoteUpdate(func(v []byte) {
+ fmt.Printf("display order => %v\n", v)
+ })
+ acc.Television.CurrentMediaState.OnValueRemoteUpdate(func(v int) {
+ fmt.Printf("current media state => %d\n", v)
+ })
+ acc.Television.TargetMediaState.OnValueRemoteUpdate(func(v int) {
+ fmt.Printf("target media state => %d\n", v)
+ })
+
+ acc.Television.PowerModeSelection.OnValueRemoteUpdate(func(v int) {
+ fmt.Printf("power mode selection => %d\n", v)
+ })
+
+ acc.Television.PictureMode.OnValueRemoteUpdate(func(v int) {
+ fmt.Printf("PictureMode => %d\n", v)
+ })
+
+ acc.Television.RemoteKey.OnValueRemoteUpdate(func(v int) {
+ switch v {
+ case characteristic.RemoteKeyRewind:
+ fmt.Println("Rewind")
+ case characteristic.RemoteKeyFastForward:
+ fmt.Println("Fast forward")
+ case characteristic.RemoteKeyExit:
+ fmt.Println("Exit")
+ case characteristic.RemoteKeyPlayPause:
+ fmt.Println("Play/Pause")
+ case characteristic.RemoteKeyInfo:
+ fmt.Println("Info")
+ case characteristic.RemoteKeyNextTrack:
+ fmt.Println("Next")
+ case characteristic.RemoteKeyPrevTrack:
+ fmt.Println("Prev")
+ case characteristic.RemoteKeyArrowUp:
+ fmt.Println("Up")
+ case characteristic.RemoteKeyArrowDown:
+ fmt.Println("Down")
+ case characteristic.RemoteKeyArrowLeft:
+ fmt.Println("Left")
+ case characteristic.RemoteKeyArrowRight:
+ fmt.Println("Right")
+ case characteristic.RemoteKeySelect:
+ fmt.Println("Select")
+ case characteristic.RemoteKeyBack:
+ fmt.Println("Back")
+ }
+ })
+
+ config := hc.Config{Pin: "12344321", StoragePath: "./db"}
+ t, err := hc.NewIPTransport(config, acc.Accessory)
+
+ addInputSource(acc, 1, "HDMI 1", characteristic.InputSourceTypeHdmi)
+ addInputSource(acc, 2, "HDMI 2", characteristic.InputSourceTypeHdmi)
+ addInputSource(acc, 3, "Netflix", characteristic.InputSourceTypeApplication)
+ addInputSource(acc, 4, "YouTube", characteristic.InputSourceTypeApplication)
+ addInputSource(acc, 5, "Twitter", characteristic.InputSourceTypeApplication)
+ addInputSource(acc, 6, "Composite Video", characteristic.InputSourceTypeCompositeVideo)
+ addInputSource(acc, 7, "S-Video", characteristic.InputSourceTypeSVideo)
+ addInputSource(acc, 8, "Component Video", characteristic.InputSourceTypeComponentVideo)
+ addInputSource(acc, 9, "Dvi", characteristic.InputSourceTypeDvi)
+ addInputSource(acc, 10, "Airplay", characteristic.InputSourceTypeAirplay)
+ addInputSource(acc, 11, "Usb", characteristic.InputSourceTypeUsb)
+
+ if err != nil {
+ log.Info.Panic(err)
+ }
+
+ hc.OnTermination(func() {
+ <-t.Stop()
+ })
+
+ t.Start()
+}
diff --git a/_img/home-icon.png b/_img/home-icon.png
new file mode 100644
index 00000000..747e000c
Binary files /dev/null and b/_img/home-icon.png differ
diff --git a/accessory/README.md b/accessory/README.md
index cc32bfa0..3ed64675 100644
--- a/accessory/README.md
+++ b/accessory/README.md
@@ -25,4 +25,6 @@
| Dehumidifier | 23 |
| Sprinklers | 28 |
| Faucets | 29 |
-| Shower Systems | 30 |
\ No newline at end of file
+| Shower Systems | 30 |
+| Television | 31 |
+| Remote Control | 32 |
\ No newline at end of file
diff --git a/accessory/constant.go b/accessory/constant.go
index db1ae40d..0abd30c6 100644
--- a/accessory/constant.go
+++ b/accessory/constant.go
@@ -30,4 +30,6 @@ const (
TypeSprinklers AccessoryType = 28
TypeFaucets AccessoryType = 29
TypeShowerSystems AccessoryType = 30
+ TypeTelevision AccessoryType = 31
+ TypeRemoteControl AccessoryType = 32
)
diff --git a/accessory/television.go b/accessory/television.go
new file mode 100644
index 00000000..3c153720
--- /dev/null
+++ b/accessory/television.go
@@ -0,0 +1,24 @@
+package accessory
+
+import (
+ "github.com/brutella/hc/service"
+)
+
+type Television struct {
+ *Accessory
+ Television *service.Television
+ Speaker *service.Speaker
+}
+
+// NewTelevision returns a television accessory.
+func NewTelevision(info Info) *Television {
+ acc := Television{}
+ acc.Accessory = New(info, TypeTelevision)
+ acc.Television = service.NewTelevision()
+ acc.Speaker = service.NewSpeaker()
+
+ acc.AddService(acc.Television.Service)
+ acc.AddService(acc.Speaker.Service)
+
+ return &acc
+}
diff --git a/characteristic/active_identifier.go b/characteristic/active_identifier.go
new file mode 100644
index 00000000..d7a5bd06
--- /dev/null
+++ b/characteristic/active_identifier.go
@@ -0,0 +1,19 @@
+// THIS FILE IS AUTO-GENERATED
+package characteristic
+
+const TypeActiveIdentifier = "E7"
+
+type ActiveIdentifier struct {
+ *Int
+}
+
+func NewActiveIdentifier() *ActiveIdentifier {
+ char := NewInt(TypeActiveIdentifier)
+ char.Format = FormatUInt32
+ char.Perms = []string{PermRead, PermWrite, PermEvents}
+ char.SetMinValue(0)
+
+ char.SetValue(0)
+
+ return &ActiveIdentifier{char}
+}
diff --git a/characteristic/bool.go b/characteristic/bool.go
index 1d24feb9..31500514 100644
--- a/characteristic/bool.go
+++ b/characteristic/bool.go
@@ -22,7 +22,7 @@ func (c *Bool) SetValue(value bool) {
// GetValue returns the value as bool
func (c *Bool) GetValue() bool {
- return c.Value.(bool)
+ return c.Characteristic.GetValue().(bool)
}
// OnValueRemoteGet calls fn when the value was read by a client.
diff --git a/characteristic/bytes.go b/characteristic/bytes.go
index 6a43b855..f3999be6 100644
--- a/characteristic/bytes.go
+++ b/characteristic/bytes.go
@@ -2,6 +2,7 @@ package characteristic
import (
"encoding/base64"
+ "net"
)
type Bytes struct {
@@ -28,6 +29,13 @@ func (bs *Bytes) GetValue() []byte {
}
}
+// OnValueRemoteUpdate calls fn when the value was updated by a client.
+func (bs *Bytes) OnValueRemoteUpdate(fn func([]byte)) {
+ bs.OnValueUpdateFromConn(func(conn net.Conn, c *Characteristic, new, old interface{}) {
+ fn(new.([]byte))
+ })
+}
+
func base64FromBytes(b []byte) string {
return base64.StdEncoding.EncodeToString(b)
}
diff --git a/characteristic/characteristic.go b/characteristic/characteristic.go
index 0a80baf7..ef80acbc 100644
--- a/characteristic/characteristic.go
+++ b/characteristic/characteristic.go
@@ -2,9 +2,9 @@ package characteristic
import (
"fmt"
- "github.com/gosexy/to"
"net"
- "reflect"
+
+ "github.com/gosexy/to"
)
type ConnChangeFunc func(conn net.Conn, c *Characteristic, newValue, oldValue interface{})
@@ -149,11 +149,7 @@ func (c *Characteristic) getValue(conn net.Conn) interface{} {
//
// When permissions are write only and checkPerms is true, this methods does not set the Value field.
func (c *Characteristic) updateValue(value interface{}, conn net.Conn, checkPerms bool) {
- if c.Value != nil {
- if converted, err := to.Convert(value, reflect.TypeOf(c.Value).Kind()); err == nil {
- value = converted
- }
- }
+ value = c.convert(value)
// Value must be within min and max
switch c.Format {
@@ -222,3 +218,22 @@ func (c *Characteristic) boundIntValue(value int) interface{} {
return value
}
+
+func (c *Characteristic) convert(v interface{}) interface{} {
+ switch c.Format {
+ case FormatFloat:
+ return to.Float64(v)
+ case FormatUInt8:
+ return int(to.Uint64(v))
+ case FormatUInt16:
+ return int(to.Uint64(v))
+ case FormatUInt32:
+ return int(to.Uint64(v))
+ case FormatInt32:
+ return int(to.Uint64(v))
+ case FormatUInt64:
+ return int(to.Uint64(v))
+ default:
+ return v
+ }
+}
diff --git a/characteristic/characteristic_test.go b/characteristic/characteristic_test.go
index c365d6d3..dbaf3713 100644
--- a/characteristic/characteristic_test.go
+++ b/characteristic/characteristic_test.go
@@ -9,7 +9,7 @@ func TestCharacteristicGetValue(t *testing.T) {
getCalls := 0
updateCalls := 0
- c := NewCharacteristic(TypeOn)
+ c := NewBrightness()
c.Value = getCalls
c.OnValueUpdateFromConn(func(conn net.Conn, c *Characteristic, new, old interface{}) {
@@ -46,7 +46,7 @@ func TestCharacteristicGetValue(t *testing.T) {
}
func TestCharacteristicUpdateValuesOfWrongType(t *testing.T) {
- c := NewCharacteristic(TypeOn)
+ c := NewBrightness()
c.Value = 5
c.UpdateValue(float64(20.5))
@@ -69,7 +69,7 @@ func TestCharacteristicUpdateValuesOfWrongType(t *testing.T) {
}
func TestCharacteristicLocalDelegate(t *testing.T) {
- c := NewCharacteristic(TypeOn)
+ c := NewBrightness()
c.Value = 5
var oldValue interface{}
@@ -92,7 +92,7 @@ func TestCharacteristicLocalDelegate(t *testing.T) {
}
func TestCharacteristicRemoteDelegate(t *testing.T) {
- c := NewCharacteristic(TypeOn)
+ c := NewBrightness()
c.Perms = PermsAll()
c.Value = 5
@@ -118,7 +118,7 @@ func TestCharacteristicRemoteDelegate(t *testing.T) {
}
func TestNoValueChange(t *testing.T) {
- c := NewCharacteristic(TypeOn)
+ c := NewBrightness()
c.Value = 5
changed := false
@@ -142,7 +142,7 @@ func TestNoValueChange(t *testing.T) {
}
func TestReadOnlyValue(t *testing.T) {
- c := NewCharacteristic(TypeOn)
+ c := NewBrightness()
c.Perms = PermsRead()
c.Value = 5
@@ -174,13 +174,13 @@ func TestReadOnlyValue(t *testing.T) {
}
func TestEqual(t *testing.T) {
- c1 := NewCharacteristic(TypeOn)
+ c1 := NewBrightness()
c1.Value = 5
- c2 := NewCharacteristic(TypeOn)
+ c2 := NewBrightness()
c2.Value = 5
- if c1.Equal(c2) == false {
+ if c1.Characteristic.Equal(c2.Characteristic) == false {
t.Fatal("characteristics not the same")
}
}
diff --git a/characteristic/closed_captions.go b/characteristic/closed_captions.go
new file mode 100644
index 00000000..6eb74b47
--- /dev/null
+++ b/characteristic/closed_captions.go
@@ -0,0 +1,25 @@
+// THIS FILE IS AUTO-GENERATED
+package characteristic
+
+const (
+ ClosedCaptionsDisabled int = 0
+ ClosedCaptionsEnabled int = 1
+)
+
+const TypeClosedCaptions = "DD"
+
+type ClosedCaptions struct {
+ *Int
+}
+
+func NewClosedCaptions() *ClosedCaptions {
+ char := NewInt(TypeClosedCaptions)
+ char.Format = FormatUInt8
+ char.Perms = []string{PermRead, PermWrite, PermEvents}
+ char.SetMinValue(0)
+ char.SetMaxValue(1)
+ char.SetStepValue(1)
+ char.SetValue(0)
+
+ return &ClosedCaptions{char}
+}
diff --git a/characteristic/configured_name.go b/characteristic/configured_name.go
new file mode 100644
index 00000000..c931b5ff
--- /dev/null
+++ b/characteristic/configured_name.go
@@ -0,0 +1,18 @@
+// THIS FILE IS AUTO-GENERATED
+package characteristic
+
+const TypeConfiguredName = "E3"
+
+type ConfiguredName struct {
+ *String
+}
+
+func NewConfiguredName() *ConfiguredName {
+ char := NewString(TypeConfiguredName)
+ char.Format = FormatString
+ char.Perms = []string{PermRead, PermWrite, PermEvents}
+
+ char.SetValue("")
+
+ return &ConfiguredName{char}
+}
diff --git a/characteristic/constants.go b/characteristic/constants.go
index ee62c0f8..a59e3d26 100644
--- a/characteristic/constants.go
+++ b/characteristic/constants.go
@@ -4,6 +4,7 @@ const (
PermRead = "pr" // can be read
PermWrite = "pw" // can be written
PermEvents = "ev" // sends events
+ PermHidden = "hd" // is hidden
)
// PermsAll returns read, write and event permissions
@@ -33,6 +34,7 @@ const (
UnitCelsius = "celsius"
UnitLux = "lux"
UnitSeconds = "seconds"
+ UnitPPM = "ppm"
)
// HAP characterisitic formats
diff --git a/characteristic/current_media_state.go b/characteristic/current_media_state.go
new file mode 100644
index 00000000..ad81ad6b
--- /dev/null
+++ b/characteristic/current_media_state.go
@@ -0,0 +1,28 @@
+// THIS FILE IS AUTO-GENERATED
+package characteristic
+
+const (
+ CurrentMediaStatePlay int = 0
+ CurrentMediaStatePause int = 1
+ CurrentMediaStateStop int = 2
+ CurrentMediaStateUnknown int = 3
+)
+
+const TypeCurrentMediaState = "E0"
+
+type CurrentMediaState struct {
+ *Int
+}
+
+func NewCurrentMediaState() *CurrentMediaState {
+ char := NewInt(TypeCurrentMediaState)
+ char.Format = FormatUInt8
+ char.Perms = []string{PermRead, PermEvents}
+ char.SetMinValue(0)
+ char.SetMaxValue(3)
+ char.SetStepValue(1)
+ char.SetValue(0)
+ char.Unit = UnitPercentage
+
+ return &CurrentMediaState{char}
+}
diff --git a/characteristic/current_visibility_state.go b/characteristic/current_visibility_state.go
new file mode 100644
index 00000000..fc096dea
--- /dev/null
+++ b/characteristic/current_visibility_state.go
@@ -0,0 +1,25 @@
+// THIS FILE IS AUTO-GENERATED
+package characteristic
+
+const (
+ CurrentVisibilityStateShown int = 0
+ CurrentVisibilityStateHidden int = 1
+)
+
+const TypeCurrentVisibilityState = "135"
+
+type CurrentVisibilityState struct {
+ *Int
+}
+
+func NewCurrentVisibilityState() *CurrentVisibilityState {
+ char := NewInt(TypeCurrentVisibilityState)
+ char.Format = FormatUInt8
+ char.Perms = []string{PermRead, PermEvents}
+ char.SetMinValue(0)
+ char.SetMaxValue(3)
+ char.SetStepValue(1)
+ char.SetValue(0)
+
+ return &CurrentVisibilityState{char}
+}
diff --git a/characteristic/display_order.go b/characteristic/display_order.go
new file mode 100644
index 00000000..75416800
--- /dev/null
+++ b/characteristic/display_order.go
@@ -0,0 +1,18 @@
+// THIS FILE IS AUTO-GENERATED
+package characteristic
+
+const TypeDisplayOrder = "136"
+
+type DisplayOrder struct {
+ *Bytes
+}
+
+func NewDisplayOrder() *DisplayOrder {
+ char := NewBytes(TypeDisplayOrder)
+ char.Format = FormatTLV8
+ char.Perms = []string{PermRead, PermWrite, PermEvents}
+
+ char.SetValue([]byte{})
+
+ return &DisplayOrder{char}
+}
diff --git a/characteristic/float.go b/characteristic/float.go
index 50ab3dfc..f3032bad 100644
--- a/characteristic/float.go
+++ b/characteristic/float.go
@@ -32,7 +32,7 @@ func (c *Float) SetStepValue(value float64) {
// GetValue returns the value as float
func (c *Float) GetValue() float64 {
- return c.Value.(float64)
+ return c.Characteristic.GetValue().(float64)
}
func (c *Float) GetMinValue() float64 {
diff --git a/characteristic/identifier.go b/characteristic/identifier.go
new file mode 100644
index 00000000..19a6b10e
--- /dev/null
+++ b/characteristic/identifier.go
@@ -0,0 +1,20 @@
+// THIS FILE IS AUTO-GENERATED
+package characteristic
+
+const TypeIdentifier = "E6"
+
+type Identifier struct {
+ *Int
+}
+
+func NewIdentifier() *Identifier {
+ char := NewInt(TypeIdentifier)
+ char.Format = FormatUInt32
+ char.Perms = []string{PermRead}
+ char.SetMinValue(0)
+
+ char.SetStepValue(1)
+ char.SetValue(0)
+
+ return &Identifier{char}
+}
diff --git a/characteristic/input_device_type.go b/characteristic/input_device_type.go
new file mode 100644
index 00000000..1cf5ad23
--- /dev/null
+++ b/characteristic/input_device_type.go
@@ -0,0 +1,29 @@
+// THIS FILE IS AUTO-GENERATED
+package characteristic
+
+const (
+ InputDeviceTypeOther int = 0
+ InputDeviceTypeTv int = 1
+ InputDeviceTypeRecording int = 2
+ InputDeviceTypeTuner int = 3
+ InputDeviceTypePlayback int = 4
+ InputDeviceTypeAudioSystem int = 5
+)
+
+const TypeInputDeviceType = "DC"
+
+type InputDeviceType struct {
+ *Int
+}
+
+func NewInputDeviceType() *InputDeviceType {
+ char := NewInt(TypeInputDeviceType)
+ char.Format = FormatUInt8
+ char.Perms = []string{PermRead, PermEvents}
+ char.SetMinValue(0)
+ char.SetMaxValue(5)
+ char.SetStepValue(1)
+ char.SetValue(0)
+
+ return &InputDeviceType{char}
+}
diff --git a/characteristic/input_source_type.go b/characteristic/input_source_type.go
new file mode 100644
index 00000000..365aab8c
--- /dev/null
+++ b/characteristic/input_source_type.go
@@ -0,0 +1,34 @@
+// THIS FILE IS AUTO-GENERATED
+package characteristic
+
+const (
+ InputSourceTypeOther int = 0
+ InputSourceTypeHomeScreen int = 1
+ InputSourceTypeApplication int = 10
+ InputSourceTypeTuner int = 2
+ InputSourceTypeHdmi int = 3
+ InputSourceTypeCompositeVideo int = 4
+ InputSourceTypeSVideo int = 5
+ InputSourceTypeComponentVideo int = 6
+ InputSourceTypeDvi int = 7
+ InputSourceTypeAirplay int = 8
+ InputSourceTypeUsb int = 9
+)
+
+const TypeInputSourceType = "DB"
+
+type InputSourceType struct {
+ *Int
+}
+
+func NewInputSourceType() *InputSourceType {
+ char := NewInt(TypeInputSourceType)
+ char.Format = FormatUInt8
+ char.Perms = []string{PermRead, PermEvents}
+ char.SetMinValue(0)
+ char.SetMaxValue(10)
+ char.SetStepValue(1)
+ char.SetValue(0)
+
+ return &InputSourceType{char}
+}
diff --git a/characteristic/int.go b/characteristic/int.go
index 82b71729..86f7a5ea 100644
--- a/characteristic/int.go
+++ b/characteristic/int.go
@@ -32,7 +32,7 @@ func (c *Int) SetStepValue(value int) {
// GetValue returns the value as int
func (c *Int) GetValue() int {
- return c.Value.(int)
+ return c.Characteristic.GetValue().(int)
}
func (c *Int) GetMinValue() int {
diff --git a/characteristic/picture_mode.go b/characteristic/picture_mode.go
new file mode 100644
index 00000000..6ebbdde3
--- /dev/null
+++ b/characteristic/picture_mode.go
@@ -0,0 +1,31 @@
+// THIS FILE IS AUTO-GENERATED
+package characteristic
+
+const (
+ PictureModeOther int = 0
+ PictureModeStandard int = 1
+ PictureModeCalibrated int = 2
+ PictureModeCalibratedDark int = 3
+ PictureModeVivid int = 4
+ PictureModeGame int = 5
+ PictureModeComputer int = 6
+ PictureModeCustom int = 7
+)
+
+const TypePictureMode = "E2"
+
+type PictureMode struct {
+ *Int
+}
+
+func NewPictureMode() *PictureMode {
+ char := NewInt(TypePictureMode)
+ char.Format = FormatUInt16
+ char.Perms = []string{PermRead, PermWrite, PermEvents}
+ char.SetMinValue(0)
+ char.SetMaxValue(13)
+ char.SetStepValue(1)
+ char.SetValue(0)
+
+ return &PictureMode{char}
+}
diff --git a/characteristic/power_mode_selection.go b/characteristic/power_mode_selection.go
new file mode 100644
index 00000000..3a946199
--- /dev/null
+++ b/characteristic/power_mode_selection.go
@@ -0,0 +1,24 @@
+// THIS FILE IS AUTO-GENERATED
+package characteristic
+
+const (
+ PowerModeSelectionShow int = 0
+ PowerModeSelectionHide int = 1
+)
+
+const TypePowerModeSelection = "DF"
+
+type PowerModeSelection struct {
+ *Int
+}
+
+func NewPowerModeSelection() *PowerModeSelection {
+ char := NewInt(TypePowerModeSelection)
+ char.Format = FormatUInt8
+ char.Perms = []string{PermWrite}
+ char.SetMinValue(0)
+ char.SetMaxValue(1)
+ char.SetStepValue(1)
+
+ return &PowerModeSelection{char}
+}
diff --git a/characteristic/remote_key.go b/characteristic/remote_key.go
new file mode 100644
index 00000000..8f377783
--- /dev/null
+++ b/characteristic/remote_key.go
@@ -0,0 +1,35 @@
+// THIS FILE IS AUTO-GENERATED
+package characteristic
+
+const (
+ RemoteKeyRewind int = 0
+ RemoteKeyFastForward int = 1
+ RemoteKeyExit int = 10
+ RemoteKeyPlayPause int = 11
+ RemoteKeyInfo int = 15
+ RemoteKeyNextTrack int = 2
+ RemoteKeyPrevTrack int = 3
+ RemoteKeyArrowUp int = 4
+ RemoteKeyArrowDown int = 5
+ RemoteKeyArrowLeft int = 6
+ RemoteKeyArrowRight int = 7
+ RemoteKeySelect int = 8
+ RemoteKeyBack int = 9
+)
+
+const TypeRemoteKey = "E1"
+
+type RemoteKey struct {
+ *Int
+}
+
+func NewRemoteKey() *RemoteKey {
+ char := NewInt(TypeRemoteKey)
+ char.Format = FormatUInt8
+ char.Perms = []string{PermWrite}
+ char.SetMinValue(0)
+ char.SetMaxValue(16)
+ char.SetStepValue(1)
+
+ return &RemoteKey{char}
+}
diff --git a/characteristic/sleep_discovery_mode.go b/characteristic/sleep_discovery_mode.go
new file mode 100644
index 00000000..9ddad505
--- /dev/null
+++ b/characteristic/sleep_discovery_mode.go
@@ -0,0 +1,25 @@
+// THIS FILE IS AUTO-GENERATED
+package characteristic
+
+const (
+ SleepDiscoveryModeNotDiscoverable int = 0
+ SleepDiscoveryModeAlwaysDiscoverable int = 1
+)
+
+const TypeSleepDiscoveryMode = "E8"
+
+type SleepDiscoveryMode struct {
+ *Int
+}
+
+func NewSleepDiscoveryMode() *SleepDiscoveryMode {
+ char := NewInt(TypeSleepDiscoveryMode)
+ char.Format = FormatUInt8
+ char.Perms = []string{PermRead, PermEvents}
+ char.SetMinValue(0)
+ char.SetMaxValue(1)
+
+ char.SetValue(0)
+
+ return &SleepDiscoveryMode{char}
+}
diff --git a/characteristic/string.go b/characteristic/string.go
index e9756af0..42664476 100644
--- a/characteristic/string.go
+++ b/characteristic/string.go
@@ -22,7 +22,7 @@ func (c *String) SetValue(str string) {
// GetValue returns the value as string
func (c *String) GetValue() string {
- return c.Value.(string)
+ return c.Characteristic.GetValue().(string)
}
// OnValueRemoteGet calls fn when the value was read by a client.
diff --git a/characteristic/target_media_state.go b/characteristic/target_media_state.go
new file mode 100644
index 00000000..001d3ecb
--- /dev/null
+++ b/characteristic/target_media_state.go
@@ -0,0 +1,26 @@
+// THIS FILE IS AUTO-GENERATED
+package characteristic
+
+const (
+ TargetMediaStatePlay int = 0
+ TargetMediaStatePause int = 1
+ TargetMediaStateStop int = 2
+)
+
+const TypeTargetMediaState = "137"
+
+type TargetMediaState struct {
+ *Int
+}
+
+func NewTargetMediaState() *TargetMediaState {
+ char := NewInt(TypeTargetMediaState)
+ char.Format = FormatUInt8
+ char.Perms = []string{PermRead, PermWrite, PermEvents}
+ char.SetMinValue(0)
+ char.SetMaxValue(2)
+ char.SetStepValue(1)
+ char.SetValue(0)
+
+ return &TargetMediaState{char}
+}
diff --git a/characteristic/target_visibility_state.go b/characteristic/target_visibility_state.go
new file mode 100644
index 00000000..cebd8c20
--- /dev/null
+++ b/characteristic/target_visibility_state.go
@@ -0,0 +1,25 @@
+// THIS FILE IS AUTO-GENERATED
+package characteristic
+
+const (
+ TargetVisibilityStateShown int = 0
+ TargetVisibilityStateHidden int = 1
+)
+
+const TypeTargetVisibilityState = "134"
+
+type TargetVisibilityState struct {
+ *Int
+}
+
+func NewTargetVisibilityState() *TargetVisibilityState {
+ char := NewInt(TypeTargetVisibilityState)
+ char.Format = FormatUInt8
+ char.Perms = []string{PermRead, PermWrite, PermEvents}
+ char.SetMinValue(0)
+ char.SetMaxValue(2)
+ char.SetStepValue(1)
+ char.SetValue(0)
+
+ return &TargetVisibilityState{char}
+}
diff --git a/characteristic/volume_control_type.go b/characteristic/volume_control_type.go
new file mode 100644
index 00000000..e54eb4be
--- /dev/null
+++ b/characteristic/volume_control_type.go
@@ -0,0 +1,27 @@
+// THIS FILE IS AUTO-GENERATED
+package characteristic
+
+const (
+ VolumeControlTypeNone int = 0
+ VolumeControlTypeRelative int = 1
+ VolumeControlTypeRelativeWithCurrent int = 2
+ VolumeControlTypeAbsolute int = 3
+)
+
+const TypeVolumeControlType = "E9"
+
+type VolumeControlType struct {
+ *Int
+}
+
+func NewVolumeControlType() *VolumeControlType {
+ char := NewInt(TypeVolumeControlType)
+ char.Format = FormatUInt8
+ char.Perms = []string{PermRead, PermEvents}
+ char.SetMinValue(0)
+ char.SetMaxValue(3)
+ char.SetStepValue(1)
+ char.SetValue(0)
+
+ return &VolumeControlType{char}
+}
diff --git a/characteristic/volume_selector.go b/characteristic/volume_selector.go
new file mode 100644
index 00000000..557740ce
--- /dev/null
+++ b/characteristic/volume_selector.go
@@ -0,0 +1,24 @@
+// THIS FILE IS AUTO-GENERATED
+package characteristic
+
+const (
+ VolumeSelectorIncrement int = 0
+ VolumeSelectorDecrement int = 1
+)
+
+const TypeVolumeSelector = "EA"
+
+type VolumeSelector struct {
+ *Int
+}
+
+func NewVolumeSelector() *VolumeSelector {
+ char := NewInt(TypeVolumeSelector)
+ char.Format = FormatUInt8
+ char.Perms = []string{PermWrite}
+ char.SetMinValue(0)
+ char.SetMaxValue(1)
+ char.SetStepValue(1)
+
+ return &VolumeSelector{char}
+}
diff --git a/config.go b/config.go
index 93221af8..a32896d7 100644
--- a/config.go
+++ b/config.go
@@ -6,7 +6,6 @@ import (
"net"
"reflect"
- "github.com/brutella/hc/log"
"github.com/brutella/hc/util"
"github.com/gosexy/to"
)
@@ -21,7 +20,7 @@ type Config struct {
// When empty, the transport uses a random port
Port string
- // IP on which clients can connect.
+ // Deprecated: Specifying a static IP is discouraged.
IP string
// Pin with has to be entered on iOS client to pair with the accessory
@@ -41,16 +40,10 @@ type Config struct {
}
func defaultConfig(name string) *Config {
- ip, err := getFirstLocalIPAddr()
- if err != nil {
- log.Info.Panic(err)
- }
-
return &Config{
StoragePath: name,
Pin: "00102003", // default pin
Port: "", // empty string means that we get port from assigned by the system
- IP: ip.String(),
name: name,
id: util.MAC48Address(util.RandomHexString()),
version: 1,
diff --git a/gen/metadata.json b/gen/metadata.json
index 66abfbc7..f1f237df 100644
--- a/gen/metadata.json
+++ b/gen/metadata.json
@@ -1,2926 +1,3323 @@
{
- "Categories" : [
- {
- "Name" : "Unknown",
- "Category" : 0
- },
- {
- "Name" : "Other",
- "Category" : 1
- },
- {
- "Name" : "Bridge",
- "Category" : 2
- },
- {
- "Name" : "Fan",
- "Category" : 3
- },
- {
- "Name" : "Garage Door Opener",
- "Category" : 4
- },
- {
- "Name" : "Lightbulb",
- "Category" : 5
- },
- {
- "Name" : "Door Lock",
- "Category" : 6
- },
- {
- "Name" : "Outlet",
- "Category" : 7
- },
- {
- "Name" : "Switch",
- "Category" : 8
- },
- {
- "Name" : "Thermostat",
- "Category" : 9
- },
- {
- "Name" : "Sensor",
- "Category" : 10
- },
- {
- "Name" : "Security System",
- "Category" : 11
- },
- {
- "Name" : "Door",
- "Category" : 12
- },
- {
- "Name" : "Window",
- "Category" : 13
- },
- {
- "Name" : "Window Covering",
- "Category" : 14
- },
- {
- "Name" : "Programmable Switch",
- "Category" : 15
- },
- {
- "Name" : "IP Camera",
- "Category" : 17
- },
- {
- "Name" : "Video Doorbell",
- "Category" : 18
- },
- {
- "Name" : "Air Purifier",
- "Category" : 19
- },
- {
- "Name" : "Heater",
- "Category" : 20
- },
- {
- "Name" : "Air Conditioner",
- "Category" : 21
- },
- {
- "Name" : "Humidifier",
- "Category" : 22
- },
- {
- "Name" : "Dehumidifier",
- "Category" : 23
- },
- {
- "Name" : "Sprinklers",
- "Category" : 28
- },
- {
- "Name" : "Faucets",
- "Category" : 29
- },
- {
- "Name" : "Shower Systems",
- "Category" : 30
- }
- ],
- "Characteristics" : [
- {
- "UUID" : "000000A6-0000-1000-8000-0026BB765291",
- "Name" : "Accessory Flags",
- "Constraints" : {
- "ValidBits" : {
- "0" : "Requires Additional Setup"
+ "Categories": [
+ {
+ "Name": "Unknown",
+ "Category": 0
+ },
+ {
+ "Name": "Other",
+ "Category": 1
+ },
+ {
+ "Name": "Bridge",
+ "Category": 2
+ },
+ {
+ "Name": "Fan",
+ "Category": 3
+ },
+ {
+ "Name": "Garage Door Opener",
+ "Category": 4
+ },
+ {
+ "Name": "Lightbulb",
+ "Category": 5
+ },
+ {
+ "Name": "Door Lock",
+ "Category": 6
+ },
+ {
+ "Name": "Outlet",
+ "Category": 7
+ },
+ {
+ "Name": "Switch",
+ "Category": 8
+ },
+ {
+ "Name": "Thermostat",
+ "Category": 9
+ },
+ {
+ "Name": "Sensor",
+ "Category": 10
+ },
+ {
+ "Name": "Security System",
+ "Category": 11
+ },
+ {
+ "Name": "Door",
+ "Category": 12
+ },
+ {
+ "Name": "Window",
+ "Category": 13
+ },
+ {
+ "Name": "Window Covering",
+ "Category": 14
+ },
+ {
+ "Name": "Programmable Switch",
+ "Category": 15
+ },
+ {
+ "Name": "IP Camera",
+ "Category": 17
+ },
+ {
+ "Name": "Video Doorbell",
+ "Category": 18
+ },
+ {
+ "Name": "Air Purifier",
+ "Category": 19
+ },
+ {
+ "Name": "Heater",
+ "Category": 20
+ },
+ {
+ "Name": "Air Conditioner",
+ "Category": 21
+ },
+ {
+ "Name": "Humidifier",
+ "Category": 22
+ },
+ {
+ "Name": "Dehumidifier",
+ "Category": 23
+ },
+ {
+ "Name": "Sprinklers",
+ "Category": 28
+ },
+ {
+ "Name": "Faucets",
+ "Category": 29
+ },
+ {
+ "Name": "Shower Systems",
+ "Category": 30
+ },
+ {
+ "Name": "Television",
+ "Category": 31
+ },
+ {
+ "Name": "Remote Control",
+ "Category": 32
}
- },
- "Format" : "uint32",
- "Permissions" : [
- "securedRead"
- ],
- "Properties" : [
- "read",
- "cnotify",
- "uncnotify"
- ]
- },
- {
- "UUID" : "000000B0-0000-1000-8000-0026BB765291",
- "Name" : "Active",
- "Constraints" : {
- "ValidValues" : {
- "0" : "Inactive",
- "1" : "Active"
+ ],
+ "Characteristics": [
+ {
+ "UUID": "000000A6-0000-1000-8000-0026BB765291",
+ "Name": "Accessory Flags",
+ "Constraints": {
+ "ValidBits": {
+ "0": "Requires Additional Setup"
+ }
+ },
+ "Format": "uint32",
+ "Permissions": [
+ "securedRead"
+ ],
+ "Properties": [
+ "read",
+ "cnotify",
+ "uncnotify"
+ ]
+ },
+ {
+ "UUID": "000000B0-0000-1000-8000-0026BB765291",
+ "Name": "Active",
+ "Constraints": {
+ "ValidValues": {
+ "0": "Inactive",
+ "1": "Active"
+ }
+ },
+ "Format": "uint8",
+ "Permissions": [
+ "securedRead",
+ "securedWrite"
+ ],
+ "Properties": [
+ "read",
+ "write",
+ "cnotify",
+ "uncnotify"
+ ]
+ },
+ {
+ "UUID": "000000E7-0000-1000-8000-0026BB765291",
+ "Name": "Active Identifier",
+ "Constraints": {
+ "MinimumValue": 0
+ },
+ "Format": "uint32",
+ "Permissions": [
+ "securedRead",
+ "securedWrite"
+ ],
+ "Properties": [
+ "read",
+ "write",
+ "cnotify"
+ ]
+ },
+ {
+ "Name": "Administrator Only Access",
+ "Format": "bool",
+ "Permissions": [
+ "securedRead",
+ "securedWrite"
+ ],
+ "Properties": [
+ "read",
+ "write",
+ "cnotify",
+ "uncnotify"
+ ],
+ "UUID": "00000001-0000-1000-8000-0026BB765291"
+ },
+ {
+ "UUID": "00000064-0000-1000-8000-0026BB765291",
+ "Name": "Air Particulate Density",
+ "Constraints": {
+ "StepValue": 1,
+ "MaximumValue": 1000,
+ "MinimumValue": 0
+ },
+ "Format": "float",
+ "Permissions": [
+ "securedRead"
+ ],
+ "Properties": [
+ "read",
+ "cnotify",
+ "uncnotify"
+ ]
+ },
+ {
+ "UUID": "00000065-0000-1000-8000-0026BB765291",
+ "Name": "Air Particulate Size",
+ "Constraints": {
+ "ValidValues": {
+ "0": "2.5 μm",
+ "1": "10 μm"
+ }
+ },
+ "Format": "uint8",
+ "Permissions": [
+ "securedRead"
+ ],
+ "Properties": [
+ "read",
+ "cnotify",
+ "uncnotify"
+ ]
+ },
+ {
+ "UUID": "00000095-0000-1000-8000-0026BB765291",
+ "Name": "Air Quality",
+ "Constraints": {
+ "ValidValues": {
+ "3": "Fair",
+ "1": "Excellent",
+ "4": "Inferior",
+ "2": "Good",
+ "0": "Unknown",
+ "5": "Poor"
+ }
+ },
+ "Format": "uint8",
+ "Permissions": [
+ "securedRead"
+ ],
+ "Properties": [
+ "read",
+ "cnotify",
+ "uncnotify"
+ ]
+ },
+ {
+ "Name": "Audio Feedback",
+ "Format": "bool",
+ "Permissions": [
+ "securedRead",
+ "securedWrite"
+ ],
+ "Properties": [
+ "read",
+ "write",
+ "cnotify",
+ "uncnotify"
+ ],
+ "UUID": "00000005-0000-1000-8000-0026BB765291"
+ },
+ {
+ "Format": "uint8",
+ "UUID": "00000068-0000-1000-8000-0026BB765291",
+ "Properties": [
+ "read",
+ "cnotify",
+ "uncnotify"
+ ],
+ "Name": "Battery Level",
+ "Permissions": [
+ "securedRead"
+ ],
+ "Unit": "percentage",
+ "Constraints": {
+ "StepValue": 1,
+ "MaximumValue": 100,
+ "MinimumValue": 0
+ }
+ },
+ {
+ "Format": "int32",
+ "UUID": "00000008-0000-1000-8000-0026BB765291",
+ "Properties": [
+ "read",
+ "write",
+ "cnotify",
+ "uncnotify"
+ ],
+ "Name": "Brightness",
+ "Permissions": [
+ "securedRead",
+ "securedWrite"
+ ],
+ "Unit": "percentage",
+ "Constraints": {
+ "StepValue": 1,
+ "MaximumValue": 100,
+ "MinimumValue": 0
+ }
+ },
+ {
+ "UUID": "00000092-0000-1000-8000-0026BB765291",
+ "Name": "Carbon Dioxide Detected",
+ "Constraints": {
+ "ValidValues": {
+ "0": "CO2 Levels Normal",
+ "1": "CO2 Levels Abnormal"
+ }
+ },
+ "Format": "uint8",
+ "Permissions": [
+ "securedRead"
+ ],
+ "Properties": [
+ "read",
+ "cnotify",
+ "uncnotify"
+ ]
+ },
+ {
+ "UUID": "00000093-0000-1000-8000-0026BB765291",
+ "Name": "Carbon Dioxide Level",
+ "Constraints": {
+ "MaximumValue": 100000,
+ "MinimumValue": 0
+ },
+ "Format": "float",
+ "Permissions": [
+ "securedRead"
+ ],
+ "Properties": [
+ "read",
+ "cnotify",
+ "uncnotify"
+ ]
+ },
+ {
+ "UUID": "00000094-0000-1000-8000-0026BB765291",
+ "Name": "Carbon Dioxide Peak Level",
+ "Constraints": {
+ "MaximumValue": 100000,
+ "MinimumValue": 0
+ },
+ "Format": "float",
+ "Permissions": [
+ "securedRead"
+ ],
+ "Properties": [
+ "read",
+ "cnotify",
+ "uncnotify"
+ ]
+ },
+ {
+ "UUID": "00000069-0000-1000-8000-0026BB765291",
+ "Name": "Carbon Monoxide Detected",
+ "Constraints": {
+ "ValidValues": {
+ "0": "CO Levels Normal",
+ "1": "CO Levels Abnormal"
+ }
+ },
+ "Format": "uint8",
+ "Permissions": [
+ "securedRead"
+ ],
+ "Properties": [
+ "read",
+ "cnotify",
+ "uncnotify"
+ ]
+ },
+ {
+ "UUID": "00000090-0000-1000-8000-0026BB765291",
+ "Name": "Carbon Monoxide Level",
+ "Constraints": {
+ "MaximumValue": 100,
+ "MinimumValue": 0
+ },
+ "Format": "float",
+ "Permissions": [
+ "securedRead"
+ ],
+ "Properties": [
+ "read",
+ "cnotify",
+ "uncnotify"
+ ]
+ },
+ {
+ "UUID": "00000091-0000-1000-8000-0026BB765291",
+ "Name": "Carbon Monoxide Peak Level",
+ "Constraints": {
+ "MaximumValue": 100,
+ "MinimumValue": 0
+ },
+ "Format": "float",
+ "Permissions": [
+ "securedRead"
+ ],
+ "Properties": [
+ "read",
+ "cnotify",
+ "uncnotify"
+ ]
+ },
+ {
+ "UUID": "0000008F-0000-1000-8000-0026BB765291",
+ "Name": "Charging State",
+ "Constraints": {
+ "ValidValues": {
+ "0": "Not Charging",
+ "1": "Charging",
+ "2": "Not Chargeable"
+ }
+ },
+ "Format": "uint8",
+ "Permissions": [
+ "securedRead"
+ ],
+ "Properties": [
+ "read",
+ "cnotify",
+ "uncnotify"
+ ]
+ },
+ {
+ "UUID": "000000DD-0000-1000-8000-0026BB765291",
+ "Name": "Closed Captions",
+ "Constraints": {
+ "StepValue": 1,
+ "MaximumValue": 1,
+ "MinimumValue": 0,
+ "ValidValues": {
+ "0": "Disabled",
+ "1": "Enabled"
+ }
+ },
+ "Format": "uint8",
+ "Properties": [
+ "read",
+ "write",
+ "cnotify"
+ ]
+ },
+ {
+ "UUID": "000000E3-0000-1000-8000-0026BB765291",
+ "Name": "Configured Name",
+ "Format": "string",
+ "Properties": [
+ "read",
+ "write",
+ "cnotify"
+ ]
+ },
+ {
+ "UUID": "00000136-0000-1000-8000-0026BB765291",
+ "Name": "Display Order",
+ "Format": "tlv8",
+ "Properties": [
+ "read",
+ "write",
+ "cnotify"
+ ]
+ },
+ {
+ "UUID": "000000CE-0000-1000-8000-0026BB765291",
+ "Name": "Color Temperature",
+ "Constraints": {
+ "StepValue": 1,
+ "MaximumValue": 500,
+ "MinimumValue": 140
+ },
+ "Format": "uint32",
+ "Permissions": [
+ "securedRead",
+ "securedWrite"
+ ],
+ "Properties": [
+ "read",
+ "write",
+ "cnotify",
+ "uncnotify"
+ ]
+ },
+ {
+ "UUID": "0000006A-0000-1000-8000-0026BB765291",
+ "Name": "Contact Sensor State",
+ "Constraints": {
+ "ValidValues": {
+ "0": "Contact Detected",
+ "1": "Contact Not Detected"
+ }
+ },
+ "Format": "uint8",
+ "Permissions": [
+ "securedRead"
+ ],
+ "Properties": [
+ "read",
+ "cnotify",
+ "uncnotify"
+ ]
+ },
+ {
+ "Format": "float",
+ "UUID": "0000000D-0000-1000-8000-0026BB765291",
+ "Properties": [
+ "read",
+ "write",
+ "cnotify",
+ "uncnotify"
+ ],
+ "Name": "Cooling Threshold Temperature",
+ "Permissions": [
+ "securedRead",
+ "securedWrite"
+ ],
+ "Unit": "celsius",
+ "Constraints": {
+ "StepValue": 0.1,
+ "MaximumValue": 35,
+ "MinimumValue": 10
+ }
+ },
+ {
+ "UUID": "000000A9-0000-1000-8000-0026BB765291",
+ "Name": "Current Air Purifier State",
+ "Constraints": {
+ "ValidValues": {
+ "0": "Inactive",
+ "1": "Idle",
+ "2": "Purifying Air"
+ }
+ },
+ "Format": "uint8",
+ "Permissions": [
+ "securedRead"
+ ],
+ "Properties": [
+ "read",
+ "cnotify",
+ "uncnotify"
+ ]
+ },
+ {
+ "Format": "float",
+ "UUID": "0000006B-0000-1000-8000-0026BB765291",
+ "Properties": [
+ "read",
+ "cnotify",
+ "uncnotify"
+ ],
+ "Name": "Current Ambient Light Level",
+ "Permissions": [
+ "securedRead"
+ ],
+ "Unit": "lux",
+ "Constraints": {
+ "MaximumValue": 100000,
+ "MinimumValue": 0.0001
+ }
+ },
+ {
+ "UUID": "0000000E-0000-1000-8000-0026BB765291",
+ "Name": "Current Door State",
+ "Constraints": {
+ "ValidValues": {
+ "3": "Closing",
+ "1": "Closed",
+ "4": "Stopped",
+ "2": "Opening",
+ "0": "Open"
+ }
+ },
+ "Format": "uint8",
+ "Permissions": [
+ "securedRead"
+ ],
+ "Properties": [
+ "read",
+ "cnotify",
+ "uncnotify"
+ ]
+ },
+ {
+ "UUID": "000000AF-0000-1000-8000-0026BB765291",
+ "Name": "Current Fan State",
+ "Constraints": {
+ "ValidValues": {
+ "0": "Inactive",
+ "1": "Idle",
+ "2": "Blowing Air"
+ }
+ },
+ "Format": "uint8",
+ "Permissions": [
+ "securedRead"
+ ],
+ "Properties": [
+ "read",
+ "cnotify",
+ "uncnotify"
+ ]
+ },
+ {
+ "UUID": "000000B1-0000-1000-8000-0026BB765291",
+ "Name": "Current Heater Cooler State",
+ "Constraints": {
+ "ValidValues": {
+ "3": "Cooling",
+ "1": "Idle",
+ "2": "Heating",
+ "0": "Inactive"
+ }
+ },
+ "Format": "uint8",
+ "Permissions": [
+ "securedRead"
+ ],
+ "Properties": [
+ "read",
+ "cnotify",
+ "uncnotify"
+ ]
+ },
+ {
+ "UUID": "0000000F-0000-1000-8000-0026BB765291",
+ "Name": "Current Heating Cooling State",
+ "Constraints": {
+ "ValidValues": {
+ "0": "Off",
+ "1": "Heat",
+ "2": "Cool"
+ }
+ },
+ "Format": "uint8",
+ "Permissions": [
+ "securedRead"
+ ],
+ "Properties": [
+ "read",
+ "cnotify",
+ "uncnotify"
+ ]
+ },
+ {
+ "Format": "int32",
+ "UUID": "0000006C-0000-1000-8000-0026BB765291",
+ "Properties": [
+ "read",
+ "cnotify",
+ "uncnotify"
+ ],
+ "Name": "Current Horizontal Tilt Angle",
+ "Permissions": [
+ "securedRead"
+ ],
+ "Unit": "arcdegrees",
+ "Constraints": {
+ "StepValue": 1,
+ "MaximumValue": 90,
+ "MinimumValue": -90
+ }
+ },
+ {
+ "UUID": "000000B3-0000-1000-8000-0026BB765291",
+ "Name": "Current Humidifier Dehumidifier State",
+ "Constraints": {
+ "ValidValues": {
+ "3": "Dehumidifying",
+ "1": "Idle",
+ "2": "Humidifying",
+ "0": "Inactive"
+ }
+ },
+ "Format": "uint8",
+ "Permissions": [
+ "securedRead"
+ ],
+ "Properties": [
+ "read",
+ "cnotify",
+ "uncnotify"
+ ]
+ },
+ {
+ "Format": "uint8",
+ "UUID": "000000E0-0000-1000-8000-0026BB765291",
+ "Properties": [
+ "read",
+ "cnotify",
+ "uncnotify"
+ ],
+ "Name": "Current Media State",
+ "Unit": "percentage",
+ "Constraints": {
+ "StepValue": 1,
+ "MaximumValue": 3,
+ "MinimumValue": 0,
+ "ValidValues": {
+ "0": "Play",
+ "1": "Pause",
+ "2": "Stop",
+ "3": "Unknown"
+ }
+ }
+ },
+ {
+ "Format": "uint8",
+ "UUID": "00000137-0000-1000-8000-0026BB765291",
+ "Properties": [
+ "read",
+ "write",
+ "cnotify",
+ "uncnotify"
+ ],
+ "Name": "Target Media State",
+ "Constraints": {
+ "StepValue": 1,
+ "MaximumValue": 2,
+ "MinimumValue": 0,
+ "ValidValues": {
+ "1": "Pause",
+ "2": "Stop",
+ "0": "Play"
+ }
+ }
+ },
+ {
+ "Format": "uint8",
+ "UUID": "0000006D-0000-1000-8000-0026BB765291",
+ "Properties": [
+ "read",
+ "cnotify",
+ "uncnotify"
+ ],
+ "Name": "Current Position",
+ "Permissions": [
+ "securedRead"
+ ],
+ "Unit": "percentage",
+ "Constraints": {
+ "StepValue": 1,
+ "MaximumValue": 100,
+ "MinimumValue": 0
+ }
+ },
+ {
+ "Format": "float",
+ "UUID": "00000010-0000-1000-8000-0026BB765291",
+ "Properties": [
+ "read",
+ "cnotify",
+ "uncnotify"
+ ],
+ "Name": "Current Relative Humidity",
+ "Permissions": [
+ "securedRead"
+ ],
+ "Unit": "percentage",
+ "Constraints": {
+ "StepValue": 1,
+ "MaximumValue": 100,
+ "MinimumValue": 0
+ }
+ },
+ {
+ "UUID": "000000AA-0000-1000-8000-0026BB765291",
+ "Name": "Current Slat State",
+ "Constraints": {
+ "ValidValues": {
+ "0": "Fixed",
+ "1": "Jammed",
+ "2": "Swinging"
+ }
+ },
+ "Format": "uint8",
+ "Permissions": [
+ "securedRead"
+ ],
+ "Properties": [
+ "read",
+ "cnotify",
+ "uncnotify"
+ ]
+ },
+ {
+ "Format": "float",
+ "UUID": "00000011-0000-1000-8000-0026BB765291",
+ "Properties": [
+ "read",
+ "cnotify",
+ "uncnotify"
+ ],
+ "Name": "Current Temperature",
+ "Permissions": [
+ "securedRead"
+ ],
+ "Unit": "celsius",
+ "Constraints": {
+ "StepValue": 0.1,
+ "MaximumValue": 100,
+ "MinimumValue": 0
+ }
+ },
+ {
+ "Format": "int32",
+ "UUID": "000000C1-0000-1000-8000-0026BB765291",
+ "Properties": [
+ "read",
+ "cnotify",
+ "uncnotify"
+ ],
+ "Name": "Current Tilt Angle",
+ "Permissions": [
+ "securedRead"
+ ],
+ "Unit": "arcdegrees",
+ "Constraints": {
+ "StepValue": 1,
+ "MaximumValue": 90,
+ "MinimumValue": -90
+ }
+ },
+ {
+ "Format": "int32",
+ "UUID": "0000006E-0000-1000-8000-0026BB765291",
+ "Properties": [
+ "read",
+ "cnotify",
+ "uncnotify"
+ ],
+ "Name": "Current Vertical Tilt Angle",
+ "Permissions": [
+ "securedRead"
+ ],
+ "Unit": "arcdegrees",
+ "Constraints": {
+ "StepValue": 1,
+ "MaximumValue": 90,
+ "MinimumValue": -90
+ }
+ },
+ {
+ "Name": "Digital Zoom",
+ "Format": "float",
+ "Permissions": [
+ "securedRead",
+ "securedWrite"
+ ],
+ "Properties": [
+ "read",
+ "write",
+ "cnotify",
+ "uncnotify"
+ ],
+ "UUID": "0000011D-0000-1000-8000-0026BB765291"
+ },
+ {
+ "UUID": "000000AC-0000-1000-8000-0026BB765291",
+ "Name": "Filter Change Indication",
+ "Constraints": {
+ "ValidValues": {
+ "0": "Filter OK",
+ "1": "Change Filter"
+ }
+ },
+ "Format": "uint8",
+ "Permissions": [
+ "securedRead"
+ ],
+ "Properties": [
+ "read",
+ "cnotify",
+ "uncnotify"
+ ]
+ },
+ {
+ "UUID": "000000AB-0000-1000-8000-0026BB765291",
+ "Name": "Filter Life Level",
+ "Constraints": {
+ "stepValue": 1,
+ "MaximumValue": 100,
+ "MinimumValue": 0
+ },
+ "Format": "float",
+ "Permissions": [
+ "securedRead"
+ ],
+ "Properties": [
+ "read",
+ "cnotify",
+ "uncnotify"
+ ]
+ },
+ {
+ "Name": "Firmware Revision",
+ "Format": "string",
+ "Permissions": [
+ "securedRead"
+ ],
+ "Properties": [
+ "read"
+ ],
+ "UUID": "00000052-0000-1000-8000-0026BB765291"
+ },
+ {
+ "Name": "Hardware Revision",
+ "Format": "string",
+ "Permissions": [
+ "securedRead"
+ ],
+ "Properties": [
+ "read"
+ ],
+ "UUID": "00000053-0000-1000-8000-0026BB765291"
+ },
+ {
+ "Format": "float",
+ "UUID": "00000012-0000-1000-8000-0026BB765291",
+ "Properties": [
+ "read",
+ "write",
+ "cnotify",
+ "uncnotify"
+ ],
+ "Name": "Heating Threshold Temperature",
+ "Permissions": [
+ "securedRead",
+ "securedWrite"
+ ],
+ "Unit": "celsius",
+ "Constraints": {
+ "StepValue": 0.1,
+ "MaximumValue": 25,
+ "MinimumValue": 0
+ }
+ },
+ {
+ "Name": "Hold Position",
+ "Format": "bool",
+ "Permissions": [
+ "securedWrite"
+ ],
+ "Properties": [
+ "write"
+ ],
+ "UUID": "0000006F-0000-1000-8000-0026BB765291"
+ },
+ {
+ "Format": "float",
+ "UUID": "00000013-0000-1000-8000-0026BB765291",
+ "Properties": [
+ "read",
+ "write",
+ "cnotify",
+ "uncnotify"
+ ],
+ "Name": "Hue",
+ "Permissions": [
+ "securedRead",
+ "securedWrite"
+ ],
+ "Unit": "arcdegrees",
+ "Constraints": {
+ "StepValue": 1,
+ "MaximumValue": 360,
+ "MinimumValue": 0
+ }
+ },
+ {
+ "Name": "Identify",
+ "Format": "bool",
+ "Permissions": [
+ "securedWrite"
+ ],
+ "Properties": [
+ "write"
+ ],
+ "UUID": "00000014-0000-1000-8000-0026BB765291"
+ },
+ {
+ "Name": "Input Source Type",
+ "Format": "uint8",
+ "Permissions": [
+ "securedRead"
+ ],
+ "Properties": [
+ "read",
+ "cnotify",
+ "uncnotify"
+ ],
+ "Constraints": {
+ "StepValue": 1,
+ "MaximumValue": 10,
+ "MinimumValue": 0,
+ "ValidValues": {
+ "0": "Other",
+ "1": "HomeScreen",
+ "2": "Tuner",
+ "3": "Hdmi",
+ "4": "CompositeVideo",
+ "5": "SVideo",
+ "6": "ComponentVideo",
+ "7": "Dvi",
+ "8": "Airplay",
+ "9": "Usb",
+ "10": "Application"
+ }
+ },
+ "UUID": "000000DB-0000-1000-8000-0026BB765291"
+ },
+ {
+ "Name": "Input Device Type",
+ "Format": "uint8",
+ "Permissions": [
+ "securedRead"
+ ],
+ "Properties": [
+ "read",
+ "cnotify",
+ "uncnotify"
+ ],
+ "Constraints": {
+ "StepValue": 1,
+ "MaximumValue": 5,
+ "MinimumValue": 0,
+ "ValidValues": {
+ "0": "Other",
+ "1": "Tv",
+ "2": "Recording",
+ "3": "Tuner",
+ "4": "Playback",
+ "5": "AudioSystem"
+ }
+ },
+ "UUID": "000000DC-0000-1000-8000-0026BB765291"
+ },
+ {
+ "Name": "Identifier",
+ "Format": "uint32",
+ "Permissions": [
+ "securedRead"
+ ],
+ "Properties": [
+ "read"
+ ],
+ "Constraints": {
+ "StepValue": 1,
+ "MinimumValue": 0
+ },
+ "UUID": "000000E6-0000-1000-8000-0026BB765291"
+ },
+ {
+ "Name": "Current Visibility State",
+ "Format": "uint8",
+ "Permissions": [
+ "securedRead"
+ ],
+ "Properties": [
+ "read",
+ "cnotify",
+ "uncnotify"
+ ],
+ "Constraints": {
+ "StepValue": 1,
+ "MinimumValue": 0,
+ "MaximumValue": 3,
+ "ValidValues": {
+ "0": "Shown",
+ "1": "Hidden"
+ }
+ },
+ "UUID": "00000135-0000-1000-8000-0026BB765291"
+ },
+ {
+ "Name": "Target Visibility State",
+ "Format": "uint8",
+ "Permissions": [
+ "securedRead"
+ ],
+ "Properties": [
+ "read",
+ "write",
+ "cnotify",
+ "uncnotify"
+ ],
+ "Constraints": {
+ "StepValue": 1,
+ "MinimumValue": 0,
+ "MaximumValue": 2,
+ "ValidValues": {
+ "0": "Shown",
+ "1": "Hidden"
+ }
+ },
+ "UUID": "00000134-0000-1000-8000-0026BB765291"
+ },
+ {
+ "Name": "Image Mirroring",
+ "Format": "bool",
+ "Permissions": [
+ "securedRead",
+ "securedWrite"
+ ],
+ "Properties": [
+ "read",
+ "write",
+ "cnotify",
+ "uncnotify"
+ ],
+ "UUID": "0000011F-0000-1000-8000-0026BB765291"
+ },
+ {
+ "Format": "float",
+ "UUID": "0000011E-0000-1000-8000-0026BB765291",
+ "Properties": [
+ "read",
+ "write",
+ "cnotify",
+ "uncnotify"
+ ],
+ "Name": "Image Rotation",
+ "Permissions": [
+ "securedRead",
+ "securedWrite"
+ ],
+ "Unit": "arcdegrees",
+ "Constraints": {
+ "StepValue": 90,
+ "MaximumValue": 270,
+ "MinimumValue": 0
+ }
+ },
+ {
+ "UUID": "000000D2-0000-1000-8000-0026BB765291",
+ "Name": "In Use",
+ "Constraints": {
+ "ValidValues": {
+ "0": "Not in use",
+ "1": "In use"
+ }
+ },
+ "Format": "uint8",
+ "Permissions": [
+ "securedRead"
+ ],
+ "Properties": [
+ "read",
+ "cnotify",
+ "uncnotify"
+ ]
+ },
+ {
+ "UUID": "000000D6-0000-1000-8000-0026BB765291",
+ "Name": "Is Configured",
+ "Constraints": {
+ "ValidValues": {
+ "0": "Not Configured",
+ "1": "Configured"
+ }
+ },
+ "Format": "uint8",
+ "Permissions": [
+ "securedRead",
+ "securedWrite"
+ ],
+ "Properties": [
+ "read",
+ "write",
+ "cnotify",
+ "uncnotify"
+ ]
+ },
+ {
+ "UUID": "00000070-0000-1000-8000-0026BB765291",
+ "Name": "Leak Detected",
+ "Constraints": {
+ "ValidValues": {
+ "0": "Leak Not Detected",
+ "1": "Leak Detected"
+ }
+ },
+ "Format": "uint8",
+ "Permissions": [
+ "securedRead"
+ ],
+ "Properties": [
+ "read",
+ "cnotify",
+ "uncnotify"
+ ]
+ },
+ {
+ "Name": "Lock Control Point",
+ "Format": "tlv8",
+ "Permissions": [
+ "securedWrite"
+ ],
+ "Properties": [
+ "write"
+ ],
+ "UUID": "00000019-0000-1000-8000-0026BB765291"
+ },
+ {
+ "UUID": "0000001D-0000-1000-8000-0026BB765291",
+ "Name": "Lock Current State",
+ "Constraints": {
+ "ValidValues": {
+ "3": "Unknown",
+ "1": "Secured",
+ "2": "Jammed",
+ "0": "Unsecured"
+ }
+ },
+ "Format": "uint8",
+ "Permissions": [
+ "securedRead"
+ ],
+ "Properties": [
+ "read",
+ "cnotify",
+ "uncnotify"
+ ]
+ },
+ {
+ "UUID": "0000001C-0000-1000-8000-0026BB765291",
+ "Name": "Lock Last Known Action",
+ "Constraints": {
+ "ValidValues": {
+ "7": "Unsecured Remotely",
+ "3": "Unsecured Physically, Exterior",
+ "8": "Secured by Auto Secure Timeout",
+ "4": "Secured by Keypad",
+ "0": "Secured Physically, Interior",
+ "5": "Unsecured by Keypad",
+ "1": "Unsecured Physically, Interior",
+ "6": "Secured Remotely",
+ "2": "Secured Physically, Exterior"
+ }
+ },
+ "Format": "uint8",
+ "Permissions": [
+ "securedRead"
+ ],
+ "Properties": [
+ "read",
+ "cnotify",
+ "uncnotify"
+ ]
+ },
+ {
+ "Unit": "seconds",
+ "Name": "Lock Management Auto Security Timeout",
+ "Format": "uint32",
+ "Permissions": [
+ "securedRead",
+ "securedWrite"
+ ],
+ "Properties": [
+ "read",
+ "write",
+ "cnotify",
+ "uncnotify"
+ ],
+ "UUID": "0000001A-0000-1000-8000-0026BB765291"
+ },
+ {
+ "UUID": "000000A7-0000-1000-8000-0026BB765291",
+ "Name": "Lock Physical Controls",
+ "Constraints": {
+ "ValidValues": {
+ "0": "Control Lock Disabled",
+ "1": "Control Lock Enabled"
+ }
+ },
+ "Format": "uint8",
+ "Permissions": [
+ "securedRead",
+ "securedWrite"
+ ],
+ "Properties": [
+ "read",
+ "write",
+ "cnotify",
+ "uncnotify"
+ ]
+ },
+ {
+ "UUID": "0000001E-0000-1000-8000-0026BB765291",
+ "Name": "Lock Target State",
+ "Constraints": {
+ "ValidValues": {
+ "0": "Unsecured",
+ "1": "Secured"
+ }
+ },
+ "Format": "uint8",
+ "Permissions": [
+ "securedRead",
+ "securedWrite"
+ ],
+ "Properties": [
+ "read",
+ "write",
+ "cnotify",
+ "uncnotify"
+ ]
+ },
+ {
+ "Name": "Logs",
+ "Format": "tlv8",
+ "Permissions": [
+ "securedRead"
+ ],
+ "Properties": [
+ "read",
+ "cnotify",
+ "uncnotify"
+ ],
+ "UUID": "0000001F-0000-1000-8000-0026BB765291"
+ },
+ {
+ "Name": "Manufacturer",
+ "Format": "string",
+ "Permissions": [
+ "securedRead"
+ ],
+ "Properties": [
+ "read"
+ ],
+ "UUID": "00000020-0000-1000-8000-0026BB765291"
+ },
+ {
+ "Name": "Model",
+ "Format": "string",
+ "Permissions": [
+ "securedRead"
+ ],
+ "Properties": [
+ "read"
+ ],
+ "UUID": "00000021-0000-1000-8000-0026BB765291"
+ },
+ {
+ "Name": "Motion Detected",
+ "Format": "bool",
+ "Permissions": [
+ "securedRead"
+ ],
+ "Properties": [
+ "read",
+ "cnotify",
+ "uncnotify"
+ ],
+ "UUID": "00000022-0000-1000-8000-0026BB765291"
+ },
+ {
+ "Name": "Mute",
+ "Format": "bool",
+ "Permissions": [
+ "securedRead",
+ "securedWrite"
+ ],
+ "Properties": [
+ "read",
+ "write",
+ "cnotify",
+ "uncnotify"
+ ],
+ "UUID": "0000011A-0000-1000-8000-0026BB765291"
+ },
+ {
+ "Name": "Name",
+ "Format": "string",
+ "Permissions": [
+ "securedRead"
+ ],
+ "Properties": [
+ "read"
+ ],
+ "UUID": "00000023-0000-1000-8000-0026BB765291"
+ },
+ {
+ "Name": "Night Vision",
+ "Format": "bool",
+ "Permissions": [
+ "securedRead",
+ "securedWrite"
+ ],
+ "Properties": [
+ "read",
+ "write",
+ "cnotify",
+ "uncnotify"
+ ],
+ "UUID": "0000011B-0000-1000-8000-0026BB765291"
+ },
+ {
+ "UUID": "000000C4-0000-1000-8000-0026BB765291",
+ "Name": "Nitrogen Dioxide Density",
+ "Constraints": {
+ "StepValue": 1,
+ "MaximumValue": 1000,
+ "MinimumValue": 0
+ },
+ "Format": "float",
+ "Permissions": [
+ "securedRead"
+ ],
+ "Properties": [
+ "read",
+ "cnotify",
+ "uncnotify"
+ ]
+ },
+ {
+ "Name": "Obstruction Detected",
+ "Format": "bool",
+ "Permissions": [
+ "securedRead"
+ ],
+ "Properties": [
+ "read",
+ "cnotify",
+ "uncnotify"
+ ],
+ "UUID": "00000024-0000-1000-8000-0026BB765291"
+ },
+ {
+ "UUID": "00000071-0000-1000-8000-0026BB765291",
+ "Name": "Occupancy Detected",
+ "Constraints": {
+ "ValidValues": {
+ "0": "Occupancy Not Detected",
+ "1": "Occupancy Detected"
+ }
+ },
+ "Format": "uint8",
+ "Permissions": [
+ "securedRead"
+ ],
+ "Properties": [
+ "read",
+ "cnotify",
+ "uncnotify"
+ ]
+ },
+ {
+ "Name": "On",
+ "Format": "bool",
+ "Permissions": [
+ "securedRead",
+ "securedWrite"
+ ],
+ "Properties": [
+ "read",
+ "write",
+ "cnotify",
+ "uncnotify"
+ ],
+ "UUID": "00000025-0000-1000-8000-0026BB765291"
+ },
+ {
+ "Name": "Optical Zoom",
+ "Format": "float",
+ "Permissions": [
+ "securedRead",
+ "securedWrite"
+ ],
+ "Properties": [
+ "read",
+ "write",
+ "cnotify",
+ "uncnotify"
+ ],
+ "UUID": "0000011C-0000-1000-8000-0026BB765291"
+ },
+ {
+ "Name": "Outlet In Use",
+ "Format": "bool",
+ "Permissions": [
+ "securedRead"
+ ],
+ "Properties": [
+ "read",
+ "cnotify",
+ "uncnotify"
+ ],
+ "UUID": "00000026-0000-1000-8000-0026BB765291"
+ },
+ {
+ "UUID": "000000C3-0000-1000-8000-0026BB765291",
+ "Name": "Ozone Density",
+ "Constraints": {
+ "StepValue": 1,
+ "MaximumValue": 1000,
+ "MinimumValue": 0
+ },
+ "Format": "float",
+ "Permissions": [
+ "securedRead"
+ ],
+ "Properties": [
+ "read",
+ "cnotify",
+ "uncnotify"
+ ]
+ },
+ {
+ "Name": "Pair Setup",
+ "Format": "tlv8",
+ "Permissions": [
+ "read",
+ "write"
+ ],
+ "Properties": [
+ "read",
+ "write"
+ ],
+ "UUID": "0000004C-0000-1000-8000-0026BB765291"
+ },
+ {
+ "Name": "Pair Verify",
+ "Format": "tlv8",
+ "Permissions": [
+ "read",
+ "write"
+ ],
+ "Properties": [
+ "read",
+ "write"
+ ],
+ "UUID": "0000004E-0000-1000-8000-0026BB765291"
+ },
+ {
+ "Name": "Pairing Features",
+ "Format": "uint8",
+ "Permissions": [
+ "read"
+ ],
+ "Properties": [
+ "read"
+ ],
+ "UUID": "0000004F-0000-1000-8000-0026BB765291"
+ },
+ {
+ "Name": "Pairing Pairings",
+ "Format": "tlv8",
+ "Permissions": [
+ "securedRead",
+ "securedWrite"
+ ],
+ "Properties": [
+ "read",
+ "write"
+ ],
+ "UUID": "00000050-0000-1000-8000-0026BB765291"
+ },
+ {
+ "UUID": "000000C7-0000-1000-8000-0026BB765291",
+ "Name": "PM10 Density",
+ "Constraints": {
+ "StepValue": 1,
+ "MaximumValue": 1000,
+ "MinimumValue": 0
+ },
+ "Format": "float",
+ "Permissions": [
+ "securedRead"
+ ],
+ "Properties": [
+ "read",
+ "cnotify",
+ "uncnotify"
+ ]
+ },
+ {
+ "UUID": "000000C6-0000-1000-8000-0026BB765291",
+ "Name": "PM2.5 Density",
+ "Constraints": {
+ "StepValue": 1,
+ "MaximumValue": 1000,
+ "MinimumValue": 0
+ },
+ "Format": "float",
+ "Permissions": [
+ "securedRead"
+ ],
+ "Properties": [
+ "read",
+ "cnotify",
+ "uncnotify"
+ ]
+ },
+ {
+ "UUID": "00000072-0000-1000-8000-0026BB765291",
+ "Name": "Position State",
+ "Constraints": {
+ "ValidValues": {
+ "0": "Decreasing",
+ "1": "Increasing",
+ "2": "Stopped"
+ }
+ },
+ "Format": "uint8",
+ "Permissions": [
+ "securedRead"
+ ],
+ "Properties": [
+ "read",
+ "cnotify",
+ "uncnotify"
+ ]
+ },
+ {
+ "UUID": "000000E2-0000-1000-8000-0026BB765291",
+ "Name": "Picture Mode",
+ "Constraints": {
+ "StepValue": 1,
+ "MaximumValue": 13,
+ "MinimumValue": 0,
+ "ValidValues": {
+ "0": "Other",
+ "1": "Standard",
+ "2": "Calibrated",
+ "3": "CalibratedDark",
+ "4": "Vivid",
+ "5": "Game",
+ "6": "Computer",
+ "7": "Custom"
+ }
+ },
+ "Format": "uint16",
+ "Properties": [
+ "read",
+ "write",
+ "cnotify",
+ "uncnotify"
+ ]
+ },
+ {
+ "UUID": "000000DF-0000-1000-8000-0026BB765291",
+ "Name": "Power Mode Selection",
+ "Constraints": {
+ "StepValue": 1,
+ "MaximumValue": 1,
+ "MinimumValue": 0,
+ "ValidValues": {
+ "0": "Show",
+ "1": "Hide"
+ }
+ },
+ "Format": "uint8",
+ "Properties": [
+ "write"
+ ]
+ },
+ {
+ "UUID": "000000D1-0000-1000-8000-0026BB765291",
+ "Name": "Program Mode",
+ "Constraints": {
+ "ValidValues": {
+ "0": "No program scheduled",
+ "1": "Program scheduled",
+ "2": "Program scheduled (Manual Mode)"
+ }
+ },
+ "Format": "uint8",
+ "Permissions": [
+ "securedRead"
+ ],
+ "Properties": [
+ "read",
+ "cnotify",
+ "uncnotify"
+ ]
+ },
+ {
+ "UUID": "00000073-0000-1000-8000-0026BB765291",
+ "Name": "Programmable Switch Event",
+ "Constraints": {
+ "ValidValues": {
+ "0": "Single Press",
+ "1": "Double Press",
+ "2": "Long Press"
+ }
+ },
+ "Format": "uint8",
+ "Permissions": [
+ "securedRead"
+ ],
+ "Properties": [
+ "read",
+ "cnotify",
+ "uncnotify"
+ ]
+ },
+ {
+ "Format": "uint8",
+ "UUID": "000000E1-0000-1000-8000-0026BB765291",
+ "Properties": [
+ "write"
+ ],
+ "Name": "Remote Key",
+ "Permissions": [
+ "securedRead",
+ "securedWrite"
+ ],
+ "Constraints": {
+ "StepValue": 1,
+ "MaximumValue": 16,
+ "MinimumValue": 0,
+ "ValidValues": {
+ "0": "Rewind",
+ "1": "FastForward",
+ "2": "NextTrack",
+ "3": "PrevTrack",
+ "4": "ArrowUp",
+ "5": "ArrowDown",
+ "6": "ArrowLeft",
+ "7": "ArrowRight",
+ "8": "Select",
+ "9": "Back",
+ "10": "Exit",
+ "11": "PlayPause",
+ "15": "Info"
+ }
+ }
+ },
+ {
+ "Format": "float",
+ "UUID": "000000C9-0000-1000-8000-0026BB765291",
+ "Properties": [
+ "read",
+ "write",
+ "cnotify",
+ "uncnotify"
+ ],
+ "Name": "Relative Humidity Dehumidifier Threshold",
+ "Permissions": [
+ "securedRead",
+ "securedWrite"
+ ],
+ "Unit": "percentage",
+ "Constraints": {
+ "StepValue": 1,
+ "MaximumValue": 100,
+ "MinimumValue": 0
+ }
+ },
+ {
+ "Format": "float",
+ "UUID": "000000CA-0000-1000-8000-0026BB765291",
+ "Properties": [
+ "read",
+ "write",
+ "cnotify",
+ "uncnotify"
+ ],
+ "Name": "Relative Humidity Humidifier Threshold",
+ "Permissions": [
+ "securedRead",
+ "securedWrite"
+ ],
+ "Unit": "percentage",
+ "Constraints": {
+ "StepValue": 1,
+ "MaximumValue": 100,
+ "MinimumValue": 0
+ }
+ },
+ {
+ "UUID": "000000D4-0000-1000-8000-0026BB765291",
+ "Name": "Remaining Duration",
+ "Constraints": {
+ "StepValue": 1,
+ "MaximumValue": 3600,
+ "MinimumValue": 0
+ },
+ "Format": "uint32",
+ "Permissions": [
+ "securedRead"
+ ],
+ "Properties": [
+ "read",
+ "cnotify",
+ "uncnotify"
+ ]
+ },
+ {
+ "UUID": "000000AD-0000-1000-8000-0026BB765291",
+ "Name": "Reset Filter Indication",
+ "Constraints": {
+ "StepValue": 1,
+ "MaximumValue": 1,
+ "MinimumValue": 1
+ },
+ "Format": "uint8",
+ "Permissions": [
+ "securedWrite"
+ ],
+ "Properties": [
+ "write"
+ ]
+ },
+ {
+ "UUID": "00000028-0000-1000-8000-0026BB765291",
+ "Name": "Rotation Direction",
+ "Constraints": {
+ "ValidValues": {
+ "0": "Clockwise",
+ "1": "Counter-clockwise"
+ }
+ },
+ "Format": "int32",
+ "Permissions": [
+ "securedRead",
+ "securedWrite"
+ ],
+ "Properties": [
+ "read",
+ "write",
+ "cnotify",
+ "uncnotify"
+ ]
+ },
+ {
+ "Format": "float",
+ "UUID": "00000029-0000-1000-8000-0026BB765291",
+ "Properties": [
+ "read",
+ "write",
+ "cnotify",
+ "uncnotify"
+ ],
+ "Name": "Rotation Speed",
+ "Permissions": [
+ "securedRead",
+ "securedWrite"
+ ],
+ "Unit": "percentage",
+ "Constraints": {
+ "StepValue": 1,
+ "MaximumValue": 100,
+ "MinimumValue": 0
+ }
+ },
+ {
+ "Format": "float",
+ "UUID": "0000002F-0000-1000-8000-0026BB765291",
+ "Properties": [
+ "read",
+ "write",
+ "cnotify",
+ "uncnotify"
+ ],
+ "Name": "Saturation",
+ "Permissions": [
+ "securedRead",
+ "securedWrite"
+ ],
+ "Unit": "percentage",
+ "Constraints": {
+ "StepValue": 1,
+ "MaximumValue": 100,
+ "MinimumValue": 0
+ }
+ },
+ {
+ "UUID": "0000008E-0000-1000-8000-0026BB765291",
+ "Name": "Security System Alarm Type",
+ "Constraints": {
+ "StepValue": 1,
+ "MaximumValue": 1,
+ "MinimumValue": 0
+ },
+ "Format": "uint8",
+ "Permissions": [
+ "securedRead"
+ ],
+ "Properties": [
+ "read",
+ "cnotify",
+ "uncnotify"
+ ]
+ },
+ {
+ "UUID": "00000066-0000-1000-8000-0026BB765291",
+ "Name": "Security System Current State",
+ "Constraints": {
+ "ValidValues": {
+ "3": "Disarmed",
+ "1": "Away Arm",
+ "4": "Alarm Triggered",
+ "2": "Night Arm",
+ "0": "Stay Arm"
+ }
+ },
+ "Format": "uint8",
+ "Permissions": [
+ "securedRead"
+ ],
+ "Properties": [
+ "read",
+ "cnotify",
+ "uncnotify"
+ ]
+ },
+ {
+ "UUID": "00000067-0000-1000-8000-0026BB765291",
+ "Name": "Security System Target State",
+ "Constraints": {
+ "ValidValues": {
+ "3": "Disarm",
+ "1": "Away Arm",
+ "2": "Night Arm",
+ "0": "Stay Arm"
+ }
+ },
+ "Format": "uint8",
+ "Permissions": [
+ "securedRead",
+ "securedWrite"
+ ],
+ "Properties": [
+ "read",
+ "write",
+ "cnotify",
+ "uncnotify"
+ ]
+ },
+ {
+ "Name": "Selected RTP Stream Configuration",
+ "Format": "tlv8",
+ "Permissions": [
+ "securedRead",
+ "securedWrite"
+ ],
+ "Properties": [
+ "read",
+ "write"
+ ],
+ "UUID": "00000117-0000-1000-8000-0026BB765291"
+ },
+ {
+ "UUID": "00000030-0000-1000-8000-0026BB765291",
+ "Name": "Serial Number",
+ "Constraints": {
+ "MaximumLength": 64
+ },
+ "Format": "string",
+ "Permissions": [
+ "securedRead"
+ ],
+ "Properties": [
+ "read"
+ ]
+ },
+ {
+ "UUID": "000000CB-0000-1000-8000-0026BB765291",
+ "Name": "Service Label Index",
+ "Constraints": {
+ "StepValue": 1,
+ "MaximumValue": 255,
+ "MinimumValue": 1
+ },
+ "Format": "uint8",
+ "Permissions": [
+ "securedRead"
+ ],
+ "Properties": [
+ "read"
+ ]
+ },
+ {
+ "UUID": "000000CD-0000-1000-8000-0026BB765291",
+ "Name": "Service Label Namespace",
+ "Constraints": {
+ "ValidValues": {
+ "0": "Dots",
+ "1": "Arabic Numerals"
+ }
+ },
+ "Format": "uint8",
+ "Permissions": [
+ "securedRead"
+ ],
+ "Properties": [
+ "read"
+ ]
+ },
+ {
+ "UUID": "000000D3-0000-1000-8000-0026BB765291",
+ "Name": "Set Duration",
+ "Constraints": {
+ "StepValue": 1,
+ "MaximumValue": 3600,
+ "MinimumValue": 0
+ },
+ "Format": "uint32",
+ "Permissions": [
+ "securedRead",
+ "securedWrite"
+ ],
+ "Properties": [
+ "read",
+ "write",
+ "cnotify",
+ "uncnotify"
+ ]
+ },
+ {
+ "Name": "Setup Endpoints",
+ "Format": "tlv8",
+ "Permissions": [
+ "securedRead",
+ "securedWrite"
+ ],
+ "Properties": [
+ "read",
+ "write"
+ ],
+ "UUID": "00000118-0000-1000-8000-0026BB765291"
+ },
+ {
+ "UUID": "000000C0-0000-1000-8000-0026BB765291",
+ "Name": "Slat Type",
+ "Constraints": {
+ "ValidValues": {
+ "0": "Horizontal",
+ "1": "Vertical"
+ }
+ },
+ "Format": "uint8",
+ "Permissions": [
+ "securedRead"
+ ],
+ "Properties": [
+ "read"
+ ]
+ },
+ {
+ "UUID": "000000E8-0000-1000-8000-0026BB765291",
+ "Name": "Sleep Discovery Mode",
+ "Constraints": {
+ "MinimumValue": 0,
+ "MaximumValue": 1,
+ "ValidValues": {
+ "0": "NotDiscoverable",
+ "1": "AlwaysDiscoverable"
+ }
+ },
+ "Format": "uint8",
+ "Properties": [
+ "read",
+ "cnotify",
+ "uncnotify"
+ ]
+ },
+ {
+ "UUID": "00000076-0000-1000-8000-0026BB765291",
+ "Name": "Smoke Detected",
+ "Constraints": {
+ "ValidValues": {
+ "0": "Smoke Not Detected",
+ "1": "Smoke Detected"
+ }
+ },
+ "Format": "uint8",
+ "Permissions": [
+ "securedRead"
+ ],
+ "Properties": [
+ "read",
+ "cnotify",
+ "uncnotify"
+ ]
+ },
+ {
+ "Name": "Status Active",
+ "Format": "bool",
+ "Permissions": [
+ "securedRead"
+ ],
+ "Properties": [
+ "read",
+ "cnotify",
+ "uncnotify"
+ ],
+ "UUID": "00000075-0000-1000-8000-0026BB765291"
+ },
+ {
+ "UUID": "00000077-0000-1000-8000-0026BB765291",
+ "Name": "Status Fault",
+ "Constraints": {
+ "ValidValues": {
+ "0": "No Fault",
+ "1": "General Fault"
+ }
+ },
+ "Format": "uint8",
+ "Permissions": [
+ "securedRead"
+ ],
+ "Properties": [
+ "read",
+ "cnotify",
+ "uncnotify"
+ ]
+ },
+ {
+ "UUID": "00000078-0000-1000-8000-0026BB765291",
+ "Name": "Status Jammed",
+ "Constraints": {
+ "ValidValues": {
+ "0": "Not Jammed",
+ "1": "Jammed"
+ }
+ },
+ "Format": "uint8",
+ "Permissions": [
+ "securedRead"
+ ],
+ "Properties": [
+ "read",
+ "cnotify",
+ "uncnotify"
+ ]
+ },
+ {
+ "UUID": "00000079-0000-1000-8000-0026BB765291",
+ "Name": "Status Low Battery",
+ "Constraints": {
+ "ValidValues": {
+ "0": "Battery Level Normal",
+ "1": "Battery Level Low"
+ }
+ },
+ "Format": "uint8",
+ "Permissions": [
+ "securedRead"
+ ],
+ "Properties": [
+ "read",
+ "cnotify",
+ "uncnotify"
+ ]
+ },
+ {
+ "UUID": "0000007A-0000-1000-8000-0026BB765291",
+ "Name": "Status Tampered",
+ "Constraints": {
+ "ValidValues": {
+ "0": "Not Tampered",
+ "1": "Tampered"
+ }
+ },
+ "Format": "uint8",
+ "Permissions": [
+ "securedRead"
+ ],
+ "Properties": [
+ "read",
+ "cnotify",
+ "uncnotify"
+ ]
+ },
+ {
+ "Name": "Streaming Status",
+ "Format": "tlv8",
+ "Permissions": [
+ "securedRead"
+ ],
+ "Properties": [
+ "read",
+ "cnotify",
+ "uncnotify"
+ ],
+ "UUID": "00000120-0000-1000-8000-0026BB765291"
+ },
+ {
+ "UUID": "000000C5-0000-1000-8000-0026BB765291",
+ "Name": "Sulphur Dioxide Density",
+ "Constraints": {
+ "StepValue": 1,
+ "MaximumValue": 1000,
+ "MinimumValue": 0
+ },
+ "Format": "float",
+ "Permissions": [
+ "securedRead"
+ ],
+ "Properties": [
+ "read",
+ "cnotify",
+ "uncnotify"
+ ]
+ },
+ {
+ "Name": "Supported Audio Stream Configuration",
+ "Format": "tlv8",
+ "Permissions": [
+ "securedRead"
+ ],
+ "Properties": [
+ "read"
+ ],
+ "UUID": "00000115-0000-1000-8000-0026BB765291"
+ },
+ {
+ "Name": "Supported RTP Configuration",
+ "Format": "tlv8",
+ "Permissions": [
+ "securedRead"
+ ],
+ "Properties": [
+ "read"
+ ],
+ "UUID": "00000116-0000-1000-8000-0026BB765291"
+ },
+ {
+ "Name": "Supported Video Stream Configuration",
+ "Format": "tlv8",
+ "Permissions": [
+ "securedRead"
+ ],
+ "Properties": [
+ "read"
+ ],
+ "UUID": "00000114-0000-1000-8000-0026BB765291"
+ },
+ {
+ "UUID": "000000B6-0000-1000-8000-0026BB765291",
+ "Name": "Swing Mode",
+ "Constraints": {
+ "ValidValues": {
+ "0": "Swing Disabled",
+ "1": "Swing Enabled"
+ }
+ },
+ "Format": "uint8",
+ "Permissions": [
+ "securedRead",
+ "securedWrite"
+ ],
+ "Properties": [
+ "read",
+ "write",
+ "cnotify",
+ "uncnotify"
+ ]
+ },
+ {
+ "UUID": "000000A8-0000-1000-8000-0026BB765291",
+ "Name": "Target Air Purifier State",
+ "Constraints": {
+ "ValidValues": {
+ "0": "Manual",
+ "1": "Auto"
+ }
+ },
+ "Format": "uint8",
+ "Permissions": [
+ "securedRead",
+ "securedWrite"
+ ],
+ "Properties": [
+ "read",
+ "write",
+ "cnotify",
+ "uncnotify"
+ ]
+ },
+ {
+ "UUID": "000000AE-0000-1000-8000-0026BB765291",
+ "Name": "Target Air Quality",
+ "Constraints": {
+ "ValidValues": {
+ "0": "Excellent",
+ "1": "Good",
+ "2": "Fair"
+ }
+ },
+ "Format": "uint8",
+ "Permissions": [
+ "securedRead",
+ "securedWrite"
+ ],
+ "Properties": [
+ "read",
+ "write",
+ "cnotify",
+ "uncnotify"
+ ]
+ },
+ {
+ "UUID": "00000032-0000-1000-8000-0026BB765291",
+ "Name": "Target Door State",
+ "Constraints": {
+ "ValidValues": {
+ "0": "Open",
+ "1": "Closed"
+ }
+ },
+ "Format": "uint8",
+ "Permissions": [
+ "securedRead",
+ "securedWrite"
+ ],
+ "Properties": [
+ "read",
+ "write",
+ "cnotify",
+ "uncnotify"
+ ]
+ },
+ {
+ "UUID": "000000BF-0000-1000-8000-0026BB765291",
+ "Name": "Target Fan State",
+ "Constraints": {
+ "ValidValues": {
+ "0": "Manual",
+ "1": "Auto"
+ }
+ },
+ "Format": "uint8",
+ "Permissions": [
+ "securedRead",
+ "securedWrite"
+ ],
+ "Properties": [
+ "read",
+ "write",
+ "cnotify",
+ "uncnotify"
+ ]
+ },
+ {
+ "UUID": "000000B2-0000-1000-8000-0026BB765291",
+ "Name": "Target Heater Cooler State",
+ "Constraints": {
+ "ValidValues": {
+ "0": "Auto",
+ "1": "Heat",
+ "2": "Cool"
+ }
+ },
+ "Format": "uint8",
+ "Permissions": [
+ "securedRead",
+ "securedWrite"
+ ],
+ "Properties": [
+ "read",
+ "write",
+ "cnotify",
+ "uncnotify"
+ ]
+ },
+ {
+ "UUID": "00000033-0000-1000-8000-0026BB765291",
+ "Name": "Target Heating Cooling State",
+ "Constraints": {
+ "ValidValues": {
+ "3": "Auto",
+ "1": "Heat",
+ "2": "Cool",
+ "0": "Off"
+ }
+ },
+ "Format": "uint8",
+ "Permissions": [
+ "securedRead",
+ "securedWrite"
+ ],
+ "Properties": [
+ "read",
+ "write",
+ "cnotify",
+ "uncnotify"
+ ]
+ },
+ {
+ "Format": "int32",
+ "UUID": "0000007B-0000-1000-8000-0026BB765291",
+ "Properties": [
+ "read",
+ "write",
+ "cnotify",
+ "uncnotify"
+ ],
+ "Name": "Target Horizontal Tilt Angle",
+ "Permissions": [
+ "securedRead",
+ "securedWrite"
+ ],
+ "Unit": "arcdegrees",
+ "Constraints": {
+ "StepValue": 1,
+ "MaximumValue": 90,
+ "MinimumValue": -90
+ }
+ },
+ {
+ "UUID": "000000B4-0000-1000-8000-0026BB765291",
+ "Name": "Target Humidifier Dehumidifier State",
+ "Constraints": {
+ "ValidValues": {
+ "0": "Humidifier or Dehumidifier",
+ "1": "Humidifier",
+ "2": "Dehumidifier"
+ }
+ },
+ "Format": "uint8",
+ "Permissions": [
+ "securedRead",
+ "securedWrite"
+ ],
+ "Properties": [
+ "read",
+ "write",
+ "cnotify",
+ "uncnotify"
+ ]
+ },
+ {
+ "Format": "uint8",
+ "UUID": "0000007C-0000-1000-8000-0026BB765291",
+ "Properties": [
+ "read",
+ "write",
+ "cnotify",
+ "uncnotify"
+ ],
+ "Name": "Target Position",
+ "Permissions": [
+ "securedRead",
+ "securedWrite"
+ ],
+ "Unit": "percentage",
+ "Constraints": {
+ "StepValue": 1,
+ "MaximumValue": 100,
+ "MinimumValue": 0
+ }
+ },
+ {
+ "Format": "float",
+ "UUID": "00000034-0000-1000-8000-0026BB765291",
+ "Properties": [
+ "read",
+ "write",
+ "cnotify",
+ "uncnotify"
+ ],
+ "Name": "Target Relative Humidity",
+ "Permissions": [
+ "securedRead",
+ "securedWrite"
+ ],
+ "Unit": "percentage",
+ "Constraints": {
+ "StepValue": 1,
+ "MaximumValue": 100,
+ "MinimumValue": 0
+ }
+ },
+ {
+ "UUID": "000000BE-0000-1000-8000-0026BB765291",
+ "Name": "Target Slat State",
+ "Constraints": {
+ "ValidValues": {
+ "0": "Manual",
+ "1": "Auto"
+ }
+ },
+ "Format": "uint8",
+ "Permissions": [
+ "securedRead",
+ "securedWrite"
+ ],
+ "Properties": [
+ "read",
+ "write",
+ "cnotify",
+ "uncnotify"
+ ]
+ },
+ {
+ "Format": "float",
+ "UUID": "00000035-0000-1000-8000-0026BB765291",
+ "Properties": [
+ "read",
+ "write",
+ "cnotify",
+ "uncnotify"
+ ],
+ "Name": "Target Temperature",
+ "Permissions": [
+ "securedRead",
+ "securedWrite"
+ ],
+ "Unit": "celsius",
+ "Constraints": {
+ "StepValue": 0.1,
+ "MaximumValue": 38,
+ "MinimumValue": 10
+ }
+ },
+ {
+ "Format": "int32",
+ "UUID": "000000C2-0000-1000-8000-0026BB765291",
+ "Properties": [
+ "read",
+ "write",
+ "cnotify",
+ "uncnotify"
+ ],
+ "Name": "Target Tilt Angle",
+ "Permissions": [
+ "securedRead",
+ "securedWrite"
+ ],
+ "Unit": "arcdegrees",
+ "Constraints": {
+ "StepValue": 1,
+ "MaximumValue": 90,
+ "MinimumValue": -90
+ }
+ },
+ {
+ "Format": "int32",
+ "UUID": "0000007D-0000-1000-8000-0026BB765291",
+ "Properties": [
+ "read",
+ "write",
+ "cnotify",
+ "uncnotify"
+ ],
+ "Name": "Target Vertical Tilt Angle",
+ "Permissions": [
+ "securedRead",
+ "securedWrite"
+ ],
+ "Unit": "arcdegrees",
+ "Constraints": {
+ "StepValue": 1,
+ "MaximumValue": 90,
+ "MinimumValue": -90
+ }
+ },
+ {
+ "UUID": "00000036-0000-1000-8000-0026BB765291",
+ "Name": "Temperature Display Units",
+ "Constraints": {
+ "ValidValues": {
+ "0": "Celsius",
+ "1": "Fahrenheit"
+ }
+ },
+ "Format": "uint8",
+ "Permissions": [
+ "securedRead",
+ "securedWrite"
+ ],
+ "Properties": [
+ "read",
+ "write",
+ "cnotify",
+ "uncnotify"
+ ]
+ },
+ {
+ "UUID": "000000D5-0000-1000-8000-0026BB765291",
+ "Name": "Valve Type",
+ "Constraints": {
+ "ValidValues": {
+ "3": "Water faucet",
+ "1": "Irrigation",
+ "2": "Shower head",
+ "0": "Generic valve"
+ }
+ },
+ "Format": "uint8",
+ "Permissions": [
+ "securedRead"
+ ],
+ "Properties": [
+ "read",
+ "cnotify",
+ "uncnotify"
+ ]
+ },
+ {
+ "UUID": "00000037-0000-1000-8000-0026BB765291",
+ "Name": "Version",
+ "Constraints": {
+ "MaximumLength": 64
+ },
+ "Format": "string",
+ "Permissions": [
+ "securedRead"
+ ],
+ "Properties": [
+ "read",
+ "cnotify",
+ "uncnotify"
+ ]
+ },
+ {
+ "UUID": "000000C8-0000-1000-8000-0026BB765291",
+ "Name": "VOC Density",
+ "Constraints": {
+ "StepValue": 1,
+ "MaximumValue": 1000,
+ "MinimumValue": 0
+ },
+ "Format": "float",
+ "Permissions": [
+ "securedRead"
+ ],
+ "Properties": [
+ "read",
+ "cnotify",
+ "uncnotify"
+ ]
+ },
+ {
+ "Format": "uint8",
+ "UUID": "00000119-0000-1000-8000-0026BB765291",
+ "Properties": [
+ "read",
+ "write",
+ "cnotify",
+ "uncnotify"
+ ],
+ "Name": "Volume",
+ "Permissions": [
+ "securedRead",
+ "securedWrite"
+ ],
+ "Unit": "percentage",
+ "Constraints": {
+ "StepValue": 1,
+ "MaximumValue": 100,
+ "MinimumValue": 0
+ }
+ },
+ {
+ "Format": "uint8",
+ "UUID": "000000E9-0000-1000-8000-0026BB765291",
+ "Properties": [
+ "read",
+ "cnotify",
+ "uncnotify"
+ ],
+ "Name": "Volume Control Type",
+ "Permissions": [
+ "securedRead"
+ ],
+ "Constraints": {
+ "StepValue": 1,
+ "MaximumValue": 3,
+ "MinimumValue": 0,
+ "ValidValues": {
+ "0": "None",
+ "1": "Relative",
+ "2": "RelativeWithCurrent",
+ "3": "Absolute"
+ }
+ }
+ },
+ {
+ "Format": "uint8",
+ "UUID": "000000EA-0000-1000-8000-0026BB765291",
+ "Properties": [
+ "write"
+ ],
+ "Name": "Volume Selector",
+ "Permissions": [
+ "securedRead"
+ ],
+ "Constraints": {
+ "StepValue": 1,
+ "MaximumValue": 1,
+ "MinimumValue": 0,
+ "ValidValues": {
+ "0": "Increment",
+ "1": "Decrement"
+ }
+ }
+ },
+ {
+ "Format": "float",
+ "UUID": "000000B5-0000-1000-8000-0026BB765291",
+ "Properties": [
+ "read",
+ "cnotify",
+ "uncnotify"
+ ],
+ "Name": "Water Level",
+ "Permissions": [
+ "securedRead"
+ ],
+ "Unit": "percentage",
+ "Constraints": {
+ "MaximumValue": 100,
+ "MinimumValue": 0
+ }
}
- },
- "Format" : "uint8",
- "Permissions" : [
- "securedRead",
- "securedWrite"
- ],
- "Properties" : [
- "read",
- "write",
- "cnotify",
- "uncnotify"
- ]
- },
- {
- "Name" : "Administrator Only Access",
- "Format" : "bool",
- "Permissions" : [
- "securedRead",
- "securedWrite"
- ],
- "Properties" : [
- "read",
- "write",
- "cnotify",
- "uncnotify"
- ],
- "UUID" : "00000001-0000-1000-8000-0026BB765291"
- },
- {
- "UUID" : "00000064-0000-1000-8000-0026BB765291",
- "Name" : "Air Particulate Density",
- "Constraints" : {
- "StepValue" : 1,
- "MaximumValue" : 1000,
- "MinimumValue" : 0
- },
- "Format" : "float",
- "Permissions" : [
- "securedRead"
- ],
- "Properties" : [
- "read",
- "cnotify",
- "uncnotify"
- ]
- },
- {
- "UUID" : "00000065-0000-1000-8000-0026BB765291",
- "Name" : "Air Particulate Size",
- "Constraints" : {
- "ValidValues" : {
- "0" : "2.5 μm",
- "1" : "10 μm"
+ ],
+ "Version": "1.0",
+ "Services": [
+ {
+ "OptionalCharacteristics": [
+ "00000053-0000-1000-8000-0026BB765291",
+ "000000A6-0000-1000-8000-0026BB765291"
+ ],
+ "RequiredCharacteristics": [
+ "00000014-0000-1000-8000-0026BB765291",
+ "00000020-0000-1000-8000-0026BB765291",
+ "00000021-0000-1000-8000-0026BB765291",
+ "00000023-0000-1000-8000-0026BB765291",
+ "00000030-0000-1000-8000-0026BB765291",
+ "00000052-0000-1000-8000-0026BB765291"
+ ],
+ "Name": "Accessory Information",
+ "UUID": "0000003E-0000-1000-8000-0026BB765291"
+ },
+ {
+ "OptionalCharacteristics": [
+ "000000A7-0000-1000-8000-0026BB765291",
+ "00000023-0000-1000-8000-0026BB765291",
+ "000000B6-0000-1000-8000-0026BB765291",
+ "00000029-0000-1000-8000-0026BB765291"
+ ],
+ "RequiredCharacteristics": [
+ "000000B0-0000-1000-8000-0026BB765291",
+ "000000A9-0000-1000-8000-0026BB765291",
+ "000000A8-0000-1000-8000-0026BB765291"
+ ],
+ "Name": "Air Purifier",
+ "UUID": "000000BB-0000-1000-8000-0026BB765291"
+ },
+ {
+ "OptionalCharacteristics": [
+ "00000075-0000-1000-8000-0026BB765291",
+ "00000077-0000-1000-8000-0026BB765291",
+ "0000007A-0000-1000-8000-0026BB765291",
+ "00000079-0000-1000-8000-0026BB765291",
+ "00000023-0000-1000-8000-0026BB765291",
+ "000000C3-0000-1000-8000-0026BB765291",
+ "000000C4-0000-1000-8000-0026BB765291",
+ "000000C5-0000-1000-8000-0026BB765291",
+ "000000C6-0000-1000-8000-0026BB765291",
+ "000000C7-0000-1000-8000-0026BB765291",
+ "000000C8-0000-1000-8000-0026BB765291",
+ "00000090-0000-1000-8000-0026BB765291",
+ "00000093-0000-1000-8000-0026BB765291"
+ ],
+ "RequiredCharacteristics": [
+ "00000095-0000-1000-8000-0026BB765291"
+ ],
+ "Name": "Air Quality Sensor",
+ "UUID": "0000008D-0000-1000-8000-0026BB765291"
+ },
+ {
+ "OptionalCharacteristics": [
+ "00000023-0000-1000-8000-0026BB765291"
+ ],
+ "RequiredCharacteristics": [
+ "00000068-0000-1000-8000-0026BB765291",
+ "0000008F-0000-1000-8000-0026BB765291",
+ "00000079-0000-1000-8000-0026BB765291"
+ ],
+ "Name": "Battery Service",
+ "UUID": "00000096-0000-1000-8000-0026BB765291"
+ },
+ {
+ "OptionalCharacteristics": [
+ "00000023-0000-1000-8000-0026BB765291"
+ ],
+ "RequiredCharacteristics": [
+ "00000114-0000-1000-8000-0026BB765291",
+ "00000115-0000-1000-8000-0026BB765291",
+ "00000116-0000-1000-8000-0026BB765291",
+ "00000117-0000-1000-8000-0026BB765291",
+ "00000120-0000-1000-8000-0026BB765291",
+ "00000118-0000-1000-8000-0026BB765291"
+ ],
+ "Name": "Camera RTP Stream Management",
+ "UUID": "00000110-0000-1000-8000-0026BB765291"
+ },
+ {
+ "OptionalCharacteristics": [
+ "00000075-0000-1000-8000-0026BB765291",
+ "00000077-0000-1000-8000-0026BB765291",
+ "00000079-0000-1000-8000-0026BB765291",
+ "0000007A-0000-1000-8000-0026BB765291",
+ "00000093-0000-1000-8000-0026BB765291",
+ "00000094-0000-1000-8000-0026BB765291",
+ "00000023-0000-1000-8000-0026BB765291"
+ ],
+ "RequiredCharacteristics": [
+ "00000092-0000-1000-8000-0026BB765291"
+ ],
+ "Name": "Carbon Dioxide Sensor",
+ "UUID": "00000097-0000-1000-8000-0026BB765291"
+ },
+ {
+ "OptionalCharacteristics": [
+ "00000075-0000-1000-8000-0026BB765291",
+ "00000077-0000-1000-8000-0026BB765291",
+ "00000079-0000-1000-8000-0026BB765291",
+ "0000007A-0000-1000-8000-0026BB765291",
+ "00000090-0000-1000-8000-0026BB765291",
+ "00000091-0000-1000-8000-0026BB765291",
+ "00000023-0000-1000-8000-0026BB765291"
+ ],
+ "RequiredCharacteristics": [
+ "00000069-0000-1000-8000-0026BB765291"
+ ],
+ "Name": "Carbon Monoxide Sensor",
+ "UUID": "0000007F-0000-1000-8000-0026BB765291"
+ },
+ {
+ "OptionalCharacteristics": [
+ "00000075-0000-1000-8000-0026BB765291",
+ "00000077-0000-1000-8000-0026BB765291",
+ "0000007A-0000-1000-8000-0026BB765291",
+ "00000079-0000-1000-8000-0026BB765291",
+ "00000023-0000-1000-8000-0026BB765291"
+ ],
+ "RequiredCharacteristics": [
+ "0000006A-0000-1000-8000-0026BB765291"
+ ],
+ "Name": "Contact Sensor",
+ "UUID": "00000080-0000-1000-8000-0026BB765291"
+ },
+ {
+ "OptionalCharacteristics": [
+ "0000006F-0000-1000-8000-0026BB765291",
+ "00000024-0000-1000-8000-0026BB765291",
+ "00000023-0000-1000-8000-0026BB765291"
+ ],
+ "RequiredCharacteristics": [
+ "0000006D-0000-1000-8000-0026BB765291",
+ "00000072-0000-1000-8000-0026BB765291",
+ "0000007C-0000-1000-8000-0026BB765291"
+ ],
+ "Name": "Door",
+ "UUID": "00000081-0000-1000-8000-0026BB765291"
+ },
+ {
+ "OptionalCharacteristics": [
+ "00000008-0000-1000-8000-0026BB765291",
+ "00000119-0000-1000-8000-0026BB765291",
+ "00000023-0000-1000-8000-0026BB765291"
+ ],
+ "RequiredCharacteristics": [
+ "00000073-0000-1000-8000-0026BB765291"
+ ],
+ "Name": "Doorbell",
+ "UUID": "00000121-0000-1000-8000-0026BB765291"
+ },
+ {
+ "OptionalCharacteristics": [
+ "00000028-0000-1000-8000-0026BB765291",
+ "00000029-0000-1000-8000-0026BB765291",
+ "00000023-0000-1000-8000-0026BB765291"
+ ],
+ "RequiredCharacteristics": [
+ "00000025-0000-1000-8000-0026BB765291"
+ ],
+ "Name": "Fan",
+ "UUID": "00000040-0000-1000-8000-0026BB765291"
+ },
+ {
+ "OptionalCharacteristics": [
+ "000000AF-0000-1000-8000-0026BB765291",
+ "000000BF-0000-1000-8000-0026BB765291",
+ "000000A7-0000-1000-8000-0026BB765291",
+ "00000023-0000-1000-8000-0026BB765291",
+ "00000028-0000-1000-8000-0026BB765291",
+ "00000029-0000-1000-8000-0026BB765291",
+ "000000B6-0000-1000-8000-0026BB765291"
+ ],
+ "RequiredCharacteristics": [
+ "000000B0-0000-1000-8000-0026BB765291"
+ ],
+ "Name": "Fan v2",
+ "UUID": "000000B7-0000-1000-8000-0026BB765291"
+ },
+ {
+ "OptionalCharacteristics": [
+ "000000AB-0000-1000-8000-0026BB765291",
+ "000000AD-0000-1000-8000-0026BB765291",
+ "00000023-0000-1000-8000-0026BB765291"
+ ],
+ "RequiredCharacteristics": [
+ "000000AC-0000-1000-8000-0026BB765291"
+ ],
+ "Name": "Filter Maintenance",
+ "UUID": "000000BA-0000-1000-8000-0026BB765291"
+ },
+ {
+ "OptionalCharacteristics": [
+ "00000023-0000-1000-8000-0026BB765291",
+ "00000077-0000-1000-8000-0026BB765291"
+ ],
+ "RequiredCharacteristics": [
+ "000000B0-0000-1000-8000-0026BB765291"
+ ],
+ "Name": "Faucet",
+ "UUID": "000000D7-0000-1000-8000-0026BB765291"
+ },
+ {
+ "OptionalCharacteristics": [
+ "0000001D-0000-1000-8000-0026BB765291",
+ "0000001E-0000-1000-8000-0026BB765291",
+ "00000023-0000-1000-8000-0026BB765291"
+ ],
+ "RequiredCharacteristics": [
+ "0000000E-0000-1000-8000-0026BB765291",
+ "00000032-0000-1000-8000-0026BB765291",
+ "00000024-0000-1000-8000-0026BB765291"
+ ],
+ "Name": "Garage Door Opener",
+ "UUID": "00000041-0000-1000-8000-0026BB765291"
+ },
+ {
+ "OptionalCharacteristics": [
+ "000000A7-0000-1000-8000-0026BB765291",
+ "00000023-0000-1000-8000-0026BB765291",
+ "000000B6-0000-1000-8000-0026BB765291",
+ "0000000D-0000-1000-8000-0026BB765291",
+ "00000012-0000-1000-8000-0026BB765291",
+ "00000036-0000-1000-8000-0026BB765291",
+ "00000029-0000-1000-8000-0026BB765291"
+ ],
+ "RequiredCharacteristics": [
+ "000000B0-0000-1000-8000-0026BB765291",
+ "000000B1-0000-1000-8000-0026BB765291",
+ "000000B2-0000-1000-8000-0026BB765291",
+ "00000011-0000-1000-8000-0026BB765291"
+ ],
+ "Name": "Heater Cooler",
+ "UUID": "000000BC-0000-1000-8000-0026BB765291"
+ },
+ {
+ "OptionalCharacteristics": [
+ "000000A7-0000-1000-8000-0026BB765291",
+ "00000023-0000-1000-8000-0026BB765291",
+ "000000B6-0000-1000-8000-0026BB765291",
+ "000000B5-0000-1000-8000-0026BB765291",
+ "000000C9-0000-1000-8000-0026BB765291",
+ "000000CA-0000-1000-8000-0026BB765291",
+ "00000029-0000-1000-8000-0026BB765291"
+ ],
+ "RequiredCharacteristics": [
+ "00000010-0000-1000-8000-0026BB765291",
+ "000000B3-0000-1000-8000-0026BB765291",
+ "000000B4-0000-1000-8000-0026BB765291",
+ "000000B0-0000-1000-8000-0026BB765291"
+ ],
+ "Name": "Humidifier Dehumidifier",
+ "UUID": "000000BD-0000-1000-8000-0026BB765291"
+ },
+ {
+ "OptionalCharacteristics": [
+ "00000075-0000-1000-8000-0026BB765291",
+ "00000077-0000-1000-8000-0026BB765291",
+ "0000007A-0000-1000-8000-0026BB765291",
+ "00000079-0000-1000-8000-0026BB765291",
+ "00000023-0000-1000-8000-0026BB765291"
+ ],
+ "RequiredCharacteristics": [
+ "00000010-0000-1000-8000-0026BB765291"
+ ],
+ "Name": "Humidity Sensor",
+ "UUID": "00000082-0000-1000-8000-0026BB765291"
+ },
+ {
+ "OptionalCharacteristics": [
+ "00000023-0000-1000-8000-0026BB765291",
+ "000000D4-0000-1000-8000-0026BB765291",
+ "00000077-0000-1000-8000-0026BB765291"
+ ],
+ "RequiredCharacteristics": [
+ "000000B0-0000-1000-8000-0026BB765291",
+ "000000D1-0000-1000-8000-0026BB765291",
+ "000000D2-0000-1000-8000-0026BB765291"
+ ],
+ "Name": "Irrigation System",
+ "UUID": "000000CF-0000-1000-8000-0026BB765291"
+ },
+ {
+ "OptionalCharacteristics": [
+ "00000075-0000-1000-8000-0026BB765291",
+ "00000077-0000-1000-8000-0026BB765291",
+ "0000007A-0000-1000-8000-0026BB765291",
+ "00000079-0000-1000-8000-0026BB765291",
+ "00000023-0000-1000-8000-0026BB765291"
+ ],
+ "RequiredCharacteristics": [
+ "00000070-0000-1000-8000-0026BB765291"
+ ],
+ "Name": "Leak Sensor",
+ "UUID": "00000083-0000-1000-8000-0026BB765291"
+ },
+ {
+ "OptionalCharacteristics": [
+ "00000023-0000-1000-8000-0026BB765291",
+ "00000075-0000-1000-8000-0026BB765291",
+ "00000077-0000-1000-8000-0026BB765291",
+ "0000007A-0000-1000-8000-0026BB765291",
+ "00000079-0000-1000-8000-0026BB765291"
+ ],
+ "RequiredCharacteristics": [
+ "0000006B-0000-1000-8000-0026BB765291"
+ ],
+ "Name": "Light Sensor",
+ "UUID": "00000084-0000-1000-8000-0026BB765291"
+ },
+ {
+ "OptionalCharacteristics": [
+ "00000008-0000-1000-8000-0026BB765291",
+ "00000013-0000-1000-8000-0026BB765291",
+ "0000002F-0000-1000-8000-0026BB765291",
+ "00000023-0000-1000-8000-0026BB765291"
+ ],
+ "RequiredCharacteristics": [
+ "00000025-0000-1000-8000-0026BB765291"
+ ],
+ "Name": "Lightbulb",
+ "UUID": "00000043-0000-1000-8000-0026BB765291"
+ },
+ {
+ "OptionalCharacteristics": [
+ "0000001F-0000-1000-8000-0026BB765291",
+ "00000005-0000-1000-8000-0026BB765291",
+ "0000001A-0000-1000-8000-0026BB765291",
+ "00000001-0000-1000-8000-0026BB765291",
+ "0000001C-0000-1000-8000-0026BB765291",
+ "0000000E-0000-1000-8000-0026BB765291",
+ "00000022-0000-1000-8000-0026BB765291",
+ "00000023-0000-1000-8000-0026BB765291"
+ ],
+ "RequiredCharacteristics": [
+ "00000019-0000-1000-8000-0026BB765291",
+ "00000037-0000-1000-8000-0026BB765291"
+ ],
+ "Name": "Lock Management",
+ "UUID": "00000044-0000-1000-8000-0026BB765291"
+ },
+ {
+ "OptionalCharacteristics": [
+ "00000023-0000-1000-8000-0026BB765291"
+ ],
+ "RequiredCharacteristics": [
+ "0000001D-0000-1000-8000-0026BB765291",
+ "0000001E-0000-1000-8000-0026BB765291"
+ ],
+ "Name": "Lock Mechanism",
+ "UUID": "00000045-0000-1000-8000-0026BB765291"
+ },
+ {
+ "OptionalCharacteristics": [
+ "00000023-0000-1000-8000-0026BB765291"
+ ],
+ "RequiredCharacteristics": [
+ "00000119-0000-1000-8000-0026BB765291",
+ "0000011A-0000-1000-8000-0026BB765291"
+ ],
+ "Name": "Microphone",
+ "UUID": "00000112-0000-1000-8000-0026BB765291"
+ },
+ {
+ "OptionalCharacteristics": [
+ "00000075-0000-1000-8000-0026BB765291",
+ "00000077-0000-1000-8000-0026BB765291",
+ "0000007A-0000-1000-8000-0026BB765291",
+ "00000079-0000-1000-8000-0026BB765291",
+ "00000023-0000-1000-8000-0026BB765291"
+ ],
+ "RequiredCharacteristics": [
+ "00000022-0000-1000-8000-0026BB765291"
+ ],
+ "Name": "Motion Sensor",
+ "UUID": "00000085-0000-1000-8000-0026BB765291"
+ },
+ {
+ "OptionalCharacteristics": [
+ "00000023-0000-1000-8000-0026BB765291",
+ "00000075-0000-1000-8000-0026BB765291",
+ "00000077-0000-1000-8000-0026BB765291",
+ "0000007A-0000-1000-8000-0026BB765291",
+ "00000079-0000-1000-8000-0026BB765291"
+ ],
+ "RequiredCharacteristics": [
+ "00000071-0000-1000-8000-0026BB765291"
+ ],
+ "Name": "Occupancy Sensor",
+ "UUID": "00000086-0000-1000-8000-0026BB765291"
+ },
+ {
+ "OptionalCharacteristics": [
+ "00000023-0000-1000-8000-0026BB765291"
+ ],
+ "RequiredCharacteristics": [
+ "00000025-0000-1000-8000-0026BB765291",
+ "00000026-0000-1000-8000-0026BB765291"
+ ],
+ "Name": "Outlet",
+ "UUID": "00000047-0000-1000-8000-0026BB765291"
+ },
+ {
+ "OptionalCharacteristics": [
+ "00000077-0000-1000-8000-0026BB765291",
+ "0000007A-0000-1000-8000-0026BB765291",
+ "0000008E-0000-1000-8000-0026BB765291",
+ "00000023-0000-1000-8000-0026BB765291"
+ ],
+ "RequiredCharacteristics": [
+ "00000066-0000-1000-8000-0026BB765291",
+ "00000067-0000-1000-8000-0026BB765291"
+ ],
+ "Name": "Security System",
+ "UUID": "0000007E-0000-1000-8000-0026BB765291"
+ },
+ {
+ "OptionalCharacteristics": [
+ "00000023-0000-1000-8000-0026BB765291"
+ ],
+ "RequiredCharacteristics": [
+ "000000CD-0000-1000-8000-0026BB765291"
+ ],
+ "Name": "Service Label",
+ "UUID": "000000CC-0000-1000-8000-0026BB765291"
+ },
+ {
+ "OptionalCharacteristics": [
+ "00000023-0000-1000-8000-0026BB765291",
+ "000000C1-0000-1000-8000-0026BB765291",
+ "000000C2-0000-1000-8000-0026BB765291",
+ "000000B6-0000-1000-8000-0026BB765291"
+ ],
+ "RequiredCharacteristics": [
+ "000000C0-0000-1000-8000-0026BB765291",
+ "000000AA-0000-1000-8000-0026BB765291"
+ ],
+ "Name": "Slat",
+ "UUID": "000000B9-0000-1000-8000-0026BB765291"
+ },
+ {
+ "OptionalCharacteristics": [
+ "00000075-0000-1000-8000-0026BB765291",
+ "00000077-0000-1000-8000-0026BB765291",
+ "0000007A-0000-1000-8000-0026BB765291",
+ "00000079-0000-1000-8000-0026BB765291",
+ "00000023-0000-1000-8000-0026BB765291"
+ ],
+ "RequiredCharacteristics": [
+ "00000076-0000-1000-8000-0026BB765291"
+ ],
+ "Name": "Smoke Sensor",
+ "UUID": "00000087-0000-1000-8000-0026BB765291"
+ },
+ {
+ "OptionalCharacteristics": [
+ "00000023-0000-1000-8000-0026BB765291",
+ "00000119-0000-1000-8000-0026BB765291"
+ ],
+ "RequiredCharacteristics": [
+ "0000011A-0000-1000-8000-0026BB765291"
+ ],
+ "Name": "Speaker",
+ "UUID": "00000113-0000-1000-8000-0026BB765291"
+ },
+ {
+ "OptionalCharacteristics": [
+ "00000023-0000-1000-8000-0026BB765291",
+ "000000CB-0000-1000-8000-0026BB765291"
+ ],
+ "RequiredCharacteristics": [
+ "00000073-0000-1000-8000-0026BB765291"
+ ],
+ "Name": "Stateless Programmable Switch",
+ "UUID": "00000089-0000-1000-8000-0026BB765291"
+ },
+ {
+ "OptionalCharacteristics": [
+ "00000023-0000-1000-8000-0026BB765291"
+ ],
+ "RequiredCharacteristics": [
+ "00000025-0000-1000-8000-0026BB765291"
+ ],
+ "Name": "Switch",
+ "UUID": "00000049-0000-1000-8000-0026BB765291"
+ },
+ {
+ "OptionalCharacteristics": [
+ "00000075-0000-1000-8000-0026BB765291",
+ "00000077-0000-1000-8000-0026BB765291",
+ "00000079-0000-1000-8000-0026BB765291",
+ "0000007A-0000-1000-8000-0026BB765291",
+ "00000023-0000-1000-8000-0026BB765291"
+ ],
+ "RequiredCharacteristics": [
+ "00000011-0000-1000-8000-0026BB765291"
+ ],
+ "Name": "Temperature Sensor",
+ "UUID": "0000008A-0000-1000-8000-0026BB765291"
+ },
+ {
+ "OptionalCharacteristics": [
+ "00000010-0000-1000-8000-0026BB765291",
+ "00000034-0000-1000-8000-0026BB765291",
+ "0000000D-0000-1000-8000-0026BB765291",
+ "00000012-0000-1000-8000-0026BB765291",
+ "00000023-0000-1000-8000-0026BB765291"
+ ],
+ "RequiredCharacteristics": [
+ "0000000F-0000-1000-8000-0026BB765291",
+ "00000033-0000-1000-8000-0026BB765291",
+ "00000011-0000-1000-8000-0026BB765291",
+ "00000035-0000-1000-8000-0026BB765291",
+ "00000036-0000-1000-8000-0026BB765291"
+ ],
+ "Name": "Thermostat",
+ "UUID": "0000004A-0000-1000-8000-0026BB765291"
+ },
+ {
+ "OptionalCharacteristics": [
+ "000000D3-0000-1000-8000-0026BB765291",
+ "000000D4-0000-1000-8000-0026BB765291",
+ "000000D6-0000-1000-8000-0026BB765291",
+ "000000CB-0000-1000-8000-0026BB765291",
+ "00000077-0000-1000-8000-0026BB765291",
+ "00000023-0000-1000-8000-0026BB765291"
+ ],
+ "RequiredCharacteristics": [
+ "000000B0-0000-1000-8000-0026BB765291",
+ "000000D2-0000-1000-8000-0026BB765291",
+ "000000D5-0000-1000-8000-0026BB765291"
+ ],
+ "Name": "Valve",
+ "UUID": "000000D0-0000-1000-8000-0026BB765291"
+ },
+ {
+ "OptionalCharacteristics": [
+ "0000006F-0000-1000-8000-0026BB765291",
+ "00000024-0000-1000-8000-0026BB765291",
+ "00000023-0000-1000-8000-0026BB765291"
+ ],
+ "RequiredCharacteristics": [
+ "0000006D-0000-1000-8000-0026BB765291",
+ "0000007C-0000-1000-8000-0026BB765291",
+ "00000072-0000-1000-8000-0026BB765291"
+ ],
+ "Name": "Window",
+ "UUID": "0000008B-0000-1000-8000-0026BB765291"
+ },
+ {
+ "OptionalCharacteristics": [
+ "0000006F-0000-1000-8000-0026BB765291",
+ "0000007B-0000-1000-8000-0026BB765291",
+ "0000007D-0000-1000-8000-0026BB765291",
+ "0000006C-0000-1000-8000-0026BB765291",
+ "0000006E-0000-1000-8000-0026BB765291",
+ "00000024-0000-1000-8000-0026BB765291",
+ "00000023-0000-1000-8000-0026BB765291"
+ ],
+ "RequiredCharacteristics": [
+ "0000006D-0000-1000-8000-0026BB765291",
+ "0000007C-0000-1000-8000-0026BB765291",
+ "00000072-0000-1000-8000-0026BB765291"
+ ],
+ "Name": "Window Covering",
+ "UUID": "0000008C-0000-1000-8000-0026BB765291"
+ },
+ {
+ "OptionalCharacteristics": [
+ "00000008-0000-1000-8000-0026BB765291",
+ "000000DD-0000-1000-8000-0026BB765291",
+ "00000136-0000-1000-8000-0026BB765291",
+ "000000E0-0000-1000-8000-0026BB765291",
+ "00000137-0000-1000-8000-0026BB765291",
+ "000000E2-0000-1000-8000-0026BB765291",
+ "000000DF-0000-1000-8000-0026BB765291",
+ "000000E1-0000-1000-8000-0026BB765291"
+ ],
+ "RequiredCharacteristics": [
+ "000000B0-0000-1000-8000-0026BB765291",
+ "000000E7-0000-1000-8000-0026BB765291",
+ "000000E3-0000-1000-8000-0026BB765291",
+ "000000E8-0000-1000-8000-0026BB765291"
+ ],
+ "Name": "Television",
+ "UUID": "000000D8-0000-1000-8000-0026BB765291"
+ },
+ {
+ "OptionalCharacteristics": [
+ "000000E6-0000-1000-8000-0026BB765291",
+ "000000DC-0000-1000-8000-0026BB765291",
+ "00000134-0000-1000-8000-0026BB765291",
+ "00000023-0000-1000-8000-0026BB765291"
+ ],
+ "RequiredCharacteristics": [
+ "000000E3-0000-1000-8000-0026BB765291",
+ "000000DB-0000-1000-8000-0026BB765291",
+ "000000D6-0000-1000-8000-0026BB765291",
+ "00000135-0000-1000-8000-0026BB765291"
+ ],
+ "Name": "Input Source",
+ "UUID": "000000D9-0000-1000-8000-0026BB765291"
}
- },
- "Format" : "uint8",
- "Permissions" : [
- "securedRead"
- ],
- "Properties" : [
- "read",
- "cnotify",
- "uncnotify"
- ]
- },
- {
- "UUID" : "00000095-0000-1000-8000-0026BB765291",
- "Name" : "Air Quality",
- "Constraints" : {
- "ValidValues" : {
- "3" : "Fair",
- "1" : "Excellent",
- "4" : "Inferior",
- "2" : "Good",
- "0" : "Unknown",
- "5" : "Poor"
- }
- },
- "Format" : "uint8",
- "Permissions" : [
- "securedRead"
- ],
- "Properties" : [
- "read",
- "cnotify",
- "uncnotify"
- ]
- },
- {
- "Name" : "Audio Feedback",
- "Format" : "bool",
- "Permissions" : [
- "securedRead",
- "securedWrite"
- ],
- "Properties" : [
- "read",
- "write",
- "cnotify",
- "uncnotify"
- ],
- "UUID" : "00000005-0000-1000-8000-0026BB765291"
- },
- {
- "Format" : "uint8",
- "UUID" : "00000068-0000-1000-8000-0026BB765291",
- "Properties" : [
- "read",
- "cnotify",
- "uncnotify"
- ],
- "Name" : "Battery Level",
- "Permissions" : [
- "securedRead"
- ],
- "Unit" : "percentage",
- "Constraints" : {
- "StepValue" : 1,
- "MaximumValue" : 100,
- "MinimumValue" : 0
- }
- },
- {
- "Format" : "int32",
- "UUID" : "00000008-0000-1000-8000-0026BB765291",
- "Properties" : [
- "read",
- "write",
- "cnotify",
- "uncnotify"
- ],
- "Name" : "Brightness",
- "Permissions" : [
- "securedRead",
- "securedWrite"
- ],
- "Unit" : "percentage",
- "Constraints" : {
- "StepValue" : 1,
- "MaximumValue" : 100,
- "MinimumValue" : 0
- }
- },
- {
- "UUID" : "00000092-0000-1000-8000-0026BB765291",
- "Name" : "Carbon Dioxide Detected",
- "Constraints" : {
- "ValidValues" : {
- "0" : "CO2 Levels Normal",
- "1" : "CO2 Levels Abnormal"
- }
- },
- "Format" : "uint8",
- "Permissions" : [
- "securedRead"
- ],
- "Properties" : [
- "read",
- "cnotify",
- "uncnotify"
- ]
- },
- {
- "UUID" : "00000093-0000-1000-8000-0026BB765291",
- "Name" : "Carbon Dioxide Level",
- "Constraints" : {
- "MaximumValue" : 100000,
- "MinimumValue" : 0
- },
- "Format" : "float",
- "Permissions" : [
- "securedRead"
- ],
- "Properties" : [
- "read",
- "cnotify",
- "uncnotify"
- ]
- },
- {
- "UUID" : "00000094-0000-1000-8000-0026BB765291",
- "Name" : "Carbon Dioxide Peak Level",
- "Constraints" : {
- "MaximumValue" : 100000,
- "MinimumValue" : 0
- },
- "Format" : "float",
- "Permissions" : [
- "securedRead"
- ],
- "Properties" : [
- "read",
- "cnotify",
- "uncnotify"
- ]
- },
- {
- "UUID" : "00000069-0000-1000-8000-0026BB765291",
- "Name" : "Carbon Monoxide Detected",
- "Constraints" : {
- "ValidValues" : {
- "0" : "CO Levels Normal",
- "1" : "CO Levels Abnormal"
- }
- },
- "Format" : "uint8",
- "Permissions" : [
- "securedRead"
- ],
- "Properties" : [
- "read",
- "cnotify",
- "uncnotify"
- ]
- },
- {
- "UUID" : "00000090-0000-1000-8000-0026BB765291",
- "Name" : "Carbon Monoxide Level",
- "Constraints" : {
- "MaximumValue" : 100,
- "MinimumValue" : 0
- },
- "Format" : "float",
- "Permissions" : [
- "securedRead"
- ],
- "Properties" : [
- "read",
- "cnotify",
- "uncnotify"
- ]
- },
- {
- "UUID" : "00000091-0000-1000-8000-0026BB765291",
- "Name" : "Carbon Monoxide Peak Level",
- "Constraints" : {
- "MaximumValue" : 100,
- "MinimumValue" : 0
- },
- "Format" : "float",
- "Permissions" : [
- "securedRead"
- ],
- "Properties" : [
- "read",
- "cnotify",
- "uncnotify"
- ]
- },
- {
- "UUID" : "0000008F-0000-1000-8000-0026BB765291",
- "Name" : "Charging State",
- "Constraints" : {
- "ValidValues" : {
- "0" : "Not Charging",
- "1" : "Charging",
- "2" : "Not Chargeable"
- }
- },
- "Format" : "uint8",
- "Permissions" : [
- "securedRead"
- ],
- "Properties" : [
- "read",
- "cnotify",
- "uncnotify"
- ]
- },
- {
- "UUID" : "000000CE-0000-1000-8000-0026BB765291",
- "Name" : "Color Temperature",
- "Constraints" : {
- "StepValue" : 1,
- "MaximumValue" : 500,
- "MinimumValue" : 140
- },
- "Format" : "uint32",
- "Permissions" : [
- "securedRead",
- "securedWrite"
- ],
- "Properties" : [
- "read",
- "write",
- "cnotify",
- "uncnotify"
- ]
- },
- {
- "UUID" : "0000006A-0000-1000-8000-0026BB765291",
- "Name" : "Contact Sensor State",
- "Constraints" : {
- "ValidValues" : {
- "0" : "Contact Detected",
- "1" : "Contact Not Detected"
- }
- },
- "Format" : "uint8",
- "Permissions" : [
- "securedRead"
- ],
- "Properties" : [
- "read",
- "cnotify",
- "uncnotify"
- ]
- },
- {
- "Format" : "float",
- "UUID" : "0000000D-0000-1000-8000-0026BB765291",
- "Properties" : [
- "read",
- "write",
- "cnotify",
- "uncnotify"
- ],
- "Name" : "Cooling Threshold Temperature",
- "Permissions" : [
- "securedRead",
- "securedWrite"
- ],
- "Unit" : "celsius",
- "Constraints" : {
- "StepValue" : 0.10000000000000001,
- "MaximumValue" : 35,
- "MinimumValue" : 10
- }
- },
- {
- "UUID" : "000000A9-0000-1000-8000-0026BB765291",
- "Name" : "Current Air Purifier State",
- "Constraints" : {
- "ValidValues" : {
- "0" : "Inactive",
- "1" : "Idle",
- "2" : "Purifying Air"
- }
- },
- "Format" : "uint8",
- "Permissions" : [
- "securedRead"
- ],
- "Properties" : [
- "read",
- "cnotify",
- "uncnotify"
- ]
- },
- {
- "Format" : "float",
- "UUID" : "0000006B-0000-1000-8000-0026BB765291",
- "Properties" : [
- "read",
- "cnotify",
- "uncnotify"
- ],
- "Name" : "Current Ambient Light Level",
- "Permissions" : [
- "securedRead"
- ],
- "Unit" : "lux",
- "Constraints" : {
- "MaximumValue" : 100000,
- "MinimumValue" : 0.0001
- }
- },
- {
- "UUID" : "0000000E-0000-1000-8000-0026BB765291",
- "Name" : "Current Door State",
- "Constraints" : {
- "ValidValues" : {
- "3" : "Closing",
- "1" : "Closed",
- "4" : "Stopped",
- "2" : "Opening",
- "0" : "Open"
- }
- },
- "Format" : "uint8",
- "Permissions" : [
- "securedRead"
- ],
- "Properties" : [
- "read",
- "cnotify",
- "uncnotify"
- ]
- },
- {
- "UUID" : "000000AF-0000-1000-8000-0026BB765291",
- "Name" : "Current Fan State",
- "Constraints" : {
- "ValidValues" : {
- "0" : "Inactive",
- "1" : "Idle",
- "2" : "Blowing Air"
- }
- },
- "Format" : "uint8",
- "Permissions" : [
- "securedRead"
- ],
- "Properties" : [
- "read",
- "cnotify",
- "uncnotify"
- ]
- },
- {
- "UUID" : "000000B1-0000-1000-8000-0026BB765291",
- "Name" : "Current Heater Cooler State",
- "Constraints" : {
- "ValidValues" : {
- "3" : "Cooling",
- "1" : "Idle",
- "2" : "Heating",
- "0" : "Inactive"
- }
- },
- "Format" : "uint8",
- "Permissions" : [
- "securedRead"
- ],
- "Properties" : [
- "read",
- "cnotify",
- "uncnotify"
- ]
- },
- {
- "UUID" : "0000000F-0000-1000-8000-0026BB765291",
- "Name" : "Current Heating Cooling State",
- "Constraints" : {
- "ValidValues" : {
- "0" : "Off",
- "1" : "Heat",
- "2" : "Cool"
- }
- },
- "Format" : "uint8",
- "Permissions" : [
- "securedRead"
- ],
- "Properties" : [
- "read",
- "cnotify",
- "uncnotify"
- ]
- },
- {
- "Format" : "int32",
- "UUID" : "0000006C-0000-1000-8000-0026BB765291",
- "Properties" : [
- "read",
- "cnotify",
- "uncnotify"
- ],
- "Name" : "Current Horizontal Tilt Angle",
- "Permissions" : [
- "securedRead"
- ],
- "Unit" : "arcdegrees",
- "Constraints" : {
- "StepValue" : 1,
- "MaximumValue" : 90,
- "MinimumValue" : -90
- }
- },
- {
- "UUID" : "000000B3-0000-1000-8000-0026BB765291",
- "Name" : "Current Humidifier Dehumidifier State",
- "Constraints" : {
- "ValidValues" : {
- "3" : "Dehumidifying",
- "1" : "Idle",
- "2" : "Humidifying",
- "0" : "Inactive"
- }
- },
- "Format" : "uint8",
- "Permissions" : [
- "securedRead"
- ],
- "Properties" : [
- "read",
- "cnotify",
- "uncnotify"
- ]
- },
- {
- "Format" : "uint8",
- "UUID" : "0000006D-0000-1000-8000-0026BB765291",
- "Properties" : [
- "read",
- "cnotify",
- "uncnotify"
- ],
- "Name" : "Current Position",
- "Permissions" : [
- "securedRead"
- ],
- "Unit" : "percentage",
- "Constraints" : {
- "StepValue" : 1,
- "MaximumValue" : 100,
- "MinimumValue" : 0
- }
- },
- {
- "Format" : "float",
- "UUID" : "00000010-0000-1000-8000-0026BB765291",
- "Properties" : [
- "read",
- "cnotify",
- "uncnotify"
- ],
- "Name" : "Current Relative Humidity",
- "Permissions" : [
- "securedRead"
- ],
- "Unit" : "percentage",
- "Constraints" : {
- "StepValue" : 1,
- "MaximumValue" : 100,
- "MinimumValue" : 0
- }
- },
- {
- "UUID" : "000000AA-0000-1000-8000-0026BB765291",
- "Name" : "Current Slat State",
- "Constraints" : {
- "ValidValues" : {
- "0" : "Fixed",
- "1" : "Jammed",
- "2" : "Swinging"
- }
- },
- "Format" : "uint8",
- "Permissions" : [
- "securedRead"
- ],
- "Properties" : [
- "read",
- "cnotify",
- "uncnotify"
- ]
- },
- {
- "Format" : "float",
- "UUID" : "00000011-0000-1000-8000-0026BB765291",
- "Properties" : [
- "read",
- "cnotify",
- "uncnotify"
- ],
- "Name" : "Current Temperature",
- "Permissions" : [
- "securedRead"
- ],
- "Unit" : "celsius",
- "Constraints" : {
- "StepValue" : 0.10000000000000001,
- "MaximumValue" : 100,
- "MinimumValue" : 0
- }
- },
- {
- "Format" : "int32",
- "UUID" : "000000C1-0000-1000-8000-0026BB765291",
- "Properties" : [
- "read",
- "cnotify",
- "uncnotify"
- ],
- "Name" : "Current Tilt Angle",
- "Permissions" : [
- "securedRead"
- ],
- "Unit" : "arcdegrees",
- "Constraints" : {
- "StepValue" : 1,
- "MaximumValue" : 90,
- "MinimumValue" : -90
- }
- },
- {
- "Format" : "int32",
- "UUID" : "0000006E-0000-1000-8000-0026BB765291",
- "Properties" : [
- "read",
- "cnotify",
- "uncnotify"
- ],
- "Name" : "Current Vertical Tilt Angle",
- "Permissions" : [
- "securedRead"
- ],
- "Unit" : "arcdegrees",
- "Constraints" : {
- "StepValue" : 1,
- "MaximumValue" : 90,
- "MinimumValue" : -90
- }
- },
- {
- "Name" : "Digital Zoom",
- "Format" : "float",
- "Permissions" : [
- "securedRead",
- "securedWrite"
- ],
- "Properties" : [
- "read",
- "write",
- "cnotify",
- "uncnotify"
- ],
- "UUID" : "0000011D-0000-1000-8000-0026BB765291"
- },
- {
- "UUID" : "000000AC-0000-1000-8000-0026BB765291",
- "Name" : "Filter Change Indication",
- "Constraints" : {
- "ValidValues" : {
- "0" : "Filter OK",
- "1" : "Change Filter"
- }
- },
- "Format" : "uint8",
- "Permissions" : [
- "securedRead"
- ],
- "Properties" : [
- "read",
- "cnotify",
- "uncnotify"
- ]
- },
- {
- "UUID" : "000000AB-0000-1000-8000-0026BB765291",
- "Name" : "Filter Life Level",
- "Constraints" : {
- "stepValue" : 1,
- "MaximumValue" : 100,
- "MinimumValue" : 0
- },
- "Format" : "float",
- "Permissions" : [
- "securedRead"
- ],
- "Properties" : [
- "read",
- "cnotify",
- "uncnotify"
- ]
- },
- {
- "Name" : "Firmware Revision",
- "Format" : "string",
- "Permissions" : [
- "securedRead"
- ],
- "Properties" : [
- "read"
- ],
- "UUID" : "00000052-0000-1000-8000-0026BB765291"
- },
- {
- "Name" : "Hardware Revision",
- "Format" : "string",
- "Permissions" : [
- "securedRead"
- ],
- "Properties" : [
- "read"
- ],
- "UUID" : "00000053-0000-1000-8000-0026BB765291"
- },
- {
- "Format" : "float",
- "UUID" : "00000012-0000-1000-8000-0026BB765291",
- "Properties" : [
- "read",
- "write",
- "cnotify",
- "uncnotify"
- ],
- "Name" : "Heating Threshold Temperature",
- "Permissions" : [
- "securedRead",
- "securedWrite"
- ],
- "Unit" : "celsius",
- "Constraints" : {
- "StepValue" : 0.10000000000000001,
- "MaximumValue" : 25,
- "MinimumValue" : 0
- }
- },
- {
- "Name" : "Hold Position",
- "Format" : "bool",
- "Permissions" : [
- "securedWrite"
- ],
- "Properties" : [
- "write"
- ],
- "UUID" : "0000006F-0000-1000-8000-0026BB765291"
- },
- {
- "Format" : "float",
- "UUID" : "00000013-0000-1000-8000-0026BB765291",
- "Properties" : [
- "read",
- "write",
- "cnotify",
- "uncnotify"
- ],
- "Name" : "Hue",
- "Permissions" : [
- "securedRead",
- "securedWrite"
- ],
- "Unit" : "arcdegrees",
- "Constraints" : {
- "StepValue" : 1,
- "MaximumValue" : 360,
- "MinimumValue" : 0
- }
- },
- {
- "Name" : "Identify",
- "Format" : "bool",
- "Permissions" : [
- "securedWrite"
- ],
- "Properties" : [
- "write"
- ],
- "UUID" : "00000014-0000-1000-8000-0026BB765291"
- },
- {
- "Name" : "Image Mirroring",
- "Format" : "bool",
- "Permissions" : [
- "securedRead",
- "securedWrite"
- ],
- "Properties" : [
- "read",
- "write",
- "cnotify",
- "uncnotify"
- ],
- "UUID" : "0000011F-0000-1000-8000-0026BB765291"
- },
- {
- "Format" : "float",
- "UUID" : "0000011E-0000-1000-8000-0026BB765291",
- "Properties" : [
- "read",
- "write",
- "cnotify",
- "uncnotify"
- ],
- "Name" : "Image Rotation",
- "Permissions" : [
- "securedRead",
- "securedWrite"
- ],
- "Unit" : "arcdegrees",
- "Constraints" : {
- "StepValue" : 90,
- "MaximumValue" : 270,
- "MinimumValue" : 0
- }
- },
- {
- "UUID" : "000000D2-0000-1000-8000-0026BB765291",
- "Name" : "In Use",
- "Constraints" : {
- "ValidValues" : {
- "0" : "Not in use",
- "1" : "In use"
- }
- },
- "Format" : "uint8",
- "Permissions" : [
- "securedRead"
- ],
- "Properties" : [
- "read",
- "cnotify",
- "uncnotify"
- ]
- },
- {
- "UUID" : "000000D6-0000-1000-8000-0026BB765291",
- "Name" : "Is Configured",
- "Constraints" : {
- "ValidValues" : {
- "0" : "Not Configured",
- "1" : "Configured"
- }
- },
- "Format" : "uint8",
- "Permissions" : [
- "securedRead",
- "securedWrite"
- ],
- "Properties" : [
- "read",
- "write",
- "cnotify",
- "uncnotify"
- ]
- },
- {
- "UUID" : "00000070-0000-1000-8000-0026BB765291",
- "Name" : "Leak Detected",
- "Constraints" : {
- "ValidValues" : {
- "0" : "Leak Not Detected",
- "1" : "Leak Detected"
- }
- },
- "Format" : "uint8",
- "Permissions" : [
- "securedRead"
- ],
- "Properties" : [
- "read",
- "cnotify",
- "uncnotify"
- ]
- },
- {
- "Name" : "Lock Control Point",
- "Format" : "tlv8",
- "Permissions" : [
- "securedWrite"
- ],
- "Properties" : [
- "write"
- ],
- "UUID" : "00000019-0000-1000-8000-0026BB765291"
- },
- {
- "UUID" : "0000001D-0000-1000-8000-0026BB765291",
- "Name" : "Lock Current State",
- "Constraints" : {
- "ValidValues" : {
- "3" : "Unknown",
- "1" : "Secured",
- "2" : "Jammed",
- "0" : "Unsecured"
- }
- },
- "Format" : "uint8",
- "Permissions" : [
- "securedRead"
- ],
- "Properties" : [
- "read",
- "cnotify",
- "uncnotify"
- ]
- },
- {
- "UUID" : "0000001C-0000-1000-8000-0026BB765291",
- "Name" : "Lock Last Known Action",
- "Constraints" : {
- "ValidValues" : {
- "7" : "Unsecured Remotely",
- "3" : "Unsecured Physically, Exterior",
- "8" : "Secured by Auto Secure Timeout",
- "4" : "Secured by Keypad",
- "0" : "Secured Physically, Interior",
- "5" : "Unsecured by Keypad",
- "1" : "Unsecured Physically, Interior",
- "6" : "Secured Remotely",
- "2" : "Secured Physically, Exterior"
- }
- },
- "Format" : "uint8",
- "Permissions" : [
- "securedRead"
- ],
- "Properties" : [
- "read",
- "cnotify",
- "uncnotify"
- ]
- },
- {
- "Unit" : "seconds",
- "Name" : "Lock Management Auto Security Timeout",
- "Format" : "uint32",
- "Permissions" : [
- "securedRead",
- "securedWrite"
- ],
- "Properties" : [
- "read",
- "write",
- "cnotify",
- "uncnotify"
- ],
- "UUID" : "0000001A-0000-1000-8000-0026BB765291"
- },
- {
- "UUID" : "000000A7-0000-1000-8000-0026BB765291",
- "Name" : "Lock Physical Controls",
- "Constraints" : {
- "ValidValues" : {
- "0" : "Control Lock Disabled",
- "1" : "Control Lock Enabled"
- }
- },
- "Format" : "uint8",
- "Permissions" : [
- "securedRead",
- "securedWrite"
- ],
- "Properties" : [
- "read",
- "write",
- "cnotify",
- "uncnotify"
- ]
- },
- {
- "UUID" : "0000001E-0000-1000-8000-0026BB765291",
- "Name" : "Lock Target State",
- "Constraints" : {
- "ValidValues" : {
- "0" : "Unsecured",
- "1" : "Secured"
- }
- },
- "Format" : "uint8",
- "Permissions" : [
- "securedRead",
- "securedWrite"
- ],
- "Properties" : [
- "read",
- "write",
- "cnotify",
- "uncnotify"
- ]
- },
- {
- "Name" : "Logs",
- "Format" : "tlv8",
- "Permissions" : [
- "securedRead"
- ],
- "Properties" : [
- "read",
- "cnotify",
- "uncnotify"
- ],
- "UUID" : "0000001F-0000-1000-8000-0026BB765291"
- },
- {
- "Name" : "Manufacturer",
- "Format" : "string",
- "Permissions" : [
- "securedRead"
- ],
- "Properties" : [
- "read"
- ],
- "UUID" : "00000020-0000-1000-8000-0026BB765291"
- },
- {
- "Name" : "Model",
- "Format" : "string",
- "Permissions" : [
- "securedRead"
- ],
- "Properties" : [
- "read"
- ],
- "UUID" : "00000021-0000-1000-8000-0026BB765291"
- },
- {
- "Name" : "Motion Detected",
- "Format" : "bool",
- "Permissions" : [
- "securedRead"
- ],
- "Properties" : [
- "read",
- "cnotify",
- "uncnotify"
- ],
- "UUID" : "00000022-0000-1000-8000-0026BB765291"
- },
- {
- "Name" : "Mute",
- "Format" : "bool",
- "Permissions" : [
- "securedRead",
- "securedWrite"
- ],
- "Properties" : [
- "read",
- "write",
- "cnotify",
- "uncnotify"
- ],
- "UUID" : "0000011A-0000-1000-8000-0026BB765291"
- },
- {
- "Name" : "Name",
- "Format" : "string",
- "Permissions" : [
- "securedRead"
- ],
- "Properties" : [
- "read"
- ],
- "UUID" : "00000023-0000-1000-8000-0026BB765291"
- },
- {
- "Name" : "Night Vision",
- "Format" : "bool",
- "Permissions" : [
- "securedRead",
- "securedWrite"
- ],
- "Properties" : [
- "read",
- "write",
- "cnotify",
- "uncnotify"
- ],
- "UUID" : "0000011B-0000-1000-8000-0026BB765291"
- },
- {
- "UUID" : "000000C4-0000-1000-8000-0026BB765291",
- "Name" : "Nitrogen Dioxide Density",
- "Constraints" : {
- "StepValue" : 1,
- "MaximumValue" : 1000,
- "MinimumValue" : 0
- },
- "Format" : "float",
- "Permissions" : [
- "securedRead"
- ],
- "Properties" : [
- "read",
- "cnotify",
- "uncnotify"
- ]
- },
- {
- "Name" : "Obstruction Detected",
- "Format" : "bool",
- "Permissions" : [
- "securedRead"
- ],
- "Properties" : [
- "read",
- "cnotify",
- "uncnotify"
- ],
- "UUID" : "00000024-0000-1000-8000-0026BB765291"
- },
- {
- "UUID" : "00000071-0000-1000-8000-0026BB765291",
- "Name" : "Occupancy Detected",
- "Constraints" : {
- "ValidValues" : {
- "0" : "Occupancy Not Detected",
- "1" : "Occupancy Detected"
- }
- },
- "Format" : "uint8",
- "Permissions" : [
- "securedRead"
- ],
- "Properties" : [
- "read",
- "cnotify",
- "uncnotify"
- ]
- },
- {
- "Name" : "On",
- "Format" : "bool",
- "Permissions" : [
- "securedRead",
- "securedWrite"
- ],
- "Properties" : [
- "read",
- "write",
- "cnotify",
- "uncnotify"
- ],
- "UUID" : "00000025-0000-1000-8000-0026BB765291"
- },
- {
- "Name" : "Optical Zoom",
- "Format" : "float",
- "Permissions" : [
- "securedRead",
- "securedWrite"
- ],
- "Properties" : [
- "read",
- "write",
- "cnotify",
- "uncnotify"
- ],
- "UUID" : "0000011C-0000-1000-8000-0026BB765291"
- },
- {
- "Name" : "Outlet In Use",
- "Format" : "bool",
- "Permissions" : [
- "securedRead"
- ],
- "Properties" : [
- "read",
- "cnotify",
- "uncnotify"
- ],
- "UUID" : "00000026-0000-1000-8000-0026BB765291"
- },
- {
- "UUID" : "000000C3-0000-1000-8000-0026BB765291",
- "Name" : "Ozone Density",
- "Constraints" : {
- "StepValue" : 1,
- "MaximumValue" : 1000,
- "MinimumValue" : 0
- },
- "Format" : "float",
- "Permissions" : [
- "securedRead"
- ],
- "Properties" : [
- "read",
- "cnotify",
- "uncnotify"
- ]
- },
- {
- "Name" : "Pair Setup",
- "Format" : "tlv8",
- "Permissions" : [
- "read",
- "write"
- ],
- "Properties" : [
- "read",
- "write"
- ],
- "UUID" : "0000004C-0000-1000-8000-0026BB765291"
- },
- {
- "Name" : "Pair Verify",
- "Format" : "tlv8",
- "Permissions" : [
- "read",
- "write"
- ],
- "Properties" : [
- "read",
- "write"
- ],
- "UUID" : "0000004E-0000-1000-8000-0026BB765291"
- },
- {
- "Name" : "Pairing Features",
- "Format" : "uint8",
- "Permissions" : [
- "read"
- ],
- "Properties" : [
- "read"
- ],
- "UUID" : "0000004F-0000-1000-8000-0026BB765291"
- },
- {
- "Name" : "Pairing Pairings",
- "Format" : "tlv8",
- "Permissions" : [
- "securedRead",
- "securedWrite"
- ],
- "Properties" : [
- "read",
- "write"
- ],
- "UUID" : "00000050-0000-1000-8000-0026BB765291"
- },
- {
- "UUID" : "000000C7-0000-1000-8000-0026BB765291",
- "Name" : "PM10 Density",
- "Constraints" : {
- "StepValue" : 1,
- "MaximumValue" : 1000,
- "MinimumValue" : 0
- },
- "Format" : "float",
- "Permissions" : [
- "securedRead"
- ],
- "Properties" : [
- "read",
- "cnotify",
- "uncnotify"
- ]
- },
- {
- "UUID" : "000000C6-0000-1000-8000-0026BB765291",
- "Name" : "PM2.5 Density",
- "Constraints" : {
- "StepValue" : 1,
- "MaximumValue" : 1000,
- "MinimumValue" : 0
- },
- "Format" : "float",
- "Permissions" : [
- "securedRead"
- ],
- "Properties" : [
- "read",
- "cnotify",
- "uncnotify"
- ]
- },
- {
- "UUID" : "00000072-0000-1000-8000-0026BB765291",
- "Name" : "Position State",
- "Constraints" : {
- "ValidValues" : {
- "0" : "Decreasing",
- "1" : "Increasing",
- "2" : "Stopped"
- }
- },
- "Format" : "uint8",
- "Permissions" : [
- "securedRead"
- ],
- "Properties" : [
- "read",
- "cnotify",
- "uncnotify"
- ]
- },
- {
- "UUID" : "000000D1-0000-1000-8000-0026BB765291",
- "Name" : "Program Mode",
- "Constraints" : {
- "ValidValues" : {
- "0" : "No program scheduled",
- "1" : "Program scheduled",
- "2" : "Program scheduled (Manual Mode)"
- }
- },
- "Format" : "uint8",
- "Permissions" : [
- "securedRead"
- ],
- "Properties" : [
- "read",
- "cnotify",
- "uncnotify"
- ]
- },
- {
- "UUID" : "00000073-0000-1000-8000-0026BB765291",
- "Name" : "Programmable Switch Event",
- "Constraints" : {
- "ValidValues" : {
- "0" : "Single Press",
- "1" : "Double Press",
- "2" : "Long Press"
- }
- },
- "Format" : "uint8",
- "Permissions" : [
- "securedRead"
- ],
- "Properties" : [
- "read",
- "cnotify",
- "uncnotify"
- ]
- },
- {
- "Format" : "float",
- "UUID" : "000000C9-0000-1000-8000-0026BB765291",
- "Properties" : [
- "read",
- "write",
- "cnotify",
- "uncnotify"
- ],
- "Name" : "Relative Humidity Dehumidifier Threshold",
- "Permissions" : [
- "securedRead",
- "securedWrite"
- ],
- "Unit" : "percentage",
- "Constraints" : {
- "StepValue" : 1,
- "MaximumValue" : 100,
- "MinimumValue" : 0
- }
- },
- {
- "Format" : "float",
- "UUID" : "000000CA-0000-1000-8000-0026BB765291",
- "Properties" : [
- "read",
- "write",
- "cnotify",
- "uncnotify"
- ],
- "Name" : "Relative Humidity Humidifier Threshold",
- "Permissions" : [
- "securedRead",
- "securedWrite"
- ],
- "Unit" : "percentage",
- "Constraints" : {
- "StepValue" : 1,
- "MaximumValue" : 100,
- "MinimumValue" : 0
- }
- },
- {
- "UUID" : "000000D4-0000-1000-8000-0026BB765291",
- "Name" : "Remaining Duration",
- "Constraints" : {
- "StepValue" : 1,
- "MaximumValue" : 3600,
- "MinimumValue" : 0
- },
- "Format" : "uint32",
- "Permissions" : [
- "securedRead"
- ],
- "Properties" : [
- "read",
- "cnotify",
- "uncnotify"
- ]
- },
- {
- "UUID" : "000000AD-0000-1000-8000-0026BB765291",
- "Name" : "Reset Filter Indication",
- "Constraints" : {
- "StepValue" : 1,
- "MaximumValue" : 1,
- "MinimumValue" : 1
- },
- "Format" : "uint8",
- "Permissions" : [
- "securedWrite"
- ],
- "Properties" : [
- "write"
- ]
- },
- {
- "UUID" : "00000028-0000-1000-8000-0026BB765291",
- "Name" : "Rotation Direction",
- "Constraints" : {
- "ValidValues" : {
- "0" : "Clockwise",
- "1" : "Counter-clockwise"
- }
- },
- "Format" : "int32",
- "Permissions" : [
- "securedRead",
- "securedWrite"
- ],
- "Properties" : [
- "read",
- "write",
- "cnotify",
- "uncnotify"
- ]
- },
- {
- "Format" : "float",
- "UUID" : "00000029-0000-1000-8000-0026BB765291",
- "Properties" : [
- "read",
- "write",
- "cnotify",
- "uncnotify"
- ],
- "Name" : "Rotation Speed",
- "Permissions" : [
- "securedRead",
- "securedWrite"
- ],
- "Unit" : "percentage",
- "Constraints" : {
- "StepValue" : 1,
- "MaximumValue" : 100,
- "MinimumValue" : 0
- }
- },
- {
- "Format" : "float",
- "UUID" : "0000002F-0000-1000-8000-0026BB765291",
- "Properties" : [
- "read",
- "write",
- "cnotify",
- "uncnotify"
- ],
- "Name" : "Saturation",
- "Permissions" : [
- "securedRead",
- "securedWrite"
- ],
- "Unit" : "percentage",
- "Constraints" : {
- "StepValue" : 1,
- "MaximumValue" : 100,
- "MinimumValue" : 0
- }
- },
- {
- "UUID" : "0000008E-0000-1000-8000-0026BB765291",
- "Name" : "Security System Alarm Type",
- "Constraints" : {
- "StepValue" : 1,
- "MaximumValue" : 1,
- "MinimumValue" : 0
- },
- "Format" : "uint8",
- "Permissions" : [
- "securedRead"
- ],
- "Properties" : [
- "read",
- "cnotify",
- "uncnotify"
- ]
- },
- {
- "UUID" : "00000066-0000-1000-8000-0026BB765291",
- "Name" : "Security System Current State",
- "Constraints" : {
- "ValidValues" : {
- "3" : "Disarmed",
- "1" : "Away Arm",
- "4" : "Alarm Triggered",
- "2" : "Night Arm",
- "0" : "Stay Arm"
- }
- },
- "Format" : "uint8",
- "Permissions" : [
- "securedRead"
- ],
- "Properties" : [
- "read",
- "cnotify",
- "uncnotify"
- ]
- },
- {
- "UUID" : "00000067-0000-1000-8000-0026BB765291",
- "Name" : "Security System Target State",
- "Constraints" : {
- "ValidValues" : {
- "3" : "Disarm",
- "1" : "Away Arm",
- "2" : "Night Arm",
- "0" : "Stay Arm"
- }
- },
- "Format" : "uint8",
- "Permissions" : [
- "securedRead",
- "securedWrite"
- ],
- "Properties" : [
- "read",
- "write",
- "cnotify",
- "uncnotify"
- ]
- },
- {
- "Name" : "Selected RTP Stream Configuration",
- "Format" : "tlv8",
- "Permissions" : [
- "securedRead",
- "securedWrite"
- ],
- "Properties" : [
- "read",
- "write"
- ],
- "UUID" : "00000117-0000-1000-8000-0026BB765291"
- },
- {
- "UUID" : "00000030-0000-1000-8000-0026BB765291",
- "Name" : "Serial Number",
- "Constraints" : {
- "MaximumLength" : 64
- },
- "Format" : "string",
- "Permissions" : [
- "securedRead"
- ],
- "Properties" : [
- "read"
- ]
- },
- {
- "UUID" : "000000CB-0000-1000-8000-0026BB765291",
- "Name" : "Service Label Index",
- "Constraints" : {
- "StepValue" : 1,
- "MaximumValue" : 255,
- "MinimumValue" : 1
- },
- "Format" : "uint8",
- "Permissions" : [
- "securedRead"
- ],
- "Properties" : [
- "read"
- ]
- },
- {
- "UUID" : "000000CD-0000-1000-8000-0026BB765291",
- "Name" : "Service Label Namespace",
- "Constraints" : {
- "ValidValues" : {
- "0" : "Dots",
- "1" : "Arabic Numerals"
- }
- },
- "Format" : "uint8",
- "Permissions" : [
- "securedRead"
- ],
- "Properties" : [
- "read"
- ]
- },
- {
- "UUID" : "000000D3-0000-1000-8000-0026BB765291",
- "Name" : "Set Duration",
- "Constraints" : {
- "StepValue" : 1,
- "MaximumValue" : 3600,
- "MinimumValue" : 0
- },
- "Format" : "uint32",
- "Permissions" : [
- "securedRead",
- "securedWrite"
- ],
- "Properties" : [
- "read",
- "write",
- "cnotify",
- "uncnotify"
- ]
- },
- {
- "Name" : "Setup Endpoints",
- "Format" : "tlv8",
- "Permissions" : [
- "securedRead",
- "securedWrite"
- ],
- "Properties" : [
- "read",
- "write"
- ],
- "UUID" : "00000118-0000-1000-8000-0026BB765291"
- },
- {
- "UUID" : "000000C0-0000-1000-8000-0026BB765291",
- "Name" : "Slat Type",
- "Constraints" : {
- "ValidValues" : {
- "0" : "Horizontal",
- "1" : "Vertical"
- }
- },
- "Format" : "uint8",
- "Permissions" : [
- "securedRead"
- ],
- "Properties" : [
- "read"
- ]
- },
- {
- "UUID" : "00000076-0000-1000-8000-0026BB765291",
- "Name" : "Smoke Detected",
- "Constraints" : {
- "ValidValues" : {
- "0" : "Smoke Not Detected",
- "1" : "Smoke Detected"
- }
- },
- "Format" : "uint8",
- "Permissions" : [
- "securedRead"
- ],
- "Properties" : [
- "read",
- "cnotify",
- "uncnotify"
- ]
- },
- {
- "Name" : "Status Active",
- "Format" : "bool",
- "Permissions" : [
- "securedRead"
- ],
- "Properties" : [
- "read",
- "cnotify",
- "uncnotify"
- ],
- "UUID" : "00000075-0000-1000-8000-0026BB765291"
- },
- {
- "UUID" : "00000077-0000-1000-8000-0026BB765291",
- "Name" : "Status Fault",
- "Constraints" : {
- "ValidValues" : {
- "0" : "No Fault",
- "1" : "General Fault"
- }
- },
- "Format" : "uint8",
- "Permissions" : [
- "securedRead"
- ],
- "Properties" : [
- "read",
- "cnotify",
- "uncnotify"
- ]
- },
- {
- "UUID" : "00000078-0000-1000-8000-0026BB765291",
- "Name" : "Status Jammed",
- "Constraints" : {
- "ValidValues" : {
- "0" : "Not Jammed",
- "1" : "Jammed"
- }
- },
- "Format" : "uint8",
- "Permissions" : [
- "securedRead"
- ],
- "Properties" : [
- "read",
- "cnotify",
- "uncnotify"
- ]
- },
- {
- "UUID" : "00000079-0000-1000-8000-0026BB765291",
- "Name" : "Status Low Battery",
- "Constraints" : {
- "ValidValues" : {
- "0" : "Battery Level Normal",
- "1" : "Battery Level Low"
- }
- },
- "Format" : "uint8",
- "Permissions" : [
- "securedRead"
- ],
- "Properties" : [
- "read",
- "cnotify",
- "uncnotify"
- ]
- },
- {
- "UUID" : "0000007A-0000-1000-8000-0026BB765291",
- "Name" : "Status Tampered",
- "Constraints" : {
- "ValidValues" : {
- "0" : "Not Tampered",
- "1" : "Tampered"
- }
- },
- "Format" : "uint8",
- "Permissions" : [
- "securedRead"
- ],
- "Properties" : [
- "read",
- "cnotify",
- "uncnotify"
- ]
- },
- {
- "Name" : "Streaming Status",
- "Format" : "tlv8",
- "Permissions" : [
- "securedRead"
- ],
- "Properties" : [
- "read",
- "cnotify",
- "uncnotify"
- ],
- "UUID" : "00000120-0000-1000-8000-0026BB765291"
- },
- {
- "UUID" : "000000C5-0000-1000-8000-0026BB765291",
- "Name" : "Sulphur Dioxide Density",
- "Constraints" : {
- "StepValue" : 1,
- "MaximumValue" : 1000,
- "MinimumValue" : 0
- },
- "Format" : "float",
- "Permissions" : [
- "securedRead"
- ],
- "Properties" : [
- "read",
- "cnotify",
- "uncnotify"
- ]
- },
- {
- "Name" : "Supported Audio Stream Configuration",
- "Format" : "tlv8",
- "Permissions" : [
- "securedRead"
- ],
- "Properties" : [
- "read"
- ],
- "UUID" : "00000115-0000-1000-8000-0026BB765291"
- },
- {
- "Name" : "Supported RTP Configuration",
- "Format" : "tlv8",
- "Permissions" : [
- "securedRead"
- ],
- "Properties" : [
- "read"
- ],
- "UUID" : "00000116-0000-1000-8000-0026BB765291"
- },
- {
- "Name" : "Supported Video Stream Configuration",
- "Format" : "tlv8",
- "Permissions" : [
- "securedRead"
- ],
- "Properties" : [
- "read"
- ],
- "UUID" : "00000114-0000-1000-8000-0026BB765291"
- },
- {
- "UUID" : "000000B6-0000-1000-8000-0026BB765291",
- "Name" : "Swing Mode",
- "Constraints" : {
- "ValidValues" : {
- "0" : "Swing Disabled",
- "1" : "Swing Enabled"
- }
- },
- "Format" : "uint8",
- "Permissions" : [
- "securedRead",
- "securedWrite"
- ],
- "Properties" : [
- "read",
- "write",
- "cnotify",
- "uncnotify"
- ]
- },
- {
- "UUID" : "000000A8-0000-1000-8000-0026BB765291",
- "Name" : "Target Air Purifier State",
- "Constraints" : {
- "ValidValues" : {
- "0" : "Manual",
- "1" : "Auto"
- }
- },
- "Format" : "uint8",
- "Permissions" : [
- "securedRead",
- "securedWrite"
- ],
- "Properties" : [
- "read",
- "write",
- "cnotify",
- "uncnotify"
- ]
- },
- {
- "UUID" : "000000AE-0000-1000-8000-0026BB765291",
- "Name" : "Target Air Quality",
- "Constraints" : {
- "ValidValues" : {
- "0" : "Excellent",
- "1" : "Good",
- "2" : "Fair"
- }
- },
- "Format" : "uint8",
- "Permissions" : [
- "securedRead",
- "securedWrite"
- ],
- "Properties" : [
- "read",
- "write",
- "cnotify",
- "uncnotify"
- ]
- },
- {
- "UUID" : "00000032-0000-1000-8000-0026BB765291",
- "Name" : "Target Door State",
- "Constraints" : {
- "ValidValues" : {
- "0" : "Open",
- "1" : "Closed"
- }
- },
- "Format" : "uint8",
- "Permissions" : [
- "securedRead",
- "securedWrite"
- ],
- "Properties" : [
- "read",
- "write",
- "cnotify",
- "uncnotify"
- ]
- },
- {
- "UUID" : "000000BF-0000-1000-8000-0026BB765291",
- "Name" : "Target Fan State",
- "Constraints" : {
- "ValidValues" : {
- "0" : "Manual",
- "1" : "Auto"
- }
- },
- "Format" : "uint8",
- "Permissions" : [
- "securedRead",
- "securedWrite"
- ],
- "Properties" : [
- "read",
- "write",
- "cnotify",
- "uncnotify"
- ]
- },
- {
- "UUID" : "000000B2-0000-1000-8000-0026BB765291",
- "Name" : "Target Heater Cooler State",
- "Constraints" : {
- "ValidValues" : {
- "0" : "Auto",
- "1" : "Heat",
- "2" : "Cool"
- }
- },
- "Format" : "uint8",
- "Permissions" : [
- "securedRead",
- "securedWrite"
- ],
- "Properties" : [
- "read",
- "write",
- "cnotify",
- "uncnotify"
- ]
- },
- {
- "UUID" : "00000033-0000-1000-8000-0026BB765291",
- "Name" : "Target Heating Cooling State",
- "Constraints" : {
- "ValidValues" : {
- "3" : "Auto",
- "1" : "Heat",
- "2" : "Cool",
- "0" : "Off"
- }
- },
- "Format" : "uint8",
- "Permissions" : [
- "securedRead",
- "securedWrite"
- ],
- "Properties" : [
- "read",
- "write",
- "cnotify",
- "uncnotify"
- ]
- },
- {
- "Format" : "int32",
- "UUID" : "0000007B-0000-1000-8000-0026BB765291",
- "Properties" : [
- "read",
- "write",
- "cnotify",
- "uncnotify"
- ],
- "Name" : "Target Horizontal Tilt Angle",
- "Permissions" : [
- "securedRead",
- "securedWrite"
- ],
- "Unit" : "arcdegrees",
- "Constraints" : {
- "StepValue" : 1,
- "MaximumValue" : 90,
- "MinimumValue" : -90
- }
- },
- {
- "UUID" : "000000B4-0000-1000-8000-0026BB765291",
- "Name" : "Target Humidifier Dehumidifier State",
- "Constraints" : {
- "ValidValues" : {
- "0" : "Humidifier or Dehumidifier",
- "1" : "Humidifier",
- "2" : "Dehumidifier"
- }
- },
- "Format" : "uint8",
- "Permissions" : [
- "securedRead",
- "securedWrite"
- ],
- "Properties" : [
- "read",
- "write",
- "cnotify",
- "uncnotify"
- ]
- },
- {
- "Format" : "uint8",
- "UUID" : "0000007C-0000-1000-8000-0026BB765291",
- "Properties" : [
- "read",
- "write",
- "cnotify",
- "uncnotify"
- ],
- "Name" : "Target Position",
- "Permissions" : [
- "securedRead",
- "securedWrite"
- ],
- "Unit" : "percentage",
- "Constraints" : {
- "StepValue" : 1,
- "MaximumValue" : 100,
- "MinimumValue" : 0
- }
- },
- {
- "Format" : "float",
- "UUID" : "00000034-0000-1000-8000-0026BB765291",
- "Properties" : [
- "read",
- "write",
- "cnotify",
- "uncnotify"
- ],
- "Name" : "Target Relative Humidity",
- "Permissions" : [
- "securedRead",
- "securedWrite"
- ],
- "Unit" : "percentage",
- "Constraints" : {
- "StepValue" : 1,
- "MaximumValue" : 100,
- "MinimumValue" : 0
- }
- },
- {
- "UUID" : "000000BE-0000-1000-8000-0026BB765291",
- "Name" : "Target Slat State",
- "Constraints" : {
- "ValidValues" : {
- "0" : "Manual",
- "1" : "Auto"
- }
- },
- "Format" : "uint8",
- "Permissions" : [
- "securedRead",
- "securedWrite"
- ],
- "Properties" : [
- "read",
- "write",
- "cnotify",
- "uncnotify"
- ]
- },
- {
- "Format" : "float",
- "UUID" : "00000035-0000-1000-8000-0026BB765291",
- "Properties" : [
- "read",
- "write",
- "cnotify",
- "uncnotify"
- ],
- "Name" : "Target Temperature",
- "Permissions" : [
- "securedRead",
- "securedWrite"
- ],
- "Unit" : "celsius",
- "Constraints" : {
- "StepValue" : 0.10000000000000001,
- "MaximumValue" : 38,
- "MinimumValue" : 10
- }
- },
- {
- "Format" : "int32",
- "UUID" : "000000C2-0000-1000-8000-0026BB765291",
- "Properties" : [
- "read",
- "write",
- "cnotify",
- "uncnotify"
- ],
- "Name" : "Target Tilt Angle",
- "Permissions" : [
- "securedRead",
- "securedWrite"
- ],
- "Unit" : "arcdegrees",
- "Constraints" : {
- "StepValue" : 1,
- "MaximumValue" : 90,
- "MinimumValue" : -90
- }
- },
- {
- "Format" : "int32",
- "UUID" : "0000007D-0000-1000-8000-0026BB765291",
- "Properties" : [
- "read",
- "write",
- "cnotify",
- "uncnotify"
- ],
- "Name" : "Target Vertical Tilt Angle",
- "Permissions" : [
- "securedRead",
- "securedWrite"
- ],
- "Unit" : "arcdegrees",
- "Constraints" : {
- "StepValue" : 1,
- "MaximumValue" : 90,
- "MinimumValue" : -90
- }
- },
- {
- "UUID" : "00000036-0000-1000-8000-0026BB765291",
- "Name" : "Temperature Display Units",
- "Constraints" : {
- "ValidValues" : {
- "0" : "Celsius",
- "1" : "Fahrenheit"
- }
- },
- "Format" : "uint8",
- "Permissions" : [
- "securedRead",
- "securedWrite"
- ],
- "Properties" : [
- "read",
- "write",
- "cnotify",
- "uncnotify"
- ]
- },
- {
- "UUID" : "000000D5-0000-1000-8000-0026BB765291",
- "Name" : "Valve Type",
- "Constraints" : {
- "ValidValues" : {
- "3" : "Water faucet",
- "1" : "Irrigation",
- "2" : "Shower head",
- "0" : "Generic valve"
- }
- },
- "Format" : "uint8",
- "Permissions" : [
- "securedRead"
- ],
- "Properties" : [
- "read",
- "cnotify",
- "uncnotify"
- ]
- },
- {
- "UUID" : "00000037-0000-1000-8000-0026BB765291",
- "Name" : "Version",
- "Constraints" : {
- "MaximumLength" : 64
- },
- "Format" : "string",
- "Permissions" : [
- "securedRead"
- ],
- "Properties" : [
- "read",
- "cnotify",
- "uncnotify"
- ]
- },
- {
- "UUID" : "000000C8-0000-1000-8000-0026BB765291",
- "Name" : "VOC Density",
- "Constraints" : {
- "StepValue" : 1,
- "MaximumValue" : 1000,
- "MinimumValue" : 0
- },
- "Format" : "float",
- "Permissions" : [
- "securedRead"
- ],
- "Properties" : [
- "read",
- "cnotify",
- "uncnotify"
- ]
- },
- {
- "Format" : "uint8",
- "UUID" : "00000119-0000-1000-8000-0026BB765291",
- "Properties" : [
- "read",
- "write",
- "cnotify",
- "uncnotify"
- ],
- "Name" : "Volume",
- "Permissions" : [
- "securedRead",
- "securedWrite"
- ],
- "Unit" : "percentage",
- "Constraints" : {
- "StepValue" : 1,
- "MaximumValue" : 100,
- "MinimumValue" : 0
- }
- },
- {
- "Format" : "float",
- "UUID" : "000000B5-0000-1000-8000-0026BB765291",
- "Properties" : [
- "read",
- "cnotify",
- "uncnotify"
- ],
- "Name" : "Water Level",
- "Permissions" : [
- "securedRead"
- ],
- "Unit" : "percentage",
- "Constraints" : {
- "MaximumValue" : 100,
- "MinimumValue" : 0
- }
- }
- ],
- "Version" : "1.0",
- "Services" : [
- {
- "OptionalCharacteristics" : [
- "00000053-0000-1000-8000-0026BB765291",
- "000000A6-0000-1000-8000-0026BB765291"
- ],
- "RequiredCharacteristics" : [
- "00000014-0000-1000-8000-0026BB765291",
- "00000020-0000-1000-8000-0026BB765291",
- "00000021-0000-1000-8000-0026BB765291",
- "00000023-0000-1000-8000-0026BB765291",
- "00000030-0000-1000-8000-0026BB765291",
- "00000052-0000-1000-8000-0026BB765291"
- ],
- "Name" : "Accessory Information",
- "UUID" : "0000003E-0000-1000-8000-0026BB765291"
- },
- {
- "OptionalCharacteristics" : [
- "000000A7-0000-1000-8000-0026BB765291",
- "00000023-0000-1000-8000-0026BB765291",
- "000000B6-0000-1000-8000-0026BB765291",
- "00000029-0000-1000-8000-0026BB765291"
- ],
- "RequiredCharacteristics" : [
- "000000B0-0000-1000-8000-0026BB765291",
- "000000A9-0000-1000-8000-0026BB765291",
- "000000A8-0000-1000-8000-0026BB765291"
- ],
- "Name" : "Air Purifier",
- "UUID" : "000000BB-0000-1000-8000-0026BB765291"
- },
- {
- "OptionalCharacteristics" : [
- "00000075-0000-1000-8000-0026BB765291",
- "00000077-0000-1000-8000-0026BB765291",
- "0000007A-0000-1000-8000-0026BB765291",
- "00000079-0000-1000-8000-0026BB765291",
- "00000023-0000-1000-8000-0026BB765291",
- "000000C3-0000-1000-8000-0026BB765291",
- "000000C4-0000-1000-8000-0026BB765291",
- "000000C5-0000-1000-8000-0026BB765291",
- "000000C6-0000-1000-8000-0026BB765291",
- "000000C7-0000-1000-8000-0026BB765291",
- "000000C8-0000-1000-8000-0026BB765291",
- "00000090-0000-1000-8000-0026BB765291",
- "00000093-0000-1000-8000-0026BB765291"
- ],
- "RequiredCharacteristics" : [
- "00000095-0000-1000-8000-0026BB765291"
- ],
- "Name" : "Air Quality Sensor",
- "UUID" : "0000008D-0000-1000-8000-0026BB765291"
- },
- {
- "OptionalCharacteristics" : [
- "00000023-0000-1000-8000-0026BB765291"
- ],
- "RequiredCharacteristics" : [
- "00000068-0000-1000-8000-0026BB765291",
- "0000008F-0000-1000-8000-0026BB765291",
- "00000079-0000-1000-8000-0026BB765291"
- ],
- "Name" : "Battery Service",
- "UUID" : "00000096-0000-1000-8000-0026BB765291"
- },
- {
- "OptionalCharacteristics" : [
- "00000023-0000-1000-8000-0026BB765291"
- ],
- "RequiredCharacteristics" : [
- "00000114-0000-1000-8000-0026BB765291",
- "00000115-0000-1000-8000-0026BB765291",
- "00000116-0000-1000-8000-0026BB765291",
- "00000117-0000-1000-8000-0026BB765291",
- "00000120-0000-1000-8000-0026BB765291",
- "00000118-0000-1000-8000-0026BB765291"
- ],
- "Name" : "Camera RTP Stream Management",
- "UUID" : "00000110-0000-1000-8000-0026BB765291"
- },
- {
- "OptionalCharacteristics" : [
- "00000075-0000-1000-8000-0026BB765291",
- "00000077-0000-1000-8000-0026BB765291",
- "00000079-0000-1000-8000-0026BB765291",
- "0000007A-0000-1000-8000-0026BB765291",
- "00000093-0000-1000-8000-0026BB765291",
- "00000094-0000-1000-8000-0026BB765291",
- "00000023-0000-1000-8000-0026BB765291"
- ],
- "RequiredCharacteristics" : [
- "00000092-0000-1000-8000-0026BB765291"
- ],
- "Name" : "Carbon Dioxide Sensor",
- "UUID" : "00000097-0000-1000-8000-0026BB765291"
- },
- {
- "OptionalCharacteristics" : [
- "00000075-0000-1000-8000-0026BB765291",
- "00000077-0000-1000-8000-0026BB765291",
- "00000079-0000-1000-8000-0026BB765291",
- "0000007A-0000-1000-8000-0026BB765291",
- "00000090-0000-1000-8000-0026BB765291",
- "00000091-0000-1000-8000-0026BB765291",
- "00000023-0000-1000-8000-0026BB765291"
- ],
- "RequiredCharacteristics" : [
- "00000069-0000-1000-8000-0026BB765291"
- ],
- "Name" : "Carbon Monoxide Sensor",
- "UUID" : "0000007F-0000-1000-8000-0026BB765291"
- },
- {
- "OptionalCharacteristics" : [
- "00000075-0000-1000-8000-0026BB765291",
- "00000077-0000-1000-8000-0026BB765291",
- "0000007A-0000-1000-8000-0026BB765291",
- "00000079-0000-1000-8000-0026BB765291",
- "00000023-0000-1000-8000-0026BB765291"
- ],
- "RequiredCharacteristics" : [
- "0000006A-0000-1000-8000-0026BB765291"
- ],
- "Name" : "Contact Sensor",
- "UUID" : "00000080-0000-1000-8000-0026BB765291"
- },
- {
- "OptionalCharacteristics" : [
- "0000006F-0000-1000-8000-0026BB765291",
- "00000024-0000-1000-8000-0026BB765291",
- "00000023-0000-1000-8000-0026BB765291"
- ],
- "RequiredCharacteristics" : [
- "0000006D-0000-1000-8000-0026BB765291",
- "00000072-0000-1000-8000-0026BB765291",
- "0000007C-0000-1000-8000-0026BB765291"
- ],
- "Name" : "Door",
- "UUID" : "00000081-0000-1000-8000-0026BB765291"
- },
- {
- "OptionalCharacteristics" : [
- "00000008-0000-1000-8000-0026BB765291",
- "00000119-0000-1000-8000-0026BB765291",
- "00000023-0000-1000-8000-0026BB765291"
- ],
- "RequiredCharacteristics" : [
- "00000073-0000-1000-8000-0026BB765291"
- ],
- "Name" : "Doorbell",
- "UUID" : "00000121-0000-1000-8000-0026BB765291"
- },
- {
- "OptionalCharacteristics" : [
- "00000028-0000-1000-8000-0026BB765291",
- "00000029-0000-1000-8000-0026BB765291",
- "00000023-0000-1000-8000-0026BB765291"
- ],
- "RequiredCharacteristics" : [
- "00000025-0000-1000-8000-0026BB765291"
- ],
- "Name" : "Fan",
- "UUID" : "00000040-0000-1000-8000-0026BB765291"
- },
- {
- "OptionalCharacteristics" : [
- "000000AF-0000-1000-8000-0026BB765291",
- "000000BF-0000-1000-8000-0026BB765291",
- "000000A7-0000-1000-8000-0026BB765291",
- "00000023-0000-1000-8000-0026BB765291",
- "00000028-0000-1000-8000-0026BB765291",
- "00000029-0000-1000-8000-0026BB765291",
- "000000B6-0000-1000-8000-0026BB765291"
- ],
- "RequiredCharacteristics" : [
- "000000B0-0000-1000-8000-0026BB765291"
- ],
- "Name" : "Fan v2",
- "UUID" : "000000B7-0000-1000-8000-0026BB765291"
- },
- {
- "OptionalCharacteristics" : [
- "000000AB-0000-1000-8000-0026BB765291",
- "000000AD-0000-1000-8000-0026BB765291",
- "00000023-0000-1000-8000-0026BB765291"
- ],
- "RequiredCharacteristics" : [
- "000000AC-0000-1000-8000-0026BB765291"
- ],
- "Name" : "Filter Maintenance",
- "UUID" : "000000BA-0000-1000-8000-0026BB765291"
- },
- {
- "OptionalCharacteristics" : [
- "00000023-0000-1000-8000-0026BB765291",
- "00000077-0000-1000-8000-0026BB765291"
- ],
- "RequiredCharacteristics" : [
- "000000B0-0000-1000-8000-0026BB765291"
- ],
- "Name" : "Faucet",
- "UUID" : "000000D7-0000-1000-8000-0026BB765291"
- },
- {
- "OptionalCharacteristics" : [
- "0000001D-0000-1000-8000-0026BB765291",
- "0000001E-0000-1000-8000-0026BB765291",
- "00000023-0000-1000-8000-0026BB765291"
- ],
- "RequiredCharacteristics" : [
- "0000000E-0000-1000-8000-0026BB765291",
- "00000032-0000-1000-8000-0026BB765291",
- "00000024-0000-1000-8000-0026BB765291"
- ],
- "Name" : "Garage Door Opener",
- "UUID" : "00000041-0000-1000-8000-0026BB765291"
- },
- {
- "OptionalCharacteristics" : [
- "000000A7-0000-1000-8000-0026BB765291",
- "00000023-0000-1000-8000-0026BB765291",
- "000000B6-0000-1000-8000-0026BB765291",
- "0000000D-0000-1000-8000-0026BB765291",
- "00000012-0000-1000-8000-0026BB765291",
- "00000036-0000-1000-8000-0026BB765291",
- "00000029-0000-1000-8000-0026BB765291"
- ],
- "RequiredCharacteristics" : [
- "000000B0-0000-1000-8000-0026BB765291",
- "000000B1-0000-1000-8000-0026BB765291",
- "000000B2-0000-1000-8000-0026BB765291",
- "00000011-0000-1000-8000-0026BB765291"
- ],
- "Name" : "Heater Cooler",
- "UUID" : "000000BC-0000-1000-8000-0026BB765291"
- },
- {
- "OptionalCharacteristics" : [
- "000000A7-0000-1000-8000-0026BB765291",
- "00000023-0000-1000-8000-0026BB765291",
- "000000B6-0000-1000-8000-0026BB765291",
- "000000B5-0000-1000-8000-0026BB765291",
- "000000C9-0000-1000-8000-0026BB765291",
- "000000CA-0000-1000-8000-0026BB765291",
- "00000029-0000-1000-8000-0026BB765291"
- ],
- "RequiredCharacteristics" : [
- "00000010-0000-1000-8000-0026BB765291",
- "000000B3-0000-1000-8000-0026BB765291",
- "000000B4-0000-1000-8000-0026BB765291",
- "000000B0-0000-1000-8000-0026BB765291"
- ],
- "Name" : "Humidifier Dehumidifier",
- "UUID" : "000000BD-0000-1000-8000-0026BB765291"
- },
- {
- "OptionalCharacteristics" : [
- "00000075-0000-1000-8000-0026BB765291",
- "00000077-0000-1000-8000-0026BB765291",
- "0000007A-0000-1000-8000-0026BB765291",
- "00000079-0000-1000-8000-0026BB765291",
- "00000023-0000-1000-8000-0026BB765291"
- ],
- "RequiredCharacteristics" : [
- "00000010-0000-1000-8000-0026BB765291"
- ],
- "Name" : "Humidity Sensor",
- "UUID" : "00000082-0000-1000-8000-0026BB765291"
- },
- {
- "OptionalCharacteristics" : [
- "00000023-0000-1000-8000-0026BB765291",
- "000000D4-0000-1000-8000-0026BB765291",
- "00000077-0000-1000-8000-0026BB765291"
- ],
- "RequiredCharacteristics" : [
- "000000B0-0000-1000-8000-0026BB765291",
- "000000D1-0000-1000-8000-0026BB765291",
- "000000D2-0000-1000-8000-0026BB765291"
- ],
- "Name" : "Irrigation System",
- "UUID" : "000000CF-0000-1000-8000-0026BB765291"
- },
- {
- "OptionalCharacteristics" : [
- "00000075-0000-1000-8000-0026BB765291",
- "00000077-0000-1000-8000-0026BB765291",
- "0000007A-0000-1000-8000-0026BB765291",
- "00000079-0000-1000-8000-0026BB765291",
- "00000023-0000-1000-8000-0026BB765291"
- ],
- "RequiredCharacteristics" : [
- "00000070-0000-1000-8000-0026BB765291"
- ],
- "Name" : "Leak Sensor",
- "UUID" : "00000083-0000-1000-8000-0026BB765291"
- },
- {
- "OptionalCharacteristics" : [
- "00000023-0000-1000-8000-0026BB765291",
- "00000075-0000-1000-8000-0026BB765291",
- "00000077-0000-1000-8000-0026BB765291",
- "0000007A-0000-1000-8000-0026BB765291",
- "00000079-0000-1000-8000-0026BB765291"
- ],
- "RequiredCharacteristics" : [
- "0000006B-0000-1000-8000-0026BB765291"
- ],
- "Name" : "Light Sensor",
- "UUID" : "00000084-0000-1000-8000-0026BB765291"
- },
- {
- "OptionalCharacteristics" : [
- "00000008-0000-1000-8000-0026BB765291",
- "00000013-0000-1000-8000-0026BB765291",
- "0000002F-0000-1000-8000-0026BB765291",
- "00000023-0000-1000-8000-0026BB765291"
- ],
- "RequiredCharacteristics" : [
- "00000025-0000-1000-8000-0026BB765291"
- ],
- "Name" : "Lightbulb",
- "UUID" : "00000043-0000-1000-8000-0026BB765291"
- },
- {
- "OptionalCharacteristics" : [
- "0000001F-0000-1000-8000-0026BB765291",
- "00000005-0000-1000-8000-0026BB765291",
- "0000001A-0000-1000-8000-0026BB765291",
- "00000001-0000-1000-8000-0026BB765291",
- "0000001C-0000-1000-8000-0026BB765291",
- "0000000E-0000-1000-8000-0026BB765291",
- "00000022-0000-1000-8000-0026BB765291",
- "00000023-0000-1000-8000-0026BB765291"
- ],
- "RequiredCharacteristics" : [
- "00000019-0000-1000-8000-0026BB765291",
- "00000037-0000-1000-8000-0026BB765291"
- ],
- "Name" : "Lock Management",
- "UUID" : "00000044-0000-1000-8000-0026BB765291"
- },
- {
- "OptionalCharacteristics" : [
- "00000023-0000-1000-8000-0026BB765291"
- ],
- "RequiredCharacteristics" : [
- "0000001D-0000-1000-8000-0026BB765291",
- "0000001E-0000-1000-8000-0026BB765291"
- ],
- "Name" : "Lock Mechanism",
- "UUID" : "00000045-0000-1000-8000-0026BB765291"
- },
- {
- "OptionalCharacteristics" : [
- "00000023-0000-1000-8000-0026BB765291"
- ],
- "RequiredCharacteristics" : [
- "00000119-0000-1000-8000-0026BB765291",
- "0000011A-0000-1000-8000-0026BB765291"
- ],
- "Name" : "Microphone",
- "UUID" : "00000112-0000-1000-8000-0026BB765291"
- },
- {
- "OptionalCharacteristics" : [
- "00000075-0000-1000-8000-0026BB765291",
- "00000077-0000-1000-8000-0026BB765291",
- "0000007A-0000-1000-8000-0026BB765291",
- "00000079-0000-1000-8000-0026BB765291",
- "00000023-0000-1000-8000-0026BB765291"
- ],
- "RequiredCharacteristics" : [
- "00000022-0000-1000-8000-0026BB765291"
- ],
- "Name" : "Motion Sensor",
- "UUID" : "00000085-0000-1000-8000-0026BB765291"
- },
- {
- "OptionalCharacteristics" : [
- "00000023-0000-1000-8000-0026BB765291",
- "00000075-0000-1000-8000-0026BB765291",
- "00000077-0000-1000-8000-0026BB765291",
- "0000007A-0000-1000-8000-0026BB765291",
- "00000079-0000-1000-8000-0026BB765291"
- ],
- "RequiredCharacteristics" : [
- "00000071-0000-1000-8000-0026BB765291"
- ],
- "Name" : "Occupancy Sensor",
- "UUID" : "00000086-0000-1000-8000-0026BB765291"
- },
- {
- "OptionalCharacteristics" : [
- "00000023-0000-1000-8000-0026BB765291"
- ],
- "RequiredCharacteristics" : [
- "00000025-0000-1000-8000-0026BB765291",
- "00000026-0000-1000-8000-0026BB765291"
- ],
- "Name" : "Outlet",
- "UUID" : "00000047-0000-1000-8000-0026BB765291"
- },
- {
- "OptionalCharacteristics" : [
- "00000077-0000-1000-8000-0026BB765291",
- "0000007A-0000-1000-8000-0026BB765291",
- "0000008E-0000-1000-8000-0026BB765291",
- "00000023-0000-1000-8000-0026BB765291"
- ],
- "RequiredCharacteristics" : [
- "00000066-0000-1000-8000-0026BB765291",
- "00000067-0000-1000-8000-0026BB765291"
- ],
- "Name" : "Security System",
- "UUID" : "0000007E-0000-1000-8000-0026BB765291"
- },
- {
- "OptionalCharacteristics" : [
- "00000023-0000-1000-8000-0026BB765291"
- ],
- "RequiredCharacteristics" : [
- "000000CD-0000-1000-8000-0026BB765291"
- ],
- "Name" : "Service Label",
- "UUID" : "000000CC-0000-1000-8000-0026BB765291"
- },
- {
- "OptionalCharacteristics" : [
- "00000023-0000-1000-8000-0026BB765291",
- "000000C1-0000-1000-8000-0026BB765291",
- "000000C2-0000-1000-8000-0026BB765291",
- "000000B6-0000-1000-8000-0026BB765291"
- ],
- "RequiredCharacteristics" : [
- "000000C0-0000-1000-8000-0026BB765291",
- "000000AA-0000-1000-8000-0026BB765291"
- ],
- "Name" : "Slat",
- "UUID" : "000000B9-0000-1000-8000-0026BB765291"
- },
- {
- "OptionalCharacteristics" : [
- "00000075-0000-1000-8000-0026BB765291",
- "00000077-0000-1000-8000-0026BB765291",
- "0000007A-0000-1000-8000-0026BB765291",
- "00000079-0000-1000-8000-0026BB765291",
- "00000023-0000-1000-8000-0026BB765291"
- ],
- "RequiredCharacteristics" : [
- "00000076-0000-1000-8000-0026BB765291"
- ],
- "Name" : "Smoke Sensor",
- "UUID" : "00000087-0000-1000-8000-0026BB765291"
- },
- {
- "OptionalCharacteristics" : [
- "00000023-0000-1000-8000-0026BB765291",
- "00000119-0000-1000-8000-0026BB765291"
- ],
- "RequiredCharacteristics" : [
- "0000011A-0000-1000-8000-0026BB765291"
- ],
- "Name" : "Speaker",
- "UUID" : "00000113-0000-1000-8000-0026BB765291"
- },
- {
- "OptionalCharacteristics" : [
- "00000023-0000-1000-8000-0026BB765291",
- "000000CB-0000-1000-8000-0026BB765291"
- ],
- "RequiredCharacteristics" : [
- "00000073-0000-1000-8000-0026BB765291"
- ],
- "Name" : "Stateless Programmable Switch",
- "UUID" : "00000089-0000-1000-8000-0026BB765291"
- },
- {
- "OptionalCharacteristics" : [
- "00000023-0000-1000-8000-0026BB765291"
- ],
- "RequiredCharacteristics" : [
- "00000025-0000-1000-8000-0026BB765291"
- ],
- "Name" : "Switch",
- "UUID" : "00000049-0000-1000-8000-0026BB765291"
- },
- {
- "OptionalCharacteristics" : [
- "00000075-0000-1000-8000-0026BB765291",
- "00000077-0000-1000-8000-0026BB765291",
- "00000079-0000-1000-8000-0026BB765291",
- "0000007A-0000-1000-8000-0026BB765291",
- "00000023-0000-1000-8000-0026BB765291"
- ],
- "RequiredCharacteristics" : [
- "00000011-0000-1000-8000-0026BB765291"
- ],
- "Name" : "Temperature Sensor",
- "UUID" : "0000008A-0000-1000-8000-0026BB765291"
- },
- {
- "OptionalCharacteristics" : [
- "00000010-0000-1000-8000-0026BB765291",
- "00000034-0000-1000-8000-0026BB765291",
- "0000000D-0000-1000-8000-0026BB765291",
- "00000012-0000-1000-8000-0026BB765291",
- "00000023-0000-1000-8000-0026BB765291"
- ],
- "RequiredCharacteristics" : [
- "0000000F-0000-1000-8000-0026BB765291",
- "00000033-0000-1000-8000-0026BB765291",
- "00000011-0000-1000-8000-0026BB765291",
- "00000035-0000-1000-8000-0026BB765291",
- "00000036-0000-1000-8000-0026BB765291"
- ],
- "Name" : "Thermostat",
- "UUID" : "0000004A-0000-1000-8000-0026BB765291"
- },
- {
- "OptionalCharacteristics" : [
- "000000D3-0000-1000-8000-0026BB765291",
- "000000D4-0000-1000-8000-0026BB765291",
- "000000D6-0000-1000-8000-0026BB765291",
- "000000CB-0000-1000-8000-0026BB765291",
- "00000077-0000-1000-8000-0026BB765291",
- "00000023-0000-1000-8000-0026BB765291"
- ],
- "RequiredCharacteristics" : [
- "000000B0-0000-1000-8000-0026BB765291",
- "000000D2-0000-1000-8000-0026BB765291",
- "000000D5-0000-1000-8000-0026BB765291"
- ],
- "Name" : "Valve",
- "UUID" : "000000D0-0000-1000-8000-0026BB765291"
- },
- {
- "OptionalCharacteristics" : [
- "0000006F-0000-1000-8000-0026BB765291",
- "00000024-0000-1000-8000-0026BB765291",
- "00000023-0000-1000-8000-0026BB765291"
- ],
- "RequiredCharacteristics" : [
- "0000006D-0000-1000-8000-0026BB765291",
- "0000007C-0000-1000-8000-0026BB765291",
- "00000072-0000-1000-8000-0026BB765291"
- ],
- "Name" : "Window",
- "UUID" : "0000008B-0000-1000-8000-0026BB765291"
- },
- {
- "OptionalCharacteristics" : [
- "0000006F-0000-1000-8000-0026BB765291",
- "0000007B-0000-1000-8000-0026BB765291",
- "0000007D-0000-1000-8000-0026BB765291",
- "0000006C-0000-1000-8000-0026BB765291",
- "0000006E-0000-1000-8000-0026BB765291",
- "00000024-0000-1000-8000-0026BB765291",
- "00000023-0000-1000-8000-0026BB765291"
- ],
- "RequiredCharacteristics" : [
- "0000006D-0000-1000-8000-0026BB765291",
- "0000007C-0000-1000-8000-0026BB765291",
- "00000072-0000-1000-8000-0026BB765291"
- ],
- "Name" : "Window Covering",
- "UUID" : "0000008C-0000-1000-8000-0026BB765291"
- }
- ]
+ ]
}
\ No newline at end of file
diff --git a/go.mod b/go.mod
index 1fae109c..351e1537 100644
--- a/go.mod
+++ b/go.mod
@@ -2,11 +2,12 @@ module github.com/brutella/hc
require (
github.com/agl/ed25519 v0.0.0-20170116200512-5312a6153412
- github.com/brutella/dnssd v0.0.0-20180519095852-a1eecd10aafc
+ github.com/brutella/dnssd v1.1.0
github.com/gosexy/to v0.0.0-20141221203644-c20e083e3123
- github.com/miekg/dns v1.0.15 // indirect
+ github.com/miekg/dns v1.1.4 // indirect
github.com/tadglines/go-pkgs v0.0.0-20140924210655-1f86682992f1
- golang.org/x/crypto v0.0.0-20181127143415-eb0de9b17e85
- golang.org/x/net v0.0.0-20181114220301-adae6a3d119a // indirect
- golang.org/x/sys v0.0.0-20181122145206-62eef0e2fa9b // indirect
+ golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9
+ golang.org/x/net v0.0.0-20190125091013-d26f9f9a57f3 // indirect
+ golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4 // indirect
+ golang.org/x/sys v0.0.0-20190130150945-aca44879d564 // indirect
)
diff --git a/go.sum b/go.sum
index 9bb3b003..24dc4de7 100644
--- a/go.sum
+++ b/go.sum
@@ -1,16 +1,21 @@
github.com/agl/ed25519 v0.0.0-20170116200512-5312a6153412 h1:w1UutsfOrms1J05zt7ISrnJIXKzwaspym5BTKGx93EI=
github.com/agl/ed25519 v0.0.0-20170116200512-5312a6153412/go.mod h1:WPjqKcmVOxf0XSf3YxCJs6N6AOSrOx3obionmG7T0y0=
-github.com/brutella/dnssd v0.0.0-20180519095852-a1eecd10aafc h1:gevuvoeZlOfrFb7bfKeJWjYvkRMsDPyBHojp3wVy/yk=
-github.com/brutella/dnssd v0.0.0-20180519095852-a1eecd10aafc/go.mod h1:Gm5azbpU/tmPJNH9nQrFcTBIgasziqDdNYE/8epxvjc=
+github.com/brutella/dnssd v1.1.0 h1:kJdLHbmBcYHwdmApjejMnOFxQsqfFhgH5rLPkvMy0JE=
+github.com/brutella/dnssd v1.1.0/go.mod h1:FiUea3FfCnV1wi78S9exUgWrQfkILjydmuUcX6/jbgc=
github.com/gosexy/to v0.0.0-20141221203644-c20e083e3123 h1:6Q7VB4v0aEgIE6BtsbJhEH0KgFE0f+FHAxXePQp9Klc=
github.com/gosexy/to v0.0.0-20141221203644-c20e083e3123/go.mod h1:oQuuq9ZkoRpy+2mhINlY3ZrwgywR77yPXmFpP6vCr/w=
-github.com/miekg/dns v1.0.15 h1:9+UupePBQCG6zf1q/bGmTO1vumoG13jsrbWOSX1W6Tw=
-github.com/miekg/dns v1.0.15/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg=
+github.com/miekg/dns v1.1.1/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg=
+github.com/miekg/dns v1.1.4 h1:rCMZsU2ScVSYcAsOXgmC6+AKOK+6pmQTOcw03nfwYV0=
+github.com/miekg/dns v1.1.4/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg=
github.com/tadglines/go-pkgs v0.0.0-20140924210655-1f86682992f1 h1:ms/IQpkxq+t7hWpgKqCE5KjAUQWC24mqBrnL566SWgE=
github.com/tadglines/go-pkgs v0.0.0-20140924210655-1f86682992f1/go.mod h1:roo6cZ/uqpwKMuvPG0YmzI5+AmUiMWfjCBZpGXqbTxE=
-golang.org/x/crypto v0.0.0-20181127143415-eb0de9b17e85 h1:et7+NAX3lLIk5qUCTA9QelBjGE/NkhzYw/mhnr0s7nI=
-golang.org/x/crypto v0.0.0-20181127143415-eb0de9b17e85/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
-golang.org/x/net v0.0.0-20181114220301-adae6a3d119a h1:gOpx8G595UYyvj8UK4+OFyY4rx037g3fmfhe5SasG3U=
-golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
-golang.org/x/sys v0.0.0-20181122145206-62eef0e2fa9b h1:MQE+LT/ABUuuvEZ+YQAMSXindAdUh7slEmAkup74op4=
-golang.org/x/sys v0.0.0-20181122145206-62eef0e2fa9b/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9 h1:mKdxBk7AujPs8kU4m80U72y/zjbZ3UcXC7dClwKbUI0=
+golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
+golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/net v0.0.0-20190125091013-d26f9f9a57f3 h1:ulvT7fqt0yHWzpJwI57MezWnYDVpCAYBVuYst/L+fAY=
+golang.org/x/net v0.0.0-20190125091013-d26f9f9a57f3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4 h1:YUO/7uOKsKeq9UokNS62b8FYywz3ker1l1vDZRCRefw=
+golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sys v0.0.0-20181206074257-70b957f3b65e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20190130150945-aca44879d564 h1:o6ENHFwwr1TZ9CUPQcfo1HGvLP1OPsPOTB7xCIOPNmU=
+golang.org/x/sys v0.0.0-20190130150945-aca44879d564/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
diff --git a/hap/pair/pairing_controller.go b/hap/pair/pairing_controller.go
index c4962616..d2bea8eb 100644
--- a/hap/pair/pairing_controller.go
+++ b/hap/pair/pairing_controller.go
@@ -44,12 +44,6 @@ func (c *PairingController) Handle(cont util.Container) (util.Container, error)
log.Debug.Printf("Remove LTPK for client '%s'\n", username)
c.database.DeleteEntity(entity)
case PairingMethodAdd:
- if perm != AdminPerm {
- log.Info.Println("Non-admin controllers are not allowed to add pairings")
- out.SetByte(TagErrCode, ErrCodeAuthenticationFailed.Byte())
- break
- }
-
err := c.database.SaveEntity(entity)
if err != nil {
log.Info.Panic(err)
diff --git a/hap/pair/pairing_controller_test.go b/hap/pair/pairing_controller_test.go
index aae45de5..a4c298f7 100644
--- a/hap/pair/pairing_controller_test.go
+++ b/hap/pair/pairing_controller_test.go
@@ -49,32 +49,6 @@ func TestAddPairing(t *testing.T) {
}
}
-func TestAddPairingAsNonAdmin(t *testing.T) {
- in := util.NewTLV8Container()
- in.SetByte(TagPairingMethod, PairingMethodAdd.Byte())
- in.SetByte(TagSequence, 0x01)
- in.SetString(TagUsername, "Unit Test")
- in.SetBytes(TagPublicKey, []byte{0x01, 0x02})
-
- database, _ := db.NewDatabase(os.TempDir())
- controller := NewPairingController(database)
-
- out, err := controller.Handle(in)
- if err != nil {
- t.Fatal(err)
- }
- if out == nil {
- t.Fatal("no response")
- }
- if is, want := out.GetByte(TagSequence), byte(0x2); is != want {
- t.Fatalf("is=%v want=%v", is, want)
- }
-
- if is, want := out.GetByte(TagErrCode), ErrCodeAuthenticationFailed.Byte(); is != want {
- t.Fatalf("is=%v want=%v", is, want)
- }
-}
-
func TestDeletePairing(t *testing.T) {
username := "Unit Test"
entity := db.NewEntity(username, []byte{0x01, 0x02}, nil)
diff --git a/ip_transport.go b/ip_transport.go
index 39673ed6..b625db80 100644
--- a/ip_transport.go
+++ b/ip_transport.go
@@ -5,6 +5,7 @@ import (
"context"
"io/ioutil"
"net"
+ "strings"
"sync"
_ "time"
@@ -25,7 +26,6 @@ type ipTransport struct {
context hap.Context
server http.Server
mutex *sync.Mutex
- mdns *MDNSService
storage util.Storage
database db.Database
@@ -175,7 +175,7 @@ func (t *ipTransport) Start() {
// }()
// Publish accessory ip
- log.Info.Printf("Accessory address is %s:%s\n", t.config.IP, s.Port())
+ log.Info.Printf("Listening on port %s\n", s.Port())
serverCtx, serverCancel := context.WithCancel(t.ctx)
defer serverCancel()
@@ -279,3 +279,32 @@ func (t *ipTransport) Handle(ev interface{}) {
break
}
}
+
+func newService(config *Config) dnssd.Service {
+ // 2016-03-14(brutella): Replace whitespaces (" ") from service name
+ // with underscores ("_")to fix invalid http host header field value
+ // produces by iOS.
+ //
+ // [Radar] http://openradar.appspot.com/radar?id=4931940373233664
+ stripped := strings.Replace(config.name, " ", "_", -1)
+
+ var ips []net.IP
+ if ip := net.ParseIP(config.IP); ip != nil {
+ ips = append(ips, ip)
+ }
+
+ dnsCfg := dnssd.Config{
+ Name: stripped,
+ Type: "_hap._tcp",
+ Domain: "local",
+ Text: config.txtRecords(),
+ IPs: ips,
+ Port: config.servePort,
+ }
+ service, err := dnssd.NewService(dnsCfg)
+ if err != nil {
+ log.Info.Fatal(err)
+ }
+
+ return service
+}
diff --git a/mdns.go b/mdns.go
deleted file mode 100644
index 2d556137..00000000
--- a/mdns.go
+++ /dev/null
@@ -1,89 +0,0 @@
-package hc
-
-import (
- "context"
- "github.com/brutella/dnssd"
- "github.com/brutella/hc/log"
- "net"
- "strings"
-)
-
-// MDNSService represents a mDNS service.
-type MDNSService struct {
- config *Config
- responder dnssd.Responder
- handle dnssd.ServiceHandle
-}
-
-func newService(config *Config) dnssd.Service {
- // 2016-03-14(brutella): Replace whitespaces (" ") from service name
- // with underscores ("_")to fix invalid http host header field value
- // produces by iOS.
- //
- // [Radar] http://openradar.appspot.com/radar?id=4931940373233664
- stripped := strings.Replace(config.name, " ", "_", -1)
-
- var ips []net.IP
- if ip := net.ParseIP(config.IP); ip != nil {
- ips = append(ips, ip)
- }
-
- service := dnssd.NewService(stripped, "_hap._tcp.", "local.", "", ips, config.servePort)
- service.Text = config.txtRecords()
-
- return service
-}
-
-// NewMDNSService returns a new service based for the bridge name, id and port.
-func NewMDNSService(config *Config) *MDNSService {
- // TODO handle error
- responder, _ := dnssd.NewResponder()
-
- return &MDNSService{
- config: config,
- responder: responder,
- }
-}
-
-// Publish announces the service for the machine's ip address on a random port using mDNS.
-func (s *MDNSService) Publish(ctx context.Context) error {
- // 2016-03-14(brutella): Replace whitespaces (" ") from service name
- // with underscores ("_")to fix invalid http host header field value
- // produces by iOS.
- //
- // [Radar] http://openradar.appspot.com/radar?id=4931940373233664
- stripped := strings.Replace(s.config.name, " ", "_", -1)
-
- var ips []net.IP
- if ip := net.ParseIP(s.config.IP); ip != nil {
- ips = append(ips, ip)
- }
-
- service := dnssd.NewService(stripped, "_hap._tcp.", "local.", "", ips, s.config.servePort)
- service.Text = s.config.txtRecords()
- handle, err := s.responder.Add(service)
- if err != nil {
- log.Info.Panic(err)
- }
-
- s.handle = handle
-
- return s.responder.Respond(ctx)
-}
-
-// Update updates the mDNS txt records.
-func (s *MDNSService) Update() {
- if s.handle != nil {
- txt := s.config.txtRecords()
- s.handle.UpdateText(txt, s.responder)
- log.Debug.Println(txt)
- }
-}
-
-// Stop stops the running mDNS service.
-func (s *MDNSService) Stop() {
- if s.handle != nil {
- s.responder.Remove(s.handle)
- s.handle = nil
- }
-}
diff --git a/service/README.md b/service/README.md
index b433bda9..436ea3c7 100644
--- a/service/README.md
+++ b/service/README.md
@@ -20,19 +20,19 @@
| Humidity Sensor | Current Relative Humidity
Status Active Optional
Status Fault Optional
Status Tampered Optional
Status Low Battery Optional
Name Optional | 82 |
| Irrigation System | Active
Program Mode
In Use
Name Optional
Remaining Duration Optional
Status Fault Optional | CF |
| Leak Sensor | Leak Detected
Status Active Optional
Status Fault Optional
Status Tampered Optional
Status Low Battery Optional
Name Optional | 83 |
-| Light Sensor | Current Ambient Light Level
Status Active Optional
Status Fault Optional
Status Tampered Optional
Status Low Battery Optional
Name Optional | 84 |
+| Light Sensor | Current Ambient Light Level
Name Optional
Status Active Optional
Status Fault Optional
Status Tampered Optional
Status Low Battery Optional | 84 |
| Lightbulb | On
Brightness Optional
Hue Optional
Saturation Optional
Name Optional | 43 |
| Lock Management | Lock Control Point
Version
Logs Optional
Audio Feedback Optional
Lock Management Auto Security Timeout Optional
Administrator Only Access Optional
Lock Last Known Action Optional
Current Door State Optional
Motion Detected Optional
Name Optional | 44 |
| Lock Mechanism | Lock Current State
Lock Target State
Name Optional | 45 |
-| Microphone | Mute
Volume Optional
Name Optional | 112 |
+| Microphone | Volume
Mute
Name Optional | 112 |
| Motion Sensor | Motion Detected
Status Active Optional
Status Fault Optional
Status Tampered Optional
Status Low Battery Optional
Name Optional | 85 |
-| Occupancy Sensor | Occupancy Detected
Status Active Optional
Status Fault Optional
Status Tampered Optional
Status Low Battery Optional
Name Optional | 86 |
+| Occupancy Sensor | Occupancy Detected
Name Optional
Status Active Optional
Status Fault Optional
Status Tampered Optional
Status Low Battery Optional | 86 |
| Outlet | On
Outlet In Use
Name Optional | 47 |
| Security System | Security System Current State
Security System Target State
Status Fault Optional
Status Tampered Optional
Security System Alarm Type Optional
Name Optional | 7E |
| Service Label | Service Label Namespace
Name Optional | CC |
| Slat | Slat Type
Current Slat State
Name Optional
Current Tilt Angle Optional
Target Tilt Angle Optional
Swing Mode Optional | B9 |
| Smoke Sensor | Smoke Detected
Status Active Optional
Status Fault Optional
Status Tampered Optional
Status Low Battery Optional
Name Optional | 87 |
-| Speaker | Mute
Volume Optional
Name Optional | 113 |
+| Speaker | Mute
Name Optional
Volume Optional | 113 |
| Stateless Programmable Switch | Programmable Switch Event
Name Optional
Service Label Index Optional | 89 |
| Switch | On
Name Optional | 49 |
| Temperature Sensor | Current Temperature
Status Active Optional
Status Fault Optional
Status Low Battery Optional
Status Tampered Optional
Name Optional | 8A |
@@ -40,3 +40,5 @@
| Valve | Active
In Use
Valve Type
Set Duration Optional
Remaining Duration Optional
Is Configured Optional
Service Label Index Optional
Status Fault Optional
Name Optional | D0 |
| Window | Current Position
Target Position
Position State
Hold Position Optional
Obstruction Detected Optional
Name Optional | 8B |
| Window Covering | Current Position
Target Position
Position State
Hold Position Optional
Target Horizontal Tilt Angle Optional
Target Vertical Tilt Angle Optional
Current Horizontal Tilt Angle Optional
Current Vertical Tilt Angle Optional
Obstruction Detected Optional
Name Optional | 8C |
+| Television | Active
Active Identifier
Configured Name
Sleep Discovery Mode
Brightness Optional
Closed Captions Optional
Display Order Optional
Current Media State Optional
Target Media State Optional
Picture Mode Optional
Power Mode Selection Optional
Remote Key Optional | D8 |
+| Input Source | Configured Name
Input Source Type
Is Configured
Current Visibility State
Identifier Optional
Input Device Type Optional
Target Visibility State Optional
Name Optional | D9 |
diff --git a/service/input_source.go b/service/input_source.go
new file mode 100644
index 00000000..f9a6217e
--- /dev/null
+++ b/service/input_source.go
@@ -0,0 +1,52 @@
+// THIS FILE IS AUTO-GENERATED
+package service
+
+import (
+ "github.com/brutella/hc/characteristic"
+)
+
+const TypeInputSource = "D9"
+
+type InputSource struct {
+ *Service
+
+ ConfiguredName *characteristic.ConfiguredName
+ InputSourceType *characteristic.InputSourceType
+ IsConfigured *characteristic.IsConfigured
+ CurrentVisibilityState *characteristic.CurrentVisibilityState
+ Identifier *characteristic.Identifier
+ InputDeviceType *characteristic.InputDeviceType
+ TargetVisibilityState *characteristic.TargetVisibilityState
+ Name *characteristic.Name
+}
+
+func NewInputSource() *InputSource {
+ svc := InputSource{}
+ svc.Service = New(TypeInputSource)
+
+ svc.ConfiguredName = characteristic.NewConfiguredName()
+ svc.AddCharacteristic(svc.ConfiguredName.Characteristic)
+
+ svc.InputSourceType = characteristic.NewInputSourceType()
+ svc.AddCharacteristic(svc.InputSourceType.Characteristic)
+
+ svc.IsConfigured = characteristic.NewIsConfigured()
+ svc.AddCharacteristic(svc.IsConfigured.Characteristic)
+
+ svc.CurrentVisibilityState = characteristic.NewCurrentVisibilityState()
+ svc.AddCharacteristic(svc.CurrentVisibilityState.Characteristic)
+
+ svc.Identifier = characteristic.NewIdentifier()
+ svc.AddCharacteristic(svc.Identifier.Characteristic)
+
+ svc.InputDeviceType = characteristic.NewInputDeviceType()
+ svc.AddCharacteristic(svc.InputDeviceType.Characteristic)
+
+ svc.TargetVisibilityState = characteristic.NewTargetVisibilityState()
+ svc.AddCharacteristic(svc.TargetVisibilityState.Characteristic)
+
+ svc.Name = characteristic.NewName()
+ svc.AddCharacteristic(svc.Name.Characteristic)
+
+ return &svc
+}
diff --git a/service/service.go b/service/service.go
index a2f2383c..2f49f063 100644
--- a/service/service.go
+++ b/service/service.go
@@ -9,6 +9,9 @@ type Service struct {
ID int64 `json:"iid"`
Type string `json:"type"`
Characteristics []*characteristic.Characteristic `json:"characteristics"`
+ Hidden *bool `json:"hidden,omitempty"`
+ Primary *bool `json:"primary,omitempty"`
+ Linked []int64 `json:"linked,omitempty"`
}
// New returns a new service.
@@ -16,6 +19,7 @@ func New(typ string) *Service {
s := Service{
Type: typ,
Characteristics: []*characteristic.Characteristic{},
+ Linked: []int64{},
}
return &s
@@ -40,6 +44,28 @@ func (s *Service) GetCharacteristics() []*characteristic.Characteristic {
return result
}
+func (s *Service) SetHidden(b bool) {
+ s.Hidden = &b
+}
+
+func (s *Service) IsHidden() bool {
+ if s.Hidden != nil && *s.Hidden == true {
+ return true
+ }
+ return false
+}
+
+func (s *Service) SetPrimary(b bool) {
+ s.Primary = &b
+}
+
+func (s *Service) IsPrimary() bool {
+ if s.Primary != nil && *s.Primary == true {
+ return true
+ }
+ return false
+}
+
// Equal returns true when receiver has the same characteristics, service id and service type as the argument.
func (s *Service) Equal(other interface{}) bool {
if service, ok := other.(*Service); ok == true {
@@ -64,3 +90,10 @@ func (s *Service) Equal(other interface{}) bool {
func (s *Service) AddCharacteristic(c *characteristic.Characteristic) {
s.Characteristics = append(s.Characteristics, c)
}
+
+func (s *Service) AddLinkedService(other *Service) {
+ if other.ID == 0 {
+ panic("adding a linked should be done after the server was added to an accessory")
+ }
+ s.Linked = append(s.Linked, other.ID)
+}
diff --git a/service/service_test.go b/service/service_test.go
new file mode 100644
index 00000000..259f84fc
--- /dev/null
+++ b/service/service_test.go
@@ -0,0 +1,61 @@
+package service
+
+import (
+ "encoding/json"
+ "testing"
+)
+
+func TestMinimalService(t *testing.T) {
+ s := New(TypeOutlet)
+
+ if buf, err := json.Marshal(s); err != nil {
+ t.Fatal(err)
+ } else {
+ if is, want := string(buf), "{\"iid\":0,\"type\":\"47\",\"characteristics\":[]}"; is != want {
+ t.Fatalf("%v != %v", is, want)
+ }
+ }
+}
+
+func TestPrimaryService(t *testing.T) {
+ s := New(TypeOutlet)
+ s.SetPrimary(true)
+
+ if buf, err := json.Marshal(s); err != nil {
+ t.Fatal(err)
+ } else {
+ if is, want := string(buf), "{\"iid\":0,\"type\":\"47\",\"characteristics\":[],\"primary\":true}"; is != want {
+ t.Fatalf("%v != %v", is, want)
+ }
+ }
+}
+
+func TestHiddenService(t *testing.T) {
+ s := New(TypeOutlet)
+ s.SetHidden(true)
+
+ if buf, err := json.Marshal(s); err != nil {
+ t.Fatal(err)
+ } else {
+ if is, want := string(buf), "{\"iid\":0,\"type\":\"47\",\"characteristics\":[],\"hidden\":true}"; is != want {
+ t.Fatalf("%v != %v", is, want)
+ }
+ }
+}
+
+func TestLinkedService(t *testing.T) {
+ s := New(TypeOutlet)
+ s.ID = 1
+ fan := New(TypeFan)
+ fan.ID = 2
+
+ s.AddLinkedService(fan)
+
+ if buf, err := json.Marshal(s); err != nil {
+ t.Fatal(err)
+ } else {
+ if is, want := string(buf), "{\"iid\":1,\"type\":\"47\",\"characteristics\":[],\"linked\":[2]}"; is != want {
+ t.Fatalf("%v != %v", is, want)
+ }
+ }
+}
diff --git a/service/television.go b/service/television.go
new file mode 100644
index 00000000..0e158265
--- /dev/null
+++ b/service/television.go
@@ -0,0 +1,68 @@
+// THIS FILE IS AUTO-GENERATED
+package service
+
+import (
+ "github.com/brutella/hc/characteristic"
+)
+
+const TypeTelevision = "D8"
+
+type Television struct {
+ *Service
+
+ Active *characteristic.Active
+ ActiveIdentifier *characteristic.ActiveIdentifier
+ ConfiguredName *characteristic.ConfiguredName
+ SleepDiscoveryMode *characteristic.SleepDiscoveryMode
+ Brightness *characteristic.Brightness
+ ClosedCaptions *characteristic.ClosedCaptions
+ DisplayOrder *characteristic.DisplayOrder
+ CurrentMediaState *characteristic.CurrentMediaState
+ TargetMediaState *characteristic.TargetMediaState
+ PictureMode *characteristic.PictureMode
+ PowerModeSelection *characteristic.PowerModeSelection
+ RemoteKey *characteristic.RemoteKey
+}
+
+func NewTelevision() *Television {
+ svc := Television{}
+ svc.Service = New(TypeTelevision)
+
+ svc.Active = characteristic.NewActive()
+ svc.AddCharacteristic(svc.Active.Characteristic)
+
+ svc.ActiveIdentifier = characteristic.NewActiveIdentifier()
+ svc.AddCharacteristic(svc.ActiveIdentifier.Characteristic)
+
+ svc.ConfiguredName = characteristic.NewConfiguredName()
+ svc.AddCharacteristic(svc.ConfiguredName.Characteristic)
+
+ svc.SleepDiscoveryMode = characteristic.NewSleepDiscoveryMode()
+ svc.AddCharacteristic(svc.SleepDiscoveryMode.Characteristic)
+
+ svc.Brightness = characteristic.NewBrightness()
+ svc.AddCharacteristic(svc.Brightness.Characteristic)
+
+ svc.ClosedCaptions = characteristic.NewClosedCaptions()
+ svc.AddCharacteristic(svc.ClosedCaptions.Characteristic)
+
+ svc.DisplayOrder = characteristic.NewDisplayOrder()
+ svc.AddCharacteristic(svc.DisplayOrder.Characteristic)
+
+ svc.CurrentMediaState = characteristic.NewCurrentMediaState()
+ svc.AddCharacteristic(svc.CurrentMediaState.Characteristic)
+
+ svc.TargetMediaState = characteristic.NewTargetMediaState()
+ svc.AddCharacteristic(svc.TargetMediaState.Characteristic)
+
+ svc.PictureMode = characteristic.NewPictureMode()
+ svc.AddCharacteristic(svc.PictureMode.Characteristic)
+
+ svc.PowerModeSelection = characteristic.NewPowerModeSelection()
+ svc.AddCharacteristic(svc.PowerModeSelection.Characteristic)
+
+ svc.RemoteKey = characteristic.NewRemoteKey()
+ svc.AddCharacteristic(svc.RemoteKey.Characteristic)
+
+ return &svc
+}
diff --git a/transport.go b/transport.go
index fe08fa74..f55265a3 100644
--- a/transport.go
+++ b/transport.go
@@ -1,7 +1,5 @@
package hc
-import ()
-
// Transport provides accessories over a network.
type Transport interface {
// Start starts the transport