From e803d1ae51bec378a13d278c0b1616a624fee0a1 Mon Sep 17 00:00:00 2001 From: Andrey Date: Sun, 6 Apr 2025 22:46:44 +0300 Subject: [PATCH] mapping val bondaries added timer tuning more logging to thermostat & map MBUS chan stop if not configured well --- lighthub/item.cpp | 4 +-- lighthub/itemCmd.cpp | 61 ++++++++++++++++++++++++++++----- lighthub/modules/out_modbus.cpp | 1 + lighthub/options.h | 2 +- lighthub/utils.cpp | 28 ++++++++++----- lighthub/utils.h | 2 +- platformio.ini | 2 +- 7 files changed, 79 insertions(+), 21 deletions(-) diff --git a/lighthub/item.cpp b/lighthub/item.cpp index 472a6e7..2f87202 100644 --- a/lighthub/item.cpp +++ b/lighthub/item.cpp @@ -1687,13 +1687,13 @@ if ((!driver || driver->isAllowed(cmd)) tStore.asint=getExt(); if (!tStore.timestamp16) { - infoSerial<name<name<<" Ext:"<name); #endif } tStore.tempX100=cmd.getFloat()*100.; //Save measurement - tStore.timestamp16=millisNZ(8) & 0xFFFF; //And timestamp + tStore.timestamp16=millisNZ(8) & 0xFFFFU; //And timestamp debugSerial<name<type != aJson_NULL) { + traceSerial<valueint<valueint); } aJsonObject *valMapping = aJson.getObjectItem(mappingData, "val"); -if (isValue() && valMapping && valMapping->type == aJson_Array && aJson.getArraySize(valMapping) == 4) - { - if (getInt()valueint) return itemCmd().Int((uint32_t) 0); - return itemCmd().Int((uint32_t) - map(getInt(), +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()valueint) return itemCmd().Int((uint32_t) 0); было если меньше левой границы то ноль. Неперь для такого поведения надо пятым элементом явно поставить ноль + + if (getInt()valueint) + { + traceSerial<valueint<type == aJson_Int ) + return itemCmd().Int(leftBoundObj->valueint); + else return itemCmd(ST_VOID,CMD_VOID); + } + + if (getInt()>aJson.getArrayItem(valMapping,1)->valueint) + { + traceSerial<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<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()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()valueint) return itemCmd().Int((uint32_t) 0); + + + if (getInt()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)); diff --git a/lighthub/modules/out_modbus.cpp b/lighthub/modules/out_modbus.cpp index a556cd4..b2468bf 100644 --- a/lighthub/modules/out_modbus.cpp +++ b/lighthub/modules/out_modbus.cpp @@ -289,6 +289,7 @@ if (getConfig()) else { errorSerial<endTime) && (currTime endTime) || (currTime = 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); diff --git a/lighthub/utils.h b/lighthub/utils.h index 249a734..e10a963 100644 --- a/lighthub/utils.h +++ b/lighthub/utils.h @@ -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); diff --git a/platformio.ini b/platformio.ini index 940c14f..98acea1 100644 --- a/platformio.ini +++ b/platformio.ini @@ -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