mirror of
https://github.com/jomjol/AI-on-the-edge-device.git
synced 2025-12-08 20:46:52 +03:00
Compare commits
3 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
58a90ff706 | ||
|
|
d0bf12f3d4 | ||
|
|
af16785bbf |
@@ -47,6 +47,11 @@ In other cases you can contact the developer via email: <img src="https://raw.gi
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
##### 8.5.0 - Multi Meter Support (2021-10-07)
|
||||||
|
|
||||||
|
* Upgrade digital CNN to v13.1.0 (added new images)
|
||||||
|
* bug fix: wlan password with space, double digit output
|
||||||
|
|
||||||
##### 8.4.0 - Multi Meter Support (2021-09-25)
|
##### 8.4.0 - Multi Meter Support (2021-09-25)
|
||||||
|
|
||||||
* License change (remove MIT license, remark see below)
|
* License change (remove MIT license, remark see below)
|
||||||
|
|||||||
@@ -61,6 +61,7 @@ string ClassFlowCNNGeneral::getReadout(int _analog = 0, bool _extendedResolution
|
|||||||
prev = ZeigerEval(GENERAL[_analog]->ROI[i]->result_float, prev);
|
prev = ZeigerEval(GENERAL[_analog]->ROI[i]->result_float, prev);
|
||||||
result = std::to_string(prev) + result;
|
result = std::to_string(prev) + result;
|
||||||
}
|
}
|
||||||
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (CNNType == Digital)
|
if (CNNType == Digital)
|
||||||
@@ -72,6 +73,7 @@ string ClassFlowCNNGeneral::getReadout(int _analog = 0, bool _extendedResolution
|
|||||||
else
|
else
|
||||||
result = result + std::to_string(GENERAL[_analog]->ROI[i]->result_klasse);
|
result = result + std::to_string(GENERAL[_analog]->ROI[i]->result_klasse);
|
||||||
}
|
}
|
||||||
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (CNNType == DigitalHyprid)
|
if (CNNType == DigitalHyprid)
|
||||||
@@ -116,6 +118,7 @@ string ClassFlowCNNGeneral::getReadout(int _analog = 0, bool _extendedResolution
|
|||||||
result = "N" + result;
|
result = "N" + result;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
@@ -540,7 +543,7 @@ bool ClassFlowCNNGeneral::doNeuralNetwork(string time)
|
|||||||
if (debugdetailgeneral) LogFile.WriteToFile("Nach Invoke");
|
if (debugdetailgeneral) LogFile.WriteToFile("Nach Invoke");
|
||||||
|
|
||||||
_num = tflite->GetOutClassification(0, 10);
|
_num = tflite->GetOutClassification(0, 10);
|
||||||
_nachkomma = tflite->GetOutClassification(11, 22);
|
_nachkomma = tflite->GetOutClassification(11, 21);
|
||||||
|
|
||||||
|
|
||||||
string _zwres = "Nach Invoke - Nummer: " + to_string(_num) + " Nachkomma: " + to_string(_nachkomma);
|
string _zwres = "Nach Invoke - Nummer: " + to_string(_num) + " Nachkomma: " + to_string(_nachkomma);
|
||||||
|
|||||||
@@ -89,7 +89,7 @@ bool ClassFlowPostProcessing::LoadPreValue(void)
|
|||||||
if (NUMBERS[j]->name == name)
|
if (NUMBERS[j]->name == name)
|
||||||
{
|
{
|
||||||
NUMBERS[j]->PreValue = stof(zwvalue.c_str());
|
NUMBERS[j]->PreValue = stof(zwvalue.c_str());
|
||||||
NUMBERS[j]->ReturnPreValue = RundeOutput(NUMBERS[j]->PreValue, NUMBERS[j]->Nachkomma);
|
NUMBERS[j]->ReturnPreValue = RundeOutput(NUMBERS[j]->PreValue, NUMBERS[j]->Nachkomma + 1); // SIcherheitshalber 1 Stelle mehr, da ggf. Exgtended Resolution an ist (wird erst beim ersten Durchlauf gesetzt)
|
||||||
|
|
||||||
time_t tStart;
|
time_t tStart;
|
||||||
int yy, month, dd, hh, mm, ss;
|
int yy, month, dd, hh, mm, ss;
|
||||||
@@ -123,7 +123,7 @@ bool ClassFlowPostProcessing::LoadPreValue(void)
|
|||||||
|
|
||||||
if (NUMBERS[j]->digit_roi || NUMBERS[j]->analog_roi)
|
if (NUMBERS[j]->digit_roi || NUMBERS[j]->analog_roi)
|
||||||
{
|
{
|
||||||
NUMBERS[j]->ReturnValue = RundeOutput(NUMBERS[j]->Value, NUMBERS[j]->Nachkomma);
|
NUMBERS[j]->ReturnValue = RundeOutput(NUMBERS[j]->Value, NUMBERS[j]->Nachkomma + 1); // SIcherheitshalber 1 Stelle mehr, da ggf. Exgtended Resolution an ist (wird erst beim ersten Durchlauf gesetzt)
|
||||||
NUMBERS[j]->ReturnValueNoError = NUMBERS[j]->ReturnValue;
|
NUMBERS[j]->ReturnValueNoError = NUMBERS[j]->ReturnValue;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -595,13 +595,14 @@ bool ClassFlowPostProcessing::doFlow(string zwtime)
|
|||||||
|
|
||||||
if (NUMBERS[j]->digit_roi)
|
if (NUMBERS[j]->digit_roi)
|
||||||
{
|
{
|
||||||
if (NUMBERS[j]->analog_roi)
|
if (NUMBERS[j]->analog_roi)
|
||||||
NUMBERS[j]->ReturnRawValue = flowDigit->getReadout(j, false);
|
NUMBERS[j]->ReturnRawValue = flowDigit->getReadout(j, false);
|
||||||
else
|
else
|
||||||
NUMBERS[j]->ReturnRawValue = flowDigit->getReadout(j, NUMBERS[j]->isExtendedResolution); // Extended Resolution nur falls es keine analogen Ziffern gibt
|
NUMBERS[j]->ReturnRawValue = flowDigit->getReadout(j, NUMBERS[j]->isExtendedResolution); // Extended Resolution nur falls es keine analogen Ziffern gibt
|
||||||
}
|
}
|
||||||
if (NUMBERS[j]->digit_roi && NUMBERS[j]->analog_roi)
|
if (NUMBERS[j]->digit_roi && NUMBERS[j]->analog_roi)
|
||||||
NUMBERS[j]->ReturnRawValue = NUMBERS[j]->ReturnRawValue + ".";
|
NUMBERS[j]->ReturnRawValue = NUMBERS[j]->ReturnRawValue + ".";
|
||||||
|
|
||||||
if (NUMBERS[j]->analog_roi)
|
if (NUMBERS[j]->analog_roi)
|
||||||
NUMBERS[j]->ReturnRawValue = NUMBERS[j]->ReturnRawValue + flowAnalog->getReadout(j, NUMBERS[j]->isExtendedResolution);
|
NUMBERS[j]->ReturnRawValue = NUMBERS[j]->ReturnRawValue + flowAnalog->getReadout(j, NUMBERS[j]->isExtendedResolution);
|
||||||
|
|
||||||
@@ -822,14 +823,14 @@ float ClassFlowPostProcessing::checkDigitConsistency(float input, int _decilamsh
|
|||||||
while (pot <= pot_max)
|
while (pot <= pot_max)
|
||||||
{
|
{
|
||||||
zw = input / pow(10, pot-1);
|
zw = input / pow(10, pot-1);
|
||||||
aktdigit_before = ((int) zw) % 10;
|
aktdigit_before = ((int) zw + 10) % 10;
|
||||||
zw = _preValue / pow(10, pot-1);
|
zw = _preValue / pow(10, pot-1);
|
||||||
olddigit_before = ((int) zw) % 10;
|
olddigit_before = ((int) zw + 10) % 10;
|
||||||
|
|
||||||
zw = input / pow(10, pot);
|
zw = input / pow(10, pot);
|
||||||
aktdigit = ((int) zw) % 10;
|
aktdigit = ((int) zw + 10) % 10;
|
||||||
zw = _preValue / pow(10, pot);
|
zw = _preValue / pow(10, pot);
|
||||||
olddigit = ((int) zw) % 10;
|
olddigit = ((int) zw + 10) % 10;
|
||||||
|
|
||||||
no_nulldurchgang = (olddigit_before <= aktdigit_before);
|
no_nulldurchgang = (olddigit_before <= aktdigit_before);
|
||||||
|
|
||||||
|
|||||||
@@ -44,12 +44,12 @@ int CTfLiteClass::GetOutClassification(int _von, int _bis)
|
|||||||
//printf("\n number output neurons: %d\n\n", numeroutput);
|
//printf("\n number output neurons: %d\n\n", numeroutput);
|
||||||
|
|
||||||
if (_bis == -1)
|
if (_bis == -1)
|
||||||
_bis = numeroutput;
|
_bis = numeroutput -1;
|
||||||
|
|
||||||
if (_von == -1)
|
if (_von == -1)
|
||||||
_von = 0;
|
_von = 0;
|
||||||
|
|
||||||
if (_bis > numeroutput)
|
if (_bis >= numeroutput)
|
||||||
{
|
{
|
||||||
printf("ANZAHL OUTPUT NEURONS passt nicht zu geforderter Classifizierung!");
|
printf("ANZAHL OUTPUT NEURONS passt nicht zu geforderter Classifizierung!");
|
||||||
return -1;
|
return -1;
|
||||||
@@ -57,7 +57,7 @@ int CTfLiteClass::GetOutClassification(int _von, int _bis)
|
|||||||
|
|
||||||
zw_max = output2->data.f[_von];
|
zw_max = output2->data.f[_von];
|
||||||
zw_class = _von;
|
zw_class = _von;
|
||||||
for (int i = _von+1; i <= _bis; ++i)
|
for (int i = _von + 1; i <= _bis; ++i)
|
||||||
{
|
{
|
||||||
zw = output2->data.f[i];
|
zw = output2->data.f[i];
|
||||||
if (zw > zw_max)
|
if (zw > zw_max)
|
||||||
|
|||||||
@@ -184,32 +184,6 @@ void wifi_init_sta(const char *_ssid, const char *_password, const char *_hostna
|
|||||||
ip_addr_set_ip4_u32(&dns_info.ip, ip.addr);
|
ip_addr_set_ip4_u32(&dns_info.ip, ip.addr);
|
||||||
ESP_ERROR_CHECK(esp_netif_set_dns_info(my_sta, ESP_NETIF_DNS_MAIN, &dns_info));
|
ESP_ERROR_CHECK(esp_netif_set_dns_info(my_sta, ESP_NETIF_DNS_MAIN, &dns_info));
|
||||||
}
|
}
|
||||||
/////////////////////////////////////////////////////////////////
|
|
||||||
|
|
||||||
|
|
||||||
// esp_netif_create_default_wifi_sta();
|
|
||||||
|
|
||||||
// wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT();
|
|
||||||
// ESP_ERROR_CHECK(esp_wifi_init(&cfg));
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
////////////////////////////// esp-idf 4.2 //////////////////////////
|
|
||||||
esp_event_handler_instance_t instance_any_id;
|
|
||||||
esp_event_handler_instance_t instance_got_ip;
|
|
||||||
ESP_ERROR_CHECK(esp_event_handler_instance_register(WIFI_EVENT,
|
|
||||||
ESP_EVENT_ANY_ID,
|
|
||||||
&event_handler,
|
|
||||||
NULL,
|
|
||||||
&instance_any_id));
|
|
||||||
ESP_ERROR_CHECK(esp_event_handler_instance_register(IP_EVENT,
|
|
||||||
IP_EVENT_STA_GOT_IP,
|
|
||||||
&event_handler,
|
|
||||||
NULL,
|
|
||||||
&instance_got_ip));
|
|
||||||
////////////////////////// ENDE esp-idf 4.2 ///////////////////////////
|
|
||||||
*/
|
|
||||||
|
|
||||||
ESP_ERROR_CHECK(esp_event_handler_register(WIFI_EVENT, ESP_EVENT_ANY_ID, &event_handler, NULL));
|
ESP_ERROR_CHECK(esp_event_handler_register(WIFI_EVENT, ESP_EVENT_ANY_ID, &event_handler, NULL));
|
||||||
ESP_ERROR_CHECK(esp_event_handler_register(IP_EVENT, IP_EVENT_STA_GOT_IP, &event_handler, NULL));
|
ESP_ERROR_CHECK(esp_event_handler_register(IP_EVENT, IP_EVENT_STA_GOT_IP, &event_handler, NULL));
|
||||||
@@ -253,27 +227,6 @@ void wifi_init_sta(const char *_ssid, const char *_password, const char *_hostna
|
|||||||
} else {
|
} else {
|
||||||
ESP_LOGE(TAG, "UNEXPECTED EVENT");
|
ESP_LOGE(TAG, "UNEXPECTED EVENT");
|
||||||
}
|
}
|
||||||
|
|
||||||
/* The event will not be processed after unregister */
|
|
||||||
/*
|
|
||||||
////////////////////////////// esp-idf 4.2 //////////////////////////
|
|
||||||
ESP_ERROR_CHECK(esp_event_handler_instance_unregister(IP_EVENT, IP_EVENT_STA_GOT_IP, instance_got_ip));
|
|
||||||
ESP_ERROR_CHECK(esp_event_handler_instance_unregister(WIFI_EVENT, ESP_EVENT_ANY_ID, instance_any_id));
|
|
||||||
////////////////////////// ENDE esp-idf 4.2 ///////////////////////////
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* Deaktiveren, damit bei einen Verbindungsabbruch neu aufgebaut wird
|
|
||||||
ESP_ERROR_CHECK(esp_event_handler_unregister(IP_EVENT, IP_EVENT_STA_GOT_IP, &event_handler));
|
|
||||||
ESP_ERROR_CHECK(esp_event_handler_unregister(WIFI_EVENT, ESP_EVENT_ANY_ID, &event_handler));
|
|
||||||
vEventGroupDelete(s_wifi_event_group);
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
while (BlinkIsRunning)
|
|
||||||
{
|
|
||||||
vTaskDelay(100 / portTICK_PERIOD_MS);
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -12,7 +12,7 @@
|
|||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
|
|
||||||
std::vector<string> ZerlegeZeile(std::string input, std::string _delimiter = "")
|
std::vector<string> ZerlegeZeileWLAN(std::string input, std::string _delimiter = "")
|
||||||
{
|
{
|
||||||
std::vector<string> Output;
|
std::vector<string> Output;
|
||||||
std::string delimiter = " =,";
|
std::string delimiter = " =,";
|
||||||
@@ -23,13 +23,13 @@ std::vector<string> ZerlegeZeile(std::string input, std::string _delimiter = "")
|
|||||||
input = trim(input, delimiter);
|
input = trim(input, delimiter);
|
||||||
size_t pos = findDelimiterPos(input, delimiter);
|
size_t pos = findDelimiterPos(input, delimiter);
|
||||||
std::string token;
|
std::string token;
|
||||||
while (pos != std::string::npos) {
|
if (pos != std::string::npos) // Zerlegt nur bis ersten Gleichheitszeichen !!! Sonderfall für WLAN.ini
|
||||||
|
{
|
||||||
token = input.substr(0, pos);
|
token = input.substr(0, pos);
|
||||||
token = trim(token, delimiter);
|
token = trim(token, delimiter);
|
||||||
Output.push_back(token);
|
Output.push_back(token);
|
||||||
input.erase(0, pos + 1);
|
input.erase(0, pos + 1);
|
||||||
input = trim(input, delimiter);
|
input = trim(input, delimiter);
|
||||||
pos = findDelimiterPos(input, delimiter);
|
|
||||||
}
|
}
|
||||||
Output.push_back(input);
|
Output.push_back(input);
|
||||||
|
|
||||||
@@ -67,10 +67,8 @@ void LoadWlanFromFile(std::string fn, char *&_ssid, char *&_password, char *&_ho
|
|||||||
while ((line.size() > 0) || !(feof(pFile)))
|
while ((line.size() > 0) || !(feof(pFile)))
|
||||||
{
|
{
|
||||||
// printf("%s", line.c_str());
|
// printf("%s", line.c_str());
|
||||||
zerlegt = ZerlegeZeile(line, "=");
|
zerlegt = ZerlegeZeileWLAN(line, "=");
|
||||||
zerlegt[0] = trim(zerlegt[0], " ");
|
zerlegt[0] = trim(zerlegt[0], " ");
|
||||||
for (int i = 2; i < zerlegt.size(); ++i)
|
|
||||||
zerlegt[1] = zerlegt[1] + "=" + zerlegt[i];
|
|
||||||
|
|
||||||
if ((zerlegt.size() > 1) && (toUpper(zerlegt[0]) == "HOSTNAME")){
|
if ((zerlegt.size() > 1) && (toUpper(zerlegt[0]) == "HOSTNAME")){
|
||||||
hostname = trim(zerlegt[1]);
|
hostname = trim(zerlegt[1]);
|
||||||
@@ -212,7 +210,7 @@ bool ChangeHostName(std::string fn, std::string _newhostname)
|
|||||||
while ((line.size() > 0) || !(feof(pFile)))
|
while ((line.size() > 0) || !(feof(pFile)))
|
||||||
{
|
{
|
||||||
printf("%s", line.c_str());
|
printf("%s", line.c_str());
|
||||||
zerlegt = ZerlegeZeile(line, "=");
|
zerlegt = ZerlegeZeileWLAN(line, "=");
|
||||||
zerlegt[0] = trim(zerlegt[0], " ");
|
zerlegt[0] = trim(zerlegt[0], " ");
|
||||||
|
|
||||||
if ((zerlegt.size() > 1) && (toUpper(zerlegt[0]) == "HOSTNAME")){
|
if ((zerlegt.size() > 1) && (toUpper(zerlegt[0]) == "HOSTNAME")){
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
const char* GIT_REV="147d974";
|
const char* GIT_REV="d0bf12f";
|
||||||
const char* GIT_TAG="";
|
const char* GIT_TAG="";
|
||||||
const char* GIT_BRANCH="master";
|
const char* GIT_BRANCH="master";
|
||||||
const char* BUILD_TIME="2021-09-25 18:55";
|
const char* BUILD_TIME="2021-10-07 07:17";
|
||||||
@@ -13,7 +13,7 @@ extern "C"
|
|||||||
#include "Helper.h"
|
#include "Helper.h"
|
||||||
#include <fstream>
|
#include <fstream>
|
||||||
|
|
||||||
const char* GIT_BASE_BRANCH = "master - v8.4.0 - 2021-09-25";
|
const char* GIT_BASE_BRANCH = "master - v8.5.0 - 2021-10-07";
|
||||||
|
|
||||||
|
|
||||||
const char* git_base_branch(void)
|
const char* git_base_branch(void)
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
const char* GIT_REV="147d974";
|
const char* GIT_REV="d0bf12f";
|
||||||
const char* GIT_TAG="";
|
const char* GIT_TAG="";
|
||||||
const char* GIT_BRANCH="master";
|
const char* GIT_BRANCH="master";
|
||||||
const char* BUILD_TIME="2021-09-25 18:55";
|
const char* BUILD_TIME="2021-10-07 07:17";
|
||||||
Binary file not shown.
BIN
firmware/dig1310s3q.tflite
Normal file
BIN
firmware/dig1310s3q.tflite
Normal file
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -20,7 +20,7 @@ FlipImageSize = false
|
|||||||
/config/ref1.jpg 442 142
|
/config/ref1.jpg 442 142
|
||||||
|
|
||||||
[Digits]
|
[Digits]
|
||||||
Model = /config/dig1210s2q.tflite
|
Model = /config/dig1310s3q.tflite
|
||||||
;LogImageLocation = /log/digit
|
;LogImageLocation = /log/digit
|
||||||
;LogfileRetentionInDays = 3
|
;LogfileRetentionInDays = 3
|
||||||
ModelInputSize = 20 32
|
ModelInputSize = 20 32
|
||||||
|
|||||||
BIN
sd-card/config/dig1310s3q.tflite
Normal file
BIN
sd-card/config/dig1310s3q.tflite
Normal file
Binary file not shown.
@@ -62,7 +62,7 @@ p {font-size: 1em;}
|
|||||||
}
|
}
|
||||||
ParseConfig();
|
ParseConfig();
|
||||||
param = getConfigParameters();
|
param = getConfigParameters();
|
||||||
param["System"]["SetupMode"]["enabled"] = false;
|
param["System"]["SetupMode"]["enabled"] = true;
|
||||||
param["System"]["SetupMode"]["value1"] = "false";
|
param["System"]["SetupMode"]["value1"] = "false";
|
||||||
|
|
||||||
WriteConfigININew();
|
WriteConfigININew();
|
||||||
|
|||||||
@@ -31,7 +31,6 @@ function ParseConfig() {
|
|||||||
ParamAddValue(param, catname, "ImageQuality");
|
ParamAddValue(param, catname, "ImageQuality");
|
||||||
ParamAddValue(param, catname, "ImageSize");
|
ParamAddValue(param, catname, "ImageSize");
|
||||||
ParamAddValue(param, catname, "FixedExposure");
|
ParamAddValue(param, catname, "FixedExposure");
|
||||||
ParamAddValue(param, catname, "UseGPIOControlledIllumination");
|
|
||||||
|
|
||||||
var catname = "Alignment";
|
var catname = "Alignment";
|
||||||
category[catname] = new Object();
|
category[catname] = new Object();
|
||||||
@@ -54,7 +53,6 @@ function ParseConfig() {
|
|||||||
ParamAddValue(param, catname, "LogImageLocation");
|
ParamAddValue(param, catname, "LogImageLocation");
|
||||||
ParamAddValue(param, catname, "LogfileRetentionInDays");
|
ParamAddValue(param, catname, "LogfileRetentionInDays");
|
||||||
ParamAddValue(param, catname, "ModelInputSize", 2);
|
ParamAddValue(param, catname, "ModelInputSize", 2);
|
||||||
// ParamAddValue(param, catname, "ExtendedResolution");
|
|
||||||
|
|
||||||
var catname = "Analog";
|
var catname = "Analog";
|
||||||
category[catname] = new Object();
|
category[catname] = new Object();
|
||||||
@@ -65,7 +63,6 @@ function ParseConfig() {
|
|||||||
ParamAddValue(param, catname, "LogImageLocation");
|
ParamAddValue(param, catname, "LogImageLocation");
|
||||||
ParamAddValue(param, catname, "LogfileRetentionInDays");
|
ParamAddValue(param, catname, "LogfileRetentionInDays");
|
||||||
ParamAddValue(param, catname, "ModelInputSize", 2);
|
ParamAddValue(param, catname, "ModelInputSize", 2);
|
||||||
// ParamAddValue(param, catname, "ExtendedResolution");
|
|
||||||
|
|
||||||
var catname = "PostProcessing";
|
var catname = "PostProcessing";
|
||||||
category[catname] = new Object();
|
category[catname] = new Object();
|
||||||
@@ -81,7 +78,6 @@ function ParseConfig() {
|
|||||||
ParamAddValue(param, catname, "IgnoreLeadingNaN", 1, true);
|
ParamAddValue(param, catname, "IgnoreLeadingNaN", 1, true);
|
||||||
ParamAddValue(param, catname, "ErrorMessage");
|
ParamAddValue(param, catname, "ErrorMessage");
|
||||||
ParamAddValue(param, catname, "CheckDigitIncreaseConsistency");
|
ParamAddValue(param, catname, "CheckDigitIncreaseConsistency");
|
||||||
// ParamAddValue(param, catname, "IgnoreLeadingNaN");
|
|
||||||
|
|
||||||
var catname = "MQTT";
|
var catname = "MQTT";
|
||||||
category[catname] = new Object();
|
category[catname] = new Object();
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
10.1.0
|
10.2.0
|
||||||
Reference in New Issue
Block a user