💬 Building a Raspberry Pi Gateway
kted last edited by kted
@rolo6442u I built an Raspberry gateway using an RFM69 radio, to replace one built around a NodeMCU.
All nodes are transmit only, and using the latest stable API.
I noticed that all sensors were using max TX power after the first couple of transmissions, although they were respecting the ATC setting before, and were using minimum power most of the time.
Now I am concerned about battery life, so I switched back to the NodeMCU gateway, waiting for a fix.
I'll put together a temporary net, with a RPi0 gateway and a single node later, to show some real data, if you need any more information.
Rolo6442u last edited by Rolo6442u
@kted I wil do some tests to check if I see this behavior. Just build a simple test node with a pushbutton, on 2 AA batteries. This node has the low power W radio module. How did you discover/measure that the max TX power was used?
@kted could be the same problem as discussed in https://forum.mysensors.org/topic/9796/rfm69-atc-not-working/
@rolo6442u From what the node itself reports from transportGetSignalReport(SR_TX_POWER_PERCENT). It starts from say 50%, and after a coule of transmissions it goes up to 100%, when the nodes are 1m apart. When using a stand alone ESP8266 gateway, it drops to 0%.
I'll have the nodes ready in a couple of hours, after I come home from work...
Did some tests and I do see the TX power climbing to 100% after a few transmits :
-42 :transportGetReceivingRSSI() 127 :transportGetSendingRSSI() -256 :transportGetReceivingSNR() -256 :transportGetSendingSNR() 6 :transportGetTxPowerLevel() 77 :transportGetTxPowerPercent() 0 :transportInternalToRSSI(_transportSM.uplinkQualityRSSI) -46 :transportGetReceivingRSSI() -102 :transportGetSendingRSSI() -256 :transportGetReceivingSNR() -256 :transportGetSendingSNR() 7 :transportGetTxPowerLevel() 80 :transportGetTxPowerPercent() 0 :transportInternalToRSSI(_transportSM.uplinkQualityRSSI) -47 :transportGetReceivingRSSI() -102 :transportGetSendingRSSI() -256 :transportGetReceivingSNR() -256 :transportGetSendingSNR() 10 :transportGetTxPowerLevel() 90 :transportGetTxPowerPercent() 0 :transportInternalToRSSI(_transportSM.uplinkQualityRSSI) -47 :transportGetReceivingRSSI() -105 :transportGetSendingRSSI() -256 :transportGetReceivingSNR() -256 :transportGetSendingSNR() 11 :transportGetTxPowerLevel() 93 :transportGetTxPowerPercent() 0 :transportInternalToRSSI(_transportSM.uplinkQualityRSSI) -47 :transportGetReceivingRSSI() -103 :transportGetSendingRSSI() -256 :transportGetReceivingSNR() -256 :transportGetSendingSNR() 13 :transportGetTxPowerLevel() 100 :transportGetTxPowerPercent() 0 :transportInternalToRSSI(_transportSM.uplinkQualityRSSI) -47 :transportGetReceivingRSSI() -106 :transportGetSendingRSSI() -256 :transportGetReceivingSNR() -256 :transportGetSendingSNR() 13 :transportGetTxPowerLevel() 100 :transportGetTxPowerPercent() 0 :transportInternalToRSSI(_transportSM.uplinkQualityRSSI)
Not sure if this has a great impact on battery life, depends on how often the node sends a message. Al my nodes have an interval of about 10 minutes. I leave the gateway running for now. Having it running on this PI is a great advantage for me. Will try to do some current measurement on this node and calculate what the impact is on battery life.
@barrydou I gave a double gateway running on my raspberry both nrf24 and rfm69, still on v. 2.2
@gohan Nice. I was thinking to do that same at some time, but I wasn't sure if the Raspberry could handle the load, since I also run domoticz on it, along with pi-hole.
How many devices do you have on each gateway?
I got the same, domoticz and pi hole, but the load of the gateway is minimal
@gohan I meant multiple gateways on the same raspberry.
Right now, I have an NRF24L01 gateway, Domoticz, pi-hole, and a VPN server running, with 2 more gateways connected, one local and one remote RFM69 on ESP8266.
It would be nice if I could combine the two local gateways, the RFM and the NRF on the same Raspberry's GPIO...
Yes, I have both radios on the same raspberry.
MasMat last edited by MasMat
More problems when I try to "make" after configuring. Tried with and without sudo...
dietpi@Domoticz:~/MySensors$ sudo make gcc -MT build/hal/architecture/Linux/drivers/core/log.o -MMD -MP -march=armv6zk -mtune=arm1176jzf-s -mfpu=vfp -mfloat-abi=hard -DMY_SIGNING_SIMPLE_PASSWD=\"ZZZZZZZ\" -DMY_RADIO_RF24 -DMY_GATEWAY_LINUX -DMY_GATEWAY_MQTT_CLIENT -DMY_DEBUG -DLINUX_SPI_BCM -DLINUX_ARCH_RASPBERRYPI -DMY_LINUX_CONFIG_FILE=\"/etc/mysensors.conf\" -DMY_DEFAULT_TX_LED_PIN=18 -DMY_DEFAULT_RX_LED_PIN=16 -DMY_DEFAULT_ERR_LED_PIN=12 -DMY_MQTT_CLIENT_ID=\"mygateway1\" -DMY_MQTT_SUBSCRIBE_TOPIC_PREFIX=\"mysensors-in\" -DMY_MQTT_PUBLISH_TOPIC_PREFIX=\"mysensors-out\" -DMY_MQTT_PASSWORD=\"YYYYY\" -DMY_MQTT_USER=\"XXXX\" -DMY_CONTROLLER_IP_ADDRESS=127,0,0,1 -DMY_DEBUG_VERBOSE_SIGNING -DMY_RX_MESSAGE_BUFFER_FEATURE -DMY_RF24_IRQ_PIN=15 -Ofast -g -Wall -Wextra -I. -I./core -I./hal/architecture/Linux/drivers/core -I./hal/architecture/Linux/drivers/BCM -c hal/architecture/Linux/drivers/core/log.c -o build/hal/architecture/Linux/drivers/core/log.o In file included from hal/architecture/Linux/drivers/core/log.c:20:0: hal/architecture/Linux/drivers/core/log.h:24:19: fatal error: stdio.h: File not found #include <stdio.h> ^ compilation terminated. Makefile:102: recipe for target 'build/hal/architecture/Linux/drivers/core/log.o' failed make: *** [build/hal/architecture/Linux/drivers/core/log.o] Error 1
EDIT: ...and here's the fix: "sudo apt-get install g++" (I'm using DietPi now to make it lighter for Pi Zero W).
coza last edited by coza
Running Version 2.3.2-beta just cloned today. On a raspberry pi B rev2.
A little bug/problem I have discovered with the MQTT gateway.
When you run the gateway with command and switch:-
mysgw -c /etc/mysensors.conf
When its run with the command and switch :-
mysgw --config-file /etc/mysensors.conf
It works fine
I was playing with the ethernet gateway compile and the -c worked fine.
coza last edited by coza
Another thing I have found is I cannot get any logging working with the mqqt gateway compile. It worked fine (named pipe) with the ethernet gateway compile.
It seems logging with the mqtt is not instant. It seem to dump the log out of memory periodically, is this expected? Makes it a bit hard to debug real-time.
Just use mqtt client
@coza I have experienced that the raspberry pigateway does not flush the logs immediately when logging to file. Syslog logs immediately though. See if switching to syslog helps.
barrydou last edited by barrydou
@gohan Sorry I miss your answer a few days ago
I don't want to a gateway with both rfm69 and nrf24..
I'm planning to change my nrf24 sensors with rfm69, to have a better transmission distance. My two nodes are outside, and i have communication trouble if i put them where i wanted, specially for my rain gauge.
So I wanted to use those adaptors https://www.openhardware.io/view/16/NRF2RFM69.
I received them, and I'm still waiting RFM69 board to test it.
But as the pinout is not the same between nrf24 and rfm69 on raspberry gateway, I could not use the adaptor on the gateway. So before making a new board for my raspberry, I wanted to know if it's possible to change the default pin configuration, to have exactly the same as nrf24, and use an adaptor on the gateway too.
For that, I "just" need to redefine DIO0 on pin 15 (default is 22). So I wonder if it's possible to do it.
And "bonus question", I'd like to know why pin configuration is not the same between arduino and raspberry. Why pin 15 is not used for DIO0 on raspberry (equivalent to pin 2 on arduino). I'm telling myself it should be a good reason, but I don't get it.
--my-rfm69-irq-pin=<PIN> Pin number connected to RFM69 IRQ pin.
For the bonus question: I wasn't aware that there was a mapping between Raspberry Pi gpio and Arduino pins. Could you share he rest of the list?
barrydou last edited by barrydou
@mfalkvidd I don't know what DI00 is, and if it's equivalent to IRQ ? If Yes, it's exactly what I need ! Thank you !!! I will test it as soon as I get my RFM69
Here is the pin mapping between RFM69W/NRF24 and Arduino/Raspberry
Arduino mini - NRF24 - RFM69 - Raspberry GW NRF - Raspberry GW RFM 9 - CE - N/A - 22 - N/A 10 - CSN/CS - NSS - 24 - 24 13 - SCK - SCK - 23 - 23 11 - MOSI - MOSI - 19 - 19 12 - MISO - MISO - 21 - 21 2 - IRQ - DI00 - 15 - 22
So, the only mismatch breaking pin compatibility (and preventing to use adaptors on the raspberry pi gateway) is on IRQ/DI00. Adaptors wire RFM69 DI00 on NRF24 IRQ pin, but they don't use, by default, the same pin on raspberry, depending the radio type.
@barrydou I don't know what dio0 is either, but https://learn.sparkfun.com/tutorials/rfm69hcw-hookup-guide/all describes it like this:
Digital I/O 0
RX interrupt Received data ready interrupt signal from RFM69HCW to microcontroller
which sounds like it could be interrupt. It might be worth a try at least.
barrydou last edited by
@mfalkvidd Thank you.
I've found that too https://www.mysensors.org/apidocs/RFM69_8h_source.html
It's clearly indicated that DIO0 is IRQ.
So I think with "--my-rfm69-irq-pin=" it will do the job.
I'll test it as soon as i'll receive RFM69.
Thank you again
@marceloaqno Sorry to kick this old topic, but I will soon be trying to build my gateway with a Raspberry pi. I was wondering if the capacitor is also required for the gateway, or just for the nodes?
Because at the instruction page on how to wire and build a Raspberry Pi gateway, the capacitor isn't mentioned.
I'll be using a RPI 1 and NRF24L01+
@rolandow yes the capacitor is needed. I'll add that info to the page. Thanks for noticing.
Ok, one more question. I thought I read somewhere that the wiring between the RPI and de radio should be as short as possible, but I can't find exactly where I read that anymore.
At another project (zigbee2mqtt) I read that users had better reception when they placed the transceiver further away from the controller, because there was less inteference. So if possible, I would like to use a piece of UTP cable to wire the radio to the raspberry pi. That way I can put the rpi inside a closet, but the radio outside.
So I am not sure if longer wires (say 2, 3 meters) is going to be a problem?
@rolandow there could be a problem.
There are two things to consider.
Power drop due to resistance in the cable. See https://electronics.stackexchange.com/questions/113253/voltage-drop-and-safe-current-load-on-cat5-cable for details but use the current used by the radio (provided in the datasheet) instead of the 2.5A used in that question.
SPI communication problems due to capacitance in the cable. See https://electronics.stackexchange.com/questions/163468/spi-max-distance for details. See also my post at https://forum.mysensors.org/post/92967 for oscilloscope pictures of what an i2c signal can look like through a long cable. SPI can handle longer cable lengts than i2c though.
For me, my electronics is not as good as my development skills ;-). But I gave it a try. According to the datasheet the NRF24 will consume about 14 mA max. My cable is 2 m max, so then the resistance is 0,16ohms. So if I understand correctly the voltage drop would be 0,00224 volt. Sounds neglegtable to me? Also; can't I just measure the voltage at the end of the cable once it's connected to the RPI?
At the stackoverflow page somebody says: "In an answer on a Microchip forum, Jan Axelson, author of 'Serial Port Complete', claims a maximum cable length of 10' for the SPI bus. Other posts have mentioned the same figure.". So 10" is about 3 metres, so I am within that range. I do understand though that this isn't a preferred thing to do.
Which makes me wonder how other people handle this. I mean; I think ideally you'd want the radio that is connected to the controller in the most 'center' way of the home, right? So do people just hange the Pi and the whole shebang to the ceiling? I'd rather put the controller in the closet where my modem and router are, and then only wire the receiver to outside the closet. Isn't there a better way to do this?
Nice work @rolandow
You can measure the voltage drop, if you put a load of 14mA on the cable. But without load, there will be no voltage drop.
One small adjustment on your calculation: there will be 4m cable (2m to the radio and 2m back). But the drop will still be negligable for a normal nrf24.
monte last edited by monte
Please edit the image used in this tutorial:
It is wrong and misleading, as it says that pin36 is SPI1 CS0. In fact SPI1 CS0 by default is pin12. To be able to use pin36 as SPI1 CS0 one have to follow implicit steps which can be found on this forum thread: https://www.raspberrypi.org/forums/viewtopic.php?t=203776.
Also it would be useful to add instructions to enable SPI1 in /boot/config.txt to the tutorial.
I want to run this gateway with another networkid (RFM69) but can't find how to do this. The option --my-rfm69-networkid=105 in the config line is ignored. So maybe it should go in the mysensnsors.conf file, but what is the syntax of this option?
@rolo6442u where did you find
my-rfm69-networkid? I don't think such an option has ever existed. If you found it somewhere we probably need to update that documentation.
Follow the instructions at https://www.mysensors.org/build/raspberry#advanced to set defines.
I did not found it, I kind of made it up, following the syntax of other options.
Looks like there is no way of changing the ID at this moment for the PI gateway.
@rolo6442u ok. Well, making things up will usually not add them to the code
There is a way. Two actually. Set the define in one of the two ways described on the link I provided.
Thanks, will take a look at that.
mafe last edited by
Is it also possible to read a sensor directly at the Raspberry Pi MQTT Gateway? I only want to send the status of a GPIO via MQTT. Is there an example code for this combination?
Might be nice to know it compilation still seems to works fine on Raspbian Buster on a Raspberry Pi 4.
// Update: unlike on the Pi 3 I now had to activate SPI. Might be good to make that more prominent in the explanation now.
@alowhum to my knowledge, activating SPI has always been required, unless the user has already activated SPI by some other means.
Do you have a suggestion on how to make it more prominent that what it is now? Preferably without contributing too much to the pileup of notices that scare users - everything is super-important to at least 1 person.
@mfalkvidd I don't know, perhaps mention it as something that has to be done upfront instead of something that might need to be done if there is an error?
I'm not having any luck actually getting the radio to work. I now noticed this warning during compilation:
g++ -MT build/drivers/Linux/GPIO.o -MMD -MP -DMY_RADIO_RF24 -DMY_GATEWAY_LINUX -DMY_GATEWAY_MQTT_CLIENT -DMY_DEBUG -DLINUX_SPI_SPIDEV -DMY_MQTT_CLIENT_ID=\"mygateway1\" -DMY_MQTT_SUBSCRIBE_TOPIC_PREFIX=\"mysensors-in\" -DMY_MQTT_PUBLISH_TOPIC_PREFIX=\"mysensors-out\" -DMY_CONTROLLER_IP_ADDRESS=127,0,0,1 -Ofast -g -Wall -Wextra -I. -I./core -I./drivers/Linux -c drivers/Linux/GPIO.cpp -o build/drivers/Linux/GPIO.o drivers/Linux/GPIO.cpp: In constructor ‘GPIOClass::GPIOClass()’: drivers/Linux/GPIO.cpp:53:18: warning: ‘%s’ directive writing up to 255 bytes into a region of size 48 [-Wformat-overflow=] sprintf(file, "/sys/class/gpio/%s/base", de->d_name); ^~~~~~~~~~~~~~~~~~~~~~~~~ drivers/Linux/GPIO.cpp:53:11: note: ‘sprintf’ output between 22 and 277 bytes into a destination of size 64 sprintf(file, "/sys/class/gpio/%s/base", de->d_name); ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ drivers/Linux/GPIO.cpp:62:18: warning: ‘%s’ directive writing up to 255 bytes into a region of size 48 [-Wformat-overflow=] sprintf(file, "/sys/class/gpio/%s/ngpio", de->d_name); ^~~~~~~~~~~~~~~~~~~~~~~~~~ drivers/Linux/GPIO.cpp:62:11: note: ‘sprintf’ output between 23 and 278 bytes into a destination of size 64 sprintf(file, "/sys/class/gpio/%s/ngpio", de->d_name); ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Could this be an issue?
./configure without any additional parameters gives:
[SECTION] Detecting target machine. [OK] machine detected: SoC=unknown, Type=unknown, CPU=armv7l.
The rest looks fine:
[SECTION] Checking GPIO Sysfs. [OK] /sys/class/gpio/export found. [SECTION] Detecting SPI driver. [OK] SPI driver detected:SPIDEV. [SECTION] Gateway configuration. [OK] Type: ethernet. [OK] Transport: rf24. [OK] Signing: Disabled. [OK] Encryption: Disabled. [OK] CPPFLAGS: -DMY_RADIO_RF24 -DMY_GATEWAY_LINUX -DMY_DEBUG -DLINUX_SPI_SPIDEV [SECTION] Detecting init system. [OK] Init system detected: systemd. [SECTION] Saving configuration. [OK] Saved. [SECTION] Cleaning previous builds. [OK] Finished.
Same thing happens with the dev version
Yes, if the configure script cannot detect which hardware to use, compilation failure could very well be the result.
swedchef last edited by
I'm just venturing into this world of building my own sensors - but perhaps i am a tad late? Two months since last update.. Typically me - showing up to the party when everybody else has left.
My main issue is, i am running the Raspberry Pi 4 - and when trying to build (i've tried both the development and master builds) i get from 4 (master build) to A BUNCH (development) of errors. First of all, the autodetect of SoC does not work for me either (just like @alowhum, and with the same warnings), and when using --help the actual SoC is not listed either, so should i just assume it does not work for Raspberry Pi 4?
Is there any chance the 4 will be supported soon?
Just a note - i can actually complete the configure and then make - but unfortunately i just get a TSP error when trying to fire up the radio.
Hope i can get this working as it was the main reason for upgrading my RaspberryPi version 1 to a version 4
Thanks in advance for any and all help!
Thanks for sharing your experience @swedchef
From the problems reported by users (you included), it seems like the rpi4 is quite different fom the earlier rpis. To add support, the following ingredients are needed in one person
- person needs to have sufficient knowledge and skills to figure out how to support the rpi4
- person needs to have sufficient time to do the work
- person needs to have a rpi4
- person needs to be sufficiently interested/motivated to do the work
It seems like, so far, we haven't found this person (or this person hasn't found us).
phildefer last edited by
i compile with success the gateway in Raspberry PI 4 (with some code modification)
this is not perfect.. but it works.
if someone wants to try, i upload the gateway compiled with this options :
--my-transport=rf24 --my-gateway=ethernet --my-port=5003
@phildefer could you please share what you changed? The security concerned might not be comfortable running a binary with unspecified changes that manages their home automation setup. Especially not a project supposed to be open source.
@phildefer would you mind sharing the code modifications that were needed?
phildefer last edited by
patrikr76 last edited by patrikr76
I got the same problem as @swedchef and saw the warnings @alowhum mentioned.
Simply upping the buffer that is declared in GPIO.cpp solved the warnings and made it compile without issue but the radio still won't work.
Maybe it has to do with the soc not being detected, as mentioned, and that the pin positions on the new soc are different from previous ones.
@phildefer, weekend has come and gone buddy. Patience is a virtue some do not have.
Edit: So looking a little more through the files today i see that configure looks for the soc type in /proc/cpuinfo and funnily my raspi 4 reports a BCM2835
Something has seriously mangled whitespace in the modified code, but apart from that it looks good to me, but I am not that familiar with the rpi code and I have not tested it myself.
patrikr76 last edited by patrikr76
You are correct.
@phildefer, thank you.
There were a couple of minor warnings about indentations and the buffer size i mentioned earlier fixed by upping the declared buffer in GPIO.cpp. Not sure if that is a good fix or not, the warning goes away though.
A few other warnings looks like this:
In member function ‘char* MyMessage::getString(char*) const’, inlined from ‘bool transportSendWrite(uint8_t, MyMessage&)’ at ./core/MyTransport.cpp:987:2, inlined from ‘bool transportRouteMessage(MyMessage&)’ at ./core/MyTransport.cpp:560:40, inlined from ‘void stUplinkTransition()’ at ./core/MyTransport.cpp:252:29: ./core/MyMessage.cpp:284:17: warning: ‘char* strncpy(char*, const char*, size_t)’ output may be truncated copying between 0 and 25 bytes from a string of length 25 [-Wstringop-truncation] (void)strncpy(buffer, this->data, this->getLength()); ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Not sure how to fix those.
Edit: Forgot to mention, it seems to be working though.
Thanks guys for the effort to port MySensors for the Pi 4.
I'm very interested, but my coding skills are not sufficient to help in the development. Maybe I can do some debug when my Pi4 will arrive
MySensors for the Pi4 is a must-have!
kiesel last edited by
I can confirm that the code compiles and runs on my rasbperry pi 4 model b. I am using a rfm69 radio and that seems to be working too. I couldn't test it yet though since I haven't wired any rfm69 nodes up yet.
@kiesel Good news!
I will test both (nrf24 and rfm69) when my Pi 4 arrive.
Ok my Pi 4 is arrived. I have 2 gateway, one RFM69 and one NRF24 connected respectively to spi0 and spi1. Details here.
With a Raspberry Pi 3 all works fine (compilation and execution) with both Rasbian Stretch and with Raspbian Buster.
With a Raspberry Pi 4 and the same version of Rasbian Buster the situation is a bit different:
- The RFM69 gateway on the SPI0 compiles and can be executed without problems. In this days I don't have an RFM69 radio module, so I don't know if it works, but the daemon start in a regular way.
- The NRF24 gateway compile, but after few seconds of execution the daemon stops with the following error.
Oct 26 13:59:47 ERROR Could not open /sys/class/gpio/gpio12/direction
Considering that the same configuration works for a Pi 3, it is possible that the error is caused by the autodetect of SoC issue mentioned above?
The details of my /boot/config.txt file are here
tested the RFM69 gateway with a radio module attached -> Not working
tried to compile and execute the NRF24 gateway on the first spi bus (--spi-spidev-device=/dev/spidev0.0) -> same error as above
ERROR Could not open /sys/class/gpio/gpio12/direction
I have checked my Makefile and configure files and they don't contain the modification proposed by @phildefer . Is this normal? I'm using the development branch.
Oct 27 20:50:41 DEBUG !TSM:INIT:TSP FAIL
Hi, if someone needs more info (debug, log, etc...) I'm here.
I can perform tests on Rpi 3 and Rpi 4 (Raspbian Buster) with NRF24 and RFM69 radio modules and then report the results. Not so much but maybe this can help the development.