mirror of
https://github.com/anklimov/lighthub
synced 2025-12-06 11:49:51 +03:00
sync
This commit is contained in:
@@ -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
|
||||||
|
|||||||
@@ -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
@@ -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
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
Reference in New Issue
Block a user