From ecff141f6aabffe4daa018c505a9cf163193769f Mon Sep 17 00:00:00 2001 From: Andrey Klimov Date: Fri, 30 Apr 2021 11:51:29 +0300 Subject: [PATCH] multivent interim 2 --- lighthub/item.cpp | 23 ++++++- lighthub/item.h | 3 +- lighthub/modules/out_multivent.cpp | 97 ++++++++++++++++++++++-------- 3 files changed, 96 insertions(+), 27 deletions(-) diff --git a/lighthub/item.cpp b/lighthub/item.cpp index 399820a..fdb1b4f 100644 --- a/lighthub/item.cpp +++ b/lighthub/item.cpp @@ -48,6 +48,7 @@ e-mail anklimov@gmail.com #include "modules/out_dmx.h" #include "modules/out_pwm.h" #include "modules/out_pid.h" +#include "modules/out_multivent.h" short modbusBusy = 0; extern aJsonObject *pollingItem; @@ -172,6 +173,13 @@ void Item::Parse() { // debugSerial<name << F(" T:") << itemType << F(" =") << getArg() << endl; @@ -1125,7 +1133,7 @@ int Item::SendStatus(int sendFlags) { else return SendStatusImmediate(sendFlags); } - int Item::SendStatusImmediate(int sendFlags) { + int Item::SendStatusImmediate(int sendFlags, char * subItem) { { itemCmd st(ST_VOID,CMD_VOID); st.loadItem(this, true); @@ -1171,7 +1179,7 @@ int Item::SendStatus(int sendFlags) { case ST_HSV255: case ST_FLOAT_CELSIUS: - if (mqttClient.connected() && !ethernetIdleCount) + if (mqttClient.connected() && !ethernetIdleCount && !subItem) { setTopic(addrstr,sizeof(addrstr),T_OUT); @@ -1206,6 +1214,12 @@ int Item::SendStatus(int sendFlags) { { setTopic(addrstr,sizeof(addrstr),T_OUT); strncat(addrstr, itemArr->name, sizeof(addrstr)-1); + if (subItem) + { + strncat(addrstr, "/", sizeof(addrstr)); + strncat(addrstr, subItem, sizeof(addrstr)-1); + } + strncat(addrstr, "/", sizeof(addrstr)); // Preparing parameters payload ////////// @@ -1263,6 +1277,11 @@ int Item::SendStatus(int sendFlags) { setTopic(addrstr,sizeof(addrstr),T_OUT); strncat(addrstr, itemArr->name, sizeof(addrstr)-1); + if (subItem) + { + strncat(addrstr, "/", sizeof(addrstr)); + strncat(addrstr, subItem, sizeof(addrstr)-1); + } strncat(addrstr, "/", sizeof(addrstr)); strncat_P(addrstr, CMD_P, sizeof(addrstr)); diff --git a/lighthub/item.h b/lighthub/item.h index 6fc868b..12bc435 100644 --- a/lighthub/item.h +++ b/lighthub/item.h @@ -52,6 +52,7 @@ e-mail anklimov@gmail.com #define CH_MOTOR 12 #define CH_PID 13 #define CH_MBUS 14 +#define CH_MULTIVENT 18 //#define CHANNEL_TYPES 13 @@ -128,7 +129,7 @@ class Item void setSubtype(uint8_t par); int Poll(int cause); int SendStatus(int sendFlags); - int SendStatusImmediate(int sendFlags); + int SendStatusImmediate(int sendFlags, char * subItem=NULL); int isActive(); int getChanType(); inline int On (){return Ctrl(itemCmd(ST_VOID,CMD_ON));}; diff --git a/lighthub/modules/out_multivent.cpp b/lighthub/modules/out_multivent.cpp index 4841804..f9ef091 100644 --- a/lighthub/modules/out_multivent.cpp +++ b/lighthub/modules/out_multivent.cpp @@ -22,7 +22,7 @@ int out_Multivent::Setup() abstractOut::Setup(); //getConfig(); -//Expand Argument storage to 3 +//Expand Argument storage to 2 for (int i = aJson.getArraySize(item->itemArg); i < 2; i++) aJson.addItemToArray(item->itemArg, aJson.createItem( (long int) 0)); @@ -33,13 +33,13 @@ if (gatesObj) while (i) { aJsonObject * setObj = aJson.getObjectItem(i, "set"); - if (!setObj) aJson.addNumberToObject(i, "set", (long int) 0); + if (!setObj) aJson.addNumberToObject(i, "set", (long int) -1); aJsonObject * cmdObj = aJson.getObjectItem(i, "cmd"); - if (!setObj) aJson.addNumberToObject(i, "cmd", (long int) 0); + if (!setObj) aJson.addNumberToObject(i, "cmd", (long int) -1); aJsonObject * outObj = aJson.getObjectItem(i, "out"); - if (!setObj) aJson.addNumberToObject(i, "out", (long int) 0); + if (!setObj) aJson.addNumberToObject(i, "out", (long int) -1); i=i->next; } @@ -91,51 +91,100 @@ int out_Multivent::getChanType() int out_Multivent::Ctrl(itemCmd cmd, char* subItem , bool toExecute) { -aJsonObject * gateObj = NULL; + int suffixCode = cmd.getSuffix(); if (cmd.isCommand() && !suffixCode) suffixCode=S_CMD; //if some known command find, but w/o correct suffix - got it -//if (subItem && gatesObj) -//{ -//gateObj = aJson.getObjectItem(gatesObj,subItem); -//} - aJsonObject * i = NULL; -if (gatesObj) i = gatesObj->child; +aJsonObject * currentGateObj = NULL; + +if (gatesObj) i = gatesObj->child; // Pass 1 - calculate summ air value, max value etc int activeV = 0; -int totalV = 0; -int gateV = 0; -char * gateEmit = NULL; +int totalV = 0; +int gateV = 0; +//char * gateEmit = NULL; int gateCmd = 0; +int maxV=0; while (i) { - int V =aJson.getObjectItem(i,"V")->valueint; aJsonObject * setObj=aJson.getObjectItem(i, "set"); aJsonObject * cmdObj=aJson.getObjectItem(i, "cmd"); + if (!setObj || !cmdObj || setObj->type!=aJson_Int || cmdObj->type!=aJson_Int) continue; + + int V =aJson.getObjectItem(i,"V")->valueint; + int requestedV=0; if (subItem && !strcmp (i->name,subItem)) { - gateObj=i; + currentGateObj=i; gateV=V; - gateEmit=aJson.getObjectItem(i,"emit")->valuestring; + // gateEmit=aJson.getObjectItem(i,"emit")->valuestring; + gateCmd=cmdObj->valueint; - if (cmdObj && cmd.isCommand()) cmdObj->valueint = cmd.getCmd(); - if (setObj && cmd.isValue()) setObj->valueint = cmd.getPercents255(); + if (cmdObj && cmd.isCommand()) + { + cmdObj->valueint = cmd.getCmd(); + //publishTopic(i->name,cmdObj->valueint,"/set"); + item->SendStatusImmediate(SEND_COMMAND,i->name); + } + if (setObj && cmd.isValue()) + { + setObj->valueint = cmd.getPercents255(); + //publishTopic(i->name,setObj->valueint,"/set"); + item->SendStatusImmediate(SEND_PARAMETERS,i->name); + } } - if (cmdObj && cmdObj->valueint != CMD_OFF) activeV+=setObj->valueint*V; + if (cmdObj->valueint != CMD_OFF) + { + requestedV=V*setObj->valueint; + activeV+=requestedV; + } totalV+=V; + // numberGates++; + + if(requestedV>maxV) maxV=requestedV; i=i->next; } -int fanV=activeV*255/totalV; +int fanV=activeV/totalV; +debugSerial << F("Total V:")<child; //Pass 2: re-distribute airflow + +while (i) +{ +// nGate++; + int V =aJson.getObjectItem(i,"V")->valueint; + + aJsonObject * outObj=aJson.getObjectItem(i, "out"); + aJsonObject * setObj=aJson.getObjectItem(i, "set"); + aJsonObject * cmdObj=aJson.getObjectItem(i, "cmd"); + + if (!outObj || !setObj || !cmdObj || outObj->type!=aJson_Int || setObj->type!=aJson_Int || cmdObj->type!=aJson_Int) continue; + int out = 0; + if (cmdObj->valueint != CMD_OFF) + { + int requestedV=V*setObj->valueint; + int out = requestedV*255/maxV; + debugSerial<name,(" Req:")<valueint) + { + //report out + executeCommand(i,-1,itemCmd().Percents255(out)); + outObj->valueint=out; + } + + i=i->next; +} + +return 1; switch(suffixCode) {