OTA firmware update with external MQTT broker

  • First of all, Thank you for your all effort. This is nice and easy mysensors controller!

    Nowadays I'm trying to use OTA with mysensors.
    OTA works with serial gateway with MYSController but doesn't work with MyController with ESP8266 MQTT gateway.
    Probably I didn't know how to use OTA properly with MyController.

    Here is what I have been doing.

    1. Add firmware with Types and Version on Utilities => Firmware
    2. Select firmware from Resources => Node => detail => edit .

    Node run every 15minutes but nothing happen after 1hr later.
    No log at all..

    Here is my configuration

    Mysensors : 2.0.0

    Gateway :
    ESP8266 Devkit V3 MQTT Gateway
    Node :
    MySBootLoader : 1.1
    Using Smartsleep on Battery powered Arduino pro mini

    mosquitto MQTT on same server with myController

    Thank you.

  • @yd If your MQTT gateway have the fix for MQTT it will work properly.

  • @jkandasa Hi Jkandasa, Thank you for your reply!
    I have been working on this last couple of days and check what's different between MYSController and MYController.
    First, I have to set battery powered node on MYSController otherwise doesn't work either.
    However MYController can update firmware successfully when node is rebooted.
    I did send reboot command but seems not working properly.
    I think there is some different between normal node and battery powered node. ( Probably buffered in controller for battery powered node)
    My node can be shown on MYScontroller as battery powered node..

    Now I'm loading new firmware with wait(300) before/after smartsleep().

    Can you point what I'm missing please?

    Thank you.

  • @jkandasa I upload new firmware with wait(300) before/after smartsleep() but nothing happen.
    From following article, MYSController does something for battery powered node.


  • Is there any way to reboot battery powered node when I need?
    I did try to use rule but seems not triggered properly.
    I think if I can reboot node after load new firmware, it will work for me.

    Thank you in advance.

  • @yd I forget to mention a thing. You have to map your firmware with your node. If there is a reboot, your node will check with controller this is my firmware. Controller will respond as we have new firmware use this, Then node will request each block. This is how firmware update works. So you have to map your frimware with your node on MyController node page.

  • @jkandasa Thanks. Finally I've solved the issue but not in MyController.
    You are right. I did map new firmware and push reset button then it works however MYSController behavior is a little bit different for battery powered node.

    When I look into smartsleep(), it send heartbeat() before going to sleep.
    I guess MYSController check firmware version between MYSController and node then if it's different, it send reboot command automatically. Then node restart and process firmware upgrade. So firmware upgrade works well with battery powered node.
    If you add this function to MyController, it will be great.


  • @yd Sure, I will add this. Kindly create feature request on https://github.com/mycontroller-org/mycontroller/issues

  • @yd, Would you be willing to share how you got the bootloader loaded to your nodes and got OTA firmware updates working with MyController?

    I've been trying for days now and every guide, or forum post I've found is way over my head. I'm confused with all the fuse settings etc that people are discussing and just want to load MYSBootloader to my nodes so I can push the updates from the Controller. All the other jargon is bogging me down.

    I'm running MySensors 2.0 on a Serial Gateway and the nodes, and My Controller v0.0.3-FINAL2


  • @imedia You don't need to change fuse for OTA. It's mostly for low battery.
    I've use mysensors boot loader from MYSController 0_1_2_282.
    However you need usbasp bootloader burning cable and also I use avrdudess s/w to burn boot loader.
    I don't know why but I was unable to burn bootloader from arduino or any other s/w.
    Only problem is after you use mysensors bootloader, you can't use arduino to burn firmware on it.
    Ah I use arduino pro mini 3.3V version.

    After you load firmware on MYController, you have to reset node to start burn firmware from controller.

    Hope this save your time.


  • Thanks for the info @yd, going to give this a try shortly..

    Just to confirm, I export the sketch (firmware) using Sketch > Export compiled binary in the Arduino IDE correct? I then import that file into MySensors on the Firmware page. However, on that page it says "Nothing Selected" for both the Type and Version. There is also nothing appearing in the drop downs to select something and you cannot save and upload the firmware without selecting both these drope downs. Maybe @jkandasa can advise on that?

    So Let's assume I can get the firmware loaded into MyController. How does the node know to connect this specific Gateway / MyController and download it's specific firmware? There needs to be a relationship between the two created correct? If so how is that created and ensure the correct node is getting the correct firmware from the correct controller?


  • @imedia

    Well you'd better see following link to get HEX file.
    https://www.mysensors.org/about/ota (search "How to upload a new sketch just with OTA")
    Then you can find hex file in build.path

    In MyController, you have to create new type and version first then you can select the type and version then upload HEX file.

    Once you upload firmware, you can go Resources => Node then you can select any node which you want to uplpad firmware. Then edit node and select firmware.

    Don't forget reset node to get new firmware.


  • @imedia One more thing you need to know.
    Once you got New boot loader, you are unable to use arduino sketch to put new firmware.
    You have to use OTA. It took 5-10minutes;; Not sure what's wrong with this but it looks like mysensors boot loader bug or how it works.


  • @yd I'm not sure where you create the new "type" and "version" you are referring to? Can you please be more specific?

    Also, I understand that the firmwares will need to be loaded to the nodes via MyController once the node is running the MYSBootloader. My question is, how does the node with just a bootloader installed know where to find its firmware? What tells a newly loaded node with only the bootloader on it where and what firmware it should be running?

    Let's say I get a brand new Pro Mini, I flash it with the bootloader. Then what? Is there some type of configuration I need to do on the bootloader before loading it so it has a unique ID or something? How does it find home when it doesn't know where home is?

  • @imedia
    Add type
    Utilities => Firmwares => Click "Types" on right top => click "Add firmware type" right next => add new record
    Add version
    Utilities => Firmwares => Click "Versions" on right top => click "Add firmware version" right next => add new record

    After you flash MYSBootLoader, you will see the node ID in MYController node list.
    You can select the node and click action then you can edit node.
    From that screen, you will be able to select one of firmware which you have uploaded in utilities.

    Once you upload MYSBootloader, Once you have new bootloader, the node doesn't have firmware so keep sending request to controller to get firmware. Obviously your gateway should work as expected.
    Hope this help you.


  • Thank you so much. I feel dumb for not figuring out the adding of the Types and Versions.. I guess when I saw those buttons there I thought they were for sorting rather than managing sub-lists. Maybe some UI improvements needed here, or maybe I'm just tired. Eiter way, thanks for clarifying on that.

    I think I have a better idea what to do now. We should get a WIKI going as I can't seem to come up with much in terms of documentation other than the forum? +1? 🙂

  • @imedia
    Seem you are on the right track. If you make a simple wiki document for newbie after you success, it will be huge help for the community.
    English is my second language so it will take long time for me and afraid not crystal clear for everyone^^;

  • @yd / @jkandasa ,

    I would be more than happy to do the writing, I am quite new to the platform however so I'm still discovering the system myself as you can see...

    With your help I can write the documentation once I understand what exactly it is I'm documenting. I see @jkandasa has already an outline created on GIT hub, we just need to add moer specifics to that. Hotlinking to support right in the application will also be a huge help to users.

  • @imedia Have you checked user manual? Which is available on http://www.mycontroller.org/files/docs/0.0.3.Alpha2.pdf for the last released version. I hope this manual will help you to understand more on configuration.

    How node gets new firmware from Controller?

    Once you installed and turned on brand new node, following actions done.

    • Requests node id from controller, Controller gives next available node for the new node. Node id will be stores on eeprom, So this is permanent node id for this node(Until we trigger Erase configuration from controller).
    • By default brand new node has type id as 65535 and version id as 65535. node sends this information to MyController.
    • If you have enabled and configured, Support default firmware on MyController, default firmware will be sent to node. Otherwise controller will not respond for the firmware request, as controller does not know which firmware have to send.
    • Once node appeared on nodes list. You have to select your firmware for that node and trigger reboot.
    • Now your node will request with 65535 as version id and type id. However controller has different type id and version id for this node. Controller will send configured firmware type id and version id. Now node takes the controller configuration and requests firmware for that configuration.
    • New firmware will be loaded on your node.(Which is configured on controller's node page)

    Hope this will help you to understand more depth about firmware update on node.

  • Great, thanks again @jkandasa!

    I tried this and got it to work, however, some clarification is still needed as my results are inconsistent.

    First thing I noticed is, when the .hex file is generated by the Arduino IDE two .hex files are created:

    • SketchName.ino.hex

    • SketchName.ino.with_bootloader.hex

    Which one should be uploaded to the MyController Firmware section? Does it matter?

    Next, a little more clarification on the update process...

    Once a new version of the firmware is uploaded into MyController, how do we push that out to the node?

    I know there is an option to select the node and then from the Actions Menu choose "Upload firmware". Does that initiate the upload immediately and refresh refresh the node or must a "Reboot" be selected after pushing "Upload firmware"?

    If a reboot is needed, can it be done immediately after choosing "Upload firmware"? If not how long should we wait before clicking "Reboot"?

    I'm able to get the updates out eventually but that is just because I keep clicking reboot and upload, and even resetting the node manually. That seems like a poor way to achieve what I am doing. There must be a certain order to doing this with consistent results. I would like to know what part of what I am doing is actually necessary and what is not.

    Can you please provide a step by step guide.

    Also, is there any way we could monitor the Firmware Upload progress in MyController? That would be very helpful. Should I add that feature request to GitHub?

Suggested Topics