mirror of https://github.com/arendst/Tasmota.git
v5.1.2
5.1.2 20170519 * Fix Counter/Timer JSON message and update Counter/Timer on webpage * Fix WS2812 Domoticz related regression issues
This commit is contained in:
parent
88648a8099
commit
26d3a8c191
|
@ -1,7 +1,7 @@
|
||||||
## Sonoff-Tasmota
|
## Sonoff-Tasmota
|
||||||
Provide ESP8266 based Sonoff by [iTead Studio](https://www.itead.cc/) and ElectroDragon IoT Relay with Serial, Web and MQTT control allowing 'Over the Air' or OTA firmware updates using Arduino IDE.
|
Provide ESP8266 based Sonoff by [iTead Studio](https://www.itead.cc/) and ElectroDragon IoT Relay with Serial, Web and MQTT control allowing 'Over the Air' or OTA firmware updates using Arduino IDE.
|
||||||
|
|
||||||
Current version is **5.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 ****
|
### **** ATTENTION Version 5.x.x specific information ****
|
||||||
|
|
||||||
|
|
Binary file not shown.
|
@ -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
|
* Allow command FullTopic in group mode
|
||||||
* Prepare for more use of RTC memory
|
* Prepare for more use of RTC memory
|
||||||
* Add independant WS2812 led string power control (#386, #390)
|
* Add independant WS2812 led string power control (#386, #390)
|
||||||
|
|
|
@ -24,7 +24,7 @@
|
||||||
- Select IDE Tools - Flash size: "1M (no SPIFFS)"
|
- 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 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};
|
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)
|
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());
|
snprintf_P(svalue, ssvalue, PSTR("%s{\"Time\":\"%s\""), svalue, getDateTime().c_str());
|
||||||
for (byte i = 0; i < 4; i++) {
|
for (byte i = 0; i < 4; i++) {
|
||||||
if (pin[GPIO_SWT1 +i] < 99) {
|
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++) {
|
for (byte i = 0; i < 4; i++) {
|
||||||
if (pin[GPIO_CNTR1 +i] < 99) {
|
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;
|
*djson = 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -2467,7 +2474,6 @@ void GPIO_init()
|
||||||
analogWrite(pin[GPIO_PWM1 +i], sysCfg.pwmvalue[i]);
|
analogWrite(pin[GPIO_PWM1 +i], sysCfg.pwmvalue[i]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
counter_init();
|
|
||||||
|
|
||||||
if (EXS_RELAY == sysCfg.module) {
|
if (EXS_RELAY == sysCfg.module) {
|
||||||
setLatchingRelay(0,2);
|
setLatchingRelay(0,2);
|
||||||
|
@ -2475,6 +2481,21 @@ void GPIO_init()
|
||||||
}
|
}
|
||||||
setLed(sysCfg.ledstate &8);
|
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));
|
hlw_flg = ((pin[GPIO_HLW_SEL] < 99) && (pin[GPIO_HLW_CF1] < 99) && (pin[GPIO_HLW_CF] < 99));
|
||||||
if (hlw_flg) {
|
if (hlw_flg) {
|
||||||
hlw_init();
|
hlw_init();
|
||||||
|
@ -2498,19 +2519,6 @@ void GPIO_init()
|
||||||
Wire.begin(pin[GPIO_I2C_SDA], pin[GPIO_I2C_SCL]);
|
Wire.begin(pin[GPIO_I2C_SDA], pin[GPIO_I2C_SCL]);
|
||||||
}
|
}
|
||||||
#endif // USE_I2C
|
#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" {
|
extern "C" {
|
||||||
|
|
|
@ -251,7 +251,7 @@ const char HTTP_TABLE100[] PROGMEM =
|
||||||
const char HTTP_COUNTER[] PROGMEM =
|
const char HTTP_COUNTER[] PROGMEM =
|
||||||
"<br/><div id='t' name='t' style='text-align:center;'></div>";
|
"<br/><div id='t' name='t' style='text-align:center;'></div>";
|
||||||
const char HTTP_SNS_COUNTER[] PROGMEM =
|
const char HTTP_SNS_COUNTER[] PROGMEM =
|
||||||
"<tr><th>Counter%d</th><td>%d</td></tr>";
|
"<tr><th>Counter%d</th><td>%s%s</td></tr>";
|
||||||
const char HTTP_SNS_TEMP[] PROGMEM =
|
const char HTTP_SNS_TEMP[] PROGMEM =
|
||||||
"<tr><th>%s Temperature</th><td>%s°%c</td></tr>";
|
"<tr><th>%s Temperature</th><td>%s°%c</td></tr>";
|
||||||
const char HTTP_SNS_HUM[] PROGMEM =
|
const char HTTP_SNS_HUM[] PROGMEM =
|
||||||
|
@ -449,7 +449,8 @@ void handleRoot()
|
||||||
|
|
||||||
void handleAjax2()
|
void handleAjax2()
|
||||||
{
|
{
|
||||||
char svalue[80];
|
char svalue[16];
|
||||||
|
char sensor[80];
|
||||||
|
|
||||||
if (strlen(webServer->arg("o").c_str())) {
|
if (strlen(webServer->arg("o").c_str())) {
|
||||||
do_cmnd_power(atoi(webServer->arg("o").c_str()), 2);
|
do_cmnd_power(atoi(webServer->arg("o").c_str()), 2);
|
||||||
|
@ -462,8 +463,13 @@ void handleAjax2()
|
||||||
String tpage = "";
|
String tpage = "";
|
||||||
for (byte i = 0; i < 4; i++) {
|
for (byte i = 0; i < 4; i++) {
|
||||||
if (pin[GPIO_CNTR1 +i] < 99) {
|
if (pin[GPIO_CNTR1 +i] < 99) {
|
||||||
snprintf_P(svalue, sizeof(svalue), HTTP_SNS_COUNTER, i+1, rtcMem.pCounter[i]);
|
if (bitRead(sysCfg.pCounterType, i)) {
|
||||||
tpage += svalue;
|
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) {
|
if (hlw_flg) {
|
||||||
|
|
|
@ -42,6 +42,7 @@ const char HTTP_FORM_DOMOTICZ_TIMER[] PROGMEM =
|
||||||
const char domoticz_sensors[DOMOTICZ_MAX_SENSORS][14] PROGMEM =
|
const char domoticz_sensors[DOMOTICZ_MAX_SENSORS][14] PROGMEM =
|
||||||
{ "Temp", "Temp,Hum", "Temp,Hum,Baro", "Power,Energy", "Illuminance" };
|
{ "Temp", "Temp,Hum", "Temp,Hum,Baro", "Power,Energy", "Illuminance" };
|
||||||
|
|
||||||
|
boolean domoticz_subscribe = false;
|
||||||
int domoticz_update_timer = 0;
|
int domoticz_update_timer = 0;
|
||||||
byte domoticz_update_flag = 1;
|
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]);
|
sysCfg.domoticz_relay_idx[device -1], sysCfg.led_dimmer[device -1]);
|
||||||
mqtt_publish(sysCfg.domoticz_in_topic, svalue);
|
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\"}"),
|
snprintf_P(svalue, sizeof(svalue), PSTR("{\"idx\":%d,\"nvalue\":2,\"svalue\":\"%d\"}"),
|
||||||
sysCfg.domoticz_relay_idx[device -1], sysCfg.ws_dimmer);
|
sysCfg.domoticz_relay_idx[device -1], sysCfg.ws_dimmer);
|
||||||
mqtt_publish(sysCfg.domoticz_in_topic, svalue);
|
mqtt_publish(sysCfg.domoticz_in_topic, svalue);
|
||||||
|
@ -80,7 +81,7 @@ void domoticz_updatePowerState(byte device)
|
||||||
|
|
||||||
void domoticz_mqttUpdate()
|
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--;
|
domoticz_update_timer--;
|
||||||
if (domoticz_update_timer <= 0) {
|
if (domoticz_update_timer <= 0) {
|
||||||
domoticz_update_timer = sysCfg.domoticz_update_timer;
|
domoticz_update_timer = sysCfg.domoticz_update_timer;
|
||||||
|
@ -98,7 +99,12 @@ void domoticz_setUpdateTimer(uint16_t value)
|
||||||
|
|
||||||
void domoticz_mqttSubscribe()
|
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];
|
char stopic[TOPSZ];
|
||||||
snprintf_P(stopic, sizeof(stopic), PSTR("%s/#"), sysCfg.domoticz_out_topic); // domoticz topic
|
snprintf_P(stopic, sizeof(stopic), PSTR("%s/#"), sysCfg.domoticz_out_topic); // domoticz topic
|
||||||
mqttClient.subscribe(stopic);
|
mqttClient.subscribe(stopic);
|
||||||
|
|
|
@ -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)) {
|
else if (!strcmp_P(type,PSTR("LED")) && (index > 0) && (index <= sysCfg.ws_pixels)) {
|
||||||
if (6 == data_len) {
|
if (6 == data_len) {
|
||||||
// ws2812_setColor(index, dataBufUc);
|
|
||||||
ws2812_setColor(index, dataBuf);
|
ws2812_setColor(index, dataBuf);
|
||||||
}
|
}
|
||||||
ws2812_getColor(index, svalue, ssvalue);
|
ws2812_getColor(index, svalue, ssvalue);
|
||||||
}
|
}
|
||||||
else if (!strcmp_P(type,PSTR("COLOR"))) {
|
else if (!strcmp_P(type,PSTR("COLOR"))) {
|
||||||
if (6 == data_len) {
|
if (6 == data_len) {
|
||||||
// ws2812_setColor(0, dataBufUc);
|
|
||||||
ws2812_setColor(0, dataBuf);
|
ws2812_setColor(0, dataBuf);
|
||||||
bitSet(power, ws_bit);
|
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;
|
sysCfg.ws_dimmer = payload;
|
||||||
bitSet(power, ws_bit);
|
bitSet(power, ws_bit);
|
||||||
#ifdef USE_DOMOTICZ
|
#ifdef USE_DOMOTICZ
|
||||||
mqtt_publishDomoticzPowerState(index);
|
// mqtt_publishDomoticzPowerState(index);
|
||||||
|
mqtt_publishDomoticzPowerState(ws_bit +1);
|
||||||
#endif // USE_DOMOTICZ
|
#endif // USE_DOMOTICZ
|
||||||
}
|
}
|
||||||
snprintf_P(svalue, ssvalue, PSTR("{\"Dimmer\":%d}"), sysCfg.ws_dimmer);
|
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);
|
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"))) {
|
else if (!strcmp_P(type,PSTR("WAKEUP"))) {
|
||||||
if ((data_len > 0) && (payload > 0) && (payload < 3601)) {
|
if ((data_len > 0) && (payload > 0) && (payload < 3601)) {
|
||||||
sysCfg.ws_wakeup = payload;
|
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);
|
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 {
|
else {
|
||||||
serviced = false; // Unknown command
|
serviced = false; // Unknown command
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue