mapping val bondaries added

timer tuning
more logging to thermostat & map
MBUS chan stop if not configured well
This commit is contained in:
2025-04-06 22:46:44 +03:00
parent 6cba90f7dd
commit e803d1ae51
7 changed files with 79 additions and 21 deletions

View File

@@ -1687,13 +1687,13 @@ if ((!driver || driver->isAllowed(cmd))
tStore.asint=getExt();
if (!tStore.timestamp16)
{
infoSerial<<F("Cleaning alarm ")<<itemArr->name<<endl;
infoSerial<<F("Cleaning alarm ")<<itemArr->name<<" Ext:"<<tStore.asint<<endl;
#if not defined (NOIP)
mqttClient.publish("/alarmoff/snsr", itemArr->name);
#endif
}
tStore.tempX100=cmd.getFloat()*100.; //Save measurement
tStore.timestamp16=millisNZ(8) & 0xFFFF; //And timestamp
tStore.timestamp16=millisNZ(8) & 0xFFFFU; //And timestamp
debugSerial<<F("THERM:")<<itemArr->name<<F(" T:")<<tStore.tempX100<<F(" TS:")<<tStore.timestamp16<<endl;
setExt(tStore.asint);
res=1;

View File

@@ -1367,17 +1367,40 @@ return false;
if (matchedCmd && matchedCmd->type != aJson_NULL)
{
traceSerial<<F("MAP: cmd mapped to ")<<matchedCmd->valueint<<endl;
return itemCmd().Int((uint32_t)matchedCmd->valueint);
}
aJsonObject *valMapping = aJson.getObjectItem(mappingData, "val");
if (isValue() && valMapping && valMapping->type == aJson_Array && aJson.getArraySize(valMapping) == 4)
if (isValue() && valMapping && valMapping->type == aJson_Array && aJson.getArraySize(valMapping) >= 4)
{ //ПРЯМОЕ
//"val":[0-вход_мин, 1-вход_макс, 2-выход_мин, 3-выход_макс, 4-вход<мин_прямое, 5-вых<мин_обратное, 6-вход>макс_прямое, 7-вых>макс_обратное]
aJsonObject *leftBoundObj = aJson.getArrayItem(valMapping,4);
aJsonObject *rightBoundObj = aJson.getArrayItem(valMapping,6);
//if (getInt()<aJson.getArrayItem(valMapping,0)->valueint) return itemCmd().Int((uint32_t) 0); было если меньше левой границы то ноль. Неперь для такого поведения надо пятым элементом явно поставить ноль
if (getInt()<aJson.getArrayItem(valMapping,0)->valueint)
{
if (getInt()<aJson.getArrayItem(valMapping,0)->valueint) return itemCmd().Int((uint32_t) 0);
return itemCmd().Int((uint32_t)
map(getInt(),
traceSerial<<F("MAP: value ")<<getInt()<<F(" is below left bound ")<<aJson.getArrayItem(valMapping,0)->valueint<<endl;
if (leftBoundObj && leftBoundObj->type == aJson_Int )
return itemCmd().Int(leftBoundObj->valueint);
else return itemCmd(ST_VOID,CMD_VOID);
}
if (getInt()>aJson.getArrayItem(valMapping,1)->valueint)
{
traceSerial<<F("MAP: value above right bound ")<<endl;
if (rightBoundObj && rightBoundObj->type == aJson_Int )
return itemCmd().Int(rightBoundObj->valueint);
else return itemCmd(ST_VOID,CMD_VOID);
}
long res = map(getInt(),
aJson.getArrayItem(valMapping,0)->valueint,aJson.getArrayItem(valMapping,1)->valueint,
aJson.getArrayItem(valMapping,2)->valueint,aJson.getArrayItem(valMapping,3)->valueint));
aJson.getArrayItem(valMapping,2)->valueint,aJson.getArrayItem(valMapping,3)->valueint);
traceSerial<<F("MAP: val mapped to ")<<res<<endl;
return itemCmd().Int((uint32_t) res);
}
else if (valMapping && valMapping->type == aJson_NULL) return itemCmd(ST_VOID,CMD_VOID);
return *this;
@@ -1445,14 +1468,36 @@ if (isValue() && valMapping && valMapping->type == aJson_Array && aJson.getArray
if (matchedCmd) return itemCmd().Cmd(matchedCmd->valueint);
aJsonObject *valMapping = aJson.getObjectItem(mappingData, "val");
if (valMapping && valMapping->type == aJson_Array && aJson.getArraySize(valMapping) == 4)
if (valMapping && valMapping->type == aJson_Array && aJson.getArraySize(valMapping) >= 4)
{
//ОБРАТНОЕ
//"val":[0-вход_мин, 1-вход_макс, 2-выход_мин, 3-выход_макс, 4-вход<мин_прямое, 5-вых<мин_обратное, 6-вход>макс_прямое, 7-вых>макс_обратное]
int a = aJson.getArrayItem(valMapping,0)->valueint;
int b = aJson.getArrayItem(valMapping,1)->valueint;
int c = aJson.getArrayItem(valMapping,2)->valueint;
int d = aJson.getArrayItem(valMapping,3)->valueint;
if (getInt()<aJson.getArrayItem(valMapping,2)->valueint) return itemCmd().Int((uint32_t) 0);
aJsonObject *leftBoundObj = aJson.getArrayItem(valMapping,5);
aJsonObject *rightBoundObj = aJson.getArrayItem(valMapping,7);
// Dev to unified
//было если меньше левой границы то ноль. Неперь для такого поведения надо 7m элементом явно поставить ноль
//if (getInt()<aJson.getArrayItem(valMapping,2)->valueint) return itemCmd().Int((uint32_t) 0);
if (getInt()<aJson.getArrayItem(valMapping,2)->valueint)
{
if (leftBoundObj && leftBoundObj->type == aJson_Int )
return itemCmd().Int(leftBoundObj->valueint);
else return itemCmd(ST_VOID,CMD_VOID);
}
if (getInt()>aJson.getArrayItem(valMapping,3)->valueint)
{
if (rightBoundObj && rightBoundObj->type == aJson_Int )
return itemCmd().Int(rightBoundObj->valueint);
else return itemCmd(ST_VOID,CMD_VOID);
}
int diff = ((b-a)/(d-c))/2;
//return itemCmd().Int((uint32_t) constrain(map(getInt(),c,d,a,b)+diff,0,255));
return itemCmd().Int((uint32_t) constrain(map(getInt(),c,d,a,b)+diff,0,b));

View File

@@ -289,6 +289,7 @@ if (getConfig())
else
{ errorSerial<<F("MBUS: config error")<<endl;
setStatus(CST_FAILED);
Stop();
return 0;
}

View File

@@ -83,7 +83,7 @@
#define TIMEOUT_RETAIN 8000UL
#define TIMEOUT_REINIT_NOT_CONFIGURED 120000UL
#define INTERVAL_1W 5000UL
#define PERIOD_THERMOSTAT_FAILED (600 * 1000UL)
#define PERIOD_THERMOSTAT_FAILED (600 * 1000UL) //16000 sec (4h) max
//#define T_ATTEMPTS 200
//#define IET_TEMP 0

View File

@@ -626,7 +626,7 @@ RebootFunc();
}
#endif
/*
bool isTimeOver(uint32_t timestamp, uint32_t currTime, uint32_t time, uint32_t modulo)
{
uint32_t endTime;
@@ -638,7 +638,19 @@ bool isTimeOver(uint32_t timestamp, uint32_t currTime, uint32_t time, uint32_t m
return ((currTime>endTime) && (currTime <timestamp)) ||
((timestamp<endTime) && ((currTime>endTime) || (currTime <timestamp)));
}
//millis() - tmr1 >= MY_PERIOD
*/
bool isTimeOver(uint32_t timestamp, uint32_t currTime, uint32_t time, uint32_t modulo)
{
uint32_t elapsed;
if (!time) return true;
if (modulo) elapsed = ((currTime & modulo) - (timestamp & modulo)) & modulo ;
else elapsed = currTime - timestamp ;
return elapsed >= time;
}
@@ -819,9 +831,9 @@ itemCmd mapInt(int32_t arg, aJsonObject* map)
}
//Same as millis() but never return 0 or -1
unsigned long millisNZ(uint8_t shift)
uint32_t millisNZ(uint8_t shift)
{
unsigned long now = millis()>>shift;
uint32_t now = millis()>>shift;
if (!now || !(now+1)) now=1;
return now;
}
@@ -1017,7 +1029,7 @@ if (element && element->type == aJson_String) return element->valuestring;
long getIntFromJson(aJsonObject * a, int i, long def)
{
aJsonObject * element = NULL;
if (!a) return NULL;
if (!a) return def;
if (a->type == aJson_Array)
element = aJson.getArrayItem(a, i);
// TODO - human readable JSON objects as alias
@@ -1030,7 +1042,7 @@ return def;
long getIntFromJson(aJsonObject * a, char * name, long def)
{
aJsonObject * element = NULL;
if (!a) return NULL;
if (!a) return def;
if (a->type == aJson_Object)
element = aJson.getObjectItem(a, name);
if (element && element->type == aJson_Int) return element->valueint;
@@ -1041,7 +1053,7 @@ return def;
float getFloatFromJson(aJsonObject * a, int i, float def)
{
aJsonObject * element = NULL;
if (!a) return NULL;
if (!a) return def;
if (a->type == aJson_Array)
element = aJson.getArrayItem(a, i);
// TODO - human readable JSON objects as alias
@@ -1054,7 +1066,7 @@ return def;
float getFloatFromJson(aJsonObject * a, char * name, float def)
{
aJsonObject * element = NULL;
if (!a) return NULL;
if (!a) return def;
if (a->type == aJson_Object)
element = aJson.getObjectItem(a, name);

View File

@@ -73,7 +73,7 @@ bool isTimeOver(uint32_t timestamp, uint32_t currTime, uint32_t time, uint32_t m
bool executeCommand(aJsonObject* cmd, int8_t toggle = -1);
bool executeCommand(aJsonObject* cmd, int8_t toggle, itemCmd _itemCmd, aJsonObject* defaultItem=NULL, aJsonObject* defaultEmit=NULL, aJsonObject* defaultCan = NULL);
itemCmd mapInt(int32_t arg, aJsonObject* map);
unsigned long millisNZ(uint8_t shift=0);
uint32_t millisNZ(uint8_t shift=0);
serialParamType str2SerialParam(char * str);
String toString(const IPAddress& address);
bool getPinVal(uint8_t pin);

View File

@@ -796,7 +796,7 @@ lib_deps =
Adafruit BusIO
https://github.com/arcao/Syslog.git
;br3ttb/PID@^1.2.1
https://github.com/anklimov/Arduino-PID-Library.gitv
https://github.com/anklimov/Arduino-PID-Library.git
ArduinoMDNS
https://github.com/khoih-prog/TimerInterrupt_Generic.git