"
#ifdef LANGUAGE_MODULE_NAME
- "
" D_MODULE " {ha
{h}
";
+ "
" D_MODULE " {ha
"
#else
- "
{ha " D_MODULE "
{h}
";
+ "
{ha " D_MODULE "
"
#endif
+ "
{h}
";
const char HTTP_SCRIPT_CONSOL[] PROGMEM =
"var sn=0;" // Scroll position
"var id=0;" // Get most of weblog initially
diff --git a/sonoff/xdrv_03_energy.ino b/sonoff/xdrv_03_energy.ino
index 3e12ef94f..1e73d3f03 100644
--- a/sonoff/xdrv_03_energy.ino
+++ b/sonoff/xdrv_03_energy.ino
@@ -307,7 +307,6 @@ void CseReceived()
// 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
// 55 5A 02 F7 60 00 03 AB 00 40 10 02 60 5D 51 A6 58 03 E9 EF 71 0B 7A 36
// Hd Id VCal---- Voltage- ICal---- Current- PCal---- Power--- Ad CF--- Ck
- AddLogSerial(LOG_LEVEL_DEBUG_MORE);
uint8_t header = serial_in_buffer[0];
if ((header & 0xFC) == 0xFC) {
@@ -315,14 +314,6 @@ void CseReceived()
return;
}
- // Calculate checksum
- uint8_t checksum = 0;
- for (byte i = 2; i < 23; i++) checksum += serial_in_buffer[i];
- if (checksum != serial_in_buffer[23]) {
- AddLog_P(LOG_LEVEL_DEBUG, PSTR("CSE: " D_CHECKSUM_FAILURE));
- return;
- }
-
// Get chip calibration data (coefficients) and use as initial defaults
if (HLW_UREF_PULSE == Settings.energy_voltage_calibration) {
long voltage_coefficient = 191200; // uSec
@@ -392,24 +383,36 @@ bool CseSerialInput()
if (cse_receive_flag) {
serial_in_buffer[serial_in_byte_counter++] = serial_in_byte;
if (24 == serial_in_byte_counter) {
- CseReceived();
- cse_receive_flag = 0;
- return 1;
+
+ AddLogSerial(LOG_LEVEL_DEBUG_MORE);
+
+ uint8_t checksum = 0;
+ for (byte i = 2; i < 23; i++) { checksum += serial_in_buffer[i]; }
+ if (checksum == serial_in_buffer[23]) {
+ CseReceived();
+ cse_receive_flag = 0;
+ return 1;
+ } else {
+ AddLog_P(LOG_LEVEL_DEBUG, PSTR("CSE: " D_CHECKSUM_FAILURE));
+ do { // Sync buffer with data (issue #1907 and #3425)
+ memmove(serial_in_buffer, serial_in_buffer +1, 24);
+ serial_in_byte_counter--;
+ } while ((serial_in_byte_counter > 2) && (0x5A != serial_in_buffer[1]));
+ if (0x5A != serial_in_buffer[1]) {
+ cse_receive_flag = 0;
+ serial_in_byte_counter = 0;
+ }
+ }
}
} else {
- if ((0x5A == serial_in_byte) && (serial_in_byte_counter)) { // 0x5A - Packet header 2
- if (serial_in_byte_counter > 1) { // Sync buffer with data (issue #1907)
- serial_in_buffer[0] = serial_in_buffer[--serial_in_byte_counter];
- serial_in_byte_counter = 1;
- AddLog_P(LOG_LEVEL_DEBUG, PSTR("CSE: Fixed out-of-sync"));
- }
+ if ((0x5A == serial_in_byte) && (1 == serial_in_byte_counter)) { // 0x5A - Packet header 2
cse_receive_flag = 1;
} else {
serial_in_byte_counter = 0;
}
serial_in_buffer[serial_in_byte_counter++] = serial_in_byte;
}
- serial_in_byte = 0; // Discard
+ serial_in_byte = 0; // Discard
return 0;
}
@@ -917,17 +920,20 @@ boolean EnergyCommand()
case 3:
RtcSettings.energy_kWhtotal = lnum *100;
Settings.energy_kWhtotal = RtcSettings.energy_kWhtotal;
+ energy_total = (float)(RtcSettings.energy_kWhtotal + energy_kWhtoday) / 100000;
break;
}
}
char energy_yesterday_chr[10];
- char stoday_energy[10];
+ char energy_daily_chr[10];
char energy_total_chr[10];
+
+ dtostrfd(energy_total, Settings.flag2.energy_resolution, energy_total_chr);
+ dtostrfd(energy_daily, Settings.flag2.energy_resolution, energy_daily_chr);
dtostrfd((float)Settings.energy_kWhyesterday / 100000, Settings.flag2.energy_resolution, energy_yesterday_chr);
- dtostrfd((float)RtcSettings.energy_kWhtoday / 100000, Settings.flag2.energy_resolution, stoday_energy);
- dtostrfd((float)(RtcSettings.energy_kWhtotal + energy_kWhtoday) / 100000, Settings.flag2.energy_resolution, energy_total_chr);
+
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("{\"%s\":{\"" D_JSON_TOTAL "\":%s,\"" D_JSON_YESTERDAY "\":%s,\"" D_JSON_TODAY "\":%s}}"),
- command, energy_total_chr, energy_yesterday_chr, stoday_energy);
+ command, energy_total_chr, energy_yesterday_chr, energy_daily_chr);
status_flag = 1;
}
@@ -1153,7 +1159,7 @@ void EnergyShow(boolean json)
#ifdef USE_DOMOTICZ
if (show_energy_period) { // Only send if telemetry
dtostrfd(energy_total * 1000, 1, energy_total_chr);
- DomoticzSensorPowerEnergy((uint16_t)energy_power, energy_total_chr); // PowerUsage, EnergyToday
+ DomoticzSensorPowerEnergy((int)energy_power, energy_total_chr); // PowerUsage, EnergyToday
DomoticzSensor(DZ_VOLTAGE, energy_voltage_chr); // Voltage
DomoticzSensor(DZ_CURRENT, energy_current_chr); // Current
}
diff --git a/sonoff/xdrv_07_domoticz.ino b/sonoff/xdrv_07_domoticz.ino
index f29def2ce..a7eb7708f 100644
--- a/sonoff/xdrv_07_domoticz.ino
+++ b/sonoff/xdrv_07_domoticz.ino
@@ -179,12 +179,25 @@ boolean DomoticzMqttData()
snprintf_P(log_data, sizeof(log_data), PSTR(D_LOG_DOMOTICZ "idx %d, nvalue %d"), idx, nvalue);
AddLog(LOG_LEVEL_DEBUG_MORE);
- if ((idx > 0) && (nvalue >= 0) && (nvalue <= 2)) {
+ if ((idx > 0) && (nvalue >= 0) && (nvalue <= 15)) {
uint8_t maxdev = (devices_present > MAX_DOMOTICZ_IDX) ? MAX_DOMOTICZ_IDX : devices_present;
for (byte i = 0; i < maxdev; i++) {
if (idx == Settings.domoticz_relay_idx[i]) {
+ bool iscolordimmer = strcmp_P(domoticz["dtype"],PSTR("Color Switch")) == 0;
snprintf_P(stemp1, sizeof(stemp1), PSTR("%d"), i +1);
- if (2 == nvalue) {
+ if (iscolordimmer && 10 == nvalue) { // Color_SetColor
+ JsonObject& color = domoticz["Color"];
+ uint16_t level = nvalue = domoticz["svalue1"];
+ uint16_t r = color["r"]; r = r * level / 100;
+ uint16_t g = color["g"]; g = g * level / 100;
+ uint16_t b = color["b"]; b = b * level / 100;
+ uint16_t cw = color["cw"]; cw = cw * level / 100;
+ uint16_t ww = color["ww"]; ww = ww * level / 100;
+ snprintf_P(XdrvMailbox.topic, XdrvMailbox.index, PSTR("/" D_CMND_COLOR));
+ snprintf_P(XdrvMailbox.data, XdrvMailbox.data_len, PSTR("%02x%02x%02x%02x%02x"), r, g, b, cw, ww);
+ found = 1;
+ } else if ((!iscolordimmer && 2 == nvalue) || // gswitch_sSetLevel
+ (iscolordimmer && 15 == nvalue)) { // Color_SetBrightnessLevel
nvalue = domoticz["svalue1"];
if (light_type && (Settings.light_dimmer == nvalue) && ((power >> i) &1)) {
return 1;
@@ -192,7 +205,7 @@ boolean DomoticzMqttData()
snprintf_P(XdrvMailbox.topic, XdrvMailbox.index, PSTR("/" D_CMND_DIMMER));
snprintf_P(XdrvMailbox.data, XdrvMailbox.data_len, PSTR("%d"), nvalue);
found = 1;
- } else {
+ } else if (1 == nvalue || 0 == nvalue) {
if (((power >> i) &1) == (power_t)nvalue) {
return 1;
}
@@ -346,7 +359,7 @@ void DomoticzTempHumPressureSensor(char *temp, char *hum, char *baro)
DomoticzSensor(DZ_TEMP_HUM_BARO, data);
}
-void DomoticzSensorPowerEnergy(uint16_t power, char *energy)
+void DomoticzSensorPowerEnergy(int power, char *energy)
{
char data[16];
snprintf_P(data, sizeof(data), PSTR("%d;%s"), power, energy);
diff --git a/sonoff/xdrv_10_rules.ino b/sonoff/xdrv_10_rules.ino
index 6bcfb4538..4139d0273 100644
--- a/sonoff/xdrv_10_rules.ino
+++ b/sonoff/xdrv_10_rules.ino
@@ -63,13 +63,6 @@
* RuleTimer2 100
\*********************************************************************************************/
-#define MAX_RULE_TIMERS 8
-#define RULES_MAX_VARS 5
-
-#ifndef ULONG_MAX
-#define ULONG_MAX 0xffffffffUL
-#endif
-
#define D_CMND_RULE "Rule"
#define D_CMND_RULETIMER "RuleTimer"
#define D_CMND_EVENT "Event"
@@ -97,54 +90,7 @@ uint8_t rules_trigger_count[MAX_RULE_SETS] = { 0 };
uint8_t rules_teleperiod = 0;
char event_data[100];
-char vars[RULES_MAX_VARS][10] = { 0 };
-
-/*******************************************************************************************/
-
-long TimeDifference(unsigned long prev, unsigned long next)
-{
- // Return the time difference as a signed value, taking into account the timers may overflow.
- // Returned timediff is between -24.9 days and +24.9 days.
- // Returned value is positive when "next" is after "prev"
- long signed_diff = 0;
- // To cast a value to a signed long, the difference may not exceed half the ULONG_MAX
- const unsigned long half_max_unsigned_long = 2147483647u; // = 2^31 -1
- if (next >= prev) {
- const unsigned long diff = next - prev;
- if (diff <= half_max_unsigned_long) { // Normal situation, just return the difference.
- signed_diff = static_cast