This is a general section about all I can find regarding Zigbee. No logical order in the articles, just random information about the things I faced while trying to get a grip on Zigbee.
I want to use Zigbee in Home Automation since there's a ton of devices working with Zigbee and a lot of them are battery powered, which is extremely useful.
Zigbee is also using the 2.4GHz frequency band, so conficts with the regular WiFi are possible. It's therefore of utmost importance to separate the WiFi channel as much as possible from the Zigbee channel.
WiFi has channels 1 - 14 (in Belgium, that is) and the most popular channes are 1, 6 and 11.
Zigbee has 16 channels in the 2.4GHz band: 11 - 26. Depending on the WiFi channel(s) used, you should adapt the Zigbee channels.
Below is a graph visually representing both WiFi as well as Zigbee channels.
Below is a visual overview of the combination of WiFi as well as Zigbee channels.
Careful channel planning can avoid lots of interference between the two rivals and result in a stable and strong network, both for WiFi as well as for Zigbee!
Sonoff dongle flashing
Insert dongle into PC
Check the presence of the dongle in Windows:
press Windows+X and select Device Manager from the popup menu
you should see an extra port added in the Ports section
Press Connect button on the web UI, a new popup will appear with the Sonoff dongle recognised.
Click on the Sonoff dongle and then click connect in the popup window (I had to do this twice...)
The sw will check the current dongle firmware and will show a new screen with firmware update, if available
In the screenshot you see the FW is from Juli 8th, 2021 and a newer version of March 21st, 2026 is available.
Press the Flash button: a flash window will appear.
Once flashing is successfully done, a message will appear telling the device will restart automatically.
You can now remove the Sonoff dongle from the PC.
All screenshots are attached below.
Although the Sonoff Zigbee 3.0 USB Dongle P is working perfect, a drawback is that you can't install it wherever you want into your house. You're restricted to the length of the USB cable and that length cannot be infinit.
Especially in my case, where my study room is at the side of my house and not centrally located, I'm a bit blocked with USB dongles. I know, I could start adding a zillion repeaters throughout the house to extend the Zigbee mesh network. But there's a better alternative: an ethernet-based Zigbee dongle!
An ethernet-based Zigbee dongle can be placed at random in your house where ethernet cable is provided. In quite recent houses, that should not be a problem.
When we were building our house I've provided lots of UTP/FTP cables everywhere in the house. Many are already in use, but many are still not: they're just waiting to get used one day for whatever purposes.
One such cable is quite centrally located in the house and that's where I'm going to install such an ethernet Zigbee dongle. My Home Assistant server can be wherever in the house, as long as it's in the same network of my ethernet dongle, it's fine.
After some search on the internet I read/saw/heard that the SLZB-06 Zigbee ethernet dongle (and its derivatives) is by far the best you can get. And for me, the nice thing is that it's PoE driven! So, I don't even need a separate USB power supply to power the device. What a luxury this is...
The other nice thing is that it's made by a Ukraine-based company called SMLIGHT. So, we're supporting the Ukraine economy too! Two birds with one stone (although I don't like this English expression)...
To install the dongle, you need a PoE capable switch or device. I happen to have a TpLink PoE switch TL-SG1005P which I can use to both power and use the SLZB-06 dongle.
Once the dongle is connected to the PoE switch it will start up and try to get an IP address from the ISP modem. It's best to assign a fixed IP address to the dongle, so go to the DHCP settings page of your dongle and do an "address reservation". Address reservation is nothing more than assigning a fixed IP address for a given MAC address.
Once this is done, you can open a web page and go to that IP address. If all goes fine, you should see a control panel dedicated to the SLZB-6P7U.
There's only a few things you should check on the dongle website, since most of the parameters will be OK:
Mode
Select Mode in the left side bar and make sure the dongle is set as Zigbee Coordinator and that the connection mode is set to Ethernet connection.
Z2M and ZHA
Select Z2M and ZHA in the left side bar and make sure the option Zigbee2MQTT is selected in the generator configurator.
Just below, you will see a piece of configuration that will be needed later on. Copy that piece of information and put it somewhere aside.
That information contains, among other things, the following information:
IP address
Port
Baud rate
Adapter
There's for now not really anything else to check.
The next step is to add it to Z2M. For the ease of work, make sure you have installed the File Editor app. See the section HP EliteDesk: Start up sequence -> Add File Editor application for more details.
Open the file editor, click the browse symbol and go all the way down until you see a subdirectory called zigbee2mqtt. If Zigbee2MQTT is already installed and running, that directory must be there. If not, check if Z2M is started/running since that's the moment the directory is created. If not, start Z2M.
Click that directory and then select the file configuration.yaml. This is the file we're going to change.
Copy the information you've put aside from the ZLSB website at the end of the file. You will see that the file editor is flagging a red circle with an exclamation mark in the upper-right corner.
The reason for this is that the key value advanced is defined twice: once from the original content and once from the added code.
The solution is to copy the content of the new advanced block to the existing advanced block. In case of the ethernet dongle it's just one line defining the power transmission:
transmit_power: 20
Once the line is moved to the new location, remove the redundant advanced block and the error should be gone. You should see a green checkmark instead.
For completeness, this is the additional information I added to the end of the file (IP address partially hidden...):
serial:
port: tcp://192.168.x.x:6638
baudrate: 115200
adapter: zstack
disable_led: false
By the way: while we're working in that configuration file you also see a whole list of devices that has been detected by Z2M since it was installed. Next to the exotic ID you also see the friendly name and the description, if any. Just as a sidenote...
In case the ethernet dongle is not the first dongle you installed in Z2M, you have to take extra actions.
In my case, before I installed the ethernet dongle I had the Sonoff Zigbee 3.0 USB Dongle P in place which was based on a serial communication through /dev/ttyUSB0. As a result, this information was also in my Z2M configuration file as a serial block. Having two serial blocks in the configuration file is a no-go.
Two Zigbee dongles (one serial based and one ethernet based) can't co-exist as far as I know! So, the serial dongle information has to be removed.
How to do this?
First off, you have to remove the serial data which is in the configuration part of the Z2M application. To remove it, go to Settings -> Apps -> Zigbee2MQTT -> Configuration.
From there, open the serial block and remove all the data that is there for port, adapter and baudrate.
Save the file. Normally, that should also remove the related serial block from the configuration.yaml file. But just to be on the safe side, open that configuration.yaml file and check if there's only one serial block in the file. If so, then it's fine. If not, remove the serial block related to the other Zigbee dongle manually.
Once this is done, you should restart Z2M again. This can be done by clicking Zigbee2MQTT in the left sidebar, then click Settings -> Tools. One of the options in the Tools menu is Restart Zigbee2MQTT. This is given in red so that you're warned a restart will happen if you click that tile.
I was looking for a device who could control roller shutters. Mostly, Somfy is used as motor for roller shutters. At least, that's what I currently have in mind.
One of the types of roller shutters from Somfy is the LT 50 WT range. WT stands for Wired Technology. It means nothing more or nothing less than 4 wires that are controlling the motor.
The Somfy LT 50 has two end switches: white and yellow. One will be used to indicate the UP end position and the other one will be used to indicate the DOWN end position.
The 4 wires are:
Ground
Neutral: goes directly to the motor
Red: related to the yellow button
Black: related to the white button
Those wires are connected to the line wires:
Ground to ground
Neutral to neutral
Live to red or black wire of the LT 50
This can be done by means of a manual toggle switch but in my case I will use a Shelly 2PM GEN4 device.
The Shelly 2PM GEN4 device has two outputs which can be connected to the live wire of the mains. A front and back image of the Shelly device can be found below this section.
The device is remotely controllable by means of the following protocols (not necessarily always available in all modes):
WiFi
Bluetooth
Zigbee
MQTT
This way, the red wire will be connected to the live wire if the Shelly connects one output and the black wire of the LT 50 will be connected to the live wire if the Shelly device connects the other output to the
It's also possible to use RPC calls to get information from a Shelly device.
Documentation can be found here: https://shelly-api-docs.shelly.cloud/gen2/General/RPCProtocol/
Example:
To get the status of a Shelly 2PM GEN4 switch that has an IP address of 192.168.100.50, you can execute the following RPC call:
http://192.168.100.50/rpc/Shelly.GetStatus
Results in the following long respon (JSON formatted by NPP):
{
"ble": {
},
"cloud": {
"connected": false
},
"cover:0": {
"aenergy": {
"by_minute": [
0.0,
0.0,
0.0
],
"minute_ts": 1785571620,
"total": 27.0
},
"apower": 0.0,
"current": 0.0,
"current_pos": 75,
"freq": 50.0,
"id": 0,
"last_direction": "open",
"pf": 0.0,
"pos_control": true,
"source": "init",
"state": "stopped",
"tag": null,
"temperature": {
"tC": 41.4,
"tF": 106.6
},
"voltage": 230.3
},
"input:0": {
"id": 0,
"state": null
},
"input:1": {
"id": 1,
"state": null
},
"knx": {
},
"modbus": {
},
"mqtt": {
"connected": false
},
"sys": {
"alt": {
"S2PMG4": {
"desc": "Shelly 2 PM Gen4 with Matter",
"name": "Shelly 2 PM Gen4",
"stable": {
"build_id": "20260710-101230/2.0.0-g87fbfa4",
"version": "2.0.0"
}
}
},
"available_updates": {
},
"cfg_rev": 30,
"fs_free": 434176,
"fs_size": 917504,
"kvs_rev": 0,
"last_sync_ts": 1785570256,
"mac": "E8F60A66BA7C",
"ram_free": 142640,
"ram_min_free": 128836,
"ram_size": 317468,
"reset_reason": 1,
"restart_required": false,
"schedule_rev": 0,
"time": "10:07",
"unixtime": 1785571643,
"uptime": 8580,
"utc_offset": 7200,
"webhook_rev": 0
},
"wifi": {
"bssid": "90:f6:52:44:45:f4",
"channel": 1,
"rssi": -46,
"ssid": "SisyPhus",
"sta_ip": "192.168.1.50",
"sta_ip6": [
"fe80::eaf6:aff:fe66:ba7c",
"2a02:a03f:e13e:e300:eaf6:aff:fe66:ba7c"
],
"status": "got ip"
},
"ws": {
"connected": false
},
"zigbee": {
"network_state": "joined"
}
}
To get an overview of all possible RPC calls for a Shelly 2PM GEN4 device, set the following address in a browser window:
http://192.168.100.50/rpc/Shelly.ListProfiles
The result will be a huge list of possible RPC calls. Too much to cover here, since there's a total of 142 (!!!) RPC methods defined: from 0 to 141.
Nah... Why not (I really am crazy to do this...):
{
"methods": [
"Cover.ResetCounters",
"Cover.Calibrate",
"Cover.GoToPosition",
"Cover.Stop",
"Cover.Close",
"Cover.Open",
"Cover.SetConfig",
"Cover.GetConfig",
"Cover.GetStatus",
"Input.CheckExpression",
"Input.SetConfig",
"Input.GetConfig",
"Input.GetStatus",
"Shelly.ZigbeeClear",
"Shelly.SetProfile",
"Shelly.ListProfiles",
"Zigbee.WriteAttr",
"Zigbee.ReadAttr",
"Zigbee.SendCommand",
"Zigbee.StartNetworkSteering",
"Zigbee.GetStatus",
"Zigbee.SetConfig",
"Zigbee.GetConfig",
"Button.SetConfig",
"Button.GetConfig",
"Button.GetStatus",
"Button.Trigger",
"Text.SetConfig",
"Text.GetConfig",
"Text.GetStatus",
"Text.Set",
"Number.SetConfig",
"Number.GetConfig",
"Number.GetStatus",
"Number.Set",
"Group.SetConfig",
"Group.GetConfig",
"Group.GetStatus",
"Group.Set",
"Enum.SetConfig",
"Enum.GetConfig",
"Enum.GetStatus",
"Enum.Set",
"Boolean.SetConfig",
"Boolean.GetConfig",
"Boolean.GetStatus",
"Boolean.Set",
"Virtual.Delete",
"Virtual.Add",
"Schedule.Eval",
"Schedule.List",
"Schedule.DeleteAll",
"Schedule.Delete",
"Schedule.Update",
"Schedule.Create",
"Modbus.SetConfig",
"Modbus.GetConfig",
"Modbus.GetStatus",
"KNX.SetConfig",
"KNX.GetConfig",
"KNX.GetStatus",
"Webhook.ListAllSupported",
"Webhook.ListSupported",
"Webhook.List",
"Webhook.DeleteAll",
"Webhook.Delete",
"Webhook.Update",
"Webhook.Create",
"Script.Stop",
"Script.Start",
"Script.Eval",
"Script.GetCode",
"Script.PutCode",
"Script.SetConfig",
"Script.GetConfig",
"Script.GetStatus",
"Script.List",
"Script.Delete",
"Script.Create",
"WS.SetConfig",
"WS.GetConfig",
"WS.GetStatus",
"Mqtt.SetConfig",
"Mqtt.GetConfig",
"Mqtt.GetStatus",
"Cloud.SetConfig",
"Cloud.GetConfig",
"Cloud.GetStatus",
"BLE.AdvertiseOnce",
"BLE.DeletePairedDevice",
"BLE.ListPairedDevices",
"BLE.StopPairing",
"BLE.StartPairing",
"BLE.SetConfig",
"BLE.GetConfig",
"BLE.GetStatus",
"Wifi.Scan",
"Wifi.ListAPClients",
"Wifi.SetConfig",
"Wifi.GetConfig",
"Wifi.GetStatus",
"Sys.SetTime",
"Sys.SetConfig",
"Sys.GetConfig",
"Sys.GetStatus",
"KVS.Delete",
"KVS.Set",
"KVS.GetMany",
"KVS.Get",
"KVS.List",
"Shelly.Identify",
"HTTP.Request",
"HTTP.POST",
"HTTP.GET",
"Shelly.ListMethods",
"Shelly.PutHTTPServerCABundle",
"Shelly.PutHTTPServerKey",
"Shelly.PutHTTPServerCert",
"Shelly.PutTLSClientKey",
"Shelly.PutTLSClientCert",
"Shelly.PutUserCA",
"Shelly.Reboot",
"Shelly.SetAuth",
"Shelly.InstallAlt",
"Shelly.Update",
"Shelly.CheckForUpdate",
"Shelly.DetectLocation",
"Shelly.ListTimezones",
"Shelly.GetComponents",
"Shelly.GetStatus",
"Shelly.FactoryReset",
"Shelly.ResetWiFiConfig",
"Shelly.GetConfig",
"Shelly.GetDeviceInfo",
"OTA.Abort",
"OTA.Write",
"OTA.Data",
"OTA.Start",
"OTA.Revert",
"OTA.Commit",
"OTA.Update",
"RPC.Ping"
]
}
Some of the important ones:
GetStatus
GetConfig
ListMethods
See this link for detailed info: https://shelly-api-docs.shelly.cloud/gen2/ComponentsAndServices/Shelly.
Especially the "Examples" section is interesting, since examples are given for the following requests:
HTTP
CURL
MOS
We're thinking about putting roller shutters in front or our windows at our home. The windows don't have roller shutters built in. We want them for several reasons:
Privacy
Security
Protection against damage of falling branches during a storm (we're living in a forest, hence...)
And last but not least: protection against the heat
If I would have known in 2003 what I know now about the climate change and increasing hot summers with more and more heat waves, I would definitely have chosen to put roller shutters directly built in. But, it's not like that and we can't turn back the clock (would be extremely handy from time to time, if we could...).
So, that's why we're possibly going for for roller shutters.
My sister and brother in law quite recently also placed roller shutters in front of some of their windows. The reason is totally different for them, since they have built-in roller shutters already. But it's more because of comfort that they have chosen for a few of such roller shutters.
They worked together with a company located in Roeselare. The company is called Phaz, their website is phaz.be. It's already the fifth generation working in the roller shutter industry, so they have lots of experience.
So, since my sister and brother in law are very satisfied about the work delivered by this company we decided to also ask for an estimation of cost. This still has to happen (very soon) but in the meantime I was thinking on how to control those roller shutters. In the meantime we visited already the showroom, but that was not really satisfying. We didn't have the person we thought we would have to talk about the different possibilities about exernal roller shutters. We agreed to meet the boss himself during that showroom visit, but something went wrong.
So, the boss himself will drop by at our house to see what is possible and what we want. I'm happy the company is lead by two members of the family: a brother and a sister. They're still very young (early 30-ies, I guess).
If I want to incorporate the external roller shutters in Home Assistant, then I need to know what type of motor will be used in our case. The boss already sent me information upfront about the motor brand that will be used: Somfy. He sent me more in particular the type of motor he things we will need: Somfy LT50 WT (Wired Technology).
That's a motor that has no intelligence, only 4 wires:
a ground wire (green/yellow)
a neutral wire (blue)
a black wire
a brown wire
The rotation of the motor depends on which of the black or brown wires will close the circuit:
if the black wire closes the circuit, then the motor runs clockwise (CW), if you look from the side with the motor close to you
if the brown wire closes the circuit, then the motor runs counterclockwise (CCW) if you look from the side with the motor close to you
An ideal device to control such a type of motor is a Shelly switch, type 2PM GEN4. This device is already discussed on this page. Have a look.
In short:
The Shelly can be powered with 110-240V AC or 24V DC
It has two outputs
It has two inputs (you can control the outputs with two external switches, however, that's not a must)
Most important: it has a mode in which the two outputs can NEVER be on at the same time. This mode is called the cover mode (the other mode is just the switch mode...)
The Somfy LT50 roller shutter motor has two microswitches internally to define the end of the roller shutter movement:
one for the clockwise direction
one for the counterclockwise direction
This is always seen when you look to the side where the motor is located.
The white button: used to determine the end position in counterclockwise direction (CCW direction)
The yellow button: used to determine the end position in the clockwise direction (CW direction)
To trim the motor, both switches have to be pressed. Only then, the motor can run freely in CW or CCW direction.
Let the motor run in CW or CCW direction until the roller shutter is completely down. Once the shutter is in place, unlock the button that corresponds to the direction that the motor has run: White for CCW direction and yellow for CW direction.
From now onwards, the motor can't run any further anymore in CW or CCW direction.
Do the same as for the lower shutter position, but then in the opposite direction. Depending on where the motor is mounted (on the left or on the right) and depending on where the shutter is located (in front or at the back of the tube), this can again be CW or CCW. Once the shutter reaches the upper position, unlock the remaining button (white for CCW, yellow for CW).
From now onwards, the shutter can't get any higher anymore than the upper limit.
Even if you keep applying power on the black or brown wire, the internal microswitches of the roller shutter motor will prevent the motor from moving any furter in CCW or CW direction. This is a safety catch.
You have different ways to log in via a terminal into the HAOS distro:
Go to Settings -> Apps
Select Install app (blue button in the right-bottom corner)
Start typing Terminal
Select Terminal & SSH from the list
Install and start the application: make sure you activate the Show in sidebar slider to see Terminal in the sidebar
Click on Terminal in the sidebar and you will see a welcome screen like this (more or less):
▄██▄ _ _
▄██████▄ | | | | ___ _ __ ___ ___
▄████▀▀████▄ | |_| |/ _ \| '_ ` _ \ / _ \
▄█████ █████▄ | _ | (_) | | | | | | __/
▄██████▄ ▄██████▄ |_| |_|\___/|_| |_| |_|\___| _
████████ ██▀ ▀██ / \ ___ ___(_)___| |_ __ _ _ __ | |_
███▀▀███ ██ ▄██ / _ \ / __/ __| / __| __/ _` | '_ \| __|
██ ██ ▀ ▄█████ / ___ \\__ \__ \ \__ \ || (_| | | | | |_
███▄▄ ▀█ ▄███████ /_/ \_\___/___/_|___/\__\__,_|_| |_|\__|
▀█████▄ ███████▀
Welcome to the Home Assistant command line interface.
Home Assistant Supervisor is running!
System information:
IPv4 addresses for end0: 192.168.1.45/24
IPv6 addresses for end0: 2a02:a03f:e13e:e300:5cc7:ab80:fa41:3d91/64, fe80::dae0:7998:2c5b:e7d2/64
OS Version: Debian GNU/Linux 12 (bookworm)
Home Assistant Core: 2026.8.0
Home Assistant URL: http://lepotato.local:8123
Observer URL: http://lepotato.local:4357
System is ready! Use browser or app to configure.
[core-ssh ~]$
Then you can log in with your own credentials:
ssh geertvc@192.168.x.xx
You will be asked for your username and password. After that, you're logged in into an SSH shell. And you will have something like this instead:
_ _ _
/_\ _ _ _ __ | |__(_)__ _ _ _
/ _ \| '_| ' \| '_ \ / _` | ' \
/_/ \_\_| |_|_|_|_.__/_\__,_|_||_|
v26.2.1 for Le potato running Armbian Linux 6.18.10-current-meson64
Packages: Debian stable (trixie)
IPv4: (LAN) 192.168.1.45 (WAN) 109.133.59.155
IPv6: (WAN) 2a02:a03f:e13e:e300:5cc7:ab80:fa41:3d91
Containers: app_core_ssh, app_a0d7b954_nodered, app_a0d7b954_vscode, hassio_multicast, hassio_audio, hassio_dns, hassio_cli, homeassistant, hassio_supervisor, zigbee2mqtt, hassio_observer
Performance:
Load: 6% Uptime: 4h 56m Local users: 2
Memory usage: 72% of 1.88G Zram usage: 14% of 0.94G
CPU temp: 47°C Usage of /: 16% of 58G
RX today: 784 MiB
Tips:
What’s new in Armbian v26.5? https://tinyurl.com/5cwr7wfh
Commands:
Configuration: armbian-config
Monitoring : htop
Last login: Fri Aug 7 11:57:23 2026 from 172.30.33.1
geertvc@lepotato:~$
Open Putty
Type in the address of HA
You will be asked for your name and password
Fill in both and you're logged in as geertvc on the HAOS system (if that's your user name, of course...).
Make sure Zigbee2MQTT is in pairing mode before you start pairing devices. To get Z2M into pairing mode, do the following:
In Home Assistant, click the Zigbee2MQTT item in the left sidebar
In the Z2M dialog, press the Permit join button: a timer of 4'20" will start. During that period, the Zigbee devices have to be put in pairing mode too.
Once the paring is done, Z2M will show a picture of the device in the column Friendly name. Next to this a lot of other information will be shown.
Click on the friendly name of a device to change the name itself (as a start, it will be a cryptic hexadecimal number). A new window will open and if you click again on that hex number you will get the chance to change the name in a more meaningful name.
Press one of the 4 buttons for at least 10 seconds until the 4 LEDs are flashing quickly.
Scenes:
Single
Double
Hold (active after approx. 4 seconds)
Remove the back cover and press the Reset button with a small pin for about 10 seconds until the internal LED starts flashing slowly.
Scenes:
Single
Double
Triple
Hold (active after approx. 1 second)
Press the button on the left side for at least 5 seconds until the LED start flashing.
Switch off the lamp
After a few seconds, repeat this sequence 5 times
Switch on for 1 second
Switch off for 2 seconds
After the 5th sequence, switch on the lamp again. Shortly after, the lamp should flash and jump to a bright white colour.
Make sure the Z2M application is in Permit join state in the mean time!!!
After that, the lamp will be recognised and added to the list of Zigbee devices
See this YouTube video: https://www.youtube.com/watch?v=o4D6lR5eDoo
Use the metal pin delivered with the package to bring the device into pairing mode. Press the reset button with the pin until the LED starts flashing.
You can set both the sensitivity as well as the Keep time using Z2M. However, I have the impression the new settings are only taken along when a new event is happening. This gives an odd feeling if you change values, though...
To get the Aeotec range extender in pairing mode press the button for at least 10 seconds until the LED starts fading in and out. Once in this state, press the button once more. Now the LED should start fast blinking. This means it's open for paring.
Note that the device goes in auto-paring the very first time it has ever been put into a mains outlet. Make sure Z2M permits joining by then.
Press the button for at least 10 seconds until it starts flashing. Then pairing is ongoing.