Add Mqtt Button and Switch status

Add Mqtt Button and Switch status (#6725)
This commit is contained in:
Theo Arends 2019-10-24 09:47:28 +02:00
parent 42fc1d57af
commit 90a161bec8
4 changed files with 50 additions and 25 deletions

View File

@ -270,7 +270,7 @@ enum XsnsFunctions {FUNC_SETTINGS_OVERRIDE, FUNC_PIN_STATE, FUNC_MODULE_INIT, FU
FUNC_SAVE_AT_MIDNIGHT, FUNC_SAVE_BEFORE_RESTART,
FUNC_PREP_BEFORE_TELEPERIOD, FUNC_AFTER_TELEPERIOD, FUNC_JSON_APPEND, FUNC_WEB_SENSOR, FUNC_COMMAND, FUNC_COMMAND_SENSOR, FUNC_COMMAND_DRIVER,
FUNC_MQTT_SUBSCRIBE, FUNC_MQTT_INIT, FUNC_MQTT_DATA,
FUNC_SET_POWER, FUNC_SET_DEVICE_POWER, FUNC_SHOW_SENSOR,
FUNC_SET_POWER, FUNC_SET_DEVICE_POWER, FUNC_SHOW_SENSOR, FUNC_ANY_KEY,
FUNC_ENERGY_EVERY_SECOND, FUNC_ENERGY_RESET,
FUNC_RULES_PROCESS, FUNC_SERIAL, FUNC_FREE_MEM, FUNC_BUTTON_PRESSED,
FUNC_WEB_ADD_BUTTON, FUNC_WEB_ADD_MAIN_BUTTON, FUNC_WEB_ADD_HANDLER, FUNC_SET_CHANNELS, FUNC_SET_SCHEME};

View File

@ -537,9 +537,10 @@ bool SendKey(uint32_t key, uint32_t device, uint32_t state)
Response_P(PSTR("{\"%s%d\":{\"State\":%d}}"), (key) ? "Switch" : "Button", device, state);
result = XdrvRulesProcess();
}
#ifdef USE_KNX
KnxSendButtonPower(key, device, state);
#endif // USE_KNX
int32_t payload_save = XdrvMailbox.payload;
XdrvMailbox.payload = key << 16 | state << 8 | device;
XsnsCall(FUNC_ANY_KEY);
XdrvMailbox.payload = payload_save;
return result;
}

View File

@ -672,8 +672,13 @@ void KnxUpdatePowerState(uint8_t device, power_t state)
}
void KnxSendButtonPower(uint8_t key, uint8_t device, uint8_t state)
void KnxSendButtonPower(void)
{
if (!(Settings.flag.knx_enabled)) { return; }
uint32_t key = (XdrvMailbox.payload >> 16) & 0xFF;
uint32_t device = XdrvMailbox.payload & 0xFF;
uint32_t state = (XdrvMailbox.payload >> 8) & 0xFF;
// key 0 = button_topic
// key 1 = switch_topic
// state 0 = off
@ -681,9 +686,6 @@ void KnxSendButtonPower(uint8_t key, uint8_t device, uint8_t state)
// state 2 = toggle
// state 3 = hold
// state 9 = clear retain flag
if (!(Settings.flag.knx_enabled)) { return; }
// if (key)
// {
// Search all the registered GA that has that output (variable: device) as parameter
uint8_t i = KNX_GA_Search(device + 8);
@ -1207,8 +1209,13 @@ bool Xdrv11(uint8_t function)
case FUNC_LOOP:
if (!global_state.wifi_down) { knx.loop(); } // Process knx events
break;
case FUNC_PRE_INIT:
KNX_INIT();
case FUNC_EVERY_50_MSECOND:
if (toggle_inhibit) {
toggle_inhibit--;
}
break;
case FUNC_ANY_KEY:
KnxSendButtonPower();
break;
#ifdef USE_WEBSERVER
#ifdef USE_KNX_WEB_MENU
@ -1220,14 +1227,12 @@ bool Xdrv11(uint8_t function)
break;
#endif // USE_KNX_WEB_MENU
#endif // USE_WEBSERVER
case FUNC_EVERY_50_MSECOND:
if (toggle_inhibit) {
toggle_inhibit--;
}
break;
case FUNC_COMMAND:
result = DecodeCommand(kKnxCommands, KnxCommand);
break;
case FUNC_PRE_INIT:
KNX_INIT();
break;
// case FUNC_SET_POWER:
// break;
}

