Серьезно меняем скрипт обновления конфигурации проекта

This commit is contained in:
2022-08-02 23:32:11 +03:00
parent efcda0218a
commit 029d505806
55 changed files with 928 additions and 1399 deletions

179
PrepareProject.py Normal file
View File

@@ -0,0 +1,179 @@
# PrepareProject.py - инструмент для подготовки проекта к компиляции.
# Необходимо вызвать при изменении персональных настроек или состава модулей.
#
# При отсутствии файла с персональными настройками, myProfile.json будет создан автоматически
# python PrepareProject.py
#
# Если myProfile.json уже существует, можно запустить PrepareProject.py с параметром -u или --update для обновления списка модулей.
# Данная функция будет полезна для разработчиков при добавлении модуля в папку src/modules
# python PrepareProject.py --update
# python PrepareProject.py -u
#
# Возможно использовать несколько вариантов персональных настроек и уточнять имя файла при запуске с использованием параметра -p или -profile
# python PrepareProject.py --profile <ИмяФайла>
# python PrepareProject.py -p <ИмяФайла>
#
#
import configparser
import os, json, sys, getopt
from pathlib import Path
config = configparser.ConfigParser() # создаём объекта парсера INI
def printHelp():
print('''Usage:
PrepareProject.py
-p --profile <file.json_in_root_folder>
-u --update
-h --help''')
def updateModulesInProfile(profJson):
profJson["modules"] = {}
for root,d_names,f_names in os.walk("src\\modules"):
for fname in f_names:
if fname == "modinfo.json":
with open(root + "\\" + fname, "r", encoding='utf-8') as read_file:
modinfoJson = json.load(read_file)
# проверяем есть ли уже узловой элемент и если нет, то создаем
if not modinfoJson['menuSection'] in profJson["modules"]:
profJson["modules"][modinfoJson['menuSection']] = []
# добавляем информацию о модуле в узловой элемент
profJson["modules"][modinfoJson['menuSection']].append({
'path': root,
'active': modinfoJson['defActive']
})
update = False # признак необходимости обновить список модулей
profile = 'myProfile.json' # имя профиля. Будет заменено из консоли, если указано при старте
argv = sys.argv[1:]
try:
opts, args = getopt.getopt(argv, 'hp:u', ['help', 'profile=', 'update'])
except getopt.GetoptError:
print('Ошибка обработки параметров!')
printHelp()
sys.exit(2)
for opt, arg in opts:
if opt in ("-h", "--help"):
printHelp()
sys.exit()
elif opt in ("-p", "--profile"):
profile = arg
elif opt in ("-u", "--update"):
update = True
if Path(profile).is_file():
# подтягиваем уже существующий профиль
with open(profile, "r", encoding='utf-8') as read_file:
profJson = json.load(read_file)
# если хотим обновить список модулей в существующем профиле
if update:
updateModulesInProfile(profJson)
with open(profile, "w", encoding='utf-8') as write_file:
json.dump(profJson, write_file, ensure_ascii=False, indent=4, sort_keys=False)
else:
# если файла нет - создаем по образу настроек из проекта
profJson = json.loads('{}')
# копируем параметры IOTM из settings.json в новый профиль
with open("data_svelte/settings.json", "r", encoding='utf-8') as read_file:
profJson['iotmSettings'] = json.load(read_file)
# устанавливаем параметры сборки
profJson['projectProp'] = {
'platformio': {
'default_envs': 'esp8266_4mb',
'data_dir': 'data_svelte'
}
}
# загружаем список модулей для сборки
updateModulesInProfile(profJson)
# сохраняем новый профиль
with open(profile, "w", encoding='utf-8') as write_file:
json.dump(profJson, write_file, ensure_ascii=False, indent=4, sort_keys=False)
# генерируем файлы проекта на основе подготовленного профиля
# заполняем конфигурационный файл прошивки параметрами из профиля
with open("data_svelte/settings.json", "r", encoding='utf-8') as read_file:
iotmJson = json.load(read_file)
for key, value in profJson['iotmSettings'].items():
iotmJson[key] = value
with open("data_svelte/settings.json", "w", encoding='utf-8') as write_file:
json.dump(iotmJson, write_file, ensure_ascii=False, indent=4, sort_keys=False)
# определяем какое устройство используется в профиле
deviceName = profJson['projectProp']['platformio']['default_envs']
# собираем меню прошивки из модулей
# параллельно формируем список имен активных модулей
# параллельно собираем необходимые активным модулям библиотеки для включения в компиляцию для текущего типа устройства (esp8266_4m, esp32_4mb)
activeModulesName = [] # список имен активных модулей
allLibs = "" # подборка всех библиотек необходимых модулям для дальнейшей записи в конфигурацию platformio
itemsCount = 1;
includeDirs = "" # подборка путей ко всем модулям для дальнейшей записи в конфигурацию platformio
itemsJson = json.loads('[{"name": "Выберите элемент", "num": 0}]')
for section, modules in profJson['modules'].items():
itemsJson.append({"header": section})
for module in modules:
if module['active']:
with open(module['path'] + "\\modinfo.json", "r", encoding='utf-8') as read_file:
moduleJson = json.load(read_file)
if deviceName in moduleJson['devices']: # проверяем поддерживает ли модуль текущее устройство
activeModulesName.append(moduleJson['about']['moduleName']) # запоминаем имена для использования на след шагах
includeDirs = includeDirs + "\n+<" + module['path'].replace("src\\", "") + ">" # запоминаем пути к модулям для компиляции
for libPath in moduleJson['devices'][deviceName]: # запоминаем библиотеки необходимые модулю для текущей платы
allLibs = allLibs + "\n" + libPath
for configItemsJson in moduleJson['configItem']:
configItemsJson['num'] = itemsCount
configItemsJson['name'] = str(itemsCount) + ". " + configItemsJson['name']
itemsCount = itemsCount + 1
itemsJson.append(configItemsJson)
with open("data_svelte/items.json", "w", encoding='utf-8') as write_file:
json.dump(itemsJson, write_file, ensure_ascii=False, indent=4, sort_keys=False)
# учитываем вызовы модулей в API.cpp
allAPI_head = ""
allAPI_exec = ""
for activModuleName in activeModulesName:
allAPI_head = allAPI_head + "\nvoid* getAPI_" + activModuleName + "(String subtype, String params);"
allAPI_exec = allAPI_exec + "\nif ((tmpAPI = getAPI_" + activModuleName + "(subtype, params)) != nullptr) return tmpAPI;"
apicpp = '#include "ESPConfiguration.h"\n'
apicpp = apicpp + allAPI_head
apicpp = apicpp + '\n\nvoid* getAPI(String subtype, String params) {\nvoid* tmpAPI;'
apicpp = apicpp + allAPI_exec
apicpp = apicpp + '\nreturn nullptr;\n}'
with open('src/modules/API.cpp', 'w') as f:
f.write(apicpp)
# корректируем параметры platformio
# собираем пути всех отключенных модулей для исключения их из процесса компиляции
# excludeDirs = ""
# for root,d_names,f_names in os.walk("src\\modules"):
# for fname in f_names:
# if fname == "modinfo.json":
# with open(root + "\\" + fname, "r", encoding='utf-8') as read_file:
# modinfoJson = json.load(read_file)
# if not modinfoJson['about']['moduleName'] in activeModulesName:
# excludeDirs = excludeDirs + "\n-<" + root.replace("src\\", "") + ">"
# фиксируем изменения в platformio.ini
config.clear()
config.read("platformio.ini")
config["env:" + deviceName + "_fromitems"]["lib_deps"] = allLibs
config["env:" + deviceName + "_fromitems"]["build_src_filter"] = includeDirs
config["platformio"]["default_envs"] = deviceName
config["platformio"]["data_dir"] = profJson['projectProp']['platformio']['data_dir']
with open("platformio.ini", 'w') as configFile:
config.write(configFile)

View File

