v5.11.1d - Add command State and fixes

5.11.1d
 * Add locale Decimal Separator to Web sensor page
 * Add
command State to retrieve device state information (same data as
teleperiod state and status 11 in slightly different JSON format)
 *
Extent state information with Light parameters
 * Fix IRSend parameter
translation (#1636)
 * Add optional login to Webserver AP mode (#1587,
#1635)
 * Fix BME680 teleperiod resistance measuring (#1647)
This commit is contained in:
arendst 2018-01-20 12:12:39 +01:00
parent 1538d30c96
commit c14234394a
21 changed files with 180 additions and 234 deletions

View File

@ -1,7 +1,7 @@
## Sonoff-Tasmota ## 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. 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.11.1c** - See [sonoff/_releasenotes.ino](https://github.com/arendst/Sonoff-Tasmota/blob/development/sonoff/_releasenotes.ino) for change information. Current version is **5.11.1d** - See [sonoff/_releasenotes.ino](https://github.com/arendst/Sonoff-Tasmota/blob/development/sonoff/_releasenotes.ino) for change information.
### ATTENTION All versions ### ATTENTION All versions

View File

@ -1,4 +1,12 @@
/* 5.11.1c /* 5.11.1d
* Add locale Decimal Separator to Web sensor page
* Add command State to retrieve device state information (same data as teleperiod state and status 11 in slightly different JSON format)
* Extent state information with Light parameters
* Fix IRSend parameter translation (#1636)
* Add optional login to Webserver AP mode (#1587, #1635)
* Fix BME680 teleperiod resistance measuring (#1647)
*
* 5.11.1c
* Make command color parameter input less strict to ease Hass support * Make command color parameter input less strict to ease Hass support
* Add ColorTemperature to light status message * Add ColorTemperature to light status message
* Change PubSubClient.h define MQTT_MAX_PACKET_SIZE from 512 to 1000 for Hass support * Change PubSubClient.h define MQTT_MAX_PACKET_SIZE from 512 to 1000 for Hass support

View File

@ -166,6 +166,7 @@
#define D_STATUS9_MARGIN "PTH" #define D_STATUS9_MARGIN "PTH"
#define D_STATUS10_SENSOR "SNS" #define D_STATUS10_SENSOR "SNS"
#define D_STATUS11_STATUS "STS" #define D_STATUS11_STATUS "STS"
#define D_CMND_STATE "State"
#define D_CMND_POWER "Power" #define D_CMND_POWER "Power"
#define D_CMND_POWERONSTATE "PowerOnState" #define D_CMND_POWERONSTATE "PowerOnState"
#define D_CMND_PULSETIME "PulseTime" #define D_CMND_PULSETIME "PulseTime"
@ -255,7 +256,18 @@
// Commands xdrv_02_irremote.ino // Commands xdrv_02_irremote.ino
#define D_CMND_IRSEND "IRSend" #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_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_03_energy.ino // Commands xdrv_03_energy.ino
#define D_CMND_POWERLOW "PowerLow" #define D_CMND_POWERLOW "PowerLow"

View File

@ -335,19 +335,6 @@
#define D_HUE_POST_ARGS "Hue POST args" #define D_HUE_POST_ARGS "Hue POST args"
#define D_3_RESPONSE_PACKETS_SENT "3 Antwortpakete gesendet" #define D_3_RESPONSE_PACKETS_SENT "3 Antwortpakete gesendet"
// xdrv_02_irremote.ino
#define D_JSON_INVALID_JSON "ungültiger JSON"
#define D_JSON_PROTOCOL_NOT_SUPPORTED "Protokoll nicht unterstützt"
#define D_JSON_IR_PROTOCOL "PROTOKOLL"
#define D_JSON_IR_BITS "BITS"
#define D_JSON_IR_DATA "DATEN"
#define D_JSON_IRHVAC_VENDOR "HERSTELLER"
#define D_JSON_IRHVAC_POWER "STROM"
#define D_JSON_IRHVAC_MODE "MODUS"
#define D_JSON_IRHVAC_FANSPEED "LÜFTERGESCHWINDIGKEIT"
#define D_JSON_IRHVAC_TEMP "TEMPERATUR"
#define D_JSON_IRRECEIVED "IR empfangen"
// xdrv_05_domoticz.ino // xdrv_05_domoticz.ino
#define D_DOMOTICZ_PARAMETERS "Domoticz parameters" #define D_DOMOTICZ_PARAMETERS "Domoticz parameters"
#define D_DOMOTICZ_IDX "Idx" #define D_DOMOTICZ_IDX "Idx"

View File

@ -335,19 +335,6 @@
#define D_HUE_POST_ARGS "Hue POST args" #define D_HUE_POST_ARGS "Hue POST args"
#define D_3_RESPONSE_PACKETS_SENT "3 response packets sent" #define D_3_RESPONSE_PACKETS_SENT "3 response packets sent"
// xdrv_02_irremote.ino
#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_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"
// xdrv_05_domoticz.ino // xdrv_05_domoticz.ino
#define D_DOMOTICZ_PARAMETERS "Domoticz parameters" #define D_DOMOTICZ_PARAMETERS "Domoticz parameters"
#define D_DOMOTICZ_IDX "Idx" #define D_DOMOTICZ_IDX "Idx"

View File

@ -335,19 +335,6 @@
#define D_HUE_POST_ARGS "Hue POST args" #define D_HUE_POST_ARGS "Hue POST args"
#define D_3_RESPONSE_PACKETS_SENT "3 paquetes de respuesta enviados" #define D_3_RESPONSE_PACKETS_SENT "3 paquetes de respuesta enviados"
// xdrv_02_irremote.ino
#define D_JSON_INVALID_JSON "JSON no válido"
#define D_JSON_PROTOCOL_NOT_SUPPORTED "Protocolo no soportado"
#define D_JSON_IR_PROTOCOL "PROTOCOLO"
#define D_JSON_IR_BITS "BITS"
#define D_JSON_IR_DATA "DATA"
#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"
// xdrv_05_domoticz.ino // xdrv_05_domoticz.ino
#define D_DOMOTICZ_PARAMETERS "Parámetros Domoticz" #define D_DOMOTICZ_PARAMETERS "Parámetros Domoticz"
#define D_DOMOTICZ_IDX "Idx" #define D_DOMOTICZ_IDX "Idx"

View File

@ -335,19 +335,6 @@
#define D_HUE_POST_ARGS "Hue POST args" #define D_HUE_POST_ARGS "Hue POST args"
#define D_3_RESPONSE_PACKETS_SENT "3 paquets response envoyés" #define D_3_RESPONSE_PACKETS_SENT "3 paquets response envoyés"
// xdrv_02_irremote.ino
#define D_JSON_INVALID_JSON "JSON Invalide"
#define D_JSON_PROTOCOL_NOT_SUPPORTED "Protocole non supporté"
#define D_JSON_IR_PROTOCOL "PROTOCOL"
#define D_JSON_IR_BITS "BITS"
#define D_JSON_IR_DATA "DATA"
#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"
// xdrv_05_domoticz.ino // xdrv_05_domoticz.ino
#define D_DOMOTICZ_PARAMETERS "Paramètres Domoticz" #define D_DOMOTICZ_PARAMETERS "Paramètres Domoticz"
#define D_DOMOTICZ_IDX "Idx" #define D_DOMOTICZ_IDX "Idx"

View File

@ -335,19 +335,6 @@
#define D_HUE_POST_ARGS "Hue POST argomenti" #define D_HUE_POST_ARGS "Hue POST argomenti"
#define D_3_RESPONSE_PACKETS_SENT "3 pacchetti di risposta inviati" #define D_3_RESPONSE_PACKETS_SENT "3 pacchetti di risposta inviati"
// xdrv_02_irremote.ino
#define D_JSON_INVALID_JSON "JSON non valido"
#define D_JSON_PROTOCOL_NOT_SUPPORTED "Protocollo non supportato"
#define D_JSON_IR_PROTOCOL "PROTOCOL"
#define D_JSON_IR_BITS "BITS"
#define D_JSON_IR_DATA "DATA"
#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"
// xdrv_05_domoticz.ino // xdrv_05_domoticz.ino
#define D_DOMOTICZ_PARAMETERS "Parametri Domoticz" #define D_DOMOTICZ_PARAMETERS "Parametri Domoticz"
#define D_DOMOTICZ_IDX "Idx" #define D_DOMOTICZ_IDX "Idx"

View File

@ -335,19 +335,6 @@
#define D_HUE_POST_ARGS "Hue POST argumenten" #define D_HUE_POST_ARGS "Hue POST argumenten"
#define D_3_RESPONSE_PACKETS_SENT "3 antwoord paketten verstuurd" #define D_3_RESPONSE_PACKETS_SENT "3 antwoord paketten verstuurd"
// xdrv_02_irremote.ino
#define D_JSON_INVALID_JSON "Ongeldig JSON"
#define D_JSON_PROTOCOL_NOT_SUPPORTED "Protocol wordt niet ondersteund"
#define D_JSON_IR_PROTOCOL "PROTOCOL"
#define D_JSON_IR_BITS "BITS"
#define D_JSON_IR_DATA "DATA"
#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"
// xdrv_05_domoticz.ino // xdrv_05_domoticz.ino
#define D_DOMOTICZ_PARAMETERS "Domoticz parameters" #define D_DOMOTICZ_PARAMETERS "Domoticz parameters"
#define D_DOMOTICZ_IDX "Idx" #define D_DOMOTICZ_IDX "Idx"

View File

@ -335,19 +335,6 @@
#define D_HUE_POST_ARGS "Hue POST args" #define D_HUE_POST_ARGS "Hue POST args"
#define D_3_RESPONSE_PACKETS_SENT "3 pakiety odpowiedzi wysylane" #define D_3_RESPONSE_PACKETS_SENT "3 pakiety odpowiedzi wysylane"
// xdrv_02_irremote.ino
#define D_JSON_INVALID_JSON "Invalid JSON"
#define D_JSON_PROTOCOL_NOT_SUPPORTED "Protokol nie jest obslugiwany"
#define D_JSON_IR_PROTOCOL "PROTOCOL"
#define D_JSON_IR_BITS "BITS"
#define D_JSON_IR_DATA "DATA"
#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"
// xdrv_05_domoticz.ino // xdrv_05_domoticz.ino
#define D_DOMOTICZ_PARAMETERS "Parametry Domoticz" #define D_DOMOTICZ_PARAMETERS "Parametry Domoticz"
#define D_DOMOTICZ_IDX "Idx" #define D_DOMOTICZ_IDX "Idx"

View File

@ -335,19 +335,6 @@
#define D_HUE_POST_ARGS "Hue POST 参数" #define D_HUE_POST_ARGS "Hue POST 参数"
#define D_3_RESPONSE_PACKETS_SENT "3 请求包发送" #define D_3_RESPONSE_PACKETS_SENT "3 请求包发送"
// xdrv_02_irremote.ino
#define D_JSON_INVALID_JSON "无效的JSON"
#define D_JSON_PROTOCOL_NOT_SUPPORTED "协议不支持"
#define D_JSON_IR_PROTOCOL "协议"
#define D_JSON_IR_BITS "BITS"
#define D_JSON_IR_DATA "数据"
#define D_JSON_IRHVAC_VENDOR "供应商"
#define D_JSON_IRHVAC_POWER "电源"
#define D_JSON_IRHVAC_MODE "模式"
#define D_JSON_IRHVAC_FANSPEED "风扇转速"
#define D_JSON_IRHVAC_TEMP "温度"
#define D_JSON_IRRECEIVED "IrReceived"
// xdrv_05_domoticz.ino // xdrv_05_domoticz.ino
#define D_DOMOTICZ_PARAMETERS "Domoticz 设置" #define D_DOMOTICZ_PARAMETERS "Domoticz 设置"
#define D_DOMOTICZ_IDX "Idx" #define D_DOMOTICZ_IDX "Idx"

View File

@ -145,4 +145,10 @@ enum XsnsFunctions {FUNC_INIT, FUNC_EVERY_50_MSECOND, FUNC_EVERY_SECOND, FUNC_PR
const uint8_t kDefaultRfCode[9] PROGMEM = { 0x21, 0x16, 0x01, 0x0E, 0x03, 0x48, 0x2E, 0x1A, 0x00 }; const uint8_t kDefaultRfCode[9] PROGMEM = { 0x21, 0x16, 0x01, 0x0E, 0x03, 0x48, 0x2E, 0x1A, 0x00 };
/*********************************************************************************************\
* Extern global variables
\*********************************************************************************************/
extern uint8_t light_device; // Light device number
#endif // _SONOFF_H_ #endif // _SONOFF_H_

View File

@ -25,7 +25,7 @@
- Select IDE Tools - Flash Size: "1M (no SPIFFS)" - Select IDE Tools - Flash Size: "1M (no SPIFFS)"
====================================================*/ ====================================================*/
#define VERSION 0x050B0103 // 5.11.1c #define VERSION 0x050B0104 // 5.11.1d
// Location specific includes // Location specific includes
#include "sonoff.h" // Enumaration used in user_config.h #include "sonoff.h" // Enumaration used in user_config.h
@ -67,7 +67,7 @@
#include "settings.h" #include "settings.h"
enum TasmotaCommands { enum TasmotaCommands {
CMND_BACKLOG, CMND_DELAY, CMND_POWER, CMND_STATUS, CMND_POWERONSTATE, CMND_PULSETIME, CMND_BACKLOG, CMND_DELAY, CMND_POWER, CMND_STATUS, CMND_STATE, CMND_POWERONSTATE, CMND_PULSETIME,
CMND_BLINKTIME, CMND_BLINKCOUNT, CMND_SAVEDATA, CMND_SETOPTION, CMND_TEMPERATURE_RESOLUTION, CMND_HUMIDITY_RESOLUTION, CMND_BLINKTIME, CMND_BLINKCOUNT, CMND_SAVEDATA, CMND_SETOPTION, CMND_TEMPERATURE_RESOLUTION, CMND_HUMIDITY_RESOLUTION,
CMND_PRESSURE_RESOLUTION, CMND_POWER_RESOLUTION, CMND_VOLTAGE_RESOLUTION, CMND_CURRENT_RESOLUTION, CMND_ENERGY_RESOLUTION, CMND_MODULE, CMND_MODULES, CMND_PRESSURE_RESOLUTION, CMND_POWER_RESOLUTION, CMND_VOLTAGE_RESOLUTION, CMND_CURRENT_RESOLUTION, CMND_ENERGY_RESOLUTION, CMND_MODULE, CMND_MODULES,
CMND_GPIO, CMND_GPIOS, CMND_PWM, CMND_PWMFREQUENCY, CMND_PWMRANGE, CMND_COUNTER, CMND_COUNTERTYPE, CMND_GPIO, CMND_GPIOS, CMND_PWM, CMND_PWMFREQUENCY, CMND_PWMRANGE, CMND_COUNTER, CMND_COUNTERTYPE,
@ -77,7 +77,7 @@ enum TasmotaCommands {
CMND_TELEPERIOD, CMND_RESTART, CMND_RESET, CMND_TIMEZONE, CMND_ALTITUDE, CMND_LEDPOWER, CMND_LEDSTATE, CMND_TELEPERIOD, CMND_RESTART, CMND_RESET, CMND_TIMEZONE, CMND_ALTITUDE, CMND_LEDPOWER, CMND_LEDSTATE,
CMND_CFGDUMP, CMND_I2CSCAN, CMND_INA219MODE, CMND_EXCEPTION }; CMND_CFGDUMP, CMND_I2CSCAN, CMND_INA219MODE, CMND_EXCEPTION };
const char kTasmotaCommands[] PROGMEM = const char kTasmotaCommands[] PROGMEM =
D_CMND_BACKLOG "|" D_CMND_DELAY "|" D_CMND_POWER "|" D_CMND_STATUS "|" D_CMND_POWERONSTATE "|" D_CMND_PULSETIME "|" D_CMND_BACKLOG "|" D_CMND_DELAY "|" D_CMND_POWER "|" D_CMND_STATUS "|" D_CMND_STATE "|" D_CMND_POWERONSTATE "|" D_CMND_PULSETIME "|"
D_CMND_BLINKTIME "|" D_CMND_BLINKCOUNT "|" D_CMND_SAVEDATA "|" D_CMND_SETOPTION "|" D_CMND_TEMPERATURE_RESOLUTION "|" D_CMND_HUMIDITY_RESOLUTION "|" D_CMND_BLINKTIME "|" D_CMND_BLINKCOUNT "|" D_CMND_SAVEDATA "|" D_CMND_SETOPTION "|" D_CMND_TEMPERATURE_RESOLUTION "|" D_CMND_HUMIDITY_RESOLUTION "|"
D_CMND_PRESSURE_RESOLUTION "|" D_CMND_POWER_RESOLUTION "|" D_CMND_VOLTAGE_RESOLUTION "|" D_CMND_CURRENT_RESOLUTION "|" D_CMND_ENERGY_RESOLUTION "|" D_CMND_MODULE "|" D_CMND_MODULES "|" D_CMND_PRESSURE_RESOLUTION "|" D_CMND_POWER_RESOLUTION "|" D_CMND_VOLTAGE_RESOLUTION "|" D_CMND_CURRENT_RESOLUTION "|" D_CMND_ENERGY_RESOLUTION "|" D_CMND_MODULE "|" D_CMND_MODULES "|"
D_CMND_GPIO "|" D_CMND_GPIOS "|" D_CMND_PWM "|" D_CMND_PWMFREQUENCY "|" D_CMND_PWMRANGE "|" D_CMND_COUNTER "|" D_CMND_COUNTERTYPE "|" D_CMND_GPIO "|" D_CMND_GPIOS "|" D_CMND_PWM "|" D_CMND_PWMFREQUENCY "|" D_CMND_PWMRANGE "|" D_CMND_COUNTER "|" D_CMND_COUNTERTYPE "|"
@ -194,13 +194,8 @@ char my_version[33]; // Composed version string
char my_hostname[33]; // Composed Wifi hostname char my_hostname[33]; // Composed Wifi hostname
char mqtt_client[33]; // Composed MQTT Clientname char mqtt_client[33]; // Composed MQTT Clientname
char serial_in_buffer[INPUT_BUFFER_SIZE + 2]; // Receive buffer char serial_in_buffer[INPUT_BUFFER_SIZE + 2]; // Receive buffer
//char mqtt_data[MESSZ + TOPSZ]; // MQTT publish buffer (MESSZ) and web page ajax buffer (MESSZ + TOPSZ)
char mqtt_data[MESSZ]; // MQTT publish buffer and web page ajax buffer char mqtt_data[MESSZ]; // MQTT publish buffer and web page ajax buffer
//char log_data[TOPSZ + MESSZ]; // Logging
char log_data[LOGSZ]; // Logging char log_data[LOGSZ]; // Logging
String web_log[MAX_LOG_LINES]; // Web log buffer String web_log[MAX_LOG_LINES]; // Web log buffer
String backlog[MAX_BACKLOG]; // Command backlog String backlog[MAX_BACKLOG]; // Command backlog
@ -317,7 +312,7 @@ void SetDevicePower(power_t rpower)
} }
} }
XdrvSetPower(bitRead(rpower, devices_present -1)); XdrvSetPower(rpower);
if ((SONOFF_DUAL == Settings.module) || (CH4 == Settings.module)) { if ((SONOFF_DUAL == Settings.module) || (CH4 == Settings.module)) {
Serial.write(0xA0); Serial.write(0xA0);
@ -938,6 +933,10 @@ void MqttDataCallback(char* topic, byte* data, unsigned int data_len)
fallback_topic_flag = 0; fallback_topic_flag = 0;
return; return;
} }
else if (CMND_STATE == command_code) {
mqtt_data[0] = '\0';
MqttShowState();
}
else if ((CMND_POWERONSTATE == command_code) && (Settings.module != MOTOR)) { else if ((CMND_POWERONSTATE == command_code) && (Settings.module != MOTOR)) {
/* 0 = Keep relays off after power on /* 0 = Keep relays off after power on
* 1 = Turn relays on after power on, if PulseTime set wait for PulseTime seconds, and turn relays off * 1 = Turn relays on after power on, if PulseTime set wait for PulseTime seconds, and turn relays off
@ -1796,9 +1795,15 @@ void MqttShowState()
dtostrfd((double)ESP.getVcc()/1000, 3, stemp1); dtostrfd((double)ESP.getVcc()/1000, 3, stemp1);
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("%s,\"" D_JSON_VCC "\":%s"), mqtt_data, stemp1); snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("%s,\"" D_JSON_VCC "\":%s"), mqtt_data, stemp1);
#endif #endif
for (byte i = 0; i < devices_present; i++) { for (byte i = 0; i < devices_present; i++) {
if (i == light_device -1) {
LightState(1);
} else {
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("%s,\"%s\":\"%s\""), mqtt_data, GetPowerDevice(stemp1, i +1, sizeof(stemp1)), GetStateText(bitRead(power, i))); snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("%s,\"%s\":\"%s\""), mqtt_data, GetPowerDevice(stemp1, i +1, sizeof(stemp1)), GetStateText(bitRead(power, i)));
} }
}
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("%s,\"" D_JSON_WIFI "\":{\"" D_JSON_AP "\":%d,\"" D_JSON_SSID "\":\"%s\",\"" D_JSON_RSSI "\":%d,\"" D_JSON_APMAC_ADDRESS "\":\"%s\"}}"), snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("%s,\"" D_JSON_WIFI "\":{\"" D_JSON_AP "\":%d,\"" D_JSON_SSID "\":\"%s\",\"" D_JSON_RSSI "\":%d,\"" D_JSON_APMAC_ADDRESS "\":\"%s\"}}"),
mqtt_data, Settings.sta_active +1, Settings.sta_ssid[Settings.sta_active], WifiGetRssiAsQuality(WiFi.RSSI()), WiFi.BSSIDstr().c_str()); mqtt_data, Settings.sta_active +1, Settings.sta_ssid[Settings.sta_active], WifiGetRssiAsQuality(WiFi.RSSI()), WiFi.BSSIDstr().c_str());
} }

View File

@ -148,83 +148,9 @@ Decoding 14 results
* General * General
\*********************************************************************************************/ \*********************************************************************************************/
char* _dtostrf(double number, unsigned char prec, char *s, bool i18n) char* dtostrfd(double number, unsigned char prec, char *s)
{ {
bool negative = false; return dtostrf(number, 1, prec, s);
if (isnan(number)) {
strcpy_P(s, PSTR("nan"));
return s;
}
if (isinf(number)) {
strcpy_P(s, PSTR("inf"));
return s;
}
char decimal = '.';
if (i18n) {
decimal = D_DECIMAL_SEPARATOR[0];
}
char* out = s;
// Handle negative numbers
if (number < 0.0) {
negative = true;
number = -number;
}
// Round correctly so that print(1.999, 2) prints as "2.00"
// I optimized out most of the divisions
double rounding = 2.0;
for (uint8_t i = 0; i < prec; ++i) {
rounding *= 10.0;
}
rounding = 1.0 / rounding;
number += rounding;
// Figure out how big our number really is
double tenpow = 1.0;
int digitcount = 1;
while (number >= 10.0 * tenpow) {
tenpow *= 10.0;
digitcount++;
}
number /= tenpow;
// Handle negative sign
if (negative) {
*out++ = '-';
}
// Print the digits, and if necessary, the decimal point
digitcount += prec;
int8_t digit = 0;
while (digitcount-- > 0) {
digit = (int8_t)number;
if (digit > 9) {
digit = 9; // insurance
}
*out++ = (char)('0' | digit);
if ((digitcount == prec) && (prec > 0)) {
*out++ = decimal;
}
number -= digit;
number *= 10.0;
}
// make sure the string is terminated
*out = 0;
return s;
}
char* dtostrfd(double number, unsigned char prec, char *s) // Always decimal dot
{
return _dtostrf(number, prec, s, 0);
}
char* dtostrfi(double number, unsigned char prec, char *s) // Use localized decimal dot
{
return _dtostrf(number, prec, s, 1);
} }
boolean ParseIp(uint32_t* addr, const char* str) boolean ParseIp(uint32_t* addr, const char* str)

View File

@ -96,7 +96,11 @@ const char HTTP_HEAD[] PROGMEM =
#ifdef BE_MINIMAL #ifdef BE_MINIMAL
"<div style='text-align:center;color:red;'><h3>" D_MINIMAL_FIRMWARE_PLEASE_UPGRADE "</h3></div>" "<div style='text-align:center;color:red;'><h3>" D_MINIMAL_FIRMWARE_PLEASE_UPGRADE "</h3></div>"
#endif #endif
#if MY_LANGUAGE == es-AR
"<div style='text-align:center;'><h3>" D_MODULE " {ha</h3><h2>{h}</h2></div>";
#else
"<div style='text-align:center;'><h3>{ha " D_MODULE "</h3><h2>{h}</h2></div>"; "<div style='text-align:center;'><h3>{ha " D_MODULE "</h3><h2>{h}</h2></div>";
#endif
const char HTTP_SCRIPT_CONSOL[] PROGMEM = const char HTTP_SCRIPT_CONSOL[] PROGMEM =
"var sn=0;" // Scroll position "var sn=0;" // Scroll position
"var id=99;" // Get most of weblog initially "var id=99;" // Get most of weblog initially
@ -190,6 +194,12 @@ const char HTTP_BTN_MENU4[] PROGMEM =
"<br/><form action='rs' method='get'><button>" D_RESTORE_CONFIGURATION "</button></form>"; "<br/><form action='rs' method='get'><button>" D_RESTORE_CONFIGURATION "</button></form>";
const char HTTP_BTN_MAIN[] PROGMEM = const char HTTP_BTN_MAIN[] PROGMEM =
"<br/><br/><form action='.' method='get'><button>" D_MAIN_MENU "</button></form>"; "<br/><br/><form action='.' method='get'><button>" D_MAIN_MENU "</button></form>";
const char HTTP_FORM_LOGIN[] PROGMEM =
"<form method='post' action='/'>"
"<br/><b>" D_USER "</b><br/><input name='USER1' placeholder='" D_USER "'><br/>"
"<br/><b>" D_PASSWORD "</b><br/><input name='PASS1' type='password' placeholder='" D_PASSWORD "'><br/>"
"<br/>"
"<br/><button>" D_OK "</button></form>";
const char HTTP_BTN_CONF[] PROGMEM = const char HTTP_BTN_CONF[] PROGMEM =
"<br/><br/><form action='cn' method='get'><button>" D_CONFIGURATION "</button></form>"; "<br/><br/><form action='cn' method='get'><button>" D_CONFIGURATION "</button></form>";
const char HTTP_FORM_MODULE[] PROGMEM = const char HTTP_FORM_MODULE[] PROGMEM =
@ -204,9 +214,9 @@ const char HTTP_FORM_WIFI[] PROGMEM =
"<fieldset><legend><b>&nbsp;" D_WIFI_PARAMETERS "&nbsp;</b></legend><form method='get' action='sv'>" "<fieldset><legend><b>&nbsp;" D_WIFI_PARAMETERS "&nbsp;</b></legend><form method='get' action='sv'>"
"<input id='w' name='w' value='1' hidden><input id='r' name='r' value='1' hidden>" "<input id='w' name='w' value='1' hidden><input id='r' name='r' value='1' hidden>"
"<br/><b>" D_AP1_SSID "</b> (" STA_SSID1 ")<br/><input id='s1' name='s1' placeholder='" STA_SSID1 "' value='{s1'><br/>" "<br/><b>" D_AP1_SSID "</b> (" STA_SSID1 ")<br/><input id='s1' name='s1' placeholder='" STA_SSID1 "' value='{s1'><br/>"
"<br/><b>" D_AP1_PASSWORD "</b><br/><input id='p1' name='p1' type='password' placeholder='" STA_PASS1 "' value='{p1'><br/>" "<br/><b>" D_AP1_PASSWORD "</b><br/><input id='p1' name='p1' type='password' placeholder='" D_AP1_PASSWORD "' value='********'><br/>"
"<br/><b>" D_AP2_SSID "</b> (" STA_SSID2 ")<br/><input id='s2' name='s2' placeholder='" STA_SSID2 "' value='{s2'><br/>" "<br/><b>" D_AP2_SSID "</b> (" STA_SSID2 ")<br/><input id='s2' name='s2' placeholder='" STA_SSID2 "' value='{s2'><br/>"
"<br/><b>" D_AP2_PASSWORD "</b><br/><input id='p2' name='p2' type='password' placeholder='" STA_PASS2 "' value='{p2'><br/>" "<br/><b>" D_AP2_PASSWORD "</b><br/><input id='p2' name='p2' type='password' placeholder='" D_AP2_PASSWORD "' value='********'><br/>"
"<br/><b>" D_HOSTNAME "</b> (" WIFI_HOSTNAME ")<br/><input id='h' name='h' placeholder='" WIFI_HOSTNAME" ' value='{h1'><br/>"; "<br/><b>" D_HOSTNAME "</b> (" WIFI_HOSTNAME ")<br/><input id='h' name='h' placeholder='" WIFI_HOSTNAME" ' value='{h1'><br/>";
const char HTTP_FORM_MQTT[] PROGMEM = const char HTTP_FORM_MQTT[] PROGMEM =
"<fieldset><legend><b>&nbsp;" D_MQTT_PARAMETERS "&nbsp;</b></legend><form method='get' action='sv'>" "<fieldset><legend><b>&nbsp;" D_MQTT_PARAMETERS "&nbsp;</b></legend><form method='get' action='sv'>"
@ -236,7 +246,7 @@ const char HTTP_FORM_LOG3[] PROGMEM =
const char HTTP_FORM_OTHER[] PROGMEM = const char HTTP_FORM_OTHER[] PROGMEM =
"<fieldset><legend><b>&nbsp;" D_OTHER_PARAMETERS "&nbsp;</b></legend><form method='get' action='sv'>" "<fieldset><legend><b>&nbsp;" D_OTHER_PARAMETERS "&nbsp;</b></legend><form method='get' action='sv'>"
"<input id='w' name='w' value='5' hidden><input id='r' name='r' value='1' hidden>" "<input id='w' name='w' value='5' hidden><input id='r' name='r' value='1' hidden>"
"<br/><b>" D_WEB_ADMIN_PASSWORD "</b><br/><input id='p1' name='p1' type='password' placeholder='" WEB_PASSWORD "' value='{p1'><br/>" "<br/><b>" D_WEB_ADMIN_PASSWORD "</b><br/><input id='p1' name='p1' type='password' placeholder='" D_WEB_ADMIN_PASSWORD "' value='********'><br/>"
"<br/><input style='width:10%;' id='b1' name='b1' type='checkbox'{r1><b>" D_MQTT_ENABLE "</b><br/>"; "<br/><input style='width:10%;' id='b1' name='b1' type='checkbox'{r1><b>" D_MQTT_ENABLE "</b><br/>";
const char HTTP_FORM_OTHER2[] PROGMEM = const char HTTP_FORM_OTHER2[] PROGMEM =
"<br/><b>" D_FRIENDLY_NAME " {1</b> ({2)<br/><input id='a{1' name='a{1' placeholder='{2' value='{3'><br/>"; "<br/><b>" D_FRIENDLY_NAME " {1</b> ({2)<br/><input id='a{1' name='a{1' placeholder='{2' value='{3'><br/>";
@ -244,8 +254,8 @@ const char HTTP_FORM_OTHER[] PROGMEM =
const char HTTP_FORM_OTHER3a[] PROGMEM = const char HTTP_FORM_OTHER3a[] PROGMEM =
"<br/><fieldset><legend><b>&nbsp;" D_EMULATION "&nbsp;</b></legend>"; "<br/><fieldset><legend><b>&nbsp;" D_EMULATION "&nbsp;</b></legend>";
const char HTTP_FORM_OTHER3b[] PROGMEM = const char HTTP_FORM_OTHER3b[] PROGMEM =
"<br/><input style='width:10%;' id='b2' name='b2' type='radio' value='{1'{2><b>{3</b>{4"; "<br/><input style='width:10%;' id='r{1' name='b2' type='radio' value='{1'{2><b>{3</b>{4"; // Different id only used for labels
#endif // USE_EMULATION #endif // USE_EMULATION
const char HTTP_FORM_END[] PROGMEM = const char HTTP_FORM_END[] PROGMEM =
"<br/><button type='submit'>" D_SAVE "</button></form></fieldset>"; "<br/><button type='submit'>" D_SAVE "</button></form></fieldset>";
const char HTTP_FORM_RST[] PROGMEM = const char HTTP_FORM_RST[] PROGMEM =
@ -412,11 +422,17 @@ void SetHeader()
#endif #endif
} }
void ShowPage(String &page) void ShowPage(String &page, bool auth = true)
{ {
if((HTTP_ADMIN == webserver_state) && (Settings.web_password[0] != 0) && !WebServer->authenticate(WEB_USERNAME, Settings.web_password)) { // if((HTTP_ADMIN == webserver_state) && (Settings.web_password[0] != 0) && !WebServer->authenticate(WEB_USERNAME, Settings.web_password)) {
// return WebServer->requestAuthentication();
// }
//Authentication
if (auth && (Settings.web_password[0] != 0) && !WebServer->authenticate(WEB_USERNAME, Settings.web_password)) {
return WebServer->requestAuthentication(); return WebServer->requestAuthentication();
} }
page.replace(F("{ha"), my_module.name); page.replace(F("{ha"), my_module.name);
page.replace(F("{h}"), Settings.friendlyname[0]); page.replace(F("{h}"), Settings.friendlyname[0]);
if (HTTP_MANAGER == webserver_state) { if (HTTP_MANAGER == webserver_state) {
@ -429,11 +445,20 @@ void ShowPage(String &page)
page.replace(F("{mv"), my_version); page.replace(F("{mv"), my_version);
SetHeader(); SetHeader();
WebServer->send(200, FPSTR(HDR_CTYPE_HTML), page); WebServer->send(200, FPSTR(HDR_CTYPE_HTML), page);
// WebServer->sendContent("");
}
//Authentication
void HandleWifiLogin()
{
String page = FPSTR(HTTP_HEAD);
page.replace(F("{v}"), FPSTR( D_CONFIGURE_WIFI ));
page += FPSTR(HTTP_FORM_LOGIN);
ShowPage(page, false); // false means show page no matter if the client has or has not credentials
} }
void HandleRoot() void HandleRoot()
{ {
// AddLog_P(LOG_LEVEL_DEBUG, PSTR(D_LOG_HTTP D_MAIN_MENU));
AddLog_P(LOG_LEVEL_DEBUG, S_LOG_HTTP, S_MAIN_MENU); AddLog_P(LOG_LEVEL_DEBUG, S_LOG_HTTP, S_MAIN_MENU);
if (CaptivePortal()) { // If captive portal redirect instead of displaying the page. if (CaptivePortal()) { // If captive portal redirect instead of displaying the page.
@ -441,7 +466,20 @@ void HandleRoot()
} }
if (HTTP_MANAGER == webserver_state) { if (HTTP_MANAGER == webserver_state) {
// HandleWifiConfiguration();
//Authentication
if ((Settings.web_password[0] != 0) && !(WebServer->hasArg("USER1")) && !(WebServer->hasArg("PASS1"))) {
HandleWifiLogin();
} else {
if (!(Settings.web_password[0] != 0) || ((WebServer->arg("USER1") == WEB_USERNAME ) && (WebServer->arg("PASS1") == Settings.web_password ))) {
HandleWifiConfiguration(); HandleWifiConfiguration();
} else {
// wrong user and pass
HandleWifiLogin();
}
}
} else { } else {
char stemp[10]; char stemp[10];
char line[160]; char line[160];
@ -520,6 +558,7 @@ void HandleAjaxStatusRefresh()
if (strlen(mqtt_data)) { if (strlen(mqtt_data)) {
page += FPSTR(HTTP_TABLE100); page += FPSTR(HTTP_TABLE100);
page += mqtt_data; page += mqtt_data;
page.replace(F("."), F(D_DECIMAL_SEPARATOR));
page += F("</table>"); page += F("</table>");
} }
char line[80]; char line[80];
@ -529,7 +568,6 @@ void HandleAjaxStatusRefresh()
uint8_t fsize = (devices_present < 5) ? 70 - (devices_present * 8) : 32; uint8_t fsize = (devices_present < 5) ? 70 - (devices_present * 8) : 32;
for (byte idx = 1; idx <= devices_present; idx++) { for (byte idx = 1; idx <= devices_present; idx++) {
snprintf_P(svalue, sizeof(svalue), PSTR("%d"), bitRead(power, idx -1)); snprintf_P(svalue, sizeof(svalue), PSTR("%d"), bitRead(power, idx -1));
// snprintf_P(line, sizeof(line), PSTR("<td style='width:%d%'><div style='text-align:center;font-weight:%s;font-size:%dpx'>%s</div></td>"),
snprintf_P(line, sizeof(line), PSTR("<td style='width:%d{t}%s;font-size:%dpx'>%s</div></td>"), // {t} = %'><div style='text-align:center;font-weight: snprintf_P(line, sizeof(line), PSTR("<td style='width:%d{t}%s;font-size:%dpx'>%s</div></td>"), // {t} = %'><div style='text-align:center;font-weight:
100 / devices_present, (bitRead(power, idx -1)) ? "bold" : "normal", fsize, (devices_present < 5) ? GetStateText(bitRead(power, idx -1)) : svalue); 100 / devices_present, (bitRead(power, idx -1)) ? "bold" : "normal", fsize, (devices_present < 5) ? GetStateText(bitRead(power, idx -1)) : svalue);
page += line; page += line;
@ -545,6 +583,7 @@ void HandleAjaxStatusRefresh()
} }
*/ */
WebServer->send(200, FPSTR(HDR_CTYPE_HTML), page); WebServer->send(200, FPSTR(HDR_CTYPE_HTML), page);
// WebServer->sendContent("");
} }
boolean HttpUser() boolean HttpUser()
@ -790,16 +829,15 @@ void HandleWifi(boolean scan)
page += FPSTR(HTTP_FORM_WIFI); page += FPSTR(HTTP_FORM_WIFI);
page.replace(F("{h1"), Settings.hostname); page.replace(F("{h1"), Settings.hostname);
page.replace(F("{s1"), Settings.sta_ssid[0]); page.replace(F("{s1"), Settings.sta_ssid[0]);
page.replace(F("{p1"), Settings.sta_pwd[0]);
page.replace(F("{s2"), Settings.sta_ssid[1]); page.replace(F("{s2"), Settings.sta_ssid[1]);
page.replace(F("{p2"), Settings.sta_pwd[1]);
page += FPSTR(HTTP_FORM_END); page += FPSTR(HTTP_FORM_END);
if (HTTP_MANAGER == webserver_state) { if (HTTP_MANAGER == webserver_state) {
page += FPSTR(HTTP_BTN_RSTRT); page += FPSTR(HTTP_BTN_RSTRT);
} else { } else {
page += FPSTR(HTTP_BTN_CONF); page += FPSTR(HTTP_BTN_CONF);
} }
ShowPage(page); // ShowPage(page);
ShowPage(page, !(HTTP_MANAGER == webserver_state));
} }
void HandleMqttConfiguration() void HandleMqttConfiguration()
@ -886,7 +924,6 @@ void HandleOtherConfiguration()
String page = FPSTR(HTTP_HEAD); String page = FPSTR(HTTP_HEAD);
page.replace(F("{v}"), FPSTR(S_CONFIGURE_OTHER)); page.replace(F("{v}"), FPSTR(S_CONFIGURE_OTHER));
page += FPSTR(HTTP_FORM_OTHER); page += FPSTR(HTTP_FORM_OTHER);
page.replace(F("{p1"), Settings.web_password);
page.replace(F("{r1"), (Settings.flag.mqtt_enabled) ? F(" checked") : F("")); page.replace(F("{r1"), (Settings.flag.mqtt_enabled) ? F(" checked") : F(""));
uint8_t maxfn = (devices_present > MAX_FRIENDLYNAMES) ? MAX_FRIENDLYNAMES : devices_present; uint8_t maxfn = (devices_present > MAX_FRIENDLYNAMES) ? MAX_FRIENDLYNAMES : devices_present;
for (byte i = 0; i < maxfn; i++) { for (byte i = 0; i < maxfn; i++) {
@ -905,7 +942,7 @@ void HandleOtherConfiguration()
page.replace(F("{3"), (i == EMUL_NONE) ? F(D_NONE) : (i == EMUL_WEMO) ? F(D_BELKIN_WEMO) : F(D_HUE_BRIDGE)); page.replace(F("{3"), (i == EMUL_NONE) ? F(D_NONE) : (i == EMUL_WEMO) ? F(D_BELKIN_WEMO) : F(D_HUE_BRIDGE));
page.replace(F("{4"), (i == EMUL_NONE) ? F("") : (i == EMUL_WEMO) ? F(" " D_SINGLE_DEVICE) : F(" " D_MULTI_DEVICE)); page.replace(F("{4"), (i == EMUL_NONE) ? F("") : (i == EMUL_WEMO) ? F(" " D_SINGLE_DEVICE) : F(" " D_MULTI_DEVICE));
} }
// page += F("<br/>"); page += F("<br/>");
page += F("<br/></fieldset>"); page += F("<br/></fieldset>");
#endif // USE_EMULATION #endif // USE_EMULATION
page += FPSTR(HTTP_FORM_END); page += FPSTR(HTTP_FORM_END);
@ -964,9 +1001,11 @@ void HandleSaveSettings()
strlcpy(Settings.hostname, WIFI_HOSTNAME, sizeof(Settings.hostname)); strlcpy(Settings.hostname, WIFI_HOSTNAME, sizeof(Settings.hostname));
} }
strlcpy(Settings.sta_ssid[0], (!strlen(WebServer->arg("s1").c_str())) ? STA_SSID1 : WebServer->arg("s1").c_str(), sizeof(Settings.sta_ssid[0])); strlcpy(Settings.sta_ssid[0], (!strlen(WebServer->arg("s1").c_str())) ? STA_SSID1 : WebServer->arg("s1").c_str(), sizeof(Settings.sta_ssid[0]));
strlcpy(Settings.sta_pwd[0], (!strlen(WebServer->arg("p1").c_str())) ? STA_PASS1 : WebServer->arg("p1").c_str(), sizeof(Settings.sta_pwd[0]));
strlcpy(Settings.sta_ssid[1], (!strlen(WebServer->arg("s2").c_str())) ? STA_SSID2 : WebServer->arg("s2").c_str(), sizeof(Settings.sta_ssid[1])); strlcpy(Settings.sta_ssid[1], (!strlen(WebServer->arg("s2").c_str())) ? STA_SSID2 : WebServer->arg("s2").c_str(), sizeof(Settings.sta_ssid[1]));
strlcpy(Settings.sta_pwd[1], (!strlen(WebServer->arg("p2").c_str())) ? STA_PASS2 : WebServer->arg("p2").c_str(), sizeof(Settings.sta_pwd[1])); // strlcpy(Settings.sta_ssid[0], (!strlen(WebServer->arg("s1").c_str())) ? "" : WebServer->arg("s1").c_str(), sizeof(Settings.sta_ssid[0]));
// strlcpy(Settings.sta_ssid[1], (!strlen(WebServer->arg("s2").c_str())) ? "" : WebServer->arg("s2").c_str(), sizeof(Settings.sta_ssid[1]));
strlcpy(Settings.sta_pwd[0], (!strlen(WebServer->arg("p1").c_str())) ? "" : (strchr(WebServer->arg("p1").c_str(),'*')) ? Settings.sta_pwd[0] : WebServer->arg("p1").c_str(), sizeof(Settings.sta_pwd[0]));
strlcpy(Settings.sta_pwd[1], (!strlen(WebServer->arg("p2").c_str())) ? "" : (strchr(WebServer->arg("p2").c_str(),'*')) ? Settings.sta_pwd[1] : WebServer->arg("p2").c_str(), sizeof(Settings.sta_pwd[1]));
snprintf_P(log_data, sizeof(log_data), PSTR(D_LOG_WIFI D_CMND_HOSTNAME " %s, " D_CMND_SSID "1 %s, " D_CMND_PASSWORD "1 %s, " D_CMND_SSID "2 %s, " D_CMND_PASSWORD "2 %s"), snprintf_P(log_data, sizeof(log_data), PSTR(D_LOG_WIFI D_CMND_HOSTNAME " %s, " D_CMND_SSID "1 %s, " D_CMND_PASSWORD "1 %s, " D_CMND_SSID "2 %s, " D_CMND_PASSWORD "2 %s"),
Settings.hostname, Settings.sta_ssid[0], Settings.sta_pwd[0], Settings.sta_ssid[1], Settings.sta_pwd[1]); Settings.hostname, Settings.sta_ssid[0], Settings.sta_pwd[0], Settings.sta_ssid[1], Settings.sta_pwd[1]);
AddLog(LOG_LEVEL_INFO); AddLog(LOG_LEVEL_INFO);
@ -1014,7 +1053,7 @@ snprintf_P(log_data, sizeof(log_data), PSTR(D_LOG_LOG D_CMND_SERIALLOG " %d, " D
break; break;
#endif // USE_DOMOTICZ #endif // USE_DOMOTICZ
case 5: case 5:
strlcpy(Settings.web_password, (!strlen(WebServer->arg("p1").c_str())) ? WEB_PASSWORD : (!strcmp(WebServer->arg("p1").c_str(),"0")) ? "" : WebServer->arg("p1").c_str(), sizeof(Settings.web_password)); strlcpy(Settings.web_password, (!strlen(WebServer->arg("p1").c_str())) ? "" : (strchr(WebServer->arg("p1").c_str(),'*')) ? Settings.web_password : WebServer->arg("p1").c_str(), sizeof(Settings.web_password));
Settings.flag.mqtt_enabled = WebServer->hasArg("b1"); Settings.flag.mqtt_enabled = WebServer->hasArg("b1");
#ifdef USE_EMULATION #ifdef USE_EMULATION
Settings.flag2.emulation = (!strlen(WebServer->arg("b2").c_str())) ? 0 : atoi(WebServer->arg("b2").c_str()); Settings.flag2.emulation = (!strlen(WebServer->arg("b2").c_str())) ? 0 : atoi(WebServer->arg("b2").c_str());
@ -1376,6 +1415,7 @@ void HandleHttpCommand()
} }
SetHeader(); SetHeader();
WebServer->send(200, FPSTR(HDR_CTYPE_JSON), message); WebServer->send(200, FPSTR(HDR_CTYPE_JSON), message);
// WebServer->sendContent("");
} }
void HandleConsole() void HandleConsole()
@ -1454,6 +1494,7 @@ void HandleAjaxConsoleRefresh()
} }
message += F("</l></r>"); message += F("</l></r>");
WebServer->send(200, FPSTR(HDR_CTYPE_XML), message); WebServer->send(200, FPSTR(HDR_CTYPE_XML), message);
// WebServer->sendContent("");
} }
void HandleInformation() void HandleInformation()

