Browse Source

Test: check core feature build (#2080)

* Test: check core feature build

* order

* add missing
master
Max Prokhorov 4 years ago
committed by GitHub
parent
commit
37763f1ad4
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
21 changed files with 325 additions and 251 deletions
  1. +0
    -64
      code/espurna/config/prototypes.h
  2. +1
    -0
      code/espurna/espurna.ino
  3. +2
    -0
      code/espurna/homeassistant.ino
  4. +1
    -0
      code/espurna/light.ino
  5. +1
    -0
      code/espurna/mqtt.ino
  6. +1
    -0
      code/espurna/nofuss.ino
  7. +1
    -0
      code/espurna/ntp.ino
  8. +4
    -1
      code/espurna/ota.h
  9. +1
    -0
      code/espurna/ota_arduinoota.ino
  10. +1
    -0
      code/espurna/relay.ino
  11. +3
    -2
      code/espurna/rfbridge.ino
  12. +1
    -0
      code/espurna/rfm69.ino
  13. +24
    -22
      code/espurna/rtcmem.ino
  14. +5
    -3
      code/espurna/sensor.ino
  15. +4
    -2
      code/espurna/thermostat.ino
  16. +2
    -0
      code/espurna/utils.h
  17. +2
    -0
      code/espurna/wifi.ino
  18. +67
    -0
      code/espurna/ws.h
  19. +21
    -157
      code/espurna/ws.ino
  20. +167
    -0
      code/espurna/ws_internal.h
  21. +16
    -0
      code/test/build/core.h

+ 0
- 64
code/espurna/config/prototypes.h View File

@ -11,7 +11,6 @@ extern "C" {
}
#define UNUSED(x) (void)(x)
#define INLINE inline __attribute__((always_inline))
// -----------------------------------------------------------------------------
// System
@ -313,69 +312,6 @@ using web_request_callback_f = std::function<bool(AsyncWebServerRequest*)>;
void webBodyRegister(web_body_callback_f);
void webRequestRegister(web_request_callback_f);
// -----------------------------------------------------------------------------
// WebSockets
// -----------------------------------------------------------------------------
#include <queue>
// TODO: pending configuration headers refactoring... here for now
struct ws_counter_t;
struct ws_data_t;
struct ws_debug_t;
struct ws_callbacks_t;
using ws_on_send_callback_f = std::function<void(JsonObject& root)>;
using ws_on_action_callback_f = std::function<void(uint32_t client_id, const char * action, JsonObject& data)>;
using ws_on_keycheck_callback_f = std::function<bool(const char * key, JsonVariant& value)>;
using ws_on_send_callback_list_t = std::vector<ws_on_send_callback_f>;
using ws_on_action_callback_list_t = std::vector<ws_on_action_callback_f>;
using ws_on_keycheck_callback_list_t = std::vector<ws_on_keycheck_callback_f>;
#if WEB_SUPPORT
struct ws_callbacks_t {
ws_on_send_callback_list_t on_visible;
ws_on_send_callback_list_t on_connected;
ws_on_send_callback_list_t on_data;
ws_on_action_callback_list_t on_action;
ws_on_keycheck_callback_list_t on_keycheck;
ws_callbacks_t& onVisible(ws_on_send_callback_f);
ws_callbacks_t& onConnected(ws_on_send_callback_f);
ws_callbacks_t& onData(ws_on_send_callback_f);
ws_callbacks_t& onAction(ws_on_action_callback_f);
ws_callbacks_t& onKeyCheck(ws_on_keycheck_callback_f);
};
ws_callbacks_t& wsRegister();
void wsSetup();
void wsSend(uint32_t client_id, const char* data);
void wsSend(uint32_t client_id, JsonObject& root);
void wsSend(JsonObject& root);
void wsSend(ws_on_send_callback_f callback);
void wsSend_P(PGM_P data);
void wsSend_P(uint32_t client_id, PGM_P data);
void INLINE wsPost(const ws_on_send_callback_f& callback);
void INLINE wsPost(uint32_t client_id, const ws_on_send_callback_f& callback);
void INLINE wsPost(const ws_on_send_callback_list_t& callbacks);
void INLINE wsPost(uint32_t client_id, const ws_on_send_callback_list_t& callbacks);
void INLINE wsPostAll(uint32_t client_id, const ws_on_send_callback_list_t& callbacks);
void INLINE wsPostAll(const ws_on_send_callback_list_t& callbacks);
void INLINE wsPostSequence(uint32_t client_id, const ws_on_send_callback_list_t& callbacks);
void INLINE wsPostSequence(uint32_t client_id, ws_on_send_callback_list_t&& callbacks);
void INLINE wsPostSequence(const ws_on_send_callback_list_t& callbacks);
bool INLINE wsConnected();
bool INLINE wsConnected(uint32_t client_id);
bool wsDebugSend(const char* prefix, const char* message);
#endif
// -----------------------------------------------------------------------------
// WIFI
// -----------------------------------------------------------------------------


+ 1
- 0
code/espurna/espurna.ino View File

@ -27,6 +27,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#include "relay.h"
#include "broker.h"
#include "tuya.h"
#include "ws.h"
#include "libs/HeapStats.h"
using void_callback_f = void (*)();


+ 2
- 0
code/espurna/homeassistant.ino View File

@ -12,6 +12,8 @@ Copyright (C) 2017-2019 by Xose Pérez <xose dot perez at gmail dot com>
#include <Schedule.h>
#include <ArduinoJson.h>
#include "ws.h"
bool _ha_enabled = false;
bool _ha_send_flag = false;


+ 1
- 0
code/espurna/light.ino View File

@ -11,6 +11,7 @@ Copyright (C) 2016-2019 by Xose Pérez <xose dot perez at gmail dot com>
#include "tuya.h"
#include "light.h"
#include "broker.h"
#include "ws.h"
#include <Ticker.h>
#include <Schedule.h>


+ 1
- 0
code/espurna/mqtt.ino View File

@ -20,6 +20,7 @@ Updated secure client support by Niek van der Maas < mail at niekvandermaas dot
#include "system.h"
#include "libs/SecureClientHelpers.h"
#include "ws.h"
#if MQTT_LIBRARY == MQTT_LIBRARY_ASYNCMQTTCLIENT


+ 1
- 0
code/espurna/nofuss.ino View File

@ -9,6 +9,7 @@ Copyright (C) 2016-2019 by Xose Pérez <xose dot perez at gmail dot com>
#if NOFUSS_SUPPORT
#include "NoFUSSClient.h"
#include "ws.h"
unsigned long _nofussLastCheck = 0;
unsigned long _nofussInterval = 0;


+ 1
- 0
code/espurna/ntp.ino View File

@ -14,6 +14,7 @@ Copyright (C) 2016-2019 by Xose Pérez <xose dot perez at gmail dot com>
#include "libs/NtpClientWrap.h"
#include "broker.h"
#include "ws.h"
Ticker _ntp_defer;


+ 4
- 1
code/espurna/ota.h View File

@ -6,6 +6,7 @@ OTA COMMON FUNCTIONS
#pragma once
#include "ws.h"
#include <Updater.h>
void otaPrintError() {
@ -61,7 +62,9 @@ bool otaVerifyHeader(uint8_t* data, size_t len) {
void otaProgress(size_t bytes, size_t each = 8192u) {
// Removed to avoid websocket ping back during upgrade (see #1574)
// TODO: implement as separate from debugging message
if (wsConnected()) return;
#if WEB_SUPPORT
if (wsConnected()) return;
#endif
// Telnet and serial will still output things, but slightly throttled
static size_t last = 0;


+ 1
- 0
code/espurna/ota_arduinoota.ino View File

@ -9,6 +9,7 @@ Copyright (C) 2016-2019 by Xose Pérez <xose dot perez at gmail dot com>
#if OTA_ARDUINOOTA_SUPPORT
#include "system.h"
#include "ws.h"
// TODO: allocate ArduinoOTAClass on-demand, stop using global instance


+ 1
- 0
code/espurna/relay.ino View File

@ -16,6 +16,7 @@ Copyright (C) 2016-2019 by Xose Pérez <xose dot perez at gmail dot com>
#include "relay.h"
#include "broker.h"
#include "tuya.h"
#include "ws.h"
#include "relay_config.h"


+ 3
- 2
code/espurna/rfbridge.ino View File

@ -8,14 +8,15 @@ Copyright (C) 2016-2019 by Xose Pérez <xose dot perez at gmail dot com>
#if RF_SUPPORT
#include "relay.h"
#include <queue>
#if RFB_DIRECT
#include <RCSwitch.h>
#endif
#include "relay.h"
#include "ws.h"
// -----------------------------------------------------------------------------
// DEFINITIONS
// -----------------------------------------------------------------------------


+ 1
- 0
code/espurna/rfm69.ino View File

@ -9,6 +9,7 @@ Copyright (C) 2016-2017 by Xose Pérez <xose dot perez at gmail dot com>
#if RFM69_SUPPORT
#include "libs/RFM69Wrap.h"
#include "ws.h"
#define RFM69_PACKET_SEPARATOR ':'


+ 24
- 22
code/espurna/rtcmem.ino View File

@ -46,39 +46,41 @@ void _rtcmemInitCommands() {
_rtcmemInit();
});
terminalRegisterCommand(F("RTCMEM.DUMP"), [](Embedis* e) {
#if DEBUG_SUPPORT
terminalRegisterCommand(F("RTCMEM.DUMP"), [](Embedis* e) {
DEBUG_MSG_P(PSTR("[RTCMEM] boot_status=%u status=%u blocks_used=%u\n"),
_rtcmem_status, _rtcmemStatus(), RtcmemSize);
DEBUG_MSG_P(PSTR("[RTCMEM] boot_status=%u status=%u blocks_used=%u\n"),
_rtcmem_status, _rtcmemStatus(), RtcmemSize);
String line;
line.reserve(96);
char buffer[16] = {0};
String line;
line.reserve(96);
char buffer[16] = {0};
auto addr = reinterpret_cast<volatile uint32_t*>(RTCMEM_ADDR);
auto addr = reinterpret_cast<volatile uint32_t*>(RTCMEM_ADDR);
uint8_t block = 1;
uint8_t offset = 0;
uint8_t start = 0;
uint8_t block = 1;
uint8_t offset = 0;
uint8_t start = 0;
do {
do {
offset = block - 1;
offset = block - 1;
snprintf(buffer, sizeof(buffer), "%08x ", *(addr + offset));
line += buffer;
snprintf(buffer, sizeof(buffer), "%08x ", *(addr + offset));
line += buffer;
if ((block % 8) == 0) {
DEBUG_MSG_P(PSTR("%02u %p: %s\n"), start, addr+start, line.c_str());
start = block;
line = "";
}
if ((block % 8) == 0) {
DEBUG_MSG_P(PSTR("%02u %p: %s\n"), start, addr+start, line.c_str());
start = block;
line = "";
}
++block;
++block;
} while (block<(RTCMEM_BLOCKS+1));
} while (block<(RTCMEM_BLOCKS+1));
});
});
#endif
}
#endif


+ 5
- 3
code/espurna/sensor.ino View File

@ -8,9 +8,6 @@ Copyright (C) 2016-2019 by Xose Pérez <xose dot perez at gmail dot com>
#if SENSOR_SUPPORT
#include "relay.h"
#include "broker.h"
#include <vector>
#include "filters/LastFilter.h"
#include "filters/MaxFilter.h"
@ -20,6 +17,11 @@ Copyright (C) 2016-2019 by Xose Pérez <xose dot perez at gmail dot com>
#include <float.h>
#include "relay.h"
#include "broker.h"
#include "ws.h"
struct sensor_magnitude_t {
BaseSensor * sensor; // Sensor object
BaseFilter * filter; // Filter object


+ 4
- 2
code/espurna/thermostat.ino View File

@ -8,11 +8,13 @@ Copyright (C) 2017 by Dmitry Blinov <dblinov76 at gmail dot com>
#if THERMOSTAT_SUPPORT
#include "relay.h"
#include <ArduinoJson.h>
#include <float.h>
#include "relay.h"
#include "ws.h"
bool _thermostat_enabled = true;
bool _thermostat_mode_cooler = false;


+ 2
- 0
code/espurna/utils.h View File

@ -8,6 +8,8 @@ Copyright (C) 2017-2019 by Xose Pérez <xose dot perez at gmail dot com>
#pragma once
#define INLINE inline __attribute__((always_inline))
extern "C" uint32_t _SPIFFS_start;
extern "C" uint32_t _SPIFFS_end;


+ 2
- 0
code/espurna/wifi.ino View File

@ -9,6 +9,8 @@ Copyright (C) 2016-2019 by Xose Pérez <xose dot perez at gmail dot com>
#include <JustWifi.h>
#include <Ticker.h>
#include "ws.h"
bool _wifi_wps_running = false;
bool _wifi_smartconfig_running = false;
bool _wifi_smartconfig_initial = false;


+ 67
- 0
code/espurna/ws.h View File

@ -0,0 +1,67 @@
/*
WEBSOCKET MODULE
Copyright (C) 2016-2019 by Xose Pérez <xose dot perez at gmail dot com>
*/
#pragma once
#include <ArduinoJson.h>
#include <queue>
#include <functional>
#include <vector>
#include "utils.h"
using ws_on_send_callback_f = std::function<void(JsonObject& root)>;
using ws_on_action_callback_f = std::function<void(uint32_t client_id, const char * action, JsonObject& data)>;
using ws_on_keycheck_callback_f = std::function<bool(const char * key, JsonVariant& value)>;
using ws_on_send_callback_list_t = std::vector<ws_on_send_callback_f>;
using ws_on_action_callback_list_t = std::vector<ws_on_action_callback_f>;
using ws_on_keycheck_callback_list_t = std::vector<ws_on_keycheck_callback_f>;
struct ws_callbacks_t {
ws_on_send_callback_list_t on_visible;
ws_on_send_callback_list_t on_connected;
ws_on_send_callback_list_t on_data;
ws_on_action_callback_list_t on_action;
ws_on_keycheck_callback_list_t on_keycheck;
ws_callbacks_t& onVisible(ws_on_send_callback_f);
ws_callbacks_t& onConnected(ws_on_send_callback_f);
ws_callbacks_t& onData(ws_on_send_callback_f);
ws_callbacks_t& onAction(ws_on_action_callback_f);
ws_callbacks_t& onKeyCheck(ws_on_keycheck_callback_f);
};
ws_callbacks_t& wsRegister();
void wsSetup();
void wsSend(uint32_t client_id, const char* data);
void wsSend(uint32_t client_id, JsonObject& root);
void wsSend(JsonObject& root);
void wsSend(ws_on_send_callback_f callback);
void wsSend_P(PGM_P data);
void wsSend_P(uint32_t client_id, PGM_P data);
void INLINE wsPost(const ws_on_send_callback_f& callback);
void INLINE wsPost(uint32_t client_id, const ws_on_send_callback_f& callback);
void INLINE wsPost(const ws_on_send_callback_list_t& callbacks);
void INLINE wsPost(uint32_t client_id, const ws_on_send_callback_list_t& callbacks);
void INLINE wsPostAll(uint32_t client_id, const ws_on_send_callback_list_t& callbacks);
void INLINE wsPostAll(const ws_on_send_callback_list_t& callbacks);
void INLINE wsPostSequence(uint32_t client_id, const ws_on_send_callback_list_t& callbacks);
void INLINE wsPostSequence(uint32_t client_id, ws_on_send_callback_list_t&& callbacks);
void INLINE wsPostSequence(const ws_on_send_callback_list_t& callbacks);
bool INLINE wsConnected();
bool INLINE wsConnected(uint32_t client_id);
bool wsDebugSend(const char* prefix, const char* message);

+ 21
- 157
code/espurna/ws.ino View File

@ -15,6 +15,8 @@ Copyright (C) 2016-2019 by Xose Pérez <xose dot perez at gmail dot com>
#include <vector>
#include "system.h"
#include "ws.h"
#include "ws_internal.h"
#include "libs/WebSocketIncommingBuffer.h"
AsyncWebSocket _ws("/ws");
@ -51,112 +53,12 @@ ws_callbacks_t& ws_callbacks_t::onKeyCheck(ws_on_keycheck_callback_f cb) {
}
ws_callbacks_t _ws_callbacks;
struct ws_counter_t {
ws_counter_t() : current(0), start(0), stop(0) {}
ws_counter_t(uint32_t start, uint32_t stop) :
current(start), start(start), stop(stop) {}
void reset() {
current = start;
}
void next() {
if (current < stop) {
++current;
}
}
bool done() {
return (current >= stop);
}
uint32_t current;
uint32_t start;
uint32_t stop;
};
struct ws_data_t {
enum mode_t {
SEQUENCE,
ALL
};
ws_data_t(const ws_on_send_callback_f& cb) :
storage(new ws_on_send_callback_list_t {cb}),
client_id(0),
mode(ALL),
callbacks(*storage.get()),
counter(0, 1)
{}
ws_data_t(uint32_t client_id, const ws_on_send_callback_f& cb) :
storage(new ws_on_send_callback_list_t {cb}),
client_id(client_id),
mode(ALL),
callbacks(*storage.get()),
counter(0, 1)
{}
ws_data_t(const uint32_t client_id, ws_on_send_callback_list_t&& callbacks, mode_t mode = SEQUENCE) :
storage(new ws_on_send_callback_list_t(std::move(callbacks))),
client_id(client_id),
mode(mode),
callbacks(*storage.get()),
counter(0, (storage.get())->size())
{}
ws_data_t(const uint32_t client_id, const ws_on_send_callback_list_t& callbacks, mode_t mode = SEQUENCE) :
client_id(client_id),
mode(mode),
callbacks(callbacks),
counter(0, callbacks.size())
{}
bool done() {
return counter.done();
}
void sendAll(JsonObject& root) {
while (!counter.done()) counter.next();
for (auto& callback : callbacks) {
callback(root);
}
}
void sendCurrent(JsonObject& root) {
callbacks[counter.current](root);
counter.next();
}
void send(JsonObject& root) {
switch (mode) {
case SEQUENCE: sendCurrent(root); break;
case ALL: sendAll(root); break;
}
}
std::unique_ptr<ws_on_send_callback_list_t> storage;
const uint32_t client_id;
const mode_t mode;
const ws_on_send_callback_list_t& callbacks;
ws_counter_t counter;
};
std::queue<ws_data_t> _ws_client_data;
// -----------------------------------------------------------------------------
// WS authentication
// -----------------------------------------------------------------------------
struct ws_ticket_t {
IPAddress ip;
unsigned long timestamp = 0;
};
ws_ticket_t _ws_tickets[WS_BUFFER_SIZE];
void _onAuth(AsyncWebServerRequest *request) {
@ -206,71 +108,33 @@ bool _wsAuth(AsyncWebSocketClient * client) {
#if DEBUG_WEB_SUPPORT
using ws_debug_msg_t = std::pair<String, String>;
struct ws_debug_t {
ws_debug_t(size_t capacity) :
flush(false),
current(0),
capacity(capacity)
{
messages.reserve(capacity);
}
ws_debug_t _ws_debug(WS_DEBUG_MSG_BUFFER);
void clear() {
messages.clear();
current = 0;
flush = false;
void ws_debug_t::send(const bool connected) {
if (!connected && flush) {
clear();
return;
}
void add(const char* prefix, const char* message) {
if (current >= capacity) {
flush = true;
send(wsConnected());
}
messages.emplace(messages.begin() + current, prefix, message);
flush = true;
++current;
}
if (!flush) return;
// ref: http://arduinojson.org/v5/assistant/
// {"weblog": {"msg":[...],"pre":[...]}}
DynamicJsonBuffer jsonBuffer(2*JSON_ARRAY_SIZE(messages.size()) + JSON_OBJECT_SIZE(1) + JSON_OBJECT_SIZE(2));
void send(const bool connected) {
if (!connected && flush) {
clear();
return;
}
if (!flush) return;
// ref: http://arduinojson.org/v5/assistant/
// {"weblog": {"msg":[...],"pre":[...]}}
DynamicJsonBuffer jsonBuffer(2*JSON_ARRAY_SIZE(messages.size()) + JSON_OBJECT_SIZE(1) + JSON_OBJECT_SIZE(2));
JsonObject& root = jsonBuffer.createObject();
JsonObject& weblog = root.createNestedObject("weblog");
JsonArray& msg = weblog.createNestedArray("msg");
JsonArray& pre = weblog.createNestedArray("pre");
JsonObject& root = jsonBuffer.createObject();
JsonObject& weblog = root.createNestedObject("weblog");
for (auto& message : messages) {
pre.add(message.first.c_str());
msg.add(message.second.c_str());
}
JsonArray& msg = weblog.createNestedArray("msg");
JsonArray& pre = weblog.createNestedArray("pre");
wsSend(root);
clear();
for (auto& message : messages) {
pre.add(message.first.c_str());
msg.add(message.second.c_str());
}
bool flush;
size_t current;
const size_t capacity;
std::vector<ws_debug_msg_t> messages;
};
// TODO: move to the headers?
constexpr const size_t WS_DEBUG_MSG_BUFFER = 8;
ws_debug_t _ws_debug(WS_DEBUG_MSG_BUFFER);
wsSend(root);
clear();
}
bool wsDebugSend(const char* prefix, const char* message) {
if (!wsConnected()) return false;


+ 167
- 0
code/espurna/ws_internal.h View File

@ -0,0 +1,167 @@
/*
WEBSOCKET MODULE
Copyright (C) 2016-2019 by Xose Pérez <xose dot perez at gmail dot com>
*/
#pragma once
#include <IPAddress.h>
#include <cstdint>
#include <memory>
#include <vector>
constexpr const size_t WS_DEBUG_MSG_BUFFER = 8;
// -----------------------------------------------------------------------------
// WS authentication
// -----------------------------------------------------------------------------
struct ws_ticket_t {
IPAddress ip;
unsigned long timestamp = 0;
};
// -----------------------------------------------------------------------------
// WS callbacks
// -----------------------------------------------------------------------------
struct ws_counter_t {
ws_counter_t() : current(0), start(0), stop(0) {}
ws_counter_t(uint32_t start, uint32_t stop) :
current(start), start(start), stop(stop) {}
void reset() {
current = start;
}
void next() {
if (current < stop) {
++current;
}
}
bool done() {
return (current >= stop);
}
uint32_t current;
uint32_t start;
uint32_t stop;
};
struct ws_data_t {
enum mode_t {
SEQUENCE,
ALL
};
ws_data_t(const ws_on_send_callback_f& cb) :
storage(new ws_on_send_callback_list_t {cb}),
client_id(0),
mode(ALL),
callbacks(*storage.get()),
counter(0, 1)
{}
ws_data_t(uint32_t client_id, const ws_on_send_callback_f& cb) :
storage(new ws_on_send_callback_list_t {cb}),
client_id(client_id),
mode(ALL),
callbacks(*storage.get()),
counter(0, 1)
{}
ws_data_t(const uint32_t client_id, ws_on_send_callback_list_t&& callbacks, mode_t mode = SEQUENCE) :
storage(new ws_on_send_callback_list_t(std::move(callbacks))),
client_id(client_id),
mode(mode),
callbacks(*storage.get()),
counter(0, (storage.get())->size())
{}
ws_data_t(const uint32_t client_id, const ws_on_send_callback_list_t& callbacks, mode_t mode = SEQUENCE) :
client_id(client_id),
mode(mode),
callbacks(callbacks),
counter(0, callbacks.size())
{}
bool done() {
return counter.done();
}
void sendAll(JsonObject& root) {
while (!counter.done()) counter.next();
for (auto& callback : callbacks) {
callback(root);
}
}
void sendCurrent(JsonObject& root) {
callbacks[counter.current](root);
counter.next();
}
void send(JsonObject& root) {
switch (mode) {
case SEQUENCE: sendCurrent(root); break;
case ALL: sendAll(root); break;
}
}
std::unique_ptr<ws_on_send_callback_list_t> storage;
const uint32_t client_id;
const mode_t mode;
const ws_on_send_callback_list_t& callbacks;
ws_counter_t counter;
};
// -----------------------------------------------------------------------------
// Debug
// -----------------------------------------------------------------------------
using ws_debug_msg_t = std::pair<String, String>;
struct ws_debug_t {
ws_debug_t(size_t capacity) :
flush(false),
current(0),
capacity(capacity)
{
messages.reserve(capacity);
}
void clear() {
messages.clear();
current = 0;
flush = false;
}
void add(const char* prefix, const char* message) {
if (current >= capacity) {
flush = true;
send(wsConnected());
}
messages.emplace(messages.begin() + current, prefix, message);
flush = true;
++current;
}
void send(const bool connected);
bool flush;
size_t current;
const size_t capacity;
std::vector<ws_debug_msg_t> messages;
};

+ 16
- 0
code/test/build/core.h View File

@ -0,0 +1,16 @@
#define ALEXA_SUPPORT 0
#define API_SUPPORT 0
#define BROKER_SUPPORT 0
#define DOMOTICZ_SUPPORT 0
#define DEBUG_SERIAL_SUPPORT 0
#define DEBUG_TELNET_SUPPORT 0
#define DEBUG_WEB_SUPPORT 0
#define HOMEASSISTANT_SUPPORT 0
#define I2C_SUPPORT 0
#define MQTT_SUPPORT 0
#define NTP_SUPPORT 0
#define RPN_RULES_SUPPORT 0
#define SCHEDULER_SUPPORT 0
#define SENSOR_SUPPORT 0
#define THINGSPEAK_SUPPORT 0
#define WEB_SUPPORT 0

Loading…
Cancel
Save