5.8.0 20170918
 * Remove the need for NeoPixelBus library for Hue
support
 * Consolidate WS2812 into Sonoff Led for flexible future led
strip library changes
 * Invert WS2812 fade speed to align with Sonoff
led (Speed 1 = fast, Speed 8 = slow)
 * Remove upper case MQTT receive
buffer
 * Reduce code and string length for output of commands Modules
and GPIOs
 * Add Sonoff SC debug information
 * Change syslog service
 *
Removed webserver syslog disable as now no longer needed
 * Increased
default MQTT message size from 368 to 405 bytes while keeping
MQTT_MAX_PACKET_SIZE = 512 (because we can)
 * Fix MQTT Offline or
Remove MQTT retained topic code
 * Fix Domoticz loop when Emulation is
selected
 * Add blink to WS2812 and Sonoff Led (#643)
 * Add option
WIFI_WAIT (5) to command WifiConfig to allow connection retry to same AP
without restart or update flash (#772, #869)
 * Add support for Witty
Cloud (#794)
 * Add GPIO14 to Sonoff Dual (#797, #839)
 * Add support
for Yunshan Wifi Relay (#802)
 * Add GPIO16 input pulldown (#827)
 * Add
timeout to DHT and DS18B20 sensors (#852)
 * Fix watchdog timeout caused
by lack of stack space by moving to heap (#853)
 * Allow LogPort and
MqttPort up to 65535 and add LogPort tot Status 3 (#859)
 * Allow
command SwitchTopic in group mode (#861)
 * Allow command SwitchMode if
no switches are defined (#861)
 * Add optional dimmer parameter to
command Wakeup for WS2812, AiLight, Sonoff B1, Led and BN-SZ01 (#867)
 *
Fix basic On, Off, Toggle, Blink and BlinkOff commands when other
language is selected (#874)
This commit is contained in:
arendst 2017-09-18 18:38:13 +02:00
parent 41f1004d93
commit af942a278c
27 changed files with 1162 additions and 1273 deletions

View File

@ -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.7.1** - See [sonoff/_releasenotes.ino](https://github.com/arendst/Sonoff-Tasmota/blob/master/sonoff/_releasenotes.ino) for change information.
Current version is **5.8.0** - See [sonoff/_releasenotes.ino](https://github.com/arendst/Sonoff-Tasmota/blob/master/sonoff/_releasenotes.ino) for change information.
### ATTENTION All versions

View File

@ -1,4 +1,30 @@
/* 5.7.1 20170909
/* 5.8.0 20170918
* Remove the need for NeoPixelBus library for Hue support
* Consolidate WS2812 into Sonoff Led for flexible future led strip library changes
* Invert WS2812 fade speed to align with Sonoff led (Speed 1 = fast, Speed 8 = slow)
* Remove upper case MQTT receive buffer
* Reduce code and string length for output of commands Modules and GPIOs
* Add Sonoff SC debug information
* Change syslog service
* Removed webserver syslog disable as now no longer needed
* Increased default MQTT message size from 368 to 405 bytes while keeping MQTT_MAX_PACKET_SIZE = 512 (because we can)
* Fix MQTT Offline or Remove MQTT retained topic code
* Fix Domoticz loop when Emulation is selected
* Add blink to WS2812 and Sonoff Led (#643)
* Add option WIFI_WAIT (5) to command WifiConfig to allow connection retry to same AP without restart or update flash (#772, #869)
* Add support for Witty Cloud (#794)
* Add GPIO14 to Sonoff Dual (#797, #839)
* Add support for Yunshan Wifi Relay (#802)
* Add GPIO16 input pulldown (#827)
* Add timeout to DHT and DS18B20 sensors (#852)
* Fix watchdog timeout caused by lack of stack space by moving to heap (#853)
* Allow LogPort and MqttPort up to 65535 and add LogPort tot Status 3 (#859)
* Allow command SwitchTopic in group mode (#861)
* Allow command SwitchMode if no switches are defined (#861)
* Add optional dimmer parameter to command Wakeup for WS2812, AiLight, Sonoff B1, Led and BN-SZ01 (#867)
* Fix basic On, Off, Toggle, Blink and BlinkOff commands when other language is selected (#874)
*
* 5.7.1 20170909
* Remove leading spaces from MQTT data
* Fix webconsole special character entry
* Allow # as prefix for color value

View File

@ -44,12 +44,13 @@ const char commands[MAX_BUTTON_COMMANDS][14] PROGMEM = {
D_CMND_WIFICONFIG " 3", // Press button five times
D_CMND_RESTART " 1", // Press button six times
D_CMND_UPGRADE " 1" }; // Press button seven times
const char wificfg[5][WCFG_MAX_STRING_LENGTH] PROGMEM = {
const char wificfg[MAX_WIFI_OPTION][WCFG_MAX_STRING_LENGTH] PROGMEM = {
D_WCFG_0_RESTART,
D_WCFG_1_SMARTCONFIG,
D_WCFG_2_WIFIMANAGER,
D_WCFG_3_WPSCONFIG,
D_WCFG_4_RETRY };
D_WCFG_4_RETRY,
D_WCFG_5_WAIT };
const char PREFIXES[3][PRFX_MAX_STRING_LENGTH] PROGMEM = {
D_CMND,
D_STAT,

View File

@ -175,6 +175,7 @@
#define D_TOGGLE "Toggle"
#define D_TOPIC "Topic"
#define D_TOTAL "Total"
#define D_TRANSMIT "Transmit"
#define D_TRUE "True"
#define D_TYPE "Type"
#define D_UNKNOWN "Unknown"
@ -478,7 +479,7 @@
#define D_LOG_APPLICATION "APP: "
#define D_LOG_BRIDGE "BRG: "
#define D_LOG_CONFIG "CFG: "
#define D_LOG_COMMAND "CND: "
#define D_LOG_COMMAND "CMD: "
#define D_LOG_DHT "DHT: "
#define D_LOG_DOMOTICZ "DOM: "
#define D_LOG_DSB "DSB: "
@ -494,6 +495,7 @@
#define D_LOG_UPLOAD "UPL: "
#define D_LOG_UPNP "UPP: "
#define D_LOG_WIFI "WIF: "
#define D_LOG_SERIAL "SER: "
// Result
#define D_RSLT_RESULT "RESULT"
@ -587,6 +589,7 @@
#define D_WCFG_2_WIFIMANAGER "WifiManager"
#define D_WCFG_3_WPSCONFIG "WPSConfig"
#define D_WCFG_4_RETRY "Retry"
#define D_WCFG_5_WAIT "Wait"
#define D_CMND_FRIENDLYNAME "FriendlyName"
#define D_CMND_SWITCHMODE "SwitchMode"
#define D_CMND_WEBSERVER "Webserver"

View File

@ -175,6 +175,7 @@
#define D_TOGGLE "Toggle" // Wissel, Tuimel
#define D_TOPIC "Topic" // Onderwerp
#define D_TOTAL "Totaal"
#define D_TRANSMIT "Verzend"
#define D_TRUE "Waar"
#define D_TYPE "Soort"
#define D_UNKNOWN "Onbekend"
@ -478,7 +479,7 @@
#define D_LOG_APPLICATION "APP: "
#define D_LOG_BRIDGE "BRG: "
#define D_LOG_CONFIG "CFG: "
#define D_LOG_COMMAND "CND: "
#define D_LOG_COMMAND "CMD: "
#define D_LOG_DHT "DHT: "
#define D_LOG_DOMOTICZ "DOM: "
#define D_LOG_DSB "DSB: "
@ -494,6 +495,7 @@
#define D_LOG_UPLOAD "UPL: "
#define D_LOG_UPNP "UPP: "
#define D_LOG_WIFI "WIF: "
#define D_LOG_SERIAL "SER: "
// Result
#define D_RSLT_RESULT "RESULTAAT"
@ -587,6 +589,7 @@
#define D_WCFG_2_WIFIMANAGER "WifiManager"
#define D_WCFG_3_WPSCONFIG "WPSConfig"
#define D_WCFG_4_RETRY "Opnieuw"
#define D_WCFG_5_WAIT "Wacht"
#define D_CMND_FRIENDLYNAME "FriendlyName"
#define D_CMND_SWITCHMODE "SwitchMode"
#define D_CMND_WEBSERVER "Webserver"

View File

@ -82,7 +82,6 @@ void RTC_Dump()
{
#define CFG_COLS 16
char log[LOGSZ];
uint16_t idx;
uint16_t maxrow;
uint16_t row;
@ -93,22 +92,22 @@ void RTC_Dump()
for (row = 0; row < maxrow; row++) {
idx = row * CFG_COLS;
snprintf_P(log, sizeof(log), PSTR("%04X:"), idx);
snprintf_P(log_data, sizeof(log_data), PSTR("%04X:"), idx);
for (col = 0; col < CFG_COLS; col++) {
if (!(col%4)) {
snprintf_P(log, sizeof(log), PSTR("%s "), log);
snprintf_P(log_data, sizeof(log_data), PSTR("%s "), log_data);
}
snprintf_P(log, sizeof(log), PSTR("%s %02X"), log, buffer[idx + col]);
snprintf_P(log_data, sizeof(log_data), PSTR("%s %02X"), log_data, buffer[idx + col]);
}
snprintf_P(log, sizeof(log), PSTR("%s |"), log);
snprintf_P(log_data, sizeof(log_data), PSTR("%s |"), log_data);
for (col = 0; col < CFG_COLS; col++) {
// if (!(col%4)) {
// snprintf_P(log, sizeof(log), PSTR("%s "), log);
// snprintf_P(log_data, sizeof(log_data), PSTR("%s "), log_data);
// }
snprintf_P(log, sizeof(log), PSTR("%s%c"), log, ((buffer[idx + col] > 0x20) && (buffer[idx + col] < 0x7F)) ? (char)buffer[idx + col] : ' ');
snprintf_P(log_data, sizeof(log_data), PSTR("%s%c"), log_data, ((buffer[idx + col] > 0x20) && (buffer[idx + col] < 0x7F)) ? (char)buffer[idx + col] : ' ');
}
snprintf_P(log, sizeof(log), PSTR("%s|"), log);
addLog(LOG_LEVEL_INFO, log);
snprintf_P(log_data, sizeof(log_data), PSTR("%s|"), log_data);
addLog(LOG_LEVEL_INFO);
}
}
#endif // DEBUG_THEO
@ -193,8 +192,6 @@ void CFG_Save(byte rotate)
* stop_flash_rotate 0 = Allow flash slot rotation (SetOption12 0)
* stop_flash_rotate 1 = Allow only eeprom flash slot use (SetOption12 1)
*/
char log[LOGSZ];
#ifndef BE_MINIMAL
if ((getHash() != _cfgHash) || rotate) {
if (1 == rotate) { // Use eeprom flash slot only and disable flash rotate from now on (upgrade)
@ -224,9 +221,9 @@ void CFG_Save(byte rotate)
delay(1);
}
}
snprintf_P(log, sizeof(log), PSTR(D_LOG_CONFIG D_SAVED_TO_FLASH_AT " %X, " D_COUNT " %d, " D_BYTES " %d"),
snprintf_P(log_data, sizeof(log_data), PSTR(D_LOG_CONFIG D_SAVED_TO_FLASH_AT " %X, " D_COUNT " %d, " D_BYTES " %d"),
_cfgLocation, sysCfg.saveFlag, sizeof(SYSCFG));
addLog(LOG_LEVEL_DEBUG, log);
addLog(LOG_LEVEL_DEBUG);
_cfgHash = getHash();
}
#endif // BE_MINIMAL
@ -237,8 +234,6 @@ void CFG_Load()
{
/* Load configuration from eeprom or one of 7 slots below if first load does not stop_flash_rotate
*/
char log[LOGSZ];
struct SYSCFGH {
unsigned long cfg_holder;
unsigned long saveFlag;
@ -252,17 +247,17 @@ void CFG_Load()
spi_flash_read((_cfgLocation -1) * SPI_FLASH_SEC_SIZE, (uint32*)&_sysCfgH, sizeof(SYSCFGH));
interrupts();
// snprintf_P(log, sizeof(log), PSTR("Cnfg: Check at %X with count %d and holder %X"), _cfgLocation -1, _sysCfgH.saveFlag, _sysCfgH.cfg_holder);
// addLog(LOG_LEVEL_DEBUG, log);
// snprintf_P(log_data, sizeof(log_data), PSTR("Cnfg: Check at %X with count %d and holder %X"), _cfgLocation -1, _sysCfgH.saveFlag, _sysCfgH.cfg_holder);
// addLog(LOG_LEVEL_DEBUG);
if (((sysCfg.version > 0x05000200) && sysCfg.flag.stop_flash_rotate) || (sysCfg.cfg_holder != _sysCfgH.cfg_holder) || (sysCfg.saveFlag > _sysCfgH.saveFlag)) {
break;
}
delay(1);
}
snprintf_P(log, sizeof(log), PSTR(D_LOG_CONFIG D_LOADED_FROM_FLASH_AT " %X, " D_COUNT " %d"),
snprintf_P(log_data, sizeof(log_data), PSTR(D_LOG_CONFIG D_LOADED_FROM_FLASH_AT " %X, " D_COUNT " %d"),
_cfgLocation, sysCfg.saveFlag);
addLog(LOG_LEVEL_DEBUG, log);
addLog(LOG_LEVEL_DEBUG);
if (sysCfg.cfg_holder != CFG_HOLDER) {
// Auto upgrade
noInterrupts();
@ -283,15 +278,14 @@ void CFG_Load()
void CFG_Erase()
{
char log[LOGSZ];
SpiFlashOpResult result;
uint32_t _sectorStart = (ESP.getSketchSize() / SPI_FLASH_SEC_SIZE) + 1;
uint32_t _sectorEnd = ESP.getFlashChipRealSize() / SPI_FLASH_SEC_SIZE;
boolean _serialoutput = (LOG_LEVEL_DEBUG_MORE <= seriallog_level);
snprintf_P(log, sizeof(log), PSTR(D_LOG_APPLICATION D_ERASE " %d " D_UNIT_SECTORS), _sectorEnd - _sectorStart);
addLog(LOG_LEVEL_DEBUG, log);
snprintf_P(log_data, sizeof(log_data), PSTR(D_LOG_APPLICATION D_ERASE " %d " D_UNIT_SECTORS), _sectorEnd - _sectorStart);
addLog(LOG_LEVEL_DEBUG);
for (uint32_t _sector = _sectorStart; _sector < _sectorEnd; _sector++) {
noInterrupts();
@ -314,7 +308,6 @@ void CFG_Dump(char* parms)
{
#define CFG_COLS 16
char log[LOGSZ];
uint16_t idx;
uint16_t maxrow;
uint16_t row;
@ -327,8 +320,8 @@ void CFG_Dump(char* parms)
uint16_t srow = strtol(parms, &p, 16) / CFG_COLS;
uint16_t mrow = strtol(p, &p, 10);
// snprintf_P(log, sizeof(log), PSTR("Cnfg: Parms %s, Start row %d, rows %d"), parms, srow, mrow);
// addLog(LOG_LEVEL_DEBUG, log);
// snprintf_P(log_data, sizeof(log_data), PSTR("Cnfg: Parms %s, Start row %d, rows %d"), parms, srow, mrow);
// addLog(LOG_LEVEL_DEBUG);
if (0 == mrow) { // Default only 8 lines
mrow = 8;
@ -342,22 +335,22 @@ void CFG_Dump(char* parms)
for (row = srow; row < maxrow; row++) {
idx = row * CFG_COLS;
snprintf_P(log, sizeof(log), PSTR("%04X:"), idx);
snprintf_P(log_data, sizeof(log_data), PSTR("%04X:"), idx);
for (col = 0; col < CFG_COLS; col++) {
if (!(col%4)) {
snprintf_P(log, sizeof(log), PSTR("%s "), log);
snprintf_P(log_data, sizeof(log_data), PSTR("%s "), log_data);
}
snprintf_P(log, sizeof(log), PSTR("%s %02X"), log, buffer[idx + col]);
snprintf_P(log_data, sizeof(log_data), PSTR("%s %02X"), log_data, buffer[idx + col]);
}
snprintf_P(log, sizeof(log), PSTR("%s |"), log);
snprintf_P(log_data, sizeof(log_data), PSTR("%s |"), log_data);
for (col = 0; col < CFG_COLS; col++) {
// if (!(col%4)) {
// snprintf_P(log, sizeof(log), PSTR("%s "), log);
// snprintf_P(log_data, sizeof(log_data), PSTR("%s "), log_data);
// }
snprintf_P(log, sizeof(log), PSTR("%s%c"), log, ((buffer[idx + col] > 0x20) && (buffer[idx + col] < 0x7F)) ? (char)buffer[idx + col] : ' ');
snprintf_P(log_data, sizeof(log_data), PSTR("%s%c"), log_data, ((buffer[idx + col] > 0x20) && (buffer[idx + col] < 0x7F)) ? (char)buffer[idx + col] : ' ');
}
snprintf_P(log, sizeof(log), PSTR("%s|"), log);
addLog(LOG_LEVEL_INFO, log);
snprintf_P(log_data, sizeof(log_data), PSTR("%s|"), log_data);
addLog(LOG_LEVEL_INFO);
delay(1);
}
}
@ -507,6 +500,8 @@ void CFG_DefaultSet2()
// 5.4.1
memcpy_P(sysCfg.sfb_code[0], sfb_codeDefault, 9);
// 5.8.0
sysCfg.led_pixels = 1;
}
/********************************************************************************************/
@ -540,7 +535,7 @@ void CFG_DefaultSet_3_9_3()
sysCfg.my_module.gp.io[i] = 0;
}
sysCfg.led_pixels = 0;
sysCfg.led_pixels = WS2812_LEDS;
for (byte i = 0; i < 5; i++) {
sysCfg.led_color[i] = 255;
}
@ -549,9 +544,9 @@ void CFG_DefaultSet_3_9_3()
sysCfg.led_dimmer[i] = 10;
}
sysCfg.led_fade = 0;
sysCfg.led_speed = 0;
sysCfg.led_speed = 1;
sysCfg.led_scheme = 0;
sysCfg.led_width = 0;
sysCfg.led_width = 1;
sysCfg.led_wakeup = 0;
}
@ -715,6 +710,30 @@ void CFG_Delta()
}
memcpy_P(sysCfg.sfb_code[0], sfb_codeDefault, 9);
}
if (sysCfg.version < 0x05080000) {
uint8_t cfg_wsflg = 0;
for (byte i = 0; i < MAX_GPIO_PIN; i++) {
if (GPIO_WS2812 == sysCfg.my_module.gp.io[i]) {
cfg_wsflg = 1;
}
}
if (!sysCfg.led_pixels && cfg_wsflg) {
sysCfg.led_pixels = sysCfg.ws_pixels;
sysCfg.led_color[0] = sysCfg.ws_red;
sysCfg.led_color[1] = sysCfg.ws_green;
sysCfg.led_color[2] = sysCfg.ws_blue;
sysCfg.led_dimmer[0] = sysCfg.ws_dimmer;
sysCfg.led_table = sysCfg.ws_ledtable;
sysCfg.led_fade = sysCfg.ws_fade;
sysCfg.led_speed = sysCfg.ws_speed;
sysCfg.led_scheme = sysCfg.ws_scheme;
sysCfg.led_width = sysCfg.ws_width;
sysCfg.led_wakeup = sysCfg.ws_wakeup;
} else {
sysCfg.led_pixels = 1;
sysCfg.led_width = 1;
}
}
sysCfg.version = VERSION;
CFG_Save(1);

File diff suppressed because it is too large Load Diff

View File

@ -157,6 +157,8 @@ enum module_t {
SONOFF_T12,
SONOFF_T13,
SUPLA1,
WITTY,
YUNSHAN,
MAXMODULE };
/********************************************************************************************/
@ -199,11 +201,13 @@ const uint8_t nicelist[MAXMODULE] PROGMEM = {
ELECTRODRAGON,
EXS_RELAY,
SUPLA1,
YUNSHAN,
WION,
H801,
HUAFAN_SS,
AILIGHT,
WEMOS
WEMOS,
WITTY
};
// Default module settings
@ -278,7 +282,8 @@ const mytmplt modules[MAXMODULE] PROGMEM = {
0, 0, 0, 0, 0, 0, // Flash connection
0,
GPIO_LED1_INV, // GPIO13 Blue Led (0 = On, 1 = Off)
0, 0, 0, 0
GPIO_USER, // GPIO14 Optional sensor
0, 0, 0
},
{ "Sonoff Pow", // Sonoff Pow (ESP8266)
GPIO_KEY1, // GPIO00 Button
@ -619,6 +624,32 @@ const mytmplt modules[MAXMODULE] PROGMEM = {
0,
GPIO_LED1, // GPIO16 Led (1 = On, 0 = Off)
GPIO_ADC0 // ADC0 A0 Analog input
},
{ "Witty Cloud", // Witty Cloud Dev Board (ESP8266) - https://www.aliexpress.com/item/ESP8266-serial-WIFI-Witty-cloud-Development-Board-ESP-12F-module-MINI-nodemcu/32643464555.html
GPIO_USER, // GPIO00 D3 flash push button on interface board
GPIO_USER, // GPIO01 Serial RXD and Optional sensor
GPIO_LED1_INV, // GPIO02 D4 Blue Led (0 = On, 1 = Off) on ESP-12F
GPIO_USER, // GPIO03 Serial TXD and Optional sensor
GPIO_KEY1, // GPIO04 D2 push button on ESP-12F board
GPIO_USER, // GPIO05 D1 optional sensor
0, 0, 0, 0, 0, 0, // Flash connection
GPIO_PWM4, // GPIO12 D6 RGB LED Green
GPIO_PWM5, // GPIO13 D7 RGB LED Blue
GPIO_USER, // GPIO14 D5 optional sensor
GPIO_PWM3, // GPIO15 D8 RGB LED Red
GPIO_USER, // GPIO16 D0 optional sensor
GPIO_ADC0 // ADC0 A0 Light sensor / Requires USE_ADC_VCC in user_config.h to be disabled
},
{ "Yunshan Relay", // Yunshan Wifi Relay (ESP8266) - https://www.ebay.com/p/Esp8266-220v-10a-Network-Relay-WiFi-Module/1369583381
// Schematics and Info https://ucexperiment.wordpress.com/2016/12/18/yunshan-esp8266-250v-15a-acdc-network-wifi-relay-module/
0, // GPIO00 Flash jumper - Module Pin 8
GPIO_USER, // GPIO01 Serial RXD and Optional sensor - Module Pin 2
GPIO_LED1_INV, // GPIO02 Blue Led (0 = On, 1 = Off) on ESP-12F - Module Pin 7
GPIO_USER, // GPIO03 Serial TXD and Optional sensor - Module Pin 3
GPIO_REL1, // GPIO04 Red Led and Relay (0 = Off, 1 = On) - Module Pin 10
GPIO_KEY1, // GPIO05 Blue Led and OptoCoupler input - Module Pin 9
0, 0, 0, 0, 0, 0, // Flash connection
0, 0, 0, 0, 0
}
};

View File

@ -38,9 +38,8 @@ void osw_osWatch()
unsigned long last_run = abs(t - osw_last_loop);
#ifdef DEBUG_THEO
char log[LOGSZ];
snprintf_P(log, sizeof(log), PSTR(D_LOG_APPLICATION D_OSWATCH " FreeRam %d, rssi %d, last_run %d"), ESP.getFreeHeap(), WIFI_getRSSIasQuality(WiFi.RSSI()), last_run);
addLog(LOG_LEVEL_DEBUG, log);
snprintf_P(log_data, sizeof(log_data), PSTR(D_LOG_APPLICATION D_OSWATCH " FreeRam %d, rssi %d, last_run %d"), ESP.getFreeHeap(), WIFI_getRSSIasQuality(WiFi.RSSI()), last_run);
addLog(LOG_LEVEL_DEBUG);
#endif // DEBUG_THEO
if (last_run >= (OSWATCH_RESET_TIME * 1000)) {
addLog_P(LOG_LEVEL_INFO, PSTR(D_LOG_APPLICATION D_OSWATCH " " D_BLOCKED_LOOP ". " D_RESTARTING));
@ -372,8 +371,6 @@ void WIFI_wps_status_cb(wps_cb_status status);
void WIFI_wps_status_cb(wps_cb_status status)
{
char log[LOGSZ];
/* from user_interface.h:
enum wps_cb_status {
WPS_CB_ST_SUCCESS = 0,
@ -383,13 +380,12 @@ void WIFI_wps_status_cb(wps_cb_status status)
WPS_CB_ST_SCAN_ERR, // can not find the target WPS AP
};
*/
_wpsresult = status;
if (WPS_CB_ST_SUCCESS == _wpsresult) {
wifi_wps_disable();
} else {
snprintf_P(log, sizeof(log), PSTR(D_LOG_WIFI D_WPS_FAILED_WITH_STATUS " %d"), _wpsresult);
addLog(LOG_LEVEL_DEBUG, log);
snprintf_P(log_data, sizeof(log_data), PSTR(D_LOG_WIFI D_WPS_FAILED_WITH_STATUS " %d"), _wpsresult);
addLog(LOG_LEVEL_DEBUG);
_wifiConfigCounter = 2;
}
}
@ -420,7 +416,7 @@ boolean WIFI_beginWPSConfig(void)
void WIFI_config(uint8_t type)
{
if (!_wificonfigflag) {
if (WIFI_RETRY == type) {
if (type >= WIFI_RETRY) { // WIFI_RETRY and WIFI_WAIT
return;
}
#ifdef USE_EMULATION
@ -458,7 +454,6 @@ void WIFI_config(uint8_t type)
void WIFI_begin(uint8_t flag)
{
const char PhyMode[] = " BGN";
char log[LOGSZ];
#ifdef USE_EMULATION
UDP_Disconnect();
@ -495,9 +490,9 @@ void WIFI_begin(uint8_t flag)
}
WiFi.hostname(Hostname);
WiFi.begin(sysCfg.sta_ssid[sysCfg.sta_active], sysCfg.sta_pwd[sysCfg.sta_active]);
snprintf_P(log, sizeof(log), PSTR(D_LOG_WIFI D_CONNECTING_TO_AP "%d %s " D_IN_MODE " 11%c " D_AS " %s..."),
snprintf_P(log_data, sizeof(log_data), PSTR(D_LOG_WIFI D_CONNECTING_TO_AP "%d %s " D_IN_MODE " 11%c " D_AS " %s..."),
sysCfg.sta_active +1, sysCfg.sta_ssid[sysCfg.sta_active], PhyMode[WiFi.getPhyMode() & 0x3], Hostname);
addLog(LOG_LEVEL_INFO, log);
addLog(LOG_LEVEL_INFO);
}
void WIFI_check_ip()
@ -523,11 +518,15 @@ void WIFI_check_ip()
break;
case WL_NO_SSID_AVAIL:
addLog_P(LOG_LEVEL_INFO, S_LOG_WIFI, PSTR(D_CONNECT_FAILED_AP_NOT_REACHED));
if (_wifiretry > (WIFI_RETRY_SEC / 2)) {
_wifiretry = WIFI_RETRY_SEC / 2;
}
else if (_wifiretry) {
_wifiretry = 0;
if (WIFI_WAIT == sysCfg.sta_config) {
_wifiretry = WIFI_RETRY_SEC;
} else {
if (_wifiretry > (WIFI_RETRY_SEC / 2)) {
_wifiretry = WIFI_RETRY_SEC / 2;
}
else if (_wifiretry) {
_wifiretry = 0;
}
}
break;
case WL_CONNECT_FAILED:
@ -548,9 +547,9 @@ void WIFI_check_ip()
}
if (_wifiretry) {
if (WIFI_RETRY_SEC == _wifiretry) {
WIFI_begin(3); // Select default SSID
WIFI_begin(3); // Select default SSID
}
if ((WIFI_RETRY_SEC / 2) == _wifiretry) {
if ((sysCfg.sta_config != WIFI_WAIT) && ((WIFI_RETRY_SEC / 2) == _wifiretry)) {
WIFI_begin(2); // Select alternate SSID
}
_wificounter = 1;
@ -565,8 +564,6 @@ void WIFI_check_ip()
void WIFI_Check(uint8_t param)
{
char log[LOGSZ];
_wificounter--;
switch (param) {
case WIFI_SMARTCONFIG:
@ -593,8 +590,8 @@ void WIFI_Check(uint8_t param)
strlcpy(sysCfg.sta_pwd[0], WiFi.psk().c_str(), sizeof(sysCfg.sta_pwd[0]));
}
sysCfg.sta_active = 0;
snprintf_P(log, sizeof(log), PSTR(D_LOG_WIFI D_WCFG_1_SMARTCONFIG D_CMND_SSID "1 %s, " D_CMND_PASSWORD "1 %s"), sysCfg.sta_ssid[0], sysCfg.sta_pwd[0]);
addLog(LOG_LEVEL_INFO, log);
snprintf_P(log_data, sizeof(log_data), PSTR(D_LOG_WIFI D_WCFG_1_SMARTCONFIG D_CMND_SSID "1 %s, " D_CMND_PASSWORD "1 %s"), sysCfg.sta_ssid[0], sysCfg.sta_pwd[0]);
addLog(LOG_LEVEL_INFO);
}
}
if (!_wifiConfigCounter) {
@ -613,8 +610,8 @@ void WIFI_Check(uint8_t param)
#ifdef USE_DISCOVERY
if (!mDNSbegun) {
mDNSbegun = MDNS.begin(Hostname);
snprintf_P(log, sizeof(log), PSTR(D_LOG_MDNS "%s"), (mDNSbegun) ? D_INITIALIZED : D_FAILED);
addLog(LOG_LEVEL_INFO, log);
snprintf_P(log_data, sizeof(log_data), PSTR(D_LOG_MDNS "%s"), (mDNSbegun) ? D_INITIALIZED : D_FAILED);
addLog(LOG_LEVEL_INFO);
}
#endif // USE_DISCOVERY
#ifdef USE_WEBSERVER
@ -673,7 +670,6 @@ void WIFI_Connect()
#ifdef MQTT_HOST_DISCOVERY
boolean mdns_discoverMQTTServer()
{
char log[LOGSZ];
char ip_str[20];
int n;
@ -683,16 +679,16 @@ boolean mdns_discoverMQTTServer()
n = MDNS.queryService("mqtt", "tcp"); // Search for mqtt service
snprintf_P(log, sizeof(log), PSTR(D_LOG_MDNS D_QUERY_DONE " %d"), n);
addLog(LOG_LEVEL_INFO, log);
snprintf_P(log_data, sizeof(log_data), PSTR(D_LOG_MDNS D_QUERY_DONE " %d"), n);
addLog(LOG_LEVEL_INFO);
if (n > 0) {
// Note: current strategy is to get the first MQTT service (even when many are found)
IPtoCharArray(MDNS.IP(0), ip_str, 20);
snprintf_P(log, sizeof(log), PSTR(D_LOG_MDNS D_MQTT_SERVICE_FOUND " %s, " D_IP_ADDRESS " %s, " D_PORT " %d"),
snprintf_P(log_data, sizeof(log_data), PSTR(D_LOG_MDNS D_MQTT_SERVICE_FOUND " %s, " D_IP_ADDRESS " %s, " D_PORT " %d"),
MDNS.hostname(0).c_str(), ip_str, MDNS.port(0));
addLog(LOG_LEVEL_INFO, log);
addLog(LOG_LEVEL_INFO);
strlcpy(sysCfg.mqtt_host, ip_str, sizeof(sysCfg.mqtt_host));
sysCfg.mqtt_port = MDNS.port(0);
@ -794,7 +790,7 @@ void i2c_scan(char *devs, unsigned int devs_len)
byte any = 0;
char tstr[10];
snprintf_P(devs, devs_len, PSTR("{\"" D_CMND_I2CSCAN "\":\"" D_I2CSCAN_DEVICES_FOUND_AT));
snprintf_P(devs, devs_len, PSTR("{\"I2Cscan\":\"Device(s) found at"));
for (address = 1; address <= 127; address++) {
Wire.beginTransmission(address);
error = Wire.endTransmission();
@ -804,13 +800,13 @@ void i2c_scan(char *devs, unsigned int devs_len)
any = 1;
}
else if (4 == error) {
snprintf_P(devs, devs_len, PSTR("{\"" D_CMND_I2CSCAN "\":\"" D_I2CSCAN_UNKNOWN_ERROR_AT " 0x%2x\"}"), address);
snprintf_P(devs, devs_len, PSTR("{\"I2Cscan\":\"Unknown error at 0x%2x\"}"), address);
}
}
if (any) {
strncat(devs, "\"}", devs_len);
} else {
snprintf_P(devs, devs_len, PSTR("{\"" D_CMND_I2CSCAN "\":\"" D_I2CSCAN_NO_DEVICES_FOUND "\"}"));
snprintf_P(devs, devs_len, PSTR("{\"I2Cscan\":\"No devices found\"}"));
}
}
#endif // USE_I2C
@ -1027,7 +1023,7 @@ String rtc_time(int type)
if (1 == type) time = loctime;
if (2 == type) time = dsttime;
if (3 == type) time = stdtime;
snprintf_P(stime, sizeof(stime), PSTR("%s"), sntp_get_real_time(time));
snprintf_P(stime, sizeof(stime), sntp_get_real_time(time));
return String(stime);
}
@ -1052,7 +1048,6 @@ boolean rtc_midnight_now()
void rtc_second()
{
char log[LOGSZ];
byte ntpsync;
uint32_t stdoffset;
uint32_t dstoffset;
@ -1076,12 +1071,12 @@ void rtc_second()
rtcTime.Year = tmpTime.Year + 1970;
dsttime = toTime_t(myDST, rtcTime.Year);
stdtime = toTime_t(mySTD, rtcTime.Year);
snprintf_P(log, sizeof(log), PSTR(D_LOG_APPLICATION "(" D_UTC_TIME ") %s"), rtc_time(0).c_str());
addLog(LOG_LEVEL_DEBUG, log);
snprintf_P(log, sizeof(log), PSTR(D_LOG_APPLICATION "(" D_DST_TIME ") %s"), rtc_time(2).c_str());
addLog(LOG_LEVEL_DEBUG, log);
snprintf_P(log, sizeof(log), PSTR(D_LOG_APPLICATION "(" D_STD_TIME ") %s"), rtc_time(3).c_str());
addLog(LOG_LEVEL_DEBUG, log);
snprintf_P(log_data, sizeof(log_data), PSTR(D_LOG_APPLICATION "(" D_UTC_TIME ") %s"), rtc_time(0).c_str());
addLog(LOG_LEVEL_DEBUG);
snprintf_P(log_data, sizeof(log_data), PSTR(D_LOG_APPLICATION "(" D_DST_TIME ") %s"), rtc_time(2).c_str());
addLog(LOG_LEVEL_DEBUG);
snprintf_P(log_data, sizeof(log_data), PSTR(D_LOG_APPLICATION "(" D_STD_TIME ") %s"), rtc_time(3).c_str());
addLog(LOG_LEVEL_DEBUG);
}
}
utctime++;
@ -1153,32 +1148,38 @@ uint16_t getAdc0()
* Syslog
\*********************************************************************************************/
void syslog(const char *message)
void syslog()
{
char str[TOPSZ + MESSZ];
// Destroys log_data
char syslog_preamble[64]; // Hostname + Id
if (portUDP.beginPacket(sysCfg.syslog_host, sysCfg.syslog_port)) {
snprintf_P(str, sizeof(str), PSTR("%s ESP-%s"), Hostname, message);
portUDP.write(str);
snprintf_P(syslog_preamble, sizeof(syslog_preamble), PSTR("%s ESP-"), Hostname);
memmove(log_data + strlen(syslog_preamble), log_data, sizeof(log_data) - strlen(syslog_preamble));
log_data[sizeof(log_data) -1] = '\0';
memcpy(log_data, syslog_preamble, strlen(syslog_preamble));
portUDP.write(log_data);
portUDP.endPacket();
} else {
syslog_level = 0;
syslog_timer = SYSLOG_TIMER;
snprintf_P(str, sizeof(str), PSTR(D_LOG_APPLICATION D_SYSLOG_HOST_NOT_FOUND ". " D_RETRY_IN " %d " D_UNIT_SECOND), SYSLOG_TIMER);
addLog(LOG_LEVEL_INFO, str);
snprintf_P(log_data, sizeof(log_data), PSTR(D_LOG_APPLICATION D_SYSLOG_HOST_NOT_FOUND ". " D_RETRY_IN " %d " D_UNIT_SECOND), SYSLOG_TIMER);
addLog(LOG_LEVEL_INFO);
}
}
void addLog(byte loglevel, const char *line)
void addLog(byte loglevel)
{
char mxtime[9];
char mxtime[9]; // 13:45:21
snprintf_P(mxtime, sizeof(mxtime), PSTR("%02d" D_HOUR_MINUTE_SEPARATOR "%02d" D_MINUTE_SECOND_SEPARATOR "%02d"), rtcTime.Hour, rtcTime.Minute, rtcTime.Second);
if (loglevel <= seriallog_level) Serial.printf("%s %s\n", mxtime, line);
if (loglevel <= seriallog_level) {
Serial.printf("%s %s\n", mxtime, log_data);
}
#ifdef USE_WEBSERVER
if (sysCfg.webserver && (loglevel <= sysCfg.weblog_level)) {
Log[logidx] = String(mxtime) + " " + String(line);
Log[logidx] = String(mxtime) + " " + String(log_data);
logidx++;
if (logidx > MAX_LOG_LINES -1) {
logidx = 0;
@ -1186,27 +1187,24 @@ void addLog(byte loglevel, const char *line)
}
#endif // USE_WEBSERVER
if ((WL_CONNECTED == WiFi.status()) && (loglevel <= syslog_level)) {
syslog(line);
syslog();
}
}
void addLog_P(byte loglevel, const char *formatP)
{
char mess[LOGSZ]; // was MESSZ
snprintf_P(mess, sizeof(mess), formatP);
addLog(loglevel, mess);
snprintf_P(log_data, sizeof(log_data), formatP);
addLog(loglevel);
}
void addLog_P(byte loglevel, const char *formatP, const char *formatP2)
{
char mess[LOGSZ]; // was MESSZ
char mes2[LOGSZ];
char message[100];
snprintf_P(mess, sizeof(mess), formatP);
snprintf_P(mes2, sizeof(mes2), formatP2);
strncat(mess, mes2, sizeof(mess));
addLog(loglevel, mess);
snprintf_P(log_data, sizeof(log_data), formatP);
snprintf_P(message, sizeof(message), formatP2);
strncat(log_data, message, sizeof(log_data));
addLog(loglevel);
}
/*********************************************************************************************\

View File

@ -48,7 +48,7 @@
#define STA_SSID2 "indebuurt2" // [Ssid2] Optional alternate AP Wifi SSID
#define STA_PASS2 "VnsqrtnrsddbrN" // [Password2] Optional alternate AP Wifi password
#define WIFI_CONFIG_TOOL WIFI_WPSCONFIG // [WifiConfig] Default tool if wifi fails to connect
// (WIFI_RESTART, WIFI_SMARTCONFIG, WIFI_MANAGER, WIFI_WPSCONFIG, WIFI_RETRY)
// (WIFI_RESTART, WIFI_SMARTCONFIG, WIFI_MANAGER, WIFI_WPSCONFIG, WIFI_RETRY, WIFI_WAIT)
// -- Syslog --------------------------------------
#define SYS_LOG_HOST "domus1" // [LogHost] (Linux) syslog host
@ -169,7 +169,7 @@
#define USE_IR_REMOTE // Send IR remote commands using library IRremoteESP8266 and ArduinoJson (+3k code, 0.3k mem)
// #define USE_IR_HVAC // Support for HVAC system using IR (+2k code)
#define USE_WS2812 // WS2812 Led string using library NeoPixelBus (+11k code, +1k mem) - Disable by //
#define USE_WS2812 // WS2812 Led string using library NeoPixelBus (+5k code, +1k mem) - Disable by //
#define USE_WS2812_CTYPE 1 // WS2812 Color type (0 - RGB, 1 - GRB)
// #define USE_WS2812_DMA // DMA supports only GPIO03 (= Serial RXD) (+1k mem)
// When USE_WS2812_DMA is enabled expect Exceptions on Pow

View File

@ -297,8 +297,6 @@ uint8_t _colcount;
void startWebserver(int type, IPAddress ipweb)
{
char log[LOGSZ];
if (!_httpflag) {
if (!webServer) {
webServer = new ESP8266WebServer((HTTP_MANAGER==type)?80:WEB_PORT);
@ -345,9 +343,9 @@ void startWebserver(int type, IPAddress ipweb)
webServer->begin(); // Web server start
}
if (_httpflag != type) {
snprintf_P(log, sizeof(log), PSTR(D_LOG_HTTP D_WEBSERVER_ACTIVE_ON " %s%s " D_WITH_IP_ADDRESS " %s"),
snprintf_P(log_data, sizeof(log_data), PSTR(D_LOG_HTTP D_WEBSERVER_ACTIVE_ON " %s%s " D_WITH_IP_ADDRESS " %s"),
Hostname, (mDNSbegun) ? ".local" : "", ipweb.toString().c_str());
addLog(LOG_LEVEL_INFO, log);
addLog(LOG_LEVEL_INFO);
}
if (type) _httpflag = type;
}
@ -431,7 +429,8 @@ void handleRoot()
if (HTTP_MANAGER == _httpflag) {
handleWifi0();
} else {
char stemp[10], line[160];
char stemp[10];
char line[160];
String page = FPSTR(HTTP_HEAD);
page.replace(F("{v}"), FPSTR(S_MAIN_MENU));
page.replace(F("<body>"), F("<body onload='la()'>"));
@ -715,7 +714,6 @@ void handleWifi(boolean scan)
if (httpUser()) {
return;
}
char log[LOGSZ];
addLog_P(LOG_LEVEL_DEBUG, S_LOG_HTTP, S_CONFIGURE_WIFI);
@ -759,8 +757,8 @@ void handleWifi(boolean scan)
cssid = WiFi.SSID(indices[i]);
for (int j = i + 1; j < n; j++) {
if (cssid == WiFi.SSID(indices[j])) {
snprintf_P(log, sizeof(log), PSTR(D_LOG_WIFI D_DUPLICATE_ACCESSPOINT " %s"), WiFi.SSID(indices[j]).c_str());
addLog(LOG_LEVEL_DEBUG, log);
snprintf_P(log_data, sizeof(log_data), PSTR(D_LOG_WIFI D_DUPLICATE_ACCESSPOINT " %s"), WiFi.SSID(indices[j]).c_str());
addLog(LOG_LEVEL_DEBUG);
indices[j] = -1; // set dup aps to index -1
}
}
@ -772,8 +770,8 @@ void handleWifi(boolean scan)
if (-1 == indices[i]) {
continue; // skip dups
}
snprintf_P(log, sizeof(log), PSTR(D_LOG_WIFI D_SSID " %s, " D_RSSI " %d"), WiFi.SSID(indices[i]).c_str(), WiFi.RSSI(indices[i]));
addLog(LOG_LEVEL_DEBUG, log);
snprintf_P(log_data, sizeof(log_data), PSTR(D_LOG_WIFI D_SSID " %s, " D_RSSI " %d"), WiFi.SSID(indices[i]).c_str(), WiFi.RSSI(indices[i]));
addLog(LOG_LEVEL_DEBUG);
int quality = WIFI_getRSSIasQuality(WiFi.RSSI(indices[i]));
if (_minimumQuality == -1 || _minimumQuality < quality) {
@ -960,7 +958,6 @@ void handleSave()
return;
}
char log[LOGSZ +20];
char stemp[TOPSZ];
char stemp2[TOPSZ];
byte what = 0;
@ -982,9 +979,9 @@ void handleSave()
strlcpy(sysCfg.sta_pwd[0], (!strlen(webServer->arg("p1").c_str())) ? STA_PASS1 : webServer->arg("p1").c_str(), sizeof(sysCfg.sta_pwd[0]));
strlcpy(sysCfg.sta_ssid[1], (!strlen(webServer->arg("s2").c_str())) ? STA_SSID2 : webServer->arg("s2").c_str(), sizeof(sysCfg.sta_ssid[1]));
strlcpy(sysCfg.sta_pwd[1], (!strlen(webServer->arg("p2").c_str())) ? STA_PASS2 : webServer->arg("p2").c_str(), sizeof(sysCfg.sta_pwd[1]));
snprintf_P(log, sizeof(log), 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"),
sysCfg.hostname, sysCfg.sta_ssid[0], sysCfg.sta_pwd[0], sysCfg.sta_ssid[1], sysCfg.sta_pwd[1]);
addLog(LOG_LEVEL_INFO, log);
addLog(LOG_LEVEL_INFO);
result += F("<br/>" D_TRYING_TO_CONNECT "<br/>");
break;
case 2:
@ -993,7 +990,8 @@ void handleSave()
strlcpy(stemp2, (!strlen(webServer->arg("mf").c_str())) ? MQTT_FULLTOPIC : webServer->arg("mf").c_str(), sizeof(stemp2));
mqttfy(1,stemp2);
if ((strcmp(stemp, sysCfg.mqtt_topic)) || (strcmp(stemp2, sysCfg.mqtt_fulltopic))) {
mqtt_publish_topic_P(2, S_LWT, (sysCfg.flag.mqtt_offline) ? S_OFFLINE : "", true); // Offline or remove previous retained topic
snprintf_P(mqtt_data, sizeof(mqtt_data), (sysCfg.flag.mqtt_offline) ? S_OFFLINE : "");
mqtt_publish_topic_P(2, S_LWT, true); // Offline or remove previous retained topic
}
strlcpy(sysCfg.mqtt_topic, stemp, sizeof(sysCfg.mqtt_topic));
strlcpy(sysCfg.mqtt_fulltopic, stemp2, sizeof(sysCfg.mqtt_fulltopic));
@ -1002,9 +1000,9 @@ void handleSave()
strlcpy(sysCfg.mqtt_client, (!strlen(webServer->arg("mc").c_str())) ? MQTT_CLIENT_ID : webServer->arg("mc").c_str(), sizeof(sysCfg.mqtt_client));
strlcpy(sysCfg.mqtt_user, (!strlen(webServer->arg("mu").c_str())) ? MQTT_USER : (!strcmp(webServer->arg("mu").c_str(),"0")) ? "" : webServer->arg("mu").c_str(), sizeof(sysCfg.mqtt_user));
strlcpy(sysCfg.mqtt_pwd, (!strlen(webServer->arg("mp").c_str())) ? MQTT_PASS : (!strcmp(webServer->arg("mp").c_str(),"0")) ? "" : webServer->arg("mp").c_str(), sizeof(sysCfg.mqtt_pwd));
snprintf_P(log, sizeof(log), PSTR(D_LOG_MQTT D_CMND_MQTTHOST " %s, " D_CMND_MQTTPORT " %d, " D_CMND_MQTTCLIENT " %s, " D_CMND_MQTTUSER " %s, " D_CMND_MQTTPASSWORD " %s, " D_CMND_TOPIC " %s, " D_CMND_FULLTOPIC " %s"),
snprintf_P(log_data, sizeof(log_data), PSTR(D_LOG_MQTT D_CMND_MQTTHOST " %s, " D_CMND_MQTTPORT " %d, " D_CMND_MQTTCLIENT " %s, " D_CMND_MQTTUSER " %s, " D_CMND_MQTTPASSWORD " %s, " D_CMND_TOPIC " %s, " D_CMND_FULLTOPIC " %s"),
sysCfg.mqtt_host, sysCfg.mqtt_port, sysCfg.mqtt_client, sysCfg.mqtt_user, sysCfg.mqtt_pwd, sysCfg.mqtt_topic, sysCfg.mqtt_fulltopic);
addLog(LOG_LEVEL_INFO, log);
addLog(LOG_LEVEL_INFO);
break;
case 3:
sysCfg.seriallog_level = (!strlen(webServer->arg("ls").c_str())) ? SERIAL_LOG_LEVEL : atoi(webServer->arg("ls").c_str());
@ -1015,9 +1013,9 @@ void handleSave()
strlcpy(sysCfg.syslog_host, (!strlen(webServer->arg("lh").c_str())) ? SYS_LOG_HOST : webServer->arg("lh").c_str(), sizeof(sysCfg.syslog_host));
sysCfg.syslog_port = (!strlen(webServer->arg("lp").c_str())) ? SYS_LOG_PORT : atoi(webServer->arg("lp").c_str());
sysCfg.tele_period = (!strlen(webServer->arg("lt").c_str())) ? TELE_PERIOD : atoi(webServer->arg("lt").c_str());
snprintf_P(log, sizeof(log), PSTR(D_LOG_LOG D_CMND_SERIALLOG " %d, " D_CMND_WEBLOG " %d, " D_CMND_SYSLOG " %d, " D_CMND_LOGHOST " %s, " D_CMND_LOGPORT " %d, " D_CMND_TELEPERIOD " %d"),
snprintf_P(log_data, sizeof(log_data), PSTR(D_LOG_LOG D_CMND_SERIALLOG " %d, " D_CMND_WEBLOG " %d, " D_CMND_SYSLOG " %d, " D_CMND_LOGHOST " %s, " D_CMND_LOGPORT " %d, " D_CMND_TELEPERIOD " %d"),
sysCfg.seriallog_level, sysCfg.weblog_level, sysCfg.syslog_level, sysCfg.syslog_host, sysCfg.syslog_port, sysCfg.tele_period);
addLog(LOG_LEVEL_INFO, log);
addLog(LOG_LEVEL_INFO);
break;
#ifdef USE_DOMOTICZ
case 4:
@ -1034,9 +1032,9 @@ void handleSave()
strlcpy(sysCfg.friendlyname[1], (!strlen(webServer->arg("a2").c_str())) ? FRIENDLY_NAME"2" : webServer->arg("a2").c_str(), sizeof(sysCfg.friendlyname[1]));
strlcpy(sysCfg.friendlyname[2], (!strlen(webServer->arg("a3").c_str())) ? FRIENDLY_NAME"3" : webServer->arg("a3").c_str(), sizeof(sysCfg.friendlyname[2]));
strlcpy(sysCfg.friendlyname[3], (!strlen(webServer->arg("a4").c_str())) ? FRIENDLY_NAME"4" : webServer->arg("a4").c_str(), sizeof(sysCfg.friendlyname[3]));
snprintf_P(log, sizeof(log), PSTR(D_LOG_OTHER D_MQTT_ENABLE " %s, " D_CMND_EMULATION " %d, " D_CMND_FRIENDLYNAME " %s, %s, %s, %s"),
snprintf_P(log_data, sizeof(log_data), PSTR(D_LOG_OTHER D_MQTT_ENABLE " %s, " D_CMND_EMULATION " %d, " D_CMND_FRIENDLYNAME " %s, %s, %s, %s"),
getStateText(sysCfg.flag.mqtt_enabled), sysCfg.flag.emulation, sysCfg.friendlyname[0], sysCfg.friendlyname[1], sysCfg.friendlyname[2], sysCfg.friendlyname[3]);
addLog(LOG_LEVEL_INFO, log);
addLog(LOG_LEVEL_INFO);
break;
case 6:
byte new_module = (!strlen(webServer->arg("g99").c_str())) ? MODULE : atoi(webServer->arg("g99").c_str());
@ -1056,8 +1054,8 @@ void handleSave()
}
}
snprintf_P(stemp, sizeof(stemp), modules[sysCfg.module].name);
snprintf_P(log, sizeof(log), PSTR(D_LOG_MODULE "%s " D_CMND_MODULE "%s"), stemp, gpios.c_str());
addLog(LOG_LEVEL_INFO, log);
snprintf_P(log_data, sizeof(log_data), PSTR(D_LOG_MODULE "%s " D_CMND_MODULE "%s"), stemp, gpios.c_str());
addLog(LOG_LEVEL_INFO);
break;
}
@ -1088,7 +1086,7 @@ void handleReset()
return;
}
char svalue[16]; // was MESSZ
char svalue[16];
addLog_P(LOG_LEVEL_DEBUG, S_LOG_HTTP, S_RESET_CONFIGURATION);
@ -1147,7 +1145,7 @@ void handleUpgradeStart()
if (httpUser()) {
return;
}
char svalue[100]; // was MESSZ
char svalue[100];
addLog_P(LOG_LEVEL_DEBUG, PSTR(D_LOG_HTTP D_UPGRADE_STARTED));
WIFI_configCounter();
@ -1176,7 +1174,6 @@ void handleUploadDone()
addLog_P(LOG_LEVEL_DEBUG, PSTR(D_LOG_HTTP D_UPLOAD_DONE));
char error[100];
char log[LOGSZ];
WIFI_configCounter();
restartflag = 0;
@ -1201,8 +1198,8 @@ void handleUploadDone()
snprintf_P(error, sizeof(error), PSTR(D_UPLOAD_ERROR_CODE " %d"), _uploaderror);
}
page += error;
snprintf_P(log, sizeof(log), PSTR(D_UPLOAD ": %s"), error);
addLog(LOG_LEVEL_DEBUG, log);
snprintf_P(log_data, sizeof(log_data), PSTR(D_UPLOAD ": %s"), error);
addLog(LOG_LEVEL_DEBUG);
stop_flash_rotate = sysCfg.flag.stop_flash_rotate;
} else {
page += F("green'>" D_SUCCESSFUL "</font></b><br/>");
@ -1217,7 +1214,6 @@ void handleUploadDone()
void handleUploadLoop()
{
// Based on ESP8266HTTPUpdateServer.cpp uses ESP8266WebServer Parsing.cpp and Cores Updater.cpp (Update)
char log[LOGSZ];
boolean _serialoutput = (LOG_LEVEL_DEBUG <= seriallog_level);
if (HTTP_USER == _httpflag) {
@ -1239,8 +1235,8 @@ void handleUploadLoop()
return;
}
CFG_Save(1); // Free flash for upload
snprintf_P(log, sizeof(log), PSTR(D_LOG_UPLOAD D_FILE " %s ..."), upload.filename.c_str());
addLog(LOG_LEVEL_INFO, log);
snprintf_P(log_data, sizeof(log_data), PSTR(D_LOG_UPLOAD D_FILE " %s ..."), upload.filename.c_str());
addLog(LOG_LEVEL_INFO);
if (!_uploadfiletype) {
mqttcounter = 60;
#ifdef USE_EMULATION
@ -1319,8 +1315,8 @@ void handleUploadLoop()
}
}
if (!_uploaderror) {
snprintf_P(log, sizeof(log), PSTR(D_LOG_UPLOAD D_SUCCESSFUL " %u bytes. " D_RESTARTING), upload.totalSize);
addLog(LOG_LEVEL_INFO, log);
snprintf_P(log_data, sizeof(log_data), PSTR(D_LOG_UPLOAD D_SUCCESSFUL " %u bytes. " D_RESTARTING), upload.totalSize);
addLog(LOG_LEVEL_INFO);
}
} else if (UPLOAD_FILE_ABORTED == upload.status) {
restartflag = 0;
@ -1353,12 +1349,11 @@ void handleCmnd()
if (valid) {
byte curridx = logidx;
if (strlen(webServer->arg("cmnd").c_str())) {
// snprintf_P(svalue, sizeof(svalue), webServer->arg("cmnd").c_str());
snprintf_P(svalue, sizeof(svalue), PSTR("%s"), webServer->arg("cmnd").c_str());
byte syslog_now = syslog_level;
syslog_level = 0; // Disable UDP syslog to not trigger hardware WDT
snprintf_P(svalue, sizeof(svalue), webServer->arg("cmnd").c_str());
// byte syslog_now = syslog_level;
// syslog_level = 0; // Disable UDP syslog to not trigger hardware WDT - Seems to work fine since 5.7.1d (global logging)
do_cmnd(svalue);
syslog_level = syslog_now;
// syslog_level = syslog_now;
}
if (logidx != curridx) {
@ -1413,19 +1408,18 @@ void handleAjax()
if (httpUser()) {
return;
}
char log[LOGSZ];
char svalue[INPUT_BUFFER_SIZE]; // big to serve Backlog
byte cflg = 1;
byte counter = 99;
if (strlen(webServer->arg("c1").c_str())) {
snprintf_P(svalue, sizeof(svalue), PSTR("%s"), webServer->arg("c1").c_str());
snprintf_P(log, sizeof(log), PSTR(D_LOG_COMMAND "%s"), svalue);
addLog(LOG_LEVEL_INFO, log);
byte syslog_now = syslog_level;
syslog_level = 0; // Disable UDP syslog to not trigger hardware WDT
snprintf_P(svalue, sizeof(svalue), webServer->arg("c1").c_str());
snprintf_P(log_data, sizeof(log_data), PSTR(D_LOG_COMMAND "%s"), svalue);
addLog(LOG_LEVEL_INFO);
// byte syslog_now = syslog_level;
// syslog_level = 0; // Disable UDP syslog to not trigger hardware WDT - Seems to work fine since 5.7.1d (global logging)
do_cmnd(svalue);
syslog_level = syslog_now;
// syslog_level = syslog_now;
}
if (strlen(webServer->arg("c2").c_str())) {

View File

@ -49,25 +49,18 @@ byte domoticz_update_flag = 1;
void mqtt_publishDomoticzPowerState(byte device)
{
char svalue[64]; // was MESSZ
if (sysCfg.flag.mqtt_enabled && sysCfg.domoticz_relay_idx[device -1]) {
if ((device < 1) || (device > Maxdevice)) {
device = 1;
}
if (sfl_flg) {
snprintf_P(svalue, sizeof(svalue), PSTR("{\"idx\":%d,\"nvalue\":2,\"svalue\":\"%d\"}"),
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("{\"idx\":%d,\"nvalue\":2,\"svalue\":\"%d\"}"),
sysCfg.domoticz_relay_idx[device -1], sysCfg.led_dimmer[device -1]);
mqtt_publish(domoticz_in_topic, svalue);
mqtt_publish(domoticz_in_topic);
}
else if ((Maxdevice == device) && (pin[GPIO_WS2812] < 99)) {
snprintf_P(svalue, sizeof(svalue), PSTR("{\"idx\":%d,\"nvalue\":2,\"svalue\":\"%d\"}"),
sysCfg.domoticz_relay_idx[device -1], sysCfg.ws_dimmer);
mqtt_publish(domoticz_in_topic, svalue);
}
snprintf_P(svalue, sizeof(svalue), PSTR("{\"idx\":%d,\"nvalue\":%d,\"svalue\":\"\"}"),
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("{\"idx\":%d,\"nvalue\":%d,\"svalue\":\"\"}"),
sysCfg.domoticz_relay_idx[device -1], (power & (0x01 << (device -1))) ? 1 : 0);
mqtt_publish(domoticz_in_topic, svalue);
mqtt_publish(domoticz_in_topic);
}
}
@ -136,7 +129,6 @@ boolean domoticz_update()
boolean domoticz_mqttData(char *topicBuf, uint16_t stopicBuf, char *dataBuf, uint16_t sdataBuf)
{
char log[LOGSZ];
char stemp1[10];
char scommand[10];
unsigned long idx = 0;
@ -159,8 +151,8 @@ boolean domoticz_mqttData(char *topicBuf, uint16_t stopicBuf, char *dataBuf, uin
idx = domoticz["idx"];
nvalue = domoticz["nvalue"];
snprintf_P(log, sizeof(log), PSTR(D_LOG_DOMOTICZ "idx %d, nvalue %d"), idx, nvalue);
addLog(LOG_LEVEL_DEBUG_MORE, log);
snprintf_P(log_data, sizeof(log_data), PSTR(D_LOG_DOMOTICZ "idx %d, nvalue %d"), idx, nvalue);
addLog(LOG_LEVEL_DEBUG_MORE);
if (nvalue >= 0 && nvalue <= 2) {
for (byte i = 0; i < Maxdevice; i++) {
@ -168,9 +160,6 @@ boolean domoticz_mqttData(char *topicBuf, uint16_t stopicBuf, char *dataBuf, uin
snprintf_P(stemp1, sizeof(stemp1), PSTR("%d"), i +1);
if (2 == nvalue) {
nvalue = domoticz["svalue1"];
if ((pin[GPIO_WS2812] < 99) && (sysCfg.ws_dimmer == nvalue)) {
return 1;
}
if (sfl_flg && (sysCfg.led_dimmer[i] == nvalue)) {
return 1;
}
@ -193,8 +182,8 @@ boolean domoticz_mqttData(char *topicBuf, uint16_t stopicBuf, char *dataBuf, uin
return 1;
}
snprintf_P(log, sizeof(log), PSTR(D_LOG_DOMOTICZ D_RECEIVED_TOPIC " %s, " D_DATA " %s"), topicBuf, dataBuf);
addLog(LOG_LEVEL_DEBUG_MORE, log);
snprintf_P(log_data, sizeof(log_data), PSTR(D_LOG_DOMOTICZ D_RECEIVED_TOPIC " %s, " D_DATA " %s"), topicBuf, dataBuf);
addLog(LOG_LEVEL_DEBUG_MORE);
domoticz_update_flag = 0;
}
@ -205,7 +194,7 @@ boolean domoticz_mqttData(char *topicBuf, uint16_t stopicBuf, char *dataBuf, uin
* Commands
\*********************************************************************************************/
boolean domoticz_command(const char *type, uint16_t index, char *dataBuf, uint16_t data_len, int16_t payload, char *svalue, uint16_t ssvalue)
boolean domoticz_command(const char *type, uint16_t index, char *dataBuf, uint16_t data_len, int16_t payload)
{
boolean serviced = true;
uint8_t dmtcz_len = strlen(D_CMND_DOMOTICZ); // Prep for string length change
@ -216,31 +205,31 @@ boolean domoticz_command(const char *type, uint16_t index, char *dataBuf, uint16
sysCfg.domoticz_relay_idx[index -1] = payload;
restartflag = 2;
}
snprintf_P(svalue, ssvalue, PSTR("{\"" D_CMND_DOMOTICZ D_CMND_IDX "%d\":%d}"), index, sysCfg.domoticz_relay_idx[index -1]);
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("{\"" D_CMND_DOMOTICZ D_CMND_IDX "%d\":%d}"), index, sysCfg.domoticz_relay_idx[index -1]);
}
else if (!strcasecmp_P(type +dmtcz_len, PSTR(D_CMND_KEYIDX)) && (index > 0) && (index <= Maxdevice)) {
if (payload >= 0) {
sysCfg.domoticz_key_idx[index -1] = payload;
}
snprintf_P(svalue, ssvalue, PSTR("{\"" D_CMND_DOMOTICZ D_CMND_KEYIDX "%d\":%d}"), index, sysCfg.domoticz_key_idx[index -1]);
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("{\"" D_CMND_DOMOTICZ D_CMND_KEYIDX "%d\":%d}"), index, sysCfg.domoticz_key_idx[index -1]);
}
else if (!strcasecmp_P(type +dmtcz_len, PSTR(D_CMND_SWITCHIDX)) && (index > 0) && (index <= Maxdevice)) {
if (payload >= 0) {
sysCfg.domoticz_switch_idx[index -1] = payload;
}
snprintf_P(svalue, ssvalue, PSTR("{\"" D_CMND_DOMOTICZ D_CMND_SWITCHIDX "%d\":%d}"), index, sysCfg.domoticz_key_idx[index -1]);
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("{\"" D_CMND_DOMOTICZ D_CMND_SWITCHIDX "%d\":%d}"), index, sysCfg.domoticz_key_idx[index -1]);
}
else if (!strcasecmp_P(type +dmtcz_len, PSTR(D_CMND_SENSORIDX)) && (index > 0) && (index <= DOMOTICZ_MAX_SENSORS)) {
if (payload >= 0) {
sysCfg.domoticz_sensor_idx[index -1] = payload;
}
snprintf_P(svalue, ssvalue, PSTR("{\"" D_CMND_DOMOTICZ D_CMND_SENSORIDX "%d\":%d}"), index, sysCfg.domoticz_sensor_idx[index -1]);
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("{\"" D_CMND_DOMOTICZ D_CMND_SENSORIDX "%d\":%d}"), index, sysCfg.domoticz_sensor_idx[index -1]);
}
else if (!strcasecmp_P(type +dmtcz_len, PSTR(D_CMND_UPDATETIMER))) {
if ((payload >= 0) && (payload < 3601)) {
sysCfg.domoticz_update_timer = payload;
}
snprintf_P(svalue, ssvalue, PSTR("{\"" D_CMND_DOMOTICZ D_CMND_UPDATETIMER "\":%d}"), sysCfg.domoticz_update_timer);
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("{\"" D_CMND_DOMOTICZ D_CMND_UPDATETIMER "\":%d}"), sysCfg.domoticz_update_timer);
}
else serviced = false;
}
@ -251,11 +240,9 @@ boolean domoticz_command(const char *type, uint16_t index, char *dataBuf, uint16
boolean domoticz_button(byte key, byte device, byte state, byte svalflg)
{
if ((sysCfg.domoticz_key_idx[device -1] || sysCfg.domoticz_switch_idx[device -1]) && (svalflg)) {
char svalue[80]; // was MESSZ
snprintf_P(svalue, sizeof(svalue), PSTR("{\"command\":\"switchlight\",\"idx\":%d,\"switchcmd\":\"%s\"}"),
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("{\"command\":\"switchlight\",\"idx\":%d,\"switchcmd\":\"%s\"}"),
(key) ? sysCfg.domoticz_switch_idx[device -1] : sysCfg.domoticz_key_idx[device -1], (state) ? (2 == state) ? "Toggle" : "On" : "Off");
mqtt_publish(domoticz_in_topic, svalue);
mqtt_publish(domoticz_in_topic);
return 1;
} else {
return 0;
@ -274,12 +261,14 @@ uint8_t dom_hum_stat(char *hum)
void dom_sensor(byte idx, char *data)
{
char dmess[64];
if (sysCfg.domoticz_sensor_idx[idx]) {
snprintf_P(dmess, sizeof(dmess), PSTR("{\"idx\":%d,\"nvalue\":0,\"svalue\":\"%s\"}"),
char dmess[64];
memcpy(dmess, mqtt_data, sizeof(dmess));
snprintf_P(mqtt_data, sizeof(dmess), PSTR("{\"idx\":%d,\"nvalue\":0,\"svalue\":\"%s\"}"),
sysCfg.domoticz_sensor_idx[idx], data);
mqtt_publish(domoticz_in_topic, dmess);
mqtt_publish(domoticz_in_topic);
memcpy(mqtt_data, dmess, sizeof(dmess));
}
}
@ -372,7 +361,7 @@ void handleDomoticz()
void domoticz_saveSettings()
{
char log[LOGSZ], stemp[20];
char stemp[20];
for (byte i = 0; i < 4; i++) {
snprintf_P(stemp, sizeof(stemp), PSTR("r%d"), i +1);
@ -387,16 +376,16 @@ void domoticz_saveSettings()
sysCfg.domoticz_sensor_idx[i] = (!strlen(webServer->arg(stemp).c_str())) ? 0 : atoi(webServer->arg(stemp).c_str());
}
sysCfg.domoticz_update_timer = (!strlen(webServer->arg("ut").c_str())) ? DOMOTICZ_UPDATE_TIMER : atoi(webServer->arg("ut").c_str());
snprintf_P(log, sizeof(log), PSTR(D_LOG_DOMOTICZ D_CMND_IDX " %d, %d, %d, %d, " D_CMND_UPDATETIMER " %d"),
snprintf_P(log_data, sizeof(log_data), PSTR(D_LOG_DOMOTICZ D_CMND_IDX " %d, %d, %d, %d, " D_CMND_UPDATETIMER " %d"),
sysCfg.domoticz_relay_idx[0], sysCfg.domoticz_relay_idx[1], sysCfg.domoticz_relay_idx[2], sysCfg.domoticz_relay_idx[3],
sysCfg.domoticz_update_timer);
addLog(LOG_LEVEL_INFO, log);
snprintf_P(log, sizeof(log), PSTR(D_LOG_DOMOTICZ D_CMND_KEYIDX " %d, %d, %d, %d, " D_CMND_SWITCHIDX " %d, %d, %d, %d, " D_CMND_SENSORIDX " %d, %d, %d, %d, %d, %d"),
addLog(LOG_LEVEL_INFO);
snprintf_P(log_data, sizeof(log_data), PSTR(D_LOG_DOMOTICZ D_CMND_KEYIDX " %d, %d, %d, %d, " D_CMND_SWITCHIDX " %d, %d, %d, %d, " D_CMND_SENSORIDX " %d, %d, %d, %d, %d, %d"),
sysCfg.domoticz_key_idx[0], sysCfg.domoticz_key_idx[1], sysCfg.domoticz_key_idx[2], sysCfg.domoticz_key_idx[3],
sysCfg.domoticz_switch_idx[0], sysCfg.domoticz_switch_idx[1], sysCfg.domoticz_switch_idx[2], sysCfg.domoticz_switch_idx[3],
sysCfg.domoticz_sensor_idx[0], sysCfg.domoticz_sensor_idx[1], sysCfg.domoticz_sensor_idx[2], sysCfg.domoticz_sensor_idx[3],
sysCfg.domoticz_sensor_idx[4], sysCfg.domoticz_sensor_idx[5]);
addLog(LOG_LEVEL_INFO, log);
addLog(LOG_LEVEL_INFO);
}
#endif // USE_WEBSERVER
#endif // USE_DOMOTICZ

View File

@ -68,7 +68,7 @@ void ir_send_init(void)
{ "Vendor": "<Toshiba|Mitsubishi>", "Power": <0|1>, "Mode": "<Hot|Cold|Dry|Auto>", "FanSpeed": "<1|2|3|4|5|Auto|Silence>", "Temp": <17..30> }
*/
boolean ir_send_command(char *type, uint16_t index, char *dataBufUc, uint16_t data_len, int16_t payload, char *svalue, uint16_t ssvalue)
boolean ir_send_command(char *type, uint16_t index, char *dataBuf, uint16_t data_len, int16_t payload)
{
boolean serviced = true;
boolean error = false;
@ -82,67 +82,65 @@ boolean ir_send_command(char *type, uint16_t index, char *dataBufUc, uint16_t da
int HVAC_Temp = 21;
boolean HVAC_Power = true;
// char log[LOGSZ];
if (!strcasecmp_P(type, PSTR(D_CMND_IRSEND))) {
if (data_len) {
StaticJsonBuffer<128> jsonBuf;
JsonObject &ir_json = jsonBuf.parseObject(dataBufUc);
JsonObject &ir_json = jsonBuf.parseObject(dataBuf);
if (!ir_json.success()) {
snprintf_P(svalue, ssvalue, PSTR("{\"" D_CMND_IRSEND "\":\"" D_INVALID_JSON "\"}")); // JSON decode failed
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("{\"" D_CMND_IRSEND "\":\"" D_INVALID_JSON "\"}")); // JSON decode failed
} else {
snprintf_P(svalue, ssvalue, PSTR("{\"" D_CMND_IRSEND "\":\"" D_DONE "\"}"));
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("{\"" D_CMND_IRSEND "\":\"" D_DONE "\"}"));
protocol = ir_json[D_IRSEND_PROTOCOL];
bits = ir_json[D_IRSEND_BITS];
data = ir_json[D_IRSEND_DATA];
if (protocol && bits && data) {
if (!strcmp_P(protocol,PSTR("NEC"))) irsend->sendNEC(data, bits);
else if (!strcmp_P(protocol,PSTR("SONY"))) irsend->sendSony(data, bits);
else if (!strcmp_P(protocol,PSTR("RC5"))) irsend->sendRC5(data, bits);
else if (!strcmp_P(protocol,PSTR("RC6"))) irsend->sendRC6(data, bits);
else if (!strcmp_P(protocol,PSTR("DISH"))) irsend->sendDISH(data, bits);
else if (!strcmp_P(protocol,PSTR("JVC"))) irsend->sendJVC(data, bits, 1);
else if (!strcmp_P(protocol,PSTR("SAMSUNG"))) irsend->sendSAMSUNG(data, bits);
if (!strcasecmp_P(protocol, PSTR("NEC"))) irsend->sendNEC(data, bits);
else if (!strcasecmp_P(protocol, PSTR("SONY"))) irsend->sendSony(data, bits);
else if (!strcasecmp_P(protocol, PSTR("RC5"))) irsend->sendRC5(data, bits);
else if (!strcasecmp_P(protocol, PSTR("RC6"))) irsend->sendRC6(data, bits);
else if (!strcasecmp_P(protocol, PSTR("DISH"))) irsend->sendDISH(data, bits);
else if (!strcasecmp_P(protocol, PSTR("JVC"))) irsend->sendJVC(data, bits, 1);
else if (!strcasecmp_P(protocol, PSTR("SAMSUNG"))) irsend->sendSAMSUNG(data, bits);
else {
snprintf_P(svalue, ssvalue, PSTR("{\"" D_CMND_IRSEND "\":\"" D_PROTOCOL_NOT_SUPPORTED "\"}"));
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("{\"" D_CMND_IRSEND "\":\"" D_PROTOCOL_NOT_SUPPORTED "\"}"));
}
} else error = true;
}
} else error = true;
if (error) {
snprintf_P(svalue, ssvalue, PSTR("{\"" D_CMND_IRSEND "\":\"" D_NO D_IRSEND_PROTOCOL ", " D_IRSEND_BITS " " D_OR " " D_IRSEND_DATA "\"}"));
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("{\"" D_CMND_IRSEND "\":\"" D_NO D_IRSEND_PROTOCOL ", " D_IRSEND_BITS " " D_OR " " D_IRSEND_DATA "\"}"));
}
}
#ifdef USE_IR_HVAC
else if (!strcasecmp_P(type, PSTR(D_CMND_IRHVAC))) {
if (data_len) {
StaticJsonBuffer<164> jsonBufer;
JsonObject &root = jsonBufer.parseObject(dataBufUc);
JsonObject &root = jsonBufer.parseObject(dataBuf);
if (!root.success()) {
snprintf_P(svalue, ssvalue, PSTR("{\"" D_CMND_IRHVAC "\":\"" D_INVALID_JSON "\"}")); // JSON decode failed
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("{\"" D_CMND_IRHVAC "\":\"" D_INVALID_JSON "\"}")); // JSON decode failed
} else {
snprintf_P(svalue, ssvalue, PSTR("{\"" D_CMND_IRHVAC "\":\"" D_DONE "\"}"));
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("{\"" D_CMND_IRHVAC "\":\"" D_DONE "\"}"));
HVAC_Vendor = root[D_IRHVAC_VENDOR];
HVAC_Power = root[D_IRHVAC_POWER];
HVAC_Mode = root[D_IRHVAC_MODE];
HVAC_FanMode = root[D_IRHVAC_FANSPEED];
HVAC_Temp = root[D_IRHVAC_TEMP];
// snprintf_P(log, sizeof(log), PSTR("IRHVAC: Received Vendor %s, Power %d, Mode %s, FanSpeed %s, Temp %d"),
// snprintf_P(log_data, sizeof(log_data), PSTR("IRHVAC: Received Vendor %s, Power %d, Mode %s, FanSpeed %s, Temp %d"),
// HVAC_Vendor, HVAC_Power, HVAC_Mode, HVAC_FanMode, HVAC_Temp);
// addLog(LOG_LEVEL_DEBUG, log);
// addLog(LOG_LEVEL_DEBUG);
if (HVAC_Vendor == NULL || !strcmp_P(HVAC_Vendor,PSTR("TOSHIBA"))) {
if (HVAC_Vendor == NULL || !strcasecmp_P(HVAC_Vendor, PSTR("TOSHIBA"))) {
error = ir_hvac_toshiba(HVAC_Mode, HVAC_FanMode, HVAC_Power, HVAC_Temp);
}
else if (!strcmp_P(HVAC_Vendor,PSTR("MITSUBISHI"))) {
else if (!strcasecmp_P(HVAC_Vendor, PSTR("MITSUBISHI"))) {
error = ir_hvac_mitsubishi(HVAC_Mode, HVAC_FanMode, HVAC_Power, HVAC_Temp);
}
else error = true;
}
} else error = true;
if (error) {
snprintf_P(svalue, ssvalue, PSTR("{\"" D_CMND_IRHVAC "\":\"" D_WRONG D_IRHVAC_VENDOR ", " D_IRHVAC_MODE " " D_OR " " D_IRHVAC_FANSPEED "\"}"));
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("{\"" D_CMND_IRHVAC "\":\"" D_WRONG D_IRHVAC_VENDOR ", " D_IRHVAC_MODE " " D_OR " " D_IRHVAC_FANSPEED "\"}"));
}
}
#endif // USE_IR_HVAC
@ -165,7 +163,7 @@ boolean ir_hvac_toshiba(const char *HVAC_Mode, const char *HVAC_FanMode, boolean
if (HVAC_Mode == NULL) {
p = (char*)HVACMODE; // default HVAC_HOT
} else {
p = strchr(HVACMODE, HVAC_Mode[0]);
p = strchr(HVACMODE, toupper(HVAC_Mode[0]));
}
if (!p) {
return true;
@ -179,7 +177,7 @@ boolean ir_hvac_toshiba(const char *HVAC_Mode, const char *HVAC_FanMode, boolean
if (HVAC_FanMode == NULL) {
p = (char*)FANSPEED; // default FAN_SPEED_AUTO
} else {
p = strchr(FANSPEED, HVAC_FanMode[0]);
p = strchr(FANSPEED, toupper(HVAC_FanMode[0]));
}
if (!p) {
return true;
@ -246,14 +244,13 @@ boolean ir_hvac_mitsubishi(const char *HVAC_Mode,const char *HVAC_FanMode, boole
char *p;
char *token;
uint8_t mode;
char log[LOGSZ];
mitsubir->stateReset();
if (HVAC_Mode == NULL) {
p = (char*)HVACMODE; // default HVAC_HOT
} else {
p = strchr(HVACMODE, HVAC_Mode[0]);
p = strchr(HVACMODE, toupper(HVAC_Mode[0]));
}
if (!p) {
return true;
@ -266,7 +263,7 @@ boolean ir_hvac_mitsubishi(const char *HVAC_Mode,const char *HVAC_FanMode, boole
if (HVAC_FanMode == NULL) {
p = (char*)FANSPEED; // default FAN_SPEED_AUTO
} else {
p = strchr(FANSPEED, HVAC_FanMode[0]);
p = strchr(FANSPEED, toupper(HVAC_FanMode[0]));
}
if (!p) {
return true;
@ -278,9 +275,9 @@ boolean ir_hvac_mitsubishi(const char *HVAC_Mode,const char *HVAC_FanMode, boole
mitsubir->setVane(MITSUBISHI_AC_VANE_AUTO);
mitsubir->send();
// snprintf_P(log, sizeof(log), PSTR("IRHVAC: Mitsubishi Power %d, Mode %d, FanSpeed %d, Temp %d, VaneMode %d"),
// snprintf_P(log_data, sizeof(log_data), PSTR("IRHVAC: Mitsubishi Power %d, Mode %d, FanSpeed %d, Temp %d, VaneMode %d"),
// mitsubir->getPower(), mitsubir->getMode(), mitsubir->getFan(), mitsubir->getTemp(), mitsubir->getVane());
// addLog(LOG_LEVEL_DEBUG, log);
// addLog(LOG_LEVEL_DEBUG);
return false;
}

View File

@ -39,19 +39,18 @@ void sb_received()
uint16_t rhi = 0;
char svalue[90];
char rfkey[8];
char log[LOGSZ];
svalue[0] = '\0';
for (i = 0; i < SerialInByteCounter; i++) {
snprintf_P(svalue, sizeof(svalue), PSTR("%s%02X "), svalue, serialInBuf[i]);
}
snprintf_P(log, sizeof(log), PSTR(D_LOG_BRIDGE D_RECEIVED " %s"), svalue);
addLog(LOG_LEVEL_DEBUG, log);
snprintf_P(log_data, sizeof(log_data), PSTR(D_LOG_BRIDGE D_RECEIVED " %s"), svalue);
addLog(LOG_LEVEL_DEBUG);
if (0xA2 == serialInBuf[0]) { // Learn timeout
sfb_learnFlg = 0;
snprintf_P(svalue, sizeof(svalue), PSTR("{\"" D_CMND_RFKEY "%d\":\"" D_LEARN_FAILED "\"}"), sfb_learnKey);
mqtt_publish_topic_P(5, PSTR(D_CMND_RFKEY), svalue);
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("{\"" D_CMND_RFKEY "%d\":\"" D_LEARN_FAILED "\"}"), sfb_learnKey);
mqtt_publish_topic_P(5, PSTR(D_CMND_RFKEY));
}
else if (0xA3 == serialInBuf[0]) { // Learned A3 20 F8 01 18 03 3E 2E 1A 22 55
sfb_learnFlg = 0;
@ -61,11 +60,11 @@ void sb_received()
for (i = 0; i < 9; i++) {
sysCfg.sfb_code[sfb_learnKey][i] = serialInBuf[i +1];
}
snprintf_P(svalue, sizeof(svalue), PSTR("{\"" D_CMND_RFKEY "%d\":\"" D_LEARNED "\"}"), sfb_learnKey);
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("{\"" D_CMND_RFKEY "%d\":\"" D_LEARNED "\"}"), sfb_learnKey);
} else {
snprintf_P(svalue, sizeof(svalue), PSTR("{\"" D_CMND_RFKEY "%d\":\"" D_LEARN_FAILED "\"}"), sfb_learnKey);
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("{\"" D_CMND_RFKEY "%d\":\"" D_LEARN_FAILED "\"}"), sfb_learnKey);
}
mqtt_publish_topic_P(5, PSTR(D_CMND_RFKEY), svalue);
mqtt_publish_topic_P(5, PSTR(D_CMND_RFKEY));
}
else if (0xA4 == serialInBuf[0]) { // Received RF data A4 20 EE 01 18 03 3E 2E 1A 22 55
rsy = serialInBuf[1] << 8 | serialInBuf[2]; // Sync time in uSec
@ -87,9 +86,9 @@ void sb_received()
}
}
}
snprintf_P(svalue, sizeof(svalue), PSTR("{\"" D_RFRECEIVED "\":{\"" D_SYNC "\":%d, \"" D_LOW "\":%d, \"" D_HIGH "\":%d, \"" D_DATA "\":\"%06X\", \"" D_CMND_RFKEY "\":%s}}"),
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("{\"" D_RFRECEIVED "\":{\"" D_SYNC "\":%d, \"" D_LOW "\":%d, \"" D_HIGH "\":%d, \"" D_DATA "\":\"%06X\", \"" D_CMND_RFKEY "\":%s}}"),
rsy, rlo, rhi, rid, rfkey);
mqtt_publish_topic_P(6, PSTR(D_RFRECEIVED), svalue);
mqtt_publish_topic_P(6, PSTR(D_RFRECEIVED));
}
}
}
@ -155,7 +154,7 @@ void sb_learn(uint8_t key)
* Commands
\*********************************************************************************************/
boolean sb_command(char *type, uint16_t index, char *dataBuf, uint16_t data_len, int16_t payload, char *svalue, uint16_t ssvalue)
boolean sb_command(char *type, uint16_t index, char *dataBuf, uint16_t data_len, int16_t payload)
{
boolean serviced = true;
char *p;
@ -170,28 +169,28 @@ boolean sb_command(char *type, uint16_t index, char *dataBuf, uint16_t data_len,
sysCfg.sfb_code[0][7] = lsb;
}
}
snprintf_P(svalue, ssvalue, PSTR("{\"" D_CMND_RFDEFAULT "\":\"%0X%0X\"}"), sysCfg.sfb_code[0][6], sysCfg.sfb_code[0][7]);
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("{\"" D_CMND_RFDEFAULT "\":\"%0X%0X\"}"), sysCfg.sfb_code[0][6], sysCfg.sfb_code[0][7]);
}
else if (!strcasecmp_P(type, PSTR(D_CMND_RFKEY)) && (index > 0) && (index <= 16)) {
if (!sfb_learnFlg) {
if (2 == payload) {
sb_learn(index);
snprintf_P(svalue, ssvalue, PSTR("{\"" D_CMND_RFKEY "%d\":\"" D_START_LEARNING "\"}"), index);
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("{\"" D_CMND_RFKEY "%d\":\"" D_START_LEARNING "\"}"), index);
}
else if (3 == payload) {
sysCfg.sfb_code[index][0] = 0;
snprintf_P(svalue, ssvalue, PSTR("{\"" D_CMND_RFKEY "%d\":\"" D_SET_TO_DEFAULT "\"}"), index);
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("{\"" D_CMND_RFKEY "%d\":\"" D_SET_TO_DEFAULT "\"}"), index);
} else {
if ((1 == payload) || (0 == sysCfg.sfb_code[index][0])) {
sb_send(0, index);
snprintf_P(svalue, ssvalue, PSTR("{\"" D_CMND_RFKEY "%d\":\"" D_DEFAULT_SENT "\"}"), index);
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("{\"" D_CMND_RFKEY "%d\":\"" D_DEFAULT_SENT "\"}"), index);
} else {
sb_send(index, 0);
snprintf_P(svalue, ssvalue, PSTR("{\"" D_CMND_RFKEY "%d\":\"" D_LEARNED_SENT "\"}"), index);
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("{\"" D_CMND_RFKEY "%d\":\"" D_LEARNED_SENT "\"}"), index);
}
}
} else {
snprintf_P(svalue, ssvalue, PSTR("{\"" D_CMND_RFKEY "%d\":\"" D_LEARNING_ACTIVE "\"}"), sfb_learnKey);
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("{\"" D_CMND_RFKEY "%d\":\"" D_LEARNING_ACTIVE "\"}"), sfb_learnKey);
}
}
else {

View File

@ -1,5 +1,5 @@
/*
xdrv_snfled.ino - sonoff led support for Sonoff-Tasmota
xdrv_snfled.ino - WS2812 and sonoff led support for Sonoff-Tasmota
Copyright (C) 2017 Theo Arends
@ -18,44 +18,59 @@
*/
/*********************************************************************************************\
* Sonoff B1, AiLight, Sonoff Led and BN-SZ01
* WS2812, Sonoff B1, AiLight, Sonoff Led and BN-SZ01
*
* sfl_flg Module Color ColorTemp
* 1 Sonoff BN-SZ W no
* 2 Sonoff Led CW yes
* 3 not used
* 3 +WS2812 RGB no
* 4 AiLight RGBW no
* 5 Sonoff B1 RGBCW yes
*
* led_scheme WS2812 Others Effect
* 0 yes yes Color On/Off
* 1 yes yes Wakeup light
* 2 yes no Clock
* 3 yes no Incandescent
* 4 yes no RGB
* 5 yes no Christmas
* 6 yes no Hanukkah
* 7 yes no Kwanzaa
* 8 yes no Rainbow
* 9 yes no Fire
*
\*********************************************************************************************/
uint8_t ledTable[] = {
0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 4, 4,
4, 4, 4, 5, 5, 5, 5, 6, 6, 6, 6, 7, 7, 7, 7, 8,
8, 8, 9, 9, 9, 10, 10, 10, 11, 11, 12, 12, 12, 13, 13, 14,
14, 15, 15, 15, 16, 16, 17, 17, 18, 18, 19, 19, 20, 20, 21, 22,
22, 23, 23, 24, 25, 25, 26, 26, 27, 28, 28, 29, 30, 30, 31, 32,
33, 33, 34, 35, 36, 36, 37, 38, 39, 40, 40, 41, 42, 43, 44, 45,
46, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60,
61, 62, 63, 64, 65, 67, 68, 69, 70, 71, 72, 73, 75, 76, 77, 78,
80, 81, 82, 83, 85, 86, 87, 89, 90, 91, 93, 94, 95, 97, 98, 99,
101,102,104,105,107,108,110,111,113,114,116,117,119,121,122,124,
125,127,129,130,132,134,135,137,139,141,142,144,146,148,150,151,
153,155,157,159,161,163,165,166,168,170,172,174,176,178,180,182,
184,186,189,191,193,195,197,199,201,204,206,208,210,212,215,217,
219,221,224,226,228,231,233,235,238,240,243,245,248,250,253,255 };
0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 4, 4,
4, 4, 4, 5, 5, 5, 5, 6, 6, 6, 6, 7, 7, 7, 7, 8,
8, 8, 9, 9, 9, 10, 10, 10, 11, 11, 12, 12, 12, 13, 13, 14,
14, 15, 15, 15, 16, 16, 17, 17, 18, 18, 19, 19, 20, 20, 21, 22,
22, 23, 23, 24, 25, 25, 26, 26, 27, 28, 28, 29, 30, 30, 31, 32,
33, 33, 34, 35, 36, 36, 37, 38, 39, 40, 40, 41, 42, 43, 44, 45,
46, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60,
61, 62, 63, 64, 65, 67, 68, 69, 70, 71, 72, 73, 75, 76, 77, 78,
80, 81, 82, 83, 85, 86, 87, 89, 90, 91, 93, 94, 95, 97, 98, 99,
101,102,104,105,107,108,110,111,113,114,116,117,119,121,122,124,
125,127,129,130,132,134,135,137,139,141,142,144,146,148,150,151,
153,155,157,159,161,163,165,166,168,170,172,174,176,178,180,182,
184,186,189,191,193,195,197,199,201,204,206,208,210,212,215,217,
219,221,224,226,228,231,233,235,238,240,243,245,248,250,253,255 };
uint8_t sl_dcolor[5];
uint8_t sl_tcolor[5];
uint8_t sl_lcolor[5];
uint8_t sl_power;
uint8_t sl_any;
uint8_t sl_power = 0;
uint8_t sl_any = 0;
uint8_t sl_wakeupActive = 0;
uint8_t sl_wakeupDimmer = 0;
uint16_t sl_wakeupCntr = 0;
unsigned long stripTimerCntr = 0; // Bars and Gradient
/*********************************************************************************************\
* Sonoff B1 and AiLight inspired by OpenLight https://github.com/icamgo/noduino-sdk
\*********************************************************************************************/
@ -139,8 +154,7 @@ void sl_my92x1_duty(uint8_t duty_r, uint8_t duty_g, uint8_t duty_b, uint8_t duty
void sl_init(void)
{
pin[GPIO_WS2812] = 99; // I do not allow both Sonoff Led AND WS2812 led
if (sfl_flg < 4) {
if (sfl_flg < 3) {
if (!my_module.gp.io[4]) {
pinMode(4, OUTPUT); // Stop floating outputs
digitalWrite(4, LOW);
@ -157,7 +171,17 @@ void sl_init(void)
if (2 == sfl_flg) {
sysCfg.pwmvalue[1] = 0; // We use led_color
}
} else {
sysCfg.led_scheme = 0;
}
#ifdef USE_WS2812 // ************************************************************************
else if (3 == sfl_flg) {
ws2812_init();
if (1 == sysCfg.led_scheme) {
sysCfg.led_scheme = 0;
}
}
#endif // USE_WS2812 ************************************************************************
else {
sl_pdi = pin[GPIO_DI];
sl_pdcki = pin[GPIO_DCKI];
@ -167,6 +191,7 @@ void sl_init(void)
digitalWrite(sl_pdcki, LOW);
sl_my92x1_init();
sysCfg.led_scheme = 0;
}
sl_power = 0;
@ -257,113 +282,138 @@ char* sl_getColor(char* scolor)
return scolor;
}
void sl_prepPower(char *svalue, uint16_t ssvalue)
void sl_prepPower()
{
char scolor[11];
// do_cmnd_power(index, (sysCfg.led_dimmer[0]>0));
if (sysCfg.led_dimmer[0] && !(power&1)) {
do_cmnd_power(1, 7); // No publishPowerState
if (sysCfg.led_dimmer[0] && !(sl_power)) {
do_cmnd_power(Maxdevice, 7); // No publishPowerState
}
else if (!sysCfg.led_dimmer[0] && (power&1)) {
do_cmnd_power(1, 6); // No publishPowerState
else if (!sysCfg.led_dimmer[0] && sl_power) {
do_cmnd_power(Maxdevice, 6); // No publishPowerState
}
#ifdef USE_DOMOTICZ
mqtt_publishDomoticzPowerState(1);
// mqtt_publishDomoticzPowerState(1);
domoticz_updatePowerState(Maxdevice);
#endif // USE_DOMOTICZ
if (sfl_flg > 1) {
snprintf_P(svalue, ssvalue, PSTR("{\"" D_RSLT_POWER "\":\"%s\", \"" D_CMND_DIMMER "\":%d, \"" D_CMND_COLOR "\":\"%s\"}"),
getStateText(power &1), sysCfg.led_dimmer[0], sl_getColor(scolor));
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("{\"" D_RSLT_POWER "\":\"%s\", \"" D_CMND_DIMMER "\":%d, \"" D_CMND_COLOR "\":\"%s\"}"),
getStateText(sl_power), sysCfg.led_dimmer[0], sl_getColor(scolor));
} else {
snprintf_P(svalue, ssvalue, PSTR("{\"" D_RSLT_POWER "\":\"%s\", \"" D_CMND_DIMMER "\":%d}"),
getStateText(power &1), sysCfg.led_dimmer[0]);
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("{\"" D_RSLT_POWER "\":\"%s\", \"" D_CMND_DIMMER "\":%d}"),
getStateText(sl_power), sysCfg.led_dimmer[0]);
}
}
void sl_setPower(uint8_t power)
void sl_setPower(uint8_t mpower)
{
sl_power = power &1;
sl_power = ((mpower & (0x01 << (Maxdevice -1))) != 0);
if (sl_wakeupActive) {
sl_wakeupActive--;
}
if (sl_power) {
sl_any = 1;
}
sl_animate();
}
void sl_animate()
{
// {"Wakeup":"Done"}
char svalue[32]; // was MESSZ
uint8_t fadeValue;
uint8_t cur_col[5];
if (0 == sl_power) { // Power Off
stripTimerCntr++;
if (!sl_power) { // Power Off
sleep = sysCfg.sleep;
stripTimerCntr = 0;
for (byte i = 0; i < sfl_flg; i++) {
sl_tcolor[i] = 0;
}
}
else {
if (!sl_wakeupActive) { // Power On
sl_setDim(sysCfg.led_dimmer[0]);
if (0 == sysCfg.led_fade) {
for (byte i = 0; i < sfl_flg; i++) {
sl_tcolor[i] = sl_dcolor[i];
}
} else {
for (byte i = 0; i < sfl_flg; i++) {
if (sl_tcolor[i] != sl_dcolor[i]) {
if (sl_tcolor[i] < sl_dcolor[i]) {
sl_tcolor[i] += ((sl_dcolor[i] - sl_tcolor[i]) >> sysCfg.led_speed) +1;
}
if (sl_tcolor[i] > sl_dcolor[i]) {
sl_tcolor[i] -= ((sl_tcolor[i] - sl_dcolor[i]) >> sysCfg.led_speed) +1;
}
}
}
}
} else { // Power On using wake up duration
if (2 == sl_wakeupActive) {
sl_wakeupActive = 1;
for (byte i = 0; i < sfl_flg; i++) {
sl_tcolor[i] = 0;
}
sl_wakeupCntr = 0;
sl_wakeupDimmer = 0;
}
sl_wakeupCntr++;
if (sl_wakeupCntr > ((sysCfg.led_wakeup * STATES) / sysCfg.led_dimmer[0])) {
sl_wakeupCntr = 0;
sl_wakeupDimmer++;
if (sl_wakeupDimmer <= sysCfg.led_dimmer[0]) {
sl_setDim(sl_wakeupDimmer);
sleep = 0;
switch (sysCfg.led_scheme) {
case 0: // Power On
sl_setDim(sysCfg.led_dimmer[0]); // Power On
if (0 == sysCfg.led_fade) {
for (byte i = 0; i < sfl_flg; i++) {
sl_tcolor[i] = sl_dcolor[i];
}
} else {
snprintf_P(svalue, sizeof(svalue), PSTR("{\"" D_CMND_WAKEUP "\":\"" D_DONE "\"}"));
mqtt_publish_topic_P(2, PSTR(D_CMND_WAKEUP), svalue);
sl_wakeupActive = 0;
for (byte i = 0; i < sfl_flg; i++) {
if (sl_tcolor[i] != sl_dcolor[i]) {
if (sl_tcolor[i] < sl_dcolor[i]) {
sl_tcolor[i] += ((sl_dcolor[i] - sl_tcolor[i]) >> sysCfg.led_speed) +1;
}
if (sl_tcolor[i] > sl_dcolor[i]) {
sl_tcolor[i] -= ((sl_tcolor[i] - sl_dcolor[i]) >> sysCfg.led_speed) +1;
}
}
}
}
}
break;
case 1: // Power On using wake up duration
if (2 == sl_wakeupActive) {
sl_wakeupActive = 1;
for (byte i = 0; i < sfl_flg; i++) {
sl_tcolor[i] = 0;
}
sl_wakeupCntr = 0;
sl_wakeupDimmer = 0;
}
sl_wakeupCntr++;
if (sl_wakeupCntr > ((sysCfg.led_wakeup * STATES) / sysCfg.led_dimmer[0])) {
sl_wakeupCntr = 0;
sl_wakeupDimmer++;
if (sl_wakeupDimmer <= sysCfg.led_dimmer[0]) {
sl_setDim(sl_wakeupDimmer);
for (byte i = 0; i < sfl_flg; i++) {
sl_tcolor[i] = sl_dcolor[i];
}
} else {
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("{\"" D_CMND_WAKEUP "\":\"" D_DONE "\"}"));
mqtt_publish_topic_P(2, PSTR(D_CMND_WAKEUP));
sl_wakeupActive = 0;
sysCfg.led_scheme = 0;
}
}
break;
#ifdef USE_WS2812 // ************************************************************************
default:
if (3 == sfl_flg) {
ws2812_showScheme(sysCfg.led_scheme -2);
}
#endif // USE_WS2812 ************************************************************************
}
}
for (byte i = 0; i < sfl_flg; i++) {
if (sl_lcolor[i] != sl_tcolor[i]) {
sl_any = 1;
}
}
if (sl_any) {
sl_any = 0;
if ((sysCfg.led_scheme < 2) || !sl_power) {
for (byte i = 0; i < sfl_flg; i++) {
sl_lcolor[i] = sl_tcolor[i];
cur_col[i] = (sysCfg.led_table) ? ledTable[sl_lcolor[i]] : sl_lcolor[i];
if (sfl_flg < 4) {
if (pin[GPIO_PWM1 +i] < 99) {
analogWrite(pin[GPIO_PWM1 +i], cur_col[i] * (PWM_RANGE / 255));
}
if (sl_lcolor[i] != sl_tcolor[i]) {
sl_any = 1;
}
}
if (sfl_flg > 3) {
sl_my92x1_duty(cur_col[0], cur_col[1], cur_col[2], cur_col[3], cur_col[4]);
if (sl_any) {
sl_any = 0;
for (byte i = 0; i < sfl_flg; i++) {
sl_lcolor[i] = sl_tcolor[i];
cur_col[i] = (sysCfg.led_table) ? ledTable[sl_lcolor[i]] : sl_lcolor[i];
if (sfl_flg < 3) {
if (pin[GPIO_PWM1 +i] < 99) {
analogWrite(pin[GPIO_PWM1 +i], cur_col[i] * (PWM_RANGE / 255));
}
}
}
#ifdef USE_WS2812 // ************************************************************************
if (3 == sfl_flg) {
ws2812_setColor(0, cur_col[0], cur_col[1], cur_col[2]);
}
#endif // USE_ES2812 ************************************************************************
if (sfl_flg > 3) {
sl_my92x1_duty(cur_col[0], cur_col[1], cur_col[2], cur_col[3], cur_col[4]);
}
}
}
}
@ -372,33 +422,114 @@ void sl_animate()
* Hue support
\*********************************************************************************************/
void sl_rgb2hsb(float *hue, float *sat, float *bri)
{
RgbColor dcolor;
float sl_Hue = 0.0;
float sl_Sat = 0.0;
float sl_Bri = 0.0;
void sl_rgb2hsb()
{
sl_setDim(sysCfg.led_dimmer[0]);
dcolor.R = sl_dcolor[0];
dcolor.G = sl_dcolor[1];
dcolor.B = sl_dcolor[2];
HsbColor hsb = HsbColor(dcolor);
*hue = hsb.H;
*sat = hsb.S;
*bri = hsb.B;
// convert colors to float between (0.0 - 1.0)
float r = sl_dcolor[0] / 255.0f;
float g = sl_dcolor[1] / 255.0f;
float b = sl_dcolor[2] / 255.0f;
float max = (r > g && r > b) ? r : (g > b) ? g : b;
float min = (r < g && r < b) ? r : (g < b) ? g : b;
float d = max - min;
sl_Hue = 0.0;
sl_Bri = max;
sl_Sat = (0.0f == sl_Bri) ? 0 : (d / sl_Bri);
if (d != 0.0f)
{
if (r == max) {
sl_Hue = (g - b) / d + (g < b ? 6.0f : 0.0f);
} else if (g == max) {
sl_Hue = (b - r) / d + 2.0f;
} else {
sl_Hue = (r - g) / d + 4.0f;
}
sl_Hue /= 6.0f;
}
}
void sl_hsb2rgb()
{
float r;
float g;
float b;
float h = sl_Hue;
float s = sl_Sat;
float v = sl_Bri;
if (0.0f == sl_Sat) {
r = g = b = v; // achromatic or black
} else {
if (h < 0.0f) {
h += 1.0f;
}
else if (h >= 1.0f) {
h -= 1.0f;
}
h *= 6.0f;
int i = (int)h;
float f = h - i;
float q = v * (1.0f - s * f);
float p = v * (1.0f - s);
float t = v * (1.0f - s * (1.0f - f));
switch (i) {
case 0:
r = v;
g = t;
b = p;
break;
case 1:
r = q;
g = v;
b = p;
break;
case 2:
r = p;
g = v;
b = t;
break;
case 3:
r = p;
g = q;
b = v;
break;
case 4:
r = t;
g = p;
b = v;
break;
default:
r = v;
g = p;
b = q;
break;
}
}
sl_dcolor[0] = (uint8_t)(r * 255.0f);
sl_dcolor[1] = (uint8_t)(g * 255.0f);
sl_dcolor[2] = (uint8_t)(b * 255.0f);
}
/********************************************************************************************/
void sl_replaceHSB(String *response)
{
float hue;
float sat;
float bri;
if (sfl_flg > 2) {
sl_rgb2hsb(&hue, &sat, &bri);
response->replace("{h}", String((uint16_t)(65535.0f * hue)));
response->replace("{s}", String((uint8_t)(254.0f * sat)));
response->replace("{b}", String((uint8_t)(254.0f * bri)));
sl_rgb2hsb();
response->replace("{h}", String((uint16_t)(65535.0f * sl_Hue)));
response->replace("{s}", String((uint8_t)(254.0f * sl_Sat)));
response->replace("{b}", String((uint8_t)(254.0f * sl_Bri)));
} else {
response->replace("{h}", "0");
response->replace("{s}", "0");
@ -410,7 +541,10 @@ void sl_replaceHSB(String *response)
void sl_getHSB(float *hue, float *sat, float *bri)
{
if (sfl_flg > 2) {
sl_rgb2hsb(hue, sat, bri);
sl_rgb2hsb();
*hue = sl_Hue;
*sat = sl_Sat;
*bri = sl_Bri;
} else {
*hue = 0;
*sat = 0;
@ -421,36 +555,29 @@ void sl_getHSB(float *hue, float *sat, float *bri)
void sl_setHSB(float hue, float sat, float bri, uint16_t ct)
{
char svalue[MESSZ];
HsbColor hsb;
/*
char log[LOGSZ];
char stemp1[10];
char stemp2[10];
char stemp3[10];
dtostrfi(hue, 3, stemp1);
dtostrfi(sat, 3, stemp2);
dtostrfi(bri, 3, stemp3);
snprintf_P(log, sizeof(log), PSTR("HUE: Set Hue %s, Sat %s, Bri %s, Ct %d"), stemp1, stemp2, stemp3, ct);
addLog(LOG_LEVEL_DEBUG, log);
snprintf_P(log_data, sizeof(log_data), PSTR("HUE: Set Hue %s, Sat %s, Bri %s, Ct %d"), stemp1, stemp2, stemp3, ct);
addLog(LOG_LEVEL_DEBUG);
*/
if (sfl_flg > 2) {
if ((5 == sfl_flg) && (ct > 0)) {
sl_setColorTemp(ct);
} else {
hsb.H = hue;
hsb.S = sat;
hsb.B = bri;
RgbColor tmp = RgbColor(hsb);
sl_dcolor[0] = tmp.R;
sl_dcolor[1] = tmp.G;
sl_dcolor[2] = tmp.B;
sl_Hue = hue;
sl_Sat = sat;
sl_Bri = bri;
sl_hsb2rgb();
sl_setColor();
}
sl_prepPower(svalue, sizeof(svalue));
mqtt_publish_topic_P(5, PSTR(D_CMND_COLOR), svalue);
sl_prepPower();
mqtt_publish_topic_P(5, PSTR(D_CMND_COLOR));
} else {
uint8_t tmp = (uint8_t)(bri * 100);
sysCfg.led_dimmer[0] = tmp;
@ -458,11 +585,11 @@ void sl_setHSB(float hue, float sat, float bri, uint16_t ct)
if (ct > 0) {
sl_setColorTemp(ct);
}
sl_prepPower(svalue, sizeof(svalue));
mqtt_publish_topic_P(5, PSTR(D_CMND_COLOR), svalue);
sl_prepPower();
mqtt_publish_topic_P(5, PSTR(D_CMND_COLOR));
} else {
sl_prepPower(svalue, sizeof(svalue));
mqtt_publish_topic_P(5, PSTR(D_CMND_DIMMER), svalue);
sl_prepPower();
mqtt_publish_topic_P(5, PSTR(D_CMND_DIMMER));
}
}
}
@ -471,7 +598,7 @@ void sl_setHSB(float hue, float sat, float bri, uint16_t ct)
* Commands
\*********************************************************************************************/
boolean sl_command(char *type, uint16_t index, char *dataBufUc, uint16_t data_len, int16_t payload, char *svalue, uint16_t ssvalue)
boolean sl_command(char *type, uint16_t index, char *dataBuf, uint16_t data_len, int16_t payload)
{
boolean serviced = true;
boolean coldim = false;
@ -479,27 +606,78 @@ boolean sl_command(char *type, uint16_t index, char *dataBufUc, uint16_t data_le
char *p;
if ((sfl_flg > 1) && !strcasecmp_P(type, PSTR(D_CMND_COLOR))) {
if (dataBufUc[0] == '#') {
dataBufUc++;
if (dataBuf[0] == '#') {
dataBuf++;
data_len--;
}
if ((2 * sfl_flg) == data_len) {
for (byte i = 0; i < sfl_flg; i++) {
strlcpy(scolor, dataBufUc + (i *2), 3);
strlcpy(scolor, dataBuf + (i *2), 3);
sl_dcolor[i] = (uint8_t)strtol(scolor, &p, 16);
}
sl_setColor();
coldim = true;
} else {
snprintf_P(svalue, ssvalue, PSTR("{\"" D_CMND_COLOR "\":\"%s\"}"), sl_getColor(scolor));
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("{\"" D_CMND_COLOR "\":\"%s\"}"), sl_getColor(scolor));
}
}
#ifdef USE_WS2812 // ***********************************************************************
else if ((3 == sfl_flg) && !strcasecmp_P(type, PSTR(D_CMND_LED)) && (index > 0) && (index <= sysCfg.led_pixels)) {
if (dataBuf[0] == '#') {
dataBuf++;
data_len--;
}
uint8_t sl_ledcolor[3];
if ((2 * sfl_flg) == data_len) {
for (byte i = 0; i < sfl_flg; i++) {
strlcpy(scolor, dataBuf + (i *2), 3);
sl_ledcolor[i] = (uint8_t)strtol(scolor, &p, 16);
}
ws2812_setColor(index, sl_ledcolor[0], sl_ledcolor[1], sl_ledcolor[2]);
}
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("{\"" D_CMND_LED "%d\":\"%s\"}"), index, ws2812_getColor(index, scolor));
}
else if ((3 == sfl_flg) && !strcasecmp_P(type, PSTR(D_CMND_PIXELS))) {
if ((payload > 0) && (payload <= WS2812_MAX_LEDS)) {
sysCfg.led_pixels = payload;
ws2812_clear();
sl_any = 1;
}
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("{\"" D_CMND_PIXELS "\":%d}"), sysCfg.led_pixels);
}
else if ((3 == sfl_flg) && !strcasecmp_P(type, PSTR(D_CMND_WIDTH))) {
if ((payload >= 0) && (payload <= 4)) {
sysCfg.led_width = payload;
}
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("{\"" D_CMND_WIDTH "\":%d}"), sysCfg.led_width);
}
else if ((3 == sfl_flg) && !strcasecmp_P(type, PSTR(D_CMND_SCHEME))) {
if ((payload >= 0) && (payload <= 9)) {
sysCfg.led_scheme = payload;
if (1 == sysCfg.led_scheme) {
sl_wakeupActive = 3;
}
do_cmnd_power(Maxdevice, 1);
stripTimerCntr = 0;
}
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("{\"" D_CMND_SCHEME "\":%d}"), sysCfg.led_scheme);
}
#endif // USE_WS2812 ************************************************************************
else if (!strcasecmp_P(type, PSTR(D_CMND_WAKEUP))) {
if ((payload >= 0) && (payload <= 100)) {
sysCfg.led_dimmer[0] = payload;
}
sl_wakeupActive = 3;
sysCfg.led_scheme = 1;
do_cmnd_power(Maxdevice, 1);
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("{\"" D_CMND_WAKEUP "\":\"" D_STARTED "\"}"));
}
else if (!strcasecmp_P(type, PSTR(D_CMND_COLORTEMPERATURE)) && ((2 == sfl_flg) || (5 == sfl_flg))) { // ColorTemp
if ((payload >= 153) && (payload <= 500)) { // https://developers.meethue.com/documentation/core-concepts
sl_setColorTemp(payload);
coldim = true;
} else {
snprintf_P(svalue, ssvalue, PSTR("{\"" D_CMND_COLORTEMPERATURE "\":%d}"), sl_getColorTemp());
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("{\"" D_CMND_COLORTEMPERATURE "\":%d}"), sl_getColorTemp());
}
}
else if (!strcasecmp_P(type, PSTR(D_CMND_DIMMER))) {
@ -507,7 +685,7 @@ boolean sl_command(char *type, uint16_t index, char *dataBufUc, uint16_t data_le
sysCfg.led_dimmer[0] = payload;
coldim = true;
} else {
snprintf_P(svalue, ssvalue, PSTR("{\"" D_CMND_DIMMER "\":%d}"), sysCfg.led_dimmer[0]);
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("{\"" D_CMND_DIMMER "\":%d}"), sysCfg.led_dimmer[0]);
}
}
else if (!strcasecmp_P(type, PSTR(D_CMND_LEDTABLE))) {
@ -523,7 +701,7 @@ boolean sl_command(char *type, uint16_t index, char *dataBufUc, uint16_t data_le
}
sl_any = 1;
}
snprintf_P(svalue, ssvalue, PSTR("{\"" D_CMND_LEDTABLE "\":\"%s\"}"), getStateText(sysCfg.led_table));
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("{\"" D_CMND_LEDTABLE "\":\"%s\"}"), getStateText(sysCfg.led_table));
}
else if (!strcasecmp_P(type, PSTR(D_CMND_FADE))) {
switch (payload) {
@ -535,39 +713,34 @@ boolean sl_command(char *type, uint16_t index, char *dataBufUc, uint16_t data_le
sysCfg.led_fade ^= 1;
break;
}
snprintf_P(svalue, ssvalue, PSTR("{\"" D_CMND_FADE "\":\"%s\"}"), getStateText(sysCfg.led_fade));
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("{\"" D_CMND_FADE "\":\"%s\"}"), getStateText(sysCfg.led_fade));
}
else if (!strcasecmp_P(type, PSTR(D_CMND_SPEED))) { // 1 - fast, 8 - slow
if ((payload > 0) && (payload <= 8)) {
sysCfg.led_speed = payload;
}
snprintf_P(svalue, ssvalue, PSTR("{\"" D_CMND_SPEED "\":%d}"), sysCfg.led_speed);
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("{\"" D_CMND_SPEED "\":%d}"), sysCfg.led_speed);
}
else if (!strcasecmp_P(type, PSTR(D_CMND_WAKEUPDURATION))) {
if ((payload > 0) && (payload < 3001)) {
sysCfg.led_wakeup = payload;
sl_wakeupActive = 0;
}
snprintf_P(svalue, ssvalue, PSTR("{\"" D_CMND_WAKEUPDURATION "\":%d}"), sysCfg.led_wakeup);
}
else if (!strcasecmp_P(type, PSTR(D_CMND_WAKEUP))) {
sl_wakeupActive = 3;
do_cmnd_power(1, 1);
snprintf_P(svalue, ssvalue, PSTR("{\"" D_CMND_WAKEUP "\":\"" D_STARTED "\"}"));
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("{\"" D_CMND_WAKEUPDURATION "\":%d}"), sysCfg.led_wakeup);
}
else if (!strcasecmp_P(type, PSTR("UNDOCA"))) { // Theos legacy status
sl_getColor(scolor);
scolor[6] = '\0'; // RGB only
snprintf_P(svalue, ssvalue, PSTR("%s, %d, %d, 1, %d, 1"),
scolor, sysCfg.led_fade, sysCfg.led_table, sysCfg.led_speed);
mqtt_publish_topic_P(1, type, svalue);
svalue[0] = '\0';
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("%s, %d, %d, %d, %d, %d"),
scolor, sysCfg.led_fade, sysCfg.led_table, sysCfg.led_scheme, sysCfg.led_speed, sysCfg.led_width);
mqtt_publish_topic_P(1, type);
mqtt_data[0] = '\0';
}
else {
serviced = false; // Unknown command
}
if (coldim) {
sl_prepPower(svalue, ssvalue);
sl_prepPower();
}
return serviced;
}

View File

@ -55,11 +55,19 @@
uint16_t sc_value[5] = { 0 };
void sc_send(const char *data)
{
Serial.write(data);
Serial.write('\x1B');
snprintf_P(log_data, sizeof(log_data), PSTR(D_LOG_SERIAL D_TRANSMIT " %s"), data);
addLog(LOG_LEVEL_DEBUG);
}
void sc_init()
{
// Serial.write("AT+DEVCONFIG=\"uploadFreq\":1800\e");
Serial.write("AT+START\e");
// Serial.write("AT+STATUS\e");
// sc_send("AT+DEVCONFIG=\"uploadFreq\":1800");
sc_send("AT+START");
// sc_send("AT+STATUS");
}
void sc_rcvstat(char *rcvstat)
@ -68,7 +76,10 @@ void sc_rcvstat(char *rcvstat)
char *str;
uint16_t value[5] = { 0 };
if (!strncmp(rcvstat, "AT+UPDATE=", 10)) {
snprintf_P(log_data, sizeof(log_data), PSTR(D_LOG_SERIAL D_RECEIVED " %s"), rcvstat);
addLog(LOG_LEVEL_DEBUG);
if (!strncasecmp_P(rcvstat, PSTR("AT+UPDATE="), 10)) {
int8_t i = -1;
for (str = strtok_r(rcvstat, ":", &p); str && i < 5; str = strtok_r(NULL, ":", &p)) {
value[i++] = atoi(str);
@ -80,13 +91,13 @@ void sc_rcvstat(char *rcvstat)
sc_value[2] = (11 - sc_value[2]) * 10; // Invert light level
sc_value[3] *= 10;
sc_value[4] = (11 - sc_value[4]) * 10; // Invert dust level
Serial.write("AT+SEND=ok\e");
sc_send("AT+SEND=ok");
} else {
Serial.write("AT+SEND=fail\e");
sc_send("AT+SEND=fail");
}
}
else if (!strcmp_P(rcvstat,PSTR("AT+STATUS?"))) {
Serial.write("AT+STATUS=4\e");
else if (!strcasecmp_P(rcvstat, PSTR("AT+STATUS?"))) {
sc_send("AT+STATUS=4");
}
}
@ -94,12 +105,7 @@ void sc_rcvstat(char *rcvstat)
* Presentation
\*********************************************************************************************/
float sc_convertCtoF(float c)
{
return c * 1.8 + 32;
}
void sc_mqttPresent(char* svalue, uint16_t ssvalue, uint8_t* djson)
void sc_mqttPresent(uint8_t* djson)
{
if (sc_value[0] > 0) {
char stemp1[10];
@ -109,8 +115,8 @@ void sc_mqttPresent(char* svalue, uint16_t ssvalue, uint8_t* djson)
dtostrfd(t, sysCfg.flag.temperature_resolution, stemp1);
float h = sc_value[0];
dtostrfd(h, sysCfg.flag.humidity_resolution, stemp2);
snprintf_P(svalue, ssvalue, PSTR("%s, \"" D_TEMPERATURE "\":%s, \"" D_HUMIDITY "\":%s, \"" D_LIGHT "\":%d, \"" D_NOISE "\":%d, \"" D_AIRQUALITY "\":%d"),
svalue, stemp1, stemp2, sc_value[2], sc_value[3], sc_value[4]);
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("%s, \"" D_TEMPERATURE "\":%s, \"" D_HUMIDITY "\":%s, \"" D_LIGHT "\":%d, \"" D_NOISE "\":%d, \"" D_AIRQUALITY "\":%d"),
mqtt_data, stemp1, stemp2, sc_value[2], sc_value[3], sc_value[4]);
*djson = 1;
#ifdef USE_DOMOTICZ
domoticz_sensor2(stemp1, stemp2);

View File

@ -68,7 +68,6 @@ String wemo_UUID()
void wemo_respondToMSearch()
{
char message[TOPSZ];
char log[LOGSZ];
if (portUDP.beginPacket(portUDP.remoteIP(), portUDP.remotePort())) {
String response = FPSTR(WEMO_MSEARCH);
@ -80,9 +79,9 @@ void wemo_respondToMSearch()
} else {
snprintf_P(message, sizeof(message), PSTR(D_FAILED_TO_SEND_RESPONSE));
}
snprintf_P(log, sizeof(log), PSTR(D_LOG_UPNP D_WEMO " %s " D_TO " %s:%d"),
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());
addLog(LOG_LEVEL_DEBUG, log);
addLog(LOG_LEVEL_DEBUG);
}
/*********************************************************************************************\
@ -140,7 +139,6 @@ String hue_UUID()
void hue_respondToMSearch()
{
char message[TOPSZ];
char log[LOGSZ];
if (portUDP.beginPacket(portUDP.remoteIP(), portUDP.remotePort())) {
String response1 = FPSTR(HUE_RESPONSE);
@ -153,31 +151,25 @@ void hue_respondToMSearch()
portUDP.write(response.c_str());
portUDP.endPacket();
//addLog(LOG_LEVEL_DEBUG_MORE, response.c_str());
response = response1;
response += FPSTR(HUE_ST2);
response.replace("{r3}", hue_UUID());
portUDP.write(response.c_str());
portUDP.endPacket();
//addLog(LOG_LEVEL_DEBUG_MORE, response.c_str());
response = response1;
response += FPSTR(HUE_ST3);
response.replace("{r3}", hue_UUID());
portUDP.write(response.c_str());
portUDP.endPacket();
//addLog(LOG_LEVEL_DEBUG_MORE, response.c_str());
snprintf_P(message, sizeof(message), PSTR(D_3_RESPONSE_PACKETS_SENT));
} else {
snprintf_P(message, sizeof(message), PSTR(D_FAILED_TO_SEND_RESPONSE));
}
snprintf_P(log, sizeof(log), PSTR(D_LOG_UPNP D_HUE " %s " D_TO " %s:%d"),
snprintf_P(log_data, sizeof(log_data), PSTR(D_LOG_UPNP D_HUE " %s " D_TO " %s:%d"),
message, portUDP.remoteIP().toString().c_str(), portUDP.remotePort());
addLog(LOG_LEVEL_DEBUG, log);
addLog(LOG_LEVEL_DEBUG);
}
/*********************************************************************************************\
@ -440,10 +432,8 @@ void handleUPnPsetupHue()
void hue_todo(String *path)
{
char log[LOGSZ];
snprintf_P(log, sizeof(log), PSTR(D_LOG_HTTP D_HUE_API_NOT_IMPLEMENTED " (%s)"), path->c_str());
addLog(LOG_LEVEL_DEBUG_MORE, log);
snprintf_P(log_data, sizeof(log_data), PSTR(D_LOG_HTTP D_HUE_API_NOT_IMPLEMENTED " (%s)"), path->c_str());
addLog(LOG_LEVEL_DEBUG_MORE);
webServer->send(200, FPSTR(HDR_CTYPE_JSON), "{}");
}
@ -474,11 +464,6 @@ void hue_light_status(byte device, String *response)
if (sfl_flg) {
sl_replaceHSB(response);
#ifdef USE_WS2812
}
else if (pin[GPIO_WS2812] < 99) {
ws2812_replaceHSB(response);
#endif // USE_WS2812
} else {
response->replace("{h}", "0");
response->replace("{s}", "0");
@ -589,11 +574,6 @@ void hue_lights(String *path)
if (sfl_flg) {
sl_getHSB(&hue,&sat,&bri);
#ifdef USE_WS2812
}
else if (pin[GPIO_WS2812] < 99) {
ws2812_getHSB(&hue,&sat,&bri);
#endif // USE_WS2812
}
if (hue_json.containsKey("bri")) {
@ -648,11 +628,6 @@ void hue_lights(String *path)
if (change) {
if (sfl_flg) {
sl_setHSB(hue, sat, bri, ct);
#ifdef USE_WS2812
}
else if (pin[GPIO_WS2812] < 99) {
ws2812_setHSB(hue, sat, bri);
#endif // USE_WS2812
}
change = false;
}
@ -665,8 +640,6 @@ void hue_lights(String *path)
response = FPSTR(HUE_ERROR_JSON);
}
//addLog(LOG_LEVEL_DEBUG_MORE, response.c_str());
webServer->send(200, FPSTR(HDR_CTYPE_JSON), response);
}
else if(path->indexOf("/lights/") >= 0) { // Got /lights/ID
@ -718,17 +691,16 @@ void handle_hue_api(String *path)
* (c) Heiko Krupp, 2017
*/
char log[LOGSZ];
uint8_t args = 0;
path->remove(0, 4); // remove /api
uint16_t apilen = path->length();
snprintf_P(log, sizeof(log), PSTR(D_LOG_HTTP D_HUE_API " (%s)"), path->c_str());
addLog(LOG_LEVEL_DEBUG_MORE, log);
snprintf_P(log_data, sizeof(log_data), PSTR(D_LOG_HTTP D_HUE_API " (%s)"), path->c_str());
addLog(LOG_LEVEL_DEBUG_MORE);
for (args = 0; args < webServer->args(); args++) {
String json = webServer->arg(args);
snprintf_P(log, sizeof(log), PSTR(D_LOG_HTTP D_HUE_POST_ARGS " (%s)"), json.c_str());
addLog(LOG_LEVEL_DEBUG_MORE, log);
snprintf_P(log_data, sizeof(log_data), PSTR(D_LOG_HTTP D_HUE_POST_ARGS " (%s)"), json.c_str());
addLog(LOG_LEVEL_DEBUG_MORE);
}
if (path->endsWith("/invalid/")) {} // Just ignore

View File

@ -22,7 +22,7 @@
* WS2812 Leds using NeopixelBus library
\*********************************************************************************************/
//#include <NeoPixelBus.h> // Global defined as also used by Sonoff Led
#include <NeoPixelBus.h>
#ifdef USE_WS2812_DMA
#if (USE_WS2812_CTYPE == 1)
@ -75,101 +75,28 @@ uint8_t repeatValues[5] = {
4, // Large
2, // Largest
1 }; // All
uint8_t speedValues[6] = {
uint8_t speedValues[9] = {
0, // None
9 * (STATES / 10), // Slowest
7 * (STATES / 10), // Slower
5 * (STATES / 10), // Slow
3 * (STATES / 10), // Fast
1 * (STATES / 10) }; // Fastest
1 * (STATES / 10), // Fastest
3 * (STATES / 10),
5 * (STATES / 10), // Fast
7 * (STATES / 10),
9 * (STATES / 10),
11 * (STATES / 10), // Slow
13 * (STATES / 10),
15 * (STATES / 10) }; // Slowest
uint8_t lany = 0;
RgbColor dcolor;
RgbColor tcolor;
RgbColor lcolor;
uint8_t ws2812_showNext = 1;
uint8_t wakeupDimmer = 0;
uint8_t ws_bit = 0;
uint16_t wakeupCntr = 0;
unsigned long stripTimerCntr = 0; // Bars and Gradient
void ws2812_setDim(uint8_t myDimmer)
{
float newDim = 100 / (float)myDimmer;
float fmyRed = (float)sysCfg.ws_red / newDim;
float fmyGrn = (float)sysCfg.ws_green / newDim;
float fmyBlu = (float)sysCfg.ws_blue / newDim;
dcolor.R = (uint8_t)fmyRed;
dcolor.G = (uint8_t)fmyGrn;
dcolor.B = (uint8_t)fmyBlu;
}
void ws2812_setColor(uint16_t led, char* colstr)
{
HtmlColor hcolor;
char log[LOGSZ];
char lcolstr[8];
snprintf_P(lcolstr, sizeof(lcolstr), PSTR("#%s"), colstr);
uint8_t result = hcolor.Parse<HtmlColorNames>((char *)lcolstr, 7);
if (result) {
if (led) {
strip->SetPixelColor(led -1, RgbColor(hcolor)); // Led 1 is strip Led 0 -> substract offset 1
strip->Show();
} else {
dcolor = RgbColor(hcolor);
// snprintf_P(log, sizeof(log), PSTR("DBG: Red %02X, Green %02X, Blue %02X"), dcolor.R, dcolor.G, dcolor.B);
// addLog(LOG_LEVEL_DEBUG, log);
uint16_t temp = dcolor.R;
if (temp < dcolor.G) {
temp = dcolor.G;
}
if (temp < dcolor.B) {
temp = dcolor.B;
}
float mDim = (float)temp / 2.55;
sysCfg.ws_dimmer = (uint8_t)mDim;
float newDim = 100 / mDim;
float fmyRed = (float)dcolor.R * newDim;
float fmyGrn = (float)dcolor.G * newDim;
float fmyBlu = (float)dcolor.B * newDim;
sysCfg.ws_red = (uint8_t)fmyRed;
sysCfg.ws_green = (uint8_t)fmyGrn;
sysCfg.ws_blue = (uint8_t)fmyBlu;
lany = 1;
}
}
}
void ws2812_getColor(uint16_t led, char* svalue, uint16_t ssvalue)
{
RgbColor mcolor;
char stemp[20];
if (led) {
mcolor = strip->GetPixelColor(led -1);
snprintf_P(stemp, sizeof(stemp), PSTR(D_CMND_LED "%d"), led);
} else {
ws2812_setDim(sysCfg.ws_dimmer);
mcolor = dcolor;
snprintf_P(stemp, sizeof(stemp), PSTR(D_CMND_COLOR));
}
uint32_t color = (uint32_t)mcolor.R << 16;
color += (uint32_t)mcolor.G << 8;
color += (uint32_t)mcolor.B;
snprintf_P(svalue, ssvalue, PSTR("{\"%s\":\"%06X\"}"), stemp, color);
}
/********************************************************************************************/
void ws2812_stripShow()
{
RgbColor c;
if (sysCfg.ws_ledtable) {
for (uint16_t i = 0; i < sysCfg.ws_pixels; i++) {
if (sysCfg.led_table) {
for (uint16_t i = 0; i < sysCfg.led_pixels; i++) {
c = strip->GetPixelColor(i);
strip->SetPixelColor(i, RgbColor(ledTable[c.R], ledTable[c.G], ledTable[c.B]));
}
@ -177,17 +104,6 @@ void ws2812_stripShow()
strip->Show();
}
void ws2812_resetWakupState()
{
wakeupDimmer = 0;
wakeupCntr = 0;
}
void ws2812_resetStripTimer()
{
stripTimerCntr = 0;
}
int mod(int a, int b)
{
int ret = a % b;
@ -202,7 +118,7 @@ void ws2812_clock()
RgbColor c;
strip->ClearTo(0); // Reset strip
float newDim = 100 / (float)sysCfg.ws_dimmer;
float newDim = 100 / (float)sysCfg.led_dimmer[0];
float f1 = 255 / newDim;
uint8_t i1 = (uint8_t)f1;
float f2 = 127 / newDim;
@ -210,7 +126,7 @@ void ws2812_clock()
float f3 = 63 / newDim;
uint8_t i3 = (uint8_t)f3;
int j = sysCfg.ws_pixels;
int j = sysCfg.led_pixels;
int clksize = 600 / j;
int i = (rtcTime.Second * 10) / clksize;
@ -228,13 +144,13 @@ void ws2812_clock()
ws2812_stripShow();
}
void ws2812_gradientColor(struct wsColor* mColor, uint16_t range, uint16_t gradRange, uint16_t i)
void ws2812_gradientColor(uint8_t schemenr, struct wsColor* mColor, uint16_t range, uint16_t gradRange, uint16_t i)
{
/*
* Compute the color of a pixel at position i using a gradient of the color scheme.
* This function is used internally by the gradient function.
*/
ColorScheme scheme = schemes[sysCfg.ws_scheme -3];
ColorScheme scheme = schemes[schemenr];
uint16_t curRange = i / range;
uint16_t rangeIndex = i % range;
uint16_t colorIndex = rangeIndex / gradRange;
@ -244,7 +160,7 @@ void ws2812_gradientColor(struct wsColor* mColor, uint16_t range, uint16_t gradR
start = (scheme.count -1) - start;
end = (scheme.count -1) - end;
}
float newDim = 100 / (float)sysCfg.ws_dimmer;
float newDim = 100 / (float)sysCfg.led_dimmer[0];
float fmyRed = (float)map(rangeIndex % gradRange, 0, gradRange, scheme.colors[start].red, scheme.colors[end].red) / newDim;
float fmyGrn = (float)map(rangeIndex % gradRange, 0, gradRange, scheme.colors[start].green, scheme.colors[end].green) / newDim;
float fmyBlu = (float)map(rangeIndex % gradRange, 0, gradRange, scheme.colors[start].blue, scheme.colors[end].blue) / newDim;
@ -253,7 +169,7 @@ void ws2812_gradientColor(struct wsColor* mColor, uint16_t range, uint16_t gradR
mColor->blue = (uint8_t)fmyBlu;
}
void ws2812_gradient()
void ws2812_gradient(uint8_t schemenr)
{
/*
* This routine courtesy Tony DiCola (Adafruit)
@ -262,28 +178,28 @@ void ws2812_gradient()
*/
RgbColor c;
ColorScheme scheme = schemes[sysCfg.ws_scheme -3];
ColorScheme scheme = schemes[schemenr];
if (scheme.count < 2) {
return;
}
uint8_t repeat = repeatValues[sysCfg.ws_width]; // number of scheme.count per ledcount
uint16_t range = (uint16_t)ceil((float)sysCfg.ws_pixels / (float)repeat);
uint8_t repeat = repeatValues[sysCfg.led_width]; // number of scheme.count per ledcount
uint16_t range = (uint16_t)ceil((float)sysCfg.led_pixels / (float)repeat);
uint16_t gradRange = (uint16_t)ceil((float)range / (float)(scheme.count - 1));
uint16_t offset = speedValues[sysCfg.ws_speed] > 0 ? stripTimerCntr / speedValues[sysCfg.ws_speed] : 0;
uint16_t offset = speedValues[sysCfg.led_speed] > 0 ? stripTimerCntr / speedValues[sysCfg.led_speed] : 0;
wsColor oldColor, currentColor;
ws2812_gradientColor(&oldColor, range, gradRange, offset);
ws2812_gradientColor(schemenr, &oldColor, range, gradRange, offset);
currentColor = oldColor;
for (uint16_t i = 0; i < sysCfg.ws_pixels; i++) {
if (repeatValues[sysCfg.ws_width] > 1) {
ws2812_gradientColor(&currentColor, range, gradRange, i +offset);
for (uint16_t i = 0; i < sysCfg.led_pixels; i++) {
if (repeatValues[sysCfg.led_width] > 1) {
ws2812_gradientColor(schemenr, &currentColor, range, gradRange, i +offset);
}
if (sysCfg.ws_speed > 0) {
if (sysCfg.led_speed > 0) {
// Blend old and current color based on time for smooth movement.
c.R = map(stripTimerCntr % speedValues[sysCfg.ws_speed], 0, speedValues[sysCfg.ws_speed], oldColor.red, currentColor.red);
c.G = map(stripTimerCntr % speedValues[sysCfg.ws_speed], 0, speedValues[sysCfg.ws_speed], oldColor.green, currentColor.green);
c.B = map(stripTimerCntr % speedValues[sysCfg.ws_speed], 0, speedValues[sysCfg.ws_speed], oldColor.blue, currentColor.blue);
c.R = map(stripTimerCntr % speedValues[sysCfg.led_speed], 0, speedValues[sysCfg.led_speed], oldColor.red, currentColor.red);
c.G = map(stripTimerCntr % speedValues[sysCfg.led_speed], 0, speedValues[sysCfg.led_speed], oldColor.green, currentColor.green);
c.B = map(stripTimerCntr % speedValues[sysCfg.led_speed], 0, speedValues[sysCfg.led_speed], oldColor.blue, currentColor.blue);
}
else {
// No animation, just use the current color.
@ -297,7 +213,7 @@ void ws2812_gradient()
ws2812_stripShow();
}
void ws2812_bars()
void ws2812_bars(uint8_t schemenr)
{
/*
* This routine courtesy Tony DiCola (Adafruit)
@ -307,18 +223,18 @@ void ws2812_bars()
RgbColor c;
uint16_t i;
ColorScheme scheme = schemes[sysCfg.ws_scheme -3];
ColorScheme scheme = schemes[schemenr];
uint16_t maxSize = sysCfg.ws_pixels / scheme.count;
if (widthValues[sysCfg.ws_width] > maxSize) {
uint16_t maxSize = sysCfg.led_pixels / scheme.count;
if (widthValues[sysCfg.led_width] > maxSize) {
maxSize = 0;
}
uint8_t offset = speedValues[sysCfg.ws_speed] > 0 ? stripTimerCntr / speedValues[sysCfg.ws_speed] : 0;
uint8_t offset = speedValues[sysCfg.led_speed] > 0 ? stripTimerCntr / speedValues[sysCfg.led_speed] : 0;
wsColor mcolor[scheme.count];
memcpy(mcolor, scheme.colors, sizeof(mcolor));
float newDim = 100 / (float)sysCfg.ws_dimmer;
float newDim = 100 / (float)sysCfg.led_dimmer[0];
for (i = 0; i < scheme.count; i++) {
float fmyRed = (float)mcolor[i].red / newDim;
float fmyGrn = (float)mcolor[i].green / newDim;
@ -328,9 +244,9 @@ void ws2812_bars()
mcolor[i].blue = (uint8_t)fmyBlu;
}
uint8_t colorIndex = offset % scheme.count;
for (i = 0; i < sysCfg.ws_pixels; i++) {
for (i = 0; i < sysCfg.led_pixels; i++) {
if (maxSize) {
colorIndex = ((i + offset) % (scheme.count * widthValues[sysCfg.ws_width])) / widthValues[sysCfg.ws_width];
colorIndex = ((i + offset) % (scheme.count * widthValues[sysCfg.led_width])) / widthValues[sysCfg.led_width];
}
c.R = mcolor[colorIndex].red;
c.G = mcolor[colorIndex].green;
@ -340,122 +256,12 @@ void ws2812_bars()
ws2812_stripShow();
}
void ws2812_animate()
/*********************************************************************************************\
* Public
\*********************************************************************************************/
void ws2812_init()
{
char log[LOGSZ];
uint8_t fadeValue;
stripTimerCntr++;
if (0 == bitRead(power, ws_bit)) { // Power Off
sleep = sysCfg.sleep;
stripTimerCntr = 0;
tcolor = 0;
}
else {
sleep = 0;
switch (sysCfg.ws_scheme) {
case 0: // Power On
ws2812_setDim(sysCfg.ws_dimmer);
if (0 == sysCfg.ws_fade) {
tcolor = dcolor;
} else {
if (tcolor != dcolor) {
uint8_t ws_speed = speedValues[sysCfg.ws_speed];
if (tcolor.R < dcolor.R) {
tcolor.R += ((dcolor.R - tcolor.R) / ws_speed) +1;
}
if (tcolor.G < dcolor.G) {
tcolor.G += ((dcolor.G - tcolor.G) / ws_speed) +1;
}
if (tcolor.B < dcolor.B) {
tcolor.B += ((dcolor.B - tcolor.B) / ws_speed) +1;
}
if (tcolor.R > dcolor.R) {
tcolor.R -= ((tcolor.R - dcolor.R) / ws_speed) +1;
}
if (tcolor.G > dcolor.G) {
tcolor.G -= ((tcolor.G - dcolor.G) / ws_speed) +1;
}
if (tcolor.B > dcolor.B) {
tcolor.B -= ((tcolor.B - dcolor.B) / ws_speed) +1;
}
}
}
break;
case 1: // Wake up light
wakeupCntr++;
if (0 == wakeupDimmer) {
tcolor = 0;
wakeupDimmer++;
}
else {
if (wakeupCntr > ((sysCfg.ws_wakeup * STATES) / sysCfg.ws_dimmer)) {
wakeupCntr = 0;
wakeupDimmer++;
if (wakeupDimmer <= sysCfg.ws_dimmer) {
ws2812_setDim(wakeupDimmer);
tcolor = dcolor;
} else {
sysCfg.ws_scheme = 0;
}
}
}
break;
case 2: // Clock
if (((STATES/10)*2 == state) || (lany != 2)) {
ws2812_clock();
}
lany = 2;
break;
default:
if (1 == sysCfg.ws_fade) {
ws2812_gradient();
} else {
ws2812_bars();
}
lany = 1;
break;
}
}
if ((sysCfg.ws_scheme <= 1) || (0 == bitRead(power, ws_bit))) {
if ((lcolor != tcolor) || lany) {
lany = 0;
lcolor = tcolor;
// snprintf_P(log, sizeof(log), PSTR("DBG: StripPixels %d, CfgPixels %d, Red %02X, Green %02X, Blue %02X"), strip->PixelCount(), sysCfg.ws_pixels, lcolor.R, lcolor.G, lcolor.B);
// addLog(LOG_LEVEL_DEBUG, log);
if (sysCfg.ws_ledtable) {
for (uint16_t i = 0; i < sysCfg.ws_pixels; i++) {
strip->SetPixelColor(i, RgbColor(ledTable[lcolor.R],ledTable[lcolor.G],ledTable[lcolor.B]));
}
} else {
for (uint16_t i = 0; i < sysCfg.ws_pixels; i++) {
strip->SetPixelColor(i, lcolor);
}
}
strip->Show();
}
}
}
void ws2812_update()
{
lany = 1;
}
void ws2812_pixels()
{
strip->ClearTo(0);
strip->Show();
tcolor = 0;
lany = 1;
}
void ws2812_init(uint8_t powerbit)
{
ws_bit = powerbit -1;
#ifdef USE_WS2812_DMA
#if (USE_WS2812_CTYPE == 1)
strip = new NeoPixelBus<NeoGrbFeature, Neo800KbpsMethod>(WS2812_MAX_LEDS); // For Esp8266, the Pin is omitted and it uses GPIO3 due to DMA hardware use.
@ -470,161 +276,67 @@ void ws2812_init(uint8_t powerbit)
#endif // USE_WS2812_CTYPE
#endif // USE_WS2812_DMA
strip->Begin();
ws2812_pixels();
ws2812_clear();
}
/*********************************************************************************************\
* Hue support
\*********************************************************************************************/
void ws2812_replaceHSB(String *response)
void ws2812_clear()
{
ws2812_setDim(sysCfg.ws_dimmer);
HsbColor hsb = HsbColor(dcolor);
response->replace("{h}", String((uint16_t)(65535.0f * hsb.H)));
response->replace("{s}", String((uint8_t)(254.0f * hsb.S)));
response->replace("{b}", String((uint8_t)(254.0f * hsb.B)));
strip->ClearTo(0);
strip->Show();
ws2812_showNext = 1;
}
void ws2812_getHSB(float *hue, float *sat, float *bri)
void ws2812_setColor(uint16_t led, uint8_t red, uint8_t green, uint8_t blue)
{
ws2812_setDim(sysCfg.ws_dimmer);
HsbColor hsb = HsbColor(dcolor);
*hue = hsb.H;
*sat = hsb.S;
*bri = hsb.B;
RgbColor lcolor;
lcolor.R = red;
lcolor.G = green;
lcolor.B = blue;
if (led) {
strip->SetPixelColor(led -1, lcolor); // Led 1 is strip Led 0 -> substract offset 1
} else {
// strip->ClearTo(lcolor); // Set WS2812_MAX_LEDS pixels
for (uint16_t i = 0; i < sysCfg.led_pixels; i++) {
strip->SetPixelColor(i, lcolor);
}
}
strip->Show();
ws2812_showNext = 1;
}
void ws2812_setHSB(float hue, float sat, float bri)
char* ws2812_getColor(uint16_t led, char* scolor)
{
char rgb[7];
uint8_t sl_ledcolor[3];
HsbColor hsb;
hsb.H = hue;
hsb.S = sat;
hsb.B = bri;
RgbColor tmp = RgbColor(hsb);
sprintf(rgb,"%02X%02X%02X", tmp.R, tmp.G, tmp.B);
ws2812_setColor(0,rgb);
RgbColor lcolor = strip->GetPixelColor(led -1);
sl_ledcolor[0] = lcolor.R;
sl_ledcolor[1] = lcolor.G;
sl_ledcolor[2] = lcolor.B;
scolor[0] = '\0';
for (byte i = 0; i < 3; i++) {
snprintf_P(scolor, 11, PSTR("%s%02X"), scolor, sl_ledcolor[i]);
}
return scolor;
}
/*********************************************************************************************\
* Commands
\*********************************************************************************************/
boolean ws2812_command(char *type, uint16_t index, char *dataBuf, uint16_t data_len, int16_t payload, char *svalue, uint16_t ssvalue)
void ws2812_showScheme(uint8_t scheme)
{
boolean serviced = true;
if (!strcasecmp_P(type, PSTR(D_CMND_PIXELS))) {
if ((payload > 0) && (payload <= WS2812_MAX_LEDS)) {
sysCfg.ws_pixels = payload;
ws2812_pixels();
}
snprintf_P(svalue, ssvalue, PSTR("{\"" D_CMND_PIXELS "\":%d}"), sysCfg.ws_pixels);
}
else if (!strcasecmp_P(type, PSTR(D_CMND_LED)) && (index > 0) && (index <= sysCfg.ws_pixels)) {
if (6 == data_len) {
ws2812_setColor(index, dataBuf);
}
ws2812_getColor(index, svalue, ssvalue);
}
else if (!strcasecmp_P(type, PSTR(D_CMND_COLOR))) {
if (dataBuf[0] == '#') {
dataBuf++;
data_len--;
}
if (6 == data_len) {
ws2812_setColor(0, dataBuf);
bitSet(power, ws_bit);
}
ws2812_getColor(0, svalue, ssvalue);
}
else if (!strcasecmp_P(type, PSTR(D_CMND_DIMMER))) {
if ((payload >= 0) && (payload <= 100)) {
sysCfg.ws_dimmer = payload;
bitSet(power, ws_bit);
#ifdef USE_DOMOTICZ
// mqtt_publishDomoticzPowerState(index);
mqtt_publishDomoticzPowerState(ws_bit +1);
#endif // USE_DOMOTICZ
}
snprintf_P(svalue, ssvalue, PSTR("{\"" D_CMND_DIMMER "\":%d}"), sysCfg.ws_dimmer);
}
else if (!strcasecmp_P(type, PSTR(D_CMND_LEDTABLE))) {
if ((payload >= 0) && (payload <= 2)) {
switch (payload) {
case 0: // Off
case 1: // On
sysCfg.ws_ledtable = payload;
break;
case 2: // Toggle
sysCfg.ws_ledtable ^= 1;
break;
switch (scheme) {
case 0: // Clock
if (((STATES/10)*2 == state) || (ws2812_showNext)) {
ws2812_clock();
ws2812_showNext = 0;
}
ws2812_update();
}
snprintf_P(svalue, ssvalue, PSTR("{\"" D_CMND_LEDTABLE "\":\"%s\"}"), getStateText(sysCfg.ws_ledtable));
}
else if (!strcasecmp_P(type, PSTR(D_CMND_FADE))) {
switch (payload) {
case 0: // Off
case 1: // On
sysCfg.ws_fade = payload;
break;
case 2: // Toggle
sysCfg.ws_fade ^= 1;
default:
if (1 == sysCfg.led_fade) {
ws2812_gradient(scheme -1);
} else {
ws2812_bars(scheme -1);
}
ws2812_showNext = 1;
break;
}
snprintf_P(svalue, ssvalue, PSTR("{\"" D_CMND_FADE "\":\"%s\"}"), getStateText(sysCfg.ws_fade));
}
else if (!strcasecmp_P(type, PSTR(D_CMND_SPEED))) { // 1 - fast, 5 - slow
if ((payload > 0) && (payload <= 5)) {
sysCfg.ws_speed = payload;
}
snprintf_P(svalue, ssvalue, PSTR("{\"" D_CMND_SPEED "\":%d}"), sysCfg.ws_speed);
}
else if (!strcasecmp_P(type, PSTR(D_CMND_WIDTH))) {
if ((payload >= 0) && (payload <= 4)) {
sysCfg.ws_width = payload;
}
snprintf_P(svalue, ssvalue, PSTR("{\"" D_CMND_WIDTH "\":%d}"), sysCfg.ws_width);
}
else if (!strcasecmp_P(type, PSTR(D_CMND_WAKEUP))) {
if ((payload > 0) && (payload < 3001)) {
sysCfg.ws_wakeup = payload;
if (1 == sysCfg.ws_scheme) {
sysCfg.ws_scheme = 0;
}
}
snprintf_P(svalue, ssvalue, PSTR("{\"" D_CMND_WAKEUP "\":%d}"), sysCfg.ws_wakeup);
}
else if (!strcasecmp_P(type, PSTR(D_CMND_SCHEME))) {
if ((payload >= 0) && (payload <= 9)) {
sysCfg.ws_scheme = payload;
if (1 == sysCfg.ws_scheme) {
ws2812_resetWakupState();
}
bitSet(power, ws_bit);
ws2812_resetStripTimer();
}
snprintf_P(svalue, ssvalue, PSTR("{\"" D_CMND_SCHEME "\":%d}"), sysCfg.ws_scheme);
}
else if (!strcasecmp_P(type, PSTR("UNDOCA"))) { // Theos legacy status
RgbColor mcolor;
ws2812_setDim(sysCfg.ws_dimmer);
mcolor = dcolor;
uint32_t color = (uint32_t)mcolor.R << 16;
color += (uint32_t)mcolor.G << 8;
color += (uint32_t)mcolor.B;
snprintf_P(svalue, ssvalue, PSTR("%06X, %d, %d, %d, %d, %d"),
color, sysCfg.ws_fade, sysCfg.ws_ledtable, sysCfg.ws_scheme, sysCfg.ws_speed, sysCfg.ws_width);
mqtt_publish_topic_P(1, type, svalue);
svalue[0] = '\0';
}
else {
serviced = false; // Unknown command
}
return serviced;
}
#endif // USE_WS2812

View File

@ -47,7 +47,6 @@ boolean bh1750_detect()
return true;
}
char log[LOGSZ];
uint8_t status;
boolean success = false;
@ -67,8 +66,8 @@ boolean bh1750_detect()
strcpy_P(bh1750stype, PSTR("BH1750"));
}
if (success) {
snprintf_P(log, sizeof(log), PSTR(D_LOG_I2C "%s " D_FOUND_AT " 0x%x"), bh1750stype, bh1750addr);
addLog(LOG_LEVEL_DEBUG, log);
snprintf_P(log_data, sizeof(log_data), PSTR(D_LOG_I2C "%s " D_FOUND_AT " 0x%x"), bh1750stype, bh1750addr);
addLog(LOG_LEVEL_DEBUG);
} else {
bh1750type = 0;
}
@ -79,14 +78,14 @@ boolean bh1750_detect()
* Presentation
\*********************************************************************************************/
void bh1750_mqttPresent(char* svalue, uint16_t ssvalue, uint8_t* djson)
void bh1750_mqttPresent(uint8_t* djson)
{
if (!bh1750type) {
return;
}
uint16_t l = bh1750_readLux();
snprintf_P(svalue, ssvalue, PSTR("%s, \"%s\":{\"" D_ILLUMINANCE "\":%d}"), svalue, bh1750stype, l);
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("%s, \"%s\":{\"" D_ILLUMINANCE "\":%d}"), mqtt_data, bh1750stype, l);
*djson = 1;
#ifdef USE_DOMOTICZ
domoticz_sensor5(l);

View File

@ -394,7 +394,6 @@ boolean bmp_detect()
return true;
}
char log[LOGSZ];
boolean success = false;
bmpaddr = BMP_ADDR;
@ -418,8 +417,8 @@ boolean bmp_detect()
strcpy_P(bmpstype, PSTR("BME280"));
}
if (success) {
snprintf_P(log, sizeof(log), PSTR(D_LOG_I2C "%s " D_FOUND_AT " 0x%x"), bmpstype, bmpaddr);
addLog(LOG_LEVEL_DEBUG, log);
snprintf_P(log_data, sizeof(log_data), PSTR(D_LOG_I2C "%s " D_FOUND_AT " 0x%x"), bmpstype, bmpaddr);
addLog(LOG_LEVEL_DEBUG);
} else {
bmptype = 0;
}
@ -430,7 +429,7 @@ boolean bmp_detect()
* Presentation
\*********************************************************************************************/
void bmp_mqttPresent(char* svalue, uint16_t ssvalue, uint8_t* djson)
void bmp_mqttPresent(uint8_t* djson)
{
if (!bmptype) {
return;
@ -447,11 +446,11 @@ void bmp_mqttPresent(char* svalue, uint16_t ssvalue, uint8_t* djson)
dtostrfd(p, sysCfg.flag.pressure_resolution, stemp2);
dtostrfd(h, sysCfg.flag.humidity_resolution, stemp3);
if (!strcmp(bmpstype,"BME280")) {
snprintf_P(svalue, ssvalue, PSTR("%s, \"%s\":{\"" D_TEMPERATURE "\":%s, \"" D_HUMIDITY "\":%s, \"" D_PRESSURE "\":%s}"),
svalue, bmpstype, stemp1, stemp3, stemp2);
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("%s, \"%s\":{\"" D_TEMPERATURE "\":%s, \"" D_HUMIDITY "\":%s, \"" D_PRESSURE "\":%s}"),
mqtt_data, bmpstype, stemp1, stemp3, stemp2);
} else {
snprintf_P(svalue, ssvalue, PSTR("%s, \"%s\":{\"" D_TEMPERATURE "\":%s, \"" D_PRESSURE "\":%s}"),
svalue, bmpstype, stemp1, stemp2);
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("%s, \"%s\":{\"" D_TEMPERATURE "\":%s, \"" D_PRESSURE "\":%s}"),
mqtt_data, bmpstype, stemp1, stemp2);
}
*djson = 1;
#ifdef USE_DOMOTICZ

View File

@ -25,8 +25,6 @@ unsigned long pTimeLast[MAX_COUNTERS]; // Last counter time in milli seconds
void counter_update(byte index)
{
// char log[LOGSZ];
unsigned long pTime = millis() - pTimeLast[index -1];
if (pTime > sysCfg.pCounterDebounce) {
pTimeLast[index -1] = millis();
@ -36,8 +34,8 @@ void counter_update(byte index)
rtcMem.pCounter[index -1]++;
}
// snprintf_P(log, sizeof(log), PSTR("CNTR: Interrupt %d"), index);
// addLog(LOG_LEVEL_DEBUG, log);
// snprintf_P(log_data, sizeof(log_data), PSTR("CNTR: Interrupt %d"), index);
// addLog(LOG_LEVEL_DEBUG);
}
}
@ -87,7 +85,7 @@ void counter_init()
* Presentation
\*********************************************************************************************/
void counter_mqttPresent(char* svalue, uint16_t ssvalue, uint8_t* djson)
void counter_mqttPresent(uint8_t* djson)
{
char stemp[16];
@ -100,7 +98,7 @@ void counter_mqttPresent(char* svalue, uint16_t ssvalue, uint8_t* djson)
dsxflg++;
dtostrfd(rtcMem.pCounter[i], 0, stemp);
}
snprintf_P(svalue, ssvalue, PSTR("%s, \"" D_COUNTER "%d\":%s"), svalue, i +1, stemp);
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("%s, \"" D_COUNTER "%d\":%s"), mqtt_data, i +1, stemp);
*djson = 1;
#ifdef USE_DOMOTICZ
if (1 == dsxflg) {

View File

@ -38,7 +38,7 @@ struct DHTSTRUCT {
byte type;
char stype[10];
uint32_t lastreadtime;
bool lastresult;
uint16_t lastresult;
float t;
float h = 0;
} dht[DHT_MAX_SENSORS];
@ -62,14 +62,13 @@ uint32_t dht_expectPulse(byte sensor, bool level)
return count;
}
boolean dht_read(byte sensor)
void dht_read(byte sensor)
{
char log[LOGSZ];
uint32_t cycles[80];
uint32_t currenttime = millis();
if ((currenttime - dht[sensor].lastreadtime) < 2000) {
return dht[sensor].lastresult;
return;
}
dht[sensor].lastreadtime = currenttime;
@ -89,13 +88,13 @@ boolean dht_read(byte sensor)
delayMicroseconds(10);
if (0 == dht_expectPulse(sensor, LOW)) {
addLog_P(LOG_LEVEL_DEBUG, PSTR(D_LOG_DHT D_TIMEOUT_WAITING_FOR " " D_START_SIGNAL_LOW " " D_PULSE));
dht[sensor].lastresult = false;
return dht[sensor].lastresult;
dht[sensor].lastresult++;
return;
}
if (0 == dht_expectPulse(sensor, HIGH)) {
addLog_P(LOG_LEVEL_DEBUG, PSTR(D_LOG_DHT D_TIMEOUT_WAITING_FOR " " D_START_SIGNAL_HIGH " " D_PULSE));
dht[sensor].lastresult = false;
return dht[sensor].lastresult;
dht[sensor].lastresult++;
return;
}
for (int i = 0; i < 80; i += 2) {
cycles[i] = dht_expectPulse(sensor, LOW);
@ -108,8 +107,8 @@ boolean dht_read(byte sensor)
uint32_t highCycles = cycles[2*i+1];
if ((0 == lowCycles) || (0 == highCycles)) {
addLog_P(LOG_LEVEL_DEBUG, PSTR(D_LOG_DHT D_TIMEOUT_WAITING_FOR " " D_PULSE));
dht[sensor].lastresult = false;
return dht[sensor].lastresult;
dht[sensor].lastresult++;
return;
}
dht_data[i/8] <<= 1;
if (highCycles > lowCycles) {
@ -117,17 +116,16 @@ boolean dht_read(byte sensor)
}
}
snprintf_P(log, sizeof(log), PSTR(D_LOG_DHT D_RECEIVED " %02X, %02X, %02X, %02X, %02X =? %02X"),
snprintf_P(log_data, sizeof(log_data), PSTR(D_LOG_DHT D_RECEIVED " %02X, %02X, %02X, %02X, %02X =? %02X"),
dht_data[0], dht_data[1], dht_data[2], dht_data[3], dht_data[4], (dht_data[0] + dht_data[1] + dht_data[2] + dht_data[3]) & 0xFF);
addLog(LOG_LEVEL_DEBUG, log);
addLog(LOG_LEVEL_DEBUG);
if (dht_data[4] == ((dht_data[0] + dht_data[1] + dht_data[2] + dht_data[3]) & 0xFF)) {
dht[sensor].lastresult = true;
dht[sensor].lastresult = 0;
} else {
addLog_P(LOG_LEVEL_DEBUG, PSTR(D_LOG_DHT D_CHECKSUM_FAILURE));
dht[sensor].lastresult = false;
dht[sensor].lastresult++;
}
return dht[sensor].lastresult;
}
boolean dht_readTempHum(byte sensor, float &t, float &h)
@ -136,11 +134,16 @@ boolean dht_readTempHum(byte sensor, float &t, float &h)
t = NAN;
h = NAN;
} else {
if (dht[sensor].lastresult > 8) { // Reset after 8 misses
dht[sensor].t = NAN;
dht[sensor].h = NAN;
}
t = dht[sensor].t;
h = dht[sensor].h;
}
if (dht_read(sensor)) {
dht_read(sensor);
if (!dht[sensor].lastresult) {
switch (dht[sensor].type) {
case GPIO_DHT11:
h = dht_data[0];
@ -187,13 +190,12 @@ boolean dht_setup(byte pin, byte type)
void dht_init()
{
char log[LOGSZ];
dht_maxcycles = microsecondsToClockCycles(1000); // 1 millisecond timeout for reading pulses from DHT sensor.
for (byte i = 0; i < dht_sensors; i++) {
pinMode(dht[i].pin, INPUT_PULLUP);
dht[i].lastreadtime = -MIN_INTERVAL;
dht[i].lastreadtime = 0;
dht[i].lastresult = 0;
switch (dht[i].type) {
case GPIO_DHT11:
strcpy_P(dht[i].stype, PSTR("DHT11"));
@ -214,7 +216,7 @@ void dht_init()
* Presentation
\*********************************************************************************************/
void dht_mqttPresent(char* svalue, uint16_t ssvalue, uint8_t* djson)
void dht_mqttPresent(uint8_t* djson)
{
char stemp1[10];
char stemp2[10];
@ -226,7 +228,7 @@ void dht_mqttPresent(char* svalue, uint16_t ssvalue, uint8_t* djson)
if (dht_readTempHum(i, t, h)) { // Read temperature
dtostrfd(t, sysCfg.flag.temperature_resolution, stemp1);
dtostrfd(h, sysCfg.flag.humidity_resolution, stemp2);
snprintf_P(svalue, ssvalue, JSON_SNS_TEMPHUM, svalue, dht[i].stype, stemp1, stemp2);
snprintf_P(mqtt_data, sizeof(mqtt_data), JSON_SNS_TEMPHUM, mqtt_data, dht[i].stype, stemp1, stemp2);
*djson = 1;
#ifdef USE_DOMOTICZ
if (!dsxflg) {

View File

@ -25,6 +25,7 @@
\*********************************************************************************************/
float dsb_mt = 0;
uint16_t dsb_lastresult = 0;
uint8_t dsb_reset()
{
@ -131,6 +132,10 @@ boolean dsb_readTemp(float &t)
if (!dsb_mt) {
t = NAN;
} else {
dsb_lastresult++;
if (dsb_lastresult > 8) { // Reset after 8 misses
dsb_mt = NAN;
}
t = dsb_mt;
}
@ -168,8 +173,11 @@ boolean dsb_readTemp(float &t)
sign = -1;
}
t = convertTemp((float)sign * DSTemp * 0.0625);
dsb_lastresult = 0;
}
if (!isnan(t)) {
dsb_mt = t;
}
if (!isnan(t)) dsb_mt = t;
return !isnan(t);
}
@ -177,14 +185,14 @@ boolean dsb_readTemp(float &t)
* Presentation
\*********************************************************************************************/
void dsb_mqttPresent(char* svalue, uint16_t ssvalue, uint8_t* djson)
void dsb_mqttPresent(uint8_t* djson)
{
char stemp1[10];
float t;
if (dsb_readTemp(t)) { // Check if read failed
dtostrfd(t, sysCfg.flag.temperature_resolution, stemp1);
snprintf_P(svalue, ssvalue, PSTR("%s, \"DS18B20\":{\"" D_TEMPERATURE "\":%s}"), svalue, stemp1);
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("%s, \"DS18B20\":{\"" D_TEMPERATURE "\":%s}"), mqtt_data, stemp1);
*djson = 1;
#ifdef USE_DOMOTICZ
domoticz_sensor1(stemp1);

View File

@ -180,7 +180,7 @@ void ds18x20_type(uint8_t sensor)
}
}
void ds18x20_mqttPresent(char* svalue, uint16_t ssvalue, uint8_t* djson)
void ds18x20_mqttPresent(uint8_t* djson)
{
char stemp1[10];
char stemp2[10];
@ -192,13 +192,13 @@ void ds18x20_mqttPresent(char* svalue, uint16_t ssvalue, uint8_t* djson)
ds18x20_type(i);
dtostrfd(t, sysCfg.flag.temperature_resolution, stemp2);
if (!dsxflg) {
snprintf_P(svalue, ssvalue, PSTR("%s, \"DS18x20\":{"), svalue);
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("%s, \"DS18x20\":{"), mqtt_data);
*djson = 1;
stemp1[0] = '\0';
}
dsxflg++;
snprintf_P(svalue, ssvalue, PSTR("%s%s\"DS%d\":{\"" D_TYPE "\":\"%s\", \"" D_ADDRESS "\":\"%s\", \"" D_TEMPERATURE "\":%s}"),
svalue, stemp1, i +1, dsbstype, ds18x20_address(i).c_str(), stemp2);
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("%s%s\"DS%d\":{\"" D_TYPE "\":\"%s\", \"" D_ADDRESS "\":\"%s\", \"" D_TEMPERATURE "\":%s}"),
mqtt_data, stemp1, i +1, dsbstype, ds18x20_address(i).c_str(), stemp2);
strcpy(stemp1, ", ");
#ifdef USE_DOMOTICZ
if (1 == dsxflg) domoticz_sensor1(stemp2);
@ -206,7 +206,7 @@ void ds18x20_mqttPresent(char* svalue, uint16_t ssvalue, uint8_t* djson)
}
}
if (dsxflg) {
snprintf_P(svalue, ssvalue, PSTR("%s}"), svalue);
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("%s}"), mqtt_data);
}
}

View File

@ -194,9 +194,8 @@ void hlw_readEnergy(byte option, float &et, float &ed, float &e, float &w, float
uint16_t hlw_period;
uint16_t hlw_interval;
//char log[LOGSZ];
//snprintf_P(log, sizeof(log), PSTR("HLW: CF %d, CF1U %d (%d), CF1I %d (%d)"), hlw_cf_plen, hlw_cf1u_plen, hlw_cf1u_pcntmax, hlw_cf1i_plen, hlw_cf1i_pcntmax);
//addLog(LOG_LEVEL_DEBUG, log);
//snprintf_P(log_data, sizeof(log_data), PSTR("HLW: CF %d, CF1U %d (%d), CF1I %d (%d)"), hlw_cf_plen, hlw_cf1u_plen, hlw_cf1u_pcntmax, hlw_cf1i_plen, hlw_cf1i_pcntmax);
//addLog(LOG_LEVEL_DEBUG);
et = (float)(rtcMem.hlw_kWhtotal + (cur_kWhtoday / 1000)) / 100000;
ed = 0;
@ -312,8 +311,6 @@ void hlw_setPowerSteadyCounter(byte value)
void hlw_margin_chk()
{
char log[LOGSZ];
char svalue[200]; // was MESSZ
float pet;
float ped;
float pe;
@ -339,38 +336,38 @@ void hlw_margin_chk()
puv = (uint16_t)(pu);
piv = (uint16_t)(pi * 1000);
// snprintf_P(log, sizeof(log), PSTR("HLW: W %d, U %d, I %d"), pw, pu, piv);
// addLog(LOG_LEVEL_DEBUG, log);
// snprintf_P(log_data, sizeof(log_data), PSTR("HLW: W %d, U %d, I %d"), pw, pu, piv);
// addLog(LOG_LEVEL_DEBUG);
snprintf_P(svalue, sizeof(svalue), PSTR("{"));
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("{"));
jsonflg = 0;
if (hlw_margin(0, sysCfg.hlw_pmin, pwv, flag, hlw_pminflg)) {
snprintf_P(svalue, sizeof(svalue), PSTR("%s%s\"" D_CMND_POWERLOW "\":\"%s\""), svalue, (jsonflg)?", ":"", getStateText(flag));
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("%s%s\"" D_CMND_POWERLOW "\":\"%s\""), mqtt_data, (jsonflg)?", ":"", getStateText(flag));
jsonflg = 1;
}
if (hlw_margin(1, sysCfg.hlw_pmax, pwv, flag, hlw_pmaxflg)) {
snprintf_P(svalue, sizeof(svalue), PSTR("%s%s\"" D_CMND_POWERHIGH "\":\"%s\""), svalue, (jsonflg)?", ":"", getStateText(flag));
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("%s%s\"" D_CMND_POWERHIGH "\":\"%s\""), mqtt_data, (jsonflg)?", ":"", getStateText(flag));
jsonflg = 1;
}
if (hlw_margin(0, sysCfg.hlw_umin, puv, flag, hlw_uminflg)) {
snprintf_P(svalue, sizeof(svalue), PSTR("%s%s\"" D_CMND_VOLTAGELOW "\":\"%s\""), svalue, (jsonflg)?", ":"", getStateText(flag));
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("%s%s\"" D_CMND_VOLTAGELOW "\":\"%s\""), mqtt_data, (jsonflg)?", ":"", getStateText(flag));
jsonflg = 1;
}
if (hlw_margin(1, sysCfg.hlw_umax, puv, flag, hlw_umaxflg)) {
snprintf_P(svalue, sizeof(svalue), PSTR("%s%s\"" D_CMND_VOLTAGEHIGH "\":\"%s\""), svalue, (jsonflg)?", ":"", getStateText(flag));
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("%s%s\"" D_CMND_VOLTAGEHIGH "\":\"%s\""), mqtt_data, (jsonflg)?", ":"", getStateText(flag));
jsonflg = 1;
}
if (hlw_margin(0, sysCfg.hlw_imin, piv, flag, hlw_iminflg)) {
snprintf_P(svalue, sizeof(svalue), PSTR("%s%s\"" D_CMND_CURRENTLOW "\":\"%s\""), svalue, (jsonflg)?", ":"", getStateText(flag));
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("%s%s\"" D_CMND_CURRENTLOW "\":\"%s\""), mqtt_data, (jsonflg)?", ":"", getStateText(flag));
jsonflg = 1;
}
if (hlw_margin(1, sysCfg.hlw_imax, piv, flag, hlw_imaxflg)) {
snprintf_P(svalue, sizeof(svalue), PSTR("%s%s\"" D_CMND_CURRENTHIGH "\":\"%s\""), svalue, (jsonflg)?", ":"", getStateText(flag));
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("%s%s\"" D_CMND_CURRENTHIGH "\":\"%s\""), mqtt_data, (jsonflg)?", ":"", getStateText(flag));
jsonflg = 1;
}
if (jsonflg) {
snprintf_P(svalue, sizeof(svalue), PSTR("%s}"), svalue);
mqtt_publish_topic_P(2, PSTR(D_RSLT_MARGINS), svalue);
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("%s}"), mqtt_data);
mqtt_publish_topic_P(2, PSTR(D_RSLT_MARGINS));
hlw_mqttPresent(0);
}
}
@ -384,8 +381,8 @@ void hlw_margin_chk()
} else {
hlw_mplh_counter--;
if (!hlw_mplh_counter) {
snprintf_P(svalue, sizeof(svalue), PSTR("{\"" D_MAXPOWERREACHED "\":\"%d%s\"}"), pwv, (sysCfg.flag.value_units) ? " " D_UNIT_WATT : "");
mqtt_publish_topic_P(1, S_RSLT_WARNING, svalue);
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("{\"" D_MAXPOWERREACHED "\":\"%d%s\"}"), pwv, (sysCfg.flag.value_units) ? " " D_UNIT_WATT : "");
mqtt_publish_topic_P(1, S_RSLT_WARNING);
hlw_mqttPresent(0);
do_cmnd_power(1, 0);
if (!hlw_mplr_counter) {
@ -407,12 +404,12 @@ void hlw_margin_chk()
if (hlw_mplr_counter) {
hlw_mplr_counter--;
if (hlw_mplr_counter) {
snprintf_P(svalue, sizeof(svalue), PSTR("{\"" D_POWERMONITOR "\":\"%s\"}"), getStateText(1));
mqtt_publish_topic_P(5, PSTR(D_POWERMONITOR), svalue);
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("{\"" D_POWERMONITOR "\":\"%s\"}"), getStateText(1));
mqtt_publish_topic_P(5, PSTR(D_POWERMONITOR));
do_cmnd_power(1, 1);
} else {
snprintf_P(svalue, sizeof(svalue), PSTR("{\"" D_MAXPOWERREACHEDRETRY "\":\"%s\"}"), getStateText(0));
mqtt_publish_topic_P(1, S_RSLT_WARNING, svalue);
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("{\"" D_MAXPOWERREACHEDRETRY "\":\"%s\"}"), getStateText(0));
mqtt_publish_topic_P(1, S_RSLT_WARNING);
hlw_mqttPresent(0);
}
}
@ -425,15 +422,15 @@ void hlw_margin_chk()
uped = (uint16_t)(ped * 1000);
if (!hlw_mkwh_state && (rtcTime.Hour == sysCfg.hlw_mkwhs)) {
hlw_mkwh_state = 1;
snprintf_P(svalue, sizeof(svalue), PSTR("{\"" D_ENERGYMONITOR "\":\"%s\"}"), getStateText(1));
mqtt_publish_topic_P(5, PSTR(D_ENERGYMONITOR), svalue);
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("{\"" D_ENERGYMONITOR "\":\"%s\"}"), getStateText(1));
mqtt_publish_topic_P(5, PSTR(D_ENERGYMONITOR));
do_cmnd_power(1, 1);
}
else if ((1 == hlw_mkwh_state) && (uped >= sysCfg.hlw_mkwh)) {
hlw_mkwh_state = 2;
dtostrfd(ped, 3, svalue);
snprintf_P(svalue, sizeof(svalue), PSTR("{\"" D_MAXENERGYREACHED "\":\"%s%s\"}"), svalue, (sysCfg.flag.value_units) ? " " D_UNIT_KILOWATTHOUR : "");
mqtt_publish_topic_P(1, S_RSLT_WARNING, svalue);
dtostrfd(ped, 3, mqtt_data);
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("{\"" D_MAXENERGYREACHED "\":\"%s%s\"}"), mqtt_data, (sysCfg.flag.value_units) ? " " D_UNIT_KILOWATTHOUR : "");
mqtt_publish_topic_P(1, S_RSLT_WARNING);
hlw_mqttPresent(0);
do_cmnd_power(1, 0);
}
@ -445,7 +442,7 @@ void hlw_margin_chk()
* Commands
\*********************************************************************************************/
boolean hlw_command(char *type, uint16_t index, char *dataBuf, uint16_t data_len, int16_t payload, char *svalue, uint16_t ssvalue)
boolean hlw_command(char *type, uint16_t index, char *dataBuf, uint16_t data_len, int16_t payload)
{
boolean serviced = true;
uint8_t caltext = 0;
@ -454,37 +451,37 @@ boolean hlw_command(char *type, uint16_t index, char *dataBuf, uint16_t data_len
if ((payload >= 0) && (payload < 3601)) {
sysCfg.hlw_pmin = payload;
}
snprintf_P(svalue, ssvalue, PSTR("{\"" D_CMND_POWERLOW "\":\"%d%s\"}"), sysCfg.hlw_pmin, (sysCfg.flag.value_units) ? " " D_UNIT_WATT : "");
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("{\"" D_CMND_POWERLOW "\":\"%d%s\"}"), sysCfg.hlw_pmin, (sysCfg.flag.value_units) ? " " D_UNIT_WATT : "");
}
else if (!strcasecmp_P(type, PSTR(D_CMND_POWERHIGH))) {
if ((payload >= 0) && (payload < 3601)) {
sysCfg.hlw_pmax = payload;
}
snprintf_P(svalue, ssvalue, PSTR("{\"" D_CMND_POWERHIGH "\":\"%d%s\"}"), sysCfg.hlw_pmax, (sysCfg.flag.value_units) ? " " D_UNIT_WATT : "");
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("{\"" D_CMND_POWERHIGH "\":\"%d%s\"}"), sysCfg.hlw_pmax, (sysCfg.flag.value_units) ? " " D_UNIT_WATT : "");
}
else if (!strcasecmp_P(type, PSTR(D_CMND_VOLTAGELOW))) {
if ((payload >= 0) && (payload < 501)) {
sysCfg.hlw_umin = payload;
}
snprintf_P(svalue, ssvalue, PSTR("{\"" D_CMND_VOLTAGELOW "\":\"%d%s\"}"), sysCfg.hlw_umin, (sysCfg.flag.value_units) ? " " D_UNIT_VOLT : "");
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("{\"" D_CMND_VOLTAGELOW "\":\"%d%s\"}"), sysCfg.hlw_umin, (sysCfg.flag.value_units) ? " " D_UNIT_VOLT : "");
}
else if (!strcasecmp_P(type, PSTR(D_CMND_VOLTAGEHIGH))) {
if ((payload >= 0) && (payload < 501)) {
sysCfg.hlw_umax = payload;
}
snprintf_P(svalue, ssvalue, PSTR("{\"" D_CMND_VOLTAGEHIGH "\":\"%d%s\"}"), sysCfg.hlw_umax, (sysCfg.flag.value_units) ? " " D_UNIT_VOLT : "");
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("{\"" D_CMND_VOLTAGEHIGH "\":\"%d%s\"}"), sysCfg.hlw_umax, (sysCfg.flag.value_units) ? " " D_UNIT_VOLT : "");
}
else if (!strcasecmp_P(type, PSTR(D_CMND_CURRENTLOW))) {
if ((payload >= 0) && (payload < 16001)) {
sysCfg.hlw_imin = payload;
}
snprintf_P(svalue, ssvalue, PSTR("{\"" D_CMND_CURRENTLOW "\":\"%d%s\"}"), sysCfg.hlw_imin, (sysCfg.flag.value_units) ? " " D_UNIT_MILLIAMPERE : "");
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("{\"" D_CMND_CURRENTLOW "\":\"%d%s\"}"), sysCfg.hlw_imin, (sysCfg.flag.value_units) ? " " D_UNIT_MILLIAMPERE : "");
}
else if (!strcasecmp_P(type, PSTR(D_CMND_CURRENTHIGH))) {
if ((payload >= 0) && (payload < 16001)) {
sysCfg.hlw_imax = payload;
}
snprintf_P(svalue, ssvalue, PSTR("{\"" D_CMND_CURRENTHIGH "\":\"%d%s\"}"), sysCfg.hlw_imax, (sysCfg.flag.value_units) ? " " D_UNIT_MILLIAMPERE : "");
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("{\"" D_CMND_CURRENTHIGH "\":\"%d%s\"}"), sysCfg.hlw_imax, (sysCfg.flag.value_units) ? " " D_UNIT_MILLIAMPERE : "");
}
else if (!strcasecmp_P(type, PSTR(D_CMND_ENERGYRESET))) {
if ((payload >= 1) && (payload <= 3)) {
@ -509,7 +506,7 @@ boolean hlw_command(char *type, uint16_t index, char *dataBuf, uint16_t data_len
dtostrfd((float)sysCfg.hlw_kWhyesterday / 100000000, sysCfg.flag.energy_resolution, sey);
dtostrfd((float)rtcMem.hlw_kWhtoday / 100000000, sysCfg.flag.energy_resolution, sen);
dtostrfd((float)(rtcMem.hlw_kWhtotal + (hlw_kWhtoday / 1000)) / 100000, sysCfg.flag.energy_resolution, set);
snprintf_P(svalue, ssvalue, PSTR("{\"" D_CMND_ENERGYRESET "\":{\"" D_TOTAL "\":%s, \"" D_YESTERDAY "\":%s, \"" D_TODAY "\":%s}}"), set, sey, sen);
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("{\"" D_CMND_ENERGYRESET "\":{\"" D_TOTAL "\":%s, \"" D_YESTERDAY "\":%s, \"" D_TODAY "\":%s}}"), set, sey, sen);
}
else if (!strcasecmp_P(type, PSTR(D_CMND_HLWPCAL))) {
if ((payload > 0) && (payload < 32001)) {
@ -552,50 +549,50 @@ boolean hlw_command(char *type, uint16_t index, char *dataBuf, uint16_t data_len
if ((payload >= 0) && (payload < 3601)) {
sysCfg.hlw_mpl = payload;
}
snprintf_P(svalue, ssvalue, PSTR("{\"" D_CMND_MAXPOWER "\":\"%d%s\"}"), sysCfg.hlw_mpl, (sysCfg.flag.value_units) ? " " D_UNIT_WATT : "");
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("{\"" D_CMND_MAXPOWER "\":\"%d%s\"}"), sysCfg.hlw_mpl, (sysCfg.flag.value_units) ? " " D_UNIT_WATT : "");
}
else if (!strcasecmp_P(type, PSTR(D_CMND_MAXPOWERHOLD))) {
if ((payload >= 0) && (payload < 3601)) {
sysCfg.hlw_mplh = (1 == payload) ? MAX_POWER_HOLD : payload;
}
snprintf_P(svalue, ssvalue, PSTR("{\"" D_CMND_MAXPOWERHOLD "\":\"%d%s\"}"), sysCfg.hlw_mplh, (sysCfg.flag.value_units) ? " " D_UNIT_SECOND : "");
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("{\"" D_CMND_MAXPOWERHOLD "\":\"%d%s\"}"), sysCfg.hlw_mplh, (sysCfg.flag.value_units) ? " " D_UNIT_SECOND : "");
}
else if (!strcasecmp_P(type, PSTR(D_CMND_MAXPOWERWINDOW))) {
if ((payload >= 0) && (payload < 3601)) {
sysCfg.hlw_mplw = (1 == payload) ? MAX_POWER_WINDOW : payload;
}
snprintf_P(svalue, ssvalue, PSTR("{\"" D_CMND_MAXPOWERWINDOW "\":\"%d%s\"}"), sysCfg.hlw_mplw, (sysCfg.flag.value_units) ? " " D_UNIT_SECOND : "");
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("{\"" D_CMND_MAXPOWERWINDOW "\":\"%d%s\"}"), sysCfg.hlw_mplw, (sysCfg.flag.value_units) ? " " D_UNIT_SECOND : "");
}
else if (!strcasecmp_P(type, PSTR(D_CMND_SAFEPOWER))) {
if ((payload >= 0) && (payload < 3601)) {
sysCfg.hlw_mspl = payload;
}
snprintf_P(svalue, ssvalue, PSTR("{\"" D_CMND_SAFEPOWER "\":\"%d%s\"}"), sysCfg.hlw_mspl, (sysCfg.flag.value_units) ? " " D_UNIT_WATT : "");
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("{\"" D_CMND_SAFEPOWER "\":\"%d%s\"}"), sysCfg.hlw_mspl, (sysCfg.flag.value_units) ? " " D_UNIT_WATT : "");
}
else if (!strcasecmp_P(type, PSTR(D_CMND_SAFEPOWERHOLD))) {
if ((payload >= 0) && (payload < 3601)) {
sysCfg.hlw_msplh = (1 == payload) ? SAFE_POWER_HOLD : payload;
}
snprintf_P(svalue, ssvalue, PSTR("{\"" D_CMND_SAFEPOWERHOLD "\":\"%d%s\"}"), sysCfg.hlw_msplh, (sysCfg.flag.value_units) ? " " D_UNIT_SECOND : "");
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("{\"" D_CMND_SAFEPOWERHOLD "\":\"%d%s\"}"), sysCfg.hlw_msplh, (sysCfg.flag.value_units) ? " " D_UNIT_SECOND : "");
}
else if (!strcasecmp_P(type, PSTR(D_CMND_SAFEPOWERWINDOW))) {
if ((payload >= 0) && (payload < 1440)) {
sysCfg.hlw_msplw = (1 == payload) ? SAFE_POWER_WINDOW : payload;
}
snprintf_P(svalue, ssvalue, PSTR("{\"" D_CMND_SAFEPOWERWINDOW "\":\"%d%s\"}"), sysCfg.hlw_msplw, (sysCfg.flag.value_units) ? " " D_UNIT_MINUTE : "");
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("{\"" D_CMND_SAFEPOWERWINDOW "\":\"%d%s\"}"), sysCfg.hlw_msplw, (sysCfg.flag.value_units) ? " " D_UNIT_MINUTE : "");
}
else if (!strcasecmp_P(type, PSTR(D_CMND_MAXENERGY))) {
if ((payload >= 0) && (payload < 3601)) {
sysCfg.hlw_mkwh = payload;
hlw_mkwh_state = 3;
}
snprintf_P(svalue, ssvalue, PSTR("{\"" D_CMND_MAXENERGY "\":\"%d%s\"}"), sysCfg.hlw_mkwh, (sysCfg.flag.value_units) ? " " D_UNIT_WATTHOUR : "");
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("{\"" D_CMND_MAXENERGY "\":\"%d%s\"}"), sysCfg.hlw_mkwh, (sysCfg.flag.value_units) ? " " D_UNIT_WATTHOUR : "");
}
else if (!strcasecmp_P(type, PSTR(D_CMND_MAXENERGYSTART))) {
if ((payload >= 0) && (payload < 24)) {
sysCfg.hlw_mkwhs = payload;
}
snprintf_P(svalue, ssvalue, PSTR("{\"" D_CMND_MAXENERGYSTART "\":\"%d%s\"}"), sysCfg.hlw_mkwhs, (sysCfg.flag.value_units) ? " " D_UNIT_HOUR : "");
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("{\"" D_CMND_MAXENERGYSTART "\":\"%d%s\"}"), sysCfg.hlw_mkwhs, (sysCfg.flag.value_units) ? " " D_UNIT_HOUR : "");
}
#endif // FEATURE_POWER_LIMIT
else {
@ -603,13 +600,13 @@ boolean hlw_command(char *type, uint16_t index, char *dataBuf, uint16_t data_len
}
switch (caltext) {
case 1:
snprintf_P(svalue, ssvalue, PSTR("{\"" D_CMND_HLWPCAL "\":\"%d%s\"}"), sysCfg.hlw_pcal, (sysCfg.flag.value_units) ? " " D_UNIT_MICROSECOND : "");
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("{\"" D_CMND_HLWPCAL "\":\"%d%s\"}"), sysCfg.hlw_pcal, (sysCfg.flag.value_units) ? " " D_UNIT_MICROSECOND : "");
break;
case 2:
snprintf_P(svalue, ssvalue, PSTR("{\"" D_CMND_HLWUCAL "\":\"%d%s\"}"), sysCfg.hlw_ucal, (sysCfg.flag.value_units) ? " " D_UNIT_MICROSECOND : "");
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("{\"" D_CMND_HLWUCAL "\":\"%d%s\"}"), sysCfg.hlw_ucal, (sysCfg.flag.value_units) ? " " D_UNIT_MICROSECOND : "");
break;
case 3:
snprintf_P(svalue, ssvalue, PSTR("{\"" D_CMND_HLWICAL "\":\"%d%s\"}"), sysCfg.hlw_ical, (sysCfg.flag.value_units) ? " " D_UNIT_MICROSECOND : "");
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("{\"" D_CMND_HLWICAL "\":\"%d%s\"}"), sysCfg.hlw_ical, (sysCfg.flag.value_units) ? " " D_UNIT_MICROSECOND : "");
break;
}
return serviced;
@ -619,7 +616,7 @@ boolean hlw_command(char *type, uint16_t index, char *dataBuf, uint16_t data_len
* Presentation
\*********************************************************************************************/
void hlw_mqttStat(byte option, char* svalue, uint16_t ssvalue)
void hlw_mqttStat(byte option)
{
/* option 0 = do not show period energy usage
* option 1 = show period energy usage
@ -651,8 +648,8 @@ void hlw_mqttStat(byte option, char* svalue, uint16_t ssvalue)
dtostrfd(pc, 2, spc);
dtostrfd((float)sysCfg.hlw_kWhyesterday / 100000000, sysCfg.flag.energy_resolution, sey);
snprintf_P(speriod, sizeof(speriod), PSTR(", \"" D_PERIOD "\":%s"), spe);
snprintf_P(svalue, ssvalue, PSTR("%s\"" D_TOTAL "\":%s, \"" D_YESTERDAY "\":%s, \"" D_TODAY "\":%s%s, \"" D_POWERUSAGE "\":%s, \"" D_POWERFACTOR "\":%s, \"" D_VOLTAGE "\":%s, \"" D_CURRENT "\":%s}"),
svalue, spet, sey, sped, (option) ? speriod : "", spw, spc, spu, spi);
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("%s\"" D_TOTAL "\":%s, \"" D_YESTERDAY "\":%s, \"" D_TODAY "\":%s%s, \"" D_POWERUSAGE "\":%s, \"" D_POWERFACTOR "\":%s, \"" D_VOLTAGE "\":%s, \"" D_CURRENT "\":%s}"),
mqtt_data, spet, sey, sped, (option) ? speriod : "", spw, spc, spu, spi);
#ifdef USE_DOMOTICZ
if (option) { // Only send if telemetry
dtostrfd(pet * 1000, 1, spet);
@ -667,18 +664,16 @@ void hlw_mqttPresent(byte option)
* option 1 = show period energy usage
*/
// {"Time":"2017-03-04T13:37:24", "Total":0.013, "Yesterday":0.013, "Today":0.000, "Period":0, "Power":0, "Factor":0.00, "Voltage":0, "Current":0.000}
char svalue[200]; // was MESSZ
snprintf_P(svalue, sizeof(svalue), PSTR("{\"" D_TIME "\":\"%s\", "), getDateTime().c_str());
hlw_mqttStat(option, svalue, sizeof(svalue));
mqtt_publish_topic_P(2, PSTR(D_RSLT_ENERGY), svalue);
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("{\"" D_TIME "\":\"%s\", "), getDateTime().c_str());
hlw_mqttStat(option);
mqtt_publish_topic_P(2, PSTR(D_RSLT_ENERGY));
}
void hlw_mqttStatus(char* svalue, uint16_t ssvalue)
void hlw_mqttStatus()
{
snprintf_P(svalue, ssvalue, PSTR("{\"" D_CMND_STATUS D_STATUS8_POWER "\":{"));
hlw_mqttStat(0, svalue, ssvalue);
snprintf_P(svalue, ssvalue, PSTR("%s}"), svalue);
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("{\"" D_CMND_STATUS D_STATUS8_POWER "\":{"));
hlw_mqttStat(0);
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("%s}"), mqtt_data);
}
#ifdef USE_WEBSERVER

