[ISSUE] Monitor One Custom Firmware OTA not changing

Hi all, happy new year!

We write a custom app for Monitor One. It has a PRODUCT_VERSION(...) definition in main.cpp (right after PRODUCT_ID(...)). The app compiles locally using workbench (toolchain v1.16.0, device OS v4.2.0).

When I particle flash <deviceID> <path-to-binary> (CLI v3.30.3), I get the "Flash success!" message, console reports 'flash started', followed by 'flash success' and the device comes back online and continues its normal operation.

However: the product version reported by console does not update and monitor one continues running the old binary (functionality fixed in new binary remains broken even after 'OTA success'). I have also tried uploading the binary and flashing from console directly, which appears to have the same error. Only flashing locally via USB updates the binary on the device. I have tried with 3 different monitor ones. The only time an OTA update was successful was when the device was first updated from factory firmware. "Force enable updates" via console made no difference.

What are the possible causes and how do you suggest resolving this? Our product is remotely deployed so USB updates are not possible outside of our development environment. Thanks!

Is the device marked as a development device? If it's not marked as a development device, as soon as it comes online it will be switched to the product default firmware or the lock and flashed version for that device.

You must mark any device to be flashed manually as a development device. Once you have determined that it is working, you can upload the firmware to the Firmware tab of your product and roll the update out to the rest of the fleet.

It is marked development, but it is still coming back online and immediately reporting the existing firmware version. The console does not show any signs of trying to OTA update back to the old version and all events are still tagged with the old Product Version number. Any other ideas what might be blocking updates?

Our firmware does call System.disableUpdates() and System.enableUpdates() but using console's Force Enable OTA should override these, correct? Neither call would result in the device choosing to ignore what the console reports as an in-progress update, correct?

1 Like

No, it does not work that way. When you use particle flash it will only flash immediately. If the device is offline or in disableUpdates mode the update will be discarded and never be applied.

The Force Enable OTA is only used when doing a product firmware update after uploading your binary to the console product firmware tab and updating devices that way.

Makes sense, thanks for the clarification