View File

@ -404,13 +404,13 @@ void HAssAnnounceButtons(void)
}
}
void HAssAnnounceSensor(const char* sensorname, const char* subsensortype)
void HAssAnnounceSensor(const char* sensorname, const char* subsensortype)
{
char stopic[TOPSZ];
char stemp1[TOPSZ];
char stemp2[TOPSZ];
char unique_id[30];
bool is_sensor = true;
bool is_sensor = true;
// Announce sensor, special handling of temperature and humidity sensors
mqtt_data[0] = '\0'; // Clear retained message
@ -466,10 +466,10 @@ void HAssAnnounceSensor(const char* sensorname, const char* subsensortype)
} else if (!strcmp_P(subsensortype, PSTR(D_JSON_ILLUMINANCE))){
TryResponseAppend_P(HASS_DISCOVER_SENSOR_ILLUMINANCE, sensorname, subsensortype);
} else {
if (is_sensor){
TryResponseAppend_P(PSTR(",\"unit_of_meas\":\" \"")); // " " As unit of measurement to get a value graph (not available for binary sensors)
}
TryResponseAppend_P(HASS_DISCOVER_SENSOR_ANY, sensorname, subsensortype);
if (is_sensor){
TryResponseAppend_P(PSTR(",\"unit_of_meas\":\" \"")); // " " As unit of measurement to get a value graph (not available for binary sensors)
}
TryResponseAppend_P(HASS_DISCOVER_SENSOR_ANY, sensorname, subsensortype);
}
TryResponseAppend_P(PSTR("}"));
}
@ -611,6 +611,22 @@ void HAssDiscover(void)
hass_init_step = 1; // Delayed discovery
}
void HAssAnyKey(void)
{
if (!Settings.flag.hass_discovery) { return; }
uint32_t key = (XdrvMailbox.payload >> 16) & 0xFF;
uint32_t device = XdrvMailbox.payload & 0xFF;
uint32_t state = (XdrvMailbox.payload >> 8) & 0xFF;
char scommand[CMDSZ];
snprintf_P(scommand, sizeof(scommand), PSTR("%s%d"), (key) ? "SWITCH" : "BUTTON", device);
char stopic[TOPSZ];
GetTopic_P(stopic, STAT, mqtt_topic, (Settings.flag.mqtt_response) ? scommand : S_RSLT_RESULT);
Response_P(S_JSON_COMMAND_SVALUE, scommand, GetStateText(bitRead(state, device -1)));
MqttPublish(stopic);
}
/*********************************************************************************************\
* Interface
\*********************************************************************************************/
@ -621,10 +637,6 @@ bool Xdrv12(uint8_t function)
if (Settings.flag.mqtt_enabled) {
switch (function) {
case FUNC_MQTT_INIT:
hass_mode = 0; // Discovery only if Settings.flag.hass_discovery is set
hass_init_step = 2; // Delayed discovery
break;
case FUNC_EVERY_SECOND:
if (hass_init_step) {
hass_init_step--;
@ -641,6 +653,13 @@ bool Xdrv12(uint8_t function)
}
}
break;
case FUNC_ANY_KEY:
HAssAnyKey();
break;
case FUNC_MQTT_INIT:
hass_mode = 0; // Discovery only if Settings.flag.hass_discovery is set
hass_init_step = 2; // Delayed discovery
break;
}
}
return result;