Raspberry Pi is a small computer that uses very little power (2-3 watts). It has all the horsepower necessary to serve as a cloud-enabled all-in-one Controller.
Several controllers available here can run directly on the RPi. E.g. OpenHAB and PiDome.
Login to your Raspberry Pi and get the code from MySensors repository (master branch):
git clone https://github.com/mysensors/MySensors.git --branch master cd MySensors
Note: It seems there are communication issues with radio modules with latest "Jessie" versions, so development version is advised if problem arises.
To use the development version with the latest updates:
git clone https://github.com/mysensors/MySensors.git --branch development cd MySensors
A list of options to set the gateway is available by running the command:
Note: In options that requires a pin number, use the Raspberry Pi physical pin number and not the GPIO numbers.
The transports available are: nrf24, rs485, rfm95, rfm69
--my-transport=rfm69 --my-rfm69-frequency=868 --my-is-rfm69hw
The frequency can be set to 315,433,868 or 915 Mhz; --my-is-rfm69hw enables high-powered rfm69hw radios.
Note: The RaspberryPi uses the new RFM69 driver which is not compatible with the old (=default) RFM69 driver, you need to add #define MY_RFM69_NEW_DRIVER to your nodes to properly communicate with the gateway.
The types available are: ethernet, serial, mqtt
By default, the gateway is built for ethernet and it listens on port 5003:
To set the gateway as a client that connects to a controller, use:
If you are running a controller on the Raspberry Pi that doesn't support communication with the gateway through ethernet, you can use a virtual serial port:
--my-gateway=serial --my-serial-is-pty --my-serial-pty=/dev/ttyMySensorsGateway
For some controllers a more recognisable name needs to be used: e.g. /dev/ttyUSB020 (check if this is free).
The following is an example of how to build a MQTT gateway:
--my-gateway=mqtt --my-controller-ip-address=127.0.0.1 --my-mqtt-publish-topic-prefix=mysensors-out --my-mqtt-subscribe-topic-prefix=mysensors-in --my-mqtt-client-id=mygateway1
To build the gateway, run:
If there were no errors during compilation the file bin/mysgw will be created. If you get
No supported SPI driver detected
you need to enable SPI by running sudo raspi-config, Advanced -> SPI -> yes and reboot your Pi. Then run make again.
Note: Development branch only
There are some gateway settings that can be made through the configuration file, in which its default path is /etc/mysensors.conf, but you can set a different path with the --my-config-file=
The options present in this file can be changed without the need to recompile the gateway, a simple restart is sufficient for them to take effect.
The first time you start the gateway the configuration file will be created if it does not already exist.
The default settings are:
# Logging verbosity: debug,info,notice,warn,err verbose=debug # Enable logging to a file. log_file=0 # Log file path. log_filepath=/tmp/mysgw.log # Enable logging to a named pipe. log_pipe=0 # This option lets you view your gateway's log messages # running as a service without the need to save them to # a file or through the use of syslog. # The log messages are not buffered. # To open the pipe, run the following command on another # terminal: cat /tmp/mysgw.pipe log_pipe_file=/tmp/mysgw.pipe # Enable logging to syslog. syslog=0 eeprom_file=/etc/mysensors.eeprom eeprom_size=1024
The gateway needs root privilege to run, for a list of parameters that can be used, run:
sudo ./bin/mysgw -h
The first time you run the gateway, enable the debug messages to verify that it is working:
sudo ./bin/mysgw -d
Note: In the development branch debugging is enabled by default, -d is not necessary
The following message indicates that communication with the radio module failed:
mysgw: Starting gateway... mysgw: Protocol version - 2.2.0-beta mysgw: MCO:BGN:INIT GW,CP=RNNG---,VER=2.2.0-beta mysgw: TSM:INIT mysgw: TSF:WUR:MS=0 mysgw: !TSM:INIT:TSP FAIL mysgw: TSM:FAIL:CNT=1 mysgw: TSM:FAIL:PDT
A success message would be:
mysgw: Starting gateway... mysgw: Protocol version - 2.2.0-beta mysgw: MCO:BGN:INIT GW,CP=RNNG---,VER=2.2.0-beta mysgw: TSF:LRT:OK mysgw: TSM:INIT mysgw: TSF:WUR:MS=0 mysgw: TSM:INIT:TSP OK mysgw: TSM:INIT:GW MODE mysgw: TSM:READY:ID=0,PAR=0,DIS=0 mysgw: MCO:REG:NOT NEEDED mysgw: Listening for connections on 0.0.0.0:5003 mysgw: MCO:BGN:STP mysgw: MCO:BGN:INIT OK,TSP=1
If the test fails you are very welcome to ask for help in the forum. Make sure you include:
- a general description of what you are trying to do (ex: build a Raspberry Pi ethernet gateway with nrf24l01+ and connect to Domoticz)
- the exact configure command you used
- the output from the test
- the settings you used in your controller
To install run:
sudo make install
To start service automatically when the Raspberry boots:
sudo systemctl enable mysgw.service
Note: In the development branch, the gateway logging is controlled through a configuration file. Check the Configuration file section for more details.
When installed as a service, the output of the gateway will be directed to syslog in /var/log/syslog. Look at this file (less /var/log/syslog) to get information.
If you want full debug output from the gateway to be logged to syslog (including serial protocol) you have to edit the following file: /etc/systemd/system/mysgw.service
Add the -d parameter to the ExecStart line
[Service] ExecStart=/usr/local/bin/mysgw -d
Then reload the systemd process and restart the gateway
sudo systemctl daemon-reload sudo systemctl restart mysgw.service
Now the output from the gateway can be monitored by
tail -f /var/log/syslog
Mind that the gateway logging will now produce quite some output in syslog!
Use the Pin No. and not the GPIO.
Raspberry Pi 2/3
Raspberry Pi 1
(*): If you are using the nrf24 PA/LNA version you need to use a 5V->3.3V regulator because the Raspberry Pi 3.3V can't supply enough power.
(**): Optional, more info here.
(*): Solder a piece of wire, more info here
Improving throughput for nrf24
Note: The use of this functionality must be used with caution, there is a known issue that is still under investigation.
Normally the gateway asks the nrf24 module if a new radio message is available and then sleep a few milliseconds before asking again. This is necessary to avoid high CPU usage. During the gateway sleeping period, the module will still listen for new messages, but if multiple messages arrive, it won't take all.
There is another method were the interrupt pin from the nrf24 modules is used to inform when a new message arrives and it's immediately added to a queue for further processing. To use this method connect the interrupt pin from the nrf24 module to your Raspberry Pi (check the wiring part for more details) and use the "--my-rf24-irq-pin=PIN" option to build the gateway.
In the following example, the interrupt pin is connected to the Raspberry Pi pin 15:
The following is an example of how to add LEDs for ERR/RX/TX blinking.
--my-leds-err-pin=12 --my-leds-rx-pin=16 --my-leds-tx-pin=18
Other customizations can be made by editing the file example_linux/mysgw.cpp
It is also possible to set any define from the configure command by adding it to --extra-cxxflags. Example for turning on rfm95 debug:
Example for setting NRF24 message buffer size and data rate: