forked from Aircoookie/WLED
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
* added klipper usermod * enabled IP Change and updated the Readme * Added spreading from center and fixed the enable * fixing the PR conflict * bugfixes * xml.cpp: correct type for checkbox global led buffer" (was not shown correctly) * fx.cpp: 2D floating blobs - correct swapped x/y coordinates (did not render correctly on non-square matrix) * update build nr and npm run build * Delete wled00.ino.cpp accident * Whitespace. * Art-Net transmit support for network LEDs Like DDP, this allows WLED to address network systems using the Art-Net protocol. Universe starts at zero, because that's the first universe in Art-Net. Works with RGB. It's coded to also work with RGBW, but I couldn't find a great place to enable it without mucking with things I don't understand. * whitespace cleanup * PROGMEM for header * Fix for Aircoookie#2542. UI rebuild. * workaround for issue Aircoookie#3128 * adding wled00.ino.cpp to gitignore to avoid future accidents in GH Desktop * Fix typing to resolve build errors after installing the mpu6050_imu usermod. * adding WLED_DISABLE_ADALIGHT (issue Aircoookie#3128 This flag disables reading commands from serial interface (RX = gpio 3) Add -D WLED_DISABLE_ADALIGHT to your custom pio build environment. * typo * comment updated Also "Serial JSON" is not possible when reading from RX pin is disabled. --------- Co-authored-by: lost-hope <s.willrodt@yahoo.de> Co-authored-by: Frank <frank.moehle@outlook.de> Co-authored-by: Frank <91616163+softhack007@users.noreply.github.com> Co-authored-by: Blaz Kristan <blaz@kristan-sp.si> Co-authored-by: TroyHacks <5659019+troyhacks@users.noreply.github.com> Co-authored-by: Ryan Horricks <ryan.horricks@gmail.com>
- Loading branch information
1 parent
0d3debf
commit 4229c0c
Showing
17 changed files
with
1,306 additions
and
1,021 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
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -17,4 +17,5 @@ node_modules | |
wled-update.sh | ||
esp01-update.sh | ||
/wled00/LittleFS | ||
replace_fs.py | ||
replace_fs.py | ||
wled00/wled00.ino.cpp |
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 |
---|---|---|
@@ -0,0 +1,40 @@ | ||
# Klipper Percentage Usermod | ||
This usermod polls the Klipper API every 10s for the progressvalue. | ||
The leds are then filled with a solid color according to that progress percentage. | ||
the solid color is the secondary color of the segment. | ||
|
||
A corresponding curl command would be: | ||
``` | ||
curl --location --request GET 'http://[]/printer/objects/query?virtual_sdcard=progress' | ||
``` | ||
## Usage | ||
Compile the source with the buildflag `-D USERMOD_KLIPPER_PERCENTAGE` added. | ||
|
||
You can also use the WLBD bot in the Discord by simply extending an exsisting build enviroment: | ||
``` | ||
[env:esp32klipper] | ||
extends = env:esp32dev | ||
build_flags = ${common.build_flags_esp32} -D USERMOD_KLIPPER_PERCENTAGE | ||
``` | ||
|
||
## Settings | ||
|
||
### Enabled: | ||
Checkbox to enable or disable the overlay | ||
|
||
### Klipper IP: | ||
IP adress of your Klipper instance you want to poll. ESP has to be restarted after change | ||
|
||
### Direction : | ||
0 = normal | ||
|
||
1 = reversed | ||
|
||
2 = center | ||
|
||
----- | ||
Author: | ||
|
||
Sören Willrodt | ||
|
||
Discord: Sören#5281 |
222 changes: 222 additions & 0 deletions
222
usermods/usermod_v2_klipper_percentage/usermod_v2_klipper_percentage.h
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,222 @@ | ||
#pragma once | ||
|
||
#include "wled.h" | ||
|
||
class klipper_percentage : public Usermod | ||
{ | ||
private: | ||
unsigned long lastTime = 0; | ||
String ip = "192.168.25.207"; | ||
WiFiClient wifiClient; | ||
char errorMessage[100] = ""; | ||
int printPercent = 0; | ||
int direction = 0; // 0 for along the strip, 1 for reversed direction | ||
|
||
static const char _name[]; | ||
static const char _enabled[]; | ||
bool enabled = false; | ||
|
||
void httpGet(WiFiClient &client, char *errorMessage) | ||
{ | ||
// https://arduinojson.org/v6/example/http-client/ | ||
// is this the most compact way to do http get and put it in arduinojson object??? | ||
// would like async response ... ??? | ||
client.setTimeout(10000); | ||
if (!client.connect(ip.c_str(), 80)) | ||
{ | ||
strcat(errorMessage, PSTR("Connection failed")); | ||
} | ||
else | ||
{ | ||
// Send HTTP request | ||
client.println(F("GET /printer/objects/query?virtual_sdcard=progress HTTP/1.0")); | ||
client.println("Host: " + ip); | ||
client.println(F("Connection: close")); | ||
if (client.println() == 0) | ||
{ | ||
strcat(errorMessage, PSTR("Failed to send request")); | ||
} | ||
else | ||
{ | ||
// Check HTTP status | ||
char status[32] = {0}; | ||
client.readBytesUntil('\r', status, sizeof(status)); | ||
if (strcmp(status, "HTTP/1.1 200 OK") != 0) | ||
{ | ||
strcat(errorMessage, PSTR("Unexpected response: ")); | ||
strcat(errorMessage, status); | ||
} | ||
else | ||
{ | ||
// Skip HTTP headers | ||
char endOfHeaders[] = "\r\n\r\n"; | ||
if (!client.find(endOfHeaders)) | ||
{ | ||
strcat(errorMessage, PSTR("Invalid response")); | ||
} | ||
} | ||
} | ||
} | ||
} | ||
|
||
public: | ||
void setup() | ||
{ | ||
} | ||
|
||
void connected() | ||
{ | ||
} | ||
|
||
void loop() | ||
{ | ||
if (enabled) | ||
{ | ||
if (WLED_CONNECTED) | ||
{ | ||
if (millis() - lastTime > 10000) | ||
{ | ||
httpGet(wifiClient, errorMessage); | ||
if (strcmp(errorMessage, "") == 0) | ||
{ | ||
PSRAMDynamicJsonDocument klipperDoc(4096); // in practive about 2673 | ||
DeserializationError error = deserializeJson(klipperDoc, wifiClient); | ||
if (error) | ||
{ | ||
strcat(errorMessage, PSTR("deserializeJson() failed: ")); | ||
strcat(errorMessage, error.c_str()); | ||
} | ||
printPercent = (int)(klipperDoc["result"]["status"]["virtual_sdcard"]["progress"].as<float>() * 100); | ||
|
||
DEBUG_PRINT("Percent: "); | ||
DEBUG_PRINTLN((int)(klipperDoc["result"]["status"]["virtual_sdcard"]["progress"].as<float>() * 100)); | ||
DEBUG_PRINT("LEDs: "); | ||
DEBUG_PRINTLN(direction == 2 ? (strip.getLengthTotal() / 2) * printPercent / 100 : strip.getLengthTotal() * printPercent / 100); | ||
} | ||
else | ||
{ | ||
DEBUG_PRINTLN(errorMessage); | ||
DEBUG_PRINTLN(ip); | ||
} | ||
lastTime = millis(); | ||
} | ||
} | ||
} | ||
} | ||
|
||
void addToConfig(JsonObject &root) | ||
{ | ||
JsonObject top = root.createNestedObject("Klipper Printing Percentage"); | ||
top["Enabled"] = enabled; | ||
top["Klipper IP"] = ip; | ||
top["Direction"] = direction; | ||
} | ||
|
||
bool readFromConfig(JsonObject &root) | ||
{ | ||
// default settings values could be set here (or below using the 3-argument getJsonValue()) instead of in the class definition or constructor | ||
// setting them inside readFromConfig() is slightly more robust, handling the rare but plausible use case of single value being missing after boot (e.g. if the cfg.json was manually edited and a value was removed) | ||
|
||
JsonObject top = root["Klipper Printing Percentage"]; | ||
|
||
bool configComplete = !top.isNull(); | ||
configComplete &= getJsonValue(top["Klipper IP"], ip); | ||
configComplete &= getJsonValue(top["Enabled"], enabled); | ||
configComplete &= getJsonValue(top["Direction"], direction); | ||
return configComplete; | ||
} | ||
|
||
/* | ||
* 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) | ||
{ | ||
JsonObject user = root["u"]; | ||
if (user.isNull()) | ||
user = root.createNestedObject("u"); | ||
|
||
JsonArray infoArr = user.createNestedArray(FPSTR(_name)); | ||
String uiDomString = F("<button class=\"btn btn-xs\" onclick=\"requestJson({"); | ||
uiDomString += FPSTR(_name); | ||
uiDomString += F(":{"); | ||
uiDomString += FPSTR(_enabled); | ||
uiDomString += enabled ? F(":false}});\">") : F(":true}});\">"); | ||
uiDomString += F("<i class=\"icons"); | ||
uiDomString += enabled ? F(" on") : F(" off"); | ||
uiDomString += F("\"></i>"); | ||
uiDomString += F("</button>"); | ||
infoArr.add(uiDomString); | ||
} | ||
|
||
void addToJsonState(JsonObject &root) | ||
{ | ||
JsonObject usermod = root[FPSTR(_name)]; | ||
if (usermod.isNull()) | ||
{ | ||
usermod = root.createNestedObject(FPSTR(_name)); | ||
} | ||
usermod["on"] = enabled; | ||
} | ||
void readFromJsonState(JsonObject &root) | ||
{ | ||
JsonObject usermod = root[FPSTR(_name)]; | ||
if (!usermod.isNull()) | ||
{ | ||
if (usermod[FPSTR(_enabled)].is<bool>()) | ||
{ | ||
enabled = usermod[FPSTR(_enabled)].as<bool>(); | ||
} | ||
} | ||
} | ||
|
||
/* | ||
* handleOverlayDraw() is called just before every show() (LED strip update frame) after effects have set the colors. | ||
* Use this to blank out some LEDs or set them to a different color regardless of the set effect mode. | ||
* Commonly used for custom clocks (Cronixie, 7 segment) | ||
*/ | ||
void handleOverlayDraw() | ||
{ | ||
if (enabled) | ||
{ | ||
if (direction == 0) // normal | ||
{ | ||
for (int i = 0; i < strip.getLengthTotal() * printPercent / 100; i++) | ||
{ | ||
strip.setPixelColor(i, strip.getSegment(0).colors[1]); | ||
} | ||
} | ||
else if (direction == 1) // reversed | ||
{ | ||
for (int i = 0; i < strip.getLengthTotal() * printPercent / 100; i++) | ||
{ | ||
strip.setPixelColor(strip.getLengthTotal() - i, strip.getSegment(0).colors[1]); | ||
} | ||
} | ||
else if (direction == 2) // center | ||
{ | ||
for (int i = 0; i < (strip.getLengthTotal() / 2) * printPercent / 100; i++) | ||
{ | ||
strip.setPixelColor((strip.getLengthTotal() / 2) + i, strip.getSegment(0).colors[1]); | ||
strip.setPixelColor((strip.getLengthTotal() / 2) - i, strip.getSegment(0).colors[1]); | ||
} | ||
} | ||
else | ||
{ | ||
direction = 0; | ||
} | ||
} | ||
} | ||
|
||
/* | ||
* 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_KLIPPER; | ||
} | ||
}; | ||
const char klipper_percentage::_name[] PROGMEM = "Klipper_Percentage"; | ||
const char klipper_percentage::_enabled[] PROGMEM = "enabled"; |
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
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
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
Oops, something went wrong.