Compare commits

...
Author SHA1 Message Date
ESPEasy release bot 5bd2532853 automaticly updated release notes for mega-20180405 2018-04-05 04:00:10 +02:00
mvdbro 4c755d83a6 ESP32 RTOS 10 per second
Run 10 per seconds call independent from main loop
2018-04-04 21:55:50 +02:00
mvdbro 1b9e1b92aa ESP32 RTOS config setting 2018-04-04 12:32:17 +02:00
Gijs NoorlanderandGitHub a4c73cc91e Merge pull request #1175 from Grovkillen/Fix-parsing-structure-for-JSON-+-upload-file-filter
Updated JSON path for sensor values and names
2018-04-04 10:06:17 +02:00
Gijs NoorlanderandGitHub 736fe2111a Merge pull request #1218 from soif/Fix/PioConfTypo
Unwanted lib_ignore now properly commented
2018-04-04 10:05:22 +02:00
Gijs NoorlanderandGitHub 767b0af733 Merge pull request #1217 from soif/Feat/JsonLoad
Shows CPU Load in JSON page
2018-04-04 10:04:59 +02:00
ESPEasy release bot c3bde94f7a automaticly updated release notes for mega-20180403 2018-04-03 04:00:14 +02:00
GrovkillenandGitHub 080be1ad0a Update _P029_Output.ino 2018-04-02 20:41:22 +02:00
GrovkillenandGitHub 232ca4f215 Update _P038_NeoPixel.ino 2018-04-02 20:40:08 +02:00
mvdbro bfa6eac538 ESP32 prep for RTOS multitasking 2018-04-02 15:59:01 +02:00
moi 0ca06782b9 unwanted lib_ignore now properly commented 2018-04-02 13:27:02 +02:00
moi 2079b0f28b Adds CPU Load LC in JSON page 2018-04-02 12:39:14 +02:00
moi 32bf45e817 Show CPU Load in JSON page 2018-04-02 12:38:30 +02:00
ESPEasy release bot 5d41bf9e73 automaticly updated release notes for mega-20180402 2018-04-02 04:00:10 +02:00
Gijs Noorlander dc5a2fd956 Revert "Merge pull request #1205 from s0170071/SerialSwap"
This reverts commit 46586e5355.
2018-04-01 10:47:50 +02:00
ESPEasy release bot b20f05305b automaticly updated release notes for mega-20180401 2018-04-01 04:00:08 +02:00
Gijs NoorlanderandGitHub 46586e5355 Merge pull request #1205 from s0170071/SerialSwap
Serial Swap function
2018-04-01 01:17:51 +02:00
Gijs NoorlanderandGitHub 7e8a751657 Merge pull request #1203 from TD-er/feature/mqtt_disconnect_event
[issue #1201] MQTT#Disconnected event and MQTT stability improvements
2018-04-01 01:14:55 +02:00
TD-er 7d61e55d34 [deepsleep] Allow for some minimum wifi connect time
In Deepsleep mode the wifi connect time is now minimum of 6 seconds.
Also the first loop after connect, the 'awake' timer will reset and start over. Without WiFi connection the set 'awake' timer starts at the moment the node boots.
2018-03-31 23:53:15 +02:00
GrovkillenandGitHub 2f663429a3 P0059 (rotary encoder) and P0063 (ttp229, keypad)
These two plugins are not in test but in normal.
2018-03-31 19:52:25 +02:00
ESPEasy release bot 492791a4ac automaticly updated release notes for mega-20180331 2018-03-31 04:00:09 +02:00
TD-er 52e75ade78 Merge remote-tracking branch 'origin/feature/mqtt_disconnect_event' into feature/mqtt_disconnect_event 2018-03-31 01:42:19 +02:00
TD-er 525a0ba0a1 [issue #1201] MQTT#Disconnected event and MQTT stability improvements
While looking for issues regarding DeepSleep + MQTT and issue #1195, I came across a number of other issues related to high CPU load and WiFi disconnects when a MQTT controller cannot reach the MQTT broker or is set to be no longer enabled.

These fixes improve CPU load and WiFi stability and also send the following events:
- `MQTT#Connected` 
- `MQTT#Disconnected`
- `MQTTimport#Connected` 
- `MQTTimport#Disconnected`

The MQTTimport plugin still has some major issues which have to be taken care of, so #1195 is not fixed yet.
2018-03-31 01:34:50 +02:00
Gijs NoorlanderandGitHub 52c7e5012e Merge pull request #1212 from TD-er/bugfix/build_issues_ESP32_ESP8266
[Build ESP32] Fix for build issues between ESP32 and ESP8266
2018-03-31 01:32:13 +02:00
TD-er 4dd733eb63 [ESP32] Build errors/warnings 2018-03-31 00:53:25 +02:00
TD-er 02a065d623 [Build ESP32] Fix for build issues between ESP32 and ESP8266
There is a problem with the PlatformIO builder since the last update of @mvdbro
It's an issue with the parsing of `#ifdef ESP32`.

It is very well explained here: [platformio/platformio-core#801 (comment)](https://github.com/platformio/platformio-core/issues/801#issuecomment-252447178)

In short, the event handling functions for the wifi have been moved to a separate .h file, since those files will be parsed properly by the Library Dependency Finder (LDF) in PlatformIO 3.x
2018-03-31 00:22:12 +02:00
mvdbro 0afee4fafb ESP32: Fix Wifi Disconnect reason 2018-03-30 16:21:47 +02:00
s0170071 eba1fb3388 Serial Swap function
swaps Serial Pins *and* keeps track of it.
2018-03-30 08:47:55 +02:00
ESPEasy release bot b2c866edeb automaticly updated release notes for mega-20180330 2018-03-30 04:00:10 +02:00
TD-er 3583db3e22 [issue #1201] MQTT#Disconnected event and MQTT stability improvements
While looking for issues regarding DeepSleep + MQTT and issue #1195, I came across a number of other issues related to high CPU load and WiFi disconnects when a MQTT controller cannot reach the MQTT broker or is set to be no longer enabled.

These fixes improve CPU load and WiFi stability and also send the following events:
- `MQTT#Connected` 
- `MQTT#Disconnected`
- `MQTTimport#Connected` 
- `MQTTimport#Disconnected`

The MQTTimport plugin still has some major issues which have to be taken care of, so #1195 is not fixed yet.
2018-03-30 02:48:23 +02:00
Gijs NoorlanderandGitHub 1a72444b0a Build issue with Arduino IDE
See https://github.com/letscontrolit/ESPEasy/issues/1188#issuecomment-377020065
2018-03-29 21:27:09 +02:00
ESPEasy release bot f613bb4572 automaticly updated release notes for mega-20180329 2018-03-29 04:00:11 +02:00
Gijs NoorlanderandGitHub 51059f0c18 Merge pull request #1189 from TD-er/bugfix/include_paths_ArduinoIDE
[issue #1188] Revert changes in include paths
2018-03-28 21:58:07 +02:00
TD-er dec6598f49 [Arduino IDE] Revert changes in include paths
Were changed to be able to test the PlatformIO feature to compile only files that are actually used.
Apparently the Arduino IDE cannot find the files anymore because that IDE needs the parent directory to be named as the main project file, not "src"
2018-03-28 21:40:09 +02:00
mvdbroandGitHub f8f6767bec Merge pull request #1180 from TD-er/bugfix/esp32_eventbased_wifi
[ESP32] Event driven WiFi for ESP32
2018-03-28 19:42:54 +02:00
ESPEasy release bot 5c475b98db automaticly updated release notes for mega-20180328 2018-03-28 04:00:09 +02:00
Gijs NoorlanderandGitHub 58fb8dc42b Merge pull request #1182 from TD-er/feature/pluginsets
[Build] Cleanup/split builds using defines
2018-03-27 22:37:45 +02:00
TD-er cb2b11a41a [build] Disabled a few PlatformIO profiles for now.
There were way too many.
Just placed them in comments and Travis had already built them all to test first.
2018-03-27 22:27:31 +02:00
TD-er ac4f3c4cd4 [Build] Cleanup/split builds using defines
See PR #1034 and #1040 made by @soif
2018-03-27 21:24:08 +02:00
mvdbro c651e29d2a Merge branch 'mega' of https://github.com/letscontrolit/ESPEasy into mega 2018-03-27 17:24:45 +02:00
mvdbro d7e886a841 Fix nesting level check 2018-03-27 17:23:56 +02:00
Gijs NoorlanderandGitHub eec7647782 Merge pull request #1025 from soif/Feat/PlugSets
Initial re-organisation of plugin sets (#1019)
2018-03-27 10:12:56 +02:00
ESPEasy release bot 6f9d120ff0 automaticly updated release notes for mega-20180327 2018-03-27 04:00:09 +02:00
TD-er 28ddc2d9c0 [ESP32] Event driven WiFi for ESP32
Not tested, just got some inspiration by these files:

- https://github.com/espressif/arduino-esp32/blob/master/libraries/WiFi/examples/WiFiClientEvents/WiFiClientEvents.ino
- https://github.com/espressif/arduino-esp32/blob/master/libraries/WiFi/src/WiFiGeneric.cpp
- https://github.com/espressif/arduino-esp32/blob/master/tools/sdk/include/esp32/esp_event.h
2018-03-26 22:44:58 +02:00
Gijs NoorlanderandGitHub cc54354ac3 Merge pull request #1178 from TD-er/bugfix/degree_parse_LCD
[issue #1174] Show degree sign via external writes to LCD
2018-03-26 19:48:56 +02:00
TD-er 3929390629 [issue #1174] Show degree sign via external writes to LCD
Fix suggested by [elmicha](https://github.com/letscontrolit/ESPEasy/issues/1174#issuecomment-376244766)
2018-03-26 19:48:12 +02:00
GrovkillenandGitHub 5f4685337e Added value number as discussed. 2018-03-26 14:59:47 +02:00
GrovkillenandGitHub 08c158aa9c Moved to correct folder 2018-03-26 10:33:22 +02:00
GrovkillenandGitHub e9d71a8f35 Delete WebServer.ino
Same mistake as before, wrong folder upload
2018-03-26 10:32:58 +02:00
GrovkillenandGitHub 3e3173cbb0 Updated JSON path for sensor values and names
+file type filter on upload (not OTA since that is not part of ESP Easy core)
2018-03-26 10:31:27 +02:00
ESPEasy release bot 3a26ebf7b1 automaticly updated release notes for mega-20180326 2018-03-26 04:00:15 +02:00
Gijs NoorlanderandGitHub 1685bead52 Merge pull request #1173 from TD-er/merge/command_parsing
Merge "improve command parsing" & fix for #1170 - uservar not set on encwrite
2018-03-25 21:54:19 +02:00
Bartlomiej ZimonandTD-er 3a2fe35e5c - fix for #1170 - uservar not setted on encwrite 2018-03-25 21:04:34 +02:00
TD-er 29ce7f774f Merge branch 'bugfix/improve_command_parsing' into mega 2018-03-25 20:51:23 +02:00
Gijs NoorlanderandGitHub cc85327356 Merge pull request #1164 from BrianSetz/bugfix/plugin044
[P1 Wifi Gateway] Support for ESMR 5.0
2018-03-25 20:33:01 +02:00
Gijs NoorlanderandGitHub 0851bb655e Merge pull request #1165 from TD-er/feature/event_driven_wifi
[wifi] Event based connect/reconnect
2018-03-25 20:30:49 +02:00
TD-er d4bc10d8f1 [NTP] Speedup NTP again with async WiFi
Previously it would only start calling "now" when the WiFi was already setup.
And in calling `now()`, a call to an NTP server is being made. When this fails, retry again in a minute.
But now the WiFi initialization is asynchronous, so the first NTP query was already failing and thus the retry is already set to a minute.

This is fixed now and also the pool.ntp.org will pick a random one from 0...3 (.pool.ntp.org).
The DNS queries from this pool change about every minute, so if you want to retry because one of the servers is offline, you should try one from the other `N.pool.ntp.org` or else you have to wait for another minute.
2018-03-25 12:32:06 +02:00
ESPEasy release bot 0672f32f4b automaticly updated release notes for mega-20180324 2018-03-24 04:00:10 +01:00
TD-er a17f7b679c [wifi] Event based connect/reconnect
Now using the core WiFiEvents to act on:

- connect
- disconnect
- gotIP

This will make polling for a status no longer needed.
It also allows to get a better understanding in why diconnects happen, since the disconnect reason is given in the events.
This extra information is also present on the information panel on the webinterface and also in the JSON output.

The entire connect/disconnect/reconnect is now done completely asynchronous and thus takes much less resources from the ESP.
A disconnect will now also send an event: "WiFi#Disconnected"

For deepsleep this means there has to be a minimum awake time set and perhaps use rules to set the ESP into sleep again when done.
Typical connection times to an accesspoint are about 3 seconds + about 1 second for DHCP.

This also resolves the issues where services my try to connect while there is a WiFi connection, but not yet an IP address set.

I already noticed a lot of NTP servers from pool.ntp.org are non responsive the last few weeks, so that may still take some time, but that's another issue.
2018-03-24 01:19:32 +01:00
Brian Setz 425bd85c83 [P1] Support for latest standard 2018-03-23 22:13:03 +01:00
Gijs NoorlanderandGitHub 3be005e1ee Merge pull request #1161 from TD-er/bugfix/mqtt_deepsleep
[issue #1097] Call MQTTclient.loop() during deepsleep
2018-03-23 15:52:48 +01:00
TD-er 174f9e6e03 [issue #1097] Call MQTTclient.loop() during deepsleep
The `MQTTclient.loop()` function should be called quite often.
This does the actual MQTT handling.
In normal operations, this is called quite frequently, but it should also be called when deepsleep is active and right before deepsleep is activated again.
2018-03-23 15:19:10 +01:00
Gijs NoorlanderandGitHub 51a14a174f Merge pull request #1160 from TD-er/feature/epoch_time
[issue #1131] Add %unixtime%
2018-03-23 14:44:55 +01:00
Gijs NoorlanderandGitHub 7cb1f453d3 Merge pull request #1159 from TD-er/bugfix/wifi_issues
[WiFi] Reverted those temp String uses for ssid/pass
2018-03-23 14:44:41 +01:00
TD-er 23a6caab89 [issue #1131] Add %unixtime%
Show the current time as [Unix time](https://en.wikipedia.org/wiki/Unix_time) (numbers of seconds that have elapsed since midnight 1970-01-01, UTC)
2018-03-23 14:23:27 +01:00
TD-er 6b4300bd46 [WiFi] Reverted those temp String uses for ssid/pass
Was introduced due to misunderstanding of reported issues with WiFi.
2018-03-23 12:34:27 +01:00
ESPEasy release bot 04a9069db0 automaticly updated release notes for mega-20180323 2018-03-23 04:00:06 +01:00
TD-er dd636903c8 [Command] Parsing improvement for commands
Use more intelligent parsing of commands and switch statement to improve speed
2018-03-22 22:33:41 +01:00
mvdbro 940b65e86a ESP32 fix 2018-03-22 14:08:47 +01:00
ESPEasy release bot 6344de0649 automaticly updated release notes for mega-20180322 2018-03-22 04:00:11 +01:00
TD-er 8ccd7c3e8d Merge branch 'v2.0' into mega 2018-03-22 01:06:27 +01:00
TD-er 22371649a4 [WiFi] Take much more time for initial WiFi connect during setup
Accesspoint is still active, so it may take a lot more time to make the initial connection
2018-03-22 01:05:56 +01:00
Gijs NoorlanderandGitHub 2a48d5033e Merge pull request #1149 from TD-er/bugfix/initialWiFiconnect
[WiFi] Take much more time for initial WiFi connect during setup
2018-03-22 01:04:48 +01:00
TD-er f064da797d [WiFi] Take much more time for initial WiFi connect during setup
Accesspoint is still active, so it may take a lot more time to make the initial connection
2018-03-22 01:04:19 +01:00
TD-er b0b8edf935 Merge branch 'v2.0' into mega 2018-03-22 00:27:38 +01:00
Gijs NoorlanderandGitHub 8cbd9a0822 Merge pull request #1148 from TD-er/merge/mega_to_v2.0_0321
Merge/mega to v2.0 0321
2018-03-22 00:24:59 +01:00
TD-er 93f9d11738 [Memory] parseTemplate did not check if markers were found
"Free Mem" reported this function to be using quite a lot of memory.
Maybe that was related to parsing texts without matching ']' or '#'
Just added some checks to see if they were found.
2018-03-22 00:24:17 +01:00
TD-er cf3e0a3f0a [wifi] Make more robust checks and increase timeout
See #1145
2018-03-22 00:12:04 +01:00
s0170071andTD-er ccfd14dbd3 Serial WD crash 2018-03-22 00:11:48 +01:00
Bartlomiej ZimonandTD-er 3034738ad4 - P048 fetch params only when needed 2018-03-22 00:11:30 +01:00
TD-er 178d1c46a2 - P035 move strings to flash 2018-03-22 00:11:21 +01:00
Bartlomiej ZimonandTD-er cdfd1d986e - P023 fix command interpretation 2018-03-22 00:10:55 +01:00
Bartlomiej ZimonandTD-er 4b7aa53692 - P012 fix command interpretation 2018-03-22 00:10:50 +01:00
Gijs NoorlanderandGitHub 7959a5133f Merge pull request #1117 from TD-er/bugfix/memoryusage_parsetemplate
[Memory] parseTemplate did not check if markers were found
2018-03-21 23:33:47 +01:00
Gijs NoorlanderandGitHub 941fb5c29c Merge pull request #1147 from TD-er/bugfix/check_wifi_cred
[wifi] Make more robust checks and increase timeout
2018-03-21 23:32:37 +01:00
TD-er c43c9ea2b3 [wifi] Make more robust checks and increase timeout
See #1145
2018-03-21 23:19:05 +01:00
Gijs NoorlanderandGitHub 967103bcad Merge pull request #1141 from uzi18/mega-plugins_check
some small fixes found during check for propper success setting
2018-03-21 21:36:52 +01:00
Gijs NoorlanderandGitHub efe637ec70 Merge pull request #1146 from s0170071/SerialWDCrash
Wifi connect fails if serial bytes are incoming
2018-03-21 21:24:43 +01:00
s0170071 00450eb260 Serial WD crash 2018-03-21 19:48:04 +01:00
ESPEasy release bot cc02fa4481 automaticly updated release notes for v2.0-20180321 2018-03-21 04:00:21 +01:00
ESPEasy release bot 1c5f8af083 automaticly updated release notes for mega-20180321 2018-03-21 04:00:08 +01:00
Bartlomiej Zimon fccc31a7c6 - P048 fetch params only when needed 2018-03-21 02:43:04 +01:00
Bartlomiej Zimon b84d905a0b - P035 move strings to flash 2018-03-21 02:42:13 +01:00
Bartlomiej Zimon 94aa951cba - P023 fix command interpretation 2018-03-21 02:41:35 +01:00
Bartlomiej Zimon 2a23dcd011 - P012 fix command interpretation 2018-03-21 02:41:08 +01:00
Gijs NoorlanderandGitHub ab3a406706 [merge issue] Forgotten #endif in merge 2018-03-20 23:46:43 +01:00
TD-er e7a9ee7eee Merge branch 'v2.0' into mega 2018-03-20 23:28:59 +01:00
Unknown 3edfdbf5f7 [wifi] Setup with factory settings could not complete 2018-03-20 23:27:39 +01:00
Gijs NoorlanderandGitHub 27bac2ca00 Merge pull request #1140 from TD-er/bugfix/connect_to_wifi_during_setup
[wifi] Setup with factory settings could not complete
2018-03-20 23:25:57 +01:00
Unknown 373f74e9f8 [wifi] Setup with factory settings could not complete 2018-03-20 23:25:23 +01:00
ESPEasy release bot 1220c565c8 automaticly updated release notes for v2.0-20180320 2018-03-20 04:00:23 +01:00
Unknown f135c63d84 [Memory] parseTemplate did not check if markers were found
"Free Mem" reported this function to be using quite a lot of memory.
Maybe that was related to parsing texts without matching ']' or '#'
Just added some checks to see if they were found.
2018-03-18 23:57:42 +01:00
soif 4bca2c6361 Initial re-organisation of plugin sets (#1019) 2018-03-06 09:53:17 +01:00
97 changed files with 2621 additions and 751 deletions
+217
View File
@@ -1,3 +1,220 @@
-------------------------------------------------
Changes in release mega-20180405 (since mega-20180403)
-------------------------------------------------
Release date: Thu Apr 5 04:00:10 CEST 2018
Grovkillen (4):
Updated JSON path for sensor values and names
Delete WebServer.ino
Moved to correct folder
Added value number as discussed.
moi (3):
Show CPU Load in JSON page
Adds CPU Load LC in JSON page
unwanted lib_ignore now properly commented
mvdbro (2):
ESP32 RTOS config setting
ESP32 RTOS 10 per second
-------------------------------------------------
Changes in release mega-20180403 (since mega-20180402)
-------------------------------------------------
Release date: Tue Apr 3 04:00:14 CEST 2018
Grovkillen (2):
Update _P038_NeoPixel.ino
Update _P029_Output.ino
mvdbro (1):
ESP32 prep for RTOS multitasking
-------------------------------------------------
Changes in release mega-20180402 (since mega-20180401)
-------------------------------------------------
Release date: Mon Apr 2 04:00:10 CEST 2018
Gijs Noorlander (1):
Revert "Merge pull request #1205 from s0170071/SerialSwap"
-------------------------------------------------
Changes in release mega-20180401 (since mega-20180331)
-------------------------------------------------
Release date: Sun Apr 1 04:00:08 CEST 2018
Grovkillen (1):
P0059 (rotary encoder) and P0063 (ttp229, keypad)
TD-er (3):
[issue #1201] MQTT#Disconnected event and MQTT stability improvements
[issue #1201] MQTT#Disconnected event and MQTT stability improvements
[deepsleep] Allow for some minimum wifi connect time
s0170071 (1):
Serial Swap function
-------------------------------------------------
Changes in release mega-20180331 (since mega-20180330)
-------------------------------------------------
Release date: Sat Mar 31 04:00:09 CEST 2018
TD-er (2):
[Build ESP32] Fix for build issues between ESP32 and ESP8266
[ESP32] Build errors/warnings
mvdbro (1):
ESP32: Fix Wifi Disconnect reason
-------------------------------------------------
Changes in release mega-20180330 (since mega-20180329)
-------------------------------------------------
Release date: Fri Mar 30 04:00:10 CEST 2018
Gijs Noorlander (1):
Build issue with Arduino IDE
-------------------------------------------------
Changes in release mega-20180329 (since mega-20180328)
-------------------------------------------------
Release date: Thu Mar 29 04:00:11 CEST 2018
TD-er (2):
[ESP32] Event driven WiFi for ESP32
[Arduino IDE] Revert changes in include paths
-------------------------------------------------
Changes in release mega-20180328 (since mega-20180327)
-------------------------------------------------
Release date: Wed Mar 28 04:00:09 CEST 2018
TD-er (2):
[Build] Cleanup/split builds using defines
[build] Disabled a few PlatformIO profiles for now.
mvdbro (1):
Fix nesting level check
soif (1):
Initial re-organisation of plugin sets (#1019)
-------------------------------------------------
Changes in release mega-20180327 (since mega-20180326)
-------------------------------------------------
Release date: Tue Mar 27 04:00:09 CEST 2018
TD-er (1):
[issue #1174] Show degree sign via external writes to LCD
-------------------------------------------------
Changes in release mega-20180326 (since mega-20180324)
-------------------------------------------------
Release date: Mon Mar 26 04:00:14 CEST 2018
Bartlomiej Zimon (1):
- fix for #1170 - uservar not setted on encwrite
Brian Setz (1):
[P1] Support for latest standard
TD-er (3):
[Command] Parsing improvement for commands
[wifi] Event based connect/reconnect
[NTP] Speedup NTP again with async WiFi
-------------------------------------------------
Changes in release mega-20180324 (since mega-20180323)
-------------------------------------------------
Release date: Sat Mar 24 04:00:10 CET 2018
TD-er (3):
[WiFi] Reverted those temp String uses for ssid/pass
[issue #1131] Add %unixtime%
[issue #1097] Call MQTTclient.loop() during deepsleep
-------------------------------------------------
Changes in release mega-20180323 (since mega-20180322)
-------------------------------------------------
Release date: Fri Mar 23 04:00:06 CET 2018
mvdbro (1):
ESP32 fix
-------------------------------------------------
Changes in release mega-20180322 (since mega-20180321)
-------------------------------------------------
Release date: Thu Mar 22 04:00:11 CET 2018
Bartlomiej Zimon (7):
- P012 fix command interpretation
- P023 fix command interpretation
- P035 move strings to flash
- P048 fetch params only when needed
- P012 fix command interpretation
- P023 fix command interpretation
- P048 fetch params only when needed
ESPEasy release bot (1):
automaticly updated release notes for v2.0-20180321
Gijs Noorlander (1):
[merge issue] Forgotten #endif in merge
TD-er (6):
[wifi] Make more robust checks and increase timeout
- P035 move strings to flash
[wifi] Make more robust checks and increase timeout
[Memory] parseTemplate did not check if markers were found
[WiFi] Take much more time for initial WiFi connect during setup
[WiFi] Take much more time for initial WiFi connect during setup
Unknown (1):
[Memory] parseTemplate did not check if markers were found
s0170071 (2):
Serial WD crash
Serial WD crash
-------------------------------------------------
Changes in release mega-20180321 (since mega-20180320)
-------------------------------------------------
Release date: Wed Mar 21 04:00:08 CET 2018
ESPEasy release bot (1):
automaticly updated release notes for v2.0-20180320
Unknown (2):
[wifi] Setup with factory settings could not complete
[wifi] Setup with factory settings could not complete
-------------------------------------------------
Changes in release mega-20180320 (since mega-20180319)
-------------------------------------------------
+1 -3
View File
@@ -1,4 +1,4 @@
# EspESPeasySoftwareSerial
# ESPeasySoftwareSerial
Implementation of the Arduino software serial library for the ESP8266
@@ -7,5 +7,3 @@ Speed up to 115200 baud is supported. The constructor also has an optional input
Please note that due to the fact that the ESP always have other activities ongoing, there will be some inexactness in interrupt
timings. This may lead to bit errors when having heavy data traffic in high baud rates.
+1 -1
View File
@@ -1,5 +1,5 @@
{
"name": "EspESPeasySoftwareSerial",
"name": "ESPeasySoftwareSerial",
"version": "3.3.1",
"keywords": [
"serial", "io", "softwareserial"
+1
View File
@@ -31,6 +31,7 @@
#include "SensorSerialBuffer.h"
#include "ESPeasySoftwareSerial.h"
class CjkSDS011
{
public:
+476 -128
View File
@@ -7,11 +7,11 @@
#minimal version for esps with 512K or less flash (only has minimal plugin set)
; [env:mini_512]
; platform = espressif8266@1.5.0
; framework = arduino
; platform = ${common.platform}
; framework = ${common.framework}
; board = esp01
; upload_speed=460800
; build_flags = !echo -Wl,-Tesp8266.flash.512k64.ld -D BUILD_GIT=\'\"$(git describe)\"\'
; upload_speed = ${common.upload_speed}
; build_flags = !echo -Wl,-Tesp8266.flash.512k64.ld -D BUILD_GIT=\'\"$(git describe)\"\'
; # upload_port = /dev/ttyUSB0
# add these:
@@ -19,150 +19,498 @@
# -Wmissing-include-dirs -Wnoexcept -Wold-style-cast -Woverloaded-virtual -Wredundant-decls -Wshadow -Wsign-promo -Wstrict-null-sentinel
# -Wstrict-overflow=5 -Wundef -Wno-unused -Wno-variadic-macros -Wno-parentheses -fdiagnostics-show-option
# thanks @chouffe103
[compiler_warnings]
build_flags =
-Wall -Wno-parentheses -fdiagnostics-show-option
##########################################################################################
###### Definition cheat sheet:
# board_flash_mode in terms of performance: QIO > QOUT > DIO > DOUT
# for lib_ldf_mode, see http://docs.platformio.org/en/latest/librarymanager/ldf.html#ldf
###### Frequently used build flags:
# Use custom.h file to override default settings for ESPeasy: -D USE_CUSTOM_H
# Set VCC mode to measure Vcc of ESP chip : -D FEATURE_ADC_VCC=true
[core_2_3_0]
platform = espressif8266@1.5.0
[core_2_4_0]
platform = espressif8266@1.6.0
[core_esp32]
#platform = espressif32@0.12.0
platform = https://github.com/platformio/platform-espressif32.git#feature/stage
build_flags = -D BUILD_GIT='"${env.TRAVIS_TAG}"'
lib_ignore = ESPeasySoftwareSerial, EspESPeasySoftwareSerial, AS_BH1750, ESP8266WiFi, ESP8266Ping, ESP8266WebServer, ESP8266HTTPUpdateServer, ESP8266mDNS, IRremoteESP8266, ESPEasy_ESP8266Ping, SerialSensors
lib_deps = ESP32WebServer
[common]
build_flags = -D BUILD_GIT='"${env.TRAVIS_TAG}"'
lib_deps = ""
build_flags = -D BUILD_GIT='"${env.TRAVIS_TAG}"' ; ${compiler_warnings.build_flags}
lib_deps = ""
lib_ignore = ESP32_ping, ESP32WebServer
lib_ldf_mode = chain
upload_speed = 460800
framework = arduino
board = esp12e
platform = ${core_2_3_0.platform}
#normal version with stable plugins, 1024k version
[esp8266_1M]
board_flash_mode = dout
build_flags = ${common.build_flags} -Wl,-Tesp8266.flash.1m128.ld
[esp8285_1M]
board = esp8285
board_flash_mode = ${esp8266_1M.board_flash_mode}
build_flags = ${esp8266_1M.build_flags} -DESP8285
[Sonoff]
board = esp01_1m
board_flash_mode = ${esp8266_1M.board_flash_mode}
build_flags = ${common.build_flags} -Wl,-Tesp8266.flash.1m128.ld
[espWroom2M]
board_flash_mode = dout
board = esp_wroom_02
build_flags = ${common.build_flags} -Wl,-Tesp8266.flash.2m.ld
[esp8266_4M]
board_flash_mode = dio
build_flags = ${common.build_flags} -Wl,-Tesp8266.flash.4m1m.ld
### ESP32 pre-alpha test build ###########################################################
# Very limited build for ESP32, to start testing regular building for ESP32. #
# Will probably not work, not tested and guaranteed to take a few hours time of some #
# still trying to build the version without reading this warning. #
##########################################################################################
[env:esp32dev]
platform = ${core_esp32.platform}
board = esp32dev
build_flags = ${core_esp32.build_flags} -DPLUGIN_SET_GENERIC_ESP32
lib_deps = ${core_esp32.lib_deps}
lib_ignore = ${core_esp32.lib_ignore}
lib_ldf_mode = ${common.lib_ldf_mode}
framework = ${common.framework}
upload_speed = ${common.upload_speed}
### NORMAL (STABLE) ######################################################################
# normal version with stable plugins #
##########################################################################################
# NORMAL: 1024k version --------------------------
[env:normal_ESP8266_1024]
platform = espressif8266@1.5.0
lib_deps = ${common.lib_deps}
board_flash_mode = dout
framework = arduino
board = esp12e
upload_speed=460800
build_flags = ${common.build_flags} -Wl,-Tesp8266.flash.1m128.ld
# upload_port = /dev/ttyUSB0
platform = ${common.platform}
lib_deps = ${common.lib_deps}
lib_ignore = ${common.lib_ignore}
lib_ldf_mode = ${common.lib_ldf_mode}
framework = ${common.framework}
upload_speed = ${common.upload_speed}
board = ${common.board}
board_flash_mode = ${esp8266_1M.board_flash_mode}
build_flags = ${esp8266_1M.build_flags}
[env:normal_ESP8266_1024_DOUT]
platform = espressif8266@1.5.0
lib_deps = ${common.lib_deps}
board_flash_mode = dout
framework = arduino
board = esp12e
upload_speed=460800
build_flags = ${common.build_flags} -Wl,-Tesp8266.flash.1m128.ld
# upload_port = /dev/ttyUSB0
#normal version with stable plugins, 4096k version
[env:normal_ESP8266_4096]
platform = espressif8266@1.5.0
lib_deps = ${common.lib_deps}
framework = arduino
board = esp12e
upload_speed=460800
build_flags = ${common.build_flags} -Wl,-Tesp8266.flash.4m1m.ld
# upload_port = /dev/ttyUSB0
#normal version with stable plugins, 4096k version for esp8285
# NORMAL: 1024k for esp8285 ----------------------
[env:normal_ESP8285_1024]
platform = espressif8266@1.5.0
lib_deps = ${common.lib_deps}
board_flash_mode = dout
framework = arduino
board = esp8285
upload_speed=460800
build_flags = ${common.build_flags} -Wl,-Tesp8266.flash.1m128.ld -DESP8285
# upload_port = /dev/ttyUSB0
platform = ${common.platform}
lib_deps = ${common.lib_deps}
lib_ignore = ${common.lib_ignore}
lib_ldf_mode = ${common.lib_ldf_mode}
framework = ${common.framework}
upload_speed = ${common.upload_speed}
board = ${esp8285_1M.board}
board_flash_mode = ${esp8285_1M.board_flash_mode}
build_flags = ${esp8285_1M.build_flags}
# NORMAL: 2048k version --------------------------
[env:normal_WROOM02_2048]
platform = ${common.platform}
lib_deps = ${common.lib_deps}
lib_ignore = ${common.lib_ignore}
lib_ldf_mode = ${common.lib_ldf_mode}
framework = ${common.framework}
upload_speed = ${common.upload_speed}
board = ${espWroom2M.board}
board_flash_mode = ${espWroom2M.board_flash_mode}
build_flags = ${espWroom2M.build_flags}
# NORMAL: 4096k version --------------------------
[env:normal_ESP8266_4096]
platform = ${common.platform}
lib_deps = ${common.lib_deps}
lib_ignore = ${common.lib_ignore}
lib_ldf_mode = ${common.lib_ldf_mode}
framework = ${common.framework}
upload_speed = ${common.upload_speed}
board = ${common.board}
board_flash_mode = ${esp8266_4M.board_flash_mode}
build_flags = ${esp8266_4M.build_flags}
#version with additional plugins (and dependend code) that are in test-stadium 1024k
### TESTING ##############################################################################
# additional plugins (and dependend code) that are in test-stadium #
##########################################################################################
# TEST: 1024k version ----------------------------
[env:test_ESP8266_1024]
platform = espressif8266@1.5.0
lib_deps = ${common.lib_deps}
board_flash_mode = dout
framework = arduino
board = esp12e
upload_speed=460800
build_flags = ${common.build_flags} -Wl,-Tesp8266.flash.1m128.ld -D PLUGIN_BUILD_TESTING
platform = ${common.platform}
lib_deps = ${common.lib_deps}
lib_ignore = ${common.lib_ignore}
lib_ldf_mode = ${common.lib_ldf_mode}
framework = ${common.framework}
upload_speed = ${common.upload_speed}
board = ${common.board}
board_flash_mode = ${esp8266_1M.board_flash_mode}
build_flags = ${esp8266_1M.build_flags} -D PLUGIN_BUILD_TESTING
#version with additional plugins (and dependend code) that are in test-stadium 4096k
[env:test_ESP8266_4096]
platform = espressif8266@1.5.0
lib_deps = ${common.lib_deps}
framework = arduino
board = esp12e
upload_speed=460800
build_flags = ${common.build_flags} -Wl,-Tesp8266.flash.4m1m.ld -D PLUGIN_BUILD_TESTING
[env:test_ESP8266_4096_VCC]
platform = espressif8266@1.5.0
lib_deps = ${common.lib_deps}
framework = arduino
board = esp12e
upload_speed=460800
build_flags = ${common.build_flags} -Wl,-Tesp8266.flash.4m1m.ld -D PLUGIN_BUILD_TESTING -D FEATURE_ADC_VCC=true
#version with additional plugins (and dependend code) that are in test-stadium 4096k for esp8285
# TEST: 1024k for esp8285 ------------------------
[env:test_ESP8285_1024]
platform = espressif8266@1.5.0
lib_deps = ${common.lib_deps}
board_flash_mode = dout
framework = arduino
board = esp8285
upload_speed=460800
build_flags = ${common.build_flags} -Wl,-Tesp8266.flash.1m128.ld -D PLUGIN_BUILD_TESTING -DESP8285
platform = ${common.platform}
lib_deps = ${common.lib_deps}
lib_ignore = ${common.lib_ignore}
lib_ldf_mode = ${common.lib_ldf_mode}
framework = ${common.framework}
upload_speed = ${common.upload_speed}
board_flash_mode = ${esp8285_1M.board_flash_mode}
board = ${esp8285_1M.board}
build_flags = ${esp8285_1M.build_flags} -D PLUGIN_BUILD_TESTING
# TEST: 2048k version ----------------------------
[env:test_WROOM02_2048]
platform = ${common.platform}
lib_deps = ${common.lib_deps}
lib_ignore = ${common.lib_ignore}
lib_ldf_mode = ${common.lib_ldf_mode}
framework = ${common.framework}
upload_speed = ${common.upload_speed}
board_flash_mode = ${espWroom2M.board_flash_mode}
board = ${espWroom2M.board}
build_flags = ${espWroom2M.build_flags} -D PLUGIN_BUILD_TESTING
# TEST: 4096k version ----------------------------
[env:test_ESP8266_4096]
platform = ${common.platform}
lib_deps = ${common.lib_deps}
lib_ignore = ${common.lib_ignore}
lib_ldf_mode = ${common.lib_ldf_mode}
framework = ${common.framework}
board = ${common.board}
upload_speed = ${common.upload_speed}
board_flash_mode = ${esp8266_4M.board_flash_mode}
build_flags = ${esp8266_4M.build_flags} -D PLUGIN_BUILD_TESTING
# TEST: 4096k version + FEATURE_ADC_VCC ----------
[env:test_ESP8266_4096_VCC]
platform = ${common.platform}
lib_deps = ${common.lib_deps}
lib_ignore = ${common.lib_ignore}
lib_ldf_mode = ${common.lib_ldf_mode}
framework = ${common.framework}
board = ${common.board}
upload_speed = ${common.upload_speed}
board_flash_mode = ${esp8266_4M.board_flash_mode}
build_flags = ${esp8266_4M.build_flags} -D PLUGIN_BUILD_TESTING -D FEATURE_ADC_VCC=true
#version with additional plugins (and dependend code) that is in development (probably broken or incomplete) 1024k
### DEV ##################################################################################
# additional plugins (and dependend code) that is in development (probably broken or incomplete)
##########################################################################################
# DEV : 1024k version ----------------------------
[env:dev_ESP8266_1024]
platform = espressif8266@1.5.0
lib_deps = ${common.lib_deps}
board_flash_mode = dout
framework = arduino
board = esp12e
upload_speed=460800
build_flags = ${common.build_flags} -Wl,-Tesp8266.flash.1m128.ld -D PLUGIN_BUILD_TESTING -D PLUGIN_BUILD_DEV
platform = ${common.platform}
lib_deps = ${common.lib_deps}
lib_ignore = ${common.lib_ignore}
lib_ldf_mode = ${common.lib_ldf_mode}
framework = ${common.framework}
upload_speed = ${common.upload_speed}
board_flash_mode = ${esp8266_1M.board_flash_mode}
board = ${common.board}
build_flags = ${esp8266_1M.build_flags} -D PLUGIN_BUILD_DEV
#version with additional plugins (and dependend code) that is in development (probably broken or incomplete) 4096k
[env:dev_ESP8266_4096]
platform = espressif8266@1.5.0
lib_deps = ${common.lib_deps}
framework = arduino
board = esp12e
upload_speed=460800
build_flags = ${common.build_flags} -Wl,-Tesp8266.flash.4m1m.ld -D PLUGIN_BUILD_TESTING -D PLUGIN_BUILD_DEV
#version with additional plugins (and dependend code) that is in development (probably broken or incomplete) 4096k
# Use latest ESP8266 core 2.4.0
[env:dev_ESP8266_4096_core2_4_0]
platform = espressif8266
framework = arduino
board = esp12e
upload_speed=460800
build_flags = ${common.build_flags} -Wl,-Tesp8266.flash.4m1m.ld -D PLUGIN_BUILD_TESTING -D PLUGIN_BUILD_DEV
#version with additional plugins (and dependend code) that is in development (probably broken or incomplete) 4096k for esp8285
# DEV: 1024k for esp8285 -------------------------
[env:dev_ESP8285_1024]
platform = espressif8266@1.5.0
lib_deps = ${common.lib_deps}
board_flash_mode = dout
framework = arduino
board = esp8285
upload_speed=460800
build_flags = ${common.build_flags} -Wl,-Tesp8266.flash.1m128.ld -D PLUGIN_BUILD_TESTING -D PLUGIN_BUILD_DEV -DESP8285
platform = ${common.platform}
lib_deps = ${common.lib_deps}
lib_ignore = ${common.lib_ignore}
lib_ldf_mode = ${common.lib_ldf_mode}
framework = ${common.framework}
upload_speed = ${common.upload_speed}
board_flash_mode = ${esp8285_1M.board_flash_mode}
board = ${esp8285_1M.board}
build_flags = ${esp8285_1M.build_flags} -D PLUGIN_BUILD_DEV
# DEV: 2048k version -----------------------------
[env:dev_WROOM02_2048]
platform = ${common.platform}
lib_deps = ${common.lib_deps}
lib_ignore = ${common.lib_ignore}
lib_ldf_mode = ${common.lib_ldf_mode}
framework = ${common.framework}
upload_speed = ${common.upload_speed}
board_flash_mode = ${espWroom2M.board_flash_mode}
board = ${espWroom2M.board}
build_flags = ${espWroom2M.build_flags} -D PLUGIN_BUILD_DEV
# DEV : 4096k version ----------------------------
[env:dev_ESP8266_4096]
platform = ${common.platform}
lib_deps = ${common.lib_deps}
lib_ignore = ${common.lib_ignore}
lib_ldf_mode = ${common.lib_ldf_mode}
framework = ${common.framework}
board = ${common.board}
upload_speed = ${common.upload_speed}
board_flash_mode = ${esp8266_4M.board_flash_mode}
build_flags = ${esp8266_4M.build_flags} -D PLUGIN_BUILD_DEV
#special patched version for PUYA flash chips, see https://github.com/letscontrolit/ESPEasy/issues/650
### DEV + PUYA ###########################################################################
# special patched version for PUYA flash chips, see issue #650 at Github #
##########################################################################################
# DEV+PUYA : 1024k version -----------------------
[env:dev_ESP8266PUYA_1024]
platform = espressif8266@1.5.0
lib_deps = ${common.lib_deps}
board_flash_mode = dout
framework = arduino
board = esp12e
upload_speed=460800
build_flags = ${common.build_flags} -Wl,-Tesp8266.flash.1m128.ld -D PLUGIN_BUILD_TESTING -D PLUGIN_BUILD_DEV -D FLASH_QUIRK_WRITE_0_TO_1
platform = ${common.platform}
lib_deps = ${common.lib_deps}
lib_ignore = ${common.lib_ignore}
lib_ldf_mode = ${common.lib_ldf_mode}
framework = ${common.framework}
board = ${common.board}
upload_speed = ${common.upload_speed}
board_flash_mode = ${esp8266_1M.board_flash_mode}
build_flags = ${esp8266_1M.build_flags} -D PLUGIN_BUILD_DEV -D FLASH_QUIRK_WRITE_0_TO_1
#special patched version for PUYA flash chips, see https://github.com/letscontrolit/ESPEasy/issues/650
# DEV+PUYA : 1024k version + FEATURE_ADC_VCC -----
[env:dev_ESP8266PUYA_1024_VCC]
platform = espressif8266@1.5.0
lib_deps = ${common.lib_deps}
board_flash_mode = dout
framework = arduino
board = esp12e
upload_speed=460800
build_flags = ${common.build_flags} -Wl,-Tesp8266.flash.1m128.ld -D PLUGIN_BUILD_TESTING -D PLUGIN_BUILD_DEV -D FLASH_QUIRK_WRITE_0_TO_1 -D FEATURE_ADC_VCC=true
platform = ${common.platform}
lib_deps = ${common.lib_deps}
lib_ignore = ${common.lib_ignore}
lib_ldf_mode = ${common.lib_ldf_mode}
framework = ${common.framework}
board = ${common.board}
upload_speed = ${common.upload_speed}
board_flash_mode = ${esp8266_1M.board_flash_mode}
build_flags = ${esp8266_1M.build_flags} -D PLUGIN_BUILD_DEV -D FLASH_QUIRK_WRITE_0_TO_1 -D FEATURE_ADC_VCC=true
### HARDWARE SPECIFIC VERSIONS ###########################################################
# versions specially designed to fit, and contents only needed plugins for each hardware #
##########################################################################################
# ITEAD Products ################################
# ITEAD / SONOFF BASIC version ------------------
#[env:hard_SONOFF_BASIC]
#upload_speed = ${common.upload_speed}
#framework = ${common.framework}
#platform = ${common.platform}
#lib_deps = ${common.lib_deps}
#lib_ignore = ${common.lib_ignore}
#lib_ldf_mode = ${common.lib_ldf_mode}
#board_flash_mode = ${Sonoff.board_flash_mode}
#board = ${Sonoff.board}
#build_flags = ${Sonoff.build_flags} -D PLUGIN_SET_SONOFF_BASIC
# ITEAD / SONOFF TH10 version -------------------
#[env:hard_SONOFF_TH10]
#upload_speed = ${common.upload_speed}
#framework = ${common.framework}
#platform = ${common.platform}
#lib_deps = ${common.lib_deps}
#lib_ignore = ${common.lib_ignore}
#lib_ldf_mode = ${common.lib_ldf_mode}
#board_flash_mode = ${Sonoff.board_flash_mode}
#board = ${Sonoff.board}
#build_flags = ${Sonoff.build_flags} -D PLUGIN_SET_SONOFF_TH10
# ITEAD / SONOFF TH16 version -------------------
#[env:hard_SONOFF_TH16]
#upload_speed = ${common.upload_speed}
#framework = ${common.framework}
#platform = ${common.platform}
#lib_deps = ${common.lib_deps}
#lib_ignore = ${common.lib_ignore}
#lib_ldf_mode = ${common.lib_ldf_mode}
#board_flash_mode = ${Sonoff.board_flash_mode}
#board = ${Sonoff.board}
#build_flags = ${Sonoff.build_flags} -D PLUGIN_SET_SONOFF_TH16
# ITEAD / SONOFF POW version --------------------
#[env:hard_SONOFF_POW]
#upload_speed = ${common.upload_speed}
#framework = ${common.framework}
#platform = ${common.platform}
#lib_deps = ${common.lib_deps}
#lib_ignore = ${common.lib_ignore}
#lib_ldf_mode = ${common.lib_ldf_mode}
#board_flash_mode = ${Sonoff.board_flash_mode}
#board = ${Sonoff.board}
#build_flags = ${Sonoff.build_flags} -D PLUGIN_SET_SONOFF_POW
# ITEAD / SONOFF S20 version --------------------
#[env:hard_SONOFF_S20]
#upload_speed = ${common.upload_speed}
#framework = ${common.framework}
#platform = ${common.platform}
#lib_deps = ${common.lib_deps}
#lib_ignore = ${common.lib_ignore}
#lib_ldf_mode = ${common.lib_ldf_mode}
#board_flash_mode = ${Sonoff.board_flash_mode}
#board = ${Sonoff.board}
#build_flags = ${Sonoff.build_flags} -D PLUGIN_SET_SONOFF_S20
# ITEAD / SONOFF 4CH version --------------------
#[env:hard_SONOFF_4CH]
#upload_speed = ${common.upload_speed}
#framework = ${common.framework}
#platform = ${common.platform}
#lib_deps = ${common.lib_deps}
#lib_ignore = ${common.lib_ignore}
#lib_ldf_mode = ${common.lib_ldf_mode}
#board_flash_mode = ${Sonoff.board_flash_mode}
#board = ${Sonoff.board}
#build_flags = ${Sonoff.build_flags} -D PLUGIN_SET_SONOFF_4CH
# ITEAD / SONOFF TOUCH version ------------------
#[env:hard_SONOFF_TOUCH]
#upload_speed = ${common.upload_speed}
#framework = ${common.framework}
#platform = ${common.platform}
#lib_deps = ${common.lib_deps}
#lib_ignore = ${common.lib_ignore}
#lib_ldf_mode = ${common.lib_ldf_mode}
#board_flash_mode = ${Sonoff.board_flash_mode}
#board = ${Sonoff.board}
#build_flags = ${Sonoff.build_flags} -D PLUGIN_SET_SONOFF_TOUCH
# LED Strips #####################################
# Huacanxing / H801 ------------------------------
#[env:hard_HUACANXING_H801]
#upload_speed = ${common.upload_speed}
#framework = ${common.framework}
#platform = ${common.platform}
#lib_deps = ${common.lib_deps}
#lib_ignore = ${common.lib_ignore}
#lib_ldf_mode = ${common.lib_ldf_mode}
#board_flash_mode = ${esp8266_1M.board_flash_mode}
#board = esp01_1m
#build_flags = ${esp8266_1M.build_flags} -D PLUGIN_SET_H801
# MagicHome / Led Controller ---------------------
#[env:hard_MAGICHOME]
#upload_speed = ${common.upload_speed}
#upload_speed = ${common.upload_speed}
#framework = ${common.framework}
#platform = ${common.platform}
#lib_deps = ${common.lib_deps}
#lib_ignore = ${common.lib_ignore}
#lib_ldf_mode = ${common.lib_ldf_mode}
#board_flash_mode = ${esp8266_1M.board_flash_mode}
#board = esp01_1m
#build_flags = ${esp8266_1M.build_flags} -D PLUGIN_SET_MAGICHOME
# MagicHome / Led Controller with IR -------------
#[env:hard_MAGICHOME_IR]
#upload_speed = ${common.upload_speed}
#framework = ${common.framework}
#platform = ${common.platform}
#lib_deps = ${common.lib_deps}
#lib_ignore = ${common.lib_ignore}
#lib_ldf_mode = ${common.lib_ldf_mode}
#board_flash_mode = ${esp8266_1M.board_flash_mode}
#board = esp01_1m
#build_flags = ${esp8266_1M.build_flags} -D PLUGIN_SET_MAGICHOME_IR
### EASY VERSIONS ########################################################################
# versions specially designed to be small and cover a specific usage #
##########################################################################################
# Easy Temperature Sensor ------------------------
#[env:easy_TEMP]
#upload_speed = ${common.upload_speed}
#framework = ${common.framework}
#platform = ${common.platform}
#lib_deps = ${common.lib_deps}
#lib_ignore = ${common.lib_ignore}
#lib_ldf_mode = ${common.lib_ldf_mode}
#board_flash_mode = ${esp8266_1M.board_flash_mode}
#board = esp01_1m
#build_flags = ${esp8266_1M.build_flags} -D PLUGIN_SET_EASY_TEMP
# Easy Carbon Sensor -----------------------------
#[env:easy_CARBON]
#upload_speed = ${common.upload_speed}
#framework = ${common.framework}
#platform = ${common.platform}
#lib_deps = ${common.lib_deps}
#lib_ignore = ${common.lib_ignore}
#lib_ldf_mode = ${common.lib_ldf_mode}
#board_flash_mode = ${esp8266_1M.board_flash_mode}
#board = esp01_1m
#build_flags = ${esp8266_1M.build_flags} -D PLUGIN_SET_EASY_CARBON
## Easy Nextion ----------------------------------
##PLUGIN_SET_EASY_NEXTION
# Easy OLED Display v1 ---------------------------
#[env:easy_OLED_V1]
#upload_speed = ${common.upload_speed}
#framework = ${common.framework}
#platform = ${common.platform}
#lib_deps = ${common.lib_deps}
#lib_ignore = ${common.lib_ignore}
#lib_ldf_mode = ${common.lib_ldf_mode}
#board_flash_mode = ${esp8266_1M.board_flash_mode}
#board = esp01_1m
#build_flags = ${esp8266_1M.build_flags} -D PLUGIN_SET_EASY_OLED1
# Easy OLED Display v2 ---------------------------
#[env:easy_OLED_V2]
#upload_speed = ${common.upload_speed}
#framework = ${common.framework}
#platform = ${common.platform}
#lib_deps = ${common.lib_deps}
#lib_ignore = ${common.lib_ignore}
#lib_ldf_mode = ${common.lib_ldf_mode}
#board_flash_mode = ${esp8266_1M.board_flash_mode}
#board = esp01_1m
#build_flags = ${esp8266_1M.build_flags} -D PLUGIN_SET_EASY_OLED2
# Easy Relay Switch ------------------------------
#[env:easy_OLED_V2]
#upload_speed = ${common.upload_speed}
#framework = ${common.framework}
#platform = ${common.platform}
#lib_deps = ${common.lib_deps}
#lib_ignore = ${common.lib_ignore}
#lib_ldf_mode = ${common.lib_ldf_mode}
#board_flash_mode = ${esp8266_1M.board_flash_mode}
#board = esp01_1m
#build_flags = ${esp8266_1M.build_flags} -D PLUGIN_SET_EASY_RELAY
# Easy Generic (1M) device ----------------------
#[env:easy_GENERIC_1M]
#upload_speed = ${common.upload_speed}
#framework = ${common.framework}
#platform = ${common.platform}
#lib_deps = ${common.lib_deps}
#lib_ignore = ${common.lib_ignore}
#lib_ldf_mode = ${common.lib_ldf_mode}
#board_flash_mode = ${esp8266_1M.board_flash_mode}
#board = esp01_1m
#build_flags = ${esp8266_1M.build_flags} -D PLUGIN_SET_GENERIC_1M
+304 -126
View File
@@ -38,31 +38,146 @@ bool safeReadStringUntil(Stream &input, String &str, char terminator, unsigned i
}
#define INPUT_COMMAND_SIZE 80
Command commandStringToEnum(const char * cmd) {
String tmpcmd;
tmpcmd = cmd;
tmpcmd.toLowerCase();
char cmd_lc[INPUT_COMMAND_SIZE];
tmpcmd.toCharArray(cmd_lc, tmpcmd.length() + 1);
switch (cmd_lc[0]) {
case 'a': {
if (strcmp_P(cmd_lc, PSTR("accessinfo") ) == 0) return cmd_accessinfo;
break;
}
case 'b': {
if (strcmp_P(cmd_lc, PSTR("background") ) == 0) return cmd_background;
else if (strcmp_P(cmd_lc, PSTR("blynkget") ) == 0) return cmd_BlynkGet;
else if (strcmp_P(cmd_lc, PSTR("build") ) == 0) return cmd_build;
break;
}
case 'c': {
if (strcmp_P(cmd_lc, PSTR("clearaccessblock") ) == 0) return cmd_clearaccessblock;
else if (strcmp_P(cmd_lc, PSTR("clearrtcram") ) == 0) return cmd_clearRTCRAM;
else if (strcmp_P(cmd_lc, PSTR("config") ) == 0) return cmd_config;
break;
}
case 'd': {
if (strcmp_P(cmd_lc, PSTR("debug") ) == 0) return cmd_Debug;
else if (strcmp_P(cmd_lc, PSTR("delay") ) == 0) return cmd_Delay;
else if (strcmp_P(cmd_lc, PSTR("deepsleep") ) == 0) return cmd_deepSleep;
break;
}
case 'e': {
if (strcmp_P(cmd_lc, PSTR("erase") ) == 0) return cmd_Erase;
else if (strcmp_P(cmd_lc, PSTR("event") ) == 0) return cmd_Event;
else if (strcmp_P(cmd_lc, PSTR("executerules") ) == 0) return cmd_executeRules;
break;
}
case 'i': {
if (strcmp_P(cmd_lc, PSTR("i2cscanner") ) == 0) return cmd_i2cscanner;
else if (strcmp_P(cmd_lc, PSTR("ip") ) == 0) return cmd_IP;
break;
}
case 'l': {
if (strcmp_P(cmd_lc, PSTR("load") ) == 0) return cmd_Load;
else if (strcmp_P(cmd_lc, PSTR("lowmem") ) == 0) return cmd_lowmem;
break;
}
case 'm': {
if (strcmp_P(cmd_lc, PSTR("malloc") ) == 0) return cmd_malloc;
else if (strcmp_P(cmd_lc, PSTR("meminfo") ) == 0) return cmd_meminfo;
break;
}
case 'n': {
if (strcmp_P(cmd_lc, PSTR("name") ) == 0) return cmd_Name;
else if (strcmp_P(cmd_lc, PSTR("notify") ) == 0) return cmd_notify;
else if (strcmp_P(cmd_lc, PSTR("nosleep") ) == 0) return cmd_NoSleep;
break;
}
case 'p': {
if (strcmp_P(cmd_lc, PSTR("password") ) == 0) return cmd_Password;
else if (strcmp_P(cmd_lc, PSTR("publish") ) == 0) return cmd_Publish;
break;
}
case 'r': {
if (strcmp_P(cmd_lc, PSTR("reboot") ) == 0) return cmd_Reboot;
else if (strcmp_P(cmd_lc, PSTR("reset") ) == 0) return cmd_Reset;
else if (strcmp_P(cmd_lc, PSTR("restart") ) == 0) return cmd_Restart;
else if (strcmp_P(cmd_lc, PSTR("resetflashwritecounter")) == 0) return cmd_resetFlashWriteCounter;
else if (strcmp_P(cmd_lc, PSTR("rules") ) == 0) return cmd_Rules;
break;
}
case 's': {
if (strcmp_P(cmd_lc, PSTR("sdcard") ) == 0) return cmd_sdcard;
else if (strcmp_P(cmd_lc, PSTR("sdremove") ) == 0) return cmd_sdremove;
else if (strcmp_P(cmd_lc, PSTR("sysload") ) == 0) return cmd_sysload;
else if (strcmp_P(cmd_lc, PSTR("save") ) == 0) return cmd_Save;
else if (strcmp_P(cmd_lc, PSTR("sendto") ) == 0) return cmd_SendTo;
else if (strcmp_P(cmd_lc, PSTR("sendtohttp") ) == 0) return cmd_SendToHTTP;
else if (strcmp_P(cmd_lc, PSTR("sendtoudp") ) == 0) return cmd_SendToUDP;
else if (strcmp_P(cmd_lc, PSTR("serialfloat") ) == 0) return cmd_SerialFloat;
else if (strcmp_P(cmd_lc, PSTR("settings") ) == 0) return cmd_Settings;
break;
}
case 't': {
if (strcmp_P(cmd_lc, PSTR("taskclear") ) == 0) return cmd_TaskClear;
else if (strcmp_P(cmd_lc, PSTR("taskclearall") ) == 0) return cmd_TaskClearAll;
else if (strcmp_P(cmd_lc, PSTR("taskrun") ) == 0) return cmd_TaskRun;
else if (strcmp_P(cmd_lc, PSTR("taskvalueset") ) == 0) return cmd_TaskValueSet;
else if (strcmp_P(cmd_lc, PSTR("timerset") ) == 0) return cmd_TimerSet;
break;
}
case 'u': {
if (strcmp_P(cmd_lc, PSTR("udptest") ) == 0) return cmd_udptest;
else if (strcmp_P(cmd_lc, PSTR("unit") ) == 0) return cmd_Unit;
break;
}
case 'w': {
if (strcmp_P(cmd_lc, PSTR("wdconfig") ) == 0) return cmd_wdconfig;
else if (strcmp_P(cmd_lc, PSTR("wdread") ) == 0) return cmd_wdread;
else if (strcmp_P(cmd_lc, PSTR("wifiapmode") ) == 0) return cmd_WifiAPMode;
else if (strcmp_P(cmd_lc, PSTR("wificonnect") ) == 0) return cmd_WifiConnect;
else if (strcmp_P(cmd_lc, PSTR("wifidisconnect") ) == 0) return cmd_WifiDisconnect;
else if (strcmp_P(cmd_lc, PSTR("wifikey2") ) == 0) return cmd_WifiKey2;
else if (strcmp_P(cmd_lc, PSTR("wifikey") ) == 0) return cmd_WifiKey;
else if (strcmp_P(cmd_lc, PSTR("wifissid2") ) == 0) return cmd_WifiSSID2;
else if (strcmp_P(cmd_lc, PSTR("wifissid") ) == 0) return cmd_WifiSSID;
else if (strcmp_P(cmd_lc, PSTR("wifiscan") ) == 0) return cmd_WifiScan;
break;
}
default:
return cmd_Unknown;
}
return cmd_Unknown;
}
void ExecuteCommand(byte source, const char *Line)
{
checkRAM(F("ExecuteCommand"));
String status = "";
boolean success = false;
char TmpStr1[80];
char TmpStr1[INPUT_COMMAND_SIZE];
TmpStr1[0] = 0;
char Command[80];
Command[0] = 0;
char cmd[INPUT_COMMAND_SIZE];
cmd[0] = 0;
int Par1 = 0;
int Par2 = 0;
int Par3 = 0;
GetArgv(Line, Command, 1);
GetArgv(Line, cmd, 1);
if (GetArgv(Line, TmpStr1, 2)) Par1 = str2int(TmpStr1);
if (GetArgv(Line, TmpStr1, 3)) Par2 = str2int(TmpStr1);
if (GetArgv(Line, TmpStr1, 4)) Par3 = str2int(TmpStr1);
const Command cmd_enum = commandStringToEnum(cmd);
switch (cmd_enum) {
// ****************************************
// commands for debugging
// ****************************************
if (strcasecmp_P(Command, PSTR("background")) == 0)
case cmd_background:
{
success = true;
unsigned long timer = millis() + Par1;
@@ -70,9 +185,10 @@ void ExecuteCommand(byte source, const char *Line)
while (!timeOutReached(timer))
backgroundtasks();
Serial.println("end");
break;
}
if (strcasecmp_P(Command, PSTR("executeRules")) == 0)
case cmd_executeRules:
{
success = true;
if (GetArgv(Line, TmpStr1, 2))
@@ -81,15 +197,17 @@ void ExecuteCommand(byte source, const char *Line)
String event = "";
rulesProcessingFile(fileName, event);
}
break;
}
if (strcasecmp_P(Command, PSTR("clearRTCRAM")) == 0)
case cmd_clearRTCRAM:
{
success = true;
initRTC();
break;
}
if (strcasecmp_P(Command, PSTR("notify")) == 0)
case cmd_notify:
{
success = true;
String message = "";
@@ -110,15 +228,17 @@ void ExecuteCommand(byte source, const char *Line)
}
}
}
break;
}
if (strcasecmp_P(Command, PSTR("resetFlashWriteCounter")) == 0)
case cmd_resetFlashWriteCounter:
{
success = true;
RTC.flashDayCounter = 0;
break;
}
if (strcasecmp_P(Command, PSTR("udptest")) == 0)
case cmd_udptest:
{
success = true;
for (byte x = 0; x < Par2; x++)
@@ -127,18 +247,20 @@ void ExecuteCommand(byte source, const char *Line)
event += x;
SendUDPCommand(Par1, (char*)event.c_str(), event.length());
}
break;
}
#ifdef FEATURE_SD
if (strcasecmp_P(Command, PSTR("sdcard")) == 0)
case cmd_sdcard:
{
success = true;
File root = SD.open("/");
root.rewindDirectory();
printDirectory(root, 0);
root.close();
break;
}
if (strcasecmp_P(Command, PSTR("sdremove")) == 0)
case cmd_sdremove:
{
success = true;
String fname = Line;
@@ -146,56 +268,63 @@ void ExecuteCommand(byte source, const char *Line)
Serial.print(F("Removing:"));
Serial.println(fname.c_str());
SD.remove((char*)fname.c_str());
break;
}
#endif
if (strcasecmp_P(Command, PSTR("lowmem")) == 0)
case cmd_lowmem:
{
Serial.print(lowestRAM);
Serial.print(F(" : "));
Serial.println(lowestRAMfunction);
success = true;
break;
}
if (strcasecmp_P(Command, PSTR("malloc")) == 0)
case cmd_malloc:
{
ramtest = (char *)malloc(Par1);
success = true;
break;
}
if (strcasecmp_P(Command, PSTR("sysload")) == 0)
case cmd_sysload:
{
success = true;
Serial.print(100 - (100 * loopCounterLast / loopCounterMax));
Serial.print(F("% (LC="));
Serial.print(int(loopCounterLast / 30));
Serial.println(F(")"));
break;
}
if (strcasecmp_P(Command, PSTR("SerialFloat")) == 0)
case cmd_SerialFloat:
{
success = true;
pinMode(1, INPUT);
pinMode(3, INPUT);
delay(60000);
break;
}
if (strcasecmp_P(Command, PSTR("accessinfo")) == 0)
case cmd_accessinfo:
{
success = true;
Serial.print(F("Allowed IP range : "));
Serial.println(describeAllowedIPrange());
break;
}
if (strcasecmp_P(Command, PSTR("clearaccessblock")) == 0)
case cmd_clearaccessblock:
{
success = true;
clearAccessBlock();
Serial.print(F("Allowed IP range : "));
Serial.println(describeAllowedIPrange());
break;
}
if (strcasecmp_P(Command, PSTR("meminfo")) == 0)
case cmd_meminfo:
{
success = true;
Serial.print(F("SecurityStruct : "));
@@ -206,32 +335,36 @@ void ExecuteCommand(byte source, const char *Line)
Serial.println(sizeof(ExtraTaskSettings));
Serial.print(F("DeviceStruct: "));
Serial.println(sizeof(Device));
break;
}
if (strcasecmp_P(Command, PSTR("TaskClear")) == 0)
case cmd_TaskClear:
{
success = true;
taskClear(Par1 - 1, true);
break;
}
//quickly clear all tasks, without saving (used by test suite)
if (strcasecmp_P(Command, PSTR("TaskClearAll")) == 0)
case cmd_TaskClearAll:
{
success = true;
for (byte t=0; t<TASKS_MAX; t++)
taskClear(t, false);
break;
}
if (strcasecmp_P(Command, PSTR("wdconfig")) == 0)
case cmd_wdconfig:
{
success = true;
Wire.beginTransmission(Par1); // address
Wire.write(Par2); // command
Wire.write(Par3); // data
Wire.endTransmission();
break;
}
if (strcasecmp_P(Command, PSTR("wdread")) == 0)
case cmd_wdread:
{
success = true;
Wire.beginTransmission(Par1); // address
@@ -245,22 +378,25 @@ void ExecuteCommand(byte source, const char *Line)
status = F("Reg value: ");
status += value;
}
break;
}
if (strcasecmp_P(Command, PSTR("build")) == 0)
case cmd_build:
{
success = true;
Settings.Build = Par1;
SaveSettings();
break;
}
if (strcasecmp_P(Command, PSTR("NoSleep")) == 0)
case cmd_NoSleep:
{
success = true;
Settings.deepSleep = 0;
break;
}
if (strcasecmp_P(Command, PSTR("i2cscanner")) == 0)
case cmd_i2cscanner:
{
success = true;
@@ -280,28 +416,31 @@ void ExecuteCommand(byte source, const char *Line)
Serial.println(String(address, HEX));
}
}
break;
}
// ****************************************
// commands for rules
// ****************************************
if (strcasecmp_P(Command, PSTR("config")) == 0)
case cmd_config:
{
success = true;
struct EventStruct TempEvent;
String request = Line;
remoteConfig(&TempEvent, request);
break;
}
if (strcasecmp_P(Command, PSTR("deepSleep")) == 0)
case cmd_deepSleep:
{
success = true;
if (Par1 > 0)
deepSleepStart(Par1); // call the second part of the function to avoid check and enable one-shot operation
break;
}
if (strcasecmp_P(Command, PSTR("TaskValueSet")) == 0)
case cmd_TaskValueSet:
{
success = true;
if (GetArgv(Line, TmpStr1, 4))
@@ -310,15 +449,17 @@ void ExecuteCommand(byte source, const char *Line)
Calculate(TmpStr1, &result);
UserVar[(VARS_PER_TASK * (Par1 - 1)) + Par2 - 1] = result;
}
break;
}
if (strcasecmp_P(Command, PSTR("TaskRun")) == 0)
case cmd_TaskRun:
{
success = true;
SensorSendTask(Par1 - 1);
break;
}
if (strcasecmp_P(Command, PSTR("TimerSet")) == 0)
case cmd_TimerSet:
{
if (Par1>=1 && Par1<=RULES_TIMER_MAX)
{
@@ -334,24 +475,27 @@ void ExecuteCommand(byte source, const char *Line)
{
addLog(LOG_LEVEL_ERROR, F("TIMER: invalid timer number"));
}
break;
}
if (strcasecmp_P(Command, PSTR("Delay")) == 0)
case cmd_Delay:
{
success = true;
delayBackground(Par1);
break;
}
if (strcasecmp_P(Command, PSTR("Rules")) == 0)
case cmd_Rules:
{
success = true;
if (Par1 == 1)
Settings.UseRules = true;
else
Settings.UseRules = false;
break;
}
if (strcasecmp_P(Command, PSTR("Event")) == 0)
case cmd_Event:
{
success = true;
String event = Line;
@@ -359,9 +503,10 @@ void ExecuteCommand(byte source, const char *Line)
event.replace("$", "#");
if (Settings.UseRules)
rulesProcessing(event);
break;
}
if (strcasecmp_P(Command, PSTR("SendTo")) == 0)
case cmd_SendTo:
{
success = true;
String event = Line;
@@ -372,78 +517,88 @@ void ExecuteCommand(byte source, const char *Line)
event = event.substring(index + 1);
SendUDPCommand(Par1, (char*)event.c_str(), event.length());
}
break;
}
if (strcasecmp_P(Command, PSTR("Publish")) == 0 && WiFi.status() == WL_CONNECTED)
case cmd_Publish:
{
// ToDo TD-er: Not sure about this function, but at least it sends to an existing MQTTclient
int enabledMqttController = firstEnabledMQTTController();
if (enabledMqttController >= 0) {
if (wifiStatus == ESPEASY_WIFI_SERVICES_INITIALIZED) {
// ToDo TD-er: Not sure about this function, but at least it sends to an existing MQTTclient
int enabledMqttController = firstEnabledMQTTController();
if (enabledMqttController >= 0) {
success = true;
String event = Line;
event = event.substring(8);
int index = event.indexOf(',');
if (index > 0)
{
String topic = event.substring(0, index);
String value = event.substring(index + 1);
MQTTpublish(enabledMqttController, topic.c_str(), value.c_str(), Settings.MQTTRetainFlag);
}
}
}
break;
}
case cmd_SendToUDP:
{
if (wifiStatus == ESPEASY_WIFI_SERVICES_INITIALIZED) {
success = true;
String event = Line;
event = event.substring(8);
int index = event.indexOf(',');
if (index > 0)
String strLine = Line;
String ip = parseString(strLine, 2);
String port = parseString(strLine, 3);
int msgpos = getParamStartPos(strLine, 4);
String message = strLine.substring(msgpos);
IPAddress UDP_IP;
if(UDP_IP.fromString(ip)) {
portUDP.beginPacket(UDP_IP, port.toInt());
#if defined(ESP8266)
portUDP.write(message.c_str(), message.length());
#endif
#if defined(ESP32)
portUDP.write((uint8_t*)message.c_str(), message.length());
#endif
portUDP.endPacket();
}
}
break;
}
case cmd_SendToHTTP:
{
if (wifiStatus == ESPEASY_WIFI_SERVICES_INITIALIZED) {
success = true;
String strLine = Line;
String host = parseString(strLine, 2);
String port = parseString(strLine, 3);
int pathpos = getParamStartPos(strLine, 4);
String path = strLine.substring(pathpos);
WiFiClient client;
if (client.connect(host.c_str(), port.toInt()))
{
String topic = event.substring(0, index);
String value = event.substring(index + 1);
MQTTpublish(enabledMqttController, topic.c_str(), value.c_str(), Settings.MQTTRetainFlag);
client.print(String("GET ") + path + " HTTP/1.1\r\n" +
"Host: " + host + "\r\n" +
"Connection: close\r\n\r\n");
unsigned long timer = millis() + 200;
while (!client.available() && !timeOutReached(timer))
delay(1);
while (client.available()) {
// String line = client.readStringUntil('\n');
String line;
safeReadStringUntil(client, line, '\n');
if (line.substring(0, 15) == F("HTTP/1.1 200 OK"))
addLog(LOG_LEVEL_DEBUG, line);
delay(1);
}
client.flush();
client.stop();
}
}
}
if (strcasecmp_P(Command, PSTR("SendToUDP")) == 0 && WiFi.status() == WL_CONNECTED)
{
success = true;
String strLine = Line;
String ip = parseString(strLine, 2);
String port = parseString(strLine, 3);
int msgpos = getParamStartPos(strLine, 4);
String message = strLine.substring(msgpos);
IPAddress UDP_IP;
if(UDP_IP.fromString(ip)) {
portUDP.beginPacket(UDP_IP, port.toInt());
#if defined(ESP8266)
portUDP.write(message.c_str(), message.length());
#endif
#if defined(ESP32)
portUDP.write((uint8_t*)message.c_str(), message.length());
#endif
portUDP.endPacket();
}
}
if (strcasecmp_P(Command, PSTR("SendToHTTP")) == 0 && WiFi.status() == WL_CONNECTED)
{
success = true;
String strLine = Line;
String host = parseString(strLine, 2);
String port = parseString(strLine, 3);
int pathpos = getParamStartPos(strLine, 4);
String path = strLine.substring(pathpos);
WiFiClient client;
if (client.connect(host.c_str(), port.toInt()))
{
client.print(String("GET ") + path + " HTTP/1.1\r\n" +
"Host: " + host + "\r\n" +
"Connection: close\r\n\r\n");
unsigned long timer = millis() + 200;
while (!client.available() && !timeOutReached(timer))
delay(1);
while (client.available()) {
// String line = client.readStringUntil('\n');
String line;
safeReadStringUntil(client, line, '\n');
if (line.substring(0, 15) == F("HTTP/1.1 200 OK"))
addLog(LOG_LEVEL_DEBUG, line);
delay(1);
}
client.flush();
client.stop();
}
break;
}
// ****************************************
@@ -452,7 +607,7 @@ void ExecuteCommand(byte source, const char *Line)
#ifdef CPLUGIN_012
//FIXME: this should go to PLUGIN_WRITE in _C012.ino
if (strcasecmp_P(Command, PSTR("BlynkGet")) == 0)
case cmd_BlynkGet:
{
byte first_enabled_blynk_controller = firstEnabledBlynkController();
if (first_enabled_blynk_controller == -1) {
@@ -481,80 +636,91 @@ void ExecuteCommand(byte source, const char *Line)
}
}
}
break;
}
#endif
// ****************************************
// configure settings commands
// ****************************************
if (strcasecmp_P(Command, PSTR("WifiSSID")) == 0)
case cmd_WifiSSID:
{
success = true;
strcpy(SecuritySettings.WifiSSID, Line + 9);
break;
}
if (strcasecmp_P(Command, PSTR("WifiKey")) == 0)
case cmd_WifiKey:
{
success = true;
strcpy(SecuritySettings.WifiKey, Line + 8);
break;
}
if (strcasecmp_P(Command, PSTR("WifiSSID2")) == 0)
case cmd_WifiSSID2:
{
success = true;
strcpy(SecuritySettings.WifiSSID2, Line + 10);
break;
}
if (strcasecmp_P(Command, PSTR("WifiKey2")) == 0)
case cmd_WifiKey2:
{
success = true;
strcpy(SecuritySettings.WifiKey2, Line + 9);
break;
}
if (strcasecmp_P(Command, PSTR("WifiScan")) == 0)
case cmd_WifiScan:
{
success = true;
WifiScan();
break;
}
if (strcasecmp_P(Command, PSTR("WifiConnect")) == 0)
case cmd_WifiConnect:
{
success = true;
WifiConnect(1);
WiFiConnectRelaxed();
break;
}
if (strcasecmp_P(Command, PSTR("WifiDisconnect")) == 0)
case cmd_WifiDisconnect:
{
success = true;
WifiDisconnect();
break;
}
if (strcasecmp_P(Command, PSTR("WifiAPMode")) == 0)
case cmd_WifiAPMode:
{
WifiAPMode(true);
success = true;
break;
}
if (strcasecmp_P(Command, PSTR("Unit")) == 0)
case cmd_Unit:
{
success = true;
Settings.Unit=Par1;
break;
}
if (strcasecmp_P(Command, PSTR("Name")) == 0)
case cmd_Name:
{
success = true;
strcpy(Settings.Name, Line + 5);
break;
}
if (strcasecmp_P(Command, PSTR("Password")) == 0)
case cmd_Password:
{
success = true;
strcpy(SecuritySettings.Password, Line + 9);
break;
}
if (strcasecmp_P(Command, PSTR("Reboot")) == 0)
case cmd_Reboot:
{
success = true;
pinMode(0, INPUT);
@@ -566,22 +732,26 @@ void ExecuteCommand(byte source, const char *Line)
#if defined(ESP32)
ESP.restart();
#endif
break;
}
if (strcasecmp_P(Command, PSTR("Restart")) == 0)
case cmd_Restart:
{
success = true;
ESP.restart();
break;
}
if (strcasecmp_P(Command, PSTR("Erase")) == 0)
case cmd_Erase:
{
success = true;
WiFi.persistent(true); // use SDK storage of SSID/WPA parameters
WiFi.disconnect(); // this will store empty ssid/wpa into sdk storage
WiFi.persistent(false); // Do not use SDK storage of SSID/WPA parameters
break;
}
if (strcasecmp_P(Command, PSTR("Reset")) == 0)
case cmd_Reset:
{
success = true;
ResetFactory();
@@ -591,37 +761,41 @@ void ExecuteCommand(byte source, const char *Line)
#if defined(ESP32)
ESP.restart();
#endif
break;
}
if (strcasecmp_P(Command, PSTR("Save")) == 0)
case cmd_Save:
{
success = true;
SaveSettings();
break;
}
if (strcasecmp_P(Command, PSTR("Load")) == 0)
case cmd_Load:
{
success = true;
LoadSettings();
break;
}
if (strcasecmp_P(Command, PSTR("Debug")) == 0)
case cmd_Debug:
{
success = true;
Settings.SerialLogLevel = Par1;
break;
}
if (strcasecmp_P(Command, PSTR("IP")) == 0)
case cmd_IP:
{
success = true;
if (GetArgv(Line, TmpStr1, 2)) {
if (!str2ip(TmpStr1, Settings.IP))
Serial.println("?");
}
break;
}
if (strcasecmp_P(Command, PSTR("Settings")) == 0)
case cmd_Settings:
{
success = true;
char str[20];
@@ -639,6 +813,10 @@ void ExecuteCommand(byte source, const char *Line)
Serial.print(F(" WifiSSID2 : ")); Serial.println(SecuritySettings.WifiSSID2);
Serial.print(F(" WifiKey2 : ")); Serial.println(SecuritySettings.WifiKey2);
Serial.print(F(" Free mem : ")); Serial.println(FreeMem());
break;
}
default:
success = false;
}
yield();
+8 -8
View File
@@ -120,8 +120,10 @@ bool MQTTConnect(int controller_idx)
LoadControllerSettings(controller_idx, (byte*)&ControllerSettings, sizeof(ControllerSettings));
if (!ControllerSettings.checkHostReachable(true))
return false;
if (MQTTclient.connected())
if (MQTTclient.connected()) {
MQTTclient.disconnect();
updateMQTTclient_connected();
}
if (ControllerSettings.UseDNS) {
MQTTclient.setServer(ControllerSettings.getHost().c_str(), ControllerSettings.Port);
} else {
@@ -166,11 +168,7 @@ bool MQTTConnect(int controller_idx)
addLog(LOG_LEVEL_INFO, log);
if (MQTTclient.publish(LWTTopic.c_str(), "Connected", 1)) {
if (Settings.UseRules)
{
String event = F("MQTT#Connected");
rulesProcessing(event);
}
updateMQTTclient_connected();
statusLED(true);
return true; // end loop if succesfull
}
@@ -183,15 +181,17 @@ bool MQTTConnect(int controller_idx)
\*********************************************************************************************/
bool MQTTCheck(int controller_idx)
{
if (!WiFiConnected(10)) {
return false;
}
byte ProtocolIndex = getProtocolIndex(Settings.Protocol[controller_idx]);
if (Protocol[ProtocolIndex].usesMQTT)
{
if (MQTTclient_should_reconnect || !WiFiConnected(10) || !MQTTclient.connected())
if (MQTTclient_should_reconnect || !MQTTclient.connected())
{
if (MQTTclient_should_reconnect) {
addLog(LOG_LEVEL_ERROR, F("MQTT : Intentional reconnect"));
} else {
addLog(LOG_LEVEL_ERROR, F("MQTT : Connection lost"));
connectionFailures += 2;
}
return MQTTConnect(controller_idx);
+35 -1
View File
@@ -84,6 +84,14 @@ String minutesToDayHour(int minutes) {
return TimeString;
}
String minutesToHourMinute(int minutes) {
int hours = (minutes % 1440) / 60;
int mins = (minutes % 1440) % 60;
char TimeString[20];
sprintf_P(TimeString, PSTR("%d%c%02d%c"), hours, 'h', mins, 'm');
return TimeString;
}
String minutesToDayHourMinute(int minutes) {
int days = minutes / 1440;
int hours = (minutes % 1440) / 60;
@@ -104,7 +112,33 @@ String secondsToDayHourMinuteSecond(int seconds) {
return TimeString;
}
String format_msec_duration(long duration) {
String result;
if (duration < 0) {
result = "-";
duration = -1 * duration;
}
if (duration < 10000) {
result += duration;
result += F(" ms");
return result;
}
duration /= 1000;
if (duration < 3600) {
int sec = duration % 60;
int minutes = duration / 60;
if (minutes > 0) {
result += minutes;
result += F(" m ");
}
result += sec;
result += F(" s");
return result;
}
duration /= 60;
if (duration < 1440) return minutesToHourMinute(duration);
return minutesToDayHourMinute(duration);
}
/********************************************************************************************\
+139 -2
View File
@@ -32,6 +32,8 @@
#define DEFAULT_IPRANGE_HIGH "255.255.255.255" // Allowed IP range to access webserver
#define DEFAULT_IP_BLOCK_LEVEL 1 // 0: ALL_ALLOWED 1: LOCAL_SUBNET_ALLOWED 2: ONLY_IP_RANGE_ALLOWED
#define DEFAULT_WIFI_CONNECTION_TIMEOUT 10000 // minimum timeout in ms for WiFi to be connected.
// --- Default Controller ------------------------------------------------------------------------------
#define DEFAULT_CONTROLLER false // true or false enabled or disabled, set 1st controller defaults
// using a default template, you also need to set a DEFAULT PROTOCOL to a suitable MQTT protocol !
@@ -53,6 +55,10 @@
// --- Advanced Settings ---------------------------------------------------------------------------------
#if defined(ESP32)
#define USE_RTOS_MULTITASKING
#endif
#define DEFAULT_USE_RULES false // (true|false) Enable Rules?
#define DEFAULT_MQTT_RETAIN false // (true|false) Retain MQTT messages?
@@ -432,6 +438,18 @@ using namespace fs;
ADC_MODE(ADC_VCC);
#endif
#define ESPEASY_WIFI_DISCONNECTED 0
#define ESPEASY_WIFI_CONNECTED 1
#define ESPEASY_WIFI_GOT_IP 2
#define ESPEASY_WIFI_SERVICES_INITIALIZED 3
#if defined(ESP32)
void WiFiEvent(system_event_id_t event, system_event_info_t info);
#else
WiFiEventHandler stationConnectedHandler;
WiFiEventHandler stationDisconnectedHandler;
WiFiEventHandler stationGotIpHandler;
#endif
// Setup DNS, only used if the ESP has no valid WiFi config
const byte DNS_PORT = 53;
@@ -445,6 +463,7 @@ MDNSResponder mdns;
WiFiClient mqtt;
PubSubClient MQTTclient(mqtt);
bool MQTTclient_should_reconnect = true;
bool MQTTclient_connected = false;
// udp protocol stuff (syslog, global sync, node info list, ntp time)
WiFiUDP portUDP;
@@ -459,7 +478,68 @@ struct CRCStruct{
uint32_t numberOfCRCBytes=0;
}CRCValues;
enum Command {
cmd_Unknown,
cmd_accessinfo,
cmd_background,
cmd_BlynkGet,
cmd_build,
cmd_clearaccessblock,
cmd_clearRTCRAM,
cmd_config,
cmd_Debug,
cmd_Delay,
cmd_deepSleep,
cmd_Erase,
cmd_Event,
cmd_executeRules,
cmd_i2cscanner,
cmd_IP,
cmd_Load,
cmd_lowmem,
cmd_malloc,
cmd_meminfo,
cmd_Name,
cmd_notify,
cmd_NoSleep,
cmd_Password,
cmd_Publish,
cmd_Reboot,
cmd_Reset,
cmd_Restart,
cmd_resetFlashWriteCounter,
cmd_Rules,
cmd_sdcard,
cmd_sdremove,
cmd_sysload,
cmd_Save,
cmd_SendTo,
cmd_SendToHTTP,
cmd_SendToUDP,
cmd_SerialFloat,
cmd_Settings,
cmd_TaskClear,
cmd_TaskClearAll,
cmd_TaskRun,
cmd_TaskValueSet,
cmd_TimerSet,
cmd_udptest,
cmd_Unit,
cmd_wdconfig,
cmd_wdread,
cmd_WifiAPMode,
cmd_WifiConnect,
cmd_WifiDisconnect,
cmd_WifiKey2,
cmd_WifiKey,
cmd_WifiSSID2,
cmd_WifiSSID,
cmd_WifiScan
};
// Forward declarations.
Command commandStringToEnum(const char * cmd);
bool WiFiConnected(uint32_t timeout_ms);
bool hostReachable(const IPAddress& ip);
bool hostReachable(const String& hostname);
@@ -619,6 +699,7 @@ struct SettingsStruct
// make sure crc is the last value in the struct
uint8_t ProgmemMd5[16]; // crc of the binary that last saved the struct to file.
uint8_t md5[16];
boolean UseRTOSMultitasking;
} Settings;
struct ControllerSettingsStruct
@@ -1043,14 +1124,63 @@ String dummyString = "";
byte lastBootCause = BOOT_CAUSE_MANUAL_REBOOT;
#if defined(ESP32)
enum WiFiDisconnectReason
{
WIFI_DISCONNECT_REASON_UNSPECIFIED = 1,
WIFI_DISCONNECT_REASON_AUTH_EXPIRE = 2,
WIFI_DISCONNECT_REASON_AUTH_LEAVE = 3,
WIFI_DISCONNECT_REASON_ASSOC_EXPIRE = 4,
WIFI_DISCONNECT_REASON_ASSOC_TOOMANY = 5,
WIFI_DISCONNECT_REASON_NOT_AUTHED = 6,
WIFI_DISCONNECT_REASON_NOT_ASSOCED = 7,
WIFI_DISCONNECT_REASON_ASSOC_LEAVE = 8,
WIFI_DISCONNECT_REASON_ASSOC_NOT_AUTHED = 9,
WIFI_DISCONNECT_REASON_DISASSOC_PWRCAP_BAD = 10, /* 11h */
WIFI_DISCONNECT_REASON_DISASSOC_SUPCHAN_BAD = 11, /* 11h */
WIFI_DISCONNECT_REASON_IE_INVALID = 13, /* 11i */
WIFI_DISCONNECT_REASON_MIC_FAILURE = 14, /* 11i */
WIFI_DISCONNECT_REASON_4WAY_HANDSHAKE_TIMEOUT = 15, /* 11i */
WIFI_DISCONNECT_REASON_GROUP_KEY_UPDATE_TIMEOUT = 16, /* 11i */
WIFI_DISCONNECT_REASON_IE_IN_4WAY_DIFFERS = 17, /* 11i */
WIFI_DISCONNECT_REASON_GROUP_CIPHER_INVALID = 18, /* 11i */
WIFI_DISCONNECT_REASON_PAIRWISE_CIPHER_INVALID = 19, /* 11i */
WIFI_DISCONNECT_REASON_AKMP_INVALID = 20, /* 11i */
WIFI_DISCONNECT_REASON_UNSUPP_RSN_IE_VERSION = 21, /* 11i */
WIFI_DISCONNECT_REASON_INVALID_RSN_IE_CAP = 22, /* 11i */
WIFI_DISCONNECT_REASON_802_1X_AUTH_FAILED = 23, /* 11i */
WIFI_DISCONNECT_REASON_CIPHER_SUITE_REJECTED = 24, /* 11i */
WIFI_DISCONNECT_REASON_BEACON_TIMEOUT = 200,
WIFI_DISCONNECT_REASON_NO_AP_FOUND = 201,
WIFI_DISCONNECT_REASON_AUTH_FAIL = 202,
WIFI_DISCONNECT_REASON_ASSOC_FAIL = 203,
WIFI_DISCONNECT_REASON_HANDSHAKE_TIMEOUT = 204
};
#endif
// WiFi related data
boolean wifiSetup = false;
boolean wifiSetupConnect = false;
uint8_t lastBSSID[6] = {0};
boolean wifiConnected = false;
unsigned long wifi_connect_timer = 0;
uint8_t wifiStatus = ESPEASY_WIFI_DISCONNECTED;
unsigned long last_wifi_connect_attempt_moment = 0;
unsigned int wifi_connect_attempt = 0;
uint8_t lastWiFiSettings = 0;
String last_ssid;
bool bssid_changed = false;
uint8_t last_channel = 0;
WiFiDisconnectReason lastDisconnectReason = WIFI_DISCONNECT_REASON_UNSPECIFIED;
unsigned long lastConnectMoment = 0;
unsigned long lastDisconnectMoment = 0;
unsigned long lastGetIPmoment = 0;
unsigned long lastConnectedDuration = 0;
bool intent_to_reboot = false;
// Semaphore like booleans for processing data gathered from WiFi events.
bool processedConnect = true;
bool processedDisconnect = true;
bool processedGetIP = true;
unsigned long start = 0;
@@ -1071,4 +1201,11 @@ bool firstLoop=true;
boolean activeRuleSets[RULESETS_MAX];
boolean UseRTOSMultitasking;
// These wifi event functions must be in a .h-file because otherwise the preprocessor
// may not filter the ifdef checks properly.
// Also the functions use a lot of global defined variables, so include at the end of this file.
#include "ESPEasyWiFiEvent.h"
#endif /* ESPEASY_GLOBALS_H_ */
+139 -56
View File
@@ -1,3 +1,4 @@
#ifdef CONTINUOUS_INTEGRATION
#pragma GCC diagnostic error "-Wall"
#else
@@ -71,7 +72,9 @@
// SHT1X temperature/humidity sensors
// Ser2Net server
// Define globals before plugin sets to allow a personal override of the selected plugins
#include "ESPEasy-Globals.h"
#include "define_plugin_sets.h"
// Blynk_get prototype
boolean Blynk_get(const String& command, byte controllerIndex,float *data = NULL );
@@ -108,6 +111,14 @@ void setup()
initLog();
#if defined(ESP32)
WiFi.onEvent((WiFiEventFullCb)WiFiEvent);
#else
// WiFi event handlers
stationConnectedHandler = WiFi.onStationModeConnected(onConnected);
stationDisconnectedHandler = WiFi.onStationModeDisconnected(onDisconnect);
stationGotIpHandler = WiFi.onStationModeGotIP(onGotIP);
#endif
if (SpiffsSectors() < 32)
{
@@ -210,7 +221,7 @@ void setup()
timer100ms = 0; // timer for periodic actions 10 x per/sec
timer1s = 0; // timer for periodic actions once per/sec
timerwd = 0; // timer for watchdog once per 30 sec
timermqtt = 0; // Timer for the MQTT keep alive loop.
timermqtt = 10000; // Timer for the MQTT keep alive loop, initial value can be high, since it will be set as soon as IP is set.
timermqtt_interval = 250; // Interval for checking MQTT
timerAwakeFromDeepSleep = millis();
@@ -226,20 +237,7 @@ void setup()
WiFi.persistent(false); // Do not use SDK storage of SSID/WPA parameters
WifiAPconfig();
if (Settings.deepSleep)
{
//only one attempt in deepsleep, to conserve battery
if (!WifiConnect(1))
{
if (Settings.deepSleepOnFail)
{
addLog(LOG_LEVEL_ERROR, F("SLEEP: Connection failed, going back to sleep."));
deepSleep(Settings.Delay);
}
}
}
else
WiFiConnectRelaxed();
WiFiConnectRelaxed();
#ifdef FEATURE_REPORTING
ReportStatus();
@@ -278,8 +276,49 @@ void setup()
writeDefaultCSS();
UseRTOSMultitasking = Settings.UseRTOSMultitasking;
#ifdef USE_RTOS_MULTITASKING
if(UseRTOSMultitasking){
log = F("RTOS : Launching tasks");
addLog(LOG_LEVEL_INFO, log);
xTaskCreatePinnedToCore(RTOS_TaskServers, "RTOS_TaskServers", 8192, NULL, 1, NULL, 1);
xTaskCreatePinnedToCore(RTOS_TaskSerial, "RTOS_TaskSerial", 8192, NULL, 1, NULL, 1);
xTaskCreatePinnedToCore(RTOS_Task10ps, "RTOS_Task10ps", 8192, NULL, 1, NULL, 1);
}
#endif
}
#ifdef USE_RTOS_MULTITASKING
void RTOS_TaskServers( void * parameter )
{
while (true){
delay(100);
WebServer.handleClient();
checkUDP();
}
}
void RTOS_TaskSerial( void * parameter )
{
while (true){
delay(100);
if (Settings.UseSerial)
if (Serial.available())
if (!PluginCall(PLUGIN_SERIAL_IN, 0, dummyString))
serial();
}
}
void RTOS_Task10ps( void * parameter )
{
while (true){
delay(100);
run10TimesPerSecond();
}
}
#endif
int firstEnabledMQTTController() {
for (byte i = 0; i < CONTROLLER_MAX; ++i) {
byte ProtocolIndex = getProtocolIndex(Settings.Protocol[i]);
@@ -307,20 +346,28 @@ void loop()
if (wifiSetupConnect)
{
// try to connect for setup wizard
WifiConnect(1);
WiFiConnectRelaxed();
wifiSetupConnect = false;
}
if (wifiStatus != ESPEASY_WIFI_SERVICES_INITIALIZED) {
if (wifiStatus >= ESPEASY_WIFI_CONNECTED) processConnect();
if (wifiStatus >= ESPEASY_WIFI_GOT_IP) processGotIP();
if (wifiStatus == ESPEASY_WIFI_DISCONNECTED) processDisconnect();
} else if (WiFi.status() != WL_CONNECTED) {
// Somehow the WiFi has entered a limbo state.
resetWiFi();
}
// Deep sleep mode, just run all tasks one time and go back to sleep as fast as possible
if (firstLoop && isDeepSleepEnabled())
bool firstLoopWiFiConnected = wifiStatus == ESPEASY_WIFI_SERVICES_INITIALIZED && firstLoop;
if (firstLoopWiFiConnected) {
firstLoop = false;
timerAwakeFromDeepSleep = millis(); // Allow to run for "awake" number of seconds, now we have wifi.
}
// Deep sleep mode, just run all tasks one (more) time and go back to sleep as fast as possible
if ((firstLoopWiFiConnected || readyForSleep()) && isDeepSleepEnabled())
{
// Setup MQTT Client
// Controller index is forced to the first enabled MQTT controller.
// This is normally done via frequent checks, but there's no time for in deepsleep.
int enabledMqttController = firstEnabledMQTTController();
if (enabledMqttController >= 0) {
MQTTConnect(enabledMqttController);
}
runPeriodicalMQTT();
// Now run all frequent tasks
run50TimesPerSecond();
run10TimesPerSecond();
@@ -335,7 +382,8 @@ void loop()
run50TimesPerSecond();
if (timeOutReached(timer100ms))
run10TimesPerSecond();
if(!UseRTOSMultitasking)
run10TimesPerSecond();
if (timeOutReached(timerwd))
runEach30Seconds();
@@ -344,21 +392,7 @@ void loop()
runOncePerSecond();
if (timeOutReached(timermqtt)) {
// MQTT_KEEPALIVE = 15 seconds.
timermqtt = millis() + timermqtt_interval;
//dont do this in backgroundtasks(), otherwise causes crashes. (https://github.com/letscontrolit/ESPEasy/issues/683)
int enabledMqttController = firstEnabledMQTTController();
if (enabledMqttController >= 0) {
if (!MQTTclient.loop()) {
if (!MQTTCheck(enabledMqttController)) {
// Check failed, no need to retry it immediately.
if (timermqtt_interval < 2000)
timermqtt_interval += 250;
} else {
timermqtt_interval = 250;
}
}
}
runPeriodicalMQTT();
}
}
@@ -370,14 +404,58 @@ void loop()
String event = F("System#Sleep");
rulesProcessing(event);
}
// Flush outstanding MQTT messages
runPeriodicalMQTT();
deepSleep(Settings.Delay);
//deepsleep will never return, its a special kind of reboot
}
firstLoop = false;
}
void runPeriodicalMQTT() {
// MQTT_KEEPALIVE = 15 seconds.
if (!WiFiConnected(10)) {
updateMQTTclient_connected();
return;
}
//dont do this in backgroundtasks(), otherwise causes crashes. (https://github.com/letscontrolit/ESPEasy/issues/683)
int enabledMqttController = firstEnabledMQTTController();
if (enabledMqttController >= 0) {
if (!MQTTclient.loop()) {
updateMQTTclient_connected();
if (MQTTCheck(enabledMqttController)) {
updateMQTTclient_connected();
}
}
} else {
if (MQTTclient.connected()) {
MQTTclient.disconnect();
updateMQTTclient_connected();
}
}
}
void updateMQTTclient_connected() {
if (MQTTclient_connected != MQTTclient.connected()) {
MQTTclient_connected = !MQTTclient_connected;
if (!MQTTclient_connected)
addLog(LOG_LEVEL_ERROR, F("MQTT : Connection lost"));
if (Settings.UseRules) {
String event = MQTTclient_connected ? F("MQTT#Connected") : F("MQTT#Disconnected");
rulesProcessing(event);
}
}
if (!MQTTclient_connected) {
if (timermqtt_interval < 2000) {
timermqtt_interval += 250;
}
} else {
timermqtt_interval = 250;
}
timermqtt = millis() + timermqtt_interval;
}
/*********************************************************************************************\
* Tasks that run 50 times per second
\*********************************************************************************************/
@@ -405,7 +483,9 @@ void run10TimesPerSecond()
eventBuffer = "";
}
elapsed = micros() - start;
WebServer.handleClient();
#ifndef USE_RTOS_MULTITASKING
WebServer.handleClient();
#endif
}
@@ -510,11 +590,14 @@ void runEach30Seconds()
checkRAMtoLog();
wdcounter++;
timerwd = millis() + 30000;
char str[60];
str[0] = 0;
sprintf_P(str, PSTR("Uptime %u ConnectFailures %u FreeMem %u"), wdcounter / 2, connectionFailures, FreeMem());
String log = F("WD : ");
log += str;
String log;
log.reserve(60);
log = F("WD : Uptime ");
log += wdcounter / 2;
log += F(" ConnectFailures ");
log += connectionFailures;
log += F(" FreeMem ");
log += FreeMem();
addLog(LOG_LEVEL_INFO, log);
sendSysInfoUDP(1);
refreshNodeList();
@@ -741,19 +824,19 @@ void backgroundtasks()
tcpCleanup();
#endif
if (Settings.UseSerial)
if (Serial.available())
if (!PluginCall(PLUGIN_SERIAL_IN, 0, dummyString))
serial();
if(!UseRTOSMultitasking){
if (Settings.UseSerial)
if (Serial.available())
if (!PluginCall(PLUGIN_SERIAL_IN, 0, dummyString))
serial();
WebServer.handleClient();
checkUDP();
}
// process DNS, only used if the ESP has no valid WiFi config
if (wifiSetup)
dnsServer.processNextRequest();
WebServer.handleClient();
checkUDP();
#ifdef FEATURE_ARDUINO_OTA
if(Settings.ArduinoOTAEnable)
ArduinoOTA.handle();
+1
View File
@@ -64,6 +64,7 @@ void setTimeZone(const TimeChangeRule& dstStart, const TimeChangeRule& stdStart,
uint32_t calcTimeChangeForRule(const TimeChangeRule& r, int yr);
String getTimeString(char delimiter, bool show_seconds=true);
String getTimeString_ampm(char delimiter, bool show_seconds=true);
long timeDiff(unsigned long prev, unsigned long next);
#endif /* ESPEASY_TIMETYPES_H_ */
+68
View File
@@ -0,0 +1,68 @@
//********************************************************************************
// Functions called on events.
// Make sure not to call anything in these functions that result in delay() or yield()
//********************************************************************************
#ifdef ESP32
void WiFiEvent(system_event_id_t event, system_event_info_t info) {
switch(event) {
case SYSTEM_EVENT_STA_CONNECTED:
lastConnectMoment = millis();
processedConnect = false;
wifiStatus = ESPEASY_WIFI_CONNECTED;
break;
case SYSTEM_EVENT_STA_DISCONNECTED:
lastDisconnectMoment = millis();
if (timeDiff(lastConnectMoment, last_wifi_connect_attempt_moment) > 0) {
// There was an unsuccessful connection attempt
lastConnectedDuration = timeDiff(last_wifi_connect_attempt_moment, lastDisconnectMoment);
} else {
lastConnectedDuration = timeDiff(lastConnectMoment, lastDisconnectMoment);
}
processedDisconnect = false;
lastDisconnectReason = static_cast<WiFiDisconnectReason>(info.disconnected.reason);
wifiStatus = ESPEASY_WIFI_DISCONNECTED;
break;
case SYSTEM_EVENT_STA_GOT_IP:
lastGetIPmoment = millis();
wifiStatus = ESPEASY_WIFI_GOT_IP;
processedGetIP = false;
break;
default:
break;
}
}
#else
void onConnected(const WiFiEventStationModeConnected& event){
lastConnectMoment = millis();
processedConnect = false;
wifiStatus = ESPEASY_WIFI_CONNECTED;
last_channel = event.channel;
last_ssid = event.ssid;
bssid_changed = false;
for (byte i=0; i < 6; ++i) {
if (lastBSSID[i] != event.bssid[i]) {
bssid_changed = true;
lastBSSID[i] = event.bssid[i];
}
}
}
void onDisconnect(const WiFiEventStationModeDisconnected& event){
lastDisconnectMoment = millis();
if (timeDiff(lastConnectMoment, last_wifi_connect_attempt_moment) > 0) {
// There was an unsuccessful connection attempt
lastConnectedDuration = timeDiff(last_wifi_connect_attempt_moment, lastDisconnectMoment);
} else
lastConnectedDuration = timeDiff(lastConnectMoment, lastDisconnectMoment);
processedDisconnect = false;
lastDisconnectReason = event.reason;
wifiStatus = ESPEASY_WIFI_DISCONNECTED;
}
void onGotIP(const WiFiEventStationModeGotIP& event){
lastGetIPmoment = millis();
wifiStatus = ESPEASY_WIFI_GOT_IP;
processedGetIP = false;
}
#endif
+227 -179
View File
@@ -1,10 +1,152 @@
//********************************************************************************
// Functions to process the data gathered from the events.
// These functions are called from Setup() or Loop() and thus may call delay() or yield()
//********************************************************************************
void processConnect() {
if (processedConnect) return;
if (wifiStatus < ESPEASY_WIFI_CONNECTED) return;
String log = F("WIFI : Connected! AP: ");
log += WiFi.SSID();
log += F(" (");
log += WiFi.BSSIDstr();
log += F(") Ch: ");
log += last_channel;
const long connect_duration = timeDiff(last_wifi_connect_attempt_moment, lastConnectMoment);
if (connect_duration > 0 && connect_duration < 30000) {
// Just log times when they make sense.
log += F(" Duration: ");
log += connect_duration;
log += F(" ms");
}
addLog(LOG_LEVEL_INFO, log);
if (Settings.UseRules && bssid_changed) {
String event = F("WiFi#ChangedAccesspoint");
rulesProcessing(event);
}
wifi_connect_attempt = 0;
processedConnect = true;
}
void processDisconnect() {
if (processedDisconnect) return;
if (Settings.UseRules) {
String event = F("WiFi#Disconnected");
rulesProcessing(event);
}
String log = F("WIFI : Disconnected! Reason: '");
log += getLastDisconnectReason();
log += F("'");
if (lastConnectedDuration > 0) {
log += F(" Connected for ");
log += format_msec_duration(lastConnectedDuration);
}
addLog(LOG_LEVEL_INFO, log);
processedDisconnect = true;
if (Settings.deepSleep && Settings.deepSleepOnFail) {
//only one attempt in deepsleep, to conserve battery
addLog(LOG_LEVEL_ERROR, F("SLEEP: Connection failed, going back to sleep."));
deepSleep(Settings.Delay);
}
if (!intent_to_reboot)
WiFiConnectRelaxed();
}
void processGotIP() {
if (processedGetIP)
return;
if (wifiStatus < ESPEASY_WIFI_GOT_IP)
return;
IPAddress ip = WiFi.localIP();
const IPAddress gw = WiFi.gatewayIP();
const IPAddress subnet = WiFi.subnetMask();
String log = F("WIFI : ");
if (useStaticIP()) {
log += F("Static IP: ");
} else {
log += F("DHCP IP: ");
}
log += formatIP(ip);
log += F(" (");
log += WifiGetHostname();
log += F(") GW: ");
log += formatIP(gw);
log += F(" SN: ");
log += formatIP(subnet);
const long dhcp_duration = timeDiff(lastConnectMoment, lastGetIPmoment);
if (dhcp_duration > 0 && dhcp_duration < 30000) {
// Just log times when they make sense.
log += F(" duration: ");
log += dhcp_duration;
log += F(" ms");
}
addLog(LOG_LEVEL_INFO, log);
// fix octet?
if (Settings.IP_Octet != 0 && Settings.IP_Octet != 255)
{
ip[3] = Settings.IP_Octet;
log = F("IP : Fixed IP octet:");
log += formatIP(ip);
addLog(LOG_LEVEL_INFO, log);
WiFi.config(ip, gw, subnet);
}
#ifdef FEATURE_MDNS
log = F("WIFI : ");
if (MDNS.begin(WifiGetHostname().c_str(), WiFi.localIP())) {
log += F("mDNS started, with name: ");
log += WifiGetHostname();
log += F(".local");
}
else{
log += F("mDNS failed");
}
addLog(LOG_LEVEL_INFO, log);
#endif
// First try to get the time, since that may be used in logs
if (Settings.UseNTP) {
initTime();
}
timermqtt_interval = 100;
timermqtt = millis() + timermqtt_interval;
if (Settings.UseRules)
{
String event = F("WiFi#Connected");
rulesProcessing(event);
}
statusLED(true);
wifiStatus = ESPEASY_WIFI_SERVICES_INITIALIZED;
processedGetIP = true;
}
void resetWiFi() {
WiFiMode_t currentMode = WiFi.getMode();
WiFi.mode(WIFI_OFF);
WiFi.mode(currentMode);
lastDisconnectMoment = millis();
processedDisconnect = false;
wifiStatus = ESPEASY_WIFI_DISCONNECTED;
}
//********************************************************************************
// Determine Wifi AP name to set. (also used for mDNS)
//********************************************************************************
String WifiGetAPssid()
{
String ssid(Settings.Name);
ssid+=F("_");
ssid+=F("-");
ssid+=Settings.Unit;
return (ssid);
}
@@ -16,6 +158,7 @@ String WifiGetHostname()
{
String hostname(WifiGetAPssid());
hostname.replace(F(" "), F("-"));
hostname.replace(F("_"), F("-")); // See RFC952
return (hostname);
}
@@ -27,7 +170,10 @@ void WifiAPconfig()
{
// create and store unique AP SSID/PW to prevent ESP from starting AP mode with default SSID and No password!
// setup ssid for AP Mode when needed
WiFi.softAP(WifiGetAPssid().c_str(), SecuritySettings.WifiAPKey);
String softAPSSID=WifiGetAPssid();
String pwd = SecuritySettings.WifiAPKey;
WiFi.softAP(softAPSSID.c_str(),pwd.c_str());
// We start in STA mode
WifiAPMode(false);
@@ -37,8 +183,6 @@ void WifiAPconfig()
log=log+F(" with address ");
log=log+apIP.toString();
addLog(LOG_LEVEL_INFO, log);
}
@@ -78,11 +222,17 @@ void WifiAPMode(boolean state)
}
}
bool useStaticIP() {
return (Settings.IP[0] != 0 && Settings.IP[0] != 255);
}
//********************************************************************************
// Set Wifi config
//********************************************************************************
void prepareWiFi() {
bool prepareWiFi() {
if (!selectValidWiFiSettings())
return false;
String log = "";
char hostname[40];
strncpy(hostname, WifiGetHostname().c_str(), sizeof(hostname));
@@ -94,7 +244,7 @@ void prepareWiFi() {
#endif
//use static ip?
if (Settings.IP[0] != 0 && Settings.IP[0] != 255)
if (useStaticIP())
{
const IPAddress ip = Settings.IP;
log = F("IP : Static IP :");
@@ -105,44 +255,18 @@ void prepareWiFi() {
const IPAddress dns = Settings.DNS;
WiFi.config(ip, gw, subnet, dns);
}
}
//********************************************************************************
// Configure network and connect to Wifi SSID and SSID2
//********************************************************************************
boolean WifiConnect(byte connectAttempts)
{
prepareWiFi();
if (anyValidWifiSettings()) {
//try to connect to one of the access points
bool connected = WifiConnectAndWait(connectAttempts);
if (!connected) {
if (selectNextWiFiSettings()) {
connected = WifiConnectAndWait(connectAttempts);
}
}
if (connected) {
return(true);
}
}
addLog(LOG_LEVEL_ERROR, F("WIFI : Could not connect to AP!"));
//everything failed, activate AP mode (will deactivate automatically after a while if its connected again)
WifiAPMode(true);
return(false);
return true;
}
//********************************************************************************
// Start connect to WiFi and check later to see if connected.
//********************************************************************************
void WiFiConnectRelaxed() {
prepareWiFi();
wifiConnected = false;
wifi_connect_attempt = 0;
if (anyValidWifiSettings()) {
if (prepareWiFi()) {
tryConnectWiFi();
return;
}
addLog(LOG_LEVEL_ERROR, F("WIFI : Could not connect to AP!"));
addLog(LOG_LEVEL_ERROR, F("WIFI : Could not connect to AP! (relaxed connect mode)"));
//everything failed, activate AP mode (will deactivate automatically after a while if its connected again)
WifiAPMode(true);
}
@@ -159,50 +283,68 @@ const char* getLastWiFiSettingsPassphrase() {
return lastWiFiSettings == 0 ? SecuritySettings.WifiKey : SecuritySettings.WifiKey2;
}
bool anyValidWifiSettings() {
if (wifiSettingsValid(SecuritySettings.WifiSSID, SecuritySettings.WifiKey))
return true;
if (wifiSettingsValid(SecuritySettings.WifiSSID2, SecuritySettings.WifiKey2))
return true;
return false;
}
bool selectNextWiFiSettings() {
uint8_t tmp = lastWiFiSettings;
lastWiFiSettings = (lastWiFiSettings + 1) % 2;
if (!wifiSettingsValid(getLastWiFiSettingsSSID(), getLastWiFiSettingsPassphrase())) {
// other settings are not correct, switch back.
lastWiFiSettings = (lastWiFiSettings + 1) % 2;
lastWiFiSettings = tmp;
return false; // Nothing changed.
}
return true;
}
bool selectValidWiFiSettings() {
if (wifiSettingsValid(getLastWiFiSettingsSSID(), getLastWiFiSettingsPassphrase()))
return true;
return selectNextWiFiSettings();
}
bool wifiSettingsValid(const char* ssid, const char* pass) {
if (ssid[0] == 0 || (strcasecmp(ssid, "ssid") == 0)) {
return false;
}
if (pass[0] == 0) return false;
if (strlen(ssid) > 32) return false;
if (strlen(pass) > 64) return false;
return true;
}
bool wifiConnectTimeoutReached() {
if (wifi_connect_attempt == 0) return true;
if (timeDiff(last_wifi_connect_attempt_moment, lastDisconnectMoment) >0 ) {
// Connection attempt was already ended.
return true;
}
if (wifiSetupConnect) {
// Initial setup of WiFi, may take much longer since accesspoint is still active.
return timeOutReached(last_wifi_connect_attempt_moment + 20000);
}
// wait until it connects + add some device specific random offset to prevent
// all nodes overloading the accesspoint when turning on at the same time.
#if defined(ESP8266)
const unsigned int randomOffset_in_sec = wifi_connect_attempt == 1 ? 0 : 1000 * ((ESP.getChipId() & 0xF));
return timeOutReached(wifi_connect_timer + 7000 + randomOffset_in_sec);
#endif
#if defined(ESP32)
const unsigned int randomOffset_in_sec = wifi_connect_attempt == 1 ? 0 : 1000 * ((ESP.getEfuseMac() & 0xF));
#endif
return timeOutReached(last_wifi_connect_attempt_moment + DEFAULT_WIFI_CONNECTION_TIMEOUT + randomOffset_in_sec);
}
//********************************************************************************
// Simply start the WiFi connection sequence
//********************************************************************************
bool tryConnectWiFi() {
if (wifiSetup)
if (wifiSetup && !wifiSetupConnect)
return false;
if (WiFi.status() == WL_CONNECTED)
if (wifiStatus != ESPEASY_WIFI_DISCONNECTED)
return(true); //already connected, need to disconnect first
if (!wifiConnectTimeoutReached())
return true; // timeout not reached yet, thus no need to retry again.
if (!selectValidWiFiSettings()) {
addLog(LOG_LEVEL_ERROR, F("WIFI : No valid WiFi settings!"));
return false;
}
if (wifi_connect_attempt != 0 && ((wifi_connect_attempt % 3) == 0)) {
// Change to other wifi settings.
@@ -221,7 +363,7 @@ bool tryConnectWiFi() {
log += wifi_connect_attempt;
addLog(LOG_LEVEL_INFO, log);
wifi_connect_timer = millis();
last_wifi_connect_attempt_moment = millis();
switch (wifi_connect_attempt) {
case 0:
if (lastBSSID[0] == 0)
@@ -246,132 +388,18 @@ bool tryConnectWiFi() {
addLog(LOG_LEVEL_INFO, log);
return false;
}
case WL_CONNECTED:
checkWifiJustConnected();
break;
default:
break;
}
return true; // Sent
}
//********************************************************************************
// Connect to Wifi specific SSID
//********************************************************************************
boolean WifiConnectAndWait(byte connectAttempts)
{
String log;
wifiConnected = false;
wifi_connect_attempt = 0;
for (byte tryConnect = 0; tryConnect < connectAttempts; tryConnect++)
{
if (tryConnectWiFi()) {
do {
if (checkWifiJustConnected())
return true;
delay(50);
} while (!wifiConnectTimeoutReached());
}
// log = F("WIFI : Disconnecting!");
// addLog(LOG_LEVEL_INFO, log);
#if defined(ESP8266)
ETS_UART_INTR_DISABLE();
wifi_station_disconnect();
ETS_UART_INTR_ENABLE();
#endif
for (byte x = 0; x < 20; x++)
{
statusLED(true);
delay(50);
}
}
return false;
}
bool checkWifiJustConnected() {
if (wifiConnected) return true;
if (WiFi.status() != WL_CONNECTED) {
statusLED(false);
delay(1);
return false;
}
wifiConnected = true;
String log = F("WIFI : WiFi connect attempt took: ");
log += timePassedSince(wifi_connect_timer);
log += F(" ms");
addLog(LOG_LEVEL_INFO, log);
// fix octet?
if (Settings.IP_Octet != 0 && Settings.IP_Octet != 255)
{
IPAddress ip = WiFi.localIP();
IPAddress gw = WiFi.gatewayIP();
IPAddress subnet = WiFi.subnetMask();
ip[3] = Settings.IP_Octet;
log = F("IP : Fixed IP octet:");
log += ip;
addLog(LOG_LEVEL_INFO, log);
WiFi.config(ip, gw, subnet);
}
#ifdef FEATURE_MDNS
String log = F("WIFI : ");
if (MDNS.begin(WifiGetHostname().c_str(), WiFi.localIP())) {
log += F("mDNS started, with name: ");
log += WifiGetHostname();
log += F(".local");
}
else{
log += F("mDNS failed");
}
addLog(LOG_LEVEL_INFO, log);
#endif
// First try to get the time, since that may be used in logs
if (Settings.UseNTP) {
initTime();
}
uint8_t* curBSSID = WiFi.BSSID();
bool changed = false;
for (byte i=0; i < 6; ++i) {
if (lastBSSID[i] != *(curBSSID + i)) {
changed = true;
lastBSSID[i] = *(curBSSID + i);
}
}
if (Settings.UseRules)
{
if (changed) {
String event = F("WiFi#ChangedAccesspoint");
rulesProcessing(event);
}
String event = F("WiFi#Connected");
rulesProcessing(event);
}
log = F("WIFI : Connected! IP: ");
log += formatIP(WiFi.localIP());
log += F(" (");
log += WifiGetHostname();
log += F(") AP: ");
log += WiFi.SSID();
log += F(" AP BSSID: ");
log += WiFi.BSSIDstr();
addLog(LOG_LEVEL_INFO, log);
statusLED(true);
return true;
}
//********************************************************************************
// Disconnect from Wifi AP
//********************************************************************************
void WifiDisconnect()
{
WiFi.disconnect();
wifiConnected = false;
}
@@ -416,20 +444,10 @@ void WifiCheck()
if(wifiSetup)
return;
if (WiFi.status() != WL_CONNECTED)
if (wifiStatus == ESPEASY_WIFI_DISCONNECTED)
{
NC_Count++;
//give it time to automatically reconnect
if (NC_Count > 2)
{
if (wifiConnected) {
wifi_connect_attempt = 0;
wifiConnected = false;
WiFiConnectRelaxed();
}
C_Count=0;
NC_Count = 0;
}
WiFiConnectRelaxed();
}
//connected
else
@@ -441,10 +459,6 @@ void WifiCheck()
WifiAPMode(false);
}
}
if (!wifiConnected) {
if (tryConnectWiFi())
checkWifiJustConnected();
}
}
//********************************************************************************
@@ -456,7 +470,7 @@ bool getSubnetRange(IPAddress& low, IPAddress& high)
// WiFi is active as accesspoint, do not check.
return false;
}
if (WiFi.status() != WL_CONNECTED) {
if (wifiStatus < ESPEASY_WIFI_GOT_IP) {
return false;
}
const IPAddress ip = WiFi.localIP();
@@ -472,3 +486,37 @@ bool getSubnetRange(IPAddress& low, IPAddress& high)
}
return true;
}
String getLastDisconnectReason() {
switch (lastDisconnectReason) {
case WIFI_DISCONNECT_REASON_UNSPECIFIED: return F("Unspecified");
case WIFI_DISCONNECT_REASON_AUTH_EXPIRE: return F("Auth expire");
case WIFI_DISCONNECT_REASON_AUTH_LEAVE: return F("Auth leave");
case WIFI_DISCONNECT_REASON_ASSOC_EXPIRE: return F("Assoc expire");
case WIFI_DISCONNECT_REASON_ASSOC_TOOMANY: return F("Assoc toomany");
case WIFI_DISCONNECT_REASON_NOT_AUTHED: return F("Not authed");
case WIFI_DISCONNECT_REASON_NOT_ASSOCED: return F("Not assoced");
case WIFI_DISCONNECT_REASON_ASSOC_LEAVE: return F("Assoc leave");
case WIFI_DISCONNECT_REASON_ASSOC_NOT_AUTHED: return F("Assoc not authed");
case WIFI_DISCONNECT_REASON_DISASSOC_PWRCAP_BAD: return F("Disassoc pwrcap bad");
case WIFI_DISCONNECT_REASON_DISASSOC_SUPCHAN_BAD: return F("Disassoc supchan bad");
case WIFI_DISCONNECT_REASON_IE_INVALID: return F("IE invalid");
case WIFI_DISCONNECT_REASON_MIC_FAILURE: return F("Mic failure");
case WIFI_DISCONNECT_REASON_4WAY_HANDSHAKE_TIMEOUT: return F("4way handshake timeout");
case WIFI_DISCONNECT_REASON_GROUP_KEY_UPDATE_TIMEOUT: return F("Group key update timeout");
case WIFI_DISCONNECT_REASON_IE_IN_4WAY_DIFFERS: return F("IE in 4way differs");
case WIFI_DISCONNECT_REASON_GROUP_CIPHER_INVALID: return F("Group cipher invalid");
case WIFI_DISCONNECT_REASON_PAIRWISE_CIPHER_INVALID: return F("Pairwise cipher invalid");
case WIFI_DISCONNECT_REASON_AKMP_INVALID: return F("AKMP invalid");
case WIFI_DISCONNECT_REASON_UNSUPP_RSN_IE_VERSION: return F("Unsupp RSN IE version");
case WIFI_DISCONNECT_REASON_INVALID_RSN_IE_CAP: return F("Invalid RSN IE cap");
case WIFI_DISCONNECT_REASON_802_1X_AUTH_FAILED: return F("802 1X auth failed");
case WIFI_DISCONNECT_REASON_CIPHER_SUITE_REJECTED: return F("Cipher suite rejected");
case WIFI_DISCONNECT_REASON_BEACON_TIMEOUT: return F("Beacon timeout");
case WIFI_DISCONNECT_REASON_NO_AP_FOUND: return F("No AP found");
case WIFI_DISCONNECT_REASON_AUTH_FAIL: return F("Auth fail");
case WIFI_DISCONNECT_REASON_ASSOC_FAIL: return F("Assoc fail");
case WIFI_DISCONNECT_REASON_HANDSHAKE_TIMEOUT: return F("Handshake timeout");
}
return F("Unknown");
}
+98 -99
View File
@@ -44,6 +44,10 @@ bool readyForSleep()
{
if (!isDeepSleepEnabled())
return false;
if (wifiStatus != ESPEASY_WIFI_SERVICES_INITIALIZED) {
// Allow 6 seconds to connect to WiFi
return timeOutReached(timerAwakeFromDeepSleep + 6000);
}
return timeOutReached(timerAwakeFromDeepSleep + 1000 * Settings.deepSleep);
}
@@ -317,7 +321,7 @@ void statusLED(boolean traffic)
else
{
if (WiFi.status() == WL_CONNECTED)
if (wifiStatus == ESPEASY_WIFI_SERVICES_INITIALIZED)
{
long int delta = timePassedSince(gnLastUpdate);
if (delta>0 || delta<0 )
@@ -1163,6 +1167,7 @@ void ResetFactory(void)
//NOTE: this is a known ESP8266 bug, not our fault. :)
delay(1000);
WiFi.persistent(true); // use SDK storage of SSID/WPA parameters
intent_to_reboot = true;
WiFi.disconnect(); // this will store empty ssid/wpa into sdk storage
WiFi.persistent(false); // Do not use SDK storage of SSID/WPA parameters
#if defined(ESP8266)
@@ -1383,7 +1388,9 @@ void delayedReboot(int rebootDelay)
\*********************************************************************************************/
boolean saveToRTC()
{
#if defined(ESP8266)
#if defined(ESP32)
return false;
#else
if (!system_rtc_mem_write(RTC_BASE_STRUCT, (byte*)&RTC, sizeof(RTC)) || !readFromRTC())
{
addLog(LOG_LEVEL_ERROR, F("RTC : Error while writing to RTC"));
@@ -1394,9 +1401,6 @@ boolean saveToRTC()
return(true);
}
#endif
#if defined(ESP32)
boolean ret = false;
#endif
}
@@ -1419,17 +1423,12 @@ void initRTC()
\*********************************************************************************************/
boolean readFromRTC()
{
#if defined(ESP8266)
#if defined(ESP32)
return false;
#else
if (!system_rtc_mem_read(RTC_BASE_STRUCT, (byte*)&RTC, sizeof(RTC)))
return(false);
if (RTC.ID1 == 0xAA && RTC.ID2 == 0x55)
return true;
else
return false;
#endif
#if defined(ESP32)
boolean ret = false;
return (RTC.ID1 == 0xAA && RTC.ID2 == 0x55);
#endif
}
@@ -1439,18 +1438,17 @@ boolean readFromRTC()
\*********************************************************************************************/
boolean saveUserVarToRTC()
{
#if defined(ESP8266)
#if defined(ESP32)
return false;
#else
//addLog(LOG_LEVEL_DEBUG, F("RTCMEM: saveUserVarToRTC"));
byte* buffer = (byte*)&UserVar;
size_t size = sizeof(UserVar);
uint32_t sum = getChecksum(buffer, size);
boolean ret = system_rtc_mem_write(RTC_BASE_USERVAR, buffer, size);
ret &= system_rtc_mem_write(RTC_BASE_USERVAR+(size>>2), (byte*)&sum, 4);
return ret;
#endif
#if defined(ESP32)
boolean ret = false;
#endif
return ret;
}
@@ -1459,7 +1457,9 @@ boolean saveUserVarToRTC()
\*********************************************************************************************/
boolean readUserVarFromRTC()
{
#if defined(ESP8266)
#if defined(ESP32)
return false;
#else
//addLog(LOG_LEVEL_DEBUG, F("RTCMEM: readUserVarFromRTC"));
byte* buffer = (byte*)&UserVar;
size_t size = sizeof(UserVar);
@@ -1472,11 +1472,8 @@ boolean readUserVarFromRTC()
addLog(LOG_LEVEL_ERROR, F("RTC : Checksum error on reading RTC user var"));
memset(buffer, 0, size);
}
return ret;
#endif
#if defined(ESP32)
boolean ret = false;
#endif
return ret;
}
@@ -1513,87 +1510,89 @@ String parseTemplate(String &tmpString, byte lineSize)
newString += tmpString.substring(0, leftBracketIndex);
tmpString = tmpString.substring(leftBracketIndex + 1);
int rightBracketIndex = tmpString.indexOf(']');
if (rightBracketIndex)
if (rightBracketIndex >= 0)
{
tmpStringMid = tmpString.substring(0, rightBracketIndex);
tmpString = tmpString.substring(rightBracketIndex + 1);
int hashtagIndex = tmpStringMid.indexOf('#');
String deviceName = tmpStringMid.substring(0, hashtagIndex);
String valueName = tmpStringMid.substring(hashtagIndex + 1);
String valueFormat = "";
hashtagIndex = valueName.indexOf('#');
if (hashtagIndex >= 0)
{
valueFormat = valueName.substring(hashtagIndex + 1);
valueName = valueName.substring(0, hashtagIndex);
}
if (deviceName.equalsIgnoreCase("Plugin"))
{
String tmpString = tmpStringMid.substring(7);
tmpString.replace("#", ",");
if (PluginCall(PLUGIN_REQUEST, 0, tmpString))
newString += tmpString;
}
else
for (byte y = 0; y < TASKS_MAX; y++)
if (hashtagIndex >= 0) {
String deviceName = tmpStringMid.substring(0, hashtagIndex);
String valueName = tmpStringMid.substring(hashtagIndex + 1);
String valueFormat = "";
hashtagIndex = valueName.indexOf('#');
if (hashtagIndex >= 0)
{
if (Settings.TaskDeviceEnabled[y])
valueFormat = valueName.substring(hashtagIndex + 1);
valueName = valueName.substring(0, hashtagIndex);
}
if (deviceName.equalsIgnoreCase("Plugin"))
{
String tmpString = tmpStringMid.substring(7);
tmpString.replace("#", ",");
if (PluginCall(PLUGIN_REQUEST, 0, tmpString))
newString += tmpString;
}
else
for (byte y = 0; y < TASKS_MAX; y++)
{
LoadTaskSettings(y);
if (ExtraTaskSettings.TaskDeviceName[0] != 0)
if (Settings.TaskDeviceEnabled[y])
{
if (deviceName.equalsIgnoreCase(ExtraTaskSettings.TaskDeviceName))
LoadTaskSettings(y);
if (ExtraTaskSettings.TaskDeviceName[0] != 0)
{
boolean match = false;
for (byte z = 0; z < VARS_PER_TASK; z++)
if (valueName.equalsIgnoreCase(ExtraTaskSettings.TaskDeviceValueNames[z]))
{
// here we know the task and value, so find the uservar
match = true;
String value = "";
byte DeviceIndex = getDeviceIndex(Settings.TaskDeviceNumber[y]);
if (Device[DeviceIndex].VType == SENSOR_TYPE_LONG)
value = (unsigned long)UserVar[y * VARS_PER_TASK + z] + ((unsigned long)UserVar[y * VARS_PER_TASK + z + 1] << 16);
else
value = toString(UserVar[y * VARS_PER_TASK + z], ExtraTaskSettings.TaskDeviceValueDecimals[z]);
int oidx;
if ((oidx = valueFormat.indexOf('O')) >= 0) // Output
{
valueFormat.remove(oidx);
oidx = valueFormat.indexOf('!'); // inverted or active low
float val = value.toFloat();
if (oidx >= 0) {
valueFormat.remove(oidx);
value = val == 0 ? " ON" : "OFF";
} else {
value = val == 0 ? "OFF" : " ON";
}
}
if (valueFormat == "R")
{
int filler = lineSize - newString.length() - value.length() - tmpString.length() ;
for (byte f = 0; f < filler; f++)
newString += " ";
}
newString += String(value);
break;
}
if (!match) // try if this is a get config request
if (deviceName.equalsIgnoreCase(ExtraTaskSettings.TaskDeviceName))
{
struct EventStruct TempEvent;
TempEvent.TaskIndex = y;
String tmpName = valueName;
if (PluginCall(PLUGIN_GET_CONFIG, &TempEvent, tmpName))
newString += tmpName;
boolean match = false;
for (byte z = 0; z < VARS_PER_TASK; z++)
if (valueName.equalsIgnoreCase(ExtraTaskSettings.TaskDeviceValueNames[z]))
{
// here we know the task and value, so find the uservar
match = true;
String value = "";
byte DeviceIndex = getDeviceIndex(Settings.TaskDeviceNumber[y]);
if (Device[DeviceIndex].VType == SENSOR_TYPE_LONG)
value = (unsigned long)UserVar[y * VARS_PER_TASK + z] + ((unsigned long)UserVar[y * VARS_PER_TASK + z + 1] << 16);
else
value = toString(UserVar[y * VARS_PER_TASK + z], ExtraTaskSettings.TaskDeviceValueDecimals[z]);
int oidx;
if ((oidx = valueFormat.indexOf('O')) >= 0) // Output
{
valueFormat.remove(oidx);
oidx = valueFormat.indexOf('!'); // inverted or active low
float val = value.toFloat();
if (oidx >= 0) {
valueFormat.remove(oidx);
value = val == 0 ? " ON" : "OFF";
} else {
value = val == 0 ? "OFF" : " ON";
}
}
if (valueFormat == "R")
{
int filler = lineSize - newString.length() - value.length() - tmpString.length() ;
for (byte f = 0; f < filler; f++)
newString += " ";
}
newString += String(value);
break;
}
if (!match) // try if this is a get config request
{
struct EventStruct TempEvent;
TempEvent.TaskIndex = y;
String tmpName = valueName;
if (PluginCall(PLUGIN_GET_CONFIG, &TempEvent, tmpName))
newString += tmpName;
}
break;
}
break;
}
}
}
}
}
}
leftBracketIndex = tmpString.indexOf('[');
count++;
@@ -1615,7 +1614,6 @@ String parseTemplate(String &tmpString, byte lineSize)
return newString;
}
/********************************************************************************************\
Calculate function for simple expressions
\*********************************************************************************************/
@@ -1959,8 +1957,6 @@ String rulesProcessingFile(String fileName, String& event)
Serial.println(fileName);
Serial.println(F(" flags CMI parse output:"));
}
fs::File f = SPIFFS.open(fileName, "r+");
SPIFFS_CHECK(f, fileName.c_str());
static byte nestingLevel = 0;
int data = 0;
@@ -1975,6 +1971,9 @@ String rulesProcessingFile(String fileName, String& event)
return (log);
}
fs::File f = SPIFFS.open(fileName, "r+");
SPIFFS_CHECK(f, fileName.c_str());
String line = "";
boolean match = false;
boolean codeBlock = false;
@@ -2013,7 +2012,7 @@ String rulesProcessingFile(String fileName, String& event)
line = parseTemplate(line, line.length());
}
line.trim();
String lineOrg = line; // store original line for future use
line.toLowerCase(); // convert all to lower case to make checks easier
@@ -2060,9 +2059,9 @@ String rulesProcessingFile(String fileName, String& event)
{
isCommand = false;
codeBlock = false;
match = false;
match = false;
}
if (Settings.SerialLogLevel == LOG_LEVEL_DEBUG_DEV){
Serial.print(F("RuleDebug: "));
Serial.print(codeBlock);
@@ -2071,7 +2070,7 @@ String rulesProcessingFile(String fileName, String& event)
Serial.print(": ");
Serial.println(line);
}
if (match) // rule matched for one action or a block of actions
{
int split = lcAction.indexOf("if "); // check for optional "if" condition
+6 -8
View File
@@ -12,7 +12,7 @@
\*********************************************************************************************/
void syslog(const char *message)
{
if (Settings.Syslog_IP[0] != 0 && WiFi.status() == WL_CONNECTED)
if (Settings.Syslog_IP[0] != 0 && wifiStatus == ESPEASY_WIFI_SERVICES_INITIALIZED)
{
IPAddress broadcastIP(Settings.Syslog_IP[0], Settings.Syslog_IP[1], Settings.Syslog_IP[2], Settings.Syslog_IP[3]);
portUDP.beginPacket(broadcastIP, 514);
@@ -596,12 +596,10 @@ bool WiFiConnected(uint32_t timeout_ms) {
yield(); // Allow at least once time for backgroundtasks
min_delay = 10;
}
if (!wifiConnected) {
// Apparently something needs network, perform check to see if it is ready now.
if (tryConnectWiFi())
checkWifiJustConnected();
}
while (WiFi.status() != WL_CONNECTED) {
// Apparently something needs network, perform check to see if it is ready now.
// if (!tryConnectWiFi())
// return false;
while (wifiStatus != ESPEASY_WIFI_SERVICES_INITIALIZED) {
if (timeOutReached(timer)) {
return false;
}
@@ -624,7 +622,7 @@ bool hostReachable(const IPAddress& ip) {
--retry;
}
String log = F("Host unreachable: ");
log += ip;
log += formatIP(ip);
addLog(LOG_LEVEL_ERROR, log);
return false;
}
+3 -2
View File
@@ -278,8 +278,8 @@ void parseSystemVariables(String& s, boolean useURLencode)
repl(F("%CR%"), F("\r"), s, useURLencode);
repl(F("%LF%"), F("\n"), s, useURLencode);
SMART_REPL(F("%ip%"),WiFi.localIP().toString())
SMART_REPL(F("%rssi%"), String((WiFi.status() == WL_CONNECTED) ? WiFi.RSSI() : 0))
SMART_REPL(F("%ssid%"), (WiFi.status() == WL_CONNECTED) ? WiFi.SSID() : F("--"))
SMART_REPL(F("%rssi%"), String((wifiStatus == ESPEASY_WIFI_DISCONNECTED) ? 0 : WiFi.RSSI()))
SMART_REPL(F("%ssid%"), (wifiStatus == ESPEASY_WIFI_DISCONNECTED) ? F("--") : WiFi.SSID())
SMART_REPL(F("%unit%"), String(Settings.Unit))
SMART_REPL(F("%mac%"), String(WiFi.macAddress()))
#if defined(ESP8266)
@@ -311,6 +311,7 @@ void parseSystemVariables(String& s, boolean useURLencode)
SMART_REPL(F("%lcltime%"), getDateTimeString('-',':',' '))
SMART_REPL(F("%lcltime_am%"), getDateTimeString_ampm('-',':',' '))
SMART_REPL(F("%uptime%"), String(wdcounter / 2))
SMART_REPL(F("%unixtime%"), String(getUnixTime()))
repl(F("%tskname%"), ExtraTaskSettings.TaskDeviceName, s, useURLencode);
if (s.indexOf("%vname") != -1) {
+26 -12
View File
@@ -72,6 +72,7 @@ void breakTime(unsigned long timeInput, struct timeStruct &tm) {
void setTime(unsigned long t) {
sysTime = (uint32_t)t;
applyTimeZone(t);
nextSyncTime = (uint32_t)t + syncInterval;
prevMillis = millis(); // restart counting from now (thanks to Korman for this fix)
if (Settings.UseRules)
@@ -83,6 +84,10 @@ void setTime(unsigned long t) {
}
}
uint32_t getUnixTime() {
return sysTime;
}
unsigned long now() {
// calculate number of seconds passed since last call to now()
const long msec_passed = timePassedSince(prevMillis);
@@ -94,10 +99,6 @@ unsigned long now() {
unsigned long t = getNtpTime();
if (t != 0) {
setTime(t);
applyTimeZone(t);
} else {
// Unable to sync, retry again in a minute
nextSyncTime = sysTime + 60;
}
}
uint32_t localSystime = toLocal(sysTime);
@@ -197,19 +198,30 @@ void checkTime()
unsigned long getNtpTime()
{
if (!Settings.UseNTP || !WiFiConnected(100)) {
if (!Settings.UseNTP || !WiFiConnected(10)) {
return 0;
}
IPAddress timeServerIP;
const char* ntpServerName = "pool.ntp.org";
// Have to do a lookup eacht time, since the NTP pool always returns another IP
if (Settings.NTPHost[0] != 0)
String log = F("NTP : NTP send to ");
if (Settings.NTPHost[0] != 0) {
WiFi.hostByName(Settings.NTPHost, timeServerIP);
else
WiFi.hostByName(ntpServerName, timeServerIP);
log += Settings.NTPHost;
// When single set host fails, retry again in a minute
nextSyncTime = sysTime + 20;
}
else {
// Have to do a lookup eacht time, since the NTP pool always returns another IP
String ntpServerName = String(random(0, 3));
ntpServerName += F(".pool.ntp.org");
WiFi.hostByName(ntpServerName.c_str(), timeServerIP);
log += ntpServerName;
// When pool host fails, retry can be much sooner
nextSyncTime = sysTime + 5;
}
if (!hostReachable(timeServerIP))
if (!hostReachable(timeServerIP)) {
return 0;
}
WiFiUDP udp;
udp.begin(123);
@@ -217,8 +229,9 @@ unsigned long getNtpTime()
const int NTP_PACKET_SIZE = 48; // NTP time is in the first 48 bytes of message
byte packetBuffer[NTP_PACKET_SIZE]; //buffer to hold incoming & outgoing packets
String log = F("NTP : NTP send to ");
log += F(" (");
log += timeServerIP.toString();
log += F(")");
addLog(LOG_LEVEL_DEBUG_MORE, log);
while (udp.parsePacket() > 0) ; // discard any previously received packets
@@ -253,6 +266,7 @@ unsigned long getNtpTime()
addLog(LOG_LEVEL_DEBUG_MORE, log);
return secsSince1900 - 2208988800UL;
}
delay(10);
}
log = F("NTP : No reply");
addLog(LOG_LEVEL_DEBUG_MORE, log);
+94 -53
View File
@@ -856,7 +856,7 @@ void handle_root() {
TXBuffer += formatIP(ip);
TXBuffer += F("<TD><TD>Wifi RSSI:<TD>");
if (WiFi.status() == WL_CONNECTED)
if (wifiStatus == ESPEASY_WIFI_SERVICES_INITIALIZED)
{
TXBuffer += String(WiFi.RSSI());
TXBuffer += F(" dB");
@@ -3503,11 +3503,22 @@ void handle_json()
reply += F(",\n");
reply += to_json_object_value(F("Uptime"), String(wdcounter / 2));
reply += F(",\n");
if (wdcounter > 0)
{
reply += to_json_object_value(F("Load"), String( 100 - (100 * loopCounterLast / loopCounterMax) ));
reply += F(",\n");
reply += to_json_object_value(F("Load LC"), String( int(loopCounterLast / 30) ));
reply += F(",\n");
}
reply += to_json_object_value(F("Free RAM"), String(ESP.getFreeHeap()));
reply += F("\n},\n");
reply += F("\"WiFi\":{\n");
reply += to_json_object_value(F("Hostname"), WiFi.hostname());
#if defined(ESP8266)
reply += to_json_object_value(F("Hostname"), WiFi.hostname());
#endif
reply += F(",\n");
reply += to_json_object_value(F("IP"), WiFi.localIP().toString());
reply += F(",\n");
@@ -3525,6 +3536,14 @@ void handle_json()
reply += F(",\n");
reply += to_json_object_value(F("BSSID"), WiFi.BSSIDstr());
reply += F(",\n");
reply += to_json_object_value(F("Channel"), String(WiFi.channel()));
reply += F(",\n");
reply += to_json_object_value(F("Connected msec"), String(timeDiff(lastConnectMoment, millis())));
reply += F(",\n");
reply += to_json_object_value(F("Last Disconnect Reason"), String(lastDisconnectReason));
reply += F(",\n");
reply += to_json_object_value(F("Last Disconnect Reason str"), getLastDisconnectReason());
reply += F(",\n");
reply += to_json_object_value(F("RSSI"), String(WiFi.RSSI()));
reply += F("\n},\n");
}
@@ -3542,42 +3561,45 @@ void handle_json()
if (Settings.TaskDeviceNumber[TaskIndex])
lastActiveTaskIndex = TaskIndex;
if (taskNr == 0 )
reply += F("\"Sensors\":[\n");
for (byte TaskIndex = firstTaskIndex; TaskIndex <= lastTaskIndex; TaskIndex++)
{
if (Settings.TaskDeviceNumber[TaskIndex])
{
byte BaseVarIndex = TaskIndex * VARS_PER_TASK;
byte DeviceIndex = getDeviceIndex(Settings.TaskDeviceNumber[TaskIndex]);
LoadTaskSettings(TaskIndex);
reply += F("{\n");
reply += to_json_object_value(F("tasknr"), String(TaskIndex + 1));
reply += F(",\n");
reply += to_json_object_value(F("TaskName"), String(ExtraTaskSettings.TaskDeviceName));
reply += F(",\n");
reply += to_json_object_value(F("Type"), getPluginNameFromDeviceIndex(DeviceIndex));
if (Device[DeviceIndex].ValueCount != 0)
reply += F(",");
reply += F("\n");
for (byte x = 0; x < Device[DeviceIndex].ValueCount; x++)
if (taskNr == 0 )
reply += F("\"Sensors\":[\n");
for (byte TaskIndex = firstTaskIndex; TaskIndex <= lastTaskIndex; TaskIndex++)
{
reply += to_json_object_value(ExtraTaskSettings.TaskDeviceValueNames[x],
toString(UserVar[BaseVarIndex + x], ExtraTaskSettings.TaskDeviceValueDecimals[x]));
if (x < (Device[DeviceIndex].ValueCount - 1))
reply += F(",");
reply += F("\n");
if (Settings.TaskDeviceNumber[TaskIndex])
{
byte BaseVarIndex = TaskIndex * VARS_PER_TASK;
byte DeviceIndex = getDeviceIndex(Settings.TaskDeviceNumber[TaskIndex]);
LoadTaskSettings(TaskIndex);
reply += F("{\n");
reply += to_json_object_value(F("TaskNumber"), String(TaskIndex + 1));
reply += F(",\n");
reply += to_json_object_value(F("Type"), getPluginNameFromDeviceIndex(DeviceIndex));
reply += F(",\n");
reply += to_json_object_value(F("TaskName"), String(ExtraTaskSettings.TaskDeviceName));
if (Device[DeviceIndex].ValueCount != 0)
reply += F(",\n");
reply += F("\"TaskValues\": [\n");
for (byte x = 0; x < Device[DeviceIndex].ValueCount; x++)
{
reply += F("{");
reply += to_json_object_value(F("ValueNumber"), String(x + 1));
reply += F(",\n");
reply += to_json_object_value(F("Name"), String(ExtraTaskSettings.TaskDeviceValueNames[x]));
reply += F(",\n");
reply += to_json_object_value(F("Value"), toString(UserVar[BaseVarIndex + x], ExtraTaskSettings.TaskDeviceValueDecimals[x]));
if (x < (Device[DeviceIndex].ValueCount - 1))
reply += F("},\n");
}
reply += F("}]\n}");
if (TaskIndex != lastActiveTaskIndex)
reply += F(",");
reply += F("\n");
}
}
reply += F("}");
if (TaskIndex != lastActiveTaskIndex)
reply += F(",");
reply += F("\n");
}
}
if (taskNr == 0 )
reply += F("]}\n");
if (taskNr == 0 )
reply += F("]\n}");
WebServer.send(200, "application/json", reply);
}
@@ -3624,7 +3646,7 @@ void handle_advanced() {
String cft = WebServer.arg(F("cft"));
String MQTTRetainFlag = WebServer.arg(F("mqttretainflag"));
String ArduinoOTAEnable = WebServer.arg(F("arduinootaenable"));
String UseRTOSMultitasking = WebServer.arg(F("usertosmultitasking"));
if (edit.length() != 0)
@@ -3656,6 +3678,7 @@ void handle_advanced() {
Settings.ConnectionFailuresThreshold = cft.toInt();
Settings.MQTTRetainFlag = (MQTTRetainFlag == "on");
Settings.ArduinoOTAEnable = (ArduinoOTAEnable == "on");
Settings.UseRTOSMultitasking = (UseRTOSMultitasking == "on");
addHtmlError( TXBuffer.buf, SaveSettings());
if (Settings.UseNTP)
@@ -3729,6 +3752,10 @@ void handle_advanced() {
addFormCheckBox(TXBuffer.buf, F("Enable Arduino OTA"), F("arduinootaenable"), Settings.ArduinoOTAEnable);
#if defined(ESP32)
addFormCheckBox(TXBuffer.buf, F("Enable RTOS Multitasking"), F("usertosmultitasking"), Settings.UseRTOSMultitasking);
#endif
addFormSeparator (TXBuffer.buf);
TXBuffer += F("<TR><TD><TD>");
@@ -4239,7 +4266,7 @@ void handle_filelist() {
{
if(!file.isDirectory()){
TXBuffer += F("<TR><TD>");
if (file.name() != "/config.dat" && file.name() != "/security.dat" && file.name() != "/notification.dat")
if (strcmp(file.name(), FILE_CONFIG) != 0 && strcmp(file.name(), FILE_SECURITY) != 0 && strcmp(file.name(), FILE_NOTIFICATION) != 0)
{
TXBuffer += F("<a class='button link' href=\"filelist?delete=");
TXBuffer += file.name();
@@ -4451,7 +4478,7 @@ void handle_setup() {
addHeader(false,TXBuffer.buf);
if (WiFi.status() == WL_CONNECTED)
if (wifiStatus == ESPEASY_WIFI_SERVICES_INITIALIZED)
{
addHtmlError( SaveSettings());
const IPAddress ip = WiFi.localIP();
@@ -4781,7 +4808,7 @@ void handle_sysinfo() {
TXBuffer += F("<TR><TD colspan=2><H3>Network</H3></TD></TR>");
if (WiFi.status() == WL_CONNECTED)
if (wifiStatus == ESPEASY_WIFI_SERVICES_INITIALIZED)
{
TXBuffer += F("<TR><TD>Wifi<TD>");
#if defined(ESP8266)
@@ -4816,14 +4843,13 @@ void handle_sysinfo() {
TXBuffer += formatIP(WiFi.gatewayIP());
{
TXBuffer += F("<TR><TD>Client IP<TD>");
TXBuffer += F("<TR><TD>Client IP<TD>");
WiFiClient client(WebServer.client());
TXBuffer += formatIP(client.remoteIP());
TXBuffer += formatIP(client.remoteIP());
}
TXBuffer += F("<TR><TD>Allowed IP Range<TD>");
TXBuffer += describeAllowedIPrange();
TXBuffer += F("<TR><TD>Allowed IP Range<TD>");
TXBuffer += describeAllowedIPrange();
TXBuffer += F("<TR><TD>Serial Port available:<TD>");
TXBuffer += String(SerialAvailableForWrite());
@@ -4841,19 +4867,34 @@ void handle_sysinfo() {
uint8_t* macread = WiFi.macAddress(mac);
char macaddress[20];
formatMAC(macread, macaddress);
TXBuffer += macaddress;
TXBuffer += macaddress;
TXBuffer += F("<TR><TD>AP MAC<TD>");
TXBuffer += F("<TR><TD>AP MAC<TD>");
macread = WiFi.softAPmacAddress(mac);
formatMAC(macread, macaddress);
TXBuffer += macaddress;
TXBuffer += macaddress;
TXBuffer += F("<TR><TD colspan=2><H3>Firmware</H3></TD></TR>");
TXBuffer += F("<TR><TD>SSID<TD>");
TXBuffer += WiFi.SSID();
TXBuffer += F(" (");
TXBuffer += WiFi.BSSIDstr();
TXBuffer += F(")");
TXBuffer += F("<TR><TD>Build<TD>");
TXBuffer += BUILD;
TXBuffer += F(" ");
TXBuffer += F(BUILD_NOTES);
TXBuffer += F("<TR><TD>Channel<TD>");
TXBuffer += WiFi.channel();
TXBuffer += F("<TR><TD>Connected<TD>");
TXBuffer += format_msec_duration(timeDiff(lastConnectMoment, millis()));
TXBuffer += F("<TR><TD>Last Disconnect Reason<TD>");
TXBuffer += getLastDisconnectReason();
TXBuffer += F("<TR><TD colspan=2><H3>Firmware</H3></TD></TR>");
TXBuffer += F("<TR><TD>Build<TD>");
TXBuffer += BUILD;
TXBuffer += F(" ");
TXBuffer += F(BUILD_NOTES);
#if defined(ESP8266)
TXBuffer += F(" (core ");
TXBuffer += ESP.getCoreVersion();
+1 -1
View File
@@ -87,7 +87,7 @@ void C010_Send(struct EventStruct *event, byte varIndex, float value, unsigned l
else
msg.replace(F("%value%"), toString(value, ExtraTaskSettings.TaskDeviceValueDecimals[varIndex]));
if (WiFi.status() == WL_CONNECTED) {
if (wifiStatus == ESPEASY_WIFI_SERVICES_INITIALIZED) {
ControllerSettings.beginPacket(portUDP);
portUDP.write((uint8_t*)msg.c_str(),msg.length());
portUDP.endPacket();
+2 -2
View File
@@ -33,7 +33,7 @@ boolean CPlugin_012(byte function, struct EventStruct *event, String& string)
case CPLUGIN_PROTOCOL_SEND:
{
if (WiFi.status() != WL_CONNECTED) {
if (wifiStatus != ESPEASY_WIFI_SERVICES_INITIALIZED) {
success = false;
break;
}
@@ -63,7 +63,7 @@ boolean CPlugin_012_send(struct EventStruct *event, int nrValues) {
boolean Blynk_get(const String& command, byte controllerIndex, float *data )
{
if (WiFi.status() != WL_CONNECTED) {
if (wifiStatus != ESPEASY_WIFI_SERVICES_INITIALIZED) {
return false;
}
+3
View File
@@ -46,7 +46,10 @@ boolean NPlugin_002(byte function, struct EventStruct *event, String& string)
NotificationSettingsStruct NotificationSettings;
LoadNotificationSettings(event->NotificationIndex, (byte*)&NotificationSettings, sizeof(NotificationSettings));
//this reserves IRAM and uninitialized RAM
#ifndef ESP32
// Buzzer not compatible with ESP32 due to lack of tone command.
tone(NotificationSettings.Pin1, 500, 500);
#endif
success = true;
}
+2
View File
@@ -1,3 +1,4 @@
#ifdef USES_P001
//#######################################################################################################
//#################################### Plugin 001: Input Switch #########################################
//#######################################################################################################
@@ -480,3 +481,4 @@ byte P001_getSwitchType(struct EventStruct *event) {
}
return choice;
}
#endif // USES_P001
+2
View File
@@ -1,3 +1,4 @@
#ifdef USES_P002
//#######################################################################################################
//#################################### Plugin 002: Analog ###############################################
//#######################################################################################################
@@ -150,3 +151,4 @@ boolean Plugin_002(byte function, struct EventStruct *event, String& string)
}
return success;
}
#endif // USES_P002
+2
View File
@@ -1,3 +1,4 @@
#ifdef USES_P003
//#######################################################################################################
//#################################### Plugin 003: Pulse ###############################################
//#######################################################################################################
@@ -267,3 +268,4 @@ bool Plugin_003_pulseinit(byte Par1, byte Index, byte Mode)
return(true);
}
#endif // USES_P003
+2
View File
@@ -1,3 +1,4 @@
#ifdef USES_P004
// #######################################################################################################
// #################################### Plugin 004: TempSensor Dallas DS18B20 ###########################
// #######################################################################################################
@@ -653,3 +654,4 @@ boolean Plugin_004_DS_crc8(uint8_t * addr)
}
return crc == *addr; // addr 8
}
#endif // USES_P004
+2
View File
@@ -1,3 +1,4 @@
#ifdef USES_P005
//#######################################################################################################
//######################## Plugin 005: Temperature and Humidity sensor DHT 11/22 ########################
//#######################################################################################################
@@ -219,3 +220,4 @@ int Plugin_005_read_dht_dat(void)
}
return result;
}
#endif // USES_P005
+2
View File
@@ -1,3 +1,4 @@
#ifdef USES_P006
//#######################################################################################################
//######################## Plugin 006 BMP0685 I2C Barometric Pressure Sensor ###########################
//#######################################################################################################
@@ -287,3 +288,4 @@ float Plugin_006_pressureElevation(float atmospheric, int altitude) {
/*********************************************************************/
return atmospheric / pow(1.0 - (altitude/44330.0), 5.255);
}
#endif // USES_P006
+2
View File
@@ -1,3 +1,4 @@
#ifdef USES_P007
//#######################################################################################################
//#################################### Plugin 007: ExtWiredAnalog #######################################
//#######################################################################################################
@@ -69,3 +70,4 @@ boolean Plugin_007(byte function, struct EventStruct *event, String& string)
}
return success;
}
#endif // USES_P007
+2
View File
@@ -1,3 +1,4 @@
#ifdef USES_P008
//#######################################################################################################
//################################# Plugin 008: Wiegand RFID Tag Reader #################################
//#######################################################################################################
@@ -176,3 +177,4 @@ void Plugin_008_interrupt2()
Plugin_008_keyBuffer = Plugin_008_keyBuffer << 1; // Left shift the number (effectively multiplying by 2)
Plugin_008_bitCount++; // Increment the bit count
}
#endif // USES_P008
+2
View File
@@ -1,3 +1,4 @@
#ifdef USES_P009
//#######################################################################################################
//#################################### Plugin 009: MCP23017 input #######################################
//#######################################################################################################
@@ -306,3 +307,4 @@ void Plugin_009_Config(byte Par1, byte Par2)
Wire.endTransmission();
}
}
#endif // USES_P009
+2
View File
@@ -1,3 +1,4 @@
#ifdef USES_P010
//#######################################################################################################
//#################################### Plugin-010: LuxRead ############################################
//#######################################################################################################
@@ -124,3 +125,4 @@ boolean Plugin_010(byte function, struct EventStruct *event, String& string)
}
return success;
}
#endif // USES_P010
+2
View File
@@ -1,3 +1,4 @@
#ifdef USES_P011
//#######################################################################################################
//#################################### Plugin 011: Pro Mini Extender ####################################
//#######################################################################################################
@@ -211,3 +212,4 @@ void Plugin_011_Write(byte Par1, byte Par2)
Wire.write((Par2 >> 8));
Wire.endTransmission();
}
#endif // USES_P011
+19 -18
View File
@@ -1,3 +1,4 @@
#ifdef USES_P012
//#######################################################################################################
//#################################### Plugin 012: LCD ##################################################
//#######################################################################################################
@@ -8,7 +9,6 @@
// Lux:[Lux#Lux#R]
// Baro:[Baro#Pressure#R]
// Pump:[Pump#on#O] -> ON/OFF
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C *lcd=NULL;
@@ -226,11 +226,27 @@ boolean Plugin_012(byte function, struct EventStruct *event, String& string)
if (argIndex)
tmpString = tmpString.substring(0, argIndex);
if (lcd && tmpString.equalsIgnoreCase(F("LCD")))
if (lcd && tmpString.equalsIgnoreCase(F("LCDCMD")))
{
success = true;
argIndex = string.lastIndexOf(',');
tmpString = string.substring(argIndex + 1);
if (tmpString.equalsIgnoreCase(F("Off"))){
lcd->noBacklight();
}
else if (tmpString.equalsIgnoreCase(F("On"))){
lcd->backlight();
}
else if (tmpString.equalsIgnoreCase(F("Clear"))){
lcd->clear();
}
}
else if (lcd && tmpString.equalsIgnoreCase(F("LCD")))
{
success = true;
tmpString = P012_parseTemplate(string, cols);
argIndex = tmpString.lastIndexOf(',');
tmpString = tmpString.substring(argIndex + 1);
int colPos = event->Par2 - 1;
int rowPos = event->Par1 - 1;
@@ -281,22 +297,6 @@ boolean Plugin_012(byte function, struct EventStruct *event, String& string)
}
}
if (lcd && tmpString.equalsIgnoreCase(F("LCDCMD")))
{
success = true;
argIndex = string.lastIndexOf(',');
tmpString = string.substring(argIndex + 1);
if (tmpString.equalsIgnoreCase(F("Off"))){
lcd->noBacklight();
}
else if (tmpString.equalsIgnoreCase(F("On"))){
lcd->backlight();
}
else if (tmpString.equalsIgnoreCase(F("Clear"))){
lcd->clear();
}
}
break;
}
@@ -313,3 +313,4 @@ String P012_parseTemplate(String &tmpString, byte lineSize) {
result.replace(degree, degree_lcd);
return result;
}
#endif // USES_P012
+2
View File
@@ -1,3 +1,4 @@
#ifdef USES_P013
//#######################################################################################################
//#################################### Plugin 013: HC-SR04 ##############################################
//#######################################################################################################
@@ -180,3 +181,4 @@ void Plugin_013_interrupt()
Plugin_013_timer = micros() - Plugin_013_timer;
}
}
#endif // USES_P013
+2
View File
@@ -1,3 +1,4 @@
#ifdef USES_P014
//#######################################################################################################
//######################## Plugin 014 SI7021 I2C Temperature Humidity Sensor ###########################
//#######################################################################################################
@@ -393,3 +394,4 @@ int8_t Plugin_014_si7021_setResolution(uint8_t res)
return error;
}
#endif // USES_P014
+2
View File
@@ -1,3 +1,4 @@
#ifdef USES_P015
//#######################################################################################################
//######################## Plugin 015 TSL2561 I2C Lux Sensor ############################################
//#######################################################################################################
@@ -441,3 +442,4 @@ boolean Plugin_015(byte function, struct EventStruct *event, String& string)
}
return success;
}
#endif // USES_P015
+2
View File
@@ -1,3 +1,4 @@
#ifdef USES_P016
//#######################################################################################################
//#################################### Plugin 016: Input IR #############################################
//#######################################################################################################
@@ -93,3 +94,4 @@ boolean Plugin_016(byte function, struct EventStruct *event, String& string)
}
#endif
#endif // USES_P016
+2
View File
@@ -1,3 +1,4 @@
#ifdef USES_P017
//#######################################################################################################
//#################################### Plugin-017: PN532 RFID reader ####################################
//#######################################################################################################
@@ -401,3 +402,4 @@ int8_t Plugin_017_readAckFrame()
return 0;
}
#endif // USES_P017
+2
View File
@@ -1,3 +1,4 @@
#ifdef USES_P018
//#######################################################################################################
//#################################### Plugin 018: GP2Y10 ###############################################
//#######################################################################################################
@@ -82,3 +83,4 @@ boolean Plugin_018(byte function, struct EventStruct *event, String& string)
}
return success;
}
#endif // USES_P018
+2
View File
@@ -1,3 +1,4 @@
#ifdef USES_P019
//#######################################################################################################
//#################################### Plugin 019: PCF8574 ##############################################
//#######################################################################################################
@@ -238,3 +239,4 @@ boolean Plugin_019_Write(byte Par1, byte Par2)
return true;
}
#endif // USES_P019
+2
View File
@@ -1,3 +1,4 @@
#ifdef USES_P020
//#######################################################################################################
//#################################### Plugin 020: Ser2Net ##############################################
//#######################################################################################################
@@ -292,3 +293,4 @@ boolean Plugin_020(byte function, struct EventStruct *event, String& string)
}
return success;
}
#endif // USES_P020
+2
View File
@@ -1,3 +1,4 @@
#ifdef USES_P021
//#######################################################################################################
//#################################### Plugin 021: Level Control ########################################
//#######################################################################################################
@@ -137,3 +138,4 @@ boolean Plugin_021(byte function, struct EventStruct *event, String& string)
}
return success;
}
#endif // USES_P021
+2
View File
@@ -1,3 +1,4 @@
#ifdef USES_P022
//#######################################################################################################
//#################################### Plugin 022: PCA9685 ##############################################
//#######################################################################################################
@@ -152,3 +153,4 @@ void Plugin_022_initialize()
Plugin_022_writeRegister(PCA9685_MODE2, (byte)0x10); // set to output
Plugin_022_init = true;
}
#endif // USES_P022
+19 -18
View File
@@ -1,3 +1,4 @@
#ifdef USES_P023
//#######################################################################################################
//#################################### Plugin 023: OLED SSD1306 display #################################
//#######################################################################################################
@@ -208,14 +209,6 @@ boolean Plugin_023(byte function, struct EventStruct *event, String& string)
int argIndex = tmpString.indexOf(',');
if (argIndex)
tmpString = tmpString.substring(0, argIndex);
if (tmpString.equalsIgnoreCase(F("OLED")))
{
success = true;
argIndex = string.lastIndexOf(',');
tmpString = string.substring(argIndex + 1);
String newString = P023_parseTemplate(tmpString, 16);
Plugin_023_sendStrXY(newString.c_str(), event->Par1 - 1, event->Par2 - 1);
}
if (tmpString.equalsIgnoreCase(F("OLEDCMD")))
{
success = true;
@@ -228,9 +221,16 @@ boolean Plugin_023(byte function, struct EventStruct *event, String& string)
else if (tmpString.equalsIgnoreCase(F("Clear")))
Plugin_023_clear_display();
}
else if (tmpString.equalsIgnoreCase(F("OLED")))
{
success = true;
argIndex = string.lastIndexOf(',');
tmpString = string.substring(argIndex + 1);
String newString = P023_parseTemplate(tmpString, 16);
Plugin_023_sendStrXY(newString.c_str(), event->Par1 - 1, event->Par2 - 1);
}
break;
}
}
return success;
}
@@ -444,7 +444,7 @@ const char Plugin_023_myFont[][8] PROGMEM = {
{0x00, 0x02, 0x05, 0x05, 0x02, 0x00, 0x00, 0x00} // DEL
};
static void Plugin_023_reset_display(void)
void Plugin_023_reset_display(void)
{
Plugin_023_displayOff();
Plugin_023_clear_display();
@@ -475,7 +475,7 @@ void Plugin_023_displayOff(void)
}
static void Plugin_023_clear_display(void)
void Plugin_023_clear_display(void)
{
unsigned char i, k;
for (k = 0; k < 8; k++)
@@ -492,7 +492,7 @@ static void Plugin_023_clear_display(void)
// Actually this sends a byte, not a char to draw in the display.
static void Plugin_023_SendChar(unsigned char data)
void Plugin_023_SendChar(unsigned char data)
{
Wire.beginTransmission(Plugin_023_OLED_address); // begin transmitting
Wire.write(0x40); //data mode
@@ -503,7 +503,7 @@ static void Plugin_023_SendChar(unsigned char data)
// Prints a display char (not just a byte) in coordinates X Y,
//currently unused:
// static void Plugin_023_sendCharXY(unsigned char data, int X, int Y)
// void Plugin_023_sendCharXY(unsigned char data, int X, int Y)
// {
// //if (interrupt && !doing_menu) return; // Stop printing only if interrupt is call but not in button functions
// Plugin_023_setXY(X, Y);
@@ -517,7 +517,7 @@ static void Plugin_023_SendChar(unsigned char data)
// }
static void Plugin_023_sendcommand(unsigned char com)
void Plugin_023_sendcommand(unsigned char com)
{
Wire.beginTransmission(Plugin_023_OLED_address); //begin transmitting
Wire.write(0x80); //command mode
@@ -528,7 +528,7 @@ static void Plugin_023_sendcommand(unsigned char com)
// Set the cursor position in a 16 COL * 8 ROW map (128x64 pixels)
// or 8 COL * 5 ROW map (64x48 pixels)
static void Plugin_023_setXY(unsigned char row, unsigned char col)
void Plugin_023_setXY(unsigned char row, unsigned char col)
{
switch (Plugin_023_OLED_type)
{
@@ -548,7 +548,7 @@ static void Plugin_023_setXY(unsigned char row, unsigned char col)
// Prints a string regardless the cursor position.
// unused:
// static void Plugin_023_sendStr(unsigned char *string)
// void Plugin_023_sendStr(unsigned char *string)
// {
// unsigned char i = 0;
// while (*string)
@@ -564,7 +564,7 @@ static void Plugin_023_setXY(unsigned char row, unsigned char col)
// Prints a string in coordinates X Y, being multiples of 8.
// This means we have 16 COLS (0-15) and 8 ROWS (0-7).
static void Plugin_023_sendStrXY(const char *string, int X, int Y)
void Plugin_023_sendStrXY(const char *string, int X, int Y)
{
Plugin_023_setXY(X, Y);
unsigned char i = 0;
@@ -590,7 +590,7 @@ static void Plugin_023_sendStrXY(const char *string, int X, int Y)
}
static void Plugin_023_init_OLED(void)
void Plugin_023_init_OLED(void)
{
unsigned char multiplex;
unsigned char compins;
@@ -636,3 +636,4 @@ static void Plugin_023_init_OLED(void)
Plugin_023_sendcommand(0x00); //Set Memory Addressing Mode ab Horizontal addressing mode
}
#endif // USES_P023
+2
View File
@@ -1,3 +1,4 @@
#ifdef USES_P024
//#######################################################################################################
//#################################### Plugin 024: MLX90614 IR temperature I2C 0x5A) ###############################################
//#######################################################################################################
@@ -122,3 +123,4 @@ boolean Plugin_024(byte function, struct EventStruct *event, String& string)
}
return success;
}
#endif // USES_P024
+3 -1
View File
@@ -1,3 +1,4 @@
#ifdef USES_P025
//#######################################################################################################
//#################################### Plugin 025: ADS1115 I2C 0x48) ###############################################
//#######################################################################################################
@@ -9,7 +10,7 @@
boolean Plugin_025_init = false;
static uint16_t readRegister025(uint8_t i2cAddress, uint8_t reg) {
uint16_t readRegister025(uint8_t i2cAddress, uint8_t reg) {
Wire.beginTransmission(i2cAddress);
Wire.write((0x00));
Wire.endTransmission();
@@ -202,3 +203,4 @@ boolean Plugin_025(byte function, struct EventStruct *event, String& string)
}
return success;
}
#endif // USES_P025
+2
View File
@@ -1,3 +1,4 @@
#ifdef USES_P026
//#######################################################################################################
//#################################### Plugin 026: System Info ##########################################
//#######################################################################################################
@@ -134,3 +135,4 @@ boolean Plugin_026(byte function, struct EventStruct *event, String& string)
}
return success;
}
#endif // USES_P026
+2
View File
@@ -1,3 +1,4 @@
#ifdef USES_P027
//#######################################################################################################
//######################### Plugin 027: INA219 DC Voltage/Current sensor ################################
//#######################################################################################################
@@ -426,3 +427,4 @@ float Plugin_027_getCurrent_mA(uint8_t i2caddr) {
valueDec /= _ina219_data[idx].currentDivider_mA;
return valueDec;
}
#endif // USES_P027
+2
View File
@@ -1,3 +1,4 @@
#ifdef USES_P028
//#######################################################################################################
//#################### Plugin 028 BME280 I2C Temp/Hum/Barometric Pressure Sensor #######################
//#######################################################################################################
@@ -667,3 +668,4 @@ float Plugin_028_readAltitude(float seaLevel)
float Plugin_028_pressureElevation(float atmospheric, int altitude) {
return atmospheric / pow(1.0 - (altitude/44330.0), 5.255);
}
#endif // USES_P028
+3 -1
View File
@@ -1,10 +1,11 @@
#ifdef USES_P029
//#######################################################################################################
//#################################### Plugin 029: Output ###############################################
//#######################################################################################################
#define PLUGIN_029
#define PLUGIN_ID_029 29
#define PLUGIN_NAME_029 "Output - (Domoticz MQTT helper)"
#define PLUGIN_NAME_029 "Output - Domoticz MQTT Helper"
#define PLUGIN_VALUENAME1_029 "Output"
boolean Plugin_029(byte function, struct EventStruct *event, String& string)
{
@@ -65,3 +66,4 @@ boolean Plugin_029(byte function, struct EventStruct *event, String& string)
}
return success;
}
#endif // USES_P029
+2
View File
@@ -1,3 +1,4 @@
#ifdef USES_P030
//#######################################################################################################
//#################### Plugin 030 BMP280 I2C Temp/Barometric Pressure Sensor #######################
//#######################################################################################################
@@ -394,3 +395,4 @@ float Plugin_030_readAltitude(float seaLevel)
float Plugin_030_pressureElevation(float atmospheric, int altitude) {
return atmospheric / pow(1.0 - (altitude/44330.0), 5.255);
}
#endif // USES_P030
+2
View File
@@ -1,3 +1,4 @@
#ifdef USES_P031
//#######################################################################################################
//#################### Plugin 031: SHT10/SHT11/SHT15 Temp/Humidity Sensor ###############################
//#######################################################################################################
@@ -242,3 +243,4 @@ int Plugin_031_readData(const int bits)
return val;
}
#endif // USES_P031
+2
View File
@@ -1,3 +1,4 @@
#ifdef USES_P032
//#######################################################################################################
//################ Plugin 032 MS5611 (GY-63) I2C Temp/Barometric Pressure Sensor #######################
//#######################################################################################################
@@ -252,3 +253,4 @@ void Plugin_032_readout() {
double Plugin_032_pressureElevation(double atmospheric, int altitude) {
return atmospheric / pow(1.0 - (altitude/44330.0), 5.255);
}
#endif // USES_P032
+2
View File
@@ -1,3 +1,4 @@
#ifdef USES_P033
//#######################################################################################################
//#################################### Plugin 033: Dummy ################################################
//#######################################################################################################
@@ -100,3 +101,4 @@ boolean Plugin_033(byte function, struct EventStruct *event, String& string)
}
return success;
}
#endif // USES_P033
+2
View File
@@ -1,3 +1,4 @@
#ifdef USES_P034
//#######################################################################################################
//######################## Plugin 034: Temperature and Humidity sensor DHT 12 (I2C) #####################
//#######################################################################################################
@@ -110,3 +111,4 @@ boolean Plugin_034(byte function, struct EventStruct *event, String& string)
}
return success;
}
#endif // USES_P034
+10 -8
View File
@@ -1,3 +1,4 @@
#ifdef USES_P035
//#######################################################################################################
//#################################### Plugin 035: Output IR ############################################
//#######################################################################################################
@@ -204,14 +205,14 @@ boolean Plugin_035(byte function, struct EventStruct *event, String& string)
if (GetArgv(command, TmpStr1, 5)) IrRepeat = str2int(TmpStr1);
if (GetArgv(command, TmpStr1, 6)) IrSecondCode = strtoul(TmpStr1, NULL, 16);
if (IrType.equalsIgnoreCase("NEC")) Plugin_035_irSender->sendNEC(IrCode, IrBits);
if (IrType.equalsIgnoreCase("JVC")) Plugin_035_irSender->sendJVC(IrCode, IrBits, 2);
if (IrType.equalsIgnoreCase("RC5")) Plugin_035_irSender->sendRC5(IrCode, IrBits);
if (IrType.equalsIgnoreCase("RC6")) Plugin_035_irSender->sendRC6(IrCode, IrBits);
if (IrType.equalsIgnoreCase("SAMSUNG")) Plugin_035_irSender->sendSAMSUNG(IrCode, IrBits);
if (IrType.equalsIgnoreCase("SONY")) Plugin_035_irSender->sendSony(IrCode, IrBits);
if (IrType.equalsIgnoreCase("PANASONIC")) Plugin_035_irSender->sendPanasonic(IrBits, IrCode);
if (IrType.equalsIgnoreCase("PIONEER")) Plugin_035_irSender->sendPioneer(IrCode, IrBits, IrRepeat, IrSecondCode);
if (IrType.equalsIgnoreCase(F("NEC"))) Plugin_035_irSender->sendNEC(IrCode, IrBits);
if (IrType.equalsIgnoreCase(F("JVC"))) Plugin_035_irSender->sendJVC(IrCode, IrBits, 2);
if (IrType.equalsIgnoreCase(F("RC5"))) Plugin_035_irSender->sendRC5(IrCode, IrBits);
if (IrType.equalsIgnoreCase(F("RC6"))) Plugin_035_irSender->sendRC6(IrCode, IrBits);
if (IrType.equalsIgnoreCase(F("SAMSUNG"))) Plugin_035_irSender->sendSAMSUNG(IrCode, IrBits);
if (IrType.equalsIgnoreCase(F("SONY"))) Plugin_035_irSender->sendSony(IrCode, IrBits);
if (IrType.equalsIgnoreCase(F("PANASONIC"))) Plugin_035_irSender->sendPanasonic(IrBits, IrCode);
if (IrType.equalsIgnoreCase(F("PIONEER"))) Plugin_035_irSender->sendPioneer(IrCode, IrBits, IrRepeat, IrSecondCode);
}
addLog(LOG_LEVEL_INFO, F("IRTX :IR Code Sent"));
@@ -233,3 +234,4 @@ boolean Plugin_035(byte function, struct EventStruct *event, String& string)
}
#endif
#endif // USES_P035
+10 -7
View File
@@ -1,3 +1,4 @@
#ifdef USES_P036
//#######################################################################################################
//#################################### Plugin 036: OLED SSD1306 display #################################
//
@@ -24,10 +25,11 @@
#define P36_CONTRAST_MED 0xCF
#define P36_CONTRAST_HIGH 0xFF
#include "SSD1306.h"
#include "SH1106Wire.h"
#include "OLED_SSD1306_SH1106_images.h"
#include "Dialog_Plain_12_font.h"
#include "SSD1306.h"
#include "SH1106Wire.h"
#include "OLED_SSD1306_SH1106_images.h"
#include "Dialog_Plain_12_font.h"
#define P36_WIFI_STATE_UNSET -2
#define P36_WIFI_STATE_NOT_CONNECTED -1
@@ -466,7 +468,7 @@ String P36_parseTemplate(String &tmpString, byte lineSize) {
void display_header() {
static boolean showWiFiName = true;
if (showWiFiName && (WiFi.status() == WL_CONNECTED) ) {
if (showWiFiName && (wifiStatus == ESPEASY_WIFI_SERVICES_INITIALIZED) ) {
String newString = WiFi.SSID();
newString.trim();
display_title(newString);
@@ -629,7 +631,7 @@ void display_scroll(String outString[], String inString[], int nlines, int scrol
//Draw Signal Strength Bars, return true when there was an update.
bool display_wifibars() {
const bool connected = WiFi.status() == WL_CONNECTED;
const bool connected = wifiStatus == ESPEASY_WIFI_SERVICES_INITIALIZED;
const int nbars_filled = (WiFi.RSSI() + 100) / 8;
const int newState = connected ? nbars_filled : P36_WIFI_STATE_UNSET;
if (newState == lastWiFiState)
@@ -651,7 +653,7 @@ bool display_wifibars() {
display->setColor(BLACK);
display->fillRect(x , y, size_x, size_y);
display->setColor(WHITE);
if (WiFi.status() == WL_CONNECTED) {
if (wifiStatus == ESPEASY_WIFI_SERVICES_INITIALIZED) {
for (byte ibar = 0; ibar < nbars; ibar++) {
int16_t height = size_y * (ibar + 1) / nbars;
int16_t xpos = x + ibar * width;
@@ -670,3 +672,4 @@ bool display_wifibars() {
}
return true;
}
#endif // USES_P036
+29 -8
View File
@@ -1,3 +1,4 @@
#ifdef USES_P037
//#######################################################################################################
//#################################### Plugin 037: MQTT Import ##########################################
//#######################################################################################################
@@ -19,8 +20,26 @@
// Declare a Wifi client for this plugin only
// TODO TD-er: These must be kept in some vector to allow multiple instances of MQTT import.
WiFiClient espclient_037;
PubSubClient *MQTTclient_037;
PubSubClient *MQTTclient_037 = NULL;
bool MQTTclient_037_connected = false;
void Plugin_037_update_connect_status() {
bool connected = false;
if (MQTTclient_037 != NULL) {
connected = MQTTclient_037->connected();
}
if (MQTTclient_037_connected != connected) {
MQTTclient_037_connected = !MQTTclient_037_connected;
if (Settings.UseRules) {
String event = connected ? F("MQTTimport#Connected") : F("MQTTimport#Disconnected");
rulesProcessing(event);
}
if (!connected)
addLog(LOG_LEVEL_ERROR, F("IMPT : MQTT 037 Connection lost"));
}
}
boolean Plugin_037(byte function, struct EventStruct *event, String& string)
{
@@ -121,7 +140,9 @@ boolean Plugin_037(byte function, struct EventStruct *event, String& string)
case PLUGIN_TEN_PER_SECOND:
{
MQTTclient_037->loop(); // Listen out for callbacks
if (!MQTTclient_037->loop()) { // Listen out for callbacks
Plugin_037_update_connect_status();
}
success = true;
break;
}
@@ -133,13 +154,11 @@ boolean Plugin_037(byte function, struct EventStruct *event, String& string)
if (!MQTTclient_037->connected() || MQTTclient_should_reconnect) {
if (MQTTclient_should_reconnect) {
addLog(LOG_LEVEL_ERROR, F("IMPT : MQTT 037 Intentional reconnect"));
} else {
addLog(LOG_LEVEL_ERROR, F("IMPT : MQTT 037 Connection lost"));
}
MQTTclient_037->disconnect();
delay(1000);
Plugin_037_update_connect_status();
delay(250);
if (! MQTTConnect_037(ClientName)) {
success = false;
@@ -338,7 +357,8 @@ boolean MQTTConnect_037(String clientid)
if (MQTTclient_037->connected()) return true;
// define stuff for the client - this could also be done in the intial declaration of MQTTclient_037
if (!WiFiConnected(1000)) {
if (!WiFiConnected(100)) {
Plugin_037_update_connect_status();
return false; // Not connected, so no use in wasting time to connect to a host.
}
ControllerSettingsStruct ControllerSettings;
@@ -379,7 +399,7 @@ boolean MQTTConnect_037(String clientid)
delay(500);
}
Plugin_037_update_connect_status();
return MQTTclient_037->connected();
}
@@ -448,3 +468,4 @@ boolean MQTTCheckSubscription_037(String Topic, String Subscription) {
}
return false;
}
#endif // USES_P037
+4 -1
View File
@@ -1,3 +1,4 @@
#ifdef USES_P038
//#######################################################################################################
//#################################### Plugin 038: NeoPixel Basic #######################################
//#######################################################################################################
@@ -21,11 +22,12 @@
// The NeoPixelLine command does not work for RGBW, cause espeasy currently only allows max. 5 parameters
#include <Adafruit_NeoPixel.h>
Adafruit_NeoPixel *Plugin_038_pixels;
#define PLUGIN_038
#define PLUGIN_ID_038 38
#define PLUGIN_NAME_038 "Output - NeoPixel (basic)"
#define PLUGIN_NAME_038 "Output - NeoPixel (Basic)"
#define PLUGIN_VALUENAME1_038 ""
int MaxPixels = 0;
@@ -159,3 +161,4 @@ boolean Plugin_038(byte function, struct EventStruct *event, String& string)
}
return success;
}
#endif // USES_P038
+2
View File
@@ -1,3 +1,4 @@
#ifdef USES_P039
//#######################################################################################################
//######################## Plugin 039: Thermocouple (MAX6675 / MAX31855) ################################
//#######################################################################################################
@@ -289,3 +290,4 @@ int Plugin_039_convert_two_complement(uint32_t value, int nr_bits) {
}
return nativeInt;
}
#endif // USES_P039
+2
View File
@@ -1,3 +1,4 @@
#ifdef USES_P040
//#######################################################################################################
//#################################### Plugin 040: Serial RFID ID-12 ####################################
//#######################################################################################################
@@ -133,3 +134,4 @@ boolean Plugin_040(byte function, struct EventStruct *event, String& string)
}
return success;
}
#endif // USES_P040
+2
View File
@@ -1,3 +1,4 @@
#ifdef USES_P041
//#######################################################################################################
//#################################### Plugin 041: NeoPixel clock #######################################
//#######################################################################################################
@@ -429,3 +430,4 @@ void pushHOURE() {
pushToStrip(103);
pushToStrip(104);
}
#endif // USES_P041
+2
View File
@@ -1,3 +1,4 @@
#ifdef USES_P042
//#######################################################################################################
//######################################## Plugin 042: NeoPixel Candle ##################################
//#######################################################################################################
@@ -718,3 +719,4 @@ void RGBtoHSV(byte r, byte g, byte b, double hsv[3]) {
hsv[1] = s * 255;
hsv[2] = v * 255;
}
#endif // USES_P042
+2
View File
@@ -1,3 +1,4 @@
#ifdef USES_P043
//#######################################################################################################
//#################################### Plugin 043: Clock Output #########################################
//#######################################################################################################
@@ -119,3 +120,4 @@ boolean Plugin_043(byte function, struct EventStruct *event, String& string)
}
return success;
}
#endif // USES_P043
+4 -2
View File
@@ -1,3 +1,4 @@
#ifdef USES_P044
//#################################### Plugin 044: P1WifiGateway ########################################
//
// based on P020 Ser2Net, extended by Ronald Leenes romix/-at-/macuser.nl
@@ -123,7 +124,7 @@ boolean Plugin_044(byte function, struct EventStruct *event, String& string)
#endif
#if defined(ESP32)
Serial.begin(ExtraTaskSettings.TaskDevicePluginConfigLong[1], serialconfig);
#endif
#endif
if (P1GatewayServer) P1GatewayServer->close();
P1GatewayServer = new WiFiServer(ExtraTaskSettings.TaskDevicePluginConfigLong[0]);
P1GatewayServer->begin();
@@ -347,7 +348,7 @@ void blinkLED() {
checks whether the incoming character is a valid one for a P1 datagram. Returns false if not, which signals corrupt datagram
*/
bool validP1char(char ch) {
if ((ch >= '0' && ch <= '9') || (ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z') || (ch == '.') || (ch == '!') || (ch == 92) || (ch == 13) || (ch == '\n') || (ch == '(') || (ch == ')') || (ch == '-') || (ch == '*') || (ch == ':') )
if ((ch >= '0' && ch <= '9') || (ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z') || (ch == '.') || (ch == '!') || (ch == ' ') || (ch == 92) || (ch == 13) || (ch == '\n') || (ch == '(') || (ch == ')') || (ch == '-') || (ch == '*') || (ch == ':') )
{
return true;
} else {
@@ -436,3 +437,4 @@ bool checkDatagram(int len) {
}
return validCRCFound;
}
#endif // USES_P044
+2
View File
@@ -1,3 +1,4 @@
#ifdef USES_P045
//#######################################################################################################
//#################################### Plugin 045: MPU6050 [Testing] ####################################
//#######################################################################################################
@@ -401,3 +402,4 @@ void _P045_writeBits(uint8_t devAddr, uint8_t regAddr, uint8_t bitStart, uint8_t
}
}
#endif
#endif // USES_P045
+2
View File
@@ -1,3 +1,4 @@
#ifdef USES_P046
//#######################################################################################################
//#################################### Plugin 046: Ventus W266 [Testing] ################################
//#######################################################################################################
@@ -499,3 +500,4 @@ void Plugin_046_ISR_SCLK() // Interrupt on
}
}
#endif
#endif // USES_P046
+2
View File
@@ -1,3 +1,4 @@
#ifdef USES_P047
//#######################################################################################################
//#################### Plugin 047 Moisture & Temperature & Light I2C Soil moisture sensor ##############
//#######################################################################################################
@@ -302,3 +303,4 @@ bool Plugin_047_setAddress(int addr) {
#endif
#endif // USES_P047
+7 -6
View File
@@ -1,3 +1,4 @@
#ifdef USES_P048
//#######################################################################################################
//#################################### Plugin 048: Adafruit Motorshield v2 ##############################
//#######################################################################################################
@@ -102,18 +103,17 @@ boolean Plugin_048(byte function, struct EventStruct *event, String& string) {
String tmpString = string;
String cmd = parseString(tmpString, 1);
String param1 = parseString(tmpString, 2);
String param2 = parseString(tmpString, 3);
String param3 = parseString(tmpString, 4);
String param4 = parseString(tmpString, 5);
String param5 = parseString(tmpString, 6);
// Commands:
// MotorShieldCMD,<DCMotor>,<Motornumber>,<Forward/Backward/Release>,<Speed>
if (cmd.equalsIgnoreCase(F("MotorShieldCMD")))
{
String param1 = parseString(tmpString, 2);
String param2 = parseString(tmpString, 3);
String param3 = parseString(tmpString, 4);
String param4 = parseString(tmpString, 5);
String param5 = parseString(tmpString, 6);
// Create the motor shield object with the default I2C address
AFMS = Adafruit_MotorShield(Plugin_048_MotorShield_address);
@@ -277,3 +277,4 @@ boolean Plugin_048(byte function, struct EventStruct *event, String& string) {
#endif
#endif // USES_P048
+2
View File
@@ -1,3 +1,4 @@
#ifdef USES_P049
/*
This plug in is written by Dmitry (rel22 ___ inbox.ru)
@@ -461,3 +462,4 @@ size_t _P049_send_mhzCmd(byte CommandId)
return Plugin_049_SoftSerial->write(mhzResp, sizeof(mhzResp));
}
#endif // USES_P049
+2
View File
@@ -1,3 +1,4 @@
#ifdef USES_P050
//#######################################################################################################
//#################### Plugin 050 I2C TCS34725 RGB Color Sensor with IR filter and White LED ############
//#######################################################################################################
@@ -176,3 +177,4 @@ boolean Plugin_050(byte function, struct EventStruct *event, String& string)
#endif
#endif // USES_P050
+2
View File
@@ -1,3 +1,4 @@
#ifdef USES_P051
//#######################################################################################################
//#################### Plugin 051 Temperature and Humidity Sensor AM2320 ##############
//#######################################################################################################
@@ -102,3 +103,4 @@ boolean Plugin_051(byte function, struct EventStruct *event, String& string)
#endif
#endif // USES_P051
+2
View File
@@ -1,3 +1,4 @@
#ifdef USES_P052
//#######################################################################################################
//############################# Plugin 052: Senseair CO2 Sensors ########################################
//#######################################################################################################
@@ -416,3 +417,4 @@ int getBitOfInt(int reg, int pos)
return result;
}
#endif // USES_P052
+2
View File
@@ -1,3 +1,4 @@
#ifdef USES_P053
//#######################################################################################################
//#################################### Plugin 053: Plantower PMSx003 ####################################
//#######################################################################################################
@@ -301,3 +302,4 @@ boolean Plugin_053(byte function, struct EventStruct *event, String& string)
return success;
}
#endif // PLUGIN_BUILD_TESTING
#endif // USES_P053
+2
View File
@@ -1,3 +1,4 @@
#ifdef USES_P054
//#######################################################################################################
//######################################## Plugin 054: DMX512 TX ########################################
//#######################################################################################################
@@ -256,3 +257,4 @@ boolean Plugin_054(byte function, struct EventStruct *event, String& string)
}
#endif //PLUGIN_BUILD_TESTING
#endif // USES_P054
+2
View File
@@ -1,3 +1,4 @@
#ifdef USES_P055
//#######################################################################################################
//#################################### Plugin 055: Chiming Mechanism ####################################
//#######################################################################################################
@@ -501,3 +502,4 @@ byte Plugin_055_ReadChime(const String& name, String& tokens)
}
#endif
#endif // USES_P055
+2
View File
@@ -1,3 +1,4 @@
#ifdef USES_P056
//#######################################################################################################
//#################################### Plugin 056: Dust Sensor SDS011 / SDS018 ##########################
//#######################################################################################################
@@ -204,3 +205,4 @@ void Plugin_056_setWorkingPeriod(int minutes) {
}
#endif //PLUGIN_BUILD_TESTING
#endif // USES_P056
+2
View File
@@ -1,3 +1,4 @@
#ifdef USES_P057
//#######################################################################################################
//#################################### Plugin 057: HT16K33 LED ##########################################
//#######################################################################################################
@@ -324,3 +325,4 @@ boolean Plugin_057(byte function, struct EventStruct *event, String& string)
}
#endif
#endif // USES_P057
+2
View File
@@ -1,3 +1,4 @@
#ifdef USES_P058
//#######################################################################################################
//#################################### Plugin 058: HT16K33 KeyPad #######################################
//#######################################################################################################
@@ -149,3 +150,4 @@ boolean Plugin_058(byte function, struct EventStruct *event, String& string)
}
#endif
#endif // USES_P058
+3
View File
@@ -1,3 +1,4 @@
#ifdef USES_P059
//#######################################################################################################
//#################################### Plugin 059: Rotary Encoder #######################################
//#######################################################################################################
@@ -179,6 +180,7 @@ boolean Plugin_059(byte function, struct EventStruct *event, String& string)
log = String(F("QEI : ")) + string;
addLog(LOG_LEVEL_INFO, log);
Plugin_059_QE->write(event->Par1);
UserVar[event->BaseVarIndex] = (float) event->Par1;
success = true;
}
}
@@ -189,3 +191,4 @@ boolean Plugin_059(byte function, struct EventStruct *event, String& string)
}
return success;
}
#endif // USES_P059
+2
View File
@@ -1,3 +1,4 @@
#ifdef USES_P060
//#######################################################################################################
//#################################### Plugin 060: MCP3221 ##############################################
//#######################################################################################################
@@ -167,3 +168,4 @@ boolean Plugin_060(byte function, struct EventStruct *event, String& string)
}
#endif
#endif // USES_P060
+2
View File
@@ -1,3 +1,4 @@
#ifdef USES_P061
//#######################################################################################################
//#################################### Plugin 061: PCF8574/MCP23017 KeyPad ##############################
//#######################################################################################################
@@ -373,3 +374,4 @@ byte PCF8574_KeyPadDirectScan(byte addr)
}
#endif
#endif // USES_P061
+2
View File
@@ -1,3 +1,4 @@
#ifdef USES_P062
//#######################################################################################################
//#################################### Plugin 062: MPR121 KeyPad ########################################
//#######################################################################################################
@@ -159,3 +160,4 @@ boolean Plugin_062(byte function, struct EventStruct *event, String& string)
}
#endif
#endif // USES_P062
+2
View File
@@ -1,3 +1,4 @@
#ifdef USES_P063
//#######################################################################################################
//#################################### Plugin 063: TTP229 KeyPad ########################################
//#######################################################################################################
@@ -204,3 +205,4 @@ boolean Plugin_063(byte function, struct EventStruct *event, String& string)
}
return success;
}
#endif // USES_P063
+2
View File
@@ -1,3 +1,4 @@
#ifdef USES_P064
//#######################################################################################################
//#################################### Plugin 064: APDS9960 Gesture ##############################
//#######################################################################################################
@@ -215,3 +216,4 @@ boolean Plugin_064(byte function, struct EventStruct *event, String& string)
}
#endif
#endif // USES_P064
+2
View File
@@ -1,3 +1,4 @@
#ifdef USES_P065
//#######################################################################################################
//############################# Plugin 065: P065_DFR0299_MP3 ############################################
//#######################################################################################################
@@ -227,3 +228,4 @@ void Plugin_065_SendCmd(byte cmd, int16_t data)
}
#endif
#endif // USES_P065
+2
View File
@@ -1,3 +1,4 @@
#ifdef USES_P066
//#######################################################################################################
//#################################### Plugin 066: VEML6040 RGBW ##############################
//#######################################################################################################
@@ -234,3 +235,4 @@ float Plugin_066_CalcRelW(float X, float W)
}
#endif
#endif // USES_P066
+2
View File
@@ -1,3 +1,4 @@
#ifdef USES_P067
//#######################################################################################################
//#################################### Plugin 063: _P067_HX711_Load_Cell ################################
//#######################################################################################################
@@ -289,3 +290,4 @@ boolean Plugin_067(byte function, struct EventStruct *event, String& string)
}
#endif
#endif // USES_P067
+2
View File
@@ -1,3 +1,4 @@
#ifdef USES_P068
//#######################################################################################################
//################ Plugin 68: SHT30/SHT31/SHT35 Temperature and Humidity Sensor (I2C) ###################
//#######################################################################################################
@@ -178,3 +179,4 @@ boolean Plugin_068(byte function, struct EventStruct *event, String& string)
}
#endif
#endif // USES_P068
+2
View File
@@ -1,3 +1,4 @@
#ifdef USES_P069
//#######################################################################################################
//########################### Plugin 69: LM75A Temperature Sensor (I2C) #################################
//#######################################################################################################
@@ -202,3 +203,4 @@ boolean Plugin_069(byte function, struct EventStruct *event, String& string)
}
#endif
#endif // USES_P069
+2
View File
@@ -1,3 +1,4 @@
#ifdef USES_P070
//#######################################################################################################
//#################################### Plugin 070: NeoPixel ring clock #######################################
//#######################################################################################################
@@ -281,3 +282,4 @@ void timeToStrip(int hours, int minutes, int seconds) {
}
#endif
#endif // USES_P070
+2
View File
@@ -1,3 +1,4 @@
#ifdef USES_P071
//#######################################################################################################
//############################# Plugin 071: Kamstrup Multical 401 #######################################
//#######################################################################################################
@@ -270,3 +271,4 @@ bool parity_check(unsigned input) {
}
#endif
#endif // USES_P071
+2
View File
@@ -1,3 +1,4 @@
#ifdef USES_P072
//######################################################################################################
//####################### Plugin 072: Temperature and Humidity sensor HDC1080 (I2C) ####################
//######################################################################################################
@@ -99,3 +100,4 @@ boolean Plugin_072(byte function, struct EventStruct *event, String& string)
}
#endif
#endif // USES_P072
+2
View File
@@ -1,3 +1,4 @@
#ifdef USES_P073
//#######################################################################################################
//################### Plugin 073 - 7-segment display plugin TM1637/MAX7219 ######################
//#######################################################################################################
@@ -786,3 +787,4 @@ void max7219_ShowBuffer(uint8_t din_pin, uint8_t clk_pin, uint8_t cs_pin)
}
#endif
#endif // USES_P073
+2
View File
@@ -1,3 +1,4 @@
#ifdef USES_P074
//#######################################################################################################
//######################## Plugin 074 TSL2591 I2C Lux/IR Sensor #########################################
//#######################################################################################################
@@ -263,3 +264,4 @@ boolean Plugin_074(byte function, struct EventStruct *event, String& string)
return success;
}
#endif
#endif // USES_P074
+16
View File
@@ -0,0 +1,16 @@
#!/bin/bash
SRC=`pwd`
DST=${SRC}/converted
mkdir -p ${DST}
for file in `ls _P*.ino`; do
PREF=`echo $file|cut -d '_' -f-2`
USES=`echo "USES${PREF}"`
if ! grep -q $USES "$file"; then
echo "#ifdef ${USES}" > ${DST}/${file}
cat ${file} >> ${DST}/${file}
echo "#endif // ${USES}" >> ${DST}/${file}
fi
done
+518
View File
@@ -0,0 +1,518 @@
/*
#################################################
This is the place where plugins are registered
#################################################
To create/register a plugin, you have to :
- find an available number, ie 777.
- Create your own plugin, ie as "_P777_myfunction.ino"
- be sure it starts with ""#ifdef USES_P777", and ends with "#endif"
- then register it into the PLUGIN_SET_EXPERIMENTAL block (see below)
#ifdef PLUGIN_SET_EXPERIMENTAL
#define USES_P777 // MYsuperPlugin
#endif
- you can from now on test it by compiling using the PLUGIN_BUILD_DEV flag
either by adding "-DPLUGIN_BUILD_DEV" when compiling, or by momentarly
adding "#define PLUGIN_BUILD_DEV" at the top of the ESPEasy.ino file
- You will then have to push a PR including your plugin + the corret line (#define USES_P777) added to this file
When found stable enought, the maintainer (and only him) will choose to move it to TESTING or STABLE
*/
/******************************************************************************\
* BUILD Configs *******************************************************************
\******************************************************************************/
#ifdef PLUGIN_BUILD_DEV
#define PLUGIN_SET_EXPERIMENTAL
#define CONTROLLER_SET_EXPERIMENTAL
#define NOTIFIER_SET_EXPERIMENTAL
#define PLUGIN_BUILD_TESTING // add testing
#endif
#ifdef PLUGIN_BUILD_TESTING
#define PLUGIN_SET_TESTING
#define CONTROLLER_SET_TESTING
#define NOTIFIER_SET_TESTING
#define PLUGIN_BUILD_NORMAL // add stable
#endif
#ifndef PLUGIN_BUILD_CUSTOM
#ifndef PLUGIN_BUILD_NORMAL
#define PLUGIN_BUILD_NORMAL // defaults to stable, if not custom
#endif
#endif
#ifdef PLUGIN_BUILD_NORMAL
#define PLUGIN_SET_STABLE
#define CONTROLLER_SET_STABLE
#define NOTIFIER_SET_STABLE
#endif
/******************************************************************************\
* Devices ********************************************************************
\******************************************************************************/
// Itead ----------------------------
#ifdef PLUGIN_SET_SONOFF_BASIC
#define PLUGIN_SET_ONLY_SWITCH
#endif
#ifdef PLUGIN_SET_SONOFF_TH10
#define PLUGIN_SET_ONLY_SWITCH
#endif
#ifdef PLUGIN_SET_SONOFF_TH16
#define PLUGIN_SET_ONLY_SWITCH
#define PLUGIN_SET_ONLY_TEMP_HUM
#endif
#ifdef PLUGIN_SET_SONOFF_POW
#define PLUGIN_SET_ONLY_SWITCH
#endif
#ifdef PLUGIN_SET_SONOFF_S20
#define PLUGIN_SET_ONLY_SWITCH
#endif
#ifdef PLUGIN_SET_SONOFF_4CH
#define PLUGIN_SET_ONLY_SWITCH
#endif
#ifdef PLUGIN_SET_SONOFF_TOUCH
#define PLUGIN_SET_ONLY_SWITCH
#endif
// Easy ----------------------------
#ifdef PLUGIN_SET_EASY_TEMP
#define PLUGIN_SET_ONLY_TEMP_HUM
#endif
#ifdef PLUGIN_SET_EASY_CARBON
#define PLUGIN_SET_NONE
#define USES_P052 // SenseAir
#endif
/*
#ifdef PLUGIN_SET_EASY_NEXTION
#define PLUGIN_SET_ONLY_SWITCH
//#define USES_Pxxx // Nextion
#endif
*/
#ifdef PLUGIN_SET_EASY_OLED1
#define PLUGIN_SET_ONLY_SWITCH
#define USES_P036 // FrameOLED
#endif
#ifdef PLUGIN_SET_EASY_OLED2
#define PLUGIN_SET_ONLY_SWITCH
#define USES_P023 // OLED
#endif
#ifdef PLUGIN_SET_EASY_RELAY
#define PLUGIN_SET_ONLY_SWITCH
#endif
// LedStrips ----------------------------
#ifdef PLUGIN_SET_H801
#define PLUGIN_SET_ONLY_LEDSTRIP
#endif
#ifdef PLUGIN_SET_MAGICHOME
#define PLUGIN_SET_ONLY_LEDSTRIP
#endif
#ifdef PLUGIN_SET_MAGICHOME_IR
#define PLUGIN_SET_ONLY_LEDSTRIP
#define USES_P016 // IR
#endif
// Generic ESP32 -----------------------------
#ifdef PLUGIN_SET_GENERIC_ESP32
#ifndef ESP32
#define ESP32
#endif
#ifdef ESP8266
#undef ESP8266
#endif
#define PLUGIN_SET_ONLY_SWITCH
#define USES_P036 // FrameOLED
// TODO : Add list of compatible plugins for ESP32 board.
#endif
// Generic ------------------------------------
#ifdef PLUGIN_SET_GENERIC_1M
#define PLUGIN_SET_NONE
// TODO : small list of common plugins to fit in 1M
#endif
/******************************************************************************\
* "ONLY" shorcuts ************************************************************
\******************************************************************************/
#ifdef PLUGIN_SET_ONLY_SWITCH
#ifndef PLUGIN_SET_NONE
#define PLUGIN_SET_NONE
#endif
#ifndef USES_P001
#define USES_P001 // switch
#endif
#ifndef USES_P003
#define USES_P003 // pulse
#endif
#ifndef USES_P037
#define USES_P037 // MQTTImport
#endif
#endif
#ifdef PLUGIN_SET_ONLY_TEMP_HUM
#ifndef PLUGIN_SET_NONE
#define PLUGIN_SET_NONE
#endif
#ifndef USES_P004
#define USES_P004 // Dallas
#endif
#ifndef USES_P005
#define USES_P005 // DHT
#endif
#ifndef USES_P028
#define USES_P028 // BME280
#endif
#ifndef USES_P030
#define USES_P030 // BMP280
#endif
#endif
#ifdef PLUGIN_SET_ONLY_LEDSTRIP
#ifndef PLUGIN_SET_NONE
#define PLUGIN_SET_NONE
#endif
#ifndef USES_P141
#define USES_P141 // LedStrip
#endif
#ifndef USES_P037
#define USES_P037 // MQTTImport
#endif
#endif
/******************************************************************************\
* Main Families **************************************************************
\******************************************************************************/
// NONE #####################################
#ifdef PLUGIN_SET_NONE
#ifdef PLUGIN_SET_STABLE
#undef PLUGIN_SET_STABLE
#endif
#ifdef PLUGIN_SET_TESTING
#undef PLUGIN_SET_TESTING
#endif
#ifdef PLUGIN_SET_EXPERIMENTAL
#undef PLUGIN_SET_EXPERIMENTAL
#endif
#endif
#ifdef CONTROLLER_SET_NONE
#ifdef CONTROLLER_SET_STABLE
#undef CONTROLLER_SET_STABLE
#endif
#ifdef CONTROLLER_SET_TESTING
#undef CONTROLLER_SET_TESTING
#endif
#ifdef CONTROLLER_SET_EXPERIMENTAL
#undef CONTROLLER_SET_EXPERIMENTAL
#endif
#endif
#ifdef NOTIFIER_SET_NONE
#ifdef NOTIFIER_SET_STABLE
#undef NOTIFIER_SET_STABLE
#endif
#ifdef NOTIFIER_SET_TESTING
#undef NOTIFIER_SET_TESTING
#endif
#ifdef NOTIFIER_SET_EXPERIMENTAL
#undef NOTIFIER_SET_EXPERIMENTAL
#endif
#endif
// ALL ###########################################
#ifdef PLUGIN_SET_ALL
#ifndef PLUGIN_SET_STABLE
#define PLUGIN_SET_STABLE
#endif
#ifndef PLUGIN_SET_TESTING
#define PLUGIN_SET_TESTING
#endif
#ifndef PLUGIN_SET_EXPERIMENTAL
#define PLUGIN_SET_EXPERIMENTAL
#endif
#endif
#ifdef CONTROLLER_SET_ALL
#ifndef CONTROLLER_SET_STABLE
#define CONTROLLER_SET_STABLE
#endif
#ifndef CONTROLLER_SET_TESTING
#define CONTROLLER_SET_TESTING
#endif
#ifndef CONTROLLER_SET_EXPERIMENTAL
#define CONTROLLER_SET_EXPERIMENTAL
#endif
#endif
#ifdef NOTIFIER_SET_ALL
#ifndef NOTIFIER_SET_STABLE
#define NOTIFIER_SET_STABLE
#endif
#ifndef NOTIFIER_SET_TESTING
#define NOTIFIER_SET_TESTING
#endif
#ifndef NOTIFIER_SET_EXPERIMENTAL
#define NOTIFIER_SET_EXPERIMENTAL
#endif
#endif
// STABLE #####################################
#ifdef PLUGIN_SET_STABLE
#define USES_P001 // Switch
#define USES_P002 // ADC
#define USES_P003 // Pulse
#define USES_P004 // Dallas
#define USES_P005 // DHT
#define USES_P006 // BMP085
#define USES_P007 // PCF8591
#define USES_P008 // RFID
#define USES_P009 // MCP
#define USES_P010 // BH1750
#define USES_P011 // PME
#define USES_P012 // LCD
#define USES_P013 // HCSR04
#define USES_P014 // SI7021
#define USES_P015 // TSL2561
#define USES_P016 // IR
#define USES_P017 // PN532
#define USES_P018 // Dust
#define USES_P019 // PCF8574
#define USES_P020 // Ser2Net
#define USES_P021 // Level
#define USES_P022 // PCA9685
#define USES_P023 // OLED
#define USES_P024 // MLX90614
#define USES_P025 // ADS1115
#define USES_P026 // SysInfo
#define USES_P027 // INA219
#define USES_P028 // BME280
#define USES_P029 // Output
#define USES_P030 // BMP280
#define USES_P031 // SHT1X
#define USES_P032 // MS5611
#define USES_P033 // Dummy
#define USES_P034 // DHT12
#define USES_P035 // IRTX
#define USES_P036 // FrameOLED
#define USES_P037 // MQTTImport
#define USES_P038 // NeoPixel
#define USES_P039 // ID12
#define USES_P041 // NeoClock
#define USES_P042 // Candle
#define USES_P043 // ClkOutput
#define USES_P044 // P1WifiGateway
#define USES_P049 // MHZ19
#define USES_P052 // SenseAir
#define USES_P059 // Encoder
#define USES_P063 // TTP229_KeyPad
#endif
#ifdef CONTROLLER_SET_STABLE
#define USES_C001 // Domoticz HTTP
#define USES_C002 // Domoticz MQTT
#define USES_C003 // Nodo telnet
#define USES_C004 // ThingSpeak
#define USES_C005 // OpenHAB MQTT
#define USES_C006 // PiDome MQTT
#define USES_C007 // Emoncms
#define USES_C008 // Generic HTTP
#define USES_C009 // FHEM HTTP
#define USES_C010 // Generic UDP
#endif
#ifdef NOTIFIER_SET_STABLE
#define USES_N001 // Email
#define USES_N002 // Buzzer
#endif
// TESTING #####################################
#ifdef PLUGIN_SET_TESTING
#define USES_P045 // MPU6050
#define USES_P047 // I2C_soil_misture
#define USES_P048 // Motoshield_v2
#define USES_P051 // AM2320
#define USES_P053 // PMSx003
#define USES_P054 // DMX512
#define USES_P055 // Chiming
#define USES_P056 // SDS011-Dust
#define USES_P057 // HT16K33_LED
#define USES_P058 // HT16K33_KeyPad
#define USES_P060 // MCP3221
#define USES_P061 // Keypad
#define USES_P062 // MPR121_KeyPad
#define USES_P064 // APDS9960
#define USES_P065 // DRF0299
#define USES_P066 // VEML6040
#define USES_P067 // HX711_Load_Cell
#define USES_P068 // SHT3x
#define USES_P069 // LM75A
#define USES_P070 // NeoPixel_Clock
#define USES_P071 // Kamstrup401
#define USES_P072 // HDC1080
#define USES_P073 // 7DG
#define USES_P074 // TSL2561
#endif
#ifdef CONTROLLER_SET_TESTING
#define USES_C011 // Generic HTTP Advanced
#define USES_C012 // Blynk HTTP
#endif
#ifdef NOTIFIER_SET_TESTING
#endif
// EXPERIMENTAL (playground) #######################
#ifdef PLUGIN_SET_EXPERIMENTAL
#define USES_P046 // VentusW266
#define USES_P050 // TCS34725 RGB Color Sensor with IR filter and White LED
#define USES_P064 // APDS9960 Gesture
// [copied from Playground as of 6 March 2018]
// It needs some cleanup as some are ALSO in the main repo,
// thus they should have been removed from the Playground repo
#define USES_P100 // SRF01
#define USES_P101 // NeoClock (MERGED?)
#define USES_P102 // Nodo
#define USES_P103 // Event
#define USES_P104 // SRF02
#define USES_P105 // RGBW
#define USES_P106 // IRTX
#define USES_P107 // Email_Demo
#define USES_P108 // WOL
#define USES_P109 // RESOL_DeltaSol_Pro
#define USES_P110 // P1WifiGateway (MERGED?)
#define USES_P111 // RF
//#define USES_P111 // SenseAir (MERGED?)
#define USES_P112 // Power
//#define USES_P112 // RFTX
#define USES_P113 // SI1145
#define USES_P114 // DSM501
#define USES_P115 // HeatpumpIR
#define USES_P116 // ID12
#define USES_P117 // LW12FC
//#define USES_P117 // Neopixels
//#define USES_P117 // Nextion
#define USES_P118 // CCS811
#define USES_P119 // BME680
#define USES_P120 // Thermocouple
#define USES_P121 // Candle
#define USES_P122 // NeoPixel (MERGED?)
#define USES_P123 // NeoPixel_Clock (MERGED?)
#define USES_P124 // NeoPixelBusFX
//#define USES_P124 // Ventus_W266_RFM69
#define USES_P125 // ArduCAM
#define USES_P127 // Teleinfo
#define USES_P130 // VEML6075
#define USES_P131 // SHT3X
#define USES_P133 // VL53L0X
#define USES_P141 // LedStrip
#define USES_P142 // RGB-Strip
#define USES_P143 // AnyonePresent
#define USES_P144 // RC-Switch-TX
#define USES_P145 // Itho
#define USES_P149 // MHZ19
#define USES_P150 // SDM120C
#define USES_P151 // CISA
#define USES_P153 // MAX44009
#define USES_P162 // MPL3115A2
#define USES_P163 // DS1631
#define USES_P165 // SerSwitch
#define USES_P166 // WiFiMan
#define USES_P167 // ADS1015
#define USES_P170 // HLW8012
#define USES_P171 // PZEM-004T
#define USES_P180 // Mux
#define USES_P181 // TempHumidity_SHT2x
#define USES_P182 // MT681
#define USES_P199 // RF443_KaKu
#define USES_P202 // ADC_ACcurrentSensor
#define USES_P205 // FrameOLED (MERGED?)
#define USES_P209 // IFTTTMaker
#define USES_P210 // MQTTImport (MERGED?)
#define USES_P211 // MPU6050
#define USES_P212 // MY9291
#define USES_P213 // VEML6070
#endif
#ifdef CONTROLLER_SET_EXPERIMENTAL
#endif
#ifdef NOTIFIER_SET_EXPERIMENTAL
#endif
/******************************************************************************\
* Libraries dependencies *****************************************************
\******************************************************************************/
/*
#if defined(USES_P00x) || defined(USES_P00y)
#include <the_required_lib.h>
#endif
*/