Change Domoticz commands prefix from ``Domoticz`` to ``Dz``

- Change Domoticz commands prefix from ``Domoticz`` to ``Dz``
- Add command ``DzSend<type> <index>,<value1(;value2)|state>`` to send values or state to Domoticz
This commit is contained in:
Theo Arends 2020-07-24 15:30:21 +02:00
parent 93226c2bc3
commit 3acae81fc0
3 changed files with 91 additions and 70 deletions

View File

@ -64,6 +64,7 @@ The following binary downloads have been compiled with ESP8266/Arduino library c
- Change define USE_TASMOTA_SLAVE into USE_TASMOTA_CLIENT
- Change commands ``SlaveSend`` and ``SlaveReset`` into ``ClientSend`` and ``ClientReset``
- Change all timer references from ``Arm`` to ``Enable`` in GUI, ``Timer`` command and JSON message
- Change Domoticz commands prefix from ``Domoticz`` to ``Dz``
- Fix escape of non-JSON received serial data (#8329)
- Fix exception or watchdog on rule re-entry (#8757)
- Add command ``Rule0`` to change global rule parameters
@ -74,6 +75,7 @@ The following binary downloads have been compiled with ESP8266/Arduino library c
- Add command ``SetOption99 0/1`` to enable zero cross detection on PWM dimmer
- Add command ``SetOption100 0/1`` to remove Zigbee ``ZbReceived`` value from ``{"ZbReceived":{xxx:yyy}}`` JSON message
- Add command ``SetOption101 0/1`` to add the Zigbee source endpoint as suffix to attributes, ex `Power3` instead of `Power` if sent from endpoint 3
- Add command ``DzSend<type> <index>,<value1(;value2)|state>`` to send values or state to Domoticz
- Add command ``Module2`` to configure fallback module on fast reboot (#8464)
- Add command (``S``)``SerialSend6`` \<comma seperated values\> (#8937)
- Add commands ``LedPwmOn 0..255``, ``LedPwmOff 0..255`` and ``LedPwmMode1 0/1`` to control led brightness by George (#8491)

View File

@ -5,6 +5,8 @@
- Remove Arduino ESP8266 Core support for versions before 2.7.1
- Change to limited support of Arduino IDE as an increasing amount of features cannot be compiled with Arduino IDE
- Change all timer references from ``Arm`` to ``Enable`` in GUI, ``Timer`` command and JSON message
- Change Domoticz commands prefix from ``Domoticz`` to ``Dz``
- Add command ``DzSend<type> <index>,<value1(;value2)|state>`` to send values or state to Domoticz
- Add command ``SetOption100 0/1`` to remove Zigbee ``ZbReceived`` value from ``{"ZbReceived":{xxx:yyy}}`` JSON message
- Add command ``SetOption101 0/1`` to add the Zigbee source endpoint as suffix to attributes, ex `Power3` instead of `Power` if sent from endpoint 3
- Add command (``S``)``SerialSend6`` \<comma seperated values\> (#8937)

View File

@ -21,18 +21,20 @@
#define XDRV_07 7
#define D_PRFX_DOMOTICZ "Domoticz"
//#define D_PRFX_DOMOTICZ "Domoticz"
#define D_PRFX_DOMOTICZ "Dz"
#define D_CMND_IDX "Idx"
#define D_CMND_KEYIDX "KeyIdx"
#define D_CMND_SWITCHIDX "SwitchIdx"
#define D_CMND_SENSORIDX "SensorIdx"
#define D_CMND_UPDATETIMER "UpdateTimer"
#define D_CMND_DZSEND "Send"
const char kDomoticzCommands[] PROGMEM = D_PRFX_DOMOTICZ "|" // Prefix
D_CMND_IDX "|" D_CMND_KEYIDX "|" D_CMND_SWITCHIDX "|" D_CMND_SENSORIDX "|" D_CMND_UPDATETIMER ;
D_CMND_IDX "|" D_CMND_KEYIDX "|" D_CMND_SWITCHIDX "|" D_CMND_SENSORIDX "|" D_CMND_UPDATETIMER "|" D_CMND_DZSEND ;
void (* const DomoticzCommand[])(void) PROGMEM = {
&CmndDomoticzIdx, &CmndDomoticzKeyIdx, &CmndDomoticzSwitchIdx, &CmndDomoticzSensorIdx, &CmndDomoticzUpdateTimer };
&CmndDomoticzIdx, &CmndDomoticzKeyIdx, &CmndDomoticzSwitchIdx, &CmndDomoticzSensorIdx, &CmndDomoticzUpdateTimer, &CmndDomoticzSend };
const char DOMOTICZ_MESSAGE[] PROGMEM = "{\"idx\":%d,\"nvalue\":%d,\"svalue\":\"%s\",\"Battery\":%d,\"RSSI\":%d}";
@ -44,6 +46,8 @@ const char kDomoticzSensors[] PROGMEM =
D_DOMOTICZ_TEMP "|" D_DOMOTICZ_TEMP_HUM "|" D_DOMOTICZ_TEMP_HUM_BARO "|" D_DOMOTICZ_POWER_ENERGY "|" D_DOMOTICZ_ILLUMINANCE "|"
D_DOMOTICZ_COUNT "|" D_DOMOTICZ_VOLTAGE "|" D_DOMOTICZ_CURRENT "|" D_DOMOTICZ_AIRQUALITY "|" D_DOMOTICZ_P1_SMART_METER "|" D_DOMOTICZ_SHUTTER ;
const char kDomoticzCommand[] PROGMEM = "switchlight|switchscene";
char domoticz_in_topic[] = DOMOTICZ_IN_TOPIC;
int domoticz_update_timer = 0;
@ -55,8 +59,7 @@ bool domoticz_update_flag = true;
bool domoticz_is_shutter = false;
#endif // USE_SHUTTER
int DomoticzBatteryQuality(void)
{
int DomoticzBatteryQuality(void) {
// Battery 0%: ESP 2.6V (minimum operating voltage is 2.5)
// Battery 100%: ESP 3.6V (maximum operating voltage is 3.6)
// Battery 101% to 200%: ESP over 3.6V (means over maximum operating voltage)
@ -76,16 +79,14 @@ int DomoticzBatteryQuality(void)
return quality;
}
int DomoticzRssiQuality(void)
{
int DomoticzRssiQuality(void) {
// RSSI range: 0% to 10% (12 means disable RSSI in Domoticz)
return WifiGetRssiAsQuality(WiFi.RSSI()) / 10;
}
#ifdef USE_SONOFF_IFAN
void MqttPublishDomoticzFanState(void)
{
void MqttPublishDomoticzFanState(void) {
if (Settings.flag.mqtt_enabled && Settings.domoticz_relay_idx[1]) { // SetOption3 - Enable MQTT
char svalue[8]; // Fanspeed value
@ -98,8 +99,7 @@ void MqttPublishDomoticzFanState(void)
}
}
void DomoticzUpdateFanState(void)
{
void DomoticzUpdateFanState(void) {
if (domoticz_update_flag) {
MqttPublishDomoticzFanState();
}
@ -107,8 +107,7 @@ void DomoticzUpdateFanState(void)
}
#endif // USE_SONOFF_IFAN
void MqttPublishDomoticzPowerState(uint8_t device)
{
void MqttPublishDomoticzPowerState(uint8_t device) {
if (Settings.flag.mqtt_enabled) { // SetOption3 - Enable MQTT
if (device < 1) { device = 1; }
if ((device > devices_present) || (device > MAX_DOMOTICZ_IDX)) { return; }
@ -138,16 +137,14 @@ void MqttPublishDomoticzPowerState(uint8_t device)
}
}
void DomoticzUpdatePowerState(uint8_t device)
{
void DomoticzUpdatePowerState(uint8_t device) {
if (domoticz_update_flag) {
MqttPublishDomoticzPowerState(device);
}
domoticz_update_flag = true;
}
void DomoticzMqttUpdate(void)
{
void DomoticzMqttUpdate(void) {
if (domoticz_subscribe && (Settings.domoticz_update_timer || domoticz_update_timer)) {
domoticz_update_timer--;
if (domoticz_update_timer <= 0) {
@ -175,8 +172,7 @@ void DomoticzMqttUpdate(void)
}
}
void DomoticzMqttSubscribe(void)
{
void DomoticzMqttSubscribe(void) {
uint8_t maxdev = (devices_present > MAX_DOMOTICZ_IDX) ? MAX_DOMOTICZ_IDX : devices_present;
for (uint32_t i = 0; i < maxdev; i++) {
if (Settings.domoticz_relay_idx[i]) {
@ -217,8 +213,7 @@ void DomoticzMqttSubscribe(void)
}
*/
bool DomoticzMqttData(void)
{
bool DomoticzMqttData(void) {
domoticz_update_flag = true;
if (strncasecmp_P(XdrvMailbox.topic, PSTR(DOMOTICZ_OUT_TOPIC), strlen(DOMOTICZ_OUT_TOPIC)) != 0) {
@ -359,15 +354,19 @@ bool DomoticzMqttData(void)
/*********************************************************************************************/
bool DomoticzSendKey(uint8_t key, uint8_t device, uint8_t state, uint8_t svalflg)
{
void DomoticzSendSwitch(uint32_t type, uint32_t index, uint32_t state) {
char stemp[16]; // "switchlight" or "switchscene"
Response_P(PSTR("{\"command\":\"%s\",\"idx\":%d,\"switchcmd\":\"%s\"}"),
GetTextIndexed(stemp, sizeof(stemp), type, kDomoticzCommand), index, (state) ? (POWER_TOGGLE == state) ? "Toggle" : "On" : "Off"); // Domoticz case sensitive
MqttPublish(domoticz_in_topic);
}
bool DomoticzSendKey(uint8_t key, uint8_t device, uint8_t state, uint8_t svalflg) {
bool result = false;
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) ? (POWER_TOGGLE == state) ? "Toggle" : "On" : "Off");
MqttPublish(domoticz_in_topic);
DomoticzSendSwitch(0, (key) ? Settings.domoticz_switch_idx[device -1] : Settings.domoticz_key_idx[device -1], state);
result = true;
}
}
@ -391,46 +390,46 @@ bool DomoticzSendKey(uint8_t key, uint8_t device, uint8_t state, uint8_t svalflg
*
\*********************************************************************************************/
uint8_t DomoticzHumidityState(float h)
{
return (!h) ? 0 : (h < 40) ? 2 : (h > 70) ? 3 : 1;
void DomoticzSendData(uint32_t sensor_idx, uint32_t idx, char *data) {
if (DZ_AIRQUALITY == sensor_idx) {
Response_P(PSTR("{\"idx\":%d,\"nvalue\":%s,\"Battery\":%d,\"RSSI\":%d}"),
idx, data, DomoticzBatteryQuality(), DomoticzRssiQuality());
} else {
uint8_t nvalue = 0;
#ifdef USE_SHUTTER
if (DZ_SHUTTER == sensor_idx) {
uint8_t position = atoi(data);
nvalue = position < 2 ? 0 : (position == 100 ? 1 : 2);
}
#endif // USE_SHUTTER
Response_P(DOMOTICZ_MESSAGE,
idx, nvalue, data, DomoticzBatteryQuality(), DomoticzRssiQuality());
}
MqttPublish(domoticz_in_topic);
}
void DomoticzSensor(uint8_t idx, char *data)
{
void DomoticzSensor(uint8_t idx, char *data) {
if (Settings.domoticz_sensor_idx[idx]) {
char dmess[128]; // {"idx":26700,"nvalue":0,"svalue":"22330.1;10234.4;22000.5;10243.4;1006;3000","Battery":100,"RSSI":10}
memcpy(dmess, mqtt_data, sizeof(dmess));
if (DZ_AIRQUALITY == idx) {
Response_P(PSTR("{\"idx\":%d,\"nvalue\":%s,\"Battery\":%d,\"RSSI\":%d}"),
Settings.domoticz_sensor_idx[idx], data, DomoticzBatteryQuality(), DomoticzRssiQuality());
} else {
uint8_t nvalue = 0;
#ifdef USE_SHUTTER
if (DZ_SHUTTER == idx) {
uint8_t position = atoi(data);
nvalue = position < 2 ? 0 : (position == 100 ? 1 : 2);
}
#endif // USE_SHUTTER
Response_P(DOMOTICZ_MESSAGE,
Settings.domoticz_sensor_idx[idx], nvalue, data, DomoticzBatteryQuality(), DomoticzRssiQuality());
}
MqttPublish(domoticz_in_topic);
DomoticzSendData(idx, Settings.domoticz_sensor_idx[idx], data);
memcpy(mqtt_data, dmess, sizeof(dmess));
}
}
void DomoticzSensor(uint8_t idx, uint32_t value)
{
uint8_t DomoticzHumidityState(float h) {
return (!h) ? 0 : (h < 40) ? 2 : (h > 70) ? 3 : 1;
}
void DomoticzSensor(uint8_t idx, uint32_t value) {
char data[16];
snprintf_P(data, sizeof(data), PSTR("%d"), value);
DomoticzSensor(idx, data);
}
//void DomoticzTempHumPressureSensor(float temp, float hum, float baro = -1);
void DomoticzTempHumPressureSensor(float temp, float hum, float baro)
{
void DomoticzTempHumPressureSensor(float temp, float hum, float baro) {
char temperature[FLOATSZ];
dtostrfd(temp, 2, temperature);
char humidity[FLOATSZ];
@ -449,15 +448,13 @@ void DomoticzTempHumPressureSensor(float temp, float hum, float baro)
}
}
void DomoticzSensorPowerEnergy(int power, char *energy)
{
void DomoticzSensorPowerEnergy(int power, char *energy) {
char data[16];
snprintf_P(data, sizeof(data), PSTR("%d;%s"), power, energy);
DomoticzSensor(DZ_POWER_ENERGY, data);
}
void DomoticzSensorP1SmartMeter(char *usage1, char *usage2, char *return1, char *return2, int power)
{
void DomoticzSensorP1SmartMeter(char *usage1, char *usage2, char *return1, char *return2, int power) {
//usage1 = energy usage meter tariff 1, This is an incrementing counter
//usage2 = energy usage meter tariff 2, This is an incrementing counter
//return1 = energy return meter tariff 1, This is an incrementing counter
@ -478,8 +475,7 @@ void DomoticzSensorP1SmartMeter(char *usage1, char *usage2, char *return1, char
* Commands
\*********************************************************************************************/
void CmndDomoticzIdx(void)
{
void CmndDomoticzIdx(void) {
if ((XdrvMailbox.index > 0) && (XdrvMailbox.index <= MAX_DOMOTICZ_IDX)) {
if (XdrvMailbox.payload >= 0) {
Settings.domoticz_relay_idx[XdrvMailbox.index -1] = XdrvMailbox.payload;
@ -489,8 +485,7 @@ void CmndDomoticzIdx(void)
}
}
void CmndDomoticzKeyIdx(void)
{
void CmndDomoticzKeyIdx(void) {
if ((XdrvMailbox.index > 0) && (XdrvMailbox.index <= MAX_DOMOTICZ_IDX)) {
if (XdrvMailbox.payload >= 0) {
Settings.domoticz_key_idx[XdrvMailbox.index -1] = XdrvMailbox.payload;
@ -499,8 +494,7 @@ void CmndDomoticzKeyIdx(void)
}
}
void CmndDomoticzSwitchIdx(void)
{
void CmndDomoticzSwitchIdx(void) {
if ((XdrvMailbox.index > 0) && (XdrvMailbox.index <= MAX_DOMOTICZ_IDX)) {
if (XdrvMailbox.payload >= 0) {
Settings.domoticz_switch_idx[XdrvMailbox.index -1] = XdrvMailbox.payload;
@ -509,8 +503,7 @@ void CmndDomoticzSwitchIdx(void)
}
}
void CmndDomoticzSensorIdx(void)
{
void CmndDomoticzSensorIdx(void) {
if ((XdrvMailbox.index > 0) && (XdrvMailbox.index <= DZ_MAX_SENSORS)) {
if (XdrvMailbox.payload >= 0) {
Settings.domoticz_sensor_idx[XdrvMailbox.index -1] = XdrvMailbox.payload;
@ -519,14 +512,41 @@ void CmndDomoticzSensorIdx(void)
}
}
void CmndDomoticzUpdateTimer(void)
{
void CmndDomoticzUpdateTimer(void) {
if ((XdrvMailbox.payload >= 0) && (XdrvMailbox.payload < 3601)) {
Settings.domoticz_update_timer = XdrvMailbox.payload;
}
ResponseCmndNumber(Settings.domoticz_update_timer);
}
void CmndDomoticzSend(void) {
// DzSend1 <idx>,<values> - {\"idx\":<idx>,\"nvalue\":0,\"svalue\":\"<values>\",\"Battery\":xx,\"RSSI\":yy}
// DzSend2 <idx>,<values> - USE_SHUTTER only - {\"idx\":<idx>,\"nvalue\":<position>,\"svalue\":\"<values>\",\"Battery\":xx,\"RSSI\":yy}
// DzSend3 <idx>,<values> - {\"idx\":<idx>,\"nvalue\":<values>,\"Battery\":xx,\"RSSI\":yy}
// DzSend4 <idx>,<state> - {\"command\":\"switchlight\",\"idx\":<idx>,\"switchcmd\":\"<state>\"}
// DzSend5 <idx>,<state> - {\"command\":\"switchscene\",\"idx\":<idx>,\"switchcmd\":\"<state>\"}
if ((XdrvMailbox.index > 0) && (XdrvMailbox.index <= 5)) {
if (XdrvMailbox.data_len > 0) {
if (strstr(XdrvMailbox.data, ",") != nullptr) { // Process parameter entry
char *data;
uint32_t index = strtoul(strtok_r(XdrvMailbox.data, ",", &data), nullptr, 10);
if ((index > 0) && (data != nullptr)) {
if (XdrvMailbox.index > 3) {
uint32_t state = strtoul(data, nullptr, 10); // 0, 1 or 2
DomoticzSendSwitch(XdrvMailbox.index -4, index, state);
} else {
uint32_t type = DZ_TEMP;
if (2 == XdrvMailbox.index) { type = DZ_SHUTTER; }
else if (3 == XdrvMailbox.index) { type = DZ_AIRQUALITY; }
DomoticzSendData(type, index, data);
}
}
}
}
}
}
/*********************************************************************************************\
* Presentation
\*********************************************************************************************/
@ -554,8 +574,7 @@ const char HTTP_FORM_DOMOTICZ_SENSOR[] PROGMEM =
const char HTTP_FORM_DOMOTICZ_TIMER[] PROGMEM =
"<tr><td style='width:260px'><b>" D_DOMOTICZ_UPDATE_TIMER "</b> (" STR(DOMOTICZ_UPDATE_TIMER) ")</td><td style='width:70px'><input id='ut' placeholder='" STR(DOMOTICZ_UPDATE_TIMER) "' value='%d'></td></tr>";
void HandleDomoticzConfiguration(void)
{
void HandleDomoticzConfiguration(void) {
if (!HttpCheckPriviledgedAccess()) { return; }
AddLog_P(LOG_LEVEL_DEBUG, S_LOG_HTTP, S_CONFIGURE_DOMOTICZ);
@ -596,8 +615,7 @@ void HandleDomoticzConfiguration(void)
WSContentStop();
}
void DomoticzSaveSettings(void)
{
void DomoticzSaveSettings(void) {
char stemp[20];
char ssensor_indices[6 * MAX_DOMOTICZ_SNS_IDX];
char tmp[100];
@ -635,8 +653,7 @@ void DomoticzSaveSettings(void)
* Interface
\*********************************************************************************************/
bool Xdrv07(uint8_t function)
{
bool Xdrv07(uint8_t function) {
bool result = false;
if (Settings.flag.mqtt_enabled) { // SetOption3 - Enable MQTT