Refactor and document power control

Refactor and document power control
This commit is contained in:
Theo Arends 2019-09-04 12:20:04 +02:00
parent 636e842545
commit f88e87cfde
13 changed files with 149 additions and 98 deletions

View File

@ -231,7 +231,11 @@ enum EmulationOptions {EMUL_NONE, EMUL_WEMO, EMUL_HUE, EMUL_MAX};
enum TopicOptions { CMND, STAT, TELE, nu1, RESULT_OR_CMND, RESULT_OR_STAT, RESULT_OR_TELE };
enum ExecuteCommandPowerOptions { POWER_OFF, POWER_ON, POWER_TOGGLE, POWER_BLINK, POWER_BLINK_STOP, power_nu1, POWER_OFF_NO_STATE, POWER_ON_NO_STATE, power_nu2, POWER_SHOW_STATE };
enum ExecuteCommandPowerOptions { POWER_OFF, POWER_ON, POWER_TOGGLE, POWER_BLINK, POWER_BLINK_STOP,
POWER_OFF_NO_STATE = 8, POWER_ON_NO_STATE, POWER_TOGGLE_NO_STATE,
POWER_SHOW_STATE = 16 };
enum SendKeyPowerOptions { POWER_HOLD = 3, CLEAR_RETAIN = 9 };
enum SendKeyOptions { KEY_BUTTON, KEY_SWITCH };
enum PowerOnStateOptions { POWER_ALL_OFF, POWER_ALL_ON, POWER_ALL_SAVED_TOGGLE, POWER_ALL_SAVED, POWER_ALL_ALWAYS_ON, POWER_ALL_OFF_PULSETIME_ON };

View File

