Skip to content
  • MySensors
  • OpenHardware.io
  • Categories
  • Recent
  • Tags
  • Popular
Skins
  • Light
  • Brite
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Default (No Skin)
  • No Skin
Collapse
Brand Logo
  1. Home
  2. Development
  3. Porting MySensors to work with the RadioHead library

Porting MySensors to work with the RadioHead library

Scheduled Pinned Locked Moved Development
portingradiohead
288 Posts 24 Posters 187.4k Views 12 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • YveauxY Yveaux

    @kolaf said:

    For instance, when you initialise the manager (after giving it the driver) it sets up a bunch of defaults.

    Yes, I see it calls init() from the driver, which sucks...
    I'll guess you want gw.setradio to initialize the manager then (which in turn initializes the driver)? This way you'll be able to modify the driver's parameters before MySensors starts. Not a very elegant way... (but I also don't have a better solution at the moment...)

    K Offline
    K Offline
    kolaf
    Hero Member
    wrote on last edited by
    #88

    @Yveaux Exactly.

    1 Reply Last reply
    0
    • YveauxY Offline
      YveauxY Offline
      Yveaux
      Mod
      wrote on last edited by
      #89

      @kolaf Have you checked initialization of the managers for any radio communication taking place? If it does, your solution will not work as it will be executed using the default radio parameters...

      http://yveaux.blogspot.nl

      K 1 Reply Last reply
      0
      • YveauxY Yveaux

        @kolaf Have you checked initialization of the managers for any radio communication taking place? If it does, your solution will not work as it will be executed using the default radio parameters...

        K Offline
        K Offline
        kolaf
        Hero Member
        wrote on last edited by
        #90

        @Yveaux I don't think there is any radio communication, it just initialises the radio chip and confirms that it is able to communicate with it. Otherwise you would have had real problems with trying to start every radio at the same time :-)

        1 Reply Last reply
        0
        • YveauxY Yveaux

          I just built my first nRF24L01+ setup using the RadioHead library running the nrf24_reliable_datagram_client and nrf24_reliable_datagram_server sketches on two Uno's.

          Works like a charm, after I disconnected the interrupt line to the nRF24.
          Don't know why yet (possibly an interrupt handler is 'secretly' installed by the library), but it took me some time to figure out...

          Also requires the driver to be constructed as RH_NRF24 driver(9, 10) when using the MySensors connection-scheme.

          YveauxY Offline
          YveauxY Offline
          Yveaux
          Mod
          wrote on last edited by
          #91

          @Yveaux said:

          Works like a charm, after I disconnected the interrupt line to the nRF24.

          I went through the RadioHead code, looking for enabled INT0 interrupts, interrupts handlers etc. in nRF24 code.
          Found none, so tested again today, with the interrupt line connected.

          Now it also works with interrupt connected...

          Don't know what went wrong before.

          http://yveaux.blogspot.nl

          K 1 Reply Last reply
          0
          • YveauxY Yveaux

            @Yveaux said:

            Works like a charm, after I disconnected the interrupt line to the nRF24.

            I went through the RadioHead code, looking for enabled INT0 interrupts, interrupts handlers etc. in nRF24 code.
            Found none, so tested again today, with the interrupt line connected.

            Now it also works with interrupt connected...

            Don't know what went wrong before.

            K Offline
            K Offline
            kolaf
            Hero Member
            wrote on last edited by
            #92

            @Yveaux Good to hear that it is working out for you. I'm very curious to see whether you can get my version of the library working with your radio.

            I have posted on the Radiohead group to see whether they can implement a generic sleep function in the driver or in the manager. This would make it much easier for us to put everything to sleep when required. Short of that the only reasonable solution I can see to fix this is to create a sleep function in the sensor source code and pass this as a parameter to the library. Alternatively we can build a different sleep functions in the library, but I guess this will cause the same problems as you talked about earlier with bringing in a lot of code we do not need.

            YveauxY hekH 3 Replies Last reply
            0
            • K kolaf

              @Yveaux Good to hear that it is working out for you. I'm very curious to see whether you can get my version of the library working with your radio.

              I have posted on the Radiohead group to see whether they can implement a generic sleep function in the driver or in the manager. This would make it much easier for us to put everything to sleep when required. Short of that the only reasonable solution I can see to fix this is to create a sleep function in the sensor source code and pass this as a parameter to the library. Alternatively we can build a different sleep functions in the library, but I guess this will cause the same problems as you talked about earlier with bringing in a lot of code we do not need.

              YveauxY Offline
              YveauxY Offline
              Yveaux
              Mod
              wrote on last edited by
              #93

              @kolaf said:

              I have posted on the Radiohead group to see whether they can implement a generic sleep function in the driver or in the manager

              Ah great! Let's see how flexible they are ;-)

              Btw. I'm not totally dismissive of the idea of making small changes to the RadioHead library when it makes our life easier to get a clean interface for MySensors users. Indeed, we have to sync changes (which are almost on a daily basis right now, but that will settle over time) but when the changes to the original library are relatively small this won't be too hard.

              Anyway, let's not give up yet and see if we can use the vanilla library.

              http://yveaux.blogspot.nl

              1 Reply Last reply
              0
              • YveauxY Offline
                YveauxY Offline
                Yveaux
                Mod
                wrote on last edited by
                #94

                I created a github repo containing the RadioHead sources, including change history. The code is commit using a script, so future updates can easily be added.

                IMHO having the RadioHead library sourcecode under version control is a requrement for inclusion in MySensors and if we ever decide to make small changes to the library we can now easily fork from the original sourcecode.

                Get it at https://github.com/Yveaux/RadioHead

                http://yveaux.blogspot.nl

                1 Reply Last reply
                0
                • K kolaf

                  @Yveaux Good to hear that it is working out for you. I'm very curious to see whether you can get my version of the library working with your radio.

                  I have posted on the Radiohead group to see whether they can implement a generic sleep function in the driver or in the manager. This would make it much easier for us to put everything to sleep when required. Short of that the only reasonable solution I can see to fix this is to create a sleep function in the sensor source code and pass this as a parameter to the library. Alternatively we can build a different sleep functions in the library, but I guess this will cause the same problems as you talked about earlier with bringing in a lot of code we do not need.

                  hekH Offline
                  hekH Offline
                  hek
                  Admin
                  wrote on last edited by hek
                  #95

                  @kolaf

                  Agree on keeping the radio specific sleeping in each driver is the best option.

                  1 Reply Last reply
                  0
                  • Z Offline
                    Z Offline
                    Zeph
                    Hero Member
                    wrote on last edited by
                    #96

                    Are we talking here about

                    (1) each radio driver having its own full sleep library to put the processor to sleep (potentially in addition to the sleep library used by the main sketch), or

                    (2) just each radio driver having its own function to put its radio into low power mode with/without IRQ?

                    1 Reply Last reply
                    0
                    • K Offline
                      K Offline
                      kolaf
                      Hero Member
                      wrote on last edited by
                      #97

                      Just (2)

                      1 Reply Last reply
                      0
                      • Z Offline
                        Z Offline
                        Zeph
                        Hero Member
                        wrote on last edited by
                        #98

                        Good. Let's call it prepare-to-sleep or power-down or something rather than sleep.

                        K 1 Reply Last reply
                        0
                        • Z Zeph

                          Good. Let's call it prepare-to-sleep or power-down or something rather than sleep.

                          K Offline
                          K Offline
                          kolaf
                          Hero Member
                          wrote on last edited by
                          #99

                          @Zeph Fair enough.

                          Since I'm not getting any response on their mailing list, perhaps we should just go ahead and implement something. My plan is to create a virtualised powerdown in RHGenericDriver and then implement a reasonable default at least for the two radios we use. We can then expand this as we gain more experience. I know that for the RF69 driver this should be no more than five minutes work. Does anyone want to take care of your radios?

                          K 1 Reply Last reply
                          0
                          • K kolaf

                            @Zeph Fair enough.

                            Since I'm not getting any response on their mailing list, perhaps we should just go ahead and implement something. My plan is to create a virtualised powerdown in RHGenericDriver and then implement a reasonable default at least for the two radios we use. We can then expand this as we gain more experience. I know that for the RF69 driver this should be no more than five minutes work. Does anyone want to take care of your radios?

                            K Offline
                            K Offline
                            kolaf
                            Hero Member
                            wrote on last edited by
                            #100

                            If it works out, we can send them a patch :-)

                            1 Reply Last reply
                            0
                            • K kolaf

                              Hi guys,

                              I have received my Moteinos and anarduinos with RFM69HW radios. The anarduino webpage recommends a radio library called RadioHead which supports multiple radio tips and provides a common API for communication. http://www.airspayce.com/mikem/arduino/RadioHead/

                              It even supports quite complex things such as mesh networks. It currently supports the following radios:

                              • RH_RF22 Works with Hope-RF RF22B and RF23B based transceivers, and compatible chips and modules, including the RFM22B transceiver module. Supports GFSK, FSK and OOK. Access to other chip features such as on-chip temperature measurement, analog-digital converter, transmitter power control etc is also provided.
                              • RH_RF69 Works with Hope-RF RF69B based radio modules, such as the RFM69 module, (as used on the excellent Moteino and Moteino-USB boards from LowPowerLab http://lowpowerlab.com/moteino/) and compatible chips and modules such as RFM69W, RFM69HW, RFM69CW, RFM69HCW (Semtech SX1231, SX1231H). Also works with Anarduino MiniWireless -CW and -HW boards http://www.anarduino.com/miniwireless/ including the marvellous high powered MinWireless-HW (with 20dBm output for excelent range). Supports GFSK, FSK.
                              • RH_NRF24 Works with Nordic nRF24 based 2.4GHz radio modules, such as nRF24L01 and others. Also works with Hope-RF RFM73 and compatible devices (such as BK2423). nRF24L01 and RFM73 can interoperate with each other.
                              • RH_NRF905 Works with Nordic nRF905 based 433/868/915 MHz radio modules.
                              • RH_RF95 Works with Semtech SX1276/77/78 and HopeRF RFM95/96/97/98 and other similar LoRa capable radios. Supports Long Range (LoRa) with spread spectrum frequency hopping, large payloads etc. FSK/GFSK/OOK modes are not (yet) supported.
                              • RH_ASK Works with a range of inexpensive ASK (amplitude shift keying) RF transceivers such as RX-B1 (also known as ST-RX04-ASK) receiver; TX-C1 transmitter and DR3100 transceiver; FS1000A/XY-MK-5V transceiver; HopeRF RFM83C / RFM85. Supports ASK (OOK).
                              • RH_Serial Works with RS232, RS422, RS485, RS488 and other point-to-point and multidropped serial connections, or with TTL serial UARTs such as those on Arduino and many other processors, or with data radios with a serial port interface. RH_Serial23 provides packetization and error detection over any hardware or virtual serial connection.
                              • RH_TCP For use with simulated sketches compiled and running on Linux. Works with tools/etherSimulator.pl to pass messages between simulated sketches, allowing testing of Manager classes on Linux and without need for real radios or other transport hardware.
                                ``

                              Seeing as the radio that is currently supported by MySensors is also supported by RadioHead I was wondering if anyone was interested in helping me porting MySensors to work with the RadioHead library. This will greatly increase the versatility of the MySensors library and magically allow it to work with a range of different radios :-).

                              I have briefly looked at the MySensors source code and it looks like most of the changes have to be done in MySensors.h and .cpp files.

                              I am willing to take a stab at it, but as everyone else I am limited on time. Still, it looks like it should not be a very difficult task. As discussed in another thread, it should be sufficient either to subclass the new radio library and replace a bunch of function calls, or drop the subclassing altogether and simply use the radio library as a regular included library.

                              The obvious difficulty comes soon as MySensors requires a function that is not available in the new radio library. However, seeing as MySensors is a pretty high-level library, and the API support from radioHead seems quite good, I suspect it should be possible to get around any such problems.

                              Anyway, I'm thinking of creating a branch of the library and spending a few hours trying to port it and get some basic functionality to work. Is anyone else is any value in this it would be great to have some help :-)

                              K Offline
                              K Offline
                              kolaf
                              Hero Member
                              wrote on last edited by
                              #101

                              Scratch my previous messages. I took a new look at the documentation and there appears to be a function setMode which can set the radio to TX, RX, and idle. I think the idle mode is as close as you come to sleeping, and I know that several of the drivers have a function called setIdleMode which you can use to define how the radio sleeps. This means that we can initialise the sleep function in the same way as we initialise the the other radio specific parameters (e.g. power and frequency), and then simply set the radio to the generic idle mode when sleeping.

                              1 Reply Last reply
                              0
                              • YveauxY Offline
                                YveauxY Offline
                                Yveaux
                                Mod
                                wrote on last edited by Yveaux
                                #102

                                Just a small update on my effort to get RadioHead & MySensors working with nRF24L01+...
                                I managed to get the node configured correctly using the MySensors 'defaults'.
                                I see data getting sent over the air (as my sniffer captures it). The only data on air, captured by Wireshark, is:

                                ff:7e:01:00:ff:7e:00:52:00:01:01:00
                                ff:7e:02:00:ff:7e:00:53:00:01:01:00
                                ff:7e:03:00:ff:7e:00:54:00:01:01:00
                                ff:7e:04:00:ff:7e:00:55:00:01:01:00
                                etc.
                                

                                Roughly 4 seconds apart.
                                I have to dive deeper into the protocol , but I suspect this is the node sending broadcasting requests to find a parent.
                                The gateway doesn't acknowledge these broadcasts yet...
                                Fixed a few small issues in the nRF24 driver along the way (see https://github.com/Yveaux/RadioHead/commits/MySensors/RadioHead/RH_NRF24.cpp)
                                Seems like I'm almost there!

                                Some things I miss in the library:

                                • Normally the nRF24 changes its destination address when sending to the destination's node address. The current driver/RadioHead implementation just always broadcasts and the header of the data determines which node the data is really for. This means any node within range will always have to process all messages coming in to determine if they are meant for it or not. From a generic driver point-of-view I understand this approach, but it ignores powerful functionality of the nRF24. As the nRF24 is still the main radio target for the MySensors library we might have to think about a solution.
                                • The library does not use the auto-acknowledge feature of the nRF24 but instead seems to retry on application level. Another nice feauture of the nRF24 which remains unused...

                                http://yveaux.blogspot.nl

                                1 Reply Last reply
                                0
                                • K Offline
                                  K Offline
                                  kolaf
                                  Hero Member
                                  wrote on last edited by
                                  #103

                                  I would guess it is a arp request. Weird that it does not use the radio properly, I think both addressing and retransmission works well with rf69.

                                  1 Reply Last reply
                                  0
                                  • hekH Offline
                                    hekH Offline
                                    hek
                                    Admin
                                    wrote on last edited by
                                    #104

                                    Using auto-ack would be impossible (i think) using the in radioheads mesh-setup where every message basically is a broadcast.

                                    I wondoer if it would it be possible to implement a mySensors class similar to RHMesh which actually works like MySensors do today using a star-topology and direct-addressed messages?

                                    K T 2 Replies Last reply
                                    0
                                    • hekH hek

                                      Using auto-ack would be impossible (i think) using the in radioheads mesh-setup where every message basically is a broadcast.

                                      I wondoer if it would it be possible to implement a mySensors class similar to RHMesh which actually works like MySensors do today using a star-topology and direct-addressed messages?

                                      K Offline
                                      K Offline
                                      kolaf
                                      Hero Member
                                      wrote on last edited by
                                      #105

                                      radiohead uses direct messaging, with an arp protocol and route discovery to build local routing tables, much as original mysensors. At least as far as I understand it.

                                      Do you use the same library in both the sensor and gateway? It won't work of you mix network layer protocols.

                                      K 1 Reply Last reply
                                      0
                                      • K kolaf

                                        radiohead uses direct messaging, with an arp protocol and route discovery to build local routing tables, much as original mysensors. At least as far as I understand it.

                                        Do you use the same library in both the sensor and gateway? It won't work of you mix network layer protocols.

                                        K Offline
                                        K Offline
                                        kolaf
                                        Hero Member
                                        wrote on last edited by
                                        #106

                                        @kolaf with hop by hop acknowledgements

                                        1 Reply Last reply
                                        0
                                        • YveauxY Offline
                                          YveauxY Offline
                                          Yveaux
                                          Mod
                                          wrote on last edited by Yveaux
                                          #107

                                          @Yveaux said:

                                          ff:7e:01:00:ff:7e:00:52:00:01:01:00

                                          Ok, read a bit through the docs. Apparently this is what is sent:

                                          RHDatagram:  ff:7e:01:00     (TO:FROM:ID:FLAGS)
                                          RHRouter:    ff:7e:00:52:00  (DEST:SOURCE:HOPS:ID:FLAGS)
                                          RHMesh:      01:01:00        (ROUTE_DISCOVERY_REQUEST:<RESERVED>:DEST)
                                          

                                          Therefore the destination and source address are sent TWICE (destination even 3 times with nRF24, as the destination address is part of the nRF24 header). An ID byte (incremented with each message sent) is also present in RHDatagram & RHRouter.
                                          After the route is known, sending through RHMesh still requires 1 byte to indicate application payload is transmitted.
                                          For short, Every message will require 10 bytes header, at least, to which the MySensors payload is added (including its own header of currently 4 bytes) giving at least 14 bytes overhead of 32 bytes total.
                                          To me this feels like too much....

                                          http://yveaux.blogspot.nl

                                          T 1 Reply Last reply
                                          0
                                          Reply
                                          • Reply as topic
                                          Log in to reply
                                          • Oldest to Newest
                                          • Newest to Oldest
                                          • Most Votes


                                          18

                                          Online

                                          11.7k

                                          Users

                                          11.2k

                                          Topics

                                          113.0k

                                          Posts


                                          Copyright 2019 TBD   |   Forum Guidelines   |   Privacy Policy   |   Terms of Service
                                          • Login

                                          • Don't have an account? Register

                                          • Login or register to search.
                                          • First post
                                            Last post
                                          0
                                          • MySensors
                                          • OpenHardware.io
                                          • Categories
                                          • Recent
                                          • Tags
                                          • Popular