4#ifndef SRC_SUPLADEVICE_H_
5#define SRC_SUPLADEVICE_H_
7#include <supla-common/log.h>
8#include <supla-common/proto.h>
9#include <supla/action_handler.h>
10#include <supla/device/device_mode.h>
11#include <supla/local_action.h>
12#include <supla/suplet/config.h>
13#if SUPLA_SUPLET_ENABLED
14#include <supla/suplet/definition_cache.h>
15#include <supla/suplet/storage.h>
17#include <supla/uptime.h>
19#include "supla/device/security_logger.h"
21#define STATUS_UNKNOWN -1
22#define STATUS_ALREADY_INITIALIZED 1
23#define STATUS_MISSING_NETWORK_INTERFACE 2
24#define STATUS_UNKNOWN_SERVER_ADDRESS 3
25#define STATUS_UNKNOWN_LOCATION_ID 4
26#define STATUS_INITIALIZED 5
27#define STATUS_SERVER_DISCONNECTED 6
28#define STATUS_ITERATE_FAIL 7
29#define STATUS_NETWORK_DISCONNECTED 8
30#define STATUS_ALL_PROTOCOLS_DISABLED 9
32#define STATUS_REGISTER_IN_PROGRESS 10
33#define STATUS_REGISTERED_AND_READY 17
35#define STATUS_TEMPORARILY_UNAVAILABLE 21
36#define STATUS_INVALID_GUID 22
37#define STATUS_CHANNEL_LIMIT_EXCEEDED 23
38#define STATUS_PROTOCOL_VERSION_ERROR 24
39#define STATUS_BAD_CREDENTIALS 25
40#define STATUS_LOCATION_CONFLICT 26
41#define STATUS_CHANNEL_CONFLICT 27
42#define STATUS_DEVICE_IS_DISABLED 28
43#define STATUS_LOCATION_IS_DISABLED 29
44#define STATUS_DEVICE_LIMIT_EXCEEDED 30
45#define STATUS_REGISTRATION_DISABLED 31
46#define STATUS_MISSING_CREDENTIALS 32
47#define STATUS_INVALID_AUTHKEY 33
48#define STATUS_NO_LOCATION_AVAILABLE 34
49#define STATUS_UNKNOWN_ERROR 35
50#define STATUS_COUNTRY_REJECTED 36
52#define STATUS_CONFIG_MODE 40
53#define STATUS_SOFTWARE_RESET 41
54#define STATUS_SW_DOWNLOAD 50
55#define STATUS_SUPLA_PROTOCOL_DISABLED 60
56#define STATUS_TEST_WAIT_FOR_CFG_BUTTON 70
57#define STATUS_OFFLINE_MODE 80
58#define STATUS_NOT_CONFIGURED_MODE 90
60typedef void (*_impl_arduino_status)(
int status,
const char *msg);
63class __FlashStringHelper;
65#define __FlashStringHelper char
73class SwUpdateObserver;
77constexpr uint32_t AutomaticOtaCheckInterval = (10ULL * 24 * 60 * 60 * 1000);
79enum class SwUpdateMode : uint8_t {
81 PeriodicCheckAndUpdate,
90enum class InitialMode : uint8_t {
103 StartWithCfgModeThenOffline = 2,
107 StartInNotConfiguredMode = 3
110enum class CfgModeState : uint8_t {
112 CfgModeStartedFor1hPending = 1,
113 CfgModeStartedPending = 2,
119 uint8_t wifiEnabled : 1;
120 uint8_t wifiSsidFilled : 1;
121 uint8_t wifiPassFilled : 1;
122 uint8_t protocolFilled : 1;
123 uint8_t protocolNotEmpty : 1;
124 uint8_t configNotComplete : 1;
125 uint8_t atLeastOneProtoIsEnabled : 1;
127 bool isEmpty()
const;
134 protocolNotEmpty = 0;
135 configNotComplete = 0;
136 atLeastOneProtoIsEnabled = 0;
140const char *getInitialModeName(
const InitialMode mode);
144class ChannelConflictResolver;
145class ChannelConflictResolverList;
146class SubdevicePairingHandler;
148class LastStateLogger;
157class CapabilityRegistry;
160class ServerConfigHandler;
161enum class ServerConfigResult : uint8_t;
176 bool begin(
const char GUID[SUPLA_GUID_SIZE],
179 const char authkey[SUPLA_AUTHKEY_SIZE],
180 unsigned char protoVersion = 23);
182 bool begin(
unsigned char protoVersion = 23);
185 void setName(
const char *Name);
187 void setGUID(
const char GUID[SUPLA_GUID_SIZE]);
188 void setAuthKey(
const char authkey[SUPLA_AUTHKEY_SIZE]);
189 void setEmail(
const char *email);
190 void setServer(
const char *server);
191 void setSwVersion(
const char *);
195 void setManufacturerId(int16_t);
199 void setProductId(int16_t);
201 void addFlags(int32_t);
202 void removeFlags(int32_t);
203 bool isSleepingDeviceEnabled()
const;
205 int generateHostname(
char *,
int macSize = 6);
210 void onFastTimer(
void);
213 void status(
int status,
214 const __FlashStringHelper *msg,
215 bool alwaysLog =
false);
216 void setStatusFuncImpl(_impl_arduino_status impl_arduino_status);
217 void setServerPort(
int value);
222 void enterConfigMode();
223 void leaveConfigModeWithoutRestart();
224 void enterNormalMode();
227 void scheduleSoftRestart(
int timeout = 0);
228 void scheduleProtocolsRestart(
int timeout = 0);
230 void saveStateToStorage();
231 void restartCfgModeTimeout(
bool requireRestart);
232 void resetToFactorySettings();
233 void disableLocalActionsIfNeeded();
234 void restoreLocalActionsAfterConfigMode();
235 void requestCfgMode();
237 int8_t getCurrentStatus()
const;
238 bool getSelfTestFailed()
const;
239 int getSelfTestFailureReason()
const;
240 bool loadDeviceConfig();
241 bool prepareLastStateLog();
242 char *getLastStateLog();
243 void addLastStateLog(
const char *);
244 void enableLastStateLog();
245 void disableLastStateLog();
246 void setRsaPublicKeyPtr(
const uint8_t *ptr);
247 const uint8_t *getRsaPublicKey()
const;
248 enum Supla::DeviceMode getDeviceMode()
const;
250 void setActivityTimeout(_supla_int_t newActivityTimeout);
251 uint32_t getActivityTimeout();
253 void handleAction(
int event,
int action)
override;
267 void setSuplaCACert(
const char *);
268 void setSupla3rdPartyCACert(
const char *);
269 const char *getSuplaCACert()
const;
275 void enableNetwork();
276 void disableNetwork();
277 bool getStorageInitResult();
285 bool isSleepingAllowed();
362 void setChannelConflictResolver(
364 bool addChannelConflictResolver(
366 bool removeChannelConflictResolver(
371 void setSupletServerConfigHandler(
373 Supla::Suplet::ServerConfigResult applySupletCommandJson(
374 const char *commandJson);
375 Supla::Suplet::ServerConfigResult validateSupletCommandJson(
376 const char *commandJson)
const;
377 void setSubdevicePairingHandler(
414 uint32_t getCfgModeInactivityTimeLeftMs()
const;
471 void addSecurityLog(Supla::SecurityLogSource source,
const char *log)
const;
505 void iterateAlwaysElements(uint32_t _millis);
506 bool iterateNetworkSetup();
507 bool iterateSuplaProtocol(uint32_t _millis);
508 void handleLocalActionTriggers();
509 void checkIfLeaveCfgModeOrRestartIsNeeded();
510 void createSrpcLayerIfNeeded();
511 bool loadSupletRuntime();
512 bool handleSupletRuntimeRefresh();
513 void rewriteStateStorageIfInvalidAfterTopologyChange();
514 void setupDeviceMode();
516 uint32_t networkIsNotReadyCounter = 0;
517 uint32_t deviceRestartTimeoutTimestamp = 0;
518 uint32_t protocolRestartTimeoutTimestamp = 0;
519 uint32_t waitForIterate = 0;
520 uint32_t lastIterateTime = 0;
521 uint32_t enterConfigModeTimestamp = 0;
522 uint32_t forceRestartTimeMs = 0;
523 uint32_t protocolRestartTimeMs = 0;
524 uint32_t resetOnConnectionFailTimeoutSec = 0;
525 uint32_t lastSwUpdateCheckTimestamp = 0;
526 uint32_t sleepDeferStartMs = 0;
527 uint32_t sleepDeferDurationMs = 0;
529 enum Supla::DeviceMode deviceMode = Supla::DEVICE_MODE_NOT_SET;
530 bool triggerResetToFactorySettings =
false;
531 bool triggerStartLocalWebServer =
false;
532 bool triggerStopLocalWebServer =
false;
533 bool triggerCheckSwUpdate =
false;
534 bool requestNetworkLayerRestart =
false;
535 bool isNetworkSetupOk =
false;
536 bool skipNetwork =
false;
537 bool storageInitResult =
false;
538 bool showUptimeInChannelState =
true;
539 bool lastStateLogEnabled =
true;
542 bool initializationDone =
false;
543 bool goToConfigModeAsap =
false;
544 bool selfTestFailed =
false;
545 int selfTestFailureReason = 0;
547 uint8_t leaveCfgModeAfterInactivityMin = 5;
548 uint8_t macLengthInHostname = 6;
549 int8_t currentStatus = STATUS_UNKNOWN;
550 uint8_t swUpdateAttempts = 0;
552 Supla::InitialMode initialMode = Supla::InitialMode::StartInNotConfiguredMode;
553 Supla::CfgModeState cfgModeState = Supla::CfgModeState::NotSet;
561#if SUPLA_SUPLET_ENABLED
570 const uint8_t *rsaPublicKey =
nullptr;
571 char *customHostnamePrefix =
nullptr;
572 _impl_arduino_status impl_arduino_status =
nullptr;
Definition SuplaDevice.h:167
void identifyStatusLed()
Triggers "identify" action on status LED.
Definition SuplaDevice.cpp:2169
void setShowUptimeInChannelState(bool value)
Sets if "uptime" should be added to channel state (i)
Definition SuplaDevice.cpp:1904
int getLogLevel()
Returns current global Supla log level.
Definition SuplaDevice.cpp:1912
void setCustomHostnamePrefix(const char *prefix)
Sets custom hostname prefix to be used in hostname and Wi-Fi Soft AP name.
Definition SuplaDevice.cpp:1752
void testStepStatusLed(int times)
Triggers special status LED flashing sequence based on provided "times".
Definition SuplaDevice.cpp:2177
void setInitialMode(Supla::InitialMode mode)
Sets the initial mode of the device.
Definition SuplaDevice.cpp:2208
void addSecurityLog(uint32_t source, const char *log) const
Adds security log.
Definition SuplaDevice.cpp:2191
void allowWorkInOfflineMode(int mode=1)
Allows device to work in offline mode DEPRECATED: use setInitialMode() instead.
Definition SuplaDevice.cpp:1873
void deferSleep(uint32_t delayMs)
Defers permission to enter sleep mode for the given number of milliseconds.
Definition SuplaDevice.cpp:1853
void setProtoVerboseLog(bool value)
Enables/disables verbose logging of Supla protocol.
Definition SuplaDevice.cpp:1916
bool isSecurityLogEnabled() const
Checks if security log is enabled.
Definition SuplaDevice.cpp:2204
void setSecurityLogger(Supla::Device::SecurityLogger *logger)
Sets instance of Supla::Device::SecurityLogger.
Definition SuplaDevice.cpp:2183
void setMacLengthInHostname(int value)
Sets the byte length of MAC address in hostname and Wi-Fi Soft AP name.
Definition SuplaDevice.cpp:2106
void setAutomaticResetOnConnectionProblem(unsigned int timeSec)
Enables automatic software reset of device in case of network/server connection problems longer than ...
Definition SuplaDevice.cpp:1702
Supla::InitialMode getInitialMode() const
Returns the initial mode of the device @See Supla::InitialMode.
Definition SuplaDevice.h:315
bool isLeaveCfgModeAfterInactivityEnabled() const
Checks if leave configuration mode after inactivity is enabled.
Definition SuplaDevice.cpp:2255
void setLeaveCfgModeAfterInactivityMin(int valueMin)
Sets the leave configuration mode after inactivity timeout in minutes.
Definition SuplaDevice.cpp:2122
void iterateSwUpdate()
Performs software update if needed.
Definition SuplaDevice.cpp:710
void setLogLevel(int level)
Sets global Supla log level.
Definition SuplaDevice.cpp:1908
void setAutomaticFirmwareUpdateSupported(bool value)
Sets automatic firmware update support.
Definition SuplaDevice.cpp:2157
bool isRemoteDeviceConfigEnabled() const
Checks if remote device configuration is enabled.
Definition SuplaDevice.cpp:1892
bool isAutomaticFirmwareUpdateEnabled() const
Checks if automatic firmware update is supported.
Definition SuplaDevice.cpp:2153
bool initSwUpdateInstance(Supla::SwUpdateMode mode, int securityOnly=-1)
Initializes SW update instance.
Definition SuplaDevice.cpp:621
Definition action_handler.h:8
Definition channel_conflict_resolver.h:48
Definition channel_conflict_resolver.h:18
Definition last_state_logger.h:15
Definition security_logger.h:47
Definition status_led.h:43
Definition subdevice_pairing_handler.h:26
Definition sw_update.h:20
Definition sw_update.h:32
Base class for all elements of SuplaDevice.
Definition element.h:27
Definition local_action.h:42
Definition supla_srpc.h:47
Definition capability_registry.h:13
Definition server_config.h:55
Definition SuplaDevice.h:118