6 Commits
v1.0 ... v1.3

Author SHA1 Message Date
4f14de7763 Version 1.3
Minimized of config message size.
Changed SDK version for 3.0.5
Changed config data storage location to EEPROM.
Changed FS from SPIFFS to LittleFS.
2023-03-05 10:34:53 +03:00
afaf9b5e8f Version 1.2
Added encrypting messages.
Web interface minor redesign.
Main code minor refactoring.
2023-01-22 14:03:34 +03:00
82f7e3c128 Version 1.1
Fixed some bugs.
2023-01-09 12:33:46 +03:00
752e8caf53 Minor changes 2023-01-07 11:16:31 +03:00
373be8ac60 Minor changes 2023-01-07 10:48:36 +03:00
a18d4366ac Minor changes 2023-01-07 10:20:33 +03:00
7 changed files with 177 additions and 134 deletions

View File

@ -4,10 +4,10 @@ ESP-NOW based window/door sensor for ESP8266. Alternate firmware for Tuya/SmartL
## Features
1. When triggered transmits system information, battery status and sensor status.
1. When triggered transmits system information, battery level charge and sensor status (OPEN/CLOSED).
2. Average response time of 1 second (depends on the MCU of the sensor).
3. In setup/update mode creates an access point named "ESP-NOW Window XXXXXXXXXXXX" with password "12345678" (IP 192.168.4.1).
4. Automatically adds sensor and battery configuration to Home Assistan via MQTT discovery as a binary_sensors (2 different binary_sensor).
3. In setup/update mode creates an access point named "ESP-NOW window XXXXXXXXXXXX" with password "12345678" (IP 192.168.4.1).
4. Automatically adds sensor and battery configuration to Home Assistan via MQTT discovery as a binary_sensor (for sensor) and sensor (for battery).
5. Possibility firmware update over OTA (if is allows the size of the flash memory).
6. Web interface for settings.
@ -24,7 +24,8 @@ See [here](https://github.com/aZholtikov/ESP-NOW-Window-Door-Sensor/tree/main/ha
1. A gateway is required. For details see [ESP-NOW Gateway](https://github.com/aZholtikov/ESP-NOW-Gateway).
2. ESP-NOW network name must be set same of all another ESP-NOW devices in network.
3. Upload the "data" folder (with web interface) into the filesystem before flashing.
4. For using this firmware on Tuya/SmartLife WiFi window/door sensors, the WiFi module must be replaced with an ESP8266 compatible module (if necessary).
5. Highly recommended connect an external power supply during setup/upgrade.
6. Because this sensor is battery operated, it has an additional controller (MCU) that controls the power of the WiFi module (Module) and transmits data to it for transmission to the network. The communication is done via UART at 9600 speed. Make sure that the protocol is correct before flashing. Details [here](https://github.com/aZholtikov/ESP-NOW-Window-Door-Sensor/tree/main/doc).
3. If encryption is used, the key must be set same of all another ESP-NOW devices in network.
4. Upload the "data" folder (with web interface) into the filesystem before flashing.
5. For using this firmware on Tuya/SmartLife WiFi window/door sensors, the WiFi module must be replaced with an ESP8266 compatible module (if necessary).
6. Highly recommended connect an external power supply during setup/upgrade.
7. Because this sensor is battery operated, it has an additional controller (MCU) that controls the power of the WiFi module (Module) and transmits data to it for transmission to the network. The communication is done via UART at 9600 speed. Make sure that the protocol is correct before flashing. Details [here](https://github.com/aZholtikov/ESP-NOW-Window-Door-Sensor/tree/main/doc).

View File

@ -10,7 +10,7 @@ function createXmlHttpObject() {
function load() {
if (xmlHttp.readyState == 0 || xmlHttp.readyState == 4) {
xmlHttp.open('PUT', '/config.json', true);
xmlHttp.open('GET', '/config', true);
xmlHttp.send(null);
xmlHttp.onload = function () {
jsonResponse = JSON.parse(xmlHttp.responseText);
@ -29,7 +29,7 @@ function loadBlock() {
}
document.getElementsByTagName('body')[0].innerHTML = newString;
setFirmvareValue('version', 'firmware');
setGpioValue('deviceSensorClassSelect', 'deviceSensorClass');
setGpioValue('deviceClassSelect', 'deviceClass');
handleServerResponse();
}
@ -51,10 +51,9 @@ function sendRequest(submit, server) {
}
function saveSetting(submit) {
server = "/setting?deviceSensorName=" + getValue('deviceSensorName')
+ "&deviceBatteryName=" + getValue('deviceBatteryName')
server = "/setting?deviceName=" + getValue('deviceName')
+ "&espnowNetName=" + getValue('espnowNetName')
+ "&deviceSensorClass=" + getSelectValue('deviceSensorClassSelect');
+ "&deviceClass=" + getSelectValue('deviceClassSelect');
sendRequest(submit, server);
alert("Please restart device for changes apply.");
}

View File

@ -5,12 +5,12 @@
<meta name="viewport" content="width=device-width, initial-scale=0.9">
<link rel="stylesheet" href="style.css">
<script type="text/javascript" src="function.js"></script>
<title>ESP-NOW Window/Door Sensor</title>
<title>ESP-NOW Window Sensor</title>
</head>
<body onload="load();">
<form class="box">
<h1>ESP-NOW Window/Door Sensor </h1>
<h1>ESP-NOW Window Sensor </h1>
<div class="wrapper">
<p class="text">Firmware:</p>
<p class="text" id="version"></p>
@ -18,14 +18,8 @@
</div>
<div class="wrapper">
<p class="text">Sensor name:</p>
<input id="deviceSensorName" value="{{deviceSensorName}}" placeholder="Name" autocomplete="off" label
title="ESP-NOW device name (up to 150 characters)" />
</div>
<div class="wrapper">
<p class="text">Battery name:</p>
<input id="deviceBatteryName" value="{{deviceBatteryName}}" placeholder="Name" autocomplete="off" label
<p class="text">Device name:</p>
<input id="deviceName" value="{{deviceName}}" placeholder="Name" autocomplete="off" label
title="ESP-NOW device name (up to 150 characters)" />
</div>
@ -37,8 +31,8 @@
<div class="wrapper">
<p class="text-select">Sensor type:</p>
<input id="deviceSensorClass" value="{{deviceSensorClass}}" hidden />
<p><select id="deviceSensorClassSelect">
<input id="deviceClass" value="{{deviceClass}}" hidden />
<p><select id="deviceClassSelect">
<option value="28">WINDOW</option>
<option value="6">DOOR</option>
</select></p>

View File

@ -1,3 +1,7 @@
p{
margin: 0 0;
}
body {
font-family: "Gill Sans", sans-serif;
background: rgb(255, 255, 255);
@ -21,6 +25,8 @@ h1 {
font-weight: 600;
flex-shrink: 0;
margin-right: 10px;
margin-left: 10px;
margin: 10px 0;
}
.text-select {
@ -42,6 +48,7 @@ input {
border-radius: 5px;
border: none;
margin-bottom: 10px;
margin-left: 10px;
padding: 0 10px;
color: rgb(0, 0, 0);
background: #a3e0f1;
@ -76,6 +83,8 @@ select:hover {
background: rgb(65, 125, 238);
color: white;
transition: .5s;
margin-left: 0;
margin-top: 8px;
}
.btn:hover {
@ -84,10 +93,13 @@ select:hover {
transform: translatey(-3px);
}
#deviceSensorName,
#deviceBatteryName,
#deviceName,
#espnowNetName {
width: 73%;
width: 100%;
}
#espnowNetName {
margin-bottom: 15px;
}
.wrapper.wrapper--end {

View File

@ -11,10 +11,10 @@ Communication protocol used in the firmware (only necessary "cuts" from the orig
Module sends 55 AA 00 01 00 00 00 (Initial message)
MCU returns 55 AA 00 01 00 ............ (MCU system information)
Module sends 55 AA 00 02 00 01 04 06 (Network connection established)
MCU returns 55 AA 00 02 00 00 01 (Confirmation message)
The MCU sends 55 AA 00 08 00 0C 00 01 01 01 01 01 03 04 00 01 02 23 (Battery status. 02 23 - high, 01 22 - medium, 00 21 - low)
MCU returns 55 AA 00 02 00 00 01 (MCU confirmation message)
MCU sends 55 AA 00 08 00 0C 00 01 01 01 01 01 03 04 00 01 02 23 (Battery status. 02 23 - high, 01 22 - medium, 00 21 - low)
Module returns 55 AA 00 08 00 01 00 08 (Confirmation message)
The MCU sends 55 AA 00 08 00 0C 00 02 02 02 02 02 01 01 01 00 22 (Sensor position. 01 23 - open, 00 22 - closed)
MCU sends 55 AA 00 08 00 0C 00 02 02 02 02 02 01 01 01 00 22 (Sensor position. 01 23 - open, 00 22 - closed)
Module returns 55 AA 00 08 00 01 00 08 (Confirmation message)
Module power off
@ -24,8 +24,8 @@ Communication protocol used in the firmware (only necessary "cuts" from the orig
Module sends 55 AA 00 01 00 00 00 (Initial message)
MCU returns 55 AA 00 01 00 00 ............ (MCU system information)
Module sends 55 AA 00 02 00 01 04 06 (Network connection established)
MCU returns 55 AA 00 02 00 00 01 (Confirmation message)
The MCU sends 55 AA 00 08 00 0C 00 01 01 01 01 01 03 04 00 01 02 23 (Battery status. 02 23 - high, 01 22 - medium, 00 21 - low)
MCU returns 55 AA 00 02 00 00 01 (MCU confirmation message)
MCU sends 55 AA 00 08 00 0C 00 01 01 01 01 01 03 04 00 01 02 23 (Battery status. 02 23 - high, 01 22 - medium, 00 21 - low)
Module returns 55 AA 00 08 00 01 00 08 (Confirmation message)
Module power off
@ -35,8 +35,8 @@ Communication protocol used in the firmware (only necessary "cuts" from the orig
Module sends 55 AA 00 01 00 00 00 (Initial message)
MCU returns 55 AA 00 01 00 00 ............ (MCU system information)
Module sends 55 AA 00 02 00 01 04 06 (Network connection established)
MCU returns 55 AA 00 02 00 00 01 (Confirmation message)
The MCU sends 55 AA 00 03 00 00 02 (Message for switching to setting mode)
MCU returns 55 AA 00 02 00 00 01 (MCU confirmation message)
MCU sends 55 AA 00 03 00 00 02 (Message for switching to setting mode)
Module returns 55 AA 00 03 00 00 02 (Confirmation message)
Update mode has started. Will be available during 120 seconds until the module is powered off.

View File

@ -1,19 +1,53 @@
[env:ESP-12E]
platform = espressif8266
board = esp12e
framework = arduino
build_flags = -D PIO_FRAMEWORK_ARDUINO_ESPRESSIF_SDK305
board_build.filesystem = littlefs
board_build.ldscript = eagle.flash.4m1m.ld
lib_deps =
https://github.com/aZholtikov/ZHNetwork
https://github.com/aZholtikov/ZHConfig
https://github.com/aZholtikov/Async-Web-Server
https://github.com/bblanchon/ArduinoJson
[env:ESP-12E-OTA]
platform = espressif8266
board = esp12e
framework = arduino
build_flags = -D PIO_FRAMEWORK_ARDUINO_ESPRESSIF_SDK305
board_build.filesystem = littlefs
board_build.ldscript = eagle.flash.4m1m.ld
upload_port = 192.168.4.1
upload_protocol = espota
lib_deps =
https://github.com/aZholtikov/ZHNetwork
https://github.com/aZholtikov/ZHConfig
https://github.com/aZholtikov/Async-Web-Server
https://github.com/bblanchon/ArduinoJson
[env:TYWE3S]
platform = espressif8266
board = esp01_1m
framework = arduino
build_flags = -D PIO_FRAMEWORK_ARDUINO_ESPRESSIF_SDK305
board_build.filesystem = littlefs
board_build.ldscript = eagle.flash.1m64.ld
lib_deps =
https://github.com/aZholtikov/ZHNetwork
https://github.com/aZholtikov/ZHConfig
bblanchon/ArduinoJson@^6.19.4
me-no-dev/ESP Async WebServer@^1.2.3
https://github.com/aZholtikov/Async-Web-Server
https://github.com/bblanchon/ArduinoJson
[env:ESP-M2]
platform = espressif8266
board = esp8285
framework = arduino
build_flags = -D PIO_FRAMEWORK_ARDUINO_ESPRESSIF_SDK305
board_build.filesystem = littlefs
board_build.ldscript = eagle.flash.1m64.ld
lib_deps =
https://github.com/aZholtikov/ZHNetwork
https://github.com/aZholtikov/ZHConfig
bblanchon/ArduinoJson@^6.19.4
me-no-dev/ESP Async WebServer@^1.2.3
https://github.com/aZholtikov/Async-Web-Server
https://github.com/bblanchon/ArduinoJson

View File

@ -1,10 +1,14 @@
#include "ArduinoJson.h"
#include "ArduinoOTA.h"
#include "ESPAsyncWebServer.h"
#include "ESPAsyncWebServer.h" // https://github.com/aZholtikov/Async-Web-Server
#include "LittleFS.h"
#include "EEPROM.h"
#include "ZHNetwork.h"
#include "ZHConfig.h"
void onConfirmReceiving(const uint8_t *target, const bool status);
ADC_MODE(ADC_VCC);
void onConfirmReceiving(const uint8_t *target, const uint16_t id, const bool status);
void loadConfig(void);
void saveConfig(void);
@ -14,25 +18,21 @@ void sendSensorConfigMessage(void);
void sendBatteryConfigMessage(void);
void sendAttributesMessage(void);
const String firmware{"1.0"};
String espnowNetName{"DEFAULT"};
String deviceSensorName{"ESP-NOW window sensor"};
uint8_t deviceSensorClass{HABSDC_WINDOW};
String deviceBatteryName{"ESP-NOW window sensor battery"};
struct deviceConfig
{
const String firmware{"1.3"};
String espnowNetName{"DEFAULT"};
String deviceName = "ESP-NOW window " + String(ESP.getChipId(), HEX);
uint8_t deviceClass{HABSDC_WINDOW};
} config;
char receivedBytes[128]{0};
byte counter{0};
byte messageLenght{0};
uint8_t counter{0};
uint8_t messageLenght{0};
bool dataReceiving{false};
bool dataReceived{false};
bool semaphore{false};
esp_now_payload_data_t outgoingData{ENDT_SENSOR, ENPT_STATE};
StaticJsonDocument<sizeof(esp_now_payload_data_t::message)> json;
char buffer[sizeof(esp_now_payload_data_t::message)]{0};
char temp[sizeof(esp_now_payload_data_t)]{0};
const char initialMessage[] = {0x55, 0xAA, 0x00, 0x01, 0x00, 0x00, 0x00};
const char connectedMessage[] = {0x55, 0xAA, 0x00, 0x02, 0x00, 0x01, 0x04, 0x06};
const char settingMessage[] = {0x55, 0xAA, 0x00, 0x03, 0x00, 0x00, 0x02};
@ -45,11 +45,12 @@ void setup()
{
Serial.begin(9600);
SPIFFS.begin();
LittleFS.begin();
loadConfig();
myNet.begin(espnowNetName.c_str());
myNet.begin(config.espnowNetName.c_str());
// myNet.setCryptKey("VERY_LONG_CRYPT_KEY"); // If encryption is used, the key must be set same of all another ESP-NOW devices in network.
myNet.setOnConfirmReceivingCallback(onConfirmReceiving);
@ -90,48 +91,46 @@ void loop()
}
if (dataReceived)
{
if (receivedBytes[3] == 0x01)
if (receivedBytes[3] == 0x01) // MCU system information.
{
Serial.write(connectedMessage, sizeof(connectedMessage));
Serial.flush();
dataReceived = false;
}
if (receivedBytes[3] == 0x02)
if (receivedBytes[3] == 0x02) // MCU confirmation message.
dataReceived = false;
if (receivedBytes[3] == 0x03)
if (receivedBytes[3] == 0x03) // Message for switching to setting mode.
{
Serial.write(settingMessage, sizeof(settingMessage));
Serial.flush();
Serial.end();
dataReceived = false;
WiFi.softAP(("ESP-NOW Window " + myNet.getNodeMac()).c_str(), "12345678", 1, 0);
WiFi.mode(WIFI_AP);
WiFi.softAP(("ESP-NOW window " + String(ESP.getChipId(), HEX)).c_str(), "12345678", 1, 0);
setupWebServer();
ArduinoOTA.begin();
}
if (receivedBytes[3] == 0x08)
if (receivedBytes[3] == 0x08) // Sensor status message.
{
if (receivedBytes[7] == 0x01)
if (receivedBytes[7] == 0x01) // Battery status.
{
if (receivedBytes[17] == 0x02)
json["battery"] = "HIGH";
if (receivedBytes[17] == 0x01)
json["battery"] = "MID";
if (receivedBytes[17] == 0x00)
json["battery"] = "LOW";
dataReceived = false;
Serial.write(confirmationMessage, sizeof(confirmationMessage));
Serial.flush();
}
if (receivedBytes[7] == 0x02)
if (receivedBytes[7] == 0x02) // Sensor position.
{
esp_now_payload_data_t outgoingData{ENDT_SENSOR, ENPT_STATE};
DynamicJsonDocument json(sizeof(esp_now_payload_data_t::message));
if (receivedBytes[17] == 0x01)
json["state"] = "OPEN";
if (receivedBytes[17] == 0x00)
json["state"] = "CLOSED";
json["battery"] = round((double(system_get_vdd33()) / 1000) * 100) / 100;
dataReceived = false;
serializeJsonPretty(json, buffer);
memcpy(outgoingData.message, buffer, sizeof(esp_now_payload_data_t::message));
memcpy(temp, &outgoingData, sizeof(esp_now_payload_data_t));
serializeJsonPretty(json, outgoingData.message);
char temp[sizeof(esp_now_payload_data_t)]{0};
memcpy(&temp, &outgoingData, sizeof(esp_now_payload_data_t));
myNet.sendBroadcastMessage(temp);
semaphore = true;
}
@ -141,7 +140,7 @@ void loop()
ArduinoOTA.handle();
}
void onConfirmReceiving(const uint8_t *target, const bool status)
void onConfirmReceiving(const uint8_t *target, const uint16_t id, const bool status)
{
if (semaphore)
{
@ -152,60 +151,69 @@ void onConfirmReceiving(const uint8_t *target, const bool status)
void loadConfig()
{
if (!SPIFFS.exists("/config.json"))
ETS_GPIO_INTR_DISABLE();
EEPROM.begin(4096);
if (EEPROM.read(4095) == 254)
{
EEPROM.get(0, config);
EEPROM.end();
}
else
{
EEPROM.end();
saveConfig();
File file = SPIFFS.open("/config.json", "r");
String jsonFile = file.readString();
StaticJsonDocument<512> json;
deserializeJson(json, jsonFile);
espnowNetName = json["espnowNetName"].as<String>();
deviceSensorName = json["deviceSensorName"].as<String>();
deviceBatteryName = json["deviceBatteryName"].as<String>();
deviceSensorClass = json["deviceSensorClass"];
file.close();
}
delay(50);
ETS_GPIO_INTR_ENABLE();
}
void saveConfig()
{
StaticJsonDocument<512> json;
json["firmware"] = firmware;
json["espnowNetName"] = espnowNetName;
json["deviceSensorName"] = deviceSensorName;
json["deviceBatteryName"] = deviceBatteryName;
json["deviceSensorClass"] = deviceSensorClass;
json["system"] = "empty";
File file = SPIFFS.open("/config.json", "w");
serializeJsonPretty(json, file);
file.close();
ETS_GPIO_INTR_DISABLE();
EEPROM.begin(4096);
EEPROM.write(4095, 254);
EEPROM.put(0, config);
EEPROM.end();
delay(50);
ETS_GPIO_INTR_ENABLE();
}
void setupWebServer()
{
webServer.on("/", HTTP_GET, [](AsyncWebServerRequest *request)
{ request->send(SPIFFS, "/index.htm"); });
{ request->send(LittleFS, "/index.htm"); });
webServer.on("/function.js", HTTP_GET, [](AsyncWebServerRequest *request)
{ request->send(LittleFS, "/function.js"); });
webServer.on("/style.css", HTTP_GET, [](AsyncWebServerRequest *request)
{ request->send(LittleFS, "/style.css"); });
webServer.on("/setting", HTTP_GET, [](AsyncWebServerRequest *request)
{
deviceSensorName = request->getParam("deviceSensorName")->value();
deviceBatteryName = request->getParam("deviceBatteryName")->value();
deviceSensorClass = request->getParam("deviceSensorClass")->value().toInt();
espnowNetName = request->getParam("espnowNetName")->value();
config.deviceName = request->getParam("deviceName")->value();
config.deviceClass = request->getParam("deviceClass")->value().toInt();
config.espnowNetName = request->getParam("espnowNetName")->value();
request->send(200);
saveConfig(); });
webServer.on("/restart", HTTP_GET, [](AsyncWebServerRequest *request)
webServer.on("/config", HTTP_GET, [](AsyncWebServerRequest *request)
{
request->send(200);
String configJson;
DynamicJsonDocument json(256); // To calculate the buffer size uses https://arduinojson.org/v6/assistant.
json["firmware"] = config.firmware;
json["espnowNetName"] = config.espnowNetName;
json["deviceName"] = config.deviceName;
json["deviceClass"] = config.deviceClass;
serializeJsonPretty(json, configJson);
request->send(200, "application/json", configJson); });
webServer.on("/restart", HTTP_GET, [](AsyncWebServerRequest *request)
{request->send(200);
ESP.restart(); });
webServer.onNotFound([](AsyncWebServerRequest *request)
{
if (SPIFFS.exists(request->url()))
request->send(SPIFFS, request->url());
else
{
request->send(404, "text/plain", "File Not Found");
} });
{ request->send(404, "text/plain", "File Not Found"); });
webServer.begin();
}
@ -213,16 +221,15 @@ void setupWebServer()
void sendSensorConfigMessage()
{
esp_now_payload_data_t outgoingData{ENDT_SENSOR, ENPT_CONFIG};
StaticJsonDocument<sizeof(esp_now_payload_data_t::message)> json;
json["name"] = deviceSensorName;
json["unit"] = 1;
json["type"] = HACT_BINARY_SENSOR;
json["class"] = deviceSensorClass;
json["payload_on"] = "OPEN";
json["payload_off"] = "CLOSED";
char buffer[sizeof(esp_now_payload_data_t::message)]{0};
serializeJsonPretty(json, buffer);
memcpy(outgoingData.message, buffer, sizeof(esp_now_payload_data_t::message));
DynamicJsonDocument json(sizeof(esp_now_payload_data_t::message));
json[MCMT_DEVICE_NAME] = config.deviceName;
json[MCMT_DEVICE_UNIT] = 1;
json[MCMT_COMPONENT_TYPE] = HACT_BINARY_SENSOR;
json[MCMT_DEVICE_CLASS] = config.deviceClass;
json[MCMT_VALUE_TEMPLATE] = "state";
json[MCMT_PAYLOAD_ON] = "OPEN";
json[MCMT_PAYLOAD_OFF] = "CLOSED";
serializeJsonPretty(json, outgoingData.message);
char temp[sizeof(esp_now_payload_data_t)]{0};
memcpy(&temp, &outgoingData, sizeof(esp_now_payload_data_t));
myNet.sendBroadcastMessage(temp);
@ -231,16 +238,14 @@ void sendSensorConfigMessage()
void sendBatteryConfigMessage()
{
esp_now_payload_data_t outgoingData{ENDT_SENSOR, ENPT_CONFIG};
StaticJsonDocument<sizeof(esp_now_payload_data_t::message)> json;
json["name"] = deviceBatteryName;
json["unit"] = 2;
json["type"] = HACT_BINARY_SENSOR;
json["class"] = HABSDC_BATTERY;
json["payload_on"] = "MID";
json["payload_off"] = "HIGH";
char buffer[sizeof(esp_now_payload_data_t::message)]{0};
serializeJsonPretty(json, buffer);
memcpy(outgoingData.message, buffer, sizeof(esp_now_payload_data_t::message));
DynamicJsonDocument json(sizeof(esp_now_payload_data_t::message));
json[MCMT_DEVICE_NAME] = config.deviceName + " battery";
json[MCMT_DEVICE_UNIT] = 2;
json[MCMT_COMPONENT_TYPE] = HACT_SENSOR;
json[MCMT_DEVICE_CLASS] = HASDC_VOLTAGE;
json[MCMT_VALUE_TEMPLATE] = "battery";
json[MCMT_UNIT_OF_MEASUREMENT] = "V";
serializeJsonPretty(json, outgoingData.message);
char temp[sizeof(esp_now_payload_data_t)]{0};
memcpy(&temp, &outgoingData, sizeof(esp_now_payload_data_t));
myNet.sendBroadcastMessage(temp);
@ -249,16 +254,14 @@ void sendBatteryConfigMessage()
void sendAttributesMessage()
{
esp_now_payload_data_t outgoingData{ENDT_SENSOR, ENPT_ATTRIBUTES};
StaticJsonDocument<sizeof(esp_now_payload_data_t::message)> json;
json["Type"] = "ESP-NOW Window Sensor";
DynamicJsonDocument json(sizeof(esp_now_payload_data_t::message));
json["Type"] = "ESP-NOW window sensor";
json["MCU"] = "ESP8266";
json["MAC"] = myNet.getNodeMac();
json["Firmware"] = firmware;
json["Firmware"] = config.firmware;
json["Library"] = myNet.getFirmwareVersion();
char buffer[sizeof(esp_now_payload_data_t::message)]{0};
serializeJsonPretty(json, buffer);
memcpy(outgoingData.message, buffer, sizeof(esp_now_payload_data_t::message));
serializeJsonPretty(json, outgoingData.message);
char temp[sizeof(esp_now_payload_data_t)]{0};
memcpy(temp, &outgoingData, sizeof(esp_now_payload_data_t));
memcpy(&temp, &outgoingData, sizeof(esp_now_payload_data_t));
myNet.sendBroadcastMessage(temp);
}