@ -90,6 +90,7 @@ unsigned long pulse_timer[MAX_PULSETIMERS] = { 0 }; // Power off timer
unsigned long blink_timer = 0; // Power cycle timer
unsigned long backlog_delay = 0; // Command backlog delay
power_t power = 0; // Current copy of Settings.power
power_t last_power = 0; // Last power set state
power_t blink_power; // Blink power state
power_t blink_mask = 0; // Blink relay active mask
power_t blink_powersave; // Blink start power save state
@ -201,7 +202,9 @@ char* Format(char* output, const char* input, int size)
}
}
}
if (!digits) { strlcpy(output, input, size); }
if (!digits) {
strlcpy(output, input, size);
}
return output;
}
@ -258,7 +261,9 @@ char* GetTopic_P(char *stopic, uint8_t prefix, char *topic, const char* subtopic
}
fulltopic.replace(F("#"), "");
fulltopic.replace(F("//"), "/");
if (!fulltopic.endsWith("/")) fulltopic += "/";
if (!fulltopic.endsWith("/")) {
fulltopic += "/";
}
snprintf_P(stopic, TOPSZ, PSTR("%s%s"), fulltopic.c_str(), romram);
return stopic;
}
@ -270,7 +275,9 @@ char* GetFallbackTopic_P(char *stopic, uint8_t prefix, const char* subtopic)
char* GetStateText(uint8_t state)
{
if (state > 3) { state = 1; }
if (state > 3) {
state = 1;
}
return Settings.state_text[state];
}
@ -312,7 +319,9 @@ void SetDevicePower(power_t rpower, int source)
power_t mask = 1;
uint8_t count = 0;
for (uint32_t j = 0; j < devices_present; j++) {
if ((Settings.interlock[i] & mask) && (rpower & mask)) { count++; }
if ((Settings.interlock[i] & mask) && (rpower & mask)) {
count++;
}
mask <<= 1;
}
if (count > 1) {
@ -323,6 +332,10 @@ void SetDevicePower(power_t rpower, int source)
}
}
if (rpower) { // Any power set
last_power = rpower;
}
XdrvMailbox.index = rpower;
XdrvCall(FUNC_SET_POWER); // Signal power state
@ -353,10 +366,56 @@ void SetDevicePower(power_t rpower, int source)
}
}
void RestorePower(bool publish_power, int source)
{
if (power != last_power) {
SetDevicePower(last_power, source);
if (publish_power) {
MqttPublishAllPowerState();
}
}
}
void SetAllPower(uint8_t state, int source)
{
// state 0 = POWER_OFF = Relay Off
// state 1 = POWER_ON = Relay On (turn off after Settings.pulse_timer * 100 mSec if enabled)
// state 2 = POWER_TOGGLE = Toggle relay
// state 8 = POWER_OFF_NO_STATE = Relay Off and no publishPowerState
// state 9 = POWER_ON_NO_STATE = Relay On and no publishPowerState
// state 10 = POWER_TOGGLE_NO_STATE = Toggle relay and no publishPowerState
// state 16 = POWER_SHOW_STATE = Show power state
bool publish_power = true;
if ((state >= POWER_OFF_NO_STATE) && (state <= POWER_TOGGLE_NO_STATE)) {
state &= 3; // POWER_OFF, POWER_ON or POWER_TOGGLE
publish_power = false;
}
if ((state >= POWER_OFF) && (state <= POWER_TOGGLE)) {
power_t all_on = (1 << devices_present) -1;
switch (state) {
case POWER_OFF:
power = 0;
break;
case POWER_ON:
power = all_on;
break;
case POWER_TOGGLE:
power ^= all_on; // Complement current state
}
SetDevicePower(power, source);
}
if (publish_power) {
MqttPublishAllPowerState();
}
}
void SetLedPowerIdx(uint8_t led, uint8_t state)
{
if ((99 == pin[GPIO_LEDLNK]) && (0 == led)) { // Legacy - LED1 is link led only if LED2 is present
if (pin[GPIO_LED2] < 99) { led = 1; }
if ((99 == pin[GPIO_LEDLNK]) && (0 == led)) { // Legacy - LED1 is link led only if LED2 is present
if (pin[GPIO_LED2] < 99) {
led = 1;
}
}
if (pin[GPIO_LED1 + led] < 99) {
uint8_t mask = 1 << led;
@ -372,11 +431,11 @@ void SetLedPowerIdx(uint8_t led, uint8_t state)
void SetLedPower(uint8_t state)
{
if (99 == pin[GPIO_LEDLNK]) { // Legacy - Only use LED1 and/or LED2
if (99 == pin[GPIO_LEDLNK]) { // Legacy - Only use LED1 and/or LED2
SetLedPowerIdx(0, state);
} else {
power_t mask = 1;
for (uint32_t i = 0; i < leds_present; i++) { // Map leds to power
for (uint32_t i = 0; i < leds_present; i++) { // Map leds to power
bool tstate = (power & mask);
SetLedPowerIdx(i, tstate);
mask <<= 1;
@ -395,7 +454,7 @@ void SetLedLink(uint8_t state)
{
uint8_t led_pin = pin[GPIO_LEDLNK];
uint8_t led_inv = ledlnk_inverted;
if (99 == led_pin) { // Legacy - LED1 is status
if (99 == led_pin) { // Legacy - LED1 is status
led_pin = pin[GPIO_LED1];
led_inv = bitRead(led_inverted, 0);
}
@ -426,13 +485,13 @@ uint16_t GetPulseTimer(uint8_t index)
bool SendKey(uint8_t key, uint8_t device, uint8_t state)
{
// key 0 = button_topic
// key 1 = switch_topic
// state 0 = off
// state 1 = on
// state 2 = toggle
// state 3 = hold
// state 9 = clear retain flag
// key 0 = KEY_BUTTON = button_topic
// key 1 = KEY_SWITCH = switch_topic
// state 0 = POWER_OFF = off
// state 1 = POWER_ON = on
// state 2 = POWER_TOGGLE = toggle
// state 3 = POWER_HOLD = hold
// state 9 = CLEAR_RETAIN = clear retain flag
char stopic[TOPSZ];
char scommand[CMDSZ];
@ -442,23 +501,25 @@ bool SendKey(uint8_t key, uint8_t device, uint8_t state)
char *tmp = (key) ? Settings.switch_topic : Settings.button_topic;
Format(key_topic, tmp, sizeof(key_topic));
if (Settings.flag.mqtt_enabled && MqttIsConnected() && (strlen(key_topic) != 0) && strcmp(key_topic, "0")) {
if (!key && (device > devices_present)) { device = 1; } // Only allow number of buttons up to number of devices
if (!key && (device > devices_present)) {
device = 1; // Only allow number of buttons up to number of devices
}
GetTopic_P(stopic, CMND, key_topic,
GetPowerDevice(scommand, device, sizeof(scommand), (key + Settings.flag.device_index_enable))); // cmnd/switchtopic/POWERx
if (9 == state) {
if (CLEAR_RETAIN == state) {
mqtt_data[0] = '\0';
} else {
if ((Settings.flag3.button_switch_force_local || !strcmp(mqtt_topic, key_topic) || !strcmp(Settings.mqtt_grptopic, key_topic)) && (2 == state)) {
state = ~(power >> (device -1)) &1;
if ((Settings.flag3.button_switch_force_local || !strcmp(mqtt_topic, key_topic) || !strcmp(Settings.mqtt_grptopic, key_topic)) && (POWER_TOGGLE == state)) {
state = ~(power >> (device -1)) &1; // POWER_OFF or POWER_ON
}
snprintf_P(mqtt_data, sizeof(mqtt_data), GetStateText(state));
}
#ifdef USE_DOMOTICZ
if (!(DomoticzSendKey(key, device, state, strlen(mqtt_data)))) {
MqttPublishDirect(stopic, ((key) ? Settings.flag.mqtt_switch_retain : Settings.flag.mqtt_button_retain) && (state != 3 || !Settings.flag3.no_hold_retain));
MqttPublishDirect(stopic, ((key) ? Settings.flag.mqtt_switch_retain : Settings.flag.mqtt_button_retain) && (state != POWER_HOLD || !Settings.flag3.no_hold_retain));
}
#else
MqttPublishDirect(stopic, ((key) ? Settings.flag.mqtt_switch_retain : Settings.flag.mqtt_button_retain) && (state != 3 || !Settings.flag3.no_hold_retain));
MqttPublishDirect(stopic, ((key) ? Settings.flag.mqtt_switch_retain : Settings.flag.mqtt_button_retain) && (state != POWER_HOLD || !Settings.flag3.no_hold_retain));
#endif // USE_DOMOTICZ
result = !Settings.flag3.button_switch_force_local;
} else {
@ -474,14 +535,15 @@ bool SendKey(uint8_t key, uint8_t device, uint8_t state)
void ExecuteCommandPower(uint8_t device, uint8_t state, int source)
{
// device = Relay number 1 and up
// state 0 = Relay Off
// state 1 = Relay On (turn off after Settings.pulse_timer * 100 mSec if enabled)
// state 2 = Toggle relay
// state 3 = Blink relay
// state 4 = Stop blinking relay
// state 6 = Relay Off and no publishPowerState
// state 7 = Relay On and no publishPowerState
// state 9 = Show power state
// state 0 = POWER_OFF = Relay Off
// state 1 = POWER_ON = Relay On (turn off after Settings.pulse_timer * 100 mSec if enabled)
// state 2 = POWER_TOGGLE = Toggle relay
// state 3 = POWER_BLINK = Blink relay
// state 4 = POWER_BLINK_STOP = Stop blinking relay
// state 8 = POWER_OFF_NO_STATE = Relay Off and no publishPowerState
// state 9 = POWER_ON_NO_STATE = Relay On and no publishPowerState
// state 10 = POWER_TOGGLE_NO_STATE = Toggle relay and no publishPowerState
// state 16 = POWER_SHOW_STATE = Show power state
// ShowSource(source);
@ -495,16 +557,20 @@ void ExecuteCommandPower(uint8_t device, uint8_t state, int source)
}
#endif // USE_SONOFF_IFAN
uint8_t publish_power = 1;
if ((POWER_OFF_NO_STATE == state) || (POWER_ON_NO_STATE == state)) {
state &= 1;
publish_power = 0;
bool publish_power = true;
if ((state >= POWER_OFF_NO_STATE) && (state <= POWER_TOGGLE_NO_STATE)) {
state &= 3; // POWER_OFF, POWER_ON or POWER_TOGGLE
publish_power = false;
}
if ((device < 1) || (device > devices_present)) device = 1;
if ((device < 1) || (device > devices_present)) {
device = 1;
}
active_device = device;
if (device <= MAX_PULSETIMERS) { SetPulseTimer(device -1, 0); }
if (device <= MAX_PULSETIMERS) {
SetPulseTimer(device -1, 0);
}
power_t mask = 1 << (device -1); // Device to control
if (state <= POWER_TOGGLE) {
if ((blink_mask & mask)) {
@ -546,7 +612,9 @@ void ExecuteCommandPower(uint8_t device, uint8_t state, int source)
#ifdef USE_KNX
KnxUpdatePowerState(device, power);
#endif // USE_KNX
if (publish_power && Settings.flag3.hass_tele_on_power) { MqttPublishTeleState(); }
if (publish_power && Settings.flag3.hass_tele_on_power) {
MqttPublishTeleState();
}
if (device <= MAX_PULSETIMERS) { // Restart PulseTime if powered On
SetPulseTimer(device -1, (((POWER_ALL_OFF_PULSETIME_ON == Settings.poweronstate) ? ~power : power) & mask) ? Settings.pulse_timer[device -1] : 0);
}
@ -566,10 +634,14 @@ void ExecuteCommandPower(uint8_t device, uint8_t state, int source)
uint8_t flag = (blink_mask & mask);
blink_mask &= (POWER_MASK ^ mask); // Clear device mask
MqttPublishPowerBlinkState(device);
if (flag) ExecuteCommandPower(device, (blink_powersave >> (device -1))&1, SRC_IGNORE); // Restore state
if (flag) {
ExecuteCommandPower(device, (blink_powersave >> (device -1))&1, SRC_IGNORE); // Restore state
}
return;
}
if (publish_power) MqttPublishPowerState(device);
if (publish_power) {
MqttPublishPowerState(device);
}
}
void StopAllPowerBlink(void)
@ -586,27 +658,6 @@ void StopAllPowerBlink(void)
}
}
void SetAllPower(uint8_t state, int source)
{
if ((POWER_ALL_OFF == state) || (POWER_ALL_ON == state)) {
power = 0;
if (POWER_ALL_ON == state) {
power = (1 << devices_present) -1;
}
SetDevicePower(power, source);
MqttPublishAllPowerState();
}
}
void RestorePower(power_t power_set, int source)
{
power_t new_state = power | power_set;
if (power != new_state) {
SetDevicePower(new_state, source);
MqttPublishAllPowerState();
}
}
void MqttShowPWMState(void)
{
ResponseAppend_P(PSTR("\"" D_CMND_PWM "\":{"));

View File

@ -165,7 +165,7 @@ void ButtonHandler(void)
if (!Button.hold_timer[button_index]) { button_pressed = true; } // Do not allow within 1 second
}
if (button_pressed) {
if (!SendKey(0, button_index +1, POWER_TOGGLE)) { // Execute Toggle command via MQTT if ButtonTopic is set
if (!SendKey(KEY_BUTTON, button_index +1, POWER_TOGGLE)) { // Execute Toggle command via MQTT if ButtonTopic is set
ExecuteCommandPower(button_index +1, POWER_TOGGLE, SRC_BUTTON); // Execute Toggle command internally
}
}
@ -174,7 +174,7 @@ void ButtonHandler(void)
if ((PRESSED == button) && (NOT_PRESSED == Button.last_state[button_index])) {
if (Settings.flag.button_single) { // SetOption13 (0) - Allow only single button press for immediate action
AddLog_P2(LOG_LEVEL_DEBUG, PSTR(D_LOG_APPLICATION D_BUTTON "%d " D_IMMEDIATE), button_index +1);
if (!SendKey(0, button_index +1, POWER_TOGGLE)) { // Execute Toggle command via MQTT if ButtonTopic is set
if (!SendKey(KEY_BUTTON, button_index +1, POWER_TOGGLE)) { // Execute Toggle command via MQTT if ButtonTopic is set
ExecuteCommandPower(button_index +1, POWER_TOGGLE, SRC_BUTTON); // Execute Toggle command internally
}
} else {
@ -199,14 +199,14 @@ void ButtonHandler(void)
if (Settings.flag.button_restrict) { // SetOption1 (0) - Button restriction
if (Settings.param[P_HOLD_IGNORE] > 0) { // SetOption40 (0) - Do not ignore button hold
if (Button.hold_timer[button_index] > loops_per_second * Settings.param[P_HOLD_IGNORE] / 10) {
Button.hold_timer[button_index] = 0; // Reset button hold counter to stay below hold trigger
Button.press_counter[button_index] = 0; // Discard button press to disable functionality
Button.hold_timer[button_index] = 0; // Reset button hold counter to stay below hold trigger
Button.press_counter[button_index] = 0; // Discard button press to disable functionality
DEBUG_CORE_LOG(PSTR("BTN: " D_BUTTON "%d cancel by " D_CMND_SETOPTION "40 %d"), button_index +1, Settings.param[P_HOLD_IGNORE]);
}
}
if (Button.hold_timer[button_index] == loops_per_second * Settings.param[P_HOLD_TIME] / 10) { // SetOption32 (40) - Button hold
Button.press_counter[button_index] = 0;
SendKey(0, button_index +1, 3); // Execute Hold command via MQTT if ButtonTopic is set
SendKey(KEY_BUTTON, button_index +1, POWER_HOLD); // Execute Hold command via MQTT if ButtonTopic is set
}
} else {
if (Button.hold_timer[button_index] == loops_per_second * hold_time_extent * Settings.param[P_HOLD_TIME] / 10) { // SetOption32 (40) - Button held for factor times longer
@ -241,7 +241,7 @@ void ButtonHandler(void)
#if defined(USE_LIGHT) && defined(ROTARY_V1)
if (!((0 == button_index) && RotaryButtonPressed())) {
#endif
if (single_press && SendKey(0, button_index + Button.press_counter[button_index], POWER_TOGGLE)) { // Execute Toggle command via MQTT if ButtonTopic is set
if (single_press && SendKey(KEY_BUTTON, button_index + Button.press_counter[button_index], POWER_TOGGLE)) { // Execute Toggle command via MQTT if ButtonTopic is set
// Success
} else {
if (Button.press_counter[button_index] < 3) { // Single or Double press

View File

@ -257,19 +257,19 @@ void CmndDelay(void)
void CmndPower(void)
{
if ((XdrvMailbox.index > 0) && (XdrvMailbox.index <= devices_present)) {
if ((XdrvMailbox.payload < 0) || (XdrvMailbox.payload > 4)) { XdrvMailbox.payload = 9; }
if ((XdrvMailbox.payload < POWER_OFF) || (XdrvMailbox.payload > POWER_BLINK_STOP)) {
XdrvMailbox.payload = POWER_SHOW_STATE;
}
// Settings.flag.device_index_enable = XdrvMailbox.usridx;
ExecuteCommandPower(XdrvMailbox.index, XdrvMailbox.payload, SRC_IGNORE);
mqtt_data[0] = '\0';
}
else if (0 == XdrvMailbox.index) {
if ((XdrvMailbox.payload >= 0) && (XdrvMailbox.payload <= 2)) {
if (2 == XdrvMailbox.payload) {
XdrvMailbox.payload = (power) ? 0 : 1;
}
SetAllPower(XdrvMailbox.payload, SRC_IGNORE);
mqtt_data[0] = '\0';
if ((XdrvMailbox.payload < POWER_OFF) || (XdrvMailbox.payload > POWER_TOGGLE)) {
XdrvMailbox.payload = POWER_SHOW_STATE;
}
SetAllPower(XdrvMailbox.payload, SRC_IGNORE);
mqtt_data[0] = '\0';
}
}

View File

@ -143,7 +143,7 @@ void SwitchHandler(uint8_t mode)
if (Switch.hold_timer[i]) {
Switch.hold_timer[i]--;
if (0 == Switch.hold_timer[i]) {
SendKey(1, i +1, 3); // Execute command via MQTT
SendKey(KEY_SWITCH, i +1, POWER_HOLD); // Execute command via MQTT
}
}
@ -152,10 +152,10 @@ void SwitchHandler(uint8_t mode)
// enum SwitchModeOptions {TOGGLE, FOLLOW, FOLLOW_INV, PUSHBUTTON, PUSHBUTTON_INV, PUSHBUTTONHOLD, PUSHBUTTONHOLD_INV, PUSHBUTTON_TOGGLE, MAX_SWITCH_OPTION};
if (button != Switch.last_state[i]) {
switchflag = 3;
switchflag = POWER_TOGGLE +1;
switch (Settings.switchmode[i]) {
case TOGGLE:
switchflag = 2; // Toggle
switchflag = POWER_TOGGLE; // Toggle
break;
case FOLLOW:
switchflag = button &1; // Follow wall switch state
@ -165,17 +165,17 @@ void SwitchHandler(uint8_t mode)
break;
case PUSHBUTTON:
if ((PRESSED == button) && (NOT_PRESSED == Switch.last_state[i])) {
switchflag = 2; // Toggle with pushbutton to Gnd
switchflag = POWER_TOGGLE; // Toggle with pushbutton to Gnd
}
break;
case PUSHBUTTON_INV:
if ((NOT_PRESSED == button) && (PRESSED == Switch.last_state[i])) {
switchflag = 2; // Toggle with releasing pushbutton from Gnd
switchflag = POWER_TOGGLE; // Toggle with releasing pushbutton from Gnd
}
break;
case PUSHBUTTON_TOGGLE:
if (button != Switch.last_state[i]) {
switchflag = 2; // Toggle with any pushbutton change
switchflag = POWER_TOGGLE; // Toggle with any pushbutton change
}
break;
case PUSHBUTTONHOLD:
@ -184,7 +184,7 @@ void SwitchHandler(uint8_t mode)
}
if ((NOT_PRESSED == button) && (PRESSED == Switch.last_state[i]) && (Switch.hold_timer[i])) {
Switch.hold_timer[i] = 0;
switchflag = 2; // Toggle with pushbutton to Gnd
switchflag = POWER_TOGGLE; // Toggle with pushbutton to Gnd
}
break;
case PUSHBUTTONHOLD_INV:
@ -193,13 +193,13 @@ void SwitchHandler(uint8_t mode)
}
if ((PRESSED == button) && (NOT_PRESSED == Switch.last_state[i]) && (Switch.hold_timer[i])) {
Switch.hold_timer[i] = 0;
switchflag = 2; // Toggle with pushbutton to Gnd
switchflag = POWER_TOGGLE; // Toggle with pushbutton to Gnd
}
break;
}
if (switchflag < 3) {
if (!SendKey(1, i +1, switchflag)) { // Execute command via MQTT
if (switchflag <= POWER_TOGGLE) {
if (!SendKey(KEY_SWITCH, i +1, switchflag)) { // Execute command via MQTT
ExecuteCommandPower(i +1, switchflag, SRC_SWITCH); // Execute command internally (if i < devices_present)
}
}

View File

@ -894,7 +894,7 @@ void CmndButtonRetain(void)
if ((XdrvMailbox.payload >= 0) && (XdrvMailbox.payload <= 1)) {
if (!XdrvMailbox.payload) {
for (uint32_t i = 1; i <= MAX_KEYS; i++) {
SendKey(0, i, 9); // Clear MQTT retain in broker
SendKey(KEY_BUTTON, i, CLEAR_RETAIN); // Clear MQTT retain in broker
}
}
Settings.flag.mqtt_button_retain = XdrvMailbox.payload;
@ -907,7 +907,7 @@ void CmndSwitchRetain(void)
if ((XdrvMailbox.payload >= 0) && (XdrvMailbox.payload <= 1)) {
if (!XdrvMailbox.payload) {
for (uint32_t i = 1; i <= MAX_SWITCHES; i++) {
SendKey(1, i, 9); // Clear MQTT retain in broker
SendKey(KEY_SWITCH, i, CLEAR_RETAIN); // Clear MQTT retain in broker
}
}
Settings.flag.mqtt_switch_retain = XdrvMailbox.payload;

View File

@ -110,8 +110,6 @@ struct ENERGY {
bool max_current_flag = false;
#ifdef USE_ENERGY_POWER_LIMIT
power_t mp_last_power = 0;
power_t me_last_power = 0;
uint16_t mplh_counter = 0;
uint16_t mplw_counter = 0;
uint8_t mplr_counter = 0;
@ -319,7 +317,6 @@ void EnergyMarginCheck(void)
Response_P(PSTR("{\"" D_JSON_MAXPOWERREACHED "\":\"%d%s\"}"), energy_power_u, (Settings.flag.value_units) ? " " D_UNIT_WATT : "");
MqttPublishPrefixTopic_P(STAT, S_RSLT_WARNING);
EnergyMqttShow();
Energy.mp_last_power = power;
SetAllPower(POWER_ALL_OFF, SRC_MAXPOWER);
if (!Energy.mplr_counter) {
Energy.mplr_counter = Settings.param[P_MAX_POWER_RETRY] +1;
@ -342,7 +339,7 @@ void EnergyMarginCheck(void)
if (Energy.mplr_counter) {
Response_P(PSTR("{\"" D_JSON_POWERMONITOR "\":\"%s\"}"), GetStateText(1));
MqttPublishPrefixTopic_P(RESULT_OR_STAT, PSTR(D_JSON_POWERMONITOR));
RestorePower(Energy.mp_last_power, SRC_MAXPOWER);
RestorePower(true, SRC_MAXPOWER);
} else {
Response_P(PSTR("{\"" D_JSON_MAXPOWERREACHEDRETRY "\":\"%s\"}"), GetStateText(0));
MqttPublishPrefixTopic_P(STAT, S_RSLT_WARNING);
@ -360,7 +357,7 @@ void EnergyMarginCheck(void)
Energy.max_energy_state = 1;
Response_P(PSTR("{\"" D_JSON_ENERGYMONITOR "\":\"%s\"}"), GetStateText(1));
MqttPublishPrefixTopic_P(RESULT_OR_STAT, PSTR(D_JSON_ENERGYMONITOR));
RestorePower(Energy.me_last_power, SRC_MAXENERGY);
RestorePower(true, SRC_MAXENERGY);
}
else if ((1 == Energy.max_energy_state ) && (energy_daily_u >= Settings.energy_max_energy)) {
Energy.max_energy_state = 2;
@ -368,7 +365,6 @@ void EnergyMarginCheck(void)
Response_P(PSTR("{\"" D_JSON_MAXENERGYREACHED "\":\"%s%s\"}"), mqtt_data, (Settings.flag.value_units) ? " " D_UNIT_KILOWATTHOUR : "");
MqttPublishPrefixTopic_P(STAT, S_RSLT_WARNING);
EnergyMqttShow();
Energy.me_last_power = power;
SetAllPower(POWER_ALL_OFF, SRC_MAXENERGY);
}
}

View File

@ -306,7 +306,7 @@ bool DomoticzSendKey(uint8_t key, uint8_t device, uint8_t state, uint8_t svalflg
if (device <= MAX_DOMOTICZ_IDX) {
if ((Settings.domoticz_key_idx[device -1] || Settings.domoticz_switch_idx[device -1]) && (svalflg)) {
Response_P(PSTR("{\"command\":\"switchlight\",\"idx\":%d,\"switchcmd\":\"%s\"}"),
(key) ? Settings.domoticz_switch_idx[device -1] : Settings.domoticz_key_idx[device -1], (state) ? (2 == state) ? "Toggle" : "On" : "Off");
(key) ? Settings.domoticz_switch_idx[device -1] : Settings.domoticz_key_idx[device -1], (state) ? (POWER_TOGGLE == state) ? "Toggle" : "On" : "Off");
MqttPublish(domoticz_in_topic);
result = true;
}

View File

@ -296,7 +296,7 @@ void TimerEverySecond(void)
if (xtimer.days & days) {
Settings.timer[i].arm = xtimer.repeat;
#if defined(USE_RULES) || defined(USE_SCRIPT)
if (3 == xtimer.power) { // Blink becomes Rule disregarding device and allowing use of Backlog commands
if (POWER_BLINK == xtimer.power) { // Blink becomes Rule disregarding device and allowing use of Backlog commands
Response_P(PSTR("{\"Clock\":{\"Timer\":%d}}"), i +1);
XdrvRulesProcess();
} else

View File

@ -575,7 +575,7 @@ void KNX_CB_Action(message_t const &msg, void *arg)
else if (chan->type < 17) // Toggle Relays
{
if (!toggle_inhibit) {
ExecuteCommandPower((chan->type) -8, 2, SRC_KNX);
ExecuteCommandPower((chan->type) -8, POWER_TOGGLE, SRC_KNX);
if (Settings.flag.knx_enable_enhancement) {
toggle_inhibit = TOGGLE_INHIBIT_TIME;
}

View File

@ -96,7 +96,7 @@ void SonoffIFanSetFanspeed(uint8_t fanspeed, bool sequence)
fans = kIFan03Speed[fanspeed];
}
for (uint32_t i = 2; i < 5; i++) {
uint8_t state = (fans &1) + 6; // Add no publishPowerState
uint8_t state = (fans &1) + POWER_OFF_NO_STATE; // Add no publishPowerState
ExecuteCommandPower(i, state, SRC_IGNORE); // Use relay 2, 3 and 4
fans >>= 1;
}

View File

@ -165,7 +165,7 @@ if (2 == ili9488_ctouch_counter) {
uint8_t bflags=buttons[count]->vpower&0x7f;
if (!bflags) {
// real button
if (!SendKey(0, count+1, POWER_TOGGLE)) {
if (!SendKey(KEY_BUTTON, count+1, POWER_TOGGLE)) {
ExecuteCommandPower(count+1, POWER_TOGGLE, SRC_BUTTON);
}
buttons[count]->xdrawButton(bitRead(power,count));

View File

@ -166,7 +166,7 @@ if (2 == ra8876_ctouch_counter) {
uint8_t bflags=buttons[count]->vpower&0x7f;
if (!bflags) {
// real button
if (!SendKey(0, count+1, POWER_TOGGLE)) {
if (!SendKey(KEY_BUTTON, count+1, POWER_TOGGLE)) {
ExecuteCommandPower(count+1, POWER_TOGGLE, SRC_BUTTON);
}
buttons[count]->xdrawButton(bitRead(power,count));