ESP 32 Problem with EPPROM and Alexa

I have completed the script. Script for working good without EEProm. I have add EEPROM.
After that when i turn on nothing happened. But when I click on turn off all the relays work on for 1 or 2 sec after that they turn off. Whats the reason behind it. I have uploaded the script.

abbas_a.txt (12.9 KB)

Talha909:
I have add EEPROM.
After that when i turn on nothing happened.

Define "Nothing" ? the unit did not connect ? when you first read the EEPROM it is uninitialized so what the results of the read from there will be is anybody's guess.

Sorry I cant understand . Can you please explain more

After that when i turn on nothing happened

What do you mean by that ?

When I click on button on alexa nothing happened. ESP32 did not turn on the relay but in communication i got this. But when I Click on off button on alexa app. The relay turn on for 5 sec and then goes off again.

WSc] get text: {"deviceId":"5c35ee59010d8c32b556558d","action":"setPowerState","value":"ON"}
Turn On Device ID: 5c35ee59010d8c32b556558d
[WSc] get text: {"deviceId":"5c36e5b304018c4adb252073","action":"setPowerState","value":"ON"}
Turn On Device ID: 5c36e5b304018c4adb252073

Ok, first thing i saw was this

#define OFF LOW    // Relays are active low
#define ON HIGH

Now what is it, are the active LOW or active HIGH and if they are active LOW then these lines are incorrect.

Secondly this is not are very wise way to use the EEPROM on an ESP.

  { digitalWrite(device7, LOW);
    EEPROM.write(6, 0);
  }
  else if (deviceId == dID8) // Device ID of device 8
  { digitalWrite(device8, LOW);
    EEPROM.write(7, 0);
  }
  else
  {
    Serial.println("Unknown Device...");
    ShouldCommit = false;
  }

  if (ShouldCommit)
    EEPROM.commit();

Since it is using a "flash" EEPROM and the flash-writes are limited (to a 1000 times i heard once) you should only really use the EEPROM for things that you want stored more permanently (on a normal arduino this issue is not like this since it is an actual EEPROM, not "flash")

But all this should not really influence your code, so i suggest you post the original code, without the EEPROM in there that you said worked so we can compare it to this one.

This is the original code. This code works good. This one is with out the EPProm. But I am in Pakistan. I have lot of problem with the electricity. When light goes its comes to old state.

int device1 = 23;
int device2 = 22; 
int device3 = 19;
int device4 = 18;
int device5 = 5; 
int device6 = 17;
int device7 = 16;
int device8 = 4; 
  
#include <Arduino.h>
#include <WiFi.h>
#include <WiFiMulti.h>
#include <WebSocketsClient.h> // get it from https://github.com/Links2004/arduinoWebSockets/releases 
#include <ArduinoJson.h> // get it from https://arduinojson.org/ or install via Arduino library manager
#include <StreamString.h>

WiFiMulti WiFiMulti;
WebSocketsClient webSocket;
WiFiClient client;

#define MyApiKey "34af406e-6244-4663-997c-34b5f56ddb8a" // TODO: Change to your sinric API Key. Your API Key is displayed on sinric.com dashboard
#define MySSID "Home" // TODO: Change to your Wifi network SSID
#define MyWifiPassword "53883098" // TODO: Change to your Wifi network password

#define HEARTBEAT_INTERVAL 300000 // 5 Minutes

uint64_t heartbeatTimestamp = 0;
bool isConnected = false;

void setPowerStateOnServer(String deviceId, String value);
void setTargetTemperatureOnServer(String deviceId, String value, String scale);

// deviceId is the ID assgined to your smart-home-device in sinric.com dashboard. Copy it from dashboard and paste it here

void turnOn(String deviceId) {
 if (deviceId == "5c35ed05010d8c32b5565580") // Device ID of device 1
 { 
 Serial.print("Turnevice id: ");
 Serial.println(deviceId);
 digitalWrite(device1, LOW);
 } 
 else if (deviceId == "5c35ed93010d8c32b5565588") // Device ID of device 2
 { 
 Serial.print("Turnevice id: ");
 Serial.println(deviceId);
 digitalWrite(device2, LOW);
 }
 else if (deviceId == "5c35ee0e010d8c32b556558b") // Device ID of device 3
 { 
 Serial.print("Turnevice id: ");
 Serial.println(deviceId);
 digitalWrite(device3, LOW);
 } 
 else if (deviceId == "5c35ee59010d8c32b556558d") // Device ID of device 4
 { 
 Serial.print("Turnevice id: ");
 Serial.println(deviceId);
 digitalWrite(device4, LOW);
 }
 else if (deviceId == "5c36e5b304018c4adb252073") // Device ID of device 5
 { 
 Serial.print("Turnevice id: ");
 Serial.println(deviceId);
 digitalWrite(device5, LOW);
 }
 else if (deviceId == "5c36e5be04018c4adb252075") // Device ID of device 6
 { 
 Serial.print("Turnevice id: ");
 Serial.println(deviceId);
 digitalWrite(device6, LOW);
 }
 else if (deviceId == "5c36e5c804018c4adb252077") // Device ID of device 7
 { 
 Serial.print("Turnevice id: ");
 Serial.println(deviceId);
 digitalWrite(device7, LOW);
 }
 else if (deviceId == "5c36e5d204018c4adb252079") // Device ID of device 8
 { 
 Serial.print("Turnevice id: ");
 Serial.println(deviceId);
 digitalWrite(device8, LOW);
 }
 else 
 {
 Serial.print("Turnor unknown device id: ");
 Serial.println(deviceId); 
 } 
}

void turnOff(String deviceId) {
 if (deviceId == "5c35ed05010d8c32b5565580") // Device ID of device 1
 { 
 Serial.print("TurnDevice ID: ");
 Serial.println(deviceId);
 digitalWrite(device1, HIGH);
 }
 else if (deviceId == "5c35ed93010d8c32b5565588") // Device ID of device 2
 { 
 Serial.print("TurnDevice ID: ");
 Serial.println(deviceId);
 digitalWrite(device2, HIGH);
 }
 else if (deviceId == "5c35ee0e010d8c32b556558b") // Device ID of device 3
 { 
 Serial.print("TurnDevice ID: ");
 Serial.println(deviceId);
 digitalWrite(device3, HIGH);
 }
 else if (deviceId == "5c35ee59010d8c32b556558d") // Device ID of device 4
 { 
 Serial.print("TurnDevice ID: ");
 Serial.println(deviceId);
 digitalWrite(device4, HIGH);
 }
  else if (deviceId == "5c36e5b304018c4adb252073") // Device ID of device 5
 { 
 Serial.print("TurnDevice ID: ");
 Serial.println(deviceId);
 digitalWrite(device5, HIGH);
 }
  else if (deviceId == "5c36e5be04018c4adb252075") // Device ID of device 6
 { 
 Serial.print("TurnDevice ID: ");
 Serial.println(deviceId);
 digitalWrite(device6, HIGH);
 }
  else if (deviceId == "5c36e5c804018c4adb252077") // Device ID of device 7
 { 
 Serial.print("TurnDevice ID: ");
 Serial.println(deviceId);
 digitalWrite(device7, HIGH);
 }
  else if (deviceId == "5c36e5d204018c4adb252079") // Device ID of device 8
 { 
 Serial.print("TurnDevice ID: ");
 Serial.println(deviceId);
 digitalWrite(device8, HIGH);
 }
 else 
 {
 Serial.print("Turnfor unknown device id: ");
 Serial.println(deviceId); 
 }
}

void webSocketEvent(WStype_t type, uint8_t * payload, size_t length) {
 switch(type) {
 case WStype_DISCONNECTED:
 isConnected = false; 
 Serial.printf("[WSc] Webservice disconnected from sinric.com!\n");
 break;
 case WStype_CONNECTED: {
 isConnected = true;
 Serial.printf("[WSc] Service connected to sinric.com at url: %s\n", payload);
 Serial.printf("Waiting for commands from sinric.com ...\n"); 
 }
 break;
 case WStype_TEXT: {
 Serial.printf("[WSc] get text: %s\n", payload);
 // Example payloads

// For Switch or Light device types
 // {"deviceId": xxxx, "action": "setPowerState", value: "ON"} // https://developer.amazon.com/docs/device-apis/alexa-powercontroller.html

// For Light device type
 // Look at the light example in github
 
 DynamicJsonBuffer jsonBuffer;
 JsonObject& json = jsonBuffer.parseObject((char*)payload); 
 String deviceId = json ["deviceId"]; 
 String action = json ["action"];
 
 if(action == "setPowerState") { // Switch or Light
 String value = json ["value"];
 if(value == "ON") {
 turnOn(deviceId);
 } else {
 turnOff(deviceId);
 }
 }
 else if (action == "SetTargetTemperature") {
 String deviceId = json ["deviceId"]; 
 String action = json ["action"];
 String value = json ["value"];
 }
 else if (action == "test") {
 Serial.println("[WSc] received test command from sinric.com");
 }
 }
 break;
 case WStype_BIN:
 Serial.printf("[WSc] get binary length: %u\n", length);
 break;
 }
}

void setup() 
{
 pinMode(device1, OUTPUT);
 pinMode(device2, OUTPUT);
 pinMode(device3, OUTPUT);
 pinMode(device4, OUTPUT);
 pinMode(device5, OUTPUT);
 pinMode(device6, OUTPUT);
 pinMode(device7, OUTPUT);
 pinMode(device8, OUTPUT);
 digitalWrite(device1, HIGH);
 digitalWrite(device2, HIGH);
 digitalWrite(device3, HIGH);
 digitalWrite(device4, HIGH);
 digitalWrite(device5, HIGH);
 digitalWrite(device6, HIGH);
 digitalWrite(device7, HIGH);
 digitalWrite(device8, HIGH);

Serial.begin(115200);
 
 WiFiMulti.addAP(MySSID, MyWifiPassword);
 Serial.println();
 Serial.print("Connectingifi: ");
 Serial.println(MySSID);

// Waiting for Wifi connect
 while(WiFiMulti.run() != WL_CONNECTED) {
 delay(500);
 Serial.print(".");
 }
 if(WiFiMulti.run() == WL_CONNECTED) {
 Serial.println("");
 Serial.print("WiFiected. ");
 Serial.print("IPess: ");
 Serial.println(WiFi.localIP());
 }

// server address, port and URL
 webSocket.begin("iot.sinric.com",80,"/");

// event handler
 webSocket.onEvent(webSocketEvent);
 webSocket.setAuthorization("apikey", MyApiKey);
 
 // try again every 5000ms if connection has failed
 webSocket.setReconnectInterval(5000); // If you see 'class WebSocketsClient' has no member named 'setReconnectInterval' error update arduinoWebSockets
}

void loop() {
 
 webSocket.loop();
 
 if(isConnected) {
 uint64_t now = millis();
 
 // Send heartbeat in order to avoid disconnections during ISP resetting IPs over night. Thanks @MacSass
 if((now - heartbeatTimestamp) > HEARTBEAT_INTERVAL) {
 heartbeatTimestamp = now;
 webSocket.sendTXT("H"); 
 }
 } 
}

// If you are going to use a push button to on/off the switch manually, use this function to update the status on the server
// so it will reflect on Alexa app.
// eg: setPowerStateOnServer("deviceid", "ON")
void setPowerStateOnServer(String deviceId, String value) {
 DynamicJsonBuffer jsonBuffer;
 JsonObject& root = jsonBuffer.createObject();
 root["deviceId"] = deviceId;
 root["action"] = "setPowerState";
 root["value"] = value;
 StreamString databuf;
 root.printTo(databuf);
 
 webSocket.sendTXT(databuf);
}

//eg: setPowerStateOnServer("deviceid", "CELSIUS", "25.0")
void setTargetTemperatureOnServer(String deviceId, String value, String scale) {
 DynamicJsonBuffer jsonBuffer;
 JsonObject& root = jsonBuffer.createObject();
 root["action"] = "SetTargetTemperature";
 root["deviceId"] = deviceId;
 
 JsonObject& valueObj = root.createNestedObject("value");
 JsonObject& targetSetpoint = valueObj.createNestedObject("targetSetpoint");
 targetSetpoint["value"] = value;
 targetSetpoint["scale"] = scale;
 
 StreamString databuf;
 root.printTo(databuf);
 
 webSocket.sendTXT(databuf);
}

OK so somehow you changed over the HIGH-LOW states of the pin between versions, and from personal experience i tend to take a fair chunk for the EEPROM (half a kb or more) and count backwards since some libraries (and even devices) tend to use the first few addresses even without reference. I Took the second “Working coed as a base” changed a few things like using arrays for the deviceID’s and devicePins which makes it possible to use loops for repetitive tasks (rather than writing everything 8x) And i put some things in an order i am used to seeing them, so it was a little easier for me to find them when i was looking for them. Those last 2 functions don’t seem to be used for now but that doesn’t matter i suppose. I didn’t compile it since don’t have the ESP32 board installed, and also i had some trouble finding the wifimulti.h but here it is

#include <Arduino.h>
#include <WiFi.h>
#include <WiFiMulti.h>
#include <WebSocketsClient.h> // get it from https://github.com/Links2004/arduinoWebSockets/releases 
#include <ArduinoJson.h> // get it from https://arduinojson.org/ or install via Arduino library manager
#include <StreamString.h>
#include <EEPROM.h>

#define MyApiKey "34af406e-6244-4663-997c-34b5f56ddb8a" // TODO: Change to your sinric API Key. Your API Key is displayed on sinric.com dashboard
#define MySSID "Home" // TODO: Change to your Wifi network SSID
#define MyWifiPassword "53883098" // TODO: Change to your Wifi network password

#define HEARTBEAT_INTERVAL 300000 // 5 Minutes
#define EEPROM_SIZE 512

WiFiMulti WiFiMulti;
WebSocketsClient webSocket;
WiFiClient client;

byte devicePin[8] = {23, 22, 19, 18, 5, 17, 16, 4};
String devId[8]= {"5c35ed05010d8c32b5565580","5c35ed93010d8c32b5565588","5c35ee0e010d8c32b556558b","5c35ee59010d8c32b556558d",
                  "5c36e5b304018c4adb252073","5c36e5be04018c4adb252075","5c36e5c804018c4adb252077","5c36e5d204018c4adb252079"};

uint64_t heartbeatTimestamp = 0;
bool isConnected = false;

void setup() {
  Serial.begin(115200);
  EEPROM.begin(EEPROM_SIZE);  // let's take a slightly bigger chunk for the EEPROM   
  for (uint8_t i=0; i<8; i++) {
    if (EEPROM.read(EEPROM_SIZE-1-i)) digitalWrite(devicePin[i], LOW);   // and count backwards , some libraries 'taint' the first few addresses
    else digitalWrite(devicePin[i], HIGH);                    // setting the pin before switching to output will prevent it 
    pinMode(devicePin[i], OUTPUT);                           //  from it's default LOW-state coming on momentarily.
  }
  WiFiMulti.addAP(MySSID, MyWifiPassword);
  Serial.println();
  Serial.print("Connectingifi: ");
  Serial.println(MySSID);  
  while (WiFiMulti.run() != WL_CONNECTED) {  // Waiting for Wifi connect
    delay(500);
    Serial.print(".");
  }
  if (WiFiMulti.run() == WL_CONNECTED) {
    Serial.println("");
    Serial.print("WiFiected. ");
    Serial.print("IPess: ");
    Serial.println(WiFi.localIP());
  }  
  webSocket.begin("iot.sinric.com", 80, "/");      // server address, port and URL  
  webSocket.onEvent(webSocketEvent);               // event handler
  webSocket.setAuthorization("apikey", MyApiKey);  
  webSocket.setReconnectInterval(5000);             // try again every 5000ms if connection has failed
  // If you see 'class WebSocketsClient' has no member named 'setReconnectInterval' error update arduinoWebSockets
}


void loop() {
  webSocket.loop();
  if (isConnected) {
    uint64_t now = millis();
    // Send heartbeat in order to avoid disconnections during ISP resetting IPs over night. Thanks @MacSass
    if ((now - heartbeatTimestamp) > HEARTBEAT_INTERVAL) {
      heartbeatTimestamp = now;
      webSocket.sendTXT("H");
    }
  }
}

//--------------------------------------------------

void webSocketEvent(WStype_t type, uint8_t * payload, size_t length) {
  switch (type) {
    case WStype_DISCONNECTED:
      isConnected = false;
      Serial.printf("[WSc] Webservice disconnected from sinric.com!\n");
      break;
    case WStype_CONNECTED: {
        isConnected = true;
        Serial.printf("[WSc] Service connected to sinric.com at url: %s\n", payload);
        Serial.printf("Waiting for commands from sinric.com ...\n");
      }
      break;
    case WStype_TEXT: {
        Serial.printf("[WSc] get text: %s\n", payload);
        // Example payloads

        // For Switch or Light device types
        // {"deviceId": xxxx, "action": "setPowerState", value: "ON"} // https://developer.amazon.com/docs/device-apis/alexa-powercontroller.html

        // For Light device type
        // Look at the light example in github

        DynamicJsonBuffer jsonBuffer;
        JsonObject& json = jsonBuffer.parseObject((char*)payload);
        String deviceId = json ["deviceId"];
        String action = json ["action"];

        if (action == "setPowerState") { // Switch or Light
          String value = json ["value"];
          if (value == "ON") {
            turnOn(deviceId);
          } else {
            turnOff(deviceId);
          }
        }
        else if (action == "SetTargetTemperature") {
          String deviceId = json ["deviceId"];
          String action = json ["action"];
          String value = json ["value"];
        }
        else if (action == "test") {
          Serial.println("[WSc] received test command from sinric.com");
        }
      }
      break;
    case WStype_BIN:
      Serial.printf("[WSc] get binary length: %u\n", length);
      break;
  }
}


void turnOn(String deviceId) {
  bool founddevice=false;
  for (uint8_t i=0; i<8; i++) {
    if (deviceId==devId[i]) {
      Serial.print("Turn on device id: ");
      Serial.println(deviceId);
      digitalWrite(devicePin[i], LOW);
      EEPROM.write(EEPROM_SIZE-1-i,1);
      founddevice=true;
    }
    if (founddevice) EEPROM.commit();
    else {
      Serial.print("Turn on unknown device id: ");
      Serial.println(deviceId);
    }
  }
}

void turnOff(String deviceId) {
  bool founddevice=false;
  for (uint8_t i=0; i<8; i++) {
    if (deviceId==devId[i]) {
      Serial.print("Turn off device id: ");
      Serial.println(deviceId);
      digitalWrite(devicePin[i], HIGH);
      EEPROM.write(EEPROM_SIZE-1-i,0);
      founddevice=true;
    }
    if (founddevice) EEPROM.commit();
    else {
      Serial.print("Turn off unknown device id: ");
      Serial.println(deviceId);
    }
  }
}


// If you are going to use a push button to on/off the switch manually, use this function to update the status on the server
// so it will reflect on Alexa app.
// eg: setPowerStateOnServer("deviceid", "ON")
void setPowerStateOnServer(String deviceId, String value) {
  DynamicJsonBuffer jsonBuffer;
  JsonObject& root = jsonBuffer.createObject();
  root["deviceId"] = deviceId;
  root["action"] = "setPowerState";
  root["value"] = value;
  StreamString databuf;
  root.printTo(databuf);

  webSocket.sendTXT(databuf);
}

//eg: setPowerStateOnServer("deviceid", "CELSIUS", "25.0")
void setTargetTemperatureOnServer(String deviceId, String value, String scale) {
  DynamicJsonBuffer jsonBuffer;
  JsonObject& root = jsonBuffer.createObject();
  root["action"] = "SetTargetTemperature";
  root["deviceId"] = deviceId;

  JsonObject& valueObj = root.createNestedObject("value");
  JsonObject& targetSetpoint = valueObj.createNestedObject("targetSetpoint");
  targetSetpoint["value"] = value;
  targetSetpoint["scale"] = scale;

  StreamString databuf;
  root.printTo(databuf);

  webSocket.sendTXT(databuf);
}

Still i suggest you really look into backup power in the form of a battery, since using the ESP-‘flash’-eeprom this extensively is not how it is meant to be used (hence the commit() only hitting the ‘flash’ once for more bytes of data was introduced)
ps I edited since i left some pretty bad ‘bugs’ before OOps…

Thanks for the hard effect. I compile the code and found this error

   }
    if (founddevice) EEPROM.commit();
    else {
      Serial.print("Turn off unknown device id: ");
      Serial.println(deviceId);
    }
  }
}

Arduino: 1.8.8 (Windows 10), Board: “ESP32 Dev Module, Disabled, Default, 240MHz (WiFi/BT), QIO, 80MHz, 4MB (32Mb), 921600, None”

C:\Users\Robotics\Documents\Arduino\sketch_jan31a\sketch_jan31a.ino: In function ‘void setup()’:

sketch_jan31a:28:3: error: ‘EEPROM’ was not declared in this scope

EEPROM.begin(EEPROM_SIZE); // let’s take a slightly bigger chunk for the EEPROM

^

C:\Users\Robotics\Documents\Arduino\sketch_jan31a\sketch_jan31a.ino: In function ‘void turnOn(String)’:

sketch_jan31a:125:18: error: ‘devId’ was not declared in this scope

if (deviceId=devId*) {*

  • ^*
    sketch_jan31a:128:34: error: invalid conversion from ‘byte* {aka unsigned char*}’ to ‘uint8_t {aka unsigned char}’ [-fpermissive]
  • digitalWrite(devicePin, LOW);*
  • ^*
    In file included from C:\Users\Robotics\AppData\Local\Arduino15\packages\esp32\hardware\esp32\1.0.1\cores\esp32/esp32-hal.h:53:0,
  • from C:\Users\Robotics\AppData\Local\Arduino15\packages\esp32\hardware\esp32\1.0.1\cores\esp32/Arduino.h:35,*
  • from C:\Users\Robotics\Documents\Arduino\sketch_jan31a\sketch_jan31a.ino:1:*
    C:\Users\Robotics\AppData\Local\Arduino15\packages\esp32\hardware\esp32\1.0.1\cores\esp32/esp32-hal-gpio.h:78:6: note: initializing argument 1 of ‘void digitalWrite(uint8_t, uint8_t)’
    void digitalWrite(uint8_t pin, uint8_t val);
  • ^*
    sketch_jan31a:129:7: error: ‘EEPROM’ was not declared in this scope
  • EEPROM.write(EEPROM_SIZE-1-i,1);*
  • ^*
    sketch_jan31a:132:22: error: ‘EEPROM’ was not declared in this scope
  • if (founddevice) EEPROM.commit();*
  • ^*
    C:\Users\Robotics\Documents\Arduino\sketch_jan31a\sketch_jan31a.ino: In function ‘void turnOff(String)’:
    sketch_jan31a:143:18: error: ‘devId’ was not declared in this scope
    _ if (deviceId=devId*) {_
    _
    ^_
    sketch_jan31a:146:35: error: invalid conversion from 'byte {aka unsigned char*}’ to ‘uint8_t {aka unsigned char}’ [-fpermissive]

    * digitalWrite(devicePin, HIGH);*
    * ^*
    In file included from C:\Users\Robotics\AppData\Local\Arduino15\packages\esp32\hardware\esp32\1.0.1\cores\esp32/esp32-hal.h:53:0,
    * from C:\Users\Robotics\AppData\Local\Arduino15\packages\esp32\hardware\esp32\1.0.1\cores\esp32/Arduino.h:35,*
    * from C:\Users\Robotics\Documents\Arduino\sketch_jan31a\sketch_jan31a.ino:1:
    C:\Users\Robotics\AppData\Local\Arduino15\packages\esp32\hardware\esp32\1.0.1\cores\esp32/esp32-hal-gpio.h:78:6: note: initializing argument 1 of ‘void digitalWrite(uint8_t, uint8_t)’
    void digitalWrite(uint8_t pin, uint8_t val);
    _
    ^_
    sketch_jan31a:147:7: error: ‘EEPROM’ was not declared in this scope
    EEPROM.write(EEPROM_SIZE-1-i,0);
    _
    ^_
    sketch_jan31a:150:22: error: ‘EEPROM’ was not declared in this scope
    _
    if (founddevice) EEPROM.commit();_
    _
    ^_
    Multiple libraries were found for “WiFi.h”
    Used: C:\Users\Robotics\AppData\Local\Arduino15\packages\esp32\hardware\esp32\1.0.1\libraries\WiFi
    Not used: C:\Program Files (x86)\Arduino\libraries\WiFi
    exit status 1
    _
    ‘EEPROM’ was not declared in this scope*_
    This report would have more information with
    “Show verbose output during compilation”
    option enabled in File → Preferences.

Thanks its compiling now. I will check it in morning with the ESP and give you feedback over it. Thanks Man

You know if you’d have a battery back-up it would only have to last very briefly if you can signal the power drop-out to the ESP and let it do the EEPROM.commit() when it does. so short in fact you might get away with just a Big capacitor.

Thanks man you save my life. Thanks for your help and time

You're welcome !