mirror of
https://github.com/IoTManagerProject/IoTManager.git
synced 2026-03-30 20:09:14 +03:00
@@ -29,7 +29,8 @@ homeDir = os.path.expanduser('~')
|
|||||||
os.system(homeDir + "\.platformio\penv\Scripts\pio run")
|
os.system(homeDir + "\.platformio\penv\Scripts\pio run")
|
||||||
os.system(homeDir + "\.platformio\penv\Scripts\pio run -t buildfs --disable-auto-clean")
|
os.system(homeDir + "\.platformio\penv\Scripts\pio run -t buildfs --disable-auto-clean")
|
||||||
|
|
||||||
if copyFileIfExist("firmware.bin", deviceName) and copyFileIfExist("littlefs.bin", deviceName) and copyFileIfExist("partitions.bin", deviceName):
|
if copyFileIfExist("firmware.bin", deviceName) and copyFileIfExist("littlefs.bin", deviceName):
|
||||||
|
copyFileIfExist("partitions.bin", deviceName)
|
||||||
versionsJson = json.loads('{"' + deviceName + '": {"0": "400"}}')
|
versionsJson = json.loads('{"' + deviceName + '": {"0": "400"}}')
|
||||||
with open("iotm/ver.json", "w", encoding='utf-8') as write_file:
|
with open("iotm/ver.json", "w", encoding='utf-8') as write_file:
|
||||||
json.dump(versionsJson, write_file, ensure_ascii=False, indent=4, sort_keys=False)
|
json.dump(versionsJson, write_file, ensure_ascii=False, indent=4, sort_keys=False)
|
||||||
|
|||||||
@@ -257,7 +257,7 @@
|
|||||||
"name": "17. BME280 Температура",
|
"name": "17. BME280 Температура",
|
||||||
"type": "Reading",
|
"type": "Reading",
|
||||||
"subtype": "Bme280t",
|
"subtype": "Bme280t",
|
||||||
"id": "tmp3",
|
"id": "Tmp3",
|
||||||
"widget": "anydataTmp",
|
"widget": "anydataTmp",
|
||||||
"page": "Сенсоры",
|
"page": "Сенсоры",
|
||||||
"descr": "Температура",
|
"descr": "Температура",
|
||||||
@@ -296,7 +296,21 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"global": 0,
|
"global": 0,
|
||||||
"name": "20. BMP280 Температура",
|
"name": "20. BME280 Tочка росы",
|
||||||
|
"type": "Reading",
|
||||||
|
"subtype": "Bme280dp",
|
||||||
|
"id": "Dew3",
|
||||||
|
"widget": "anydataTmp",
|
||||||
|
"page": "Сенсоры",
|
||||||
|
"descr": "Точка росы",
|
||||||
|
"int": 15,
|
||||||
|
"addr": "0x77",
|
||||||
|
"round": 1,
|
||||||
|
"num": 20
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"global": 0,
|
||||||
|
"name": "21. BMP280 Температура",
|
||||||
"type": "Reading",
|
"type": "Reading",
|
||||||
"subtype": "Bmp280t",
|
"subtype": "Bmp280t",
|
||||||
"id": "tmp3",
|
"id": "tmp3",
|
||||||
@@ -306,11 +320,11 @@
|
|||||||
"int": 15,
|
"int": 15,
|
||||||
"addr": "0x77",
|
"addr": "0x77",
|
||||||
"round": 1,
|
"round": 1,
|
||||||
"num": 20
|
"num": 21
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"global": 0,
|
"global": 0,
|
||||||
"name": "21. BMP280 Давление",
|
"name": "22. BMP280 Давление",
|
||||||
"type": "Reading",
|
"type": "Reading",
|
||||||
"subtype": "Bmp280p",
|
"subtype": "Bmp280p",
|
||||||
"id": "Press3",
|
"id": "Press3",
|
||||||
@@ -320,11 +334,11 @@
|
|||||||
"int": 15,
|
"int": 15,
|
||||||
"addr": "0x77",
|
"addr": "0x77",
|
||||||
"round": 1,
|
"round": 1,
|
||||||
"num": 21
|
"num": 22
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"global": 0,
|
"global": 0,
|
||||||
"name": "22. DHT11 Температура",
|
"name": "23. DHT11 Температура",
|
||||||
"type": "Reading",
|
"type": "Reading",
|
||||||
"subtype": "Dht1122t",
|
"subtype": "Dht1122t",
|
||||||
"id": "tmp3",
|
"id": "tmp3",
|
||||||
@@ -334,11 +348,11 @@
|
|||||||
"int": 15,
|
"int": 15,
|
||||||
"pin": 0,
|
"pin": 0,
|
||||||
"senstype": "dht11",
|
"senstype": "dht11",
|
||||||
"num": 22
|
"num": 23
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"global": 0,
|
"global": 0,
|
||||||
"name": "23. DHT11 Влажность",
|
"name": "24. DHT11 Влажность",
|
||||||
"type": "Reading",
|
"type": "Reading",
|
||||||
"subtype": "Dht1122h",
|
"subtype": "Dht1122h",
|
||||||
"id": "Hum3",
|
"id": "Hum3",
|
||||||
@@ -348,11 +362,11 @@
|
|||||||
"int": 15,
|
"int": 15,
|
||||||
"pin": 0,
|
"pin": 0,
|
||||||
"senstype": "dht11",
|
"senstype": "dht11",
|
||||||
"num": 23
|
"num": 24
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"global": 0,
|
"global": 0,
|
||||||
"name": "24. DS18B20 Температура",
|
"name": "25. DS18B20 Температура",
|
||||||
"type": "Reading",
|
"type": "Reading",
|
||||||
"subtype": "Ds18b20",
|
"subtype": "Ds18b20",
|
||||||
"id": "dstmp",
|
"id": "dstmp",
|
||||||
@@ -364,11 +378,11 @@
|
|||||||
"index": 0,
|
"index": 0,
|
||||||
"addr": "",
|
"addr": "",
|
||||||
"round": 1,
|
"round": 1,
|
||||||
"num": 24
|
"num": 25
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"global": 0,
|
"global": 0,
|
||||||
"name": "25. PZEM 004t Напряжение",
|
"name": "26. PZEM 004t Напряжение",
|
||||||
"type": "Reading",
|
"type": "Reading",
|
||||||
"subtype": "Pzem004v",
|
"subtype": "Pzem004v",
|
||||||
"id": "v",
|
"id": "v",
|
||||||
@@ -378,11 +392,11 @@
|
|||||||
"int": 15,
|
"int": 15,
|
||||||
"addr": "0xF8",
|
"addr": "0xF8",
|
||||||
"round": 1,
|
"round": 1,
|
||||||
"num": 25
|
"num": 26
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"global": 0,
|
"global": 0,
|
||||||
"name": "26. PZEM 004t Сила тока",
|
"name": "27. PZEM 004t Сила тока",
|
||||||
"type": "Reading",
|
"type": "Reading",
|
||||||
"subtype": "Pzem004a",
|
"subtype": "Pzem004a",
|
||||||
"id": "a",
|
"id": "a",
|
||||||
@@ -392,11 +406,11 @@
|
|||||||
"int": 15,
|
"int": 15,
|
||||||
"addr": "0xF8",
|
"addr": "0xF8",
|
||||||
"round": 1,
|
"round": 1,
|
||||||
"num": 26
|
"num": 27
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"global": 0,
|
"global": 0,
|
||||||
"name": "27. PZEM 004t Мощность",
|
"name": "28. PZEM 004t Мощность",
|
||||||
"type": "Reading",
|
"type": "Reading",
|
||||||
"subtype": "Pzem004w",
|
"subtype": "Pzem004w",
|
||||||
"id": "w",
|
"id": "w",
|
||||||
@@ -406,11 +420,11 @@
|
|||||||
"int": 15,
|
"int": 15,
|
||||||
"addr": "0xF8",
|
"addr": "0xF8",
|
||||||
"round": 1,
|
"round": 1,
|
||||||
"num": 27
|
"num": 28
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"global": 0,
|
"global": 0,
|
||||||
"name": "28. PZEM 004t Энергия",
|
"name": "29. PZEM 004t Энергия",
|
||||||
"type": "Reading",
|
"type": "Reading",
|
||||||
"subtype": "Pzem004wh",
|
"subtype": "Pzem004wh",
|
||||||
"id": "wh",
|
"id": "wh",
|
||||||
@@ -420,11 +434,11 @@
|
|||||||
"int": 15,
|
"int": 15,
|
||||||
"addr": "0xF8",
|
"addr": "0xF8",
|
||||||
"round": 1,
|
"round": 1,
|
||||||
"num": 28
|
"num": 29
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"global": 0,
|
"global": 0,
|
||||||
"name": "29. PZEM 004t Частота",
|
"name": "30. PZEM 004t Частота",
|
||||||
"type": "Reading",
|
"type": "Reading",
|
||||||
"subtype": "Pzem004hz",
|
"subtype": "Pzem004hz",
|
||||||
"id": "hz",
|
"id": "hz",
|
||||||
@@ -434,11 +448,11 @@
|
|||||||
"int": 15,
|
"int": 15,
|
||||||
"addr": "0xF8",
|
"addr": "0xF8",
|
||||||
"round": 1,
|
"round": 1,
|
||||||
"num": 29
|
"num": 30
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"global": 0,
|
"global": 0,
|
||||||
"name": "30. PZEM 004t Косинус",
|
"name": "31. PZEM 004t Косинус",
|
||||||
"type": "Reading",
|
"type": "Reading",
|
||||||
"subtype": "Pzem004pf",
|
"subtype": "Pzem004pf",
|
||||||
"id": "pf",
|
"id": "pf",
|
||||||
@@ -448,11 +462,11 @@
|
|||||||
"int": 15,
|
"int": 15,
|
||||||
"addr": "0xF8",
|
"addr": "0xF8",
|
||||||
"round": 1,
|
"round": 1,
|
||||||
"num": 30
|
"num": 31
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"global": 0,
|
"global": 0,
|
||||||
"name": "31. PZEM настройка",
|
"name": "32. PZEM настройка",
|
||||||
"type": "Reading",
|
"type": "Reading",
|
||||||
"subtype": "Pzem004cmd",
|
"subtype": "Pzem004cmd",
|
||||||
"id": "set",
|
"id": "set",
|
||||||
@@ -464,11 +478,31 @@
|
|||||||
"changeaddr": 0,
|
"changeaddr": 0,
|
||||||
"setaddr": "0x01",
|
"setaddr": "0x01",
|
||||||
"reset": 0,
|
"reset": 0,
|
||||||
"num": 31
|
"num": 32
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"global": 0,
|
"global": 0,
|
||||||
"name": "32. Sht20 Температура",
|
"name": "33. Часы реального времени",
|
||||||
|
"type": "Reading",
|
||||||
|
"subtype": "RTC",
|
||||||
|
"id": "rtc",
|
||||||
|
"widget": "anydataDef",
|
||||||
|
"page": "Таймеры",
|
||||||
|
"descr": "Время RTC",
|
||||||
|
"chipCode": 1,
|
||||||
|
"timeFormat": "d-m-Y H:i:s",
|
||||||
|
"RST": -1,
|
||||||
|
"CLK": -1,
|
||||||
|
"DAT": -1,
|
||||||
|
"ticker": 0,
|
||||||
|
"int": 5,
|
||||||
|
"btn-setUTime": "0",
|
||||||
|
"btn-setSysTime": "nil",
|
||||||
|
"num": 33
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"global": 0,
|
||||||
|
"name": "34. Sht20 Температура",
|
||||||
"type": "Reading",
|
"type": "Reading",
|
||||||
"subtype": "Sht20t",
|
"subtype": "Sht20t",
|
||||||
"id": "tmp2",
|
"id": "tmp2",
|
||||||
@@ -477,11 +511,11 @@
|
|||||||
"descr": "Температура",
|
"descr": "Температура",
|
||||||
"int": 15,
|
"int": 15,
|
||||||
"round": 1,
|
"round": 1,
|
||||||
"num": 32
|
"num": 34
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"global": 0,
|
"global": 0,
|
||||||
"name": "33. Sht20 Влажность",
|
"name": "35. Sht20 Влажность",
|
||||||
"type": "Reading",
|
"type": "Reading",
|
||||||
"subtype": "Sht20h",
|
"subtype": "Sht20h",
|
||||||
"id": "Hum2",
|
"id": "Hum2",
|
||||||
@@ -490,11 +524,11 @@
|
|||||||
"descr": "Влажность",
|
"descr": "Влажность",
|
||||||
"int": 15,
|
"int": 15,
|
||||||
"round": 1,
|
"round": 1,
|
||||||
"num": 33
|
"num": 35
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"global": 0,
|
"global": 0,
|
||||||
"name": "34. Sht30 Температура",
|
"name": "36. Sht30 Температура",
|
||||||
"type": "Reading",
|
"type": "Reading",
|
||||||
"subtype": "Sht30t",
|
"subtype": "Sht30t",
|
||||||
"id": "tmp30",
|
"id": "tmp30",
|
||||||
@@ -503,11 +537,11 @@
|
|||||||
"descr": "SHT30 Температура",
|
"descr": "SHT30 Температура",
|
||||||
"int": 15,
|
"int": 15,
|
||||||
"round": 1,
|
"round": 1,
|
||||||
"num": 34
|
"num": 36
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"global": 0,
|
"global": 0,
|
||||||
"name": "35. Sht30 Влажность",
|
"name": "37. Sht30 Влажность",
|
||||||
"type": "Reading",
|
"type": "Reading",
|
||||||
"subtype": "Sht30h",
|
"subtype": "Sht30h",
|
||||||
"id": "Hum30",
|
"id": "Hum30",
|
||||||
@@ -516,12 +550,12 @@
|
|||||||
"descr": "SHT30 Влажность",
|
"descr": "SHT30 Влажность",
|
||||||
"int": 15,
|
"int": 15,
|
||||||
"round": 1,
|
"round": 1,
|
||||||
"num": 35
|
"num": 37
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"global": 0,
|
"global": 0,
|
||||||
"name": "36. HC-SR04 Ультразвуковой дальномер",
|
"name": "38. HC-SR04 Ультразвуковой дальномер",
|
||||||
"num": 36,
|
"num": 38,
|
||||||
"type": "Reading",
|
"type": "Reading",
|
||||||
"subtype": "Sonar",
|
"subtype": "Sonar",
|
||||||
"id": "sonar",
|
"id": "sonar",
|
||||||
@@ -533,7 +567,7 @@
|
|||||||
"int": 5
|
"int": 5
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "37. UART",
|
"name": "39. UART",
|
||||||
"type": "Reading",
|
"type": "Reading",
|
||||||
"subtype": "UART",
|
"subtype": "UART",
|
||||||
"page": "",
|
"page": "",
|
||||||
@@ -545,14 +579,14 @@
|
|||||||
"line": 2,
|
"line": 2,
|
||||||
"speed": 9600,
|
"speed": 9600,
|
||||||
"eventFormat": 0,
|
"eventFormat": 0,
|
||||||
"num": 37
|
"num": 39
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"header": "Исполнительные устройства"
|
"header": "Исполнительные устройства"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"global": 0,
|
"global": 0,
|
||||||
"name": "38. Кнопка подключенная к пину",
|
"name": "40. Кнопка подключенная к пину",
|
||||||
"type": "Writing",
|
"type": "Writing",
|
||||||
"subtype": "ButtonIn",
|
"subtype": "ButtonIn",
|
||||||
"id": "btn",
|
"id": "btn",
|
||||||
@@ -566,11 +600,12 @@
|
|||||||
"pinMode": "INPUT",
|
"pinMode": "INPUT",
|
||||||
"debounceDelay": 50,
|
"debounceDelay": 50,
|
||||||
"fixState": 0,
|
"fixState": 0,
|
||||||
"num": 38
|
"inv": 0,
|
||||||
|
"num": 40
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"global": 0,
|
"global": 0,
|
||||||
"name": "39. Управление пином",
|
"name": "41. Управление пином",
|
||||||
"type": "Writing",
|
"type": "Writing",
|
||||||
"subtype": "ButtonOut",
|
"subtype": "ButtonOut",
|
||||||
"needSave": 0,
|
"needSave": 0,
|
||||||
@@ -581,11 +616,11 @@
|
|||||||
"int": 0,
|
"int": 0,
|
||||||
"inv": 0,
|
"inv": 0,
|
||||||
"pin": 2,
|
"pin": 2,
|
||||||
"num": 39
|
"num": 41
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"global": 0,
|
"global": 0,
|
||||||
"name": "40. Сервопривод",
|
"name": "42. Сервопривод",
|
||||||
"type": "Writing",
|
"type": "Writing",
|
||||||
"subtype": "IoTServo",
|
"subtype": "IoTServo",
|
||||||
"id": "servo",
|
"id": "servo",
|
||||||
@@ -596,11 +631,11 @@
|
|||||||
"pin": 12,
|
"pin": 12,
|
||||||
"apin": -1,
|
"apin": -1,
|
||||||
"amap": "0, 4096, 0, 180",
|
"amap": "0, 4096, 0, 180",
|
||||||
"num": 40
|
"num": 42
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"global": 0,
|
"global": 0,
|
||||||
"name": "41. Расширитель портов Mcp23017",
|
"name": "43. Расширитель портов Mcp23017",
|
||||||
"type": "Reading",
|
"type": "Reading",
|
||||||
"subtype": "Mcp23017",
|
"subtype": "Mcp23017",
|
||||||
"id": "Mcp",
|
"id": "Mcp",
|
||||||
@@ -610,11 +645,11 @@
|
|||||||
"int": "0",
|
"int": "0",
|
||||||
"addr": "0x20",
|
"addr": "0x20",
|
||||||
"index": 1,
|
"index": 1,
|
||||||
"num": 41
|
"num": 43
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"global": 0,
|
"global": 0,
|
||||||
"name": "42. MP3 плеер",
|
"name": "44. MP3 плеер",
|
||||||
"type": "Reading",
|
"type": "Reading",
|
||||||
"subtype": "Mp3",
|
"subtype": "Mp3",
|
||||||
"id": "mp3",
|
"id": "mp3",
|
||||||
@@ -624,11 +659,11 @@
|
|||||||
"int": 1,
|
"int": 1,
|
||||||
"pins": "14,12",
|
"pins": "14,12",
|
||||||
"volume": 20,
|
"volume": 20,
|
||||||
"num": 42
|
"num": 44
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"global": 0,
|
"global": 0,
|
||||||
"name": "43. Сенсорная кнопка",
|
"name": "45. Сенсорная кнопка",
|
||||||
"type": "Writing",
|
"type": "Writing",
|
||||||
"subtype": "Multitouch",
|
"subtype": "Multitouch",
|
||||||
"id": "impulse",
|
"id": "impulse",
|
||||||
@@ -642,11 +677,11 @@
|
|||||||
"pinMode": "INPUT",
|
"pinMode": "INPUT",
|
||||||
"debounceDelay": 50,
|
"debounceDelay": 50,
|
||||||
"PWMDelay": 500,
|
"PWMDelay": 500,
|
||||||
"num": 43
|
"num": 45
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"global": 0,
|
"global": 0,
|
||||||
"name": "44. Расширитель портов Pcf8574",
|
"name": "46. Расширитель портов Pcf8574",
|
||||||
"type": "Reading",
|
"type": "Reading",
|
||||||
"subtype": "Pcf8574",
|
"subtype": "Pcf8574",
|
||||||
"id": "Pcf",
|
"id": "Pcf",
|
||||||
@@ -656,11 +691,11 @@
|
|||||||
"int": "0",
|
"int": "0",
|
||||||
"addr": "0x20",
|
"addr": "0x20",
|
||||||
"index": 1,
|
"index": 1,
|
||||||
"num": 44
|
"num": 46
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"global": 0,
|
"global": 0,
|
||||||
"name": "45. PWM ESP8266",
|
"name": "47. PWM ESP8266",
|
||||||
"type": "Writing",
|
"type": "Writing",
|
||||||
"subtype": "Pwm8266",
|
"subtype": "Pwm8266",
|
||||||
"id": "pwm",
|
"id": "pwm",
|
||||||
@@ -672,11 +707,11 @@
|
|||||||
"freq": 5000,
|
"freq": 5000,
|
||||||
"val": 0,
|
"val": 0,
|
||||||
"apin": -1,
|
"apin": -1,
|
||||||
"num": 45
|
"num": 47
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"global": 0,
|
"global": 0,
|
||||||
"name": "46. Телеграм-Лайт",
|
"name": "48. Телеграм-Лайт",
|
||||||
"type": "Writing",
|
"type": "Writing",
|
||||||
"subtype": "TelegramLT",
|
"subtype": "TelegramLT",
|
||||||
"id": "tg",
|
"id": "tg",
|
||||||
@@ -685,14 +720,30 @@
|
|||||||
"descr": "",
|
"descr": "",
|
||||||
"token": "",
|
"token": "",
|
||||||
"chatID": "",
|
"chatID": "",
|
||||||
"num": 46
|
"num": 48
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"header": "Экраны"
|
"header": "Экраны"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"global": 0,
|
"global": 0,
|
||||||
"name": "47. LCD экран 2004",
|
"name": "49. LCD Dwin экран",
|
||||||
|
"type": "Reading",
|
||||||
|
"subtype": "DwinI",
|
||||||
|
"id": "dwin",
|
||||||
|
"widget": "",
|
||||||
|
"page": "",
|
||||||
|
"descr": "",
|
||||||
|
"int": 15,
|
||||||
|
"TX": 17,
|
||||||
|
"RX": 16,
|
||||||
|
"line": 2,
|
||||||
|
"speed": 115200,
|
||||||
|
"num": 49
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"global": 0,
|
||||||
|
"name": "50. LCD экран 2004",
|
||||||
"type": "Reading",
|
"type": "Reading",
|
||||||
"subtype": "Lcd2004",
|
"subtype": "Lcd2004",
|
||||||
"id": "Lcd",
|
"id": "Lcd",
|
||||||
@@ -704,10 +755,10 @@
|
|||||||
"size": "20,4",
|
"size": "20,4",
|
||||||
"coord": "0,0",
|
"coord": "0,0",
|
||||||
"id2show": "id датчика",
|
"id2show": "id датчика",
|
||||||
"num": 47
|
"num": 50
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "48. LCD экран 1602",
|
"name": "51. LCD экран 1602",
|
||||||
"type": "Reading",
|
"type": "Reading",
|
||||||
"subtype": "Lcd2004",
|
"subtype": "Lcd2004",
|
||||||
"id": "Lcd",
|
"id": "Lcd",
|
||||||
@@ -719,6 +770,6 @@
|
|||||||
"size": "16,2",
|
"size": "16,2",
|
||||||
"coord": "0,0",
|
"coord": "0,0",
|
||||||
"id2show": "id датчика",
|
"id2show": "id датчика",
|
||||||
"num": 48
|
"num": 51
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
@@ -55,6 +55,7 @@
|
|||||||
*****************************************глобальные объекты классов***************************************************
|
*****************************************глобальные объекты классов***************************************************
|
||||||
**********************************************************************************************************************/
|
**********************************************************************************************************************/
|
||||||
extern IoTGpio IoTgpio;
|
extern IoTGpio IoTgpio;
|
||||||
|
extern IoTItem* rtcItem;
|
||||||
|
|
||||||
extern TickerScheduler ts;
|
extern TickerScheduler ts;
|
||||||
extern WiFiClient espClient;
|
extern WiFiClient espClient;
|
||||||
|
|||||||
@@ -15,6 +15,7 @@ class IoTGpio {
|
|||||||
|
|
||||||
int index;
|
int index;
|
||||||
void regDriver(IoTGpio* newDriver);
|
void regDriver(IoTGpio* newDriver);
|
||||||
|
void clearDrivers();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
IoTGpio* _drivers[5] = {nullptr}; //ссылки на объекты доступа к портам более 100, 200, 300, 400. Нулевой элемент используется как маркер - и возвращается nullptr при обращении
|
IoTGpio* _drivers[5] = {nullptr}; //ссылки на объекты доступа к портам более 100, 200, 300, 400. Нулевой элемент используется как маркер - и возвращается nullptr при обращении
|
||||||
|
|||||||
@@ -46,6 +46,9 @@ class IoTItem {
|
|||||||
bool enableDoByInt = true;
|
bool enableDoByInt = true;
|
||||||
|
|
||||||
virtual IoTGpio* getGpioDriver();
|
virtual IoTGpio* getGpioDriver();
|
||||||
|
virtual IoTItem* getRtcDriver();
|
||||||
|
virtual ulong getRtcUnixTime();
|
||||||
|
|
||||||
virtual void setValue(const IoTValue& Value, bool genEvent = true);
|
virtual void setValue(const IoTValue& Value, bool genEvent = true);
|
||||||
virtual void setValue(const String& valStr, bool genEvent = true);
|
virtual void setValue(const String& valStr, bool genEvent = true);
|
||||||
String getRoundValue();
|
String getRoundValue();
|
||||||
|
|||||||
@@ -249,7 +249,8 @@ lib_deps =
|
|||||||
adafruit/Adafruit BME280 Library
|
adafruit/Adafruit BME280 Library
|
||||||
adafruit/Adafruit BMP280 Library
|
adafruit/Adafruit BMP280 Library
|
||||||
beegee-tokyo/DHT sensor library for ESPx
|
beegee-tokyo/DHT sensor library for ESPx
|
||||||
milesburton/DallasTemperature@^3.9.1
|
https://github.com/milesburton/Arduino-Temperature-Control-Library
|
||||||
|
https://github.com/tremaru/iarduino_RTC
|
||||||
robtillaart/SHT2x@^0.1.1
|
robtillaart/SHT2x@^0.1.1
|
||||||
WEMOS SHT3x@1.0.0
|
WEMOS SHT3x@1.0.0
|
||||||
plerup/espsoftwareserial
|
plerup/espsoftwareserial
|
||||||
@@ -274,6 +275,7 @@ build_src_filter =
|
|||||||
+<modules/sensors/Dht1122>
|
+<modules/sensors/Dht1122>
|
||||||
+<modules/sensors/Ds18b20>
|
+<modules/sensors/Ds18b20>
|
||||||
+<modules/sensors/Pzem004t>
|
+<modules/sensors/Pzem004t>
|
||||||
|
+<modules/sensors/RTC>
|
||||||
+<modules/sensors/Sht20>
|
+<modules/sensors/Sht20>
|
||||||
+<modules/sensors/Sht30>
|
+<modules/sensors/Sht30>
|
||||||
+<modules/sensors/Sonar>
|
+<modules/sensors/Sonar>
|
||||||
@@ -287,6 +289,7 @@ build_src_filter =
|
|||||||
+<modules/exec/Pcf8574>
|
+<modules/exec/Pcf8574>
|
||||||
+<modules/exec/Pwm8266>
|
+<modules/exec/Pwm8266>
|
||||||
+<modules/exec/TelegramLT>
|
+<modules/exec/TelegramLT>
|
||||||
|
+<modules/display/DwinI>
|
||||||
+<modules/display/Lcd2004>
|
+<modules/display/Lcd2004>
|
||||||
|
|
||||||
[env:esp32_4mb_fromitems]
|
[env:esp32_4mb_fromitems]
|
||||||
@@ -295,7 +298,8 @@ lib_deps =
|
|||||||
adafruit/Adafruit BME280 Library
|
adafruit/Adafruit BME280 Library
|
||||||
adafruit/Adafruit BMP280 Library
|
adafruit/Adafruit BMP280 Library
|
||||||
beegee-tokyo/DHT sensor library for ESPx
|
beegee-tokyo/DHT sensor library for ESPx
|
||||||
milesburton/DallasTemperature@^3.9.1
|
https://github.com/milesburton/Arduino-Temperature-Control-Library
|
||||||
|
https://github.com/tremaru/iarduino_RTC
|
||||||
robtillaart/SHT2x@^0.1.1
|
robtillaart/SHT2x@^0.1.1
|
||||||
WEMOS SHT3x@1.0.0
|
WEMOS SHT3x@1.0.0
|
||||||
plerup/espsoftwareserial
|
plerup/espsoftwareserial
|
||||||
@@ -311,6 +315,7 @@ build_src_filter =
|
|||||||
+<modules/virtual/LogingDaily>
|
+<modules/virtual/LogingDaily>
|
||||||
+<modules/virtual/Timer>
|
+<modules/virtual/Timer>
|
||||||
+<modules/virtual/Variable>
|
+<modules/virtual/Variable>
|
||||||
|
+<modules/virtual/VariableColor>
|
||||||
+<modules/virtual/VButton>
|
+<modules/virtual/VButton>
|
||||||
+<modules/sensors/Acs712>
|
+<modules/sensors/Acs712>
|
||||||
+<modules/sensors/AhtXX>
|
+<modules/sensors/AhtXX>
|
||||||
@@ -320,6 +325,7 @@ build_src_filter =
|
|||||||
+<modules/sensors/Dht1122>
|
+<modules/sensors/Dht1122>
|
||||||
+<modules/sensors/Ds18b20>
|
+<modules/sensors/Ds18b20>
|
||||||
+<modules/sensors/Pzem004t>
|
+<modules/sensors/Pzem004t>
|
||||||
|
+<modules/sensors/RTC>
|
||||||
+<modules/sensors/Sht20>
|
+<modules/sensors/Sht20>
|
||||||
+<modules/sensors/Sht30>
|
+<modules/sensors/Sht30>
|
||||||
+<modules/sensors/Sonar>
|
+<modules/sensors/Sonar>
|
||||||
@@ -330,9 +336,9 @@ build_src_filter =
|
|||||||
+<modules/exec/Mcp23017>
|
+<modules/exec/Mcp23017>
|
||||||
+<modules/exec/Mp3>
|
+<modules/exec/Mp3>
|
||||||
+<modules/exec/Multitouch>
|
+<modules/exec/Multitouch>
|
||||||
+<modules/exec/MySensors>
|
|
||||||
+<modules/exec/Pcf8574>
|
+<modules/exec/Pcf8574>
|
||||||
+<modules/exec/Pwm32>
|
+<modules/exec/Pwm32>
|
||||||
+<modules/exec/TelegramLT>
|
+<modules/exec/TelegramLT>
|
||||||
|
+<modules/display/DwinI>
|
||||||
+<modules/display/Lcd2004>
|
+<modules/display/Lcd2004>
|
||||||
|
|
||||||
|
|||||||
@@ -29,6 +29,8 @@ void configure(String path) {
|
|||||||
void* driver;
|
void* driver;
|
||||||
// пробуем спросить драйвер GPIO
|
// пробуем спросить драйвер GPIO
|
||||||
if (driver = myIoTItem->getGpioDriver()) IoTgpio.regDriver((IoTGpio*)driver);
|
if (driver = myIoTItem->getGpioDriver()) IoTgpio.regDriver((IoTGpio*)driver);
|
||||||
|
// пробуем спросить драйвер RTC
|
||||||
|
if (driver = myIoTItem->getRtcDriver()) rtcItem = (IoTItem*)driver;
|
||||||
|
|
||||||
IoTItems.push_back(myIoTItem);
|
IoTItems.push_back(myIoTItem);
|
||||||
}
|
}
|
||||||
@@ -41,6 +43,9 @@ void configure(String path) {
|
|||||||
|
|
||||||
void clearConfigure() {
|
void clearConfigure() {
|
||||||
Serial.printf("Start clearing config\n");
|
Serial.printf("Start clearing config\n");
|
||||||
|
rtcItem = nullptr;
|
||||||
|
IoTgpio.clearDrivers();
|
||||||
|
|
||||||
for (std::list<IoTItem*>::iterator it = IoTItems.begin(); it != IoTItems.end(); ++it) {
|
for (std::list<IoTItem*>::iterator it = IoTItems.begin(); it != IoTItems.end(); ++it) {
|
||||||
Serial.printf("Start delete iotitem %s \n", (*it)->getID().c_str());
|
Serial.printf("Start delete iotitem %s \n", (*it)->getID().c_str());
|
||||||
if (*it) delete *it;
|
if (*it) delete *it;
|
||||||
|
|||||||
@@ -30,6 +30,7 @@ WebSocketsServer standWebSocket = WebSocketsServer(81);
|
|||||||
***********************************************глобальные переменные**************************************************
|
***********************************************глобальные переменные**************************************************
|
||||||
**********************************************************************************************************************/
|
**********************************************************************************************************************/
|
||||||
IoTGpio IoTgpio(0);
|
IoTGpio IoTgpio(0);
|
||||||
|
IoTItem* rtcItem = nullptr;
|
||||||
|
|
||||||
String settingsFlashJson = "{}"; // переменная в которой хранятся все настройки, находится в оперативной памяти и синхронизированна с flash памятью
|
String settingsFlashJson = "{}"; // переменная в которой хранятся все настройки, находится в оперативной памяти и синхронизированна с flash памятью
|
||||||
String valuesFlashJson = "{}"; // переменная в которой хранятся все значения элементов, которые необходимо сохранить на flash. Находится в оперативной памяти и синхронизированна с flash памятью
|
String valuesFlashJson = "{}"; // переменная в которой хранятся все значения элементов, которые необходимо сохранить на flash. Находится в оперативной памяти и синхронизированна с flash памятью
|
||||||
|
|||||||
108
src/Main.cpp
108
src/Main.cpp
@@ -10,6 +10,26 @@ String volStrForSave = "";
|
|||||||
unsigned long currentMillis;
|
unsigned long currentMillis;
|
||||||
unsigned long prevMillis;
|
unsigned long prevMillis;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void elementsLoop() {
|
||||||
|
// передаем управление каждому элементу конфигурации для выполнения своих функций
|
||||||
|
for (std::list<IoTItem *>::iterator it = IoTItems.begin(); it != IoTItems.end(); ++it) {
|
||||||
|
(*it)->loop();
|
||||||
|
|
||||||
|
// if ((*it)->iAmDead) {
|
||||||
|
if (!((*it)->iAmLocal) && (*it)->getIntFromNet() == -1) {
|
||||||
|
delete *it;
|
||||||
|
IoTItems.erase(it);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
handleOrder();
|
||||||
|
handleEvent();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void setup() {
|
void setup() {
|
||||||
Serial.begin(115200);
|
Serial.begin(115200);
|
||||||
Serial.flush();
|
Serial.flush();
|
||||||
@@ -33,6 +53,40 @@ void setup() {
|
|||||||
// синхронизация глобальных переменных с flash
|
// синхронизация глобальных переменных с flash
|
||||||
globalVarsSync();
|
globalVarsSync();
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// настраиваем микроконтроллер
|
||||||
|
configure("/config.json");
|
||||||
|
|
||||||
|
// настраиваем i2c шину
|
||||||
|
int i2c, pinSCL, pinSDA, i2cFreq;
|
||||||
|
jsonRead(settingsFlashJson, "pinSCL", pinSCL, false);
|
||||||
|
jsonRead(settingsFlashJson, "pinSDA", pinSDA, false);
|
||||||
|
jsonRead(settingsFlashJson, "i2cFreq", i2cFreq, false);
|
||||||
|
jsonRead(settingsFlashJson, "i2c", i2c, false);
|
||||||
|
if (i2c != 0) {
|
||||||
|
#ifdef esp32_4mb
|
||||||
|
Wire.end();
|
||||||
|
Wire.begin(pinSDA, pinSCL, (uint32_t)i2cFreq);
|
||||||
|
#else
|
||||||
|
Wire.begin(pinSDA, pinSCL);
|
||||||
|
Wire.setClock(i2cFreq);
|
||||||
|
#endif
|
||||||
|
SerialPrint("i", "i2c", F("i2c pins overriding done"));
|
||||||
|
}
|
||||||
|
|
||||||
|
// подготавливаем сценарии
|
||||||
|
iotScen.loadScenario("/scenario.txt");
|
||||||
|
|
||||||
|
// создаем событие завершения инициализации основных моментов для возможности выполнения блока кода при загрузке
|
||||||
|
createItemFromNet("onInit", "1", 1);
|
||||||
|
|
||||||
|
elementsLoop();
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// подключаемся к роутеру
|
// подключаемся к роутеру
|
||||||
routerConnect();
|
routerConnect();
|
||||||
|
|
||||||
@@ -56,27 +110,9 @@ void setup() {
|
|||||||
ntpInit();
|
ntpInit();
|
||||||
|
|
||||||
// инициализация mqtt
|
// инициализация mqtt
|
||||||
mqttInit();
|
//mqttInit();
|
||||||
|
|
||||||
// настраиваем i2c шину
|
|
||||||
int i2c, pinSCL, pinSDA, i2cFreq;
|
|
||||||
jsonRead(settingsFlashJson, "pinSCL", pinSCL, false);
|
|
||||||
jsonRead(settingsFlashJson, "pinSDA", pinSDA, false);
|
|
||||||
jsonRead(settingsFlashJson, "i2cFreq", i2cFreq, false);
|
|
||||||
jsonRead(settingsFlashJson, "i2c", i2c, false);
|
|
||||||
if (i2c != 0) {
|
|
||||||
#ifdef esp32_4mb
|
|
||||||
Wire.end();
|
|
||||||
Wire.begin(pinSDA, pinSCL, (uint32_t)i2cFreq);
|
|
||||||
#else
|
|
||||||
Wire.begin(pinSDA, pinSCL);
|
|
||||||
Wire.setClock(i2cFreq);
|
|
||||||
#endif
|
|
||||||
SerialPrint("i", "i2c", F("i2c pins overriding done"));
|
|
||||||
}
|
|
||||||
|
|
||||||
// настраиваем микроконтроллер
|
|
||||||
configure("/config.json");
|
|
||||||
|
|
||||||
// инициализация задач переодического выполнения
|
// инициализация задач переодического выполнения
|
||||||
periodicTasksInit();
|
periodicTasksInit();
|
||||||
@@ -87,9 +123,6 @@ void setup() {
|
|||||||
// запуск работы udp
|
// запуск работы udp
|
||||||
asyncUdpInit();
|
asyncUdpInit();
|
||||||
|
|
||||||
// подготавливаем сценарии
|
|
||||||
iotScen.loadScenario("/scenario.txt");
|
|
||||||
|
|
||||||
// создаем событие завершения конфигурирования для возможности выполнения блока кода при загрузке
|
// создаем событие завершения конфигурирования для возможности выполнения блока кода при загрузке
|
||||||
createItemFromNet("onStart", "1", 1);
|
createItemFromNet("onStart", "1", 1);
|
||||||
|
|
||||||
@@ -116,24 +149,10 @@ void setup() {
|
|||||||
// test
|
// test
|
||||||
Serial.println("-------test start--------");
|
Serial.println("-------test start--------");
|
||||||
Serial.println("--------test end---------");
|
Serial.println("--------test end---------");
|
||||||
|
|
||||||
// симуляция добавления внешних событий
|
|
||||||
// IoTItems.push_back((IoTItem*)new externalVariable("{\"id\":\"rel1\",\"val\":10,\"int\":20}"));
|
|
||||||
// IoTItems.push_back((IoTItem*)new externalVariable("{\"id\":\"rel4\",\"val\":34,\"int\":30}"));
|
|
||||||
// пример получения JSON всех Items
|
|
||||||
// Serial.println(getParamsJson());
|
|
||||||
// чтение одного параметра
|
|
||||||
// Serial.println(findIoTItem("t1")->getValue());
|
|
||||||
// тест перебора пинов из расширения
|
|
||||||
// for (int i = 109; i < 112; i++) {
|
|
||||||
// IoTgpio.pinMode(i, OUTPUT);
|
|
||||||
// IoTgpio.digitalWrite(i, !IoTgpio.digitalRead(i));
|
|
||||||
// delay(1000);
|
|
||||||
// IoTgpio.digitalWrite(i, !IoTgpio.digitalRead(i));
|
|
||||||
// delay(1000);
|
|
||||||
// }
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void loop() {
|
void loop() {
|
||||||
#ifdef LOOP_DEBUG
|
#ifdef LOOP_DEBUG
|
||||||
unsigned long st = millis();
|
unsigned long st = millis();
|
||||||
@@ -151,20 +170,9 @@ void loop() {
|
|||||||
|
|
||||||
mqttLoop();
|
mqttLoop();
|
||||||
|
|
||||||
// передаем управление каждому элементу конфигурации для выполнения своих функций
|
|
||||||
for (std::list<IoTItem *>::iterator it = IoTItems.begin(); it != IoTItems.end(); ++it) {
|
|
||||||
(*it)->loop();
|
|
||||||
|
|
||||||
// if ((*it)->iAmDead) {
|
elementsLoop();
|
||||||
if (!((*it)->iAmLocal) && (*it)->getIntFromNet() == -1) {
|
|
||||||
delete *it;
|
|
||||||
IoTItems.erase(it);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
handleOrder();
|
|
||||||
handleEvent();
|
|
||||||
|
|
||||||
// #ifdef LOOP_DEBUG
|
// #ifdef LOOP_DEBUG
|
||||||
// loopPeriod = millis() - st;
|
// loopPeriod = millis() - st;
|
||||||
|
|||||||
@@ -9,14 +9,19 @@ void ntpInit() {
|
|||||||
ts.add(
|
ts.add(
|
||||||
TIME, 1000, [&](void*) {
|
TIME, 1000, [&](void*) {
|
||||||
unixTime = getSystemTime();
|
unixTime = getSystemTime();
|
||||||
unixTimeShort = unixTime - START_DATETIME;
|
|
||||||
if (unixTime < MIN_DATETIME) {
|
if (unixTime < MIN_DATETIME) {
|
||||||
isTimeSynch = false;
|
isTimeSynch = false;
|
||||||
// SerialPrint("E", "NTP", "Time not synched");
|
// SerialPrint("E", "NTP", "Time not synched");
|
||||||
jsonWriteInt(errorsHeapJson, F("tme1"), 1);
|
jsonWriteInt(errorsHeapJson, F("tme1"), 1);
|
||||||
synchTime();
|
synchTime();
|
||||||
return;
|
|
||||||
|
// проверяем присутствие RTC с батарейкой и получаем время при наличии
|
||||||
|
if (rtcItem) {
|
||||||
|
unixTime = rtcItem->getRtcUnixTime();
|
||||||
|
} else return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
unixTimeShort = unixTime - START_DATETIME;
|
||||||
jsonWriteInt(errorsHeapJson, F("tme1"), 0);
|
jsonWriteInt(errorsHeapJson, F("tme1"), 0);
|
||||||
breakEpochToTime(unixTime + jsonReadInt(settingsFlashJson, F("timezone")) * 60 * 60, _time_local);
|
breakEpochToTime(unixTime + jsonReadInt(settingsFlashJson, F("timezone")) * 60 * 60, _time_local);
|
||||||
breakEpochToTime(unixTime, _time_utc);
|
breakEpochToTime(unixTime, _time_utc);
|
||||||
|
|||||||
@@ -58,3 +58,9 @@ void IoTGpio::digitalInvert(uint8_t pin) {
|
|||||||
void IoTGpio::regDriver(IoTGpio* newDriver) {
|
void IoTGpio::regDriver(IoTGpio* newDriver) {
|
||||||
_drivers[newDriver->index] = newDriver;
|
_drivers[newDriver->index] = newDriver;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void IoTGpio::clearDrivers() {
|
||||||
|
for (int i=0; i<5; i++) {
|
||||||
|
_drivers[i] = nullptr;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -173,7 +173,7 @@ void IoTItem::checkIntFromNet() {
|
|||||||
if (_intFromNet >= 0) {
|
if (_intFromNet >= 0) {
|
||||||
// если время жизни истекло, то удаляем элемент чуть позже на следующем такте loop
|
// если время жизни истекло, то удаляем элемент чуть позже на следующем такте loop
|
||||||
// если это было уведомление не об ошибке или начале работы, то сообщаем, что сетевое событие давно не приходило
|
// если это было уведомление не об ошибке или начале работы, то сообщаем, что сетевое событие давно не приходило
|
||||||
if (_intFromNet == 0 && _id.indexOf("onError") == -1 && _id.indexOf("onStart") == -1) {
|
if (_intFromNet == 0 && _id.indexOf("onError") == -1 && _id.indexOf("onStart") == -1 && _id.indexOf("onInit") == -1) {
|
||||||
SerialPrint("E", _id, "The new data did not come from the network. The level of trust is low.", _id);
|
SerialPrint("E", _id, "The new data did not come from the network. The level of trust is low.", _id);
|
||||||
}
|
}
|
||||||
_intFromNet--;
|
_intFromNet--;
|
||||||
@@ -208,6 +208,14 @@ IoTGpio* IoTItem::getGpioDriver() {
|
|||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
IoTItem* IoTItem::getRtcDriver() {
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
ulong IoTItem::getRtcUnixTime() {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
// сетевое общение====================================================================================================================================
|
// сетевое общение====================================================================================================================================
|
||||||
|
|
||||||
// externalVariable::externalVariable(const String& parameters) : IoTItem(parameters) {
|
// externalVariable::externalVariable(const String& parameters) : IoTItem(parameters) {
|
||||||
|
|||||||
@@ -15,6 +15,7 @@ void* getAPI_Bmp280(String subtype, String params);
|
|||||||
void* getAPI_Dht1122(String subtype, String params);
|
void* getAPI_Dht1122(String subtype, String params);
|
||||||
void* getAPI_Ds18b20(String subtype, String params);
|
void* getAPI_Ds18b20(String subtype, String params);
|
||||||
void* getAPI_Pzem004(String subtype, String params);
|
void* getAPI_Pzem004(String subtype, String params);
|
||||||
|
void* getAPI_RTC(String subtype, String params);
|
||||||
void* getAPI_Sht20(String subtype, String params);
|
void* getAPI_Sht20(String subtype, String params);
|
||||||
void* getAPI_Sht30(String subtype, String params);
|
void* getAPI_Sht30(String subtype, String params);
|
||||||
void* getAPI_Sonar(String subtype, String params);
|
void* getAPI_Sonar(String subtype, String params);
|
||||||
@@ -28,6 +29,7 @@ void* getAPI_Multitouch(String subtype, String params);
|
|||||||
void* getAPI_Pcf8574(String subtype, String params);
|
void* getAPI_Pcf8574(String subtype, String params);
|
||||||
void* getAPI_Pwm8266(String subtype, String params);
|
void* getAPI_Pwm8266(String subtype, String params);
|
||||||
void* getAPI_TelegramLT(String subtype, String params);
|
void* getAPI_TelegramLT(String subtype, String params);
|
||||||
|
void* getAPI_DwinI(String subtype, String params);
|
||||||
void* getAPI_Lcd2004(String subtype, String params);
|
void* getAPI_Lcd2004(String subtype, String params);
|
||||||
|
|
||||||
void* getAPI(String subtype, String params) {
|
void* getAPI(String subtype, String params) {
|
||||||
@@ -47,6 +49,7 @@ if ((tmpAPI = getAPI_Bmp280(subtype, params)) != nullptr) return tmpAPI;
|
|||||||
if ((tmpAPI = getAPI_Dht1122(subtype, params)) != nullptr) return tmpAPI;
|
if ((tmpAPI = getAPI_Dht1122(subtype, params)) != nullptr) return tmpAPI;
|
||||||
if ((tmpAPI = getAPI_Ds18b20(subtype, params)) != nullptr) return tmpAPI;
|
if ((tmpAPI = getAPI_Ds18b20(subtype, params)) != nullptr) return tmpAPI;
|
||||||
if ((tmpAPI = getAPI_Pzem004(subtype, params)) != nullptr) return tmpAPI;
|
if ((tmpAPI = getAPI_Pzem004(subtype, params)) != nullptr) return tmpAPI;
|
||||||
|
if ((tmpAPI = getAPI_RTC(subtype, params)) != nullptr) return tmpAPI;
|
||||||
if ((tmpAPI = getAPI_Sht20(subtype, params)) != nullptr) return tmpAPI;
|
if ((tmpAPI = getAPI_Sht20(subtype, params)) != nullptr) return tmpAPI;
|
||||||
if ((tmpAPI = getAPI_Sht30(subtype, params)) != nullptr) return tmpAPI;
|
if ((tmpAPI = getAPI_Sht30(subtype, params)) != nullptr) return tmpAPI;
|
||||||
if ((tmpAPI = getAPI_Sonar(subtype, params)) != nullptr) return tmpAPI;
|
if ((tmpAPI = getAPI_Sonar(subtype, params)) != nullptr) return tmpAPI;
|
||||||
@@ -60,6 +63,7 @@ if ((tmpAPI = getAPI_Multitouch(subtype, params)) != nullptr) return tmpAPI;
|
|||||||
if ((tmpAPI = getAPI_Pcf8574(subtype, params)) != nullptr) return tmpAPI;
|
if ((tmpAPI = getAPI_Pcf8574(subtype, params)) != nullptr) return tmpAPI;
|
||||||
if ((tmpAPI = getAPI_Pwm8266(subtype, params)) != nullptr) return tmpAPI;
|
if ((tmpAPI = getAPI_Pwm8266(subtype, params)) != nullptr) return tmpAPI;
|
||||||
if ((tmpAPI = getAPI_TelegramLT(subtype, params)) != nullptr) return tmpAPI;
|
if ((tmpAPI = getAPI_TelegramLT(subtype, params)) != nullptr) return tmpAPI;
|
||||||
|
if ((tmpAPI = getAPI_DwinI(subtype, params)) != nullptr) return tmpAPI;
|
||||||
if ((tmpAPI = getAPI_Lcd2004(subtype, params)) != nullptr) return tmpAPI;
|
if ((tmpAPI = getAPI_Lcd2004(subtype, params)) != nullptr) return tmpAPI;
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
@@ -7,30 +7,29 @@ extern IoTGpio IoTgpio;
|
|||||||
class ButtonIn : public IoTItem {
|
class ButtonIn : public IoTItem {
|
||||||
private:
|
private:
|
||||||
int _pin;
|
int _pin;
|
||||||
bool _execLevel;
|
bool _execLevel, _fixState, _inv, _buttonState, _reading;
|
||||||
int _fixState;
|
bool _lastButtonState = LOW;
|
||||||
String _pinMode;
|
|
||||||
int _lastButtonState = LOW;
|
|
||||||
unsigned long _lastDebounceTime = 0;
|
unsigned long _lastDebounceTime = 0;
|
||||||
long _debounceDelay = 50;
|
int _debounceDelay = 50;
|
||||||
int _buttonState;
|
|
||||||
int _reading;
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
ButtonIn(String parameters): IoTItem(parameters) {
|
ButtonIn(String parameters): IoTItem(parameters) {
|
||||||
jsonRead(parameters, "pin", _pin);
|
String _pinMode;
|
||||||
jsonRead(parameters, "execLevel", _execLevel);
|
|
||||||
jsonRead(parameters, "pinMode", _pinMode);
|
|
||||||
jsonRead(parameters, "debounceDelay", _debounceDelay);
|
|
||||||
jsonRead(parameters, "fixState", _fixState);
|
|
||||||
_round = 0;
|
|
||||||
//Serial.printf("vvvvvvvvvvvvvvvv =%d \n", _fixState);
|
|
||||||
|
|
||||||
IoTgpio.pinMode(_pin, INPUT);
|
jsonRead(parameters, F("inv"), _inv);
|
||||||
if (_pinMode == "INPUT_PULLUP") IoTgpio.digitalWrite(_pin, HIGH);
|
jsonRead(parameters, F("pin"), _pin);
|
||||||
else if (_pinMode == "INPUT_PULLDOWN") IoTgpio.digitalWrite(_pin, LOW);
|
jsonRead(parameters, F("execLevel"), _execLevel);
|
||||||
|
jsonRead(parameters, F("pinMode"), _pinMode);
|
||||||
|
jsonRead(parameters, F("debounceDelay"), _debounceDelay);
|
||||||
|
jsonRead(parameters, F("fixState"), _fixState);
|
||||||
|
_round = 0;
|
||||||
|
|
||||||
|
if (_pinMode == F("INPUT")) IoTgpio.pinMode(_pin, INPUT);
|
||||||
|
else if (_pinMode == F("INPUT_PULLUP")) IoTgpio.pinMode(_pin, INPUT_PULLUP);
|
||||||
|
else if (_pinMode == F("INPUT_PULLDOWN")) {IoTgpio.pinMode(_pin, INPUT); IoTgpio.digitalWrite(_pin, LOW);}
|
||||||
|
|
||||||
value.valD = _buttonState = IoTgpio.digitalRead(_pin);
|
value.valD = _buttonState = IoTgpio.digitalRead(_pin);
|
||||||
|
if (_inv) value.valD = _buttonState = !_buttonState; // инвертируем, если нужно показания
|
||||||
// сообщаем всем о стартовом статусе без генерации события
|
// сообщаем всем о стартовом статусе без генерации события
|
||||||
regEvent(_buttonState, "", false, false);
|
regEvent(_buttonState, "", false, false);
|
||||||
}
|
}
|
||||||
@@ -48,17 +47,13 @@ class ButtonIn : public IoTItem {
|
|||||||
|
|
||||||
if (_fixState == 1 && _buttonState == _execLevel) {
|
if (_fixState == 1 && _buttonState == _execLevel) {
|
||||||
value.valD = !value.valD;
|
value.valD = !value.valD;
|
||||||
regEvent(value.valD, "ButtonIn");
|
regEvent(value.valD, F("ButtonIn"));
|
||||||
}
|
|
||||||
|
|
||||||
if (_fixState == 2) {
|
|
||||||
value.valD = !value.valD;
|
|
||||||
regEvent(value.valD, "ButtonIn");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (_fixState == 0) {
|
if (_fixState == 0) {
|
||||||
value.valD = _buttonState;
|
value.valD = _buttonState;
|
||||||
regEvent(value.valD, "ButtonIn");
|
if (_inv) value.valD = !_buttonState; // инвертируем, если нужно показания
|
||||||
|
regEvent(value.valD, F("ButtonIn"));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -68,7 +63,7 @@ class ButtonIn : public IoTItem {
|
|||||||
|
|
||||||
void setValue(const IoTValue& Value, bool genEvent = true) {
|
void setValue(const IoTValue& Value, bool genEvent = true) {
|
||||||
value = Value;
|
value = Value;
|
||||||
regEvent((String)(int)value.valD, "ButtonIn", false, genEvent);
|
regEvent((String)(int)value.valD, F("ButtonIn"), false, genEvent);
|
||||||
}
|
}
|
||||||
|
|
||||||
String getValue() {
|
String getValue() {
|
||||||
|
|||||||
@@ -16,7 +16,8 @@
|
|||||||
"execLevel": "1",
|
"execLevel": "1",
|
||||||
"pinMode": "INPUT",
|
"pinMode": "INPUT",
|
||||||
"debounceDelay": 50,
|
"debounceDelay": 50,
|
||||||
"fixState": 0
|
"fixState": 0,
|
||||||
|
"inv": 0
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"about": {
|
"about": {
|
||||||
@@ -38,7 +39,8 @@
|
|||||||
"execLevel": "Высокий 1 или низкий 0 уровень переключения состояния в режиме fixState = 1",
|
"execLevel": "Высокий 1 или низкий 0 уровень переключения состояния в режиме fixState = 1",
|
||||||
"pinMode": "Может быть INPUT_PULLUP INPUT_PULLDOWN INPUT",
|
"pinMode": "Может быть INPUT_PULLUP INPUT_PULLDOWN INPUT",
|
||||||
"debounceDelay": "Время обработки дребезга",
|
"debounceDelay": "Время обработки дребезга",
|
||||||
"fixState": "Поведение входа, срабатывание на переходе или на фиксации уровня (триггерный режим)"
|
"fixState": "Поведение кнопки. При fixState = 0 - нет фиксации и значение кнопки повторяет уровень сигнала на входе. fixState = 1 - кнопка работает как переключатель и переключение происходит по высокому или низкому уровню сигнала (execLevel).",
|
||||||
|
"inv": "Инвертировать снимаемые показания на последнем этапе."
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"defActive": true,
|
"defActive": true,
|
||||||
|
|||||||
@@ -12,16 +12,19 @@
|
|||||||
|
|
||||||
std::map<String, Adafruit_BME280 *> bmes;
|
std::map<String, Adafruit_BME280 *> bmes;
|
||||||
|
|
||||||
class Bme280t : public IoTItem {
|
class Bme280t : public IoTItem
|
||||||
|
{
|
||||||
private:
|
private:
|
||||||
Adafruit_BME280 *_bme;
|
Adafruit_BME280 *_bme;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
Bme280t(Adafruit_BME280* bme, String parameters) : IoTItem(parameters) {
|
Bme280t(Adafruit_BME280 *bme, String parameters) : IoTItem(parameters)
|
||||||
|
{
|
||||||
_bme = bme;
|
_bme = bme;
|
||||||
}
|
}
|
||||||
|
|
||||||
void doByInterval() {
|
void doByInterval()
|
||||||
|
{
|
||||||
value.valD = _bme->readTemperature();
|
value.valD = _bme->readTemperature();
|
||||||
if (value.valD != NAN && value.valD < 145)
|
if (value.valD != NAN && value.valD < 145)
|
||||||
regEvent(value.valD, "Bme280t");
|
regEvent(value.valD, "Bme280t");
|
||||||
@@ -32,16 +35,19 @@ class Bme280t : public IoTItem {
|
|||||||
~Bme280t(){};
|
~Bme280t(){};
|
||||||
};
|
};
|
||||||
|
|
||||||
class Bme280h : public IoTItem {
|
class Bme280h : public IoTItem
|
||||||
|
{
|
||||||
private:
|
private:
|
||||||
Adafruit_BME280 *_bme;
|
Adafruit_BME280 *_bme;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
Bme280h(Adafruit_BME280* bme, String parameters) : IoTItem(parameters) {
|
Bme280h(Adafruit_BME280 *bme, String parameters) : IoTItem(parameters)
|
||||||
|
{
|
||||||
_bme = bme;
|
_bme = bme;
|
||||||
}
|
}
|
||||||
|
|
||||||
void doByInterval() {
|
void doByInterval()
|
||||||
|
{
|
||||||
value.valD = _bme->readHumidity();
|
value.valD = _bme->readHumidity();
|
||||||
if (value.valD != NAN && value.valD < 100)
|
if (value.valD != NAN && value.valD < 100)
|
||||||
regEvent(value.valD, "Bme280h");
|
regEvent(value.valD, "Bme280h");
|
||||||
@@ -52,48 +58,95 @@ class Bme280h : public IoTItem {
|
|||||||
~Bme280h(){};
|
~Bme280h(){};
|
||||||
};
|
};
|
||||||
|
|
||||||
class Bme280p : public IoTItem {
|
class Bme280p : public IoTItem
|
||||||
|
{
|
||||||
private:
|
private:
|
||||||
Adafruit_BME280 *_bme;
|
Adafruit_BME280 *_bme;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
Bme280p(Adafruit_BME280* bme, String parameters) : IoTItem(parameters) {
|
Bme280p(Adafruit_BME280 *bme, String parameters) : IoTItem(parameters)
|
||||||
|
{
|
||||||
_bme = bme;
|
_bme = bme;
|
||||||
}
|
}
|
||||||
|
|
||||||
void doByInterval() {
|
void doByInterval()
|
||||||
|
{
|
||||||
value.valD = _bme->readPressure();
|
value.valD = _bme->readPressure();
|
||||||
if (value.valD != NAN && value.valD > 0) {
|
if (value.valD != NAN && value.valD > 0)
|
||||||
|
{
|
||||||
value.valD = value.valD / 1.333224 / 100;
|
value.valD = value.valD / 1.333224 / 100;
|
||||||
regEvent(value.valD, "Bme280p");
|
regEvent(value.valD, "Bme280p");
|
||||||
} else
|
}
|
||||||
|
else
|
||||||
SerialPrint("E", "Sensor Bme280p", "Error", _id);
|
SerialPrint("E", "Sensor Bme280p", "Error", _id);
|
||||||
}
|
}
|
||||||
|
|
||||||
~Bme280p(){};
|
~Bme280p(){};
|
||||||
};
|
};
|
||||||
|
|
||||||
void* getAPI_Bme280(String subtype, String param) {
|
class Bme280dp : public IoTItem
|
||||||
if (subtype == F("Bme280t") || subtype == F("Bme280h") || subtype == F("Bme280p")) {
|
{
|
||||||
|
private:
|
||||||
|
Adafruit_BME280 *_bme;
|
||||||
|
|
||||||
|
public:
|
||||||
|
Bme280dp(Adafruit_BME280 *bme, String parameters) : IoTItem(parameters)
|
||||||
|
{
|
||||||
|
_bme = bme;
|
||||||
|
}
|
||||||
|
|
||||||
|
void doByInterval()
|
||||||
|
{
|
||||||
|
|
||||||
|
float humi = _bme->readHumidity();
|
||||||
|
float temp = _bme->readTemperature();
|
||||||
|
|
||||||
|
if (temp != NAN && temp < 145 && humi != NAN && humi > 0 && humi < 100)
|
||||||
|
{
|
||||||
|
value.valD = (temp - (14.55 + 0.114 * temp) * (1 - (0.01 * humi)) - pow(((2.5 + 0.007 * temp) * (1 - (0.01 * humi))), 3) - (15.9 + 0.117 * temp) * pow((1 - (0.01 * humi)), 14));
|
||||||
|
regEvent(value.valD, "Bme280dp");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
SerialPrint("E", "Sensor Bme280dp", "Error", _id);
|
||||||
|
}
|
||||||
|
|
||||||
|
~Bme280dp(){};
|
||||||
|
};
|
||||||
|
|
||||||
|
void *getAPI_Bme280(String subtype, String param)
|
||||||
|
{
|
||||||
|
if (subtype == F("Bme280t") || subtype == F("Bme280h") || subtype == F("Bme280p") || subtype == F("Bme280dp"))
|
||||||
|
{
|
||||||
String addr;
|
String addr;
|
||||||
jsonRead(param, "addr", addr);
|
jsonRead(param, "addr", addr);
|
||||||
if (addr == "") {
|
if (addr == "")
|
||||||
|
{
|
||||||
scanI2C();
|
scanI2C();
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (bmes.find(addr) == bmes.end()) {
|
if (bmes.find(addr) == bmes.end())
|
||||||
|
{
|
||||||
bmes[addr] = new Adafruit_BME280();
|
bmes[addr] = new Adafruit_BME280();
|
||||||
bmes[addr]->begin(hexStringToUint8(addr));
|
bmes[addr]->begin(hexStringToUint8(addr));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (subtype == F("Bme280t")) {
|
if (subtype == F("Bme280t"))
|
||||||
|
{
|
||||||
return new Bme280t(bmes[addr], param);
|
return new Bme280t(bmes[addr], param);
|
||||||
} else if (subtype == F("Bme280h")) {
|
}
|
||||||
|
else if (subtype == F("Bme280h"))
|
||||||
|
{
|
||||||
return new Bme280h(bmes[addr], param);
|
return new Bme280h(bmes[addr], param);
|
||||||
} else if (subtype == F("Bme280p")) {
|
}
|
||||||
|
else if (subtype == F("Bme280p"))
|
||||||
|
{
|
||||||
return new Bme280p(bmes[addr], param);
|
return new Bme280p(bmes[addr], param);
|
||||||
}
|
}
|
||||||
|
else if (subtype == F("Bme280dp"))
|
||||||
|
{
|
||||||
|
return new Bme280dp(bmes[addr], param);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return nullptr;
|
return nullptr;
|
||||||
|
|||||||
@@ -6,7 +6,7 @@
|
|||||||
"name": "BME280 Температура",
|
"name": "BME280 Температура",
|
||||||
"type": "Reading",
|
"type": "Reading",
|
||||||
"subtype": "Bme280t",
|
"subtype": "Bme280t",
|
||||||
"id": "tmp3",
|
"id": "Tmp3",
|
||||||
"widget": "anydataTmp",
|
"widget": "anydataTmp",
|
||||||
"page": "Сенсоры",
|
"page": "Сенсоры",
|
||||||
"descr": "Температура",
|
"descr": "Температура",
|
||||||
@@ -39,6 +39,19 @@
|
|||||||
"int": 15,
|
"int": 15,
|
||||||
"addr": "0x77",
|
"addr": "0x77",
|
||||||
"round": 1
|
"round": 1
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"global": 0,
|
||||||
|
"name": "BME280 Tочка росы",
|
||||||
|
"type": "Reading",
|
||||||
|
"subtype": "Bme280dp",
|
||||||
|
"id": "Dew3",
|
||||||
|
"widget": "anydataTmp",
|
||||||
|
"page": "Сенсоры",
|
||||||
|
"descr": "Точка росы",
|
||||||
|
"int": 15,
|
||||||
|
"addr": "0x77",
|
||||||
|
"round": 1
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"about": {
|
"about": {
|
||||||
@@ -55,12 +68,13 @@
|
|||||||
"subTypes": [
|
"subTypes": [
|
||||||
"Bme280t",
|
"Bme280t",
|
||||||
"Bme280p",
|
"Bme280p",
|
||||||
"Bme280h"
|
"Bme280h",
|
||||||
|
"Bme280dp"
|
||||||
],
|
],
|
||||||
"title": "Сенсор температуры, давления и влажности с Bme280",
|
"title": "Сенсор температуры, давления, влажности и точки росы с Bme280",
|
||||||
"moduleDesc": "Позволяет получить значения температуры, давления и влажности с Bme280.",
|
"moduleDesc": "Позволяет получить значения температуры, давления, влажности и точки росы с Bme280.",
|
||||||
"propInfo": {
|
"propInfo": {
|
||||||
"addr": "Адрес датчика на шине, обычно 0x77.",
|
"addr": "Адрес датчика на шине, обычно 0x77. Для стабильности надо пин SDO притянуть к 3.3В. Если пин SDO притянуть к GND то адрес будет 0х76",
|
||||||
"int": "Количество секунд между опросами датчика."
|
"int": "Количество секунд между опросами датчика."
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -71,18 +85,6 @@
|
|||||||
],
|
],
|
||||||
"esp8266_4mb": [
|
"esp8266_4mb": [
|
||||||
"adafruit/Adafruit BME280 Library"
|
"adafruit/Adafruit BME280 Library"
|
||||||
],
|
|
||||||
"esp8266_1mb": [
|
|
||||||
"adafruit/Adafruit BME280 Library"
|
|
||||||
],
|
|
||||||
"esp8266_1mb_ota": [
|
|
||||||
"adafruit/Adafruit BME280 Library"
|
|
||||||
],
|
|
||||||
"esp8285_1mb": [
|
|
||||||
"adafruit/Adafruit BME280 Library"
|
|
||||||
],
|
|
||||||
"esp8285_1mb_ota": [
|
|
||||||
"adafruit/Adafruit BME280 Library"
|
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
82
src/modules/sensors/RTC/RTC.cpp
Normal file
82
src/modules/sensors/RTC/RTC.cpp
Normal file
@@ -0,0 +1,82 @@
|
|||||||
|
#include "Global.h"
|
||||||
|
#include "classes/IoTItem.h"
|
||||||
|
#include <iarduino_RTC.h>
|
||||||
|
|
||||||
|
class RTC : public IoTItem {
|
||||||
|
private:
|
||||||
|
bool _ticker = false;
|
||||||
|
iarduino_RTC* _watch;
|
||||||
|
String _timeFormat = "";
|
||||||
|
|
||||||
|
public:
|
||||||
|
RTC(String parameters) : IoTItem(parameters) {
|
||||||
|
jsonRead(parameters, F("ticker"), _ticker);
|
||||||
|
jsonRead(parameters, F("timeFormat"), _timeFormat);
|
||||||
|
_timeFormat = _timeFormat + " "; // костыль для коррекции ошибки в библиотеке
|
||||||
|
|
||||||
|
int chipCode = 3;
|
||||||
|
jsonRead(parameters, F("chipCode"), chipCode);
|
||||||
|
if (chipCode == 1) {
|
||||||
|
int RST, CLK, DAT;
|
||||||
|
jsonRead(parameters, "RST", RST);
|
||||||
|
jsonRead(parameters, "CLK", CLK);
|
||||||
|
jsonRead(parameters, "DAT", DAT);
|
||||||
|
_watch = new iarduino_RTC(RTC_DS1302, RST, CLK, DAT);
|
||||||
|
} else {
|
||||||
|
_watch = new iarduino_RTC(chipCode);
|
||||||
|
}
|
||||||
|
_watch->begin();
|
||||||
|
}
|
||||||
|
|
||||||
|
void doByInterval() {
|
||||||
|
value.isDecimal = false;
|
||||||
|
value.valS = _watch->gettime(_timeFormat);
|
||||||
|
|
||||||
|
if (_ticker) regEvent(value.valS, F("RTC tick"));
|
||||||
|
}
|
||||||
|
|
||||||
|
IoTItem* getRtcDriver() {
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
ulong getRtcUnixTime() {
|
||||||
|
return _watch->gettimeUnix();
|
||||||
|
}
|
||||||
|
|
||||||
|
void onModuleOrder(String &key, String &value) {
|
||||||
|
if (key == "setUTime") {
|
||||||
|
char *stopstring;
|
||||||
|
ulong ut = strtoul(value.c_str(), &stopstring, 10);
|
||||||
|
_watch->settimeUnix(ut);
|
||||||
|
SerialPrint("i", F("RTC"), "Устанавливаем время: " + value);
|
||||||
|
} else if (key == "setSysTime") {
|
||||||
|
_watch->settimeUnix(unixTime);
|
||||||
|
SerialPrint("i", F("RTC"), F("Запоминаем системное время"));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
IoTValue execute(String command, std::vector<IoTValue> ¶m) {
|
||||||
|
if (command == "getTime") {
|
||||||
|
if (param.size() == 1) {
|
||||||
|
IoTValue valTmp;
|
||||||
|
valTmp.isDecimal = false;
|
||||||
|
valTmp.valS = _watch->gettime(param[0].valS + " ");
|
||||||
|
return valTmp;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return {};
|
||||||
|
}
|
||||||
|
|
||||||
|
~RTC(){
|
||||||
|
if (_watch) delete _watch;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
void* getAPI_RTC(String subtype, String param) {
|
||||||
|
if (subtype == F("RTC")) {
|
||||||
|
return new RTC(param);
|
||||||
|
} else {
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
}
|
||||||
67
src/modules/sensors/RTC/modinfo.json
Normal file
67
src/modules/sensors/RTC/modinfo.json
Normal file
@@ -0,0 +1,67 @@
|
|||||||
|
{
|
||||||
|
"menuSection": "Сенсоры",
|
||||||
|
"configItem": [
|
||||||
|
{
|
||||||
|
"global": 0,
|
||||||
|
"name": "Часы реального времени",
|
||||||
|
"type": "Reading",
|
||||||
|
"subtype": "RTC",
|
||||||
|
"id": "rtc",
|
||||||
|
"widget": "anydataDef",
|
||||||
|
"page": "Таймеры",
|
||||||
|
"descr": "Время RTC",
|
||||||
|
"chipCode": 1,
|
||||||
|
"timeFormat": "d-m-Y H:i:s",
|
||||||
|
"RST": -1,
|
||||||
|
"CLK": -1,
|
||||||
|
"DAT": -1,
|
||||||
|
"ticker": 0,
|
||||||
|
"int": 5,
|
||||||
|
"btn-setUTime": "0",
|
||||||
|
"btn-setSysTime": "nil"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"about": {
|
||||||
|
"authorName": "Ilya Belyakov",
|
||||||
|
"authorContact": "https://t.me/Biveraxe",
|
||||||
|
"authorGit": "https://github.com/biveraxe",
|
||||||
|
"exampleURL": "https://iotmanager.org/wiki",
|
||||||
|
"specialThanks": "",
|
||||||
|
"moduleName": "RTC",
|
||||||
|
"moduleVersion": "1.0",
|
||||||
|
"usedRam": {
|
||||||
|
"esp32_4mb": 15,
|
||||||
|
"esp8266_4mb": 15
|
||||||
|
},
|
||||||
|
"title": "Часы реального времени",
|
||||||
|
"moduleDesc": "Позволяет хранить и получать время из модуля с батарейкой.",
|
||||||
|
"propInfo": {
|
||||||
|
"chipCode": "RX8025 - 4, DS3231 - 3, DS1307 - 2, DS1302 - 1 (необходимо установить пины RST, CLK и DAT)",
|
||||||
|
"timeFormat": "Формат времени для вывода. Как у функции date() в PHP",
|
||||||
|
"RST": "Пин RST",
|
||||||
|
"CLK": "Пин CLK",
|
||||||
|
"DAT": "Пин DAT",
|
||||||
|
"ticker": "Генерировать(1) или нет(0) события при каждом тике часов (каждые int секунд).",
|
||||||
|
"int": "Количество секунд между получениями данных из модуля",
|
||||||
|
"btn-setUTime": "Кнопка установки времени модуля на основе указанного unixtime",
|
||||||
|
"btn-setSysTime": "Кнопка установки времени модуля на основе системного с платы ESP"
|
||||||
|
},
|
||||||
|
"retInfo": "Содержит текущее время из модуля RTC",
|
||||||
|
"funcInfo": [
|
||||||
|
{
|
||||||
|
"name": "getTime",
|
||||||
|
"descr": "Получить строковое значение времени по указанному формату.",
|
||||||
|
"params": ["Формат как у функции date() в PHP"]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"defActive": true,
|
||||||
|
"usedLibs": {
|
||||||
|
"esp32_4mb": ["https://github.com/tremaru/iarduino_RTC"],
|
||||||
|
"esp8266_4mb": ["https://github.com/tremaru/iarduino_RTC"],
|
||||||
|
"esp8266_1mb": ["https://github.com/tremaru/iarduino_RTC"],
|
||||||
|
"esp8266_1mb_ota": ["https://github.com/tremaru/iarduino_RTC"],
|
||||||
|
"esp8285_1mb": ["https://github.com/tremaru/iarduino_RTC"],
|
||||||
|
"esp8285_1mb_ota": ["https://github.com/tremaru/iarduino_RTC"]
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -28,6 +28,7 @@ void routerConnect() {
|
|||||||
SerialPrint("E", "WIFI", "password is not correct");
|
SerialPrint("E", "WIFI", "password is not correct");
|
||||||
tries = 1;
|
tries = 1;
|
||||||
jsonWriteInt(errorsHeapJson, "passer", 1);
|
jsonWriteInt(errorsHeapJson, "passer", 1);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
Serial.print(".");
|
Serial.print(".");
|
||||||
delay(1000);
|
delay(1000);
|
||||||
|
|||||||
Reference in New Issue
Block a user