mirror of
https://github.com/wled/WLED.git
synced 2025-07-21 17:56:33 +00:00
Add Domoticz MQTT API
- to PIR sensor - to Dallas temperature
This commit is contained in:
parent
67ae716c60
commit
b176225910
@ -70,6 +70,7 @@ private:
|
|||||||
|
|
||||||
// Home Assistant
|
// Home Assistant
|
||||||
bool HomeAssistantDiscovery = false; // is HA discovery turned on
|
bool HomeAssistantDiscovery = false; // is HA discovery turned on
|
||||||
|
int16_t idx = -1; // Domoticz virtual switch idx
|
||||||
|
|
||||||
// strings to reduce flash memory usage (used more than twice)
|
// strings to reduce flash memory usage (used more than twice)
|
||||||
static const char _name[];
|
static const char _name[];
|
||||||
@ -83,6 +84,7 @@ private:
|
|||||||
static const char _haDiscovery[];
|
static const char _haDiscovery[];
|
||||||
static const char _notify[];
|
static const char _notify[];
|
||||||
static const char _override[];
|
static const char _override[];
|
||||||
|
static const char _domoticzIDX[];
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* check if it is daytime
|
* check if it is daytime
|
||||||
@ -196,6 +198,7 @@ const char PIRsensorSwitch::_offOnly[] PROGMEM = "off-only";
|
|||||||
const char PIRsensorSwitch::_haDiscovery[] PROGMEM = "HA-discovery";
|
const char PIRsensorSwitch::_haDiscovery[] PROGMEM = "HA-discovery";
|
||||||
const char PIRsensorSwitch::_notify[] PROGMEM = "notifications";
|
const char PIRsensorSwitch::_notify[] PROGMEM = "notifications";
|
||||||
const char PIRsensorSwitch::_override[] PROGMEM = "override";
|
const char PIRsensorSwitch::_override[] PROGMEM = "override";
|
||||||
|
const char PIRsensorSwitch::_domoticzIDX[] PROGMEM = "domoticz-idx";
|
||||||
|
|
||||||
bool PIRsensorSwitch::isDayTime() {
|
bool PIRsensorSwitch::isDayTime() {
|
||||||
updateLocalTime();
|
updateLocalTime();
|
||||||
@ -271,9 +274,20 @@ void PIRsensorSwitch::publishMqtt(const char* state)
|
|||||||
#ifndef WLED_DISABLE_MQTT
|
#ifndef WLED_DISABLE_MQTT
|
||||||
//Check if MQTT Connected, otherwise it will crash the 8266
|
//Check if MQTT Connected, otherwise it will crash the 8266
|
||||||
if (WLED_MQTT_CONNECTED) {
|
if (WLED_MQTT_CONNECTED) {
|
||||||
char buf[64];
|
char buf[128];
|
||||||
sprintf_P(buf, PSTR("%s/motion"), mqttDeviceTopic); //max length: 33 + 7 = 40
|
sprintf_P(buf, PSTR("%s/motion"), mqttDeviceTopic); //max length: 33 + 7 = 40
|
||||||
mqtt->publish(buf, 0, false, state);
|
mqtt->publish(buf, 0, false, state);
|
||||||
|
// Domoticz formatted message
|
||||||
|
if (idx > 0) {
|
||||||
|
StaticJsonDocument <128> msg;
|
||||||
|
msg[F("idx")] = idx;
|
||||||
|
msg[F("RSSI")] = WiFi.RSSI();
|
||||||
|
msg[F("command")] = F("switchlight");
|
||||||
|
strcpy(buf, state); buf[0] = toupper(buf[0]);
|
||||||
|
msg[F("switchcmd")] = (const char *)buf;
|
||||||
|
serializeJson(msg, buf, 127);
|
||||||
|
mqtt->publish("domoticz/in", 0, false, buf);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
@ -482,6 +496,7 @@ void PIRsensorSwitch::addToConfig(JsonObject &root)
|
|||||||
top[FPSTR(_offOnly)] = m_offOnly;
|
top[FPSTR(_offOnly)] = m_offOnly;
|
||||||
top[FPSTR(_override)] = m_override;
|
top[FPSTR(_override)] = m_override;
|
||||||
top[FPSTR(_haDiscovery)] = HomeAssistantDiscovery;
|
top[FPSTR(_haDiscovery)] = HomeAssistantDiscovery;
|
||||||
|
top[FPSTR(_domoticzIDX)] = idx;
|
||||||
top[FPSTR(_notify)] = (NotifyUpdateMode != CALL_MODE_NO_NOTIFY);
|
top[FPSTR(_notify)] = (NotifyUpdateMode != CALL_MODE_NO_NOTIFY);
|
||||||
DEBUG_PRINTLN(F("PIR config saved."));
|
DEBUG_PRINTLN(F("PIR config saved."));
|
||||||
}
|
}
|
||||||
@ -521,6 +536,7 @@ bool PIRsensorSwitch::readFromConfig(JsonObject &root)
|
|||||||
m_offOnly = top[FPSTR(_offOnly)] | m_offOnly;
|
m_offOnly = top[FPSTR(_offOnly)] | m_offOnly;
|
||||||
m_override = top[FPSTR(_override)] | m_override;
|
m_override = top[FPSTR(_override)] | m_override;
|
||||||
HomeAssistantDiscovery = top[FPSTR(_haDiscovery)] | HomeAssistantDiscovery;
|
HomeAssistantDiscovery = top[FPSTR(_haDiscovery)] | HomeAssistantDiscovery;
|
||||||
|
idx = top[FPSTR(_domoticzIDX)] | idx;
|
||||||
|
|
||||||
NotifyUpdateMode = top[FPSTR(_notify)] ? CALL_MODE_DIRECT_CHANGE : CALL_MODE_NO_NOTIFY;
|
NotifyUpdateMode = top[FPSTR(_notify)] ? CALL_MODE_DIRECT_CHANGE : CALL_MODE_NO_NOTIFY;
|
||||||
|
|
||||||
@ -549,5 +565,5 @@ bool PIRsensorSwitch::readFromConfig(JsonObject &root)
|
|||||||
DEBUG_PRINTLN(F(" config (re)loaded."));
|
DEBUG_PRINTLN(F(" config (re)loaded."));
|
||||||
}
|
}
|
||||||
// use "return !top["newestParameter"].isNull();" when updating Usermod with new features
|
// use "return !top["newestParameter"].isNull();" when updating Usermod with new features
|
||||||
return !top[FPSTR(_override)].isNull();
|
return !top[FPSTR(_domoticzIDX)].isNull();
|
||||||
}
|
}
|
||||||
|
@ -48,6 +48,7 @@ class UsermodTemperature : public Usermod {
|
|||||||
bool enabled = true;
|
bool enabled = true;
|
||||||
|
|
||||||
bool HApublished = false;
|
bool HApublished = false;
|
||||||
|
int16_t idx = -1; // Domoticz virtual sensor idx
|
||||||
|
|
||||||
// strings to reduce flash memory usage (used more than twice)
|
// strings to reduce flash memory usage (used more than twice)
|
||||||
static const char _name[];
|
static const char _name[];
|
||||||
@ -55,6 +56,7 @@ class UsermodTemperature : public Usermod {
|
|||||||
static const char _readInterval[];
|
static const char _readInterval[];
|
||||||
static const char _parasite[];
|
static const char _parasite[];
|
||||||
static const char _parasitePin[];
|
static const char _parasitePin[];
|
||||||
|
static const char _domoticzIDX[];
|
||||||
|
|
||||||
//Dallas sensor quick (& dirty) reading. Credit to - Author: Peter Scargill, August 17th, 2013
|
//Dallas sensor quick (& dirty) reading. Credit to - Author: Peter Scargill, August 17th, 2013
|
||||||
float readDallas();
|
float readDallas();
|
||||||
@ -264,7 +266,7 @@ void UsermodTemperature::loop() {
|
|||||||
|
|
||||||
#ifndef WLED_DISABLE_MQTT
|
#ifndef WLED_DISABLE_MQTT
|
||||||
if (WLED_MQTT_CONNECTED) {
|
if (WLED_MQTT_CONNECTED) {
|
||||||
char subuf[64];
|
char subuf[128];
|
||||||
strcpy(subuf, mqttDeviceTopic);
|
strcpy(subuf, mqttDeviceTopic);
|
||||||
if (temperature > -100.0f) {
|
if (temperature > -100.0f) {
|
||||||
// dont publish super low temperature as the graph will get messed up
|
// dont publish super low temperature as the graph will get messed up
|
||||||
@ -274,6 +276,16 @@ void UsermodTemperature::loop() {
|
|||||||
mqtt->publish(subuf, 0, false, String(getTemperatureC()).c_str());
|
mqtt->publish(subuf, 0, false, String(getTemperatureC()).c_str());
|
||||||
strcat_P(subuf, PSTR("_f"));
|
strcat_P(subuf, PSTR("_f"));
|
||||||
mqtt->publish(subuf, 0, false, String(getTemperatureF()).c_str());
|
mqtt->publish(subuf, 0, false, String(getTemperatureF()).c_str());
|
||||||
|
if (idx > 0) {
|
||||||
|
StaticJsonDocument <128> msg;
|
||||||
|
msg[F("idx")] = idx;
|
||||||
|
msg[F("RSSI")] = WiFi.RSSI();
|
||||||
|
msg[F("nvalue")] = 0;
|
||||||
|
msg[F("svalue")] = String(getTemperatureC());
|
||||||
|
serializeJson(msg, subuf, 127);
|
||||||
|
DEBUG_PRINTLN(subuf);
|
||||||
|
mqtt->publish("domoticz/in", 0, false, subuf);
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
// publish something else to indicate status?
|
// publish something else to indicate status?
|
||||||
}
|
}
|
||||||
@ -360,6 +372,7 @@ void UsermodTemperature::addToConfig(JsonObject &root) {
|
|||||||
top[FPSTR(_readInterval)] = readingInterval / 1000;
|
top[FPSTR(_readInterval)] = readingInterval / 1000;
|
||||||
top[FPSTR(_parasite)] = parasite;
|
top[FPSTR(_parasite)] = parasite;
|
||||||
top[FPSTR(_parasitePin)] = parasitePin;
|
top[FPSTR(_parasitePin)] = parasitePin;
|
||||||
|
top[FPSTR(_domoticzIDX)] = idx;
|
||||||
DEBUG_PRINTLN(F("Temperature config saved."));
|
DEBUG_PRINTLN(F("Temperature config saved."));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -386,6 +399,7 @@ bool UsermodTemperature::readFromConfig(JsonObject &root) {
|
|||||||
readingInterval = min(120,max(10,(int)readingInterval)) * 1000; // convert to ms
|
readingInterval = min(120,max(10,(int)readingInterval)) * 1000; // convert to ms
|
||||||
parasite = top[FPSTR(_parasite)] | parasite;
|
parasite = top[FPSTR(_parasite)] | parasite;
|
||||||
parasitePin = top[FPSTR(_parasitePin)] | parasitePin;
|
parasitePin = top[FPSTR(_parasitePin)] | parasitePin;
|
||||||
|
idx = top[FPSTR(_domoticzIDX)] | idx;
|
||||||
|
|
||||||
if (!initDone) {
|
if (!initDone) {
|
||||||
// first run: reading from cfg.json
|
// first run: reading from cfg.json
|
||||||
@ -406,7 +420,7 @@ bool UsermodTemperature::readFromConfig(JsonObject &root) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
// use "return !top["newestParameter"].isNull();" when updating Usermod with new features
|
// use "return !top["newestParameter"].isNull();" when updating Usermod with new features
|
||||||
return !top[FPSTR(_parasitePin)].isNull();
|
return !top[FPSTR(_domoticzIDX)].isNull();
|
||||||
}
|
}
|
||||||
|
|
||||||
void UsermodTemperature::appendConfigData() {
|
void UsermodTemperature::appendConfigData() {
|
||||||
@ -430,3 +444,4 @@ const char UsermodTemperature::_enabled[] PROGMEM = "enabled";
|
|||||||
const char UsermodTemperature::_readInterval[] PROGMEM = "read-interval-s";
|
const char UsermodTemperature::_readInterval[] PROGMEM = "read-interval-s";
|
||||||
const char UsermodTemperature::_parasite[] PROGMEM = "parasite-pwr";
|
const char UsermodTemperature::_parasite[] PROGMEM = "parasite-pwr";
|
||||||
const char UsermodTemperature::_parasitePin[] PROGMEM = "parasite-pwr-pin";
|
const char UsermodTemperature::_parasitePin[] PROGMEM = "parasite-pwr-pin";
|
||||||
|
const char UsermodTemperature::_domoticzIDX[] PROGMEM = "domoticz-idx";
|
||||||
|
@ -803,13 +803,6 @@ bool MultiRelay::readFromConfig(JsonObject &root) {
|
|||||||
_relay[i].external = top[parName][FPSTR(_external)] | _relay[i].external;
|
_relay[i].external = top[parName][FPSTR(_external)] | _relay[i].external;
|
||||||
_relay[i].delay = top[parName][FPSTR(_delay_str)] | _relay[i].delay;
|
_relay[i].delay = top[parName][FPSTR(_delay_str)] | _relay[i].delay;
|
||||||
_relay[i].button = top[parName][FPSTR(_button)] | _relay[i].button;
|
_relay[i].button = top[parName][FPSTR(_button)] | _relay[i].button;
|
||||||
// begin backwards compatibility (beta) remove when 0.13 is released
|
|
||||||
parName += '-';
|
|
||||||
_relay[i].pin = top[parName+"pin"] | _relay[i].pin;
|
|
||||||
_relay[i].invert = top[parName+FPSTR(_activeHigh)] | _relay[i].invert;
|
|
||||||
_relay[i].external = top[parName+FPSTR(_external)] | _relay[i].external;
|
|
||||||
_relay[i].delay = top[parName+FPSTR(_delay_str)] | _relay[i].delay;
|
|
||||||
// end compatibility
|
|
||||||
_relay[i].delay = min(600,max(0,abs((int)_relay[i].delay))); // bounds checking max 10min
|
_relay[i].delay = min(600,max(0,abs((int)_relay[i].delay))); // bounds checking max 10min
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user