Update RG-15

- Update RG-15 in case no complete message is received
- Add colon as optional separator for Domoticz DzSend values allowing DzSend as backlog command
This commit is contained in:
Theo Arends 2022-01-04 12:09:16 +01:00
parent 900269ad44
commit 8a291f251f
2 changed files with 14 additions and 10 deletions

View File

@ -360,7 +360,7 @@ bool DomoticzSendKey(uint8_t key, uint8_t device, uint8_t state, uint8_t svalflg
\*********************************************************************************************/
void DomoticzSendData(uint32_t sensor_idx, uint32_t idx, char *data) {
char payload[128];
char payload[128]; // {"idx":26700,"nvalue":0,"svalue":"22330.1;10234.4;22000.5;10243.4;1006;3000","Battery":100,"RSSI":10}
if (DZ_AIRQUALITY == sensor_idx) {
snprintf_P(payload, sizeof(payload), PSTR("{\"idx\":%d,\"nvalue\":%s,\"Battery\":%d,\"RSSI\":%d}"),
idx, data, DomoticzBatteryQuality(), DomoticzRssiQuality());
@ -506,6 +506,7 @@ void CmndDomoticzUpdateTimer(void) {
void CmndDomoticzSend(void) {
// DzSend1 <idx>,<values> - {\"idx\":<idx>,\"nvalue\":0,\"svalue\":\"<values>\",\"Battery\":xx,\"RSSI\":yy}
// DzSend1 418,%var1%;%var2% or DzSend1 418,%var1%:%var2% - Notice colon as substitute to semi-colon
// 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>\"}
@ -517,6 +518,7 @@ void CmndDomoticzSend(void) {
char *data;
uint32_t index = strtoul(strtok_r(XdrvMailbox.data, ",", &data), nullptr, 10);
if ((index > 0) && (data != nullptr)) {
ReplaceChar(data,':',';'); // As a workaround for command backlog inter-command separator
if (XdrvMailbox.index > 3) {
uint32_t state = strtoul(data, nullptr, 10); // 0, 1 or 2
DomoticzSendSwitch(XdrvMailbox.index -4, index, state);

View File

@ -24,7 +24,9 @@
* https://rainsensors.com/rg-9-15-protocol/
*
* Rule for Domoticz Rain sensor index 418:
* on tele-rg-15#flowrate do var1 %value% endon on tele-rg-15#event do dzsend1 418,%var1%;%value% endon
* on tele-rg-15#flowrate do var1 %value% endon
* on tele-rg-15#event do backlog var2 %value%; mult1 100; event sendrain endon
* on event#sendrain do dzsend1 418,%var1%;%var2% endon
\*********************************************************************************************/
#define XSNS_90 90
@ -84,7 +86,7 @@ bool Rg15ReadLine(char* buffer) {
return true;
}
float Rg15Parse(char* buffer, const char* item) {
bool Rg15Parse(char* buffer, const char* item, float* result) {
char* start = strstr(buffer, item);
if (start != nullptr) {
char* end = strstr(start, " mm"); // Metric (mm or mmph)
@ -94,12 +96,12 @@ float Rg15Parse(char* buffer, const char* item) {
if (end != nullptr) {
char tmp = end[0];
end[0] = '\0';
float result = CharToFloat(start + strlen(item));
*result = CharToFloat(start + strlen(item));
end[0] = tmp;
return result;
return true;
}
}
return 0.0f;
return false;
}
bool Rg15Process(char* buffer) {
@ -108,10 +110,10 @@ bool Rg15Process(char* buffer) {
// Acc 0.001 in, EventAcc 0.002 in, TotalAcc 0.003 in, RInt 0.004 iph
// Acc 0.001 mm, EventAcc 0.002 mm, TotalAcc 0.003 mm, RInt 0.004 mmph, XTBTips 0, XTBAcc 0.01 mm, XTBEventAcc 0.02 mm, XTBTotalAcc 0.03 mm
if (buffer[0] == 'A' && buffer[1] == 'c' && buffer[2] == 'c') {
Rg15.acc = Rg15Parse(buffer, "Acc");
Rg15.event = Rg15Parse(buffer, "EventAcc");
Rg15.total = Rg15Parse(buffer, "TotalAcc");
Rg15.rate = Rg15Parse(buffer, "RInt");
Rg15Parse(buffer, "Acc", &Rg15.acc);
Rg15Parse(buffer, "EventAcc", &Rg15.event);
Rg15Parse(buffer, "TotalAcc", &Rg15.total);
Rg15Parse(buffer, "RInt", &Rg15.rate);
if (Rg15.acc > 0.0f) {
Rg15.time = RG15_EVENT_TIMEOUT; // We have some data, so the rain event is on-going