mirror of
https://github.com/jomjol/AI-on-the-edge-device.git
synced 2025-12-06 03:26:53 +03:00
IgnoreLeadingNaN fix (#3547)
* test1 * test2 * Update edit_config_template.html * fix * Update NUMBER.CheckDigitIncreaseConsistency.md --------- Co-authored-by: CaCO3 <caco3@ruinelli.ch>
This commit is contained in:
@@ -31,7 +31,6 @@ enum t_RateType {
|
||||
RateChange // time difference is considered and a normalized rate is used for comparison with NumberPost.maxRate
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* Holds all properties and settings of a sequence. A sequence is a set of digit and/or analog ROIs that are combined to
|
||||
* provide one meter reading (value).
|
||||
@@ -45,6 +44,7 @@ struct NumberPost {
|
||||
int ChangeRateThreshold; // threshold parameter for negative rate detection
|
||||
bool PreValueOkay; // previousValueValid; indicates that the reading of the previous round has no errors
|
||||
bool AllowNegativeRates; // allowNegativeRate; defines if the consistency checks allow negative rates between consecutive meter readings.
|
||||
bool IgnoreLeadingNaN;
|
||||
bool checkDigitIncreaseConsistency; // extendedConsistencyCheck; performs an additional consistency check to avoid wrong readings
|
||||
time_t timeStampLastValue; // Timestamp for the last read value; is used for the log
|
||||
time_t timeStampLastPreValue; // Timestamp for the last PreValue set; is used for useMaxRateValue
|
||||
@@ -66,7 +66,7 @@ struct NumberPost {
|
||||
float AnalogToDigitTransitionStart; // AnalogToDigitTransitionStartValue; FIXME: need a better description; When is the digit > x.1, i.e. when does it start to tilt?
|
||||
int Nachkomma; // decimalPlaces; usually defined by the number of analog ROIs; affected by DecimalShift
|
||||
|
||||
string DomoticzIdx; // Domoticz counter Idx
|
||||
string DomoticzIdx; // Domoticz counter Idx
|
||||
|
||||
string FieldV1; // influxdbFieldName_v1; Name of the Field in InfluxDBv1
|
||||
string MeasurementV1; // influxdbMeasurementName_v1; Name of the Measurement in InfluxDBv1
|
||||
@@ -83,4 +83,3 @@ struct NumberPost {
|
||||
};
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
@@ -320,7 +320,6 @@ ClassFlowPostProcessing::ClassFlowPostProcessing(std::vector<ClassFlow*>* lfc, C
|
||||
ListFlowControll = lfc;
|
||||
flowTakeImage = NULL;
|
||||
UpdatePreValueINI = false;
|
||||
IgnoreLeadingNaN = false;
|
||||
flowAnalog = _analog;
|
||||
flowDigit = _digit;
|
||||
|
||||
@@ -431,6 +430,27 @@ void ClassFlowPostProcessing::handleAllowNegativeRate(string _decsep, string _va
|
||||
}
|
||||
}
|
||||
|
||||
void ClassFlowPostProcessing::handleIgnoreLeadingNaN(string _decsep, string _value) {
|
||||
string _digit, _decpos;
|
||||
int _pospunkt = _decsep.find_first_of(".");
|
||||
|
||||
if (_pospunkt > -1) {
|
||||
_digit = _decsep.substr(0, _pospunkt);
|
||||
}
|
||||
else {
|
||||
_digit = "default";
|
||||
}
|
||||
|
||||
for (int j = 0; j < NUMBERS.size(); ++j) {
|
||||
bool _zwdc = alphanumericToBoolean(_value);
|
||||
|
||||
// Set to default first (if nothing else is set)
|
||||
if ((_digit == "default") || (NUMBERS[j]->name == _digit)) {
|
||||
NUMBERS[j]->IgnoreLeadingNaN = _zwdc;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void ClassFlowPostProcessing::handleMaxRateType(string _decsep, string _value) {
|
||||
string _digit, _decpos;
|
||||
int _pospunkt = _decsep.find_first_of(".");
|
||||
@@ -509,7 +529,7 @@ void ClassFlowPostProcessing::handleChangeRateThreshold(string _decsep, string _
|
||||
}
|
||||
}
|
||||
}
|
||||
/*
|
||||
|
||||
void ClassFlowPostProcessing::handlecheckDigitIncreaseConsistency(std::string _decsep, std::string _value)
|
||||
{
|
||||
std::string _digit;
|
||||
@@ -532,7 +552,7 @@ void ClassFlowPostProcessing::handlecheckDigitIncreaseConsistency(std::string _d
|
||||
}
|
||||
}
|
||||
}
|
||||
*/
|
||||
|
||||
bool ClassFlowPostProcessing::ReadParameter(FILE* pfile, string& aktparamgraph) {
|
||||
std::vector<string> splitted;
|
||||
int _n;
|
||||
@@ -585,12 +605,7 @@ bool ClassFlowPostProcessing::ReadParameter(FILE* pfile, string& aktparamgraph)
|
||||
}
|
||||
|
||||
if ((toUpper(_param) == "CHECKDIGITINCREASECONSISTENCY") && (splitted.size() > 1)) {
|
||||
// handlecheckDigitIncreaseConsistency(splitted[0], splitted[1]);
|
||||
if (alphanumericToBoolean(splitted[1])) {
|
||||
for (_n = 0; _n < NUMBERS.size(); ++_n) {
|
||||
NUMBERS[_n]->checkDigitIncreaseConsistency = true;
|
||||
}
|
||||
}
|
||||
handlecheckDigitIncreaseConsistency(splitted[0], splitted[1]);
|
||||
}
|
||||
|
||||
if ((toUpper(_param) == "ALLOWNEGATIVERATES") && (splitted.size() > 1)) {
|
||||
@@ -602,7 +617,7 @@ bool ClassFlowPostProcessing::ReadParameter(FILE* pfile, string& aktparamgraph)
|
||||
}
|
||||
|
||||
if ((toUpper(_param) == "IGNORELEADINGNAN") && (splitted.size() > 1)) {
|
||||
IgnoreLeadingNaN = alphanumericToBoolean(splitted[1]);
|
||||
handleIgnoreLeadingNaN(splitted[0], splitted[1]);
|
||||
}
|
||||
|
||||
if ((toUpper(_param) == "PREVALUEAGESTARTUP") && (splitted.size() > 1)) {
|
||||
@@ -670,6 +685,7 @@ void ClassFlowPostProcessing::InitNUMBERS() {
|
||||
_number->FlowRateAct = 0; // m3 / min
|
||||
_number->PreValueOkay = false;
|
||||
_number->AllowNegativeRates = false;
|
||||
_number->IgnoreLeadingNaN = false;
|
||||
_number->MaxRateValue = 0.1;
|
||||
_number->MaxRateType = AbsoluteChange;
|
||||
_number->useMaxRateValue = false;
|
||||
@@ -821,7 +837,7 @@ bool ClassFlowPostProcessing::doFlow(string zwtime) {
|
||||
ESP_LOGD(TAG, "After ShiftDecimal: ReturnRaw %s", NUMBERS[j]->ReturnRawValue.c_str());
|
||||
#endif
|
||||
|
||||
if (IgnoreLeadingNaN) {
|
||||
if (NUMBERS[j]->IgnoreLeadingNaN) {
|
||||
while ((NUMBERS[j]->ReturnRawValue.length() > 1) && (NUMBERS[j]->ReturnRawValue[0] == 'N')) {
|
||||
NUMBERS[j]->ReturnRawValue.erase(0, 1);
|
||||
}
|
||||
@@ -868,12 +884,7 @@ bool ClassFlowPostProcessing::doFlow(string zwtime) {
|
||||
|
||||
if (NUMBERS[j]->checkDigitIncreaseConsistency) {
|
||||
if (flowDigit) {
|
||||
if (flowDigit->getCNNType() != Digit) {
|
||||
ESP_LOGD(TAG, "checkDigitIncreaseConsistency = true - ignored due to wrong CNN-Type (not Digit Classification)");
|
||||
}
|
||||
else {
|
||||
NUMBERS[j]->Value = checkDigitConsistency(NUMBERS[j]->Value, NUMBERS[j]->DecimalShift, NUMBERS[j]->analog_roi != NULL, NUMBERS[j]->PreValue);
|
||||
}
|
||||
NUMBERS[j]->Value = checkDigitConsistency(NUMBERS[j]->Value, NUMBERS[j]->DecimalShift, NUMBERS[j]->analog_roi != NULL, NUMBERS[j]->PreValue);
|
||||
}
|
||||
else {
|
||||
#ifdef SERIAL_DEBUG
|
||||
|
||||
@@ -10,7 +10,6 @@
|
||||
|
||||
#include <string>
|
||||
|
||||
|
||||
class ClassFlowPostProcessing :
|
||||
public ClassFlow
|
||||
{
|
||||
@@ -19,8 +18,7 @@ protected:
|
||||
|
||||
int PreValueAgeStartup;
|
||||
bool ErrorMessage;
|
||||
bool IgnoreLeadingNaN; // SPECIAL CASE for User Gustl ???
|
||||
|
||||
|
||||
ClassFlowCNNGeneral* flowAnalog;
|
||||
ClassFlowCNNGeneral* flowDigit;
|
||||
|
||||
@@ -35,15 +33,16 @@ protected:
|
||||
float checkDigitConsistency(double input, int _decilamshift, bool _isanalog, double _preValue);
|
||||
|
||||
void InitNUMBERS();
|
||||
|
||||
void handleDecimalSeparator(string _decsep, string _value);
|
||||
void handleMaxRateValue(string _decsep, string _value);
|
||||
void handleDecimalExtendedResolution(string _decsep, string _value);
|
||||
void handleMaxRateType(string _decsep, string _value);
|
||||
void handleAnalogToDigitTransitionStart(string _decsep, string _value);
|
||||
void handleAllowNegativeRate(string _decsep, string _value);
|
||||
void handleIgnoreLeadingNaN(string _decsep, string _value);
|
||||
void handleChangeRateThreshold(string _decsep, string _value);
|
||||
|
||||
std::string GetStringReadouts(general);
|
||||
void handlecheckDigitIncreaseConsistency(std::string _decsep, std::string _value);
|
||||
|
||||
void WriteDataLog(int _index);
|
||||
|
||||
@@ -75,5 +74,4 @@ public:
|
||||
string name(){return "ClassFlowPostProcessing";};
|
||||
};
|
||||
|
||||
|
||||
#endif //CLASSFFLOWPOSTPROCESSING_H
|
||||
|
||||
@@ -31,7 +31,6 @@ AlignmentAlgo
|
||||
CNNGoodThreshold
|
||||
PreValueAgeStartup
|
||||
ErrorMessage
|
||||
CheckDigitIncreaseConsistency
|
||||
IO0
|
||||
IO1
|
||||
IO3
|
||||
|
||||
@@ -6,3 +6,6 @@ Default Value: `false`
|
||||
|
||||
An additional consistency check.
|
||||
It especially improves the zero crossing check between digits.
|
||||
|
||||
!!! Note
|
||||
This parameter must be prefixed with `<NUMBER>` followed by a dot (eg. `main.CheckDigitIncreaseConsistency`). `<NUMBER>` is the name of the number sequence defined in the ROI's.
|
||||
File diff suppressed because it is too large
Load Diff
@@ -6,7 +6,6 @@ var ref = new Array(2);
|
||||
var NUMBERS = new Array(0);
|
||||
var REFERENCES = new Array(0);
|
||||
|
||||
|
||||
function getNUMBERSList() {
|
||||
_domainname = getDomainname();
|
||||
var namenumberslist = "";
|
||||
@@ -33,7 +32,6 @@ function getNUMBERSList() {
|
||||
return namenumberslist;
|
||||
}
|
||||
|
||||
|
||||
function getDATAList() {
|
||||
_domainname = getDomainname();
|
||||
datalist = "";
|
||||
@@ -62,7 +60,6 @@ function getDATAList() {
|
||||
return datalist;
|
||||
}
|
||||
|
||||
|
||||
function getTFLITEList() {
|
||||
_domainname = getDomainname();
|
||||
tflitelist = "";
|
||||
@@ -90,7 +87,6 @@ function getTFLITEList() {
|
||||
return tflitelist;
|
||||
}
|
||||
|
||||
|
||||
function ParseConfig() {
|
||||
config_split = config_gesamt.split("\n");
|
||||
var aktline = 0;
|
||||
@@ -172,7 +168,7 @@ function ParseConfig() {
|
||||
category[catname]["enabled"] = false;
|
||||
category[catname]["found"] = false;
|
||||
param[catname] = new Object();
|
||||
ParamAddValue(param, catname, "DecimalShift", 1, true);
|
||||
ParamAddValue(param, catname, "DecimalShift", 1, true, "0");
|
||||
ParamAddValue(param, catname, "AnalogToDigitTransitionStart", 1, true, "9.2");
|
||||
ParamAddValue(param, catname, "ChangeRateThreshold", 1, true, "2");
|
||||
// ParamAddValue(param, catname, "PreValueUse", 1, true, "true");
|
||||
@@ -185,7 +181,7 @@ function ParseConfig() {
|
||||
ParamAddValue(param, catname, "IgnoreLeadingNaN", 1, true, "false");
|
||||
// ParamAddValue(param, catname, "IgnoreAllNaN", 1, true, "false");
|
||||
ParamAddValue(param, catname, "ErrorMessage");
|
||||
ParamAddValue(param, catname, "CheckDigitIncreaseConsistency");
|
||||
ParamAddValue(param, catname, "CheckDigitIncreaseConsistency", 1, true, "false");
|
||||
|
||||
var catname = "MQTT";
|
||||
category[catname] = new Object();
|
||||
@@ -359,7 +355,6 @@ function ParseConfig() {
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
function ParamAddValue(param, _cat, _param, _anzParam = 1, _isNUMBER = false, _defaultValue = "", _checkRegExList = null) {
|
||||
param[_cat][_param] = new Object();
|
||||
param[_cat][_param]["found"] = false;
|
||||
@@ -371,7 +366,6 @@ function ParamAddValue(param, _cat, _param, _anzParam = 1, _isNUMBER = false, _d
|
||||
param[_cat][_param].checkRegExList = _checkRegExList;
|
||||
};
|
||||
|
||||
|
||||
function ParseConfigParamAll(_aktline, _catname) {
|
||||
++_aktline;
|
||||
|
||||
@@ -403,7 +397,6 @@ function ParseConfigParamAll(_aktline, _catname) {
|
||||
return _aktline;
|
||||
}
|
||||
|
||||
|
||||
function ParamExtractValue(_param, _linesplit, _catname, _paramname, _aktline, _iscom, _anzvalue = 1) {
|
||||
if ((_linesplit[0].toUpperCase() == _paramname.toUpperCase()) && (_linesplit.length > _anzvalue)) {
|
||||
_param[_catname][_paramname]["found"] = true;
|
||||
@@ -417,7 +410,6 @@ function ParamExtractValue(_param, _linesplit, _catname, _paramname, _aktline, _
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
function ParamExtractValueAll(_param, _linesplit, _catname, _aktline, _iscom) {
|
||||
for (var paramname in _param[_catname]) {
|
||||
_AktROI = "default";
|
||||
@@ -475,7 +467,6 @@ function ParamExtractValueAll(_param, _linesplit, _catname, _aktline, _iscom) {
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
function getCamConfig() {
|
||||
ParseConfig();
|
||||
|
||||
@@ -653,12 +644,10 @@ function getCamConfig() {
|
||||
return param;
|
||||
}
|
||||
|
||||
|
||||
function getConfigParameters() {
|
||||
return param;
|
||||
}
|
||||
|
||||
|
||||
function WriteConfigININew() {
|
||||
// Cleanup empty NUMBERS
|
||||
for (var j = 0; j < NUMBERS.length; ++j) {
|
||||
@@ -760,7 +749,6 @@ function WriteConfigININew() {
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
function isCommented(input) {
|
||||
let isComment = false;
|
||||
|
||||
@@ -772,7 +760,6 @@ function isCommented(input) {
|
||||
return [isComment, input];
|
||||
}
|
||||
|
||||
|
||||
function SaveConfigToServer(_domainname){
|
||||
// leere Zeilen am Ende löschen
|
||||
var zw = config_split.length - 1;
|
||||
@@ -792,17 +779,14 @@ function SaveConfigToServer(_domainname){
|
||||
FileSendContent(config_gesamt, "/config/config.ini", _domainname);
|
||||
}
|
||||
|
||||
|
||||
function getConfig() {
|
||||
return config_gesamt;
|
||||
}
|
||||
|
||||
|
||||
function getConfigCategory() {
|
||||
return category;
|
||||
}
|
||||
|
||||
|
||||
function ExtractROIs(_aktline, _type){
|
||||
var linesplit = ZerlegeZeile(_aktline);
|
||||
abc = getNUMBERS(linesplit[0], _type);
|
||||
@@ -819,7 +803,6 @@ function ExtractROIs(_aktline, _type){
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
function getNUMBERS(_name, _type, _create = true) {
|
||||
_pospunkt = _name.indexOf (".");
|
||||
|
||||
@@ -879,7 +862,6 @@ function getNUMBERS(_name, _type, _create = true) {
|
||||
return neuroi;
|
||||
}
|
||||
|
||||
|
||||
function CopyReferenceToImgTmp(_domainname) {
|
||||
for (index = 0; index < 2; ++index) {
|
||||
_filenamevon = REFERENCES[index]["name"];
|
||||
@@ -894,12 +876,10 @@ function CopyReferenceToImgTmp(_domainname) {
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
function GetReferencesInfo(){
|
||||
return REFERENCES;
|
||||
}
|
||||
|
||||
|
||||
function UpdateConfigReferences(_domainname){
|
||||
for (var index = 0; index < 2; ++index) {
|
||||
_filenamenach = REFERENCES[index]["name"];
|
||||
@@ -914,7 +894,6 @@ function UpdateConfigReferences(_domainname){
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
function UpdateConfigReference(_anzneueref, _domainname){
|
||||
var index = 0;
|
||||
|
||||
@@ -939,12 +918,10 @@ function UpdateConfigReference(_anzneueref, _domainname){
|
||||
FileCopyOnServer(_filenamevon, _filenamenach, _domainname);
|
||||
}
|
||||
|
||||
|
||||
function getNUMBERInfo(){
|
||||
return NUMBERS;
|
||||
}
|
||||
|
||||
|
||||
function RenameNUMBER(_alt, _neu){
|
||||
if ((_neu.indexOf(".") >= 0) || (_neu.indexOf(",") >= 0) || (_neu.indexOf(" ") >= 0) || (_neu.indexOf("\"") >= 0)) {
|
||||
return "Number sequence name must not contain , . \" or a space";
|
||||
@@ -972,7 +949,6 @@ function RenameNUMBER(_alt, _neu){
|
||||
return "";
|
||||
}
|
||||
|
||||
|
||||
function DeleteNUMBER(_delete){
|
||||
if (NUMBERS.length == 1) {
|
||||
return "One number sequence is mandatory. Therefore this cannot be deleted"
|
||||
@@ -993,7 +969,6 @@ function DeleteNUMBER(_delete){
|
||||
return "";
|
||||
}
|
||||
|
||||
|
||||
function CreateNUMBER(_numbernew){
|
||||
found = false;
|
||||
|
||||
@@ -1041,7 +1016,6 @@ function CreateNUMBER(_numbernew){
|
||||
return "";
|
||||
}
|
||||
|
||||
|
||||
function getROIInfo(_typeROI, _number){
|
||||
index = -1;
|
||||
|
||||
@@ -1059,7 +1033,6 @@ function getROIInfo(_typeROI, _number){
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
function RenameROI(_number, _type, _alt, _neu){
|
||||
if ((_neu.includes("=")) || (_neu.includes(".")) || (_neu.includes(":")) || (_neu.includes(",")) || (_neu.includes(";")) || (_neu.includes(" ")) || (_neu.includes("\""))) {
|
||||
return "ROI name must not contain . : , ; = \" or space";
|
||||
@@ -1098,7 +1071,6 @@ function RenameROI(_number, _type, _alt, _neu){
|
||||
return "";
|
||||
}
|
||||
|
||||
|
||||
function DeleteNUMBER(_delte) {
|
||||
if (NUMBERS.length == 1) {
|
||||
return "The last number cannot be deleted"
|
||||
@@ -1119,7 +1091,6 @@ function DeleteNUMBER(_delte) {
|
||||
return "";
|
||||
}
|
||||
|
||||
|
||||
function CreateROI(_number, _type, _pos, _roinew, _x, _y, _dx, _dy, _CCW){
|
||||
_indexnumber = -1;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user