diff --git a/data_svelte/items.json b/data_svelte/items.json index 76ee2b84..c1b7c299 100644 --- a/data_svelte/items.json +++ b/data_svelte/items.json @@ -260,5 +260,19 @@ "size": "16,2", "coord": "0,0", "id2show": "id датчика" + }, + { + "header": "Расширения" + }, + { + "name": "20. Доп. функции системы", + "num": 20, + "type": "Reading", + "subtype": "SysExt", + "id": "SysExt", + "widget": "", + "page": "", + "descr": "", + "int": 15 } ] \ No newline at end of file diff --git a/src/modules/API.cpp b/src/modules/API.cpp index 2cb32ae0..52364d37 100644 --- a/src/modules/API.cpp +++ b/src/modules/API.cpp @@ -12,6 +12,7 @@ void* getAPI_Aht20(String subtype, String params); void* getAPI_Hdc1080(String subtype, String params); void* getAPI_GY21(String subtype, String params); void* getAPI_Lcd2004(String subtype, String params); +void* getAPI_SysExt(String subtype, String params); //============================================================================================ void* getAPI(String subtype, String params) { @@ -28,6 +29,7 @@ void* getAPI(String subtype, String params) { if ((tmpAPI = getAPI_Hdc1080(subtype, params)) != nullptr) return tmpAPI; if ((tmpAPI = getAPI_GY21(subtype, params)) != nullptr) return tmpAPI; if ((tmpAPI = getAPI_Lcd2004(subtype, params)) != nullptr) return tmpAPI; + if ((tmpAPI = getAPI_SysExt(subtype, params)) != nullptr) return tmpAPI; //================================================================================================================ return nullptr; diff --git a/src/modules/SysExt.cpp b/src/modules/SysExt.cpp new file mode 100644 index 00000000..4c04cc2d --- /dev/null +++ b/src/modules/SysExt.cpp @@ -0,0 +1,48 @@ +#include "Global.h" +#include "classes/IoTItem.h" + +// Пример модуля расширения возможностей системы на примере добавления новых команд в сценарии +// При комбинации использования doByInterval() и execute() можно обеспечить интеграцию с внешними сервисами, такими как Telegram, например. +// + +class SysExt : public IoTItem { + public: + SysExt(String parameters): IoTItem(parameters) { + // инициализация внутренних переменных и объектов для взаимодействия с внешними системами + //jsonRead(parameters, "addr", addr); // получаем параметры из настроек модуля. Наименования могут быть любыми. + } + + void doByInterval() { + // выполнение периодических проверок каждые Int секунд из настроек модуля + + //regEvent(Значение, Описание); // регистрация найденного события после проверок для запуска сценариев и других реакций в системе + } + + //void loop() { + // выполнение необходимых проверок в теле основного цикла программы. + // ВАЖНО: 1. при использовании loop() отключается doByInterval() + // 2. любые заминки в данном цикле повлияют на общую работу системы + //} + + IoTValue execute(String command, std::vector ¶m) { + // реакция на вызов команды модуля из сценария + // String command - имя команды после ID. (ID.Команда()) + // param - вектор ("массив") значений параметров переданных вместе с командой: ID.Команда("пар1", 22, 33) -> param[0].ValS = "пар1", param[1].ValD = 22 + + if (command == "reboot") { // выполняем код при вызове спец команды из сценария: ID.reboot(); + ESP.restart(); + } + + return {}; // команда поддерживает возвращаемое значения. Т.е. по итогу выполнения команды или общения с внешней системой, можно вернуть значение в сценарий для дальнейшей обработки + } + + ~SysExt(){}; +}; + +void* getAPI_SysExt(String subtype, String param) { + if (subtype == F("SysExt")) { + return new SysExt(param); + } else { + return nullptr; + } +}