mirror of
https://github.com/wled/WLED.git
synced 2025-07-23 10:46:33 +00:00
Usermod Updated: Internal Temperature V2
# Added high temperature indicator/action... - A configurable preset is activated when the internal temperature raises above a configurable threshold temperature. - When the internal temperature falls back below the threshold, the previously active preset is re-activated. - To prevent frequent toggling between states when the temperature is close to the threshold, the reset threshold is slightly lower than the activation threshold to provide a small buffer. - Reset threshold is automatically calculated to be two degrees lower than whatever the activation threshold is set to. - To prevent the user setting the loop interval too low, a minimum allowable interval has been added.
This commit is contained in:
parent
57b01c2711
commit
f825cab54a
BIN
usermods/Internal_Temperature_v2/assets/screenshot-info.png
Normal file
BIN
usermods/Internal_Temperature_v2/assets/screenshot-info.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 160 KiB |
BIN
usermods/Internal_Temperature_v2/assets/screenshot-settings.png
Normal file
BIN
usermods/Internal_Temperature_v2/assets/screenshot-settings.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 33 KiB |
@ -1,17 +1,48 @@
|
||||
# Internal Temperature Usermod
|
||||
This usermod adds the temperature readout to the Info tab and also publishes that over the topic `mcutemp` topic.
|
||||
|
||||
## Important
|
||||
A shown temp of 53,33°C might indicate that the internal temp is not supported.
|
||||
|
||||
ESP8266 does not have a internal temp sensor
|
||||
<p align="left">
|
||||
<img width="700" src="assets/screenshot-info.png">
|
||||
</p>
|
||||
|
||||
ESP32S2 seems to crash on reading the sensor -> disabled
|
||||
<p align="left">
|
||||
<img width="700" src="assets/screenshot-settings.png">
|
||||
</p>
|
||||
|
||||
## Features
|
||||
- 🌡️ Adds the internal temperature readout of the chip to the `Info` tab
|
||||
- 🥵 High temperature indicator/action. (Configurable threshold and preset)
|
||||
- 📣 Publishes the internal temperature over the MQTT topic: `mcutemp`
|
||||
<br><br>
|
||||
|
||||
## Use Examples
|
||||
- Warn of excessive/damaging temperatures by the triggering of a 'warning' preset
|
||||
- Activate a cooling fan (when used with the multi-relay usermod)
|
||||
<br><br>
|
||||
|
||||
## Compatibility
|
||||
- A shown temp of 53,33°C might indicate that the internal temp is not supported
|
||||
- ESP8266 does not have a internal temp sensor -> Disabled (Indicated with a readout of '-1')
|
||||
- ESP32S2 seems to crash on reading the sensor -> Disabled (Indicated with a readout of '-1')
|
||||
<br><br>
|
||||
|
||||
## Installation
|
||||
Add a build flag `-D USERMOD_INTERNAL_TEMPERATURE` to your `platformio.ini` (or `platformio_override.ini`).
|
||||
- Add a build flag `-D USERMOD_INTERNAL_TEMPERATURE` to your `platformio.ini` (or `platformio_override.ini`).
|
||||
<br><br>
|
||||
|
||||
## 📝 Change Log
|
||||
|
||||
2024-06-26
|
||||
|
||||
- Added "high-temperature-indication" feature
|
||||
- Documentation updated
|
||||
|
||||
2023-09-01
|
||||
|
||||
* "Internal Temperature" usermod created
|
||||
<br><br>
|
||||
|
||||
## Authors
|
||||
Soeren Willrodt [@lost-hope](https://github.com/lost-hope)
|
||||
|
||||
Dimitry Zhemkov [@dima-zhemkov](https://github.com/dima-zhemkov)
|
||||
- Soeren Willrodt [@lost-hope](https://github.com/lost-hope)
|
||||
- Dimitry Zhemkov [@dima-zhemkov](https://github.com/dima-zhemkov)
|
||||
- Adam Matthews [@adamsthws](https://github.com/adamsthws)
|
||||
|
@ -6,21 +6,34 @@ class InternalTemperatureUsermod : public Usermod
|
||||
{
|
||||
|
||||
private:
|
||||
static const unsigned long minLoopInterval = 1000; // minimum allowable interval (ms)
|
||||
unsigned long loopInterval = 10000;
|
||||
unsigned long lastTime = 0;
|
||||
bool isEnabled = false;
|
||||
float temperature = 0;
|
||||
int presetToActivate = -1; // Preset to activate when temp goes above threshold (-1 = disabled)
|
||||
float activationThreshold = 95.0; // Temperature threshold to trigger high-temperature actions
|
||||
float resetMargin = 2.0; // Margin below the activation threshold (Prevents frequent toggling when close to threshold)
|
||||
bool isAboveThreshold = false; // Flag to track if the high temperature preset is currently active
|
||||
|
||||
static const char _name[];
|
||||
static const char _enabled[];
|
||||
static const char _loopInterval[];
|
||||
static const char _activationThreshold[];
|
||||
static const char _presetToActivate[];
|
||||
|
||||
// any private methods should go here (non-inline method should be defined out of class)
|
||||
void publishMqtt(const char *state, bool retain = false); // example for publishing MQTT message
|
||||
|
||||
// Makes sure the measurement interval can't be set too low
|
||||
void setSafeLoopInterval(unsigned long newInterval) {
|
||||
loopInterval = max(newInterval, minLoopInterval);
|
||||
}
|
||||
|
||||
public:
|
||||
void setup()
|
||||
{
|
||||
setSafeLoopInterval(loopInterval); // Initialize with a safe loop interval
|
||||
}
|
||||
|
||||
void loop()
|
||||
@ -32,6 +45,7 @@ public:
|
||||
|
||||
lastTime = millis();
|
||||
|
||||
// Measure the temperature
|
||||
#ifdef ESP8266 // ESP8266
|
||||
// does not seem possible
|
||||
temperature = -1;
|
||||
@ -41,6 +55,30 @@ public:
|
||||
temperature = roundf(temperatureRead() * 10) / 10;
|
||||
#endif
|
||||
|
||||
// Check if temperature has gone above the threshold
|
||||
if (temperature >= activationThreshold) {
|
||||
// Update the state flag if not already set
|
||||
if (!isAboveThreshold){
|
||||
isAboveThreshold = true;
|
||||
}
|
||||
// Activate the 'over-threshold' preset if it's not already active
|
||||
if (presetToActivate != -1 && currentPreset != presetToActivate) {
|
||||
saveTemporaryPreset(); // Save the current preset to allow re-activation later
|
||||
applyPreset(presetToActivate);
|
||||
}
|
||||
}
|
||||
// Check if temperature is back below the threshold
|
||||
else if (temperature <= (activationThreshold - resetMargin)) {
|
||||
// Update the state flag if not already set
|
||||
if (isAboveThreshold){
|
||||
isAboveThreshold = false;
|
||||
}
|
||||
// Revert back to the original preset
|
||||
if (currentPreset == presetToActivate){
|
||||
applyTemporaryPreset(); // Restore the previously stored active preset
|
||||
}
|
||||
}
|
||||
|
||||
#ifndef WLED_DISABLE_MQTT
|
||||
if (WLED_MQTT_CONNECTED)
|
||||
{
|
||||
@ -80,15 +118,30 @@ public:
|
||||
JsonObject top = root.createNestedObject(FPSTR(_name));
|
||||
top[FPSTR(_enabled)] = isEnabled;
|
||||
top[FPSTR(_loopInterval)] = loopInterval;
|
||||
top[FPSTR(_activationThreshold)] = activationThreshold;
|
||||
top[FPSTR(_presetToActivate)] = presetToActivate;
|
||||
}
|
||||
|
||||
// Append useful info to the usermod settings gui
|
||||
void appendConfigData()
|
||||
{
|
||||
// Display 'ms' next to the 'Loop Interval' setting
|
||||
oappend(SET_F("addInfo('Internal Temperature:Loop Interval', 1, 'ms');"));
|
||||
// Display '°C' next to the 'Activation Threshold' setting
|
||||
oappend(SET_F("addInfo('Internal Temperature:Activation Threshold', 1, '°C');"));
|
||||
// Display '-1 = Disabled' next to the 'Preset To Activate' setting
|
||||
oappend(SET_F("addInfo('Internal Temperature:Preset To Activate', 1, '-1 = disabled');"));
|
||||
}
|
||||
|
||||
bool readFromConfig(JsonObject &root)
|
||||
{
|
||||
JsonObject top = root[FPSTR(_name)];
|
||||
bool configComplete = !top.isNull();
|
||||
configComplete &= getJsonValue(top[FPSTR(_enabled)], isEnabled);
|
||||
configComplete &= getJsonValue(top[FPSTR(_loopInterval)], loopInterval);
|
||||
|
||||
setSafeLoopInterval(loopInterval); // Makes sure the loop interval isn't too small.
|
||||
configComplete &= getJsonValue(top[FPSTR(_presetToActivate)], presetToActivate);
|
||||
configComplete &= getJsonValue(top[FPSTR(_activationThreshold)], activationThreshold);
|
||||
return configComplete;
|
||||
}
|
||||
|
||||
@ -101,6 +154,8 @@ public:
|
||||
const char InternalTemperatureUsermod::_name[] PROGMEM = "Internal Temperature";
|
||||
const char InternalTemperatureUsermod::_enabled[] PROGMEM = "Enabled";
|
||||
const char InternalTemperatureUsermod::_loopInterval[] PROGMEM = "Loop Interval";
|
||||
const char InternalTemperatureUsermod::_activationThreshold[] PROGMEM = "Activation Threshold";
|
||||
const char InternalTemperatureUsermod::_presetToActivate[] PROGMEM = "Preset To Activate";
|
||||
|
||||
void InternalTemperatureUsermod::publishMqtt(const char *state, bool retain)
|
||||
{
|
||||
|
Loading…
x
Reference in New Issue
Block a user