2016-12-31 00:38:51 +01:00
/*
2018-09-15 17:29:01 +02:00
* Main sketch , global variable declarations
2016-12-31 00:38:51 +01:00
*/
2017-12-14 00:12:02 +01:00
/*
* @ title WLED project sketch
2019-11-20 00:47:43 +01:00
* @ version 0.8 .7 - dev
2017-12-14 00:12:02 +01:00
* @ author Christian Schwinne
*/
2016-12-31 00:38:51 +01:00
2018-06-24 01:20:15 +02:00
2019-05-21 18:50:56 +02:00
//ESP8266-01 (blue) got too little storage space to work with all features of WLED. To use it, you must use ESP8266 Arduino Core v2.4.2 and the setting 512K(No SPIFFS).
2018-10-25 20:55:29 +02:00
//ESP8266-01 (black) has 1MB flash and can thus fit the whole program. Use 1M(64K SPIFFS).
2018-11-01 15:36:13 +01:00
//Uncomment some of the following lines to disable features to compile for ESP8266-01 (max flash size 434kB):
2018-10-25 20:55:29 +02:00
2018-11-16 19:59:00 +01:00
//You are required to disable over-the-air updates:
2018-12-06 00:40:59 +01:00
//#define WLED_DISABLE_OTA
2018-10-25 20:55:29 +02:00
2019-11-28 20:13:52 +01:00
//You need to choose some of these features to disable:
2018-10-25 20:55:29 +02:00
//#define WLED_DISABLE_ALEXA
//#define WLED_DISABLE_BLYNK
//#define WLED_DISABLE_CRONIXIE
2018-12-06 00:40:59 +01:00
//#define WLED_DISABLE_HUESYNC
//#define WLED_DISABLE_INFRARED //there is no pin left for this on ESP8266-01
2018-11-16 19:59:00 +01:00
//#define WLED_DISABLE_MOBILE_UI
2019-11-28 20:13:52 +01:00
# define WLED_ENABLE_ADALIGHT //only saves about 500b
2019-03-18 19:54:06 +01:00
2019-03-16 02:09:37 +01:00
# define WLED_DISABLE_FILESYSTEM //SPIFFS is not used by any WLED feature yet
//#define WLED_ENABLE_FS_SERVING //Enable sending html file from SPIFFS before serving progmem version
//#define WLED_ENABLE_FS_EDITOR //enable /edit page for editing SPIFFS content. Will also be disabled with OTA lock
//to toggle usb serial debug (un)comment the following line
2019-10-26 00:00:44 +02:00
//#define WLED_DEBUG
2018-11-21 23:28:20 +01:00
2019-03-16 02:09:37 +01:00
2018-09-15 17:29:01 +02:00
//library inclusions
2016-09-11 23:07:18 +02:00
# include <Arduino.h>
2019-10-25 15:32:09 +02:00
# ifdef ESP8266
# include <ESP8266WiFi.h>
# include <ESP8266mDNS.h>
# include <ESPAsyncTCP.h>
# else
2018-11-09 17:00:36 +01:00
# include <WiFi.h>
2019-10-25 11:54:47 +02:00
# include "esp_wifi.h"
2018-11-09 17:00:36 +01:00
# include <ESPmDNS.h>
2019-02-16 00:21:22 +01:00
# include <AsyncTCP.h>
2019-03-16 02:09:37 +01:00
# include "SPIFFS.h"
2018-01-09 23:13:29 +01:00
# endif
2018-09-15 17:29:01 +02:00
2019-02-17 17:11:10 +01:00
# include <ESPAsyncWebServer.h>
2016-09-11 23:07:18 +02:00
# include <EEPROM.h>
2018-12-17 15:08:59 +01:00
# include <WiFiUdp.h>
2019-02-16 00:21:22 +01:00
# include <DNSServer.h>
2018-11-01 15:36:13 +01:00
# ifndef WLED_DISABLE_OTA
2018-11-09 17:00:36 +01:00
# include <ArduinoOTA.h>
2018-11-01 15:36:13 +01:00
# endif
2019-03-16 02:09:37 +01:00
# include <SPIFFSEditor.h>
2017-12-11 23:59:12 +01:00
# include "src/dependencies/time/TimeLib.h"
# include "src/dependencies/timezone/Timezone.h"
2019-01-09 22:52:42 +01:00
# ifndef WLED_DISABLE_ALEXA
2019-02-16 00:21:22 +01:00
# define ESPALEXA_ASYNC
2019-03-03 18:05:56 +01:00
# define ESPALEXA_NO_SUBPAGE
2019-01-09 22:52:42 +01:00
# define ESPALEXA_MAXDEVICES 1
2019-10-20 17:38:25 +02:00
//#define ESPALEXA_DEBUG
2019-01-09 22:52:42 +01:00
# include "src/dependencies/espalexa/Espalexa.h"
# endif
2018-11-01 15:36:13 +01:00
# ifndef WLED_DISABLE_BLYNK
2018-11-09 17:00:36 +01:00
# include "src/dependencies/blynk/BlynkSimpleEsp.h"
2018-11-01 15:36:13 +01:00
# endif
2019-11-18 20:43:27 +01:00
# include "src/dependencies/e131/ESPAsyncE131.h"
2019-02-17 19:21:09 +01:00
# include "src/dependencies/async-mqtt-client/AsyncMqttClient.h"
2019-06-21 23:12:58 +02:00
# include "src/dependencies/json/AsyncJson-v6.h"
# include "src/dependencies/json/ArduinoJson-v6.h"
2018-11-16 19:59:00 +01:00
# include "html_classic.h"
# include "html_mobile.h"
# include "html_settings.h"
# include "html_other.h"
2019-10-07 23:38:21 +02:00
# include "FX.h"
2018-11-18 00:31:45 +01:00
# include "ir_codes.h"
2016-09-11 23:07:18 +02:00
2019-03-16 02:09:37 +01:00
2019-02-20 15:10:23 +01:00
# if IR_PIN < 0
# ifndef WLED_DISABLE_INFRARED
# define WLED_DISABLE_INFRARED
# endif
# endif
# ifdef ARDUINO_ARCH_ESP32
/*#ifndef WLED_DISABLE_INFRARED
# include <IRremote.h>
# endif* / //there are issues with ESP32 infrared, so it is disabled for now
# else
# ifndef WLED_DISABLE_INFRARED
# include <IRremoteESP8266.h>
# include <IRrecv.h>
# include <IRutils.h>
# endif
# endif
2018-09-15 17:29:01 +02:00
//version code in format yymmddb (b = daily build)
2019-11-26 20:41:15 +01:00
# define VERSION 1911261
2019-11-12 19:33:34 +01:00
char versionString [ ] = " 0.8.7-dev " ;
2017-03-20 19:56:07 +01:00
2018-09-15 17:29:01 +02:00
//AP and OTA default passwords (for maximum change them!)
2018-07-21 23:21:07 +02:00
char apPass [ 65 ] = " wled1234 " ;
char otaPass [ 33 ] = " wledota " ;
2017-05-08 21:00:06 +02:00
2018-09-15 17:29:01 +02:00
//Hardware CONFIG (only changeble HERE, not at runtime)
2018-11-18 00:31:45 +01:00
//LED strip pin, button pin and IR pin changeable in NpbWrapper.h!
2018-09-15 17:29:01 +02:00
byte auxDefaultState = 0 ; //0: input 1: high 2: low
byte auxTriggeredState = 0 ; //0: input 1: high 2: low
char ntpServerName [ ] = " 0.wled.pool.ntp.org " ; //NTP server to use
//WiFi CONFIG (all these can be changed via web UI, no need to set them here)
2018-07-21 23:21:07 +02:00
char clientSSID [ 33 ] = " Your_Network " ;
char clientPass [ 65 ] = " " ;
2019-02-05 19:40:24 +01:00
char cmDNS [ 33 ] = " x " ; //mDNS address (placeholder, will be replaced by wledXXXXXXXXXXXX.local)
2019-03-11 00:20:17 +01:00
char apSSID [ 33 ] = " " ; //AP off by default (unless setup)
2018-09-15 17:29:01 +02:00
byte apChannel = 1 ; //2.4GHz WiFi AP channel (1-13)
byte apHide = 0 ; //hidden AP SSID
2019-10-25 00:14:58 +02:00
//byte apWaitTimeSecs = 32; //time to wait for connection before opening AP
byte apBehavior = 0 ; //0: Open AP when no connection after boot 1: Open when no connection 2: Always open 3: Only when button pressed for 6 sec
//bool recoveryAPDisabled = false; //never open AP (not recommended)
2018-09-15 17:29:01 +02:00
IPAddress staticIP ( 0 , 0 , 0 , 0 ) ; //static IP of ESP
IPAddress staticGateway ( 0 , 0 , 0 , 0 ) ; //gateway (router) IP
IPAddress staticSubnet ( 255 , 255 , 255 , 0 ) ; //most common subnet in home networks
//LED CONFIG
2019-08-17 12:27:06 +02:00
uint16_t ledCount = 30 ; //overcurrent prevented by ABL
2018-09-15 17:29:01 +02:00
bool useRGBW = false ; //SK6812 strips can contain an extra White channel
bool autoRGBtoRGBW = false ; //if RGBW enabled, calculate White channel from RGB
2019-08-17 12:27:06 +02:00
# define ABL_MILLIAMPS_DEFAULT 850; //auto lower brightness to stay close to milliampere limit
2018-09-15 17:29:01 +02:00
bool turnOnAtBoot = true ; //turn on LEDs at power-up
byte bootPreset = 0 ; //save preset to load after power-up
2019-02-05 21:53:39 +01:00
byte colS [ ] { 255 , 159 , 0 , 0 } ; //default RGB(W) color
byte colSecS [ ] { 0 , 0 , 0 , 0 } ; //default RGB(W) secondary color
2018-09-15 17:29:01 +02:00
byte briS = 127 ; //default brightness
2019-08-17 12:27:06 +02:00
byte effectDefault = 0 ;
2018-03-14 13:16:28 +01:00
byte effectSpeedDefault = 75 ;
2018-09-15 17:29:01 +02:00
byte effectIntensityDefault = 128 ; //intensity is supported on some effects as an additional parameter (e.g. for blink you can change the duty cycle)
byte effectPaletteDefault = 0 ; //palette is supported on the FastLED effects, otherwise it has no effect
byte nightlightTargetBri = 0 ; //brightness after nightlight is over
byte nightlightDelayMins = 60 ;
bool nightlightFade = true ; //if enabled, light will gradually dim towards the target bri. Otherwise, it will instantly set after delay over
bool fadeTransition = true ; //enable crossfading color transition
bool enableSecTransition = true ; //also enable transition for secondary color
2019-05-22 00:23:09 +02:00
uint16_t transitionDelay = 750 ; //default crossfade duration in ms
2018-03-14 00:25:54 +01:00
2019-05-22 00:23:09 +02:00
//bool strip.reverseMode = false; //flip entire LED strip (reverses all effect directions) --> edit in WS2812FX.h
2018-09-15 17:29:01 +02:00
bool skipFirstLed = false ; //ignore first LED in strip (useful if you need the LED as signal repeater)
byte briMultiplier = 100 ; //% of brightness to set (to limit power, if you set it to 50 and set bri to 255, actual brightness will be 127)
//User Interface CONFIG
2019-10-05 01:56:55 +02:00
char serverDescription [ 33 ] = " WLED " ; //Name of module
2019-03-25 22:51:38 +01:00
byte currentTheme = 7 ; //UI theme index for settings and classic UI
2019-10-25 15:32:09 +02:00
byte uiConfiguration = 2 ; //0: automatic (depends on user-agent) 1: classic UI 2: mobile UI
2018-09-15 17:29:01 +02:00
bool useHSB = true ; //classic UI: use HSB sliders instead of RGB by default
char cssFont [ 33 ] = " Verdana " ; //font to use in classic UI
bool useHSBDefault = useHSB ;
//Sync CONFIG
2018-11-21 23:28:20 +01:00
bool buttonEnabled = true ;
bool irEnabled = false ; //Infrared receiver
2018-09-15 17:29:01 +02:00
uint16_t udpPort = 21324 ; //WLED notifier default port
uint16_t udpRgbPort = 19446 ; //Hyperion port
bool receiveNotificationBrightness = true ; //apply brightness from incoming notifications
bool receiveNotificationColor = true ; //apply color
bool receiveNotificationEffects = true ; //apply effects setup
2019-03-25 22:51:38 +01:00
bool notifyDirect = false ; //send notification if change via UI or HTTP API
bool notifyButton = false ; //send if updated by button or infrared remote
2018-09-15 17:29:01 +02:00
bool notifyAlexa = false ; //send notification if updated via Alexa
bool notifyMacro = false ; //send notification for macro
bool notifyHue = true ; //send notification if Hue light changes
bool notifyTwice = false ; //notifications use UDP: enable if devices don't sync reliably
bool alexaEnabled = true ; //enable device discovery by Amazon Echo
char alexaInvocationName [ 33 ] = " Light " ; //speech control name of device. Choose something voice-to-text can understand
2019-02-16 00:21:22 +01:00
char blynkApiKey [ 36 ] = " " ; //Auth token for Blynk server. If empty, no connection will be made
2018-09-15 17:29:01 +02:00
uint16_t realtimeTimeoutMs = 2500 ; //ms timeout of realtime mode before returning to normal mode
int arlsOffset = 0 ; //realtime LED offset
bool receiveDirect = true ; //receive UDP realtime
bool arlsDisableGammaCorrection = true ; //activate if gamma correction is handled by the source
bool arlsForceMaxBri = false ; //enable to force max brightness if source has very dark colors that would be black
2019-11-18 20:43:27 +01:00
uint16_t e131Universe = 1 ; //settings for E1.31 (sACN) protocol
2018-09-15 17:29:01 +02:00
bool e131Multicast = false ;
2018-10-04 16:50:12 +02:00
char mqttDeviceTopic [ 33 ] = " " ; //main MQTT topic (individual per device, default is wled/mac)
char mqttGroupTopic [ 33 ] = " wled/all " ; //second MQTT topic (for example to group devices)
char mqttServer [ 33 ] = " " ; //both domains and IPs should work (no SSL)
2019-08-18 03:34:47 +02:00
char mqttUser [ 41 ] = " " ; //optional: username for MQTT auth
char mqttPass [ 41 ] = " " ; //optional: password for MQTT auth
char mqttClientID [ 41 ] = " " ; //override the client ID
2019-08-18 18:14:17 +02:00
uint16_t mqttPort = 1883 ;
2018-09-28 23:53:51 +02:00
2018-09-15 17:29:01 +02:00
bool huePollingEnabled = false ; //poll hue bridge for light state
uint16_t huePollIntervalMs = 2500 ; //low values (< 1sec) may cause lag but offer quicker response
2018-10-07 11:56:29 +02:00
char hueApiKey [ 47 ] = " api " ; //key token will be obtained from bridge
2018-09-15 17:29:01 +02:00
byte huePollLightId = 1 ; //ID of hue lamp to sync to. Find the ID in the hue app ("about" section)
IPAddress hueIP = ( 0 , 0 , 0 , 0 ) ; //IP address of the bridge
bool hueApplyOnOff = true ;
bool hueApplyBri = true ;
bool hueApplyColor = true ;
//Time CONFIG
bool ntpEnabled = false ; //get internet time. Only required if you use clock overlays or time-activated macros
bool useAMPM = false ; //12h/24h clock format
byte currentTimezone = 0 ; //Timezone ID. Refer to timezones array in wled10_ntp.ino
int utcOffsetSecs = 0 ; //Seconds to offset from UTC before timzone calculation
byte overlayDefault = 0 ; //0: no overlay 1: analog clock 2: single-digit clocl 3: cronixie
byte overlayMin = 0 , overlayMax = ledCount - 1 ; //boundaries of overlay mode
byte analogClock12pixel = 0 ; //The pixel in your strip where "midnight" would be
bool analogClockSecondsTrail = false ; //Display seconds as trail of LEDs instead of a single pixel
bool analogClock5MinuteMarks = false ; //Light pixels at every 5-minute position
2018-10-07 11:56:29 +02:00
char cronixieDisplay [ 7 ] = " HHMMSS " ; //Cronixie Display mask. See wled13_cronixie.ino
2018-09-15 17:29:01 +02:00
bool cronixieBacklight = true ; //Allow digits to be back-illuminated
bool countdownMode = false ; //Clock will count down towards date
byte countdownYear = 19 , countdownMonth = 1 ; //Countdown target date, year is last two digits
byte countdownDay = 1 , countdownHour = 0 ;
byte countdownMin = 0 , countdownSec = 0 ;
byte macroBoot = 0 ; //macro loaded after startup
byte macroNl = 0 ; //after nightlight delay over
2019-08-17 12:27:06 +02:00
byte macroCountdown = 0 ;
2018-03-14 13:16:28 +01:00
byte macroAlexaOn = 0 , macroAlexaOff = 0 ;
2019-03-13 11:13:03 +01:00
byte macroButton = 0 , macroLongPress = 0 , macroDoublePress = 0 ;
2017-12-28 00:37:13 +01:00
2017-02-21 23:59:47 +01:00
2018-09-15 17:29:01 +02:00
//Security CONFIG
bool otaLock = false ; //prevents OTA firmware updates without password. ALWAYS enable if system exposed to any public networks
bool wifiLock = false ; //prevents access to WiFi settings when OTA lock is enabled
bool aOtaEnabled = true ; //ArduinoOTA allows easy updates directly from the IDE. Careful, it does not auto-disable when OTA lock is on
2018-02-28 00:27:10 +01:00
2018-04-24 12:03:25 +02:00
uint16_t userVar0 = 0 , userVar1 = 0 ;
2018-09-15 17:29:01 +02:00
//internal global variable declarations
2019-10-18 23:47:11 +02:00
//wifi
bool apActive = false ;
bool forceReconnect = false ;
uint32_t lastReconnectAttempt = 0 ;
bool interfacesInited = false ;
2019-10-26 00:00:44 +02:00
bool wasConnected = false ;
2019-10-18 23:47:11 +02:00
2018-09-15 17:29:01 +02:00
//color
2019-02-05 21:53:39 +01:00
byte col [ ] { 255 , 159 , 0 , 0 } ; //target RGB(W) color
byte colOld [ ] { 0 , 0 , 0 , 0 } ; //color before transition
byte colT [ ] { 0 , 0 , 0 , 0 } ; //current color
byte colIT [ ] { 0 , 0 , 0 , 0 } ; //color that was last sent to LEDs
byte colSec [ ] { 0 , 0 , 0 , 0 } ;
byte colSecT [ ] { 0 , 0 , 0 , 0 } ;
byte colSecOld [ ] { 0 , 0 , 0 , 0 } ;
byte colSecIT [ ] { 0 , 0 , 0 , 0 } ;
2018-09-15 17:29:01 +02:00
byte lastRandomIndex = 0 ; //used to save last random color so the new one is not the same
//transitions
bool transitionActive = false ;
uint16_t transitionDelayDefault = transitionDelay ;
2018-03-15 13:03:50 +01:00
uint16_t transitionDelayTemp = transitionDelay ;
2017-02-07 16:02:27 +01:00
unsigned long transitionStartTime ;
2018-09-15 17:29:01 +02:00
float tperLast = 0 ; //crossfade transition progress, 0.0f - 1.0f
2019-10-29 02:21:23 +01:00
bool jsonTransitionOnce = false ;
2018-09-15 17:29:01 +02:00
//nightlight
bool nightlightActive = false ;
bool nightlightActiveOld = false ;
uint32_t nightlightDelayMs = 10 ;
2018-11-21 23:28:20 +01:00
uint8_t nightlightDelayMinsDefault = nightlightDelayMins ;
2017-02-07 16:02:27 +01:00
unsigned long nightlightStartTime ;
2018-09-15 17:29:01 +02:00
byte briNlT = 0 ; //current nightlight brightness
//brightness
2018-12-16 20:38:00 +01:00
unsigned long lastOnTime = 0 ;
2019-03-13 11:13:03 +01:00
bool offMode = ! turnOnAtBoot ;
2018-09-15 17:29:01 +02:00
byte bri = briS ;
2018-03-14 13:16:28 +01:00
byte briOld = 0 ;
byte briT = 0 ;
byte briIT = 0 ;
2018-09-15 17:29:01 +02:00
byte briLast = 127 ; //brightness before turned off. Used for toggle function
//button
2018-03-14 13:16:28 +01:00
bool buttonPressedBefore = false ;
2019-10-18 12:19:52 +02:00
bool buttonLongPressed = false ;
2018-03-14 13:16:28 +01:00
unsigned long buttonPressedTime = 0 ;
2019-03-13 11:13:03 +01:00
unsigned long buttonWaitTime = 0 ;
2018-09-15 17:29:01 +02:00
//notifications
bool notifyDirectDefault = notifyDirect ;
bool receiveNotifications = true ;
2018-03-14 13:16:28 +01:00
unsigned long notificationSentTime = 0 ;
byte notificationSentCallMode = 0 ;
2018-03-06 23:47:08 +01:00
bool notificationTwoRequired = false ;
2018-09-15 17:29:01 +02:00
//effects
byte effectCurrent = effectDefault ;
byte effectSpeed = effectSpeedDefault ;
byte effectIntensity = effectIntensityDefault ;
byte effectPalette = effectPaletteDefault ;
//network
2018-05-18 23:24:47 +02:00
bool udpConnected = false , udpRgbConnected = false ;
2018-09-15 17:29:01 +02:00
//ui style
2018-10-04 16:50:12 +02:00
char cssCol [ 6 ] [ 9 ] = { " " , " " , " " , " " , " " , " " } ;
2018-09-15 17:29:01 +02:00
bool showWelcomePage = false ;
2017-02-07 14:24:42 +01:00
2018-03-15 12:04:14 +01:00
//hue
2018-07-21 23:21:07 +02:00
char hueError [ 25 ] = " Inactive " ;
2019-02-18 22:34:21 +01:00
//uint16_t hueFailCount = 0;
2018-03-15 12:04:14 +01:00
float hueXLast = 0 , hueYLast = 0 ;
uint16_t hueHueLast = 0 , hueCtLast = 0 ;
byte hueSatLast = 0 , hueBriLast = 0 ;
2018-09-15 17:29:01 +02:00
unsigned long hueLastRequestSent = 0 ;
2019-02-18 22:34:21 +01:00
bool hueAuthRequired = false ;
bool hueReceived = false ;
bool hueStoreAllowed = false , hueNewKey = false ;
2018-03-15 12:04:14 +01:00
2018-09-15 17:29:01 +02:00
//overlays
byte overlayCurrent = overlayDefault ;
2018-03-14 13:16:28 +01:00
byte overlaySpeed = 200 ;
unsigned long overlayRefreshMs = 200 ;
2017-02-07 16:02:27 +01:00
unsigned long overlayRefreshedTime ;
2016-12-31 17:36:07 +01:00
int overlayArr [ 6 ] ;
2018-03-06 23:47:08 +01:00
uint16_t overlayDur [ 6 ] ;
uint16_t overlayPauseDur [ 6 ] ;
2016-12-31 21:10:33 +01:00
int nixieClockI = - 1 ;
2018-09-15 17:29:01 +02:00
bool nixiePause = false ;
2018-03-06 23:47:08 +01:00
//cronixie
byte dP [ ] { 0 , 0 , 0 , 0 , 0 , 0 } ;
bool cronixieInit = false ;
2017-09-18 10:20:04 +02:00
2018-09-15 17:29:01 +02:00
//countdown
unsigned long countdownTime = 1514764800L ;
bool countdownOverTriggered = true ;
2018-09-22 22:49:24 +02:00
//timer
byte lastTimerMinute = 0 ;
byte timerHours [ ] = { 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 } ;
byte timerMinutes [ ] = { 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 } ;
byte timerMacro [ ] = { 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 } ;
byte timerWeekday [ ] = { 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 } ; //weekdays to activate on
2019-01-31 00:09:44 +01:00
//bit pattern of arr elem: 0b11111111: sun,sat,fri,thu,wed,tue,mon,validity
2018-09-22 22:49:24 +02:00
2018-09-15 17:29:01 +02:00
//blynk
bool blynkEnabled = false ;
//preset cycling
2018-04-11 23:50:35 +02:00
bool presetCyclingEnabled = false ;
byte presetCycleMin = 1 , presetCycleMax = 5 ;
uint16_t presetCycleTime = 1250 ;
unsigned long presetCycledTime = 0 ; byte presetCycCurr = presetCycleMin ;
2018-12-06 00:27:36 +01:00
bool presetApplyBri = false , presetApplyCol = true , presetApplyFx = true ;
2018-06-24 01:20:15 +02:00
bool saveCurrPresetCycConf = false ;
2018-09-15 17:29:01 +02:00
//realtime
bool realtimeActive = false ;
2018-06-24 01:20:15 +02:00
IPAddress realtimeIP = ( 0 , 0 , 0 , 0 ) ;
2018-09-15 17:29:01 +02:00
unsigned long realtimeTimeout = 0 ;
2018-09-28 23:53:51 +02:00
//mqtt
2019-10-18 14:06:07 +02:00
long lastMqttReconnectAttempt = 0 ;
2018-10-04 16:50:12 +02:00
long lastInterfaceUpdate = 0 ;
byte interfaceUpdateCallMode = 0 ;
2019-11-10 22:13:07 +01:00
char mqttStatusTopic [ 40 ] = " " ; //this must be global because of async handlers
2018-09-28 23:53:51 +02:00
2019-02-25 19:14:13 +01:00
# if AUXPIN >= 0
2018-09-15 17:29:01 +02:00
//auxiliary debug pin
2018-03-14 13:16:28 +01:00
byte auxTime = 0 ;
2018-05-18 23:24:47 +02:00
unsigned long auxStartTime = 0 ;
bool auxActive = false , auxActiveBefore = false ;
2019-02-25 19:14:13 +01:00
# endif
2017-09-18 10:20:04 +02:00
2018-02-20 22:29:48 +01:00
//alexa udp
2018-01-07 22:52:48 +01:00
String escapedMac ;
2019-01-09 22:52:42 +01:00
# ifndef WLED_DISABLE_ALEXA
Espalexa espalexa ;
EspalexaDevice * espalexaDevice ;
# endif
2017-02-21 23:59:47 +01:00
2018-03-14 11:41:24 +01:00
//dns server
DNSServer dnsServer ;
2018-09-15 17:29:01 +02:00
//network time
bool ntpConnected = false ;
time_t local = 0 ;
unsigned long ntpLastSyncTime = 999000000L ;
unsigned long ntpPacketSentTime = 999000000L ;
IPAddress ntpServerIP ;
2019-10-29 01:19:56 +01:00
uint16_t ntpLocalPort = 2390 ;
2018-09-15 17:29:01 +02:00
# define NTP_PACKET_SIZE 48
2019-10-26 00:00:44 +02:00
# define MAX_LEDS 1500
# define MAX_LEDS_DMA 500
2019-03-11 19:30:49 +01:00
//string temp buffer (now stored in stack locally)
2019-02-20 23:44:34 +01:00
# define OMAX 2048
2019-03-11 19:30:49 +01:00
char * obuf ;
2018-07-20 19:35:31 +02:00
uint16_t olen = 0 ;
2019-02-16 00:21:22 +01:00
String messageHead , messageSub ;
2019-02-20 23:44:34 +01:00
byte optionType ;
2019-02-16 00:21:22 +01:00
2019-02-17 17:11:10 +01:00
bool doReboot = false ; //flag to initiate reboot from async handlers
2019-10-20 17:38:25 +02:00
bool doPublishMqtt = false ;
bool doSendHADiscovery = true ;
2019-02-17 17:11:10 +01:00
2018-09-15 17:29:01 +02:00
//server library objects
2019-02-16 00:21:22 +01:00
AsyncWebServer server ( 80 ) ;
2019-02-18 22:34:21 +01:00
AsyncClient * hueClient = NULL ;
2019-02-17 19:21:09 +01:00
AsyncMqttClient * mqtt = NULL ;
2018-09-28 23:53:51 +02:00
2019-11-18 20:43:27 +01:00
//function prototypes
void serveMessage ( AsyncWebServerRequest * , uint16_t , String , String , byte ) ;
void handleE131Packet ( e131_packet_t * , IPAddress ) ;
2019-11-28 20:13:52 +01:00
# define E131_MAX_UNIVERSE_COUNT 9
2019-11-18 20:43:27 +01:00
2018-09-15 17:29:01 +02:00
//udp interface objects
2018-05-18 23:24:47 +02:00
WiFiUDP notifierUdp , rgbUdp ;
2017-02-07 16:02:27 +01:00
WiFiUDP ntpUdp ;
2019-11-18 20:43:27 +01:00
ESPAsyncE131 e131 ( handleE131Packet ) ;
bool e131NewData = false ;
2016-09-21 23:23:18 +02:00
2018-09-15 17:29:01 +02:00
//led fx library object
2018-04-13 00:28:29 +02:00
WS2812FX strip = WS2812FX ( ) ;
2016-12-14 23:40:47 +01:00
2019-10-18 13:26:39 +02:00
# define WLED_CONNECTED (WiFi.status() == WL_CONNECTED)
2019-10-18 23:47:11 +02:00
# define WLED_WIFI_CONFIGURED (strlen(clientSSID) >= 1 && strcmp(clientSSID,"Your_Network") != 0)
2019-10-18 13:26:39 +02:00
2018-09-15 17:29:01 +02:00
//debug macros
2018-11-21 23:28:20 +01:00
# ifdef WLED_DEBUG
2017-12-16 00:04:04 +01:00
# define DEBUG_PRINT(x) Serial.print (x)
# define DEBUG_PRINTLN(x) Serial.println (x)
# define DEBUG_PRINTF(x) Serial.printf (x)
2018-09-15 17:29:01 +02:00
unsigned long debugTime = 0 ;
int lastWifiState = 3 ;
unsigned long wifiStateChangedTime = 0 ;
2019-10-20 12:48:29 +02:00
int loops = 0 ;
2017-12-16 00:04:04 +01:00
# else
# define DEBUG_PRINT(x)
# define DEBUG_PRINTLN(x)
# define DEBUG_PRINTF(x)
# endif
2018-09-15 17:29:01 +02:00
//filesystem
2019-03-16 02:09:37 +01:00
# ifndef WLED_DISABLE_FILESYSTEM
# include <FS.h>
# ifdef ARDUINO_ARCH_ESP32
# include "SPIFFS.h"
# endif
# include "SPIFFSEditor.h"
2017-05-15 12:24:59 +02:00
# endif
2016-09-11 23:07:18 +02:00
2018-09-15 17:29:01 +02:00
//turns all LEDs off and restarts ESP
2016-09-11 23:07:18 +02:00
void reset ( )
{
2018-03-14 13:16:28 +01:00
briT = 0 ;
2019-03-07 23:22:52 +01:00
long dly = millis ( ) ;
while ( millis ( ) - dly < 250 )
{
yield ( ) ; //enough time to send response to client
}
2016-10-25 22:11:04 +02:00
setAllLeds ( ) ;
2017-01-15 00:24:28 +01:00
DEBUG_PRINTLN ( " MODULE RESET " ) ;
2018-01-09 23:13:29 +01:00
ESP . restart ( ) ;
2016-09-11 23:07:18 +02:00
}
2018-09-15 17:29:01 +02:00
//append new c string to temp buffer efficiently
bool oappend ( char * txt )
2018-07-20 19:35:31 +02:00
{
uint16_t len = strlen ( txt ) ;
if ( olen + len > = OMAX ) return false ; //buffer full
strcpy ( obuf + olen , txt ) ;
olen + = len ;
return true ;
}
2018-09-15 17:29:01 +02:00
//append new number to temp buffer efficiently
bool oappendi ( int i )
2018-07-20 19:35:31 +02:00
{
2019-08-17 12:27:06 +02:00
char s [ 11 ] ;
2018-07-20 19:35:31 +02:00
sprintf ( s , " %ld " , i ) ;
return oappend ( s ) ;
}
2018-09-15 17:29:01 +02:00
//boot starts here
2016-09-11 23:07:18 +02:00
void setup ( ) {
2018-11-09 17:00:36 +01:00
wledInit ( ) ;
2016-09-11 23:07:18 +02:00
}
2018-09-15 17:29:01 +02:00
//main program loop
2016-09-11 23:07:18 +02:00
void loop ( ) {
2019-10-18 13:26:39 +02:00
handleConnection ( ) ;
2018-11-09 17:00:36 +01:00
handleSerial ( ) ;
handleNotifications ( ) ;
handleTransitions ( ) ;
userLoop ( ) ;
2019-08-17 12:27:06 +02:00
2018-11-09 17:00:36 +01:00
yield ( ) ;
2019-03-16 02:09:37 +01:00
handleIO ( ) ;
2018-11-18 00:31:45 +01:00
handleIR ( ) ;
2018-11-09 17:00:36 +01:00
handleNetworkTime ( ) ;
2019-10-18 14:06:07 +02:00
handleAlexa ( ) ;
2019-08-17 12:27:06 +02:00
2018-11-09 17:00:36 +01:00
handleOverlays ( ) ;
2019-10-20 17:38:25 +02:00
if ( doSendHADiscovery ) sendHADiscoveryMQTT ( ) ;
2018-11-09 17:00:36 +01:00
yield ( ) ;
2019-02-17 17:11:10 +01:00
if ( doReboot ) reset ( ) ;
2019-08-17 12:27:06 +02:00
2018-11-09 17:00:36 +01:00
if ( ! realtimeActive ) //block stuff if WARLS/Adalight is enabled
{
2019-10-18 23:47:11 +02:00
if ( apActive ) dnsServer . processNextRequest ( ) ;
2018-11-09 17:00:36 +01:00
# ifndef WLED_DISABLE_OTA
2019-10-20 17:38:25 +02:00
if ( WLED_CONNECTED & & aOtaEnabled ) ArduinoOTA . handle ( ) ;
2017-01-15 00:24:28 +01:00
# endif
2018-11-09 17:00:36 +01:00
handleNightlight ( ) ;
2019-03-09 21:41:23 +01:00
yield ( ) ;
2019-10-18 14:06:07 +02:00
handleHue ( ) ;
handleBlynk ( ) ;
2019-02-20 23:44:34 +01:00
yield ( ) ;
2019-03-13 11:13:03 +01:00
if ( ! offMode ) strip . service ( ) ;
2018-11-09 17:00:36 +01:00
}
2019-10-18 23:47:11 +02:00
yield ( ) ;
if ( millis ( ) - lastMqttReconnectAttempt > 30000 ) initMqtt ( ) ;
2019-08-17 12:27:06 +02:00
2018-11-09 17:00:36 +01:00
//DEBUG serial logging
2018-11-21 23:28:20 +01:00
# ifdef WLED_DEBUG
2019-03-07 16:35:02 +01:00
if ( millis ( ) - debugTime > 9999 )
2018-11-09 17:00:36 +01:00
{
2019-03-07 16:35:02 +01:00
DEBUG_PRINTLN ( " ---DEBUG INFO--- " ) ;
2018-11-09 17:00:36 +01:00
DEBUG_PRINT ( " Runtime: " ) ; DEBUG_PRINTLN ( millis ( ) ) ;
DEBUG_PRINT ( " Unix time: " ) ; DEBUG_PRINTLN ( now ( ) ) ;
DEBUG_PRINT ( " Free heap: " ) ; DEBUG_PRINTLN ( ESP . getFreeHeap ( ) ) ;
DEBUG_PRINT ( " Wifi state: " ) ; DEBUG_PRINTLN ( WiFi . status ( ) ) ;
if ( WiFi . status ( ) ! = lastWifiState )
{
wifiStateChangedTime = millis ( ) ;
}
lastWifiState = WiFi . status ( ) ;
DEBUG_PRINT ( " State time: " ) ; DEBUG_PRINTLN ( wifiStateChangedTime ) ;
DEBUG_PRINT ( " NTP last sync: " ) ; DEBUG_PRINTLN ( ntpLastSyncTime ) ;
DEBUG_PRINT ( " Client IP: " ) ; DEBUG_PRINTLN ( WiFi . localIP ( ) ) ;
2019-10-20 12:48:29 +02:00
DEBUG_PRINT ( " Loops/sec: " ) ; DEBUG_PRINTLN ( loops / 10 ) ;
loops = 0 ;
2019-08-17 12:27:06 +02:00
debugTime = millis ( ) ;
2018-11-09 17:00:36 +01:00
}
2019-10-20 12:48:29 +02:00
loops + + ;
2018-11-09 17:00:36 +01:00
# endif
2016-09-11 23:07:18 +02:00
}