diff --git a/README.md b/README.md
index f55adc2c6..792c8af10 100644
--- a/README.md
+++ b/README.md
@@ -1,7 +1,7 @@
## Sonoff-Tasmota
Provide ESP8266 based Sonoff by [iTead Studio](https://www.itead.cc/) and ElectroDragon IoT Relay with Serial, Web and MQTT control allowing 'Over the Air' or OTA firmware updates using Arduino IDE.
-Current version is **5.1.1** - See [sonoff/_releasenotes.ino](https://github.com/arendst/Sonoff-Tasmota/blob/master/sonoff/_releasenotes.ino) for change information.
+Current version is **5.1.2** - See [sonoff/_releasenotes.ino](https://github.com/arendst/Sonoff-Tasmota/blob/master/sonoff/_releasenotes.ino) for change information.
### **** ATTENTION Version 5.x.x specific information ****
diff --git a/api/arduino/sonoff.ino.bin b/api/arduino/sonoff.ino.bin
index f2bbac47b..9725e41c3 100644
Binary files a/api/arduino/sonoff.ino.bin and b/api/arduino/sonoff.ino.bin differ
diff --git a/sonoff/_releasenotes.ino b/sonoff/_releasenotes.ino
index 8cd202877..b81a7dcdb 100644
--- a/sonoff/_releasenotes.ino
+++ b/sonoff/_releasenotes.ino
@@ -1,4 +1,8 @@
-/* 5.1.1 20170517
+/* 5.1.2 20170519
+ * Fix Counter/Timer JSON message and update Counter/Timer on webpage
+ * Fix WS2812 Domoticz related regression issues
+ *
+ * 5.1.1 20170517
* Allow command FullTopic in group mode
* Prepare for more use of RTC memory
* Add independant WS2812 led string power control (#386, #390)
diff --git a/sonoff/sonoff.ino b/sonoff/sonoff.ino
index 454db32ae..7767e9a40 100644
--- a/sonoff/sonoff.ino
+++ b/sonoff/sonoff.ino
@@ -24,7 +24,7 @@
- Select IDE Tools - Flash size: "1M (no SPIFFS)"
====================================================*/
-#define VERSION 0x05010100 // 5.1.1
+#define VERSION 0x05010200 // 5.1.2
enum log_t {LOG_LEVEL_NONE, LOG_LEVEL_ERROR, LOG_LEVEL_INFO, LOG_LEVEL_DEBUG, LOG_LEVEL_DEBUG_MORE, LOG_LEVEL_ALL};
enum week_t {Last, First, Second, Third, Fourth};
@@ -1799,6 +1799,8 @@ void state_mqttPresent(char* svalue, uint16_t ssvalue)
void sensors_mqttPresent(char* svalue, uint16_t ssvalue, uint8_t* djson)
{
+ char stemp[16];
+
snprintf_P(svalue, ssvalue, PSTR("%s{\"Time\":\"%s\""), svalue, getDateTime().c_str());
for (byte i = 0; i < 4; i++) {
if (pin[GPIO_SWT1 +i] < 99) {
@@ -1809,7 +1811,12 @@ void sensors_mqttPresent(char* svalue, uint16_t ssvalue, uint8_t* djson)
}
for (byte i = 0; i < 4; i++) {
if (pin[GPIO_CNTR1 +i] < 99) {
- snprintf_P(svalue, ssvalue, PSTR("%s, {\"Counter%d\":%d}"), svalue, i +1, rtcMem.pCounter[i]);
+ if (bitRead(sysCfg.pCounterType, i)) {
+ dtostrf((double)rtcMem.pCounter[i] / 1000, 1, 3, stemp);
+ } else {
+ dtostrf(rtcMem.pCounter[i], 1, 0, stemp);
+ }
+ snprintf_P(svalue, ssvalue, PSTR("%s, \"Counter%d\":%s"), svalue, i +1, stemp);
*djson = 1;
}
}
@@ -2467,7 +2474,6 @@ void GPIO_init()
analogWrite(pin[GPIO_PWM1 +i], sysCfg.pwmvalue[i]);
}
}
- counter_init();
if (EXS_RELAY == sysCfg.module) {
setLatchingRelay(0,2);
@@ -2475,6 +2481,21 @@ void GPIO_init()
}
setLed(sysCfg.ledstate &8);
+#ifdef USE_WS2812
+ if (pin[GPIO_WS2812] < 99) {
+ Maxdevice++;
+ ws2812_init(Maxdevice);
+ }
+#endif // USE_WS2812
+
+#ifdef USE_IR_REMOTE
+ if (pin[GPIO_IRSEND] < 99) {
+ ir_send_init();
+ }
+#endif // USE_IR_REMOTE
+
+ counter_init();
+
hlw_flg = ((pin[GPIO_HLW_SEL] < 99) && (pin[GPIO_HLW_CF1] < 99) && (pin[GPIO_HLW_CF] < 99));
if (hlw_flg) {
hlw_init();
@@ -2498,19 +2519,6 @@ void GPIO_init()
Wire.begin(pin[GPIO_I2C_SDA], pin[GPIO_I2C_SCL]);
}
#endif // USE_I2C
-
-#ifdef USE_WS2812
- if (pin[GPIO_WS2812] < 99) {
- Maxdevice++;
- ws2812_init(Maxdevice);
- }
-#endif // USE_WS2812
-
-#ifdef USE_IR_REMOTE
- if (pin[GPIO_IRSEND] < 99) {
- ir_send_init();
- }
-#endif // USE_IR_REMOTE
}
extern "C" {
diff --git a/sonoff/webserver.ino b/sonoff/webserver.ino
index 960a7e5ef..9c21066b7 100644
--- a/sonoff/webserver.ino
+++ b/sonoff/webserver.ino
@@ -251,7 +251,7 @@ const char HTTP_TABLE100[] PROGMEM =
const char HTTP_COUNTER[] PROGMEM =
"
";
const char HTTP_SNS_COUNTER[] PROGMEM =
- "Counter%d | %d |
";
+ "Counter%d | %s%s |
";
const char HTTP_SNS_TEMP[] PROGMEM =
"%s Temperature | %s°%c |
";
const char HTTP_SNS_HUM[] PROGMEM =
@@ -449,7 +449,8 @@ void handleRoot()
void handleAjax2()
{
- char svalue[80];
+ char svalue[16];
+ char sensor[80];
if (strlen(webServer->arg("o").c_str())) {
do_cmnd_power(atoi(webServer->arg("o").c_str()), 2);
@@ -462,8 +463,13 @@ void handleAjax2()
String tpage = "";
for (byte i = 0; i < 4; i++) {
if (pin[GPIO_CNTR1 +i] < 99) {
- snprintf_P(svalue, sizeof(svalue), HTTP_SNS_COUNTER, i+1, rtcMem.pCounter[i]);
- tpage += svalue;
+ if (bitRead(sysCfg.pCounterType, i)) {
+ dtostrf((double)rtcMem.pCounter[i] / 1000, 1, 3, svalue);
+ } else {
+ dtostrf(rtcMem.pCounter[i], 1, 0, svalue);
+ }
+ snprintf_P(sensor, sizeof(sensor), HTTP_SNS_COUNTER, i+1, svalue, (bitRead(sysCfg.pCounterType, i)) ? " Sec" : "");
+ tpage += sensor;
}
}
if (hlw_flg) {
diff --git a/sonoff/xdrv_domoticz.ino b/sonoff/xdrv_domoticz.ino
index fc1282539..bb63559d0 100644
--- a/sonoff/xdrv_domoticz.ino
+++ b/sonoff/xdrv_domoticz.ino
@@ -42,6 +42,7 @@ const char HTTP_FORM_DOMOTICZ_TIMER[] PROGMEM =
const char domoticz_sensors[DOMOTICZ_MAX_SENSORS][14] PROGMEM =
{ "Temp", "Temp,Hum", "Temp,Hum,Baro", "Power,Energy", "Illuminance" };
+boolean domoticz_subscribe = false;
int domoticz_update_timer = 0;
byte domoticz_update_flag = 1;
@@ -59,7 +60,7 @@ void mqtt_publishDomoticzPowerState(byte device)
sysCfg.domoticz_relay_idx[device -1], sysCfg.led_dimmer[device -1]);
mqtt_publish(sysCfg.domoticz_in_topic, svalue);
}
- else if ((1 == device) && (pin[GPIO_WS2812] < 99)) {
+ 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(sysCfg.domoticz_in_topic, svalue);
@@ -80,7 +81,7 @@ void domoticz_updatePowerState(byte device)
void domoticz_mqttUpdate()
{
- if ((sysCfg.domoticz_update_timer || domoticz_update_timer) && sysCfg.domoticz_relay_idx[0]) {
+ if (domoticz_subscribe && (sysCfg.domoticz_update_timer || domoticz_update_timer)) {
domoticz_update_timer--;
if (domoticz_update_timer <= 0) {
domoticz_update_timer = sysCfg.domoticz_update_timer;
@@ -98,7 +99,12 @@ void domoticz_setUpdateTimer(uint16_t value)
void domoticz_mqttSubscribe()
{
- if (sysCfg.domoticz_relay_idx[0] && (strlen(sysCfg.domoticz_out_topic) != 0)) {
+ for (byte i = 0; i < Maxdevice; i++) {
+ if (sysCfg.domoticz_relay_idx[i]) {
+ domoticz_subscribe = true;
+ }
+ }
+ if (domoticz_subscribe && (strlen(sysCfg.domoticz_out_topic) != 0)) {
char stopic[TOPSZ];
snprintf_P(stopic, sizeof(stopic), PSTR("%s/#"), sysCfg.domoticz_out_topic); // domoticz topic
mqttClient.subscribe(stopic);
diff --git a/sonoff/xdrv_ws2812.ino b/sonoff/xdrv_ws2812.ino
index 5989984d8..6979df479 100644
--- a/sonoff/xdrv_ws2812.ino
+++ b/sonoff/xdrv_ws2812.ino
@@ -537,14 +537,12 @@ boolean ws2812_command(char *type, uint16_t index, char *dataBuf, uint16_t data_
}
else if (!strcmp_P(type,PSTR("LED")) && (index > 0) && (index <= sysCfg.ws_pixels)) {
if (6 == data_len) {
-// ws2812_setColor(index, dataBufUc);
ws2812_setColor(index, dataBuf);
}
ws2812_getColor(index, svalue, ssvalue);
}
else if (!strcmp_P(type,PSTR("COLOR"))) {
if (6 == data_len) {
-// ws2812_setColor(0, dataBufUc);
ws2812_setColor(0, dataBuf);
bitSet(power, ws_bit);
}
@@ -555,7 +553,8 @@ boolean ws2812_command(char *type, uint16_t index, char *dataBuf, uint16_t data_
sysCfg.ws_dimmer = payload;
bitSet(power, ws_bit);
#ifdef USE_DOMOTICZ
- mqtt_publishDomoticzPowerState(index);
+// mqtt_publishDomoticzPowerState(index);
+ mqtt_publishDomoticzPowerState(ws_bit +1);
#endif // USE_DOMOTICZ
}
snprintf_P(svalue, ssvalue, PSTR("{\"Dimmer\":%d}"), sysCfg.ws_dimmer);
@@ -601,23 +600,6 @@ boolean ws2812_command(char *type, uint16_t index, char *dataBuf, uint16_t data_
}
snprintf_P(svalue, ssvalue, PSTR("{\"Width\":%d}"), sysCfg.ws_width);
}
- else if (!strcmp_P(type,PSTR("UNDOCA"))) { // Theos WS2812 legacy status
- RgbColor mcolor;
- char mtopic[TOPSZ];
- getTopic_P(mtopic, 1, sysCfg.mqtt_topic, type);
- 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("%s, %s, %d, %d, %d, %06X, %d, 0, %d, %d, %d, %d, %d, %d"),
- Version, sysCfg.mqtt_topic, bitRead(power, ws_bit), sysCfg.ws_fade, sysCfg.ws_dimmer, color,
- sysCfg.ws_pixels, sysCfg.ws_wakeup,
- sysCfg.ws_scheme, sysCfg.ws_speed, sysCfg.ws_width, sysCfg.timezone, sysCfg.ws_ledtable);
- mqtt_publish(mtopic, svalue);
-// snprintf_P(svalue, ssvalue, PSTR("{\"UndocA\":\"Done\"}"));
- svalue[0] = '\0';
- }
else if (!strcmp_P(type,PSTR("WAKEUP"))) {
if ((data_len > 0) && (payload > 0) && (payload < 3601)) {
sysCfg.ws_wakeup = payload;
@@ -638,6 +620,20 @@ boolean ws2812_command(char *type, uint16_t index, char *dataBuf, uint16_t data_
}
snprintf_P(svalue, ssvalue, PSTR("{\"Scheme\":%d}"), sysCfg.ws_scheme);
}
+ else if (!strcmp_P(type,PSTR("UNDOCA"))) { // Theos WS2812 legacy status
+ RgbColor mcolor;
+ char mtopic[TOPSZ];
+ getTopic_P(mtopic, 1, sysCfg.mqtt_topic, type);
+ 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(mtopic, svalue);
+ svalue[0] = '\0';
+ }
else {
serviced = false; // Unknown command
}