From 7fbbec79d980e3b1d170b1388646815f86763da8 Mon Sep 17 00:00:00 2001 From: Darell Tan Date: Fri, 16 Jun 2023 23:08:09 +0800 Subject: [PATCH] Add support for motion sensors There doesn't seem to be any distinction in Z2M between occupancy and motion sensors, but HomeKit has separate types. Most of the sensors are PIR, so they are technically motion sensors instead of occupancy sensors. There are of course _real_ occupancy sensors like mmWave, but we'll deal with those when we get there. --- README.md | 1 + s_motion_sensor.go | 36 ++++++++++++++++++++++++++++++++++++ 2 files changed, 37 insertions(+) create mode 100644 s_motion_sensor.go diff --git a/README.md b/README.md index c955242..9f6c85d 100644 --- a/README.md +++ b/README.md @@ -13,6 +13,7 @@ Currently only supports the types of Zigbee devices I have: - Climate sensors (temp, humidity) - Contact sensors +- Motion sensors - Wall switch If you do use this software, note that it's in development and may contains bugs, diff --git a/s_motion_sensor.go b/s_motion_sensor.go new file mode 100644 index 0000000..47ad4cf --- /dev/null +++ b/s_motion_sensor.go @@ -0,0 +1,36 @@ +package hapz2m + +import ( + "github.com/brutella/hap/accessory" + "github.com/brutella/hap/service" +) + +// there isn't a distinction between motion and occupancy sensors in z2m, +// but most sensors are PIR, so they are technically motion sensors + +func createMotionServices(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 == "binary" && exp.Name == "occupancy": + exp := exp // create a copy + + s := service.NewMotionSensor() + + svcs = append(svcs, s.S) + exposes = append(exposes, &ExposeMapping{&exp, s.MotionDetected.C, nil}) + } + } + + return accessory.TypeSensor, svcs, exposes, nil +} + +func init() { + RegisterCreateServiceHandler(createMotionServices) +}