View File

@ -99,6 +99,7 @@ uint8_t light_signal_color[5];
uint8_t light_wheel = 0; uint8_t light_wheel = 0;
uint8_t light_subtype = 0; uint8_t light_subtype = 0;
uint8_t light_device = 0;
uint8_t light_power = 0; uint8_t light_power = 0;
uint8_t light_update = 1; uint8_t light_update = 1;
uint8_t light_wakeup_active = 0; uint8_t light_wakeup_active = 0;
@ -337,6 +338,7 @@ void LightInit()
{ {
uint8_t max_scheme = LS_MAX -1; uint8_t max_scheme = LS_MAX -1;
light_device = devices_present;
light_subtype = light_type &7; light_subtype = light_type &7;
if (light_type < LT_PWM6) { // PWM if (light_type < LT_PWM6) { // PWM
@ -526,35 +528,56 @@ char* LightGetColor(uint8_t type, char* scolor)
void LightPowerOn() void LightPowerOn()
{ {
if (Settings.light_dimmer && !(light_power)) { if (Settings.light_dimmer && !(light_power)) {
ExecuteCommandPower(devices_present, 1); ExecuteCommandPower(light_device, 1);
} }
} }
void LightPreparePower() void LightState(uint8_t append)
{ {
char scolor[25]; char scolor[25];
char scommand[33]; char scommand[33];
if (Settings.light_dimmer && !(light_power)) { if (append) {
ExecuteCommandPower(devices_present, 7); // No publishPowerState snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("%s,"), mqtt_data);
} else {
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("{"));
} }
else if (!Settings.light_dimmer && light_power) { GetPowerDevice(scommand, light_device, sizeof(scommand));
ExecuteCommandPower(devices_present, 6); // No publishPowerState snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("%s\"%s\":\"%s\",\"" D_CMND_DIMMER "\":%d"),
} mqtt_data, scommand, GetStateText(light_power), Settings.light_dimmer);
#ifdef USE_DOMOTICZ
DomoticzUpdatePowerState(devices_present);
#endif // USE_DOMOTICZ
GetPowerDevice(scommand, devices_present, sizeof(scommand));
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("{\"%s\":\"%s\",\"" D_CMND_DIMMER "\":%d"),
scommand, GetStateText(light_power), Settings.light_dimmer);
if (light_subtype > LST_SINGLE) { if (light_subtype > LST_SINGLE) {
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("%s,\"" D_CMND_COLOR "\":\"%s\""), mqtt_data, LightGetColor(0, scolor)); snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("%s,\"" D_CMND_COLOR "\":\"%s\""), mqtt_data, LightGetColor(0, scolor));
} }
if ((LST_COLDWARM == light_subtype) || (LST_RGBWC == light_subtype)) { if ((LST_COLDWARM == light_subtype) || (LST_RGBWC == light_subtype)) {
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("%s,\"" D_CMND_COLORTEMPERATURE "\":%d"), mqtt_data, LightGetColorTemp()); snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("%s,\"" D_CMND_COLORTEMPERATURE "\":%d"), mqtt_data, LightGetColorTemp());
} }
if (append) {
if (light_subtype >= LST_RGB) {
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("%s,\"" D_CMND_SCHEME "\":%d"), mqtt_data, Settings.light_scheme);
}
if (LT_WS2812 == light_type) {
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("%s,\"" D_CMND_WIDTH "\":%d"), mqtt_data, Settings.light_width);
}
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("%s,\"" D_CMND_FADE "\":\"%s\",\"" D_CMND_SPEED "\":%d,\"" D_CMND_LEDTABLE "\":\"%s\""),
mqtt_data, GetStateText(Settings.light_fade), Settings.light_speed, GetStateText(Settings.light_correction));
} else {
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("%s}"), mqtt_data); snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("%s}"), mqtt_data);
}
}
void LightPreparePower()
{
if (Settings.light_dimmer && !(light_power)) {
ExecuteCommandPower(light_device, 7); // No publishPowerState
}
else if (!Settings.light_dimmer && light_power) {
ExecuteCommandPower(light_device, 6); // No publishPowerState
}
#ifdef USE_DOMOTICZ
DomoticzUpdatePowerState(light_device);
#endif // USE_DOMOTICZ
LightState(0);
} }
void LightFade() void LightFade()
@ -638,7 +661,8 @@ void LightRandomColor()
void LightSetPower() void LightSetPower()
{ {
light_power = XdrvMailbox.index; // light_power = XdrvMailbox.index;
light_power = bitRead(XdrvMailbox.index, light_device -1);
if (light_wakeup_active) { if (light_wakeup_active) {
light_wakeup_active--; light_wakeup_active--;
} }

View File

@ -309,21 +309,26 @@ boolean IrSendCommand()
data = ir_json[D_JSON_IR_DATA]; data = ir_json[D_JSON_IR_DATA];
if (protocol && bits && data) { if (protocol && bits && data) {
int protocol_code = GetCommandCode(protocol_text, sizeof(protocol_text), protocol, kIrRemoteProtocols); int protocol_code = GetCommandCode(protocol_text, sizeof(protocol_text), protocol, kIrRemoteProtocols);
snprintf_P(log_data, sizeof(log_data), PSTR("IRS: protocol_text %s, protocol %s, bits %d, data %d, protocol_code %d"),
protocol_text, protocol, bits, data, protocol_code);
AddLog(LOG_LEVEL_DEBUG);
switch (protocol_code) { switch (protocol_code) {
case NEC: case NEC:
irsend->sendNEC(data, bits); break; irsend->sendNEC(data, (bits > NEC_BITS) ? NEC_BITS : bits); break;
case SONY: case SONY:
irsend->sendSony(data, bits); break; irsend->sendSony(data, (bits > SONY_20_BITS) ? SONY_20_BITS : bits, 2); break;
case RC5: case RC5:
irsend->sendRC5(data, bits); break; irsend->sendRC5(data, bits); break;
case RC6: case RC6:
irsend->sendRC6(data, bits); break; irsend->sendRC6(data, bits); break;
case DISH: case DISH:
irsend->sendDISH(data, bits); break; irsend->sendDISH(data, (bits > DISH_BITS) ? DISH_BITS : bits); break;
case JVC: case JVC:
irsend->sendJVC(data, bits, 1); break; irsend->sendJVC(data, (bits > JVC_BITS) ? JVC_BITS : bits, 1); break;
case SAMSUNG: case SAMSUNG:
irsend->sendSAMSUNG(data, bits); break; irsend->sendSAMSUNG(data, (bits > SAMSUNG_BITS) ? SAMSUNG_BITS : bits); break;
case PANASONIC: case PANASONIC:
irsend->sendPanasonic(bits, data); break; irsend->sendPanasonic(bits, data); break;
default: default:

View File

@ -82,7 +82,7 @@ boolean XdrvCommand(char *type, uint16_t index, char *dataBuf, uint16_t data_len
return XdrvCall(FUNC_COMMAND); return XdrvCall(FUNC_COMMAND);
} }
void XdrvSetPower(uint8_t mpower) void XdrvSetPower(power_t mpower)
{ {
// XdrvMailbox.valid = 1; // XdrvMailbox.valid = 1;
XdrvMailbox.index = mpower; XdrvMailbox.index = mpower;
@ -102,6 +102,16 @@ boolean XdrvMqttData(char *topicBuf, uint16_t stopicBuf, char *dataBuf, uint16_t
/*********************************************************************************************\ /*********************************************************************************************\
* Function call to all xdrv * Function call to all xdrv
*
* FUNC_INIT
* FUNC_MQTT_SUBSCRIBE
* FUNC_MQTT_INIT
* return FUNC_MQTT_DATA
* return FUNC_COMMAND
* FUNC_SET_POWER
* FUNC_SHOW_SENSOR
* FUNC_EVERY_SECOND
* FUNC_EVERY_50_MSECOND
\*********************************************************************************************/ \*********************************************************************************************/
boolean XdrvCall(byte Function) boolean XdrvCall(byte Function)

View File

@ -504,8 +504,12 @@ boolean Xsns09(byte function)
switch (function) { switch (function) {
case FUNC_PREP_BEFORE_TELEPERIOD: case FUNC_PREP_BEFORE_TELEPERIOD:
BmpDetect(); BmpDetect();
break;
case FUNC_EVERY_SECOND:
#ifdef USE_BME680 #ifdef USE_BME680
if (tele_period == Settings.tele_period -3) {
Bme680PerformReading(); Bme680PerformReading();
}
#endif // USE_BME680 #endif // USE_BME680
break; break;
case FUNC_JSON_APPEND: case FUNC_JSON_APPEND:

View File

@ -71,6 +71,7 @@ const char kMhzTypes[] PROGMEM = "MHZ19|MHZ19B";
const uint8_t mhz_cmnd_read_ppm[9] = {0xFF, 0x01, 0x86, 0x00, 0x00, 0x00, 0x00, 0x00, 0x79}; const uint8_t mhz_cmnd_read_ppm[9] = {0xFF, 0x01, 0x86, 0x00, 0x00, 0x00, 0x00, 0x00, 0x79};
const uint8_t mhz_cmnd_abc_enable[9] = {0xFF, 0x01, 0x79, 0xA0, 0x00, 0x00, 0x00, 0x00, 0xE6}; const uint8_t mhz_cmnd_abc_enable[9] = {0xFF, 0x01, 0x79, 0xA0, 0x00, 0x00, 0x00, 0x00, 0xE6};
const uint8_t mhz_cmnd_abc_disable[9] = {0xFF, 0x01, 0x79, 0x00, 0x00, 0x00, 0x00, 0x00, 0x86}; const uint8_t mhz_cmnd_abc_disable[9] = {0xFF, 0x01, 0x79, 0x00, 0x00, 0x00, 0x00, 0x00, 0x86};
//const uint8_t mhz_cmnd_zeropoint[9] = {0xff, 0x01, 0x87, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78};
uint8_t mhz_type = 1; uint8_t mhz_type = 1;
uint16_t mhz_last_ppm = 0; uint16_t mhz_last_ppm = 0;

View File

@ -112,6 +112,14 @@ void XSnsInit()
/*********************************************************************************************\ /*********************************************************************************************\
* Function call to all xsns * Function call to all xsns
*
* FUNC_INIT
* FUNC_PREP_BEFORE_TELEPERIOD
* FUNC_SAVE_BEFORE_RESTART
* FUNC_JSON_APPEND
* FUNC_WEB_APPEND
* FUNC_EVERY_SECOND
* FUNC_EVERY_50_MSECOND
\*********************************************************************************************/ \*********************************************************************************************/
boolean XsnsCall(byte Function) boolean XsnsCall(byte Function)