From df5c4fa76ae193f3fe5514681c8577ee1ccb39dd Mon Sep 17 00:00:00 2001 From: foorschtbar Date: Tue, 19 Sep 2023 20:16:48 +0200 Subject: [PATCH 01/30] Basic Ulanzi support --- src/PixelIt.ino | 7880 ++++++++++++++++++++++++----------------------- 1 file changed, 3964 insertions(+), 3916 deletions(-) diff --git a/src/PixelIt.ino b/src/PixelIt.ino index f287aef..ebaaf4c 100644 --- a/src/PixelIt.ino +++ b/src/PixelIt.ino @@ -1,3916 +1,3964 @@ -#if defined(ESP8266) -#include -#include -#include -#include - -#elif defined(ESP32) -#include -#include -#include -#include -#endif - -#include -// BME Sensor -#include -#include -#include -#include -#include -// WiFi & Web -#include -#include -#include -#include -// MQTT -#include -// Matrix -#include -#include -#include -#include -// Misc -#include -#include -#include -#include -#include -#include -#include "ColorConverterLib.h" -#include -#include -#include -#include -// PixelIT Stuff -#include "PixelItFont.h" -#include "Webinterface.h" -#include "Tools.h" -#include "UpdateScreen.h" -#include "Liveview.h" -#define TELEMETRY_INTERVAL 1000 * 60 * 60 * 12 // 12 Hours -#define CHECKUPDATE_INTERVAL 1000 * 60 * 6 * 8 // 8 Hours -#define CHECKUPDATESCREEN_INTERVAL 1000 * 60 * 5 // 5 Minutes -#define CHECKUPDATESCREEN_DURATION 1000 * 5 // 5 Seconds -#define SEND_LIVEVIEW_INTERVAL 250 // 0.5 Seconds, 0 to disable - -#define VERSION "0.0.0-beta" // will be replaced by build piple with Git-Tag! - -void FadeOut(int = 10, int = 0); -void FadeIn(int = 10, int = 0); - -class SetGPIO -{ -public: - int gpio; - ulong resetMillis; -}; -#define SET_GPIO_SIZE 4 -SetGPIO setGPIOReset[SET_GPIO_SIZE]; - -//// MQTT Config -bool mqttAktiv = false; -String mqttUser = ""; -String mqttPassword = ""; -String mqttServer = ""; -String mqttMasterTopic = "pixelit/"; -int mqttPort = 1883; -unsigned long mqttLastReconnectAttempt = 0; // will store last time reconnect to mqtt broker -const int MQTT_RECONNECT_INTERVAL = 15000; -// #define MQTT_MAX_PACKET_SIZE 8000 - -//// LDR Config -#define LDR_PIN A0 - -//// GPIO Config -#if defined(ESP8266) -const int MATRIX_PIN = D2; -#elif defined(ESP32) -const int MATRIX_PIN = 27; -#endif - -String dfpRXPin = "Pin_D7"; -String dfpTXPin = "Pin_D8"; -String onewirePin = "Pin_D1"; -String SCLPin = "Pin_D1"; -String SDAPin = "Pin_D3"; -String ldrDevice = "GL5516"; -unsigned long ldrPulldown = 10000; // 10k pulldown-resistor -unsigned int ldrSmoothing = 0; - -// Telemetry API -#define TELEMETRY_SERVER_HOST "pixelit.bastelbunker.de" -#define TELEMETRY_SERVER_PATH "/api/telemetry" -#define TELEMETRY_SERVER_PORT 80 - -// Check Update API -#define CHECKUPDATE_SERVER_HOST "pixelit.bastelbunker.de" -#define CHECKUPDATE_SERVER_PATH "/api/lastversion" -#define CHECKUPDATE_SERVER_PORT 80 - -String btnPin[] = {"Pin_D0", "Pin_D4", "Pin_D5"}; -bool btnEnabled[] = {false, false, false}; -int btnPressedLevel[] = {LOW, LOW, LOW}; - -enum btnStates -{ - btnState_Released, - btnState_PressedNew, - btnState_PressedBefore, -}; - -const String btnAPINames[]{"leftButton", "middleButton", "rightButton"}; -const String btnLogNames[]{"Left button", "Middle button", "Right button"}; - -btnStates btnState[] = {btnState_Released, btnState_Released, btnState_Released}; -bool btnLastPublishState[] = {false, false, false}; - -enum btnActions -{ - btnAction_DoNothing = 0, - btnAction_GotoClock = 1, - btnAction_ToggleSleepMode = 2, - btnAction_MP3PlayPause = 3, - btnAction_MP3PlayPrevious = 4, - btnAction_MP3PlayNext = 5, -}; - -btnActions btnAction[] = {btnAction_ToggleSleepMode, btnAction_GotoClock, btnAction_DoNothing}; - -CRGB leds[MATRIX_WIDTH * MATRIX_HEIGHT]; - -#if defined(ESP8266) -bool isESP8266 = true; -#else -bool isESP8266 = false; -#endif - -#if defined(ESP32) -TwoWire twowire(BME280_ADDRESS_ALTERNATE); -#else -TwoWire twowire; -#endif -Adafruit_BME280 *bme280; -Adafruit_BMP280 *bmp280; -Adafruit_BME680 *bme680; -unsigned long lastBME680read = 0; -DHTesp dht; - -// TempSensor -enum TempSensor -{ - TempSensor_None, - TempSensor_BME280, - TempSensor_DHT, - TempSensor_BME680, - TempSensor_BMP280, -}; -TempSensor tempSensor = TempSensor_None; - -// TemperatureUnit -enum TemperatureUnit -{ - TemperatureUnit_Celsius, - TemperatureUnit_Fahrenheit -}; -TemperatureUnit temperatureUnit = TemperatureUnit_Celsius; - -LightDependentResistor *photocell; -BH1750 *bh1750; -Max44009 *max44009; - -enum LuxSensor -{ - LuxSensor_LDR, - LuxSensor_BH1750, - LuxSensor_Max44009, -}; -LuxSensor luxSensor = LuxSensor_LDR; - -FastLED_NeoMatrix *matrix; -WiFiClient wifiClientMQTT; -WiFiClient wifiClientHTTP; -WiFiUDP udp; -PubSubClient client(wifiClientMQTT); -WiFiManager wifiManager; -#if defined(ESP8266) -ESP8266WebServer server(80); -ESP8266HTTPUpdateServer httpUpdater; -#elif defined(ESP32) -WebServer server(80); -HTTPUpdateServer httpUpdater; -#endif -Liveview liveview; - -WebSocketsServer webSocket = WebSocketsServer(81); -DFPlayerMini_Fast mp3Player; -SoftwareSerial *softSerial; -uint initialVolume = 10; - -// Matrix Vars -int currentMatrixBrightness = 127; -bool matrixBrightnessAutomatic = true; -int mbaDimMin = 20; -int mbaDimMax = 100; -int mbaLuxMin = 0; -int mbaLuxMax = 400; -int matrixType = 1; -String note; -String hostname; -String matrixTempCorrection = "default"; - -// System Vars -bool sleepMode = false; -bool bootScreenAktiv = true; -bool bootSound = false; -String optionsVersion = ""; -// Millis timestamp of the last receiving screen -unsigned long lastScreenMessageMillis = 0; - -// Bmp Vars -uint16_t bmpArray[64]; -bool withBMP = false; -int bmpWidth = 8; -int bmpHeight = 8; -int bmpPosX = 0; -int bmpPosY = 0; - -// Timerserver Vars -String ntpServer = "de.pool.ntp.org"; -uint ntpRetryCounter = 0; -unsigned long ntpTimeOut = 0; -#define NTP_MAX_RETRYS 3 -#define NTP_TIMEOUT_SEC 60 - -// Clock Vars -bool clockBlink = false; -bool clockAktiv = true; -bool clock24Hours = true; -bool clockDateDayMonth = true; -bool clockDayOfWeekFirstMonday = true; -bool clockDayLightSaving = true; -bool clockSwitchAktiv = true; -bool clockWithSeconds = false; -bool clockAutoFallbackActive = false; -uint clockAutoFallbackAnimation = 1; -uint clockSwitchSec = 7; -uint clockCounterClock = 0; -uint clockCounterDate = 0; -float clockTimeZone = 1; -time_t clockLastUpdate; -uint8_t clockColorR = 255, clockColorG = 255, clockColorB = 255; -uint clockAutoFallbackTime = 30; -bool forceClock = false; -bool clockBlinkAnimated = true; -bool clockFatFont = false; -bool clockDrawWeekDays = true; - -// Scrolltext Vars -bool scrollTextAktivLoop = false; -unsigned long scrollTextPrevMillis = 0; -uint scrollTextDefaultDelay = 100; -uint scrollTextDelay; -int scrollCurPos; -int scrollposY; -int scrollposX; -int scrollxTextWidth; -int scrollxAvailableTextSpace; -String scrollTextString; - -// Animate BMP Vars -uint16_t animationBmpList[10][64]; -bool animateBMPAktivLoop = false; -unsigned long animateBMPPrevMillis = 0; -int animateBMPCounter = 0; -bool animateBMPReverse = false; -bool animateBMPRubberbandingAktiv = false; -uint animateBMPDelay; -int animateBMPLimitLoops = -1; -int animateBMPLoopCount = 0; -int animateBMPLimitFrames = -1; -int animateBMPFrameCount = 0; - -// Sensors Vars -unsigned long sendLuxPrevMillis = 0; -unsigned long sendSensorPrevMillis = 0; -unsigned long sendInfoPrevMillis = 0; -String oldGetMatrixInfo; -String oldGetLuxSensor; -String oldGetSensor; -float currentLux = 0.0f; -float luxOffset = 0.0f; -float temperatureOffset = 0.0f; -float humidityOffset = 0.0f; -float pressureOffset = 0.0f; -float gasOffset = 0.0f; - -// Other Vars -bool sendTelemetry = true; -unsigned long sendTelemetryPrevMillis = 0; -unsigned long forcedScreenIsActiveUntil = 0; -bool checkUpdateScreen = true; -unsigned long checkUpdateScreenPrevMillis = 0; -unsigned long checkUpdatePrevMillis = 0; -String lastReleaseVersion = VERSION; - -// MP3Player Vars -String OldGetMP3PlayerInfo; - -// Websoket Vars -String websocketConnection[10]; - -String ResetReason() -{ -#if defined(ESP8266) - return ESP.getResetReason(); -#elif defined(ESP32) - switch (esp_reset_reason()) - { - case ESP_RST_POWERON: - return "Power-on reset"; - case ESP_RST_EXT: - return "External reset"; - case ESP_RST_SW: - return "Software reset"; - case ESP_RST_PANIC: - return "Panic (hardware or software)"; - case ESP_RST_INT_WDT: - return "Internal watchdog reset"; - case ESP_RST_TASK_WDT: - return "Task watchdog reset"; - case ESP_RST_WDT: - return "Watchdog reset"; - case ESP_RST_DEEPSLEEP: - return "Deep sleep reset"; - case ESP_RST_BROWNOUT: - return "Brownout reset"; - case ESP_RST_SDIO: - return "SDIO reset"; - default: - return "Unknown reset reason"; - } -#endif -} - -void SetCurrentMatrixBrightness(float newBrightness) -{ - currentMatrixBrightness = newBrightness; - matrix->setBrightness(currentMatrixBrightness); -} - -void EnteredHotspotCallback(WiFiManager *manager) -{ - Log(F("Hotspot"), "Waiting for WiFi configuration"); - matrix->clear(); - DrawTextHelper("HOTSPOT", false, false, false, false, false, 255, 255, 255, 3, 1); - FadeIn(); -} - -void SaveConfig() -{ - // save the custom parameters to FS - DynamicJsonBuffer jsonBuffer; - JsonObject &json = jsonBuffer.createObject(); - - json["version"] = VERSION; - json["isESP8266"] = isESP8266; - json["temperatureUnit"] = static_cast(temperatureUnit); - json["matrixBrightnessAutomatic"] = matrixBrightnessAutomatic; - json["mbaDimMin"] = mbaDimMin; - json["mbaDimMax"] = mbaDimMax; - json["mbaLuxMin"] = mbaLuxMin; - json["mbaLuxMax"] = mbaLuxMax; - json["matrixBrightness"] = currentMatrixBrightness; - json["matrixType"] = matrixType; - json["note"] = note; - json["hostname"] = hostname; - json["matrixTempCorrection"] = matrixTempCorrection; - json["ntpServer"] = ntpServer; - json["clockTimeZone"] = clockTimeZone; - - String clockColorHex; - ColorConverter::RgbToHex(clockColorR, clockColorG, clockColorB, clockColorHex); - json["clockColor"] = "#" + clockColorHex; - - json["clockSwitchAktiv"] = clockSwitchAktiv; - json["clockSwitchSec"] = clockSwitchSec; - json["clock24Hours"] = clock24Hours; - json["clockDayLightSaving"] = clockDayLightSaving; - json["clockWithSeconds"] = clockWithSeconds; - json["clockAutoFallbackActive"] = clockAutoFallbackActive; - json["clockAutoFallbackTime"] = clockAutoFallbackTime; - json["clockAutoFallbackAnimation"] = clockAutoFallbackAnimation; - json["clockDateDayMonth"] = clockDateDayMonth; - json["clockDayOfWeekFirstMonday"] = clockDayOfWeekFirstMonday; - json["clockBlinkAnimated"] = clockBlinkAnimated; - json["clockFatFont"] = clockFatFont; - json["clockDrawWeekDays"] = clockDrawWeekDays; - json["scrollTextDefaultDelay"] = scrollTextDefaultDelay; - json["bootScreenAktiv"] = bootScreenAktiv; - json["bootSound"] = bootSound; - json["mqttAktiv"] = mqttAktiv; - json["mqttUser"] = mqttUser; - json["mqttPassword"] = mqttPassword; - json["mqttServer"] = mqttServer; - json["mqttMasterTopic"] = mqttMasterTopic; - json["mqttPort"] = mqttPort; - json["luxOffset"] = luxOffset; - json["temperatureOffset"] = temperatureOffset; - json["humidityOffset"] = humidityOffset; - json["pressureOffset"] = pressureOffset; - json["gasOffset"] = gasOffset; - - json["dfpRXpin"] = dfpRXPin; - json["dfpTXpin"] = dfpTXPin; - json["onewirePin"] = onewirePin; - json["SCLPin"] = SCLPin; - json["SDAPin"] = SDAPin; - for (uint b = 0; b < 3; b++) - { - json["btn" + String(b) + "Pin"] = btnPin[b]; - json["btn" + String(b) + "PressedLevel"] = btnPressedLevel[b]; - json["btn" + String(b) + "Enabled"] = btnEnabled[b]; - json["btn" + String(b) + "Action"] = static_cast(btnAction[b]); - } - json["ldrDevice"] = ldrDevice; - json["ldrPulldown"] = ldrPulldown; - json["ldrSmoothing"] = ldrSmoothing; - json["initialVolume"] = initialVolume; - json["sendTelemetry"] = sendTelemetry; - json["checkUpdateScreen"] = checkUpdateScreen; - -#if defined(ESP8266) - File configFile = LittleFS.open("/config.json", "w"); -#elif defined(ESP32) - File configFile = SPIFFS.open("/config.json", "w"); -#endif - json.printTo(configFile); - configFile.close(); - Log("SaveConfig", "Saved"); - // end save -} - -void LoadConfig() -{ - // file exists, reading and loading -#if defined(ESP8266) - if (LittleFS.exists("/config.json")) - { - File configFile = LittleFS.open("/config.json", "r"); -#elif defined(ESP32) - if (SPIFFS.exists("/config.json")) - { - File configFile = SPIFFS.open("/config.json", "r"); -#endif - if (configFile) - { - // Serial.println("opened config file"); - - DynamicJsonBuffer jsonBuffer; - JsonObject &json = jsonBuffer.parseObject(configFile); - - if (json.success()) - { - SetConfigVariables(json); - Log("LoadConfig", "Loaded"); - } - } - } - else - { - Log("LoadConfig", "No Configfile, init new file"); - SaveConfig(); - } -} - -void SetConfig(JsonObject &json) -{ - SetConfigVariables(json); - SaveConfig(); -} - -void SetConfigVariables(JsonObject &json) -{ - if (json.containsKey("version")) - { - optionsVersion = json["version"].as(); - } - - if (json.containsKey("temperatureUnit")) - { - temperatureUnit = static_cast(json["temperatureUnit"].as()); - } - - if (json.containsKey("matrixBrightnessAutomatic")) - { - matrixBrightnessAutomatic = json["matrixBrightnessAutomatic"].as(); - } - - if (json.containsKey("mbaDimMin")) - { - mbaDimMin = json["mbaDimMin"].as(); - } - - if (json.containsKey("mbaDimMax")) - { - mbaDimMax = json["mbaDimMax"].as(); - } - - if (json.containsKey("mbaLuxMin")) - { - mbaLuxMin = json["mbaLuxMin"].as(); - } - - if (json.containsKey("mbaLuxMax")) - { - mbaLuxMax = json["mbaLuxMax"].as(); - } - - if (json.containsKey("matrixBrightness")) - { - SetCurrentMatrixBrightness(json["matrixBrightness"].as()); - } - - if (json.containsKey("matrixType")) - { - matrixType = json["matrixType"].as(); - } - - if (json.containsKey("note")) - { - note = json["note"].as(); - } - - if (json.containsKey("hostname")) - { - String hostname_raw = json["hostname"].as(); - hostname = ""; - for (uint8_t n = 0; n < hostname_raw.length(); n++) - { - if ((hostname_raw.charAt(n) >= '0' && hostname_raw.charAt(n) <= '9') || (hostname_raw.charAt(n) >= 'A' && hostname_raw.charAt(n) <= 'Z') || (hostname_raw.charAt(n) >= 'a' && hostname_raw.charAt(n) <= 'z') || (hostname_raw.charAt(n) == '_') || (hostname_raw.charAt(n) == '-')) - hostname += hostname_raw.charAt(n); - } - if (hostname.isEmpty()) - { - hostname = "PixelIt"; - } - } - - if (json.containsKey("matrixTempCorrection")) - { - matrixTempCorrection = json["matrixTempCorrection"].as(); - } - - if (json.containsKey("ntpServer")) - { - ntpServer = json["ntpServer"].as(); - } - - if (json.containsKey("clockTimeZone")) - { - clockTimeZone = json["clockTimeZone"].as(); - } - - if (json.containsKey("clockColor")) - { - ColorConverter::HexToRgb(json["clockColor"].as(), clockColorR, clockColorG, clockColorB); - } - - if (json.containsKey("clockSwitchAktiv")) - { - clockSwitchAktiv = json["clockSwitchAktiv"].as(); - } - - if (json.containsKey("clockSwitchSec")) - { - clockSwitchSec = json["clockSwitchSec"].as(); - } - - if (json.containsKey("clock24Hours")) - { - clock24Hours = json["clock24Hours"].as(); - } - - if (json.containsKey("clockDayLightSaving")) - { - clockDayLightSaving = json["clockDayLightSaving"].as(); - } - - if (json.containsKey("clockWithSeconds")) - { - clockWithSeconds = json["clockWithSeconds"].as(); - } - - if (json.containsKey("clockBlinkAnimated")) - { - clockBlinkAnimated = json["clockBlinkAnimated"].as(); - } - - if (json.containsKey("clockAutoFallbackActive")) - { - clockAutoFallbackActive = json["clockAutoFallbackActive"].as(); - } - - if (json.containsKey("clockAutoFallbackAnimation")) - { - clockAutoFallbackAnimation = json["clockAutoFallbackAnimation"].as(); - } - - if (json.containsKey("clockAutoFallbackTime")) - { - clockAutoFallbackTime = json["clockAutoFallbackTime"].as(); - } - - if (json.containsKey("clockDateDayMonth")) - { - clockDateDayMonth = json["clockDateDayMonth"].as(); - } - - if (json.containsKey("clockDayOfWeekFirstMonday")) - { - clockDayOfWeekFirstMonday = json["clockDayOfWeekFirstMonday"].as(); - } - - if (json.containsKey("clockFatFont")) - { - clockFatFont = json["clockFatFont"].as(); - } - - if (json.containsKey("clockDrawWeekDays")) - { - clockDrawWeekDays = json["clockDrawWeekDays"].as(); - } - - if (json.containsKey("scrollTextDefaultDelay")) - { - scrollTextDefaultDelay = json["scrollTextDefaultDelay"].as(); - } - - if (json.containsKey("bootScreenAktiv")) - { - bootScreenAktiv = json["bootScreenAktiv"].as(); - } - - if (json.containsKey("bootSound")) - { - bootSound = json["bootSound"].as(); - } - - if (json.containsKey("mqttAktiv")) - { - mqttAktiv = json["mqttAktiv"].as(); - } - - if (json.containsKey("mqttUser")) - { - mqttUser = json["mqttUser"].as(); - } - - if (json.containsKey("mqttPassword")) - { - mqttPassword = json["mqttPassword"].as(); - } - - if (json.containsKey("mqttServer")) - { - mqttServer = json["mqttServer"].as(); - } - - if (json.containsKey("mqttMasterTopic")) - { - mqttMasterTopic = json["mqttMasterTopic"].as(); - mqttMasterTopic.trim(); - if (!mqttMasterTopic.endsWith("/")) - { - mqttMasterTopic += "/"; - } - } - - if (json.containsKey("mqttPort")) - { - mqttPort = json["mqttPort"].as(); - } - - if (json.containsKey("luxOffset")) - { - luxOffset = json["luxOffset"].as(); - } - - if (json.containsKey("temperatureOffset")) - { - temperatureOffset = json["temperatureOffset"].as(); - } - - if (json.containsKey("humidityOffset")) - { - humidityOffset = json["humidityOffset"].as(); - } - - if (json.containsKey("pressureOffset")) - { - pressureOffset = json["pressureOffset"].as(); - } - - if (json.containsKey("gasOffset")) - { - gasOffset = json["gasOffset"].as(); - } - - if (json.containsKey("dfpRXpin")) - { - dfpRXPin = json["dfpRXpin"].as(); - } - - if (json.containsKey("dfpTXpin")) - { - dfpTXPin = json["dfpTXpin"].as(); - } - - if (json.containsKey("onewirePin")) - { - onewirePin = json["onewirePin"].as(); - } - - if (json.containsKey("SCLPin")) - { - SCLPin = json["SCLPin"].as(); - } - - if (json.containsKey("SDAPin")) - { - SDAPin = json["SDAPin"].as(); - } - - for (uint b = 0; b < 3; b++) - { - if (json.containsKey("btn" + String(b) + "Pin")) - { - btnPin[b] = json["btn" + String(b) + "Pin"].as(); - } - if (json.containsKey("btn" + String(b) + "PressedLevel")) - { - btnPressedLevel[b] = json["btn" + String(b) + "PressedLevel"].as(); - } - if (json.containsKey("btn" + String(b) + "Enabled")) - { - btnEnabled[b] = json["btn" + String(b) + "Enabled"].as(); - } - if (json.containsKey("btn" + String(b) + "Action")) - { - btnAction[b] = static_cast(json["btn" + String(b) + "Action"].as()); - } - } - - if (json.containsKey("ldrDevice")) - { - ldrDevice = json["ldrDevice"].as(); - } - - if (json.containsKey("ldrPulldown")) - { - ldrPulldown = json["ldrPulldown"].as(); - } - - if (json.containsKey("ldrSmoothing")) - { - ldrSmoothing = json["ldrSmoothing"].as(); - } - - if (json.containsKey("initialVolume")) - { - initialVolume = json["initialVolume"].as(); - } - - if (json.containsKey("sendTelemetry")) - { - sendTelemetry = json["sendTelemetry"].as(); - } - - if (json.containsKey("checkUpdateScreen")) - { - checkUpdateScreen = json["checkUpdateScreen"].as(); - } -} - -void EraseWifiCredentials() -{ - wifiManager.resetSettings(); - delay(300); - ESP.restart(); - delay(300); -} - -void HandleGetMainPage() -{ - server.sendHeader(F("Connection"), F("close")); - server.send(200, F("text/html"), mainPage); -} - -void HandleNotFound() -{ - if (server.method() == HTTP_OPTIONS) - { - server.sendHeader(F("Access-Control-Allow-Origin"), "*"); - server.send(204); - } - - server.sendHeader("Location", "/update", true); - server.send(302, F("text/plain"), ""); -} - -void HandleScreen() -{ - DynamicJsonBuffer jsonBuffer; - String args = String(server.arg("plain").c_str()); - JsonObject &json = jsonBuffer.parseObject(args.begin()); - server.sendHeader(F("Connection"), F("close")); - server.sendHeader(F("Access-Control-Allow-Origin"), "*"); - - if (json.success()) - { - server.send(200, F("application/json"), F("{\"response\":\"OK\"}")); - Log(F("HandleScreen"), "Incoming JSON length: " + String(json.measureLength())); - CreateFrames(json); - } - else - { - server.send(406, F("application/json"), F("{\"response\":\"Not Acceptable\"}")); - } -} - -void HandleSetConfig() -{ - DynamicJsonBuffer jsonBuffer; - JsonObject &json = jsonBuffer.parseObject(server.arg("plain")); - server.sendHeader(F("Connection"), F("close")); - - if (json.success()) - { - Log(F("SetConfig"), "Incoming JSON length: " + String(json.measureLength())); - SetConfig(json); - server.send(200, F("application/json"), F("{\"response\":\"OK\"}")); - delay(500); - ESP.restart(); - } - else - { - server.send(406, F("application/json"), F("{\"response\":\"Not Acceptable\"}")); - } -} - -void HandleGetConfig() -{ - server.sendHeader(F("Connection"), F("close")); - server.send(200, F("application/json"), GetConfig()); -} - -void HandleGetLuxSensor() -{ - server.sendHeader(F("Connection"), F("close")); - server.send(200, F("application/json"), GetLuxSensor()); -} - -void HandleGetBrightness() -{ - server.sendHeader(F("Connection"), F("close")); - server.send(200, F("application/json"), GetBrightness()); -} - -void HandleGetDHTSensor() // Legancy -{ - server.sendHeader(F("Connection"), F("close")); - server.send(200, F("application/json"), GetSensor()); -} - -void HandleGetSensor() -{ - server.sendHeader(F("Connection"), F("close")); - server.send(200, F("application/json"), GetSensor()); -} - -void HandleGetButtons() -{ - server.sendHeader(F("Connection"), F("close")); - server.send(200, F("application/json"), GetButtons()); -} - -void HandleGetMatrixInfo() -{ - server.sendHeader(F("Connection"), F("close")); - server.send(200, F("application/json"), GetMatrixInfo()); -} - -void HandelWifiConfigReset() -{ - server.sendHeader(F("Connection"), F("close")); - server.send(200, F("application/json"), F("{\"response\":\"OK\"}")); - EraseWifiCredentials(); -} - -void HandleFactoryReset() -{ - server.sendHeader(F("Connection"), F("close")); - server.send(200, F("application/json"), F("{\"response\":\"OK\"}")); -#if defined(ESP8266) - File configFile = LittleFS.open("/config.json", "w"); -#elif defined(ESP32) - File configFile = SPIFFS.open("/config.json", "w"); -#endif - if (!configFile) - { - Log(F("Handle_factoryreset"), F("Failed to open config file for reset")); - } - configFile.println(""); - configFile.close(); - EraseWifiCredentials(); -} - -void HandleAndSendButtonPress(uint button, bool state) -{ - btnLastPublishState[button] = state; - Log(F("Buttons"), btnLogNames[button] + " is now " + (state ? "true" : "false")); - - // Prüfen ob über MQTT versendet werden muss - if (mqttAktiv == true && client.connected()) - { - client.publish((mqttMasterTopic + "buttons/button" + String(button)).c_str(), (state ? "true" : "false"), true); - } - // Prüfen ob über Websocket versendet werden muss - if (webSocket.connectedClients() > 0) - { - for (uint i = 0; i < sizeof websocketConnection / sizeof websocketConnection[0]; i++) - { - webSocket.sendTXT(i, "{\"buttons\":{\"" + btnAPINames[button] + "\":" + (state ? "true" : "false") + "}}"); - } - } - - if (state == false) - { - return; - } - - if (btnAction[button] == btnAction_ToggleSleepMode) - { - sleepMode = !sleepMode; - if (sleepMode) - { - matrix->clear(); - DrawTextHelper("Zzz", false, true, false, false, false, 0, 0, 255, 0, 1); - FadeOut(30, 0); - matrix->setBrightness(0); - matrix->show(); - } - else - { - matrix->clear(); - DrawTextHelper("😀", false, true, false, false, false, 255, 200, 0, 0, 1); - FadeIn(30, 0); - delay(150); - forceClock = true; - } - } - if (btnAction[button] == btnAction_GotoClock) - { - forceClock = true; - } - if (btnAction[button] == btnAction_MP3PlayPrevious) - { - mp3Player.playPrevious(); - } - if (btnAction[button] == btnAction_MP3PlayNext) - { - mp3Player.playNext(); - } - if (btnAction[button] == btnAction_MP3PlayPause) - { - if (mp3Player.isPlaying()) - { - mp3Player.pause(); - } - else - { - delay(200); - mp3Player.resume(); - } - } -} - -void callback(char *topic, byte *payload, unsigned int length) -{ - if (payload[0] == '{') - { - payload[length] = '\0'; - String channel = String(topic); - channel.replace(mqttMasterTopic, ""); - - DynamicJsonBuffer jsonBuffer; - JsonObject &json = jsonBuffer.parseObject(payload); - - Log("MQTT_callback", "Incomming JSON (Topic: " + String(topic) + ", Length: " + String(json.measureLength()) + ") "); - - if (channel.equals("setScreen")) - { - CreateFrames(json); - } - else if (channel.equals("getLuxsensor")) - { - client.publish((mqttMasterTopic + "luxsensor").c_str(), GetLuxSensor().c_str()); - } - else if (channel.equals("getMatrixinfo")) - { - client.publish((mqttMasterTopic + "matrixinfo").c_str(), GetMatrixInfo().c_str()); - } - else if (channel.equals("getConfig")) - { - client.publish((mqttMasterTopic + "config").c_str(), GetConfig().c_str()); - } - else if (channel.equals("setConfig")) - { - SetConfig(json); - } - } -} - -void webSocketEvent(uint8_t num, WStype_t type, uint8_t *payload, size_t length) -{ - switch (type) - { - case WStype_DISCONNECTED: - { - Log("WebSocketEvent", "[" + String(num) + "] Disconnected!"); - websocketConnection[num] = ""; - break; - } - case WStype_CONNECTED: - { - // Merken für was die Connection hergstellt wurde - websocketConnection[num] = String((char *)payload); - - // IP der Connection abfragen - IPAddress ip = webSocket.remoteIP(num); - - // Logausgabe - Log(F("WebSocketEvent"), "[" + String(num) + "] Connected from " + ip.toString() + " url: " + websocketConnection[num]); - - // send message to client - SendMatrixInfo(true); - SendLDR(true); - SendSensor(true); - SendConfig(); - webSocket.sendTXT(num, "{\"buttons\":" + GetButtons() + "}"); - webSocket.sendTXT(num, "{\"telemetry\":" + GetTelemetry() + "}"); - break; - } - case WStype_TEXT: - { - if (((char *)payload)[0] == '{') - { - DynamicJsonBuffer jsonBuffer; - JsonObject &json = jsonBuffer.parseObject(payload); - int forcedDuration = 0; - - // Logausgabe - Log(F("WebSocketEvent"), "Incoming JSON (Length: " + String(json.measureLength()) + ")"); - - if (json.containsKey("forcedDuration")) - { - forcedDuration = json["forcedDuration"].as(); - } - - if (json.containsKey("setScreen")) - { - CreateFrames(json["setScreen"], forcedDuration); - } - else if (json.containsKey("setConfig")) - { - SetConfig(json["setConfig"]); - delay(500); - ESP.restart(); - } - else if (json.containsKey("wifiReset")) - { - if (json["wifiReset"].as() == true) - { - HandelWifiConfigReset(); - } - } - else if (json.containsKey("factoryReset")) - { - if (json["factoryReset"].as() == true) - { - HandleFactoryReset(); - } - } - else if (json.containsKey("sendTelemetry")) - { - sendTelemetryPrevMillis = 0; - } - } - break; - } - case WStype_BIN: - break; - case WStype_FRAGMENT_BIN_START: - break; - case WStype_FRAGMENT_TEXT_START: - break; - case WStype_FRAGMENT: - break; - case WStype_FRAGMENT_FIN: - break; - case WStype_PING: - break; - case WStype_PONG: - break; - case WStype_ERROR: - break; - } -} - -void CreateFrames(JsonObject &json) -{ - CreateFrames(json, 0); -} - -void CreateFrames(JsonObject &json, int forceDuration) -{ - - String logMessage = F("JSON contains "); - - // Ist eine Display Helligkeit übergeben worden? - if (json.containsKey("brightness")) - { - logMessage += F("Brightness Control, "); - currentMatrixBrightness = json["brightness"]; - } - - // Set GPIO - if (json.containsKey("setGpio")) - { - logMessage += F("Set Gpio, "); - if (json["setGpio"]["set"].is() && json["setGpio"]["gpio"].is()) - { - uint8_t gpio = json["setGpio"]["gpio"].as(); - - // If the GPIO is already present in the array? - // has been found, this is to be replaced. - if (json["setGpio"]["duration"].is()) - { - int arrayIndex = -1; - for (int i = 0; i < SET_GPIO_SIZE; i++) - { - if (setGPIOReset[i].gpio == gpio) - { - arrayIndex = i; - break; - } - } - // Search free place in array. - if (arrayIndex == -1) - { - for (int i = 0; i < SET_GPIO_SIZE; i++) - { - if (setGPIOReset[i].gpio == -1) - { - arrayIndex = i; - break; - } - } - } - - if (arrayIndex == -1) - { - Log(F("SetGPIO"), F("Error: no free place in array found!")); - } - else - { - // Save data in array for the reset. - setGPIOReset[arrayIndex].gpio = gpio; - setGPIOReset[arrayIndex].resetMillis = (millis() + json["setGpio"]["duration"].as()); - Log(F("SetGPIO"), "Pos: " + String(arrayIndex) + ", GPIO: " + String(gpio) + ", Duration: " + String(json["setGpio"]["duration"].as()) + ", Value: " + json["setGpio"]["set"].as()); - } - } - else - { - Log(F("SetGPIO"), "GPIO: " + String(gpio) + ", Value: " + json["setGpio"]["set"].as()); - } - // Set GPIO - pinMode(gpio, OUTPUT); - digitalWrite(gpio, json["setGpio"]["set"].as()); - } - } - - // Sound - if (json.containsKey("sound")) - { - logMessage += F("Sound, "); - // Volume - if (json["sound"]["volume"] != NULL && json["sound"]["volume"].is()) - { - mp3Player.volume(json["sound"]["volume"].as()); - - // Sometimes, mp3Player gets hickups. A brief delay might help - but also might hinder scrolling. - // So, do it only if there are more commands to come. - if (json["sound"]["control"].as() == "") - { - Log(F("Sound"), F("Changing volume can prevent DFPlayer from executing a control command at the same time. Better make two separate API calls.")); - delay(200); - } - } - // Play - if (json["sound"]["control"] == "play") - { - if (json["sound"]["folder"]) - { - mp3Player.playFolder(json["sound"]["folder"].as(), json["sound"]["file"].as()); - } - else - { - mp3Player.play(json["sound"]["file"].as()); - } - } - // Stop - else if (json["sound"]["control"] == "pause") - { - mp3Player.pause(); - } - // Play Next - else if (json["sound"]["control"] == "next") - { - mp3Player.playNext(); - } - // Play Previous - else if (json["sound"]["control"] == "previous") - { - mp3Player.playPrevious(); - } - } - - // SleepMode - if (json.containsKey("sleepMode")) - { - logMessage += F("SleepMode Control, "); - sleepMode = json["sleepMode"]; - } - // SleepMode - if (sleepMode) - { - matrix->setBrightness(0); - matrix->show(); - } - else if (millis() >= forcedScreenIsActiveUntil || forceDuration > 0) - { - matrix->setBrightness(currentMatrixBrightness); - - // Prüfung für die Unterbrechnung der lokalen Schleifen - if (json.containsKey("bitmap") || json.containsKey("bitmaps") || json.containsKey("text") || json.containsKey("bar") || json.containsKey("bars") || json.containsKey("bitmapAnimation")) - { - lastScreenMessageMillis = millis(); - clockAktiv = false; - scrollTextAktivLoop = false; - animateBMPAktivLoop = false; - } - - // Ist eine Switch Animation übergeben worden? - bool fadeAnimationAktiv = false; - bool coloredBarWipeAnimationAktiv = false; - bool zigzagWipeAnimationAktiv = false; - bool bitmapWipeAnimationAktiv = false; - if (json.containsKey("switchAnimation")) - { - logMessage += F("SwitchAnimation, "); - // Switch Animation aktiv? - if (json["switchAnimation"]["aktiv"]) - { - // Fade Animation aktiv? - if (json["switchAnimation"]["animation"] == "fade") - { - fadeAnimationAktiv = true; - } - else if (json["switchAnimation"]["animation"] == "coloredBarWipe") - { - coloredBarWipeAnimationAktiv = true; - } - else if (json["switchAnimation"]["animation"] == "zigzagWipe") - { - zigzagWipeAnimationAktiv = true; - } - else if (json["switchAnimation"]["animation"] == "bitmapWipe") - { - bitmapWipeAnimationAktiv = true; - } - else if (json["switchAnimation"]["animation"] == "random") - { - switch (millis() % 3) - { - case 0: - fadeAnimationAktiv = true; - break; - case 1: - coloredBarWipeAnimationAktiv = true; - break; - case 2: - zigzagWipeAnimationAktiv = true; - break; - } - } - } - } - - // Fade aktiv? - if (fadeAnimationAktiv) - { - FadeOut(); - } - else if (coloredBarWipeAnimationAktiv) - { - ColoredBarWipe(); - } - else if (zigzagWipeAnimationAktiv) - { - uint8_t r = 255; - uint8_t g = 255; - uint8_t b = 255; - if (json["switchAnimation"]["hexColor"].as() != NULL) - { - ColorConverter::HexToRgb(json["switchAnimation"]["hexColor"].as(), r, g, b); - } - else if (json["switchAnimation"]["color"]["r"].as() != NULL) - { - r = json["switchAnimation"]["color"]["r"].as(); - g = json["switchAnimation"]["color"]["g"].as(); - b = json["switchAnimation"]["color"]["b"].as(); - } - ZigZagWipe(r, g, b); - } - else if (bitmapWipeAnimationAktiv) - { - BitmapWipe(json["switchAnimation"]["data"].as(), json["switchAnimation"]["width"].as()); - } - - // Clock - if (json.containsKey("clock")) - { - logMessage += F("InternalClock Control, Params: "); - scrollTextAktivLoop = false; - animateBMPAktivLoop = false; - clockAktiv = true; - - clockCounterClock = 0; - clockCounterDate = 0; - - bool isSwitchAktivSet = json["clock"]["switchAktiv"].is(); - if (isSwitchAktivSet) - { - logMessage += F("clockSwitchAktiv, "); - clockSwitchAktiv = json["clock"]["switchAktiv"]; - } - - bool isClockSwitchSecSet = json["clock"]["switchSec"] != NULL; - if (clockSwitchAktiv && isClockSwitchSecSet) - { - logMessage += F("clockSwitchSec, "); - clockSwitchSec = json["clock"]["switchSec"]; - } - - bool isClockWithSecondsSet = json["clock"]["withSeconds"].is(); - if (isClockWithSecondsSet) - { - logMessage += F("withSeconds, "); - clockWithSeconds = json["clock"]["withSeconds"]; - } - - bool isClockBlinkAnimatedSet = json["clock"]["blinkAnimated"].is(); - if (isClockBlinkAnimatedSet) - { - logMessage += F("blinkAnimated, "); - clockBlinkAnimated = json["clock"]["blinkAnimated"]; - } - - bool isFatFontSet = json["clock"]["fatFont"].is(); - if (isFatFontSet) - { - logMessage += F("fatFont, "); - clockFatFont = json["clock"]["fatFont"]; - } - - bool isDrawWeekDaysSet = json["clock"]["drawWeekDays"].is(); - if (isDrawWeekDaysSet) - { - logMessage += F("drawWeekDays, "); - clockDrawWeekDays = json["clock"]["drawWeekDays"]; - } - - if (json["clock"]["color"]["r"].as() != NULL) - { - logMessage += F("color, "); - clockColorR = json["clock"]["color"]["r"].as(); - clockColorG = json["clock"]["color"]["g"].as(); - clockColorB = json["clock"]["color"]["b"].as(); - } - else if (json["clock"]["hexColor"].as() != NULL) - { - logMessage += F("hexColor, "); - ColorConverter::HexToRgb(json["clock"]["hexColor"].as(), clockColorR, clockColorG, clockColorB); - } - DrawClock(true); - } - - if (json.containsKey("bitmap") || json.containsKey("bitmaps") || json.containsKey("bitmapAnimation") || json.containsKey("text") || json.containsKey("bar") || json.containsKey("bars")) - { - // Alle Pixel löschen - matrix->clear(); - } - - // Bar - if (json.containsKey("bar")) - { - logMessage += F("Bar, "); - uint8_t r, g, b; - if (json["bar"]["hexColor"].as() != NULL) - { - ColorConverter::HexToRgb(json["bar"]["hexColor"].as(), r, g, b); - } - else - { - r = json["bar"]["color"]["r"].as(); - g = json["bar"]["color"]["g"].as(); - b = json["bar"]["color"]["b"].as(); - } - matrix->drawLine(json["bar"]["position"]["x"], json["bar"]["position"]["y"], json["bar"]["position"]["x2"], json["bar"]["position"]["y2"], matrix->Color(r, g, b)); - } - - // Bars - if (json.containsKey("bars")) - { - logMessage += F("Bars, "); - for (JsonVariant x : json["bars"].as()) - { - uint8_t r, g, b; - if (x["hexColor"].as() != NULL) - { - ColorConverter::HexToRgb(x["hexColor"].as(), r, g, b); - } - else - { - r = x["color"]["r"].as(); - g = x["color"]["g"].as(); - b = x["color"]["b"].as(); - } - matrix->drawLine(x["position"]["x"], x["position"]["y"], x["position"]["x2"], x["position"]["y2"], matrix->Color(r, g, b)); - } - } - - withBMP = false; - // Ist ein Bitmap übergeben worden? - if (json.containsKey("bitmap")) - { - logMessage += F("Bitmap, "); - DrawSingleBitmap(json["bitmap"]); - } - - // Sind mehrere Bitmaps übergeben worden? - if (json.containsKey("bitmaps")) - { - logMessage += F("Bitmaps ("); - for (JsonVariant singleBitmap : json["bitmaps"].as()) - { - DrawSingleBitmap(singleBitmap); - logMessage += F("Bitmap,"); - } - - logMessage += F("), "); - } - - // Ist eine BitmapAnimation übergeben worden? - if (json.containsKey("bitmapAnimation")) - { - bmpPosX = 0; - bmpPosY = 0; - bmpWidth = 8; - bmpHeight = 8; - if (json["bitmapAnimation"]["position"]["x"].is() && json["bitmapAnimation"]["position"]["y"].is()) - { - bmpPosX = json["bitmapAnimation"]["position"]["x"].as(); - bmpPosY = json["bitmapAnimation"]["position"]["y"].as(); - } - if (json["bitmapAnimation"]["size"]["width"].is() && json["bitmapAnimation"]["size"]["height"].is()) - { - bmpWidth = json["bitmapAnimation"]["size"]["width"].as(); - bmpHeight = json["bitmapAnimation"]["size"]["height"].as(); - } - withBMP = true; - - logMessage += F("BitmapAnimation, "); - // animationBmpList zurücksetzten um das ende nacher zu finden -1 (habe aktuell keine bessere Lösung) - for (int i = 0; i < 10; i++) - { - animationBmpList[i][0] = 2; - } - - int counter = 0; - for (JsonVariant x : json["bitmapAnimation"]["data"].as()) - { - // JsonArray in IntArray konvertieren - x.as().copyTo(bmpArray); - // Speichern für die Ausgabe - for (int i = 0; i < 64; i++) - { - animationBmpList[counter][i] = bmpArray[i]; - } - counter++; - } - - // Serial.printf("Counter: %d\n", counter); - - animateBMPDelay = json["bitmapAnimation"]["animationDelay"]; - animateBMPRubberbandingAktiv = json["bitmapAnimation"]["rubberbanding"]; - - animateBMPLimitLoops = 0; - if (json["bitmapAnimation"]["limitLoops"]) - { - animateBMPLimitLoops = json["bitmapAnimation"]["limitLoops"].as(); - } - - // Hier einmal den Counter zurücksetzten - animateBMPCounter = 0; - animateBMPLoopCount = 0; - animateBMPAktivLoop = true; - animateBMPReverse = false; - animateBMPPrevMillis = millis(); - AnimateBMP(false); - } - - // Ist ein Text übergeben worden? - bool scrollTextAktiv = false; - if (json.containsKey("text")) - { - logMessage += F("Text"); - // Always assume the default delay first. - scrollTextDelay = scrollTextDefaultDelay; - - // Is ScrollText auto or true selected? - scrollTextAktiv = ((json["text"]["scrollText"] == "auto" || ((json["text"]["scrollText"]).is() && json["text"]["scrollText"]))); - - uint8_t r, g, b; - if (json["text"]["hexColor"].as() != NULL) - { - ColorConverter::HexToRgb(json["text"]["hexColor"].as(), r, g, b); - } - else - { - r = json["text"]["color"]["r"].as(); - g = json["text"]["color"]["g"].as(); - b = json["text"]["color"]["b"].as(); - } - - // Is ScrollText auto or true selected? - if (scrollTextAktiv) - { - - bool centerText = json["text"]["centerText"]; - - bool fadeInRequired = ((json.containsKey("bars") || json.containsKey("bar") || json.containsKey("bitmap") || json.containsKey("bitmapAnimation")) && fadeAnimationAktiv); - - // Wurde ein Benutzerdefeniertes Delay übergeben? - if (json["text"]["scrollTextDelay"]) - { - scrollTextDelay = json["text"]["scrollTextDelay"]; - } - - if (!(json["text"]["scrollText"]).is() && json["text"]["scrollText"] == "auto") - { - DrawAutoTextScrolled(json["text"]["textString"], json["text"]["bigFont"], centerText, fadeInRequired, r, g, b, json["text"]["position"]["x"], json["text"]["position"]["y"]); - } - else - { - DrawTextScrolled(json["text"]["textString"], json["text"]["bigFont"], centerText, fadeInRequired, r, g, b, json["text"]["position"]["x"], json["text"]["position"]["y"]); - } - } - // is centerText selected? - else if (json["text"]["centerText"]) - { - DrawTextCenter(json["text"]["textString"], json["text"]["bigFont"], r, g, b, json["text"]["position"]["x"], json["text"]["position"]["y"]); - } - else - { - DrawText(json["text"]["textString"], json["text"]["bigFont"], r, g, b, json["text"]["position"]["x"], json["text"]["position"]["y"]); - } - } - - // Fade aktiv? - if (!scrollTextAktiv && (fadeAnimationAktiv || coloredBarWipeAnimationAktiv || zigzagWipeAnimationAktiv || bitmapWipeAnimationAktiv)) - { - FadeIn(); - } - else - { - // Fade nicht aktiv! - // Muss mich selbst um Show kümmern - matrix->show(); - } - } - else - { - logMessage += F("skipped, because an forced screen is currently being displayed."); - } - - Log(F("CreateFrames"), logMessage + " (Length: " + json.measureLength() + ")"); - - if (forceDuration > 0 && (json.containsKey("bitmap") || json.containsKey("bitmaps") || json.containsKey("text") || json.containsKey("bar") || json.containsKey("bars") || json.containsKey("bitmapAnimation"))) - { - forcedScreenIsActiveUntil = millis() + forceDuration; - } -} - -String GetConfig() -{ -#if defined(ESP8266) - File configFile = LittleFS.open("/config.json", "r"); -#elif defined(ESP32) - File configFile = SPIFFS.open("/config.json", "r"); -#endif - - if (configFile) - { - // Log(F("GetConfig"), F("Opened config file")); - size_t size = configFile.size(); - // Allocate a buffer to store contents of the file. - std::unique_ptr buf(new char[size]); - - configFile.readBytes(buf.get(), size); - DynamicJsonBuffer jsonBuffer; - JsonObject &root = jsonBuffer.parseObject(buf.get()); - - String json; - root.printTo(json); - - return json; - } - return ""; -} - -String GetSensor() -{ - DynamicJsonBuffer jsonBuffer; - JsonObject &root = jsonBuffer.createObject(); - if (tempSensor == TempSensor_BME280) - { - const float currentTemp = bme280->readTemperature(); - root["temperature"] = currentTemp + temperatureOffset; - root["humidity"] = bme280->readHumidity() + humidityOffset; - root["pressure"] = (bme280->readPressure() / 100.0F) + pressureOffset; - root["gas"] = "Not installed"; - - if (temperatureUnit == TemperatureUnit_Fahrenheit) - { - root["temperature"] = CelsiusToFahrenheit(currentTemp) + temperatureOffset; - } - } - else if (tempSensor == TempSensor_DHT) - { - const float currentTemp = dht.getTemperature(); - root["temperature"] = currentTemp + temperatureOffset; - root["humidity"] = roundf(dht.getHumidity() + humidityOffset); - root["pressure"] = "Not installed"; - root["gas"] = "Not installed"; - - if (temperatureUnit == TemperatureUnit_Fahrenheit) - { - root["temperature"] = CelsiusToFahrenheit(currentTemp) + temperatureOffset; - } - } - else if (tempSensor == TempSensor_BME680) - { - /*************************************************************************************************** - // BME680 requires about 100ms for a read (heating the gas sensor). A blocking read can hinder - // animations and scrolling. Therefore, we will use asynchronous reading in most cases. - // - // First call: starts measuring sequence, returns previous values. - // Second call: performs read, returns current values. - // - // As long as there are more than ~200ms between the calls, there won't be blocking. - // PixelIt usually uses a 3000ms loop. - // - // When there's no loop (no Websock connection, no MQTT) but only HTTP API calls, this would result - // in only EVERY OTHER call return new values (which have been taken shortly after the previous call). - // This is okay when you are polling very frequently, but might be undesirable when polling every - // couple of minutes or so. Therefore: if previous reading is more than 20000ms old, perform - // read in any case, even if it might become blocking. - // - // Please note: the gas value not only depends on gas, but also on the time since last read. - // Frequent reads will yield higher values than infrequent reads. There will be a difference - // even if we switch from 6secs to 3secs! So, do not attempt to compare values of readings - // with an interval of 3 secs to values of readings with an interval of 60 secs! - */ - - const int elapsedSinceLastRead = millis() - lastBME680read; - const int remain = bme680->remainingReadingMillis(); - - if (remain == -1) // no current values available - { - bme680->beginReading(); // start measurement process - // return previous values - const float currentTemp = bme680->temperature; - root["temperature"] = currentTemp + temperatureOffset; - root["humidity"] = bme680->humidity + humidityOffset; - root["pressure"] = (bme680->pressure / 100.0F) + pressureOffset; - root["gas"] = (bme680->gas_resistance / 1000.0F) + gasOffset; - if (temperatureUnit == TemperatureUnit_Fahrenheit) - { - root["temperature"] = CelsiusToFahrenheit(currentTemp) + temperatureOffset; - } - } - - if (remain >= 0 || elapsedSinceLastRead > 20000) - // remain==0: measurement completed, not read yet - // remain>0: measurement still running, but as we already are in the next loop call, block and read - // elapsedSinceLastRead>20000: obviously, remain==-1. But as there haven't been loop calls recently, this seems to be an "infrequent" API call. Perform blocking read. - { - if (bme680->endReading()) // will become blocking if measurement not complete yet - { - lastBME680read = millis(); - const float currentTemp = bme680->temperature; - root["temperature"] = currentTemp + temperatureOffset; - root["humidity"] = bme680->humidity + humidityOffset; - root["pressure"] = (bme680->pressure / 100.0F) + pressureOffset; - root["gas"] = (bme680->gas_resistance / 1000.0F) + gasOffset; - if (temperatureUnit == TemperatureUnit_Fahrenheit) - { - root["temperature"] = CelsiusToFahrenheit(currentTemp) + temperatureOffset; - } - } - else - { - root["humidity"] = "Error while reading"; - root["temperature"] = "Error while reading"; - root["pressure"] = "Error while reading"; - root["gas"] = "Error while reading"; - } - } - } - else if (tempSensor == TempSensor_BMP280) - { - const float currentTemp = bmp280->readTemperature(); - root["temperature"] = currentTemp + temperatureOffset; - // root["humidity"] = bmp280->readHumidity() + humidityOffset; - root["humidity"] = "Not installed"; - root["pressure"] = (bmp280->readPressure() / 100.0F) + pressureOffset; - root["gas"] = "Not installed"; - - if (temperatureUnit == TemperatureUnit_Fahrenheit) - { - root["temperature"] = CelsiusToFahrenheit(currentTemp) + temperatureOffset; - } - } - - else - { - root["humidity"] = "Not installed"; - root["temperature"] = "Not installed"; - root["pressure"] = "Not installed"; - root["gas"] = "Not installed"; - } - - String json; - root.printTo(json); - - // Log(F("Sensor readings"), F("Hum/Temp/Press/Gas:")); - // Log(F("Sensor readings"), json); - return json; -} - -String GetLuxSensor() -{ - DynamicJsonBuffer jsonBuffer; - JsonObject &root = jsonBuffer.createObject(); - - root["lux"] = currentLux; - - String json; - root.printTo(json); - - return json; -} - -String GetBrightness() -{ - DynamicJsonBuffer jsonBuffer; - JsonObject &root = jsonBuffer.createObject(); - - root["brightness_255"] = currentMatrixBrightness; - root["brightness"] = map(currentMatrixBrightness, 0, 255, 0, 100); - - String json; - root.printTo(json); - - return json; -} - -String GetMatrixInfo() -{ - DynamicJsonBuffer jsonBuffer; - JsonObject &root = jsonBuffer.createObject(); - - root["pixelitVersion"] = VERSION; - //// Matrix Config - root["note"] = note; - root["hostname"] = hostname; - root["freeSketchSpace"] = ESP.getFreeSketchSpace(); - root["wifiRSSI"] = WiFi.RSSI(); - root["wifiQuality"] = GetRSSIasQuality(WiFi.RSSI()); - root["wifiSSID"] = WiFi.SSID(); - root["ipAddress"] = WiFi.localIP().toString(); - root["freeHeap"] = ESP.getFreeHeap(); - root["currentMatrixBrightness"] = currentMatrixBrightness; - root["wifiBSSID"] = WiFi.BSSIDstr(); - -#if defined(ESP8266) - root["sketchSize"] = ESP.getSketchSize(); - root["chipID"] = ESP.getChipId(); -#elif defined(ESP32) - root["chipID"] = uint64ToString(ESP.getEfuseMac()); -#endif - - root["cpuFreqMHz"] = ESP.getCpuFreqMHz(); - root["sleepMode"] = sleepMode; - root["uptime"] = millis() / 1000; - root["resetReason"] = ResetReason(); - JsonObject &matrix = root.createNestedObject("matrixsize"); - matrix["cols"] = MATRIX_WIDTH; - matrix["rows"] = MATRIX_HEIGHT; - - String json; - root.printTo(json); - - return json; -} - -String GetButtons() -{ - DynamicJsonBuffer jsonBuffer; - JsonObject &root = jsonBuffer.createObject(); - - for (uint button = 0; button < 3; button++) - { - root[btnAPINames[button]] = btnLastPublishState[button] ? "true" : "false"; - } - - String json; - root.printTo(json); - - return json; -} - -void SendTelemetry() -{ - Log(F("SendTelemetry"), F("Sending...")); - HttpClient httpClient = HttpClient(wifiClientHTTP, TELEMETRY_SERVER_HOST, TELEMETRY_SERVER_PORT); - httpClient.setTimeout(1500); - httpClient.sendHeader("User-Agent", "PixelIt"); - httpClient.post(TELEMETRY_SERVER_PATH, "application/json", GetTelemetry()); -} - -String GetTelemetry() -{ - const String MatrixTypeNames[] = {"Colum major", "Row major", "Tiled 4x 8x8 CJMCU (Column major)", "MicroMatrix", "Tiled 4x 8x8 CJMCU (Row major)"}; - const String TempSensorNames[] = {"none", "BME280", "DHT", "BME680", "BMP280"}; - const String LuxSensorNames[] = {"LDR", "BH1750", "Max44009"}; - - DynamicJsonBuffer jsonBuffer; - JsonObject &root = jsonBuffer.createObject(); - - root["uuid"] = sha1(GetChipID()); - root["version"] = VERSION; - root["type"] = isESP8266 ? "esp8266" : "esp32"; - - JsonObject &matrix = root.createNestedObject("matrix"); - matrix["type"] = matrixType; - matrix["name"] = MatrixTypeNames[matrixType - 1]; - - JsonArray &sensors = root.createNestedArray("sensors"); - sensors.add(LuxSensorNames[luxSensor]); - if (tempSensor > 0) - { - sensors.add(TempSensorNames[tempSensor]); - } - - String json; - root.printTo(json); - return json; -} - -void DrawText(String text, int bigFont, int colorRed, int colorGreen, int colorBlue, int posX, int posY) -{ - DrawTextHelper(text, bigFont, false, false, false, false, colorRed, colorGreen, colorBlue, posX, posY); -} - -void DrawTextCenter(String text, int bigFont, int colorRed, int colorGreen, int colorBlue, int posX, int posY) -{ - DrawTextHelper(text, bigFont, true, false, false, false, colorRed, colorGreen, colorBlue, posX, posY); -} - -void DrawTextScrolled(String text, int bigFont, bool centerText, bool fadeInRequired, int colorRed, int colorGreen, int colorBlue, int posX, int posY) -{ - DrawTextHelper(text, bigFont, centerText, true, false, fadeInRequired, colorRed, colorGreen, colorBlue, posX, posY); -} - -void DrawAutoTextScrolled(String text, int bigFont, bool centerText, bool fadeInRequired, int colorRed, int colorGreen, int colorBlue, int posX, int posY) -{ - DrawTextHelper(text, bigFont, centerText, false, true, fadeInRequired, colorRed, colorGreen, colorBlue, posX, posY); -} - -void DrawTextHelper(String text, int bigFont, bool centerText, bool scrollText, bool autoScrollText, bool fadeInRequired, int colorRed, int colorGreen, int colorBlue, int posX, int posY) -{ - uint16_t xTextWidth, xAvailableTextSpace; - int16_t boundsx1, boundsy1; - uint16_t boundsw, boundsh; - - text = Utf8ToAscii(text); - - // Debug function values - // Serial.printf("DrawTextHelper: %s (bigFont: %s, centerText: %s, scrollText: %s, autoScrollText: %s: %s, fadeInRequired: %s)\n", text.c_str(), bigFont == 1 ? "true" : "false", centerText ? "true" : "false", scrollText ? "true" : "false", autoScrollText ? "true" : "false" ? "true" : "false", fadeInRequired ? "true" : "false"); - - // Available text space depends on matrix size - xAvailableTextSpace = MATRIX_WIDTH - posX; - - if (bigFont == 1) - { - // Set large font - matrix->setFont(); - matrix->getTextBounds(text, 0, 0, &boundsx1, &boundsy1, &boundsw, &boundsh); - xTextWidth = boundsw; - - // Position correction - posY = posY - 1; - } - else if (bigFont == 2) // very large font, only to be used for time display / very large font, only for the time display - { - // Set very large font - matrix->setFont(&FatPixels); - - matrix->getTextBounds(text, 0, 0, &boundsx1, &boundsy1, &boundsw, &boundsh); - xTextWidth = boundsw; - - // Position correction - posY = posY + 6; - } - else - { - // Set small font - matrix->setFont(&PixelItFont); - matrix->getTextBounds(text, 0, 0, &boundsx1, &boundsy1, &boundsw, &boundsh); - xTextWidth = boundsw - 4; - - // Position correction - posY = posY + 5; - } - - if (centerText && xTextWidth < xAvailableTextSpace) // center text if text is smaller than available pixels - { - // Calculation for the first pixel of the text - posX = posX + ((xAvailableTextSpace - xTextWidth) / 2); - } - - matrix->setCursor(posX, posY); - - matrix->setTextColor(matrix->Color(colorRed, colorGreen, colorBlue)); - - if (scrollText || (autoScrollText && xTextWidth > xAvailableTextSpace)) // scroll text if text is larger than available pixels - { - - matrix->setBrightness(currentMatrixBrightness); - - scrollTextString = text; - scrollposY = posY; - scrollposX = posX; - scrollxTextWidth = xTextWidth; - scrollxAvailableTextSpace = xAvailableTextSpace; - scrollCurPos = MATRIX_WIDTH + 1; - - scrollTextAktivLoop = true; - scrollTextPrevMillis = millis(); - ScrollText(fadeInRequired); - } - // In case the text on the display fits! - else if (autoScrollText) - { - matrix->print(text); - // Here you have to check if the fade out was done, - // then the brightness is too low (0), - // but only if animateBMPAktivLoop is not active, - // because otherwise it's already done. - if (fadeInRequired && !animateBMPAktivLoop) - { - FadeIn(); - } - else - { - matrix->show(); - } - } - else - { - matrix->print(text); - } -} - -void ScrollText(bool isFadeInRequired) -{ - int xOffset = MATRIX_WIDTH - scrollxAvailableTextSpace; - - if (scrollCurPos > ((scrollxTextWidth - xOffset) * -1)) - { - matrix->clear(); - matrix->setCursor(--scrollCurPos, scrollposY); - matrix->print(scrollTextString); - - // draw black pixel under icon / blank space if (xOffset > 0) - { - - for (int i = 0; i < xOffset; i++) - { - matrix->drawLine(i, 0, i, MATRIX_HEIGHT, matrix->Color(0, 0, 0)); - } - } - - if (withBMP) - { - matrix->drawRGBBitmap(bmpPosX, bmpPosY, bmpArray, bmpWidth, bmpHeight); - } - - if (isFadeInRequired) - { - FadeIn(); - } - else - { - matrix->show(); - } - } - else - { - scrollCurPos = MATRIX_WIDTH; - } -} - -void AnimateBMP(bool isShowRequired) -{ - // Prüfen auf 2, 2 ist mein Platzhalter für leeres obj! - if (animationBmpList[animateBMPCounter][0] == 2) - { - // Ist ein Repeat Limit übergeben worden. - if (animateBMPLimitLoops > 0 && !animateBMPRubberbandingAktiv) - { - animateBMPLoopCount++; - - // Ist der Repeat Limit erreicht den AnimateBMP Loop deaktiveren. - if (animateBMPLoopCount == animateBMPLimitLoops) - { - animateBMPAktivLoop = false; - return; - } - } - - // Prüfen ob Rubberbanding aktiv und mehr wie 1 Frame vorhanden ist. - if (animateBMPRubberbandingAktiv && animateBMPCounter > 1) - { - animateBMPReverse = true; - - // 2 abziehen da sonst der letzte Frame doppelt angezeigt wird. - if (animateBMPCounter > 0) - { - animateBMPCounter = animateBMPCounter - 2; - } - } - else - { - animateBMPCounter = 0; - } - } - - if (animateBMPCounter < 0) - { - // Auf 1 setzten da sons der erste Frame doppelt angezeigt wird. - animateBMPCounter = 1; - animateBMPReverse = false; - - // Ist ein Repeat Limit übergeben worden. - if (animateBMPLimitLoops > 0) - { - animateBMPLoopCount++; - // Ist der Repeat Limit erreicht den AnimateBMP Loop deaktiveren. - if (animateBMPLoopCount >= animateBMPLimitLoops) - { - animateBMPAktivLoop = false; - return; - } - } - } - - ClearBMPArea(); - - matrix->drawRGBBitmap(bmpPosX, bmpPosY, animationBmpList[animateBMPCounter], bmpWidth, bmpHeight); - - for (int y = 0; y < 64; y++) - { - bmpArray[y] = animationBmpList[animateBMPCounter][y]; - } - - // Soll der Loop wieder zurücklaufen? - if (animateBMPReverse) - { - animateBMPCounter--; - } - else - { - animateBMPCounter++; - } - - if (isShowRequired) - { - matrix->show(); - } -} - -void DrawSingleBitmap(JsonObject &json) -{ - int16_t h = json["size"]["height"].as(); - int16_t w = json["size"]["width"].as(); - int16_t x = json["position"]["x"].as(); - int16_t y = json["position"]["y"].as(); - - bmpHeight = h; - bmpWidth = w; - bmpPosX = x; - bmpPosY = y; - withBMP = true; - - // Hier kann leider nicht die Funktion matrix->drawRGBBitmap() genutzt werde da diese Fehler in der Anzeige macht wenn es mehr wie 8x8 Pixel werden. - for (int16_t j = 0; j < h; j++, y++) - { - for (int16_t i = 0; i < w; i++) - { - matrix->drawPixel(x + i, y, json["data"][j * w + i].as()); - } - } - - // JsonArray in IntArray konvertieren - // dies ist nötig für diverse kleine Logiken z.B. Scrolltext - // bei Multibitmaps landet hier nur eine der Bitmaps - das ist aber egal, da dann eh nicht gescrollt wird - json["data"].as().copyTo(bmpArray); -} - -void DrawClock(bool fromJSON) -{ - matrix->clear(); - - char date[14]; - char time[14]; - - int xPosTime = 0; - - if (clockDateDayMonth) - { - sprintf_P(date, PSTR("%02d.%02d."), day(), month()); - } - else - { - sprintf_P(date, PSTR("%02d/%02d"), month(), day()); - } - - if (clock24Hours && clockWithSeconds && !clockFatFont) - { - xPosTime = 2; - sprintf_P(time, PSTR("%02d:%02d:%02d"), hour(), minute(), second()); - } - else if (!clock24Hours) - { - xPosTime = 2; - - if (clockBlink && clockBlinkAnimated) - { - clockBlink = false; - if (!clockFatFont) - { - sprintf_P(time, PSTR("%2d %02d %s"), hourFormat12(), minute(), isAM() ? "AM" : "PM"); - } - else - { - sprintf_P(time, PSTR("%2d %02d"), hourFormat12(), minute()); - } - } - else - { - clockBlink = !clockBlink; - if (!clockFatFont) - { - sprintf_P(time, PSTR("%2d:%02d %s"), hourFormat12(), minute(), isAM() ? "AM" : "PM"); - } - else - { - sprintf_P(time, PSTR("%2d:%02d"), hourFormat12(), minute()); - } - } - } - else - { - xPosTime = 7; - - if (clockBlink && clockBlinkAnimated) - { - clockBlink = false; - sprintf_P(time, PSTR("%02d %02d"), hour(), minute()); - } - else - { - clockBlink = !clockBlink; - sprintf_P(time, PSTR("%02d:%02d"), hour(), minute()); - } - } - - if (!clockSwitchAktiv || (clockSwitchAktiv && clockCounterClock <= clockSwitchSec)) - { - if (clockSwitchAktiv) - { - clockCounterClock++; - } - - if (clockCounterClock > clockSwitchSec) - { - clockCounterDate = 0; - - if (clockFatFont) // fade rather than vertical animate purely because DrawTextCenter doesnt have a Y argument... - { - DrawTextCenter(String(time), 2, clockColorR, clockColorG, clockColorB, 0, 1); - FadeOut(30); - matrix->clear(); - DrawTextCenter(String(date), 2, clockColorR, clockColorG, clockColorB, 0, 1); - FadeIn(30); - } - else - { - int counter = 0; - while (counter <= 6) // vertical animate - { - counter++; - matrix->clear(); - DrawText(String(time), false, clockColorR, clockColorG, clockColorB, xPosTime, (1 + counter)); - DrawText(String(date), false, clockColorR, clockColorG, clockColorB, 7, (-6 + counter)); - matrix->drawLine(0, 7, 33, 7, 0); - if (clockDrawWeekDays) - { - DrawWeekDay(); - } - matrix->show(); - delay(35); - } - } - } - else if (clockFatFont) - { - - DrawTextCenter(String(time), 2, clockColorR, clockColorG, clockColorB, 0, 1); - } - else - { - DrawText(String(time), false, clockColorR, clockColorG, clockColorB, xPosTime, 1); - xPosTime = 3; - } - } - else - { - clockCounterDate++; - - if (clockCounterDate == clockSwitchSec) - { - clockCounterClock = 0; - - if (clockFatFont) // fade rather than vertical animate purely because DrawTextCenter doesnt have a Y argument... - { - DrawTextCenter(String(date), 2, clockColorR, clockColorG, clockColorB, 0, 1); - FadeOut(30); - matrix->clear(); - DrawTextCenter(String(time), 2, clockColorR, clockColorG, clockColorB, 0, 1); - FadeIn(30); - } - else - { - int counter = 0; - while (counter <= 6) // vertical animate - { - counter++; - matrix->clear(); - DrawText(String(date), false, clockColorR, clockColorG, clockColorB, 7, (1 + counter)); - DrawText(String(time), false, clockColorR, clockColorG, clockColorB, xPosTime, (-6 + counter)); - matrix->drawLine(0, 7, 33, 7, 0); - if (clockDrawWeekDays) - { - DrawWeekDay(); - } - matrix->show(); - delay(35); - } - } - } - else if (clockFatFont) - { - DrawTextCenter(String(date), 2, clockColorR, clockColorG, clockColorB, 0, 1); - } - else - { - DrawText(String(date), false, clockColorR, clockColorG, clockColorB, 7, 1); - } - } - - if (!clockFatFont && clockDrawWeekDays) - { - DrawWeekDay(); - } - - // Wenn der Aufruf nicht über JSON sondern über den Loop kommt - // muss ich mich selbst ums Show kümmern. - if (!fromJSON) - { - matrix->show(); - } -} - -void DrawWeekDay() -{ - // The Libary works with dayOfWeek with Sunday = 1... - // So Sunday = 1 <-> Saturday = 7 - int weekDayNumber = 0; - if (clockDayOfWeekFirstMonday) - { - weekDayNumber = DayOfWeekFirstMonday(dayOfWeek(now()) - 1); - } - else - { - weekDayNumber = dayOfWeek(now()) - 1; - } - - for (int i = 0; i <= 6; i++) - { - if (i == weekDayNumber) - { - matrix->drawLine(2 + i * 4, 7, i * 4 + 4, 7, matrix->Color(clockColorR, clockColorG, clockColorB)); - } - else - { - matrix->drawLine(2 + i * 4, 7, i * 4 + 4, 7, 21162); - } - } -} - -boolean MQTTreconnect() -{ - - bool connected = false; - if (mqttUser != NULL && mqttUser.length() > 0 && mqttPassword != NULL && mqttPassword.length() > 0) - { - Log(F("MQTTreconnect"), F("MQTT connecting to broker...")); - connected = client.connect(hostname.c_str(), mqttUser.c_str(), mqttPassword.c_str(), (mqttMasterTopic + "state").c_str(), 0, true, "disconnected"); - } - else - { - Log(F("MQTTreconnect"), F("MQTT connecting to broker...")); - connected = client.connect(hostname.c_str(), (mqttMasterTopic + "state").c_str(), 0, true, "disconnected"); - } - - if (connected) - { - Log(F("MQTTreconnect"), F("MQTT connected!")); - // Subscribe to topics ... - client.subscribe((mqttMasterTopic + "setScreen").c_str()); - client.subscribe((mqttMasterTopic + "getLuxsensor").c_str()); - client.subscribe((mqttMasterTopic + "getMatrixinfo").c_str()); - client.subscribe((mqttMasterTopic + "getConfig").c_str()); - client.subscribe((mqttMasterTopic + "setConfig").c_str()); - // ... and publish state .... - client.publish((mqttMasterTopic + "state").c_str(), "connected", true); - - // ... and provide discovery information - // Create discovery information for Homeassistant - // Can also be processed by ioBroker, OpenHAB etc. - String deviceID = hostname; - if (deviceID.isEmpty()) - deviceID = "pixelit"; -#if defined(ESP8266) - deviceID += ESP.getChipId(); -#elif defined(ESP32) - deviceID += uint64ToString(ESP.getEfuseMac()); -#endif - // Get host IP to provide URL in MQTT discovery device info - String ip_url = "http://" + WiFi.localIP().toString(); - String configTopicTemplate = String(F("homeassistant/#COMPONENT#/#DEVICEID#/#DEVICEID##SENSORID#/config")); - configTopicTemplate.replace(F("#DEVICEID#"), deviceID); - String configPayloadTemplate = String(F( - "{" - "\"dev\":{" - "\"ids\":\"#DEVICEID#\"," - "\"name\":\"#HOSTNAME#\"," - "\"mdl\":\"PixelIt\"," - "\"mf\":\"PixelIt\"," - "\"sw\":\"#VERSION#\"," - "\"cu\":\"#IP#\"" - "}," - "\"avty_t\":\"#MASTERTOPIC#state\"," - "\"pl_avail\":\"connected\"," - "\"pl_not_avail\":\"disconnected\"," - "\"uniq_id\":\"#DEVICEID##SENSORID#\"," - "\"dev_cla\":\"#CLASS#\"," - "\"name\":\"#SENSORNAME#\"," - "\"stat_t\":\"#MASTERTOPIC##STATETOPIC#\"," - "\"unit_of_meas\":\"#UNIT#\"," - "\"val_tpl\":\"{{value_json.#VALUENAME#}}\"" - "}")); - configPayloadTemplate.replace(" ", ""); - configPayloadTemplate.replace(F("#DEVICEID#"), deviceID); - configPayloadTemplate.replace(F("#HOSTNAME#"), hostname); - configPayloadTemplate.replace(F("#VERSION#"), VERSION); - configPayloadTemplate.replace(F("#MASTERTOPIC#"), mqttMasterTopic); - configPayloadTemplate.replace(F("#IP#"), ip_url); - - String topic; - String payload; - - if (tempSensor != TempSensor_None) - { - topic = configTopicTemplate; - topic.replace(F("#COMPONENT#"), F("sensor")); - topic.replace(F("#SENSORID#"), F("Temperature")); - - payload = configPayloadTemplate; - payload.replace(F("#SENSORID#"), F("Temperature")); - payload.replace(F("#SENSORNAME#"), F("Temperature")); - payload.replace(F("#CLASS#"), F("temperature")); - payload.replace(F("#STATETOPIC#"), F("sensor")); - payload.replace(F("#UNIT#"), "°C"); - payload.replace(F("#VALUENAME#"), F("temperature")); - client.publish(topic.c_str(), payload.c_str(), true); - - topic = configTopicTemplate; - topic.replace(F("#COMPONENT#"), F("sensor")); - topic.replace(F("#SENSORID#"), F("Humidity")); - - payload = configPayloadTemplate; - payload.replace(F("#SENSORNAME#"), F("Humidity")); - payload.replace(F("#CLASS#"), F("humidity")); - payload.replace(F("#STATETOPIC#"), F("sensor")); - payload.replace(F("#UNIT#"), "%"); - payload.replace(F("#VALUENAME#"), F("humidity")); - client.publish(topic.c_str(), payload.c_str(), true); - } - if (tempSensor == TempSensor_BME280 || tempSensor == TempSensor_BMP280 || tempSensor == TempSensor_BME680) - { - topic = configTopicTemplate; - topic.replace(F("#COMPONENT#"), F("sensor")); - topic.replace(F("#SENSORID#"), F("Pressure")); - - payload = configPayloadTemplate; - payload.replace(F("#SENSORID#"), F("Pressure")); - payload.replace(F("#SENSORNAME#"), F("Pressure")); - payload.replace(F("#CLASS#"), F("pressure")); - payload.replace(F("#STATETOPIC#"), F("sensor")); - payload.replace(F("#UNIT#"), "hPa"); - payload.replace(F("#VALUENAME#"), F("pressure")); - client.publish(topic.c_str(), payload.c_str(), true); - } - - if (tempSensor == TempSensor_BME680) - { - topic = configTopicTemplate; - topic.replace(F("#COMPONENT#"), F("sensor")); - topic.replace(F("#SENSORID#"), F("VOC")); - - payload = configPayloadTemplate; - payload.replace(F("#SENSORID#"), F("VOC")); - payload.replace(F("#SENSORNAME#"), F("VOC")); - payload.replace(F("#CLASS#"), F("volatile_organic_compounds")); - payload.replace(F("#STATETOPIC#"), F("sensor")); - payload.replace(F("#UNIT#"), "kOhm"); - payload.replace(F("#VALUENAME#"), F("gas")); - client.publish(topic.c_str(), payload.c_str(), true); - } - topic = configTopicTemplate; - topic.replace(F("#COMPONENT#"), F("sensor")); - topic.replace(F("#SENSORID#"), F("Illuminance")); - - payload = configPayloadTemplate; - payload.replace(F("#SENSORID#"), F("Illuminance")); - payload.replace(F("#SENSORNAME#"), F("Illuminance")); - payload.replace(F("#CLASS#"), F("illuminance")); - payload.replace(F("#STATETOPIC#"), F("luxsensor")); - payload.replace(F("#UNIT#"), "lx"); - payload.replace(F("#VALUENAME#"), F("lux")); - client.publish(topic.c_str(), payload.c_str(), true); - - configPayloadTemplate = String(F( - "{" - "\"dev\":{" - "\"ids\":\"#DEVICEID#\"," - "\"name\":\"#HOSTNAME#\"," - "\"mdl\":\"PixelIt\"," - "\"mf\":\"PixelIt\"," - "\"sw\":\"#VERSION#\"," - "\"cu\":\"#IP#\"" - "}," - "\"avty_t\":\"#MASTERTOPIC#state\"," - "\"pl_avail\":\"connected\"," - "\"pl_not_avail\":\"disconnected\"," - "\"uniq_id\":\"#DEVICEID##SENSORID#\"," - "\"name\":\"#SENSORNAME#\"," - "\"ic\":\"mdi:gesture-tap-button\"," - "\"pl_on\":\"true\"," - "\"pl_off\":\"false\"," - "\"stat_t\":\"#MASTERTOPIC##STATETOPIC#\"" - "}")); - configPayloadTemplate.replace(" ", ""); - configPayloadTemplate.replace(F("#DEVICEID#"), deviceID); - configPayloadTemplate.replace(F("#HOSTNAME#"), hostname); - configPayloadTemplate.replace(F("#VERSION#"), VERSION); - configPayloadTemplate.replace(F("#MASTERTOPIC#"), mqttMasterTopic); - configPayloadTemplate.replace(F("#IP#"), ip_url); - - for (uint8_t n = 0; n < sizeof(btnEnabled) / sizeof(btnEnabled[0]); n++) - { - if (btnEnabled[n]) - { - topic = configTopicTemplate; - topic.replace(F("#COMPONENT#"), F("binary_sensor")); - topic.replace(F("#SENSORID#"), String(F("Button")) + String(n)); - - payload = configPayloadTemplate; - payload.replace(F("#SENSORID#"), String(F("Button")) + String(n)); - payload.replace(F("#SENSORNAME#"), String(btnLogNames[n])); - payload.replace(F("#STATETOPIC#"), String(F("buttons/button")) + String(n)); - client.publish(topic.c_str(), payload.c_str(), true); - } - } - - // Wifi RSSI - configPayloadTemplate = String(F( - "{" - "\"dev\":{" - "\"ids\":\"#DEVICEID#\"," - "\"name\":\"#HOSTNAME#\"," - "\"mdl\":\"PixelIt\"," - "\"mf\":\"PixelIt\"," - "\"sw\":\"#VERSION#\"," - "\"cu\":\"#IP#\"" - "}," - "\"avty_t\":\"#MASTERTOPIC#state\"," - "\"pl_avail\":\"connected\"," - "\"pl_not_avail\":\"disconnected\"," - "\"uniq_id\":\"#DEVICEID##SENSORID#\"," - "\"dev_cla\":\"signal_strength\"," - "\"name\":\"#SENSORNAME#\"," - "\"stat_t\":\"#MASTERTOPIC##STATETOPIC#\"," - "\"unit_of_meas\":\"#UNIT#\"," - "\"val_tpl\":\"{{value_json.#VALUENAME#}}\"," - "\"ent_cat\":\"diagnostic\"," - "\"ic\":\"mdi:#ICON#\"," - "\"enabled_by_default\":\"false\"" - "}")); - configPayloadTemplate.replace(" ", ""); - configPayloadTemplate.replace(F("#DEVICEID#"), deviceID); - configPayloadTemplate.replace(F("#HOSTNAME#"), hostname); - configPayloadTemplate.replace(F("#VERSION#"), VERSION); - configPayloadTemplate.replace(F("#MASTERTOPIC#"), mqttMasterTopic); - configPayloadTemplate.replace(F("#IP#"), ip_url); - - topic = configTopicTemplate; - topic.replace(F("#COMPONENT#"), F("sensor")); - topic.replace(F("#SENSORID#"), F("wifiRSSI")); - - payload = configPayloadTemplate; - payload.replace(F("#SENSORID#"), F("wifiRSSI")); - payload.replace(F("#SENSORNAME#"), F("Wifi Signal")); - payload.replace(F("#CLASS#"), F("signal_strength")); - payload.replace(F("#STATETOPIC#"), F("matrixinfo")); - payload.replace(F("#UNIT#"), "dBm"); - payload.replace(F("#VALUENAME#"), F("wifiRSSI")); - payload.replace(F("#ICON#"), F("signal")); - client.publish(topic.c_str(), payload.c_str(), true); - - // Wifi Quality sensor - configPayloadTemplate = String(F( - "{" - "\"dev\":{" - "\"ids\":\"#DEVICEID#\"," - "\"name\":\"#HOSTNAME#\"," - "\"mdl\":\"PixelIt\"," - "\"mf\":\"PixelIt\"," - "\"sw\":\"#VERSION#\"," - "\"cu\":\"#IP#\"" - "}," - "\"avty_t\":\"#MASTERTOPIC#state\"," - "\"pl_avail\":\"connected\"," - "\"pl_not_avail\":\"disconnected\"," - "\"uniq_id\":\"#DEVICEID##SENSORID#\"," - "\"name\":\"#SENSORNAME#\"," - "\"stat_t\":\"#MASTERTOPIC##STATETOPIC#\"," - "\"unit_of_meas\":\"#UNIT#\"," - "\"val_tpl\":\"{{value_json.#VALUENAME#}}\"," - "\"ent_cat\":\"diagnostic\"," - "\"ic\":\"mdi:#ICON#\"," - "\"enabled_by_default\":\"false\"" - "}")); - configPayloadTemplate.replace(" ", ""); - configPayloadTemplate.replace(F("#DEVICEID#"), deviceID); - configPayloadTemplate.replace(F("#HOSTNAME#"), hostname); - configPayloadTemplate.replace(F("#VERSION#"), VERSION); - configPayloadTemplate.replace(F("#MASTERTOPIC#"), mqttMasterTopic); - configPayloadTemplate.replace(F("#IP#"), ip_url); - - topic = configTopicTemplate; - topic.replace(F("#COMPONENT#"), F("sensor")); - topic.replace(F("#SENSORID#"), F("WifiQuality")); - - payload = configPayloadTemplate; - payload.replace(F("#SENSORID#"), F("WifiQuality")); - payload.replace(F("#SENSORNAME#"), F("Wifi Quality")); - payload.replace(F("#STATETOPIC#"), F("matrixinfo")); - payload.replace(F("#UNIT#"), "%"); - payload.replace(F("#VALUENAME#"), F("wifiQuality")); - payload.replace(F("#ICON#"), F("signal")); - client.publish(topic.c_str(), payload.c_str(), true); - - // CPU Freq. - topic = configTopicTemplate; - topic.replace(F("#COMPONENT#"), F("sensor")); - topic.replace(F("#SENSORID#"), F("cpuFreqMHz")); - - payload = configPayloadTemplate; - payload.replace(F("#SENSORID#"), F("cpuFreqMHz")); - payload.replace(F("#SENSORNAME#"), F("CPU Freq.")); - payload.replace(F("#STATETOPIC#"), F("matrixinfo")); - payload.replace(F("#UNIT#"), "MHz"); - payload.replace(F("#VALUENAME#"), F("cpuFreqMHz")); - payload.replace(F("#ICON#"), F("developer-board")); - client.publish(topic.c_str(), payload.c_str(), true); - - // Wifi SSID - configPayloadTemplate = String(F( - "{" - "\"dev\":{" - "\"ids\":\"#DEVICEID#\"," - "\"name\":\"#HOSTNAME#\"," - "\"mdl\":\"PixelIt\"," - "\"mf\":\"PixelIt\"," - "\"sw\":\"#VERSION#\"," - "\"cu\":\"#IP#\"" - "}," - "\"avty_t\":\"#MASTERTOPIC#state\"," - "\"pl_avail\":\"connected\"," - "\"pl_not_avail\":\"disconnected\"," - "\"uniq_id\":\"#DEVICEID##SENSORID#\"," - "\"name\":\"#SENSORNAME#\"," - "\"stat_t\":\"#MASTERTOPIC##STATETOPIC#\"," - "\"val_tpl\":\"{{value_json.#VALUENAME#}}\"," - "\"ent_cat\":\"diagnostic\"," - "\"ic\":\"mdi:#ICON#\"," - "\"enabled_by_default\":\"false\"" - "}")); - configPayloadTemplate.replace(" ", ""); - configPayloadTemplate.replace(F("#DEVICEID#"), deviceID); - configPayloadTemplate.replace(F("#HOSTNAME#"), hostname); - configPayloadTemplate.replace(F("#VERSION#"), VERSION); - configPayloadTemplate.replace(F("#MASTERTOPIC#"), mqttMasterTopic); - configPayloadTemplate.replace(F("#IP#"), ip_url); - - topic = configTopicTemplate; - topic.replace(F("#COMPONENT#"), F("sensor")); - topic.replace(F("#SENSORID#"), F("WifiSSID")); - - payload = configPayloadTemplate; - payload.replace(F("#SENSORID#"), F("WifiSSID")); - payload.replace(F("#SENSORNAME#"), F("SSID")); - payload.replace(F("#STATETOPIC#"), F("matrixinfo")); - payload.replace(F("#VALUENAME#"), F("wifiSSID")); - payload.replace(F("#ICON#"), F("wifi")); - client.publish(topic.c_str(), payload.c_str(), true); - - // Wifi BSSID - topic = configTopicTemplate; - topic.replace(F("#COMPONENT#"), F("sensor")); - topic.replace(F("#SENSORID#"), F("WifiBSSID")); - - payload = configPayloadTemplate; - payload.replace(F("#SENSORID#"), F("WifiBSSID")); - payload.replace(F("#SENSORNAME#"), F("BSSID")); - payload.replace(F("#STATETOPIC#"), F("matrixinfo")); - payload.replace(F("#VALUENAME#"), F("wifiBSSID")); - payload.replace(F("#ICON#"), F("wifi")); - client.publish(topic.c_str(), payload.c_str(), true); - - // Chip ID - topic = configTopicTemplate; - topic.replace(F("#COMPONENT#"), F("sensor")); - topic.replace(F("#SENSORID#"), F("chipID")); - - payload = configPayloadTemplate; - payload.replace(F("#SENSORID#"), F("chipID")); - payload.replace(F("#SENSORNAME#"), F("Chip ID")); - payload.replace(F("#STATETOPIC#"), F("matrixinfo")); - payload.replace(F("#VALUENAME#"), F("chipID")); - payload.replace(F("#ICON#"), F("developer-board")); - client.publish(topic.c_str(), payload.c_str(), true); - - // LED Matrix on/off + brightness light - configPayloadTemplate = String(F( - "{" - "\"dev\":{" - "\"ids\":\"#DEVICEID#\"," - "\"name\":\"#HOSTNAME#\"," - "\"mdl\":\"PixelIt\"," - "\"mf\":\"PixelIt\"," - "\"sw\":\"#VERSION#\"," - "\"cu\":\"#IP#\"" - "}," - "\"avty_t\":\"#MASTERTOPIC#state\"," - "\"pl_avail\":\"connected\"," - "\"pl_not_avail\":\"disconnected\"," - "\"uniq_id\":\"#DEVICEID##SENSORID#\"," - "\"name\":\"#SENSORNAME#\"," - "\"schema\":\"template\"," - "\"stat_t\":\"#MASTERTOPIC##STATETOPIC#\"," - "\"stat_tpl\":\"{{ \'on\' if value_json.sleepMode is false else \'off\' }}\"," - "\"cmd_t\":\"#MASTERTOPIC##COMMANDTOPIC#\"," - "\"cmd_on_tpl\":\"{\'sleepMode\': false {%- if brightness is defined -%}, \'brightness\': {{ brightness }}{%- endif -%}}\"," - "\"cmd_off_tpl\":\"{\'sleepMode\': true}\"," - "\"bri_tpl\":\"{{ value_json.currentMatrixBrightness }}\"," - "\"icon\":\"mdi:#ICON#\"" - "}")); - configPayloadTemplate.replace(F("#DEVICEID#"), deviceID); - configPayloadTemplate.replace(F("#HOSTNAME#"), hostname); - configPayloadTemplate.replace(F("#VERSION#"), VERSION); - configPayloadTemplate.replace(F("#MASTERTOPIC#"), mqttMasterTopic); - configPayloadTemplate.replace(F("#IP#"), ip_url); - - topic = configTopicTemplate; - topic.replace(F("#COMPONENT#"), F("light")); - topic.replace(F("#SENSORID#"), F("LEDMatrixLight")); - - payload = configPayloadTemplate; - payload.replace(F("#SENSORID#"), F("LEDMatrixLight")); - payload.replace(F("#SENSORNAME#"), F("LED Matrix")); - payload.replace(F("#STATETOPIC#"), F("matrixinfo")); - payload.replace(F("#COMMANDTOPIC#"), F("setScreen")); - payload.replace(F("#ICON#"), F("led-strip")); - client.publish(topic.c_str(), payload.c_str(), true); - - Log(F("MQTTreconnect"), F("MQTT discovery information published")); - } - else - { - Log(F("MQTTreconnect"), F("MQTT connect failed! Retry in a few seconds...")); - } - - return connected; -} -///////////////////////////////////////////////////////////////////// -///////////////////////////////////////////////////////////////////// -// Effekte - -void FadeOut(int dealy, int minBrightness) -{ - int currentFadeBrightness = currentMatrixBrightness; - - int counter = 25; - while (counter >= 0) - { - currentFadeBrightness = map(counter, 0, 25, minBrightness, currentMatrixBrightness); - matrix->setBrightness(currentFadeBrightness); - matrix->show(); - counter--; - delay(dealy); - } -} - -void FadeIn(int dealy, int minBrightness) -{ - int currentFadeBrightness = minBrightness; - - int counter = 0; - while (counter <= 25) - { - currentFadeBrightness = map(counter, 0, 25, minBrightness, currentMatrixBrightness); - matrix->setBrightness(currentFadeBrightness); - matrix->show(); - counter++; - delay(dealy); - } -} - -void ColoredBarWipe() -{ - for (uint16_t i = 0; i < 32 + 1; i++) - { - matrix->fillRect(0, 0, i - 1, 8, matrix->Color(0, 0, 0)); - - matrix->drawFastVLine(i, 0, 8, ColorWheel((i * 8) & 255, 0)); - matrix->drawFastVLine(i + 1, 0, 8, ColorWheel((i * 9) & 255, 0)); - matrix->drawFastVLine(i - 1, 0, 8, 0); - matrix->drawFastVLine(i - 2, 0, 8, 0); - matrix->show(); - delay(15); - } -} - -void ZigZagWipe(uint8_t r, uint8_t g, uint8_t b) -{ - for (uint16_t row = 0; row <= 7; row += 2) - { - for (uint16_t col = 0; col <= 31; col++) - { - if (row == 0 || row == 4) - { - matrix->fillRect(0, row, col - 1, 2, matrix->Color(0, 0, 0)); - matrix->drawFastVLine(col - 1, row, 2, matrix->Color(r, g, b)); - matrix->drawFastVLine(col, row, 2, matrix->Color(r, g, b)); - } - else - { - matrix->fillRect(32 - col, row, col, 2, matrix->Color(0, 0, 0)); - matrix->drawFastVLine(32 - col, row, 2, matrix->Color(r, g, b)); - matrix->drawFastVLine(32 - col - 1, row, 2, matrix->Color(r, g, b)); - } - matrix->show(); - delay(5); - } - matrix->fillRect(0, row, 32, 2, matrix->Color(0, 0, 0)); - if (row == 0 || row == 4) - { - matrix->drawFastVLine(30, row + 1, 2, matrix->Color(r, g, b)); - matrix->drawFastVLine(31, row + 1, 2, matrix->Color(r, g, b)); - } - else - { - matrix->drawFastVLine(0, row + 1, 2, matrix->Color(r, g, b)); - matrix->drawFastVLine(1, row + 1, 2, matrix->Color(r, g, b)); - } - matrix->show(); - delay(5); - matrix->fillRect(0, row, 32, 2, matrix->Color(0, 0, 0)); - } - matrix->fillRect(0, 0, 32, 8, matrix->Color(0, 0, 0)); - matrix->show(); -} - -void BitmapWipe(JsonArray &data, int16_t w) -{ - for (int16_t x = -w + 1; x <= 31; x++) - { - int16_t y = 0; - for (int16_t j = 0; j < 8; j++, y++) - { - for (int16_t i = 0; i < w; i++) - { - matrix->drawPixel(x + i, y, data[j * w + i].as()); - } - } - matrix->show(); - delay(18); - matrix->fillRect(0, 0, x, 8, matrix->Color(0, 0, 0)); - matrix->show(); - } -} - -void ColorFlash(int red, int green, int blue) -{ - for (uint16_t row = 0; row < 8; row++) - { - for (uint16_t column = 0; column < 32; column++) - { - matrix->drawPixel(column, row, matrix->Color(red, green, blue)); - } - } - matrix->show(); -} - -uint ColorWheel(byte wheelPos, int pos) -{ - if (wheelPos < 85) - { - return matrix->Color((wheelPos * 3) - pos, (255 - wheelPos * 3) - pos, 0); - } - else if (wheelPos < 170) - { - wheelPos -= 85; - return matrix->Color((255 - wheelPos * 3) - pos, 0, (wheelPos * 3) - pos); - } - else - { - wheelPos -= 170; - return matrix->Color(0, (wheelPos * 3) - pos, (255 - wheelPos * 3) - pos); - } -} - -void ShowBootAnimation() -{ - DrawTextHelper("P", false, false, false, false, false, 255, 51, 255, 4, 1); - matrix->show(); - - delay(200); - DrawTextHelper("I", false, false, false, false, false, 0, 255, 42, 8, 1); - matrix->show(); - - delay(200); - DrawTextHelper("X", false, false, false, false, false, 255, 25, 25, 10, 1); - matrix->show(); - - delay(200); - DrawTextHelper("E", false, false, false, false, false, 25, 255, 255, 14, 1); - matrix->show(); - - delay(200); - DrawTextHelper("L", false, false, false, false, false, 255, 221, 51, 18, 1); - matrix->show(); - - delay(500); - DrawTextHelper("I", false, false, false, false, false, 255, 255, 255, 22, 1); - DrawTextHelper("T", false, false, false, false, false, 255, 255, 255, 24, 1); - matrix->show(); - delay(1000); - - // FadeIn(60, 10); - // DrawTextHelper("PIXELIT", false, false, false, false, false, 255, 255, 255, 3, 1); - // FadeIn(60, 10); - // FadeOut(60, 10); - // FadeIn(60, 10); - // FadeOut(60, 10); - // FadeIn(60, 10); -} - -ColorTemperature GetUserColorTemp() -{ - if (matrixTempCorrection == "tungsten40w") - { - return Tungsten40W; - } - - if (matrixTempCorrection == "tungsten100w") - { - return Tungsten100W; - } - - if (matrixTempCorrection == "halogen") - { - return Halogen; - } - - if (matrixTempCorrection == "carbonarc") - { - return CarbonArc; - } - - if (matrixTempCorrection == "highnoonsun") - { - return HighNoonSun; - } - - if (matrixTempCorrection == "directsunlight") - { - return DirectSunlight; - } - - if (matrixTempCorrection == "overcastsky") - { - return OvercastSky; - } - - if (matrixTempCorrection == "clearbluesky") - { - return ClearBlueSky; - } - - if (matrixTempCorrection == "warmfluorescent") - { - return WarmFluorescent; - } - - if (matrixTempCorrection == "standardfluorescent") - { - return StandardFluorescent; - } - - if (matrixTempCorrection == "coolwhitefluorescent") - { - return CoolWhiteFluorescent; - } - if (matrixTempCorrection == "fullspectrumfluorescent") - { - return FullSpectrumFluorescent; - } - if (matrixTempCorrection == "growlightfluorescent") - { - return GrowLightFluorescent; - } - if (matrixTempCorrection == "blacklightfluorescent") - { - return BlackLightFluorescent; - } - if (matrixTempCorrection == "mercuryvapor") - { - return MercuryVapor; - } - if (matrixTempCorrection == "sodiumvapor") - { - return SodiumVapor; - } - if (matrixTempCorrection == "metalhalide") - { - return MetalHalide; - } - if (matrixTempCorrection == "highpressuresodium") - { - return HighPressureSodium; - } - - return UncorrectedTemperature; -} - -LEDColorCorrection GetUserColorCorrection() -{ - if (matrixTempCorrection == "default") - { - return TypicalSMD5050; - } - - if (matrixTempCorrection == "typicalsmd5050") - { - return TypicalSMD5050; - } - - if (matrixTempCorrection == "typical8mmpixel") - { - return Typical8mmPixel; - } - - return UncorrectedColor; -} - -int *GetUserCutomCorrection() -{ - String rgbString = matrixTempCorrection; - rgbString.trim(); - - // R,G,B / 255,255,255 - static int rgbArray[3]; - - // R - rgbArray[0] = rgbString.substring(0, 3).toInt(); - // G - rgbArray[1] = rgbString.substring(4, 7).toInt(); - // B - rgbArray[2] = rgbString.substring(8, 11).toInt(); - - return rgbArray; -} - -LightDependentResistor::ePhotoCellKind TranslatePhotocell(String photocell) -{ - if (photocell == "GL5516") - return LightDependentResistor::GL5516; - if (photocell == "GL5528") - return LightDependentResistor::GL5528; - if (photocell == "GL5537_1") - return LightDependentResistor::GL5537_1; - if (photocell == "GL5537_2") - return LightDependentResistor::GL5537_2; - if (photocell == "GL5539") - return LightDependentResistor::GL5539; - if (photocell == "GL5549") - return LightDependentResistor::GL5549; - Log(F("Zuordnung LDR"), F("Unbekannter LDR-Typ")); - return LightDependentResistor::GL5528; -} - -uint8_t TranslatePin(String pin) -{ - if (pin == "Pin_D0") - return D0; - if (pin == "Pin_D1") - return D1; - if (pin == "Pin_D2") - return D2; - if (pin == "Pin_D3") - return D3; - if (pin == "Pin_D4") - return D4; - if (pin == "Pin_D5") - return D5; - if (pin == "Pin_D6") - return D6; - if (pin == "Pin_D7") - return D7; - if (pin == "Pin_D8") - return D8; - if (pin == "Pin_27") - return 27; - Log(F("Pin-Zuordnung"), F("Unbekannter Pin")); - return LED_BUILTIN; -} - -void ClearTextArea() -{ - int16_t h = 8; - int16_t w = 24; - int16_t x = 8; - int16_t y = 0; - - for (int16_t j = 0; j < h; j++, y++) - { - for (int16_t i = 0; i < w; i++) - { - matrix->drawPixel(x + i, y, (uint16_t)0); - } - } -} - -void ClearBMPArea() -{ - int16_t h = 8; - int16_t w = 8; - int16_t x = 0; - int16_t y = 0; - - for (int16_t j = 0; j < h; j++, y++) - { - for (int16_t i = 0; i < w; i++) - { - matrix->drawPixel(x + i, y, (uint16_t)0); - } - } -} - -int DayOfWeekFirstMonday(int OrigDayofWeek) -{ - int idx = (7 + OrigDayofWeek) - 1; - if (idx > 6) // week ends at 6, because Enum.DayOfWeek is zero-based - { - idx -= 7; - } - return idx; - // int diff = (7 + (OrigDayofWeek - 1)) % 7; - // return OrigDayofWeek + (-1 * diff); -} - -void initDFPlayer() -{ - if (!mp3Player.begin(*softSerial)) - { - Log(F("DFPlayer"), F("DFPlayer not found")); - } - else - { - Log(F("DFPlayer"), F("DFPlayer started")); - mp3Player.volume(initialVolume); - } -} - -///////////////////////////////////////////////////////////////////// -///////////////////////////////////////////////////////////////////// -void setup() -{ - - Serial.begin(115200); - - // Mounting FileSystem - Serial.println(F("Mounting file system...")); -#if defined(ESP8266) - if (LittleFS.begin()) -#elif defined(ESP32) - if (SPIFFS.begin()) -#endif - { - Serial.println(F("Mounted file system.")); - LoadConfig(); - // If new version detected, create new variables in config if necessary. - if (optionsVersion != VERSION) - { - Log(F("LoadConfig"), F("New version detected, create new variables in config if necessary")); - SaveConfig(); - LoadConfig(); - } - } - else - { - Serial.println(F("Failed to mount FS")); - } - - // Init SetGPIO Array - for (int i = 0; i < SET_GPIO_SIZE; i++) - { - setGPIOReset[i].gpio = -1; - setGPIOReset[i].resetMillis = -1; - } - - // I2C Sensors - twowire.begin(TranslatePin(SDAPin), TranslatePin(SCLPin)); - - // Init LightSensor - bh1750 = new BH1750(); - if (bh1750->begin(BH1750::CONTINUOUS_HIGH_RES_MODE, 0x23, &twowire)) - { - Log(F("Setup"), F("BH1750 started")); - luxSensor = LuxSensor_BH1750; - } - else - { - delete bh1750; - max44009 = new Max44009(Max44009::Boolean::False); - max44009->configure(MAX44009_DEFAULT_ADDRESS, &twowire, Max44009::Boolean::False); - if (max44009->isConnected()) - { - Log(F("Setup"), F("Max44009/GY-049 started")); - luxSensor = LuxSensor_Max44009; - } - else - { - delete max44009; - photocell = new LightDependentResistor(LDR_PIN, ldrPulldown, TranslatePhotocell(ldrDevice), 10, ldrSmoothing); - photocell->setPhotocellPositionOnGround(false); - luxSensor = LuxSensor_LDR; - } - } - - // Init Temp Sensors - bme280 = new Adafruit_BME280(); - if (bme280->begin(BME280_ADDRESS_ALTERNATE, &twowire)) - { - Log(F("Setup"), F("BME280 started")); - tempSensor = TempSensor_BME280; - } - else - { - delete bme280; - bmp280 = new Adafruit_BMP280(&twowire); - Log(F("Setup"), F("BMP280 Trying")); - if (bmp280->begin(BMP280_ADDRESS_ALT, 0x58)) - { - Log(F("Setup"), F("BMP280 started")); - tempSensor = TempSensor_BMP280; - } - else - { - delete bmp280; - bme680 = new Adafruit_BME680(&twowire); - if (bme680->begin()) - { - Log(F("Setup"), F("BME680 started")); - tempSensor = TempSensor_BME680; - } - else - { - Log(F("Setup"), F("No BMP280, BME280 or BME 680 sensor found")); - // AM2320 needs a delay to be reliably initialized - delete bme680; - - // continue only if: - // - LDR is being used. This means: no light sensor in I²C bus. - // - SDA and SCL use different pin than onewire - - // Otherwise, we already found a light sensor on I²C. If we would start a probe for OneWire on the same pin now, I²C will be disfunctional. - if (luxSensor == LuxSensor_LDR || (onewirePin != SDAPin && onewirePin != SCLPin)) - { - delay(800); - dht.setup(TranslatePin(onewirePin), DHTesp::DHT22); - if (!isnan(dht.getHumidity()) && !isnan(dht.getTemperature())) - { - Log(F("Setup"), F("DHT started")); - tempSensor = TempSensor_DHT; - } - else - { - Log(F("Setup"), F("No DHT Sensor found")); - } - } - else - { - Log(F("Setup"), F("Not probing DHT sensor: light sensor already found on same pin as DHT.")); - } - } - } - } - - switch (matrixType) - { - default: // Matix Type 1 (Colum major) - matrix = new FastLED_NeoMatrix(leds, 32, 8, NEO_MATRIX_TOP + NEO_MATRIX_LEFT + NEO_MATRIX_COLUMNS + NEO_MATRIX_ZIGZAG); - break; - - case 2: // Matix Type 2 (Row major) - matrix = new FastLED_NeoMatrix(leds, 32, 8, NEO_MATRIX_TOP + NEO_MATRIX_LEFT + NEO_MATRIX_ROWS + NEO_MATRIX_ZIGZAG); - break; - - case 3: // Matix Type 3 (Tiled 4x 8x8 CJMCU, Column major) - matrix = new FastLED_NeoMatrix(leds, 32, 8, NEO_MATRIX_BOTTOM + NEO_MATRIX_LEFT + NEO_MATRIX_COLUMNS + NEO_MATRIX_PROGRESSIVE); - break; - - case 4: // Matix Type 4 (MicroMatrix by foorschtbar) See: https://github.com/foorschtbar/Sk6805EC15-Matrix - matrix = new FastLED_NeoMatrix(leds, 8, 8, 4, 1, NEO_MATRIX_TOP + NEO_MATRIX_LEFT + NEO_MATRIX_ROWS + NEO_MATRIX_ZIGZAG); - break; - - case 5: // Matix Type 5 (Tiled 4x 8x8 CJMCU, Row major) - matrix = new FastLED_NeoMatrix(leds, 8, 8, 4, 1, NEO_MATRIX_TOP + NEO_MATRIX_LEFT + NEO_MATRIX_ROWS + NEO_MATRIX_PROGRESSIVE); - break; - } - - ColorTemperature userColorTemp = GetUserColorTemp(); - LEDColorCorrection userLEDCorrection = GetUserColorCorrection(); - - // Matrix Color Correction - if (userLEDCorrection != UncorrectedColor) - { - FastLED.addLeds(leds, MATRIX_WIDTH * MATRIX_HEIGHT).setCorrection(userLEDCorrection); - } - else if (userColorTemp != UncorrectedTemperature) - { - FastLED.addLeds(leds, MATRIX_WIDTH * MATRIX_HEIGHT).setTemperature(userColorTemp); - } - else - { - int *rgbArray = GetUserCutomCorrection(); - FastLED.addLeds(leds, MATRIX_WIDTH * MATRIX_HEIGHT).setCorrection(matrix->Color(rgbArray[0], rgbArray[1], rgbArray[2])); - } - - matrix->begin(); - matrix->setTextWrap(false); - matrix->setBrightness(currentMatrixBrightness); - matrix->clear(); - - softSerial = new SoftwareSerial(TranslatePin(dfpTXPin), TranslatePin(dfpRXPin)); - - softSerial->begin(9600); - Log(F("Setup"), F("Software Serial started")); - - // Play sound on boot - if (bootSound) - { - delay(1000); // is needed for the dfplayer to startup - initDFPlayer(); - delay(10); - mp3Player.play(1); - } - - // Bootscreen - if (bootScreenAktiv) - { - ShowBootAnimation(); - } - - // Hostname - if (hostname.isEmpty()) - { - hostname = "PixelIt"; - } - WiFi.hostname(hostname); - - wifiManager.setAPCallback(EnteredHotspotCallback); - wifiManager.setMinimumSignalQuality(); - // Timout for the wifi connection until the hotspot is set up - wifiManager.setTimeout(30); - // Config menue timeout 180 seconds. - wifiManager.setConfigPortalTimeout(180); - - if (!wifiManager.autoConnect("PIXELIT")) - { - Log(F("Setup"), F("Wifi failed to connect and hit timeout")); - delay(3000); - // Reset and try again, or maybe put it to deep sleep - ESP.restart(); - delay(5000); - } - - Log(F("Setup"), F("Wifi connected...yeey :)")); - - Log(F("Setup"), F("Local IP")); - Log(F("Setup"), WiFi.localIP().toString()); - Log(F("Setup"), WiFi.gatewayIP().toString()); - Log(F("Setup"), WiFi.subnetMask().toString()); - - Log(F("Setup"), F("Starting UDP")); - udp.begin(2390); - // Log(F("Setup"), "Local port: " + String(udp.localPort())); - - httpUpdater.setup(&server); - - server.on(F("/api/screen"), HTTP_POST, HandleScreen); - server.on(F("/api/luxsensor"), HTTP_GET, HandleGetLuxSensor); - server.on(F("/api/brightness"), HTTP_GET, HandleGetBrightness); - server.on(F("/api/dhtsensor"), HTTP_GET, HandleGetDHTSensor); // Legacy - server.on(F("/api/sensor"), HTTP_GET, HandleGetSensor); - server.on(F("/api/buttons"), HTTP_GET, HandleGetButtons); - server.on(F("/api/matrixinfo"), HTTP_GET, HandleGetMatrixInfo); - // server.on(F("/api/soundinfo"), HTTP_GET, HandleGetSoundInfo); - server.on(F("/api/config"), HTTP_POST, HandleSetConfig); - server.on(F("/api/config"), HTTP_GET, HandleGetConfig); - server.on(F("/api/wifireset"), HTTP_POST, HandelWifiConfigReset); - server.on(F("/api/factoryreset"), HTTP_POST, HandleFactoryReset); - server.on(F("/"), HTTP_GET, HandleGetMainPage); - server.onNotFound(HandleNotFound); - - server.begin(); - - webSocket.begin(); - webSocket.onEvent(webSocketEvent); - - // Liveview - liveview.begin(matrix, leds, SEND_LIVEVIEW_INTERVAL); // pass pointer to matrix, ledbuffer and interval - liveview.setCallback(sendLiveview); // set callback function which is called after the interval - - Log(F("Setup"), F("Webserver started")); - - if (mqttAktiv == true) - { - client.setServer(mqttServer.c_str(), mqttPort); - client.setCallback(callback); - client.setBufferSize(8000); - Log(F("Setup"), F("MQTT started")); - } - - if (!bootSound) - { - initDFPlayer(); - } -} - -void displayUpdateScreen() -{ - Log(F("UpdateScreen"), F("Display UpdateScreen...")); - - DynamicJsonBuffer jsonBuffer; - JsonObject &root = jsonBuffer.createObject(); - - BuildUpdateScreenJSON(root); - - if (root.success()) - { - CreateFrames(root, CHECKUPDATESCREEN_DURATION); - } - else - { - Log(F("UpdateScreen"), F("Failed to Build UpdateScreen JSON")); - } -} - -void checkUpdate() -{ - Log(F("CheckUpdate"), F("Checking...")); - HttpClient httpClient = HttpClient(wifiClientHTTP, CHECKUPDATE_SERVER_HOST, CHECKUPDATE_SERVER_PORT); - httpClient.sendHeader("User-Agent", "PixelIt"); - httpClient.setTimeout(1500); - httpClient.get(CHECKUPDATE_SERVER_PATH); - int statusCode = httpClient.responseStatusCode(); - String response = httpClient.responseBody(); - - // Serial.print("Status code: "); - // Serial.println(statusCode); - // Serial.print("Response: "); - // Serial.println(response); - - if (statusCode == 200) - { - DynamicJsonBuffer jsonBuffer; - JsonObject &root = jsonBuffer.parseObject(response); - if (root.containsKey("version")) - { - lastReleaseVersion = root["version"].as(); - if (!lastReleaseVersion.equals(VERSION)) - { - Log(F("CheckUpdate"), F("New FW available")); - } - else - { - Log(F("CheckUpdate"), F("No new FW available")); - } - } - } - else - { - Log(F("CheckUpdate"), "Error. HTTP Code: " + statusCode); - } -} - -void loop() -{ - server.handleClient(); - webSocket.loop(); - - // Reset GPIO based on the array, as far as something is present in the array. - for (int i = 0; i < SET_GPIO_SIZE; i++) - { - if (setGPIOReset[i].gpio != -1) - { - if (setGPIOReset[i].resetMillis <= millis()) - { - Log(F("ResetSetGPIO"), "Pos: " + String(i) + ", GPIO: " + String(setGPIOReset[i].gpio) + ", Value: false"); - digitalWrite(setGPIOReset[i].gpio, false); - setGPIOReset[i].gpio = -1; - setGPIOReset[i].resetMillis = -1; - } - } - } - - // Check and display if new FW version is available. - // if necessary also check scrollTextAktivLoop = false; and animateBMPAktivLoop = false; if they are disturbed?! - if (checkUpdateScreen == true) - { - - // Check new FW Version first time after 30.5 seconds - if ((checkUpdatePrevMillis == 0 && millis() > 30500) || millis() - checkUpdatePrevMillis >= CHECKUPDATE_INTERVAL) - { - checkUpdatePrevMillis = millis(); - checkUpdate(); - } - - // Display new FW Version - if (millis() - checkUpdateScreenPrevMillis >= CHECKUPDATESCREEN_INTERVAL) - { - checkUpdateScreenPrevMillis = millis(); - if (!lastReleaseVersion.equals(VERSION)) - { - displayUpdateScreen(); - } - } - } - - // Send Telemetry data first time after 30.3 seconds - // if necessary also check scrollTextAktivLoop = false; and animateBMPAktivLoop = false; if they are disturbed?! - if (sendTelemetry == true && ((sendTelemetryPrevMillis == 0 && millis() > 30300) || millis() - sendTelemetryPrevMillis >= TELEMETRY_INTERVAL)) - { - sendTelemetryPrevMillis = millis(); - SendTelemetry(); - } - - if (mqttAktiv == true) - { - if (!client.connected()) - { - // MQTT connect - if (mqttLastReconnectAttempt == 0 || (millis() - mqttLastReconnectAttempt) >= MQTT_RECONNECT_INTERVAL) - { - mqttLastReconnectAttempt = millis(); - - // try to reconnect - if (MQTTreconnect()) - { - mqttLastReconnectAttempt = 0; - } - } - } - else - { - client.loop(); - } - } - - // Check buttons - for (uint button = 0; button < 3; button++) - { - if (btnEnabled[button]) - { - if ((btnState[button] == btnState_Released) && (digitalRead(TranslatePin(btnPin[button])) == btnPressedLevel[button])) - { - btnState[button] = btnState_PressedNew; - } - if ((btnState[button] == btnState_PressedBefore) && (digitalRead(TranslatePin(btnPin[button])) != btnPressedLevel[button])) - { - btnState[button] = btnState_Released; - HandleAndSendButtonPress(button, false); - } - if (btnState[button] == btnState_PressedNew) - { - btnState[button] = btnState_PressedBefore; - HandleAndSendButtonPress(button, true); - } - } - } - - // Clock Auto Fallback - if (!sleepMode && ((clockAutoFallbackActive && !clockAktiv && millis() - lastScreenMessageMillis >= (clockAutoFallbackTime * 1000)) || forceClock)) - { - forceClock = false; - scrollTextAktivLoop = false; - animateBMPAktivLoop = false; - - int performWipe = 0; - - switch (clockAutoFallbackAnimation) - { - case 1: - case 2: - case 3: - performWipe = clockAutoFallbackAnimation; - break; - case 4: - performWipe = (millis() % 3) + 1; - break; - default:; - } - - if (performWipe == 1) - { - FadeOut(); - } - else if (performWipe == 2) - { - ColoredBarWipe(); - } - else if (performWipe == 3) - { - ZigZagWipe(clockColorR, clockColorG, clockColorB); - } - clockAktiv = true; - clockCounterClock = 0; - clockCounterDate = 0; - DrawClock(true); - - if (performWipe != 0) - { - FadeIn(); - } - } - - if (clockAktiv && now() != clockLastUpdate) - { - if (timeStatus() == timeNotSet && ntpTimeOut <= millis()) - { - if (ntpRetryCounter >= NTP_MAX_RETRYS) - { - ntpTimeOut = (millis() + (NTP_TIMEOUT_SEC * 1000)); - ntpRetryCounter = 0; - Log(F("Sync TimeServer"), "sync timeout for " + String(NTP_TIMEOUT_SEC) + " seconds!"); - } - else - { - Log(F("Sync TimeServer"), ntpServer + " waiting for sync"); - setSyncProvider(getNtpTime); - } - } - clockLastUpdate = now(); - DrawClock(false); - } - - if (millis() - sendLuxPrevMillis >= 1000) - { - sendLuxPrevMillis = millis(); - - if (luxSensor == LuxSensor_BH1750) - { - currentLux = bh1750->readLightLevel() + luxOffset; - } - else if (luxSensor == LuxSensor_Max44009) - { - currentLux = max44009->getLux() + luxOffset; - } - else - { - currentLux = (roundf(photocell->getSmoothedLux() * 1000) / 1000) + luxOffset; - } - - SendLDR(false); - - if (!sleepMode && matrixBrightnessAutomatic) - { - float newBrightness = map(currentLux, mbaLuxMin, mbaLuxMax, mbaDimMin, mbaDimMax); - // Max brightness 255 - if (newBrightness > 255) - { - newBrightness = 255; - } - // Min brightness 0 - if (newBrightness < 0) - { - newBrightness = 0; - } - - if (newBrightness != currentMatrixBrightness) - { - SetCurrentMatrixBrightness(newBrightness); - Log(F("Auto Brightness"), "Lux: " + String(currentLux) + " set brightness to " + String(currentMatrixBrightness)); - } - } - } - - if (millis() - sendSensorPrevMillis >= 3000) - { - sendSensorPrevMillis = millis(); - SendSensor(false); - } - - // liveview - liveview.loop(); - - if (millis() - sendInfoPrevMillis >= 3000) - { - sendInfoPrevMillis = millis(); - SendMatrixInfo(false); - // SendMp3PlayerInfo(false); - } - - if (animateBMPAktivLoop && millis() - animateBMPPrevMillis >= animateBMPDelay) - { - animateBMPPrevMillis = millis(); - AnimateBMP(true); - } - - if (scrollTextAktivLoop && millis() - scrollTextPrevMillis >= scrollTextDelay) - { - scrollTextPrevMillis = millis(); - ScrollText(false); - } -} - -void SendMatrixInfo(bool force) -{ - if (force) - { - oldGetMatrixInfo = ""; - } - - String matrixInfo; - - // Prüfen ob die ermittlung der MatrixInfo überhaupt erforderlich ist - if ((mqttAktiv == true && client.connected()) || (webSocket.connectedClients() > 0)) - { - matrixInfo = GetMatrixInfo(); - } - // Prüfen ob über MQTT versendet werden muss - if (mqttAktiv == true && client.connected() && oldGetMatrixInfo != matrixInfo) - { - client.publish((mqttMasterTopic + "matrixinfo").c_str(), matrixInfo.c_str(), true); - } - // Prüfen ob über Websocket versendet werden muss - if (webSocket.connectedClients() > 0 && oldGetMatrixInfo != matrixInfo) - { - for (uint i = 0; i < sizeof websocketConnection / sizeof websocketConnection[0]; i++) - { - webSocket.sendTXT(i, "{\"sysinfo\":" + matrixInfo + "}"); - } - } - - oldGetMatrixInfo = matrixInfo; -} - -void SendLDR(bool force) -{ - if (force) - { - oldGetLuxSensor = ""; - } - - String luxSensor; - - // Prüfen ob die Abfrage des LuxSensor überhaupt erforderlich ist - if ((mqttAktiv == true && client.connected()) || (webSocket.connectedClients() > 0)) - { - luxSensor = GetLuxSensor(); - } - // Prüfen ob über MQTT versendet werden muss - if (mqttAktiv == true && client.connected() && oldGetLuxSensor != luxSensor) - { - client.publish((mqttMasterTopic + "luxsensor").c_str(), luxSensor.c_str(), true); - } - // Prüfen ob über Websocket versendet werden muss - if (webSocket.connectedClients() > 0 && oldGetLuxSensor != luxSensor) - { - for (unsigned int i = 0; i < sizeof websocketConnection / sizeof websocketConnection[0]; i++) - { - webSocket.sendTXT(i, "{\"sensor\":" + luxSensor + "}"); - } - } - - oldGetLuxSensor = luxSensor; -} -void sendLiveview(const char *data, size_t length) -{ - if (webSocket.connectedClients() > 0) - { - for (unsigned int i = 0; i < sizeof websocketConnection / sizeof websocketConnection[0]; i++) - { - webSocket.sendTXT(i, data, length); - } - } -} - -void SendSensor(bool force) -{ - if (force) - { - oldGetSensor = ""; - } - - String Sensor; - - // Prüfen ob die Abfrage des LuxSensor überhaupt erforderlich ist - if ((mqttAktiv == true && client.connected()) || (webSocket.connectedClients() > 0)) - { - Sensor = GetSensor(); - } - // Prüfen ob über MQTT versendet werden muss - if (mqttAktiv == true && client.connected() && oldGetSensor != Sensor) - { - client.publish((mqttMasterTopic + "dhtsensor").c_str(), Sensor.c_str(), true); // Legancy - client.publish((mqttMasterTopic + "sensor").c_str(), Sensor.c_str(), true); - } - // Prüfen ob über Websocket versendet werden muss - if (webSocket.connectedClients() > 0 && oldGetSensor != Sensor) - { - for (uint i = 0; i < sizeof websocketConnection / sizeof websocketConnection[0]; i++) - { - webSocket.sendTXT(i, "{\"sensor\":" + Sensor + "}"); - } - } - - oldGetSensor = Sensor; -} - -void SendConfig() -{ - if (webSocket.connectedClients() > 0) - { - for (uint i = 0; i < sizeof websocketConnection / sizeof websocketConnection[0]; i++) - { - String config = GetConfig(); - webSocket.sendTXT(i, "{\"config\":" + config + "}"); - } - } -} - -///////////////////////////////////////////////////////////////////// -/*-------- NTP code ----------*/ -const int NTP_PACKET_SIZE = 48; -byte packetBuffer[NTP_PACKET_SIZE]; - -time_t getNtpTime() -{ - while (udp.parsePacket() > 0) - ; - sendNTPpacket(ntpServer); - uint32_t beginWait = millis(); - while (millis() - beginWait < 1500) - { - int size = udp.parsePacket(); - if (size >= NTP_PACKET_SIZE) - { - udp.read(packetBuffer, NTP_PACKET_SIZE); - time_t secsSince1900; - - secsSince1900 = (time_t)packetBuffer[40] << 24; - secsSince1900 |= (time_t)packetBuffer[41] << 16; - secsSince1900 |= (time_t)packetBuffer[42] << 8; - secsSince1900 |= (time_t)packetBuffer[43]; - time_t secsSince1970 = secsSince1900 - 2208988800UL; - float totalOffset = clockTimeZone; - if (clockDayLightSaving) - { - totalOffset = (clockTimeZone + DSToffset(secsSince1970, clockTimeZone)); - } - return secsSince1970 + (time_t)(totalOffset * SECS_PER_HOUR); - ntpRetryCounter = 0; - } - yield(); - } - ntpRetryCounter++; - return 0; -} -void sendNTPpacket(String &address) -{ - memset(packetBuffer, 0, NTP_PACKET_SIZE); - - packetBuffer[0] = 0b11100011; - packetBuffer[1] = 0; - packetBuffer[2] = 6; - packetBuffer[3] = 0xEC; - - packetBuffer[12] = 49; - packetBuffer[13] = 0x4E; - packetBuffer[14] = 49; - packetBuffer[15] = 52; - - udp.beginPacket(address.c_str(), 123); - udp.write(packetBuffer, NTP_PACKET_SIZE); - udp.endPacket(); -} - -void Log(String function, String message) -{ - - String timeStamp = IntFormat(year()) + "-" + IntFormat(month()) + "-" + IntFormat(day()) + "T" + IntFormat(hour()) + ":" + IntFormat(minute()) + ":" + IntFormat(second()); - - Serial.println("[" + timeStamp + "] " + function + ": " + message); - - // Prüfen ob über Websocket versendet werden muss - if (webSocket.connectedClients() > 0) - { - for (unsigned int i = 0; i < sizeof websocketConnection / sizeof websocketConnection[0]; i++) - { - String payload = "{\"log\":{\"timeStamp\":\"" + timeStamp + "\",\"function\":\"" + function + "\",\"message\":\"" + message + "\"}}"; - webSocket.sendTXT(i, payload); - } - } -} +#include + +#if defined(ESP8266) +#include +#include +#include +#include + +#elif defined(ESP32) +#include +#include +#include +#include +#endif + +// BME Sensor +#include +#include +#include +#include +#include +// WiFi & Web +#include +#include +#include +#include +// MQTT +#include +// Matrix +#include +#include +#include +#include +// Misc +#include +#include +#include +#include +#include +#include +#include "ColorConverterLib.h" +#include +#include +#include +#include +// Ulanzi Sensor +#include "Adafruit_SHT31.h" +// PixelIT Stuff +#include "PixelItFont.h" +#include "Webinterface.h" +#include "Tools.h" +#include "UpdateScreen.h" +#include "Liveview.h" +#define TELEMETRY_INTERVAL 1000 * 60 * 60 * 12 // 12 Hours +#define CHECKUPDATE_INTERVAL 1000 * 60 * 6 * 8 // 8 Hours +#define CHECKUPDATESCREEN_INTERVAL 1000 * 60 * 5 // 5 Minutes +#define CHECKUPDATESCREEN_DURATION 1000 * 5 // 5 Seconds +#define SEND_LIVEVIEW_INTERVAL 250 // 0.5 Seconds, 0 to disable + +#define VERSION "0.0.0-beta" // will be replaced by build piple with Git-Tag! + +#define XSTR(x) #x +#define STR(x) XSTR(x) + +void FadeOut(int = 10, int = 0); +void FadeIn(int = 10, int = 0); + +class SetGPIO +{ +public: + int gpio; + ulong resetMillis; +}; +#define SET_GPIO_SIZE 4 +SetGPIO setGPIOReset[SET_GPIO_SIZE]; + +//// MQTT Config +bool mqttAktiv = false; +String mqttUser = ""; +String mqttPassword = ""; +String mqttServer = ""; +String mqttMasterTopic = "pixelit/"; +int mqttPort = 1883; +unsigned long mqttLastReconnectAttempt = 0; // will store last time reconnect to mqtt broker +const int MQTT_RECONNECT_INTERVAL = 15000; +// #define MQTT_MAX_PACKET_SIZE 8000 + +String dfpRXPin = STR(DEFAULT_PIN_DFPRX); +String dfpTXPin = STR(DEFAULT_PIN_DFPTX); +String onewirePin = STR(DEFAULT_PIN_ONEWIRE); +String SCLPin = STR(DEFAULT_PIN_SCL); +String SDAPin = STR(DEFAULT_PIN_SDA); +String ldrDevice = "GL5516"; +unsigned long ldrPulldown = 10000; // 10k pulldown-resistor +unsigned int ldrSmoothing = 0; +float batteryLevelPct = 0; + +// Telemetry API +#define TELEMETRY_SERVER_HOST "pixelit.bastelbunker.de" +#define TELEMETRY_SERVER_PATH "/api/telemetry" +#define TELEMETRY_SERVER_PORT 80 + +// Check Update API +#define CHECKUPDATE_SERVER_HOST "pixelit.bastelbunker.de" +#define CHECKUPDATE_SERVER_PATH "/api/lastversion" +#define CHECKUPDATE_SERVER_PORT 80 + +int btnPressedLevel[] = {LOW, LOW, LOW}; + +enum btnStates +{ + btnState_Released, + btnState_PressedNew, + btnState_PressedBefore, +}; + +const String btnAPINames[]{"leftButton", "middleButton", "rightButton"}; +const String btnLogNames[]{"Left button", "Middle button", "Right button"}; + +btnStates btnState[] = {btnState_Released, btnState_Released, btnState_Released}; +bool btnLastPublishState[] = {false, false, false}; + +enum btnActions +{ + btnAction_DoNothing = 0, + btnAction_GotoClock = 1, + btnAction_ToggleSleepMode = 2, + btnAction_MP3PlayPause = 3, + btnAction_MP3PlayPrevious = 4, + btnAction_MP3PlayNext = 5, +}; + +#if defined(ULANZI) +String btnPin[] = {"GPIO_NUM_26", "GPIO_NUM_27", "GPIO_NUM_14"}; // UlanziTC001 workaround to tweak WebUI +bool btnEnabled[] = {true, true, true}; +btnActions btnAction[] = {btnAction_DoNothing, btnAction_ToggleSleepMode, btnAction_GotoClock}; +#elif +String btnPin[] = {"Pin_D0", "Pin_D4", "Pin_D5"}; +bool btnEnabled[] = {false, false, false}; +btnActions btnAction[] = {btnAction_ToggleSleepMode, btnAction_GotoClock, btnAction_DoNothing}; +#endif + +CRGB leds[MATRIX_WIDTH * MATRIX_HEIGHT]; + +#if defined(ESP8266) +bool isESP8266 = true; +#else +bool isESP8266 = false; +#endif + +#if defined(ESP32) +TwoWire twowire(BME280_ADDRESS_ALTERNATE); +#elif defined(ULANZI) +TwoWire twowire = TwoWire(0); +#else +TwoWire twowire; +#endif +Adafruit_BME280 *bme280; +Adafruit_BMP280 *bmp280; +Adafruit_BME680 *bme680; +Adafruit_SHT31 sht31 = Adafruit_SHT31(&twowire); +unsigned long lastBME680read = 0; +DHTesp dht; + +// TempSensor +enum TempSensor +{ + TempSensor_None, + TempSensor_BME280, + TempSensor_DHT, + TempSensor_BME680, + TempSensor_BMP280, + TempSensor_SHT31, +}; +TempSensor tempSensor = TempSensor_None; + +// TemperatureUnit +enum TemperatureUnit +{ + TemperatureUnit_Celsius, + TemperatureUnit_Fahrenheit +}; +TemperatureUnit temperatureUnit = TemperatureUnit_Celsius; + +LightDependentResistor *photocell; +BH1750 *bh1750; +Max44009 *max44009; + +enum LuxSensor +{ + LuxSensor_LDR, + LuxSensor_BH1750, + LuxSensor_Max44009, +}; +LuxSensor luxSensor = LuxSensor_LDR; + +FastLED_NeoMatrix *matrix; +WiFiClient wifiClientMQTT; +WiFiClient wifiClientHTTP; +WiFiUDP udp; +PubSubClient client(wifiClientMQTT); +WiFiManager wifiManager; +#if defined(ESP8266) +ESP8266WebServer server(80); +ESP8266HTTPUpdateServer httpUpdater; +#elif defined(ESP32) +WebServer server(80); +HTTPUpdateServer httpUpdater; +#endif +Liveview liveview; + +WebSocketsServer webSocket = WebSocketsServer(81); +DFPlayerMini_Fast mp3Player; +SoftwareSerial *softSerial; +uint initialVolume = 10; + +// Matrix Vars +int currentMatrixBrightness = 127; +bool matrixBrightnessAutomatic = true; +int mbaDimMin = 20; +int mbaDimMax = 100; +int mbaLuxMin = 0; +int mbaLuxMax = 400; +int matrixType = DEFAULT_MATRIX_TYPE; +String note; +String hostname; +String matrixTempCorrection = "default"; + +// System Vars +bool sleepMode = false; +bool bootScreenAktiv = true; +bool bootSound = false; +String optionsVersion = ""; +// Millis timestamp of the last receiving screen +unsigned long lastScreenMessageMillis = 0; + +// Bmp Vars +uint16_t bmpArray[64]; +bool withBMP = false; +int bmpWidth = 8; +int bmpHeight = 8; +int bmpPosX = 0; +int bmpPosY = 0; + +// Timerserver Vars +String ntpServer = "de.pool.ntp.org"; +uint ntpRetryCounter = 0; +unsigned long ntpTimeOut = 0; +#define NTP_MAX_RETRYS 3 +#define NTP_TIMEOUT_SEC 60 + +// Clock Vars +bool clockBlink = false; +bool clockAktiv = true; +bool clock24Hours = true; +bool clockDateDayMonth = true; +bool clockDayOfWeekFirstMonday = true; +bool clockDayLightSaving = true; +bool clockSwitchAktiv = true; +bool clockWithSeconds = false; +bool clockAutoFallbackActive = false; +uint clockAutoFallbackAnimation = 1; +uint clockSwitchSec = 7; +uint clockCounterClock = 0; +uint clockCounterDate = 0; +float clockTimeZone = 1; +time_t clockLastUpdate; +uint8_t clockColorR = 255, clockColorG = 255, clockColorB = 255; +uint clockAutoFallbackTime = 30; +bool forceClock = false; +bool clockBlinkAnimated = true; +bool clockFatFont = false; +bool clockDrawWeekDays = true; + +// Scrolltext Vars +bool scrollTextAktivLoop = false; +unsigned long scrollTextPrevMillis = 0; +uint scrollTextDefaultDelay = 100; +uint scrollTextDelay; +int scrollCurPos; +int scrollposY; +int scrollposX; +int scrollxTextWidth; +int scrollxAvailableTextSpace; +String scrollTextString; + +// Animate BMP Vars +uint16_t animationBmpList[10][64]; +bool animateBMPAktivLoop = false; +unsigned long animateBMPPrevMillis = 0; +int animateBMPCounter = 0; +bool animateBMPReverse = false; +bool animateBMPRubberbandingAktiv = false; +uint animateBMPDelay; +int animateBMPLimitLoops = -1; +int animateBMPLoopCount = 0; +int animateBMPLimitFrames = -1; +int animateBMPFrameCount = 0; + +// Sensors Vars +unsigned long sendLuxPrevMillis = 0; +unsigned long sendSensorPrevMillis = 0; +unsigned long sendInfoPrevMillis = 0; +String oldGetMatrixInfo; +String oldGetLuxSensor; +String oldGetSensor; +float currentLux = 0.0f; +float luxOffset = 0.0f; +float temperatureOffset = 0.0f; +float humidityOffset = 0.0f; +float pressureOffset = 0.0f; +float gasOffset = 0.0f; + +// Other Vars +bool sendTelemetry = true; +unsigned long sendTelemetryPrevMillis = 0; +unsigned long forcedScreenIsActiveUntil = 0; +bool checkUpdateScreen = true; +unsigned long checkUpdateScreenPrevMillis = 0; +unsigned long checkUpdatePrevMillis = 0; +String lastReleaseVersion = VERSION; + +// MP3Player Vars +String OldGetMP3PlayerInfo; + +// Websoket Vars +String websocketConnection[10]; + +String ResetReason() +{ +#if defined(ESP8266) + return ESP.getResetReason(); +#elif defined(ESP32) + switch (esp_reset_reason()) + { + case ESP_RST_POWERON: + return "Power-on reset"; + case ESP_RST_EXT: + return "External reset"; + case ESP_RST_SW: + return "Software reset"; + case ESP_RST_PANIC: + return "Panic (hardware or software)"; + case ESP_RST_INT_WDT: + return "Internal watchdog reset"; + case ESP_RST_TASK_WDT: + return "Task watchdog reset"; + case ESP_RST_WDT: + return "Watchdog reset"; + case ESP_RST_DEEPSLEEP: + return "Deep sleep reset"; + case ESP_RST_BROWNOUT: + return "Brownout reset"; + case ESP_RST_SDIO: + return "SDIO reset"; + default: + return "Unknown reset reason"; + } +#endif +} + +void SetCurrentMatrixBrightness(float newBrightness) +{ + currentMatrixBrightness = newBrightness; + matrix->setBrightness(currentMatrixBrightness); +} + +void EnteredHotspotCallback(WiFiManager *manager) +{ + Log(F("Hotspot"), "Waiting for WiFi configuration"); + matrix->clear(); + DrawTextHelper("HOTSPOT", false, false, false, false, false, 255, 255, 255, 3, 1); + FadeIn(); +} + +void SaveConfig() +{ + // save the custom parameters to FS + DynamicJsonBuffer jsonBuffer; + JsonObject &json = jsonBuffer.createObject(); + + json["version"] = VERSION; + json["isESP8266"] = isESP8266; + json["temperatureUnit"] = static_cast(temperatureUnit); + json["matrixBrightnessAutomatic"] = matrixBrightnessAutomatic; + json["mbaDimMin"] = mbaDimMin; + json["mbaDimMax"] = mbaDimMax; + json["mbaLuxMin"] = mbaLuxMin; + json["mbaLuxMax"] = mbaLuxMax; + json["matrixBrightness"] = currentMatrixBrightness; + json["matrixType"] = matrixType; + json["note"] = note; + json["hostname"] = hostname; + json["matrixTempCorrection"] = matrixTempCorrection; + json["ntpServer"] = ntpServer; + json["clockTimeZone"] = clockTimeZone; + + String clockColorHex; + ColorConverter::RgbToHex(clockColorR, clockColorG, clockColorB, clockColorHex); + json["clockColor"] = "#" + clockColorHex; + + json["clockSwitchAktiv"] = clockSwitchAktiv; + json["clockSwitchSec"] = clockSwitchSec; + json["clock24Hours"] = clock24Hours; + json["clockDayLightSaving"] = clockDayLightSaving; + json["clockWithSeconds"] = clockWithSeconds; + json["clockAutoFallbackActive"] = clockAutoFallbackActive; + json["clockAutoFallbackTime"] = clockAutoFallbackTime; + json["clockAutoFallbackAnimation"] = clockAutoFallbackAnimation; + json["clockDateDayMonth"] = clockDateDayMonth; + json["clockDayOfWeekFirstMonday"] = clockDayOfWeekFirstMonday; + json["clockBlinkAnimated"] = clockBlinkAnimated; + json["clockFatFont"] = clockFatFont; + json["clockDrawWeekDays"] = clockDrawWeekDays; + json["scrollTextDefaultDelay"] = scrollTextDefaultDelay; + json["bootScreenAktiv"] = bootScreenAktiv; + json["bootSound"] = bootSound; + json["mqttAktiv"] = mqttAktiv; + json["mqttUser"] = mqttUser; + json["mqttPassword"] = mqttPassword; + json["mqttServer"] = mqttServer; + json["mqttMasterTopic"] = mqttMasterTopic; + json["mqttPort"] = mqttPort; + json["luxOffset"] = luxOffset; + json["temperatureOffset"] = temperatureOffset; + json["humidityOffset"] = humidityOffset; + json["pressureOffset"] = pressureOffset; + json["gasOffset"] = gasOffset; + + json["dfpRXpin"] = dfpRXPin; + json["dfpTXpin"] = dfpTXPin; + json["onewirePin"] = onewirePin; + json["SCLPin"] = SCLPin; + json["SDAPin"] = SDAPin; + for (uint b = 0; b < 3; b++) + { + json["btn" + String(b) + "Pin"] = btnPin[b]; + json["btn" + String(b) + "PressedLevel"] = btnPressedLevel[b]; + json["btn" + String(b) + "Enabled"] = btnEnabled[b]; + json["btn" + String(b) + "Action"] = static_cast(btnAction[b]); + } + json["ldrDevice"] = ldrDevice; + json["ldrPulldown"] = ldrPulldown; + json["ldrSmoothing"] = ldrSmoothing; + json["initialVolume"] = initialVolume; + json["sendTelemetry"] = sendTelemetry; + json["checkUpdateScreen"] = checkUpdateScreen; + +#if defined(ESP8266) + File configFile = LittleFS.open("/config.json", "w"); +#elif defined(ESP32) + File configFile = SPIFFS.open("/config.json", "w"); +#endif + json.printTo(configFile); + configFile.close(); + Log("SaveConfig", "Saved"); + // end save +} + +void LoadConfig() +{ + // file exists, reading and loading +#if defined(ESP8266) + if (LittleFS.exists("/config.json")) + { + File configFile = LittleFS.open("/config.json", "r"); +#elif defined(ESP32) + if (SPIFFS.exists("/config.json")) + { + File configFile = SPIFFS.open("/config.json", "r"); +#endif + if (configFile) + { + // Serial.println("opened config file"); + + DynamicJsonBuffer jsonBuffer; + JsonObject &json = jsonBuffer.parseObject(configFile); + + if (json.success()) + { + SetConfigVariables(json); + Log("LoadConfig", "Loaded"); + } + } + } + else + { + Log("LoadConfig", "No Configfile, init new file"); + SaveConfig(); + } +} + +void SetConfig(JsonObject &json) +{ + SetConfigVariables(json); + SaveConfig(); +} + +void SetConfigVariables(JsonObject &json) +{ + if (json.containsKey("version")) + { + optionsVersion = json["version"].as(); + } + + if (json.containsKey("temperatureUnit")) + { + temperatureUnit = static_cast(json["temperatureUnit"].as()); + } + + if (json.containsKey("matrixBrightnessAutomatic")) + { + matrixBrightnessAutomatic = json["matrixBrightnessAutomatic"].as(); + } + + if (json.containsKey("mbaDimMin")) + { + mbaDimMin = json["mbaDimMin"].as(); + } + + if (json.containsKey("mbaDimMax")) + { + mbaDimMax = json["mbaDimMax"].as(); + } + + if (json.containsKey("mbaLuxMin")) + { + mbaLuxMin = json["mbaLuxMin"].as(); + } + + if (json.containsKey("mbaLuxMax")) + { + mbaLuxMax = json["mbaLuxMax"].as(); + } + + if (json.containsKey("matrixBrightness")) + { + SetCurrentMatrixBrightness(json["matrixBrightness"].as()); + } + + if (json.containsKey("matrixType")) + { + matrixType = json["matrixType"].as(); + } + + if (json.containsKey("note")) + { + note = json["note"].as(); + } + + if (json.containsKey("hostname")) + { + String hostname_raw = json["hostname"].as(); + hostname = ""; + for (uint8_t n = 0; n < hostname_raw.length(); n++) + { + if ((hostname_raw.charAt(n) >= '0' && hostname_raw.charAt(n) <= '9') || (hostname_raw.charAt(n) >= 'A' && hostname_raw.charAt(n) <= 'Z') || (hostname_raw.charAt(n) >= 'a' && hostname_raw.charAt(n) <= 'z') || (hostname_raw.charAt(n) == '_') || (hostname_raw.charAt(n) == '-')) + hostname += hostname_raw.charAt(n); + } + if (hostname.isEmpty()) + { + hostname = "PixelIt"; + } + } + + if (json.containsKey("matrixTempCorrection")) + { + matrixTempCorrection = json["matrixTempCorrection"].as(); + } + + if (json.containsKey("ntpServer")) + { + ntpServer = json["ntpServer"].as(); + } + + if (json.containsKey("clockTimeZone")) + { + clockTimeZone = json["clockTimeZone"].as(); + } + + if (json.containsKey("clockColor")) + { + ColorConverter::HexToRgb(json["clockColor"].as(), clockColorR, clockColorG, clockColorB); + } + + if (json.containsKey("clockSwitchAktiv")) + { + clockSwitchAktiv = json["clockSwitchAktiv"].as(); + } + + if (json.containsKey("clockSwitchSec")) + { + clockSwitchSec = json["clockSwitchSec"].as(); + } + + if (json.containsKey("clock24Hours")) + { + clock24Hours = json["clock24Hours"].as(); + } + + if (json.containsKey("clockDayLightSaving")) + { + clockDayLightSaving = json["clockDayLightSaving"].as(); + } + + if (json.containsKey("clockWithSeconds")) + { + clockWithSeconds = json["clockWithSeconds"].as(); + } + + if (json.containsKey("clockBlinkAnimated")) + { + clockBlinkAnimated = json["clockBlinkAnimated"].as(); + } + + if (json.containsKey("clockAutoFallbackActive")) + { + clockAutoFallbackActive = json["clockAutoFallbackActive"].as(); + } + + if (json.containsKey("clockAutoFallbackAnimation")) + { + clockAutoFallbackAnimation = json["clockAutoFallbackAnimation"].as(); + } + + if (json.containsKey("clockAutoFallbackTime")) + { + clockAutoFallbackTime = json["clockAutoFallbackTime"].as(); + } + + if (json.containsKey("clockDateDayMonth")) + { + clockDateDayMonth = json["clockDateDayMonth"].as(); + } + + if (json.containsKey("clockDayOfWeekFirstMonday")) + { + clockDayOfWeekFirstMonday = json["clockDayOfWeekFirstMonday"].as(); + } + + if (json.containsKey("clockFatFont")) + { + clockFatFont = json["clockFatFont"].as(); + } + + if (json.containsKey("clockDrawWeekDays")) + { + clockDrawWeekDays = json["clockDrawWeekDays"].as(); + } + + if (json.containsKey("scrollTextDefaultDelay")) + { + scrollTextDefaultDelay = json["scrollTextDefaultDelay"].as(); + } + + if (json.containsKey("bootScreenAktiv")) + { + bootScreenAktiv = json["bootScreenAktiv"].as(); + } + + if (json.containsKey("bootSound")) + { + bootSound = json["bootSound"].as(); + } + + if (json.containsKey("mqttAktiv")) + { + mqttAktiv = json["mqttAktiv"].as(); + } + + if (json.containsKey("mqttUser")) + { + mqttUser = json["mqttUser"].as(); + } + + if (json.containsKey("mqttPassword")) + { + mqttPassword = json["mqttPassword"].as(); + } + + if (json.containsKey("mqttServer")) + { + mqttServer = json["mqttServer"].as(); + } + + if (json.containsKey("mqttMasterTopic")) + { + mqttMasterTopic = json["mqttMasterTopic"].as(); + mqttMasterTopic.trim(); + if (!mqttMasterTopic.endsWith("/")) + { + mqttMasterTopic += "/"; + } + } + + if (json.containsKey("mqttPort")) + { + mqttPort = json["mqttPort"].as(); + } + + if (json.containsKey("luxOffset")) + { + luxOffset = json["luxOffset"].as(); + } + + if (json.containsKey("temperatureOffset")) + { + temperatureOffset = json["temperatureOffset"].as(); + } + + if (json.containsKey("humidityOffset")) + { + humidityOffset = json["humidityOffset"].as(); + } + + if (json.containsKey("pressureOffset")) + { + pressureOffset = json["pressureOffset"].as(); + } + + if (json.containsKey("gasOffset")) + { + gasOffset = json["gasOffset"].as(); + } + + if (json.containsKey("dfpRXpin")) + { + dfpRXPin = json["dfpRXpin"].as(); + } + + if (json.containsKey("dfpTXpin")) + { + dfpTXPin = json["dfpTXpin"].as(); + } + + if (json.containsKey("onewirePin")) + { + onewirePin = json["onewirePin"].as(); + } + + if (json.containsKey("SCLPin")) + { + SCLPin = json["SCLPin"].as(); + } + + if (json.containsKey("SDAPin")) + { + SDAPin = json["SDAPin"].as(); + } + + for (uint b = 0; b < 3; b++) + { + if (json.containsKey("btn" + String(b) + "Pin")) + { + btnPin[b] = json["btn" + String(b) + "Pin"].as(); + } + if (json.containsKey("btn" + String(b) + "PressedLevel")) + { + btnPressedLevel[b] = json["btn" + String(b) + "PressedLevel"].as(); + } + if (json.containsKey("btn" + String(b) + "Enabled")) + { + btnEnabled[b] = json["btn" + String(b) + "Enabled"].as(); + } + if (json.containsKey("btn" + String(b) + "Action")) + { + btnAction[b] = static_cast(json["btn" + String(b) + "Action"].as()); + } + } + + if (json.containsKey("ldrDevice")) + { + ldrDevice = json["ldrDevice"].as(); + } + + if (json.containsKey("ldrPulldown")) + { + ldrPulldown = json["ldrPulldown"].as(); + } + + if (json.containsKey("ldrSmoothing")) + { + ldrSmoothing = json["ldrSmoothing"].as(); + } + + if (json.containsKey("initialVolume")) + { + initialVolume = json["initialVolume"].as(); + } + + if (json.containsKey("sendTelemetry")) + { + sendTelemetry = json["sendTelemetry"].as(); + } + + if (json.containsKey("checkUpdateScreen")) + { + checkUpdateScreen = json["checkUpdateScreen"].as(); + } +} + +void EraseWifiCredentials() +{ + wifiManager.resetSettings(); + delay(300); + ESP.restart(); + delay(300); +} + +void HandleGetMainPage() +{ + server.sendHeader(F("Connection"), F("close")); + server.send(200, F("text/html"), mainPage); +} + +void HandleNotFound() +{ + if (server.method() == HTTP_OPTIONS) + { + server.sendHeader(F("Access-Control-Allow-Origin"), "*"); + server.send(204); + } + + server.sendHeader("Location", "/update", true); + server.send(302, F("text/plain"), ""); +} + +void HandleScreen() +{ + DynamicJsonBuffer jsonBuffer; + String args = String(server.arg("plain").c_str()); + JsonObject &json = jsonBuffer.parseObject(args.begin()); + server.sendHeader(F("Connection"), F("close")); + server.sendHeader(F("Access-Control-Allow-Origin"), "*"); + + if (json.success()) + { + server.send(200, F("application/json"), F("{\"response\":\"OK\"}")); + Log(F("HandleScreen"), "Incoming JSON length: " + String(json.measureLength())); + CreateFrames(json); + } + else + { + server.send(406, F("application/json"), F("{\"response\":\"Not Acceptable\"}")); + } +} + +void HandleSetConfig() +{ + DynamicJsonBuffer jsonBuffer; + JsonObject &json = jsonBuffer.parseObject(server.arg("plain")); + server.sendHeader(F("Connection"), F("close")); + + if (json.success()) + { + Log(F("SetConfig"), "Incoming JSON length: " + String(json.measureLength())); + SetConfig(json); + server.send(200, F("application/json"), F("{\"response\":\"OK\"}")); + delay(500); + ESP.restart(); + } + else + { + server.send(406, F("application/json"), F("{\"response\":\"Not Acceptable\"}")); + } +} + +void HandleGetConfig() +{ + server.sendHeader(F("Connection"), F("close")); + server.send(200, F("application/json"), GetConfig()); +} + +void HandleGetLuxSensor() +{ + server.sendHeader(F("Connection"), F("close")); + server.send(200, F("application/json"), GetLuxSensor()); +} + +void HandleGetBrightness() +{ + server.sendHeader(F("Connection"), F("close")); + server.send(200, F("application/json"), GetBrightness()); +} + +void HandleGetDHTSensor() // Legancy +{ + server.sendHeader(F("Connection"), F("close")); + server.send(200, F("application/json"), GetSensor()); +} + +void HandleGetSensor() +{ + server.sendHeader(F("Connection"), F("close")); + server.send(200, F("application/json"), GetSensor()); +} + +void HandleGetButtons() +{ + server.sendHeader(F("Connection"), F("close")); + server.send(200, F("application/json"), GetButtons()); +} + +void HandleGetMatrixInfo() +{ + server.sendHeader(F("Connection"), F("close")); + server.send(200, F("application/json"), GetMatrixInfo()); +} + +void HandelWifiConfigReset() +{ + server.sendHeader(F("Connection"), F("close")); + server.send(200, F("application/json"), F("{\"response\":\"OK\"}")); + EraseWifiCredentials(); +} + +void HandleFactoryReset() +{ + server.sendHeader(F("Connection"), F("close")); + server.send(200, F("application/json"), F("{\"response\":\"OK\"}")); +#if defined(ESP8266) + File configFile = LittleFS.open("/config.json", "w"); +#elif defined(ESP32) + File configFile = SPIFFS.open("/config.json", "w"); +#endif + if (!configFile) + { + Log(F("Handle_factoryreset"), F("Failed to open config file for reset")); + } + configFile.println(""); + configFile.close(); + EraseWifiCredentials(); +} + +void HandleAndSendButtonPress(uint button, bool state) +{ + btnLastPublishState[button] = state; + Log(F("Buttons"), btnLogNames[button] + " is now " + (state ? "true" : "false")); + + // Prüfen ob über MQTT versendet werden muss + if (mqttAktiv == true && client.connected()) + { + client.publish((mqttMasterTopic + "buttons/button" + String(button)).c_str(), (state ? "true" : "false"), true); + } + // Prüfen ob über Websocket versendet werden muss + if (webSocket.connectedClients() > 0) + { + for (uint i = 0; i < sizeof websocketConnection / sizeof websocketConnection[0]; i++) + { + webSocket.sendTXT(i, "{\"buttons\":{\"" + btnAPINames[button] + "\":" + (state ? "true" : "false") + "}}"); + } + } + + if (state == false) + { + return; + } + + if (btnAction[button] == btnAction_ToggleSleepMode) + { + sleepMode = !sleepMode; + if (sleepMode) + { + matrix->clear(); + DrawTextHelper("Zzz", false, true, false, false, false, 0, 0, 255, 0, 1); + FadeOut(30, 0); + matrix->setBrightness(0); + matrix->show(); + } + else + { + matrix->clear(); + DrawTextHelper("😀", false, true, false, false, false, 255, 200, 0, 0, 1); + FadeIn(30, 0); + delay(150); + forceClock = true; + } + } + if (btnAction[button] == btnAction_GotoClock) + { + forceClock = true; + } + if (btnAction[button] == btnAction_MP3PlayPrevious) + { + mp3Player.playPrevious(); + } + if (btnAction[button] == btnAction_MP3PlayNext) + { + mp3Player.playNext(); + } + if (btnAction[button] == btnAction_MP3PlayPause) + { + if (mp3Player.isPlaying()) + { + mp3Player.pause(); + } + else + { + delay(200); + mp3Player.resume(); + } + } +} + +void callback(char *topic, byte *payload, unsigned int length) +{ + if (payload[0] == '{') + { + payload[length] = '\0'; + String channel = String(topic); + channel.replace(mqttMasterTopic, ""); + + DynamicJsonBuffer jsonBuffer; + JsonObject &json = jsonBuffer.parseObject(payload); + + Log("MQTT_callback", "Incomming JSON (Topic: " + String(topic) + ", Length: " + String(json.measureLength()) + ") "); + + if (channel.equals("setScreen")) + { + CreateFrames(json); + } + else if (channel.equals("getLuxsensor")) + { + client.publish((mqttMasterTopic + "luxsensor").c_str(), GetLuxSensor().c_str()); + } + else if (channel.equals("getMatrixinfo")) + { + client.publish((mqttMasterTopic + "matrixinfo").c_str(), GetMatrixInfo().c_str()); + } + else if (channel.equals("getConfig")) + { + client.publish((mqttMasterTopic + "config").c_str(), GetConfig().c_str()); + } + else if (channel.equals("setConfig")) + { + SetConfig(json); + } + } +} + +void webSocketEvent(uint8_t num, WStype_t type, uint8_t *payload, size_t length) +{ + switch (type) + { + case WStype_DISCONNECTED: + { + Log("WebSocketEvent", "[" + String(num) + "] Disconnected!"); + websocketConnection[num] = ""; + break; + } + case WStype_CONNECTED: + { + // Merken für was die Connection hergstellt wurde + websocketConnection[num] = String((char *)payload); + + // IP der Connection abfragen + IPAddress ip = webSocket.remoteIP(num); + + // Logausgabe + Log(F("WebSocketEvent"), "[" + String(num) + "] Connected from " + ip.toString() + " url: " + websocketConnection[num]); + + // send message to client + SendMatrixInfo(true); + SendLDR(true); + SendSensor(true); + SendConfig(); + webSocket.sendTXT(num, "{\"buttons\":" + GetButtons() + "}"); + webSocket.sendTXT(num, "{\"telemetry\":" + GetTelemetry() + "}"); + break; + } + case WStype_TEXT: + { + if (((char *)payload)[0] == '{') + { + DynamicJsonBuffer jsonBuffer; + JsonObject &json = jsonBuffer.parseObject(payload); + int forcedDuration = 0; + + // Logausgabe + Log(F("WebSocketEvent"), "Incoming JSON (Length: " + String(json.measureLength()) + ")"); + + if (json.containsKey("forcedDuration")) + { + forcedDuration = json["forcedDuration"].as(); + } + + if (json.containsKey("setScreen")) + { + CreateFrames(json["setScreen"], forcedDuration); + } + else if (json.containsKey("setConfig")) + { + SetConfig(json["setConfig"]); + delay(500); + ESP.restart(); + } + else if (json.containsKey("wifiReset")) + { + if (json["wifiReset"].as() == true) + { + HandelWifiConfigReset(); + } + } + else if (json.containsKey("factoryReset")) + { + if (json["factoryReset"].as() == true) + { + HandleFactoryReset(); + } + } + else if (json.containsKey("sendTelemetry")) + { + sendTelemetryPrevMillis = 0; + } + } + break; + } + case WStype_BIN: + break; + case WStype_FRAGMENT_BIN_START: + break; + case WStype_FRAGMENT_TEXT_START: + break; + case WStype_FRAGMENT: + break; + case WStype_FRAGMENT_FIN: + break; + case WStype_PING: + break; + case WStype_PONG: + break; + case WStype_ERROR: + break; + } +} + +void CreateFrames(JsonObject &json) +{ + CreateFrames(json, 0); +} + +void CreateFrames(JsonObject &json, int forceDuration) +{ + + String logMessage = F("JSON contains "); + + // Ist eine Display Helligkeit übergeben worden? + if (json.containsKey("brightness")) + { + logMessage += F("Brightness Control, "); + currentMatrixBrightness = json["brightness"]; + } + + // Set GPIO + if (json.containsKey("setGpio")) + { + logMessage += F("Set Gpio, "); + if (json["setGpio"]["set"].is() && json["setGpio"]["gpio"].is()) + { + uint8_t gpio = json["setGpio"]["gpio"].as(); + + // If the GPIO is already present in the array? + // has been found, this is to be replaced. + if (json["setGpio"]["duration"].is()) + { + int arrayIndex = -1; + for (int i = 0; i < SET_GPIO_SIZE; i++) + { + if (setGPIOReset[i].gpio == gpio) + { + arrayIndex = i; + break; + } + } + // Search free place in array. + if (arrayIndex == -1) + { + for (int i = 0; i < SET_GPIO_SIZE; i++) + { + if (setGPIOReset[i].gpio == -1) + { + arrayIndex = i; + break; + } + } + } + + if (arrayIndex == -1) + { + Log(F("SetGPIO"), F("Error: no free place in array found!")); + } + else + { + // Save data in array for the reset. + setGPIOReset[arrayIndex].gpio = gpio; + setGPIOReset[arrayIndex].resetMillis = (millis() + json["setGpio"]["duration"].as()); + Log(F("SetGPIO"), "Pos: " + String(arrayIndex) + ", GPIO: " + String(gpio) + ", Duration: " + String(json["setGpio"]["duration"].as()) + ", Value: " + json["setGpio"]["set"].as()); + } + } + else + { + Log(F("SetGPIO"), "GPIO: " + String(gpio) + ", Value: " + json["setGpio"]["set"].as()); + } + // Set GPIO + pinMode(gpio, OUTPUT); + digitalWrite(gpio, json["setGpio"]["set"].as()); + } + } + + // Sound + if (json.containsKey("sound")) + { + logMessage += F("Sound, "); + // Volume + if (json["sound"]["volume"] != NULL && json["sound"]["volume"].is()) + { + mp3Player.volume(json["sound"]["volume"].as()); + + // Sometimes, mp3Player gets hickups. A brief delay might help - but also might hinder scrolling. + // So, do it only if there are more commands to come. + if (json["sound"]["control"].as() == "") + { + Log(F("Sound"), F("Changing volume can prevent DFPlayer from executing a control command at the same time. Better make two separate API calls.")); + delay(200); + } + } + // Play + if (json["sound"]["control"] == "play") + { + if (json["sound"]["folder"]) + { + mp3Player.playFolder(json["sound"]["folder"].as(), json["sound"]["file"].as()); + } + else + { + mp3Player.play(json["sound"]["file"].as()); + } + } + // Stop + else if (json["sound"]["control"] == "pause") + { + mp3Player.pause(); + } + // Play Next + else if (json["sound"]["control"] == "next") + { + mp3Player.playNext(); + } + // Play Previous + else if (json["sound"]["control"] == "previous") + { + mp3Player.playPrevious(); + } + } + + // SleepMode + if (json.containsKey("sleepMode")) + { + logMessage += F("SleepMode Control, "); + sleepMode = json["sleepMode"]; + } + // SleepMode + if (sleepMode) + { + matrix->setBrightness(0); + matrix->show(); + } + else if (millis() >= forcedScreenIsActiveUntil || forceDuration > 0) + { + matrix->setBrightness(currentMatrixBrightness); + + // Prüfung für die Unterbrechnung der lokalen Schleifen + if (json.containsKey("bitmap") || json.containsKey("bitmaps") || json.containsKey("text") || json.containsKey("bar") || json.containsKey("bars") || json.containsKey("bitmapAnimation")) + { + lastScreenMessageMillis = millis(); + clockAktiv = false; + scrollTextAktivLoop = false; + animateBMPAktivLoop = false; + } + + // Ist eine Switch Animation übergeben worden? + bool fadeAnimationAktiv = false; + bool coloredBarWipeAnimationAktiv = false; + bool zigzagWipeAnimationAktiv = false; + bool bitmapWipeAnimationAktiv = false; + if (json.containsKey("switchAnimation")) + { + logMessage += F("SwitchAnimation, "); + // Switch Animation aktiv? + if (json["switchAnimation"]["aktiv"]) + { + // Fade Animation aktiv? + if (json["switchAnimation"]["animation"] == "fade") + { + fadeAnimationAktiv = true; + } + else if (json["switchAnimation"]["animation"] == "coloredBarWipe") + { + coloredBarWipeAnimationAktiv = true; + } + else if (json["switchAnimation"]["animation"] == "zigzagWipe") + { + zigzagWipeAnimationAktiv = true; + } + else if (json["switchAnimation"]["animation"] == "bitmapWipe") + { + bitmapWipeAnimationAktiv = true; + } + else if (json["switchAnimation"]["animation"] == "random") + { + switch (millis() % 3) + { + case 0: + fadeAnimationAktiv = true; + break; + case 1: + coloredBarWipeAnimationAktiv = true; + break; + case 2: + zigzagWipeAnimationAktiv = true; + break; + } + } + } + } + + // Fade aktiv? + if (fadeAnimationAktiv) + { + FadeOut(); + } + else if (coloredBarWipeAnimationAktiv) + { + ColoredBarWipe(); + } + else if (zigzagWipeAnimationAktiv) + { + uint8_t r = 255; + uint8_t g = 255; + uint8_t b = 255; + if (json["switchAnimation"]["hexColor"].as() != NULL) + { + ColorConverter::HexToRgb(json["switchAnimation"]["hexColor"].as(), r, g, b); + } + else if (json["switchAnimation"]["color"]["r"].as() != NULL) + { + r = json["switchAnimation"]["color"]["r"].as(); + g = json["switchAnimation"]["color"]["g"].as(); + b = json["switchAnimation"]["color"]["b"].as(); + } + ZigZagWipe(r, g, b); + } + else if (bitmapWipeAnimationAktiv) + { + BitmapWipe(json["switchAnimation"]["data"].as(), json["switchAnimation"]["width"].as()); + } + + // Clock + if (json.containsKey("clock")) + { + logMessage += F("InternalClock Control, Params: "); + scrollTextAktivLoop = false; + animateBMPAktivLoop = false; + clockAktiv = true; + + clockCounterClock = 0; + clockCounterDate = 0; + + bool isSwitchAktivSet = json["clock"]["switchAktiv"].is(); + if (isSwitchAktivSet) + { + logMessage += F("clockSwitchAktiv, "); + clockSwitchAktiv = json["clock"]["switchAktiv"]; + } + + bool isClockSwitchSecSet = json["clock"]["switchSec"] != NULL; + if (clockSwitchAktiv && isClockSwitchSecSet) + { + logMessage += F("clockSwitchSec, "); + clockSwitchSec = json["clock"]["switchSec"]; + } + + bool isClockWithSecondsSet = json["clock"]["withSeconds"].is(); + if (isClockWithSecondsSet) + { + logMessage += F("withSeconds, "); + clockWithSeconds = json["clock"]["withSeconds"]; + } + + bool isClockBlinkAnimatedSet = json["clock"]["blinkAnimated"].is(); + if (isClockBlinkAnimatedSet) + { + logMessage += F("blinkAnimated, "); + clockBlinkAnimated = json["clock"]["blinkAnimated"]; + } + + bool isFatFontSet = json["clock"]["fatFont"].is(); + if (isFatFontSet) + { + logMessage += F("fatFont, "); + clockFatFont = json["clock"]["fatFont"]; + } + + bool isDrawWeekDaysSet = json["clock"]["drawWeekDays"].is(); + if (isDrawWeekDaysSet) + { + logMessage += F("drawWeekDays, "); + clockDrawWeekDays = json["clock"]["drawWeekDays"]; + } + + if (json["clock"]["color"]["r"].as() != NULL) + { + logMessage += F("color, "); + clockColorR = json["clock"]["color"]["r"].as(); + clockColorG = json["clock"]["color"]["g"].as(); + clockColorB = json["clock"]["color"]["b"].as(); + } + else if (json["clock"]["hexColor"].as() != NULL) + { + logMessage += F("hexColor, "); + ColorConverter::HexToRgb(json["clock"]["hexColor"].as(), clockColorR, clockColorG, clockColorB); + } + DrawClock(true); + } + + if (json.containsKey("bitmap") || json.containsKey("bitmaps") || json.containsKey("bitmapAnimation") || json.containsKey("text") || json.containsKey("bar") || json.containsKey("bars")) + { + // Alle Pixel löschen + matrix->clear(); + } + + // Bar + if (json.containsKey("bar")) + { + logMessage += F("Bar, "); + uint8_t r, g, b; + if (json["bar"]["hexColor"].as() != NULL) + { + ColorConverter::HexToRgb(json["bar"]["hexColor"].as(), r, g, b); + } + else + { + r = json["bar"]["color"]["r"].as(); + g = json["bar"]["color"]["g"].as(); + b = json["bar"]["color"]["b"].as(); + } + matrix->drawLine(json["bar"]["position"]["x"], json["bar"]["position"]["y"], json["bar"]["position"]["x2"], json["bar"]["position"]["y2"], matrix->Color(r, g, b)); + } + + // Bars + if (json.containsKey("bars")) + { + logMessage += F("Bars, "); + for (JsonVariant x : json["bars"].as()) + { + uint8_t r, g, b; + if (x["hexColor"].as() != NULL) + { + ColorConverter::HexToRgb(x["hexColor"].as(), r, g, b); + } + else + { + r = x["color"]["r"].as(); + g = x["color"]["g"].as(); + b = x["color"]["b"].as(); + } + matrix->drawLine(x["position"]["x"], x["position"]["y"], x["position"]["x2"], x["position"]["y2"], matrix->Color(r, g, b)); + } + } + + withBMP = false; + // Ist ein Bitmap übergeben worden? + if (json.containsKey("bitmap")) + { + logMessage += F("Bitmap, "); + DrawSingleBitmap(json["bitmap"]); + } + + // Sind mehrere Bitmaps übergeben worden? + if (json.containsKey("bitmaps")) + { + logMessage += F("Bitmaps ("); + for (JsonVariant singleBitmap : json["bitmaps"].as()) + { + DrawSingleBitmap(singleBitmap); + logMessage += F("Bitmap,"); + } + + logMessage += F("), "); + } + + // Ist eine BitmapAnimation übergeben worden? + if (json.containsKey("bitmapAnimation")) + { + bmpPosX = 0; + bmpPosY = 0; + bmpWidth = 8; + bmpHeight = 8; + if (json["bitmapAnimation"]["position"]["x"].is() && json["bitmapAnimation"]["position"]["y"].is()) + { + bmpPosX = json["bitmapAnimation"]["position"]["x"].as(); + bmpPosY = json["bitmapAnimation"]["position"]["y"].as(); + } + if (json["bitmapAnimation"]["size"]["width"].is() && json["bitmapAnimation"]["size"]["height"].is()) + { + bmpWidth = json["bitmapAnimation"]["size"]["width"].as(); + bmpHeight = json["bitmapAnimation"]["size"]["height"].as(); + } + withBMP = true; + + logMessage += F("BitmapAnimation, "); + // animationBmpList zurücksetzten um das ende nacher zu finden -1 (habe aktuell keine bessere Lösung) + for (int i = 0; i < 10; i++) + { + animationBmpList[i][0] = 2; + } + + int counter = 0; + for (JsonVariant x : json["bitmapAnimation"]["data"].as()) + { + // JsonArray in IntArray konvertieren + x.as().copyTo(bmpArray); + // Speichern für die Ausgabe + for (int i = 0; i < 64; i++) + { + animationBmpList[counter][i] = bmpArray[i]; + } + counter++; + } + + // Serial.printf("Counter: %d\n", counter); + + animateBMPDelay = json["bitmapAnimation"]["animationDelay"]; + animateBMPRubberbandingAktiv = json["bitmapAnimation"]["rubberbanding"]; + + animateBMPLimitLoops = 0; + if (json["bitmapAnimation"]["limitLoops"]) + { + animateBMPLimitLoops = json["bitmapAnimation"]["limitLoops"].as(); + } + + // Hier einmal den Counter zurücksetzten + animateBMPCounter = 0; + animateBMPLoopCount = 0; + animateBMPAktivLoop = true; + animateBMPReverse = false; + animateBMPPrevMillis = millis(); + AnimateBMP(false); + } + + // Ist ein Text übergeben worden? + bool scrollTextAktiv = false; + if (json.containsKey("text")) + { + logMessage += F("Text"); + // Always assume the default delay first. + scrollTextDelay = scrollTextDefaultDelay; + + // Is ScrollText auto or true selected? + scrollTextAktiv = ((json["text"]["scrollText"] == "auto" || ((json["text"]["scrollText"]).is() && json["text"]["scrollText"]))); + + uint8_t r, g, b; + if (json["text"]["hexColor"].as() != NULL) + { + ColorConverter::HexToRgb(json["text"]["hexColor"].as(), r, g, b); + } + else + { + r = json["text"]["color"]["r"].as(); + g = json["text"]["color"]["g"].as(); + b = json["text"]["color"]["b"].as(); + } + + // Is ScrollText auto or true selected? + if (scrollTextAktiv) + { + + bool centerText = json["text"]["centerText"]; + + bool fadeInRequired = ((json.containsKey("bars") || json.containsKey("bar") || json.containsKey("bitmap") || json.containsKey("bitmapAnimation")) && fadeAnimationAktiv); + + // Wurde ein Benutzerdefeniertes Delay übergeben? + if (json["text"]["scrollTextDelay"]) + { + scrollTextDelay = json["text"]["scrollTextDelay"]; + } + + if (!(json["text"]["scrollText"]).is() && json["text"]["scrollText"] == "auto") + { + DrawAutoTextScrolled(json["text"]["textString"], json["text"]["bigFont"], centerText, fadeInRequired, r, g, b, json["text"]["position"]["x"], json["text"]["position"]["y"]); + } + else + { + DrawTextScrolled(json["text"]["textString"], json["text"]["bigFont"], centerText, fadeInRequired, r, g, b, json["text"]["position"]["x"], json["text"]["position"]["y"]); + } + } + // is centerText selected? + else if (json["text"]["centerText"]) + { + DrawTextCenter(json["text"]["textString"], json["text"]["bigFont"], r, g, b, json["text"]["position"]["x"], json["text"]["position"]["y"]); + } + else + { + DrawText(json["text"]["textString"], json["text"]["bigFont"], r, g, b, json["text"]["position"]["x"], json["text"]["position"]["y"]); + } + } + + // Fade aktiv? + if (!scrollTextAktiv && (fadeAnimationAktiv || coloredBarWipeAnimationAktiv || zigzagWipeAnimationAktiv || bitmapWipeAnimationAktiv)) + { + FadeIn(); + } + else + { + // Fade nicht aktiv! + // Muss mich selbst um Show kümmern + matrix->show(); + } + } + else + { + logMessage += F("skipped, because an forced screen is currently being displayed."); + } + + Log(F("CreateFrames"), logMessage + " (Length: " + json.measureLength() + ")"); + + if (forceDuration > 0 && (json.containsKey("bitmap") || json.containsKey("bitmaps") || json.containsKey("text") || json.containsKey("bar") || json.containsKey("bars") || json.containsKey("bitmapAnimation"))) + { + forcedScreenIsActiveUntil = millis() + forceDuration; + } +} + +String GetConfig() +{ +#if defined(ESP8266) + File configFile = LittleFS.open("/config.json", "r"); +#elif defined(ESP32) + File configFile = SPIFFS.open("/config.json", "r"); +#endif + + if (configFile) + { + // Log(F("GetConfig"), F("Opened config file")); + size_t size = configFile.size(); + // Allocate a buffer to store contents of the file. + std::unique_ptr buf(new char[size]); + + configFile.readBytes(buf.get(), size); + DynamicJsonBuffer jsonBuffer; + JsonObject &root = jsonBuffer.parseObject(buf.get()); + + String json; + root.printTo(json); + + return json; + } + return ""; +} + +String GetSensor() +{ + DynamicJsonBuffer jsonBuffer; + JsonObject &root = jsonBuffer.createObject(); + if (tempSensor == TempSensor_BME280) + { + const float currentTemp = bme280->readTemperature(); + root["temperature"] = currentTemp + temperatureOffset; + root["humidity"] = bme280->readHumidity() + humidityOffset; + root["pressure"] = (bme280->readPressure() / 100.0F) + pressureOffset; + root["gas"] = "Not installed"; + + if (temperatureUnit == TemperatureUnit_Fahrenheit) + { + root["temperature"] = CelsiusToFahrenheit(currentTemp) + temperatureOffset; + } + } + else if (tempSensor == TempSensor_DHT) + { + const float currentTemp = dht.getTemperature(); + root["temperature"] = currentTemp + temperatureOffset; + root["humidity"] = roundf(dht.getHumidity() + humidityOffset); + root["pressure"] = "Not installed"; + root["gas"] = "Not installed"; + + if (temperatureUnit == TemperatureUnit_Fahrenheit) + { + root["temperature"] = CelsiusToFahrenheit(currentTemp) + temperatureOffset; + } + } + else if (tempSensor == TempSensor_BME680) + { + /*************************************************************************************************** + // BME680 requires about 100ms for a read (heating the gas sensor). A blocking read can hinder + // animations and scrolling. Therefore, we will use asynchronous reading in most cases. + // + // First call: starts measuring sequence, returns previous values. + // Second call: performs read, returns current values. + // + // As long as there are more than ~200ms between the calls, there won't be blocking. + // PixelIt usually uses a 3000ms loop. + // + // When there's no loop (no Websock connection, no MQTT) but only HTTP API calls, this would result + // in only EVERY OTHER call return new values (which have been taken shortly after the previous call). + // This is okay when you are polling very frequently, but might be undesirable when polling every + // couple of minutes or so. Therefore: if previous reading is more than 20000ms old, perform + // read in any case, even if it might become blocking. + // + // Please note: the gas value not only depends on gas, but also on the time since last read. + // Frequent reads will yield higher values than infrequent reads. There will be a difference + // even if we switch from 6secs to 3secs! So, do not attempt to compare values of readings + // with an interval of 3 secs to values of readings with an interval of 60 secs! + */ + + const int elapsedSinceLastRead = millis() - lastBME680read; + const int remain = bme680->remainingReadingMillis(); + + if (remain == -1) // no current values available + { + bme680->beginReading(); // start measurement process + // return previous values + const float currentTemp = bme680->temperature; + root["temperature"] = currentTemp + temperatureOffset; + root["humidity"] = bme680->humidity + humidityOffset; + root["pressure"] = (bme680->pressure / 100.0F) + pressureOffset; + root["gas"] = (bme680->gas_resistance / 1000.0F) + gasOffset; + if (temperatureUnit == TemperatureUnit_Fahrenheit) + { + root["temperature"] = CelsiusToFahrenheit(currentTemp) + temperatureOffset; + } + } + + if (remain >= 0 || elapsedSinceLastRead > 20000) + // remain==0: measurement completed, not read yet + // remain>0: measurement still running, but as we already are in the next loop call, block and read + // elapsedSinceLastRead>20000: obviously, remain==-1. But as there haven't been loop calls recently, this seems to be an "infrequent" API call. Perform blocking read. + { + if (bme680->endReading()) // will become blocking if measurement not complete yet + { + lastBME680read = millis(); + const float currentTemp = bme680->temperature; + root["temperature"] = currentTemp + temperatureOffset; + root["humidity"] = bme680->humidity + humidityOffset; + root["pressure"] = (bme680->pressure / 100.0F) + pressureOffset; + root["gas"] = (bme680->gas_resistance / 1000.0F) + gasOffset; + if (temperatureUnit == TemperatureUnit_Fahrenheit) + { + root["temperature"] = CelsiusToFahrenheit(currentTemp) + temperatureOffset; + } + } + else + { + root["humidity"] = "Error while reading"; + root["temperature"] = "Error while reading"; + root["pressure"] = "Error while reading"; + root["gas"] = "Error while reading"; + } + } + } + else if (tempSensor == TempSensor_BMP280) + { + const float currentTemp = bmp280->readTemperature(); + root["temperature"] = currentTemp + temperatureOffset; + // root["humidity"] = bmp280->readHumidity() + humidityOffset; + root["humidity"] = "Not installed"; + root["pressure"] = (bmp280->readPressure() / 100.0F) + pressureOffset; + root["gas"] = "Not installed"; + + if (temperatureUnit == TemperatureUnit_Fahrenheit) + { + root["temperature"] = CelsiusToFahrenheit(currentTemp) + temperatureOffset; + } + } + + else + { + root["humidity"] = "Not installed"; + root["temperature"] = "Not installed"; + root["pressure"] = "Not installed"; + root["gas"] = "Not installed"; + } + + String json; + root.printTo(json); + + // Log(F("Sensor readings"), F("Hum/Temp/Press/Gas:")); + // Log(F("Sensor readings"), json); + return json; +} + +String GetLuxSensor() +{ + DynamicJsonBuffer jsonBuffer; + JsonObject &root = jsonBuffer.createObject(); + + root["lux"] = currentLux; + + String json; + root.printTo(json); + + return json; +} + +String GetBrightness() +{ + DynamicJsonBuffer jsonBuffer; + JsonObject &root = jsonBuffer.createObject(); + + root["brightness_255"] = currentMatrixBrightness; + root["brightness"] = map(currentMatrixBrightness, 0, 255, 0, 100); + + String json; + root.printTo(json); + + return json; +} + +String GetMatrixInfo() +{ + DynamicJsonBuffer jsonBuffer; + JsonObject &root = jsonBuffer.createObject(); + + root["pixelitVersion"] = VERSION; + //// Matrix Config + root["note"] = note; + root["hostname"] = hostname; + root["freeSketchSpace"] = ESP.getFreeSketchSpace(); + root["wifiRSSI"] = WiFi.RSSI(); + root["wifiQuality"] = GetRSSIasQuality(WiFi.RSSI()); + root["wifiSSID"] = WiFi.SSID(); + root["ipAddress"] = WiFi.localIP().toString(); + root["freeHeap"] = ESP.getFreeHeap(); + root["currentMatrixBrightness"] = currentMatrixBrightness; + root["wifiBSSID"] = WiFi.BSSIDstr(); + +#if defined(ESP8266) + root["sketchSize"] = ESP.getSketchSize(); + root["chipID"] = ESP.getChipId(); +#elif defined(ESP32) + root["chipID"] = uint64ToString(ESP.getEfuseMac()); +#endif + + root["cpuFreqMHz"] = ESP.getCpuFreqMHz(); + root["sleepMode"] = sleepMode; + root["uptime"] = millis() / 1000; + root["resetReason"] = ResetReason(); + JsonObject &matrix = root.createNestedObject("matrixsize"); + matrix["cols"] = MATRIX_WIDTH; + matrix["rows"] = MATRIX_HEIGHT; + + String json; + root.printTo(json); + + return json; +} + +String GetButtons() +{ + DynamicJsonBuffer jsonBuffer; + JsonObject &root = jsonBuffer.createObject(); + + for (uint button = 0; button < 3; button++) + { + root[btnAPINames[button]] = btnLastPublishState[button] ? "true" : "false"; + } + + String json; + root.printTo(json); + + return json; +} + +void SendTelemetry() +{ + Log(F("SendTelemetry"), F("Sending...")); + HttpClient httpClient = HttpClient(wifiClientHTTP, TELEMETRY_SERVER_HOST, TELEMETRY_SERVER_PORT); + httpClient.setTimeout(1500); + httpClient.sendHeader("User-Agent", "PixelIt"); + httpClient.post(TELEMETRY_SERVER_PATH, "application/json", GetTelemetry()); +} + +String GetTelemetry() +{ + const String MatrixTypeNames[] = {"Colum major", "Row major", "Tiled 4x 8x8 CJMCU (Column major)", "MicroMatrix", "Tiled 4x 8x8 CJMCU (Row major)"}; + const String TempSensorNames[] = {"none", "BME280", "DHT", "BME680", "BMP280"}; + const String LuxSensorNames[] = {"LDR", "BH1750", "Max44009"}; + + DynamicJsonBuffer jsonBuffer; + JsonObject &root = jsonBuffer.createObject(); + + root["uuid"] = sha1(GetChipID()); + root["version"] = VERSION; + root["type"] = isESP8266 ? "esp8266" : "esp32"; + + JsonObject &matrix = root.createNestedObject("matrix"); + matrix["type"] = matrixType; + matrix["name"] = MatrixTypeNames[matrixType - 1]; + + JsonArray &sensors = root.createNestedArray("sensors"); + sensors.add(LuxSensorNames[luxSensor]); + if (tempSensor > 0) + { + sensors.add(TempSensorNames[tempSensor]); + } + + String json; + root.printTo(json); + return json; +} + +void DrawText(String text, int bigFont, int colorRed, int colorGreen, int colorBlue, int posX, int posY) +{ + DrawTextHelper(text, bigFont, false, false, false, false, colorRed, colorGreen, colorBlue, posX, posY); +} + +void DrawTextCenter(String text, int bigFont, int colorRed, int colorGreen, int colorBlue, int posX, int posY) +{ + DrawTextHelper(text, bigFont, true, false, false, false, colorRed, colorGreen, colorBlue, posX, posY); +} + +void DrawTextScrolled(String text, int bigFont, bool centerText, bool fadeInRequired, int colorRed, int colorGreen, int colorBlue, int posX, int posY) +{ + DrawTextHelper(text, bigFont, centerText, true, false, fadeInRequired, colorRed, colorGreen, colorBlue, posX, posY); +} + +void DrawAutoTextScrolled(String text, int bigFont, bool centerText, bool fadeInRequired, int colorRed, int colorGreen, int colorBlue, int posX, int posY) +{ + DrawTextHelper(text, bigFont, centerText, false, true, fadeInRequired, colorRed, colorGreen, colorBlue, posX, posY); +} + +void DrawTextHelper(String text, int bigFont, bool centerText, bool scrollText, bool autoScrollText, bool fadeInRequired, int colorRed, int colorGreen, int colorBlue, int posX, int posY) +{ + uint16_t xTextWidth, xAvailableTextSpace; + int16_t boundsx1, boundsy1; + uint16_t boundsw, boundsh; + + text = Utf8ToAscii(text); + + // Debug function values + // Serial.printf("DrawTextHelper: %s (bigFont: %s, centerText: %s, scrollText: %s, autoScrollText: %s: %s, fadeInRequired: %s)\n", text.c_str(), bigFont == 1 ? "true" : "false", centerText ? "true" : "false", scrollText ? "true" : "false", autoScrollText ? "true" : "false" ? "true" : "false", fadeInRequired ? "true" : "false"); + + // Available text space depends on matrix size + xAvailableTextSpace = MATRIX_WIDTH - posX; + + if (bigFont == 1) + { + // Set large font + matrix->setFont(); + matrix->getTextBounds(text, 0, 0, &boundsx1, &boundsy1, &boundsw, &boundsh); + xTextWidth = boundsw; + + // Position correction + posY = posY - 1; + } + else if (bigFont == 2) // very large font, only to be used for time display / very large font, only for the time display + { + // Set very large font + matrix->setFont(&FatPixels); + + matrix->getTextBounds(text, 0, 0, &boundsx1, &boundsy1, &boundsw, &boundsh); + xTextWidth = boundsw; + + // Position correction + posY = posY + 6; + } + else + { + // Set small font + matrix->setFont(&PixelItFont); + matrix->getTextBounds(text, 0, 0, &boundsx1, &boundsy1, &boundsw, &boundsh); + xTextWidth = boundsw - 4; + + // Position correction + posY = posY + 5; + } + + if (centerText && xTextWidth < xAvailableTextSpace) // center text if text is smaller than available pixels + { + // Calculation for the first pixel of the text + posX = posX + ((xAvailableTextSpace - xTextWidth) / 2); + } + + matrix->setCursor(posX, posY); + + matrix->setTextColor(matrix->Color(colorRed, colorGreen, colorBlue)); + + if (scrollText || (autoScrollText && xTextWidth > xAvailableTextSpace)) // scroll text if text is larger than available pixels + { + + matrix->setBrightness(currentMatrixBrightness); + + scrollTextString = text; + scrollposY = posY; + scrollposX = posX; + scrollxTextWidth = xTextWidth; + scrollxAvailableTextSpace = xAvailableTextSpace; + scrollCurPos = MATRIX_WIDTH + 1; + + scrollTextAktivLoop = true; + scrollTextPrevMillis = millis(); + ScrollText(fadeInRequired); + } + // In case the text on the display fits! + else if (autoScrollText) + { + matrix->print(text); + // Here you have to check if the fade out was done, + // then the brightness is too low (0), + // but only if animateBMPAktivLoop is not active, + // because otherwise it's already done. + if (fadeInRequired && !animateBMPAktivLoop) + { + FadeIn(); + } + else + { + matrix->show(); + } + } + else + { + matrix->print(text); + } +} + +void ScrollText(bool isFadeInRequired) +{ + int xOffset = MATRIX_WIDTH - scrollxAvailableTextSpace; + + if (scrollCurPos > ((scrollxTextWidth - xOffset) * -1)) + { + matrix->clear(); + matrix->setCursor(--scrollCurPos, scrollposY); + matrix->print(scrollTextString); + + // draw black pixel under icon / blank space if (xOffset > 0) + { + + for (int i = 0; i < xOffset; i++) + { + matrix->drawLine(i, 0, i, MATRIX_HEIGHT, matrix->Color(0, 0, 0)); + } + } + + if (withBMP) + { + matrix->drawRGBBitmap(bmpPosX, bmpPosY, bmpArray, bmpWidth, bmpHeight); + } + + if (isFadeInRequired) + { + FadeIn(); + } + else + { + matrix->show(); + } + } + else + { + scrollCurPos = MATRIX_WIDTH; + } +} + +void AnimateBMP(bool isShowRequired) +{ + // Prüfen auf 2, 2 ist mein Platzhalter für leeres obj! + if (animationBmpList[animateBMPCounter][0] == 2) + { + // Ist ein Repeat Limit übergeben worden. + if (animateBMPLimitLoops > 0 && !animateBMPRubberbandingAktiv) + { + animateBMPLoopCount++; + + // Ist der Repeat Limit erreicht den AnimateBMP Loop deaktiveren. + if (animateBMPLoopCount == animateBMPLimitLoops) + { + animateBMPAktivLoop = false; + return; + } + } + + // Prüfen ob Rubberbanding aktiv und mehr wie 1 Frame vorhanden ist. + if (animateBMPRubberbandingAktiv && animateBMPCounter > 1) + { + animateBMPReverse = true; + + // 2 abziehen da sonst der letzte Frame doppelt angezeigt wird. + if (animateBMPCounter > 0) + { + animateBMPCounter = animateBMPCounter - 2; + } + } + else + { + animateBMPCounter = 0; + } + } + + if (animateBMPCounter < 0) + { + // Auf 1 setzten da sons der erste Frame doppelt angezeigt wird. + animateBMPCounter = 1; + animateBMPReverse = false; + + // Ist ein Repeat Limit übergeben worden. + if (animateBMPLimitLoops > 0) + { + animateBMPLoopCount++; + // Ist der Repeat Limit erreicht den AnimateBMP Loop deaktiveren. + if (animateBMPLoopCount >= animateBMPLimitLoops) + { + animateBMPAktivLoop = false; + return; + } + } + } + + ClearBMPArea(); + + matrix->drawRGBBitmap(bmpPosX, bmpPosY, animationBmpList[animateBMPCounter], bmpWidth, bmpHeight); + + for (int y = 0; y < 64; y++) + { + bmpArray[y] = animationBmpList[animateBMPCounter][y]; + } + + // Soll der Loop wieder zurücklaufen? + if (animateBMPReverse) + { + animateBMPCounter--; + } + else + { + animateBMPCounter++; + } + + if (isShowRequired) + { + matrix->show(); + } +} + +void DrawSingleBitmap(JsonObject &json) +{ + int16_t h = json["size"]["height"].as(); + int16_t w = json["size"]["width"].as(); + int16_t x = json["position"]["x"].as(); + int16_t y = json["position"]["y"].as(); + + bmpHeight = h; + bmpWidth = w; + bmpPosX = x; + bmpPosY = y; + withBMP = true; + + // Hier kann leider nicht die Funktion matrix->drawRGBBitmap() genutzt werde da diese Fehler in der Anzeige macht wenn es mehr wie 8x8 Pixel werden. + for (int16_t j = 0; j < h; j++, y++) + { + for (int16_t i = 0; i < w; i++) + { + matrix->drawPixel(x + i, y, json["data"][j * w + i].as()); + } + } + + // JsonArray in IntArray konvertieren + // dies ist nötig für diverse kleine Logiken z.B. Scrolltext + // bei Multibitmaps landet hier nur eine der Bitmaps - das ist aber egal, da dann eh nicht gescrollt wird + json["data"].as().copyTo(bmpArray); +} + +void DrawClock(bool fromJSON) +{ + matrix->clear(); + + char date[14]; + char time[14]; + + int xPosTime = 0; + + if (clockDateDayMonth) + { + sprintf_P(date, PSTR("%02d.%02d."), day(), month()); + } + else + { + sprintf_P(date, PSTR("%02d/%02d"), month(), day()); + } + + if (clock24Hours && clockWithSeconds && !clockFatFont) + { + xPosTime = 2; + sprintf_P(time, PSTR("%02d:%02d:%02d"), hour(), minute(), second()); + } + else if (!clock24Hours) + { + xPosTime = 2; + + if (clockBlink && clockBlinkAnimated) + { + clockBlink = false; + if (!clockFatFont) + { + sprintf_P(time, PSTR("%2d %02d %s"), hourFormat12(), minute(), isAM() ? "AM" : "PM"); + } + else + { + sprintf_P(time, PSTR("%2d %02d"), hourFormat12(), minute()); + } + } + else + { + clockBlink = !clockBlink; + if (!clockFatFont) + { + sprintf_P(time, PSTR("%2d:%02d %s"), hourFormat12(), minute(), isAM() ? "AM" : "PM"); + } + else + { + sprintf_P(time, PSTR("%2d:%02d"), hourFormat12(), minute()); + } + } + } + else + { + xPosTime = 7; + + if (clockBlink && clockBlinkAnimated) + { + clockBlink = false; + sprintf_P(time, PSTR("%02d %02d"), hour(), minute()); + } + else + { + clockBlink = !clockBlink; + sprintf_P(time, PSTR("%02d:%02d"), hour(), minute()); + } + } + + if (!clockSwitchAktiv || (clockSwitchAktiv && clockCounterClock <= clockSwitchSec)) + { + if (clockSwitchAktiv) + { + clockCounterClock++; + } + + if (clockCounterClock > clockSwitchSec) + { + clockCounterDate = 0; + + if (clockFatFont) // fade rather than vertical animate purely because DrawTextCenter doesnt have a Y argument... + { + DrawTextCenter(String(time), 2, clockColorR, clockColorG, clockColorB, 0, 1); + FadeOut(30); + matrix->clear(); + DrawTextCenter(String(date), 2, clockColorR, clockColorG, clockColorB, 0, 1); + FadeIn(30); + } + else + { + int counter = 0; + while (counter <= 6) // vertical animate + { + counter++; + matrix->clear(); + DrawText(String(time), false, clockColorR, clockColorG, clockColorB, xPosTime, (1 + counter)); + DrawText(String(date), false, clockColorR, clockColorG, clockColorB, 7, (-6 + counter)); + matrix->drawLine(0, 7, 33, 7, 0); + if (clockDrawWeekDays) + { + DrawWeekDay(); + } + matrix->show(); + delay(35); + } + } + } + else if (clockFatFont) + { + + DrawTextCenter(String(time), 2, clockColorR, clockColorG, clockColorB, 0, 1); + } + else + { + DrawText(String(time), false, clockColorR, clockColorG, clockColorB, xPosTime, 1); + xPosTime = 3; + } + } + else + { + clockCounterDate++; + + if (clockCounterDate == clockSwitchSec) + { + clockCounterClock = 0; + + if (clockFatFont) // fade rather than vertical animate purely because DrawTextCenter doesnt have a Y argument... + { + DrawTextCenter(String(date), 2, clockColorR, clockColorG, clockColorB, 0, 1); + FadeOut(30); + matrix->clear(); + DrawTextCenter(String(time), 2, clockColorR, clockColorG, clockColorB, 0, 1); + FadeIn(30); + } + else + { + int counter = 0; + while (counter <= 6) // vertical animate + { + counter++; + matrix->clear(); + DrawText(String(date), false, clockColorR, clockColorG, clockColorB, 7, (1 + counter)); + DrawText(String(time), false, clockColorR, clockColorG, clockColorB, xPosTime, (-6 + counter)); + matrix->drawLine(0, 7, 33, 7, 0); + if (clockDrawWeekDays) + { + DrawWeekDay(); + } + matrix->show(); + delay(35); + } + } + } + else if (clockFatFont) + { + DrawTextCenter(String(date), 2, clockColorR, clockColorG, clockColorB, 0, 1); + } + else + { + DrawText(String(date), false, clockColorR, clockColorG, clockColorB, 7, 1); + } + } + + if (!clockFatFont && clockDrawWeekDays) + { + DrawWeekDay(); + } + + // Wenn der Aufruf nicht über JSON sondern über den Loop kommt + // muss ich mich selbst ums Show kümmern. + if (!fromJSON) + { + matrix->show(); + } +} + +void DrawWeekDay() +{ + // The Libary works with dayOfWeek with Sunday = 1... + // So Sunday = 1 <-> Saturday = 7 + int weekDayNumber = 0; + if (clockDayOfWeekFirstMonday) + { + weekDayNumber = DayOfWeekFirstMonday(dayOfWeek(now()) - 1); + } + else + { + weekDayNumber = dayOfWeek(now()) - 1; + } + + for (int i = 0; i <= 6; i++) + { + if (i == weekDayNumber) + { + matrix->drawLine(2 + i * 4, 7, i * 4 + 4, 7, matrix->Color(clockColorR, clockColorG, clockColorB)); + } + else + { + matrix->drawLine(2 + i * 4, 7, i * 4 + 4, 7, 21162); + } + } +} + +boolean MQTTreconnect() +{ + + bool connected = false; + if (mqttUser != NULL && mqttUser.length() > 0 && mqttPassword != NULL && mqttPassword.length() > 0) + { + Log(F("MQTTreconnect"), F("MQTT connecting to broker...")); + connected = client.connect(hostname.c_str(), mqttUser.c_str(), mqttPassword.c_str(), (mqttMasterTopic + "state").c_str(), 0, true, "disconnected"); + } + else + { + Log(F("MQTTreconnect"), F("MQTT connecting to broker...")); + connected = client.connect(hostname.c_str(), (mqttMasterTopic + "state").c_str(), 0, true, "disconnected"); + } + + if (connected) + { + Log(F("MQTTreconnect"), F("MQTT connected!")); + // Subscribe to topics ... + client.subscribe((mqttMasterTopic + "setScreen").c_str()); + client.subscribe((mqttMasterTopic + "getLuxsensor").c_str()); + client.subscribe((mqttMasterTopic + "getMatrixinfo").c_str()); + client.subscribe((mqttMasterTopic + "getConfig").c_str()); + client.subscribe((mqttMasterTopic + "setConfig").c_str()); + // ... and publish state .... + client.publish((mqttMasterTopic + "state").c_str(), "connected", true); + + // ... and provide discovery information + // Create discovery information for Homeassistant + // Can also be processed by ioBroker, OpenHAB etc. + String deviceID = hostname; + if (deviceID.isEmpty()) + deviceID = "pixelit"; +#if defined(ESP8266) + deviceID += ESP.getChipId(); +#elif defined(ESP32) + deviceID += uint64ToString(ESP.getEfuseMac()); +#endif + // Get host IP to provide URL in MQTT discovery device info + String ip_url = "http://" + WiFi.localIP().toString(); + String configTopicTemplate = String(F("homeassistant/#COMPONENT#/#DEVICEID#/#DEVICEID##SENSORID#/config")); + configTopicTemplate.replace(F("#DEVICEID#"), deviceID); + String configPayloadTemplate = String(F( + "{" + "\"dev\":{" + "\"ids\":\"#DEVICEID#\"," + "\"name\":\"#HOSTNAME#\"," + "\"mdl\":\"PixelIt\"," + "\"mf\":\"PixelIt\"," + "\"sw\":\"#VERSION#\"," + "\"cu\":\"#IP#\"" + "}," + "\"avty_t\":\"#MASTERTOPIC#state\"," + "\"pl_avail\":\"connected\"," + "\"pl_not_avail\":\"disconnected\"," + "\"uniq_id\":\"#DEVICEID##SENSORID#\"," + "\"dev_cla\":\"#CLASS#\"," + "\"name\":\"#SENSORNAME#\"," + "\"stat_t\":\"#MASTERTOPIC##STATETOPIC#\"," + "\"unit_of_meas\":\"#UNIT#\"," + "\"val_tpl\":\"{{value_json.#VALUENAME#}}\"" + "}")); + configPayloadTemplate.replace(" ", ""); + configPayloadTemplate.replace(F("#DEVICEID#"), deviceID); + configPayloadTemplate.replace(F("#HOSTNAME#"), hostname); + configPayloadTemplate.replace(F("#VERSION#"), VERSION); + configPayloadTemplate.replace(F("#MASTERTOPIC#"), mqttMasterTopic); + configPayloadTemplate.replace(F("#IP#"), ip_url); + + String topic; + String payload; + + if (tempSensor != TempSensor_None) + { + topic = configTopicTemplate; + topic.replace(F("#COMPONENT#"), F("sensor")); + topic.replace(F("#SENSORID#"), F("Temperature")); + + payload = configPayloadTemplate; + payload.replace(F("#SENSORID#"), F("Temperature")); + payload.replace(F("#SENSORNAME#"), F("Temperature")); + payload.replace(F("#CLASS#"), F("temperature")); + payload.replace(F("#STATETOPIC#"), F("sensor")); + payload.replace(F("#UNIT#"), "°C"); + payload.replace(F("#VALUENAME#"), F("temperature")); + client.publish(topic.c_str(), payload.c_str(), true); + + topic = configTopicTemplate; + topic.replace(F("#COMPONENT#"), F("sensor")); + topic.replace(F("#SENSORID#"), F("Humidity")); + + payload = configPayloadTemplate; + payload.replace(F("#SENSORNAME#"), F("Humidity")); + payload.replace(F("#CLASS#"), F("humidity")); + payload.replace(F("#STATETOPIC#"), F("sensor")); + payload.replace(F("#UNIT#"), "%"); + payload.replace(F("#VALUENAME#"), F("humidity")); + client.publish(topic.c_str(), payload.c_str(), true); + } + if (tempSensor == TempSensor_BME280 || tempSensor == TempSensor_BMP280 || tempSensor == TempSensor_BME680) + { + topic = configTopicTemplate; + topic.replace(F("#COMPONENT#"), F("sensor")); + topic.replace(F("#SENSORID#"), F("Pressure")); + + payload = configPayloadTemplate; + payload.replace(F("#SENSORID#"), F("Pressure")); + payload.replace(F("#SENSORNAME#"), F("Pressure")); + payload.replace(F("#CLASS#"), F("pressure")); + payload.replace(F("#STATETOPIC#"), F("sensor")); + payload.replace(F("#UNIT#"), "hPa"); + payload.replace(F("#VALUENAME#"), F("pressure")); + client.publish(topic.c_str(), payload.c_str(), true); + } + + if (tempSensor == TempSensor_BME680) + { + topic = configTopicTemplate; + topic.replace(F("#COMPONENT#"), F("sensor")); + topic.replace(F("#SENSORID#"), F("VOC")); + + payload = configPayloadTemplate; + payload.replace(F("#SENSORID#"), F("VOC")); + payload.replace(F("#SENSORNAME#"), F("VOC")); + payload.replace(F("#CLASS#"), F("volatile_organic_compounds")); + payload.replace(F("#STATETOPIC#"), F("sensor")); + payload.replace(F("#UNIT#"), "kOhm"); + payload.replace(F("#VALUENAME#"), F("gas")); + client.publish(topic.c_str(), payload.c_str(), true); + } + topic = configTopicTemplate; + topic.replace(F("#COMPONENT#"), F("sensor")); + topic.replace(F("#SENSORID#"), F("Illuminance")); + + payload = configPayloadTemplate; + payload.replace(F("#SENSORID#"), F("Illuminance")); + payload.replace(F("#SENSORNAME#"), F("Illuminance")); + payload.replace(F("#CLASS#"), F("illuminance")); + payload.replace(F("#STATETOPIC#"), F("luxsensor")); + payload.replace(F("#UNIT#"), "lx"); + payload.replace(F("#VALUENAME#"), F("lux")); + client.publish(topic.c_str(), payload.c_str(), true); + + configPayloadTemplate = String(F( + "{" + "\"dev\":{" + "\"ids\":\"#DEVICEID#\"," + "\"name\":\"#HOSTNAME#\"," + "\"mdl\":\"PixelIt\"," + "\"mf\":\"PixelIt\"," + "\"sw\":\"#VERSION#\"," + "\"cu\":\"#IP#\"" + "}," + "\"avty_t\":\"#MASTERTOPIC#state\"," + "\"pl_avail\":\"connected\"," + "\"pl_not_avail\":\"disconnected\"," + "\"uniq_id\":\"#DEVICEID##SENSORID#\"," + "\"name\":\"#SENSORNAME#\"," + "\"ic\":\"mdi:gesture-tap-button\"," + "\"pl_on\":\"true\"," + "\"pl_off\":\"false\"," + "\"stat_t\":\"#MASTERTOPIC##STATETOPIC#\"" + "}")); + configPayloadTemplate.replace(" ", ""); + configPayloadTemplate.replace(F("#DEVICEID#"), deviceID); + configPayloadTemplate.replace(F("#HOSTNAME#"), hostname); + configPayloadTemplate.replace(F("#VERSION#"), VERSION); + configPayloadTemplate.replace(F("#MASTERTOPIC#"), mqttMasterTopic); + configPayloadTemplate.replace(F("#IP#"), ip_url); + + for (uint8_t n = 0; n < sizeof(btnEnabled) / sizeof(btnEnabled[0]); n++) + { + if (btnEnabled[n]) + { + topic = configTopicTemplate; + topic.replace(F("#COMPONENT#"), F("binary_sensor")); + topic.replace(F("#SENSORID#"), String(F("Button")) + String(n)); + + payload = configPayloadTemplate; + payload.replace(F("#SENSORID#"), String(F("Button")) + String(n)); + payload.replace(F("#SENSORNAME#"), String(btnLogNames[n])); + payload.replace(F("#STATETOPIC#"), String(F("buttons/button")) + String(n)); + client.publish(topic.c_str(), payload.c_str(), true); + } + } + + // Wifi RSSI + configPayloadTemplate = String(F( + "{" + "\"dev\":{" + "\"ids\":\"#DEVICEID#\"," + "\"name\":\"#HOSTNAME#\"," + "\"mdl\":\"PixelIt\"," + "\"mf\":\"PixelIt\"," + "\"sw\":\"#VERSION#\"," + "\"cu\":\"#IP#\"" + "}," + "\"avty_t\":\"#MASTERTOPIC#state\"," + "\"pl_avail\":\"connected\"," + "\"pl_not_avail\":\"disconnected\"," + "\"uniq_id\":\"#DEVICEID##SENSORID#\"," + "\"dev_cla\":\"signal_strength\"," + "\"name\":\"#SENSORNAME#\"," + "\"stat_t\":\"#MASTERTOPIC##STATETOPIC#\"," + "\"unit_of_meas\":\"#UNIT#\"," + "\"val_tpl\":\"{{value_json.#VALUENAME#}}\"," + "\"ent_cat\":\"diagnostic\"," + "\"ic\":\"mdi:#ICON#\"," + "\"enabled_by_default\":\"false\"" + "}")); + configPayloadTemplate.replace(" ", ""); + configPayloadTemplate.replace(F("#DEVICEID#"), deviceID); + configPayloadTemplate.replace(F("#HOSTNAME#"), hostname); + configPayloadTemplate.replace(F("#VERSION#"), VERSION); + configPayloadTemplate.replace(F("#MASTERTOPIC#"), mqttMasterTopic); + configPayloadTemplate.replace(F("#IP#"), ip_url); + + topic = configTopicTemplate; + topic.replace(F("#COMPONENT#"), F("sensor")); + topic.replace(F("#SENSORID#"), F("wifiRSSI")); + + payload = configPayloadTemplate; + payload.replace(F("#SENSORID#"), F("wifiRSSI")); + payload.replace(F("#SENSORNAME#"), F("Wifi Signal")); + payload.replace(F("#CLASS#"), F("signal_strength")); + payload.replace(F("#STATETOPIC#"), F("matrixinfo")); + payload.replace(F("#UNIT#"), "dBm"); + payload.replace(F("#VALUENAME#"), F("wifiRSSI")); + payload.replace(F("#ICON#"), F("signal")); + client.publish(topic.c_str(), payload.c_str(), true); + + // Wifi Quality sensor + configPayloadTemplate = String(F( + "{" + "\"dev\":{" + "\"ids\":\"#DEVICEID#\"," + "\"name\":\"#HOSTNAME#\"," + "\"mdl\":\"PixelIt\"," + "\"mf\":\"PixelIt\"," + "\"sw\":\"#VERSION#\"," + "\"cu\":\"#IP#\"" + "}," + "\"avty_t\":\"#MASTERTOPIC#state\"," + "\"pl_avail\":\"connected\"," + "\"pl_not_avail\":\"disconnected\"," + "\"uniq_id\":\"#DEVICEID##SENSORID#\"," + "\"name\":\"#SENSORNAME#\"," + "\"stat_t\":\"#MASTERTOPIC##STATETOPIC#\"," + "\"unit_of_meas\":\"#UNIT#\"," + "\"val_tpl\":\"{{value_json.#VALUENAME#}}\"," + "\"ent_cat\":\"diagnostic\"," + "\"ic\":\"mdi:#ICON#\"," + "\"enabled_by_default\":\"false\"" + "}")); + configPayloadTemplate.replace(" ", ""); + configPayloadTemplate.replace(F("#DEVICEID#"), deviceID); + configPayloadTemplate.replace(F("#HOSTNAME#"), hostname); + configPayloadTemplate.replace(F("#VERSION#"), VERSION); + configPayloadTemplate.replace(F("#MASTERTOPIC#"), mqttMasterTopic); + configPayloadTemplate.replace(F("#IP#"), ip_url); + + topic = configTopicTemplate; + topic.replace(F("#COMPONENT#"), F("sensor")); + topic.replace(F("#SENSORID#"), F("WifiQuality")); + + payload = configPayloadTemplate; + payload.replace(F("#SENSORID#"), F("WifiQuality")); + payload.replace(F("#SENSORNAME#"), F("Wifi Quality")); + payload.replace(F("#STATETOPIC#"), F("matrixinfo")); + payload.replace(F("#UNIT#"), "%"); + payload.replace(F("#VALUENAME#"), F("wifiQuality")); + payload.replace(F("#ICON#"), F("signal")); + client.publish(topic.c_str(), payload.c_str(), true); + + // CPU Freq. + topic = configTopicTemplate; + topic.replace(F("#COMPONENT#"), F("sensor")); + topic.replace(F("#SENSORID#"), F("cpuFreqMHz")); + + payload = configPayloadTemplate; + payload.replace(F("#SENSORID#"), F("cpuFreqMHz")); + payload.replace(F("#SENSORNAME#"), F("CPU Freq.")); + payload.replace(F("#STATETOPIC#"), F("matrixinfo")); + payload.replace(F("#UNIT#"), "MHz"); + payload.replace(F("#VALUENAME#"), F("cpuFreqMHz")); + payload.replace(F("#ICON#"), F("developer-board")); + client.publish(topic.c_str(), payload.c_str(), true); + + // Wifi SSID + configPayloadTemplate = String(F( + "{" + "\"dev\":{" + "\"ids\":\"#DEVICEID#\"," + "\"name\":\"#HOSTNAME#\"," + "\"mdl\":\"PixelIt\"," + "\"mf\":\"PixelIt\"," + "\"sw\":\"#VERSION#\"," + "\"cu\":\"#IP#\"" + "}," + "\"avty_t\":\"#MASTERTOPIC#state\"," + "\"pl_avail\":\"connected\"," + "\"pl_not_avail\":\"disconnected\"," + "\"uniq_id\":\"#DEVICEID##SENSORID#\"," + "\"name\":\"#SENSORNAME#\"," + "\"stat_t\":\"#MASTERTOPIC##STATETOPIC#\"," + "\"val_tpl\":\"{{value_json.#VALUENAME#}}\"," + "\"ent_cat\":\"diagnostic\"," + "\"ic\":\"mdi:#ICON#\"," + "\"enabled_by_default\":\"false\"" + "}")); + configPayloadTemplate.replace(" ", ""); + configPayloadTemplate.replace(F("#DEVICEID#"), deviceID); + configPayloadTemplate.replace(F("#HOSTNAME#"), hostname); + configPayloadTemplate.replace(F("#VERSION#"), VERSION); + configPayloadTemplate.replace(F("#MASTERTOPIC#"), mqttMasterTopic); + configPayloadTemplate.replace(F("#IP#"), ip_url); + + topic = configTopicTemplate; + topic.replace(F("#COMPONENT#"), F("sensor")); + topic.replace(F("#SENSORID#"), F("WifiSSID")); + + payload = configPayloadTemplate; + payload.replace(F("#SENSORID#"), F("WifiSSID")); + payload.replace(F("#SENSORNAME#"), F("SSID")); + payload.replace(F("#STATETOPIC#"), F("matrixinfo")); + payload.replace(F("#VALUENAME#"), F("wifiSSID")); + payload.replace(F("#ICON#"), F("wifi")); + client.publish(topic.c_str(), payload.c_str(), true); + + // Wifi BSSID + topic = configTopicTemplate; + topic.replace(F("#COMPONENT#"), F("sensor")); + topic.replace(F("#SENSORID#"), F("WifiBSSID")); + + payload = configPayloadTemplate; + payload.replace(F("#SENSORID#"), F("WifiBSSID")); + payload.replace(F("#SENSORNAME#"), F("BSSID")); + payload.replace(F("#STATETOPIC#"), F("matrixinfo")); + payload.replace(F("#VALUENAME#"), F("wifiBSSID")); + payload.replace(F("#ICON#"), F("wifi")); + client.publish(topic.c_str(), payload.c_str(), true); + + // Chip ID + topic = configTopicTemplate; + topic.replace(F("#COMPONENT#"), F("sensor")); + topic.replace(F("#SENSORID#"), F("chipID")); + + payload = configPayloadTemplate; + payload.replace(F("#SENSORID#"), F("chipID")); + payload.replace(F("#SENSORNAME#"), F("Chip ID")); + payload.replace(F("#STATETOPIC#"), F("matrixinfo")); + payload.replace(F("#VALUENAME#"), F("chipID")); + payload.replace(F("#ICON#"), F("developer-board")); + client.publish(topic.c_str(), payload.c_str(), true); + + // LED Matrix on/off + brightness light + configPayloadTemplate = String(F( + "{" + "\"dev\":{" + "\"ids\":\"#DEVICEID#\"," + "\"name\":\"#HOSTNAME#\"," + "\"mdl\":\"PixelIt\"," + "\"mf\":\"PixelIt\"," + "\"sw\":\"#VERSION#\"," + "\"cu\":\"#IP#\"" + "}," + "\"avty_t\":\"#MASTERTOPIC#state\"," + "\"pl_avail\":\"connected\"," + "\"pl_not_avail\":\"disconnected\"," + "\"uniq_id\":\"#DEVICEID##SENSORID#\"," + "\"name\":\"#SENSORNAME#\"," + "\"schema\":\"template\"," + "\"stat_t\":\"#MASTERTOPIC##STATETOPIC#\"," + "\"stat_tpl\":\"{{ \'on\' if value_json.sleepMode is false else \'off\' }}\"," + "\"cmd_t\":\"#MASTERTOPIC##COMMANDTOPIC#\"," + "\"cmd_on_tpl\":\"{\'sleepMode\': false {%- if brightness is defined -%}, \'brightness\': {{ brightness }}{%- endif -%}}\"," + "\"cmd_off_tpl\":\"{\'sleepMode\': true}\"," + "\"bri_tpl\":\"{{ value_json.currentMatrixBrightness }}\"," + "\"icon\":\"mdi:#ICON#\"" + "}")); + configPayloadTemplate.replace(F("#DEVICEID#"), deviceID); + configPayloadTemplate.replace(F("#HOSTNAME#"), hostname); + configPayloadTemplate.replace(F("#VERSION#"), VERSION); + configPayloadTemplate.replace(F("#MASTERTOPIC#"), mqttMasterTopic); + configPayloadTemplate.replace(F("#IP#"), ip_url); + + topic = configTopicTemplate; + topic.replace(F("#COMPONENT#"), F("light")); + topic.replace(F("#SENSORID#"), F("LEDMatrixLight")); + + payload = configPayloadTemplate; + payload.replace(F("#SENSORID#"), F("LEDMatrixLight")); + payload.replace(F("#SENSORNAME#"), F("LED Matrix")); + payload.replace(F("#STATETOPIC#"), F("matrixinfo")); + payload.replace(F("#COMMANDTOPIC#"), F("setScreen")); + payload.replace(F("#ICON#"), F("led-strip")); + client.publish(topic.c_str(), payload.c_str(), true); + + Log(F("MQTTreconnect"), F("MQTT discovery information published")); + } + else + { + Log(F("MQTTreconnect"), F("MQTT connect failed! Retry in a few seconds...")); + } + + return connected; +} +///////////////////////////////////////////////////////////////////// +///////////////////////////////////////////////////////////////////// +// Effekte + +void FadeOut(int dealy, int minBrightness) +{ + int currentFadeBrightness = currentMatrixBrightness; + + int counter = 25; + while (counter >= 0) + { + currentFadeBrightness = map(counter, 0, 25, minBrightness, currentMatrixBrightness); + matrix->setBrightness(currentFadeBrightness); + matrix->show(); + counter--; + delay(dealy); + } +} + +void FadeIn(int dealy, int minBrightness) +{ + int currentFadeBrightness = minBrightness; + + int counter = 0; + while (counter <= 25) + { + currentFadeBrightness = map(counter, 0, 25, minBrightness, currentMatrixBrightness); + matrix->setBrightness(currentFadeBrightness); + matrix->show(); + counter++; + delay(dealy); + } +} + +void ColoredBarWipe() +{ + for (uint16_t i = 0; i < 32 + 1; i++) + { + matrix->fillRect(0, 0, i - 1, 8, matrix->Color(0, 0, 0)); + + matrix->drawFastVLine(i, 0, 8, ColorWheel((i * 8) & 255, 0)); + matrix->drawFastVLine(i + 1, 0, 8, ColorWheel((i * 9) & 255, 0)); + matrix->drawFastVLine(i - 1, 0, 8, 0); + matrix->drawFastVLine(i - 2, 0, 8, 0); + matrix->show(); + delay(15); + } +} + +void ZigZagWipe(uint8_t r, uint8_t g, uint8_t b) +{ + for (uint16_t row = 0; row <= 7; row += 2) + { + for (uint16_t col = 0; col <= 31; col++) + { + if (row == 0 || row == 4) + { + matrix->fillRect(0, row, col - 1, 2, matrix->Color(0, 0, 0)); + matrix->drawFastVLine(col - 1, row, 2, matrix->Color(r, g, b)); + matrix->drawFastVLine(col, row, 2, matrix->Color(r, g, b)); + } + else + { + matrix->fillRect(32 - col, row, col, 2, matrix->Color(0, 0, 0)); + matrix->drawFastVLine(32 - col, row, 2, matrix->Color(r, g, b)); + matrix->drawFastVLine(32 - col - 1, row, 2, matrix->Color(r, g, b)); + } + matrix->show(); + delay(5); + } + matrix->fillRect(0, row, 32, 2, matrix->Color(0, 0, 0)); + if (row == 0 || row == 4) + { + matrix->drawFastVLine(30, row + 1, 2, matrix->Color(r, g, b)); + matrix->drawFastVLine(31, row + 1, 2, matrix->Color(r, g, b)); + } + else + { + matrix->drawFastVLine(0, row + 1, 2, matrix->Color(r, g, b)); + matrix->drawFastVLine(1, row + 1, 2, matrix->Color(r, g, b)); + } + matrix->show(); + delay(5); + matrix->fillRect(0, row, 32, 2, matrix->Color(0, 0, 0)); + } + matrix->fillRect(0, 0, 32, 8, matrix->Color(0, 0, 0)); + matrix->show(); +} + +void BitmapWipe(JsonArray &data, int16_t w) +{ + for (int16_t x = -w + 1; x <= 31; x++) + { + int16_t y = 0; + for (int16_t j = 0; j < 8; j++, y++) + { + for (int16_t i = 0; i < w; i++) + { + matrix->drawPixel(x + i, y, data[j * w + i].as()); + } + } + matrix->show(); + delay(18); + matrix->fillRect(0, 0, x, 8, matrix->Color(0, 0, 0)); + matrix->show(); + } +} + +void ColorFlash(int red, int green, int blue) +{ + for (uint16_t row = 0; row < 8; row++) + { + for (uint16_t column = 0; column < 32; column++) + { + matrix->drawPixel(column, row, matrix->Color(red, green, blue)); + } + } + matrix->show(); +} + +uint ColorWheel(byte wheelPos, int pos) +{ + if (wheelPos < 85) + { + return matrix->Color((wheelPos * 3) - pos, (255 - wheelPos * 3) - pos, 0); + } + else if (wheelPos < 170) + { + wheelPos -= 85; + return matrix->Color((255 - wheelPos * 3) - pos, 0, (wheelPos * 3) - pos); + } + else + { + wheelPos -= 170; + return matrix->Color(0, (wheelPos * 3) - pos, (255 - wheelPos * 3) - pos); + } +} + +void ShowBootAnimation() +{ + DrawTextHelper("P", false, false, false, false, false, 255, 51, 255, 4, 1); + matrix->show(); + + delay(200); + DrawTextHelper("I", false, false, false, false, false, 0, 255, 42, 8, 1); + matrix->show(); + + delay(200); + DrawTextHelper("X", false, false, false, false, false, 255, 25, 25, 10, 1); + matrix->show(); + + delay(200); + DrawTextHelper("E", false, false, false, false, false, 25, 255, 255, 14, 1); + matrix->show(); + + delay(200); + DrawTextHelper("L", false, false, false, false, false, 255, 221, 51, 18, 1); + matrix->show(); + + delay(500); + DrawTextHelper("I", false, false, false, false, false, 255, 255, 255, 22, 1); + DrawTextHelper("T", false, false, false, false, false, 255, 255, 255, 24, 1); + matrix->show(); + delay(1000); + + // FadeIn(60, 10); + // DrawTextHelper("PIXELIT", false, false, false, false, false, 255, 255, 255, 3, 1); + // FadeIn(60, 10); + // FadeOut(60, 10); + // FadeIn(60, 10); + // FadeOut(60, 10); + // FadeIn(60, 10); +} + +ColorTemperature GetUserColorTemp() +{ + if (matrixTempCorrection == "tungsten40w") + { + return Tungsten40W; + } + + if (matrixTempCorrection == "tungsten100w") + { + return Tungsten100W; + } + + if (matrixTempCorrection == "halogen") + { + return Halogen; + } + + if (matrixTempCorrection == "carbonarc") + { + return CarbonArc; + } + + if (matrixTempCorrection == "highnoonsun") + { + return HighNoonSun; + } + + if (matrixTempCorrection == "directsunlight") + { + return DirectSunlight; + } + + if (matrixTempCorrection == "overcastsky") + { + return OvercastSky; + } + + if (matrixTempCorrection == "clearbluesky") + { + return ClearBlueSky; + } + + if (matrixTempCorrection == "warmfluorescent") + { + return WarmFluorescent; + } + + if (matrixTempCorrection == "standardfluorescent") + { + return StandardFluorescent; + } + + if (matrixTempCorrection == "coolwhitefluorescent") + { + return CoolWhiteFluorescent; + } + if (matrixTempCorrection == "fullspectrumfluorescent") + { + return FullSpectrumFluorescent; + } + if (matrixTempCorrection == "growlightfluorescent") + { + return GrowLightFluorescent; + } + if (matrixTempCorrection == "blacklightfluorescent") + { + return BlackLightFluorescent; + } + if (matrixTempCorrection == "mercuryvapor") + { + return MercuryVapor; + } + if (matrixTempCorrection == "sodiumvapor") + { + return SodiumVapor; + } + if (matrixTempCorrection == "metalhalide") + { + return MetalHalide; + } + if (matrixTempCorrection == "highpressuresodium") + { + return HighPressureSodium; + } + + return UncorrectedTemperature; +} + +LEDColorCorrection GetUserColorCorrection() +{ + if (matrixTempCorrection == "default") + { + return TypicalSMD5050; + } + + if (matrixTempCorrection == "typicalsmd5050") + { + return TypicalSMD5050; + } + + if (matrixTempCorrection == "typical8mmpixel") + { + return Typical8mmPixel; + } + + return UncorrectedColor; +} + +int *GetUserCutomCorrection() +{ + String rgbString = matrixTempCorrection; + rgbString.trim(); + + // R,G,B / 255,255,255 + static int rgbArray[3]; + + // R + rgbArray[0] = rgbString.substring(0, 3).toInt(); + // G + rgbArray[1] = rgbString.substring(4, 7).toInt(); + // B + rgbArray[2] = rgbString.substring(8, 11).toInt(); + + return rgbArray; +} + +LightDependentResistor::ePhotoCellKind TranslatePhotocell(String photocell) +{ + if (photocell == "GL5516") + return LightDependentResistor::GL5516; + if (photocell == "GL5528") + return LightDependentResistor::GL5528; + if (photocell == "GL5537_1") + return LightDependentResistor::GL5537_1; + if (photocell == "GL5537_2") + return LightDependentResistor::GL5537_2; + if (photocell == "GL5539") + return LightDependentResistor::GL5539; + if (photocell == "GL5549") + return LightDependentResistor::GL5549; + Log(F("Zuordnung LDR"), F("Unbekannter LDR-Typ")); + return LightDependentResistor::GL5528; +} + +uint8_t TranslatePin(String pin) +{ +#if defined(ESP8266) + if (pin == "Pin_D0") + return D0; + if (pin == "Pin_D1") + return D1; + if (pin == "Pin_D2") + return D2; + if (pin == "Pin_D3") + return D3; + if (pin == "Pin_D4") + return D4; + if (pin == "Pin_D5") + return D5; + if (pin == "Pin_D6") + return D6; + if (pin == "Pin_D7") + return D7; + if (pin == "Pin_D8") + return D8; + if (pin == "Pin_27") + return 27; + Log(F("Pin-Zuordnung"), F("Unbekannter Pin")); + return LED_BUILTIN; +#elif defined(ESP32) + + if (pin == "GPIO_NUM_14") + return GPIO_NUM_14; + if (pin == "GPIO_NUM_15") + return GPIO_NUM_15; + if (pin == "GPIO_NUM_16") + return GPIO_NUM_16; + if (pin == "GPIO_NUM_17") + return GPIO_NUM_17; + if (pin == "GPIO_NUM_18") + return GPIO_NUM_18; + if (pin == "GPIO_NUM_19") + return GPIO_NUM_19; + if (pin == "GPIO_NUM_21") + return GPIO_NUM_21; + if (pin == "GPIO_NUM_22") + return GPIO_NUM_22; + if (pin == "GPIO_NUM_23") + return GPIO_NUM_23; + if (pin == "GPIO_NUM_25") + return GPIO_NUM_25; + if (pin == "GPIO_NUM_26") + return GPIO_NUM_26; + if (pin == "GPIO_NUM_27") + return GPIO_NUM_27; + if (pin == "SPI_CLK_GPIO_NUM") + return SPI_CLK_GPIO_NUM; + if (pin == "SPI_CS0_GPIO_NUM") + return SPI_CS0_GPIO_NUM; + + Log(F("Pin-Zuordnung"), F("Unbekannter Pin")); + return GPIO_NUM_32; // IDK +#endif +} + +void ClearTextArea() +{ + int16_t h = 8; + int16_t w = 24; + int16_t x = 8; + int16_t y = 0; + + for (int16_t j = 0; j < h; j++, y++) + { + for (int16_t i = 0; i < w; i++) + { + matrix->drawPixel(x + i, y, (uint16_t)0); + } + } +} + +void ClearBMPArea() +{ + int16_t h = 8; + int16_t w = 8; + int16_t x = 0; + int16_t y = 0; + + for (int16_t j = 0; j < h; j++, y++) + { + for (int16_t i = 0; i < w; i++) + { + matrix->drawPixel(x + i, y, (uint16_t)0); + } + } +} + +int DayOfWeekFirstMonday(int OrigDayofWeek) +{ + int idx = (7 + OrigDayofWeek) - 1; + if (idx > 6) // week ends at 6, because Enum.DayOfWeek is zero-based + { + idx -= 7; + } + return idx; + // int diff = (7 + (OrigDayofWeek - 1)) % 7; + // return OrigDayofWeek + (-1 * diff); +} + +void initDFPlayer() +{ + if (!mp3Player.begin(*softSerial)) + { + Log(F("DFPlayer"), F("DFPlayer not found")); + } + else + { + Log(F("DFPlayer"), F("DFPlayer started")); + mp3Player.volume(initialVolume); + } +} + +///////////////////////////////////////////////////////////////////// +///////////////////////////////////////////////////////////////////// +void setup() +{ +#if defined(ULANZI) + pinMode(15, INPUT_PULLDOWN); // Fix high pitch tone + pinMode(27, INPUT_PULLUP); // Middle Button fix + pinMode(26, INPUT_PULLUP); // Left Button fix + pinMode(VBAT_PIN, INPUT); // Battery ADC +#endif + + Serial.begin(115200); + + // Mounting FileSystem + Serial.println(F("Mounting file system...")); +#if defined(ESP8266) + if (LittleFS.begin(true)) +#elif defined(ESP32) + if (SPIFFS.begin(true)) +#endif + { + Serial.println(F("Mounted file system.")); + LoadConfig(); + // If new version detected, create new variables in config if necessary. + if (optionsVersion != VERSION) + { + Log(F("LoadConfig"), F("New version detected, create new variables in config if necessary")); + SaveConfig(); + LoadConfig(); + } + } + else + { + Serial.println(F("Failed to mount FS")); + } + + // Init SetGPIO Array + for (int i = 0; i < SET_GPIO_SIZE; i++) + { + setGPIOReset[i].gpio = -1; + setGPIOReset[i].resetMillis = -1; + } + + // I2C Sensors + twowire.begin(TranslatePin(SDAPin), TranslatePin(SCLPin)); + + // Init LightSensor + bh1750 = new BH1750(); + if (bh1750->begin(BH1750::CONTINUOUS_HIGH_RES_MODE, 0x23, &twowire)) + { + Log(F("Setup"), F("BH1750 started")); + luxSensor = LuxSensor_BH1750; + } + else + { + delete bh1750; + max44009 = new Max44009(Max44009::Boolean::False); + max44009->configure(MAX44009_DEFAULT_ADDRESS, &twowire, Max44009::Boolean::False); + if (max44009->isConnected()) + { + Log(F("Setup"), F("Max44009/GY-049 started")); + luxSensor = LuxSensor_Max44009; + } + else + { + delete max44009; + photocell = new LightDependentResistor(LDR_PIN, ldrPulldown, TranslatePhotocell(ldrDevice), 10, ldrSmoothing); + photocell->setPhotocellPositionOnGround(false); + luxSensor = LuxSensor_LDR; + } + } + + // Init Temp Sensors + bme280 = new Adafruit_BME280(); + if (bme280->begin(BME280_ADDRESS_ALTERNATE, &twowire)) + { + Log(F("Setup"), F("BME280 started")); + tempSensor = TempSensor_BME280; + } + else + { + delete bme280; + bmp280 = new Adafruit_BMP280(&twowire); + Log(F("Setup"), F("BMP280 Trying")); + if (bmp280->begin(BMP280_ADDRESS_ALT, 0x58)) + { + Log(F("Setup"), F("BMP280 started")); + tempSensor = TempSensor_BMP280; + } + else + { + delete bmp280; + bme680 = new Adafruit_BME680(&twowire); + if (bme680->begin()) + { + Log(F("Setup"), F("BME680 started")); + tempSensor = TempSensor_BME680; + } + else + { + Log(F("Setup"), F("No BMP280, BME280 or BME 680 sensor found")); + // AM2320 needs a delay to be reliably initialized + delete bme680; + + // continue only if: + // - LDR is being used. This means: no light sensor in I²C bus. + // - SDA and SCL use different pin than onewire + + // Otherwise, we already found a light sensor on I²C. If we would start a probe for OneWire on the same pin now, I²C will be disfunctional. + if (luxSensor == LuxSensor_LDR || (onewirePin != SDAPin && onewirePin != SCLPin)) + { + delay(800); + dht.setup(TranslatePin(onewirePin), DHTesp::DHT22); + if (!isnan(dht.getHumidity()) && !isnan(dht.getTemperature())) + { + Log(F("Setup"), F("DHT started")); + tempSensor = TempSensor_DHT; + } + else + { + Log(F("Setup"), F("No DHT Sensor found")); + } + } + else + { + Log(F("Setup"), F("Not probing DHT sensor: light sensor already found on same pin as DHT.")); + } + } + } + } + + switch (matrixType) + { + default: // Matix Type 1 (Colum major) + matrix = new FastLED_NeoMatrix(leds, 32, 8, NEO_MATRIX_TOP + NEO_MATRIX_LEFT + NEO_MATRIX_COLUMNS + NEO_MATRIX_ZIGZAG); + break; + + case 2: // Matix Type 2 (Row major) + matrix = new FastLED_NeoMatrix(leds, 32, 8, NEO_MATRIX_TOP + NEO_MATRIX_LEFT + NEO_MATRIX_ROWS + NEO_MATRIX_ZIGZAG); + break; + + case 3: // Matix Type 3 (Tiled 4x 8x8 CJMCU, Column major) + matrix = new FastLED_NeoMatrix(leds, 32, 8, NEO_MATRIX_BOTTOM + NEO_MATRIX_LEFT + NEO_MATRIX_COLUMNS + NEO_MATRIX_PROGRESSIVE); + break; + + case 4: // Matix Type 4 (MicroMatrix by foorschtbar) See: https://github.com/foorschtbar/Sk6805EC15-Matrix + matrix = new FastLED_NeoMatrix(leds, 8, 8, 4, 1, NEO_MATRIX_TOP + NEO_MATRIX_LEFT + NEO_MATRIX_ROWS + NEO_MATRIX_ZIGZAG); + break; + + case 5: // Matix Type 5 (Tiled 4x 8x8 CJMCU, Row major) + matrix = new FastLED_NeoMatrix(leds, 8, 8, 4, 1, NEO_MATRIX_TOP + NEO_MATRIX_LEFT + NEO_MATRIX_ROWS + NEO_MATRIX_PROGRESSIVE); + break; + } + + ColorTemperature userColorTemp = GetUserColorTemp(); + LEDColorCorrection userLEDCorrection = GetUserColorCorrection(); + + // Matrix Color Correction + if (userLEDCorrection != UncorrectedColor) + { + FastLED.addLeds(leds, MATRIX_WIDTH * MATRIX_HEIGHT).setCorrection(userLEDCorrection); + } + else if (userColorTemp != UncorrectedTemperature) + { + FastLED.addLeds(leds, MATRIX_WIDTH * MATRIX_HEIGHT).setTemperature(userColorTemp); + } + else + { + int *rgbArray = GetUserCutomCorrection(); + FastLED.addLeds(leds, MATRIX_WIDTH * MATRIX_HEIGHT).setCorrection(matrix->Color(rgbArray[0], rgbArray[1], rgbArray[2])); + } + + matrix->begin(); + matrix->setTextWrap(false); + matrix->setBrightness(currentMatrixBrightness); + matrix->clear(); + + softSerial = new SoftwareSerial(TranslatePin(dfpTXPin), TranslatePin(dfpRXPin)); + + softSerial->begin(9600); + Log(F("Setup"), F("Software Serial started")); + + // Play sound on boot + if (bootSound) + { + delay(1000); // is needed for the dfplayer to startup + initDFPlayer(); + delay(10); + mp3Player.play(1); + } + + // Bootscreen + if (bootScreenAktiv) + { + ShowBootAnimation(); + } + + // Hostname + if (hostname.isEmpty()) + { + hostname = "PixelIt"; + } + WiFi.hostname(hostname); + + wifiManager.setAPCallback(EnteredHotspotCallback); + wifiManager.setMinimumSignalQuality(); + // Timout for the wifi connection until the hotspot is set up + wifiManager.setTimeout(30); + // Config menue timeout 180 seconds. + wifiManager.setConfigPortalTimeout(180); + + if (!wifiManager.autoConnect("PIXELIT")) + { + Log(F("Setup"), F("Wifi failed to connect and hit timeout")); + delay(3000); + // Reset and try again, or maybe put it to deep sleep + ESP.restart(); + delay(5000); + } + + Log(F("Setup"), F("Wifi connected...yeey :)")); + + Log(F("Setup"), F("Local IP")); + Log(F("Setup"), WiFi.localIP().toString()); + Log(F("Setup"), WiFi.gatewayIP().toString()); + Log(F("Setup"), WiFi.subnetMask().toString()); + + Log(F("Setup"), F("Starting UDP")); + udp.begin(2390); + // Log(F("Setup"), "Local port: " + String(udp.localPort())); + + httpUpdater.setup(&server); + + server.on(F("/api/screen"), HTTP_POST, HandleScreen); + server.on(F("/api/luxsensor"), HTTP_GET, HandleGetLuxSensor); + server.on(F("/api/brightness"), HTTP_GET, HandleGetBrightness); + server.on(F("/api/dhtsensor"), HTTP_GET, HandleGetDHTSensor); // Legacy + server.on(F("/api/sensor"), HTTP_GET, HandleGetSensor); + server.on(F("/api/buttons"), HTTP_GET, HandleGetButtons); + server.on(F("/api/matrixinfo"), HTTP_GET, HandleGetMatrixInfo); + // server.on(F("/api/soundinfo"), HTTP_GET, HandleGetSoundInfo); + server.on(F("/api/config"), HTTP_POST, HandleSetConfig); + server.on(F("/api/config"), HTTP_GET, HandleGetConfig); + server.on(F("/api/wifireset"), HTTP_POST, HandelWifiConfigReset); + server.on(F("/api/factoryreset"), HTTP_POST, HandleFactoryReset); + server.on(F("/"), HTTP_GET, HandleGetMainPage); + server.onNotFound(HandleNotFound); + + server.begin(); + + webSocket.begin(); + webSocket.onEvent(webSocketEvent); + + // Liveview + liveview.begin(matrix, leds, SEND_LIVEVIEW_INTERVAL); // pass pointer to matrix, ledbuffer and interval + liveview.setCallback(sendLiveview); // set callback function which is called after the interval + + Log(F("Setup"), F("Webserver started")); + + if (mqttAktiv == true) + { + client.setServer(mqttServer.c_str(), mqttPort); + client.setCallback(callback); + client.setBufferSize(8000); + Log(F("Setup"), F("MQTT started")); + } + + if (!bootSound) + { + initDFPlayer(); + } +} + +void displayUpdateScreen() +{ + Log(F("UpdateScreen"), F("Display UpdateScreen...")); + + DynamicJsonBuffer jsonBuffer; + JsonObject &root = jsonBuffer.createObject(); + + BuildUpdateScreenJSON(root); + + if (root.success()) + { + CreateFrames(root, CHECKUPDATESCREEN_DURATION); + } + else + { + Log(F("UpdateScreen"), F("Failed to Build UpdateScreen JSON")); + } +} + +void checkUpdate() +{ + Log(F("CheckUpdate"), F("Checking...")); + HttpClient httpClient = HttpClient(wifiClientHTTP, CHECKUPDATE_SERVER_HOST, CHECKUPDATE_SERVER_PORT); + httpClient.sendHeader("User-Agent", "PixelIt"); + httpClient.setTimeout(1500); + httpClient.get(CHECKUPDATE_SERVER_PATH); + int statusCode = httpClient.responseStatusCode(); + String response = httpClient.responseBody(); + + // Serial.print("Status code: "); + // Serial.println(statusCode); + // Serial.print("Response: "); + // Serial.println(response); + + if (statusCode == 200) + { + DynamicJsonBuffer jsonBuffer; + JsonObject &root = jsonBuffer.parseObject(response); + if (root.containsKey("version")) + { + lastReleaseVersion = root["version"].as(); + if (!lastReleaseVersion.equals(VERSION)) + { + Log(F("CheckUpdate"), F("New FW available")); + } + else + { + Log(F("CheckUpdate"), F("No new FW available")); + } + } + } + else + { + Log(F("CheckUpdate"), "Error. HTTP Code: " + statusCode); + } +} + +void loop() +{ + server.handleClient(); + webSocket.loop(); + + // Reset GPIO based on the array, as far as something is present in the array. + for (int i = 0; i < SET_GPIO_SIZE; i++) + { + if (setGPIOReset[i].gpio != -1) + { + if (setGPIOReset[i].resetMillis <= millis()) + { + Log(F("ResetSetGPIO"), "Pos: " + String(i) + ", GPIO: " + String(setGPIOReset[i].gpio) + ", Value: false"); + digitalWrite(setGPIOReset[i].gpio, false); + setGPIOReset[i].gpio = -1; + setGPIOReset[i].resetMillis = -1; + } + } + } + + // Check and display if new FW version is available. + // if necessary also check scrollTextAktivLoop = false; and animateBMPAktivLoop = false; if they are disturbed?! + if (checkUpdateScreen == true) + { + + // Check new FW Version first time after 30.5 seconds + if ((checkUpdatePrevMillis == 0 && millis() > 30500) || millis() - checkUpdatePrevMillis >= CHECKUPDATE_INTERVAL) + { + checkUpdatePrevMillis = millis(); + checkUpdate(); + } + + // Display new FW Version + if (millis() - checkUpdateScreenPrevMillis >= CHECKUPDATESCREEN_INTERVAL) + { + checkUpdateScreenPrevMillis = millis(); + if (!lastReleaseVersion.equals(VERSION)) + { + displayUpdateScreen(); + } + } + } + + // Send Telemetry data first time after 30.3 seconds + // if necessary also check scrollTextAktivLoop = false; and animateBMPAktivLoop = false; if they are disturbed?! + if (sendTelemetry == true && ((sendTelemetryPrevMillis == 0 && millis() > 30300) || millis() - sendTelemetryPrevMillis >= TELEMETRY_INTERVAL)) + { + sendTelemetryPrevMillis = millis(); + SendTelemetry(); + } + + if (mqttAktiv == true) + { + if (!client.connected()) + { + // MQTT connect + if (mqttLastReconnectAttempt == 0 || (millis() - mqttLastReconnectAttempt) >= MQTT_RECONNECT_INTERVAL) + { + mqttLastReconnectAttempt = millis(); + + // try to reconnect + if (MQTTreconnect()) + { + mqttLastReconnectAttempt = 0; + } + } + } + else + { + client.loop(); + } + } + + // Check buttons + for (uint button = 0; button < 3; button++) + { + if (btnEnabled[button]) + { + if ((btnState[button] == btnState_Released) && (digitalRead(TranslatePin(btnPin[button])) == btnPressedLevel[button])) + { + btnState[button] = btnState_PressedNew; + } + if ((btnState[button] == btnState_PressedBefore) && (digitalRead(TranslatePin(btnPin[button])) != btnPressedLevel[button])) + { + btnState[button] = btnState_Released; + HandleAndSendButtonPress(button, false); + } + if (btnState[button] == btnState_PressedNew) + { + btnState[button] = btnState_PressedBefore; + HandleAndSendButtonPress(button, true); + } + } + } + + // Clock Auto Fallback + if (!sleepMode && ((clockAutoFallbackActive && !clockAktiv && millis() - lastScreenMessageMillis >= (clockAutoFallbackTime * 1000)) || forceClock)) + { + forceClock = false; + scrollTextAktivLoop = false; + animateBMPAktivLoop = false; + + int performWipe = 0; + + switch (clockAutoFallbackAnimation) + { + case 1: + case 2: + case 3: + performWipe = clockAutoFallbackAnimation; + break; + case 4: + performWipe = (millis() % 3) + 1; + break; + default:; + } + + if (performWipe == 1) + { + FadeOut(); + } + else if (performWipe == 2) + { + ColoredBarWipe(); + } + else if (performWipe == 3) + { + ZigZagWipe(clockColorR, clockColorG, clockColorB); + } + clockAktiv = true; + clockCounterClock = 0; + clockCounterDate = 0; + DrawClock(true); + + if (performWipe != 0) + { + FadeIn(); + } + } + + if (clockAktiv && now() != clockLastUpdate) + { + if (timeStatus() == timeNotSet && ntpTimeOut <= millis()) + { + if (ntpRetryCounter >= NTP_MAX_RETRYS) + { + ntpTimeOut = (millis() + (NTP_TIMEOUT_SEC * 1000)); + ntpRetryCounter = 0; + Log(F("Sync TimeServer"), "sync timeout for " + String(NTP_TIMEOUT_SEC) + " seconds!"); + } + else + { + Log(F("Sync TimeServer"), ntpServer + " waiting for sync"); + setSyncProvider(getNtpTime); + } + } + clockLastUpdate = now(); + DrawClock(false); + } + + if (millis() - sendLuxPrevMillis >= 1000) + { + sendLuxPrevMillis = millis(); + + if (luxSensor == LuxSensor_BH1750) + { + currentLux = bh1750->readLightLevel() + luxOffset; + } + else if (luxSensor == LuxSensor_Max44009) + { + currentLux = max44009->getLux() + luxOffset; + } + else + { + currentLux = (roundf(photocell->getSmoothedLux() * 1000) / 1000) + luxOffset; + } + + SendLDR(false); + + if (!sleepMode && matrixBrightnessAutomatic) + { + float newBrightness = map(currentLux, mbaLuxMin, mbaLuxMax, mbaDimMin, mbaDimMax); + // Max brightness 255 + if (newBrightness > 255) + { + newBrightness = 255; + } + // Min brightness 0 + if (newBrightness < 0) + { + newBrightness = 0; + } + + if (newBrightness != currentMatrixBrightness) + { + SetCurrentMatrixBrightness(newBrightness); + Log(F("Auto Brightness"), "Lux: " + String(currentLux) + " set brightness to " + String(currentMatrixBrightness)); + } + } + } + + if (millis() - sendSensorPrevMillis >= 3000) + { + sendSensorPrevMillis = millis(); + SendSensor(false); + } + + // liveview + liveview.loop(); + + if (millis() - sendInfoPrevMillis >= 3000) + { + sendInfoPrevMillis = millis(); + SendMatrixInfo(false); + // SendMp3PlayerInfo(false); + } + + if (animateBMPAktivLoop && millis() - animateBMPPrevMillis >= animateBMPDelay) + { + animateBMPPrevMillis = millis(); + AnimateBMP(true); + } + + if (scrollTextAktivLoop && millis() - scrollTextPrevMillis >= scrollTextDelay) + { + scrollTextPrevMillis = millis(); + ScrollText(false); + } +} + +void SendMatrixInfo(bool force) +{ + if (force) + { + oldGetMatrixInfo = ""; + } + + String matrixInfo; + + // Prüfen ob die ermittlung der MatrixInfo überhaupt erforderlich ist + if ((mqttAktiv == true && client.connected()) || (webSocket.connectedClients() > 0)) + { + matrixInfo = GetMatrixInfo(); + } + // Prüfen ob über MQTT versendet werden muss + if (mqttAktiv == true && client.connected() && oldGetMatrixInfo != matrixInfo) + { + client.publish((mqttMasterTopic + "matrixinfo").c_str(), matrixInfo.c_str(), true); + } + // Prüfen ob über Websocket versendet werden muss + if (webSocket.connectedClients() > 0 && oldGetMatrixInfo != matrixInfo) + { + for (uint i = 0; i < sizeof websocketConnection / sizeof websocketConnection[0]; i++) + { + webSocket.sendTXT(i, "{\"sysinfo\":" + matrixInfo + "}"); + } + } + + oldGetMatrixInfo = matrixInfo; +} + +void SendLDR(bool force) +{ + if (force) + { + oldGetLuxSensor = ""; + } + + String luxSensor; + + // Prüfen ob die Abfrage des LuxSensor überhaupt erforderlich ist + if ((mqttAktiv == true && client.connected()) || (webSocket.connectedClients() > 0)) + { + luxSensor = GetLuxSensor(); + } + // Prüfen ob über MQTT versendet werden muss + if (mqttAktiv == true && client.connected() && oldGetLuxSensor != luxSensor) + { + client.publish((mqttMasterTopic + "luxsensor").c_str(), luxSensor.c_str(), true); + } + // Prüfen ob über Websocket versendet werden muss + if (webSocket.connectedClients() > 0 && oldGetLuxSensor != luxSensor) + { + for (unsigned int i = 0; i < sizeof websocketConnection / sizeof websocketConnection[0]; i++) + { + webSocket.sendTXT(i, "{\"sensor\":" + luxSensor + "}"); + } + } + + oldGetLuxSensor = luxSensor; +} +void sendLiveview(const char *data, size_t length) +{ + if (webSocket.connectedClients() > 0) + { + for (unsigned int i = 0; i < sizeof websocketConnection / sizeof websocketConnection[0]; i++) + { + webSocket.sendTXT(i, data, length); + } + } +} + +void SendSensor(bool force) +{ + if (force) + { + oldGetSensor = ""; + } + + String Sensor; + + // Prüfen ob die Abfrage des LuxSensor überhaupt erforderlich ist + if ((mqttAktiv == true && client.connected()) || (webSocket.connectedClients() > 0)) + { + Sensor = GetSensor(); + } + // Prüfen ob über MQTT versendet werden muss + if (mqttAktiv == true && client.connected() && oldGetSensor != Sensor) + { + client.publish((mqttMasterTopic + "dhtsensor").c_str(), Sensor.c_str(), true); // Legancy + client.publish((mqttMasterTopic + "sensor").c_str(), Sensor.c_str(), true); + } + // Prüfen ob über Websocket versendet werden muss + if (webSocket.connectedClients() > 0 && oldGetSensor != Sensor) + { + for (uint i = 0; i < sizeof websocketConnection / sizeof websocketConnection[0]; i++) + { + webSocket.sendTXT(i, "{\"sensor\":" + Sensor + "}"); + } + } + + oldGetSensor = Sensor; +} + +void SendConfig() +{ + if (webSocket.connectedClients() > 0) + { + for (uint i = 0; i < sizeof websocketConnection / sizeof websocketConnection[0]; i++) + { + String config = GetConfig(); + webSocket.sendTXT(i, "{\"config\":" + config + "}"); + } + } +} + +///////////////////////////////////////////////////////////////////// +/*-------- NTP code ----------*/ +const int NTP_PACKET_SIZE = 48; +byte packetBuffer[NTP_PACKET_SIZE]; + +time_t getNtpTime() +{ + while (udp.parsePacket() > 0) + ; + sendNTPpacket(ntpServer); + uint32_t beginWait = millis(); + while (millis() - beginWait < 1500) + { + int size = udp.parsePacket(); + if (size >= NTP_PACKET_SIZE) + { + udp.read(packetBuffer, NTP_PACKET_SIZE); + time_t secsSince1900; + + secsSince1900 = (time_t)packetBuffer[40] << 24; + secsSince1900 |= (time_t)packetBuffer[41] << 16; + secsSince1900 |= (time_t)packetBuffer[42] << 8; + secsSince1900 |= (time_t)packetBuffer[43]; + time_t secsSince1970 = secsSince1900 - 2208988800UL; + float totalOffset = clockTimeZone; + if (clockDayLightSaving) + { + totalOffset = (clockTimeZone + DSToffset(secsSince1970, clockTimeZone)); + } + return secsSince1970 + (time_t)(totalOffset * SECS_PER_HOUR); + ntpRetryCounter = 0; + } + yield(); + } + ntpRetryCounter++; + return 0; +} +void sendNTPpacket(String &address) +{ + memset(packetBuffer, 0, NTP_PACKET_SIZE); + + packetBuffer[0] = 0b11100011; + packetBuffer[1] = 0; + packetBuffer[2] = 6; + packetBuffer[3] = 0xEC; + + packetBuffer[12] = 49; + packetBuffer[13] = 0x4E; + packetBuffer[14] = 49; + packetBuffer[15] = 52; + + udp.beginPacket(address.c_str(), 123); + udp.write(packetBuffer, NTP_PACKET_SIZE); + udp.endPacket(); +} + +void Log(String function, String message) +{ + + String timeStamp = IntFormat(year()) + "-" + IntFormat(month()) + "-" + IntFormat(day()) + "T" + IntFormat(hour()) + ":" + IntFormat(minute()) + ":" + IntFormat(second()); + + Serial.println("[" + timeStamp + "] " + function + ": " + message); + + // Prüfen ob über Websocket versendet werden muss + if (webSocket.connectedClients() > 0) + { + for (unsigned int i = 0; i < sizeof websocketConnection / sizeof websocketConnection[0]; i++) + { + String payload = "{\"log\":{\"timeStamp\":\"" + timeStamp + "\",\"function\":\"" + function + "\",\"message\":\"" + message + "\"}}"; + webSocket.sendTXT(i, payload); + } + } +} From 75dc6b29d3116e468ea9c076a55d4ac44db4b46f Mon Sep 17 00:00:00 2001 From: foorschtbar Date: Tue, 19 Sep 2023 23:17:07 +0200 Subject: [PATCH 02/30] Added sensor and battery support for Ulanzi --- src/PixelIt.ino | 89 ++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 85 insertions(+), 4 deletions(-) diff --git a/src/PixelIt.ino b/src/PixelIt.ino index ebaaf4c..1ab984a 100644 --- a/src/PixelIt.ino +++ b/src/PixelIt.ino @@ -90,7 +90,7 @@ String dfpTXPin = STR(DEFAULT_PIN_DFPTX); String onewirePin = STR(DEFAULT_PIN_ONEWIRE); String SCLPin = STR(DEFAULT_PIN_SCL); String SDAPin = STR(DEFAULT_PIN_SDA); -String ldrDevice = "GL5516"; +String ldrDevice = STR(DEFAULT_LDR); unsigned long ldrPulldown = 10000; // 10k pulldown-resistor unsigned int ldrSmoothing = 0; float batteryLevelPct = 0; @@ -229,10 +229,12 @@ String matrixTempCorrection = "default"; // System Vars bool sleepMode = false; bool bootScreenAktiv = true; +bool bootBatteryScreen = VBAT_PIN > 0 ? true : false; bool bootSound = false; String optionsVersion = ""; // Millis timestamp of the last receiving screen unsigned long lastScreenMessageMillis = 0; +unsigned long lastGetBatteryPercent = 0; // Bmp Vars uint16_t bmpArray[64]; @@ -359,6 +361,20 @@ String ResetReason() #endif } +void getBatteryVoltage() +{ + batteryLevelPct = map(analogRead(VBAT_PIN), 510, 660, 0, 100); + if (batteryLevelPct >= 100) + { + batteryLevelPct = 100; + } + if (batteryLevelPct <= 0) + { + batteryLevelPct = 1; + } + String strBV = String(batteryLevelPct, 0) + " %"; +} + void SetCurrentMatrixBrightness(float newBrightness) { currentMatrixBrightness = newBrightness; @@ -414,6 +430,7 @@ void SaveConfig() json["clockDrawWeekDays"] = clockDrawWeekDays; json["scrollTextDefaultDelay"] = scrollTextDefaultDelay; json["bootScreenAktiv"] = bootScreenAktiv; + json["bootBatteryScreen"] = bootBatteryScreen; json["bootSound"] = bootSound; json["mqttAktiv"] = mqttAktiv; json["mqttUser"] = mqttUser; @@ -658,6 +675,11 @@ void SetConfigVariables(JsonObject &json) bootScreenAktiv = json["bootScreenAktiv"].as(); } + if (json.containsKey("bootBatteryScreen")) + { + bootBatteryScreen = json["bootBatteryScreen"].as(); + } + if (json.containsKey("bootSound")) { bootSound = json["bootSound"].as(); @@ -1770,7 +1792,15 @@ String GetSensor() root["temperature"] = CelsiusToFahrenheit(currentTemp) + temperatureOffset; } } - + else if (tempSensor == TempSensor_SHT31) + { + const float currentTemp = sht31.readTemperature(); + const float currentHumi = sht31.readHumidity(); + root["temperature"] = currentTemp + temperatureOffset; + root["humidity"] = roundf(currentHumi + humidityOffset); + root["pressure"] = "Not installed"; + root["gas"] = "Not installed"; + } else { root["humidity"] = "Not installed"; @@ -1779,6 +1809,16 @@ String GetSensor() root["gas"] = "Not installed"; } + if (VBAT_PIN > 0) + { + getBatteryVoltage(); + root["battery"] = batteryLevelPct; + } + else + { + root["battery"] = "Not installed"; + } + String json; root.printTo(json); @@ -1881,7 +1921,7 @@ void SendTelemetry() String GetTelemetry() { const String MatrixTypeNames[] = {"Colum major", "Row major", "Tiled 4x 8x8 CJMCU (Column major)", "MicroMatrix", "Tiled 4x 8x8 CJMCU (Row major)"}; - const String TempSensorNames[] = {"none", "BME280", "DHT", "BME680", "BMP280"}; + const String TempSensorNames[] = {"none", "BME280", "DHT", "BME680", "BMP280", "SHT31"}; const String LuxSensorNames[] = {"LDR", "BH1750", "Max44009"}; DynamicJsonBuffer jsonBuffer; @@ -2951,6 +2991,28 @@ void ShowBootAnimation() // FadeIn(60, 10); } +void ShowBatteryScreen() +{ + const size_t capacity = JSON_ARRAY_SIZE(64) + JSON_OBJECT_SIZE(1) + 2 * JSON_OBJECT_SIZE(2) + JSON_OBJECT_SIZE(3) + 350; + DynamicJsonBuffer jsonBuffer(capacity); + const char *json = "{\"bitmap\":{\"data\":[0,0,65535,65535,65535,0,0,0,0,0,65535,2016,65535,0,0,0,0,65535,2016,2016,2016,65535,0,0,0,65535,2016,2016,2016,65535,0,0,0,65535,2016,2016,2016,65535,0,0,0,65535,2016,2016,2016,65535,0,0,0,65535,2016,2016,2016,65535,0,0,0,65535,65535,65535,65535,65535,0,0],\"position\":{\"x\":0,\"y\":0},\"size\":{\"width\":8,\"height\":8}}}"; + JsonObject &root = jsonBuffer.parseObject(json); + if (root.success()) + { + Serial.println("parsed json"); + } + else + { + Serial.println("failed to parse json"); + } + getBatteryVoltage(); + matrix->clear(); + DrawSingleBitmap(root["bitmap"]); + DrawTextHelper(String(batteryLevelPct, 0) + "%", false, true, false, false, false, 255, 255, 255, 9, 1); + matrix->show(); + delay(1000); +} + ColorTemperature GetUserColorTemp() { if (matrixTempCorrection == "tungsten40w") @@ -3286,6 +3348,19 @@ void setup() } // Init Temp Sensors + Log(F("Setup"), F("SHT31 Trying")); + if (!sht31.begin(0x44)) + { + Log(F("Setup"), F("Couldn't find SHT31")); + while (1) + delay(1); + } + else + { + Log(F("Setup"), F("SHT31 started")); + tempSensor = TempSensor_SHT31; + } + bme280 = new Adafruit_BME280(); if (bme280->begin(BME280_ADDRESS_ALTERNATE, &twowire)) { @@ -3410,6 +3485,12 @@ void setup() ShowBootAnimation(); } + // Battery + if (bootBatteryScreen) + { + ShowBatteryScreen(); + } + // Hostname if (hostname.isEmpty()) { @@ -3961,4 +4042,4 @@ void Log(String function, String message) webSocket.sendTXT(i, payload); } } -} +} \ No newline at end of file From 4e117ead52e4a141621a4b37fd041a2236c8c08b Mon Sep 17 00:00:00 2001 From: foorschtbar Date: Tue, 19 Sep 2023 23:23:12 +0200 Subject: [PATCH 03/30] Updated README --- README.md | 866 +++++++++++++++++++++++++++--------------------------- 1 file changed, 435 insertions(+), 431 deletions(-) diff --git a/README.md b/README.md index e65ba8f..890053d 100644 --- a/README.md +++ b/README.md @@ -1,431 +1,435 @@ -![](https://raw.githubusercontent.com/o0shojo0o/ioBroker.pixelit/master/admin/pixelit.png) - -# PixelIt - -![](https://github.com/pixelit-project/PixelIt/actions/workflows/build-and-release.yml/badge.svg) - -The PixelIt is an ESP8266 / ESP32 (under construction) and WS2812B-LED based PixelArt display, controlled and fed via a JSON API. -Settings and small tests are possible via the web interface, -also a node-red node ([node-red-contrib-pixelit](https://flows.nodered.org/node/node-red-contrib-pixelit)) for the JSON API is available. - -If you want to get an impression of the WebUI, you can do that here in [Demo WebUi](https://pixelit-project.github.io/PixelIt/webui/). - -- [Documentation](https://pixelit-project.github.io/) -- [Blog](https://www.bastelbunker.de/pixel-it/) -- [PixelIt Web](https://pixelit.bastelbunker.de/PixelGallery) -- [GitHub Discussions (Forum) ![](https://img.shields.io/github/discussions/pixelit-project/PixelIt)](https://github.com/pixelit-project/PixelIt/discussions) -- [Telegram Channel ![](https://img.shields.io/endpoint?style=flat&url=https%3A%2F%2Frunkit.io%2Fdamiankrawczyk%2Ftelegram-badge%2Fbranches%2Fmaster%3Furl%3Dhttps%3A%2F%2Ft.me%2Fpixelitdisplay)](https://t.me/pixelitdisplay) -- [Discord Channel ![](https://img.shields.io/discord/1145731525996970025?logo=discord)](https://discord.gg/ERBSHWxB2S) - -## Contributors - -Thanks to these great people for supporting this project. - - - - - - - - - - - - - - - -
- - o0shojo0o -
- Dennis Rathjen -
-
- - foorschtbar -
- Fab!an -
-
- - miccgn -
- Miccgn -
-
- - pplucky -
- Pplucky -
-
- - fmunozs -
- Fernando Muñoz -
-
- - rozza-m -
- Rozza-m -
-
- - hermannbach -
- HBach -
-
- - d4rkd3v1l -
- Martin Straub -
-
- - hamster65 -
- Hamster65 -
-
- - rliegmann -
- Rliegmann -
-
- - -## Changelog - - - -### 2.3.2 (2023-09-16) - -- (foorschtbar) Added live preview (liveview) of the Matrix to WebUI -- (foorschtbar) Added uptime, size and last reset reason to WebUI -- (foorschtbar) Screens from test area are now displayed prioritized for 5 seconds -- (foorschtbar) Combine centerText with scrollText=auto [#96](https://github.com/pixelit-project/PixelIt/issues/96) -- (foorschtbar) Cleanup text drawing/scrolling code **[Breaking change: Text position is now mandatory and will not be shiffed if there is an icon!]** -- (foorschtbar) Prepearing support for different matrix sizes -- (o0shojo0o) Added native `Pixel Creator` to WebUI - -### 2.2.0 (2023-02-11) - -- (miccgn) Fix Show weekdays -- (miccgn) Fix probing onewire can break previos i2c communication -- (rliegmann) Bring ESP32 support back -- (foorschtbar) Removed support for ESP32. There are incompatibilities with the WiFi Manager lib and the maintenance effort to fix this is currently too high (PRs are welcome!) -- (foorschtbar) Swaped DFPlayer Mini TX and RX pins - Description in frontend and source code now fit together. **[Breaking change: No migration takes place! You need to swap the pins in your config!]** -- (foorschtbar) Support for NodeMCU v2 -- (d4rkd3v1l) any "clock" json parameters are now optional https://github.com/pixelit-project/PixelIt/pull/222 - -### 2.1.2 (2022-09-29) - -- (o0shojo0o) fix WebUi - -### 2.1.1 (2022-09-29) - -- (foorschtbar) added Play a sound file on boot of PixelIt 🔊 - -### 2.0.0 (2022-09-14) - -**!!! Breaking changes !!!** - -- (pplucky) fix Home Assistant MQTT discovery for buttons [more](https://github.com/pixelit-project/PixelIt/pull/209) -- (foorschtbar) readded support for tiled 4x 8x8 CJMCU Matrix in column major order -- (o0shojo0o) added new icons to UserMap -- (fmunozs) added proper "folder" icon and swap names with "file" -- (o0shojo0o) increase the timout for the wifi connection to 30 seconds - -### 1.2.0 (2022-09-03) - -- (o0shojo0o) added send Telemetry data - - Send telemetry data is enabled by default, but can be disabled at any time in the WebUI under Options. -- (o0shojo0o) added UserMap to WebUI -- (foorschtbar) search and display of new FW versions -- (foorschtbar) new boot animation :eyes: - -### 1.1.0 (2022-08-16) - -- (o0shojo0o) fix URLs in WebUi -- (o0shojo0o) added option to disable the weekdays on the clock over API / WebUi - -### 1.0.0 (2022-07-22) - -**!!! Breaking changes !!!** - -- (o0shojo0o) reworked the output of the buttons via API and MQTT to get the "press" and "release" event (press = true, release = false). Example: `{"buttons":{"rightButton":true}}` - -### 0.4.0 (2022-07-04) - -- (foorschtbar) added support for new "MicroMatrix by foorschtbar" [more](https://github.com/pixelit-project/PixelIt/pull/174) | [Repo](https://github.com/foorschtbar/Sk6805EC15-Matrix) :tada: -- (foorschtbar) fixed the Tiled 4x 8x8 CJMCU Matrix Type (its doesn't work before) -- (o0shojo0o) fixed option for non-flashing time separator over JSON (internal clock) - -### 0.3.20 (2022-05-31) - -- (pplucky) MQTT Discovery enhancements -- (o0shojo0o) update WebUi disallow decimals on 'Auto brightness' settings -- (o0shojo0o) extended WebUi for 'Wifi Reset' and 'Factory Reset' -- (o0shojo0o) added 'Wifi Reset' and 'Factory Reset' function for WebAPI and Socket -- (o0shojo0o) fix hexColor for bar and bars -- (rozza-m) added fat clock font [more](https://github.com/pixelit-project/PixelIt/pull/169) -- (pplucky) Improve MQTT discovery - -### 0.3.19 (2022-04-24) - -- (o0shojo0o) fix weekday is not lighting if week is starting with monday (internal clock) -- (o0shojo0o) extended WebUi for non-flashing time separator option -- (rozza-m) remove leading zero from hours when in 12h mode (internal clock) -- (rozza-m) provide option for non-flashing time separator (internal clock) - -### 0.3.18 (2022-04-04) - -- (o0shojo0o) added option to change the start of the week (internal clock) -- (o0shojo0o) added option to change date format (internal clock) -- (hamster65) increase AM2320 sensor delay from 600 to 800ms - -### 0.3.17 (2022-03-02) - -- (o0shojo0o) fixed wrong DST handling -- (hermannbach) added support for BMP280 (only tested on D1 mini.) -- (miccgn) memory optimization -- (miccgn) added MQTT discovery information in HomeAssistant style -- (miccgn) fix mqtt LWT -- (miccgn) increase interval between reconnect attempts -- (miccgn) added support for Max44009 lux sensor - -### 0.3.16 (2022-01-21) - -- (miccgn) offer Zigzag animation and random animation for Clock Auto Fallback -- (miccgn) added button actions for MP3 control -- (miccgn) rearrange and fix WebUI -- (miccgn) added support for local hardware buttons -- (miccgn) added LDR smoothing -- (miccgn) added support for BH1750 light sensor -- (miccgn) added ZigZagWipe, bitmapWipe and randomization for wipes -- (miccgn) fixed MP3Player -- (miccgn) added possibility to set GL55xx type and resistor value in settings -- (miccgn) added selectable pins for MP3Player and Sensors (ESP8266 only) -- (miccgn) optimization of read BME680 -- (miccgn) added multiple Bitmaps - -### 0.3.15 (2021-12-04) - -- (o0shojo0o) added offset options for gas sensor -- (miccgn) added [BME680](https://pixelit-project.github.io/hardware.html#bme680-sensor-upgrade-temperature-humidity-pressure-gas) support - -### 0.3.14 (2021-11-14) - -- (o0shojo0o) added delay for AM2320 sesnor -- (o0shojo0o) `Pixel Gallery` is now a part of the WebUi - -### 0.3.13 (2021-10-31) - -- (o0shojo0o) added option for auto fallback animation -- (o0shojo0o) fixed auto brightness overrides sleep mode -- (o0shojo0o) fixed clock auto fallback overrides sleep mode - -### 0.3.12 (2021-10-16) - -- (o0shojo0o) added option for DayLightSaving -- (o0shojo0o) added option for 12H / 24H - -### 0.3.11 (2021-10-14) - -- (o0shojo0o) added new WebUi on vue base - -### 0.3.10 (2021-09-14) - -- (o0shojo0o) fixed clock draw - -### 0.3.9 (2021-09-02) - -- (o0shojo0o) fixed auto brightness, to high values - -### 0.3.8 (2021-08-11) - -- (o0shojo0o) fixed [bitmapAnimation -> rubberbanding](https://pixelit-project.github.io/api.html#bitmap-animation) - -### 0.3.7 (2021-07-05) - -- (foorschtbar) added some UTF8 icons to [font](https://pixelit-project.github.io/api.html#text) -- (foorschtbar) rewirtten UTF8 mapper function -- (o0shojo0o) added offset options for sensors -- (o0shojo0o) added `Clock auto fallback` function -- (o0shojo0o) added config for `Clock auto fallback` function - -### 0.3.6 (2021-06-14) - -- (o0shojo0o) added API endpoint `/api/brightness` -- (o0shojo0o) added config for temperature (°C or °F) -- (foorschtbar) added support for BME280 -- (foorschtbar) moved most libs to common section - -### 0.3.5 (2021-05-26) - -- (o0shojo0o) extension of the API with the call setGpio -- (o0shojo0o) added download statistics to the update page - -### 0.3.4 (2021-05-20) - -- (foorschtbar) improved MQTT reconnect -- (o0shojo0o) support decimal number input for UTC -- (o0shojo0o) bugfix for Firefox -- (foorschtbar) added a customizable hostname -- (o0shojo0o) add update notification to dashboard -- (o0shojo0o) add GitHub link to dashboard -- (o0shojo0o) fix links in dashboard -- (o0shojo0o) transferred the other stuff from cdn to repo -- (foorschtbar) tweaked dashboard a little bit -- (foorschtbar) added a note field -- (foorschtbar) allow a Hostname as MQTT Server (Broker) -- (o0shojo0o) add dashboard.css and pixel.js to repo -- (foorschtbar) switches now have the proper mouse pointer - -### 0.3.3 (2021-05-18) - -- (o0shojo0o) add auto brightness options -- (o0shojo0o) add auto brightness - -### 0.3.2_beta (2021-05-18) - -- (o0shojo0o) add hexColor to [Clock](https://pixelit-project.github.io/api.html#clock), [Text](https://pixelit-project.github.io/api.html#text), [Bar](https://pixelit-project.github.io/api.html#bar) and [Bars](https://pixelit-project.github.io/api.html#bars) -- (o0shojo0o) fix wemos_d1_mini32 build -- [(xarnze)](https://github.com/xarnze/PixelIt/commit/a8f637930d6fac131c5ce175234aff0eca6b395e) show message on hotspot mode -- [(xarnze)](https://github.com/xarnze/PixelIt/commit/f6314351b0000c701c2243ce62895b37ff89afc2) added support for 4x 8x8 CJMCU 64 Matrix (Type 3) -- (o0shojo0o) reactivate for esp8266 builds getSketchSize -- (o0shojo0o) set mqtt setBufferSize to 8000 -- (o0shojo0o) add env for d1_mini -- (rliegmann) add some missing llibs -- (rliegmann) add some libs into .pio -- (rliegmann) Merge pull request #2 from rliegmann/feature/clockDefaultsToFS- -- (rliegmann) block out getSketchSize temporary -- (rliegmann) change some build options in pio -- (rliegmann) clock default settings, adjust MQTT buffer size, some typo -- (rliegmann) Merge pull request #1 from rliegmann/feature/cross-esp-platform -- (rliegmann) add ESP32 and ESP8266 libs -- (rliegmann) remove VisualStudio overhead + port to platformIO - -### 0.3.1 (2021-04-29) - -- (o0shojo0o) change MQTT_MAX_PACKET_SIZE from 4000 to 8000 -- (o0shojo0o) new versioning - -### 1912182240 (2019-12-20) - -- (o0shojo0o) Added support for DFPlayer Mini MP3 Player - -### 1912092038 (2019-12-08) - -- (o0shojo0o) Bugfix of the JSON from the API response -- (o0shojo0o) Bugfix memory leak -- (o0shojo0o) Added special characters to font - -### 1910272052 (2019-10-27) - -- (o0shojo0o) Support for DHT22 added - -### 1910221857 (2019-10-22) - -- (o0shojo0o) Bugfix of the JSON decoder logic (thanks to @pixelthis ) - -### 1909242249 (2019-09-25) - -- (o0shojo0o) There was a change in the send interval (via MQTT and Websocket) of the light sensor and the MatrixInfo - - The light sensor sends a maximum of once per second when the lux value changes. - - The MatrixInfo transmits once every 3 seconds when a value is changed. -- (o0shojo0o) Now the protocol websocket on port 81 has been added. -- (o0shojo0o) And the biggest innovation is the webinterface which is now available on PixelIt. - -### 196232032 (2019-06-23) - -- (o0shojo0o) Added Wifimanager configuration timeout (180 seconds) - -### 195161726 (2019-05-16) - -- (o0shojo0o) Added option to disable the boot screen - -### 194241742 (2019-04-24) - -- (o0shojo0o) Add more option to set Matrix Temp Correction - -### 19422209 (2019-04-23) - -- (o0shojo0o) Add new option to set Matrix Temp Correction - -### 1942197 (2019-04-02) - -- (o0shojo0o) Bugfix animation handling - -### 193312043 (2019-03-31) - -- (o0shojo0o) Bugfix DSToffset - -### 193272138 (2019-03-27) - -- (o0shojo0o) Bugfix NTP TimeZone will now be interpreted correctly -- (o0shojo0o) Add new option to set NTP-Server - -### 19324816 (2019-03-24) - -- (o0shojo0o) Bugfix bitmap handling on scrolltext - -### 193231249 (2019-03-23) - -- (o0shojo0o) Bugfix Erroneous representation of full screen bitmap - -### 193152351 (2019-03-16) - -- (o0shojo0o) Bugfix bitmap flickering on scrolling text - -### 193151540 (2019-03-15) - -- (o0shojo0o) Bugfix, there were problems with the animations in combination with the fade transition effect, so they were not displayed correctly. - -### 193111919 (2019-03-11) - -- (o0shojo0o) Bugfix Clock Color: If red was set to 0, the color was always ignored. - -### 1938019 (2019-03-08) - -- (o0shojo0o) add optional BitmapAnimation param: limitLoops - -### 19362326 (2019-03-06) - -- (o0shojo0o) Bugfix BitmapAnimation: First frame was displayed too short. - -### 19362115 (2019-03-06) - -- (o0shojo0o) Bugfix BitmapAnimation: Animation was displayed a bit too late when a text was submitted with - -### 19352221 (2019-03-05) - -- (o0shojo0o) add optional Internal Clock param: withSeconds -- (o0shojo0o) add config param: scrollTextDefaultDelay -- (o0shojo0o) add optional Text param: scrollTextDelay -- (o0shojo0o) add optional BitmapAnimation param: rubberbanding - -### 19342040 (2019-03-04) - -- (o0shojo0o) replace umlauts -- (o0shojo0o) add support for "Pixel Bitmap Creator" Live Preview (beta) - -### 19331810 (2019-03-03) - -- (o0shojo0o) Bugfixes MQTT was always enabled -- (o0shojo0o) add MQTT user & password -- (o0shojo0o) add "Text-Color" for internal Clock -- (o0shojo0o) add autoreboot after save config - -### 19331112 (2019-03-03) - -- (o0shojo0o) add option to set Matrix Type at runtime (need reboot) - -### 192272344 (2019-02-27) - -- (o0shojo0o) add MQTT Support -- (o0shojo0o) add animated 8x8 icons (max. 6 frames) +![](https://raw.githubusercontent.com/o0shojo0o/ioBroker.pixelit/master/admin/pixelit.png) + +# PixelIt + +![](https://github.com/pixelit-project/PixelIt/actions/workflows/build-and-release.yml/badge.svg) + +The PixelIt is an ESP8266 / ESP32 (under construction) and WS2812B-LED based PixelArt display, controlled and fed via a JSON API. +Settings and small tests are possible via the web interface, +also a node-red node ([node-red-contrib-pixelit](https://flows.nodered.org/node/node-red-contrib-pixelit)) for the JSON API is available. + +If you want to get an impression of the WebUI, you can do that here in [Demo WebUi](https://pixelit-project.github.io/PixelIt/webui/). + +- [Documentation](https://pixelit-project.github.io/) +- [Blog](https://www.bastelbunker.de/pixel-it/) +- [PixelIt Web](https://pixelit.bastelbunker.de/PixelGallery) +- [GitHub Discussions (Forum) ![](https://img.shields.io/github/discussions/pixelit-project/PixelIt)](https://github.com/pixelit-project/PixelIt/discussions) +- [Telegram Channel ![](https://img.shields.io/endpoint?style=flat&url=https%3A%2F%2Frunkit.io%2Fdamiankrawczyk%2Ftelegram-badge%2Fbranches%2Fmaster%3Furl%3Dhttps%3A%2F%2Ft.me%2Fpixelitdisplay)](https://t.me/pixelitdisplay) +- [Discord Channel ![](https://img.shields.io/discord/1145731525996970025?logo=discord)](https://discord.gg/ERBSHWxB2S) + +## Contributors + +Thanks to these great people for supporting this project. + + + + + + + + + + + + + + + +
+ + o0shojo0o +
+ Dennis Rathjen +
+
+ + foorschtbar +
+ Fab!an +
+
+ + miccgn +
+ Miccgn +
+
+ + pplucky +
+ Pplucky +
+
+ + fmunozs +
+ Fernando Muñoz +
+
+ + rozza-m +
+ Rozza-m +
+
+ + hermannbach +
+ HBach +
+
+ + d4rkd3v1l +
+ Martin Straub +
+
+ + hamster65 +
+ Hamster65 +
+
+ + rliegmann +
+ Rliegmann +
+
+ + +## Changelog + + + +### 2.4.0 ** WORK IN PROGRESS ** + +- (foorschtbar) Added support for Ulanzi TC001 Desktop Clock + +### 2.3.2 (2023-09-16) + +- (foorschtbar) Added live preview (liveview) of the Matrix to WebUI +- (foorschtbar) Added uptime, size and last reset reason to WebUI +- (foorschtbar) Screens from test area are now displayed prioritized for 5 seconds +- (foorschtbar) Combine centerText with scrollText=auto [#96](https://github.com/pixelit-project/PixelIt/issues/96) +- (foorschtbar) Cleanup text drawing/scrolling code **[Breaking change: Text position is now mandatory and will not be shiffed if there is an icon!]** +- (foorschtbar) Prepearing support for different matrix sizes +- (o0shojo0o) Added native `Pixel Creator` to WebUI + +### 2.2.0 (2023-02-11) + +- (miccgn) Fix Show weekdays +- (miccgn) Fix probing onewire can break previos i2c communication +- (rliegmann) Bring ESP32 support back +- (foorschtbar) Removed support for ESP32. There are incompatibilities with the WiFi Manager lib and the maintenance effort to fix this is currently too high (PRs are welcome!) +- (foorschtbar) Swaped DFPlayer Mini TX and RX pins - Description in frontend and source code now fit together. **[Breaking change: No migration takes place! You need to swap the pins in your config!]** +- (foorschtbar) Support for NodeMCU v2 +- (d4rkd3v1l) any "clock" json parameters are now optional https://github.com/pixelit-project/PixelIt/pull/222 + +### 2.1.2 (2022-09-29) + +- (o0shojo0o) fix WebUi + +### 2.1.1 (2022-09-29) + +- (foorschtbar) added Play a sound file on boot of PixelIt 🔊 + +### 2.0.0 (2022-09-14) + +**!!! Breaking changes !!!** + +- (pplucky) fix Home Assistant MQTT discovery for buttons [more](https://github.com/pixelit-project/PixelIt/pull/209) +- (foorschtbar) readded support for tiled 4x 8x8 CJMCU Matrix in column major order +- (o0shojo0o) added new icons to UserMap +- (fmunozs) added proper "folder" icon and swap names with "file" +- (o0shojo0o) increase the timout for the wifi connection to 30 seconds + +### 1.2.0 (2022-09-03) + +- (o0shojo0o) added send Telemetry data + - Send telemetry data is enabled by default, but can be disabled at any time in the WebUI under Options. +- (o0shojo0o) added UserMap to WebUI +- (foorschtbar) search and display of new FW versions +- (foorschtbar) new boot animation :eyes: + +### 1.1.0 (2022-08-16) + +- (o0shojo0o) fix URLs in WebUi +- (o0shojo0o) added option to disable the weekdays on the clock over API / WebUi + +### 1.0.0 (2022-07-22) + +**!!! Breaking changes !!!** + +- (o0shojo0o) reworked the output of the buttons via API and MQTT to get the "press" and "release" event (press = true, release = false). Example: `{"buttons":{"rightButton":true}}` + +### 0.4.0 (2022-07-04) + +- (foorschtbar) added support for new "MicroMatrix by foorschtbar" [more](https://github.com/pixelit-project/PixelIt/pull/174) | [Repo](https://github.com/foorschtbar/Sk6805EC15-Matrix) :tada: +- (foorschtbar) fixed the Tiled 4x 8x8 CJMCU Matrix Type (its doesn't work before) +- (o0shojo0o) fixed option for non-flashing time separator over JSON (internal clock) + +### 0.3.20 (2022-05-31) + +- (pplucky) MQTT Discovery enhancements +- (o0shojo0o) update WebUi disallow decimals on 'Auto brightness' settings +- (o0shojo0o) extended WebUi for 'Wifi Reset' and 'Factory Reset' +- (o0shojo0o) added 'Wifi Reset' and 'Factory Reset' function for WebAPI and Socket +- (o0shojo0o) fix hexColor for bar and bars +- (rozza-m) added fat clock font [more](https://github.com/pixelit-project/PixelIt/pull/169) +- (pplucky) Improve MQTT discovery + +### 0.3.19 (2022-04-24) + +- (o0shojo0o) fix weekday is not lighting if week is starting with monday (internal clock) +- (o0shojo0o) extended WebUi for non-flashing time separator option +- (rozza-m) remove leading zero from hours when in 12h mode (internal clock) +- (rozza-m) provide option for non-flashing time separator (internal clock) + +### 0.3.18 (2022-04-04) + +- (o0shojo0o) added option to change the start of the week (internal clock) +- (o0shojo0o) added option to change date format (internal clock) +- (hamster65) increase AM2320 sensor delay from 600 to 800ms + +### 0.3.17 (2022-03-02) + +- (o0shojo0o) fixed wrong DST handling +- (hermannbach) added support for BMP280 (only tested on D1 mini.) +- (miccgn) memory optimization +- (miccgn) added MQTT discovery information in HomeAssistant style +- (miccgn) fix mqtt LWT +- (miccgn) increase interval between reconnect attempts +- (miccgn) added support for Max44009 lux sensor + +### 0.3.16 (2022-01-21) + +- (miccgn) offer Zigzag animation and random animation for Clock Auto Fallback +- (miccgn) added button actions for MP3 control +- (miccgn) rearrange and fix WebUI +- (miccgn) added support for local hardware buttons +- (miccgn) added LDR smoothing +- (miccgn) added support for BH1750 light sensor +- (miccgn) added ZigZagWipe, bitmapWipe and randomization for wipes +- (miccgn) fixed MP3Player +- (miccgn) added possibility to set GL55xx type and resistor value in settings +- (miccgn) added selectable pins for MP3Player and Sensors (ESP8266 only) +- (miccgn) optimization of read BME680 +- (miccgn) added multiple Bitmaps + +### 0.3.15 (2021-12-04) + +- (o0shojo0o) added offset options for gas sensor +- (miccgn) added [BME680](https://pixelit-project.github.io/hardware.html#bme680-sensor-upgrade-temperature-humidity-pressure-gas) support + +### 0.3.14 (2021-11-14) + +- (o0shojo0o) added delay for AM2320 sesnor +- (o0shojo0o) `Pixel Gallery` is now a part of the WebUi + +### 0.3.13 (2021-10-31) + +- (o0shojo0o) added option for auto fallback animation +- (o0shojo0o) fixed auto brightness overrides sleep mode +- (o0shojo0o) fixed clock auto fallback overrides sleep mode + +### 0.3.12 (2021-10-16) + +- (o0shojo0o) added option for DayLightSaving +- (o0shojo0o) added option for 12H / 24H + +### 0.3.11 (2021-10-14) + +- (o0shojo0o) added new WebUi on vue base + +### 0.3.10 (2021-09-14) + +- (o0shojo0o) fixed clock draw + +### 0.3.9 (2021-09-02) + +- (o0shojo0o) fixed auto brightness, to high values + +### 0.3.8 (2021-08-11) + +- (o0shojo0o) fixed [bitmapAnimation -> rubberbanding](https://pixelit-project.github.io/api.html#bitmap-animation) + +### 0.3.7 (2021-07-05) + +- (foorschtbar) added some UTF8 icons to [font](https://pixelit-project.github.io/api.html#text) +- (foorschtbar) rewirtten UTF8 mapper function +- (o0shojo0o) added offset options for sensors +- (o0shojo0o) added `Clock auto fallback` function +- (o0shojo0o) added config for `Clock auto fallback` function + +### 0.3.6 (2021-06-14) + +- (o0shojo0o) added API endpoint `/api/brightness` +- (o0shojo0o) added config for temperature (°C or °F) +- (foorschtbar) added support for BME280 +- (foorschtbar) moved most libs to common section + +### 0.3.5 (2021-05-26) + +- (o0shojo0o) extension of the API with the call setGpio +- (o0shojo0o) added download statistics to the update page + +### 0.3.4 (2021-05-20) + +- (foorschtbar) improved MQTT reconnect +- (o0shojo0o) support decimal number input for UTC +- (o0shojo0o) bugfix for Firefox +- (foorschtbar) added a customizable hostname +- (o0shojo0o) add update notification to dashboard +- (o0shojo0o) add GitHub link to dashboard +- (o0shojo0o) fix links in dashboard +- (o0shojo0o) transferred the other stuff from cdn to repo +- (foorschtbar) tweaked dashboard a little bit +- (foorschtbar) added a note field +- (foorschtbar) allow a Hostname as MQTT Server (Broker) +- (o0shojo0o) add dashboard.css and pixel.js to repo +- (foorschtbar) switches now have the proper mouse pointer + +### 0.3.3 (2021-05-18) + +- (o0shojo0o) add auto brightness options +- (o0shojo0o) add auto brightness + +### 0.3.2_beta (2021-05-18) + +- (o0shojo0o) add hexColor to [Clock](https://pixelit-project.github.io/api.html#clock), [Text](https://pixelit-project.github.io/api.html#text), [Bar](https://pixelit-project.github.io/api.html#bar) and [Bars](https://pixelit-project.github.io/api.html#bars) +- (o0shojo0o) fix wemos_d1_mini32 build +- [(xarnze)](https://github.com/xarnze/PixelIt/commit/a8f637930d6fac131c5ce175234aff0eca6b395e) show message on hotspot mode +- [(xarnze)](https://github.com/xarnze/PixelIt/commit/f6314351b0000c701c2243ce62895b37ff89afc2) added support for 4x 8x8 CJMCU 64 Matrix (Type 3) +- (o0shojo0o) reactivate for esp8266 builds getSketchSize +- (o0shojo0o) set mqtt setBufferSize to 8000 +- (o0shojo0o) add env for d1_mini +- (rliegmann) add some missing llibs +- (rliegmann) add some libs into .pio +- (rliegmann) Merge pull request #2 from rliegmann/feature/clockDefaultsToFS- +- (rliegmann) block out getSketchSize temporary +- (rliegmann) change some build options in pio +- (rliegmann) clock default settings, adjust MQTT buffer size, some typo +- (rliegmann) Merge pull request #1 from rliegmann/feature/cross-esp-platform +- (rliegmann) add ESP32 and ESP8266 libs +- (rliegmann) remove VisualStudio overhead + port to platformIO + +### 0.3.1 (2021-04-29) + +- (o0shojo0o) change MQTT_MAX_PACKET_SIZE from 4000 to 8000 +- (o0shojo0o) new versioning + +### 1912182240 (2019-12-20) + +- (o0shojo0o) Added support for DFPlayer Mini MP3 Player + +### 1912092038 (2019-12-08) + +- (o0shojo0o) Bugfix of the JSON from the API response +- (o0shojo0o) Bugfix memory leak +- (o0shojo0o) Added special characters to font + +### 1910272052 (2019-10-27) + +- (o0shojo0o) Support for DHT22 added + +### 1910221857 (2019-10-22) + +- (o0shojo0o) Bugfix of the JSON decoder logic (thanks to @pixelthis ) + +### 1909242249 (2019-09-25) + +- (o0shojo0o) There was a change in the send interval (via MQTT and Websocket) of the light sensor and the MatrixInfo + - The light sensor sends a maximum of once per second when the lux value changes. + - The MatrixInfo transmits once every 3 seconds when a value is changed. +- (o0shojo0o) Now the protocol websocket on port 81 has been added. +- (o0shojo0o) And the biggest innovation is the webinterface which is now available on PixelIt. + +### 196232032 (2019-06-23) + +- (o0shojo0o) Added Wifimanager configuration timeout (180 seconds) + +### 195161726 (2019-05-16) + +- (o0shojo0o) Added option to disable the boot screen + +### 194241742 (2019-04-24) + +- (o0shojo0o) Add more option to set Matrix Temp Correction + +### 19422209 (2019-04-23) + +- (o0shojo0o) Add new option to set Matrix Temp Correction + +### 1942197 (2019-04-02) + +- (o0shojo0o) Bugfix animation handling + +### 193312043 (2019-03-31) + +- (o0shojo0o) Bugfix DSToffset + +### 193272138 (2019-03-27) + +- (o0shojo0o) Bugfix NTP TimeZone will now be interpreted correctly +- (o0shojo0o) Add new option to set NTP-Server + +### 19324816 (2019-03-24) + +- (o0shojo0o) Bugfix bitmap handling on scrolltext + +### 193231249 (2019-03-23) + +- (o0shojo0o) Bugfix Erroneous representation of full screen bitmap + +### 193152351 (2019-03-16) + +- (o0shojo0o) Bugfix bitmap flickering on scrolling text + +### 193151540 (2019-03-15) + +- (o0shojo0o) Bugfix, there were problems with the animations in combination with the fade transition effect, so they were not displayed correctly. + +### 193111919 (2019-03-11) + +- (o0shojo0o) Bugfix Clock Color: If red was set to 0, the color was always ignored. + +### 1938019 (2019-03-08) + +- (o0shojo0o) add optional BitmapAnimation param: limitLoops + +### 19362326 (2019-03-06) + +- (o0shojo0o) Bugfix BitmapAnimation: First frame was displayed too short. + +### 19362115 (2019-03-06) + +- (o0shojo0o) Bugfix BitmapAnimation: Animation was displayed a bit too late when a text was submitted with + +### 19352221 (2019-03-05) + +- (o0shojo0o) add optional Internal Clock param: withSeconds +- (o0shojo0o) add config param: scrollTextDefaultDelay +- (o0shojo0o) add optional Text param: scrollTextDelay +- (o0shojo0o) add optional BitmapAnimation param: rubberbanding + +### 19342040 (2019-03-04) + +- (o0shojo0o) replace umlauts +- (o0shojo0o) add support for "Pixel Bitmap Creator" Live Preview (beta) + +### 19331810 (2019-03-03) + +- (o0shojo0o) Bugfixes MQTT was always enabled +- (o0shojo0o) add MQTT user & password +- (o0shojo0o) add "Text-Color" for internal Clock +- (o0shojo0o) add autoreboot after save config + +### 19331112 (2019-03-03) + +- (o0shojo0o) add option to set Matrix Type at runtime (need reboot) + +### 192272344 (2019-02-27) + +- (o0shojo0o) add MQTT Support +- (o0shojo0o) add animated 8x8 icons (max. 6 frames) From 4f55d124e90cdc6f6ab3cfa3d2b49f558e7f43f5 Mon Sep 17 00:00:00 2001 From: foorschtbar Date: Thu, 21 Sep 2023 22:48:06 +0200 Subject: [PATCH 04/30] WIP --- platformio.ini | 129 +++++++++++++++++++++++++++++++++++++++--------- src/PixelIt.ino | 40 +++++++++++---- 2 files changed, 136 insertions(+), 33 deletions(-) diff --git a/platformio.ini b/platformio.ini index 4f797f0..7ff1a20 100644 --- a/platformio.ini +++ b/platformio.ini @@ -35,28 +35,39 @@ lib_deps = bakercp/CRC32 @ 2.0.0 [env:wemos_d1_mini32] - platform = espressif32 - board = wemos_d1_mini32 - framework = ${common.framework} - board_build.f_cpu = 80000000L - monitor_speed = ${common.monitor_speed} - extra_scripts = ${common.extra_scripts} - upload_speed = ${common.upload_speed} - build_flags = ${common.build_flags} - platform_packages = +platform = espressif32 +board = wemos_d1_mini32 +framework = ${common.framework} +board_build.f_cpu = 80000000L +monitor_speed = ${common.monitor_speed} +extra_scripts = ${common.extra_scripts} +upload_speed = ${common.upload_speed} +build_flags = + ${common.build_flags} + -DLDR_PIN=A0 + -DMATRIX_PIN=27 + -DDEFAULT_PIN_SCL="Pin_D1" + -DDEFAULT_PIN_SDA="Pin_D3" + -DDEFAULT_PIN_DFPRX="Pin_D7" + -DDEFAULT_PIN_DFPTX="Pin_D8" + -DDEFAULT_PIN_ONEWIRE="Pin_D1" + -DDEFAULT_MATRIX_TYPE=1 + -DDEFAULT_LDR=GL5516 + -DVBAT_PIN=0 +platform_packages = framework-arduinoespressif32 @ https://github.com/espressif/arduino-esp32.git toolchain-xtensa32@~2.80400.0 - lib_deps = - ${common.lib_deps} - WiFiManager = https://github.com/tzapu/WiFiManager.git#v2.0.15-rc.1 - plerup/EspSoftwareSerial@^6.11.4 - fastled/FastLED@^3.5.0 - adafruit/Adafruit BME680 Library@^2.0.1 - adafruit/Adafruit BMP280 Library@^2.6.1 - claws/BH1750@^1.2.0 - robtillaart/Max44009@^0.5.2 - arduino-libraries/ArduinoHttpClient@^0.4.0 - Hash = https://github.com/bbx10/Hash_tng.git +lib_deps = + ${common.lib_deps} + WiFiManager = https://github.com/tzapu/WiFiManager.git#v2.0.15-rc.1 + plerup/EspSoftwareSerial@^6.11.4 + fastled/FastLED@^3.5.0 + adafruit/Adafruit BME680 Library@^2.0.1 + adafruit/Adafruit BMP280 Library@^2.6.1 + claws/BH1750@^1.2.0 + robtillaart/Max44009@^0.5.2 + arduino-libraries/ArduinoHttpClient@^0.4.0 + Hash = https://github.com/bbx10/Hash_tng.git [env:ESP8266] platform = espressif8266@2.6.3 @@ -66,7 +77,18 @@ board_build.filesystem = littlefs monitor_speed = ${common.monitor_speed} extra_scripts = ${common.extra_scripts} upload_speed = ${common.upload_speed} -build_flags = ${common.build_flags} +build_flags = + ${common.build_flags} + -DLDR_PIN=A0 + -DMATRIX_PIN=D2 + -DDEFAULT_PIN_SCL="Pin_D1" + -DDEFAULT_PIN_SDA="Pin_D3" + -DDEFAULT_PIN_DFPRX="Pin_D7" + -DDEFAULT_PIN_DFPTX="Pin_D8" + -DDEFAULT_PIN_ONEWIRE="Pin_D1" + -DDEFAULT_MATRIX_TYPE=1 + -DDEFAULT_LDR=GL5516 + -DVBAT_PIN=0 lib_deps = ${common.lib_deps} tzapu/WiFiManager@^0.16.0 @@ -86,7 +108,18 @@ board_build.filesystem = littlefs monitor_speed = ${common.monitor_speed} extra_scripts = ${common.extra_scripts} upload_speed = ${common.upload_speed} -build_flags = ${common.build_flags} +build_flags = + ${common.build_flags} + -DLDR_PIN=A0 + -DMATRIX_PIN=D2 + -DDEFAULT_PIN_SCL="Pin_D1" + -DDEFAULT_PIN_SDA="Pin_D3" + -DDEFAULT_PIN_DFPRX="Pin_D7" + -DDEFAULT_PIN_DFPTX="Pin_D8" + -DDEFAULT_PIN_ONEWIRE="Pin_D1" + -DDEFAULT_MATRIX_TYPE=1 + -DDEFAULT_LDR=GL5516 + -DVBAT_PIN=0 lib_deps = ${common.lib_deps} tzapu/WiFiManager@^0.16.0 @@ -105,7 +138,18 @@ board_build.filesystem = littlefs monitor_speed = ${common.monitor_speed} extra_scripts = ${common.extra_scripts} upload_speed = ${common.upload_speed} -build_flags = ${common.build_flags} +build_flags = + ${common.build_flags} + -DLDR_PIN=A0 + -DMATRIX_PIN=D2 + -DDEFAULT_PIN_SCL="Pin_D1" + -DDEFAULT_PIN_SDA="Pin_D3" + -DDEFAULT_PIN_DFPRX="Pin_D7" + -DDEFAULT_PIN_DFPTX="Pin_D8" + -DDEFAULT_PIN_ONEWIRE="Pin_D1" + -DDEFAULT_MATRIX_TYPE=1 + -DDEFAULT_LDR=GL5516 + -DVBAT_PIN=0 lib_deps = ${common.lib_deps} tzapu/WiFiManager@^0.16.0 @@ -115,3 +159,42 @@ lib_deps = robtillaart/Max44009@^0.5.2 arduino-libraries/ArduinoHttpClient@^0.4.0 mr-glt/SHA-1 Hash@^1.1.0 + +[env:Ulanzi] +platform = espressif32 +board = esp32dev +framework = ${common.framework} +board_build.f_cpu = 80000000L +monitor_speed = ${common.monitor_speed} +extra_scripts = ${common.extra_scripts} +upload_speed = ${common.upload_speed} +platform_packages = + framework-arduinoespressif32 @ https://github.com/espressif/arduino-esp32.git + toolchain-xtensa32@~2.80400.0 +build_flags = + ${common.build_flags} + -DLDR_PIN=A7 + -DMATRIX_PIN=32 + -DULANZI + -DVBAT_PIN=GPIO_NUM_34 + -DDEFAULT_PIN_SCL=GPIO_NUM_22 + -DDEFAULT_PIN_SDA=GPIO_NUM_21 + -DDEFAULT_PIN_DFPRX=SPI_CLK_GPIO_NUM + -DDEFAULT_PIN_DFPTX=SPI_CS0_GPIO_NUM + -DDEFAULT_PIN_ONEWIRE=GPIO_NUM_22 + -DDEFAULT_MATRIX_TYPE=2 + -DDEFAULT_LDR=GL5516 + -DMIN_BATTERY=475 + -DMAX_BATTERY=665 +lib_deps = + ${common.lib_deps} + WiFiManager = https://github.com/tzapu/WiFiManager.git#v2.0.15-rc.1 + fastled/FastLED@^3.5.0 + arduino-libraries/ArduinoHttpClient@^0.4.0 + adafruit/Adafruit SHT31 Library @ 2.2.0 + Hash = https://github.com/bbx10/Hash_tng.git + plerup/EspSoftwareSerial@^6.11.4 + adafruit/Adafruit BME680 Library@^2.0.1 + adafruit/Adafruit BMP280 Library@^2.6.1 + claws/BH1750@^1.2.0 + robtillaart/Max44009@^0.5.2 \ No newline at end of file diff --git a/src/PixelIt.ino b/src/PixelIt.ino index 1ab984a..17239a6 100644 --- a/src/PixelIt.ino +++ b/src/PixelIt.ino @@ -93,7 +93,11 @@ String SDAPin = STR(DEFAULT_PIN_SDA); String ldrDevice = STR(DEFAULT_LDR); unsigned long ldrPulldown = 10000; // 10k pulldown-resistor unsigned int ldrSmoothing = 0; -float batteryLevelPct = 0; + +// Bettery stuff +float batteryLevel = 0; +unsigned long batteryLevelPrevMillis = 0; +const int BATTERY_LEVEL_INTERVAL = 30 * 1000; // Telemetry API #define TELEMETRY_SERVER_HOST "pixelit.bastelbunker.de" @@ -363,16 +367,26 @@ String ResetReason() void getBatteryVoltage() { - batteryLevelPct = map(analogRead(VBAT_PIN), 510, 660, 0, 100); - if (batteryLevelPct >= 100) + uint16_t value = 0; + uint8_t numReadings = 5; + + for (uint8_t i = 0; i < numReadings; i++) + { + value = value + analogRead(VBAT_PIN); + + // 1ms pause adds more stability between reads. + delay(1); + } + + batteryLevel = map(value / numReadings, MIN_BATTERY, MAX_BATTERY, 0, 100); + if (batteryLevel >= 100) { - batteryLevelPct = 100; + batteryLevel = 100; } - if (batteryLevelPct <= 0) + if (batteryLevel <= 0) { - batteryLevelPct = 1; + batteryLevel = 1; } - String strBV = String(batteryLevelPct, 0) + " %"; } void SetCurrentMatrixBrightness(float newBrightness) @@ -1811,8 +1825,7 @@ String GetSensor() if (VBAT_PIN > 0) { - getBatteryVoltage(); - root["battery"] = batteryLevelPct; + root["battery"] = batteryLevel; } else { @@ -3008,7 +3021,7 @@ void ShowBatteryScreen() getBatteryVoltage(); matrix->clear(); DrawSingleBitmap(root["bitmap"]); - DrawTextHelper(String(batteryLevelPct, 0) + "%", false, true, false, false, false, 255, 255, 255, 9, 1); + DrawTextHelper(String(batteryLevel, 0) + "%", false, true, false, false, false, 255, 255, 255, 9, 1); matrix->show(); delay(1000); } @@ -3629,6 +3642,13 @@ void loop() server.handleClient(); webSocket.loop(); + // Update Battery level + if (millis() - batteryLevelPrevMillis >= BATTERY_LEVEL_INTERVAL) + { + batteryLevelPrevMillis = millis(); + getBatteryVoltage(); + } + // Reset GPIO based on the array, as far as something is present in the array. for (int i = 0; i < SET_GPIO_SIZE; i++) { From f55651ff8ad2ebb2deab15fee6e7fe09af39b5f3 Mon Sep 17 00:00:00 2001 From: Florian Date: Sat, 30 Sep 2023 23:05:15 +0200 Subject: [PATCH 05/30] Ulanzi: Add Ulanzi support and fix environment problems --- platformio.ini | 8 +++++++- src/PixelIt.ino | 16 ++++++++++++---- 2 files changed, 19 insertions(+), 5 deletions(-) diff --git a/platformio.ini b/platformio.ini index 7ff1a20..15422a5 100644 --- a/platformio.ini +++ b/platformio.ini @@ -33,6 +33,7 @@ lib_deps = TimeLib = https://github.com/PaulStoffregen/Time.git marcmerlin/FastLED NeoMatrix@^1.2 bakercp/CRC32 @ 2.0.0 + adafruit/Adafruit SHT31 Library@^2.2.2 [env:wemos_d1_mini32] platform = espressif32 @@ -68,6 +69,7 @@ lib_deps = robtillaart/Max44009@^0.5.2 arduino-libraries/ArduinoHttpClient@^0.4.0 Hash = https://github.com/bbx10/Hash_tng.git + adafruit/Adafruit SHT31 Library@^2.2.2 [env:ESP8266] platform = espressif8266@2.6.3 @@ -98,6 +100,7 @@ lib_deps = robtillaart/Max44009@^0.5.2 arduino-libraries/ArduinoHttpClient@^0.4.0 mr-glt/SHA-1 Hash@^1.1.0 + adafruit/Adafruit SHT31 Library@^2.2.2 [env:d1_mini] platform = espressif8266@2.6.3 @@ -129,6 +132,7 @@ lib_deps = robtillaart/Max44009@^0.5.2 arduino-libraries/ArduinoHttpClient@^0.4.0 mr-glt/SHA-1 Hash@^1.1.0 + adafruit/Adafruit SHT31 Library@^2.2.2 [env:nodemcuv2] platform = espressif8266@2.6.3 @@ -159,6 +163,7 @@ lib_deps = robtillaart/Max44009@^0.5.2 arduino-libraries/ArduinoHttpClient@^0.4.0 mr-glt/SHA-1 Hash@^1.1.0 + adafruit/Adafruit SHT31 Library@^2.2.2 [env:Ulanzi] platform = espressif32 @@ -197,4 +202,5 @@ lib_deps = adafruit/Adafruit BME680 Library@^2.0.1 adafruit/Adafruit BMP280 Library@^2.6.1 claws/BH1750@^1.2.0 - robtillaart/Max44009@^0.5.2 \ No newline at end of file + robtillaart/Max44009@^0.5.2 + adafruit/Adafruit SHT31 Library@^2.2.2 \ No newline at end of file diff --git a/src/PixelIt.ino b/src/PixelIt.ino index 17239a6..0f38bef 100644 --- a/src/PixelIt.ino +++ b/src/PixelIt.ino @@ -94,11 +94,19 @@ String ldrDevice = STR(DEFAULT_LDR); unsigned long ldrPulldown = 10000; // 10k pulldown-resistor unsigned int ldrSmoothing = 0; -// Bettery stuff +// Battery stuff float batteryLevel = 0; unsigned long batteryLevelPrevMillis = 0; const int BATTERY_LEVEL_INTERVAL = 30 * 1000; +#ifndef MIN_BATTERY +#define MIN_BATTERY 0 +#endif + +#ifndef MAX_BATTERY +#define MAX_BATTERY 100 +#endif + // Telemetry API #define TELEMETRY_SERVER_HOST "pixelit.bastelbunker.de" #define TELEMETRY_SERVER_PATH "/api/telemetry" @@ -138,7 +146,7 @@ enum btnActions String btnPin[] = {"GPIO_NUM_26", "GPIO_NUM_27", "GPIO_NUM_14"}; // UlanziTC001 workaround to tweak WebUI bool btnEnabled[] = {true, true, true}; btnActions btnAction[] = {btnAction_DoNothing, btnAction_ToggleSleepMode, btnAction_GotoClock}; -#elif +#else String btnPin[] = {"Pin_D0", "Pin_D4", "Pin_D5"}; bool btnEnabled[] = {false, false, false}; btnActions btnAction[] = {btnAction_ToggleSleepMode, btnAction_GotoClock, btnAction_DoNothing}; @@ -377,7 +385,7 @@ void getBatteryVoltage() // 1ms pause adds more stability between reads. delay(1); } - + batteryLevel = map(value / numReadings, MIN_BATTERY, MAX_BATTERY, 0, 100); if (batteryLevel >= 100) { @@ -3304,7 +3312,7 @@ void setup() // Mounting FileSystem Serial.println(F("Mounting file system...")); #if defined(ESP8266) - if (LittleFS.begin(true)) + if (LittleFS.begin()) #elif defined(ESP32) if (SPIFFS.begin(true)) #endif From 2345c03c24d5e6ae366df91e7f6d6612f91a4489 Mon Sep 17 00:00:00 2001 From: foorschtbar Date: Fri, 6 Oct 2023 21:48:07 +0200 Subject: [PATCH 06/30] Fixes #259 --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 93e8cd1..9f834c4 100644 --- a/README.md +++ b/README.md @@ -109,7 +109,7 @@ Thanks to these great people for supporting this project. -### 2.4.0 ** WORK IN PROGRESS ** +### 2.4.0 **WORK IN PROGRESS** - (foorschtbar) Native support for [Ulanzi TC001 Pixel Clock](https://www.ulanzi.com/products/ulanzi-pixel-smart-clock-2882?aff=1181)\* (**Beta**, see [Releases](https://github.com/pixelit-project/PixelIt/releases)) :tada: - (foorschtbar) Display `zZz` on the matrix when the device going to sleep From 872cb738130d6218746f4ea8c6bdad1eb017ed56 Mon Sep 17 00:00:00 2001 From: foorschtbar Date: Fri, 6 Oct 2023 22:16:31 +0200 Subject: [PATCH 07/30] Rename PIO enviroments --- .github/workflows/build-and-release.yml | 11 +++--- platformio.ini | 48 +++++++++++++++++++++---- 2 files changed, 47 insertions(+), 12 deletions(-) diff --git a/.github/workflows/build-and-release.yml b/.github/workflows/build-and-release.yml index 084cbfe..f66a6ab 100644 --- a/.github/workflows/build-and-release.yml +++ b/.github/workflows/build-and-release.yml @@ -1,11 +1,10 @@ name: Build, Release & Deploy -on: - [push] +on: [push] env: prerelease: ${{ contains(github.ref, 'beta') || contains(github.ref, 'testing') }} - + jobs: build-webui: runs-on: ubuntu-latest @@ -13,7 +12,7 @@ jobs: - name: Checkout 🛎️ uses: actions/checkout@v4 with: - repository: 'pixelit-project/WebUI' + repository: "pixelit-project/WebUI" - name: Use Node.js 💾 uses: actions/setup-node@v3 @@ -78,7 +77,7 @@ jobs: pip install --upgrade platformio - name: Run PlatformIO build on selected platforms 🏗️ - run: platformio run -e d1_mini -e ESP8266 -e wemos_d1_mini32 -e nodemcuv2 + run: platformio run -e ESP8266_generic -e ESP8266_nodemcuv2 -e ESP32_generic -e ESP32_d1_mini32 -e ESP8266_d1_mini -e ESP32_Ulanzi - name: Upload build artifacts 💾 uses: actions/upload-artifact@v3 @@ -118,7 +117,7 @@ jobs: - name: Checkout 🛎️ uses: actions/checkout@v4 with: - repository: 'pixelit-project/WebUI' + repository: "pixelit-project/WebUI" - name: Download artifacts 💾 uses: actions/download-artifact@v3 diff --git a/platformio.ini b/platformio.ini index 15422a5..00207b1 100644 --- a/platformio.ini +++ b/platformio.ini @@ -35,7 +35,7 @@ lib_deps = bakercp/CRC32 @ 2.0.0 adafruit/Adafruit SHT31 Library@^2.2.2 -[env:wemos_d1_mini32] +[env:ESP32_d1_mini32] platform = espressif32 board = wemos_d1_mini32 framework = ${common.framework} @@ -71,9 +71,45 @@ lib_deps = Hash = https://github.com/bbx10/Hash_tng.git adafruit/Adafruit SHT31 Library@^2.2.2 -[env:ESP8266] +[env:ESP32_generic] +platform = espressif32 +board = esp32dev +framework = ${common.framework} +board_build.f_cpu = 80000000L +monitor_speed = ${common.monitor_speed} +extra_scripts = ${common.extra_scripts} +upload_speed = ${common.upload_speed} +build_flags = + ${common.build_flags} + -DLDR_PIN=A0 + -DMATRIX_PIN=27 + -DDEFAULT_PIN_SCL="Pin_D1" + -DDEFAULT_PIN_SDA="Pin_D3" + -DDEFAULT_PIN_DFPRX="Pin_D7" + -DDEFAULT_PIN_DFPTX="Pin_D8" + -DDEFAULT_PIN_ONEWIRE="Pin_D1" + -DDEFAULT_MATRIX_TYPE=1 + -DDEFAULT_LDR=GL5516 + -DVBAT_PIN=0 +platform_packages = + framework-arduinoespressif32 @ https://github.com/espressif/arduino-esp32.git + toolchain-xtensa32@~2.80400.0 +lib_deps = + ${common.lib_deps} + WiFiManager = https://github.com/tzapu/WiFiManager.git#v2.0.15-rc.1 + plerup/EspSoftwareSerial@^6.11.4 + fastled/FastLED@^3.5.0 + adafruit/Adafruit BME680 Library@^2.0.1 + adafruit/Adafruit BMP280 Library@^2.6.1 + claws/BH1750@^1.2.0 + robtillaart/Max44009@^0.5.2 + arduino-libraries/ArduinoHttpClient@^0.4.0 + Hash = https://github.com/bbx10/Hash_tng.git + adafruit/Adafruit SHT31 Library@^2.2.2 + +[env:ESP8266_generic] platform = espressif8266@2.6.3 -board = nodemcu +board = esp12e framework = ${common.framework} board_build.filesystem = littlefs monitor_speed = ${common.monitor_speed} @@ -102,7 +138,7 @@ lib_deps = mr-glt/SHA-1 Hash@^1.1.0 adafruit/Adafruit SHT31 Library@^2.2.2 -[env:d1_mini] +[env:ESP8266_d1_mini] platform = espressif8266@2.6.3 monitor_filters = esp8266_exception_decoder board = d1_mini @@ -134,7 +170,7 @@ lib_deps = mr-glt/SHA-1 Hash@^1.1.0 adafruit/Adafruit SHT31 Library@^2.2.2 -[env:nodemcuv2] +[env:ESP8266_nodemcuv2] platform = espressif8266@2.6.3 board = nodemcuv2 framework = ${common.framework} @@ -165,7 +201,7 @@ lib_deps = mr-glt/SHA-1 Hash@^1.1.0 adafruit/Adafruit SHT31 Library@^2.2.2 -[env:Ulanzi] +[env:ESP32_Ulanzi] platform = espressif32 board = esp32dev framework = ${common.framework} From a889c38ab06a558fc860ea9f8096092c83bdc1bd Mon Sep 17 00:00:00 2001 From: foorschtbar Date: Fri, 6 Oct 2023 22:39:26 +0200 Subject: [PATCH 08/30] Fixes boot freeze on esp8266's --- src/PixelIt.ino | 87 ++++++++++++++++++++++++------------------------- 1 file changed, 43 insertions(+), 44 deletions(-) diff --git a/src/PixelIt.ino b/src/PixelIt.ino index f74b0a8..e379963 100644 --- a/src/PixelIt.ino +++ b/src/PixelIt.ino @@ -3431,72 +3431,71 @@ void setup() // Init Temp Sensors Log(F("Setup"), F("SHT31 Trying")); - if (!sht31.begin(0x44)) - { - Log(F("Setup"), F("Couldn't find SHT31")); - while (1) - delay(1); - } - else + if (sht31.begin(0x44)) { Log(F("Setup"), F("SHT31 started")); tempSensor = TempSensor_SHT31; } - - bme280 = new Adafruit_BME280(); - if (bme280->begin(BME280_ADDRESS_ALTERNATE, &twowire)) - { - Log(F("Setup"), F("BME280 started")); - tempSensor = TempSensor_BME280; - } else { - delete bme280; - bmp280 = new Adafruit_BMP280(&twowire); - Log(F("Setup"), F("BMP280 Trying")); - if (bmp280->begin(BMP280_ADDRESS_ALT, 0x58)) + Log(F("Setup"), F("BME280 Trying")); + bme280 = new Adafruit_BME280(); + if (bme280->begin(BME280_ADDRESS_ALTERNATE, &twowire)) { - Log(F("Setup"), F("BMP280 started")); - tempSensor = TempSensor_BMP280; + Log(F("Setup"), F("BME280 started")); + tempSensor = TempSensor_BME280; } else { - delete bmp280; - bme680 = new Adafruit_BME680(&twowire); - if (bme680->begin()) + delete bme280; + bmp280 = new Adafruit_BMP280(&twowire); + Log(F("Setup"), F("BMP280 Trying")); + if (bmp280->begin(BMP280_ADDRESS_ALT, 0x58)) { - Log(F("Setup"), F("BME680 started")); - tempSensor = TempSensor_BME680; + Log(F("Setup"), F("BMP280 started")); + tempSensor = TempSensor_BMP280; } else { - Log(F("Setup"), F("No BMP280, BME280 or BME 680 sensor found")); - // AM2320 needs a delay to be reliably initialized - delete bme680; + delete bmp280; + bme680 = new Adafruit_BME680(&twowire); + Log(F("Setup"), F("BME680 Trying")); + if (bme680->begin()) + { + Log(F("Setup"), F("BME680 started")); + tempSensor = TempSensor_BME680; + } + else + { + Log(F("Setup"), F("No SHT31, BMP280, BME280 or BME680 sensor found")); + // AM2320 needs a delay to be reliably initialized + delete bme680; - // continue only if: - // - LDR is being used. This means: no light sensor in I²C bus. - // - SDA and SCL use different pin than onewire + // continue only if: + // - LDR is being used. This means: no light sensor in I²C bus. + // - SDA and SCL use different pin than onewire - // Otherwise, we already found a light sensor on I²C. If we would start a probe for OneWire on the same pin now, I²C will be disfunctional. - if (luxSensor == LuxSensor_LDR || (onewirePin != SDAPin && onewirePin != SCLPin)) - { - delay(800); - dht.setup(TranslatePin(onewirePin), DHTesp::DHT22); - if (!isnan(dht.getHumidity()) && !isnan(dht.getTemperature())) + // Otherwise, we already found a light sensor on I²C. If we would start a probe for OneWire on the same pin now, I²C will be disfunctional. + if (luxSensor == LuxSensor_LDR || (onewirePin != SDAPin && onewirePin != SCLPin)) { - Log(F("Setup"), F("DHT started")); - tempSensor = TempSensor_DHT; + delay(800); + dht.setup(TranslatePin(onewirePin), DHTesp::DHT22); + Log(F("Setup"), F("DHT Trying")); + if (!isnan(dht.getHumidity()) && !isnan(dht.getTemperature())) + { + Log(F("Setup"), F("DHT started")); + tempSensor = TempSensor_DHT; + } + else + { + Log(F("Setup"), F("No DHT Sensor found")); + } } else { - Log(F("Setup"), F("No DHT Sensor found")); + Log(F("Setup"), F("Not probing DHT sensor: light sensor already found on same pin as DHT.")); } } - else - { - Log(F("Setup"), F("Not probing DHT sensor: light sensor already found on same pin as DHT.")); - } } } } From 4afdd2d58ffcf8467b79df0970c54725232cd507 Mon Sep 17 00:00:00 2001 From: foorschtbar Date: Fri, 6 Oct 2023 22:39:45 +0200 Subject: [PATCH 09/30] CI improvments --- .github/workflows/build-and-release.yml | 8 ++++---- platformio.ini | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/workflows/build-and-release.yml b/.github/workflows/build-and-release.yml index f66a6ab..c24342e 100644 --- a/.github/workflows/build-and-release.yml +++ b/.github/workflows/build-and-release.yml @@ -77,7 +77,7 @@ jobs: pip install --upgrade platformio - name: Run PlatformIO build on selected platforms 🏗️ - run: platformio run -e ESP8266_generic -e ESP8266_nodemcuv2 -e ESP32_generic -e ESP32_d1_mini32 -e ESP8266_d1_mini -e ESP32_Ulanzi + run: platformio run -e ESP8266_generic -e ESP8266_nodemcuv2 -e ESP32_generic -e ESP32_d1_mini32 -e ESP8266_d1_mini -e ESP32_ulanzi - name: Upload build artifacts 💾 uses: actions/upload-artifact@v3 @@ -128,6 +128,6 @@ jobs: - name: Deploy 🚀 uses: JamesIves/github-pages-deploy-action@v4 with: - BRANCH: gh-pages # The branch the action should deploy to. - FOLDER: . # The folder the action should deploy. - CLEAN: false # Automatically remove deleted files from the deploy branch + branch: gh-pages # The branch the action should deploy to. + folder: . # The folder the action should deploy. + clean: false # Automatically remove deleted files from the deploy branch diff --git a/platformio.ini b/platformio.ini index 00207b1..ef01683 100644 --- a/platformio.ini +++ b/platformio.ini @@ -201,7 +201,7 @@ lib_deps = mr-glt/SHA-1 Hash@^1.1.0 adafruit/Adafruit SHT31 Library@^2.2.2 -[env:ESP32_Ulanzi] +[env:ESP32_ulanzi] platform = espressif32 board = esp32dev framework = ${common.framework} From 248ac3fbf65ef70a38e178febc458343b0b009bc Mon Sep 17 00:00:00 2001 From: foorschtbar Date: Mon, 9 Oct 2023 22:05:09 +0200 Subject: [PATCH 10/30] Added ESP32 firmware merging --- .github/merge.py | 64 +++++++++++++++++++++++++ .github/workflows/build-and-release.yml | 6 ++- 2 files changed, 69 insertions(+), 1 deletion(-) create mode 100644 .github/merge.py diff --git a/.github/merge.py b/.github/merge.py new file mode 100644 index 0000000..ea268fe --- /dev/null +++ b/.github/merge.py @@ -0,0 +1,64 @@ +import os +import shutil +import subprocess + +root_dir = '.pio/build' +boot_app0_path = os.path.join(os.path.expanduser("~"),".platformio/packages/framework-arduinoespressif32/tools/partitions/boot_app0.bin") + +print("+++ Starting merging... +++") + +# Check if the boot_app0.bin file exists +if not os.path.isfile(boot_app0_path): + print(f"boot_app0.bin not found at {boot_app0_path}") + exit(1) + +# Check if the root directory exists +if not os.path.isdir(root_dir): + print(f"Root directory {root_dir} not found") + exit(1) + +# Iterate over all items in the root directory +for item in os.listdir(root_dir): + item_path = os.path.join(root_dir, item) + + # Check if the item is a directory and its name starts with "esp32" + if os.path.isdir(item_path) and item.lower().startswith("esp32"): + print(f"Found an 'esp32' directory: {item_path}") + + # Check if the directory contains a file which begins with "firmware" + firmware_path = "" + for file in os.listdir(item_path): + if file.lower().startswith("firmware") and file.lower().endswith(".bin") and "combined" not in file.lower(): + firmware_path = os.path.join(item_path, file) + directory_path, filename_with_extension = os.path.split(firmware_path) + filename, file_extension = os.path.splitext(filename_with_extension) + print(f"> Found a 'firmware' file: {firmware_path}") + + # build new filename + firmware_combined_path = os.path.join(directory_path, filename + ".combined" + file_extension) + + # copy boot_app0.bin + print(f"> Copying boot_app0.bin to {item_path}...") + shutil.copy(boot_app0_path, item_path) + + # merge firmware + print(f"> Merging firmware to {firmware_combined_path}...") + command = f"python -m esptool --chip esp32 merge_bin -o {firmware_combined_path} --flash_mode dio --flash_freq 40m --flash_size 4MB 0x1000 {item_path}/bootloader.bin 0x8000 {item_path}/partitions.bin 0xe000 {item_path}/boot_app0.bin 0x10000 {firmware_path}" + return_code = subprocess.call(command, shell=True, stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL) + if return_code != 0: + print(f"> Merging failed with return code {return_code}.") + break + else: + print("> Merging successful") + + # remove unmerged firmware + print(f"> Removing unmerged firmware {firmware_path}...") + os.remove(firmware_path) + + print("> Done") + break + + if firmware_path == "": + print("> No firmware file for merging found") + +print("+++ Merging done... +++") \ No newline at end of file diff --git a/.github/workflows/build-and-release.yml b/.github/workflows/build-and-release.yml index c24342e..2ca566c 100644 --- a/.github/workflows/build-and-release.yml +++ b/.github/workflows/build-and-release.yml @@ -74,11 +74,15 @@ jobs: - name: Install pio and its dependencies 🔧 run: | python -m pip install --upgrade pip - pip install --upgrade platformio + pip install --upgrade platformio esptool - name: Run PlatformIO build on selected platforms 🏗️ run: platformio run -e ESP8266_generic -e ESP8266_nodemcuv2 -e ESP32_generic -e ESP32_d1_mini32 -e ESP8266_d1_mini -e ESP32_ulanzi + - name: Merge ESP32 firmware to single binaries 🔧 + run: | + python .github/merge.py + - name: Upload build artifacts 💾 uses: actions/upload-artifact@v3 with: From 36044d0197af045bc874202186d611f222a8fd46 Mon Sep 17 00:00:00 2001 From: foorschtbar Date: Tue, 10 Oct 2023 21:15:23 +0200 Subject: [PATCH 11/30] Changed name of combined file --- .github/merge.py | 122 +++++++++++++++++++++++------------------------ 1 file changed, 59 insertions(+), 63 deletions(-) diff --git a/.github/merge.py b/.github/merge.py index ea268fe..d354381 100644 --- a/.github/merge.py +++ b/.github/merge.py @@ -1,64 +1,60 @@ -import os -import shutil -import subprocess - -root_dir = '.pio/build' -boot_app0_path = os.path.join(os.path.expanduser("~"),".platformio/packages/framework-arduinoespressif32/tools/partitions/boot_app0.bin") - -print("+++ Starting merging... +++") - -# Check if the boot_app0.bin file exists -if not os.path.isfile(boot_app0_path): - print(f"boot_app0.bin not found at {boot_app0_path}") - exit(1) - -# Check if the root directory exists -if not os.path.isdir(root_dir): - print(f"Root directory {root_dir} not found") - exit(1) - -# Iterate over all items in the root directory -for item in os.listdir(root_dir): - item_path = os.path.join(root_dir, item) - - # Check if the item is a directory and its name starts with "esp32" - if os.path.isdir(item_path) and item.lower().startswith("esp32"): - print(f"Found an 'esp32' directory: {item_path}") - - # Check if the directory contains a file which begins with "firmware" - firmware_path = "" - for file in os.listdir(item_path): - if file.lower().startswith("firmware") and file.lower().endswith(".bin") and "combined" not in file.lower(): - firmware_path = os.path.join(item_path, file) - directory_path, filename_with_extension = os.path.split(firmware_path) - filename, file_extension = os.path.splitext(filename_with_extension) - print(f"> Found a 'firmware' file: {firmware_path}") - - # build new filename - firmware_combined_path = os.path.join(directory_path, filename + ".combined" + file_extension) - - # copy boot_app0.bin - print(f"> Copying boot_app0.bin to {item_path}...") - shutil.copy(boot_app0_path, item_path) - - # merge firmware - print(f"> Merging firmware to {firmware_combined_path}...") - command = f"python -m esptool --chip esp32 merge_bin -o {firmware_combined_path} --flash_mode dio --flash_freq 40m --flash_size 4MB 0x1000 {item_path}/bootloader.bin 0x8000 {item_path}/partitions.bin 0xe000 {item_path}/boot_app0.bin 0x10000 {firmware_path}" - return_code = subprocess.call(command, shell=True, stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL) - if return_code != 0: - print(f"> Merging failed with return code {return_code}.") - break - else: - print("> Merging successful") - - # remove unmerged firmware - print(f"> Removing unmerged firmware {firmware_path}...") - os.remove(firmware_path) - - print("> Done") - break - - if firmware_path == "": - print("> No firmware file for merging found") - +import os +import shutil +import subprocess + +root_dir = '.pio/build' +boot_app0_path = os.path.join(os.path.expanduser("~"),".platformio/packages/framework-arduinoespressif32/tools/partitions/boot_app0.bin") + +print("+++ Starting merging... +++") + +# Check if the boot_app0.bin file exists +if not os.path.isfile(boot_app0_path): + print(f"boot_app0.bin not found at {boot_app0_path}") + exit(1) + +# Check if the root directory exists +if not os.path.isdir(root_dir): + print(f"Root directory {root_dir} not found") + exit(1) + +# Iterate over all items in the root directory +for item in os.listdir(root_dir): + item_path = os.path.join(root_dir, item) + + # Check if the item is a directory and its name starts with "esp32" + if os.path.isdir(item_path) and item.lower().startswith("esp32"): + print(f"Found an 'esp32' directory: {item_path}") + + # Check if the directory contains a file which begins with "firmware" + firmware_path = "" + for file in os.listdir(item_path): + if file.lower().startswith("firmware") and file.lower().endswith(".bin") and "full-upgrade" not in file.lower(): + firmware_path = os.path.join(item_path, file) + directory_path, filename_with_extension = os.path.split(firmware_path) + filename, file_extension = os.path.splitext(filename_with_extension) + print(f"> Found a 'firmware' file: {firmware_path}") + + # build new filename + firmware_combined_path = os.path.join(directory_path, filename + ".full-upgrade" + file_extension) + + # copy boot_app0.bin + print(f"> Copying boot_app0.bin to {item_path}...") + shutil.copy(boot_app0_path, item_path) + + # merge firmware + print(f"> Merging firmware to {firmware_combined_path}...") + command = f"python -m esptool --chip esp32 merge_bin -o {firmware_combined_path} --flash_mode dio --flash_freq 40m --flash_size 4MB 0x1000 {item_path}/bootloader.bin 0x8000 {item_path}/partitions.bin 0xe000 {item_path}/boot_app0.bin 0x10000 {firmware_path}" + return_code = subprocess.call(command, shell=True, stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL) + if return_code != 0: + print(f"> Merging failed with return code {return_code}.") + break + else: + print("> Merging successful") + + print("> Done") + break + + if firmware_path == "": + print("> No firmware file for merging found") + print("+++ Merging done... +++") \ No newline at end of file From 3d938b4eb41ee82709b13d4f8b8fc7260ddd1a8d Mon Sep 17 00:00:00 2001 From: Florian Date: Tue, 10 Oct 2023 22:34:13 +0200 Subject: [PATCH 12/30] Improve version comparison --- src/PixelIt.ino | 49 ++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 46 insertions(+), 3 deletions(-) diff --git a/src/PixelIt.ino b/src/PixelIt.ino index e379963..b127822 100644 --- a/src/PixelIt.ino +++ b/src/PixelIt.ino @@ -336,6 +336,13 @@ unsigned long checkUpdateScreenPrevMillis = 0; unsigned long checkUpdatePrevMillis = 0; String lastReleaseVersion = VERSION; +typedef struct { + int major; + int minor; + int patch; + char prerelease[16]; +} Version; + // MP3Player Vars String OldGetMP3PlayerInfo; @@ -375,6 +382,37 @@ String ResetReason() #endif } +Version parseVersion(const char* versionStr) { + Version version; + int x = sscanf(versionStr, "%d.%d.%d-%s", &version.major, &version.minor, &version.patch, version.prerelease); + return version; +} + +int compareVersions(const char* version1, const char* version2) { + Version v1 = parseVersion(version1); + Version v2 = parseVersion(version2); + + if (v1.major != v2.major) { + return v1.major - v2.major; + } + if (v1.minor != v2.minor) { + return v1.minor - v2.minor; + } + if (v1.patch != v2.patch) { + return v1.patch - v2.patch; + } + + if (strlen(v1.prerelease) == 0 && strlen(v2.prerelease) == 0) { + return 0; // Versions are equal + } else if (strlen(v1.prerelease) == 0) { + return 1; // v1 is greater (no prerelease for v1, but prerelease for v2) + } else if (strlen(v2.prerelease) == 0) { + return -1; // v2 is greater (no prerelease for v2, but prerelease for v1) + } else { + return strcmp(v1.prerelease, v2.prerelease); // Compare prerelease strings + } +} + void getBatteryVoltage() { uint16_t value = 0; @@ -3689,9 +3727,12 @@ void checkUpdate() if (root.containsKey("version")) { lastReleaseVersion = root["version"].as(); - if (!lastReleaseVersion.equals(VERSION)) + + int result = compareVersions(lastReleaseVersion.c_str(), VERSION); + + if (result > 0) { - Log(F("CheckUpdate"), F("New FW available")); + Log(F("CheckUpdate"), "New FW available -> " + lastReleaseVersion); } else { @@ -3748,7 +3789,9 @@ void loop() if (millis() - checkUpdateScreenPrevMillis >= CHECKUPDATESCREEN_INTERVAL) { checkUpdateScreenPrevMillis = millis(); - if (!lastReleaseVersion.equals(VERSION)) + + int result = compareVersions(lastReleaseVersion.c_str(), VERSION); + if (result > 0) { if (!sleepMode) { From 5fe764fc317c6de2f3f20de2f8c349b4217817e5 Mon Sep 17 00:00:00 2001 From: Florian Date: Tue, 10 Oct 2023 23:09:39 +0200 Subject: [PATCH 13/30] Log versions and fix prerelease char-array recycling --- src/PixelIt.ino | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/PixelIt.ino b/src/PixelIt.ino index b127822..62ed6c3 100644 --- a/src/PixelIt.ino +++ b/src/PixelIt.ino @@ -57,7 +57,7 @@ #define CHECKUPDATESCREEN_DURATION 1000 * 5 // 5 Seconds #define SEND_LIVEVIEW_INTERVAL 250 // 0.5 Seconds, 0 to disable -#define VERSION "0.0.0-beta" // will be replaced by build piple with Git-Tag! +#define VERSION "2.3.2-beta" // will be replaced by build piple with Git-Tag! #define XSTR(x) #x #define STR(x) XSTR(x) @@ -384,6 +384,9 @@ String ResetReason() Version parseVersion(const char* versionStr) { Version version; + + memset(version.prerelease, 0, sizeof(version.prerelease)); + int x = sscanf(versionStr, "%d.%d.%d-%s", &version.major, &version.minor, &version.patch, version.prerelease); return version; } @@ -3732,11 +3735,11 @@ void checkUpdate() if (result > 0) { - Log(F("CheckUpdate"), "New FW available -> " + lastReleaseVersion); + Log(F("CheckUpdate"), "New FW available " + String(VERSION) + " -> " + lastReleaseVersion); } else { - Log(F("CheckUpdate"), F("No new FW available")); + Log(F("CheckUpdate"), "No new FW available " + String(VERSION) + " -> " + lastReleaseVersion); } } } From 575257dbd940db065c260d300488105d16b2dd8a Mon Sep 17 00:00:00 2001 From: Florian Date: Tue, 10 Oct 2023 23:35:13 +0200 Subject: [PATCH 14/30] Handle versions if strings are empty eg no connection --- src/PixelIt.ino | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/PixelIt.ino b/src/PixelIt.ino index 62ed6c3..9ccf02c 100644 --- a/src/PixelIt.ino +++ b/src/PixelIt.ino @@ -57,7 +57,7 @@ #define CHECKUPDATESCREEN_DURATION 1000 * 5 // 5 Seconds #define SEND_LIVEVIEW_INTERVAL 250 // 0.5 Seconds, 0 to disable -#define VERSION "2.3.2-beta" // will be replaced by build piple with Git-Tag! +#define VERSION "0.0.0-beta" // will be replaced by build piple with Git-Tag! #define XSTR(x) #x #define STR(x) XSTR(x) @@ -392,6 +392,11 @@ Version parseVersion(const char* versionStr) { } int compareVersions(const char* version1, const char* version2) { + if (strlen(version1) == 0 || strlen(version2) == 0) + { + return 0; + } + Version v1 = parseVersion(version1); Version v2 = parseVersion(version2); From 54caa80b69531a65d6226c11f67c37f68e2a3db8 Mon Sep 17 00:00:00 2001 From: foorschtbar Date: Wed, 11 Oct 2023 21:32:17 +0200 Subject: [PATCH 15/30] test webflasher upload --- .github/workflows/build-and-release.yml | 64 ++++++++++++++++++++----- 1 file changed, 52 insertions(+), 12 deletions(-) diff --git a/.github/workflows/build-and-release.yml b/.github/workflows/build-and-release.yml index 2ca566c..b0f5cdf 100644 --- a/.github/workflows/build-and-release.yml +++ b/.github/workflows/build-and-release.yml @@ -77,7 +77,8 @@ jobs: pip install --upgrade platformio esptool - name: Run PlatformIO build on selected platforms 🏗️ - run: platformio run -e ESP8266_generic -e ESP8266_nodemcuv2 -e ESP32_generic -e ESP32_d1_mini32 -e ESP8266_d1_mini -e ESP32_ulanzi + #run: platformio run -e ESP8266_generic -e ESP8266_nodemcuv2 -e ESP32_generic -e ESP32_d1_mini32 -e ESP8266_d1_mini -e ESP32_ulanzi + run: platformio run -e ESP32_ulanzi - name: Merge ESP32 firmware to single binaries 🔧 run: | @@ -113,25 +114,64 @@ jobs: file_glob: true prerelease: ${{ env.prerelease }} - deploy-webui-gh-pages: + upload-fw-to-docs: + needs: build-fw runs-on: ubuntu-latest - needs: build-webui - if: startsWith(github.ref, 'refs/tags/') + # if: startsWith(github.ref, 'refs/tags/') steps: - name: Checkout 🛎️ uses: actions/checkout@v4 with: - repository: "pixelit-project/WebUI" + repository: "pixelit-project/PixelIt.Docs" + path: docs - name: Download artifacts 💾 uses: actions/download-artifact@v3 with: - name: pixelit-webui - path: webui + name: pixelit-firmware + path: artifacts + + - name: Prepare binaries for web flasher 🚀 + run: | + mkdir -p upload + cp ./docs/src/.vuepress/public/pixelit_flasher/firmware/firmware_*.bin ./upload/ + cp -rf ./artifacts/*/firmware_*.bin ./upload/ + + - name: Display structure of downloaded files 🔍 + run: ls -R ./upload/ - - name: Deploy 🚀 - uses: JamesIves/github-pages-deploy-action@v4 + - name: Upload binaries to PixelIt.Docs for web flasher 🚀 + uses: cpina/github-action-push-to-another-repository@main + env: + SSH_DEPLOY_KEY: ${{ secrets.SSH_DEPLOY_KEY }} with: - branch: gh-pages # The branch the action should deploy to. - folder: . # The folder the action should deploy. - clean: false # Automatically remove deleted files from the deploy branch + source-directory: "upload" + destination-github-username: "pixelit-project" + destination-repository-name: "PixelIt.Docs" + user-email: bot@pixelit + target-branch: master + target-directory: "src/.vuepress/public/pixelit_flasher/firmware/" + commit-message: pushed from $GITHUB_REF via GitHub Actions + + # deploy-webui-gh-pages: + # runs-on: ubuntu-latest + # needs: build-webui + # if: startsWith(github.ref, 'refs/tags/') + # steps: + # - name: Checkout 🛎️ + # uses: actions/checkout@v4 + # with: + # repository: "pixelit-project/WebUI" + + # - name: Download artifacts 💾 + # uses: actions/download-artifact@v3 + # with: + # name: pixelit-webui + # path: webui + + # - name: Deploy 🚀 + # uses: JamesIves/github-pages-deploy-action@v4 + # with: + # branch: gh-pages # The branch the action should deploy to. + # folder: . # The folder the action should deploy. + # clean: false # Automatically remove deleted files from the deploy branch From 31a63bd4e7552edf8a6e19be8ba2389e2377a709 Mon Sep 17 00:00:00 2001 From: foorschtbar Date: Wed, 11 Oct 2023 21:56:33 +0200 Subject: [PATCH 16/30] Upload firmware to docs --- .github/workflows/build-and-release.yml | 49 ++++++++++++------------- 1 file changed, 24 insertions(+), 25 deletions(-) diff --git a/.github/workflows/build-and-release.yml b/.github/workflows/build-and-release.yml index b0f5cdf..4474657 100644 --- a/.github/workflows/build-and-release.yml +++ b/.github/workflows/build-and-release.yml @@ -77,8 +77,7 @@ jobs: pip install --upgrade platformio esptool - name: Run PlatformIO build on selected platforms 🏗️ - #run: platformio run -e ESP8266_generic -e ESP8266_nodemcuv2 -e ESP32_generic -e ESP32_d1_mini32 -e ESP8266_d1_mini -e ESP32_ulanzi - run: platformio run -e ESP32_ulanzi + run: platformio run -e ESP8266_generic -e ESP8266_nodemcuv2 -e ESP32_generic -e ESP32_d1_mini32 -e ESP8266_d1_mini -e ESP32_ulanzi - name: Merge ESP32 firmware to single binaries 🔧 run: | @@ -117,7 +116,7 @@ jobs: upload-fw-to-docs: needs: build-fw runs-on: ubuntu-latest - # if: startsWith(github.ref, 'refs/tags/') + if: startsWith(github.ref, 'refs/tags/') steps: - name: Checkout 🛎️ uses: actions/checkout@v4 @@ -153,25 +152,25 @@ jobs: target-directory: "src/.vuepress/public/pixelit_flasher/firmware/" commit-message: pushed from $GITHUB_REF via GitHub Actions - # deploy-webui-gh-pages: - # runs-on: ubuntu-latest - # needs: build-webui - # if: startsWith(github.ref, 'refs/tags/') - # steps: - # - name: Checkout 🛎️ - # uses: actions/checkout@v4 - # with: - # repository: "pixelit-project/WebUI" - - # - name: Download artifacts 💾 - # uses: actions/download-artifact@v3 - # with: - # name: pixelit-webui - # path: webui - - # - name: Deploy 🚀 - # uses: JamesIves/github-pages-deploy-action@v4 - # with: - # branch: gh-pages # The branch the action should deploy to. - # folder: . # The folder the action should deploy. - # clean: false # Automatically remove deleted files from the deploy branch + deploy-webui-gh-pages: + runs-on: ubuntu-latest + needs: build-webui + if: startsWith(github.ref, 'refs/tags/') + steps: + - name: Checkout 🛎️ + uses: actions/checkout@v4 + with: + repository: "pixelit-project/WebUI" + + - name: Download artifacts 💾 + uses: actions/download-artifact@v3 + with: + name: pixelit-webui + path: webui + + - name: Deploy 🚀 + uses: JamesIves/github-pages-deploy-action@v4 + with: + branch: gh-pages # The branch the action should deploy to. + folder: . # The folder the action should deploy. + clean: false # Automatically remove deleted files from the deploy branch From 8dae0562042c35cb3130f25dbb20a3cef6828ac1 Mon Sep 17 00:00:00 2001 From: Fab!an Date: Wed, 11 Oct 2023 23:08:52 +0200 Subject: [PATCH 17/30] Updated readme --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 9f834c4..303e456 100644 --- a/README.md +++ b/README.md @@ -109,11 +109,12 @@ Thanks to these great people for supporting this project. -### 2.4.0 **WORK IN PROGRESS** +### 2.4.x **WORK IN PROGRESS** - (foorschtbar) Native support for [Ulanzi TC001 Pixel Clock](https://www.ulanzi.com/products/ulanzi-pixel-smart-clock-2882?aff=1181)\* (**Beta**, see [Releases](https://github.com/pixelit-project/PixelIt/releases)) :tada: - (foorschtbar) Display `zZz` on the matrix when the device going to sleep - (foorschtbar) Fixed issue with flickering icons, wenn device wake from sleep mode +- (Metaln00b) Improved new firmware check by doing real version compare (major, minor, patch and prerelease) ### 2.3.2 (2023-09-16) From 1331484554696e2e4f157ab22c840e7d9269003f Mon Sep 17 00:00:00 2001 From: foorschtbar Date: Wed, 11 Oct 2023 23:23:01 +0200 Subject: [PATCH 18/30] Updated action --- .github/workflows/build-and-release.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/build-and-release.yml b/.github/workflows/build-and-release.yml index 4474657..d914669 100644 --- a/.github/workflows/build-and-release.yml +++ b/.github/workflows/build-and-release.yml @@ -148,9 +148,10 @@ jobs: destination-github-username: "pixelit-project" destination-repository-name: "PixelIt.Docs" user-email: bot@pixelit + user-name: PixelIt Pipeline Bot target-branch: master target-directory: "src/.vuepress/public/pixelit_flasher/firmware/" - commit-message: pushed from $GITHUB_REF via GitHub Actions + commit-message: Pushed binaries from main repo via GitHub Actions deploy-webui-gh-pages: runs-on: ubuntu-latest From 289b85dcf2e177f5eec1c74b32be83d55f58b1d3 Mon Sep 17 00:00:00 2001 From: foorschtbar Date: Thu, 12 Oct 2023 00:31:39 +0200 Subject: [PATCH 19/30] Added preview image to readme --- .github/logo.png | Bin 0 -> 1745 bytes .github/pixelit.png | Bin 0 -> 672340 bytes README.md | 4 +++- 3 files changed, 3 insertions(+), 1 deletion(-) create mode 100644 .github/logo.png create mode 100644 .github/pixelit.png diff --git a/.github/logo.png b/.github/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..5594adf30716054fba92f515aa32946df3b87a13 GIT binary patch literal 1745 zcmeAS@N?(olHy`uVBq!ia0y~yU}OSe4j{=eOV^K`fq`v?r;B4q#jUq@H}=Ye@wi?L z6%8`J#I)}C(;afm%BITYiHBcLdE$L+LECdSX*;!Q1N&J&zx@4JF*)x$C-X~tw)^+) z&o6n9{Qvy-eE(bj-+uf%e}DY^ZT}zN|2zMEy=~_I(~m!Mzp?-Q|M|_|5?q1sE8&v3 zAyK~h1rJ-O#Fs>Y)`M-eJd2DaLJ}{uJBqMLe>3bjmk`kED9;usk#l1(X!nFMk0$r{$_#%PWH1c1GXUXYAg-Q|MN)grH`kyoo0n=Q{P>K=M1QXxV zSYpYe(!XeBzx&1W-_vVf)K}KjHU5qN8`yqOfbAr);WGF#+xp6#!qnR62ToeE^ks^=Yn`DEQgRQkZZ3a6w^aH&s{>@P0(1U?e9REfSl(Kp& zMPdiJOThv5zWc5!DCHRTFB-gIiWIfA8+W%fe);yz{QA>Vp9M3kP6Mkd22WQ%mvv4F FO#s!&$4meK literal 0 HcmV?d00001 diff --git a/.github/pixelit.png b/.github/pixelit.png new file mode 100644 index 0000000000000000000000000000000000000000..f36bbbaa369255b835fe2be8501a3fb8e891b48e GIT binary patch literal 672340 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 z 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 aJ=C^nQ9W?+mIDO*oczJ}Se Date: Thu, 12 Oct 2023 21:46:40 +0200 Subject: [PATCH 20/30] Remove duplication from platformio.ini (#315) * remove duplication from platformio.ini * fix env names * pin framework-arduinoespressif32 version --- platformio.ini | 168 ++++++++----------------------------------------- 1 file changed, 26 insertions(+), 142 deletions(-) diff --git a/platformio.ini b/platformio.ini index ef01683..b8093c2 100644 --- a/platformio.ini +++ b/platformio.ini @@ -17,59 +17,27 @@ build_flags = -DMATRIX_WIDTH=32 ; Pixel cols -DMATRIX_HEIGHT=8 ; Pixel rows lib_deps = - links2004/WebSockets@^2.4.0 - knolleary/PubSubClient@^2.8 - bblanchon/ArduinoJson@^5.13.4 - adafruit/Adafruit GFX Library@^1.10.5 - fastled/FastLED@^3.4.0 - beegee-tokyo/DHT sensor library for ESPx@^1.17 - powerbroker2/DFPlayerMini_Fast@^1.2.0 - adafruit/Adafruit BusIO@^1.7.2 adafruit/Adafruit BME280 Library@^2.0.2 + adafruit/Adafruit BME680 Library@^2.0.1 adafruit/Adafruit BMP280 Library@^2.6.1 + adafruit/Adafruit BusIO@^1.7.2 + adafruit/Adafruit GFX Library@^1.10.5 + adafruit/Adafruit SHT31 Library@^2.2.2 adafruit/Adafruit Unified Sensor@^1.1.4 - LightDependentResistor=https://github.com/QuentinCG/Arduino-Light-Dependent-Resistor-Library.git - ColorConverter=https://github.com/luisllamasbinaburo/Arduino-ColorConverter.git - TimeLib = https://github.com/PaulStoffregen/Time.git - marcmerlin/FastLED NeoMatrix@^1.2 + arduino-libraries/ArduinoHttpClient@^0.4.0 bakercp/CRC32 @ 2.0.0 - adafruit/Adafruit SHT31 Library@^2.2.2 - -[env:ESP32_d1_mini32] -platform = espressif32 -board = wemos_d1_mini32 -framework = ${common.framework} -board_build.f_cpu = 80000000L -monitor_speed = ${common.monitor_speed} -extra_scripts = ${common.extra_scripts} -upload_speed = ${common.upload_speed} -build_flags = - ${common.build_flags} - -DLDR_PIN=A0 - -DMATRIX_PIN=27 - -DDEFAULT_PIN_SCL="Pin_D1" - -DDEFAULT_PIN_SDA="Pin_D3" - -DDEFAULT_PIN_DFPRX="Pin_D7" - -DDEFAULT_PIN_DFPTX="Pin_D8" - -DDEFAULT_PIN_ONEWIRE="Pin_D1" - -DDEFAULT_MATRIX_TYPE=1 - -DDEFAULT_LDR=GL5516 - -DVBAT_PIN=0 -platform_packages = - framework-arduinoespressif32 @ https://github.com/espressif/arduino-esp32.git - toolchain-xtensa32@~2.80400.0 -lib_deps = - ${common.lib_deps} - WiFiManager = https://github.com/tzapu/WiFiManager.git#v2.0.15-rc.1 - plerup/EspSoftwareSerial@^6.11.4 - fastled/FastLED@^3.5.0 - adafruit/Adafruit BME680 Library@^2.0.1 - adafruit/Adafruit BMP280 Library@^2.6.1 + bblanchon/ArduinoJson@^5.13.4 + beegee-tokyo/DHT sensor library for ESPx@^1.17 claws/BH1750@^1.2.0 + ColorConverter=https://github.com/luisllamasbinaburo/Arduino-ColorConverter.git + fastled/FastLED@^3.4.0 + knolleary/PubSubClient@^2.8 + LightDependentResistor=https://github.com/QuentinCG/Arduino-Light-Dependent-Resistor-Library.git + links2004/WebSockets@^2.4.0 + marcmerlin/FastLED NeoMatrix@^1.2 + powerbroker2/DFPlayerMini_Fast@^1.2.0 robtillaart/Max44009@^0.5.2 - arduino-libraries/ArduinoHttpClient@^0.4.0 - Hash = https://github.com/bbx10/Hash_tng.git - adafruit/Adafruit SHT31 Library@^2.2.2 + TimeLib = https://github.com/PaulStoffregen/Time.git [env:ESP32_generic] platform = espressif32 @@ -92,20 +60,14 @@ build_flags = -DDEFAULT_LDR=GL5516 -DVBAT_PIN=0 platform_packages = - framework-arduinoespressif32 @ https://github.com/espressif/arduino-esp32.git + framework-arduinoespressif32 @ https://github.com/espressif/arduino-esp32.git#2.0.14 toolchain-xtensa32@~2.80400.0 lib_deps = ${common.lib_deps} - WiFiManager = https://github.com/tzapu/WiFiManager.git#v2.0.15-rc.1 - plerup/EspSoftwareSerial@^6.11.4 fastled/FastLED@^3.5.0 - adafruit/Adafruit BME680 Library@^2.0.1 - adafruit/Adafruit BMP280 Library@^2.6.1 - claws/BH1750@^1.2.0 - robtillaart/Max44009@^0.5.2 - arduino-libraries/ArduinoHttpClient@^0.4.0 Hash = https://github.com/bbx10/Hash_tng.git - adafruit/Adafruit SHT31 Library@^2.2.2 + plerup/EspSoftwareSerial@^6.11.4 + WiFiManager = https://github.com/tzapu/WiFiManager.git#v2.0.15-rc.1 [env:ESP8266_generic] platform = espressif8266@2.6.3 @@ -129,89 +91,24 @@ build_flags = -DVBAT_PIN=0 lib_deps = ${common.lib_deps} - tzapu/WiFiManager@^0.16.0 - adafruit/Adafruit BME680 Library@^2.0.1 - adafruit/Adafruit BMP280 Library@^2.6.1 - claws/BH1750@^1.2.0 - robtillaart/Max44009@^0.5.2 - arduino-libraries/ArduinoHttpClient@^0.4.0 mr-glt/SHA-1 Hash@^1.1.0 - adafruit/Adafruit SHT31 Library@^2.2.2 + tzapu/WiFiManager@^0.16.0 [env:ESP8266_d1_mini] -platform = espressif8266@2.6.3 +extends = env:ESP8266_generic monitor_filters = esp8266_exception_decoder board = d1_mini -framework = ${common.framework} -board_build.filesystem = littlefs -monitor_speed = ${common.monitor_speed} -extra_scripts = ${common.extra_scripts} -upload_speed = ${common.upload_speed} -build_flags = - ${common.build_flags} - -DLDR_PIN=A0 - -DMATRIX_PIN=D2 - -DDEFAULT_PIN_SCL="Pin_D1" - -DDEFAULT_PIN_SDA="Pin_D3" - -DDEFAULT_PIN_DFPRX="Pin_D7" - -DDEFAULT_PIN_DFPTX="Pin_D8" - -DDEFAULT_PIN_ONEWIRE="Pin_D1" - -DDEFAULT_MATRIX_TYPE=1 - -DDEFAULT_LDR=GL5516 - -DVBAT_PIN=0 -lib_deps = - ${common.lib_deps} - tzapu/WiFiManager@^0.16.0 - adafruit/Adafruit BME680 Library@^2.0.1 - adafruit/Adafruit BMP280 Library@^2.6.1 - claws/BH1750@^1.2.0 - robtillaart/Max44009@^0.5.2 - arduino-libraries/ArduinoHttpClient@^0.4.0 - mr-glt/SHA-1 Hash@^1.1.0 - adafruit/Adafruit SHT31 Library@^2.2.2 [env:ESP8266_nodemcuv2] -platform = espressif8266@2.6.3 +extends = env:ESP8266_generic board = nodemcuv2 -framework = ${common.framework} -board_build.filesystem = littlefs -monitor_speed = ${common.monitor_speed} -extra_scripts = ${common.extra_scripts} -upload_speed = ${common.upload_speed} -build_flags = - ${common.build_flags} - -DLDR_PIN=A0 - -DMATRIX_PIN=D2 - -DDEFAULT_PIN_SCL="Pin_D1" - -DDEFAULT_PIN_SDA="Pin_D3" - -DDEFAULT_PIN_DFPRX="Pin_D7" - -DDEFAULT_PIN_DFPTX="Pin_D8" - -DDEFAULT_PIN_ONEWIRE="Pin_D1" - -DDEFAULT_MATRIX_TYPE=1 - -DDEFAULT_LDR=GL5516 - -DVBAT_PIN=0 -lib_deps = - ${common.lib_deps} - tzapu/WiFiManager@^0.16.0 - adafruit/Adafruit BME680 Library@^2.0.1 - adafruit/Adafruit BMP280 Library@^2.6.1 - claws/BH1750@^1.2.0 - robtillaart/Max44009@^0.5.2 - arduino-libraries/ArduinoHttpClient@^0.4.0 - mr-glt/SHA-1 Hash@^1.1.0 - adafruit/Adafruit SHT31 Library@^2.2.2 + +[env:ESP32_d1_mini32] +extends = env:ESP32_generic +board = wemos_d1_mini32 [env:ESP32_ulanzi] -platform = espressif32 -board = esp32dev -framework = ${common.framework} -board_build.f_cpu = 80000000L -monitor_speed = ${common.monitor_speed} -extra_scripts = ${common.extra_scripts} -upload_speed = ${common.upload_speed} -platform_packages = - framework-arduinoespressif32 @ https://github.com/espressif/arduino-esp32.git - toolchain-xtensa32@~2.80400.0 +extends = env:ESP32_generic build_flags = ${common.build_flags} -DLDR_PIN=A7 @@ -227,16 +124,3 @@ build_flags = -DDEFAULT_LDR=GL5516 -DMIN_BATTERY=475 -DMAX_BATTERY=665 -lib_deps = - ${common.lib_deps} - WiFiManager = https://github.com/tzapu/WiFiManager.git#v2.0.15-rc.1 - fastled/FastLED@^3.5.0 - arduino-libraries/ArduinoHttpClient@^0.4.0 - adafruit/Adafruit SHT31 Library @ 2.2.0 - Hash = https://github.com/bbx10/Hash_tng.git - plerup/EspSoftwareSerial@^6.11.4 - adafruit/Adafruit BME680 Library@^2.0.1 - adafruit/Adafruit BMP280 Library@^2.6.1 - claws/BH1750@^1.2.0 - robtillaart/Max44009@^0.5.2 - adafruit/Adafruit SHT31 Library@^2.2.2 \ No newline at end of file From e855b2ee2b67cd0fff729d9793e2f891f63138e5 Mon Sep 17 00:00:00 2001 From: Dennis Rathjen Date: Thu, 12 Oct 2023 21:52:45 +0200 Subject: [PATCH 21/30] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 255cdd1..9f8f46a 100644 --- a/README.md +++ b/README.md @@ -112,7 +112,7 @@ Thanks to these great people for supporting this project. ### 2.4.x **WORK IN PROGRESS** - +- (jekader) Remove duplication from platformio.ini [#315](https://github.com/pixelit-project/PixelIt/issues/315) - (foorschtbar) Native support for [Ulanzi TC001 Pixel Clock](https://www.ulanzi.com/products/ulanzi-pixel-smart-clock-2882?aff=1181)\* (**Beta**, see [Releases](https://github.com/pixelit-project/PixelIt/releases)) :tada: - (foorschtbar) Display `zZz` on the matrix when the device going to sleep - (foorschtbar) Fixed issue with flickering icons, wenn device wake from sleep mode From f9abc3dacd6e9ce6ad463cf1eb9e226935f13021 Mon Sep 17 00:00:00 2001 From: Dennis Rathjen Date: Thu, 12 Oct 2023 21:54:07 +0200 Subject: [PATCH 22/30] Update README.md --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 9f8f46a..39b3f42 100644 --- a/README.md +++ b/README.md @@ -112,7 +112,7 @@ Thanks to these great people for supporting this project. ### 2.4.x **WORK IN PROGRESS** -- (jekader) Remove duplication from platformio.ini [#315](https://github.com/pixelit-project/PixelIt/issues/315) +- (jekader) Remove duplication from platformio.ini [[#315](https://github.com/pixelit-project/PixelIt/issues/315)] - (foorschtbar) Native support for [Ulanzi TC001 Pixel Clock](https://www.ulanzi.com/products/ulanzi-pixel-smart-clock-2882?aff=1181)\* (**Beta**, see [Releases](https://github.com/pixelit-project/PixelIt/releases)) :tada: - (foorschtbar) Display `zZz` on the matrix when the device going to sleep - (foorschtbar) Fixed issue with flickering icons, wenn device wake from sleep mode @@ -123,7 +123,7 @@ Thanks to these great people for supporting this project. - (foorschtbar) Added live preview (liveview) of the Matrix to WebUI - (foorschtbar) Added uptime, size and last reset reason to WebUI - (foorschtbar) Screens from test area are now displayed prioritized for 5 seconds -- (foorschtbar) Combine centerText with scrollText=auto [#96](https://github.com/pixelit-project/PixelIt/issues/96) +- (foorschtbar) Combine centerText with scrollText=auto [[#96](https://github.com/pixelit-project/PixelIt/issues/96)] - (foorschtbar) Cleanup text drawing/scrolling code **[Breaking change: Text position is now mandatory and will not be shiffed if there is an icon!]** - (foorschtbar) Prepearing support for different matrix sizes - (o0shojo0o) Added native `Pixel Creator` to WebUI From 9cff0271cab9cb8b274db738684e91d5de5166bf Mon Sep 17 00:00:00 2001 From: Dennis Rathjen Date: Thu, 12 Oct 2023 21:56:33 +0200 Subject: [PATCH 23/30] Update README.md --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 39b3f42..47f4804 100644 --- a/README.md +++ b/README.md @@ -112,6 +112,8 @@ Thanks to these great people for supporting this project. ### 2.4.x **WORK IN PROGRESS** + +- (o0shojo0o) As of this version, it is possible to install via the new [webflasher](https://pixelit-project.github.io/firmware.html#flashing-web) - (jekader) Remove duplication from platformio.ini [[#315](https://github.com/pixelit-project/PixelIt/issues/315)] - (foorschtbar) Native support for [Ulanzi TC001 Pixel Clock](https://www.ulanzi.com/products/ulanzi-pixel-smart-clock-2882?aff=1181)\* (**Beta**, see [Releases](https://github.com/pixelit-project/PixelIt/releases)) :tada: - (foorschtbar) Display `zZz` on the matrix when the device going to sleep From 8ab7ddb8472e93b1c31bc2ffa0d3f99fdbd9aada Mon Sep 17 00:00:00 2001 From: Jeka Der Date: Fri, 13 Oct 2023 10:53:34 +0200 Subject: [PATCH 24/30] improve logging during pin assignment --- src/PixelIt.ino | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/PixelIt.ino b/src/PixelIt.ino index 9ccf02c..283a45d 100644 --- a/src/PixelIt.ino +++ b/src/PixelIt.ino @@ -3281,7 +3281,7 @@ LightDependentResistor::ePhotoCellKind TranslatePhotocell(String photocell) return LightDependentResistor::GL5539; if (photocell == "GL5549") return LightDependentResistor::GL5549; - Log(F("Zuordnung LDR"), F("Unbekannter LDR-Typ")); + Log(F("LDR assignment - unknown type"), photocell); return LightDependentResistor::GL5528; } @@ -3308,7 +3308,7 @@ uint8_t TranslatePin(String pin) return D8; if (pin == "Pin_27") return 27; - Log(F("Pin-Zuordnung"), F("Unbekannter Pin")); + Log(F("Pin assignment - unknown pin"), pin); return LED_BUILTIN; #elif defined(ESP32) @@ -3341,7 +3341,7 @@ uint8_t TranslatePin(String pin) if (pin == "SPI_CS0_GPIO_NUM") return SPI_CS0_GPIO_NUM; - Log(F("Pin-Zuordnung"), F("Unbekannter Pin")); + Log(F("Pin assignment - unknown pin"), pin); return GPIO_NUM_32; // IDK #endif } From 70d596b9b5b7df16764cfd739f2707b0dd60527c Mon Sep 17 00:00:00 2001 From: foorschtbar Date: Fri, 13 Oct 2023 15:15:23 +0200 Subject: [PATCH 25/30] Added native inpu length to callback logs --- src/PixelIt.ino | 39 ++++++++++++++++++++++++++------------- 1 file changed, 26 insertions(+), 13 deletions(-) diff --git a/src/PixelIt.ino b/src/PixelIt.ino index 9ccf02c..1c4b071 100644 --- a/src/PixelIt.ino +++ b/src/PixelIt.ino @@ -336,7 +336,8 @@ unsigned long checkUpdateScreenPrevMillis = 0; unsigned long checkUpdatePrevMillis = 0; String lastReleaseVersion = VERSION; -typedef struct { +typedef struct +{ int major; int minor; int patch; @@ -382,16 +383,18 @@ String ResetReason() #endif } -Version parseVersion(const char* versionStr) { +Version parseVersion(const char *versionStr) +{ Version version; - + memset(version.prerelease, 0, sizeof(version.prerelease)); int x = sscanf(versionStr, "%d.%d.%d-%s", &version.major, &version.minor, &version.patch, version.prerelease); return version; } -int compareVersions(const char* version1, const char* version2) { +int compareVersions(const char *version1, const char *version2) +{ if (strlen(version1) == 0 || strlen(version2) == 0) { return 0; @@ -400,23 +403,33 @@ int compareVersions(const char* version1, const char* version2) { Version v1 = parseVersion(version1); Version v2 = parseVersion(version2); - if (v1.major != v2.major) { + if (v1.major != v2.major) + { return v1.major - v2.major; } - if (v1.minor != v2.minor) { + if (v1.minor != v2.minor) + { return v1.minor - v2.minor; } - if (v1.patch != v2.patch) { + if (v1.patch != v2.patch) + { return v1.patch - v2.patch; } - if (strlen(v1.prerelease) == 0 && strlen(v2.prerelease) == 0) { + if (strlen(v1.prerelease) == 0 && strlen(v2.prerelease) == 0) + { return 0; // Versions are equal - } else if (strlen(v1.prerelease) == 0) { + } + else if (strlen(v1.prerelease) == 0) + { return 1; // v1 is greater (no prerelease for v1, but prerelease for v2) - } else if (strlen(v2.prerelease) == 0) { + } + else if (strlen(v2.prerelease) == 0) + { return -1; // v2 is greater (no prerelease for v2, but prerelease for v1) - } else { + } + else + { return strcmp(v1.prerelease, v2.prerelease); // Compare prerelease strings } } @@ -1120,7 +1133,7 @@ void callback(char *topic, byte *payload, unsigned int length) DynamicJsonBuffer jsonBuffer; JsonObject &json = jsonBuffer.parseObject(payload); - Log("MQTT_callback", "Incomming JSON (Topic: " + String(topic) + ", Length: " + String(json.measureLength()) + ") "); + Log("MQTT_callback", "Incoming JSON (Topic: " + String(topic) + ", Length: " + String(length) + "/" + String(json.measureLength()) + ") "); if (channel.equals("setScreen")) { @@ -1184,7 +1197,7 @@ void webSocketEvent(uint8_t num, WStype_t type, uint8_t *payload, size_t length) int forcedDuration = 0; // Logausgabe - Log(F("WebSocketEvent"), "Incoming JSON (Length: " + String(json.measureLength()) + ")"); + Log(F("WebSocketEvent"), "Incoming JSON (Length: " + String(length) + "/" + String(json.measureLength()) + ")"); if (json.containsKey("forcedDuration")) { From 099f939fecbc83715dd8624664245959e5ef3b32 Mon Sep 17 00:00:00 2001 From: foorschtbar Date: Fri, 13 Oct 2023 15:20:17 +0200 Subject: [PATCH 26/30] Log error if message is to long --- src/PixelIt.ino | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/src/PixelIt.ino b/src/PixelIt.ino index 1c4b071..00dff62 100644 --- a/src/PixelIt.ino +++ b/src/PixelIt.ino @@ -1135,6 +1135,11 @@ void callback(char *topic, byte *payload, unsigned int length) Log("MQTT_callback", "Incoming JSON (Topic: " + String(topic) + ", Length: " + String(length) + "/" + String(json.measureLength()) + ") "); + if (length != json.measureLength()) + { + Log("MQTT_callback", "JSON length mismatch! JSON Message to long :("); + return; + } if (channel.equals("setScreen")) { CreateFrames(json); @@ -1170,13 +1175,13 @@ void webSocketEvent(uint8_t num, WStype_t type, uint8_t *payload, size_t length) } case WStype_CONNECTED: { - // Merken für was die Connection hergstellt wurde + // Remember for what the connection was established websocketConnection[num] = String((char *)payload); - // IP der Connection abfragen + // get ip IPAddress ip = webSocket.remoteIP(num); - // Logausgabe + // Logging Log(F("WebSocketEvent"), "[" + String(num) + "] Connected from " + ip.toString() + " url: " + websocketConnection[num]); // send message to client @@ -1196,8 +1201,13 @@ void webSocketEvent(uint8_t num, WStype_t type, uint8_t *payload, size_t length) JsonObject &json = jsonBuffer.parseObject(payload); int forcedDuration = 0; - // Logausgabe + // Logging Log(F("WebSocketEvent"), "Incoming JSON (Length: " + String(length) + "/" + String(json.measureLength()) + ")"); + if (length != json.measureLength()) + { + Log("MQTT_callback", "JSON length mismatch! JSON Message to long :("); + return; + } if (json.containsKey("forcedDuration")) { From 9a6523b4e83e9e2ef89824cf5881bd573a215668 Mon Sep 17 00:00:00 2001 From: foorschtbar Date: Fri, 13 Oct 2023 15:45:31 +0200 Subject: [PATCH 27/30] Optimized interval of sending mqtt/websocket messages (fixes #314) --- src/PixelIt.ino | 87 ++++++++++++++++++++++++++++--------------------- 1 file changed, 49 insertions(+), 38 deletions(-) diff --git a/src/PixelIt.ino b/src/PixelIt.ino index 00dff62..1d884e3 100644 --- a/src/PixelIt.ino +++ b/src/PixelIt.ino @@ -51,12 +51,19 @@ #include "Tools.h" #include "UpdateScreen.h" #include "Liveview.h" -#define TELEMETRY_INTERVAL 1000 * 60 * 60 * 12 // 12 Hours -#define CHECKUPDATE_INTERVAL 1000 * 60 * 6 * 8 // 8 Hours -#define CHECKUPDATESCREEN_INTERVAL 1000 * 60 * 30 // 30 Minutes -#define CHECKUPDATESCREEN_DURATION 1000 * 5 // 5 Seconds -#define SEND_LIVEVIEW_INTERVAL 250 // 0.5 Seconds, 0 to disable +// Internal Config +#define CHECKUPDATE_INTERVAL 1000 * 60 * 6 * 8 // 8 Hours +#define CHECKUPDATESCREEN_INTERVAL 1000 * 60 * 30 // 30 Minutes +#define CHECKUPDATESCREEN_DURATION 1000 * 5 // 5 Seconds +#define CONTROL_BRIGHTNESS_INTERVAL 1000 // 1000 Milliseconds +#define SEND_TELEMETRY_INTERVAL 1000 * 60 * 60 * 12 // 12 Hours +#define SEND_LIVEVIEW_INTERVAL 250 // 0.5 Seconds, 0 to disable +#define SEND_LUX_INTERVAL 1000 * 10 // 10 Seconds +#define SEND_MATRIXINFO_INTERVAL 1000 * 10 // 10 Seconds +#define SEND_SENSOR_INTERVAL 1000 * 3 // 3 Seconds + +// Version config - will be replaced by build piple with Git-Tag! #define VERSION "0.0.0-beta" // will be replaced by build piple with Git-Tag! #define XSTR(x) #x @@ -315,9 +322,9 @@ int animateBMPFrameCount = 0; // Sensors Vars unsigned long sendLuxPrevMillis = 0; +unsigned long getLuxPrevMillis = 0; unsigned long sendSensorPrevMillis = 0; unsigned long sendInfoPrevMillis = 0; -String oldGetMatrixInfo; String oldGetLuxSensor; String oldGetSensor; float currentLux = 0.0f; @@ -1185,7 +1192,7 @@ void webSocketEvent(uint8_t num, WStype_t type, uint8_t *payload, size_t length) Log(F("WebSocketEvent"), "[" + String(num) + "] Connected from " + ip.toString() + " url: " + websocketConnection[num]); // send message to client - SendMatrixInfo(true); + SendMatrixInfo(); SendLDR(true); SendSensor(true); SendConfig(); @@ -1980,6 +1987,7 @@ String GetSensor() { root["battery"] = "Not installed"; } + root["hostname"] = hostname; String json; root.printTo(json); @@ -1995,6 +2003,7 @@ String GetLuxSensor() JsonObject &root = jsonBuffer.createObject(); root["lux"] = currentLux; + root["hostname"] = hostname; String json; root.printTo(json); @@ -2009,6 +2018,7 @@ String GetBrightness() root["brightness_255"] = currentMatrixBrightness; root["brightness"] = map(currentMatrixBrightness, 0, 255, 0, 100); + root["hostname"] = hostname; String json; root.printTo(json); @@ -2064,6 +2074,7 @@ String GetButtons() { root[btnAPINames[button]] = btnLastPublishState[button] ? "true" : "false"; } + root["hostname"] = hostname; String json; root.printTo(json); @@ -3834,7 +3845,7 @@ void loop() // Send Telemetry data first time after 30.3 seconds // if necessary also check scrollTextAktivLoop = false; and animateBMPAktivLoop = false; if they are disturbed?! - if (sendTelemetry == true && ((sendTelemetryPrevMillis == 0 && millis() > 30300) || millis() - sendTelemetryPrevMillis >= TELEMETRY_INTERVAL)) + if (sendTelemetry == true && ((sendTelemetryPrevMillis == 0 && millis() > 30300) || millis() - sendTelemetryPrevMillis >= SEND_TELEMETRY_INTERVAL)) { sendTelemetryPrevMillis = millis(); SendTelemetry(); @@ -3949,9 +3960,10 @@ void loop() DrawClock(false); } - if (millis() - sendLuxPrevMillis >= 1000) + // Get Lunx and control brightness + if (millis() - getLuxPrevMillis >= SEND_LUX_INTERVAL) { - sendLuxPrevMillis = millis(); + getLuxPrevMillis = millis(); if (luxSensor == LuxSensor_BH1750) { @@ -3966,8 +3978,6 @@ void loop() currentLux = (roundf(photocell->getSmoothedLux() * 1000) / 1000) + luxOffset; } - SendLDR(false); - if (!sleepMode && matrixBrightnessAutomatic) { float newBrightness = map(currentLux, mbaLuxMin, mbaLuxMax, mbaDimMin, mbaDimMax); @@ -3990,7 +4000,15 @@ void loop() } } - if (millis() - sendSensorPrevMillis >= 3000) + // Send LDR values non-foreced + if (millis() - sendLuxPrevMillis >= SEND_LUX_INTERVAL) + { + sendLuxPrevMillis = millis(); + SendLDR(false); + } + + // Send Sensor values non-foreced + if (millis() - sendSensorPrevMillis >= SEND_SENSOR_INTERVAL) { sendSensorPrevMillis = millis(); SendSensor(false); @@ -3999,10 +4017,11 @@ void loop() // liveview liveview.loop(); - if (millis() - sendInfoPrevMillis >= 3000) + // send matrix info + if (millis() - sendInfoPrevMillis >= SEND_MATRIXINFO_INTERVAL) { sendInfoPrevMillis = millis(); - SendMatrixInfo(false); + SendMatrixInfo(); // SendMp3PlayerInfo(false); } @@ -4019,35 +4038,27 @@ void loop() } } -void SendMatrixInfo(bool force) +void SendMatrixInfo() { - if (force) - { - oldGetMatrixInfo = ""; - } - - String matrixInfo; - - // Prüfen ob die ermittlung der MatrixInfo überhaupt erforderlich ist + // Check if mqtt or websocket connected if ((mqttAktiv == true && client.connected()) || (webSocket.connectedClients() > 0)) { - matrixInfo = GetMatrixInfo(); - } - // Prüfen ob über MQTT versendet werden muss - if (mqttAktiv == true && client.connected() && oldGetMatrixInfo != matrixInfo) - { - client.publish((mqttMasterTopic + "matrixinfo").c_str(), matrixInfo.c_str(), true); - } - // Prüfen ob über Websocket versendet werden muss - if (webSocket.connectedClients() > 0 && oldGetMatrixInfo != matrixInfo) - { - for (uint i = 0; i < sizeof websocketConnection / sizeof websocketConnection[0]; i++) + String matrixInfo = GetMatrixInfo(); + + // Check if sending via MQTT is required + if (mqttAktiv == true && client.connected()) { - webSocket.sendTXT(i, "{\"sysinfo\":" + matrixInfo + "}"); + client.publish((mqttMasterTopic + "matrixinfo").c_str(), matrixInfo.c_str(), true); + } + // Check if sending via websocket is required + if (webSocket.connectedClients() > 0) + { + for (uint i = 0; i < sizeof websocketConnection / sizeof websocketConnection[0]; i++) + { + webSocket.sendTXT(i, "{\"sysinfo\":" + matrixInfo + "}"); + } } } - - oldGetMatrixInfo = matrixInfo; } void SendLDR(bool force) From 788db9f6b9a8d54a1ed0d273d5c2ead6d5dc8050 Mon Sep 17 00:00:00 2001 From: foorschtbar Date: Fri, 13 Oct 2023 16:09:52 +0200 Subject: [PATCH 28/30] Updated README --- README.md | 10 +++++++--- src/PixelIt.ino | 6 +++--- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 47f4804..a5db46f 100644 --- a/README.md +++ b/README.md @@ -113,12 +113,16 @@ Thanks to these great people for supporting this project. ### 2.4.x **WORK IN PROGRESS** -- (o0shojo0o) As of this version, it is possible to install via the new [webflasher](https://pixelit-project.github.io/firmware.html#flashing-web) -- (jekader) Remove duplication from platformio.ini [[#315](https://github.com/pixelit-project/PixelIt/issues/315)] -- (foorschtbar) Native support for [Ulanzi TC001 Pixel Clock](https://www.ulanzi.com/products/ulanzi-pixel-smart-clock-2882?aff=1181)\* (**Beta**, see [Releases](https://github.com/pixelit-project/PixelIt/releases)) :tada: +- (foorschtbar) Native support for [Ulanzi TC001 Pixel Clock](https://www.ulanzi.com/products/ulanzi-pixel-smart-clock-2882?aff=1181)\* :tada: - (foorschtbar) Display `zZz` on the matrix when the device going to sleep - (foorschtbar) Fixed issue with flickering icons, wenn device wake from sleep mode - (Metaln00b) Improved new firmware check by doing real version compare (major, minor, patch and prerelease) +- (o0shojo0o) As of this version, it is possible to install via the new [webflasher](https://pixelit-project.github.io/firmware.html#flashing-web) +- (jekader) Remove duplication from platformio.ini [[#315](https://github.com/pixelit-project/PixelIt/issues/315)] +- (foorschtbar) MQTT/Websocket message interval for sensors and matrix info are now minimum 10 seconds to reduce "noise" on the network +- (foorschtbar) Added support for SHT31 sensor +- (foorschtbar) Log error if MQTT or Websocket message is to long +- (jekader) Improve logging during pin assignment ### 2.3.2 (2023-09-16) diff --git a/src/PixelIt.ino b/src/PixelIt.ino index 7435acd..19f3627 100644 --- a/src/PixelIt.ino +++ b/src/PixelIt.ino @@ -61,7 +61,8 @@ #define SEND_LIVEVIEW_INTERVAL 250 // 0.5 Seconds, 0 to disable #define SEND_LUX_INTERVAL 1000 * 10 // 10 Seconds #define SEND_MATRIXINFO_INTERVAL 1000 * 10 // 10 Seconds -#define SEND_SENSOR_INTERVAL 1000 * 3 // 3 Seconds +#define SEND_SENSOR_INTERVAL 1000 * 3 // 10 Seconds +#define UPDATE_BATTERY_LEVEL_INTERVAL 1000 * 30 // 30 Seconds // Version config - will be replaced by build piple with Git-Tag! #define VERSION "0.0.0-beta" // will be replaced by build piple with Git-Tag! @@ -104,7 +105,6 @@ unsigned int ldrSmoothing = 0; // Battery stuff float batteryLevel = 0; unsigned long batteryLevelPrevMillis = 0; -const int BATTERY_LEVEL_INTERVAL = 30 * 1000; #ifndef MIN_BATTERY #define MIN_BATTERY 0 @@ -3794,7 +3794,7 @@ void loop() webSocket.loop(); // Update Battery level - if (millis() - batteryLevelPrevMillis >= BATTERY_LEVEL_INTERVAL) + if (millis() - batteryLevelPrevMillis >= UPDATE_BATTERY_LEVEL_INTERVAL) { batteryLevelPrevMillis = millis(); getBatteryVoltage(); From 1895a6c1e012cee30840591d9e2f4790da22cf68 Mon Sep 17 00:00:00 2001 From: foorschtbar Date: Fri, 13 Oct 2023 17:05:04 +0200 Subject: [PATCH 29/30] Added build section to matrix and telemetry info --- platformio.ini | 60 +++++++++++++++++++++++++++++++------------------ src/PixelIt.ino | 5 +++++ 2 files changed, 43 insertions(+), 22 deletions(-) diff --git a/platformio.ini b/platformio.ini index b8093c2..2de2099 100644 --- a/platformio.ini +++ b/platformio.ini @@ -16,6 +16,30 @@ extra_scripts = pre:extra_script.py build_flags = -DMATRIX_WIDTH=32 ; Pixel cols -DMATRIX_HEIGHT=8 ; Pixel rows +esp32_build_flags = + ${common.build_flags} + -DLDR_PIN=A0 + -DMATRIX_PIN=27 + -DDEFAULT_PIN_SCL="Pin_D1" + -DDEFAULT_PIN_SDA="Pin_D3" + -DDEFAULT_PIN_DFPRX="Pin_D7" + -DDEFAULT_PIN_DFPTX="Pin_D8" + -DDEFAULT_PIN_ONEWIRE="Pin_D1" + -DDEFAULT_MATRIX_TYPE=1 + -DDEFAULT_LDR=GL5516 + -DVBAT_PIN=0 +esp8266_build_flags = + ${common.build_flags} + -DLDR_PIN=A0 + -DMATRIX_PIN=D2 + -DDEFAULT_PIN_SCL="Pin_D1" + -DDEFAULT_PIN_SDA="Pin_D3" + -DDEFAULT_PIN_DFPRX="Pin_D7" + -DDEFAULT_PIN_DFPTX="Pin_D8" + -DDEFAULT_PIN_ONEWIRE="Pin_D1" + -DDEFAULT_MATRIX_TYPE=1 + -DDEFAULT_LDR=GL5516 + -DVBAT_PIN=0 lib_deps = adafruit/Adafruit BME280 Library@^2.0.2 adafruit/Adafruit BME680 Library@^2.0.1 @@ -48,17 +72,8 @@ monitor_speed = ${common.monitor_speed} extra_scripts = ${common.extra_scripts} upload_speed = ${common.upload_speed} build_flags = - ${common.build_flags} - -DLDR_PIN=A0 - -DMATRIX_PIN=27 - -DDEFAULT_PIN_SCL="Pin_D1" - -DDEFAULT_PIN_SDA="Pin_D3" - -DDEFAULT_PIN_DFPRX="Pin_D7" - -DDEFAULT_PIN_DFPTX="Pin_D8" - -DDEFAULT_PIN_ONEWIRE="Pin_D1" - -DDEFAULT_MATRIX_TYPE=1 - -DDEFAULT_LDR=GL5516 - -DVBAT_PIN=0 + ${common.esp32_build_flags} + -DBUILD_SECTION="ESP32_generic" platform_packages = framework-arduinoespressif32 @ https://github.com/espressif/arduino-esp32.git#2.0.14 toolchain-xtensa32@~2.80400.0 @@ -78,17 +93,8 @@ monitor_speed = ${common.monitor_speed} extra_scripts = ${common.extra_scripts} upload_speed = ${common.upload_speed} build_flags = - ${common.build_flags} - -DLDR_PIN=A0 - -DMATRIX_PIN=D2 - -DDEFAULT_PIN_SCL="Pin_D1" - -DDEFAULT_PIN_SDA="Pin_D3" - -DDEFAULT_PIN_DFPRX="Pin_D7" - -DDEFAULT_PIN_DFPTX="Pin_D8" - -DDEFAULT_PIN_ONEWIRE="Pin_D1" - -DDEFAULT_MATRIX_TYPE=1 - -DDEFAULT_LDR=GL5516 - -DVBAT_PIN=0 + ${common.esp8266_build_flags} + -DBUILD_SECTION="ESP8266_generic" lib_deps = ${common.lib_deps} mr-glt/SHA-1 Hash@^1.1.0 @@ -98,14 +104,23 @@ lib_deps = extends = env:ESP8266_generic monitor_filters = esp8266_exception_decoder board = d1_mini +build_flags = + ${common.esp8266_build_flags} + -DBUILD_SECTION='ESP8266_d1_mini' [env:ESP8266_nodemcuv2] extends = env:ESP8266_generic board = nodemcuv2 +build_flags = + ${common.esp8266_build_flags} + -DBUILD_SECTION="ESP8266_nodemcuv2" [env:ESP32_d1_mini32] extends = env:ESP32_generic board = wemos_d1_mini32 +build_flags = + ${common.esp32_build_flags} + -DBUILD_SECTION="ESP32_d1_mini32" [env:ESP32_ulanzi] extends = env:ESP32_generic @@ -124,3 +139,4 @@ build_flags = -DDEFAULT_LDR=GL5516 -DMIN_BATTERY=475 -DMAX_BATTERY=665 + -DBUILD_SECTION="ESP32_ulanzi" diff --git a/src/PixelIt.ino b/src/PixelIt.ino index 19f3627..aec8037 100644 --- a/src/PixelIt.ino +++ b/src/PixelIt.ino @@ -67,6 +67,7 @@ // Version config - will be replaced by build piple with Git-Tag! #define VERSION "0.0.0-beta" // will be replaced by build piple with Git-Tag! +// Workaround for String in defines #define XSTR(x) #x #define STR(x) XSTR(x) @@ -2035,6 +2036,7 @@ String GetMatrixInfo() //// Matrix Config root["note"] = note; root["hostname"] = hostname; + root["buildSection"] = STR(BUILD_SECTION); root["freeSketchSpace"] = ESP.getFreeSketchSpace(); root["wifiRSSI"] = WiFi.RSSI(); root["wifiQuality"] = GetRSSIasQuality(WiFi.RSSI()); @@ -2103,10 +2105,13 @@ String GetTelemetry() root["uuid"] = sha1(GetChipID()); root["version"] = VERSION; root["type"] = isESP8266 ? "esp8266" : "esp32"; + root["buildSection"] = STR(BUILD_SECTION); JsonObject &matrix = root.createNestedObject("matrix"); matrix["type"] = matrixType; matrix["name"] = MatrixTypeNames[matrixType - 1]; + matrix["width"] = MATRIX_WIDTH; + matrix["height"] = MATRIX_HEIGHT; JsonArray &sensors = root.createNestedArray("sensors"); sensors.add(LuxSensorNames[luxSensor]); From 56fd3e5b23c506823b43639c129fc7535c63250d Mon Sep 17 00:00:00 2001 From: foorschtbar Date: Fri, 13 Oct 2023 19:01:39 +0200 Subject: [PATCH 30/30] Updated README --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index a5db46f..45b9313 100644 --- a/README.md +++ b/README.md @@ -123,6 +123,7 @@ Thanks to these great people for supporting this project. - (foorschtbar) Added support for SHT31 sensor - (foorschtbar) Log error if MQTT or Websocket message is to long - (jekader) Improve logging during pin assignment +- (foorschtbar) Added build section from PIO config to matrix info and telemetry data ### 2.3.2 (2023-09-16)