From 41496acdee15e790735670a7c5f13453d7cf357a Mon Sep 17 00:00:00 2001 From: Theo Arends Date: Mon, 28 May 2018 11:35:23 +0200 Subject: [PATCH] File renames and Add command WebSend 5.14.0b * Add command WebSend [(:,:)] (#2821) --- sonoff/_releasenotes.ino | 2 + sonoff/i18n.h | 114 +++++----- sonoff/sonoff.ino | 43 +--- sonoff/support.ino | 32 +-- sonoff/{xdrv_00_mqtt.ino => xdrv_01_mqtt.ino} | 6 +- .../{webserver.ino => xdrv_02_webserver.ino} | 200 +++++++++++++++++- .../{xdrv_01_light.ino => xdrv_04_light.ino} | 8 +- ...v_02_irremote.ino => xdrv_05_irremote.ino} | 6 +- ...04_snfbridge.ino => xdrv_06_snfbridge.ino} | 8 +- ...v_05_domoticz.ino => xdrv_07_domoticz.ino} | 8 +- ...sistant.ino => xdrv_12_home_assistant.ino} | 6 +- sonoff/xdrv_interface.ino | 4 - sonoff/xsns_21_sgp30.ino | 2 +- sonoff/xsns_24_si1145.ino | 2 +- 14 files changed, 302 insertions(+), 139 deletions(-) rename sonoff/{xdrv_00_mqtt.ino => xdrv_01_mqtt.ino} (99%) rename sonoff/{webserver.ino => xdrv_02_webserver.ino} (90%) rename sonoff/{xdrv_01_light.ino => xdrv_04_light.ino} (99%) rename sonoff/{xdrv_02_irremote.ino => xdrv_05_irremote.ino} (99%) rename sonoff/{xdrv_04_snfbridge.ino => xdrv_06_snfbridge.ino} (99%) rename sonoff/{xdrv_05_domoticz.ino => xdrv_07_domoticz.ino} (99%) rename sonoff/{xdrv_07_home_assistant.ino => xdrv_12_home_assistant.ino} (98%) diff --git a/sonoff/_releasenotes.ino b/sonoff/_releasenotes.ino index 59db833a6..aaa78c3d5 100644 --- a/sonoff/_releasenotes.ino +++ b/sonoff/_releasenotes.ino @@ -1,6 +1,8 @@ /* 5.14.0b * Add two rule sets of 511 characters using commands rule1, rule2 and rule3 * Add rule support for IrReceive and RfReceive (#2758) + * Add command WebSend [(:,:)] (#2821) + * Fix some Pow R2 and S31 checksum errors (#1907) * * 5.14.0a * Add feature information to Status 4 diff --git a/sonoff/i18n.h b/sonoff/i18n.h index 0890c5738..c6346a748 100644 --- a/sonoff/i18n.h +++ b/sonoff/i18n.h @@ -42,6 +42,7 @@ #define D_JSON_BUILDDATETIME "BuildDateTime" #define D_JSON_CO2 "CarbonDioxide" #define D_JSON_COMMAND "Command" +#define D_JSON_CONNECT_FAILED "Connect failed" #define D_JSON_COREVERSION "Core" #define D_JSON_COUNTER "Counter" #define D_JSON_CURRENT "Current" // As in Voltage and Current @@ -67,6 +68,7 @@ #define D_JSON_GATEWAY "Gateway" #define D_JSON_HEAPSIZE "Heap" #define D_JSON_HIGH "High" +#define D_JSON_HOST_NOT_FOUND "Host not found" #define D_JSON_HSBCOLOR "HSBColor" #define D_JSON_HUMIDITY "Humidity" #define D_JSON_I2CSCAN_DEVICES_FOUND_AT "Device(s) found at" @@ -133,6 +135,7 @@ #define D_JSON_VOLTAGE "Voltage" #define D_JSON_WIFI "Wifi" #define D_JSON_WRONG "Wrong" +#define D_JSON_WRONG_PARAMETERS "Wrong parameters" #define D_JSON_YESTERDAY "Yesterday" #define D_JSON_ZERO_POINT_CALIBRATION "Zero Point Calibration" @@ -213,14 +216,6 @@ #define D_WCFG_5_WAIT "Wait" #define D_CMND_FRIENDLYNAME "FriendlyName" #define D_CMND_SWITCHMODE "SwitchMode" -#define D_CMND_WEBSERVER "Webserver" - #define D_JSON_WEBSERVER_MODE "WebServerMode" - #define D_JSON_ACTIVE_FOR "Active for" - #define D_JSON_ON_DEVICE "on" - #define D_JSON_WITH_IP_ADDRESS "with IP address" -#define D_CMND_WEBPASSWORD "WebPassword" -#define D_CMND_WEBLOG "WebLog" -#define D_CMND_EMULATION "Emulation" #define D_CMND_TELEPERIOD "TelePeriod" #define D_CMND_RESTART "Restart" #define D_JSON_ONE_TO_RESTART "1 to restart" @@ -238,7 +233,7 @@ #define D_CMND_SERIALDELIMITER "SerialDelimiter" #define D_CMND_BAUDRATE "Baudrate" -// Commands xdrv_00_mqtt.ino +// Commands xdrv_01_mqtt.ino #define D_CMND_MQTTHOST "MqttHost" #define D_CMND_MQTTPORT "MqttPort" #define D_CMND_MQTTRETRY "MqttRetry" @@ -263,37 +258,16 @@ #define D_CMND_SENSORRETAIN "SensorRetain" #define D_CMND_PUBLISH "Publish" -// Commands xdrv_01_light.ino -#define D_CMND_CHANNEL "Channel" -#define D_CMND_COLOR "Color" -#define D_CMND_COLORTEMPERATURE "CT" -#define D_CMND_DIMMER "Dimmer" -#define D_CMND_HSBCOLOR "HSBColor" -#define D_CMND_LED "Led" -#define D_CMND_LEDTABLE "LedTable" -#define D_CMND_FADE "Fade" -#define D_CMND_PIXELS "Pixels" -#define D_CMND_ROTATION "Rotation" -#define D_CMND_SCHEME "Scheme" -#define D_CMND_SPEED "Speed" -#define D_CMND_WAKEUP "Wakeup" -#define D_CMND_WAKEUPDURATION "WakeUpDuration" -#define D_CMND_WIDTH "Width" - -// Commands xdrv_02_irremote.ino -#define D_CMND_IRSEND "IRSend" - #define D_JSON_INVALID_JSON "Invalid JSON" - #define D_JSON_PROTOCOL_NOT_SUPPORTED "Protocol not supported" - #define D_JSON_IR_PROTOCOL "Protocol" - #define D_JSON_IR_BITS "Bits" - #define D_JSON_IR_DATA "Data" -#define D_CMND_IRHVAC "IRHVAC" - #define D_JSON_IRHVAC_VENDOR "VENDOR" - #define D_JSON_IRHVAC_POWER "POWER" - #define D_JSON_IRHVAC_MODE "MODE" - #define D_JSON_IRHVAC_FANSPEED "FANSPEED" - #define D_JSON_IRHVAC_TEMP "TEMP" -#define D_JSON_IRRECEIVED "IrReceived" +// Commands xdrv_02_webserver.ino +#define D_CMND_WEBSERVER "Webserver" + #define D_JSON_WEBSERVER_MODE "WebServerMode" + #define D_JSON_ACTIVE_FOR "Active for" + #define D_JSON_ON_DEVICE "on" + #define D_JSON_WITH_IP_ADDRESS "with IP address" +#define D_CMND_WEBPASSWORD "WebPassword" +#define D_CMND_WEBLOG "WebLog" +#define D_CMND_WEBSEND "WebSend" +#define D_CMND_EMULATION "Emulation" // Commands xdrv_03_energy.ino #define D_CMND_POWERLOW "PowerLow" @@ -324,7 +298,39 @@ #define D_JSON_ENERGYMONITOR "EnergyMonitor" #define D_JSON_MAXENERGYREACHED "MaxEnergyReached" -// Commands xdrv_04_snfbridge.ino +// Commands xdrv_04_light.ino +#define D_CMND_CHANNEL "Channel" +#define D_CMND_COLOR "Color" +#define D_CMND_COLORTEMPERATURE "CT" +#define D_CMND_DIMMER "Dimmer" +#define D_CMND_HSBCOLOR "HSBColor" +#define D_CMND_LED "Led" +#define D_CMND_LEDTABLE "LedTable" +#define D_CMND_FADE "Fade" +#define D_CMND_PIXELS "Pixels" +#define D_CMND_ROTATION "Rotation" +#define D_CMND_SCHEME "Scheme" +#define D_CMND_SPEED "Speed" +#define D_CMND_WAKEUP "Wakeup" +#define D_CMND_WAKEUPDURATION "WakeUpDuration" +#define D_CMND_WIDTH "Width" + +// Commands xdrv_05_irremote.ino +#define D_CMND_IRSEND "IRSend" + #define D_JSON_INVALID_JSON "Invalid JSON" + #define D_JSON_PROTOCOL_NOT_SUPPORTED "Protocol not supported" + #define D_JSON_IR_PROTOCOL "Protocol" + #define D_JSON_IR_BITS "Bits" + #define D_JSON_IR_DATA "Data" +#define D_CMND_IRHVAC "IRHVAC" + #define D_JSON_IRHVAC_VENDOR "VENDOR" + #define D_JSON_IRHVAC_POWER "POWER" + #define D_JSON_IRHVAC_MODE "MODE" + #define D_JSON_IRHVAC_FANSPEED "FANSPEED" + #define D_JSON_IRHVAC_TEMP "TEMP" +#define D_JSON_IRRECEIVED "IrReceived" + +// Commands xdrv_06_snfbridge.ino #define D_CMND_RFCODE "RfCode" #define D_CMND_RFHIGH "RfHigh" #define D_CMND_RFHOST "RfHost" @@ -340,7 +346,7 @@ #define D_CMND_RFSYNC "RfSync" #define D_JSON_RFRECEIVED "RfReceived" -// Commands xdrv_05_domoticz.ino +// Commands xdrv_07_domoticz.ino #define D_CMND_DOMOTICZ "Domoticz" #define D_CMND_IDX "Idx" #define D_CMND_KEYIDX "KeyIdx" @@ -348,18 +354,6 @@ #define D_CMND_SENSORIDX "SensorIdx" #define D_CMND_UPDATETIMER "UpdateTimer" -// Commands xdrv_06_display.ino -#define D_CMND_DISPLAY "Display" -#define D_CMND_DISP_ADDRESS "Address" -#define D_CMND_DISP_COLS "Cols" -#define D_CMND_DISP_DIMMER "Dimmer" -#define D_CMND_DISP_MODE "Mode" -#define D_CMND_DISP_MODEL "Model" -#define D_CMND_DISP_REFRESH "Refresh" -#define D_CMND_DISP_ROWS "Rows" -#define D_CMND_DISP_SIZE "Size" -#define D_CMND_DISP_TEXT "Text" - // Commands xdrv_08_serial_bridge.ino #define D_CMND_SSERIALSEND "SSerialSend" #define D_CMND_SBAUDRATE "SBaudrate" @@ -380,6 +374,18 @@ #define D_CMND_LATITUDE "Latitude" #define D_CMND_LONGITUDE "Longitude" +// Commands xdrv_98_display.ino +#define D_CMND_DISPLAY "Display" +#define D_CMND_DISP_ADDRESS "Address" +#define D_CMND_DISP_COLS "Cols" +#define D_CMND_DISP_DIMMER "Dimmer" +#define D_CMND_DISP_MODE "Mode" +#define D_CMND_DISP_MODEL "Model" +#define D_CMND_DISP_REFRESH "Refresh" +#define D_CMND_DISP_ROWS "Rows" +#define D_CMND_DISP_SIZE "Size" +#define D_CMND_DISP_TEXT "Text" + /********************************************************************************************/ #define D_ASTERIX "********" diff --git a/sonoff/sonoff.ino b/sonoff/sonoff.ino index 82e745b73..d1781793d 100644 --- a/sonoff/sonoff.ino +++ b/sonoff/sonoff.ino @@ -82,7 +82,7 @@ enum TasmotaCommands { CMND_GPIO, CMND_GPIOS, CMND_PWM, CMND_PWMFREQUENCY, CMND_PWMRANGE, CMND_COUNTER, CMND_COUNTERTYPE, CMND_COUNTERDEBOUNCE, CMND_SLEEP, CMND_UPGRADE, CMND_UPLOAD, CMND_OTAURL, CMND_SERIALLOG, CMND_SYSLOG, CMND_LOGHOST, CMND_LOGPORT, CMND_IPADDRESS, CMND_NTPSERVER, CMND_AP, CMND_SSID, CMND_PASSWORD, CMND_HOSTNAME, - CMND_WIFICONFIG, CMND_FRIENDLYNAME, CMND_SWITCHMODE, CMND_WEBSERVER, CMND_WEBPASSWORD, CMND_WEBLOG, CMND_EMULATION, + CMND_WIFICONFIG, CMND_FRIENDLYNAME, CMND_SWITCHMODE, CMND_TELEPERIOD, CMND_RESTART, CMND_RESET, CMND_TIMEZONE, CMND_TIMESTD, CMND_TIMEDST, CMND_ALTITUDE, CMND_LEDPOWER, CMND_LEDSTATE, CMND_I2CSCAN, CMND_SERIALSEND, CMND_BAUDRATE, CMND_SERIALDELIMITER }; const char kTasmotaCommands[] PROGMEM = @@ -92,7 +92,7 @@ const char kTasmotaCommands[] PROGMEM = D_CMND_GPIO "|" D_CMND_GPIOS "|" D_CMND_PWM "|" D_CMND_PWMFREQUENCY "|" D_CMND_PWMRANGE "|" D_CMND_COUNTER "|" D_CMND_COUNTERTYPE "|" D_CMND_COUNTERDEBOUNCE "|" D_CMND_SLEEP "|" D_CMND_UPGRADE "|" D_CMND_UPLOAD "|" D_CMND_OTAURL "|" D_CMND_SERIALLOG "|" D_CMND_SYSLOG "|" D_CMND_LOGHOST "|" D_CMND_LOGPORT "|" D_CMND_IPADDRESS "|" D_CMND_NTPSERVER "|" D_CMND_AP "|" D_CMND_SSID "|" D_CMND_PASSWORD "|" D_CMND_HOSTNAME "|" - D_CMND_WIFICONFIG "|" D_CMND_FRIENDLYNAME "|" D_CMND_SWITCHMODE "|" D_CMND_WEBSERVER "|" D_CMND_WEBPASSWORD "|" D_CMND_WEBLOG "|" D_CMND_EMULATION "|" + D_CMND_WIFICONFIG "|" D_CMND_FRIENDLYNAME "|" D_CMND_SWITCHMODE "|" D_CMND_TELEPERIOD "|" D_CMND_RESTART "|" D_CMND_RESET "|" D_CMND_TIMEZONE "|" D_CMND_TIMESTD "|" D_CMND_TIMEDST "|" D_CMND_ALTITUDE "|" D_CMND_LEDPOWER "|" D_CMND_LEDSTATE "|" D_CMND_I2CSCAN "|" D_CMND_SERIALSEND "|" D_CMND_BAUDRATE "|" D_CMND_SERIALDELIMITER; @@ -980,38 +980,6 @@ void MqttDataHandler(char* topic, byte* data, unsigned int data_len) if ((payload >= 0) && (payload < MAX_SWITCH_OPTION)) Settings.switchmode[index -1] = payload; snprintf_P(mqtt_data, sizeof(mqtt_data), S_JSON_COMMAND_INDEX_NVALUE, command, index, Settings.switchmode[index-1]); } -#ifdef USE_WEBSERVER - else if (CMND_WEBSERVER == command_code) { - if ((payload >= 0) && (payload <= 2)) Settings.webserver = payload; - if (Settings.webserver) { - snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("{\"" D_CMND_WEBSERVER "\":\"" D_JSON_ACTIVE_FOR " %s " D_JSON_ON_DEVICE " %s " D_JSON_WITH_IP_ADDRESS " %s\"}"), - (2 == Settings.webserver) ? D_ADMIN : D_USER, my_hostname, WiFi.localIP().toString().c_str()); - } else { - snprintf_P(mqtt_data, sizeof(mqtt_data), S_JSON_COMMAND_SVALUE, command, GetStateText(0)); - } - } - else if (CMND_WEBPASSWORD == command_code) { - if ((data_len > 0) && (data_len < sizeof(Settings.web_password))) { - strlcpy(Settings.web_password, (!strcmp(dataBuf,"0")) ? "" : (1 == payload) ? WEB_PASSWORD : dataBuf, sizeof(Settings.web_password)); - snprintf_P(mqtt_data, sizeof(mqtt_data), S_JSON_COMMAND_SVALUE, command, Settings.web_password); - } else { - snprintf_P(mqtt_data, sizeof(mqtt_data), S_JSON_COMMAND_ASTERIX, command); - } - } - else if (CMND_WEBLOG == command_code) { - if ((payload >= LOG_LEVEL_NONE) && (payload <= LOG_LEVEL_ALL)) Settings.weblog_level = payload; - snprintf_P(mqtt_data, sizeof(mqtt_data), S_JSON_COMMAND_NVALUE, command, Settings.weblog_level); - } -#ifdef USE_EMULATION - else if (CMND_EMULATION == command_code) { - if ((payload >= EMUL_NONE) && (payload < EMUL_MAX)) { - Settings.flag2.emulation = payload; - restart_flag = 2; - } - snprintf_P(mqtt_data, sizeof(mqtt_data), S_JSON_COMMAND_NVALUE, command, Settings.flag2.emulation); - } -#endif // USE_EMULATION -#endif // USE_WEBSERVER else if (CMND_TELEPERIOD == command_code) { if ((payload >= 0) && (payload < 3601)) { Settings.tele_period = (1 == payload) ? TELE_PERIOD : payload; @@ -2480,13 +2448,6 @@ void loop() OsWatchLoop(); -#ifdef USE_WEBSERVER - PollDnsWebserver(); -#ifdef USE_EMULATION - if (Settings.flag2.emulation) PollUdp(); -#endif // USE_EMULATION -#endif // USE_WEBSERVER - if (millis() >= state_loop_timer) StateLoop(); if (!serial_local) SerialInput(); diff --git a/sonoff/support.ino b/sonoff/support.ino index 2bc80c5eb..34845e4f6 100644 --- a/sonoff/support.ino +++ b/sonoff/support.ino @@ -633,52 +633,52 @@ void GetFeatures() feature_drv1 |= 0x00000040; // sonoff.ino #endif #ifdef USE_WEBSERVER - feature_drv1 |= 0x00000080; // webserver.ino + feature_drv1 |= 0x00000080; // xdrv_02_webserver.ino #endif #ifdef WEBSERVER_ADVERTISE - feature_drv1 |= 0x00000100; // webserver.ino + feature_drv1 |= 0x00000100; // xdrv_02_webserver.ino #endif #ifdef USE_EMULATION feature_drv1 |= 0x00000200; // xplg_wemohue.ino #endif #if (MQTT_LIBRARY_TYPE == MQTT_PUBSUBCLIENT) - feature_drv1 |= 0x00000400; // xdrv_00_mqtt.ino + feature_drv1 |= 0x00000400; // xdrv_01_mqtt.ino #endif #if (MQTT_LIBRARY_TYPE == MQTT_TASMOTAMQTT) - feature_drv1 |= 0x00000800; // xdrv_00_mqtt.ino + feature_drv1 |= 0x00000800; // xdrv_01_mqtt.ino #endif #if (MQTT_LIBRARY_TYPE == MQTT_ESPMQTTARDUINO) - feature_drv1 |= 0x00001000; // xdrv_00_mqtt.ino + feature_drv1 |= 0x00001000; // xdrv_01_mqtt.ino #endif #ifdef MQTT_HOST_DISCOVERY - feature_drv1 |= 0x00002000; // xdrv_00_mqtt.ino + feature_drv1 |= 0x00002000; // xdrv_01_mqtt.ino #endif #ifdef USE_ARILUX_RF - feature_drv1 |= 0x00004000; // xdrv_01_light.ino + feature_drv1 |= 0x00004000; // xdrv_04_light.ino #endif #ifdef USE_WS2812 - feature_drv1 |= 0x00008000; // xdrv_01_light.ino + feature_drv1 |= 0x00008000; // xdrv_04_light.ino #endif #ifdef USE_WS2812_DMA - feature_drv1 |= 0x00010000; // xdrv_01_light.ino + feature_drv1 |= 0x00010000; // xdrv_04_light.ino #endif #ifdef USE_IR_REMOTE - feature_drv1 |= 0x00020000; // xdrv_02_irremote.ino + feature_drv1 |= 0x00020000; // xdrv_05_irremote.ino #endif #ifdef USE_IR_HVAC - feature_drv1 |= 0x00040000; // xdrv_02_irremote.ino + feature_drv1 |= 0x00040000; // xdrv_05_irremote.ino #endif #ifdef USE_IR_RECEIVE - feature_drv1 |= 0x00080000; // xdrv_02_irremote.ino + feature_drv1 |= 0x00080000; // xdrv_05_irremote.ino #endif #ifdef USE_DOMOTICZ - feature_drv1 |= 0x00100000; // xdrv_05_domoticz.ino + feature_drv1 |= 0x00100000; // xdrv_07_domoticz.ino #endif #ifdef USE_DISPLAY - feature_drv1 |= 0x00200000; // xdrv_06_display.ino + feature_drv1 |= 0x00200000; // xdrv_98_display.ino #endif #ifdef USE_HOME_ASSISTANT - feature_drv1 |= 0x00400000; // xdrv_07_home_assistant.ino + feature_drv1 |= 0x00400000; // xdrv_12_home_assistant.ino #endif #ifdef USE_SERIAL_BRIDGE feature_drv1 |= 0x00800000; // xdrv_08_serial_bridge.ino @@ -1141,7 +1141,7 @@ void WifiCheck(uint8_t param) StartWebserver(Settings.webserver, WiFi.localIP()); #ifdef USE_DISCOVERY #ifdef WEBSERVER_ADVERTISE - MDNS.addService("http", "tcp", 80); + MDNS.addService("http", "tcp", WEB_PORT); #endif // WEBSERVER_ADVERTISE #endif // USE_DISCOVERY } else { diff --git a/sonoff/xdrv_00_mqtt.ino b/sonoff/xdrv_01_mqtt.ino similarity index 99% rename from sonoff/xdrv_00_mqtt.ino rename to sonoff/xdrv_01_mqtt.ino index 5d688e721..7a2c5e666 100644 --- a/sonoff/xdrv_00_mqtt.ino +++ b/sonoff/xdrv_01_mqtt.ino @@ -1,5 +1,5 @@ /* - xdrv_00_mqtt.ino - mqtt support for Sonoff-Tasmota + xdrv_01_mqtt.ino - mqtt support for Sonoff-Tasmota Copyright (C) 2018 Theo Arends @@ -745,9 +745,9 @@ bool MqttCommand() * Interface \*********************************************************************************************/ -#define XDRV_00 +#define XDRV_01 -boolean Xdrv00(byte function) +boolean Xdrv01(byte function) { boolean result = false; diff --git a/sonoff/webserver.ino b/sonoff/xdrv_02_webserver.ino similarity index 90% rename from sonoff/webserver.ino rename to sonoff/xdrv_02_webserver.ino index e1656ec31..9823145c4 100644 --- a/sonoff/webserver.ino +++ b/sonoff/xdrv_02_webserver.ino @@ -1,5 +1,5 @@ /* - webserver.ino - webserver for Sonoff-Tasmota + xdrv_02_webserver.ino - webserver for Sonoff-Tasmota Copyright (C) 2018 Theo Arends @@ -1676,4 +1676,202 @@ boolean ValidIpAddress(String str) } return true; } + +/*********************************************************************************************/ + +String UrlEncode(const String& text) +{ + const char hex[] = "0123456789ABCDEF"; + + String encoded = ""; + int len = text.length(); + int i = 0; + while (i < len) { + char decodedChar = text.charAt(i++); + +/* + if (('a' <= decodedChar && decodedChar <= 'z') || + ('A' <= decodedChar && decodedChar <= 'Z') || + ('0' <= decodedChar && decodedChar <= '9') || + ('=' == decodedChar)) { + encoded += decodedChar; + } else { + encoded += '%'; + encoded += hex[decodedChar >> 4]; + encoded += hex[decodedChar & 0xF]; + } +*/ + if (' ' == decodedChar) { + encoded += '%'; + encoded += hex[decodedChar >> 4]; + encoded += hex[decodedChar & 0xF]; + } else { + encoded += decodedChar; + } + + } + return encoded; +} + +int WebSend(char *buffer) +{ + // http://192.168.178.86:80/cm?user=admin&password=joker&cmnd=POWER1 ON + // http://192.168.178.86:80/cm?cmnd=POWER1 ON + // [192.168.178.86:80,admin:joker] POWER1 ON + + char *host; + char *port; + char *user; + char *password; + char *command; + uint16_t nport = 80; + int status = 1; // Wrong parameters + + host = strtok_r(buffer, "]", &command); // buffer = [192.168.178.86:80,admin:joker] POWER1 ON + if (host && command) { + host = LTrim(host); + host++; // Skip [ + host = strtok_r(host, ",", &user); // host = 192.168.178.86:80,admin:joker > 192.168.178.86:80 + host = strtok_r(host, ":", &port); // host = 192.168.178.86:80 > 192.168.178.86 + if (user) { + user = strtok_r(user, ":", &password); // user = admin:joker > admin + } + +//snprintf_P(log_data, sizeof(log_data), PSTR("DBG: Buffer |%X|, Host |%X|, Port |%X|, User |%X|, Password |%X|, Command |%X|"), buffer, host, port, user, password, command); +//AddLog(LOG_LEVEL_DEBUG); + + if (port) { nport = atoi(port); } + + String nuri = ""; + if (user && password) { + nuri += F("user="); + nuri += user; + nuri += F("&password="); + nuri += password; + nuri += F("&"); + } + nuri += F("cmnd="); + nuri += LTrim(command); + String uri = UrlEncode(nuri); + + IPAddress host_ip; + if (WiFi.hostByName(host, host_ip)) { + WiFiClient client; + + bool connected = false; + byte retry = 2; + while ((retry > 0) && !connected) { + --retry; + connected = client.connect(host_ip, nport); + if (connected) break; + } + + if (connected) { + String url = F("GET /cm?"); + url += uri; + url += F(" HTTP/1.1\r\n Host: "); + url += IPAddress(host_ip).toString(); + if (port) { + url += F(" \r\n Port: "); + url += port; + } + url += F(" \r\n Connection: close\r\n\r\n"); + +//snprintf_P(log_data, sizeof(log_data), PSTR("DBG: Url |%s|"), url.c_str()); +//AddLog(LOG_LEVEL_DEBUG); + + client.print(url.c_str()); + client.flush(); + client.stop(); + status = 0; // No error - Done + } else { + status = 2; // Connection failed + } + } else { + status = 3; // Host not found + } + } + return status; +} + +/*********************************************************************************************/ + +enum WebCommands { CMND_WEBSERVER, CMND_WEBPASSWORD, CMND_WEBLOG, CMND_WEBSEND, CMND_EMULATION }; +const char kWebCommands[] PROGMEM = D_CMND_WEBSERVER "|" D_CMND_WEBPASSWORD "|" D_CMND_WEBLOG "|" D_CMND_WEBSEND "|" D_CMND_EMULATION ; +const char kWebSendStatus[] PROGMEM = D_JSON_DONE "|" D_JSON_WRONG_PARAMETERS "|" D_JSON_CONNECT_FAILED "|" D_JSON_HOST_NOT_FOUND ; + +bool WebCommand() +{ + char command[CMDSZ]; + bool serviced = true; + + int command_code = GetCommandCode(command, sizeof(command), XdrvMailbox.topic, kWebCommands); + if (-1 == command_code) { + serviced = false; // Unknown command + } + if (CMND_WEBSERVER == command_code) { + if ((XdrvMailbox.payload >= 0) && (XdrvMailbox.payload <= 2)) { Settings.webserver = XdrvMailbox.payload; } + if (Settings.webserver) { + snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("{\"" D_CMND_WEBSERVER "\":\"" D_JSON_ACTIVE_FOR " %s " D_JSON_ON_DEVICE " %s " D_JSON_WITH_IP_ADDRESS " %s\"}"), + (2 == Settings.webserver) ? D_ADMIN : D_USER, my_hostname, WiFi.localIP().toString().c_str()); + } else { + snprintf_P(mqtt_data, sizeof(mqtt_data), S_JSON_COMMAND_SVALUE, command, GetStateText(0)); + } + } + else if (CMND_WEBPASSWORD == command_code) { + if ((XdrvMailbox.data_len > 0) && (XdrvMailbox.data_len < sizeof(Settings.web_password))) { + strlcpy(Settings.web_password, (!strcmp(XdrvMailbox.data,"0")) ? "" : (1 == XdrvMailbox.payload) ? WEB_PASSWORD : XdrvMailbox.data, sizeof(Settings.web_password)); + snprintf_P(mqtt_data, sizeof(mqtt_data), S_JSON_COMMAND_SVALUE, command, Settings.web_password); + } else { + snprintf_P(mqtt_data, sizeof(mqtt_data), S_JSON_COMMAND_ASTERIX, command); + } + } + else if (CMND_WEBLOG == command_code) { + if ((XdrvMailbox.payload >= LOG_LEVEL_NONE) && (XdrvMailbox.payload <= LOG_LEVEL_ALL)) { Settings.weblog_level = XdrvMailbox.payload; } + snprintf_P(mqtt_data, sizeof(mqtt_data), S_JSON_COMMAND_NVALUE, command, Settings.weblog_level); + } + else if (CMND_WEBSEND == command_code) { + if (XdrvMailbox.data_len > 0) { + uint8_t result = WebSend(XdrvMailbox.data); + char stemp1[20]; + snprintf_P(mqtt_data, sizeof(mqtt_data), S_JSON_COMMAND_SVALUE, command, GetTextIndexed(stemp1, sizeof(stemp1), result, kWebSendStatus)); + } + } +#ifdef USE_EMULATION + else if (CMND_EMULATION == command_code) { + if ((XdrvMailbox.payload >= EMUL_NONE) && (XdrvMailbox.payload < EMUL_MAX)) { + Settings.flag2.emulation = XdrvMailbox.payload; + restart_flag = 2; + } + snprintf_P(mqtt_data, sizeof(mqtt_data), S_JSON_COMMAND_NVALUE, command, Settings.flag2.emulation); + } +#endif // USE_EMULATION + else serviced = false; // Unknown command + + return serviced; +} + +/*********************************************************************************************\ + * Interface +\*********************************************************************************************/ + +#define XDRV_02 + +boolean Xdrv02(byte function) +{ + boolean result = false; + + switch (function) { + case FUNC_LOOP: + PollDnsWebserver(); +#ifdef USE_EMULATION + if (Settings.flag2.emulation) PollUdp(); +#endif // USE_EMULATION + break; + case FUNC_COMMAND: + result = WebCommand(); + break; + } + return result; +} #endif // USE_WEBSERVER diff --git a/sonoff/xdrv_01_light.ino b/sonoff/xdrv_04_light.ino similarity index 99% rename from sonoff/xdrv_01_light.ino rename to sonoff/xdrv_04_light.ino index 6ea7ca7e9..557250d31 100644 --- a/sonoff/xdrv_01_light.ino +++ b/sonoff/xdrv_04_light.ino @@ -1,5 +1,5 @@ /* - xdrv_01_light.ino - PWM, WS2812 and sonoff led support for Sonoff-Tasmota + xdrv_04_light.ino - PWM, WS2812 and sonoff led support for Sonoff-Tasmota Copyright (C) 2018 Theo Arends @@ -1279,7 +1279,7 @@ boolean LightCommand() if (coldim) { LightPreparePower(); } - + return serviced; } @@ -1287,9 +1287,9 @@ boolean LightCommand() * Interface \*********************************************************************************************/ -#define XDRV_01 +#define XDRV_04 -boolean Xdrv01(byte function) +boolean Xdrv04(byte function) { boolean result = false; diff --git a/sonoff/xdrv_02_irremote.ino b/sonoff/xdrv_05_irremote.ino similarity index 99% rename from sonoff/xdrv_02_irremote.ino rename to sonoff/xdrv_05_irremote.ino index eed1fd228..df2828fb9 100644 --- a/sonoff/xdrv_02_irremote.ino +++ b/sonoff/xdrv_05_irremote.ino @@ -1,5 +1,5 @@ /* - xdrv_02_irremote.ino - infra red support for Sonoff-Tasmota + xdrv_05_irremote.ino - infra red support for Sonoff-Tasmota Copyright (C) 2018 Heiko Krupp, Lazar Obradovic and Theo Arends @@ -393,9 +393,9 @@ boolean IrSendCommand() * Interface \*********************************************************************************************/ -#define XDRV_02 +#define XDRV_05 -boolean Xdrv02(byte function) +boolean Xdrv05(byte function) { boolean result = false; diff --git a/sonoff/xdrv_04_snfbridge.ino b/sonoff/xdrv_06_snfbridge.ino similarity index 99% rename from sonoff/xdrv_04_snfbridge.ino rename to sonoff/xdrv_06_snfbridge.ino index 8aa300f5d..4149ae2a9 100644 --- a/sonoff/xdrv_04_snfbridge.ino +++ b/sonoff/xdrv_06_snfbridge.ino @@ -1,5 +1,5 @@ /* - xdrv_04_snfbridge.ino - sonoff RF bridge 433 support for Sonoff-Tasmota + xdrv_06_snfbridge.ino - sonoff RF bridge 433 support for Sonoff-Tasmota Copyright (C) 2018 Theo Arends @@ -295,7 +295,7 @@ boolean SonoffBridgeCommand() snprintf_P(mqtt_data, sizeof(mqtt_data), S_JSON_COMMAND_INDEX_SVALUE, command, sonoff_bridge_learn_key, D_JSON_LEARNING_ACTIVE); } } else serviced = false; // Unknown command - + return serviced; } @@ -303,9 +303,9 @@ boolean SonoffBridgeCommand() * Interface \*********************************************************************************************/ -#define XDRV_04 +#define XDRV_06 -boolean Xdrv04(byte function) +boolean Xdrv06(byte function) { boolean result = false; diff --git a/sonoff/xdrv_05_domoticz.ino b/sonoff/xdrv_07_domoticz.ino similarity index 99% rename from sonoff/xdrv_05_domoticz.ino rename to sonoff/xdrv_07_domoticz.ino index bf9ae023e..f2b972326 100644 --- a/sonoff/xdrv_05_domoticz.ino +++ b/sonoff/xdrv_07_domoticz.ino @@ -1,5 +1,5 @@ /* - xdrv_05_domoticz.ino - domoticz support for Sonoff-Tasmota + xdrv_07_domoticz.ino - domoticz support for Sonoff-Tasmota Copyright (C) 2018 Theo Arends @@ -265,7 +265,7 @@ boolean DomoticzCommand() else serviced = false; // Unknown command } else serviced = false; // Unknown command - + return serviced; } @@ -437,9 +437,9 @@ void DomoticzSaveSettings() * Interface \*********************************************************************************************/ -#define XDRV_05 +#define XDRV_07 -boolean Xdrv05(byte function) +boolean Xdrv07(byte function) { boolean result = false; diff --git a/sonoff/xdrv_07_home_assistant.ino b/sonoff/xdrv_12_home_assistant.ino similarity index 98% rename from sonoff/xdrv_07_home_assistant.ino rename to sonoff/xdrv_12_home_assistant.ino index 657f8d5b7..ee008280b 100644 --- a/sonoff/xdrv_07_home_assistant.ino +++ b/sonoff/xdrv_12_home_assistant.ino @@ -1,5 +1,5 @@ /* - xdrv_07_home_assistant.ino - home assistant support for Sonoff-Tasmota + xdrv_12_home_assistant.ino - home assistant support for Sonoff-Tasmota Copyright (C) 2018 Theo Arends @@ -208,9 +208,9 @@ void HAssDiscovery(uint8_t mode) * Interface \*********************************************************************************************/ -#define XDRV_07 +#define XDRV_12 -boolean Xdrv07(byte function) +boolean Xdrv12(byte function) { boolean result = false; diff --git a/sonoff/xdrv_interface.ino b/sonoff/xdrv_interface.ino index d075f3136..1897cec5f 100644 --- a/sonoff/xdrv_interface.ino +++ b/sonoff/xdrv_interface.ino @@ -18,10 +18,6 @@ */ boolean (* const xdrv_func_ptr[])(byte) PROGMEM = { // Driver Function Pointers -#ifdef XDRV_00 - &Xdrv00, -#endif - #ifdef XDRV_01 &Xdrv01, #endif diff --git a/sonoff/xsns_21_sgp30.ino b/sonoff/xsns_21_sgp30.ino index d30281155..5fef47bfd 100644 --- a/sonoff/xsns_21_sgp30.ino +++ b/sonoff/xsns_21_sgp30.ino @@ -76,8 +76,8 @@ void Sgp30Show(boolean json) #ifdef USE_DOMOTICZ if (0 == tele_period) DomoticzSensor(DZ_AIRQUALITY, sgp.eCO2); #endif // USE_DOMOTICZ - } else { #ifdef USE_WEBSERVER + } else { snprintf_P(mqtt_data, sizeof(mqtt_data), HTTP_SNS_SGP30, mqtt_data, sgp.eCO2, sgp.TVOC); #endif } diff --git a/sonoff/xsns_24_si1145.ino b/sonoff/xsns_24_si1145.ino index 5ddd713d8..95ad930af 100644 --- a/sonoff/xsns_24_si1145.ino +++ b/sonoff/xsns_24_si1145.ino @@ -335,8 +335,8 @@ void Si1145Show(boolean json) #ifdef USE_DOMOTICZ if (0 == tele_period) DomoticzSensor(DZ_ILLUMINANCE, visible); #endif // USE_DOMOTICZ - } else { #ifdef USE_WEBSERVER + } else { snprintf_P(mqtt_data, sizeof(mqtt_data), HTTP_SNS_SI1145, mqtt_data, visible, infrared, uvindex /100, uvindex %100); #endif }