View File

@ -211,7 +211,6 @@ uint8_t htu_detect()
return true;
}
char log[LOGSZ];
boolean success = false;
htuaddr = HTU21_ADDR;
@ -244,8 +243,8 @@ uint8_t htu_detect()
delayH=23;
}
if (success) {
snprintf_P(log, sizeof(log), PSTR(D_LOG_I2C "%s " D_FOUND_AT " 0x%x"), htustype, htuaddr);
addLog(LOG_LEVEL_DEBUG, log);
snprintf_P(log_data, sizeof(log_data), PSTR(D_LOG_I2C "%s " D_FOUND_AT " 0x%x"), htustype, htuaddr);
addLog(LOG_LEVEL_DEBUG);
} else {
htutype = 0;
}
@ -256,7 +255,7 @@ uint8_t htu_detect()
* Presentation
\*********************************************************************************************/
void htu_mqttPresent(char* svalue, uint16_t ssvalue, uint8_t* djson)
void htu_mqttPresent(uint8_t* djson)
{
if (!htutype) {
return;
@ -270,7 +269,7 @@ void htu_mqttPresent(char* svalue, uint16_t ssvalue, uint8_t* djson)
h = htu21_compensatedHumidity(h, t);
dtostrfd(t, sysCfg.flag.temperature_resolution, stemp1);
dtostrfd(h, sysCfg.flag.humidity_resolution, stemp2);
snprintf_P(svalue, ssvalue, JSON_SNS_TEMPHUM, svalue, htustype, stemp1, stemp2);
snprintf_P(mqtt_data, sizeof(mqtt_data), JSON_SNS_TEMPHUM, mqtt_data, htustype, stemp1, stemp2);
*djson = 1;
#ifdef USE_DOMOTICZ
domoticz_sensor2(stemp1, stemp2);

View File

@ -184,7 +184,7 @@ boolean sht_detect()
* Presentation
\*********************************************************************************************/
void sht_mqttPresent(char* svalue, uint16_t ssvalue, uint8_t* djson)
void sht_mqttPresent(uint8_t* djson)
{
if (!shttype) {
return;
@ -199,7 +199,7 @@ void sht_mqttPresent(char* svalue, uint16_t ssvalue, uint8_t* djson)
dtostrfd(t, sysCfg.flag.temperature_resolution, stemp);
dtostrfd(h, sysCfg.flag.humidity_resolution, shum);
snprintf_P(svalue, ssvalue, JSON_SNS_TEMPHUM, svalue, "SHT1X", stemp, shum);
snprintf_P(mqtt_data, sizeof(mqtt_data), JSON_SNS_TEMPHUM, mqtt_data, "SHT1X", stemp, shum);
*djson = 1;
#ifdef USE_DOMOTICZ
domoticz_sensor2(stemp, shum);