diff --git a/README.md b/README.md index 7452a47..1fc3446 100644 --- a/README.md +++ b/README.md @@ -15,23 +15,26 @@ nice-looking LED matrix everytime you want to update the software. Checkout the code, rename `include/config.sample.h` to `include/config.h` and edit it to match your preferences / environment. -Then compile and flash it, preferrably using PlatformIO. +Then compile and flash it, preferably using PlatformIO. ## Control it -Currently, control is only possible via MQTT. `MQTT_TOPIC` is set in -`include/config.h` and defaults to `pitrix`. +Currently, control is possible via MQTT and / or HTTP REST API. +To use MQTT, you have to define `MQTT_ENABLE` and configure your MQTT sever's credentials. MQTT_TOPIC` is set in `include/config.h` and defaults to `pitrix`. + +To use the HTTP REST API, you have to define HTTP_SERVER_ENABLE and set a port number +to listen on (80 is set by default). Possible commands / topics are: -* `MQTT_TOPIC/mode` lets you select an effect to show. See `src/effects.cpp` +* `MQTT_TOPIC/mode` / `POST /mode` lets you select an effect to show. See `src/effects.cpp` for a list. Default effect is `cycle`, which will cycle through some of the available effects. Another effect is `off`, which will just display black, effectively turning the display off. (pitrix stays running, so you can turn it on again by simply selecting another mode.) -* `MQTT_TOPIC/brightness` sets the brightness of the display. Valid values +* `MQTT_TOPIC/brightness` / `POST /brightness` sets the brightness of the display. Valid values are between 1 (darkest possible setting) and 255 (maximum brightness). -* `MQTT_TOPIC/reboot` reboots pitrix. Send any value. +* `MQTT_TOPIC/reboot` / `POST /reboot` reboots pitrix. Send any value. You can set retained values to have pitrix read them at startup, effectively setting a default effect or brightness. (Do NOT set a retained value for @@ -49,4 +52,6 @@ seconds: * `MQTT_TOPIC/uptime` contains the uptime of pitrix in seconds. * `MQTT_TOPIC/fps` contains the currently reached frames per second. +If you enabled HTTP server, you can always make GET requests to `/free_heap`, `/uptime` or `/fps` to get those values. + If you enabled `DEBUG`, log messages will be sent to `MQTT_TOPIC/log`. diff --git a/include/config.sample.h b/include/config.sample.h index 3417a69..d638b85 100644 --- a/include/config.sample.h +++ b/include/config.sample.h @@ -24,6 +24,9 @@ #define NTP_INTERVAL 300000 // Interval in ms to update the time from the NTP server. 300000 ms = 5 minutes #define NTP_OFFSET 7200 // Offset of your local time from UTC in seconds. Germany, daylight savings time = 2 hours = 7200 seconds +#define HTTP_SERVER_ENABLE +#define HTTP_SERVER_PORT 80 + #define MQTT_ENABLE // Use MQTT. Add slashes to the start of the line to disable MQTT completely. #define MQTT_SERVER "..." // Data for connecting to the MQTT server #define MQTT_PORT 1883 diff --git a/include/http_server.h b/include/http_server.h new file mode 100644 index 0000000..9d20483 --- /dev/null +++ b/include/http_server.h @@ -0,0 +1,11 @@ +#pragma once +#include "config.h" + +#ifdef HTTP_SERVER_ENABLE +#include + +extern ESP8266WebServer http_server; + +void http_server_setup(); +void http_server_loop(); +#endif diff --git a/src/http_server.cpp b/src/http_server.cpp new file mode 100644 index 0000000..f1f06a7 --- /dev/null +++ b/src/http_server.cpp @@ -0,0 +1,76 @@ +#include "config.h" + +#ifdef HTTP_SERVER_ENABLE + +#include "http_server.h" +#include "effects.h" + +ESP8266WebServer http_server(HTTP_SERVER_PORT); + +void http_server_400() { + http_server.send(400); +} + +void http_server_setup() { + PGM_P text_plain = PSTR("text/plain"); + http_server.on("/", HTTP_GET, [&](){ + LOGln("HTTP * GET /"); + http_server.send_P(200, text_plain, PSTR("Welcome to pitrix.")); + }); + http_server.on("/free_heap", HTTP_GET, [&](){ + LOGln("HTTP * GET /free_heap"); + http_server.send(200, "text/plain", String(ESP.getFreeHeap())); + }); + http_server.on("/uptime", HTTP_GET, [&](){ + LOGln("HTTP * GET /uptime"); + http_server.send(200, "text/plain", String(millis()/1000)); + }); + http_server.on("/fps", HTTP_GET, [](){ + LOGln("HTTP * GET /fps"); + http_server.send(200, "text/plain", String(FastLED.getFPS())); + }); + http_server.on("/reboot", HTTP_POST, [](){ + LOGln("HTTP * POST /reboot"); + ESP.restart(); + }); + http_server.on("/brightness", HTTP_POST, [&](){ + LOG("HTTP * POST /brightness with value "); LOGln(http_server.arg("plain")); + if (!http_server.hasArg("plain")) { + http_server.send_P(400, text_plain, PSTR("No brightness given")); + return; + } + long val = http_server.arg("plain").toInt(); + if (val==0 || val>255) { + http_server.send_P(400, text_plain, PSTR("New value out of bounds. (1-255)")); + return; + } + FastLED.setBrightness(val); + http_server.send(200, "text/plain", "OK"); + }); + http_server.on("/mode", HTTP_POST, [&](){ + LOGln("HTTP * POST /mode with value "); LOGln(http_server.arg("plain")); + if (!http_server.hasArg("plain")) { + http_server.send_P(400, text_plain, PSTR("No effect given.")); + return; + } + String val = http_server.arg("plain"); + for (int i=0; isize(); i++) { + EffectEntry e = effects->get(i); + if (val.compareTo(e.name)==0) { + current_effect->stop(); + current_effect = e.effect; + current_effect->start(); + http_server.send(200, "text/plain", "OK"); + return; + } + } + http_server.send_P(400, text_plain, PSTR("Unknown effect.")); + }); + http_server.begin(); +} + +void http_server_loop() { + http_server.handleClient(); +} + +#endif diff --git a/src/pitrix.cpp b/src/pitrix.cpp index 511d306..55eafb3 100644 --- a/src/pitrix.cpp +++ b/src/pitrix.cpp @@ -11,6 +11,7 @@ #include "my_mqtt.h" #include "functions.h" #include "effects.h" +#include "http_server.h" uint8_t starting_up = OTA_STARTUP_DELAY; int loop_timeouts = 0; @@ -26,6 +27,9 @@ void setup() { ota_setup(); fastled_setup(); ntpClient.begin(); + #ifdef HTTP_SERVER_ENABLE + http_server_setup(); + #endif #ifdef MQTT_ENABLE mqtt_setup(); #endif @@ -57,6 +61,9 @@ void loop() { #ifdef MQTT_ENABLE mqtt_loop(); #endif + #ifdef HTTP_SERVER_ENABLE + http_server_loop(); + #endif EVERY_N_MILLISECONDS(100) { baseHue++;