diff --git a/README.md b/README.md
index 74dedf6ae..43f3d4b37 100644
--- a/README.md
+++ b/README.md
@@ -1,7 +1,7 @@
## Sonoff-Tasmota
Provide ESP8266 based Sonoff by [iTead Studio](https://www.itead.cc/) and ElectroDragon IoT Relay with Serial, Web and MQTT control allowing 'Over the Air' or OTA firmware updates using Arduino IDE.
-Current version is **5.10.0g** - See [sonoff/_releasenotes.ino](https://github.com/arendst/Sonoff-Tasmota/blob/development/sonoff/_releasenotes.ino) for change information.
+Current version is **5.10.0h** - See [sonoff/_releasenotes.ino](https://github.com/arendst/Sonoff-Tasmota/blob/development/sonoff/_releasenotes.ino) for change information.
### ATTENTION All versions
diff --git a/sonoff/_releasenotes.ino b/sonoff/_releasenotes.ino
index f8bde43a0..a1d4dab4d 100644
--- a/sonoff/_releasenotes.ino
+++ b/sonoff/_releasenotes.ino
@@ -1,4 +1,7 @@
-/* 5.10.0g
+/* 5.10.0h
+ * Fix Wemo Emulation for Gen 2 devices (#1486)
+ *
+ * 5.10.0g
* Add 2nd Gen Alexa support to Wemo emulation discovery (#1357, #1450)
*
* 5.10.0f
diff --git a/sonoff/language/de-DE.h b/sonoff/language/de-DE.h
index 98f25d8b1..dcf52f3b5 100644
--- a/sonoff/language/de-DE.h
+++ b/sonoff/language/de-DE.h
@@ -441,6 +441,7 @@
#define D_WEMO "WeMo"
#define D_WEMO_BASIC_EVENT "WeMo basic event"
#define D_WEMO_EVENT_SERVICE "WeMo event service"
+#define D_WEMO_META_SERVICE "WeMo meta service"
#define D_WEMO_SETUP "WeMo-Setup"
#define D_RESPONSE_SENT "Antwort gesendet"
@@ -668,6 +669,16 @@
#define D_CMND_INA219MODE "Ina219Mode"
#define D_CMND_EXCEPTION "Exception"
+// Commands xdrv_display.ino
+#define D_CMND_DISPLAY "Display"
+#define D_CMND_DISP_MODEL "Model"
+#define D_CMND_DISP_MODE "Mode"
+#define D_CMND_DISP_REFRESH "Refresh"
+#define D_CMND_DISP_DIMMER "Dimmer"
+#define D_CMND_DISP_COLS "Cols"
+#define D_CMND_DISP_ROWS "Rows"
+#define D_CMND_DISP_ADDRESS "Address"
+
// Commands xdrv_domoticz.ino
#define D_CMND_DOMOTICZ "Domoticz"
#define D_CMND_IDX "Idx"
diff --git a/sonoff/language/en-GB.h b/sonoff/language/en-GB.h
index dc293dc1c..79f5b5b95 100644
--- a/sonoff/language/en-GB.h
+++ b/sonoff/language/en-GB.h
@@ -441,6 +441,7 @@
#define D_WEMO "WeMo"
#define D_WEMO_BASIC_EVENT "WeMo basic event"
#define D_WEMO_EVENT_SERVICE "WeMo event service"
+#define D_WEMO_META_SERVICE "WeMo meta service"
#define D_WEMO_SETUP "WeMo setup"
#define D_RESPONSE_SENT "Response sent"
@@ -668,6 +669,16 @@
#define D_CMND_INA219MODE "Ina219Mode"
#define D_CMND_EXCEPTION "Exception"
+// Commands xdrv_display.ino
+#define D_CMND_DISPLAY "Display"
+#define D_CMND_DISP_MODEL "Model"
+#define D_CMND_DISP_MODE "Mode"
+#define D_CMND_DISP_REFRESH "Refresh"
+#define D_CMND_DISP_DIMMER "Dimmer"
+#define D_CMND_DISP_COLS "Cols"
+#define D_CMND_DISP_ROWS "Rows"
+#define D_CMND_DISP_ADDRESS "Address"
+
// Commands xdrv_domoticz.ino
#define D_CMND_DOMOTICZ "Domoticz"
#define D_CMND_IDX "Idx"
diff --git a/sonoff/language/it-IT.h b/sonoff/language/it-IT.h
index c568b5c5d..9594de592 100644
--- a/sonoff/language/it-IT.h
+++ b/sonoff/language/it-IT.h
@@ -441,6 +441,7 @@
#define D_WEMO "WeMo"
#define D_WEMO_BASIC_EVENT "WeMo evento base"
#define D_WEMO_EVENT_SERVICE "WeMo servizio eventi"
+#define D_WEMO_META_SERVICE "WeMo meta service"
#define D_WEMO_SETUP "Impostazione WeMo"
#define D_RESPONSE_SENT "Risposta inviata"
@@ -668,6 +669,16 @@
#define D_CMND_INA219MODE "Ina219Mode"
#define D_CMND_EXCEPTION "Exception"
+// Commands xdrv_display.ino
+#define D_CMND_DISPLAY "Display"
+#define D_CMND_DISP_MODEL "Model"
+#define D_CMND_DISP_MODE "Mode"
+#define D_CMND_DISP_REFRESH "Refresh"
+#define D_CMND_DISP_DIMMER "Dimmer"
+#define D_CMND_DISP_COLS "Cols"
+#define D_CMND_DISP_ROWS "Rows"
+#define D_CMND_DISP_ADDRESS "Address"
+
// Commands xdrv_domoticz.ino
#define D_CMND_DOMOTICZ "Domoticz"
#define D_CMND_IDX "Idx"
diff --git a/sonoff/language/nl-NL.h b/sonoff/language/nl-NL.h
index df945f62f..c5bb157f7 100644
--- a/sonoff/language/nl-NL.h
+++ b/sonoff/language/nl-NL.h
@@ -441,6 +441,7 @@
#define D_WEMO "WeMo"
#define D_WEMO_BASIC_EVENT "WeMo basis gebeurtenis"
#define D_WEMO_EVENT_SERVICE "WeMo gebeurtenis dienst"
+#define D_WEMO_META_SERVICE "WeMo meta service"
#define D_WEMO_SETUP "WeMo installatie"
#define D_RESPONSE_SENT "Antwoord verstuurd"
@@ -668,6 +669,16 @@
#define D_CMND_INA219MODE "Ina219Mode"
#define D_CMND_EXCEPTION "Exception"
+// Commands xdrv_display.ino
+#define D_CMND_DISPLAY "Display"
+#define D_CMND_DISP_MODEL "Model"
+#define D_CMND_DISP_MODE "Mode"
+#define D_CMND_DISP_REFRESH "Refresh"
+#define D_CMND_DISP_DIMMER "Dimmer"
+#define D_CMND_DISP_COLS "Cols"
+#define D_CMND_DISP_ROWS "Rows"
+#define D_CMND_DISP_ADDRESS "Address"
+
// Commands xdrv_domoticz.ino
#define D_CMND_DOMOTICZ "Domoticz"
#define D_CMND_IDX "Idx"
diff --git a/sonoff/language/pl-PL.h b/sonoff/language/pl-PL.h
index 0edf07c68..f529d8ad4 100644
--- a/sonoff/language/pl-PL.h
+++ b/sonoff/language/pl-PL.h
@@ -441,6 +441,7 @@
#define D_WEMO "WeMo"
#define D_WEMO_BASIC_EVENT "WeMo podstawowe zdarzenie"
#define D_WEMO_EVENT_SERVICE "WeMo zdarzenie service"
+#define D_WEMO_META_SERVICE "WeMo meta service"
#define D_WEMO_SETUP "WeMo setup"
#define D_RESPONSE_SENT "Odpowiedz wyslana"
@@ -668,6 +669,16 @@
#define D_CMND_INA219MODE "Ina219Mode"
#define D_CMND_EXCEPTION "Exception"
+// Commands xdrv_display.ino
+#define D_CMND_DISPLAY "Display"
+#define D_CMND_DISP_MODEL "Model"
+#define D_CMND_DISP_MODE "Mode"
+#define D_CMND_DISP_REFRESH "Refresh"
+#define D_CMND_DISP_DIMMER "Dimmer"
+#define D_CMND_DISP_COLS "Cols"
+#define D_CMND_DISP_ROWS "Rows"
+#define D_CMND_DISP_ADDRESS "Address"
+
// Commands xdrv_domoticz.ino
#define D_CMND_DOMOTICZ "Domoticz"
#define D_CMND_IDX "Idx"
diff --git a/sonoff/sonoff.ino b/sonoff/sonoff.ino
index bfefb52cf..b3011e353 100644
--- a/sonoff/sonoff.ino
+++ b/sonoff/sonoff.ino
@@ -25,8 +25,8 @@
- Select IDE Tools - Flash Size: "1M (no SPIFFS)"
====================================================*/
-#define VERSION 0x050A0007
-#define VERSION_STRING "5.10.0g" // Would be great to have a macro that fills this from VERSION ...
+#define VERSION 0x050A0008
+#define VERSION_STRING "5.10.0h" // Would be great to have a macro that fills this from VERSION ...
// Location specific includes
#include "sonoff.h" // Enumaration used in user_config.h
diff --git a/sonoff/webserver.ino b/sonoff/webserver.ino
index 21242702f..c14f1a1e7 100644
--- a/sonoff/webserver.ino
+++ b/sonoff/webserver.ino
@@ -338,6 +338,7 @@ void StartWebserver(int type, IPAddress ipweb)
if (EMUL_WEMO == Settings.flag2.emulation) {
WebServer->on("/upnp/control/basicevent1", HTTP_POST, HandleUpnpEvent);
WebServer->on("/eventservice.xml", HandleUpnpService);
+ WebServer->on("/metainfoservice.xml", HandleUpnpMetaService);
WebServer->on("/setup.xml", HandleUpnpSetupWemo);
}
if (EMUL_HUE == Settings.flag2.emulation) {
@@ -1594,6 +1595,9 @@ void HandleRestart()
void HandleNotFound()
{
+// snprintf_P(log_data, sizeof(log_data), PSTR(D_LOG_HTTP "Not fount (%s)"), WebServer->uri().c_str());
+// AddLog(LOG_LEVEL_DEBUG);
+
if (CaptivePortal()) { // If captive portal redirect instead of displaying the error page.
return;
}
diff --git a/sonoff/xdrv_wemohue.ino b/sonoff/xdrv_wemohue.ino
index 907ee3c95..1ec8a6403 100755
--- a/sonoff/xdrv_wemohue.ino
+++ b/sonoff/xdrv_wemohue.ino
@@ -44,8 +44,8 @@ const char WEMO_MSEARCH[] PROGMEM =
"OPT: \"http://schemas.upnp.org/upnp/1/0/\"; ns=01\r\n"
"01-NLS: b9200ebb-736d-4b93-bf03-835149d13983\r\n"
"SERVER: Unspecified, UPnP/1.0, Unspecified\r\n"
- "ST: urn:Belkin:device:**\r\n"
- "USN: uuid:{r2::urn:Belkin:device:**\r\n"
+ "ST: {r3\r\n" // type1 = urn:Belkin:device:**, type2 = upnp:rootdevice
+ "USN: uuid:{r2::{r3\r\n" // type1 = urn:Belkin:device:**, type2 = upnp:rootdevice
"X-User-Agent: redsonic\r\n"
"\r\n";
@@ -65,7 +65,7 @@ String WemoUuid()
return String(uuid);
}
-void WemoRespondToMSearch()
+void WemoRespondToMSearch(uint8_t echo_type)
{
char message[TOPSZ];
@@ -73,14 +73,19 @@ void WemoRespondToMSearch()
String response = FPSTR(WEMO_MSEARCH);
response.replace("{r1", WiFi.localIP().toString());
response.replace("{r2", WemoUuid());
+ if (1 == echo_type) { // type1 echo 1g & dot 2g
+ response.replace("{r3", F("urn:Belkin:device:**"));
+ } else { // type2 echo 2g (echo, plus, show)
+ response.replace("{r3", F("upnp:rootdevice"));
+ }
PortUdp.write(response.c_str());
PortUdp.endPacket();
snprintf_P(message, sizeof(message), PSTR(D_RESPONSE_SENT));
} else {
snprintf_P(message, sizeof(message), PSTR(D_FAILED_TO_SEND_RESPONSE));
}
- snprintf_P(log_data, sizeof(log_data), PSTR(D_LOG_UPNP D_WEMO " %s " D_TO " %s:%d"),
- message, PortUdp.remoteIP().toString().c_str(), PortUdp.remotePort());
+ snprintf_P(log_data, sizeof(log_data), PSTR(D_LOG_UPNP D_WEMO " " D_JSON_TYPE " %d, %s " D_TO " %s:%d"),
+ echo_type, message, PortUdp.remoteIP().toString().c_str(), PortUdp.remotePort());
AddLog(LOG_LEVEL_DEBUG);
}
@@ -220,12 +225,15 @@ void PollUdp()
// AddLog_P(LOG_LEVEL_DEBUG_MORE, PSTR("UDP: M-SEARCH Packet received"));
// AddLog_P(LOG_LEVEL_DEBUG_MORE, request.c_str());
- if ((EMUL_WEMO == Settings.flag2.emulation) &&
- ((request.indexOf(F("urn:belkin:device:**")) > 0) ||
- (request.indexOf(F("upnp:rootdevice")) > 0) || // Needed by 2nd generation Echo
- (request.indexOf(F("ssdpsearch:all")) > 0) ||
- (request.indexOf(F("ssdp:all")) > 0))) {
- WemoRespondToMSearch();
+ if (EMUL_WEMO == Settings.flag2.emulation) {
+ if (request.indexOf(F("urn:belkin:device:**")) > 0) { // type1 echo dot 2g, echo 1g's
+ WemoRespondToMSearch(1);
+ }
+ else if ((request.indexOf(F("upnp:rootdevice")) > 0) || // type2 Echo 2g (echo & echo plus)
+ (request.indexOf(F("ssdpsearch:all")) > 0) ||
+ (request.indexOf(F("ssdp:all")) > 0)) {
+ WemoRespondToMSearch(2);
+ }
}
else if ((EMUL_HUE == Settings.flag2.emulation) &&
((request.indexOf(F("urn:schemas-upnp-org:device:basic:1")) > 0) ||
@@ -282,11 +290,35 @@ const char WEMO_EVENTSERVICE_XML[] PROGMEM =
"0"
""
""
- "\r\n"
- "\r\n";
+ "\r\n\r\n";
+
+const char WEMO_METASERVICE_XML[] PROGMEM =
+ ""
+ ""
+ "1"
+ "0"
+ ""
+ ""
+ ""
+ "GetMetaInfo"
+ ""
+ ""
+ "GetMetaInfo"
+ "MetaInfo"
+ "in"
+ ""
+ ""
+ ""
+ ""
+ ""
+ "MetaInfo"
+ "string"
+ "0"
+ ""
+ ""
+ "\r\n\r\n";
const char WEMO_RESPONSE_STATE_SOAP[] PROGMEM =
- // Reloxx13 from #1357
""
""
""
@@ -315,6 +347,13 @@ const char WEMO_SETUP_XML[] PROGMEM =
"/upnp/event/basicevent1"
"/eventservice.xml"
""
+ ""
+ "urn:Belkin:service:metainfo:1"
+ "urn:Belkin:serviceId:metainfo1"
+ "/upnp/control/metainfo1"
+ "/upnp/event/metainfo1"
+ "/metainfoservice.xml"
+ ""
""
""
"\r\n";
@@ -350,6 +389,13 @@ void HandleUpnpService()
WebServer->send(200, FPSTR(HDR_CTYPE_PLAIN), FPSTR(WEMO_EVENTSERVICE_XML));
}
+void HandleUpnpMetaService()
+{
+ AddLog_P(LOG_LEVEL_DEBUG, S_LOG_HTTP, PSTR(D_WEMO_META_SERVICE));
+
+ WebServer->send(200, FPSTR(HDR_CTYPE_PLAIN), FPSTR(WEMO_METASERVICE_XML));
+}
+
void HandleUpnpSetupWemo()
{
AddLog_P(LOG_LEVEL_DEBUG, S_LOG_HTTP, PSTR(D_WEMO_SETUP));