Description
Board
ESP32C3
Device Description
Hardware Configuration
no
Version
v3.0.4
IDE Name
arduino
Operating System
macos 14.5 (23F79)
Flash frequency
80
PSRAM enabled
no
Upload speed
921600
Description
the esp rainmker example codes dont work propperly. after uploading the codes with rainmaker 4Mb no ota partition, it uploads the code but gives this error. in order to connect it to wifi, I have to hold the reset button for more than 3 seconds to initialize the esp rainmmaker, otherwise it does not initialize and fails. the failing part is 'failed to start STA!'.
after I manually reset the code using reset button, it gives me the qr code and let me connect to it. while connecting the esp to wifi and confirming, I get these error that sound like something did not work right.
after the device is added to esp rainmaker app, If I disconnect and reconnect the esp32, I get the same error I got in the beginning. so basically, esp rainmaker is not usable at the moment.
on the other side, when I used esp idf examples of esp rainmaker, I would get the qr code after uploading the code and the process would go seemless. and after discoonecting and reconnecting, the esp32c3 would reconnect to wifi with no problem.
Sketch
// This example demonstrates the ESP RainMaker with a standard Switch device.
#include "RMaker.h"
#include "WiFi.h"
#include "WiFiProv.h"
#include "AppInsights.h"
#define DEFAULT_POWER_MODE true
const char *service_name = "PROV_1234";
const char *pop = "abcd1234";
// GPIO for push button
#if CONFIG_IDF_TARGET_ESP32C3 || CONFIG_IDF_TARGET_ESP32C6
static int gpio_0 = 9;
static int gpio_switch = 8;
#else
// GPIO for virtual device
static int gpio_0 = 0;
static int gpio_switch = 16;
#endif
/* Variable for reading pin status*/
bool switch_state = true;
// The framework provides some standard device types like switch, lightbulb,
// fan, temperaturesensor.
static Switch *my_switch = NULL;
// WARNING: sysProvEvent is called from a separate FreeRTOS task (thread)!
void sysProvEvent(arduino_event_t *sys_event) {
switch (sys_event->event_id) {
case ARDUINO_EVENT_PROV_START:
#if CONFIG_IDF_TARGET_ESP32S2
Serial.printf("\nProvisioning Started with name \"%s\" and PoP \"%s\" on SoftAP\n", service_name, pop);
printQR(service_name, pop, "softap");
#else
Serial.printf("\nProvisioning Started with name \"%s\" and PoP \"%s\" on BLE\n", service_name, pop);
printQR(service_name, pop, "ble");
#endif
break;
case ARDUINO_EVENT_PROV_INIT: wifi_prov_mgr_disable_auto_stop(10000); break;
case ARDUINO_EVENT_PROV_CRED_SUCCESS: wifi_prov_mgr_stop_provisioning(); break;
default: ;
}
}
void write_callback(Device *device, Param *param, const param_val_t val, void *priv_data, write_ctx_t *ctx) {
const char *device_name = device->getDeviceName();
const char *param_name = param->getParamName();
if (strcmp(param_name, "Power") == 0) {
Serial.printf("Received value = %s for %s - %s\n", val.val.b ? "true" : "false", device_name, param_name);
switch_state = val.val.b;
(switch_state == false) ? digitalWrite(gpio_switch, LOW) : digitalWrite(gpio_switch, HIGH);
param->updateAndReport(val);
}
}
void setup() {
Serial.begin(115200);
pinMode(gpio_0, INPUT);
pinMode(gpio_switch, OUTPUT);
digitalWrite(gpio_switch, DEFAULT_POWER_MODE);
Node my_node;
my_node = RMaker.initNode("ESP RainMaker Node");
// Initialize switch device
my_switch = new Switch("Switch", &gpio_switch);
if (!my_switch) {
return;
}
// Standard switch device
my_switch->addCb(write_callback);
// Add switch device to the node
my_node.addDevice(*my_switch);
// This is optional
RMaker.enableOTA(OTA_USING_TOPICS);
// If you want to enable scheduling, set time zone for your region using
// setTimeZone(). The list of available values are provided here
// https://rainmaker.espressif.com/docs/time-service.html
// RMaker.setTimeZone("Asia/Shanghai");
// Alternatively, enable the Timezone service and let the phone apps set the
// appropriate timezone
RMaker.enableTZService();
RMaker.enableSchedule();
RMaker.enableScenes();
// Enable ESP Insights. Insteads of using the default http transport, this function will
// reuse the existing MQTT connection of Rainmaker, thereby saving memory space.
initAppInsights();
RMaker.enableSystemService(SYSTEM_SERV_FLAGS_ALL, 2, 2, 2);
RMaker.start();
WiFi.onEvent(sysProvEvent); // Will call sysProvEvent() from another thread.
#if CONFIG_IDF_TARGET_ESP32S2
WiFiProv.beginProvision(WIFI_PROV_SCHEME_SOFTAP, WIFI_PROV_SCHEME_HANDLER_NONE, WIFI_PROV_SECURITY_1, pop, service_name);
#else
WiFiProv.beginProvision(WIFI_PROV_SCHEME_BLE, WIFI_PROV_SCHEME_HANDLER_FREE_BTDM, WIFI_PROV_SECURITY_1, pop, service_name);
#endif
}
void loop() {
if (digitalRead(gpio_0) == LOW) { // Push button pressed
// Key debounce handling
delay(100);
int startTime = millis();
while (digitalRead(gpio_0) == LOW) {
delay(50);
}
int endTime = millis();
if ((endTime - startTime) > 10000) {
// If key pressed for more than 10secs, reset all
Serial.printf("Reset to factory.\n");
RMakerFactoryReset(2);
} else if ((endTime - startTime) > 3000) {
Serial.printf("Reset Wi-Fi.\n");
// If key pressed for more than 3secs, but less than 10, reset Wi-Fi
RMakerWiFiReset(2);
} else {
// Toggle device state
switch_state = !switch_state;
Serial.printf("Toggle State to %s.\n", switch_state ? "true" : "false");
if (my_switch) {
my_switch->updateAndReportParam(ESP_RMAKER_DEF_POWER_NAME, switch_state);
}
(switch_state == false) ? digitalWrite(gpio_switch, LOW) : digitalWrite(gpio_switch, HIGH);
}
}
delay(100);
}
Debug Message
[ 397][I][WiFiProv.cpp:163] beginProvision(): Attempting conne[ 1458][E][STA.cpp:302] begin(): Failed to start STA!
[ 377][I][RMaker.cpp:17] event_handler(): RainMaker Initialize[ 1447][E][STA.cpp:302] begin(): Failed to start STA!
[ 1513][E][STA.cpp:302] begin(): Failed to start STA!
[ 378][I][RMaker.cpp:17] event_handler(): RainMaker Initialize[ 1511][E][STA.cpp:302] begin(): Failed to start STA!
[ 371][I][RMaker.cpp:17] event_handler(): RainMaker Initialize[ 1442][E][STA.cpp:302] begin(): Failed to start STA!
[ 377][I][RMaker.cpp:17] event_handler(): RainMaker Initialize[ 1460][E][STA.cpp:302] begin(): Failed to start STA!
[ 399][I][WiFiProv.cpp:163] beginProvision(): Attempting conne[ 1494][E][STA.cpp:302] begin(): Failed to start STA!
[ 399][I][WiFiProv.cpp:163] beginProvision(): Attempting conne[ 1455][E][STA.cpp:302] begin(): Failed to start STA!
this is when esp rainmaker app is adding the device successfully.
E (24924) security1: Key mismatch. Close connection
(24924) security1: Session setup error -1
(24925) protocomm_ble: Invalid content received, killing connection
(65779) esp-x509-crt-bundle: PK verify failed with error FFFFBD70
E (65780) esp-x509-crt-bundle: Failed to verify certificate
E (67830) esp-tls-mbedtls: mbedtls_ss_handshake returned -0x3000
E (67830) esp-tls: Failed to open new connection
E (67830) transport_base: Failed to open a new connection
(67835) mqtt_client: Error transport connect
E (67838) esp_mqtt_glue: MQTT_EVENT_ERROR
I 843201[I [RMaker. cpp:211 event_handler(): Unhandled RainMaker Event:
Other Steps to Reproduce
please try esp idf rainmaker example and compare it to this one. you will see that many thing is different, even the texts from the core debug info is different than the one in arduino.
I have checked existing issues, online documentation and the Troubleshooting Guide
- I confirm I have checked existing issues, online documentation and Troubleshooting guide.