Skip to content
GitLab
Explore
Sign in
Primary navigation
Search or go to…
Project
Q
q
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
Container Registry
Model registry
Operate
Environments
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
Jens Nolte
q
Commits
56d26b65
Commit
56d26b65
authored
3 years ago
by
Jens Nolte
Browse files
Options
Downloads
Patches
Plain Diff
Split zigbee2mqtt and mqtt module
parent
ad23a6c8
No related branches found
Branches containing commit
No related tags found
No related merge requests found
Changes
3
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
src/Q/Home.hs
+1
-0
1 addition, 0 deletions
src/Q/Home.hs
src/Q/Mqtt.hs
+8
-58
8 additions, 58 deletions
src/Q/Mqtt.hs
src/Q/Mqtt/Zigbee2Mqtt.hs
+67
-0
67 additions, 0 deletions
src/Q/Mqtt/Zigbee2Mqtt.hs
with
76 additions
and
58 deletions
src/Q/Home.hs
+
1
−
0
View file @
56d26b65
...
...
@@ -10,6 +10,7 @@ import Data.ByteString.Lazy qualified as BSL
import
Data.HashMap.Strict
qualified
as
HM
import
Data.Text
import
Q.Mqtt
import
Q.Mqtt.Zigbee2Mqtt
import
Quasar
import
Quasar.Prelude
import
Network.MQTT.Client
...
...
This diff is collapsed.
Click to expand it.
src/Q/Mqtt.hs
+
8
−
58
View file @
56d26b65
module
Q.Mqtt
(
Mqtt
,
Mqtt
(
Mqtt
,
mqttClient
)
,
connectMqtt
,
subscribeCallback
,
subscribeJson
,
IkeaDimmerCallbacks
(
..
),
ikeaDimmerCallbacks
,
subscribeIkeaDimmer
,
setHueState
,
)
where
import
Control.Concurrent.STM
...
...
@@ -26,7 +20,7 @@ import Network.MQTT.Topic
import
Network.URI
data
Mqtt
=
Mqtt
{
c
lient
::
MQTTClient
,
mqttC
lient
::
MQTTClient
,
callbacks
::
TVar
[
Callback
],
awaitable
::
Awaitable
()
}
...
...
@@ -41,24 +35,22 @@ data Callback = Callback {
type
JsonCallback
=
forall
a
.
FromJSON
a
=>
Mqtt
->
Topic
->
a
->
[
Property
]
->
IO
()
zigbee2mqtt
::
Text
->
Topic
zigbee2mqtt
name
=
"zigbee2mqtt/"
<>
name
connectMqtt
::
String
->
Topic
->
IO
Mqtt
connectMqtt
mqttUri
statusTopic
=
mfix
\
handle
->
do
uri
<-
case
parseURI
mqttUri
of
Just
uri
->
pure
uri
Nothing
->
fail
"Invalid URI"
c
lient
<-
connectURI
(
config
handle
statusTopic
)
uri
mqttC
lient
<-
connectURI
(
config
handle
statusTopic
)
uri
callbacks
<-
newTVarIO
[]
publish
c
lient
statusTopic
"online"
True
publish
mqttC
lient
statusTopic
"online"
True
awaitable
<-
toAwaitable
<$>
unmanagedAsync
(
waitForClient
c
lient
)
awaitable
<-
toAwaitable
<$>
unmanagedAsync
(
waitForClient
mqttC
lient
)
pure
Mqtt
{
c
lient
,
mqttC
lient
,
callbacks
,
awaitable
}
...
...
@@ -92,9 +84,9 @@ subscribeSingle client switchTopic = do
subscribeCallback
::
Mqtt
->
Filter
->
CallbackFn
->
IO
()
subscribeCallback
Mqtt
{
c
lient
,
callbacks
}
topicFilter
fn
=
do
subscribeCallback
Mqtt
{
mqttC
lient
,
callbacks
}
topicFilter
fn
=
do
atomically
$
modifyTVar
callbacks
(
newCallback
:
)
subscribeSingle
c
lient
topicFilter
subscribeSingle
mqttC
lient
topicFilter
where
newCallback
=
Callback
{
topicFilter
,
...
...
@@ -110,45 +102,3 @@ subscribeJson handle topicFilter fn = do
case
eitherDecode
msg
of
Left
err
->
traceIO
$
mconcat
[
"Failed to decode json message on topic "
,
show
topic
,
": "
,
err
]
Right
json
->
fn
handle'
topic
json
props
data
IkeaDimmerCallbacks
=
IkeaDimmerCallbacks
{
on
::
IO
()
,
off
::
IO
()
,
onLongPress
::
IO
()
,
offLongPress
::
IO
()
,
endLongPress
::
IO
()
}
ikeaDimmerCallbacks
::
IkeaDimmerCallbacks
ikeaDimmerCallbacks
=
IkeaDimmerCallbacks
{
on
=
pure
()
,
off
=
pure
()
,
onLongPress
=
pure
()
,
offLongPress
=
pure
()
,
endLongPress
=
pure
()
}
subscribeIkeaDimmer
::
Mqtt
->
Text
->
IkeaDimmerCallbacks
->
IO
()
subscribeIkeaDimmer
handle
switchName
callbacks
=
do
subscribeJson
handle
(
zigbee2mqtt
switchName
)
cb
where
cb
::
Mqtt
->
Topic
->
Object
->
[
Property
]
->
IO
()
cb
_
_
event
_
=
case
HM
.
lookup
"action"
event
of
Just
(
String
"on"
)
->
on
callbacks
Just
(
String
"off"
)
->
off
callbacks
Just
(
String
"brightness_move_up"
)
->
onLongPress
callbacks
Just
(
String
"brightness_move_down"
)
->
offLongPress
callbacks
Just
(
String
"brightness_stop"
)
->
endLongPress
callbacks
Just
(
String
action
)
->
traceIO
$
"Unknown switch .action: "
<>
show
action
Just
action
->
traceIO
$
"Switch event .action should be a string but is "
<>
show
action
Nothing
->
traceIO
"Switch event has no .action key"
setHueState
::
Mqtt
->
Topic
->
Bool
->
IO
()
setHueState
Mqtt
{
client
}
hueTopic
state
=
publish
client
(
hueTopic
<>
"/set"
)
(
stateMessage
state
)
False
where
stateMessage
::
Bool
->
BSL
.
ByteString
stateMessage
False
=
"{
\"
state
\"
:
\"
off
\"
}"
stateMessage
True
=
"{
\"
state
\"
:
\"
on
\"
}"
This diff is collapsed.
Click to expand it.
src/Q/Mqtt/Zigbee2Mqtt.hs
0 → 100644
+
67
−
0
View file @
56d26b65
module
Q.Mqtt.Zigbee2Mqtt
(
IkeaDimmerCallbacks
(
..
),
ikeaDimmerCallbacks
,
subscribeIkeaDimmer
,
setHueState
,
)
where
import
Control.Concurrent.STM
import
Data.Aeson
import
Data.ByteString
(
ByteString
)
import
Data.ByteString
qualified
as
BS
import
Data.ByteString.Lazy
qualified
as
BSL
import
Data.HashMap.Strict
qualified
as
HM
import
Data.Text
import
Q.Mqtt
import
Quasar
import
Quasar.Async.Unmanaged
import
Quasar.Prelude
import
Network.MQTT.Client
as
MQTT
import
Network.MQTT.Topic
import
Network.URI
zigbee2mqtt
::
Text
->
Topic
zigbee2mqtt
name
=
"zigbee2mqtt/"
<>
name
data
IkeaDimmerCallbacks
=
IkeaDimmerCallbacks
{
on
::
IO
()
,
off
::
IO
()
,
onLongPress
::
IO
()
,
offLongPress
::
IO
()
,
endLongPress
::
IO
()
}
ikeaDimmerCallbacks
::
IkeaDimmerCallbacks
ikeaDimmerCallbacks
=
IkeaDimmerCallbacks
{
on
=
pure
()
,
off
=
pure
()
,
onLongPress
=
pure
()
,
offLongPress
=
pure
()
,
endLongPress
=
pure
()
}
subscribeIkeaDimmer
::
Mqtt
->
Text
->
IkeaDimmerCallbacks
->
IO
()
subscribeIkeaDimmer
handle
switchName
callbacks
=
do
subscribeJson
handle
(
zigbee2mqtt
switchName
)
cb
where
cb
::
Mqtt
->
Topic
->
Object
->
[
Property
]
->
IO
()
cb
_
_
event
_
=
case
HM
.
lookup
"action"
event
of
Just
(
String
"on"
)
->
on
callbacks
Just
(
String
"off"
)
->
off
callbacks
Just
(
String
"brightness_move_up"
)
->
onLongPress
callbacks
Just
(
String
"brightness_move_down"
)
->
offLongPress
callbacks
Just
(
String
"brightness_stop"
)
->
endLongPress
callbacks
Just
(
String
action
)
->
traceIO
$
"Unknown switch .action: "
<>
show
action
Just
action
->
traceIO
$
"Switch event .action should be a string but is "
<>
show
action
Nothing
->
traceIO
"Switch event has no .action key"
setHueState
::
Mqtt
->
Topic
->
Bool
->
IO
()
setHueState
Mqtt
{
mqttClient
}
hueTopic
state
=
publish
mqttClient
(
hueTopic
<>
"/set"
)
(
stateMessage
state
)
False
where
stateMessage
::
Bool
->
BSL
.
ByteString
stateMessage
False
=
"{
\"
state
\"
:
\"
off
\"
}"
stateMessage
True
=
"{
\"
state
\"
:
\"
on
\"
}"
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