This commit is contained in:
2024-01-28 16:20:45 +03:00
parent bcae3c9d50
commit 340d54be09
5 changed files with 967 additions and 929 deletions

View File

@@ -146,7 +146,8 @@ if (input->type == aJson_Object) {
else else
{ {
Input in(input); Input in(input);
in.Poll(CHECK_INPUT); in.store->aslong = 0;
//in.Poll(CHECK_INPUT);
} }
} }
} }
@@ -524,7 +525,7 @@ bool Input::changeState(uint8_t newState, short cause)
if (!inputObj || !store) return false; if (!inputObj || !store) return false;
if (newState == IS_REQSTATE) if (newState == IS_REQSTATE)
if (store->delayedState && cause != CHECK_INTERRUPT) if (store->delayedState && (cause != CHECK_INTERRUPT))
{ {
// Requested delayed change State and safe moment // Requested delayed change State and safe moment
newState=store->reqState; //Retrieve requested state newState=store->reqState; //Retrieve requested state

View File

@@ -105,7 +105,7 @@ extern aJsonObject *inputs;
typedef union { typedef union {
long int aslong; uint32_t aslong;
uint32_t timestamp; uint32_t timestamp;
// Analog input structure // Analog input structure
struct { struct {

File diff suppressed because it is too large Load Diff

View File

@@ -1,249 +1,252 @@
#ifndef MULTIVENT_DISABLE #ifndef MULTIVENT_DISABLE
#include "modules/out_multivent.h" #include "modules/out_multivent.h"
#include "Arduino.h" #include "Arduino.h"
#include "options.h" #include "options.h"
#include "Streaming.h" #include "Streaming.h"
#include "item.h" #include "item.h"
#include "main.h" #include "main.h"
void out_Multivent::getConfig() void out_Multivent::getConfig()
{ {
gatesObj = NULL; gatesObj = NULL;
if (!item || !item->itemArg || item->itemArg->type != aJson_Object) return; if (!item || !item->itemArg || item->itemArg->type != aJson_Object) return;
gatesObj = item->itemArg; gatesObj = item->itemArg;
} }
int out_Multivent::Setup() int out_Multivent::Setup()
{ {
abstractOut::Setup(); abstractOut::Setup();
//getConfig(); //getConfig();
//Expand Argument storage to 2 //Expand Argument storage to 2
//for (int i = aJson.getArraySize(item->itemArg); i < 2; i++) //for (int i = aJson.getArraySize(item->itemArg); i < 2; i++)
// aJson.addItemToArray(item->itemArg, aJson.createItem( (long int) 0)); // aJson.addItemToArray(item->itemArg, aJson.createItem( (long int) 0));
//Allocate objects to store persistent data in config tree //Allocate objects to store persistent data in config tree
if (gatesObj /*&& aJson.getArraySize(item->itemArg)>=2*/) if (gatesObj /*&& aJson.getArraySize(item->itemArg)>=2*/)
{ {
aJsonObject * i = gatesObj->child; aJsonObject * i = gatesObj->child;
while (i) while (i)
{ {
if (i->name && *i->name) if (i->name && *i->name)
{ {
aJsonObject * setObj = aJson.getObjectItem(i, "set"); aJsonObject * setObj = aJson.getObjectItem(i, "set");
if (!setObj) aJson.addNumberToObject(i, "set", (long int) -1); if (!setObj) aJson.addNumberToObject(i, "set", (long int) -1);
aJsonObject * cmdObj = aJson.getObjectItem(i, "cmd"); aJsonObject * cmdObj = aJson.getObjectItem(i, "cmd");
if (!cmdObj) aJson.addNumberToObject(i, "cmd", (long int) -1); if (!cmdObj) aJson.addNumberToObject(i, "cmd", (long int) -1);
aJsonObject * outObj = aJson.getObjectItem(i, "out"); aJsonObject * outObj = aJson.getObjectItem(i, "out");
if (!outObj) aJson.addNumberToObject(i, "out", (long int) -1); if (!outObj) aJson.addNumberToObject(i, "out", (long int) -1);
} }
i=i->next; i=i->next;
} }
debugSerial << F ("MultiVent init")<< endl; debugSerial << F ("VENT: init")<< endl;
setStatus(CST_INITIALIZED); setStatus(CST_INITIALIZED);
return 1; return 1;
} }
debugSerial << F ("MultiVent config failed")<< endl; debugSerial << F ("VENT: config failed")<< endl;
return 0; return 0;
} }
int out_Multivent::Stop() int out_Multivent::Stop()
{ {
debugSerial << F ("Multivent De-Init") << endl; debugSerial << F ("VENT: De-Init") << endl;
setStatus(CST_UNKNOWN); setStatus(CST_UNKNOWN);
return 1; return 1;
} }
int out_Multivent::Poll(short cause) int out_Multivent::Poll(short cause)
{ {
return 0; return 0;
}; };
int out_Multivent::getChanType() int out_Multivent::getChanType()
{ {
return CH_PWM; return CH_PWM;
} }
int out_Multivent::Ctrl(itemCmd cmd, char* subItem , bool toExecute, bool authorized) int out_Multivent::Ctrl(itemCmd cmd, char* subItem , bool toExecute, bool authorized)
{ {
if (cmd.getCmd()==CMD_DISABLE || cmd.getCmd()==CMD_ENABLE) return 0; if (cmd.getCmd()==CMD_DISABLE || cmd.getCmd()==CMD_ENABLE) return 0;
int suffixCode = cmd.getSuffix(); int suffixCode = cmd.getSuffix();
if (cmd.isCommand() && !suffixCode) suffixCode=S_CMD; //if some known command find, but w/o correct suffix - got it if (cmd.isCommand() && !suffixCode) suffixCode=S_CMD; //if some known command find, but w/o correct suffix - got it
aJsonObject * i = NULL; aJsonObject * i = NULL;
if (cmd.isCommand() && cmd.getSuffix()==S_FAN) if (cmd.isCommand() && cmd.getSuffix()==S_FAN)
switch (cmd.getCmd()) switch (cmd.getCmd())
{ {
case CMD_HIGH: case CMD_HIGH:
cmd.Percents255(255); cmd.Percents255(255);
break; break;
case CMD_MED: case CMD_MED:
cmd.Percents255(128); cmd.Percents255(128);
break; break;
case CMD_LOW: case CMD_LOW:
cmd.setPercents(10); cmd.setPercents(10);
break; break;
} //switch cmd } //switch cmd
if (gatesObj) i = gatesObj->child; // Pass 1 - calculate summ air value, max value etc if (gatesObj) i = gatesObj->child; // Pass 1 - calculate summ air value, max value etc
int activeV = 0; int activeV = 0;
int totalV = 0; int totalV = 0;
int maxV=0; int maxV=0;
int maxRequestedV=0; int maxRequestedV=0;
int maxPercent=0; int maxPercent=0;
while (i) while (i)
{ {
aJsonObject * setObj=aJson.getObjectItem(i, "set"); aJsonObject * setObj=aJson.getObjectItem(i, "set");
aJsonObject * cmdObj=aJson.getObjectItem(i, "cmd"); aJsonObject * cmdObj=aJson.getObjectItem(i, "cmd");
aJsonObject * cascadeObj=aJson.getObjectItem(i, "cas"); aJsonObject * cascadeObj=aJson.getObjectItem(i, "cas");
if (setObj && cmdObj && setObj->type==aJson_Int && cmdObj->type==aJson_Int) if (setObj && cmdObj && setObj->type==aJson_Int && cmdObj->type==aJson_Int)
{ {
int V =aJson.getObjectItem(i,"V")->valueint; int V =aJson.getObjectItem(i,"V")->valueint;
int requestedV=0; int requestedV=0;
if (subItem && !strcmp (i->name,subItem)) if (subItem && !strcmp (i->name,subItem))
{ {
if (cmdObj && cmd.isCommand()) if (cmdObj && cmd.isCommand())
{ {
cmdObj->valueint = cmd.getCmd(); cmdObj->valueint = cmd.getCmd();
//publishTopic(i->name,cmdObj->valueint,"/set"); //publishTopic(i->name,cmdObj->valueint,"/set");
switch (cmd.getCmd()) switch (cmd.getCmd())
{ {
case CMD_ON: case CMD_ON:
cmd.Percents255(setObj->valueint); cmd.Percents255(setObj->valueint);
break; break;
case CMD_OFF: case CMD_OFF:
cmd.Percents255(0); cmd.Percents255(0);
} }
if (isNotRetainingStatus() && (cmdObj->valueint == CMD_ON) && (setObj->valueint<20)) if (isNotRetainingStatus() && (cmdObj->valueint == CMD_ON) && (setObj->valueint<20))
{ {
setObj->valueint=30; setObj->valueint=30;
cmd.Percents255(30); cmd.Percents255(30);
//if (isNotRetainingStatus()) item->SendStatusImmediate(cmd,FLAG_PARAMETERS,i->name); //if (isNotRetainingStatus()) item->SendStatusImmediate(cmd,FLAG_PARAMETERS,i->name);
} }
if (isNotRetainingStatus()) item->SendStatusImmediate(cmd,FLAG_COMMAND|FLAG_PARAMETERS,i->name); if (isNotRetainingStatus()) item->SendStatusImmediate(cmd,FLAG_COMMAND|FLAG_PARAMETERS,i->name);
} }
else if (setObj && cmdObj && suffixCode == S_FAN && cmd.isValue()) else if (setObj && cmdObj && suffixCode == S_FAN && cmd.isValue())
{ {
if (cmd.getInt()) if (cmd.getInt())
{ {
if (cmdObj->valueint == CMD_OFF || cmdObj->valueint == -1) if (cmdObj->valueint == CMD_OFF || cmdObj->valueint == -1)
{ {
debugSerial<<"Turning ON"<<endl; debugSerial<<"VENT: Turning ON"<<endl;
cmdObj->valueint = CMD_ON; cmdObj->valueint = CMD_ON;
cmd.Cmd(CMD_ON); cmd.Cmd(CMD_ON);
//if (isNotRetainingStatus()) item->SendStatusImmediate(itemCmd().Cmd(CMD_ON),FLAG_COMMAND,i->name); //if (isNotRetainingStatus()) item->SendStatusImmediate(itemCmd().Cmd(CMD_ON),FLAG_COMMAND,i->name);
} }
setObj->valueint = cmd.getInt(); setObj->valueint = cmd.getInt();
} }
else else
{ {
if (cmdObj->valueint != CMD_OFF && cmdObj->valueint != -1) if (cmdObj->valueint != CMD_OFF && cmdObj->valueint != -1)
{ debugSerial<<"Turning OFF"<<endl; { debugSerial<<"VENT: Turning OFF"<<endl;
cmdObj->valueint = CMD_OFF; cmdObj->valueint = CMD_OFF;
cmd.Cmd(CMD_OFF); cmd.Cmd(CMD_OFF);
//if (isNotRetainingStatus()) item->SendStatusImmediate(itemCmd().Cmd(CMD_OFF),FLAG_COMMAND,i->name); //if (isNotRetainingStatus()) item->SendStatusImmediate(itemCmd().Cmd(CMD_OFF),FLAG_COMMAND,i->name);
} }
setObj->valueint = 0; setObj->valueint = 0;
} }
if (isNotRetainingStatus()) item->SendStatusImmediate(cmd,FLAG_PARAMETERS|FLAG_COMMAND,i->name); if (isNotRetainingStatus()) item->SendStatusImmediate(cmd,FLAG_PARAMETERS|FLAG_COMMAND,i->name);
} }
else if (setObj && cmd.isValue()) else if (setObj && cmd.isValue())
{ {
setObj->valueint = cmd.getPercents255(); setObj->valueint = cmd.getPercents255();
//publishTopic(i->name,setObj->valueint,"/set"); //publishTopic(i->name,setObj->valueint,"/set");
if (isNotRetainingStatus()) item->SendStatusImmediate(cmd,FLAG_PARAMETERS,i->name); if (isNotRetainingStatus()) item->SendStatusImmediate(cmd,FLAG_PARAMETERS,i->name);
} }
if (cascadeObj) executeCommand(cascadeObj,-1,cmd); if (cascadeObj) executeCommand(cascadeObj,-1,cmd);
} }
if (cmdObj->valueint != CMD_OFF && cmdObj->valueint != -1) if (cmdObj->valueint != CMD_OFF && cmdObj->valueint != -1)
{ {
requestedV=V*setObj->valueint; requestedV=V*setObj->valueint;
activeV+=requestedV; activeV+=requestedV;
if (setObj->valueint>maxPercent ) if (setObj->valueint>maxPercent )
{ {
maxRequestedV=requestedV; maxRequestedV=requestedV;
maxV=V; maxV=V;
maxPercent=setObj->valueint; maxPercent=setObj->valueint;
} }
} }
totalV+=V; totalV+=V;
} }
i=i->next; i=i->next;
} }
if (!totalV) return 0; if (!totalV) return 0;
int fanV=activeV/totalV; int fanV=activeV/totalV;
debugSerial << F("Total V:")<<totalV<<F(" active V:")<<activeV/255<< F(" fan%:")<<fanV<< F(" Max request:")<<maxRequestedV/255 <<F(" from ")<<maxV<<F(" m3")<< endl; debugSerial << F("VENT: Total V:")<<totalV<<F(" active V:")<<activeV/255<< F(" fan%:")<<fanV<< F(" Max req:")<<maxRequestedV/255 <<F(" from ")<<maxV<<F(" m3")<< endl;
executeCommand(aJson.getObjectItem(gatesObj, ""),-1,itemCmd().Percents255(fanV).Cmd((fanV)?CMD_ON:CMD_OFF)); //executeCommand(aJson.getObjectItem(gatesObj, ""),-1,itemCmd().Percents255(fanV).Cmd((fanV)?CMD_ON:CMD_OFF));
if (fanV)
//Move gates only if fan is actually on executeCommand(aJson.getObjectItem(gatesObj, ""),-1,itemCmd().Percents255(fanV).Cmd(CMD_ON));
if (!fanV) return 1; else
executeCommand(aJson.getObjectItem(gatesObj, ""),-1,itemCmd().Percents255(fanV));
i=NULL; //Move gates only if fan is actually on
if (gatesObj) i = gatesObj->child; //Pass 2: re-distribute airflow if (!fanV) return 1;
while (i) i=NULL;
{ if (gatesObj) i = gatesObj->child; //Pass 2: re-distribute airflow
int V =aJson.getObjectItem(i,"V")->valueint;
while (i)
aJsonObject * outObj=aJson.getObjectItem(i, "out"); {
aJsonObject * setObj=aJson.getObjectItem(i, "set"); int V =aJson.getObjectItem(i,"V")->valueint;
aJsonObject * cmdObj=aJson.getObjectItem(i, "cmd");
aJsonObject * outObj=aJson.getObjectItem(i, "out");
if (outObj && setObj && cmdObj && outObj->type==aJson_Int && setObj->type==aJson_Int && cmdObj->type==aJson_Int && V) aJsonObject * setObj=aJson.getObjectItem(i, "set");
{ aJsonObject * cmdObj=aJson.getObjectItem(i, "cmd");
long int out = 0;
if (cmdObj->valueint != CMD_OFF && cmdObj->valueint != -1 && maxRequestedV) if (outObj && setObj && cmdObj && outObj->type==aJson_Int && setObj->type==aJson_Int && cmdObj->type==aJson_Int && V)
{ {
int requestedV=V*setObj->valueint; long int out = 0;
out = (( long)requestedV*255L)/(( long)V)*( long)maxV/( long)maxRequestedV; if (cmdObj->valueint != CMD_OFF && cmdObj->valueint != -1 && maxRequestedV)
debugSerial<<i->name<<(" Req:")<<requestedV/255<<F(" Out:")<<out<<endl; {
} int requestedV=V*setObj->valueint;
out = (( long)requestedV*255L)/(( long)V)*( long)maxV/( long)maxRequestedV;
debugSerial<<F("VENT: ")<<i->name<<F(" Req:")<<requestedV/255<<F(" Out:")<<out<<endl;
if ((out != outObj->valueint)) }
{
//report out
executeCommand(i,-1,itemCmd().Percents255(out)); if ((out != outObj->valueint))
outObj->valueint=out; {
} //report out
} executeCommand(i,-1,itemCmd().Percents255(out));
i=i->next; outObj->valueint=out;
} }
}
return 1; i=i->next;
} }
#endif return 1;
}
#endif

View File

@@ -5,7 +5,7 @@
#define MAXFLASHSTR 32 #define MAXFLASHSTR 32
#define PWDFLASHSTR 16 #define PWDFLASHSTR 16
#define EEPROM_SIGNATURE "LHC1" #define EEPROM_SIGNATURE "LHC2"
#define EEPROM_SIGNATURE_LENGTH 4 #define EEPROM_SIGNATURE_LENGTH 4
//#define EEPROM_offsetJSON IFLASH_PAGE_SIZE //#define EEPROM_offsetJSON IFLASH_PAGE_SIZE
@@ -23,12 +23,12 @@ const char EEPROM_signature[] = EEPROM_SIGNATURE;
uint32_t configFlags32bit; uint32_t configFlags32bit;
struct struct
{ {
uint8_t serialDebugLevel:3; uint8_t serialDebugLevel:4;
uint8_t notGetConfigFromHTTP:1; uint8_t notGetConfigFromHTTP:1;
uint8_t udpDebugLevel:3; uint8_t udpDebugLevel:3;
uint8_t notSaveSuccedConfig:1; uint8_t notSaveSuccedConfig:1;
uint8_t dhcpFallback:1; uint8_t dhcpFallback:1;
uint8_t spare2:7; uint8_t spare2:6;
uint16_t sysConfigHash; uint16_t sysConfigHash;
}; };
} systemConfigFlags; } systemConfigFlags;