Add support for dimmers and dimmable bulbs

The exposes entry looks similar to a switch, except the type is a
"light" and it has `state` and `brightness`. Tested only on single
channel dimmers.

Also added a PercentageTranslator to translate between the HomeKit
`brightness`, which is a percentage, to/from an arbitrary numeric value
in Z2M.
This commit is contained in:
Darell Tan
2023-06-25 02:20:01 +08:00
parent 7fbbec79d9
commit c61da984c9
3 changed files with 98 additions and 0 deletions

50
s_light.go Normal file
View File

@@ -0,0 +1,50 @@
package hapz2m
import (
"github.com/brutella/hap/accessory"
"github.com/brutella/hap/characteristic"
"github.com/brutella/hap/service"
)
func createLightServices(dev *Device) (byte, []*service.S, []*ExposeMapping, error) {
var svcs []*service.S
var exposes []*ExposeMapping
for _, exp := range dev.Definition.Exposes {
if exp.Ignored() {
continue
}
switch {
case exp.Type == "light" && len(exp.Features) > 0:
exp := exp // create a copy
light := service.NewLightbulb()
for _, feat := range exp.Features {
if !feat.IsStateSetGet() {
continue
}
feat := feat
switch {
case feat.Name == "state" && feat.Type == "binary":
svcs = append(svcs, light.S)
exposes = append(exposes, &ExposeMapping{&feat, light.On.C, nil})
case feat.Name == "brightness" && feat.Type == "numeric":
brightness := characteristic.NewBrightness()
light.AddC(brightness.C)
exposes = append(exposes, &ExposeMapping{&feat, brightness.C, nil})
}
}
}
}
return accessory.TypeLightbulb, svcs, exposes, nil
}
func init() {
RegisterCreateServiceHandler(createLightServices)
}