Files
IoTManager/src/MySensorsDataParse.cpp
2021-12-13 16:26:43 +03:00

349 lines
11 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#include "Consts.h"
#ifdef MYSENSORS
#include "Class/NotAsync.h"
#include "ItemsList.h"
#include "MySensorsDataParse.h"
#include "items/vSensorNode.h"
//для того что бы выключить оригинальный лог нужно перейти в файл библиотеки MyGatewayTransportSerial.cpp
//и заккоментировать строку 36 MY_SERIALDEVICE.print(protocolMyMessage2Serial(message));
boolean publishAnyJsonKeyWS(const String& topic, const String& key, const String& data) {
String path = mqttRootDevice + "/" + topic + "/status";
String json = "{}";
jsonWriteStr(json, key, data);
//добавляем топик, выводим в ws
String MyJson = json;
jsonWriteStr(MyJson, "topic", path);
ws.textAll(MyJson);
}
void loopMySensorsExecute() {
if (mysensorBuf.length()) {
String tmp = selectToMarker(mysensorBuf, ";");
String nodeId = selectFromMarkerToMarker(tmp, ",", 0); //node-id
String childSensorId = selectFromMarkerToMarker(tmp, ",", 1); //child-sensor-id
String type = selectFromMarkerToMarker(tmp, ",", 2); //type of var
String command = selectFromMarkerToMarker(tmp, ",", 3); //command
String value = selectFromMarkerToMarker(tmp, ",", 4); //value
static bool presentBeenStarted = false;
String key = nodeId + "-" + childSensorId;
static String infoJson = "{}";
if (childSensorId == "255") {
if (command == "3") { //это особое внутреннее сообщение
if (type == "11") { //название ноды
SerialPrint("I", "MySensor", "Node name: " + value);
//*
publishAnyJsonKey("MySensors", "Node name:", value);
publishAnyJsonKeyWS("MySensors", "Node name:", value);
}
if (type == "12") { //версия ноды
SerialPrint("I", "MySensor", "Node version: " + value);
//*
publishAnyJsonKey("MySensors", "Node version: ", value);
publishAnyJsonKeyWS("MySensors", "Node version: ", value);
}
}
} else {
if (command == "0") { //это презентация
presentBeenStarted = true;
int num;
String widget;
String descr;
sensorType(type.toInt(), num, widget, descr);
if (jsonReadBool(configSetupJson, "gateAuto")) {
if (!isItemAdded(key)) {
addItemAuto(num, key, widget, descr);
descr.replace("#", " ");
SerialPrint("I", "MySensor", "Add new item: " + key + ": " + descr);
//*
publishAnyJsonKey("MySensors", key, descr);
publishAnyJsonKeyWS("MySensors", key, descr);
} else {
descr.replace("#", " ");
SerialPrint("I", "MySensor", "Item already exist: " + key + ": " + descr);
//*
publishAnyJsonKey("MySensors", key, descr);
publishAnyJsonKeyWS("MySensors", key, descr);
}
} else {
descr.replace("#", " ");
SerialPrint("I", "MySensor", "Presentation: " + key + ": " + descr);
//*
publishAnyJsonKey("MySensors", key, descr);
publishAnyJsonKeyWS("MySensors", key, descr);
}
}
if (command == "1") { //это данные
if (value != "") {
if (presentBeenStarted) {
presentBeenStarted = false;
SerialPrint("I", "MySensor", "!!!Presentation of node: " + nodeId + " completed successfully!!!");
myNotAsyncActions->make(do_deviceInit);
}
if (mySensorNode != nullptr) {
for (unsigned int i = 0; i < mySensorNode->size(); i++) {
mySensorNode->at(i).onChange(value, key); //вызываем поочередно все экземпляры, там где подойдет там и выполнится
//*
publishAnyJsonKey("MySensors", key, value);
publishAnyJsonKeyWS("MySensors", key, value);
}
}
SerialPrint("I", "MySensor", "node: " + nodeId + ", sensor: " + childSensorId + ", command: " + command + ", type: " + type + ", val: " + value);
}
}
if (command == "2") { //это запрос значения переменной
SerialPrint("I", "MySensor", "Request a variable value");
}
}
mysensorBuf = deleteBeforeDelimiter(mysensorBuf, ";");
}
}
void sensorType(int index, int &num, String &widget, String &descr) {
switch (index) {
case 0:
descr = F("Door#and#window#sensors");
widget = F("alarm");
num = 1;
break;
case 1:
descr = F("Motion#sensors");
widget = F("alarm");
num = 1;
break;
case 2:
descr = F("Smoke#sensor");
widget = F("fillgauge");
num = 1;
break;
case 3:
descr = F("Binary#device#(on/off)");
widget = F("toggleBtn");
num = 2;
break;
case 4:
descr = F("Dimmable#device");
//to do
//widget = F("range");
//num = 2;
break;
case 5:
descr = F("Window#covers#or#shades");
//to do
//widget = F("range");
//num = 2;
break;
case 6:
descr = F("Temperature#sensor");
widget = F("anydataTemp");
num = 1;
break;
case 7:
descr = F("Humidity#sensor");
widget = F("anydataHum");
num = 1;
break;
case 8:
descr = F("Pressure#sensor");
widget = F("anydataPress");
num = 1;
break;
case 9:
descr = F("Wind#sensor");
widget = F("anydataTime");
num = 1;
break;
case 10:
descr = F("Rain#sensor");
widget = F("anydataTime");
num = 1;
break;
case 11:
descr = F("UV#sensor");
widget = F("anydataTime");
num = 1;
break;
case 12:
descr = F("Weight#sensor");
widget = F("anydataTime");
num = 1;
break;
case 13:
descr = F("Power#measuring#device");
widget = F("anydataWtt");
num = 1;
break;
case 14:
descr = F("Heater#device");
widget = F("anydataTemp");
num = 1;
break;
case 15:
descr = F("Distance#sensor");
widget = F("anydata");
num = 1;
break;
case 16:
descr = F("Light#sensor");
widget = F("anydataTime");
num = 1;
break;
case 17:
descr = F("Arduino#node#device");
widget = F("anydata");
num = 1;
break;
case 18:
descr = F("Arduino#repeating#node#device");
widget = F("anydata");
num = 1;
break;
case 19:
descr = F("Lock#device");
widget = F("toggleBtn");
num = 2;
break;
case 20:
descr = F("Ir#sender/receiver#device");
widget = F("toggleBtn");
num = 2;
break;
case 21:
descr = F("Water#meter");
widget = F("anydata");
num = 1;
break;
case 22:
descr = F("Air#quality#sensor");
widget = F("anydata");
num = 1;
break;
case 23:
descr = F("Custom#sensor");
widget = F("anydata");
num = 1;
break;
case 24:
descr = F("Dust#level#sensor");
widget = F("anydata");
num = 1;
break;
case 25:
descr = F("Scene#controller#device");
widget = F("anydata");
num = 1;
break;
case 26:
descr = F("RGB#light");
widget = F("anydata");
num = 1;
break;
case 27:
descr = F("RGBW#light#(with#separate#white#component)");
widget = F("anydata");
num = 1;
break;
case 28:
descr = F("Color#sensor");
widget = F("anydata");
num = 1;
break;
case 29:
descr = F("Thermostat/HVAC#device");
widget = F("anydata");
num = 1;
break;
case 30:
descr = F("Multimeter#device");
widget = F("anydataVlt");
num = 1;
break;
case 31:
descr = F("Sprinkler#device");
widget = F("anydata");
num = 1;
break;
case 32:
descr = F("Water#leak#sensor");
widget = F("alarm");
num = 1;
break;
case 33:
descr = F("Sound#sensor");
widget = F("anydata");
num = 1;
break;
case 34:
descr = F("Vibration#sensor");
widget = F("anydata");
num = 1;
break;
case 35:
descr = F("Moisture#sensor");
widget = F("anydata");
num = 1;
break;
case 36:
descr = F("LCD#text#device");
widget = F("anydata");
num = 1;
break;
case 37:
descr = F("Gas#meter");
widget = F("anydata");
num = 1;
break;
case 38:
descr = F("GPS#Sensor");
widget = F("anydata");
num = 1;
break;
case 39:
descr = F("Water#quality#sensor");
widget = F("anydata");
num = 1;
break;
default:
descr = F("Unknown");
widget = F("anydata");
num = 1;
break;
}
}
#endif
//отличный пример разбора строки
//void test(char *inputString) {
// char *str, *p;
// uint8_t index = 0;
// for (str = strtok_r(inputString, ";", &p);
// str && index < 5;
// str = strtok_r(NULL, ";", &p), index++) {
// switch (index) {
// case 0:
// Serial.println(str);
// break;
// case 1:
// Serial.println(str);
// break;
// case 2:
// Serial.println(str);
// break;
// case 3:
// Serial.println(str);
// break;
// case 4:
// Serial.println(str);
// break;
// }
// }
//}