diff --git a/.github/ISSUE_TEMPLATE/bug.md b/.github/ISSUE_TEMPLATE/bug.md
new file mode 100644
index 000000000..c3536b2ca
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE/bug.md
@@ -0,0 +1,27 @@
+---
+name: Bug
+about: Noticed an issue with your lights?
+title: ''
+labels: bug
+assignees: ''
+
+---
+
+**Describe the bug**
+A clear and concise description of what the bug is. Please quickly search existing issues first!
+
+**To Reproduce**
+Steps to reproduce the behavior, if consistently possible
+
+**Expected behavior**
+A clear and concise description of what you expected to happen.
+
+**WLED version**
+ - Board: [e.g. Wemos D1, ESP32 dev]
+ - Version [e.g. 0.10.0, dev200603]
+ - Format [e.g. Binary, self-compiled]
+
+**Additional context**
+Anything else you'd like to say about the problem?
+
+Thank you for your help!
diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md
new file mode 100644
index 000000000..67deb6e18
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE/feature_request.md
@@ -0,0 +1,22 @@
+---
+name: Feature request
+about: Suggest an improvement idea for WLED!
+title: ''
+labels: enhancement
+assignees: ''
+
+---
+
+**Is your feature request related to a problem? Please describe.**
+A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
+
+**Describe the solution you'd like**
+A clear and concise description of what you want to happen.
+
+**Describe alternatives you've considered**
+A clear and concise description of any alternative solutions or features you've considered.
+
+**Additional context**
+Add any other context or screenshots about the feature request here.
+
+Thank you for your ideas for making WLED better!
diff --git a/.github/ISSUE_TEMPLATE/question.md b/.github/ISSUE_TEMPLATE/question.md
new file mode 100644
index 000000000..94f92a612
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE/question.md
@@ -0,0 +1,19 @@
+---
+name: Question
+about: Have a question about using WLED?
+title: ''
+labels: question
+assignees: ''
+
+---
+
+**Take a look at the wiki and FAQ, perhaps your question is already answered!**
+[FAQ](https://github.com/Aircoookie/WLED/wiki/FAQ)
+
+**Please consider asking your question on the WLED forum or Discord**
+[Forum](https://wled.discourse.group/)
+[Discord](https://discord.gg/KuqP7NE)
+[What to post where?](https://github.com/Aircoookie/WLED/issues/658)
+
+**If you do not like to use these platforms, delete this template and ask away!**
+Please keep in mind though that the issue section is generally not the preferred place for general questions.
diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md
new file mode 100644
index 000000000..fbf0ddcff
--- /dev/null
+++ b/CODE_OF_CONDUCT.md
@@ -0,0 +1,76 @@
+# Contributor Covenant Code of Conduct
+
+## Our Pledge
+
+In the interest of fostering an open and welcoming environment, we as
+contributors and maintainers pledge to making participation in our project and
+our community a harassment-free experience for everyone, regardless of age, body
+size, disability, ethnicity, sex characteristics, gender identity and expression,
+level of experience, education, socio-economic status, nationality, personal
+appearance, race, religion, or sexual identity and orientation.
+
+## Our Standards
+
+Examples of behavior that contributes to creating a positive environment
+include:
+
+* Using welcoming and inclusive language
+* Being respectful of differing viewpoints and experiences
+* Gracefully accepting constructive criticism
+* Focusing on what is best for the community
+* Showing empathy towards other community members
+
+Examples of unacceptable behavior by participants include:
+
+* The use of sexualized language or imagery and unwelcome sexual attention or
+ advances
+* Trolling, insulting/derogatory comments, and personal or political attacks
+* Public or private harassment
+* Publishing others' private information, such as a physical or electronic
+ address, without explicit permission
+* Other conduct which could reasonably be considered inappropriate in a
+ professional setting
+
+## Our Responsibilities
+
+Project maintainers are responsible for clarifying the standards of acceptable
+behavior and are expected to take appropriate and fair corrective action in
+response to any instances of unacceptable behavior.
+
+Project maintainers have the right and responsibility to remove, edit, or
+reject comments, commits, code, wiki edits, issues, and other contributions
+that are not aligned to this Code of Conduct, or to ban temporarily or
+permanently any contributor for other behaviors that they deem inappropriate,
+threatening, offensive, or harmful.
+
+## Scope
+
+This Code of Conduct applies both within project spaces and in public spaces
+when an individual is representing the project or its community. Examples of
+representing a project or community include using an official project e-mail
+address, posting via an official social media account, or acting as an appointed
+representative at an online or offline event. Representation of a project may be
+further defined and clarified by project maintainers.
+
+## Enforcement
+
+Instances of abusive, harassing, or otherwise unacceptable behavior may be
+reported by contacting the project team at dev.aircoookie@gmail.com. All
+complaints will be reviewed and investigated and will result in a response that
+is deemed necessary and appropriate to the circumstances. The project team is
+obligated to maintain confidentiality with regard to the reporter of an incident.
+Further details of specific enforcement policies may be posted separately.
+
+Project maintainers who do not follow or enforce the Code of Conduct in good
+faith may face temporary or permanent repercussions as determined by other
+members of the project's leadership.
+
+## Attribution
+
+This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4,
+available at https://www.contributor-covenant.org/version/1/4/code-of-conduct.html
+
+[homepage]: https://www.contributor-covenant.org
+
+For answers to common questions about this code of conduct, see
+https://www.contributor-covenant.org/faq
diff --git a/images/macbook-pro-space-gray-on-the-wooden-table.jpg b/images/macbook-pro-space-gray-on-the-wooden-table.jpg
new file mode 100644
index 000000000..64f645b3d
Binary files /dev/null and b/images/macbook-pro-space-gray-on-the-wooden-table.jpg differ
diff --git a/images/macbook-pro-space-gray-on-the-wooden-table.webp b/images/macbook-pro-space-gray-on-the-wooden-table.webp
deleted file mode 100644
index cd728d842..000000000
Binary files a/images/macbook-pro-space-gray-on-the-wooden-table.webp and /dev/null differ
diff --git a/images/walking-with-iphone-x.jpg b/images/walking-with-iphone-x.jpg
new file mode 100644
index 000000000..90a205b19
Binary files /dev/null and b/images/walking-with-iphone-x.jpg differ
diff --git a/images/walking-with-iphone-x.webp b/images/walking-with-iphone-x.webp
deleted file mode 100644
index 24b55f0fb..000000000
Binary files a/images/walking-with-iphone-x.webp and /dev/null differ
diff --git a/readme.md b/readme.md
index dd4d2865c..fa1446b23 100644
--- a/readme.md
+++ b/readme.md
@@ -56,7 +56,7 @@ Russian speakers, check out the videos by Room31:
[ESP8266 based LED controller for WS2812b strip. WLED Firmware + OpenHAB](https://youtu.be/K4ioTt3XvGc)
## 🖼️ Images
-
+
## 💾 Compatible LED Strips
Type | Voltage | Comments
diff --git a/usermods/Fix_unreachable_netservices_v2/readme.md b/usermods/Fix_unreachable_netservices_v2/readme.md
new file mode 100644
index 000000000..f7d2aed6d
--- /dev/null
+++ b/usermods/Fix_unreachable_netservices_v2/readme.md
@@ -0,0 +1,54 @@
+# Fix unreachable net services V2
+
+This usermod-v2 modification performs a ping request to the local IP address every 60 seconds. By this procedure the net services of WLED remains accessible in some problematic WLAN environments.
+
+The modification works with static or DHCP IP address configuration.
+
+**Webinterface**: The number of pings and reconnects is displayed on the info page in the web interface.
+
+_Story:_
+
+Unfortunately, with all ESP projects where a web server or other network services are running, I have the problem that after some time the web server is no longer accessible. Now I found out that the connection is at least reestablished when a ping request is executed by the device.
+
+With this modification, in the worst case, the network functions are not available for 60 seconds until the next ping request.
+
+## Installation
+
+1. Copy the file `usermod_Fix_unreachable_netservices.h` to the `wled00` directory.
+2. Register the usermod by adding `#include "usermod_Fix_unreachable_netservices.h"` in the top and `registerUsermod(new FixUnreachableNetServices());` in the bottom of `usermods_list.cpp`.
+
+Example **usermods_list.cpp**:
+
+```cpp
+#include "wled.h"
+/*
+ * Register your v2 usermods here!
+ * (for v1 usermods using just usermod.cpp, you can ignore this file)
+ */
+
+/*
+ * Add/uncomment your usermod filename here (and once more below)
+ * || || ||
+ * \/ \/ \/
+ */
+//#include "usermod_v2_example.h"
+//#include "usermod_temperature.h"
+//#include "usermod_v2_empty.h"
+#include "usermod_Fix_unreachable_netservices.h"
+
+void registerUsermods()
+{
+ /*
+ * Add your usermod class name here
+ * || || ||
+ * \/ \/ \/
+ */
+ //usermods.add(new MyExampleUsermod());
+ //usermods.add(new UsermodTemperature());
+ //usermods.add(new UsermodRenameMe());
+ usermods.add(new FixUnreachableNetServices());
+
+}
+```
+
+Hopefully I can help someone with that - @gegu
diff --git a/usermods/Fix_unreachable_netservices_v2/usermod_Fix_unreachable_netservices.h b/usermods/Fix_unreachable_netservices_v2/usermod_Fix_unreachable_netservices.h
new file mode 100644
index 000000000..8ffc821ed
--- /dev/null
+++ b/usermods/Fix_unreachable_netservices_v2/usermod_Fix_unreachable_netservices.h
@@ -0,0 +1,138 @@
+#pragma once
+
+#include "wled.h"
+#include
+
+/*
+ * This usermod performs a ping request to the local IP address every 60 seconds.
+ * By this procedure the net services of WLED remains accessible in some problematic WLAN environments.
+ *
+ * Usermods allow you to add own functionality to WLED more easily
+ * See: https://github.com/Aircoookie/WLED/wiki/Add-own-functionality
+ *
+ * v2 usermods are class inheritance based and can (but don't have to) implement more functions, each of them is shown in this example.
+ * Multiple v2 usermods can be added to one compilation easily.
+ *
+ * Creating a usermod:
+ * This file serves as an example. If you want to create a usermod, it is recommended to use usermod_v2_empty.h from the usermods folder as a template.
+ * Please remember to rename the class and file to a descriptive name.
+ * You may also use multiple .h and .cpp files.
+ *
+ * Using a usermod:
+ * 1. Copy the usermod into the sketch folder (same folder as wled00.ino)
+ * 2. Register the usermod by adding #include "usermod_filename.h" in the top and registerUsermod(new MyUsermodClass()) in the bottom of usermods_list.cpp
+ */
+
+class FixUnreachableNetServices : public Usermod {
+ private:
+ //Private class members. You can declare variables and functions only accessible to your usermod here
+ unsigned long m_lastTime = 0;
+
+ // desclare required variables
+ const unsigned int PingDelayMs = 60000;
+ unsigned long m_connectedWiFi = 0;
+ ping_option m_pingOpt;
+ unsigned int m_pingCount = 0;
+
+ public:
+ //Functions called by WLED
+
+ /*
+ * setup() is called once at boot. WiFi is not yet connected at this point.
+ * You can use it to initialize variables, sensors or similar.
+ */
+ void setup() {
+ //Serial.println("Hello from my usermod!");
+ }
+
+
+ /*
+ * connected() is called every time the WiFi is (re)connected
+ * Use it to initialize network interfaces
+ */
+ void connected() {
+ //Serial.println("Connected to WiFi!");
+
+ ++m_connectedWiFi;
+
+ // initialize ping_options structure
+ memset(&m_pingOpt, 0, sizeof(struct ping_option));
+ m_pingOpt.count = 1;
+ m_pingOpt.ip = WiFi.localIP();
+
+ }
+
+
+ /*
+ * loop() is called continuously. Here you can check for events, read sensors, etc.
+ *
+ * Tips:
+ * 1. You can use "if (WLED_CONNECTED)" to check for a successful network connection.
+ * Additionally, "if (WLED_MQTT_CONNECTED)" is available to check for a connection to an MQTT broker.
+ *
+ * 2. Try to avoid using the delay() function. NEVER use delays longer than 10 milliseconds.
+ * Instead, use a timer check as shown here.
+ */
+ void loop() {
+ if (m_connectedWiFi > 0 && millis()-m_lastTime > PingDelayMs)
+ {
+ ping_start(&m_pingOpt);
+ m_lastTime = millis();
+ ++m_pingCount;
+ }
+ }
+
+
+ /*
+ * addToJsonInfo() can be used to add custom entries to the /json/info part of the JSON API.
+ * Creating an "u" object allows you to add custom key/value pairs to the Info section of the WLED web UI.
+ * Below it is shown how this could be used for e.g. a light sensor
+ */
+ void addToJsonInfo(JsonObject& root)
+ {
+ //this code adds "u":{"⚡ Ping fix pings": m_pingCount} to the info object
+ JsonObject user = root["u"];
+ if (user.isNull()) user = root.createNestedObject("u");
+
+ JsonArray infoArr = user.createNestedArray("⚡ Ping fix pings"); //name
+ infoArr.add(m_pingCount); //value
+
+ //this code adds "u":{"⚡ Reconnects": m_connectedWiFi - 1} to the info object
+ infoArr = user.createNestedArray("⚡ Reconnects"); //name
+ infoArr.add(m_connectedWiFi - 1); //value
+ }
+
+
+ /*
+ * addToJsonState() can be used to add custom entries to the /json/state part of the JSON API (state object).
+ * Values in the state object may be modified by connected clients
+ */
+ void addToJsonState(JsonObject& root)
+ {
+ //root["user0"] = userVar0;
+ }
+
+
+ /*
+ * readFromJsonState() can be used to receive data clients send to the /json/state part of the JSON API (state object).
+ * Values in the state object may be modified by connected clients
+ */
+ void readFromJsonState(JsonObject& root)
+ {
+ //userVar0 = root["user0"] | userVar0; //if "user0" key exists in JSON, update, else keep old value
+ //if (root["bri"] == 255) Serial.println(F("Don't burn down your garage!"));
+ }
+
+
+ /*
+ * getId() allows you to optionally give your V2 usermod an unique ID (please define it in const.h!).
+ * This could be used in the future for the system to determine whether your usermod is installed.
+ */
+ uint16_t getId()
+ {
+ return USERMOD_ID_FIXNETSERVICES;
+ }
+
+ //More methods can be added in the future, this example will then be extended.
+ //Your usermod will remain compatible as it does not need to implement all methods from the Usermod base class!
+};
diff --git a/usermods/PIR_sensor_switch/readme.md b/usermods/PIR_sensor_switch/readme.md
new file mode 100644
index 000000000..447f541cb
--- /dev/null
+++ b/usermods/PIR_sensor_switch/readme.md
@@ -0,0 +1,75 @@
+# PIR sensor switch
+
+This usermod-v2 modification allows the connection of a PIR sensor to switch on the LED strip when motion is detected. The switch-off occurs ten minutes after no more motion is detected.
+
+_Story:_
+
+I use the PIR Sensor to automatically turn on the WLED analog clock in my home office room when I am there.
+The LED strip is switched [using a relay](https://github.com/Aircoookie/WLED/wiki/Control-a-relay-with-WLED) to keep the power consumption low when it is switched off.
+
+## Webinterface
+
+The info page in the web interface shows the items below
+
+- the state of the sensor. By clicking on the state the sensor can be deactivated/activated.
+**I recommend to deactivate the sensor before installing an OTA update**.
+- the remaining time of the off timer.
+
+## JSON API
+
+The usermod supports the following state changes:
+
+| JSON key | Value range | Description |
+|------------|-------------|---------------------------------|
+| PIRenabled | bool | Deactivdate/activate the sensor |
+| PIRoffSec | 60 to 43200 | Off timer seconds |
+
+## Sensor connection
+
+My setup uses an HC-SR501 sensor, a HC-SR505 should also work.
+
+The usermod uses GPIO13 (D1 mini pin D7) for the sensor signal.
+[This example page](http://www.esp8266learning.com/wemos-mini-pir-sensor-example.php) describes how to connect the sensor.
+
+Use the potentiometers on the sensor to set the time-delay to the minimum and the sensitivity to about half, or slightly above.
+
+## Usermod installation
+
+1. Copy the file `usermod_PIR_sensor_switch.h` to the `wled00` directory.
+2. Register the usermod by adding `#include "usermod_PIR_sensor_switch.h"` in the top and `registerUsermod(new PIRsensorSwitch());` in the bottom of `usermods_list.cpp`.
+
+Example **usermods_list.cpp**:
+
+```cpp
+#include "wled.h"
+/*
+ * Register your v2 usermods here!
+ * (for v1 usermods using just usermod.cpp, you can ignore this file)
+ */
+
+/*
+ * Add/uncomment your usermod filename here (and once more below)
+ * || || ||
+ * \/ \/ \/
+ */
+//#include "usermod_v2_example.h"
+//#include "usermod_temperature.h"
+//#include "usermod_v2_empty.h"
+#include "usermod_PIR_sensor_switch.h"
+
+void registerUsermods()
+{
+ /*
+ * Add your usermod class name here
+ * || || ||
+ * \/ \/ \/
+ */
+ //usermods.add(new MyExampleUsermod());
+ //usermods.add(new UsermodTemperature());
+ //usermods.add(new UsermodRenameMe());
+ usermods.add(new PIRsensorSwitch());
+
+}
+```
+
+Have fun - @gegu
diff --git a/usermods/PIR_sensor_switch/usermod_PIR_sensor_switch.h b/usermods/PIR_sensor_switch/usermod_PIR_sensor_switch.h
new file mode 100644
index 000000000..6d71a426e
--- /dev/null
+++ b/usermods/PIR_sensor_switch/usermod_PIR_sensor_switch.h
@@ -0,0 +1,249 @@
+#pragma once
+
+#include "wled.h"
+
+/*
+ * This usermod handles PIR sensor states.
+ * The strip will be switched on and the off timer will be resetted when the sensor goes HIGH.
+ * When the sensor state goes LOW, the off timer is started and when it expires, the strip is switched off.
+ *
+ *
+ * Usermods allow you to add own functionality to WLED more easily
+ * See: https://github.com/Aircoookie/WLED/wiki/Add-own-functionality
+ *
+ * v2 usermods are class inheritance based and can (but don't have to) implement more functions, each of them is shown in this example.
+ * Multiple v2 usermods can be added to one compilation easily.
+ *
+ * Creating a usermod:
+ * This file serves as an example. If you want to create a usermod, it is recommended to use usermod_v2_empty.h from the usermods folder as a template.
+ * Please remember to rename the class and file to a descriptive name.
+ * You may also use multiple .h and .cpp files.
+ *
+ * Using a usermod:
+ * 1. Copy the usermod into the sketch folder (same folder as wled00.ino)
+ * 2. Register the usermod by adding #include "usermod_filename.h" in the top and registerUsermod(new MyUsermodClass()) in the bottom of usermods_list.cpp
+ */
+
+class PIRsensorSwitch : public Usermod {
+ private:
+ // PIR sensor pin
+ const uint8_t PIRsensorPin = 13; // D7 on D1 mini
+ // notification mode for colorUpdated()
+ const byte NotifyUpdateMode = NOTIFIER_CALL_MODE_NO_NOTIFY; // NOTIFIER_CALL_MODE_DIRECT_CHANGE
+ // delay before switch off after the sensor state goes LOW
+ uint32_t m_switchOffDelay = 600000;
+ // off timer start time
+ uint32_t m_offTimerStart = 0;
+ // current PIR sensor pin state
+ byte m_PIRsensorPinState = LOW;
+ // PIR sensor enabled - ISR attached
+ bool m_PIRenabled = true;
+
+ /*
+ * return or change if new PIR sensor state is available
+ */
+ static volatile bool newPIRsensorState(bool changeState = false, bool newState = false) {
+ static volatile bool s_PIRsensorState = false;
+ if (changeState) {
+ s_PIRsensorState = newState;
+ }
+ return s_PIRsensorState;
+ }
+
+ /*
+ * PIR sensor state has changed
+ */
+ static void IRAM_ATTR ISR_PIRstateChange() {
+ newPIRsensorState(true, true);
+ }
+
+ /*
+ * switch strip on/off
+ */
+ void switchStrip(bool switchOn) {
+ if (switchOn && bri == 0) {
+ bri = briLast;
+ colorUpdated(NotifyUpdateMode);
+ }
+ else if (!switchOn && bri != 0) {
+ briLast = bri;
+ bri = 0;
+ colorUpdated(NotifyUpdateMode);
+ }
+ }
+
+ /*
+ * Read and update PIR sensor state.
+ * Initilize/reset switch off timer
+ */
+ bool updatePIRsensorState() {
+ if (newPIRsensorState()) {
+ m_PIRsensorPinState = digitalRead(PIRsensorPin);
+
+ if (m_PIRsensorPinState == HIGH) {
+ m_offTimerStart = 0;
+ switchStrip(true);
+ }
+ else if (bri != 0) {
+ // start switch off timer
+ m_offTimerStart = millis();
+ }
+ newPIRsensorState(true, false);
+ return true;
+ }
+ return false;
+ }
+
+ /*
+ * switch off the strip if the delay has elapsed
+ */
+ bool handleOffTimer() {
+ if (m_offTimerStart > 0 && millis() - m_offTimerStart > m_switchOffDelay) {
+ switchStrip(false);
+ m_offTimerStart = 0;
+ return true;
+ }
+ return false;
+ }
+
+ public:
+ //Functions called by WLED
+
+ /*
+ * setup() is called once at boot. WiFi is not yet connected at this point.
+ * You can use it to initialize variables, sensors or similar.
+ */
+ void setup() {
+ // PIR Sensor mode INPUT_PULLUP
+ pinMode(PIRsensorPin, INPUT_PULLUP);
+ // assign interrupt function and set CHANGE mode
+ attachInterrupt(digitalPinToInterrupt(PIRsensorPin), ISR_PIRstateChange, CHANGE);
+ }
+
+
+ /*
+ * connected() is called every time the WiFi is (re)connected
+ * Use it to initialize network interfaces
+ */
+ void connected() {
+
+ }
+
+
+ /*
+ * loop() is called continuously. Here you can check for events, read sensors, etc.
+ */
+ void loop() {
+ if (!updatePIRsensorState()) {
+ handleOffTimer();
+ }
+ }
+
+ /*
+ * addToJsonInfo() can be used to add custom entries to the /json/info part of the JSON API.
+ *
+ * Add PIR sensor state and switch off timer duration to jsoninfo
+ */
+ void addToJsonInfo(JsonObject& root)
+ {
+ //this code adds "u":{"⏲ PIR sensor state":uiDomString} to the info object
+ // the value contains a button to toggle the sensor enabled/disabled
+ JsonObject user = root["u"];
+ if (user.isNull()) user = root.createNestedObject("u");
+
+ JsonArray infoArr = user.createNestedArray("⏲ PIR sensor state"); //name
+ String uiDomString = "";
+ infoArr.add(uiDomString); //value
+
+ //this code adds "u":{"⏲ switch off timer":uiDomString} to the info object
+ infoArr = user.createNestedArray("⏲ switch off timer"); //name
+
+ // off timer
+ if (m_offTimerStart > 0) {
+ uiDomString = "";
+ unsigned int offSeconds = (m_switchOffDelay - (millis() - m_offTimerStart)) / 1000;
+ if (offSeconds >= 3600) {
+ uiDomString += (offSeconds / 3600);
+ uiDomString += " hours ";
+ offSeconds %= 3600;
+ }
+ if (offSeconds >= 60) {
+ uiDomString += (offSeconds / 60);
+ offSeconds %= 60;
+ } else if (uiDomString.length() > 0){
+ uiDomString += 0;
+ }
+ if (uiDomString.length() > 0){
+ uiDomString += " min ";
+ }
+ uiDomString += (offSeconds);
+ infoArr.add(uiDomString + " sec");
+ } else {
+ infoArr.add("inactive");
+ }
+ }
+
+
+ /*
+ * addToJsonState() can be used to add custom entries to the /json/state part of the JSON API (state object).
+ * Values in the state object may be modified by connected clients
+ * Add "PIRenabled" to json state. This can be used to disable/enable the sensor.
+ * Add "PIRoffSec" to json state. This can be used to adjust milliseconds .
+ */
+ void addToJsonState(JsonObject& root)
+ {
+ root["PIRenabled"] = m_PIRenabled;
+ root["PIRoffSec"] = (m_switchOffDelay / 1000);
+ }
+
+
+ /*
+ * readFromJsonState() can be used to receive data clients send to the /json/state part of the JSON API (state object).
+ * Values in the state object may be modified by connected clients
+ * Read "PIRenabled" from json state and switch enable/disable the PIR sensor.
+ * Read "PIRoffSec" from json state and adjust milliseconds .
+ */
+ void readFromJsonState(JsonObject& root)
+ {
+ if (root["PIRoffSec"] != nullptr) {
+ m_switchOffDelay = (1000 * max(60UL, min(43200UL, root["PIRoffSec"].as())));
+ }
+
+ if (root["PIRenabled"] != nullptr) {
+ if (root["PIRenabled"] && !m_PIRenabled) {
+ attachInterrupt(digitalPinToInterrupt(PIRsensorPin), ISR_PIRstateChange, CHANGE);
+ newPIRsensorState(true, true);
+ }
+ else if(m_PIRenabled) {
+ detachInterrupt(PIRsensorPin);
+ }
+ m_PIRenabled = root["PIRenabled"];
+ }
+ }
+
+
+ /*
+ * getId() allows you to optionally give your V2 usermod an unique ID (please define it in const.h!).
+ * This could be used in the future for the system to determine whether your usermod is installed.
+ */
+ uint16_t getId()
+ {
+ return USERMOD_ID_PIRSWITCH;
+ }
+
+ //More methods can be added in the future, this example will then be extended.
+ //Your usermod will remain compatible as it does not need to implement all methods from the Usermod base class!
+};
diff --git a/wled00/const.h b/wled00/const.h
index c7437ddeb..2c2ad7884 100644
--- a/wled00/const.h
+++ b/wled00/const.h
@@ -18,6 +18,8 @@
#define USERMOD_ID_UNSPECIFIED 1 //Default value for a general user mod that does not specify a custom ID
#define USERMOD_ID_EXAMPLE 2 //Usermod "usermod_v2_example.h"
#define USERMOD_ID_TEMPERATURE 3 //Usermod "usermod_temperature.h"
+#define USERMOD_ID_FIXNETSERVICES 4 //Usermod "usermod_Fix_unreachable_netservices.h"
+#define USERMOD_ID_PIRSWITCH 5 //Usermod "usermod_PIR_sensor_switch.h"
//Access point behavior
#define AP_BEHAVIOR_BOOT_NO_CONN 0 //Open AP when no connection after boot