forked from Aircoookie/WLED
-
Notifications
You must be signed in to change notification settings - Fork 131
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
58 changed files
with
5,263 additions
and
1,873 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -409,7 +409,7 @@ board = esp32dev | |
platform = [email protected] | ||
upload_speed = 921600 | ||
build_unflags = ${common.build_unflags} | ||
build_flags = ${common.build_flags_esp32} -D WLED_RELEASE_NAME=ESP32 -D WLED_DISABLE_MQTT | ||
build_flags = ${common.build_flags_esp32} -D WLED_RELEASE_NAME=ESP32 -D WLED_DISABLE_MQTT -D WLED_DISABLE_LOXONE | ||
lib_deps = ${esp32.lib_deps} | ||
board_build.partitions = tools/WLED_ESP32_4MB_1MB_FS.csv | ||
|
||
|
@@ -418,7 +418,7 @@ board = esp32-poe | |
platform = [email protected] | ||
upload_speed = 921600 | ||
build_unflags = ${common.build_unflags} | ||
build_flags = ${common.build_flags_esp32} -D WLED_RELEASE_NAME=ESP32_Ethernet -D RLYPIN=-1 -D WLED_USE_ETHERNET -D BTNPIN=-1 -D WLED_DISABLE_MQTT | ||
build_flags = ${common.build_flags_esp32} -D WLED_RELEASE_NAME=ESP32_Ethernet -D RLYPIN=-1 -D WLED_USE_ETHERNET -D BTNPIN=-1 -D WLED_DISABLE_MQTT -D WLED_DISABLE_LOXONE | ||
lib_deps = ${esp32.lib_deps} | ||
board_build.partitions = tools/WLED_ESP32_4MB_1MB_FS.csv | ||
|
||
|
@@ -427,7 +427,7 @@ board = lolin_d32 | |
platform = [email protected] | ||
upload_speed = 921600 | ||
build_unflags = ${common.build_unflags} | ||
build_flags = ${common.build_flags_esp32} -D WLED_DISABLE_MQTT | ||
build_flags = ${common.build_flags_esp32} -D WLED_DISABLE_MQTT -D WLED_DISABLE_LOXONE | ||
lib_deps = ${esp32.lib_deps} | ||
board_build.partitions = tools/WLED_ESP32_4MB_1MB_FS.csv | ||
|
||
|
@@ -436,7 +436,7 @@ board = lolin_d32_pro | |
platform = [email protected] | ||
upload_speed = 921600 | ||
build_unflags = ${common.build_unflags} | ||
build_flags = ${common.build_flags_esp32} -D WLED_DISABLE_MQTT | ||
build_flags = ${common.build_flags_esp32} -D WLED_DISABLE_MQTT -D WLED_DISABLE_LOXONE | ||
lib_deps = ${esp32.lib_deps} | ||
board_build.f_cpu = 240000000L | ||
board_upload.flash_size = 16MB | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,16 @@ | ||
; Options | ||
; ------- | ||
; USERMOD_BH1750 - define this to have this user mod included wled00\usermods_list.cpp | ||
; USERMOD_BH1750_MAX_MEASUREMENT_INTERVAL - the max number of milliseconds between measurements, defaults to 10000ms | ||
; USERMOD_BH1750_MIN_MEASUREMENT_INTERVAL - the min number of milliseconds between measurements, defaults to 500ms | ||
; USERMOD_BH1750_FIRST_MEASUREMENT_AT - the number of milliseconds after boot to take first measurement, defaults to 10 seconds | ||
; USERMOD_BH1750_OFFSET_VALUE - the offset value to report on, defaults to 1 | ||
; | ||
[env:usermod_BH1750_d1_mini] | ||
extends = env:d1_mini | ||
build_flags = | ||
${common.build_flags_esp8266} | ||
-D USERMOD_BH1750 | ||
lib_deps = | ||
${env.lib_deps} | ||
claws/BH1750 @ ^1.2.0 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,24 @@ | ||
# BH1750 usermod | ||
|
||
This usermod will read from an ambient light sensor like the BH1750 sensor. | ||
The luminance is displayed both in the Info section of the web UI as well as published to the `/luminance` MQTT topic if enabled. | ||
|
||
## Installation | ||
|
||
Copy the example `platformio_override.ini` to the root directory. This file should be placed in the same directory as `platformio.ini`. | ||
|
||
### Define Your Options | ||
|
||
* `USERMOD_BH1750` - define this to have this user mod included wled00\usermods_list.cpp | ||
* `USERMOD_BH1750_MAX_MEASUREMENT_INTERVAL` - the max number of milliseconds between measurements, defaults to 10000ms | ||
* `USERMOD_BH1750_MIN_MEASUREMENT_INTERVAL` - the min number of milliseconds between measurements, defaults to 500ms | ||
* `USERMOD_BH1750_FIRST_MEASUREMENT_AT` - the number of milliseconds after boot to take first measurement, defaults to 10 seconds | ||
* `USERMOD_BH1750_OFFSET_VALUE` - the offset value to report on, defaults to 1 | ||
|
||
All parameters can be configured at runtime using Usermods settings page. | ||
|
||
### PlatformIO requirements | ||
|
||
If you are using `platformio_override.ini`, you should be able to refresh the task list and see your custom task, for example `env:usermod_BH1750_d1_mini`. | ||
|
||
## Change Log |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,177 @@ | ||
#pragma once | ||
|
||
#include "wled.h" | ||
#include <Wire.h> | ||
#include <BH1750.h> | ||
|
||
// the max frequency to check photoresistor, 10 seconds | ||
#ifndef USERMOD_BH1750_MAX_MEASUREMENT_INTERVAL | ||
#define USERMOD_BH1750_MAX_MEASUREMENT_INTERVAL 10000 | ||
#endif | ||
|
||
// the min frequency to check photoresistor, 500 ms | ||
#ifndef USERMOD_BH1750_MIN_MEASUREMENT_INTERVAL | ||
#define USERMOD_BH1750_MIN_MEASUREMENT_INTERVAL 500 | ||
#endif | ||
|
||
// how many seconds after boot to take first measurement, 10 seconds | ||
#ifndef USERMOD_BH1750_FIRST_MEASUREMENT_AT | ||
#define USERMOD_BH1750_FIRST_MEASUREMENT_AT 10000 | ||
#endif | ||
|
||
// only report if differance grater than offset value | ||
#ifndef USERMOD_BH1750_OFFSET_VALUE | ||
#define USERMOD_BH1750_OFFSET_VALUE 1 | ||
#endif | ||
|
||
class Usermod_BH1750 : public Usermod | ||
{ | ||
private: | ||
int8_t offset = USERMOD_BH1750_OFFSET_VALUE; | ||
|
||
unsigned long maxReadingInterval = USERMOD_BH1750_MAX_MEASUREMENT_INTERVAL; | ||
unsigned long minReadingInterval = USERMOD_BH1750_MIN_MEASUREMENT_INTERVAL; | ||
unsigned long lastMeasurement = UINT32_MAX - (USERMOD_BH1750_MAX_MEASUREMENT_INTERVAL - USERMOD_BH1750_FIRST_MEASUREMENT_AT); | ||
unsigned long lastSend = UINT32_MAX - (USERMOD_BH1750_MAX_MEASUREMENT_INTERVAL - USERMOD_BH1750_FIRST_MEASUREMENT_AT); | ||
// flag to indicate we have finished the first readLightLevel call | ||
// allows this library to report to the user how long until the first | ||
// measurement | ||
bool getLuminanceComplete = false; | ||
|
||
// flag set at startup | ||
bool disabled = false; | ||
|
||
// strings to reduce flash memory usage (used more than twice) | ||
static const char _name[]; | ||
static const char _enabled[]; | ||
static const char _maxReadInterval[]; | ||
static const char _minReadInterval[]; | ||
static const char _offset[]; | ||
|
||
BH1750 lightMeter; | ||
float lastLux = -1000; | ||
|
||
bool checkBoundSensor(float newValue, float prevValue, float maxDiff) | ||
{ | ||
return isnan(prevValue) || newValue <= prevValue - maxDiff || newValue >= prevValue + maxDiff || (newValue == 0.0 && prevValue > 0.0); | ||
} | ||
|
||
public: | ||
void setup() | ||
{ | ||
Wire.begin(); | ||
lightMeter.begin(); | ||
} | ||
|
||
void loop() | ||
{ | ||
if (disabled || strip.isUpdating()) | ||
return; | ||
|
||
unsigned long now = millis(); | ||
|
||
// check to see if we are due for taking a measurement | ||
// lastMeasurement will not be updated until the conversion | ||
// is complete the the reading is finished | ||
if (now - lastMeasurement < minReadingInterval) | ||
{ | ||
return; | ||
} | ||
|
||
bool shouldUpdate = now - lastSend > maxReadingInterval; | ||
|
||
float lux = lightMeter.readLightLevel(); | ||
lastMeasurement = millis(); | ||
getLuminanceComplete = true; | ||
|
||
if (shouldUpdate || checkBoundSensor(lux, lastLux, offset)) | ||
{ | ||
lastLux = lux; | ||
lastSend = millis(); | ||
if (WLED_MQTT_CONNECTED) | ||
{ | ||
char subuf[45]; | ||
strcpy(subuf, mqttDeviceTopic); | ||
strcat_P(subuf, PSTR("/luminance")); | ||
mqtt->publish(subuf, 0, true, String(lux).c_str()); | ||
} | ||
else | ||
{ | ||
DEBUG_PRINTLN("Missing MQTT connection. Not publishing data"); | ||
} | ||
} | ||
} | ||
|
||
void addToJsonInfo(JsonObject &root) | ||
{ | ||
JsonObject user = root[F("u")]; | ||
if (user.isNull()) | ||
user = root.createNestedObject(F("u")); | ||
|
||
JsonArray lux_json = user.createNestedArray(F("Luminance")); | ||
|
||
if (!getLuminanceComplete) | ||
{ | ||
// if we haven't read the sensor yet, let the user know | ||
// that we are still waiting for the first measurement | ||
lux_json.add((USERMOD_BH1750_FIRST_MEASUREMENT_AT - millis()) / 1000); | ||
lux_json.add(F(" sec until read")); | ||
return; | ||
} | ||
|
||
lux_json.add(lastLux); | ||
lux_json.add(F(" lx")); | ||
} | ||
|
||
uint16_t getId() | ||
{ | ||
return USERMOD_ID_BH1750; | ||
} | ||
|
||
/** | ||
* addToConfig() (called from set.cpp) stores persistent properties to cfg.json | ||
*/ | ||
void addToConfig(JsonObject &root) | ||
{ | ||
// we add JSON object. | ||
JsonObject top = root.createNestedObject(FPSTR(_name)); // usermodname | ||
top[FPSTR(_enabled)] = !disabled; | ||
top[FPSTR(_maxReadInterval)] = maxReadingInterval; | ||
top[FPSTR(_minReadInterval)] = minReadingInterval; | ||
top[FPSTR(_offset)] = offset; | ||
|
||
DEBUG_PRINTLN(F("Photoresistor config saved.")); | ||
} | ||
|
||
/** | ||
* readFromConfig() is called before setup() to populate properties from values stored in cfg.json | ||
*/ | ||
bool readFromConfig(JsonObject &root) | ||
{ | ||
// we look for JSON object. | ||
JsonObject top = root[FPSTR(_name)]; | ||
if (top.isNull()) | ||
{ | ||
DEBUG_PRINT(FPSTR(_name)); | ||
DEBUG_PRINTLN(F(": No config found. (Using defaults.)")); | ||
return false; | ||
} | ||
|
||
disabled = !(top[FPSTR(_enabled)] | !disabled); | ||
maxReadingInterval = (top[FPSTR(_maxReadInterval)] | maxReadingInterval); // ms | ||
minReadingInterval = (top[FPSTR(_minReadInterval)] | minReadingInterval); // ms | ||
offset = top[FPSTR(_offset)] | offset; | ||
DEBUG_PRINT(FPSTR(_name)); | ||
DEBUG_PRINTLN(F(" config (re)loaded.")); | ||
|
||
// use "return !top["newestParameter"].isNull();" when updating Usermod with new features | ||
return true; | ||
} | ||
}; | ||
|
||
// strings to reduce flash memory usage (used more than twice) | ||
const char Usermod_BH1750::_name[] PROGMEM = "BH1750"; | ||
const char Usermod_BH1750::_enabled[] PROGMEM = "enabled"; | ||
const char Usermod_BH1750::_maxReadInterval[] PROGMEM = "max-read-interval-ms"; | ||
const char Usermod_BH1750::_minReadInterval[] PROGMEM = "min-read-interval-ms"; | ||
const char Usermod_BH1750::_offset[] PROGMEM = "offset-lx"; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,14 @@ | ||
#include "wled.h" | ||
/* | ||
* Register your v2 usermods here! | ||
*/ | ||
#ifdef USERMOD_BH1750 | ||
#include "../usermods/BH1750_v2/usermod_BH1750.h" | ||
#endif | ||
|
||
void registerUsermods() | ||
{ | ||
#ifdef USERMOD_BH1750 | ||
usermods.add(new Usermod_BH1750()); | ||
#endif | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,33 +1,33 @@ | ||
# JSON IR remote | ||
|
||
## Purpose | ||
|
||
The JSON IR remote allows users to customize IR remote behavior without writing custom code and compiling. | ||
It also enables using any remote that is compatible with your IR receiver. Using the JSON IR remote, you can | ||
map buttons from any remote to any HTTP request API or JSON API command. | ||
|
||
## Usage | ||
|
||
* Upload the IR config file, named _ir.json_ to your board using the [ip address]/edit url. Pick from one of the included files or create your own. | ||
* On the config > LED settings page, set the correct IR pin. | ||
* On the config > Sync Interfaces page, select "JSON Remote" as the Infrared remote. | ||
|
||
## Modification | ||
|
||
* See if there is a json file with the same number of buttons as your remote. Many remotes will have the same internals and emit the same codes but have different labels. | ||
* In the ir.json file, each key will be the hex encoded IR code. | ||
* The "cmd" property will be the HTTP Request API or JSON API to execute when that button is pressed. | ||
* A limited number of c functions are supported (!incBrightness, !decBrightness, !presetFallback) | ||
* When using !presetFallback, include properties PL (preset to load), FX (effect to fall back to) and FP (palette to fall back to) | ||
* If the command is _repeatable_ and does not contain the "~" character, add a "rpt": true property. | ||
* Other properties are ignored, but having a label property may help when editing. | ||
|
||
|
||
Sample: | ||
{ | ||
"0xFF629D": {"cmd": "T=2", "rpt": true, "label": "Toggle on/off"}, // HTTP command | ||
"0xFF9867": {"cmd": "A=~16", "label": "Inc brightness"}, // HTTP command with incrementing | ||
"0xFF38C7": {"cmd": {"bri": 10}, "label": "Dim to 10"}, // JSON command | ||
"0xFF22DD": {"cmd": "!presetFallback", "PL": 1, "FX": 16, "FP": 6, | ||
"label": "Preset 1 or fallback to Saw - Party"}, // c function | ||
} | ||
# JSON IR remote | ||
|
||
## Purpose | ||
|
||
The JSON IR remote allows users to customize IR remote behavior without writing custom code and compiling. | ||
It also enables using any remote that is compatible with your IR receiver. Using the JSON IR remote, you can | ||
map buttons from any remote to any HTTP request API or JSON API command. | ||
|
||
## Usage | ||
|
||
* Upload the IR config file, named _ir.json_ to your board using the [ip address]/edit url. Pick from one of the included files or create your own. | ||
* On the config > LED settings page, set the correct IR pin. | ||
* On the config > Sync Interfaces page, select "JSON Remote" as the Infrared remote. | ||
|
||
## Modification | ||
|
||
* See if there is a json file with the same number of buttons as your remote. Many remotes will have the same internals and emit the same codes but have different labels. | ||
* In the ir.json file, each key will be the hex encoded IR code. | ||
* The "cmd" property will be the HTTP Request API or JSON API to execute when that button is pressed. | ||
* A limited number of c functions are supported (!incBrightness, !decBrightness, !presetFallback) | ||
* When using !presetFallback, include properties PL (preset to load), FX (effect to fall back to) and FP (palette to fall back to) | ||
* If the command is _repeatable_ and does not contain the "~" character, add a "rpt": true property. | ||
* Other properties are ignored, but having a label property may help when editing. | ||
|
||
|
||
Sample: | ||
{ | ||
"0xFF629D": {"cmd": "T=2", "rpt": true, "label": "Toggle on/off"}, // HTTP command | ||
"0xFF9867": {"cmd": "A=~16", "label": "Inc brightness"}, // HTTP command with incrementing | ||
"0xFF38C7": {"cmd": {"bri": 10}, "label": "Dim to 10"}, // JSON command | ||
"0xFF22DD": {"cmd": "!presetFallback", "PL": 1, "FX": 16, "FP": 6, | ||
"label": "Preset 1 or fallback to Saw - Party"}, // c function | ||
} |
Oops, something went wrong.