-
Notifications
You must be signed in to change notification settings - Fork 638
/
general.h
1859 lines (1438 loc) · 69.5 KB
/
general.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
//-----------------------------------------------------------------------------
// Do not change this file unless you know what you are doing
// To override user configuration, please see custom.h
//------------------------------------------------------------------------------
#pragma once
//------------------------------------------------------------------------------
// GENERAL
//------------------------------------------------------------------------------
// When defined, ADMIN_PASS must be 8..63 printable ASCII characters. See:
// https://en.wikipedia.org/wiki/Wi-Fi_Protected_Access#Target_users_(authentication_key_distribution)
// https://github.com/xoseperez/espurna/issues/1151
#ifndef ADMIN_PASS
#define ADMIN_PASS "fibonacci" // Default password (WEB, OTA, WIFI SoftAP)
#endif
#ifndef USE_PASSWORD
#define USE_PASSWORD 1 // Insecurity caution! Disabling this will disable password querying completely.
#endif
#ifndef LOOP_DELAY_TIME
#define LOOP_DELAY_TIME 10 // Time (in milliseconds) to wait every application loop
// This value is clamped between 10 and 250 (ms), ref.
// - https://github.com/xoseperez/espurna/issues/1541
// - https://github.com/xoseperez/espurna/issues/1631
// - https://github.com/esp8266/Arduino/issues/5825
#endif
//------------------------------------------------------------------------------
// HEARTBEAT
//------------------------------------------------------------------------------
#ifndef HEARTBEAT_MODE
#define HEARTBEAT_MODE HEARTBEAT_REPEAT
#endif
#ifndef HEARTBEAT_INTERVAL
#define HEARTBEAT_INTERVAL 300 // Default time (in seconds) for heartbeat messages
#endif
//------------------------------------------------------------------------------
// DEBUG
//------------------------------------------------------------------------------
// Set global logger mode. One of:
// - DebugLogMode::Enabled
// - DebugLogMode::Disabled
// - DebugLogMode::SkipBoot
#ifndef DEBUG_LOG_MODE
#define DEBUG_LOG_MODE DebugLogMode::Enabled
#endif
// Serial debug log
#ifndef DEBUG_SERIAL_SUPPORT
#define DEBUG_SERIAL_SUPPORT 1 // Enable serial debug log
#endif
#ifndef DEBUG_SERIAL_PORT
#define DEBUG_SERIAL_PORT 1 // Default debugging port
#endif
#ifndef DEBUG_ADD_TIMESTAMP
#define DEBUG_ADD_TIMESTAMP 1 // Add timestamp to debug messages
// (in millis overflowing every 1000 seconds)
#endif
//------------------------------------------------------------------------------
// UDP debug log
// To receive the message on the destination computer use nc:
// nc -ul 8113
#ifndef DEBUG_UDP_SUPPORT
#define DEBUG_UDP_SUPPORT 0 // Enable UDP debug log
#endif
#ifndef DEBUG_UDP_IP
#define DEBUG_UDP_IP IPAddress(192, 168, 1, 100)
#endif
#ifndef DEBUG_UDP_PORT
#define DEBUG_UDP_PORT 514
#endif
// If DEBUG_UDP_PORT is set to 514 syslog format is assumed
// (https://tools.ietf.org/html/rfc3164)
// DEBUG_UDP_FAC_PRI is the facility+priority
#define DEBUG_UDP_FAC_PRI (SYSLOG_LOCAL0 | SYSLOG_DEBUG)
//------------------------------------------------------------------------------
#ifndef DEBUG_TELNET_SUPPORT
#define DEBUG_TELNET_SUPPORT 1 // Enable telnet debug log (will only work if TELNET_SUPPORT is also 1)
#endif
//------------------------------------------------------------------------------
#ifndef DEBUG_WEB_SUPPORT
#define DEBUG_WEB_SUPPORT 1 // Enable web debug log (will only work if WEB_SUPPORT is also 1)
#endif
//------------------------------------------------------------------------------
#ifndef DEBUG_LOG_BUFFER_SUPPORT
#define DEBUG_LOG_BUFFER_SUPPORT 1 // Support boot log buffer (1.2Kb)
// Will only work if DEBUG_LOG_BUFFER_ENABLED or runtime setting is also 1
#endif
#ifndef DEBUG_LOG_BUFFER_ENABLED
#define DEBUG_LOG_BUFFER_ENABLED 0 // Disable boot log buffer by default
#endif
#ifndef DEBUG_LOG_BUFFER_SIZE
#define DEBUG_LOG_BUFFER_SIZE 4096 // Store 4 Kb of log strings
// WARNING! Memory is only reclaimed after `debug.buffer` prints the buffer contents
#endif
//------------------------------------------------------------------------------
// TELNET
//------------------------------------------------------------------------------
#ifndef TELNET_SUPPORT
#define TELNET_SUPPORT 1 // Enable telnet support by default (3.34Kb)
#endif
#ifndef TELNET_STA
#define TELNET_STA 0 // By default, disallow connections via STA interface
#endif
#ifndef TELNET_AUTHENTICATION
#define TELNET_AUTHENTICATION 1 // Request password to start telnet session by default
#endif
#ifndef TELNET_PORT
#define TELNET_PORT 23 // Port to listen to telnet clients
#endif
#ifndef TELNET_MAX_CLIENTS
#define TELNET_MAX_CLIENTS 1 // Max number of concurrent telnet clients
#endif
#ifndef TELNET_LINE_BUFFER_SIZE
#define TELNET_LINE_BUFFER_SIZE 256 // Temporary buffer, when data arrives in multiple packets without a new-line
#endif
// Enable this flag to add support for reverse telnet (+800 bytes)
// This is useful to telnet to a device behind a NAT or firewall
// To use this feature, start a listen server on a publicly reachable host with e.g. "ncat -vlp <port>" and use the MQTT reverse telnet command to connect
#ifndef TELNET_REVERSE_SUPPORT
#define TELNET_REVERSE_SUPPORT 0
#endif
//------------------------------------------------------------------------------
// TERMINAL
//------------------------------------------------------------------------------
#ifndef TERMINAL_SUPPORT
#define TERMINAL_SUPPORT 1 // Enable terminal commands (0.97Kb)
#endif
#ifndef TERMINAL_SERIAL_SUPPORT
#define TERMINAL_SERIAL_SUPPORT 1 // Enable terminal over UART
#endif
#ifndef TERMINAL_SERIAL_PORT
#define TERMINAL_SERIAL_PORT 1 // Use specific port configured as UART#_PORT
// (first port by default)
#endif
#ifndef TERMINAL_SERIAL_BUFFER_SIZE
#define TERMINAL_SERIAL_BUFFER_SIZE 128 // Maximum size for command line received from serial input
// (defaults to the size of the peripheral RX buffer)
#endif
#ifndef TERMINAL_MQTT_SUPPORT
#define TERMINAL_MQTT_SUPPORT 0 // MQTT Terminal support built in
// Depends on MQTT_SUPPORT and TERMINAL_SUPPORT commands being available
#endif
#ifndef TERMINAL_WEB_API_SUPPORT
#define TERMINAL_WEB_API_SUPPORT 0 // Web server API Terminal support built in
// Depends on WEB_SUPPORT and TERMINAL_SUPPORT commands being available
#endif
#ifndef TERMINAL_WEB_API_PATH
#define TERMINAL_WEB_API_PATH "cmd"
#endif
//------------------------------------------------------------------------------
// SYSTEM CHECK
//------------------------------------------------------------------------------
#ifndef SYSTEM_CHECK_ENABLED
#define SYSTEM_CHECK_ENABLED 1 // Enable crash check by default
#endif
#ifndef SYSTEM_CHECK_TIME
#define SYSTEM_CHECK_TIME 60 // The system is considered stable after these many seconds
#endif
#ifndef SYSTEM_CHECK_MAX
#define SYSTEM_CHECK_MAX 3 // After this many crashes on boot
// the system is flagged as unstable
#endif
//------------------------------------------------------------------------------
// EEPROM
//------------------------------------------------------------------------------
//#define EEPROM_RORATE_SECTORS 2 // Number of sectors to use for EEPROM rotation
// If not defined the firmware will use a number based
// on the number of available sectors
#ifndef SAVE_CRASH_ENABLED
#define SAVE_CRASH_ENABLED 1 // Save stack trace to EEPROM by default
// Depends on DEBUG_SUPPORT == 1
#endif
#ifndef SAVE_CRASH_STACK_TRACE_MAX
#define SAVE_CRASH_STACK_TRACE_MAX 0x80 // limit at 128 bytes (increment/decrement by 16)
#endif
//------------------------------------------------------------------------------
// GARLAND
//------------------------------------------------------------------------------
#ifndef GARLAND_SUPPORT
#define GARLAND_SUPPORT 0
#endif
#ifndef GARLAND_DATA_PIN
#define GARLAND_DATA_PIN 4 // WS2812 data pin (default: D2 / GPIO4)
#endif
#ifndef GARLAND_LEDS
#define GARLAND_LEDS 60 // Number of LEDs
#endif
//------------------------------------------------------------------------------
// THERMOSTAT
//------------------------------------------------------------------------------
#ifndef THERMOSTAT_SUPPORT
#define THERMOSTAT_SUPPORT 0
#endif
#ifndef THERMOSTAT_DISPLAY_SUPPORT
#define THERMOSTAT_DISPLAY_SUPPORT 0
#endif
#ifndef THERMOSTAT_DISPLAY_OFF_INTERVAL // Interval in seconds after which display will be switched off
#define THERMOSTAT_DISPLAY_OFF_INTERVAL 0 // This will prevent it from burnout
#endif // 0 - newer switch display off
#define THERMOSTAT_SERVER_LOST_INTERVAL 120000 //server means lost after 2 min from last response
#define THERMOSTAT_REMOTE_TEMP_MAX_WAIT 120 // 2 min
#ifndef THERMOSTAT_REMOTE_SENSOR_NAME
#define THERMOSTAT_REMOTE_SENSOR_NAME "" // Get remote temp(hum) from mqtt topic of this device
#endif
//------------------------------------------------------------------------------
// HEARTBEAT REPORT
//------------------------------------------------------------------------------
#ifndef HEARTBEAT_REPORT_STATUS
#define HEARTBEAT_REPORT_STATUS 1
#endif
#ifndef HEARTBEAT_REPORT_SSID
#define HEARTBEAT_REPORT_SSID 1
#endif
#ifndef HEARTBEAT_REPORT_IP
#define HEARTBEAT_REPORT_IP 1
#endif
#ifndef HEARTBEAT_REPORT_MAC
#define HEARTBEAT_REPORT_MAC 1
#endif
#ifndef HEARTBEAT_REPORT_RSSI
#define HEARTBEAT_REPORT_RSSI 1
#endif
#ifndef HEARTBEAT_REPORT_UPTIME
#define HEARTBEAT_REPORT_UPTIME 1
#endif
#ifndef HEARTBEAT_REPORT_DATETIME
#define HEARTBEAT_REPORT_DATETIME 1
#endif
#ifndef HEARTBEAT_REPORT_FREEHEAP
#define HEARTBEAT_REPORT_FREEHEAP 1
#endif
#ifndef HEARTBEAT_REPORT_VCC
#define HEARTBEAT_REPORT_VCC 1
#endif
#ifndef HEARTBEAT_REPORT_RELAY
#define HEARTBEAT_REPORT_RELAY 1
#endif
#ifndef HEARTBEAT_REPORT_LIGHT
#define HEARTBEAT_REPORT_LIGHT 1
#endif
#ifndef HEARTBEAT_REPORT_HOSTNAME
#define HEARTBEAT_REPORT_HOSTNAME 1
#endif
#ifndef HEARTBEAT_REPORT_DESCRIPTION
#define HEARTBEAT_REPORT_DESCRIPTION 1
#endif
#ifndef HEARTBEAT_REPORT_APP
#define HEARTBEAT_REPORT_APP 1
#endif
#ifndef HEARTBEAT_REPORT_VERSION
#define HEARTBEAT_REPORT_VERSION 1
#endif
#ifndef HEARTBEAT_REPORT_BOARD
#define HEARTBEAT_REPORT_BOARD 1
#endif
#ifndef HEARTBEAT_REPORT_LOADAVG
#define HEARTBEAT_REPORT_LOADAVG 1
#endif
#ifndef HEARTBEAT_REPORT_INTERVAL
#define HEARTBEAT_REPORT_INTERVAL 0
#endif
#ifndef HEARTBEAT_REPORT_RANGE
#define HEARTBEAT_REPORT_RANGE 1
#endif
#ifndef HEARTBEAT_REPORT_REMOTE_TEMP
#define HEARTBEAT_REPORT_REMOTE_TEMP 1
#endif
#ifndef HEARTBEAT_REPORT_BSSID
#define HEARTBEAT_REPORT_BSSID 0
#endif
//------------------------------------------------------------------------------
// Load average
//------------------------------------------------------------------------------
#ifndef LOADAVG_INTERVAL
#define LOADAVG_INTERVAL 30 // Time (in seconds) between load average calculations
#endif
//------------------------------------------------------------------------------
// RELAY
//------------------------------------------------------------------------------
// Enable general support for relays (aka switches)
#ifndef RELAY_SUPPORT
#define RELAY_SUPPORT 1
#endif
// ESP01-relays with STM co-MCU driving the relays
#ifndef RELAY_PROVIDER_STM_SUPPORT
#define RELAY_PROVIDER_STM_SUPPORT 0
#endif
#ifndef RELAY_PROVIDER_STM_PORT
#define RELAY_PROVIDER_STM_PORT 1
#endif
// Sonoff Dual, using serial protocol
#ifndef RELAY_PROVIDER_DUAL_SUPPORT
#define RELAY_PROVIDER_DUAL_SUPPORT 0
#endif
#ifndef RELAY_PROVIDER_DUAL_PORT
#define RELAY_PROVIDER_DUAL_PORT 1
#endif
// Default boot mode: 0 means OFF, 1 ON and 2 whatever was before
#ifndef RELAY_BOOT_MODE
#define RELAY_BOOT_MODE RELAY_BOOT_OFF
#endif
// One of RELAY_SYNC_ANY, RELAY_SYNC_NONE_OR_ONE, RELAY_SYNC_SAME or RELAY_SYNC_FIRST
// Default to ANY i.e. don't do anything
#ifndef RELAY_SYNC
#define RELAY_SYNC RELAY_SYNC_ANY
#endif
// Time (in ms) to wait between relay state changes.
// Setting to zero (default) will cause relay switches to change as soon as possible
#ifndef RELAY_DELAY_INTERLOCK
#define RELAY_DELAY_INTERLOCK 0
#endif
// Default pulse mode / normal mode. Switching from it will start the 'pulse' timer and reset the relay back after it finishes
#ifndef RELAY_PULSE_MODE
#define RELAY_PULSE_MODE RELAY_PULSE_NONE
#endif
// Default time (in seconds) for the pulse delay, when it is not specified in settings
#ifndef RELAY_PULSE_TIME
#define RELAY_PULSE_TIME 0.0
#endif
// Time (in seconds) for the relay flood protection window
#ifndef RELAY_FLOOD_WINDOW
#define RELAY_FLOOD_WINDOW 3.0
#endif
// Maximum amount of relay state changes allowed in the relay flood window
#ifndef RELAY_FLOOD_CHANGES
#define RELAY_FLOOD_CHANGES 5
#endif
// Time (in ms) for the latched relay pulse
#ifndef RELAY_LATCHING_PULSE
#define RELAY_LATCHING_PULSE 10
#endif
// Time (in ms) to wait until saving the relay(s) state
#ifndef RELAY_SAVE_DELAY
#define RELAY_SAVE_DELAY 1000
#endif
// Configure the MQTT payload for ON, OFF and TOGGLE
#ifndef RELAY_MQTT_OFF
#define RELAY_MQTT_OFF "0"
#endif
#ifndef RELAY_MQTT_ON
#define RELAY_MQTT_ON "1"
#endif
#ifndef RELAY_MQTT_TOGGLE
#define RELAY_MQTT_TOGGLE "2"
#endif
#ifndef RELAY_MQTT_TOPIC_MODE
#define RELAY_MQTT_TOPIC_MODE RELAY_MQTT_TOPIC_NORMAL
#endif
#ifndef RELAY_MQTT_DISCONNECT_STATUS
#define RELAY_MQTT_DISCONNECT_STATUS RELAY_MQTT_DISCONNECT_NONE
#endif
#ifndef RELAY_MQTT_DISCONNECT_DELAY
#define RELAY_MQTT_DISCONNECT_DELAY duration::Seconds(30)
#endif
//------------------------------------------------------------------------------
// BUTTON
//------------------------------------------------------------------------------
#ifndef BUTTON_SUPPORT
#define BUTTON_SUPPORT 1
#endif
#ifndef BUTTON_DEBOUNCE_DELAY
#define BUTTON_DEBOUNCE_DELAY 50 // Debounce delay (ms)
#endif
#ifndef BUTTON_REPEAT_DELAY
#define BUTTON_REPEAT_DELAY 500 // Time in ms to wait for a second (or third...) click
#endif
#ifndef BUTTON_LNGCLICK_DELAY
#define BUTTON_LNGCLICK_DELAY 1000 // Time in ms holding the button down to get a long click
#endif
#ifndef BUTTON_LNGLNGCLICK_DELAY
#define BUTTON_LNGLNGCLICK_DELAY 10000 // Time in ms holding the button down to get a long-long click
#endif
#ifndef BUTTON_MQTT_SEND_ALL_EVENTS
#define BUTTON_MQTT_SEND_ALL_EVENTS 0 // 0 - to send only events the are bound to actions
// 1 - to send all button events to MQTT
#endif
#ifndef BUTTON_MQTT_RETAIN
#define BUTTON_MQTT_RETAIN 0
#endif
// Generic digital pin support
#ifndef BUTTON_PROVIDER_GPIO_SUPPORT
#define BUTTON_PROVIDER_GPIO_SUPPORT 1
#endif
// Resistor ladder support. Poll analog pin and return digital LOW when analog reading is in a certain range
// ref. https://github.com/bxparks/AceButton/tree/develop/docs/resistor_ladder
// Uses BUTTON#_ANALOG_LEVEL for the individual button level configuration
#ifndef BUTTON_PROVIDER_ANALOG_SUPPORT
#define BUTTON_PROVIDER_ANALOG_SUPPORT 0
#endif
//------------------------------------------------------------------------------
// ENCODER
//------------------------------------------------------------------------------
#ifndef ENCODER_SUPPORT
#define ENCODER_SUPPORT 0
#endif
#ifndef ENCODER_MINIMUM_DELTA
#define ENCODER_MINIMUM_DELTA 1
#endif
//------------------------------------------------------------------------------
// LED
//------------------------------------------------------------------------------
#ifndef LED_SUPPORT
#define LED_SUPPORT 1
#endif
// -----------------------------------------------------------------------------
// WIFI
// -----------------------------------------------------------------------------
#ifndef WIFI_CONNECT_RETRIES
#define WIFI_CONNECT_RETRIES 3 // Number of times before changing to the next configured network
#endif
#ifndef WIFI_CONNECT_INTERVAL
#define WIFI_CONNECT_INTERVAL 3000 // Time (ms) between connection attempts
#endif
#ifndef WIFI_RECONNECT_INTERVAL
#define WIFI_RECONNECT_INTERVAL 120000 // When all retries on all networks are exhausted, wait for this time (ms) and start from the beginning
#endif
#ifndef WIFI_MAX_NETWORKS
#define WIFI_MAX_NETWORKS 5 // Maximum number of WiFi configurations in settings
#endif
#ifndef WIFI_AP_CAPTIVE_SUPPORT
#define WIFI_AP_CAPTIVE_SUPPORT 1 // Captive portal for AP mode
#endif
#ifndef WIFI_AP_CAPTIVE_ENABLED
#define WIFI_AP_CAPTIVE_ENABLED 1 // Enabled by default
#endif
#ifndef WIFI_STA_MODE
#define WIFI_STA_MODE wifi::StaMode::Enabled // By default, turn on STA interface and try to connect to configured networks
// - wifi::StaMode::Enabled (default)
// - wifi::StaMode::Disabled keeps STA disabled
#endif
#ifndef WIFI_AP_MODE
#define WIFI_AP_MODE wifi::ApMode::Fallback // By default, enable AP if there is no STA connection
// - wifi::ApMode::Fallback (default)
// - wifi::ApMode::Enabled keeps AP enabled independent of STA
// - wifi::ApMode::Disabled keeps AP disabled
#endif
#ifndef WIFI_FALLBACK_TIMEOUT
#define WIFI_FALLBACK_TIMEOUT 60000 // When AP is in FALLBACK mode and STA is connected,
// how long to wait (in ms) until stopping the AP
#endif
#ifndef WIFI_AP_SSID
#define WIFI_AP_SSID "" // (optional) Specify softAp SSID.
// By default or when empty, hostname (or device identifier) is used instead.
#endif
#ifndef WIFI_AP_PASS
#define WIFI_AP_PASS "" // (optional) Specify softAp passphrase
// By default or when empty, admin password is used instead.
#endif
#ifndef WIFI_AP_CHANNEL
#define WIFI_AP_CHANNEL 1 // Which WiFi channel to use for softAP.
#endif
#ifndef WIFI_SLEEP_MODE
#define WIFI_SLEEP_MODE WIFI_SLEEP_MODE_NONE // WIFI_SLEEP_MODE_NONE - disable all WiFi passive power saving modes (default)
// WIFI_SLEEP_MODE_MODEM - allow WiFi modem to periodially sleep, based on DTIM
// beacon interval time (usually between .1s and 1s)
// WIFI_SLEEP_MODE_LIGHT - in addition to the MODEM sleep also allow CPU to sleep
// between .5s and 3s (varies, depends on active timers)
//
// (ref. https://www.espressif.com/sites/default/files/9b-esp8266-low_power_solutions_en_0.pdf)
#endif
#ifndef WIFI_SCAN_NETWORKS
#define WIFI_SCAN_NETWORKS 1 // Perform a network scan before connecting and when RSSI threshold is reached
// Configured networks are used in order.
#endif
#ifndef WIFI_SCAN_RSSI_THRESHOLD
#define WIFI_SCAN_RSSI_THRESHOLD -73 // Consider current network for a reconnection cycle
// when it's RSSI value is below the specified threshold
#endif
#ifndef WIFI_SCAN_RSSI_CHECKS
#define WIFI_SCAN_RSSI_CHECKS 3 // Amount of RSSI threshold checks before starting a scan
#endif
#ifndef WIFI_SCAN_RSSI_CHECK_INTERVAL
#define WIFI_SCAN_RSSI_CHECK_INTERVAL 60000 // Time (ms) between RSSI checks
#endif
// ref: https://docs.espressif.com/projects/esp-idf/en/latest/api-reference/kconfig.html#config-lwip-esp-gratuitous-arp
// ref: https://github.com/xoseperez/espurna/pull/1877#issuecomment-525612546
//
// Broadcast gratuitous ARP periodically to update ARP tables on the AP and all devices on the same network.
// Helps to solve compatibility issues when ESP fails to timely reply to ARP requests, causing the device's ARP table entry to expire.
#ifndef WIFI_GRATUITOUS_ARP_SUPPORT
#define WIFI_GRATUITOUS_ARP_SUPPORT 1
#endif
// Interval is randomized on each boot in range from ..._MIN to ..._MAX (ms)
#ifndef WIFI_GRATUITOUS_ARP_INTERVAL_MIN
#define WIFI_GRATUITOUS_ARP_INTERVAL_MIN 15000
#endif
#ifndef WIFI_GRATUITOUS_ARP_INTERVAL_MAX
#define WIFI_GRATUITOUS_ARP_INTERVAL_MAX 30000
#endif
// ref: https://github.com/esp8266/Arduino/issues/6471
// ref: https://github.com/esp8266/Arduino/issues/6366
//
// Issue #6366 turned out to be high tx power causing weird behavior. Lowering tx power achieved stability.
#ifndef WIFI_OUTPUT_POWER_DBM
#define WIFI_OUTPUT_POWER_DBM 20.0f
#endif
#ifndef WIFI_BOOT_MODE
#define WIFI_BOOT_MODE WIFI_ENABLED
#endif
// -----------------------------------------------------------------------------
// WEB
// -----------------------------------------------------------------------------
#ifndef WEB_SUPPORT
#define WEB_SUPPORT 1 // Enable web support (http, api, 121.65Kb)
#endif
#ifndef WEB_EMBEDDED
#define WEB_EMBEDDED 1 // Build the firmware with the web interface embedded in
#endif
#ifndef WEB_ACCESS_LOG
#define WEB_ACCESS_LOG 0 // Log every request that was received by the server (but, not necessarily processed)
#endif
// Requires ESPAsyncTCP to be built with ASYNC_TCP_SSL_ENABLED=1 and Arduino Core version >= 2.4.0
// XXX: This is not working at the moment!! Pending https://github.com/me-no-dev/ESPAsyncTCP/issues/95
#ifndef WEB_SSL_ENABLED
#define WEB_SSL_ENABLED 0 // Use HTTPS web interface
#endif
#ifndef WEB_USERNAME
#define WEB_USERNAME "admin" // HTTP username
#endif
#ifndef WEB_FORCE_PASS_CHANGE
#define WEB_FORCE_PASS_CHANGE 1 // Force the user to change the password if default one
#endif
#ifndef WEB_PORT
#define WEB_PORT 80 // HTTP port
#endif
// Defining a WEB_REMOTE_DOMAIN will enable Cross-Origin Resource Sharing (CORS)
// so you will be able to login to this device from another domain. This will allow
// you to manage all ESPurna devices in your local network from a unique installation
// of the web UI. This installation could be in a local server (a Raspberry Pi, for instance)
// or in the Internet. Since the WebUI is just one compressed file with HTML, CSS and JS
// there are no special requirements. Any static web server will do (NGinx, Apache, Lighttpd,...).
// The only requirement is that the resource must be available under this domain.
#ifndef WEB_REMOTE_DOMAIN
#define WEB_REMOTE_DOMAIN "http://espurna.io"
#endif
// -----------------------------------------------------------------------------
// WEBSOCKETS
// -----------------------------------------------------------------------------
// This will only be enabled if WEB_SUPPORT is 1 (this is the default value)
#ifndef WS_AUTHENTICATION
#define WS_AUTHENTICATION 1 // WS authentication ON by default (see #507)
#endif
#ifndef WS_MAX_CLIENTS
#define WS_MAX_CLIENTS 5 // Max number of websocket connections
#endif
#ifndef WS_TIMEOUT
#define WS_TIMEOUT 1800 // Time (in seconds) to persist the client session info
#endif
#ifndef WS_UPDATE_INTERVAL
#define WS_UPDATE_INTERVAL 30 // Time (in seconds) between periodic status updates sent out to every client
#endif
// -----------------------------------------------------------------------------
// API
// -----------------------------------------------------------------------------
#ifndef API_SUPPORT
#define API_SUPPORT 1 // API (REST & RPC) support built in
#endif
// This will only be enabled if WEB_SUPPORT is 1 (this is the default value)
#ifndef API_ENABLED
#define API_ENABLED 0 // Do not enable API by default
#endif
#ifndef API_KEY
#define API_KEY "" // Do not enable API by default. WebUI will automatically generate the key
#endif
#ifndef API_RESTFUL
#define API_RESTFUL 1 // A restful API requires changes to be issued as PUT requests
// Setting this to 0 will allow using GET to change relays, for instance
#endif
#ifndef API_JSON_BUFFER_SIZE
#define API_JSON_BUFFER_SIZE 256 // Size of the (de)serializer buffer.
#endif
#ifndef API_BASE_PATH
#define API_BASE_PATH "/api/"
#endif
// -----------------------------------------------------------------------------
// MDNS / LLMNR / NETBIOS / SSDP
// -----------------------------------------------------------------------------
#ifndef MDNS_SERVER_SUPPORT
#define MDNS_SERVER_SUPPORT 1 // Publish services using mDNS by default (1.48Kb)
#endif
#ifndef LLMNR_SUPPORT
#define LLMNR_SUPPORT 0 // Publish device using LLMNR protocol by default (1.95Kb) - requires Core version >= 2.4.0
#endif
#ifndef NETBIOS_SUPPORT
#define NETBIOS_SUPPORT 0 // Publish device using NetBIOS protocol by default (1.26Kb) - requires Core version >= 2.4.0
#endif
#ifndef SSDP_SUPPORT
#define SSDP_SUPPORT 0 // Publish device using SSDP protocol by default (4.59Kb)
// Not compatible with ALEXA_SUPPORT at the moment
#endif
#ifndef SSDP_DEVICE_TYPE
#define SSDP_DEVICE_TYPE "upnp:rootdevice"
//#define SSDP_DEVICE_TYPE "urn:schemas-upnp-org:device:BinaryLight:1"
#endif
// -----------------------------------------------------------------------------
// SPIFFS
// -----------------------------------------------------------------------------
#ifndef SPIFFS_SUPPORT
#define SPIFFS_SUPPORT 0 // Do not add support for SPIFFS by default
#endif
// -----------------------------------------------------------------------------
// SSL Client ** EXPERIMENTAL **
// -----------------------------------------------------------------------------
#ifndef SECURE_CLIENT
#define SECURE_CLIENT SECURE_CLIENT_NONE // What variant of WiFiClient to use:
// SECURE_CLIENT_NONE - No secure client support (default)
// SECURE_CLIENT_BEARSSL - BearSSL client secure support (with Core versions newer than 2.5.0, TLS 1.2)
// SECURE_CLIENT_AXTLS - axTLS client secure support (only with Core versions older than 3.0.0, ONLY TLS 1.1, NOT recommended)
#endif
// Security check that is performed when the connection is established:
// SECURE_CLIENT_CHECK_CA - Use Trust Anchor / Root Certificate
// Supported only by the SECURE_CLIENT_BEARSSL
// (See respective ..._SECURE_CLIENT_INCLUDE_CA options per-module)
// SECURE_CLIENT_CHECK_FINGERPRINT - Check certificate fingerprint
// SECURE_CLIENT_CHECK_NONE - Allow insecure connections
#ifndef SECURE_CLIENT_CHECK
#if SECURE_CLIENT == SECURE_CLIENT_BEARSSL
#define SECURE_CLIENT_CHECK SECURE_CLIENT_CHECK_CA
#else
#define SECURE_CLIENT_CHECK SECURE_CLIENT_CHECK_FINGERPRINT
#endif
#endif // SECURE_CLIENT_CHECK
// Support Maximum Fragment Length Negotiation TLS extension
// "...negotiate a smaller maximum fragment length due to memory limitations or bandwidth limitations."
// - https://arduino-esp8266.readthedocs.io/en/latest/esp8266wifi/bearssl-client-secure-class.html#mfln-or-maximum-fragment-length-negotiation-saving-ram
// - https://tools.ietf.org/html/rfc6066#section-4
#ifndef SECURE_CLIENT_MFLN
#define SECURE_CLIENT_MFLN 0 // The only possible values are: 512, 1024, 2048 and 4096
// Set to 0 to disable (default)
#endif
// -----------------------------------------------------------------------------
// OTA
// -----------------------------------------------------------------------------
#ifndef OTA_PORT
#define OTA_PORT 8266 // Port for ArduinoOTA
#endif
#ifndef OTA_MQTT_SUPPORT
#define OTA_MQTT_SUPPORT 0 // Listen for HTTP(s) URLs at '<root topic>/ota'. Depends on OTA_CLIENT
#endif
#ifndef OTA_ARDUINOOTA_SUPPORT
#define OTA_ARDUINOOTA_SUPPORT 1 // Support ArduinoOTA by default (4.2Kb)
// Implicitly depends on ESP8266mDNS library, thus increasing firmware size
#endif
#ifndef OTA_CLIENT
#define OTA_CLIENT OTA_CLIENT_ASYNCTCP // Terminal / MQTT OTA support
// OTA_CLIENT_ASYNCTCP (ESPAsyncTCP library)
// OTA_CLIENT_HTTPUPDATE (Arduino Core library)j
// OTA_CLIENT_NONE to disable
#endif
#ifndef OTA_WEB_SUPPORT
#define OTA_WEB_SUPPORT WEB_SUPPORT // Support `/upgrade` endpoint and WebUI OTA handler
#endif
#define OTA_GITHUB_FP "CA:06:F5:6B:25:8B:7A:0D:4F:2B:05:47:09:39:47:86:51:15:19:84"
#ifndef OTA_FINGERPRINT
#define OTA_FINGERPRINT OTA_GITHUB_FP
#endif
#ifndef OTA_SECURE_CLIENT_CHECK
#define OTA_SECURE_CLIENT_CHECK SECURE_CLIENT_CHECK
#endif
#ifndef OTA_SECURE_CLIENT_MFLN
#define OTA_SECURE_CLIENT_MFLN SECURE_CLIENT_MFLN
#endif
#ifndef OTA_SECURE_CLIENT_INCLUDE_CA
#define OTA_SECURE_CLIENT_INCLUDE_CA 0 // Use user-provided CA. Only PROGMEM PEM option is supported.
// TODO: eventually should be replaced with pre-parsed structs, read directly from flash
// (ref: https://github.com/earlephilhower/bearssl-esp8266/pull/14)
//
// When enabled, current implementation includes "static/ota_client_trusted_root_ca.h" with
// const char _ota_client_trusted_root_ca[] PROGMEM = "...PEM data...";
// By default, using DigiCert root in "static/digicert_evroot_pem.h" (for https://github.com)
#endif
// -----------------------------------------------------------------------------
// NOFUSS
// -----------------------------------------------------------------------------
#ifndef NOFUSS_SUPPORT
#define NOFUSS_SUPPORT 0 // Do not enable support for NoFuss by default (12.65Kb)
#endif
#ifndef NOFUSS_ENABLED
#define NOFUSS_ENABLED 0 // Do not perform NoFUSS updates by default
#endif
#ifndef NOFUSS_SERVER
#define NOFUSS_SERVER "" // Default NoFuss Server
#endif
#ifndef NOFUSS_INTERVAL
#define NOFUSS_INTERVAL 3600000 // Check for updates every hour
#endif
// -----------------------------------------------------------------------------
// UART
// -----------------------------------------------------------------------------
#ifndef UART_SUPPORT
#define UART_SUPPORT 1
#endif
#ifndef UART_SOFTWARE_SUPPORT
#define UART_SOFTWARE_SUPPORT 0 // (optional) allows to set TX and RX pins
// to values other than just 1, 2, 3, 13 or 15
// which by default use hardware UART
#endif
// -----------------------------------------------------------------------------
// UART <-> MQTT
// -----------------------------------------------------------------------------
#ifndef UART_MQTT_SUPPORT
#define UART_MQTT_SUPPORT 0 // Not enabled by default
#endif
#ifndef UART_MQTT_PORT
#define UART_MQTT_PORT 1
#endif
#ifndef UART_MQTT_BUFFER_SIZE
#define UART_MQTT_BUFFER_SIZE 128 // Buffen up to N bytes when reading.
// If buffer fills up before we are able to send, old data gets discarded
#endif
#ifndef UART_MQTT_TERMINATE_OUT
#define UART_MQTT_TERMINATE_OUT '\n' // Write this byte after every received payload
// Set to `\0` to disable
#endif
#ifndef UART_MQTT_TERMINATE_IN
#define UART_MQTT_TERMINATE_IN '\n' // Read and buffer serial until this byte is found
// Set to `\0` to disable; instead, data will be sent periodically (as soon as it is read)
#endif
#ifndef UART_MQTT_ENCODE
#define UART_MQTT_ENCODE 0 // Data read from serial will be sent as HEX strings
// (e.g. for binary protocols; 2char per 1byte)
#endif
#ifndef UART_MQTT_DECODE
#define UART_MQTT_DECODE 0 // MQTT payload received will be converted from HEX before writing to serial
#endif
// -----------------------------------------------------------------------------
// MQTT
// -----------------------------------------------------------------------------
#ifndef MQTT_SUPPORT
#define MQTT_SUPPORT 1 // MQTT support (22.38Kb async, 12.48Kb sync)
#endif
#ifndef MQTT_LIBRARY
#define MQTT_LIBRARY MQTT_LIBRARY_ASYNCMQTTCLIENT // MQTT_LIBRARY_ASYNCMQTTCLIENT (default, https://github.com/marvinroger/async-mqtt-client)
// MQTT_LIBRARY_PUBSUBCLIENT (https://github.com/knolleary/pubsubclient)
// MQTT_LIBRARY_ARDUINOMQTT (https://github.com/256dpi/arduino-mqtt)
#endif
// -----------------------------------------------------------------------------
// MQTT OVER SSL
// -----------------------------------------------------------------------------
//
// Requires SECURE_CLIENT set to SECURE_CLIENT_AXTLS or SECURE_CLIENT_BEARSSL
// It is recommended to use MQTT_LIBRARY_ARDUINOMQTT or MQTT_LIBRARY_PUBSUBCLIENT
// It is recommended to use SECURE_CLIENT_BEARSSL
// It is recommended to use ESP8266 Arduino Core >= 2.5.2 with SECURE_CLIENT_BEARSSL
//
// Current version of MQTT_LIBRARY_ASYNCMQTTCLIENT only supports SECURE_CLIENT_AXTLS
//
// It is recommended to use as little modules as possible with SECURE_CLIENT option, as it requires a large amount
// of pre-allocated RAM. Even in MFLN mode, it will still require at least 16KiB to prepare input buffer.
// See SECURE_CLIENT_CHECK for all possible connection verification options.
//
// The simpliest way to verify SSL connection is to use fingerprinting.
// For example, to get Google's MQTT server certificate fingerprint, run the following command:
// $ echo -n | openssl s_client -connect mqtt.googleapis.com:8883 2>&1 | openssl x509 -noout -fingerprint -sha1 | cut -d\= -f2
// Note that fingerprint will change when certificate changes e.g. LetsEncrypt renewals or when the CSR updates
#ifndef MQTT_SSL_ENABLED
#define MQTT_SSL_ENABLED 0 // By default MQTT over SSL will not be enabled
#endif
#ifndef MQTT_SSL_FINGERPRINT
#define MQTT_SSL_FINGERPRINT "" // SSL fingerprint of the server
#endif
#ifndef MQTT_SECURE_CLIENT_CHECK
#define MQTT_SECURE_CLIENT_CHECK SECURE_CLIENT_CHECK // Use global verification setting by default
#endif
#ifndef MQTT_SECURE_CLIENT_MFLN
#define MQTT_SECURE_CLIENT_MFLN SECURE_CLIENT_MFLN // Use global MFLN setting by default
#endif
#ifndef MQTT_SECURE_CLIENT_INCLUDE_CA
#define MQTT_SECURE_CLIENT_INCLUDE_CA 0 // Use user-provided CA. Only PROGMEM PEM option is supported.
// When enabled, current implementation includes "static/mqtt_client_trusted_root_ca.h" with
// const char _mqtt_client_trusted_root_ca[] PROGMEM = "...PEM data...";
// By default, using LetsEncrypt X3 root in "static/letsencrypt_isrgroot_pem.h"
#endif
#ifndef MQTT_ENABLED
#define MQTT_ENABLED 0 // Do not enable MQTT connection by default