Skip to content
Snippets Groups Projects
Commit 95906a00 authored by KERDREUX Jerome's avatar KERDREUX Jerome
Browse files

Added support for switch ;) It works as expected

parent 7bf106af
Branches
Tags
No related merge requests found
......@@ -29,12 +29,9 @@ func newDevices(gw *Gateway, zDev *Z2MDevice) {
if createFunc, ok := deviceMap[expose.Name]; ok {
createFunc(addr, zDev)
} else if expose.Type == "switch" {
NewPowerRelay(addr, zDev)
}
// else if expose.Type == "switch" {
// // I don't know why but some devices have a switch type
// // but name
// dev = schemas.NewPowerrelay(addr)
// }
// if dev != nil {
// zDev.XAALDevice = append(zDev.XAALDevice, dev)
......
......@@ -3,6 +3,7 @@ package main
import (
"sync"
MQTT "github.com/eclipse/paho.mqtt.golang"
"gitlab.imt-atlantique.fr/xaal/code/go/core/uuid"
"gitlab.imt-atlantique.fr/xaal/code/go/core/xaal"
)
......@@ -11,6 +12,7 @@ type Gateway struct {
engine *xaal.Engine
devices map[string]*Z2MDevice
baseAddr uuid.UUID
client MQTT.Client
}
var (
......@@ -26,8 +28,10 @@ func GetGW() *Gateway {
return instance
}
func NewGW() *Gateway {
return GetGW()
func NewGW(client MQTT.Client) *Gateway {
gw := GetGW()
gw.client = client
return gw
}
func (gw *Gateway) GetZDevice(name string) *Z2MDevice {
......
......@@ -22,7 +22,7 @@ func main() {
// client.Publish("zigbee2mqtt/0x70b3d52b600f89d3/set", 0, false, `{"state": "toggle"}`)
eng := xaal.NewEngine()
gw := NewGW()
gw := NewGW(client)
gw.engine = eng
eng.Run()
client.Disconnect(250)
......
......@@ -32,6 +32,11 @@ type Battery struct {
XAALDevice
}
type PowerRelay struct {
XAALDevice
Z2MDevice
}
type XAALDeviceInterface interface {
update(map[string]interface{})
}
......@@ -51,6 +56,7 @@ func (dev *XAALDevice) setup(zDev *Z2MDevice) {
func NewContact(addr uuid.UUID, zDev *Z2MDevice) {
dev := &Contact{XAALDevice{schemas.NewContact(addr)}}
dev.setup(zDev)
// TODO: put this in Z2MDevice
zDev.XAALDevices = append(zDev.XAALDevices, dev)
}
......@@ -115,3 +121,47 @@ func (dev *Battery) update(payload map[string]interface{}) {
value := payload["battery"].(float64)
dev.GetAttribute("level").SetValue(value)
}
// ----------------------------------------------------------------------------
// PowerRelay
// ----------------------------------------------------------------------------
func NewPowerRelay(addr uuid.UUID, zDev *Z2MDevice) {
dev := &PowerRelay{XAALDevice{schemas.NewPowerrelayToggle(addr)}, *zDev}
dev.SetMethod("turn_on", dev.On)
dev.SetMethod("turn_off", dev.Off)
dev.SetMethod("toggle", dev.Toggle)
dev.setup(zDev)
zDev.XAALDevices = append(zDev.XAALDevices, dev)
}
func (dev *PowerRelay) update(payload map[string]interface{}) {
value := payload["state"].(string)
if value == "ON" {
dev.GetAttribute("power").SetValue(true)
} else {
dev.GetAttribute("power").SetValue(false)
}
}
func (dev *PowerRelay) setState(value string) {
// TODO: put this in Z2MDevice
topic := dev.Z2MDevice.SetTopic()
client := GetGW().client
body := `{"state": "` + value + `"}`
client.Publish(topic, 0, false, body)
}
func (dev *PowerRelay) On(xaal.MessageBody) *xaal.MessageBody {
dev.setState("ON")
return nil
}
func (dev *PowerRelay) Off(xaal.MessageBody) *xaal.MessageBody {
dev.setState("OFF")
return nil
}
func (dev *PowerRelay) Toggle(xaal.MessageBody) *xaal.MessageBody {
dev.setState("TOGGLE")
return nil
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment