Version 1.1
To Do item 1 performed.
This commit is contained in:
parent
aeaf9ad12c
commit
9a86f806e4
11
README.md
11
README.md
@ -8,8 +8,9 @@ Gateway for data exchange between ESP-NOW devices and MQTT broker via WiFi.
|
|||||||
2. Possibility a device search through the Windows Network Environment via SSDP.
|
2. Possibility a device search through the Windows Network Environment via SSDP.
|
||||||
3. Periodically transmission of system information to the MQTT broker (every 60 seconds) and availability status to the ESP-NOW network and to the MQTT broker (every 10 seconds).
|
3. Periodically transmission of system information to the MQTT broker (every 60 seconds) and availability status to the ESP-NOW network and to the MQTT broker (every 10 seconds).
|
||||||
4. Automatically adds gateway configuration to Home Assistan via MQTT discovery as a binary_sensor.
|
4. Automatically adds gateway configuration to Home Assistan via MQTT discovery as a binary_sensor.
|
||||||
5. Possibility firmware update over OTA.
|
5. Automatically adds supported ESP-NOW devices configurations to Home Assistan via MQTT discovery.
|
||||||
6. Web interface for settings.
|
6. Possibility firmware update over OTA.
|
||||||
|
7. Web interface for settings.
|
||||||
|
|
||||||
## Notes
|
## Notes
|
||||||
|
|
||||||
@ -31,14 +32,14 @@ Gateway for data exchange between ESP-NOW devices and MQTT broker via WiFi.
|
|||||||
## Supported devices
|
## Supported devices
|
||||||
|
|
||||||
1. [RF - Gateway](https://github.com/aZholtikov/RF-Gateway) (coming soon)
|
1. [RF - Gateway](https://github.com/aZholtikov/RF-Gateway) (coming soon)
|
||||||
2. [ESP-NOW Switch](https://github.com/aZholtikov/ESP-NOW-Switch) (coming soon)
|
2. [ESP-NOW Switch](https://github.com/aZholtikov/ESP-NOW-Switch)
|
||||||
3. [ESP-NOW Led Light/Strip](https://github.com/aZholtikov/ESP-NOW-Led-Light-Strip) (coming soon)
|
3. [ESP-NOW Light/Led Strip](https://github.com/aZholtikov/ESP-NOW-Light-Led-Strip)
|
||||||
4. [ESP-NOW Window/Door Sensor](https://github.com/aZholtikov/ESP-NOW-Window-Door-Sensor) (coming soon)
|
4. [ESP-NOW Window/Door Sensor](https://github.com/aZholtikov/ESP-NOW-Window-Door-Sensor) (coming soon)
|
||||||
5. [ESP-NOW Water Leakage Sensor](https://github.com/aZholtikov/ESP-NOW-Water-Leakage-Sensor) (coming soon)
|
5. [ESP-NOW Water Leakage Sensor](https://github.com/aZholtikov/ESP-NOW-Water-Leakage-Sensor) (coming soon)
|
||||||
|
|
||||||
## To Do
|
## To Do
|
||||||
|
|
||||||
- [ ] Automatically add ESP-NOW devices configurations to Home Assistan via MQTT discovery.
|
- [X] Automatically add ESP-NOW devices configurations to Home Assistan via MQTT discovery.
|
||||||
- [ ] LAN connection support.
|
- [ ] LAN connection support.
|
||||||
- [ ] nRF24 device support (in current time uses "RF Gateway").
|
- [ ] nRF24 device support (in current time uses "RF Gateway").
|
||||||
- [ ] BLE device support (for ESP32).
|
- [ ] BLE device support (for ESP32).
|
||||||
|
@ -38,7 +38,7 @@ lib_deps =
|
|||||||
platform = espressif32
|
platform = espressif32
|
||||||
board = az-delivery-devkit-v4
|
board = az-delivery-devkit-v4
|
||||||
framework = arduino
|
framework = arduino
|
||||||
upload_port = 192.168.1.144
|
upload_port = 192.168.1.143
|
||||||
upload_protocol = espota
|
upload_protocol = espota
|
||||||
lib_deps =
|
lib_deps =
|
||||||
https://github.com/aZholtikov/ZHNetwork
|
https://github.com/aZholtikov/ZHNetwork
|
||||||
|
51
src/main.cpp
51
src/main.cpp
@ -34,7 +34,7 @@ void setupWebServer(void);
|
|||||||
|
|
||||||
void connectToMqtt(void);
|
void connectToMqtt(void);
|
||||||
|
|
||||||
const String firmware{"1.01"};
|
const String firmware{"1.1"};
|
||||||
|
|
||||||
String espnowNetName{"DEFAULT"};
|
String espnowNetName{"DEFAULT"};
|
||||||
|
|
||||||
@ -157,6 +157,7 @@ void onEspnowMessage(const char *data, const uint8_t *sender)
|
|||||||
if (incomingData.payloadsType == ENPT_STATE)
|
if (incomingData.payloadsType == ENPT_STATE)
|
||||||
mqttClient.publish((topicPrefix + "/" + getValueName(incomingData.deviceType) + "/" + myNet.macToString(sender) + "/" + getValueName(incomingData.payloadsType)).c_str(), 2, true, incomingData.message);
|
mqttClient.publish((topicPrefix + "/" + getValueName(incomingData.deviceType) + "/" + myNet.macToString(sender) + "/" + getValueName(incomingData.payloadsType)).c_str(), 2, true, incomingData.message);
|
||||||
if (incomingData.payloadsType == ENPT_CONFIG)
|
if (incomingData.payloadsType == ENPT_CONFIG)
|
||||||
|
{
|
||||||
if (incomingData.deviceType == ENDT_SWITCH)
|
if (incomingData.deviceType == ENDT_SWITCH)
|
||||||
{
|
{
|
||||||
esp_now_payload_data_t configData;
|
esp_now_payload_data_t configData;
|
||||||
@ -165,7 +166,7 @@ void onEspnowMessage(const char *data, const uint8_t *sender)
|
|||||||
deserializeJson(json, configData.message);
|
deserializeJson(json, configData.message);
|
||||||
uint8_t unit = json["unit"].as<uint8_t>();
|
uint8_t unit = json["unit"].as<uint8_t>();
|
||||||
String type = json["type"];
|
String type = json["type"];
|
||||||
StaticJsonDocument<1024> jsonConfig;
|
StaticJsonDocument<2048> jsonConfig;
|
||||||
jsonConfig["platform"] = "mqtt";
|
jsonConfig["platform"] = "mqtt";
|
||||||
jsonConfig["name"] = json["name"];
|
jsonConfig["name"] = json["name"];
|
||||||
jsonConfig["unique_id"] = myNet.macToString(sender) + "-" + unit;
|
jsonConfig["unique_id"] = myNet.macToString(sender) + "-" + unit;
|
||||||
@ -180,10 +181,53 @@ void onEspnowMessage(const char *data, const uint8_t *sender)
|
|||||||
jsonConfig["optimistic"] = "false";
|
jsonConfig["optimistic"] = "false";
|
||||||
jsonConfig["qos"] = 2;
|
jsonConfig["qos"] = 2;
|
||||||
jsonConfig["retain"] = "true";
|
jsonConfig["retain"] = "true";
|
||||||
char buffer[1024]{0};
|
char buffer[2048]{0};
|
||||||
serializeJsonPretty(jsonConfig, buffer);
|
serializeJsonPretty(jsonConfig, buffer);
|
||||||
mqttClient.publish((topicPrefix + "/" + type + "/" + myNet.macToString(sender) + "-" + unit + "/config").c_str(), 2, true, buffer);
|
mqttClient.publish((topicPrefix + "/" + type + "/" + myNet.macToString(sender) + "-" + unit + "/config").c_str(), 2, true, buffer);
|
||||||
}
|
}
|
||||||
|
if (incomingData.deviceType == ENDT_LED)
|
||||||
|
{
|
||||||
|
esp_now_payload_data_t configData;
|
||||||
|
memcpy(&configData.message, &incomingData.message, sizeof(esp_now_payload_data_t::message));
|
||||||
|
StaticJsonDocument<sizeof(esp_now_payload_data_t::message)> json;
|
||||||
|
deserializeJson(json, configData.message);
|
||||||
|
uint8_t unit = json["unit"].as<uint8_t>();
|
||||||
|
String type = json["type"];
|
||||||
|
esp_now_led_type_t ledClass = json["class"];
|
||||||
|
StaticJsonDocument<2048> jsonConfig;
|
||||||
|
jsonConfig["platform"] = "mqtt";
|
||||||
|
jsonConfig["name"] = json["name"];
|
||||||
|
jsonConfig["unique_id"] = myNet.macToString(sender) + "-" + unit;
|
||||||
|
jsonConfig["state_topic"] = topicPrefix + "/" + getValueName(incomingData.deviceType) + "/" + myNet.macToString(sender) + "/state";
|
||||||
|
jsonConfig["state_value_template"] = "{{ value_json.state }}";
|
||||||
|
jsonConfig["command_topic"] = topicPrefix + "/" + getValueName(incomingData.deviceType) + "/" + myNet.macToString(sender) + "/set";
|
||||||
|
jsonConfig["brightness_state_topic"] = topicPrefix + "/" + getValueName(incomingData.deviceType) + "/" + myNet.macToString(sender) + "/state";
|
||||||
|
jsonConfig["brightness_value_template"] = "{{ value_json.brightness }}";
|
||||||
|
jsonConfig["brightness_command_topic"] = topicPrefix + "/" + getValueName(incomingData.deviceType) + "/" + myNet.macToString(sender) + "/brightness";
|
||||||
|
if (ledClass == ENLT_RGB || ledClass == ENLT_RGBW || ledClass == ENLT_RGBWW)
|
||||||
|
{
|
||||||
|
jsonConfig["rgb_state_topic"] = topicPrefix + "/" + getValueName(incomingData.deviceType) + "/" + myNet.macToString(sender) + "/state";
|
||||||
|
jsonConfig["rgb_value_template"] = "{{ value_json.rgb | join(',') }}";
|
||||||
|
jsonConfig["rgb_command_topic"] = topicPrefix + "/" + getValueName(incomingData.deviceType) + "/" + myNet.macToString(sender) + "/rgb";
|
||||||
|
}
|
||||||
|
if (ledClass == ENLT_WW || ledClass == ENLT_RGBWW)
|
||||||
|
{
|
||||||
|
jsonConfig["color_temp_state_topic"] = topicPrefix + "/" + getValueName(incomingData.deviceType) + "/" + myNet.macToString(sender) + "/state";
|
||||||
|
jsonConfig["color_temp_value_template"] = "{{ value_json.temperature }}";
|
||||||
|
jsonConfig["color_temp_command_topic"] = topicPrefix + "/" + getValueName(incomingData.deviceType) + "/" + myNet.macToString(sender) + "/temperature";
|
||||||
|
}
|
||||||
|
jsonConfig["json_attributes_topic"] = topicPrefix + "/" + getValueName(incomingData.deviceType) + "/" + myNet.macToString(sender) + "/attributes";
|
||||||
|
jsonConfig["availability_topic"] = topicPrefix + "/" + getValueName(incomingData.deviceType) + "/" + myNet.macToString(sender) + "/status";
|
||||||
|
jsonConfig["payload_on"] = "ON";
|
||||||
|
jsonConfig["payload_off"] = "OFF";
|
||||||
|
jsonConfig["optimistic"] = "false";
|
||||||
|
jsonConfig["qos"] = 2;
|
||||||
|
jsonConfig["retain"] = "true";
|
||||||
|
char buffer[2048]{0};
|
||||||
|
serializeJsonPretty(jsonConfig, buffer);
|
||||||
|
mqttClient.publish((topicPrefix + "/" + type + "/" + myNet.macToString(sender) + "-" + unit + "/config").c_str(), 2, true, buffer);
|
||||||
|
}
|
||||||
|
}
|
||||||
if (incomingData.payloadsType == ENPT_FORWARD)
|
if (incomingData.payloadsType == ENPT_FORWARD)
|
||||||
{
|
{
|
||||||
esp_now_payload_data_t forwardData;
|
esp_now_payload_data_t forwardData;
|
||||||
@ -295,6 +339,7 @@ void sendKeepAliveMessage()
|
|||||||
outgoingData.payloadsType = ENPT_KEEP_ALIVE;
|
outgoingData.payloadsType = ENPT_KEEP_ALIVE;
|
||||||
StaticJsonDocument<sizeof(esp_now_payload_data_t::message)> json;
|
StaticJsonDocument<sizeof(esp_now_payload_data_t::message)> json;
|
||||||
json["MQTT"] = mqttClient.connected() ? "online" : "offline";
|
json["MQTT"] = mqttClient.connected() ? "online" : "offline";
|
||||||
|
json["frequency"] = 10; // For compatibility with the previous version. Will be removed in future releases.
|
||||||
char buffer[sizeof(esp_now_payload_data_t::message)]{0};
|
char buffer[sizeof(esp_now_payload_data_t::message)]{0};
|
||||||
serializeJsonPretty(json, buffer);
|
serializeJsonPretty(json, buffer);
|
||||||
memcpy(&outgoingData.message, &buffer, sizeof(esp_now_payload_data_t::message));
|
memcpy(&outgoingData.message, &buffer, sizeof(esp_now_payload_data_t::message));
|
||||||
|
Loading…
x
Reference in New Issue
Block a user