@@ -1,116 +0,0 @@
import configparser
import os
import json, pprint
config = configparser.ConfigParser() # создаём объекта парсера INI
allLibs_esp8266_4mb = ""
allLibs_esp32_4mb = ""
allMenuItems = json.loads('[]')
allMenuItemsCount = 1
allAPI_head = ""
allAPI_exec = ""
excludeDirs = ""
def getDirs(path):
global excludeDirs
for file in os.listdir(path):
maybeDir = os.path.join(path, file)
if os.path.isdir(maybeDir):
config.clear()
if config.read(maybeDir + "/platformio.ini"):
if config.getboolean("iotm", "exclude", fallback=False):
print("Excluded: " + maybeDir)
maybeDir = maybeDir.replace("src/", "")
excludeDirs = excludeDirs + "\n-<" + maybeDir + ">"
else:
yield file
else:
yield file
def getPIOLibs(patch):
global allLibs_esp8266_4mb, allLibs_esp32_4mb
for dir in getDirs(patch):
config.clear()
if (config.read(patch + dir + "/platformio.ini")):
print(patch + dir + "/platformio.ini")
allLibs_esp8266_4mb = allLibs_esp8266_4mb + config["env:esp8266_4mb"]["lib_deps"]
allLibs_esp32_4mb = allLibs_esp32_4mb + config["env:esp32_4mb"]["lib_deps"]
def getMenuItems(patch):
global allMenuItems, allMenuItemsCount
with open(patch + "items.json", "r") as read_file:
allMenuItems = allMenuItems + json.load(read_file)
for dir in getDirs(patch):
with open(patch + dir + "/items.json", "r") as read_file:
print(patch + dir + "/items.json")
data = json.load(read_file)
for item in data:
item["name"] = str(allMenuItemsCount) + ". " + item["name"]
item["num"] = allMenuItemsCount
allMenuItemsCount = allMenuItemsCount + 1
allMenuItems = allMenuItems + data
def getAPI(patch):
global allAPI_head, allAPI_exec
for dir in getDirs(patch):
print(patch + dir)
allAPI_head = allAPI_head + "\nvoid* getAPI_" + dir + "(String subtype, String params);"
allAPI_exec = allAPI_exec + "\nif ((tmpAPI = getAPI_" + dir + "(subtype, params)) != nullptr) return tmpAPI;"
# читаем и запоминаем все либы мз каждого модуля
getPIOLibs("src/modules/system/")
getPIOLibs("src/modules/exec/")
getPIOLibs("src/modules/sensors/")
getPIOLibs("src/modules/lcd/")
# сохраняем собранные либы в настройках PIO
config.clear()
config.read("platformio.ini")
config["env:esp8266_4mb_fromitems"]["lib_deps"] = allLibs_esp8266_4mb
config["env:esp32_4mb_fromitems"]["lib_deps"] = allLibs_esp32_4mb
config["env:esp8266_4mb_fromitems"]["build_src_filter"] = excludeDirs
config["env:esp32_4mb_fromitems"]["build_src_filter"] = excludeDirs
with open("platformio.ini", 'w') as configfile:
config.write(configfile)
# готовим первый элемент меню
with open("src/modules/items.json", "r") as read_file:
allMenuItems = allMenuItems + json.load(read_file)
# читаем и запоминаем пункты меню модуелей
getMenuItems("src/modules/system/")
getMenuItems("src/modules/exec/")
getMenuItems("src/modules/sensors/")
getMenuItems("src/modules/lcd/")
# сохраняем пункты меню в общий файл
with open('data_svelte/items.json', 'w') as f:
json.dump(allMenuItems, f, ensure_ascii=False, indent=4, sort_keys=False)
# собираем списки API для интеграции вызовов модулей
getAPI("src/modules/system/")
getAPI("src/modules/exec/")
getAPI("src/modules/sensors/")
getAPI("src/modules/lcd/")
# сохраняем все API в API.cpp
apicpp = '#include "ESPConfiguration.h"\n'
apicpp = apicpp + allAPI_head
apicpp = apicpp + '\n\nvoid* getAPI(String subtype, String params) {\nvoid* tmpAPI;'
apicpp = apicpp + allAPI_exec
apicpp = apicpp + 'return nullptr;\n}'
with open('src/modules/API.cpp', 'w') as f:
f.write(apicpp)

View File

@@ -3,12 +3,133 @@
"name": "Выберите элемент",
"num": 0
},
{
"header": "Экраны"
},
{
"name": "1. LCD экран 2004",
"type": "Reading",
"subtype": "Lcd2004",
"id": "Lcd",
"widget": "",
"page": "",
"descr": "T",
"int": 15,
"addr": "0x27",
"size": "20,4",
"coord": "0,0",
"id2show": "id датчика",
"num": 1
},
{
"name": "2. LCD экран 1602",
"type": "Reading",
"subtype": "Lcd2004",
"id": "Lcd",
"widget": "",
"page": "",
"descr": "T",
"int": 15,
"addr": "0x27",
"size": "16,2",
"coord": "0,0",
"id2show": "id датчика",
"num": 2
},
{
"header": "Модули управления"
},
{
"name": "3. Кнопка (подключенная физически)",
"type": "Writing",
"subtype": "ButtonIn",
"id": "btn",
"widget": "toggle",
"page": "Кнопки",
"descr": "",
"int": 0,
"pin": 16,
"execLevel": "1",
"pinMode": "INPUT",
"debounceDelay": 50,
"fixState": 1,
"num": 3
},
{
"name": "4. Кнопка управляющая пином (Реле с кнопкой)",
"type": "Writing",
"subtype": "ButtonOut",
"id": "btn",
"widget": "toggle",
"page": "Кнопки",
"descr": "",
"int": 0,
"inv": 0,
"pin": 2,
"num": 4
},
{
"name": "5. Сервопривод",
"type": "Writing",
"subtype": "IoTServo",
"id": "servo",
"widget": "range",
"page": "servo",
"descr": "угол",
"int": 1,
"pin": 12,
"apin": -1,
"amap": "0, 4096, 0, 180",
"num": 5
},
{
"name": "6. MP3 плеер",
"type": "Reading",
"subtype": "Mp3",
"id": "mp3",
"widget": "",
"page": "",
"descr": "",
"int": 1,
"pins": "14,12",
"volume": 20,
"num": 6
},
{
"name": "7. Телеграм-Бот",
"type": "Writing",
"subtype": "Telegram",
"id": "tg",
"widget": "",
"page": "",
"descr": "",
"int": 10,
"token": "",
"autos": 1,
"receiveMsg": 0,
"chatID": "",
"num": 7
},
{
"name": "8. Таймер",
"type": "Writing",
"subtype": "Timer",
"id": "timer",
"widget": "",
"page": "",
"descr": "",
"int": 1,
"countDown": 15,
"ticker": 0,
"repeat": 0,
"needSave": 0,
"num": 8
},
{
"header": "Расширения"
},
{
"name": "1. Поддержка DS1302(1), DS1307(2), DS3231(3), RX8025(4)",
"num": 1,
"name": "9. Поддержка DS1302(1), DS1307(2), DS3231(3), RX8025(4)",
"type": "Reading",
"subtype": "IarduinoRTC",
"id": "RTC",
@@ -21,11 +142,11 @@
"clk": 5,
"dat": 4,
"defFormat": "d-m-Y",
"ticker": 0
"ticker": 0,
"num": 9
},
{
"name": "2. Расширитель портов Mcp23017",
"num": 2,
"name": "10. Расширитель портов Mcp23017",
"type": "Reading",
"subtype": "Mcp23017",
"id": "Mcp",
@@ -34,22 +155,22 @@
"descr": "",
"int": "0",
"addr": "0x20",
"index": 1
"index": 1,
"num": 10
},
{
"name": "3. Доп. функции системы",
"num": 3,
"name": "11. Доп. функции системы",
"type": "Reading",
"subtype": "SysExt",
"id": "SysExt",
"widget": "",
"page": "",
"descr": "",
"int": 15
"int": 15,
"num": 11
},
{
"name": "4. Переменная",
"num": 4,
"name": "12. Переменная",
"type": "Reading",
"subtype": "Variable",
"id": "var",
@@ -57,533 +178,7 @@
"page": "",
"descr": "",
"int": "0",
"val": "0"
},
{
"header": "Модули управления"
},
{
"name": "5. Кнопка (подключенная физически)",
"num": 5,
"type": "Writing",
"subtype": "ButtonIn",
"id": "btn",
"widget": "toggle",
"page": "Кнопки",
"descr": "",
"int": 0,
"pin": 16,
"execLevel": "1",
"pinMode": "INPUT",
"debounceDelay": 50,
"fixState": 1
},
{
"name": "6. Кнопка управляющая пином (Реле с кнопкой)",
"num": 6,
"type": "Writing",
"subtype": "ButtonOut",
"id": "btn",
"widget": "toggle",
"page": "Кнопки",
"descr": "",
"int": 0,
"inv": 0,
"pin": 2
},
{
"name": "7. Сервопривод",
"num": 7,
"type": "Writing",
"subtype": "IoTServo",
"id": "servo",
"widget": "range",
"page": "servo",
"descr": "угол",
"int": 1,
"pin": 12,
"apin": -1,
"amap": "0, 4096, 0, 180"
},
{
"name": "8. MP3 плеер",
"num": 8,
"type": "Reading",
"subtype": "Mp3",
"id": "mp3",
"widget": "",
"page": "",
"descr": "",
"int": 1,
"pins": "14,12",
"volume": 20
},
{
"name": "9. Таймер",
"num": 9,
"type": "Writing",
"subtype": "Timer",
"id": "timer",
"widget": "",
"page": "",
"descr": "",
"int": 1,
"countDown": 15,
"ticker": 0,
"repeat": 0,
"needSave": 0
},
{
"header": "Сенсоры"
},
{
"name": "10. Датчик напряжения ADS1115",
"num": 10,
"type": "Reading",
"subtype": "Ads1115",
"id": "Ads3",
"widget": "anydataVlt",
"page": "Сенсоры",
"descr": "ADS_3",
"pin": "0",
"mode": "volt",
"gain": "3/4x",
"plus": 0,
"multiply": 1,
"round": 2,
"int": 10
},
{
"name": "11. Cенсор температуры AHT20",
"num": 11,
"type": "Reading",
"subtype": "Aht20t",
"id": "Temp20",
"widget": "anydataTmp",
"page": "Сенсоры",
"descr": "AHT20 Температура",
"int": 15,
"addr": "0x38",
"round": 1
},
{
"name": "12. Cенсор влажности AHT20",
"num": 12,
"type": "Reading",
"subtype": "Aht20h",
"id": "Hum20",
"widget": "anydataHum",
"page": "Сенсоры",
"descr": "AHT20 Влажность",
"int": 15,
"addr": "0x38",
"round": 1
},
{
"name": "13. Аналоговый сенсор",
"num": 13,
"type": "Reading",
"subtype": "AnalogAdc",
"id": "t",
"widget": "anydataTmp",
"page": "Сенсоры",
"descr": "Температура",
"map": "1,1024,1,100",
"plus": 0,
"multiply": 1,
"round": 1,
"pin": 0,
"int": 15,
"avgSteps": 1
},
{
"name": "14. Cенсор температуры Bme280",
"num": 14,
"type": "Reading",
"subtype": "Bme280t",
"id": "tmp3",
"widget": "anydataTmp",
"page": "Сенсоры",
"descr": "Температура",
"int": 15,
"addr": "0x77",
"round": 1
},
{
"name": "15. Cенсор давления Bme280",
"num": 15,
"type": "Reading",
"subtype": "Bme280p",
"id": "Press3",
"widget": "anydataMm",
"page": "Сенсоры",
"descr": "Давление",
"int": 15,
"addr": "0x77",
"round": 1
},
{
"name": "16. Cенсор влажности Bme280",
"num": 16,
"type": "Reading",
"subtype": "Bme280h",
"id": "Hum3",
"widget": "anydataHum",
"page": "Сенсоры",
"descr": "Влажность",
"int": 15,
"addr": "0x77",
"round": 1
},
{
"name": "17. Cенсор температуры Bmp280",
"num": 17,
"type": "Reading",
"subtype": "Bmp280t",
"id": "tmp3",
"widget": "anydataTmp",
"page": "Сенсоры",
"descr": "280 Температура",
"int": 15,
"addr": "0x77",
"round": 1
},
{
"name": "18. Cенсор давления Bmp280",
"num": 18,
"type": "Reading",
"subtype": "Bmp280p",
"id": "Press3",
"widget": "anydataMm",
"page": "Сенсоры",
"descr": "280 Давление",
"int": 15,
"addr": "0x77",
"round": 1
},
{
"name": "19. Cенсор температуры dht11",
"num": 19,
"type": "Reading",
"subtype": "Dht1122t",
"id": "tmp3",
"widget": "anydataTmp",
"page": "Сенсоры",
"descr": "Температура",
"int": 15,
"pin": 0,
"senstype": "dht11"
},
{
"name": "20. Cенсор влажности dht11",
"num": 20,
"type": "Reading",
"subtype": "Dht1122h",
"id": "Hum3",
"widget": "anydataHum",
"page": "Сенсоры",
"descr": "Влажность",
"int": 15,
"pin": 0,
"senstype": "dht11"
},
{
"name": "21. Cенсор температуры ds18b20",
"num": 21,
"type": "Reading",
"subtype": "Ds18b20",
"id": "dstmp",
"widget": "anydataTmp",
"page": "Сенсоры",
"descr": "DS Температура",
"int": 15,
"pin": 2,
"index": 0,
"addr": "",
"round": 1
},
{
"name": "22. Датчик тока",
"num": 22,
"type": "Reading",
"subtype": "I",
"id": "current",
"widget": "anydataAmp",
"page": "Сенсоры",
"descr": "Датчик тока",
"int": 10,
"pin_I": 34,
"calib_I": 111.1,
"plus": 0,
"multiply": 1
},
{
"name": "23. Датчик напряжения",
"num": 23,
"type": "Reading",
"subtype": "U",
"id": "voltage",
"widget": "anydataVlt",
"page": "Сенсоры",
"descr": "Датчик напряжения",
"int": 10,
"pin_U": 35,
"calib_U": 223.1,
"plus": 0,
"multiply": 1
},
{
"name": "24. Cенсор температуры GY21",
"num": 24,
"type": "Reading",
"subtype": "GY21t",
"id": "tmp4",
"widget": "anydataTmp",
"page": "Сенсоры",
"descr": "Температура",
"round": 1,
"int": 15
},
{
"name": "25. Cенсор влажности GY21",
"num": 25,
"type": "Reading",
"subtype": "GY21h",
"id": "Hum4",
"widget": "anydataHum",
"page": "Сенсоры",
"descr": "Влажность",
"round": 1,
"int": 15
},
{
"name": "26. Cенсор температуры HDC1080",
"num": 26,
"type": "Reading",
"subtype": "Hdc1080t",
"id": "Temp1080",
"widget": "anydataTmp",
"page": "Сенсоры",
"descr": "1080 Температура",
"int": 15,
"addr": "0x40",
"round": 1
},
{
"name": "27. Cенсор влажности HDC1080",
"num": 27,
"type": "Reading",
"subtype": "Hdc1080h",
"id": "Hum1080",
"widget": "anydataHum",
"page": "Сенсоры",
"descr": "1080 Влажность",
"int": 15,
"addr": "0x40",
"round": 1
},
{
"name": "28. Cенсор температуры MAX6675",
"num": 28,
"type": "Reading",
"subtype": "Max6675t",
"id": "maxtmp",
"widget": "anydataTmp",
"page": "Сенсоры",
"descr": "MAX Температура",
"int": 15,
"DO": 12,
"CS": 13,
"CLK": 14
},
{
"name": "29. Датчик CO2 MHZ-19 UART",
"num": 29,
"type": "Reading",
"subtype": "Mhz19uart",
"id": "co2uart",
"widget": "anydataPpm",
"page": "Сенсоры",
"descr": "CO2uart",
"plus": 0,
"multiply": 1,
"round": 1,
"pin": 0,
"rxPin": 14,
"txPin": 16,
"int": 15,
"range": 5000,
"ABC": 1
},
{
"name": "30. Датчик CO2 MHZ-19 PWM",
"num": 30,
"type": "Reading",
"subtype": "Mhz19pwm",
"id": "co2pwm",
"widget": "anydataPpm",
"page": "Сенсоры",
"descr": "CO2pwm",
"plus": 0,
"multiply": 1,
"round": 1,
"pin": 16,
"int": 300
},
{
"name": "31. Cенсор температуры от MHZ-19 UART",
"num": 31,
"type": "Reading",
"subtype": "Mhz19temp",
"id": "Mhz19temp",
"widget": "anydataTmp",
"page": "Сенсоры",
"descr": "Температура",
"plus": 0,
"multiply": 1,
"round": 1,
"rxPin": 14,
"txPin": 16,
"ABC": 1,
"int": 30
},
{
"name": "32. Рабочий диапазон от MHZ-19 UART",
"num": 32,
"type": "Reading",
"subtype": "Mhz19range",
"id": "Mhz19range",
"widget": "anydataPpm",
"page": "Сенсоры",
"descr": "Диапазон",
"plus": 0,
"multiply": 1,
"round": 1,
"rxPin": 14,
"txPin": 16,
"range": 5000,
"ABC": 1,
"int": 30
},
{
"name": "33. Автокалибровка от MHZ-19 UART",
"num": 33,
"type": "Reading",
"subtype": "Mhz19ABC",
"id": "Mhz19ABC",
"widget": "anydataDef",
"page": "Сенсоры",
"descr": "ABC",
"rxPin": 14,
"txPin": 16,
"range": 5000,
"ABC": 1,
"int": 30
},
{
"name": "34. Датчик пыли SDS011 PM25",
"num": 34,
"type": "Reading",
"subtype": "Sds011_25",
"id": "pmuart25",
"widget": "anydataPpm",
"page": "Сенсоры",
"descr": "PM-2.5",
"plus": 0,
"multiply": 1,
"round": 10,
"rxPin": 13,
"txPin": 12,
"int": 15,
"warmUp": 30,
"period": 300
},
{
"name": "35. Датчик пыли SDS011 PM10",
"num": 35,
"type": "Reading",
"subtype": "Sds011_10",
"id": "pmuart10",
"widget": "anydataPpm",
"page": "Сенсоры",
"descr": "PM-10",
"plus": 0,
"multiply": 1,
"round": 10,
"rxPin": 13,
"txPin": 12,
"int": 15,
"warmUp": 30,
"period": 300
},
{
"name": "36. Cенсор температуры Sht20",
"num": 36,
"type": "Reading",
"subtype": "Sht20t",
"id": "tmp2",
"widget": "anydataTmp",
"page": "Сенсоры",
"descr": "Температура",
"int": 15,
"round": 1
},
{
"name": "37. Cенсор влажности Sht20",
"num": 37,
"type": "Reading",
"subtype": "Sht20h",
"id": "Hum2",
"widget": "anydataHum",
"page": "Сенсоры",
"descr": "Влажность",
"int": 15,
"round": 1
},
{
"name": "38. Сонар HC-SR04",
"num": 38,
"type": "Reading",
"subtype": "Sonar",
"id": "sonar",
"widget": "anydataTmp",
"page": "Сенсоры",
"descr": "Расстояние",
"pinTrig": 5,
"pinEcho": 4,
"int": 5
},
{
"header": "Экраны"
},
{
"name": "39. LCD экран 2004",
"num": 39,
"type": "Reading",
"subtype": "Lcd2004",
"id": "Lcd",
"widget": "",
"page": "",
"descr": "T",
"int": 15,
"addr": "0x27",
"size": "20,4",
"coord": "0,0",
"id2show": "id датчика"
},
{
"name": "40. LCD экран 1602",
"num": 40,
"type": "Reading",
"subtype": "Lcd2004",
"id": "Lcd",
"widget": "",
"page": "",
"descr": "T",
"int": 15,
"addr": "0x27",
"size": "16,2",
"coord": "0,0",
"id2show": "id датчика"
"val": "0",
"num": 12
}
]

