- Allow
PROP_FLAG_SIMPLE_TIME_SERIESfor object and array type parameters.
- Move
CONFIG_ESP_RMAKER_NETWORK_OVER_WIFIandCONFIG_ESP_RMAKER_NETWORK_OVER_THREADfromrmaker_commontoesp-rainmakercomponent.
- Add
ESP_RMAKER_REQ_SRC_BLE_LOCALinesp_rmaker_req_src_t, so that application code can differentiate between the Wi-Fi based local control (ESP_RMAKER_REQ_SRC_LOCAL) and BLE Local Control.
- De-couple work queue execution from MQTT connection. With this change, tasks added in work queue
using
esp_rmaker_work_queue_add_task()can execute as soon as the network connects. It won't be blocked for the MQTT connection and subsequent node config reporting. This is a behavioural change, so ensure that your usage ofesp_rmaker_work_queue_add_task()does not get affected. The internal users of this API (OTA fetch, schedule execution and user-node mapping) have already been fixed to account for this change. - Exposed
esp_rmaker_get_state()as public API. - Added
RMAKER_EVENT_STARTEDevent and raise the same once node params are reported. Since we have restructured the rmaker_start flow, functions enqueued before MQTT connected may get executed leading to issues. Please wait on this event if required.
- Store
mqtt_cred_hostfrom claim verify response if present. Used by camera devices that receive a separate MQTT credentials host from the claiming service.
- Added Ethernet network support for ESP RainMaker.
- RainMaker now supports Ethernet connectivity alongside Wi-Fi and Thread networks.
- Devices can use Ethernet, Wi-Fi, Thread, or any combination of these networks.
- RainMaker automatically uses whichever network connects first (Wi-Fi, Thread, or Ethernet).
- Ethernet support includes:
- Full MQTT connectivity over Ethernet
- On-network challenge-response service for user-node mapping via Ethernet
- mDNS service discovery for Ethernet-based devices
- Local control service support over Ethernet
- Note: Assisted claiming (BLE-based) is not supported for Ethernet-only devices.
- When multiple networks are enabled, both can be active simultaneously and RainMaker will use whichever connects first. The underlying network stack (LWIP) handles routing automatically.
- Fixed MQTT LWT configuration after assisted claiming: When connectivity service is enabled with an unclaimed node, the LWT topic was initialized with the MAC-based node ID. After assisted claiming, the node ID changed but the LWT topic was not updated, causing MQTT connection issues. LWT is now reconfigured with the new node ID when assisted claiming succeeds.
- Fixed misleading Connectivity
Connectedparam reporting: The param default was set from the MQTT connection status at enable time (typically false, since connectivity is enabled beforeesp_rmaker_start()). Params are only reported after MQTT connects, so the cloud received false initially then true after a delay. The default is now true to reflect the actual state when the param gets reported.
- Fixed memory management issues (leaks, missing NULL checks, inconsistent ownership) in client data retrieval APIs.
- Added Connectivity service so that clients can get connected/disconnected status of the node.
- Connected status is reported on receiving MQTT connected event.
- Disconnected status is reported via MQTT LWT.
- Delay for reporting connected status is configurable via
CONFIG_ESP_RMAKER_CONNECTIVITY_REPORT_DELAY. This is required to handle race condition when a device reboots quickly, the broker may trigger the old connection's LWT (Connected=false) after the new connection reports Connected=true, resulting in incorrect status.
- Move User Authentication part of RainMaker controller service to an independent service.
Components can register to
RMAKER_AUTH_SERVICE_EVENTevent to get the user token and base url updates. - Added
esp.param.user-token-statusin the RainMaker User Auth Service to indicate user-token state: 0 = not set; 1 = set but not verified; 2 = set and verified; 3 = set but expired/invalid. - Because group_id is not marked
PROP_FLAG_PERSIST, it must be stored manually in the RainMaker Controller.
- Added BLE local control during provisioning phase.
- Enable via
CONFIG_ESP_RMAKER_ENABLE_PROV_LOCAL_CTRLin menuconfig. - Requires challenge-response to be enabled (
CONFIG_ESP_RMAKER_ENABLE_CHALLENGE_RESPONSE). - Adds custom provisioning endpoints for direct parameter access over BLE:
get_params: Retrieve current device parameters.set_params: Update device parameters.get_config: Retrieve node configuration with fragmented transfer support for BLE MTU limits.
get_paramsandget_configreturn raw JSON by default. If a timestamp is provided, the response includes the data, timestamp, and signature for verification.- These handlers stay active only while in provisioning mode.
- Recommend setting
CONFIG_APP_NETWORK_PROV_TIMEOUT_PERIOD=0to keep device in provisioning mode indefinitely and hence, reachable for local control over BLE. - Note: This uses custom provisioning endpoints, not
esp_local_ctrl, as the latter is designed for HTTP-based local control.
- Enable via
- Add support of on-network challenge-response service for Thread devices.
- Add support for ECDSA key type for claiming. You can choose between RSA (legacy) and ECDSA via Kconfig options
CONFIG_ESP_RMAKER_CLAIM_KEY_RSA/CONFIG_ESP_RMAKER_CLAIM_KEY_ECDSA.idf.py menuconfig -> ESP RainMaker Config -> Claiming Key Type -> RSA (2048-bit)/ECDSA (P-256)
- Implemented option to report 'failed' status on OTA rollback due to MQTT timeout.
- Enable via
CONFIG_ESP_RMAKER_OTA_ROLLBACK_REPORT_FAILEDin menuconfig. - When enabled, if a rollback happens because MQTT did not connect within the configured timeout, the rolled-back firmware will report 'failed' status instead of 'rejected'.
- Ensures backward compatibility: older firmware versions (without this feature) will not report any status, preventing incorrect 'rejected' reports.
- Only applicable for
OTA_USING_TOPICStype. - Implementation details:
- New firmware stores failure reason and job ID in separate NVS keys before rollback.
- Rolled-back firmware reads these keys and reports 'failed' status with appropriate job ID.
- Main job ID key is erased before rollback to prevent old firmware from reporting 'rejected'.
- WARNING: Use this option with caution. If the new firmware has issues that cause persistent MQTT connection failures, enabling this feature may cause the device to toggle between two firmware versions indefinitely (new firmware boots → MQTT fails → rollback → OTA retry → new firmware boots again).
- Enable via
-
Added on-network challenge-response service for user-node mapping.
- Enable via
CONFIG_ESP_RMAKER_ON_NETWORK_CHAL_RESP_ENABLEin menuconfig. - Allows mapping already-provisioned devices to user accounts without re-provisioning.
- Starts an HTTP server (default port 80) with protocomm security (Sec0/Sec1/Sec2).
- Devices announce themselves via mDNS service type
_esp_rmaker_chal_resp._tcp. - Challenge-response endpoint:
ch_resp. - TXT records include:
node_id,port,sec_version,pop_required. - Optional instance name support via
config.mdns_instance_name(NULL uses node_id). - APIs:
esp_rmaker_on_network_chal_resp_start(),esp_rmaker_on_network_chal_resp_stop(),esp_rmaker_on_network_chal_resp_is_running(). - Note: Mutually exclusive with Local Control (
CONFIG_ESP_RMAKER_LOCAL_CTRL_FEATURE_ENABLE) as both use protocomm_httpd which only supports one instance at a time.
- Enable via
-
Added challenge-response endpoint in Local Control service.
- Enable via
CONFIG_ESP_RMAKER_LOCAL_CTRL_CHAL_RESP_ENABLEin menuconfig. - Registers
ch_respendpoint in the Local Control HTTP server. - Announces mDNS service
_esp_rmaker_chal_resp._tcp(same as standalone service for consistency). - TXT records include:
node_id,port,sec_version,pop_required. - Optional instance name parameter (NULL uses node_id as default).
- APIs:
esp_rmaker_local_ctrl_enable_chal_resp(instance_name),esp_rmaker_local_ctrl_disable_chal_resp(). - Both standalone and local control ch_resp use the same mDNS service type, simplifying discovery.
- Enable via
-
Added
esp_rmaker_local_ctrl_set_pop()API to set custom PoP for Local Control.- Allows using the same PoP as provisioning for Local Control service.
- Must be called before
esp_rmaker_local_ctrl_enable().
-
Added console commands to enable/disable these handlers based on
CONFIG_ESP_RMAKER_CONSOLE_CHAL_RESP_CMDS_ENABLE.- Console command:
chal-resp-enable [instance_name](instance name is optional). - The appropriate APIs are called based on whether
CONFIG_ESP_RMAKER_ON_NETWORK_CHAL_RESP_ENABLEorCONFIG_ESP_RMAKER_LOCAL_CTRL_CHAL_RESP_ENABLEis enabled.
- Console command:
- Fixed an issue where HTTP OTA resumption reported incorrect progress, even though the OTA itself could still succeed.
- Fixed when use ECDSA to sign the data, the device will crash.
- If assisted claiming was already performed before calling
esp_rmaker_start(), the firmware was stalling with an incorrect print saying that the Node connected to network without claiming.
- Added Groups service to enable direct MQTT communication between nodes and clients (phone apps/controllers).
- Setting group_id via the Groups service routes local param updates to group-specific topics
(
node/<node_id>/params/local/<group_id>) for lower latency. - Also added
esp_rmaker_publish_direct()API to publish messages onnode/<node_id>/direct/params/local/<group_id>for direct client-to-node communication, bypassing cloud processing for reduced cost and latency. - Clients can also publish param updates directly to
node/<node_id>/params/remote/<group_id>instead of using the set params API.
- Setting group_id via the Groups service routes local param updates to group-specific topics
(
- Assisted claiming is now the default for all supported platforms (requires Bluetooth enabled and not ESP32S2).
Previously, it was only the default for ESP32. To revert to self claiming, set
CONFIG_ESP_RMAKER_SELF_CLAIM=yin menuconfig. - Challenge response based user-node mapping is now enabled by default. This replaces the traditional user-node mapping flow.
To disable it, set
CONFIG_ESP_RMAKER_ENABLE_CHALLENGE_RESPONSE=nin menuconfig. Note that challenge response requires the node to be claimed before it can be used.
- Added RainMaker user Auth Service
- Added helper layer for RainMaker Controller
- Added optional
readmefield to node info: Allows example projects to include a README URL in the node configuration. The readme field will be included in node config only if its value is not NULL and not an empty string. This can be set using theesp_rmaker_node_add_readme()API.
- Decouple esp_rcp_update from esp_rainmaker and it is not a core functionality of RainMaker
- Added set-param, get-param and update-param console commands to assist in some testing
- Make version dependency for network_provisioning more flexible
- Added AWS credential provider APIs, required for RainMaker Camera applications.
- Disabled esp_bt code from ota code for supporting esp32-p4, which uses network adapters for Bluetooth.
- Some guards for
CONFIG_ESP_RMAKER_CMD_RESP_ENABLEandCONFIG_ESP_RMAKER_PARAM_CMD_RESP_ENABLEwere missing.
- Changed default MQTT Host URL to mqtt.rainmaker.espressif.com to match the domain conigured on public RainMaker.
- Add
network-idattribute to Thread rainmaker nodes.
This attribute represents the partition ID of the Thread network, which is used to determine whether Thread nodes belong to the same network.
- Add parameter updates via command-response (command id 1): Enables triggering parameter
updates through the command-response framework with proper JSON response containing
updated parameter values. Controlled by
CONFIG_ESP_RMAKER_PARAM_CMD_RESP_ENABLE(enabled by default when command-response is enabled). This will also update the values in the params DB returned via the regular get params APIs like GET /user/nodes/params.- Sample command payload:
{"params":{"Light":{"Power":false}}} - Sample response payload:
{"status":"success","params":{"Light":{"Power":false}}}
- Sample command payload:
- Add RainMaker OTA resumption feature. The OTA process will resume downloading from the last position instead of restarting the download.
OTA will check whether the MD5 values of the two consecutive files are the same. If the same, the OTA will continue; if they are different, the OTA will restart. Therefore, cloud support for delivering the file MD5 value is required (supported in backend version 3.0.0 and above). In addition, this feature requires IDF version 5.5 and above.
-
Daylight (Sunrise/Sunset) Schedules: Added support for scheduling device actions based on astronomical calculations for sunrise and sunset times.
- Supports scheduling at specific offsets from sunrise/sunset (e.g., 30 minutes before sunset)
- Works with day-of-week repeat patterns (e.g., "every weekday at sunset")
- Requires geographical location (latitude/longitude) for calculations. The location name is optional.
- Configurable via
CONFIG_ESP_SCHEDULE_ENABLE_DAYLIGHTandCONFIG_ESP_RMAKER_SCHEDULE_ENABLE_DAYLIGHT - Adds about 15KB of flash space when enabled.
- Schedule service now includes
daylight_supportattribute with value set to "yes" to indicate if daylight schedules are supported, enabling client applications to discover this capability.
Example JSON for sunrise schedule:
{ "Schedule Name": { "triggers": [{ "sr": 30, "lat": 37.7749, "lon": -122.4194, "loc": "San Francisco", "d": 127, "ts": 1641123456 }], "action": { "Light": { "Power": true, "Brightness": 80 } } } }Example JSON for sunset schedule:
{ "Evening Schedule": { "triggers": [{ "ss": -15, "lat": 51.5074, "lon": -0.1278, "loc": "London", "d": 31, "ts": 1641123456 }], "action": { "Light": { "Power": true, "Brightness": 50 } } } }JSON Field Descriptions:
sr: Sunrise offset in minutes (positive = after sunrise, negative = before, zero = exact)ss: Sunset offset in minutes (positive = after sunset, negative = before, zero = exact)lat: Latitude in decimal degrees (-90 to +90, positive North)lon: Longitude in decimal degrees (-180 to +180, positive East)loc: Optional location name for referenced: Day pattern bitmask (1=Sunday, 2=Monday, 4=Tuesday, ..., 127=everyday)ts: Next trigger timestamp (automatically calculated). Can be used by the phone apps to display the next trigger time.
- Removed legacy code for esp idf versions < 5.1 as they have reached their end of life.
- Allow challenge-response based user-node mapping even for Assisted Claiming. However, the same will still not work with self claiming because the certificate gets registered with the RainMaker backend after node connects to Wi-Fi, whereas this user-node mapping happens before that.
- User-Node mapping could fail if ESP Insights is enabled.
-ESP Insights uses the ESP RainMaker Work Queue to send data. The queue itself is processed only after
MQTT connection. So, any Insights message (Eg. periodic metric reporting) triggered before that would be
queued, eventually causing it to get full. This can cause the user-node mapping to fail,
as it also uses the same queue.
- Fixed by adding a retry mechanism to the user-node mapping.
- Add support for challenge response based user node mapping during provisioning.
This is more secure and reliable because
- The mapping happens even before Wi-Fi credentials are sent, which ensures that the node is added to the user's account before it is connected to the network.
- The node does not necessarily need to be connected to the network to be mapped.
Note that the node needs to be claimed before this can be used, as it requires the MQTT credentials to be available. This is not a concern for private deployments since the node credentials are pre-flashed. This feature requires the support to be available in phone apps too. This was added in ESP RainMaker iOS app v3.4.0 and Android app v3.7.0
- Support for OTA over MQTT: The regular OTA upgrades with ESP RainMaker required an
additional https connection to fetch the OTA image, which has a significant impact on
heap usage. With MQTT OTA, the same MQTT channel used for rest of the RainMaker
communication is used to fetch the OTA image, thereby saving on RAM.
This could be slightly slower and may odd some cost. but the overall
impact would be low enough when compared against the advantages. This can be enabled by setting
CONFIG_ESP_RMAKER_OTA_USE_MQTTtoyin the menuconfig. (idf.py menuconfig -> ESP RainMaker Config -> ESP RainMaker OTA Config -> OTA Update Protocol Type -> MQTT)
- Duplicate otafetch after rebooting into new firmware after an OTA was causing a crash.
This was seen when both,
CONFIG_BOOTLOADER_APP_ROLLBACK_ENABLEandCONFIG_ESP_RMAKER_OTA_AUTOFETCHare enabled.
- AVoid execution of
esp_rmaker_params_mqtt_init()from esp-idf event handler
- Make cmd response payload publish api (
esp_rmaker_cmd_response_publish()) public
- Enhance OTA fetch reliability
- Monitor message publish acknowledgement for the otafetch message
- Add retry logic if otafetch fails
- Add OTA retry on failure mechanism
- Try OTA multiple times (as per
CONFIG_ESP_RMAKER_OTA_MAX_RETRIES, set to 3 by default) if it fails - Schedule an OTA fetch as per
CONFIG_ESP_RMAKER_OTA_RETRY_DELAY_MINUTESif all retries fail
- Try OTA multiple times (as per