2019-01-10 18:35:05 +00:00
<!DOCTYPE html>
< html >
< head >
< meta charset = "utf-8" >
< meta http-equiv = "X-UA-Compatible" content = "IE=edge,chrome=1" >
< title > Balkian' s site - WELCOME< / title >
< meta name = "viewport" content = "width=device-width" >
< link rel = "stylesheet" href = "../../font-awesome/css/all.css" >
< link rel = "stylesheet" media = "only screen" href = "../../css/main.css" >
< link href = 'http://fonts.googleapis.com/css?family=Open+Sans:300|Comfortaa' rel = 'stylesheet' type = 'text/css' >
< / head >
< body >
< div id = "container" class = "container" >
< div id = "contentwrapper" >
< div id = "content" >
< header id = "header" >
< ul class = "navbar" id = "navbar" >
< a href = "../../" >
< li >
< i class = "fa fa-home fa-large" > < / i >
< / li > < / a >
2019-01-11 14:45:46 +00:00
< a href = "../../post/" > < li class = '' > Blog
2019-01-10 18:35:05 +00:00
< / li > < / a >
< a href = "../../tags/" > < li class = '' > Tags
< / li > < / a >
< a href = "../../cheatsheet/" > < li class = '' > Cheatsheets
< / li > < / a >
< a href = "../../project/" > < li class = '' > Projects
< / li > < / a >
2019-01-11 14:45:46 +00:00
< a href = "../../page/todo/" > < li class = '' > To-do
< / li > < / a >
2019-01-10 18:35:05 +00:00
< a href = "//jfernando.es" target = "_blank" > < li >
CV
< / li > < / a >
2019-01-11 14:45:46 +00:00
< a href = "../../search" > < li >
< i class = "fa fa-search" > < / i >
< / li > < / a >
2019-01-10 18:35:05 +00:00
< / ul >
< / header >
< h2 > Controlling Zigbee devices with MQTT< / h2 >
< span class = "date" > 2019/01/06< / span >
< span >
< a class = "tag" href = '../../tags/mqtt' > < span class = "label" > mqtt< / span > < / a >
< a class = "tag" href = '../../tags/iot' > < span class = "label" > iot< / span > < / a >
< a class = "tag" href = '../../tags/zigbee' > < span class = "label" > zigbee< / span > < / a >
< / span >
< h3 > < / h3 >
< p > This is a short tutorial on connecting a zigbee device (an Aqara cube)
to an MQTT server, so you can control your zigbee devices from the
network.< / p >
2021-01-19 11:35:27 +00:00
< p > If you’ re anything like me, you’ re probably a sucker for IoT devices.
For a long time, I’ ve been using WiFi-enabled lights, and Amazon dash
2019-01-10 18:35:05 +00:00
buttons to control them. To keep these (cheap Chinese) internet enabled
devices away from your network and their respective cloud services,
2021-01-19 11:35:27 +00:00
you’ ll probably want to set up a dedicated network in your router (more
2019-01-10 18:35:05 +00:00
on this on a future post, maybe). Another disadvantage of WiFi devices
2021-01-19 11:35:27 +00:00
is that they’ re relatively power hungry.< / p >
2019-01-10 18:35:05 +00:00
< p > A popular alternative is using ZigBee for communication. It is a
dedicated protocol similar to bluetooth (BLE), with lower power
requirements and bitrate.< / p >
< p > Take the (super cute) aqara cube as an example. It is a small cube that
2021-01-19 11:35:27 +00:00
detects rotation on all of its axes, and tapping events. Here’ s a
2019-01-10 18:35:05 +00:00
video:< / p >
< div style = "position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;" >
2019-12-11 13:32:34 +00:00
< iframe src = "https://www.youtube.com/embed/5YtqG1wEnng" style = "position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" allowfullscreen title = "YouTube Video" > < / iframe >
2019-01-10 18:35:05 +00:00
< / div >
< p > To connect to zigbee devices you will need a zigbee enabled gateway
(a.k.a. hub), which connects to your WiFi network and your zigbee
devices. Once again, this means adding an internet-enabled device to
your home, and probably a couple of cloud services.< / p >
< p > As an alternative, you can set up your own zigbee gateway, and control
it to your home automation platform of choice (e.g. home assistant). We
will cover how to set up a zigbee2mqtt gateway that is also connected to
an MQTT server, so you can use MQTT to control your devices and get
notifications.< / p >
< p > What you need:< / p >
< ul >
< li > < a href = "https://www.aliexpress.com/item/Original-Xiaomi-Mi-Aqara-Cube-Smart-Home-Controller-6-Action-Operation-Fr-Home-Device-Zigbee-Version/32892947622.html?spm=a2g0s.9042311.0.0.3da24c4dXV8sBI" > Aqara
cube< / a > .< / li >
< li > < a href = "https://www.aliexpress.com/item/Wireless-Zigbee-CC2531-CC2540-Zigbee-Sniffer-Bluetooth-BLE-4-0-Dongle-Capture-Module-USB-Programmer-Downloader/32907587711.html?spm=a2g0s.9042311.0.0.3da24c4dXV8sBI" > CC2531 zigbee
sniffer< / a > .< / li >
< li > < a href = "https://www.aliexpress.com/item/CFSUNBIRD-CC-DEBUGGER-Debugger-and-Programmer-for-RF-System-on-Chips-TI-ORIGINAL-Fast-hipping/32813122315.html?spm=a2g0s.9042311.0.0.3da24c4dXV8sBI" > CC-debugger< / a > .< / li >
< / ul >
< p > You will need to flash your sniffer. For that, you only need to follow
the instructions from the < a href = "https://koenkk.github.io/zigbee2mqtt/" > zigbee2mqtt
documentation< / a > .< / p >
2021-01-19 11:35:27 +00:00
< p > Once you’ re done flashing, you’ re ready to set up the zigbee2mqtt
2019-01-10 18:35:05 +00:00
server. For convenience, I wrote a simple docker-compose to deploy a
zigbee2mqtt server and a test mosquitto server:< / p >
< div class = "highlight" > < div style = "color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4" >
< table style = "border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;" > < tr > < td style = "vertical-align:top;padding:0;margin:0;border:0;" >
2019-12-11 13:32:34 +00:00
< pre style = "color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4" > < code > < span style = "margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" > 1
< / span > < span style = "margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" > 2
< / span > < span style = "margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" > 3
< / span > < span style = "margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" > 4
< / span > < span style = "margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" > 5
< / span > < span style = "margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" > 6
< / span > < span style = "margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" > 7
< / span > < span style = "margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" > 8
< / span > < span style = "margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" > 9
< / span > < span style = "margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" > 10
< / span > < span style = "margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" > 11
< / span > < span style = "margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" > 12
< / span > < span style = "margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" > 13
< / span > < span style = "margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" > 14
< / span > < span style = "margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" > 15
< / span > < span style = "margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" > 16
< / span > < span style = "margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" > 17
< / span > < span style = "margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" > 18
< / span > < span style = "margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" > 19
< / span > < span style = "margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" > 20
< / span > < span style = "margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" > 21
< / span > < span style = "margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" > 22
< / span > < span style = "margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" > 23
< / span > < span style = "margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" > 24
2019-01-10 18:35:05 +00:00
< / span > < / code > < / pre > < / td >
2019-12-11 13:32:34 +00:00
< td style = "vertical-align:top;padding:0;margin:0;border:0;;width:100%" >
2021-01-19 11:35:27 +00:00
< pre style = "color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4" > < code class = "language-yaml" data-lang = "yaml" > < span style = "color:#f92672" > version< / span > : < span style = "color:#e6db74" > ' 2.1' < / span >
< span style = "color:#f92672" > services< / span > :
< span style = "color:#f92672" > zigbee2mqtt< / span > :
< span style = "color:#f92672" > image< / span > : < span style = "color:#ae81ff" > koenkk/zigbee2mqtt< / span >
< span style = "color:#f92672" > container_name< / span > : < span style = "color:#ae81ff" > zigbee2mqtt < / span >
< span style = "color:#f92672" > restart< / span > : < span style = "color:#ae81ff" > always< / span >
< span style = "color:#f92672" > volumes< / span > :
- < span style = "color:#ae81ff" > ./z2m-data/:/app/data/< / span >
< span style = "color:#f92672" > devices< / span > :
2019-01-10 18:35:05 +00:00
- < span style = "color:#e6db74" > " /dev/ttyACM0" < / span >
2021-01-19 11:35:27 +00:00
< span style = "color:#f92672" > networks< / span > :
- < span style = "color:#ae81ff" > hass< / span >
< span style = "color:#f92672" > mqtt< / span > :
< span style = "color:#f92672" > image< / span > : < span style = "color:#ae81ff" > eclipse-mosquitto< / span >
< span style = "color:#f92672" > ports< / span > :
2019-01-10 18:35:05 +00:00
- < span style = "color:#ae81ff" > 1883< / span > :< span style = "color:#ae81ff" > 1883< / span >
- < span style = "color:#ae81ff" > 9001< / span > :< span style = "color:#ae81ff" > 9001< / span >
2021-01-19 11:35:27 +00:00
< span style = "color:#f92672" > networks< / span > :
- < span style = "color:#ae81ff" > hass< / span >
< span style = "color:#f92672" > volumes< / span > :
- < span style = "color:#ae81ff" > ./mosquitto.conf:/mosquitto/config/mosquitto.conf< / span >
< span style = "color:#f92672" > networks< / span > :
< span style = "color:#f92672" > hass< / span > :
< span style = "color:#f92672" > driver< / span > : < span style = "color:#ae81ff" > overlay< / span >
2019-12-11 13:32:34 +00:00
< / code > < / pre > < / td > < / tr > < / table >
2019-01-10 18:35:05 +00:00
< / div >
2019-12-11 13:32:34 +00:00
< / div > < p > You can test your installation with:< / p >
< div class = "highlight" > < div style = "color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4" >
< table style = "border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;" > < tr > < td style = "vertical-align:top;padding:0;margin:0;border:0;" >
< pre style = "color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4" > < code > < span style = "margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" > 1
< / span > < span style = "margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" > 2
< / span > < span style = "margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" > 3
< / span > < span style = "margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" > 4
< / span > < span style = "margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" > 5
< / span > < span style = "margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f" > 6
< / span > < / code > < / pre > < / td >
< td style = "vertical-align:top;padding:0;margin:0;border:0;;width:100%" >
< pre style = "color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4" > < code class = "language-shell" data-lang = "shell" > ❯ mosquitto_sub -h localhost -p < span style = "color:#ae81ff" > 1883< / span > -t < span style = "color:#e6db74" > ' zigbee2mqtt/#' < / span >
2019-01-10 18:35:05 +00:00
online
< span style = "color:#f92672" > {< / span > < span style = "color:#e6db74" > " battery" < / span > :17,< span style = "color:#e6db74" > " voltage" < / span > :2925,< span style = "color:#e6db74" > " linkquality" < / span > :149,< span style = "color:#e6db74" > " action" < / span > :< span style = "color:#e6db74" > " rotate_right" < / span > ,< span style = "color:#e6db74" > " angle" < / span > :12.8< span style = "color:#f92672" > }< / span >
< span style = "color:#f92672" > {< / span > < span style = "color:#e6db74" > " battery" < / span > :17,< span style = "color:#e6db74" > " voltage" < / span > :2925,< span style = "color:#e6db74" > " linkquality" < / span > :141,< span style = "color:#e6db74" > " action" < / span > :< span style = "color:#e6db74" > " slide" < / span > ,< span style = "color:#e6db74" > " side" < / span > :2< span style = "color:#f92672" > }< / span >
< span style = "color:#f92672" > {< / span > < span style = "color:#e6db74" > " battery" < / span > :17,< span style = "color:#e6db74" > " voltage" < / span > :2925,< span style = "color:#e6db74" > " linkquality" < / span > :120< span style = "color:#f92672" > }< / span >
2019-12-11 13:32:34 +00:00
< span style = "color:#f92672" > {< / span > < span style = "color:#e6db74" > " battery" < / span > :17,< span style = "color:#e6db74" > " voltage" < / span > :2925,< span style = "color:#e6db74" > " linkquality" < / span > :141,< span style = "color:#e6db74" > " action" < / span > :< span style = "color:#e6db74" > " wakeup" < / span > < span style = "color:#f92672" > }< / span > < / code > < / pre > < / td > < / tr > < / table >
< / div >
< / div >
2019-01-10 18:35:05 +00:00
< p > zigbee2mqtt supports the following events for the aqara cube: shake,
wakeup, fall, tap, slide, flip180, flip90, rotate_left and
rotate_right. Every event has additional information, such as the sides
involved, or the degrees turned.< / p >
< p > Now you are ready to set up home assistant support in zigbee2mqtt
following < a href = "https://koenkk.github.io/zigbee2mqtt/integration/home_assistant.html" > this
guide< / a > .< / p >
< / div >
< div id = "sidebar" class = "fixed" >
< div id = "badge" class = "flip-container" ontouchstart = "this.classList.toggle('hover');" >
2019-12-11 13:32:34 +00:00
< div class = "flipper sticky expand" >
2019-01-10 18:35:05 +00:00
< div class = "front" >
2019-12-11 13:32:34 +00:00
< img id = "avatar" class = "expandx" src = "../../img/me.png" >
2019-01-10 18:35:05 +00:00
< / div >
< div class = "back" >
2019-12-11 13:32:34 +00:00
< div id = "about" >
< div class = "icons vertical-center" >
< span class = "coolicon" > < span class = "fa-stack" > < i class = "fas fa-square fa-stack-2x" > < / i > < i class = "fab fa-inverse fa-stack-1x fa-linux" > < / i > < / span > < span class = "explanation" > Linux user< / span > < / span >
< span class = "coolicon" > < span class = "fa-stack" > < i class = "fas fa-square fa-stack-2x" > < / i > < i class = "fab fa-inverse fa-stack-1x fa-android" > < / i > < / span > < span class = "explanation" > Android dev and user< / span > < / span >
< a href = "http://github.com/balkian" target = "_blank" > < span class = "coolicon" > < span class = "fa-stack" > < i class = "fas fa-square fa-stack-2x" > < / i > < i class = "fab fa-inverse fa-stack-1x fa-github" > < / i > < / span > < span class = "explanation" > Github user< / span > < / span > < / a >
< a href = "http://gitlab.com/balkian" target = "_blank" > < span class = "coolicon" > < span class = "fa-stack" > < i class = "fas fa-square fa-stack-2x" > < / i > < i class = "fab fa-inverse fa-stack-1x fa-gitlab" > < / i > < / span > < span class = "explanation" > GitLab user< / span > < / span > < / a >
< span class = "coolicon" > < span class = "fa-stack" > < i class = "fas fa-square fa-stack-2x" > < / i > < i class = "fab fa-inverse fa-stack-1x fa-stack-exchange" > < / i > < / span > < span class = "explanation" > StackExchange fan< / span > < / span >
< span class = "coolicon" > < span class = "fa-stack" > < i class = "fas fa-square fa-stack-2x" > < / i > < i class = "fas fa-inverse fa-stack-1x fa-music" > < / i > < / span > < span class = "explanation" > Music lover< / span > < / span >
< span class = "coolicon" > < span class = "fa-stack" > < i class = "fas fa-square fa-stack-2x" > < / i > < i class = "fas fa-inverse fa-stack-1x fa-film" > < / i > < / span > < span class = "explanation" > Movie fan< / span > < / span >
< span class = "coolicon" > < span class = "fa-stack" > < i class = "fas fa-square fa-stack-2x" > < / i > < i class = "fas fa-inverse fa-stack-1x fa-laptop" > < / i > < / span > < span class = "explanation" > Always on a PC< / span > < / span >
< span class = "coolicon" > < span class = "fa-stack" > < i class = "fas fa-square fa-stack-2x" > < / i > < i class = "fas fa-inverse fa-stack-1x fa-moon" > < / i > < / span > < span class = "explanation" > Night owl< / span > < / span >
< span class = "coolicon" > < span class = "fa-stack" > < i class = "fas fa-square fa-stack-2x" > < / i > < i class = "fas fa-inverse fa-stack-1x fa-terminal" > < / i > < / span > < span class = "explanation" > CLI user< / span > < / span >
< span class = "coolicon" > < span class = "fa-stack" > < i class = "fas fa-square fa-stack-2x" > < / i > < i class = "fas fa-inverse fa-stack-1x fa-flag" > < / i > < / span > < span class = "explanation" > I love languages< / span > < / span >
< span class = "coolicon" > < span class = "fa-stack" > < i class = "fas fa-square fa-stack-2x" > < / i > < i class = "fas fa-inverse fa-stack-1x fa-code" > < / i > < / span > < span class = "explanation" > I love programming< / span > < / span >
< / div >
< / div >
2019-01-10 18:35:05 +00:00
< / div >
< / div >
< / div >
< div class = "entries" >
< h2 class = "title" > Latest entries< / h2 >
2019-12-11 13:32:34 +00:00
< dt > < a href = "../../post/2019-05-01-surface-go/" > Linux on the Microsoft Surface Go< / a > < / dt >
2019-01-10 18:35:05 +00:00
2019-12-11 13:32:34 +00:00
< a class = "tag" href = '../../tags/linux' > < span class = "label" > linux< / span > < / a >
2019-01-10 18:35:05 +00:00
2019-12-11 13:32:34 +00:00
< a class = "tag" href = '../../tags/surface-go' > < span class = "label" > surface go< / span > < / a >
2019-01-10 18:35:05 +00:00
2019-12-11 13:32:34 +00:00
< a class = "tag" href = '../../tags/config' > < span class = "label" > config< / span > < / a >
2019-01-10 18:35:05 +00:00
2019-12-11 13:32:34 +00:00
< dt > < a href = "../../post/2019-01-06-zigbee2mqtt/" > Controlling Zigbee devices with MQTT< / a > < / dt >
2019-01-10 18:35:05 +00:00
2019-12-11 13:32:34 +00:00
< a class = "tag" href = '../../tags/mqtt' > < span class = "label" > mqtt< / span > < / a >
2019-01-10 18:35:05 +00:00
2019-12-11 13:32:34 +00:00
< a class = "tag" href = '../../tags/iot' > < span class = "label" > iot< / span > < / a >
2019-01-10 18:35:05 +00:00
2019-12-11 13:32:34 +00:00
< a class = "tag" href = '../../tags/zigbee' > < span class = "label" > zigbee< / span > < / a >
2019-01-10 18:35:05 +00:00
2019-12-11 13:32:34 +00:00
< dt > < a href = "../../post/2016-09-28-tqdm/" > Progress bars in python< / a > < / dt >
2019-01-10 18:35:05 +00:00
2019-12-11 13:32:34 +00:00
< a class = "tag" href = '../../tags/python' > < span class = "label" > python< / span > < / a >
2019-01-10 18:35:05 +00:00
2019-12-11 13:33:45 +00:00
< dt > < a href = "../../post/2015-04-10-github-dotfiles/" > Sharing dotfiles< / a > < / dt >
< a class = "tag" href = '../../tags/github' > < span class = "label" > github< / span > < / a >
< a class = "tag" href = '../../tags/git' > < span class = "label" > git< / span > < / a >
< a class = "tag" href = '../../tags/dotfiles' > < span class = "label" > dotfiles< / span > < / a >
2019-01-10 18:35:05 +00:00
< / div >
< / div >
< div class = "clear" > < / div >
< / div >
< footer class = "pagefooter" role = "contentinfo" >
< div class = "contact" >
< p >
J. Fernando Sánchez Rada | balkian
< / p >
< / div >
< ul id = "social" >
< li > < a href = "http://github.com/balkian" > < i class = "fab fa-github" > < / i > < / a > < / li >
< li > < a href = "http://lab.gsi.upm.es/balkian" > < i class = "fab fa-gitlab" > < / i > < / a > < / li >
< li > < a href = "http://twitter.com/balkian" > < i class = "fab fa-twitter" > < / i > < / a > < / li >
< li > < a href = "http://git.sinpapel.es/balkian" > < i class = "fab fa-git" > < / i > < / a > < / li >
< li > < a href = "http://linkedin.com/in/jfsanchezrada" > < i class = "fab fa-linkedin" > < / i > < / a > < / li >
< / ul >
< p >
< i class = "fab fa-creative-commons" > < / i > Creative Commons A-SA-NC
< / p >
< / footer >
< / div >
< script src = "../../js/jquery-2.0.2.min.js" > < / script >
2019-01-11 14:45:46 +00:00
2019-01-10 18:35:05 +00:00
< / body >
< / html >