View File

@@ -12,7 +12,11 @@ monitor_filters = esp8266_exception_decoder
upload_speed = 115200
monitor_speed = 115200
board_build.filesystem = littlefs
build_src_filter = +<*>
build_src_filter =
+<*.cpp>
+<classes/*.cpp>
+<utils/*.cpp>
+<modules/*.cpp>
${env:esp8266_4mb_fromitems.build_src_filter}
[env:esp32_4mb]
@@ -27,12 +31,13 @@ platform = espressif32 @3.3.0
monitor_filters = esp32_exception_decoder
upload_speed = 115200
monitor_speed = 115200
build_src_filter = +<*>
build_src_filter =
+<*.cpp>
+<classes/*.cpp>
+<utils/*.cpp>
+<modules/*.cpp>
${env:esp32_4mb_fromitems.build_src_filter}
[iotm]
exclude = 1
[platformio]
default_envs = esp8266_4mb
data_dir = data_svelte
@@ -45,48 +50,42 @@ lib_deps_external =
[env:esp8266_4mb_fromitems]
lib_deps =
adafruit/Adafruit MCP23017 Arduino Library@^2.0.2
dfrobot/DFRobotDFPlayerMini @ ^1.0.5
adafruit/Adafruit ADS1X15 @ ^2.3.0
Adafruit AHTX0
adafruit/Adafruit BME280 Library
adafruit/Adafruit BMP280 Library
beegee-tokyo/DHT sensor library for ESPx
milesburton/DallasTemperature@^3.9.1
openenergymonitor/EmonLib@1.1.0
https://github.com/JonasGMorsch/GY-21.git
ClosedCube HDC1080
adafruit/MAX6675 library
Nova Fitness Sds dust sensors library@1.5.1
robtillaart/SHT2x@^0.1.1
marcoschwartz/LiquidCrystal_I2C@^1.1.4
dfrobot/DFRobotDFPlayerMini @ ^1.0.5
CTBot @2.1.9
adafruit/Adafruit MCP23017 Arduino Library@^2.0.2
adafruit/Adafruit BusIO @ ^1.13.0
build_src_filter =
-<modules/exec/EspCam>
-<modules/exec/SDcard>
-<modules/exec/Telegram>
-<modules/sensors/IoTWiegand>
+<modules\display\Lcd2004>
+<modules\exec\ButtonIn>
+<modules\exec\ButtonOut>
+<modules\exec\IoTServo>
+<modules\exec\Mp3>
+<modules\exec\Telegram>
+<modules\exec\Timer>
+<modules\system\IarduinoRTC>
+<modules\system\Mcp23017>
+<modules\system\SysExt>
+<modules\system\Variable>
[env:esp32_4mb_fromitems]
lib_deps =
adafruit/Adafruit MCP23017 Arduino Library@^2.0.2
marcoschwartz/LiquidCrystal_I2C@^1.1.4
https://github.com/RoboticsBrno/ServoESP32
dfrobot/DFRobotDFPlayerMini @ ^1.0.5
adafruit/Adafruit ADS1X15 @ ^2.3.0
Adafruit AHTX0
adafruit/Adafruit BME280 Library
adafruit/Adafruit BMP280 Library
beegee-tokyo/DHT sensor library for ESPx
milesburton/DallasTemperature@^3.9.1
openenergymonitor/EmonLib@1.1.0
https://github.com/JonasGMorsch/GY-21.git
ClosedCube HDC1080
adafruit/MAX6675 library
Nova Fitness Sds dust sensors library@1.5.1
robtillaart/SHT2x@^0.1.1
marcoschwartz/LiquidCrystal_I2C@^1.1.4
CTBot @2.1.9
adafruit/Adafruit MCP23017 Arduino Library@^2.0.2
adafruit/Adafruit BusIO @ ^1.13.0
build_src_filter =
-<modules/exec/EspCam>
-<modules/exec/SDcard>
-<modules/exec/Telegram>
-<modules/sensors/IoTWiegand>
+<modules\display\Lcd2004>
+<modules\exec\ButtonIn>
+<modules\exec\ButtonOut>
+<modules\exec\IoTServo>
+<modules\exec\Mp3>
+<modules\exec\Telegram>
+<modules\exec\Timer>
+<modules\system\IarduinoRTC>
+<modules\system\Mcp23017>
+<modules\system\SysExt>
+<modules\system\Variable>

View File

@@ -1,56 +1,29 @@
#include "ESPConfiguration.h"
void* getAPI_IarduinoRTC(String subtype, String params);
void* getAPI_Mcp23017(String subtype, String params);
void* getAPI_SysExt(String subtype, String params);
void* getAPI_Variable(String subtype, String params);
void* getAPI_Lcd2004(String subtype, String params);
void* getAPI_ButtonIn(String subtype, String params);
void* getAPI_ButtonOut(String subtype, String params);
void* getAPI_IoTServo(String subtype, String params);
void* getAPI_Mp3(String subtype, String params);
void* getAPI_Telegram(String subtype, String params);
void* getAPI_Timer(String subtype, String params);
void* getAPI_Ads1115(String subtype, String params);
void* getAPI_Aht20(String subtype, String params);
void* getAPI_AnalogAdc(String subtype, String params);
void* getAPI_Bme280(String subtype, String params);
void* getAPI_Bmp280(String subtype, String params);
void* getAPI_Dht1122(String subtype, String params);
void* getAPI_Ds18b20(String subtype, String params);
void* getAPI_Emon(String subtype, String params);
void* getAPI_GY21(String subtype, String params);
void* getAPI_Hdc1080(String subtype, String params);
void* getAPI_Max6675(String subtype, String params);
void* getAPI_Mhz19(String subtype, String params);
void* getAPI_Sds011(String subtype, String params);
void* getAPI_Sht20(String subtype, String params);
void* getAPI_Sonar(String subtype, String params);
void* getAPI_Lcd2004(String subtype, String params);
void* getAPI_IarduinoRTC(String subtype, String params);
void* getAPI_Mcp23017(String subtype, String params);
void* getAPI_SysExt(String subtype, String params);
void* getAPI_Variable(String subtype, String params);
void* getAPI(String subtype, String params) {
void* tmpAPI;
if ((tmpAPI = getAPI_IarduinoRTC(subtype, params)) != nullptr) return tmpAPI;
if ((tmpAPI = getAPI_Mcp23017(subtype, params)) != nullptr) return tmpAPI;
if ((tmpAPI = getAPI_SysExt(subtype, params)) != nullptr) return tmpAPI;
if ((tmpAPI = getAPI_Variable(subtype, params)) != nullptr) return tmpAPI;
if ((tmpAPI = getAPI_Lcd2004(subtype, params)) != nullptr) return tmpAPI;
if ((tmpAPI = getAPI_ButtonIn(subtype, params)) != nullptr) return tmpAPI;
if ((tmpAPI = getAPI_ButtonOut(subtype, params)) != nullptr) return tmpAPI;
if ((tmpAPI = getAPI_IoTServo(subtype, params)) != nullptr) return tmpAPI;
if ((tmpAPI = getAPI_Mp3(subtype, params)) != nullptr) return tmpAPI;
if ((tmpAPI = getAPI_Telegram(subtype, params)) != nullptr) return tmpAPI;
if ((tmpAPI = getAPI_Timer(subtype, params)) != nullptr) return tmpAPI;
if ((tmpAPI = getAPI_Ads1115(subtype, params)) != nullptr) return tmpAPI;
if ((tmpAPI = getAPI_Aht20(subtype, params)) != nullptr) return tmpAPI;
if ((tmpAPI = getAPI_AnalogAdc(subtype, params)) != nullptr) return tmpAPI;
if ((tmpAPI = getAPI_Bme280(subtype, params)) != nullptr) return tmpAPI;
if ((tmpAPI = getAPI_Bmp280(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_Emon(subtype, params)) != nullptr) return tmpAPI;
if ((tmpAPI = getAPI_GY21(subtype, params)) != nullptr) return tmpAPI;
if ((tmpAPI = getAPI_Hdc1080(subtype, params)) != nullptr) return tmpAPI;
if ((tmpAPI = getAPI_Max6675(subtype, params)) != nullptr) return tmpAPI;
if ((tmpAPI = getAPI_Mhz19(subtype, params)) != nullptr) return tmpAPI;
if ((tmpAPI = getAPI_Sds011(subtype, params)) != nullptr) return tmpAPI;
if ((tmpAPI = getAPI_Sht20(subtype, params)) != nullptr) return tmpAPI;
if ((tmpAPI = getAPI_Sonar(subtype, params)) != nullptr) return tmpAPI;
if ((tmpAPI = getAPI_Lcd2004(subtype, params)) != nullptr) return tmpAPI;return nullptr;
if ((tmpAPI = getAPI_IarduinoRTC(subtype, params)) != nullptr) return tmpAPI;
if ((tmpAPI = getAPI_Mcp23017(subtype, params)) != nullptr) return tmpAPI;
if ((tmpAPI = getAPI_SysExt(subtype, params)) != nullptr) return tmpAPI;
if ((tmpAPI = getAPI_Variable(subtype, params)) != nullptr) return tmpAPI;
return nullptr;
}

View File

@@ -0,0 +1,62 @@
{
"menuSection": "Экраны",
"configItem": [{
"name": "LCD экран 2004",
"type": "Reading",
"subtype": "Lcd2004",
"id": "Lcd",
"widget": "",
"page": "",
"descr": "T",
"int": 15,
"addr": "0x27",
"size": "20,4",
"coord": "0,0",
"id2show": "id датчика"
},
{
"name": "LCD экран 1602",
"type": "Reading",
"subtype": "Lcd2004",
"id": "Lcd",
"widget": "",
"page": "",
"descr": "T",
"int": 15,
"addr": "0x27",
"size": "16,2",
"coord": "0,0",
"id2show": "id датчика"
}],
"about": {
"authorName": "Ilya Belyakov",
"authorContact": "https://t.me/Biveraxe",
"authorGit": "https://github.com/biveraxe",
"specialThanks": "Sergey @Serghei63",
"moduleName": "Lcd2004",
"moduleVersion": "1.0",
"moduleDesc": "Позволяет выводить на символьные экраны по указанным позициям значения других элементов конфигурации.",
"propInfo": {
"int": "Период времени в секундах обновления информации на экране по конкретному элементу.",
"addr": "Адрес устройства на шине, обычно 0x27.",
"size": "Размерность матрицы экрана.",
"coord": "Координата позиции для вывода данных элемента конфигурации.",
"id2show": "id элемента конфигурации."
}
},
"defActive": true,
"devices": {
"esp32_4mb": [
"marcoschwartz/LiquidCrystal_I2C@^1.1.4"
],
"esp8266_4mb": [
"marcoschwartz/LiquidCrystal_I2C@^1.1.4"
]
}
}

View File

@@ -1,19 +0,0 @@
[
{
"name": "Кнопка (подключенная физически)",
"num": 31,
"type": "Writing",
"subtype": "ButtonIn",
"id": "btn",
"widget": "toggle",
"page": "Кнопки",
"descr": "",
"int": 0,
"pin": 16,
"execLevel": "1",
"pinMode": "INPUT",
"debounceDelay": 50,
"fixState": 1
}
]

View File

@@ -0,0 +1,44 @@
{
"menuSection": "Модули управления",
"configItem": [{
"name": "Кнопка (подключенная физически)",
"type": "Writing",
"subtype": "ButtonIn",
"id": "btn",
"widget": "toggle",
"page": "Кнопки",
"descr": "",
"int": 0,
"pin": 16,
"execLevel": "1",
"pinMode": "INPUT",
"debounceDelay": 50,
"fixState": 1
}],
"about": {
"authorName": "Ilya Belyakov",
"authorContact": "https://t.me/Biveraxe",
"authorGit": "https://github.com/biveraxe",
"specialThanks": "",
"moduleName": "ButtonIn",
"moduleVersion": "1.0",
"moduleDesc": "Позволяет интерпретировать сигналы на цифровом пине как кнопку, т.е. создает в системе объект для чтения булевых значений с внешнего физического источника. Может вести себя как кнопка или как переключатель.",
"propInfo": {
"pin": "Укажите GPIO номер пина для чтения состояний подключенной кнопки",
"execLevel": "Высокий 1 или низкий 0 уровень переключения состояния",
"pinMode": "Может быть INPUT_PULLUP INPUT_PULLDOWN INPUT",
"debounceDelay": "Время обработки дребезга",
"fixState": "Поведение входа, срабатывание на переходе или на фиксации уровня (триггерный режим)"
}
},
"defActive": true,
"devices": {
"esp32_4mb": [],
"esp8266_4mb": []
}
}

View File

@@ -1,16 +0,0 @@
[
{
"name": "Кнопка управляющая пином (Реле с кнопкой)",
"num": 31,
"type": "Writing",
"subtype": "ButtonOut",
"id": "btn",
"widget": "toggle",
"page": "Кнопки",
"descr": "",
"int": 0,
"inv": 0,
"pin": 2
}
]

View File

@@ -0,0 +1,38 @@
{
"menuSection": "Модули управления",
"configItem": [{
"name": "Кнопка управляющая пином (Реле с кнопкой)",
"type": "Writing",
"subtype": "ButtonOut",
"id": "btn",
"widget": "toggle",
"page": "Кнопки",
"descr": "",
"int": 0,
"inv": 0,
"pin": 2
}],
"about": {
"authorName": "Ilya Belyakov",
"authorContact": "https://t.me/Biveraxe",
"authorGit": "https://github.com/biveraxe",
"specialThanks": "",
"moduleName": "ButtonOut",
"moduleVersion": "1.0",
"moduleDesc": "Управляем состоянием конкретного пина по модели реле.",
"propInfo": {
"pin": "Укажите GPIO номер пина для управления выходом",
"inv": "Инвертировать выходные сигналы"
}
},
"defActive": true,
"devices": {
"esp32_4mb": [],
"esp8266_4mb": []
}
}

View File

@@ -1,17 +0,0 @@
[
{
"name": "Camera OV2640 (ESPcam)",
"num": 30,
"type": "Reading",
"subtype": "EspCam",
"id": "EspCam",
"widget": "",
"page": "",
"descr": "",
"int": 60,
"useLed": 0,
"ticker": 0,
"webTicker": 0
}
]

View File

@@ -0,0 +1,42 @@
{
"menuSection": "Модули управления",
"configItem": [{
"name": "Camera OV2640 (ESPcam)",
"type": "Reading",
"subtype": "EspCam",
"id": "EspCam",
"widget": "",
"page": "",
"descr": "",
"int": 60,
"useLed": 0,
"ticker": 0,
"webTicker": 0
}],
"about": {
"authorName": "Ilya Belyakov",
"authorContact": "https://t.me/Biveraxe",
"authorGit": "https://github.com/biveraxe",
"specialThanks": "",
"moduleName": "EspCam",
"moduleVersion": "1.0",
"moduleDesc": "Предназначен для специальной платы esp32 со встроенной камерой. Добавляет в прошивку функцию создания фото и сохранения в оперативную память. Для сброса на флешкарту необходимо использовать парный модуль SDcard. Это экспериментальные модули и в будущем планируется пересобрать их.",
"propInfo": {
"int": "Пауза в секундах во время постоянной съемки.",
"useLed": "использовать диод подсветки при съемке.",
"ticker": "Генерировать(1) или нет(0) событие с интервалом int",
"webTicker": "Генерировать(1) или нет(0) событие при обращении через веб-страницу с текущим фото в памяти."
}
},
"defActive": false,
"devices": {
"esp32_4mb": [
"espressif/esp32-camera @ ^2.0.0"
]
}
}

View File

@@ -1,9 +0,0 @@
[env:esp8266_4mb]
lib_deps =
[env:esp32_4mb]
lib_deps =
espressif/esp32-camera @ ^2.0.0
[iotm]
exclude = true

View File

@@ -1,17 +0,0 @@
[
{
"name": "Сервопривод",
"num": 30,
"type": "Writing",
"subtype": "IoTServo",
"id": "servo",
"widget": "range",
"page": "servo",
"descr": "угол",
"int": 1,
"pin": 12,
"apin": -1,
"amap": "0, 4096, 0, 180"
}
]

View File

@@ -0,0 +1,43 @@
{
"menuSection": "Модули управления",
"configItem": [{
"name": "Сервопривод",
"type": "Writing",
"subtype": "IoTServo",
"id": "servo",
"widget": "range",
"page": "servo",
"descr": "угол",
"int": 1,
"pin": 12,
"apin": -1,
"amap": "0, 4096, 0, 180"
}],
"about": {
"authorName": "Ilya Belyakov",
"authorContact": "https://t.me/Biveraxe",
"authorGit": "https://github.com/biveraxe",
"specialThanks": "Oleg @Threedreality, Sergey @Serghei63",
"moduleName": "IoTServo",
"moduleVersion": "1.0",
"moduleDesc": "Предназначен для управления сервоприводом по уровню аналогово сигнала.",
"propInfo": {
"int": "Пауза в секундах между опросами аналогового входа. Если 0, то читаем постоянно",
"pin": "Пин, к которому подключен сервопривод",
"apin": "Номер GPIO аналогового пина. Если -1, то функция отключена.",
"amap": "Настройки преобразования значений аналога в нужный диапазон сервы, имеет смысл, если аналог включен."
}
},
"defActive": true,
"devices": {
"esp32_4mb": [
"https://github.com/RoboticsBrno/ServoESP32"
],
"esp8266_4mb": []
}
}

View File

@@ -1,7 +0,0 @@
[env:esp8266_4mb]
lib_deps =
[env:esp32_4mb]
lib_deps =
https://github.com/RoboticsBrno/ServoESP32

View File

@@ -1,16 +0,0 @@
[
{
"name": "MP3 плеер",
"num": 30,
"type": "Reading",
"subtype": "Mp3",
"id": "mp3",
"widget": "",
"page": "",
"descr": "",
"int": 1,
"pins": "14,12",
"volume": 20
}
]

View File

@@ -0,0 +1,43 @@
{
"menuSection": "Модули управления",
"configItem": [{
"name": "MP3 плеер",
"type": "Reading",
"subtype": "Mp3",
"id": "mp3",
"widget": "",
"page": "",
"descr": "",
"int": 1,
"pins": "14,12",
"volume": 20
}],
"about": {
"authorName": "Ilya Belyakov",
"authorContact": "https://t.me/Biveraxe",
"authorGit": "https://github.com/biveraxe",
"specialThanks": "",
"moduleName": "Mp3",
"moduleVersion": "1.0",
"moduleDesc": "Позволяет управлять модулем проигрывания MP3 файлов с SD-карты по serial интерфейсу (DFplayer mini).",
"propInfo": {
"int": "Периодичность в секундах опроса состояния плеера.",
"pins": "Список GPIO через запятую, к которым подключен плеер.",
"volume": "Уровень громкости при инициализации."
}
},
"defActive": true,
"devices": {
"esp32_4mb": [
"dfrobot/DFRobotDFPlayerMini @ ^1.0.5"
],
"esp8266_4mb": [
"dfrobot/DFRobotDFPlayerMini @ ^1.0.5"
]
}
}

View File

@@ -1,10 +0,0 @@
[env:esp8266_4mb]
lib_deps =
dfrobot/DFRobotDFPlayerMini @ ^1.0.5
[env:esp32_4mb]
lib_deps =
dfrobot/DFRobotDFPlayerMini @ ^1.0.5
[iotm]
exclude = false

View File

@@ -1,14 +0,0 @@
[
{
"name": "SD карта",
"num": 30,
"type": "Writing",
"subtype": "SDcard",
"id": "sd",
"widget": "",
"page": "",
"descr": "",
"int": 60
}
]

View File

@@ -0,0 +1,36 @@
{
"menuSection": "Модули управления",
"configItem": [{
"name": "SD карта",
"type": "Writing",
"subtype": "SDcard",
"id": "sd",
"widget": "",
"page": "",
"descr": "",
"int": 1
}],
"about": {
"authorName": "Ilya Belyakov",
"authorContact": "https://t.me/Biveraxe",
"authorGit": "https://github.com/biveraxe",
"specialThanks": "",
"moduleName": "SDcard",
"moduleVersion": "1.0",
"moduleDesc": "Предназначен для специальной платы esp32 со встроенной камерой. Добавляет в прошивку функцию сохранения фото из оперативной памяти. Работает в паре с EspCam. Это экспериментальные модули и в будущем планируется пересобрать их.",
"propInfo": {
"int": "Не используется."
}
},
"defActive": false,
"devices": {
"esp32_4mb": [
"espressif/esp32-camera @ ^2.0.0"
]
}
}

View File

@@ -1,9 +0,0 @@
[env:esp8266_4mb]
lib_deps =
[env:esp32_4mb]
lib_deps =
[iotm]
exclude = true

View File

@@ -1,18 +0,0 @@
[
{
"name": "Телеграм-Бот",
"num": 31,
"type": "Writing",
"subtype": "Telegram",
"id": "tg",
"widget": "",
"page": "",
"descr": "",
"int": 10,
"token": "",
"autos": 1,
"receiveMsg": 0,
"chatID": ""
}
]

View File

@@ -0,0 +1,46 @@
{
"menuSection": "Модули управления",
"configItem": [{
"name": "Телеграм-Бот",
"type": "Writing",
"subtype": "Telegram",
"id": "tg",
"widget": "",
"page": "",
"descr": "",
"int": 10,
"token": "",
"autos": 1,
"receiveMsg": 0,
"chatID": ""
}],
"about": {
"authorName": "Ilya Belyakov",
"authorContact": "https://t.me/Biveraxe",
"authorGit": "https://github.com/biveraxe",
"specialThanks": "",
"moduleName": "Telegram",
"moduleVersion": "1.0",
"moduleDesc": "Добавляет возможность отправлять сообщения от имени бота контакту в Телеграм-чате и получать команды.",
"propInfo": {
"token": "Токен для авторизации бота в системе Telegram",
"autos": "Автоматически(1) или нет(0) запоминать ChatID по входящим сообщениям. Т.е. бот будет информировать тех, кто последний прислал сообщение.",
"receiveMsg": "Обрабатывать(1) или нет(0) входящие сообщения.",
"chatID": "ИД диалога с контактом. Необходим для отправки сообщений именно вам."
}
},
"defActive": true,
"devices": {
"esp32_4mb": [
"CTBot @2.1.9"
],
"esp8266_4mb": [
"CTBot @2.1.9"
]
}
}

View File

@@ -1,7 +0,0 @@
[env:esp8266_4mb]
lib_deps =
CTBot @2.1.9
[env:esp32_4mb]
lib_deps =
CTBot @2.1.9

View File

@@ -1,18 +0,0 @@
[
{
"name": "Таймер",
"num": 31,
"type": "Writing",
"subtype": "Timer",
"id": "timer",
"widget": "",
"page": "",
"descr": "",
"int": 1,
"countDown": 15,
"ticker": 0,
"repeat": 0,
"needSave": 0
}
]

View File

@@ -0,0 +1,43 @@
{
"menuSection": "Модули управления",
"configItem": [{
"name": "Таймер",
"type": "Writing",
"subtype": "Timer",
"id": "timer",
"widget": "",
"page": "",
"descr": "",
"int": 1,
"countDown": 15,
"ticker": 0,
"repeat": 0,
"needSave": 0
}],
"about": {
"authorName": "Ilya Belyakov",
"authorContact": "https://t.me/Biveraxe",
"authorGit": "https://github.com/biveraxe",
"specialThanks": "",
"moduleName": "Timer",
"moduleVersion": "1.0",
"moduleDesc": "Добавляет инструмент таймеров обратного отсчета для организации периодичных операций или логических конструкций. Часто используется как вспомогательный элемент для автоматизации.",
"propInfo": {
"int": "Задает размер в секундах одного шага(тика) таймера.",
"countDown": "Начальное значение таймера, с которого начинается обратный отсчет.",
"ticker": "Генерировать(1) или нет(0) события при каждом тике таймера.",
"repeat": "Сбрасывать(1) или нет(0) таймер в начальное состояние при достижении нуля.",
"needSave": "Требуется сохранять(1) или нет(0) состояние в энерго независимую память. Функция находится в разработке."
}
},
"defActive": true,
"devices": {
"esp32_4mb": [],
"esp8266_4mb": []
}
}

View File

@@ -1,5 +0,0 @@
[
{
"header": "Модули управления"
}
]

View File

@@ -1,6 +0,0 @@
[
{
"name": "Выберите элемент",
"num": 0
}
]

View File

@@ -1,32 +0,0 @@
[
{
"name": "LCD экран 2004",
"num": 25,
"type": "Reading",
"subtype": "Lcd2004",
"id": "Lcd",
"widget": "",
"page": "",
"descr": "T",
"int": 15,
"addr": "0x27",
"size": "20,4",
"coord": "0,0",
"id2show": "id датчика"
},
{
"name": "LCD экран 1602",
"num": 26,
"type": "Reading",
"subtype": "Lcd2004",
"id": "Lcd",
"widget": "",
"page": "",
"descr": "T",
"int": 15,
"addr": "0x27",
"size": "16,2",
"coord": "0,0",
"id2show": "id датчика"
}
]

View File

@@ -1,7 +0,0 @@
[env:esp8266_4mb]
lib_deps =
marcoschwartz/LiquidCrystal_I2C@^1.1.4
[env:esp32_4mb]
lib_deps =
marcoschwartz/LiquidCrystal_I2C@^1.1.4

View File

@@ -1,5 +0,0 @@
[
{
"header": "Экраны"
}
]

View File

@@ -1,12 +1,10 @@
[env:esp8266_4mb]
iotm_include = false
lib_deps =
https://github.com/jpliew/Wiegand-NG-Multi-Bit-Wiegand-Library-for-Arduino
[env:esp32_4mb]
iotm_include = false
lib_deps =
https://github.com/jpliew/Wiegand-NG-Multi-Bit-Wiegand-Library-for-Arduino
[iotm]
;exclude = false
exclude = true

View File

@@ -1,20 +0,0 @@
[
{
"name": "Поддержка DS1302(1), DS1307(2), DS3231(3), RX8025(4)",
"num": 29,
"type": "Reading",
"subtype": "IarduinoRTC",
"id": "RTC",
"widget": "",
"page": "",
"descr": "",
"int": "1",
"chipNum": 1,
"rst": 16,
"clk": 5,
"dat": 4,
"defFormat": "d-m-Y",
"ticker": 0
}
]

View File

@@ -0,0 +1,47 @@
{
"menuSection": "Расширения",
"configItem": [{
"name": "Поддержка DS1302(1), DS1307(2), DS3231(3), RX8025(4)",
"type": "Reading",
"subtype": "IarduinoRTC",
"id": "RTC",
"widget": "",
"page": "",
"descr": "",
"int": "1",
"chipNum": 1,
"rst": 16,
"clk": 5,
"dat": 4,
"defFormat": "d-m-Y",
"ticker": 0
}],
"about": {
"authorName": "Ilya Belyakov",
"authorContact": "https://t.me/Biveraxe",
"authorGit": "https://github.com/biveraxe",
"specialThanks": "Sergey @Serghei63",
"moduleName": "IarduinoRTC",
"moduleVersion": "1.0",
"moduleDesc": "Позволяет использовать часы реального времени в виде внешнего физического модуля или виртуального с синхронизацией через сеть Интернет.",
"propInfo": {
"int": "Период времени в секундах между опросами времени с RTC",
"chipNum": "Выбор источника: 0 - время с Интернет, 1 - модуль DS1302, 2 - модуль DS1307, 3 - модуль DS3231, 4 - модуль RX38025",
"rst": "Номер пина для подключения вашего модуля часов. (не всегда используется).",
"clk": "Номер пина для SDL вашего модуля часов",
"dat": "Номер пина для SDA вашего модуля часов",
"defFormat": "Вывод информации в формате defFormat",
"ticker": "Генерировать(1) или нет(0) события при каждом тике модуля = int. Позволяет не применять модуль таймера, если нужно просто тактировать работу."
}
},
"defActive": true,
"devices": {
"esp32_4mb": [],
"esp8266_4mb": []
}
}

View File

@@ -1,16 +0,0 @@
[
{
"name": "Расширитель портов Mcp23017",
"num": 29,
"type": "Reading",
"subtype": "Mcp23017",
"id": "Mcp",
"widget": "",
"page": "",
"descr": "",
"int": "0",
"addr": "0x20",
"index": 1
}
]

View File

@@ -0,0 +1,45 @@
{
"menuSection": "Расширения",
"configItem": [{
"name": "Расширитель портов Mcp23017",
"type": "Reading",
"subtype": "Mcp23017",
"id": "Mcp",
"widget": "",
"page": "",
"descr": "",
"int": "0",
"addr": "0x20",
"index": 1
}],
"about": {
"authorName": "Ilya Belyakov",
"authorContact": "https://t.me/Biveraxe",
"authorGit": "https://github.com/biveraxe",
"specialThanks": "",
"moduleName": "Mcp23017",
"moduleVersion": "1.0",
"moduleDesc": "Добавляет в систему дополнительные GPIO для элементов, которые поддерживают такую функцию.",
"propInfo": {
"int": "Не используется",
"addr": "Адрес устройства на шине, обычно 0x20",
"index": "Значения от 1 до 4, где при выборе 1 будет нумерация pin 100-115, при выборе 2 200-215 и т.д."
}
},
"defActive": true,
"devices": {
"esp32_4mb": [
"adafruit/Adafruit MCP23017 Arduino Library@^2.0.2",
"adafruit/Adafruit BusIO @ ^1.13.0"
],
"esp8266_4mb": [
"adafruit/Adafruit MCP23017 Arduino Library@^2.0.2",
"adafruit/Adafruit BusIO @ ^1.13.0"
]
}
}

View File

@@ -1,8 +0,0 @@
[env:esp8266_4mb]
lib_deps =
adafruit/Adafruit MCP23017 Arduino Library@^2.0.2
[env:esp32_4mb]
lib_deps =
adafruit/Adafruit MCP23017 Arduino Library@^2.0.2

View File

@@ -1,13 +0,0 @@
[
{
"name": "Доп. функции системы",
"num": 27,
"type": "Reading",
"subtype": "SysExt",
"id": "SysExt",
"widget": "",
"page": "",
"descr": "",
"int": 15
}
]

View File

@@ -0,0 +1,34 @@
{
"menuSection": "Расширения",
"configItem": [{
"name": "Доп. функции системы",
"type": "Reading",
"subtype": "SysExt",
"id": "SysExt",
"widget": "",
"page": "",
"descr": "",
"int": 15
}],
"about": {
"authorName": "Ilya Belyakov",
"authorContact": "https://t.me/Biveraxe",
"authorGit": "https://github.com/biveraxe",
"specialThanks": "",
"moduleName": "SysExt",
"moduleVersion": "1.0",
"moduleDesc": "Добавляет в систему дополнительные функции. Например, возможность прямого управления GPIO из сценариев.",
"propInfo": {
"int": "Не используется"
}
},
"defActive": true,
"devices": {
"esp32_4mb": [],
"esp8266_4mb": []
}
}

View File

@@ -1,15 +0,0 @@
[
{
"name": "Переменная",
"num": 30,
"type": "Reading",
"subtype": "Variable",
"id": "var",
"widget": "",
"page": "",
"descr": "",
"int": "0",
"val": "0"
}
]

View File

@@ -0,0 +1,37 @@
{
"menuSection": "Расширения",
"configItem": [{
"name": "Переменная",
"type": "Reading",
"subtype": "Variable",
"id": "var",
"widget": "",
"page": "",
"descr": "",
"int": "0",
"val": "0"
}],
"about": {
"authorName": "Ilya Belyakov",
"authorContact": "https://t.me/Biveraxe",
"authorGit": "https://github.com/biveraxe",
"specialThanks": "",
"moduleName": "Variable",
"moduleVersion": "1.0",
"moduleDesc": "Специальный системный модуль для использования переменных в процессе автоматизации как элементов конфигурации.",
"propInfo": {
"int": "Не используется",
"val": "Не используется"
}
},
"defActive": true,
"devices": {
"esp32_4mb": [],
"esp8266_4mb": []
}
}

View File

@@ -1,5 +0,0 @@
[
{
"header": "Расширения"
}
]

View File

@@ -1,46 +0,0 @@
#ifdef QUEUE_FROM_CHAR
#include "classes/QueueFromChar.h"
QueueFromChar::QueueFromChar() {
commandList = NULL;
commandCount = 0;
}
QueueFromChar::~QueueFromChar() {}
//добавление команды в буфер
void QueueFromChar::addCommand(const char* command) {
commandList = (CharBufferStruct*)realloc(commandList, (commandCount + 1) * sizeof(CharBufferStruct));
strncpy(commandList[commandCount].command, command, MAX_COMMAND_LENGTH);
Serial.println("command added: " + String(command) + " " + String(commandCount));
commandCount++;
}
//распечатаем все добавленные команды
void QueueFromChar::printCommands() {
if (commandCount > 0 && commandList != NULL) {
for (int i = 0; i < commandCount; i++) {
Serial.println(commandList[i].command);
}
}
}
//заберем последнюю из положенных в буфер команд
String QueueFromChar::getLastCommand() {
String ret = "empty";
if (commandList != NULL) {
int cnt = commandCount - 1;
ret = commandList[cnt].command;
if (cnt > 0) {
delete commandList[cnt].command;
} else if (cnt == 0) {
commandList = NULL;
}
Serial.println("command deleted: " + ret + " " + String(cnt));
commandCount--;
}
return ret;
}
// QueueFromChar* myBuf;
#endif

View File

@@ -1,42 +0,0 @@
#pragma once
#include "Global.h"
#ifdef QUEUE_FROM_CHAR
#define MAX_COMMAND_LENGTH 16
#define BUFFER 128
class QueueFromChar;
class QueueFromChar {
public:
QueueFromChar();
~QueueFromChar();
void addCommand(const char* command);
void printCommands();
String getLastCommand();
private:
struct CharBufferStruct {
char command[MAX_COMMAND_LENGTH + 1];
};
CharBufferStruct* commandList;
int commandCount = 0;
};
// extern QueueFromChar* myBuf;
//========проверка очереди=====================
// myBuf = new QueueFromChar;
// myBuf->addCommand("zero");
// myBuf->addCommand("one");
// myBuf->addCommand("two");
// myBuf->printCommands();
// myBuf->getLastCommand();
// myBuf->getLastCommand();
// myBuf->getLastCommand();
// myBuf->printCommands();
#endif

View File

@@ -1,30 +0,0 @@
#ifdef QUEUE_FROM_INST
#include "classes/QueueFromInstance.h"
QueueFromInstance::QueueFromInstance() {}
QueueFromInstance::~QueueFromInstance() {}
//добавим элемент в конец очереди
void QueueFromInstance::push(QueueInstance instance) {
queue1.push(instance);
}
//удалим элемент из начала очереди
void QueueFromInstance::pop() {
if (!queue1.empty()) {
queue1.pop();
}
}
//вернуть элемент из начала очереди и удалить его
QueueInstance QueueFromInstance::front() {
QueueInstance instance("");
if (!queue1.empty()) {
instance = queue1.front();
queue1.pop();
}
return instance;
}
// QueueFromInstance* myQueue;
#endif

View File

@@ -1,26 +0,0 @@
#pragma once
#include "Global.h"
#ifdef QUEUE_FROM_INST
#include "classes/QueueInst.h"
#include <queue>
#include <iostream>
using namespace std;
class QueueFromInstance;
class QueueFromInstance {
public:
QueueFromInstance();
~QueueFromInstance();
void push(QueueInstance instance);
void pop();
QueueInstance front();
private:
queue<QueueInstance> queue1;
};
// extern QueueFromInstance* myQueue;
#endif

View File

@@ -1,32 +0,0 @@
#include "classes/QueueFromStruct.h"
#ifdef QUEUE_FROM_STR
QueueFromStruct::QueueFromStruct() {}
QueueFromStruct::~QueueFromStruct() {}
//добавим элемент в конец очереди
void QueueFromStruct::push(QueueItems word) {
queue1.push(word);
}
//удалим элемент из начала очереди
void QueueFromStruct::pop() {
if (!queue1.empty()) {
queue1.pop();
}
}
//вернуть элемент из начала очереди и удалить его
QueueItems QueueFromStruct::front() {
if (!queue1.empty()) {
tmpItem = queue1.front();
queue1.pop();
}
return tmpItem;
}
bool QueueFromStruct::empty() {
return queue1.empty();
}
QueueFromStruct* filesQueue;
#endif

View File

@@ -1,46 +0,0 @@
#pragma once
#include "Global.h"
#ifdef QUEUE_FROM_STR
#include <queue>
//#include <iostream> долбанный стрим сука
using namespace std;
struct QueueItems {
String myword;
uint8_t num;
};
class QueueFromStruct;
class QueueFromStruct {
public:
QueueFromStruct();
~QueueFromStruct();
void push(QueueItems word);
void pop();
QueueItems front();
bool empty();
private:
queue<QueueItems> queue1;
QueueItems tmpItem;
};
extern QueueFromStruct* filesQueue;
//=======проверка очереди из структур=================
// myQueueStruct = new QueueFromStruct;
// QueueItems myItem;
// myItem.myword = "word1";
// myQueueStruct->push(myItem);
// myItem.myword = "word2";
// myQueueStruct->push(myItem);
// myItem.myword = "word3";
// myQueueStruct->push(myItem);
// Serial.println(myQueueStruct->front().myword);
// Serial.println(myQueueStruct->front().myword);
// Serial.println(myQueueStruct->front().myword);
#endif

View File

@@ -1,24 +0,0 @@
#ifdef QUEUE_FROM_INST
#include "queue/QueueInst.h"
QueueInstance::QueueInstance(String text) {
_text = text;
}
QueueInstance::~QueueInstance() {}
String QueueInstance::get() {
return _text;
}
//========проверка очереди из экземпляров======
// myQueue = new QueueFromInstance;
// myQueue->push(QueueInstance("text1"));
// myQueue->push(QueueInstance("text2"));
// myQueue->push(QueueInstance("text3"));
// Serial.println(myQueue->front().get());
// Serial.println(myQueue->front().get());
// Serial.println(myQueue->front().get());
#endif

View File

@@ -1,21 +0,0 @@
#pragma once
#include "Global.h"
#ifdef QUEUE_FROM_INST
#include <queue>
#include <iostream>
using namespace std;
class QueueInstance;
class QueueInstance {
public:
QueueInstance(String text);
~QueueInstance();
String get();
private:
String _text;
};
#endif

View File

@@ -1,44 +0,0 @@
#include "classes/SendJson.h"
#ifdef QUEUE_FROM_STR
SendJson::SendJson() {
filesQueue = new QueueFromStruct;
}
SendJson::~SendJson() {}
void SendJson::addFileToQueue(String path, uint8_t num) {
myItem.myword = path;
myItem.num = num;
filesQueue->push(myItem);
SerialPrint(F("i"), F("WS"), "file added to Queue " + path);
}
//опсылает массив json по объектно в сокеты
void SendJson::loop() {
if (!filesQueue->empty() && !sendingInProgress) {
Serial.println("Queue not empty");
myItem = filesQueue->front();
_path = myItem.myword;
_num = myItem.num;
file = seekFile(_path);
SerialPrint(F("i"), F("WS"), "seek File to WS " + _path);
sendingInProgress = true;
}
if (file.available()) {
String jsonArrayElement = _path + file.readStringUntil('}') + "}";
sendWs(jsonArrayElement);
} else {
sendingInProgress = false;
}
}
void SendJson::sendWs(String& jsonArrayElement) {
standWebSocket.sendTXT(_num, jsonArrayElement);
}
void SendJson::sendMqtt(String& jsonArrayElement) {
// mqtt send to do
}
SendJson* sendJsonFiles;
#endif

View File

@@ -1,31 +0,0 @@
#pragma once
#include "Global.h"
#ifdef QUEUE_FROM_STR
#include "classes/QueueFromStruct.h"
class SendJson;
class SendJson {
public:
SendJson();
~SendJson();
void addFileToQueue(String path, uint8_t num);
void loop();
void sendWs(String& jsonArrayElement);
void sendMqtt(String& jsonArrayElement);
QueueItems myItem;
private:
File file;
String _path;
uint8_t _num;
bool sendingInProgress = false;
};
extern SendJson* sendJsonFiles;
#endif

View File

@@ -1,8 +0,0 @@
здесь пишу статистику по остатку оперативной памяти после глобальных изменений
22.12.21 пустой код без wifi остаток = 50.28 kB
22.12.21 запустил wifi остаток = 48.59 kB
22.12.21 добавил асинхронный веб сервер = 38.36 kB
22.12.21 добавил web sockets = 37.63 kB
20.01.22 стандартный сервер mqtt в работе = 41.00 kb