PreRelease+bin. Persistant&Config mgmt done+fixes

This commit is contained in:
2021-12-26 01:41:56 +03:00
parent 184abef5a4
commit 12fe7ea71e
25 changed files with 42070 additions and 42001 deletions

File diff suppressed because it is too large Load Diff

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

Binary file not shown.

File diff suppressed because it is too large Load Diff

Binary file not shown.

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -245,52 +245,93 @@ bool systemConfig::isValidSysConf()
if (stream->write(EEPROM_signature[i]));
stream->close();
setETAG("");
setSerialDebuglevel(7);
setUdpDebuglevel(7);
return true;
}
///
systemConfigFlags systemConfig::getConfigFlags()
{
systemConfigFlags flags;
flags.configFlags32bit=0;
flags.serialDebugLevel=7;
flags.udpDebugLevel=7;
if (stream && isValidSysConf())
{
openStream('r');
stream->seek(offsetof(systemConfigData,configFlags));
stream->readBytes((uint8_t *) &flags,sizeof (flags));
stream->close();
}
return flags;
}
bool systemConfig::setConfigFlags(systemConfigFlags flags)
{
if (!stream || !isValidSysConf()) return false;
openStream('r');
stream->seek(offsetof(systemConfigData,configFlags));
int bytes = stream->write((uint8_t *) &flags, sizeof (flags));
stream->close();
return bytes;
}
bool systemConfig::getSaveSuccedConfig()
{
return false;
systemConfigFlags flags = getConfigFlags();
return !flags.notSaveSuccedConfig;
}
bool systemConfig::setSaveSuccedConfig(bool)
bool systemConfig::setSaveSuccedConfig(bool flag)
{
return false;
systemConfigFlags flags = getConfigFlags();
flags.notSaveSuccedConfig=!flag;
return setConfigFlags(flags);
}
///
bool systemConfig::getLoadHTTPConfig()
{
systemConfigFlags flags = getConfigFlags();
return !flags.notGetConfigFromHTTP;
}
bool systemConfig::setLoadHTTPConfig(bool load)
{
systemConfigFlags flags = getConfigFlags();
flags.notGetConfigFromHTTP=!load;
return setConfigFlags(flags);
}
bool systemConfig::setSerialDebuglevel(short level)
{
return false;
systemConfigFlags flags = getConfigFlags();
flags.serialDebugLevel=level;
return setConfigFlags(flags);
}
bool systemConfig::setUdpDebuglevel(short level)
{
return false;
systemConfigFlags flags = getConfigFlags();
flags.udpDebugLevel=level;
return setConfigFlags(flags);
}
uint8_t systemConfig::getSerialDebuglevel()
{
return 7;
systemConfigFlags flags = getConfigFlags();
return flags.serialDebugLevel;
}
uint8_t systemConfig::getUdpDebuglevel()
{
return 7;
}
//
bool systemConfig::setLoadHTTPConfig(bool load)
{
return false;
}
bool systemConfig::getLoadHTTPConfig()
{
return false;
systemConfigFlags flags = getConfigFlags();
return flags.udpDebugLevel;
}
String systemConfig::getETAG()

View File

@@ -61,5 +61,8 @@ class systemConfig {
bool saveETAG();
bool loadETAG();
systemConfigFlags getConfigFlags();
bool setConfigFlags(systemConfigFlags flags);
//bool Save();
};

View File

@@ -1056,7 +1056,10 @@ if (status2Send) cmd.saveItem(this,status2Send);
//debugSerial<<F("sts:")<<status2Send<<endl;
if (driver) //New style modular code
{
res = driver->Ctrl(cmd, subItem, toExecute);
//if (res==-1) status2Send=0; ///////not working
}
else
{
switch (itemType) {

View File

@@ -343,7 +343,13 @@ uint16_t httpHandler(Client& client, String request, uint8_t method, long conten
if (! result) return 404;
return result;
}
else
else if (method == HTTP_POST && request.startsWith(F("/config.json")))
{
sysConf.setLoadHTTPConfig(false);
infoSerial<<(F("Config changed locally, portal disabled"))<<endl;
sysConf.setETAG("");
return 0;
}
#endif
return 0; //Unknown
}
@@ -574,21 +580,34 @@ lan_status lanLoop() {
case LIBS_INITIALIZED:
statusLED.set(ledRED|ledGREEN|((configLoaded)?ledBLINK:0));
if (configLocked) return LIBS_INITIALIZED;
if (sysConf.getLoadHTTPConfig())
{
if (!configOk)
{
if (loadConfigFromHttp()) lanStatus = IP_READY_CONFIG_LOADED_CONNECTING_TO_BROKER;
if (loadConfigFromHttp()==200) lanStatus = IP_READY_CONFIG_LOADED_CONNECTING_TO_BROKER;
else if (configLoaded) {
infoSerial<<F("Continue with previously loaded config")<<endl;
lanStatus = IP_READY_CONFIG_LOADED_CONNECTING_TO_BROKER;
}
else lanStatus = READ_RE_CONFIG; //Load from NVRAM
else if (Ethernet.localIP()) lanStatus = DO_READ_RE_CONFIG;
else lanStatus = DO_REINIT; //Load from NVRAM
}
else
{
infoSerial<<F("Config is valid")<<endl;
lanStatus = IP_READY_CONFIG_LOADED_CONNECTING_TO_BROKER;
}
} else
{
if (configLoaded)
lanStatus = IP_READY_CONFIG_LOADED_CONNECTING_TO_BROKER;
else
lanStatus = DO_READ_RE_CONFIG;
infoSerial<<F("Loading config from portal disabled. use get ON to enable")<<endl;
}
break;
case IP_READY_CONFIG_LOADED_CONNECTING_TO_BROKER:
@@ -625,6 +644,7 @@ lan_status lanLoop() {
case DO_REINIT: // Pause and re-init LAN
//if (mqttClient.connected()) mqttClient.disconnect(); // Hmm hungs then cable disconnected
// problem here - if no sockets - DHCP will failed. finally (())
timerLanCheckTime = millis();// + 5000;
lanStatus = REINIT;
statusLED.set(ledRED|((configLoaded)?ledBLINK:0));
@@ -652,13 +672,22 @@ lan_status lanLoop() {
lanStatus = IP_READY_CONFIG_LOADED_CONNECTING_TO_BROKER;//2;
break;
case DO_READ_RE_CONFIG: // Pause and re-read EEPROM
timerLanCheckTime = millis();
lanStatus = READ_RE_CONFIG;
//statusLED.set(ledRED|((configLoaded)?ledBLINK:0));
break;
case READ_RE_CONFIG: // Restore config from FLASH, re-init LAN
if (isTimeOver(timerLanCheckTime,millis(),TIMEOUT_REINIT))
{
debugSerial<<F("Restoring config from EEPROM")<<endl;
if (loadConfigFromEEPROM()) lanStatus = IP_READY_CONFIG_LOADED_CONNECTING_TO_BROKER;//2;
else {
//timerLanCheckTime = millis();// + 5000;
lanStatus = DO_REINIT;//-10;
}
}
break;
case DO_NOTHING:
@@ -841,7 +870,7 @@ void ip_ready_config_loaded_connecting_to_broker() {
if (!mqttArr || ((n = aJson.getArraySize(mqttArr)) < 2)) //At least device name and broker IP must be configured
{
errorSerial<<F("At least device name and broker IP must be configured")<<endl;
lanStatus = READ_RE_CONFIG;
lanStatus = DO_READ_RE_CONFIG;
return;
}
@@ -1262,6 +1291,8 @@ setupSyslog();
switch (it.itemType) {
case CH_THERMO:
if (cmd<1) it.setCmd(CMD_OFF);
it.setFlag(SEND_COMMAND);
if (it.itemVal) it.setFlag(SEND_PARAMETERS);
pinMode(pin, OUTPUT);
digitalWrite(pin, false); //Initially, all thermostates are LOW (OFF for electho heaters, open for water NO)
debugSerial<<F("Thermo:")<<pin<<F("=LOW")<<F(";");
@@ -1290,7 +1321,6 @@ setupSyslog();
printConfigSummary();
configLoaded=true;
if (sysConf.getSaveSuccedConfig()) cmdFunctionSave(0,NULL);
ethClient.stop(); //Refresh MQTT connection
configLocked--;
}
@@ -1547,23 +1577,29 @@ if (arg_cnt>1)
if (lanStatus>=HAVE_IP_ADDRESS)
{
configOk=false;
lanStatus=LIBS_INITIALIZED;
return 200;
}
errorSerial<<F("No IP adress")<<endl;
return 500;
/*
if (loadConfigFromHttp(arg_cnt, args))
int retCode=loadConfigFromHttp();
if (retCode==200)
{
lanStatus =IP_READY_CONFIG_LOADED_CONNECTING_TO_BROKER;
return 200;
}
else if (retCode == -1)
{
debugSerial<<F("Releasing socket and retry")<<endl;
configOk=false;
lanStatus=LIBS_INITIALIZED;
ethClient.stop(); // Release MQTT socket
return 201;
}
// Not Loaded
if (configLoaded) lanStatus =IP_READY_CONFIG_LOADED_CONNECTING_TO_BROKER;
else lanStatus = READ_RE_CONFIG;
return 500; */
else lanStatus = DO_READ_RE_CONFIG;
return retCode;
}
errorSerial<<F("No IP adress")<<endl;
return 500;
}
void printBool(bool arg) { (arg) ? infoSerial<<F("+") : infoSerial<<F("-"); }
@@ -1580,7 +1616,7 @@ void headerHandlerProc(String header)
}
}
bool loadConfigFromHttp()
int loadConfigFromHttp()
{
//macAddress * mac = sysConf.getMAC();
int responseStatusCode = 0;
@@ -1625,14 +1661,13 @@ if (!sysConf.getServer(configServer,sizeof(configServer)))
// FILE is the return STREAM type of the HTTPClient
configStream = hclient.getURI(URI,NULL,get_header);
responseStatusCode = hclient.getLastReturnCode();
debugSerial<<F("http retcode ")<<responseStatusCode<<endl;delay(100);
//debugSerial<<F("http retcode ")<<responseStatusCode<<endl;delay(100);
//wdt_en();
if (configStream != NULL) {
if (responseStatusCode == 200) {
infoSerial<<F("got Config\n"); delay(500);
char c;
aJsonFileStream as = aJsonFileStream(configStream);
noInterrupts();
cleanConf();
@@ -1644,30 +1679,33 @@ if (!sysConf.getServer(configServer,sizeof(configServer)))
{
sysConf.setETAG("");
errorSerial<<F("Config parsing failed\n");
return false;
return 0;
}
else {
applyConfig();
if (configLoaded && sysConf.getSaveSuccedConfig()) cmdFunctionSave(0,NULL);
infoSerial<<F("Done.\n");
return true;
return 200;
}
}
else if (responseStatusCode == 304)
{
errorSerial<<F("Config not changed\n");
return false;
infoSerial<<F("Config not changed\n");
hclient.closeStream(configStream);
return responseStatusCode;
}
else
{
errorSerial<<F("ERROR: Server returned ");
hclient.closeStream(configStream);
errorSerial<<responseStatusCode<<endl;
return false;
return responseStatusCode;
}
} else {
debugSerial<<F("failed to connect\n");
return false;
return -1;
}
#endif
#if defined(__SAM3X8E__) || defined(ARDUINO_ARCH_STM32) || defined (NRF5) //|| defined(ARDUINO_ARCH_AVR)//|| defined(ARDUINO_ARCH_ESP32) //|| defined(ARDUINO_ARCH_ESP8266)
@@ -1713,32 +1751,33 @@ if (!sysConf.getServer(configServer,sizeof(configServer)))
if (!root) {
errorSerial<<F("Config parsing failed\n");
sysConf.setETAG("");
return false;
return 0;
}
else {
debugSerial<<F("Parsed. Free:")<<freeRam()<<endl;
//debugSerial<<response;
applyConfig();
infoSerial<<F("Done.\n");
return true;
if (configLoaded && sysConf.getSaveSuccedConfig()) cmdFunctionSave(0,NULL);
return 200;
}
}
else if (responseStatusCode == 304)
{
errorSerial<<F("Config not changed\n");
htclient.stop();
return false;
return responseStatusCode;
}
else {
errorSerial<<F("Config retrieving failed\n");
htclient.stop();
return false;
return responseStatusCode;
}
}
else
{
errorSerial<<F("Connect failed\n");
return false;
return -1;
}
#endif
@@ -1784,36 +1823,36 @@ if (!sysConf.getServer(configServer,sizeof(configServer)))
} else
{
httpClient.end();
return false;
return -1;
}
if (!root) {
sysConf.setETAG("");
errorSerial<<F("Config parsing failed\n");
return false;
return 0;
} else {
applyConfig();
if (configLoaded && sysConf.getSaveSuccedConfig()) cmdFunctionSave(0,NULL);
infoSerial<<F("Done.\n");
return true;
return 200;
}
}
else if (responseStatusCode == HTTP_CODE_NOT_MODIFIED)
{
httpClient.end();
errorSerial<<F("Config not changed\n");
return false;
return responseStatusCode;
}
else
{
httpClient.end();
errorSerial<<F("Config retrieving failed\n");
return false;
return responseStatusCode;
}
} else
{
errorSerial.printf("[HTTP] GET... failed, error: %s\n", httpClient.errorToString(responseStatusCode).c_str());
httpClient.end();
return false;
return responseStatusCode;
}
#endif
}
@@ -1890,11 +1929,11 @@ void setup_main() {
if(SPIFFS.begin())
#endif
{
debugSerial<<("SPIFFS Initialize....ok")<<endl;
debugSerialPort.println("SPIFFS Initialize....ok");
}
else
{
debugSerial<<("SPIFFS Initialization...failed")<<endl;
debugSerialPort.println("SPIFFS Initialization...failed");
}
#endif
#else
@@ -1909,7 +1948,7 @@ void setup_main() {
if (!sysConf.isValidSysConf())
{
infoSerial<<F("No valid EEPROM data")<<endl;
debugSerialPort.println(F("No valid EEPROM data. Initializing."));
sysConf.clear();
}
// scan_i2c_bus();

View File

@@ -213,6 +213,7 @@ enum lan_status {
DO_RECONNECT = 12,
RECONNECT = 13,
READ_RE_CONFIG = 14,
DO_READ_RE_CONFIG = 15,
DO_NOTHING = -15
};
@@ -266,7 +267,7 @@ void saveFlash(short n, IPAddress& ip);
int ipLoadFromFlash(short n, IPAddress &ip);
*/
bool loadConfigFromHttp();
int loadConfigFromHttp();
void preTransmission();

View File

@@ -53,6 +53,7 @@ void out_AC::InsertData(byte data[], size_t size){
char s_mode[10];
set_tmp = data[B_SET_TMP]+16;
if (set_tmp>40 || set_tmp<16) return;
cur_tmp = data[B_CUR_TMP];
mode = data[B_MODE];
fan_spd = data[B_FAN_SPD];
@@ -250,8 +251,8 @@ if (cause!=POLLING_SLOW) return 0;
debugSerial.println ("Polling");
SendData(qstn, sizeof(qstn)/sizeof(byte)); //Опрос кондиционера
}
delay(100);
if(AC_Serial.available() > 0){
///delay(100);
if(AC_Serial.available() >= 37){ //was 0
AC_Serial.readBytes(data, 37);
while(AC_Serial.available()){
delay(2);
@@ -282,13 +283,14 @@ int out_AC::Ctrl(itemCmd cmd, char* subItem , bool toExecute)
switch(suffixCode)
{
case S_SET:
//case S_ESET:
set_tmp = cmd.getInt();
if (set_tmp >= 10 && set_tmp <= 30)
if (set_tmp >= 16 && set_tmp <= 40)
{
//if (set_tmp>40 || set_tmp<16) set_temp=21;
data[B_SET_TMP] = set_tmp -16;
publishTopic(item->itemArr->name,(long) set_tmp,"/set");
}
else return -1;
break;
case S_CMD:

View File

@@ -70,7 +70,7 @@
#define WIFI_TIMEOUT 60000UL
#define TIMEOUT_RECONNECT 10000UL
#define TIMEOUT_REINIT 5000UL
#define TIMEOUT_RETAIN 5000UL
#define TIMEOUT_RETAIN 8000UL
#define INTERVAL_1W 5000UL
#define PERIOD_THERMOSTAT_FAILED (600 * 1000UL)>>8

View File

@@ -5,7 +5,7 @@
#define MAXFLASHSTR 32
#define PWDFLASHSTR 16
#define EEPROM_SIGNATURE "LHC0"
#define EEPROM_SIGNATURE "LHC1"
#define EEPROM_SIGNATURE_LENGTH 4
//#define EEPROM_offsetJSON IFLASH_PAGE_SIZE
@@ -18,20 +18,26 @@ const char EEPROM_signature[] = EEPROM_SIGNATURE;
typedef uint8_t macAddress[6];
#pragma pack(push, 1)
typedef union
{
uint32_t configFlags32bit;
struct
{
uint8_t serialDebugLevel:3;
uint8_t notGetConfigFromHTTP:1;
uint8_t udpDebugLevel:3;
uint8_t notSaveSuccedConfig:1;
uint8_t spare2;
uint16_t sysConfigHash;
};
} systemConfigFlags;
typedef struct
{
char signature[4];
macAddress mac; //6 bytes
union {
uint16_t configFlags;
struct
{
uint8_t serialDebugLevel:4;
uint8_t syslogDebugLevel:4;
uint8_t notGetConfigFromHTTP:1;
uint8_t saveToFlash:1;
};
};
uint16_t spare; //2 bytes
systemConfigFlags configFlags; //4 bytes
uint32_t ip;
uint32_t dns;
uint32_t gw;
@@ -41,7 +47,5 @@ const char EEPROM_signature[] = EEPROM_SIGNATURE;
flashpwd MQTTpwd;
flashpwd OTApwd;
flashstr ETAG;
uint16_t sysConfigHash;
} systemConfigData;
#pragma (pop)

View File

@@ -359,7 +359,7 @@ lib_deps =
Adafruit Unified Sensor
DHT sensor library
https://github.com/arcao/Syslog.git
;Streaming
Streaming
;;ClosedCube HDC1080
;;SparkFun CCS811 Arduino Library@~1.0.7
;Adafruit NeoPixel
@@ -566,7 +566,7 @@ platform = atmelavr
board = megaatmega2560
monitor_baud = 115200
framework = arduino
upload_port = net:192.168.88.2:23000
;upload_port = net:192.168.88.2:23000
build_flags = !python get_build_flags.py mega2560-5100
lib_ignore =
;DS2482_OneWire //UNCOMMENT for software 1-wire driver
@@ -620,8 +620,8 @@ framework = arduino
board = due
monitor_baud = 115200
build_flags = !python get_build_flags.py lighthub21
upload_command = /opt/local/sbin/arduinoOTA -address 192.168.11.172 -port 80 -username arduino -password password -b -upload /sketch -sketch $SOURCE ;sleep 6
;upload_command = arduinoOTA -address 192.168.88.45 -port 80 -username arduino -password password -b -upload /sketch -sketch $SOURCE;sleep 6
upload_command = arduinoOTA -address 192.168.11.172 -port 80 -username arduino -password password -b -upload /sketch -sketch $SOURCE ;sleep 6
upload_protocol = custom
lib_ignore =
;DS2482_OneWire //UNCOMMENT for software 1-wire driver