Skip to content
GitLab
Explore
Sign in
Primary navigation
Search or go to…
Project
Z
z2m
Manage
Activity
Members
Labels
Plan
Issues
Issue boards
Milestones
Wiki
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Snippets
Build
Pipelines
Jobs
Pipeline schedules
Artifacts
Deploy
Releases
Package registry
Container registry
Model registry
Operate
Environments
Terraform modules
Monitor
Incidents
Analyze
Value stream analytics
Contributor analytics
CI/CD analytics
Repository analytics
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
Community forum
Contribute to GitLab
Provide feedback
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
xAAL
Code
Go
z2m
Commits
e0da20bd
Commit
e0da20bd
authored
5 months ago
by
KERDREUX Jerome
Browse files
Options
Downloads
Patches
Plain Diff
Refactoring in progress
- UperCasing name .. not really sure. - Support for log_level in config file
parent
472018ea
No related branches found
No related tags found
No related merge requests found
Changes
5
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
config.go
+13
-3
13 additions, 3 deletions
config.go
gateway.go
+19
-19
19 additions, 19 deletions
gateway.go
main.go
+2
-2
2 additions, 2 deletions
main.go
mqtt.go
+5
-5
5 additions, 5 deletions
mqtt.go
z2m.go
+6
-6
6 additions, 6 deletions
z2m.go
with
45 additions
and
35 deletions
config.go
+
13
−
3
View file @
e0da20bd
...
...
@@ -2,6 +2,7 @@ package main
import
(
"fmt"
"log/slog"
"gitlab.imt-atlantique.fr/xaal/code/go/core/uuid"
"gitlab.imt-atlantique.fr/xaal/code/go/core/xaal"
...
...
@@ -25,7 +26,7 @@ var (
type
Config
struct
{
brokerHost
string
topic
string
logLevel
s
tring
logLevel
s
log
.
Level
ignoredTopics
[]
string
brokerPort
int
baseAddr
uuid
.
UUID
...
...
@@ -33,7 +34,7 @@ type Config struct {
func
parseConfig
()
(
*
Config
,
error
)
{
// Default configuration
config
:=
Config
{
brokerHost
:
"mqtt"
,
topic
:
"zigbee2mqtt"
,
logLevel
:
"INFO"
,
brokerPort
:
1883
}
config
:=
Config
{
brokerHost
:
"mqtt"
,
topic
:
"zigbee2mqtt"
,
logLevel
:
slog
.
LevelError
,
brokerPort
:
1883
}
// Parse the configuration file
cfg
,
err
:=
ini
.
Load
(
xaal
.
GetConfigDir
()
+
"/z2m.ini"
)
if
err
!=
nil
{
...
...
@@ -56,7 +57,16 @@ func parseConfig() (*Config, error) {
// log level
level
,
err
:=
sec
.
GetKey
(
"log_level"
)
if
err
==
nil
{
config
.
logLevel
=
level
.
String
()
switch
level
.
String
()
{
case
"DEBUG"
:
config
.
logLevel
=
slog
.
LevelDebug
case
"INFO"
:
config
.
logLevel
=
slog
.
LevelInfo
case
"WARN"
:
config
.
logLevel
=
slog
.
LevelWarn
default
:
config
.
logLevel
=
slog
.
LevelError
}
}
// port
port
,
err
:=
sec
.
GetKey
(
"port"
)
...
...
This diff is collapsed.
Click to expand it.
gateway.go
+
19
−
19
View file @
e0da20bd
...
...
@@ -5,59 +5,59 @@ import (
"log/slog"
"slices"
MQTT
"github.com/eclipse/paho.mqtt.golang"
mqtt
"github.com/eclipse/paho.mqtt.golang"
"gitlab.imt-atlantique.fr/xaal/code/go/core/xaal"
)
type
Gateway
struct
{
c
lient
MQTT
.
Client
e
ngine
*
xaal
.
Engine
d
evices
map
[
string
]
*
Z2MDevice
c
onfig
*
Config
C
lient
mqtt
.
Client
E
ngine
*
xaal
.
Engine
D
evices
map
[
string
]
*
Z2MDevice
C
onfig
*
Config
}
func
NewGW
(
cfg
*
Config
,
eng
*
xaal
.
Engine
)
*
Gateway
{
gw
:=
&
Gateway
{
d
evices
:
make
(
map
[
string
]
*
Z2MDevice
)}
gw
.
c
onfig
=
cfg
gw
.
c
lient
=
mqttSetup
(
cfg
,
gw
.
mqttPublishHander
)
gw
:=
&
Gateway
{
D
evices
:
make
(
map
[
string
]
*
Z2MDevice
)}
gw
.
C
onfig
=
cfg
gw
.
C
lient
=
mqttSetup
(
cfg
,
gw
.
mqttPublishHander
)
// NOTE: Wondering if we can setup engine before
gw
.
e
ngine
=
eng
gw
.
E
ngine
=
eng
return
gw
}
func
(
gw
*
Gateway
)
GetZDevice
(
name
string
)
*
Z2MDevice
{
return
gw
.
d
evices
[
name
]
return
gw
.
D
evices
[
name
]
}
func
(
gw
*
Gateway
)
AddZDevice
(
zDev
*
Z2MDevice
)
{
gw
.
d
evices
[
zDev
.
FriendlyName
]
=
zDev
gw
.
D
evices
[
zDev
.
FriendlyName
]
=
zDev
zDev
.
Gateway
=
gw
}
func
(
gw
*
Gateway
)
RemoveZDevice
(
zDev
*
Z2MDevice
)
{
zDev
.
Gateway
=
nil
delete
(
gw
.
d
evices
,
zDev
.
FriendlyName
)
delete
(
gw
.
D
evices
,
zDev
.
FriendlyName
)
}
func
(
gw
*
Gateway
)
GetZDevices
()
map
[
string
]
*
Z2MDevice
{
return
gw
.
d
evices
return
gw
.
D
evices
}
func
(
gw
*
Gateway
)
GetZDeviceByTopic
(
topic
string
)
*
Z2MDevice
{
name
:=
topic
[
len
(
gw
.
c
onfig
.
topic
+
"/"
)
:
]
name
:=
topic
[
len
(
gw
.
C
onfig
.
topic
+
"/"
)
:
]
return
gw
.
GetZDevice
(
name
)
}
// mqttPublishHander handles all incoming MQTT messages
// If the topic is /bridge/devices it will parse the json and create new devices
// Else it will find the device with the topic and call the mqttDeviceHandler
func
(
gw
*
Gateway
)
mqttPublishHander
(
client
MQTT
.
Client
,
msg
MQTT
.
Message
)
{
func
(
gw
*
Gateway
)
mqttPublishHander
(
client
mqtt
.
Client
,
msg
mqtt
.
Message
)
{
// we ignore some topics
if
slices
.
Contains
(
gw
.
c
onfig
.
ignoredTopics
,
msg
.
Topic
())
{
if
slices
.
Contains
(
gw
.
C
onfig
.
ignoredTopics
,
msg
.
Topic
())
{
return
}
// Is it devices definitions ?
if
msg
.
Topic
()
==
gw
.
c
onfig
.
topic
+
"/bridge/devices"
{
if
msg
.
Topic
()
==
gw
.
C
onfig
.
topic
+
"/bridge/devices"
{
gw
.
jsonParseDevices
(
msg
)
}
else
{
zDev
:=
gw
.
GetZDeviceByTopic
(
msg
.
Topic
())
...
...
@@ -70,7 +70,7 @@ func (gw *Gateway) mqttPublishHander(client MQTT.Client, msg MQTT.Message) {
// jsonParseDevices parses the bridge/devices json and creates new xAAL devices
// if they don't exist
func
(
gw
*
Gateway
)
jsonParseDevices
(
msg
MQTT
.
Message
)
{
func
(
gw
*
Gateway
)
jsonParseDevices
(
msg
mqtt
.
Message
)
{
var
devices
[]
Z2MDevice
err
:=
json
.
Unmarshal
(
msg
.
Payload
(),
&
devices
)
if
err
!=
nil
{
...
...
@@ -82,7 +82,7 @@ func (gw *Gateway) jsonParseDevices(msg MQTT.Message) {
if
known
!=
nil
{
continue
}
zDev
.
d
ump
()
zDev
.
D
ump
()
zDev
.
setupXAALDevices
(
gw
)
gw
.
AddZDevice
(
&
zDev
)
zDev
.
Sync
()
...
...
This diff is collapsed.
Click to expand it.
main.go
+
2
−
2
View file @
e0da20bd
...
...
@@ -14,13 +14,13 @@ func main() {
}
// start xAAL stack
xaal
.
SetupLogger
()
xaal
.
SetupLogger
(
cfg
.
logLevel
)
eng
:=
xaal
.
NewEngine
()
// start the gateway
gw
:=
NewGW
(
cfg
,
eng
)
// start the xAAL engine
eng
.
Run
()
// Engine stops, disconnect MQTT
gw
.
c
lient
.
Disconnect
(
250
)
gw
.
C
lient
.
Disconnect
(
250
)
slog
.
Debug
(
"MQTT disconnected"
)
}
This diff is collapsed.
Click to expand it.
mqtt.go
+
5
−
5
View file @
e0da20bd
...
...
@@ -6,19 +6,19 @@ import (
"log/slog"
"sort"
MQTT
"github.com/eclipse/paho.mqtt.golang"
mqtt
"github.com/eclipse/paho.mqtt.golang"
"github.com/jedib0t/go-pretty/v6/table"
)
// mqttSetup creates a new MQTT client
func
mqttSetup
(
cfg
*
Config
,
publishHandler
MQTT
.
MessageHandler
)
MQTT
.
Client
{
func
mqttSetup
(
cfg
*
Config
,
publishHandler
mqtt
.
MessageHandler
)
mqtt
.
Client
{
// This JS style of creating a client is awfully verbose
opts
:=
MQTT
.
NewClientOptions
()
.
opts
:=
mqtt
.
NewClientOptions
()
.
AddBroker
(
fmt
.
Sprintf
(
"tcp://%s:%d"
,
cfg
.
brokerHost
,
cfg
.
brokerPort
))
.
SetClientID
(
mqttClientID
)
.
SetDefaultPublishHandler
(
publishHandler
)
.
SetAutoReconnect
(
true
)
client
:=
MQTT
.
NewClient
(
opts
)
client
:=
mqtt
.
NewClient
(
opts
)
if
token
:=
client
.
Connect
();
token
.
Wait
()
&&
token
.
Error
()
!=
nil
{
panic
(
token
.
Error
())
}
...
...
@@ -30,7 +30,7 @@ func mqttSetup(cfg *Config, publishHandler MQTT.MessageHandler) MQTT.Client {
}
// mqttDumpMsg displays the MQTT message
func
mqttDumpMsg
(
msg
MQTT
.
Message
)
{
func
mqttDumpMsg
(
msg
mqtt
.
Message
)
{
var
data
map
[
string
]
interface
{}
err
:=
json
.
Unmarshal
(
msg
.
Payload
(),
&
data
)
if
err
!=
nil
{
...
...
This diff is collapsed.
Click to expand it.
z2m.go
+
6
−
6
View file @
e0da20bd
...
...
@@ -6,7 +6,7 @@ import (
"log/slog"
"strings"
MQTT
"github.com/eclipse/paho.mqtt.golang"
mqtt
"github.com/eclipse/paho.mqtt.golang"
"github.com/jedib0t/go-pretty/v6/table"
"gitlab.imt-atlantique.fr/xaal/code/go/core/uuid"
)
...
...
@@ -75,7 +75,7 @@ func (zDev *Z2MDevice) GetExpose(name string) *Expose {
}
// updates the xAAL device with the MQTT message
func
(
zDev
*
Z2MDevice
)
HandleMessage
(
msg
MQTT
.
Message
)
{
func
(
zDev
*
Z2MDevice
)
HandleMessage
(
msg
mqtt
.
Message
)
{
var
data
map
[
string
]
interface
{}
err
:=
json
.
Unmarshal
(
msg
.
Payload
(),
&
data
)
if
err
!=
nil
{
...
...
@@ -91,7 +91,7 @@ func (zDev *Z2MDevice) HandleMessage(msg MQTT.Message) {
// creates new xAAL devices from a bridge device
func
(
zDev
*
Z2MDevice
)
setupXAALDevices
(
gw
*
Gateway
)
{
// TODO: Handle errors
baseAddr
:=
gw
.
c
onfig
.
baseAddr
baseAddr
:=
gw
.
C
onfig
.
baseAddr
ieeeAddr
,
_
:=
hexStringToInteger
(
zDev
.
IeeeAddress
)
baseAddr
,
_
=
baseAddr
.
Add
(
int64
(
ieeeAddr
))
...
...
@@ -125,7 +125,7 @@ func (zDev *Z2MDevice) setupXAALDevices(gw *Gateway) {
zDev
.
XAALDevices
=
append
(
zDev
.
XAALDevices
,
dev
)
xaalDev
:=
dev
.
getXAALDevice
()
xaalDev
.
GroupID
=
grpAdd
gw
.
e
ngine
.
AddDevice
(
xaalDev
)
gw
.
E
ngine
.
AddDevice
(
xaalDev
)
}
}
}
...
...
@@ -138,7 +138,7 @@ func (zDev *Z2MDevice) setupXAALDevices(gw *Gateway) {
func
(
zDev
*
Z2MDevice
)
Publish
(
topic
string
,
payload
interface
{})
{
topic
=
zDev
.
getTopic
()
+
"/"
+
topic
slog
.
Debug
(
"Sending"
,
"topic"
,
topic
,
"payload"
,
payload
)
client
:=
zDev
.
Gateway
.
c
lient
client
:=
zDev
.
Gateway
.
C
lient
if
token
:=
client
.
Publish
(
topic
,
0
,
false
,
payload
);
token
.
Wait
()
&&
token
.
Error
()
!=
nil
{
slog
.
Error
(
"PUBLISH Error"
,
":"
,
token
.
Error
())
}
...
...
@@ -161,7 +161,7 @@ func (zDev *Z2MDevice) Sync() {
zDev
.
Publish
(
"dump"
,
"{}"
)
}
func
(
zDev
*
Z2MDevice
)
d
ump
()
{
func
(
zDev
*
Z2MDevice
)
D
ump
()
{
tab
:=
table
.
NewWriter
()
tab
.
SetTitle
(
"Def:"
+
zDev
.
FriendlyName
)
tab
.
SetStyle
(
table
.
StyleRounded
)
...
...
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment