mirror of
https://github.com/IoTManagerProject/IoTManager.git
synced 2026-03-26 22:22:16 +03:00
73
include/Bus/BusScanner.h
Normal file
73
include/Bus/BusScanner.h
Normal file
@@ -0,0 +1,73 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <Arduino.h>
|
||||||
|
|
||||||
|
enum BusScanner_t {
|
||||||
|
BS_I2C,
|
||||||
|
BS_ONE_WIRE
|
||||||
|
};
|
||||||
|
|
||||||
|
class BusScanner {
|
||||||
|
public:
|
||||||
|
BusScanner(String& result, size_t tries) : _tries{tries}, _result{&result} {}
|
||||||
|
|
||||||
|
void addResult(uint8_t addr, boolean last = true) {
|
||||||
|
_result->concat("0x");
|
||||||
|
if (addr < 16) {
|
||||||
|
_result->concat("0");
|
||||||
|
}
|
||||||
|
_result->concat(String(addr, HEX));
|
||||||
|
_result->concat(!last ? ", " : "");
|
||||||
|
};
|
||||||
|
|
||||||
|
void scan() {
|
||||||
|
if (!syncScan() && _tries--) {
|
||||||
|
syncScan();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
virtual boolean syncScan();
|
||||||
|
|
||||||
|
private:
|
||||||
|
size_t _tries;
|
||||||
|
BusScanner_t _type;
|
||||||
|
String* _result;
|
||||||
|
};
|
||||||
|
|
||||||
|
class I2CScanner : public BusScanner {
|
||||||
|
public:
|
||||||
|
I2CScanner(String& result) : BusScanner(result, 2){};
|
||||||
|
|
||||||
|
virtual boolean syncScan() override;
|
||||||
|
};
|
||||||
|
|
||||||
|
class OneWireScanner : public BusScanner {
|
||||||
|
public:
|
||||||
|
OneWireScanner(String& result) : BusScanner(result, 1){};
|
||||||
|
|
||||||
|
virtual boolean syncScan() override;
|
||||||
|
};
|
||||||
|
|
||||||
|
class BusScannerFactory {
|
||||||
|
public:
|
||||||
|
static const char* label(BusScanner_t type) {
|
||||||
|
switch (type) {
|
||||||
|
case BS_I2C:
|
||||||
|
return "i2c";
|
||||||
|
case BS_ONE_WIRE:
|
||||||
|
return "onewire";
|
||||||
|
default:
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static BusScanner* get(String& str, BusScanner_t type, size_t tries = 1) {
|
||||||
|
switch (type) {
|
||||||
|
case BS_I2C:
|
||||||
|
return new I2CScanner(str);
|
||||||
|
case BS_ONE_WIRE:
|
||||||
|
return new OneWireScanner(str);
|
||||||
|
default:
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
@@ -3,14 +3,13 @@
|
|||||||
#include "Utils/TimeUtils.h"
|
#include "Utils/TimeUtils.h"
|
||||||
#include "Utils/PrintMessage.h"
|
#include "Utils/PrintMessage.h"
|
||||||
|
|
||||||
#include "time.h"
|
#include "TZ.h"
|
||||||
|
|
||||||
class Clock {
|
class Clock {
|
||||||
const char* MODULE = "Clock";
|
const char* MODULE = "Clock";
|
||||||
|
|
||||||
public:
|
public:
|
||||||
Clock() : _timezone{0}, _ntp{}, _hasSynced{false}, _configured{false} {
|
Clock() : _timezone{0}, _hasSynced{false}, _configured{false} {}
|
||||||
}
|
|
||||||
|
|
||||||
bool hasSync() {
|
bool hasSync() {
|
||||||
if (!_hasSynced) {
|
if (!_hasSynced) {
|
||||||
@@ -19,9 +18,7 @@ class Clock {
|
|||||||
return _hasSynced;
|
return _hasSynced;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void setNtpPool(String ntp) {
|
||||||
|
|
||||||
setNtpPool(String ntp) {
|
|
||||||
_ntp = ntp;
|
_ntp = ntp;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -29,15 +26,6 @@ class Clock {
|
|||||||
_timezone = timezone;
|
_timezone = timezone;
|
||||||
}
|
}
|
||||||
|
|
||||||
time_t getSystemTime() {
|
|
||||||
timeval tv{0, 0};
|
|
||||||
timezone tz = getTimeZone(getBiasInMinutes());
|
|
||||||
time_t epoch = 0;
|
|
||||||
if (gettimeofday(&tv, &tz) != -1)
|
|
||||||
epoch = tv.tv_sec;
|
|
||||||
return epoch;
|
|
||||||
}
|
|
||||||
|
|
||||||
void startSync() {
|
void startSync() {
|
||||||
if (!_configured) {
|
if (!_configured) {
|
||||||
pm.info("sync to: " + _ntp + " time zone: " + String(_timezone));
|
pm.info("sync to: " + _ntp + " time zone: " + String(_timezone));
|
||||||
@@ -53,7 +41,7 @@ class Clock {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void setupSntp() {
|
void setupSntp() {
|
||||||
int tzs = getBiasInSeconds();
|
int tzs = getOffsetInSeconds(_timezone);
|
||||||
int tzh = tzs / 3600;
|
int tzh = tzs / 3600;
|
||||||
tzs -= tzh * 3600;
|
tzs -= tzh * 3600;
|
||||||
int tzm = tzs / 60;
|
int tzm = tzs / 60;
|
||||||
@@ -72,26 +60,23 @@ class Clock {
|
|||||||
// i++;
|
// i++;
|
||||||
// delay(1000);
|
// delay(1000);
|
||||||
// }
|
// }
|
||||||
// #endif
|
// #endifr
|
||||||
private:
|
|
||||||
bool hasTimeSynced() {
|
bool hasTimeSynced() {
|
||||||
unsigned long now = time(nullptr);
|
return getSystemTime() > 30000;
|
||||||
return now > millis();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int getBiasInSeconds() {
|
time_t getSystemTime() {
|
||||||
return getBiasInMinutes() * 60;
|
timeval tv{0, 0};
|
||||||
}
|
timezone tz = timezone{getOffsetInMinutes(_timezone), 0};
|
||||||
|
if (gettimeofday(&tv, &tz) != -1) {
|
||||||
int getBiasInMinutes() {
|
_epoch = tv.tv_sec;
|
||||||
return _timezone * 60;
|
}
|
||||||
}
|
return _epoch;
|
||||||
|
|
||||||
const timezone getTimeZone(int minutes) {
|
|
||||||
return timezone{minutes, 0};
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
time_t _epoch;
|
||||||
int _timezone;
|
int _timezone;
|
||||||
String _ntp;
|
String _ntp;
|
||||||
bool _hasSynced;
|
bool _hasSynced;
|
||||||
|
|||||||
@@ -11,9 +11,11 @@
|
|||||||
//
|
//
|
||||||
#include "Consts.h"
|
#include "Consts.h"
|
||||||
#include "CommonTypes.h"
|
#include "CommonTypes.h"
|
||||||
|
#include "Bus/BusScanner.h"
|
||||||
#include "Errors.h"
|
#include "Errors.h"
|
||||||
#include "GyverFilters.h"
|
#include "GyverFilters.h"
|
||||||
#include "UptimeInterval.h"
|
#include "UptimeInterval.h"
|
||||||
|
#include "Upgrade.h"
|
||||||
#include "Clock.h"
|
#include "Clock.h"
|
||||||
|
|
||||||
#include "MqttClient.h"
|
#include "MqttClient.h"
|
||||||
@@ -100,15 +102,24 @@ extern int enter_to_logging_counter;
|
|||||||
|
|
||||||
extern int scenario_line_status[40];
|
extern int scenario_line_status[40];
|
||||||
|
|
||||||
extern String last_version;
|
extern String lastVersion;
|
||||||
|
|
||||||
extern boolean upgrade_url;
|
extern boolean upgrade_url;
|
||||||
extern boolean upgrade;
|
extern boolean upgrade;
|
||||||
extern boolean mqttParamsChanged;
|
extern boolean mqttParamsChanged;
|
||||||
extern boolean udp_data_parse;
|
extern boolean udp_data_parse;
|
||||||
extern boolean mqtt_send_settings_to_udp;
|
extern boolean mqtt_send_settings_to_udp;
|
||||||
extern boolean i2c_scanning;
|
|
||||||
extern boolean fscheck_flag;
|
/*
|
||||||
|
* Запрос на скарнирование шины
|
||||||
|
*/
|
||||||
|
extern boolean busScanFlag;
|
||||||
|
/*
|
||||||
|
* Запрос на сканирование шины, указание какую
|
||||||
|
*/
|
||||||
|
extern BusScanner_t busToScan;
|
||||||
|
|
||||||
|
extern boolean fsCheckFlag;
|
||||||
|
|
||||||
extern int sensors_reading_map[15];
|
extern int sensors_reading_map[15];
|
||||||
|
|
||||||
@@ -225,11 +236,9 @@ extern void timerStop_();
|
|||||||
extern void delTimer(String number);
|
extern void delTimer(String number);
|
||||||
extern int readTimer(int number);
|
extern int readTimer(int number);
|
||||||
|
|
||||||
//Upgrade
|
extern void initUpdater();
|
||||||
extern void init_updater();
|
|
||||||
|
|
||||||
// widget
|
// widget
|
||||||
|
|
||||||
extern void createWidgetByType(String widget_name, String page_name, String page_number, String file, String topic);
|
extern void createWidgetByType(String widget_name, String page_name, String page_number, String file, String topic);
|
||||||
extern void createWidgetParam(String widget_name, String page_name, String page_number, String file, String topic, String name1, String param1, String name2, String param2, String name3, String param3);
|
extern void createWidgetParam(String widget_name, String page_name, String page_number, String file, String topic, String name1, String param1, String name2, String param2, String name3, String param3);
|
||||||
extern void createWidget(String widget_name, String page_name, String page_number, String type, String topik);
|
extern void createWidget(String widget_name, String page_name, String page_number, String type, String topik);
|
||||||
@@ -250,8 +259,8 @@ extern void loopCmd();
|
|||||||
extern void loopButton();
|
extern void loopButton();
|
||||||
extern void loopScenario();
|
extern void loopScenario();
|
||||||
extern void loopUdp();
|
extern void loopUdp();
|
||||||
extern void do_upgrade_url();
|
|
||||||
extern void do_upgrade();
|
extern void flashUpgrade();
|
||||||
|
|
||||||
// Init
|
// Init
|
||||||
extern void uptime_init();
|
extern void uptime_init();
|
||||||
|
|||||||
8
include/MqttDiscovery.h
Normal file
8
include/MqttDiscovery.h
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "Utils/SysUtils.h"
|
||||||
|
|
||||||
|
namespace Discovery {
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
5
include/Upgrade.h
Normal file
5
include/Upgrade.h
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
void getLastVersion();
|
||||||
|
|
||||||
|
void flashUpgrade();
|
||||||
@@ -4,6 +4,10 @@
|
|||||||
|
|
||||||
const String getChipId();
|
const String getChipId();
|
||||||
|
|
||||||
|
const String getUniqueId(const String& name);
|
||||||
|
|
||||||
const String printMemoryStatus();
|
const String printMemoryStatus();
|
||||||
|
|
||||||
const String getHeapStats();
|
const String getHeapStats();
|
||||||
|
|
||||||
|
const String getMacAddress();
|
||||||
@@ -1,16 +1,14 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <Arduino.h>
|
|
||||||
#ifdef ESP8266
|
#ifdef ESP8266
|
||||||
#include <TZ.h>
|
#include <time.h>
|
||||||
#endif
|
#endif
|
||||||
|
#include <Arduino.h>
|
||||||
void Time_Init();
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Получение текущего времени
|
* Получение текущего времени
|
||||||
*/
|
*/
|
||||||
String getTime();
|
String getTime();
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Получаем время в формате linux gmt
|
* Получаем время в формате linux gmt
|
||||||
*/
|
*/
|
||||||
@@ -36,11 +34,15 @@ int timeToMin(String Time);
|
|||||||
const String prettyMillis(unsigned long time_ms = millis());
|
const String prettyMillis(unsigned long time_ms = millis());
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Время (мс) прошедщее с @simce
|
* Время (мс) прошедщее с @since
|
||||||
*/
|
*/
|
||||||
unsigned long millis_since(unsigned long sinse);
|
unsigned long millis_since(unsigned long sinse);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Интерввал времени (мс) между @start и @fimish
|
* Интерввал времени (мс) между @start и @finish
|
||||||
*/
|
*/
|
||||||
unsigned long millis_passed(unsigned long start, unsigned long finish);
|
unsigned long millis_passed(unsigned long start, unsigned long finish);
|
||||||
|
|
||||||
|
int getOffsetInSeconds(int timezone);
|
||||||
|
|
||||||
|
int getOffsetInMinutes(int timezone);
|
||||||
|
|||||||
71
include/Utils/Timings.h
Normal file
71
include/Utils/Timings.h
Normal file
@@ -0,0 +1,71 @@
|
|||||||
|
#include <Arduino.h>
|
||||||
|
|
||||||
|
enum Timings_t { MT_ONE,
|
||||||
|
MT_TWO,
|
||||||
|
NUM_TIMINGS };
|
||||||
|
|
||||||
|
struct Timing {
|
||||||
|
unsigned long _total_mu;
|
||||||
|
unsigned long _min_mu;
|
||||||
|
unsigned long _max_mu;
|
||||||
|
|
||||||
|
Timing() : _total_mu{0}, _min_mu{999999}, _max_mu{0} {};
|
||||||
|
|
||||||
|
void reset() {
|
||||||
|
_total_mu = 0;
|
||||||
|
_min_mu = 999999;
|
||||||
|
_max_mu = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void add(unsigned long time_mu) {
|
||||||
|
if (time_mu == 0) return;
|
||||||
|
|
||||||
|
_total_mu += time_mu;
|
||||||
|
|
||||||
|
if (_min_mu > time_mu) {
|
||||||
|
_min_mu = time_mu;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (_max_mu < time_mu) {
|
||||||
|
_max_mu = time_mu;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
static const char* module_name[NUM_TIMINGS] = {"strings", "boolean"};
|
||||||
|
|
||||||
|
struct Timings {
|
||||||
|
Timing mu[NUM_TIMINGS];
|
||||||
|
|
||||||
|
unsigned long _counter;
|
||||||
|
unsigned long _start;
|
||||||
|
unsigned long long _total;
|
||||||
|
|
||||||
|
Timings() : _counter{0}, _start{0} {};
|
||||||
|
|
||||||
|
void add(size_t module, unsigned long now = micros()) {
|
||||||
|
unsigned long time = now - _start;
|
||||||
|
_total += time;
|
||||||
|
mu[module].add(time);
|
||||||
|
_start = now;
|
||||||
|
}
|
||||||
|
|
||||||
|
void count() {
|
||||||
|
_counter++;
|
||||||
|
_start = micros();
|
||||||
|
}
|
||||||
|
|
||||||
|
void print() {
|
||||||
|
if (!_counter) {
|
||||||
|
return;
|
||||||
|
};
|
||||||
|
Serial.printf("lp/ms: %llu ", _counter / _total);
|
||||||
|
for (size_t i = 0; i < NUM_TIMINGS; i++) {
|
||||||
|
Serial.printf("%s: %.2f%% ", module_name[i], ((float)mu[i]._total_mu / _total) * 100);
|
||||||
|
mu[i].reset();
|
||||||
|
}
|
||||||
|
Serial.println();
|
||||||
|
_counter = 0;
|
||||||
|
_total = 0;
|
||||||
|
};
|
||||||
|
};
|
||||||
@@ -1,7 +0,0 @@
|
|||||||
#pragma once
|
|
||||||
|
|
||||||
#include <Arduino.h>
|
|
||||||
|
|
||||||
void do_i2c_scanning();
|
|
||||||
|
|
||||||
const String i2c_scan();
|
|
||||||
21
src/Bus/i2c_bus.cpp
Normal file
21
src/Bus/i2c_bus.cpp
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
#include "Bus/BusScanner.h"
|
||||||
|
|
||||||
|
#include <Wire.h>
|
||||||
|
#include "Utils/PrintMessage.h"
|
||||||
|
|
||||||
|
static const char* MODULE = "I2C";
|
||||||
|
|
||||||
|
boolean I2CScanner::syncScan() {
|
||||||
|
Wire.begin();
|
||||||
|
pm.info("scanning i2c...");
|
||||||
|
size_t cnt = 0;
|
||||||
|
for (uint8_t i = 8; i < 120; i++) {
|
||||||
|
Wire.beginTransmission(i);
|
||||||
|
if (Wire.endTransmission() == 0) {
|
||||||
|
pm.info("found device: " + i);
|
||||||
|
addResult(i, i < 119);
|
||||||
|
cnt++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return cnt;
|
||||||
|
}
|
||||||
28
src/Bus/onewire_bus.cpp
Normal file
28
src/Bus/onewire_bus.cpp
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
#include "Bus/BusScanner.h"
|
||||||
|
|
||||||
|
#include "Utils/PresetUtils.h"
|
||||||
|
#include "Utils/PrintMessage.h"
|
||||||
|
|
||||||
|
#include <OneWire.h>
|
||||||
|
|
||||||
|
const char* MODULE = "1Wire";
|
||||||
|
|
||||||
|
bool OneWireScanner::syncScan() {
|
||||||
|
// Connect your 1-wire device to pin 3
|
||||||
|
OneWire ds(3);
|
||||||
|
uint8_t addr[8];
|
||||||
|
|
||||||
|
pm.info("scanning 1-Wire...");
|
||||||
|
while (ds.search(addr)) {
|
||||||
|
for (uint8_t i = 0; i < 8; i++) {
|
||||||
|
pm.info("found device: " + i);
|
||||||
|
addResult(addr[i], i < 7);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (OneWire::crc8(addr, 7) != addr[7]) {
|
||||||
|
pm.error("CRC!");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
ds.reset_search();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
20
src/Cmd.cpp
20
src/Cmd.cpp
@@ -606,15 +606,6 @@ void addCommandLoop(const String &cmdStr) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void loopCmd() {
|
|
||||||
if (order_loop.length()) {
|
|
||||||
String tmp = selectToMarker(order_loop, ","); //выделяем первую команду rel 5 1,
|
|
||||||
sCmd.readStr(tmp); //выполняем
|
|
||||||
pm.info("do: " + order_loop);
|
|
||||||
order_loop = deleteBeforeDelimiter(order_loop, ","); //осекаем
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void fileExecute(const String &filename) {
|
void fileExecute(const String &filename) {
|
||||||
String cmdStr = readFile(filename, 2048);
|
String cmdStr = readFile(filename, 2048);
|
||||||
cmdStr += "\r\n";
|
cmdStr += "\r\n";
|
||||||
@@ -639,4 +630,13 @@ void stringExecute(String &cmdStr) {
|
|||||||
sCmd.readStr(buf);
|
sCmd.readStr(buf);
|
||||||
cmdStr = deleteBeforeDelimiter(cmdStr, "\n");
|
cmdStr = deleteBeforeDelimiter(cmdStr, "\n");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void loopCmd() {
|
||||||
|
if (order_loop.length()) {
|
||||||
|
String tmp = selectToMarker(order_loop, ","); //выделяем первую команду rel 5 1,
|
||||||
|
sCmd.readStr(tmp); //выполняем
|
||||||
|
pm.info("do: " + order_loop);
|
||||||
|
order_loop = deleteBeforeDelimiter(order_loop, ","); //осекаем
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -64,13 +64,16 @@ int enter_to_logging_counter;
|
|||||||
// Scenario
|
// Scenario
|
||||||
int scenario_line_status[] = {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1};
|
int scenario_line_status[] = {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1};
|
||||||
|
|
||||||
String last_version = "";
|
String lastVersion = "";
|
||||||
|
|
||||||
// Async actions
|
// Async actions
|
||||||
boolean upgrade_url = false;
|
boolean upgrade_url = false;
|
||||||
boolean upgrade = false;
|
boolean upgrade = false;
|
||||||
|
|
||||||
boolean mqttParamsChanged = false;
|
boolean mqttParamsChanged = false;
|
||||||
boolean udp_data_parse = false;
|
boolean udp_data_parse = false;
|
||||||
boolean mqtt_send_settings_to_udp = false;
|
boolean mqtt_send_settings_to_udp = false;
|
||||||
boolean i2c_scanning = false;
|
|
||||||
boolean fscheck_flag = false;
|
BusScanner_t busToScan;
|
||||||
|
boolean busScanFlag = false;
|
||||||
|
boolean fsCheckFlag = false;
|
||||||
|
|||||||
@@ -9,6 +9,7 @@ namespace MqttClient {
|
|||||||
// Errors
|
// Errors
|
||||||
int wifi_lost_error = 0;
|
int wifi_lost_error = 0;
|
||||||
int mqtt_lost_error = 0;
|
int mqtt_lost_error = 0;
|
||||||
|
bool connected = false;
|
||||||
|
|
||||||
// Session params
|
// Session params
|
||||||
String mqttPrefix;
|
String mqttPrefix;
|
||||||
@@ -22,14 +23,20 @@ void init() {
|
|||||||
[&](void*) {
|
[&](void*) {
|
||||||
if (isNetworkActive()) {
|
if (isNetworkActive()) {
|
||||||
if (mqtt.connected()) {
|
if (mqtt.connected()) {
|
||||||
pm.info("OK");
|
if (!connected) {
|
||||||
setLedStatus(LED_OFF);
|
pm.info("OK");
|
||||||
|
setLedStatus(LED_OFF);
|
||||||
|
connected = true;
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
connect();
|
connect();
|
||||||
if (!just_load) mqtt_lost_error++;
|
if (!just_load) mqtt_lost_error++;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
pm.error("connection lost");
|
if (connected) {
|
||||||
|
pm.error("connection lost");
|
||||||
|
connected = false;
|
||||||
|
}
|
||||||
ts.remove(WIFI_MQTT_CONNECTION_CHECK);
|
ts.remove(WIFI_MQTT_CONNECTION_CHECK);
|
||||||
wifi_lost_error++;
|
wifi_lost_error++;
|
||||||
startAPMode();
|
startAPMode();
|
||||||
@@ -66,9 +73,6 @@ void subscribe() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
boolean connect() {
|
boolean connect() {
|
||||||
if (!isNetworkActive()) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
pm.info("connect");
|
pm.info("connect");
|
||||||
|
|
||||||
String addr = jsonReadStr(configSetupJson, "mqttServer");
|
String addr = jsonReadStr(configSetupJson, "mqttServer");
|
||||||
|
|||||||
78
src/MqttDiscovery.cpp
Normal file
78
src/MqttDiscovery.cpp
Normal file
@@ -0,0 +1,78 @@
|
|||||||
|
#include "MqttDiscovery.h"
|
||||||
|
|
||||||
|
namespace Discovery {
|
||||||
|
|
||||||
|
static const char* json_is_defined = "is_defined";
|
||||||
|
static const char* jsonId = "id";
|
||||||
|
static const char* jsonBatt = "batt";
|
||||||
|
static const char* jsonLux = "lux";
|
||||||
|
static const char* jsonPres = "pres";
|
||||||
|
static const char* jsonFer = "fer";
|
||||||
|
static const char* jsonMoi = "moi";
|
||||||
|
static const char* jsonHum = "hum";
|
||||||
|
static const char* jsonTemp = "tem";
|
||||||
|
static const char* jsonStep = "steps";
|
||||||
|
static const char* jsonWeight = "weight";
|
||||||
|
static const char* jsonPresence = "presence";
|
||||||
|
static const char* jsonAltim = "altim";
|
||||||
|
static const char* jsonAltif = "altift";
|
||||||
|
static const char* jsonTempf = "tempf";
|
||||||
|
static const char* jsonMsg = "message";
|
||||||
|
static const char* jsonVal = "value";
|
||||||
|
static const char* jsonVolt = "volt";
|
||||||
|
static const char* jsonCurrent = "current";
|
||||||
|
static const char* jsonPower = "power";
|
||||||
|
static const char* jsonGpio = "gpio";
|
||||||
|
static const char* jsonFtcd = "ftcd";
|
||||||
|
static const char* jsonWm2 = "wattsm2";
|
||||||
|
static const char* jsonAdc = "adc";
|
||||||
|
static const char* jsonPa = "pa";
|
||||||
|
|
||||||
|
const String getValueJson(const char* str) {
|
||||||
|
char buf[32];
|
||||||
|
sprintf(buf, "{{ value_json.%s }}", str);
|
||||||
|
return buf;
|
||||||
|
}
|
||||||
|
|
||||||
|
void createDiscovery(
|
||||||
|
char* unique_id,
|
||||||
|
const char* type, char* name, char* clazz,
|
||||||
|
char* value_template, char* payload_on, char* payload_off,
|
||||||
|
char* maasure_unit, int off_delay, char* has_payload, char* no_payload,
|
||||||
|
char* avail_topi, char* cmd_topic, char* state_topic, bool child) {
|
||||||
|
}
|
||||||
|
|
||||||
|
void createADC(const char* name) {
|
||||||
|
createDiscovery(
|
||||||
|
(char*)getUniqueId(name).c_str(),
|
||||||
|
"Type", "Name", "Clazz",
|
||||||
|
"Value", "Payload", "NoPayload",
|
||||||
|
"Measure", 0, "HasPayload", "NoPayload",
|
||||||
|
"", "", "", false);
|
||||||
|
}
|
||||||
|
|
||||||
|
void createSwitch(const char* name) {
|
||||||
|
createDiscovery(
|
||||||
|
(char*)getUniqueId(name).c_str(),
|
||||||
|
"Type", "Name", "Clazz",
|
||||||
|
"Value", "Payload", "NoPayload",
|
||||||
|
"Measure", 0, "HasPayload", "NoPayload",
|
||||||
|
"", "", "", false);
|
||||||
|
}
|
||||||
|
// component,
|
||||||
|
// type,
|
||||||
|
// name,
|
||||||
|
// availability topic,
|
||||||
|
// device class,
|
||||||
|
// value template, payload on, payload off, unit of measurement
|
||||||
|
char* BMEsensor[6][8] = {
|
||||||
|
{"sensor", "tempc", "bme", "temperature", "", "", "°C"}, //jsonTemp
|
||||||
|
{"sensor", "tempf", "bme", "temperature", "", "", "°F"}, //jsonTempf
|
||||||
|
{"sensor", "pa", "bme", "", "", "", "hPa"}, //jsonPa
|
||||||
|
{"sensor", "hum", "bme", "humidity", "", "", "%"}, // jsonHum
|
||||||
|
{"sensor", "altim", "bme", "", "", "", "m"}, //jsonAltim
|
||||||
|
{"sensor", "altift", "bme", "", "", "", "ft"} // jsonAltif
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace Discovery
|
||||||
@@ -1,21 +1,27 @@
|
|||||||
#include "Global.h"
|
#include "Global.h"
|
||||||
|
|
||||||
|
static const char* MODULE = "Scen";
|
||||||
|
|
||||||
void loopScenario() {
|
void loopScenario() {
|
||||||
if (jsonReadStr(configSetupJson, "scen") == "1") {
|
bool enabled = jsonReadBool(configSetupJson, "scen");
|
||||||
|
if (enabled) {
|
||||||
if ((jsonReadStr(configOptionJson, "scenario_status") != "")) {
|
if ((jsonReadStr(configOptionJson, "scenario_status") != "")) {
|
||||||
int i = 0;
|
String str = scenario;
|
||||||
String str = scenario; //читаем переменную с сценариями (то что из файла на странице)
|
|
||||||
str += "\n";
|
str += "\n";
|
||||||
str.replace("\r\n", "\n");
|
str.replace("\r\n", "\n");
|
||||||
str.replace("\r", "\n");
|
str.replace("\r", "\n");
|
||||||
while (str.length() != 0) {
|
|
||||||
//-----------------------------------------------------------------------------------------------------------------------
|
size_t i = 0;
|
||||||
String tmp = selectToMarker(str, "end"); //выделяем первый сценарий из файла вместе с командами
|
while (str.length()) {
|
||||||
if (tmp == "") return;
|
String block = selectToMarker(str, "end");
|
||||||
|
if (!block.length()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
i++;
|
i++;
|
||||||
|
|
||||||
if (scenario_line_status[i] == 1) {
|
if (scenario_line_status[i] == 1) {
|
||||||
String condition = selectToMarker(tmp, "\n"); //выделяем первую строку самого сценария button1 = 1 (условие)
|
//выделяем первую строку самого сценария button1 = 1 (условие)
|
||||||
|
String condition = selectToMarker(block, "\n");
|
||||||
String param_name = selectFromMarkerToMarker(condition, " ", 0);
|
String param_name = selectFromMarkerToMarker(condition, " ", 0);
|
||||||
String order = jsonReadStr(configOptionJson, "scenario_status"); //читаем весь файл событий
|
String order = jsonReadStr(configOptionJson, "scenario_status"); //читаем весь файл событий
|
||||||
String param = selectToMarker(order, ","); //читаем первое событие из файла событий
|
String param = selectToMarker(order, ","); //читаем первое событие из файла событий
|
||||||
@@ -52,11 +58,10 @@ void loopScenario() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (flag) {
|
if (flag) {
|
||||||
tmp = deleteBeforeDelimiter(tmp, "\n"); //удаляем строку самого сценария оставляя только команды
|
block = deleteBeforeDelimiter(block, "\n"); //удаляем строку самого сценария оставляя только команды
|
||||||
stringExecute(tmp); //выполняем все команды
|
stringExecute(block); //выполняем все команды
|
||||||
|
|
||||||
Serial.println("[SCENARIO] '" + condition + "'");
|
pm.info(condition + "'");
|
||||||
//Serial.println(" " + tmp);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -13,9 +13,10 @@ Adafruit_Sensor *bme_temp = bme.getTemperatureSensor();
|
|||||||
Adafruit_Sensor *bme_pressure = bme.getPressureSensor();
|
Adafruit_Sensor *bme_pressure = bme.getPressureSensor();
|
||||||
Adafruit_Sensor *bme_humidity = bme.getHumiditySensor();
|
Adafruit_Sensor *bme_humidity = bme.getHumiditySensor();
|
||||||
|
|
||||||
String perception(byte value);
|
const String perceptionStr(byte value);
|
||||||
|
const String comfortStr(ComfortState value);
|
||||||
|
|
||||||
void bmp280T_reading();
|
void bmp280T_reading();
|
||||||
String get_comfort_status(ComfortState cf);
|
|
||||||
|
|
||||||
void sensors_init() {
|
void sensors_init() {
|
||||||
ts.add(
|
ts.add(
|
||||||
@@ -240,9 +241,11 @@ void dallas() {
|
|||||||
String type = sCmd.next();
|
String type = sCmd.next();
|
||||||
String page_number = sCmd.next();
|
String page_number = sCmd.next();
|
||||||
oneWire = new OneWire((uint8_t)pin.toInt());
|
oneWire = new OneWire((uint8_t)pin.toInt());
|
||||||
|
|
||||||
sensors.setOneWire(oneWire);
|
sensors.setOneWire(oneWire);
|
||||||
sensors.begin();
|
sensors.begin();
|
||||||
sensors.setResolution(12);
|
sensors.setResolution(12);
|
||||||
|
|
||||||
createWidgetByType(widget_name, page_name, page_number, type, "dallas");
|
createWidgetByType(widget_name, page_name, page_number, type, "dallas");
|
||||||
sensors_reading_map[3] = 1;
|
sensors_reading_map[3] = 1;
|
||||||
}
|
}
|
||||||
@@ -351,7 +354,7 @@ void dhtP_reading() {
|
|||||||
MqttClient::publishStatus("dhtPerception", String(dht.getStatusString()));
|
MqttClient::publishStatus("dhtPerception", String(dht.getStatusString()));
|
||||||
} else {
|
} else {
|
||||||
value = dht.computePerception(jsonReadStr(configLiveJson, dhtT_value_name).toFloat(), jsonReadStr(configLiveJson, dhtH_value_name).toFloat(), false);
|
value = dht.computePerception(jsonReadStr(configLiveJson, dhtT_value_name).toFloat(), jsonReadStr(configLiveJson, dhtH_value_name).toFloat(), false);
|
||||||
String final_line = perception(value);
|
String final_line = perceptionStr(value);
|
||||||
jsonWriteStr(configLiveJson, "dhtPerception", final_line);
|
jsonWriteStr(configLiveJson, "dhtPerception", final_line);
|
||||||
eventGen("dhtPerception", "");
|
eventGen("dhtPerception", "");
|
||||||
MqttClient::publishStatus("dhtPerception", final_line);
|
MqttClient::publishStatus("dhtPerception", final_line);
|
||||||
@@ -361,7 +364,30 @@ void dhtP_reading() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
String perception(byte value) {
|
//dhtComfort Степень#комфорта: Датчики 3
|
||||||
|
void dhtC() {
|
||||||
|
String widget_name = sCmd.next();
|
||||||
|
String page_name = sCmd.next();
|
||||||
|
String page_number = sCmd.next();
|
||||||
|
createWidgetByType(widget_name, page_name, page_number, "anydata", "dhtComfort");
|
||||||
|
sensors_reading_map[7] = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
void dhtC_reading() {
|
||||||
|
ComfortState cf;
|
||||||
|
if (dht.getStatus() != 0) {
|
||||||
|
MqttClient::publishStatus("dhtComfort", String(dht.getStatusString()));
|
||||||
|
} else {
|
||||||
|
dht.getComfortRatio(cf, jsonReadStr(configLiveJson, dhtT_value_name).toFloat(), jsonReadStr(configLiveJson, dhtH_value_name).toFloat(), false);
|
||||||
|
String final_line = comfortStr(cf);
|
||||||
|
jsonWriteStr(configLiveJson, "dhtComfort", final_line);
|
||||||
|
eventGen("dhtComfort", "");
|
||||||
|
MqttClient::publishStatus("dhtComfort", final_line);
|
||||||
|
Serial.println("[I] sensor 'dhtComfort' send date " + final_line);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const String perceptionStr(byte value) {
|
||||||
String res;
|
String res;
|
||||||
switch (value) {
|
switch (value) {
|
||||||
case 0:
|
case 0:
|
||||||
@@ -386,7 +412,7 @@ String perception(byte value) {
|
|||||||
res = F("Очень неудобно");
|
res = F("Очень неудобно");
|
||||||
break;
|
break;
|
||||||
case 7:
|
case 7:
|
||||||
res = F("Сильно неудобно, полный звиздец");
|
res = F("Невыносимо");
|
||||||
default:
|
default:
|
||||||
res = F("Unknown");
|
res = F("Unknown");
|
||||||
break;
|
break;
|
||||||
@@ -394,64 +420,41 @@ String perception(byte value) {
|
|||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
//dhtComfort Степень#комфорта: Датчики 3
|
const String comfortStr(ComfortState value) {
|
||||||
void dhtC() {
|
String res;
|
||||||
String widget_name = sCmd.next();
|
switch (value) {
|
||||||
String page_name = sCmd.next();
|
|
||||||
String page_number = sCmd.next();
|
|
||||||
createWidgetByType(widget_name, page_name, page_number, "anydata", "dhtComfort");
|
|
||||||
sensors_reading_map[7] = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
void dhtC_reading() {
|
|
||||||
ComfortState cf;
|
|
||||||
if (dht.getStatus() != 0) {
|
|
||||||
MqttClient::publishStatus("dhtComfort", String(dht.getStatusString()));
|
|
||||||
} else {
|
|
||||||
dht.getComfortRatio(cf, jsonReadStr(configLiveJson, dhtT_value_name).toFloat(), jsonReadStr(configLiveJson, dhtH_value_name).toFloat(), false);
|
|
||||||
String final_line = get_comfort_status(cf);
|
|
||||||
jsonWriteStr(configLiveJson, "dhtComfort", final_line);
|
|
||||||
eventGen("dhtComfort", "");
|
|
||||||
MqttClient::publishStatus("dhtComfort", final_line);
|
|
||||||
Serial.println("[I] sensor 'dhtComfort' send date " + final_line);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
String get_comfort_status(ComfortState cf) {
|
|
||||||
String comfortStatus;
|
|
||||||
switch (cf) {
|
|
||||||
case Comfort_OK:
|
case Comfort_OK:
|
||||||
comfortStatus = "Отлично";
|
res = F("Отлично");
|
||||||
break;
|
break;
|
||||||
case Comfort_TooHot:
|
case Comfort_TooHot:
|
||||||
comfortStatus = "Очень жарко";
|
res = F("Очень жарко");
|
||||||
break;
|
break;
|
||||||
case Comfort_TooCold:
|
case Comfort_TooCold:
|
||||||
comfortStatus = "Очень холодно";
|
res = F("Очень холодно");
|
||||||
break;
|
break;
|
||||||
case Comfort_TooDry:
|
case Comfort_TooDry:
|
||||||
comfortStatus = "Очень сухо";
|
res = F("Очень сухо");
|
||||||
break;
|
break;
|
||||||
case Comfort_TooHumid:
|
case Comfort_TooHumid:
|
||||||
comfortStatus = "Очень влажно";
|
res = F("Очень влажно");
|
||||||
break;
|
break;
|
||||||
case Comfort_HotAndHumid:
|
case Comfort_HotAndHumid:
|
||||||
comfortStatus = "Жарко и влажно";
|
res = F("Жарко и влажно");
|
||||||
break;
|
break;
|
||||||
case Comfort_HotAndDry:
|
case Comfort_HotAndDry:
|
||||||
comfortStatus = "Жарко и сухо";
|
res = F("Жарко и сухо");
|
||||||
break;
|
break;
|
||||||
case Comfort_ColdAndHumid:
|
case Comfort_ColdAndHumid:
|
||||||
comfortStatus = "Холодно и влажно";
|
res = F("Холодно и влажно");
|
||||||
break;
|
break;
|
||||||
case Comfort_ColdAndDry:
|
case Comfort_ColdAndDry:
|
||||||
comfortStatus = "Холодно и сухо";
|
res = F("Холодно и сухо");
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
comfortStatus = "Неизвестно";
|
res = F("Неизвестно");
|
||||||
break;
|
break;
|
||||||
};
|
};
|
||||||
return comfortStatus;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
//dhtDewpoint Точка#росы: Датчики 5
|
//dhtDewpoint Точка#росы: Датчики 5
|
||||||
|
|||||||
@@ -1,30 +1,42 @@
|
|||||||
|
#include "Upgrade.h"
|
||||||
|
|
||||||
#include "Global.h"
|
#include "Global.h"
|
||||||
|
|
||||||
void init_updater() {
|
static const char* MODULE = "Upgr";
|
||||||
#ifdef ESP8266
|
|
||||||
if (WiFi.status() == WL_CONNECTED) last_version = getURL("http://91.204.228.124:1100/update/esp8266/version.txt");
|
static const char* filesystem_image_url PROGMEM = "http://91.204.228.124:1100/update/%s/fs.bin";
|
||||||
#endif
|
static const char* available_url PROGMEM = "http://91.204.228.124:1100/update/%s/version.txt";
|
||||||
#ifdef ESP32
|
|
||||||
if (WiFi.status() == WL_CONNECTED) last_version = getURL("http://91.204.228.124:1100/update/esp32/version.txt");
|
const String getAvailableUrl(const char* mcu) {
|
||||||
#endif
|
char buf[128];
|
||||||
jsonWriteStr(configSetupJson, "last_version", last_version);
|
sprintf_P(buf, available_url, mcu);
|
||||||
Serial.print("[I] Last firmware version: ");
|
return buf;
|
||||||
Serial.println(last_version);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void do_upgrade_url() {
|
void getLastVersion() {
|
||||||
if (upgrade_url) {
|
if (upgrade_url) {
|
||||||
upgrade_url = false;
|
upgrade_url = false;
|
||||||
|
String url;
|
||||||
#ifdef ESP32
|
#ifdef ESP32
|
||||||
last_version = getURL("http://91.204.228.124:1100/update/esp32/version.txt");
|
url = getAvailableUrl("esp32");
|
||||||
#endif
|
#endif
|
||||||
#ifdef ESP8266
|
#ifdef ESP8266
|
||||||
last_version = getURL("http://91.204.228.124:1100/update/esp8266/version.txt");
|
url = getAvailableUrl("esp8266");
|
||||||
#endif
|
#endif
|
||||||
jsonWriteStr(configSetupJson, "last_version", last_version);
|
lastVersion = getURL(url);
|
||||||
|
jsonWriteStr(configSetupJson, "last_version", lastVersion);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void initUpdater() {
|
||||||
|
if (isNetworkActive()) {
|
||||||
|
getLastVersion();
|
||||||
|
if (lastVersion.length()) {
|
||||||
|
pm.info("available: " + lastVersion);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
void upgrade_firmware() {
|
void upgrade_firmware() {
|
||||||
String scenario_for_update;
|
String scenario_for_update;
|
||||||
String config_for_update;
|
String config_for_update;
|
||||||
@@ -77,7 +89,7 @@ void upgrade_firmware() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void do_upgrade() {
|
void flashUpgrade() {
|
||||||
if (upgrade) {
|
if (upgrade) {
|
||||||
upgrade = false;
|
upgrade = false;
|
||||||
upgrade_firmware();
|
upgrade_firmware();
|
||||||
|
|||||||
@@ -1,6 +1,10 @@
|
|||||||
#include "Utils/SysUtils.h"
|
#include "Utils/SysUtils.h"
|
||||||
|
|
||||||
#include "Utils/StringUtils.h"
|
#include "Global.h"
|
||||||
|
|
||||||
|
const String getUniqueId(const char* name) {
|
||||||
|
return String(name) + getMacAddress();
|
||||||
|
}
|
||||||
|
|
||||||
const String getChipId() {
|
const String getChipId() {
|
||||||
String res;
|
String res;
|
||||||
@@ -62,6 +66,19 @@ String getHeapStats() {
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
const String getMacAddress() {
|
||||||
|
uint8_t mac[6];
|
||||||
|
char buf[13] = {0};
|
||||||
|
#if defined(ESP8266)
|
||||||
|
WiFi.macAddress(mac);
|
||||||
|
sprintf(buf, MACSTR, MAC2STR(mac));
|
||||||
|
#else
|
||||||
|
esp_read_mac(mac, ESP_MAC_WIFI_STA);
|
||||||
|
sprintf(buf, MACSTR, mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]);
|
||||||
|
#endif
|
||||||
|
return String(buf);
|
||||||
|
}
|
||||||
|
|
||||||
//===================================================================
|
//===================================================================
|
||||||
/*
|
/*
|
||||||
void web_print (String text) {
|
void web_print (String text) {
|
||||||
|
|||||||
@@ -4,6 +4,7 @@
|
|||||||
#include "Utils\StringUtils.h"
|
#include "Utils\StringUtils.h"
|
||||||
|
|
||||||
#define ONE_MINUTE_s 60
|
#define ONE_MINUTE_s 60
|
||||||
|
#define ONE_HOUR_m 60
|
||||||
#define ONE_HOUR_s 60 * ONE_MINUTE_s
|
#define ONE_HOUR_s 60 * ONE_MINUTE_s
|
||||||
|
|
||||||
time_t t;
|
time_t t;
|
||||||
@@ -13,22 +14,20 @@ String getTimeUnix() {
|
|||||||
t = time(NULL);
|
t = time(NULL);
|
||||||
tm = localtime(&t);
|
tm = localtime(&t);
|
||||||
Serial.printf("%04d/%02d/%02d(%s) %02d:%02d:%02d\n",
|
Serial.printf("%04d/%02d/%02d(%s) %02d:%02d:%02d\n",
|
||||||
tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday,
|
tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday, wd[tm->tm_wday],
|
||||||
wd[tm->tm_wday],
|
|
||||||
tm->tm_hour, tm->tm_min, tm->tm_sec);
|
tm->tm_hour, tm->tm_min, tm->tm_sec);
|
||||||
delay(1000);
|
delay(1000);
|
||||||
time_t now = time(nullptr);
|
time_t now = time(nullptr);
|
||||||
if (now < 30000) {
|
if (now < 30000) {
|
||||||
return "failed";
|
return "failed";
|
||||||
} else {
|
|
||||||
return String(now);
|
|
||||||
}
|
}
|
||||||
|
return String(now);
|
||||||
}
|
}
|
||||||
|
|
||||||
boolean getUnixTimeStr(String& res) {
|
boolean getUnixTimeStr(String& res) {
|
||||||
time_t now = time(nullptr);
|
time_t now = time(nullptr);
|
||||||
res = String(now);
|
res = String(now);
|
||||||
return now < 30000;
|
return now > 30000;
|
||||||
}
|
}
|
||||||
|
|
||||||
String getTime() {
|
String getTime() {
|
||||||
@@ -158,3 +157,11 @@ unsigned long millis_passed(unsigned long start, unsigned long finish) {
|
|||||||
}
|
}
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int getOffsetInSeconds(int timezone) {
|
||||||
|
return getOffsetInMinutes(timezone) * ONE_MINUTE_s;
|
||||||
|
}
|
||||||
|
|
||||||
|
int getOffsetInMinutes(int timezone) {
|
||||||
|
return timezone * ONE_HOUR_m;
|
||||||
|
}
|
||||||
|
|||||||
@@ -1,30 +0,0 @@
|
|||||||
#include "Utils/i2c_bus.h"
|
|
||||||
|
|
||||||
#include "Global.h"
|
|
||||||
|
|
||||||
void do_i2c_scanning() {
|
|
||||||
String tmp = i2c_scan();
|
|
||||||
if (tmp == "error") {
|
|
||||||
tmp = i2c_scan();
|
|
||||||
}
|
|
||||||
jsonWriteStr(configLiveJson, "i2c", tmp);
|
|
||||||
}
|
|
||||||
|
|
||||||
const String i2c_scan() {
|
|
||||||
String out;
|
|
||||||
byte count = 0;
|
|
||||||
Wire.begin();
|
|
||||||
for (byte i = 8; i < 120; i++) {
|
|
||||||
Wire.beginTransmission(i);
|
|
||||||
if (Wire.endTransmission() == 0) {
|
|
||||||
count++;
|
|
||||||
out += String(count) + ". 0x" + String(i, HEX) + "; ";
|
|
||||||
delay(1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (count == 0) {
|
|
||||||
return "error";
|
|
||||||
} else {
|
|
||||||
return out;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
31
src/Web.cpp
31
src/Web.cpp
@@ -219,37 +219,44 @@ void web_init() {
|
|||||||
#endif
|
#endif
|
||||||
//==============================utilities settings=============================================
|
//==============================utilities settings=============================================
|
||||||
if (request->hasArg("itoc")) {
|
if (request->hasArg("itoc")) {
|
||||||
i2c_scanning = true;
|
busScanFlag = true;
|
||||||
|
busToScan = BS_I2C;
|
||||||
|
request->redirect("/?set.utilities");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (request->hasArg("onewire")) {
|
||||||
|
busScanFlag = true;
|
||||||
|
busToScan = BS_ONE_WIRE;
|
||||||
request->redirect("/?set.utilities");
|
request->redirect("/?set.utilities");
|
||||||
}
|
}
|
||||||
|
|
||||||
if (request->hasArg("fscheck")) {
|
if (request->hasArg("fscheck")) {
|
||||||
fscheck_flag = true;
|
fsCheckFlag = true;
|
||||||
request->redirect("/?set.utilities");
|
request->redirect("/?set.utilities");
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
//==============================upgrade settings=============================================
|
//==============================upgrade settings=============================================
|
||||||
server.on("/check", HTTP_GET, [](AsyncWebServerRequest* request) {
|
server.on("/check", HTTP_GET, [](AsyncWebServerRequest* request) {
|
||||||
upgrade_url = true;
|
upgrade_url = true;
|
||||||
pm.info("firmware version: " + last_version);
|
pm.info("firmware version: " + lastVersion);
|
||||||
String tmp = "{}";
|
String tmp = "{}";
|
||||||
int case_of_update;
|
int case_of_update;
|
||||||
|
|
||||||
if (WiFi.status() != WL_CONNECTED) {
|
if (WiFi.status() != WL_CONNECTED) {
|
||||||
last_version = "nowifi";
|
lastVersion = "nowifi";
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!FLASH_4MB) {
|
if (!FLASH_4MB) {
|
||||||
last_version = "less";
|
lastVersion = "less";
|
||||||
}
|
}
|
||||||
|
|
||||||
if (last_version == FIRMWARE_VERSION) case_of_update = 1;
|
if (lastVersion == FIRMWARE_VERSION) case_of_update = 1;
|
||||||
if (last_version != FIRMWARE_VERSION) case_of_update = 2;
|
if (lastVersion != FIRMWARE_VERSION) case_of_update = 2;
|
||||||
if (last_version == "error") case_of_update = 3;
|
if (lastVersion == "error") case_of_update = 3;
|
||||||
if (last_version == "") case_of_update = 4;
|
if (lastVersion == "") case_of_update = 4;
|
||||||
if (last_version == "less") case_of_update = 5;
|
if (lastVersion == "less") case_of_update = 5;
|
||||||
if (last_version == "nowifi") case_of_update = 6;
|
if (lastVersion == "nowifi") case_of_update = 6;
|
||||||
if (last_version == "notsupported") case_of_update = 7;
|
if (lastVersion == "notsupported") case_of_update = 7;
|
||||||
|
|
||||||
switch (case_of_update) {
|
switch (case_of_update) {
|
||||||
case 1: {
|
case 1: {
|
||||||
|
|||||||
37
src/main.cpp
37
src/main.cpp
@@ -1,7 +1,8 @@
|
|||||||
#include "Global.h"
|
#include "Global.h"
|
||||||
|
|
||||||
#include "HttpServer.h"
|
#include "HttpServer.h"
|
||||||
#include "Utils/i2c_bus.h"
|
#include "Bus/BusScanner.h"
|
||||||
|
#include "Utils/Timings.h"
|
||||||
|
|
||||||
void not_async_actions();
|
void not_async_actions();
|
||||||
|
|
||||||
@@ -48,7 +49,7 @@ void setup() {
|
|||||||
telemetry_init();
|
telemetry_init();
|
||||||
|
|
||||||
pm.info("Updater");
|
pm.info("Updater");
|
||||||
init_updater();
|
initUpdater();
|
||||||
|
|
||||||
pm.info("HttpServer");
|
pm.info("HttpServer");
|
||||||
HttpServer::init();
|
HttpServer::init();
|
||||||
@@ -84,22 +85,27 @@ void saveConfig() {
|
|||||||
writeFile(String("config.json"), configSetupJson);
|
writeFile(String("config.json"), configSetupJson);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Timings metric;
|
||||||
|
|
||||||
void loop() {
|
void loop() {
|
||||||
#ifdef OTA_UPDATES_ENABLED
|
#ifdef OTA_UPDATES_ENABLED
|
||||||
ArduinoOTA.handle();
|
ArduinoOTA.handle();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef WS_enable
|
#ifdef WS_enable
|
||||||
ws.cleanupClients();
|
ws.cleanupClients();
|
||||||
#endif
|
#endif
|
||||||
|
metric.add(MT_ONE);
|
||||||
not_async_actions();
|
not_async_actions();
|
||||||
|
|
||||||
|
metric.add(MT_TWO);
|
||||||
MqttClient::loop();
|
MqttClient::loop();
|
||||||
|
|
||||||
loopCmd();
|
loopCmd();
|
||||||
|
|
||||||
loopButton();
|
loopButton();
|
||||||
|
|
||||||
loopScenario();
|
loopScenario();
|
||||||
|
|
||||||
#ifdef UDP_ENABLED
|
#ifdef UDP_ENABLED
|
||||||
loopUdp();
|
loopUdp();
|
||||||
#endif
|
#endif
|
||||||
@@ -107,6 +113,12 @@ void loop() {
|
|||||||
loopSerial();
|
loopSerial();
|
||||||
|
|
||||||
ts.update();
|
ts.update();
|
||||||
|
|
||||||
|
if (metric._counter > 100000) {
|
||||||
|
metric.print();
|
||||||
|
} else {
|
||||||
|
metric.count();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void not_async_actions() {
|
void not_async_actions() {
|
||||||
@@ -114,24 +126,27 @@ void not_async_actions() {
|
|||||||
MqttClient::reconnect();
|
MqttClient::reconnect();
|
||||||
mqttParamsChanged = false;
|
mqttParamsChanged = false;
|
||||||
}
|
}
|
||||||
do_upgrade_url();
|
getLastVersion();
|
||||||
do_upgrade();
|
flashUpgrade();
|
||||||
|
|
||||||
#ifdef UDP_ENABLED
|
#ifdef UDP_ENABLED
|
||||||
do_udp_data_parse();
|
do_udp_data_parse();
|
||||||
do_mqtt_send_settings_to_udp();
|
do_mqtt_send_settings_to_udp();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (i2c_scanning) {
|
if (busScanFlag) {
|
||||||
do_i2c_scanning();
|
String res = "";
|
||||||
i2c_scanning = false;
|
BusScanner* scanner = BusScannerFactory::get(res, busToScan);
|
||||||
|
scanner->scan();
|
||||||
|
jsonWriteStr(configLiveJson, BusScannerFactory::label(busToScan), res);
|
||||||
|
busScanFlag = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (fscheck_flag) {
|
if (fsCheckFlag) {
|
||||||
String buf;
|
String buf;
|
||||||
do_fscheck(buf);
|
do_fscheck(buf);
|
||||||
jsonWriteStr(configLiveJson, "fscheck", buf);
|
jsonWriteStr(configLiveJson, "fscheck", buf);
|
||||||
fscheck_flag = false;
|
fsCheckFlag = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user