From bb15a1ee527d83b08082e609f2f48b17137054d1 Mon Sep 17 00:00:00 2001 From: Chrome Legion Date: Thu, 13 Jun 2019 20:35:00 -0700 Subject: [PATCH 1/3] Qrome - added timezone to openweathermap as it is now in the response --- marquee/OpenWeatherMapClient.cpp | 13 +++++++++++-- marquee/OpenWeatherMapClient.h | 2 ++ marquee/marquee.ino | 2 +- 3 files changed, 14 insertions(+), 3 deletions(-) diff --git a/marquee/OpenWeatherMapClient.cpp b/marquee/OpenWeatherMapClient.cpp index 8d4e05b..0cb1b87 100644 --- a/marquee/OpenWeatherMapClient.cpp +++ b/marquee/OpenWeatherMapClient.cpp @@ -116,6 +116,7 @@ void OpenWeatherMapClient::updateWeather() { weathers[inx].direction = (const char*)root["list"][inx]["wind"]["deg"]; weathers[inx].high = (const char*)root["list"][inx]["main"]["temp_max"]; weathers[inx].low = (const char*)root["list"][inx]["main"]["temp_min"]; + weathers[inx].timeZone = (const char*)root["list"][inx]["sys"]["timezone"]; if (units == "metric") { // convert to kph from m/s @@ -142,6 +143,7 @@ void OpenWeatherMapClient::updateWeather() { Serial.println("weatherId: " + weathers[inx].weatherId); Serial.println("description: " + weathers[inx].description); Serial.println("icon: " + weathers[inx].icon); + Serial.println("timezone: " + String(getTimeZone(inx))); Serial.println(); } @@ -305,8 +307,15 @@ String OpenWeatherMapClient::getWeekDay(int index, float offset) { return rtnValue; } -String OpenWeatherMapClient::getWeatherIcon(int index) -{ +int OpenWeatherMapClient::getTimeZone(int index) { + int rtnValue = weathers[index].timeZone.toInt(); + if (rtnValue != 0) { + rtnValue = rtnValue / 3600; + } + return rtnValue; +} + +String OpenWeatherMapClient::getWeatherIcon(int index) { int id = getWeatherId(index).toInt(); String W = ")"; switch(id) diff --git a/marquee/OpenWeatherMapClient.h b/marquee/OpenWeatherMapClient.h index 636acd0..9004267 100644 --- a/marquee/OpenWeatherMapClient.h +++ b/marquee/OpenWeatherMapClient.h @@ -53,6 +53,7 @@ class OpenWeatherMapClient { String direction; String high; String low; + String timeZone; } weather; weather weathers[5]; @@ -91,4 +92,5 @@ class OpenWeatherMapClient { String getWeatherIcon(int index); String getError(); String getWeekDay(int index, float offset); + int getTimeZone(int index); }; diff --git a/marquee/marquee.ino b/marquee/marquee.ino index 48af062..16af4a8 100644 --- a/marquee/marquee.ino +++ b/marquee/marquee.ino @@ -27,7 +27,7 @@ #include "Settings.h" -#define VERSION "2.14" +#define VERSION "2.15" #define HOSTNAME "CLOCK-" #define CONFIG "/conf.txt" From 3304560730288757a80d18d23b5191c7be536334 Mon Sep 17 00:00:00 2001 From: David Payne Date: Wed, 3 Jul 2019 13:23:35 -0700 Subject: [PATCH 2/3] Qrome - added wind direction text --- marquee/OpenWeatherMapClient.cpp | 780 +++---- marquee/OpenWeatherMapClient.h | 193 +- marquee/marquee.ino | 3416 +++++++++++++++--------------- 3 files changed, 2199 insertions(+), 2190 deletions(-) diff --git a/marquee/OpenWeatherMapClient.cpp b/marquee/OpenWeatherMapClient.cpp index 0cb1b87..a62b78c 100644 --- a/marquee/OpenWeatherMapClient.cpp +++ b/marquee/OpenWeatherMapClient.cpp @@ -1,386 +1,394 @@ -/** The MIT License (MIT) - -Copyright (c) 2018 David Payne - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. -*/ - -#include "OpenWeatherMapClient.h" - -OpenWeatherMapClient::OpenWeatherMapClient(String ApiKey, int CityIDs[], int cityCount, boolean isMetric) { - updateCityIdList(CityIDs, cityCount); - myApiKey = ApiKey; - setMetric(isMetric); -} - -void OpenWeatherMapClient::updateWeatherApiKey(String ApiKey) { - myApiKey = ApiKey; -} - -void OpenWeatherMapClient::updateWeather() { - WiFiClient weatherClient; - String apiGetData = "GET /data/2.5/group?id=" + myCityIDs + "&units=" + units + "&cnt=1&APPID=" + myApiKey + " HTTP/1.1"; - - Serial.println("Getting Weather Data"); - Serial.println(apiGetData); - weathers[0].cached = false; - weathers[0].error = ""; - if (weatherClient.connect(servername, 80)) { //starts client connection, checks for connection - weatherClient.println(apiGetData); - weatherClient.println("Host: " + String(servername)); - weatherClient.println("User-Agent: ArduinoWiFi/1.1"); - weatherClient.println("Connection: close"); - weatherClient.println(); - } - else { - Serial.println("connection for weather data failed"); //error message if no client connect - Serial.println(); - weathers[0].error = "Connection for weather data failed"; - return; - } - - while(weatherClient.connected() && !weatherClient.available()) delay(1); //waits for data - - Serial.println("Waiting for data"); - - // Check HTTP status - char status[32] = {0}; - weatherClient.readBytesUntil('\r', status, sizeof(status)); - Serial.println("Response Header: " + String(status)); - if (strcmp(status, "HTTP/1.1 200 OK") != 0) { - Serial.print(F("Unexpected response: ")); - Serial.println(status); - weathers[0].error = "Weather Data Error: " + String(status); - return; - } - - // Skip HTTP headers - char endOfHeaders[] = "\r\n\r\n"; - if (!weatherClient.find(endOfHeaders)) { - Serial.println(F("Invalid response")); - return; - } - - const size_t bufferSize = 710; - DynamicJsonBuffer jsonBuffer(bufferSize); - - // Parse JSON object - JsonObject& root = jsonBuffer.parseObject(weatherClient); - if (!root.success()) { - Serial.println(F("Weather Data Parsing failed!")); - weathers[0].error = "Weather Data Parsing failed!"; - return; - } - - weatherClient.stop(); //stop client - - if (root.measureLength() <= 150) { - Serial.println("Error Does not look like we got the data. Size: " + String(root.measureLength())); - weathers[0].cached = true; - weathers[0].error = (const char*)root["message"]; - Serial.println("Error: " + weathers[0].error); - return; - } - int count = root["cnt"]; - - for (int inx = 0; inx < count; inx++) { - weathers[inx].lat = (const char*)root["list"][inx]["coord"]["lat"]; - weathers[inx].lon = (const char*)root["list"][inx]["coord"]["lon"]; - weathers[inx].dt = (const char*)root["list"][inx]["dt"]; - weathers[inx].city = (const char*)root["list"][inx]["name"]; - weathers[inx].country = (const char*)root["list"][inx]["sys"]["country"]; - weathers[inx].temp = (const char*)root["list"][inx]["main"]["temp"]; - weathers[inx].humidity = (const char*)root["list"][inx]["main"]["humidity"]; - weathers[inx].condition = (const char*)root["list"][inx]["weather"][0]["main"]; - weathers[inx].wind = (const char*)root["list"][inx]["wind"]["speed"]; - weathers[inx].weatherId = (const char*)root["list"][inx]["weather"][0]["id"]; - weathers[inx].description = (const char*)root["list"][inx]["weather"][0]["description"]; - weathers[inx].icon = (const char*)root["list"][inx]["weather"][0]["icon"]; - weathers[inx].pressure = (const char*)root["list"][inx]["main"]["pressure"]; - weathers[inx].direction = (const char*)root["list"][inx]["wind"]["deg"]; - weathers[inx].high = (const char*)root["list"][inx]["main"]["temp_max"]; - weathers[inx].low = (const char*)root["list"][inx]["main"]["temp_min"]; - weathers[inx].timeZone = (const char*)root["list"][inx]["sys"]["timezone"]; - - if (units == "metric") { - // convert to kph from m/s - float f = (weathers[inx].wind.toFloat() * 3.6); - weathers[inx].wind = String(f); - } - - if (units != "metric") - { - float p = (weathers[inx].pressure.toFloat() * 0.0295301); //convert millibars to inches - weathers[inx].pressure = String(p); - } - - Serial.println("lat: " + weathers[inx].lat); - Serial.println("lon: " + weathers[inx].lon); - Serial.println("dt: " + weathers[inx].dt); - Serial.println("city: " + weathers[inx].city); - Serial.println("country: " + weathers[inx].country); - Serial.println("temp: " + weathers[inx].temp); - Serial.println("humidity: " + weathers[inx].humidity); - Serial.println("condition: " + weathers[inx].condition); - Serial.println("wind: " + weathers[inx].wind); - Serial.println("direction: " + weathers[inx].direction); - Serial.println("weatherId: " + weathers[inx].weatherId); - Serial.println("description: " + weathers[inx].description); - Serial.println("icon: " + weathers[inx].icon); - Serial.println("timezone: " + String(getTimeZone(inx))); - Serial.println(); - - } -} - -String OpenWeatherMapClient::roundValue(String value) { - float f = value.toFloat(); - int rounded = (int)(f+0.5f); - return String(rounded); -} - -void OpenWeatherMapClient::updateCityIdList(int CityIDs[], int cityCount) { - myCityIDs = ""; - for (int inx = 0; inx < cityCount; inx++) { - if (CityIDs[inx] > 0) { - if (myCityIDs != "") { - myCityIDs = myCityIDs + ","; - } - myCityIDs = myCityIDs + String(CityIDs[inx]); - } - } -} - -void OpenWeatherMapClient::setMetric(boolean isMetric) { - if (isMetric) { - units = "metric"; - } else { - units = "imperial"; - } -} - -String OpenWeatherMapClient::getLat(int index) { - return weathers[index].lat; -} - -String OpenWeatherMapClient::getLon(int index) { - return weathers[index].lon; -} - -String OpenWeatherMapClient::getDt(int index) { - return weathers[index].dt; -} - -String OpenWeatherMapClient::getCity(int index) { - return weathers[index].city; -} - -String OpenWeatherMapClient::getCountry(int index) { - return weathers[index].country; -} - -String OpenWeatherMapClient::getTemp(int index) { - return weathers[index].temp; -} - -String OpenWeatherMapClient::getTempRounded(int index) { - return roundValue(getTemp(index)); -} - -String OpenWeatherMapClient::getHumidity(int index) { - return weathers[index].humidity; -} - -String OpenWeatherMapClient::getHumidityRounded(int index) { - return roundValue(getHumidity(index)); -} - -String OpenWeatherMapClient::getCondition(int index) { - return weathers[index].condition; -} - -String OpenWeatherMapClient::getWind(int index) { - return weathers[index].wind; -} - -String OpenWeatherMapClient::getDirection(int index) -{ - return weathers[index].direction; -} - -String OpenWeatherMapClient::getDirectionRounded(int index) -{ - return roundValue(getDirection(index)); -} - -String OpenWeatherMapClient::getWindRounded(int index) { - return roundValue(getWind(index)); -} - -String OpenWeatherMapClient::getWeatherId(int index) { - return weathers[index].weatherId; -} - -String OpenWeatherMapClient::getDescription(int index) { - return weathers[index].description; -} - -String OpenWeatherMapClient::getPressure(int index) -{ - return weathers[index].pressure; -} - -String OpenWeatherMapClient::getHigh(int index) -{ - return weathers[index].high; -} - -String OpenWeatherMapClient::getLow(int index) -{ - return weathers[index].low; -} - -String OpenWeatherMapClient::getIcon(int index) { - return weathers[index].icon; -} - -boolean OpenWeatherMapClient::getCached() { - return weathers[0].cached; -} - -String OpenWeatherMapClient::getMyCityIDs() { - return myCityIDs; -} - -String OpenWeatherMapClient::getError() { - return weathers[0].error; -} - -String OpenWeatherMapClient::getWeekDay(int index, float offset) { - String rtnValue = ""; - long epoc = weathers[index].dt.toInt(); - long day = 0; - if (epoc != 0) { - day = (((epoc + (3600 * (int)offset)) / 86400) + 4) % 7; - switch (day) { - case 0: - rtnValue = "Sunday"; - break; - case 1: - rtnValue = "Monday"; - break; - case 2: - rtnValue = "Tuesday"; - break; - case 3: - rtnValue = "Wednesday"; - break; - case 4: - rtnValue = "Thursday"; - break; - case 5: - rtnValue = "Friday"; - break; - case 6: - rtnValue = "Saturday"; - break; - default: - break; - } - } - return rtnValue; -} - -int OpenWeatherMapClient::getTimeZone(int index) { - int rtnValue = weathers[index].timeZone.toInt(); - if (rtnValue != 0) { - rtnValue = rtnValue / 3600; - } - return rtnValue; -} - -String OpenWeatherMapClient::getWeatherIcon(int index) { - int id = getWeatherId(index).toInt(); - String W = ")"; - switch(id) - { - case 800: W = "B"; break; - case 801: W = "Y"; break; - case 802: W = "H"; break; - case 803: W = "H"; break; - case 804: W = "Y"; break; - - case 200: W = "0"; break; - case 201: W = "0"; break; - case 202: W = "0"; break; - case 210: W = "0"; break; - case 211: W = "0"; break; - case 212: W = "0"; break; - case 221: W = "0"; break; - case 230: W = "0"; break; - case 231: W = "0"; break; - case 232: W = "0"; break; - - case 300: W = "R"; break; - case 301: W = "R"; break; - case 302: W = "R"; break; - case 310: W = "R"; break; - case 311: W = "R"; break; - case 312: W = "R"; break; - case 313: W = "R"; break; - case 314: W = "R"; break; - case 321: W = "R"; break; - - case 500: W = "R"; break; - case 501: W = "R"; break; - case 502: W = "R"; break; - case 503: W = "R"; break; - case 504: W = "R"; break; - case 511: W = "R"; break; - case 520: W = "R"; break; - case 521: W = "R"; break; - case 522: W = "R"; break; - case 531: W = "R"; break; - - case 600: W = "W"; break; - case 601: W = "W"; break; - case 602: W = "W"; break; - case 611: W = "W"; break; - case 612: W = "W"; break; - case 615: W = "W"; break; - case 616: W = "W"; break; - case 620: W = "W"; break; - case 621: W = "W"; break; - case 622: W = "W"; break; - - case 701: W = "M"; break; - case 711: W = "M"; break; - case 721: W = "M"; break; - case 731: W = "M"; break; - case 741: W = "M"; break; - case 751: W = "M"; break; - case 761: W = "M"; break; - case 762: W = "M"; break; - case 771: W = "M"; break; - case 781: W = "M"; break; - - default:break; - } - return W; -} +/** The MIT License (MIT) + +Copyright (c) 2018 David Payne + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +*/ + +#include "OpenWeatherMapClient.h" +#include "math.h" + +OpenWeatherMapClient::OpenWeatherMapClient(String ApiKey, int CityIDs[], int cityCount, boolean isMetric) { + updateCityIdList(CityIDs, cityCount); + myApiKey = ApiKey; + setMetric(isMetric); +} + +void OpenWeatherMapClient::updateWeatherApiKey(String ApiKey) { + myApiKey = ApiKey; +} + +void OpenWeatherMapClient::updateWeather() { + WiFiClient weatherClient; + String apiGetData = "GET /data/2.5/group?id=" + myCityIDs + "&units=" + units + "&cnt=1&APPID=" + myApiKey + " HTTP/1.1"; + + Serial.println("Getting Weather Data"); + Serial.println(apiGetData); + weathers[0].cached = false; + weathers[0].error = ""; + if (weatherClient.connect(servername, 80)) { //starts client connection, checks for connection + weatherClient.println(apiGetData); + weatherClient.println("Host: " + String(servername)); + weatherClient.println("User-Agent: ArduinoWiFi/1.1"); + weatherClient.println("Connection: close"); + weatherClient.println(); + } + else { + Serial.println("connection for weather data failed"); //error message if no client connect + Serial.println(); + weathers[0].error = "Connection for weather data failed"; + return; + } + + while(weatherClient.connected() && !weatherClient.available()) delay(1); //waits for data + + Serial.println("Waiting for data"); + + // Check HTTP status + char status[32] = {0}; + weatherClient.readBytesUntil('\r', status, sizeof(status)); + Serial.println("Response Header: " + String(status)); + if (strcmp(status, "HTTP/1.1 200 OK") != 0) { + Serial.print(F("Unexpected response: ")); + Serial.println(status); + weathers[0].error = "Weather Data Error: " + String(status); + return; + } + + // Skip HTTP headers + char endOfHeaders[] = "\r\n\r\n"; + if (!weatherClient.find(endOfHeaders)) { + Serial.println(F("Invalid response")); + return; + } + + const size_t bufferSize = 710; + DynamicJsonBuffer jsonBuffer(bufferSize); + + // Parse JSON object + JsonObject& root = jsonBuffer.parseObject(weatherClient); + if (!root.success()) { + Serial.println(F("Weather Data Parsing failed!")); + weathers[0].error = "Weather Data Parsing failed!"; + return; + } + + weatherClient.stop(); //stop client + + if (root.measureLength() <= 150) { + Serial.println("Error Does not look like we got the data. Size: " + String(root.measureLength())); + weathers[0].cached = true; + weathers[0].error = (const char*)root["message"]; + Serial.println("Error: " + weathers[0].error); + return; + } + int count = root["cnt"]; + + for (int inx = 0; inx < count; inx++) { + weathers[inx].lat = (const char*)root["list"][inx]["coord"]["lat"]; + weathers[inx].lon = (const char*)root["list"][inx]["coord"]["lon"]; + weathers[inx].dt = (const char*)root["list"][inx]["dt"]; + weathers[inx].city = (const char*)root["list"][inx]["name"]; + weathers[inx].country = (const char*)root["list"][inx]["sys"]["country"]; + weathers[inx].temp = (const char*)root["list"][inx]["main"]["temp"]; + weathers[inx].humidity = (const char*)root["list"][inx]["main"]["humidity"]; + weathers[inx].condition = (const char*)root["list"][inx]["weather"][0]["main"]; + weathers[inx].wind = (const char*)root["list"][inx]["wind"]["speed"]; + weathers[inx].weatherId = (const char*)root["list"][inx]["weather"][0]["id"]; + weathers[inx].description = (const char*)root["list"][inx]["weather"][0]["description"]; + weathers[inx].icon = (const char*)root["list"][inx]["weather"][0]["icon"]; + weathers[inx].pressure = (const char*)root["list"][inx]["main"]["pressure"]; + weathers[inx].direction = (const char*)root["list"][inx]["wind"]["deg"]; + weathers[inx].high = (const char*)root["list"][inx]["main"]["temp_max"]; + weathers[inx].low = (const char*)root["list"][inx]["main"]["temp_min"]; + weathers[inx].timeZone = (const char*)root["list"][inx]["sys"]["timezone"]; + + if (units == "metric") { + // convert to kph from m/s + float f = (weathers[inx].wind.toFloat() * 3.6); + weathers[inx].wind = String(f); + } + + if (units != "metric") + { + float p = (weathers[inx].pressure.toFloat() * 0.0295301); //convert millibars to inches + weathers[inx].pressure = String(p); + } + + Serial.println("lat: " + weathers[inx].lat); + Serial.println("lon: " + weathers[inx].lon); + Serial.println("dt: " + weathers[inx].dt); + Serial.println("city: " + weathers[inx].city); + Serial.println("country: " + weathers[inx].country); + Serial.println("temp: " + weathers[inx].temp); + Serial.println("humidity: " + weathers[inx].humidity); + Serial.println("condition: " + weathers[inx].condition); + Serial.println("wind: " + weathers[inx].wind); + Serial.println("direction: " + weathers[inx].direction); + Serial.println("weatherId: " + weathers[inx].weatherId); + Serial.println("description: " + weathers[inx].description); + Serial.println("icon: " + weathers[inx].icon); + Serial.println("timezone: " + String(getTimeZone(inx))); + Serial.println(); + + } +} + +String OpenWeatherMapClient::roundValue(String value) { + float f = value.toFloat(); + int rounded = (int)(f+0.5f); + return String(rounded); +} + +void OpenWeatherMapClient::updateCityIdList(int CityIDs[], int cityCount) { + myCityIDs = ""; + for (int inx = 0; inx < cityCount; inx++) { + if (CityIDs[inx] > 0) { + if (myCityIDs != "") { + myCityIDs = myCityIDs + ","; + } + myCityIDs = myCityIDs + String(CityIDs[inx]); + } + } +} + +void OpenWeatherMapClient::setMetric(boolean isMetric) { + if (isMetric) { + units = "metric"; + } else { + units = "imperial"; + } +} + +String OpenWeatherMapClient::getLat(int index) { + return weathers[index].lat; +} + +String OpenWeatherMapClient::getLon(int index) { + return weathers[index].lon; +} + +String OpenWeatherMapClient::getDt(int index) { + return weathers[index].dt; +} + +String OpenWeatherMapClient::getCity(int index) { + return weathers[index].city; +} + +String OpenWeatherMapClient::getCountry(int index) { + return weathers[index].country; +} + +String OpenWeatherMapClient::getTemp(int index) { + return weathers[index].temp; +} + +String OpenWeatherMapClient::getTempRounded(int index) { + return roundValue(getTemp(index)); +} + +String OpenWeatherMapClient::getHumidity(int index) { + return weathers[index].humidity; +} + +String OpenWeatherMapClient::getHumidityRounded(int index) { + return roundValue(getHumidity(index)); +} + +String OpenWeatherMapClient::getCondition(int index) { + return weathers[index].condition; +} + +String OpenWeatherMapClient::getWind(int index) { + return weathers[index].wind; +} + +String OpenWeatherMapClient::getDirection(int index) +{ + return weathers[index].direction; +} + +String OpenWeatherMapClient::getDirectionRounded(int index) +{ + return roundValue(getDirection(index)); +} + +String OpenWeatherMapClient::getDirectionText(int index) { + int num = getDirectionRounded(index).toInt(); + int val = floor((num / 22.5) + 0.5); + String arr[] = {"N", "NNE", "NE", "ENE", "E", "ESE", "SE", "SSE", "S", "SSW", "SW", "WSW", "W", "WNW", "NW", "NNW"}; + return arr[(val % 16)]; +} + +String OpenWeatherMapClient::getWindRounded(int index) { + return roundValue(getWind(index)); +} + +String OpenWeatherMapClient::getWeatherId(int index) { + return weathers[index].weatherId; +} + +String OpenWeatherMapClient::getDescription(int index) { + return weathers[index].description; +} + +String OpenWeatherMapClient::getPressure(int index) +{ + return weathers[index].pressure; +} + +String OpenWeatherMapClient::getHigh(int index) +{ + return weathers[index].high; +} + +String OpenWeatherMapClient::getLow(int index) +{ + return weathers[index].low; +} + +String OpenWeatherMapClient::getIcon(int index) { + return weathers[index].icon; +} + +boolean OpenWeatherMapClient::getCached() { + return weathers[0].cached; +} + +String OpenWeatherMapClient::getMyCityIDs() { + return myCityIDs; +} + +String OpenWeatherMapClient::getError() { + return weathers[0].error; +} + +String OpenWeatherMapClient::getWeekDay(int index, float offset) { + String rtnValue = ""; + long epoc = weathers[index].dt.toInt(); + long day = 0; + if (epoc != 0) { + day = (((epoc + (3600 * (int)offset)) / 86400) + 4) % 7; + switch (day) { + case 0: + rtnValue = "Sunday"; + break; + case 1: + rtnValue = "Monday"; + break; + case 2: + rtnValue = "Tuesday"; + break; + case 3: + rtnValue = "Wednesday"; + break; + case 4: + rtnValue = "Thursday"; + break; + case 5: + rtnValue = "Friday"; + break; + case 6: + rtnValue = "Saturday"; + break; + default: + break; + } + } + return rtnValue; +} + +int OpenWeatherMapClient::getTimeZone(int index) { + int rtnValue = weathers[index].timeZone.toInt(); + if (rtnValue != 0) { + rtnValue = rtnValue / 3600; + } + return rtnValue; +} + +String OpenWeatherMapClient::getWeatherIcon(int index) { + int id = getWeatherId(index).toInt(); + String W = ")"; + switch(id) + { + case 800: W = "B"; break; + case 801: W = "Y"; break; + case 802: W = "H"; break; + case 803: W = "H"; break; + case 804: W = "Y"; break; + + case 200: W = "0"; break; + case 201: W = "0"; break; + case 202: W = "0"; break; + case 210: W = "0"; break; + case 211: W = "0"; break; + case 212: W = "0"; break; + case 221: W = "0"; break; + case 230: W = "0"; break; + case 231: W = "0"; break; + case 232: W = "0"; break; + + case 300: W = "R"; break; + case 301: W = "R"; break; + case 302: W = "R"; break; + case 310: W = "R"; break; + case 311: W = "R"; break; + case 312: W = "R"; break; + case 313: W = "R"; break; + case 314: W = "R"; break; + case 321: W = "R"; break; + + case 500: W = "R"; break; + case 501: W = "R"; break; + case 502: W = "R"; break; + case 503: W = "R"; break; + case 504: W = "R"; break; + case 511: W = "R"; break; + case 520: W = "R"; break; + case 521: W = "R"; break; + case 522: W = "R"; break; + case 531: W = "R"; break; + + case 600: W = "W"; break; + case 601: W = "W"; break; + case 602: W = "W"; break; + case 611: W = "W"; break; + case 612: W = "W"; break; + case 615: W = "W"; break; + case 616: W = "W"; break; + case 620: W = "W"; break; + case 621: W = "W"; break; + case 622: W = "W"; break; + + case 701: W = "M"; break; + case 711: W = "M"; break; + case 721: W = "M"; break; + case 731: W = "M"; break; + case 741: W = "M"; break; + case 751: W = "M"; break; + case 761: W = "M"; break; + case 762: W = "M"; break; + case 771: W = "M"; break; + case 781: W = "M"; break; + + default:break; + } + return W; +} diff --git a/marquee/OpenWeatherMapClient.h b/marquee/OpenWeatherMapClient.h index 9004267..fa56e13 100644 --- a/marquee/OpenWeatherMapClient.h +++ b/marquee/OpenWeatherMapClient.h @@ -1,96 +1,97 @@ -/** The MIT License (MIT) - -Copyright (c) 2018 David Payne - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. -*/ - -#pragma once -#include -#include "libs/ArduinoJson/ArduinoJson.h" - -class OpenWeatherMapClient { - -private: - String myCityIDs = ""; - String myApiKey = ""; - String units = ""; - - const char* servername = "api.openweathermap.org"; // remote server we will connect to - - typedef struct { - String lat; - String lon; - String dt; - String city; - String country; - String temp; - String humidity; - String condition; - String wind; - String weatherId; - String description; - String icon; - boolean cached; - String error; - String pressure; - String direction; - String high; - String low; - String timeZone; - } weather; - - weather weathers[5]; - - String roundValue(String value); - -public: - OpenWeatherMapClient(String ApiKey, int CityIDs[], int cityCount, boolean isMetric); - void updateWeather(); - void updateWeatherApiKey(String ApiKey); - void updateCityIdList(int CityIDs[], int cityCount); - void setMetric(boolean isMetric); - - String getLat(int index); - String getLon(int index); - String getDt(int index); - String getCity(int index); - String getCountry(int index); - String getTemp(int index); - String getTempRounded(int index); - String getHumidity(int index); - String getHumidityRounded(int index); - String getCondition(int index); - String getWind(int index); - String getWindRounded(int index); - String getDirection(int index); - String getDirectionRounded(int index); - String getPressure(int index); - String getHigh(int index); - String getLow(int index); - String getWeatherId(int index); - String getDescription(int index); - String getIcon(int index); - boolean getCached(); - String getMyCityIDs(); - String getWeatherIcon(int index); - String getError(); - String getWeekDay(int index, float offset); - int getTimeZone(int index); -}; +/** The MIT License (MIT) + +Copyright (c) 2018 David Payne + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +*/ + +#pragma once +#include +#include "libs/ArduinoJson/ArduinoJson.h" + +class OpenWeatherMapClient { + +private: + String myCityIDs = ""; + String myApiKey = ""; + String units = ""; + + const char* servername = "api.openweathermap.org"; // remote server we will connect to + + typedef struct { + String lat; + String lon; + String dt; + String city; + String country; + String temp; + String humidity; + String condition; + String wind; + String weatherId; + String description; + String icon; + boolean cached; + String error; + String pressure; + String direction; + String high; + String low; + String timeZone; + } weather; + + weather weathers[5]; + + String roundValue(String value); + +public: + OpenWeatherMapClient(String ApiKey, int CityIDs[], int cityCount, boolean isMetric); + void updateWeather(); + void updateWeatherApiKey(String ApiKey); + void updateCityIdList(int CityIDs[], int cityCount); + void setMetric(boolean isMetric); + + String getLat(int index); + String getLon(int index); + String getDt(int index); + String getCity(int index); + String getCountry(int index); + String getTemp(int index); + String getTempRounded(int index); + String getHumidity(int index); + String getHumidityRounded(int index); + String getCondition(int index); + String getWind(int index); + String getWindRounded(int index); + String getDirection(int index); + String getDirectionRounded(int index); + String getDirectionText(int index); + String getPressure(int index); + String getHigh(int index); + String getLow(int index); + String getWeatherId(int index); + String getDescription(int index); + String getIcon(int index); + boolean getCached(); + String getMyCityIDs(); + String getWeatherIcon(int index); + String getError(); + String getWeekDay(int index, float offset); + int getTimeZone(int index); +}; diff --git a/marquee/marquee.ino b/marquee/marquee.ino index 16af4a8..e5ee9eb 100644 --- a/marquee/marquee.ino +++ b/marquee/marquee.ino @@ -1,1708 +1,1708 @@ -/** The MIT License (MIT) - - Copyright (c) 2018 David Payne - - Permission is hereby granted, free of charge, to any person obtaining a copy - of this software and associated documentation files (the "Software"), to deal - in the Software without restriction, including without limitation the rights - to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - copies of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: - - The above copyright notice and this permission notice shall be included in all - copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - SOFTWARE. -*/ - -/********************************************** - Edit Settings.h for personalization -***********************************************/ - -#include "Settings.h" - -#define VERSION "2.15" - -#define HOSTNAME "CLOCK-" -#define CONFIG "/conf.txt" -#define BUZZER_PIN D2 - -/* Useful Constants */ -#define SECS_PER_MIN (60UL) -#define SECS_PER_HOUR (3600UL) -#define SECS_PER_DAY (SECS_PER_HOUR * 24L) - -/* Useful Macros for getting elapsed time */ -#define numberOfSeconds(_time_) (_time_ % SECS_PER_MIN) -#define numberOfMinutes(_time_) ((_time_ / SECS_PER_MIN) % SECS_PER_MIN) -#define numberOfHours(_time_) (( _time_% SECS_PER_DAY) / SECS_PER_HOUR) -#define elapsedDays(_time_) ( _time_ / SECS_PER_DAY) - -//declairing prototypes -void configModeCallback (WiFiManager *myWiFiManager); -int8_t getWifiQuality(); - -// LED Settings -const int offset = 1; -int refresh = 0; -String message = "hello"; -int spacer = 1; // dots between letters -int width = 5 + spacer; // The font width is 5 pixels + spacer -Max72xxPanel matrix = Max72xxPanel(pinCS, numberOfHorizontalDisplays, numberOfVerticalDisplays); -String Wide_Clock_Style = "1"; //1="hh:mm Temp", 2="hh:mm:ss", 3="hh:mm" -float UtcOffset; //time zone offsets that correspond with the CityID above (offset from GMT) - -// Time -TimeDB TimeDB(""); -String lastMinute = "xx"; -int displayRefreshCount = 1; -long lastEpoch = 0; -long firstEpoch = 0; -long displayOffEpoch = 0; -boolean displayOn = true; - -// News Client -NewsApiClient newsClient(NEWS_API_KEY, NEWS_SOURCE); -int newsIndex = 0; - -// Weather Client -OpenWeatherMapClient weatherClient(APIKEY, CityIDs, 1, IS_METRIC); -// (some) Default Weather Settings -boolean SHOW_DATE = false; -boolean SHOW_CITY = true; -boolean SHOW_CONDITION = true; -boolean SHOW_HUMIDITY = true; -boolean SHOW_WIND = true; -boolean SHOW_WINDDIR = true; -boolean SHOW_PRESSURE = false; -boolean SHOW_HIGHLOW = true; - -// OctoPrint Client -OctoPrintClient printerClient(OctoPrintApiKey, OctoPrintServer, OctoPrintPort, OctoAuthUser, OctoAuthPass); -int printerCount = 0; - -// Pi-hole Client -PiHoleClient piholeClient; - -// Bitcoin Client -BitcoinApiClient bitcoinClient; - -ESP8266WebServer server(WEBSERVER_PORT); -ESP8266HTTPUpdateServer serverUpdater; - -static const char WEB_ACTIONS1[] PROGMEM = " Home" - " Configure" - " News" - " OctoPrint"; - -static const char WEB_ACTIONS2[] PROGMEM = " Bitcoin" - " Pi-hole" - " Refresh Data" - ""; - -static const char WEB_ACTION3[] PROGMEM = " Reset Settings" - " Forget WiFi" - " Firmware Update" - " About"; - -static const char CHANGE_FORM1[] PROGMEM = "

Configure:

" - "" - "" - "" - "" - "

" - "

" - "

Use Metric (Celsius)

" - "

Display Date

" - "

Display City Name

" - "

Display Daily High/Low Temperatures

" - "

Display Weather Condition

" - "

Display Humidity

" - "

Display Wind

" - "

Display Barometric Pressure

" - "

Use 24 Hour Clock (military time)

"; - -static const char CHANGE_FORM2[] PROGMEM = "

Show PM indicator (only 12h format)

" - "

Flash : in the time

" - "

" - "

" - "

" - "

Display Brightness

" - "

Display Scroll Speed

" - "

Minutes Between Refresh Data

" - "

Minutes Between Scrolling Data

"; - -static const char CHANGE_FORM3[] PROGMEM = "

Use Security Credentials for Configuration Changes

" - "

" - "

" - "

" - ""; - -static const char BITCOIN_FORM[] PROGMEM = "

Bitcoin Configuration:

" - "

Select Bitcoin Currency

" - "
"; - -static const char CURRENCY_OPTIONS[] PROGMEM = "" - "" - "" - "" - "" - "" - "" - "" - "" - ""; - -static const char WIDECLOCK_FORM[] PROGMEM = "

Wide Clock Configuration:

" - "

Wide Clock Display Format

" - "
"; - -static const char PIHOLE_FORM[] PROGMEM = "

Pi-hole Configuration:

" - "

Show Pi-hole Statistics

" - "" - "" - "

" - "
" - ""; - -static const char PIHOLE_TEST[] PROGMEM = ""; - -static const char NEWS_FORM1[] PROGMEM = "

News Configuration:

" - "

Display News Headlines

" - "" - "" - "

Select News Source

" - "" - "
"; - -static const char OCTO_FORM[] PROGMEM = "

OctoPrint Configuration:

" - "

Show OctoPrint Status

" - "

Show OctoPrint progress with clock

" - "" - "" - "" - "" - "" - "
" - ""; - - - -const int TIMEOUT = 500; // 500 = 1/2 second -int timeoutCount = 0; - -// Change the externalLight to the pin you wish to use if other than the Built-in LED -int externalLight = LED_BUILTIN; // LED_BUILTIN is is the built in LED on the Wemos - -void setup() { - Serial.begin(115200); - SPIFFS.begin(); - //SPIFFS.remove(CONFIG); - delay(10); - - // Initialize digital pin for LED - pinMode(externalLight, OUTPUT); - - //New Line to clear from start garbage - Serial.println(); - - readCityIds(); - - Serial.println("Number of LED Displays: " + String(numberOfHorizontalDisplays)); - // initialize dispaly - matrix.setIntensity(0); // Use a value between 0 and 15 for brightness - - int maxPos = numberOfHorizontalDisplays * numberOfVerticalDisplays; - for (int i = 0; i < maxPos; i++) { - matrix.setRotation(i, ledRotation); - matrix.setPosition(i, maxPos - i - 1, 0); - } - - Serial.println("matrix created"); - matrix.fillScreen(LOW); // show black - centerPrint("hello"); - - tone(BUZZER_PIN, 415, 500); - delay(500 * 1.3); - tone(BUZZER_PIN, 466, 500); - delay(500 * 1.3); - tone(BUZZER_PIN, 370, 1000); - delay(1000 * 1.3); - noTone(BUZZER_PIN); - - for (int inx = 0; inx <= 15; inx++) { - matrix.setIntensity(inx); - delay(100); - } - for (int inx = 15; inx >= 0; inx--) { - matrix.setIntensity(inx); - delay(60); - } - delay(1000); - matrix.setIntensity(displayIntensity); - //noTone(BUZZER_PIN); - - //WiFiManager - //Local intialization. Once its business is done, there is no need to keep it around - WiFiManager wifiManager; - - // Uncomment for testing wifi manager - //wifiManager.resetSettings(); - wifiManager.setAPCallback(configModeCallback); - - //Custom Station (client) Static IP Configuration - Set custom IP for your Network (IP, Gateway, Subnet mask) - //wifiManager.setSTAStaticIPConfig(IPAddress(192,168,0,99), IPAddress(192,168,0,1), IPAddress(255,255,255,0)); - - String hostname(HOSTNAME); - hostname += String(ESP.getChipId(), HEX); - if (!wifiManager.autoConnect((const char *)hostname.c_str())) {// new addition - delay(3000); - WiFi.disconnect(true); - ESP.reset(); - delay(5000); - } - - // print the received signal strength: - Serial.print("Signal Strength (RSSI): "); - Serial.print(getWifiQuality()); - Serial.println("%"); - - if (ENABLE_OTA) { - ArduinoOTA.onStart([]() { - Serial.println("Start"); - }); - ArduinoOTA.onEnd([]() { - Serial.println("\nEnd"); - }); - ArduinoOTA.onProgress([](unsigned int progress, unsigned int total) { - Serial.printf("Progress: %u%%\r", (progress / (total / 100))); - }); - ArduinoOTA.onError([](ota_error_t error) { - Serial.printf("Error[%u]: ", error); - if (error == OTA_AUTH_ERROR) Serial.println("Auth Failed"); - else if (error == OTA_BEGIN_ERROR) Serial.println("Begin Failed"); - else if (error == OTA_CONNECT_ERROR) Serial.println("Connect Failed"); - else if (error == OTA_RECEIVE_ERROR) Serial.println("Receive Failed"); - else if (error == OTA_END_ERROR) Serial.println("End Failed"); - }); - ArduinoOTA.setHostname((const char *)hostname.c_str()); - if (OTA_Password != "") { - ArduinoOTA.setPassword(((const char *)OTA_Password.c_str())); - } - ArduinoOTA.begin(); - } - - if (WEBSERVER_ENABLED) { - server.on("/", displayWeatherData); - server.on("/pull", handlePull); - server.on("/locations", handleLocations); - server.on("/savebitcoin", handleSaveBitcoin); - server.on("/savewideclock", handleSaveWideClock); - server.on("/savenews", handleSaveNews); - server.on("/saveoctoprint", handleSaveOctoprint); - server.on("/savepihole", handleSavePihole); - server.on("/systemreset", handleSystemReset); - server.on("/forgetwifi", handleForgetWifi); - server.on("/configure", handleConfigure); - server.on("/configurebitcoin", handleBitcoinConfigure); - server.on("/configurewideclock", handleWideClockConfigure); - server.on("/configurenews", handleNewsConfigure); - server.on("/configureoctoprint", handleOctoprintConfigure); - server.on("/configurepihole", handlePiholeConfigure); - server.on("/display", handleDisplay); - server.onNotFound(redirectHome); - serverUpdater.setup(&server, "/update", www_username, www_password); - // Start the server - server.begin(); - Serial.println("Server started"); - // Print the IP address - String webAddress = "http://" + WiFi.localIP().toString() + ":" + String(WEBSERVER_PORT) + "/"; - Serial.println("Use this URL : " + webAddress); - scrollMessage(" v" + String(VERSION) + " IP: " + WiFi.localIP().toString() + " "); - } else { - Serial.println("Web Interface is Disabled"); - scrollMessage("Web Interface is Disabled"); - } - - flashLED(1, 500); -} - -//************************************************************ -// Main Looop -//************************************************************ -void loop() { - //Get some Weather Data to serve - if ((getMinutesFromLastRefresh() >= minutesBetweenDataRefresh) || lastEpoch == 0) { - getWeatherData(); - } - checkDisplay(); // this will see if we need to turn it on or off for night mode. - - if (lastMinute != TimeDB.zeroPad(minute())) { - lastMinute = TimeDB.zeroPad(minute()); - - if (weatherClient.getError() != "") { - scrollMessage(weatherClient.getError()); - return; - } - - if (displayOn) { - matrix.shutdown(false); - } - matrix.fillScreen(LOW); // show black - if (OCTOPRINT_ENABLED) { - if (displayOn && ((printerClient.isOperational() || printerClient.isPrinting()) || printerCount == 0)) { - // This should only get called if the printer is actually running or if it has been 2 minutes since last check - printerClient.getPrinterJobResults(); - } - printerCount += 1; - if (printerCount > 2) { - printerCount = 0; - } - } - - displayRefreshCount --; - // Check to see if we need to Scroll some Data - if (displayRefreshCount <= 0) { - displayRefreshCount = minutesBetweenScrolling; - String temperature = weatherClient.getTempRounded(0); - String description = weatherClient.getDescription(0); - description.toUpperCase(); - String msg; - msg += " "; - - if (SHOW_DATE) { - msg += TimeDB.getDayName() + ", "; - msg += TimeDB.getMonthName() + " " + day() + " "; - } - if (SHOW_CITY) { - msg += weatherClient.getCity(0) + " "; - } - msg += temperature + getTempSymbol() + " "; - - //show high/low temperature - if (SHOW_HIGHLOW) { - msg += "High/Low:" + weatherClient.getHigh(0) + "/" + weatherClient.getLow(0) + " " + getTempSymbol() + " "; - } - - if (SHOW_CONDITION) { - msg += description + " "; - } - if (SHOW_HUMIDITY) { - msg += "Humidity:" + weatherClient.getHumidityRounded(0) + "% "; - } - if (SHOW_WIND) { - msg += "Wind:" + weatherClient.getDirectionRounded(0) + " deg @ " + weatherClient.getWindRounded(0) + " " + getSpeedSymbol() + " "; - } - //line to show barometric pressure - if (SHOW_PRESSURE) { - msg += "Pressure:" + weatherClient.getPressure(0) + getPressureSymbol() + " "; - } - - msg += marqueeMessage + " "; - - if (NEWS_ENABLED) { - msg += " " + NEWS_SOURCE + ": " + newsClient.getTitle(newsIndex) + " "; - newsIndex += 1; - if (newsIndex > 9) { - newsIndex = 0; - } - } - if (OCTOPRINT_ENABLED && printerClient.isPrinting()) { - msg += " " + printerClient.getFileName() + " "; - msg += "(" + printerClient.getProgressCompletion() + "%) "; - } - if (BitcoinCurrencyCode != "NONE" && BitcoinCurrencyCode != "") { - msg += " Bitcoin: " + bitcoinClient.getRate() + " " + bitcoinClient.getCode() + " "; - } - if (USE_PIHOLE) { - piholeClient.getPiHoleData(PiHoleServer, PiHolePort); - piholeClient.getGraphData(PiHoleServer, PiHolePort); - if (piholeClient.getPiHoleStatus() != "") { - msg += " Pi-hole (" + piholeClient.getPiHoleStatus() + "): " + piholeClient.getAdsPercentageToday() + "% "; - } - } - - scrollMessage(msg); - drawPiholeGraph(); - } - } - - String currentTime = hourMinutes(false); - - if (numberOfHorizontalDisplays >= 8) { - if (Wide_Clock_Style == "1") { - // On Wide Display -- show the current temperature as well - String currentTemp = weatherClient.getTempRounded(0); - String timeSpacer = " "; - if (currentTemp.length() >= 3) { - timeSpacer = " "; - } - currentTime += timeSpacer + currentTemp + getTempSymbol(); - } - if (Wide_Clock_Style == "2") { - currentTime += secondsIndicator(false) + TimeDB.zeroPad(second()); - matrix.fillScreen(LOW); // show black - } - if (Wide_Clock_Style == "3") { - // No change this is normal clock display - } - } - matrix.fillScreen(LOW); - centerPrint(currentTime, true); - - if (WEBSERVER_ENABLED) { - server.handleClient(); - } - if (ENABLE_OTA) { - ArduinoOTA.handle(); - } -} - -String hourMinutes(boolean isRefresh) { - if (IS_24HOUR) { - return hour() + secondsIndicator(isRefresh) + TimeDB.zeroPad(minute()); - } else { - return hourFormat12() + secondsIndicator(isRefresh) + TimeDB.zeroPad(minute()); - } -} - -String secondsIndicator(boolean isRefresh) { - String rtnValue = ":"; - if (isRefresh == false && (flashOnSeconds && (second() % 2) == 0)) { - rtnValue = " "; - } - return rtnValue; -} - -boolean athentication() { - if (IS_BASIC_AUTH) { - return server.authenticate(www_username, www_password); - } - return true; // Authentication not required -} - -void handlePull() { - getWeatherData(); // this will force a data pull for new weather - displayWeatherData(); -} - -void handleSaveBitcoin() { - if (!athentication()) { - return server.requestAuthentication(); - } - BitcoinCurrencyCode = server.arg("bitcoincurrency"); - writeCityIds(); - bitcoinClient.updateBitcoinData(BitcoinCurrencyCode); // does nothing if BitCoinCurrencyCode is "NONE" or empty - redirectHome(); -} - -void handleSaveWideClock() { - if (!athentication()) { - return server.requestAuthentication(); - } - if (numberOfHorizontalDisplays >= 8) { - Wide_Clock_Style = server.arg("wideclockformat"); - writeCityIds(); - matrix.fillScreen(LOW); // show black - } - redirectHome(); -} - -void handleSaveNews() { - if (!athentication()) { - return server.requestAuthentication(); - } - NEWS_ENABLED = server.hasArg("displaynews"); - NEWS_API_KEY = server.arg("newsApiKey"); - NEWS_SOURCE = server.arg("newssource"); - matrix.fillScreen(LOW); // show black - writeCityIds(); - newsClient.updateNews(); - redirectHome(); -} - -void handleSaveOctoprint() { - if (!athentication()) { - return server.requestAuthentication(); - } - OCTOPRINT_ENABLED = server.hasArg("displayoctoprint"); - OCTOPRINT_PROGRESS = server.hasArg("octoprintprogress"); - OctoPrintApiKey = server.arg("octoPrintApiKey"); - OctoPrintServer = server.arg("octoPrintAddress"); - OctoPrintPort = server.arg("octoPrintPort").toInt(); - OctoAuthUser = server.arg("octoUser"); - OctoAuthPass = server.arg("octoPass"); - matrix.fillScreen(LOW); // show black - writeCityIds(); - if (OCTOPRINT_ENABLED) { - printerClient.getPrinterJobResults(); - } - redirectHome(); -} - -void handleSavePihole() { - if (!athentication()) { - return server.requestAuthentication(); - } - USE_PIHOLE = server.hasArg("displaypihole"); - PiHoleServer = server.arg("piholeAddress"); - PiHolePort = server.arg("piholePort").toInt(); - writeCityIds(); - if (USE_PIHOLE) { - piholeClient.getPiHoleData(PiHoleServer, PiHolePort); - piholeClient.getGraphData(PiHoleServer, PiHolePort); - } - redirectHome(); -} - -void handleLocations() { - if (!athentication()) { - return server.requestAuthentication(); - } - TIMEDBKEY = server.arg("TimeZoneDB"); - APIKEY = server.arg("openWeatherMapApiKey"); - CityIDs[0] = server.arg("city1").toInt(); - flashOnSeconds = server.hasArg("flashseconds"); - IS_24HOUR = server.hasArg("is24hour"); - IS_PM = server.hasArg("isPM"); - SHOW_DATE = server.hasArg("showdate"); - SHOW_CITY = server.hasArg("showcity"); - SHOW_CONDITION = server.hasArg("showcondition"); - SHOW_HUMIDITY = server.hasArg("showhumidity"); - SHOW_WIND = server.hasArg("showwind"); - SHOW_PRESSURE = server.hasArg("showpressure"); - SHOW_HIGHLOW = server.hasArg("showhighlow"); - IS_METRIC = server.hasArg("metric"); - marqueeMessage = decodeHtmlString(server.arg("marqueeMsg")); - timeDisplayTurnsOn = decodeHtmlString(server.arg("startTime")); - timeDisplayTurnsOff = decodeHtmlString(server.arg("endTime")); - displayIntensity = server.arg("ledintensity").toInt(); - minutesBetweenDataRefresh = server.arg("refresh").toInt(); - minutesBetweenScrolling = server.arg("refreshDisplay").toInt(); - displayScrollSpeed = server.arg("scrollspeed").toInt(); - IS_BASIC_AUTH = server.hasArg("isBasicAuth"); - String temp = server.arg("userid"); - temp.toCharArray(www_username, sizeof(temp)); - temp = server.arg("stationpassword"); - temp.toCharArray(www_password, sizeof(temp)); - weatherClient.setMetric(IS_METRIC); - matrix.fillScreen(LOW); // show black - writeCityIds(); - getWeatherData(); // this will force a data pull for new weather - redirectHome(); -} - -void handleSystemReset() { - if (!athentication()) { - return server.requestAuthentication(); - } - Serial.println("Reset System Configuration"); - if (SPIFFS.remove(CONFIG)) { - redirectHome(); - ESP.restart(); - } -} - -void handleForgetWifi() { - if (!athentication()) { - return server.requestAuthentication(); - } - //WiFiManager - //Local intialization. Once its business is done, there is no need to keep it around - redirectHome(); - WiFiManager wifiManager; - wifiManager.resetSettings(); - ESP.restart(); -} - -void handleBitcoinConfigure() { - if (!athentication()) { - return server.requestAuthentication(); - } - digitalWrite(externalLight, LOW); - String html = ""; - - server.sendHeader("Cache-Control", "no-cache, no-store"); - server.sendHeader("Pragma", "no-cache"); - server.sendHeader("Expires", "-1"); - server.setContentLength(CONTENT_LENGTH_UNKNOWN); - server.send(200, "text/html", ""); - - sendHeader(); - - String form = FPSTR(BITCOIN_FORM); - String bitcoinOptions = FPSTR(CURRENCY_OPTIONS); - bitcoinOptions.replace(BitcoinCurrencyCode + "'", BitcoinCurrencyCode + "' selected"); - form.replace("%BITCOINOPTIONS%", bitcoinOptions); - server.sendContent(form); //Send another Chunk of form - - sendFooter(); - - server.sendContent(""); - server.client().stop(); - digitalWrite(externalLight, HIGH); -} - -void handleWideClockConfigure() { - if (!athentication()) { - return server.requestAuthentication(); - } - digitalWrite(externalLight, LOW); - - server.sendHeader("Cache-Control", "no-cache, no-store"); - server.sendHeader("Pragma", "no-cache"); - server.sendHeader("Expires", "-1"); - server.setContentLength(CONTENT_LENGTH_UNKNOWN); - server.send(200, "text/html", ""); - - sendHeader(); - - if (numberOfHorizontalDisplays >= 8) { - // Wide display options - String form = FPSTR(WIDECLOCK_FORM); - String clockOptions = ""; - clockOptions.replace(Wide_Clock_Style + "'", Wide_Clock_Style + "' selected"); - form.replace("%WIDECLOCKOPTIONS%", clockOptions); - server.sendContent(form); - } - - sendFooter(); - - server.sendContent(""); - server.client().stop(); - digitalWrite(externalLight, HIGH); -} - -void handleNewsConfigure() { - if (!athentication()) { - return server.requestAuthentication(); - } - digitalWrite(externalLight, LOW); - - server.sendHeader("Cache-Control", "no-cache, no-store"); - server.sendHeader("Pragma", "no-cache"); - server.sendHeader("Expires", "-1"); - server.setContentLength(CONTENT_LENGTH_UNKNOWN); - server.send(200, "text/html", ""); - - sendHeader(); - - String form = FPSTR(NEWS_FORM1); - String isNewsDisplayedChecked = ""; - if (NEWS_ENABLED) { - isNewsDisplayedChecked = "checked='checked'"; - } - form.replace("%NEWSCHECKED%", isNewsDisplayedChecked); - form.replace("%NEWSKEY%", NEWS_API_KEY); - form.replace("%NEWSSOURCE%", NEWS_SOURCE); - server.sendContent(form); //Send news form - - sendFooter(); - - server.sendContent(""); - server.client().stop(); - digitalWrite(externalLight, HIGH); -} - -void handleOctoprintConfigure() { - if (!athentication()) { - return server.requestAuthentication(); - } - digitalWrite(externalLight, LOW); - - server.sendHeader("Cache-Control", "no-cache, no-store"); - server.sendHeader("Pragma", "no-cache"); - server.sendHeader("Expires", "-1"); - server.setContentLength(CONTENT_LENGTH_UNKNOWN); - server.send(200, "text/html", ""); - - sendHeader(); - - String form = FPSTR(OCTO_FORM); - String isOctoPrintDisplayedChecked = ""; - if (OCTOPRINT_ENABLED) { - isOctoPrintDisplayedChecked = "checked='checked'"; - } - form.replace("%OCTOCHECKED%", isOctoPrintDisplayedChecked); - String isOctoPrintProgressChecked = ""; - if (OCTOPRINT_PROGRESS) { - isOctoPrintProgressChecked = "checked='checked'"; - } - form.replace("%OCTOPROGRESSCHECKED%", isOctoPrintProgressChecked); - form.replace("%OCTOKEY%", OctoPrintApiKey); - form.replace("%OCTOADDRESS%", OctoPrintServer); - form.replace("%OCTOPORT%", String(OctoPrintPort)); - form.replace("%OCTOUSER%", OctoAuthUser); - form.replace("%OCTOPASS%", OctoAuthPass); - server.sendContent(form); - - sendFooter(); - - server.sendContent(""); - server.client().stop(); - digitalWrite(externalLight, HIGH); -} - -void handlePiholeConfigure() { - if (!athentication()) { - return server.requestAuthentication(); - } - digitalWrite(externalLight, LOW); - - server.sendHeader("Cache-Control", "no-cache, no-store"); - server.sendHeader("Pragma", "no-cache"); - server.sendHeader("Expires", "-1"); - server.setContentLength(CONTENT_LENGTH_UNKNOWN); - server.send(200, "text/html", ""); - - sendHeader(); - - server.sendContent(FPSTR(PIHOLE_TEST)); - - String form = FPSTR(PIHOLE_FORM); - String isPiholeDisplayedChecked = ""; - if (USE_PIHOLE) { - isPiholeDisplayedChecked = "checked='checked'"; - } - form.replace("%PIHOLECHECKED%", isPiholeDisplayedChecked); - form.replace("%PIHOLEADDRESS%", PiHoleServer); - form.replace("%PIHOLEPORT%", String(PiHolePort)); - - server.sendContent(form); - form = ""; - - sendFooter(); - - server.sendContent(""); - server.client().stop(); - digitalWrite(externalLight, HIGH); -} - -void handleConfigure() { - if (!athentication()) { - return server.requestAuthentication(); - } - digitalWrite(externalLight, LOW); - String html = ""; - - server.sendHeader("Cache-Control", "no-cache, no-store"); - server.sendHeader("Pragma", "no-cache"); - server.sendHeader("Expires", "-1"); - server.setContentLength(CONTENT_LENGTH_UNKNOWN); - server.send(200, "text/html", ""); - - sendHeader(); - - String form = FPSTR(CHANGE_FORM1); - form.replace("%TIMEDBKEY%", TIMEDBKEY); - form.replace("%WEATHERKEY%", APIKEY); - - - String cityName = ""; - if (weatherClient.getCity(0) != "") { - cityName = weatherClient.getCity(0) + ", " + weatherClient.getCountry(0); - } - form.replace("%CITYNAME1%", cityName); - form.replace("%CITY1%", String(CityIDs[0])); - String isDateChecked = ""; - if (SHOW_DATE) { - isDateChecked = "checked='checked'"; - } - form.replace("%DATE_CHECKED%", isDateChecked); - String isCityChecked = ""; - if (SHOW_CITY) { - isCityChecked = "checked='checked'"; - } - form.replace("%CITY_CHECKED%", isCityChecked); - String isConditionChecked = ""; - if (SHOW_CONDITION) { - isConditionChecked = "checked='checked'"; - } - form.replace("%CONDITION_CHECKED%", isConditionChecked); - String isHumidityChecked = ""; - if (SHOW_HUMIDITY) { - isHumidityChecked = "checked='checked'"; - } - form.replace("%HUMIDITY_CHECKED%", isHumidityChecked); - String isWindChecked = ""; - if (SHOW_WIND) { - isWindChecked = "checked='checked'"; - } - form.replace("%WIND_CHECKED%", isWindChecked); - String isPressureChecked = ""; - if (SHOW_PRESSURE) { - isPressureChecked = "checked='checked'"; - } - form.replace("%PRESSURE_CHECKED%", isPressureChecked); - - String isHighlowChecked = ""; - if (SHOW_HIGHLOW) { - isHighlowChecked = "checked='checked'"; - } - form.replace("%HIGHLOW_CHECKED%", isHighlowChecked); - - - String is24hourChecked = ""; - if (IS_24HOUR) { - is24hourChecked = "checked='checked'"; - } - form.replace("%IS_24HOUR_CHECKED%", is24hourChecked); - String checked = ""; - if (IS_METRIC) { - checked = "checked='checked'"; - } - form.replace("%CHECKED%", checked); - server.sendContent(form); - - form = FPSTR(CHANGE_FORM2); - String isPmChecked = ""; - if (IS_PM) { - isPmChecked = "checked='checked'"; - } - form.replace("%IS_PM_CHECKED%", isPmChecked); - String isFlashSecondsChecked = ""; - if (flashOnSeconds) { - isFlashSecondsChecked = "checked='checked'"; - } - form.replace("%FLASHSECONDS%", isFlashSecondsChecked); - form.replace("%MSG%", marqueeMessage); - form.replace("%STARTTIME%", timeDisplayTurnsOn); - form.replace("%ENDTIME%", timeDisplayTurnsOff); - form.replace("%INTENSITYOPTIONS%", String(displayIntensity)); - String dSpeed = String(displayScrollSpeed); - String scrollOptions = ""; - scrollOptions.replace(dSpeed + "'", dSpeed + "' selected" ); - form.replace("%SCROLLOPTIONS%", scrollOptions); - String minutes = String(minutesBetweenDataRefresh); - String options = ""; - options.replace(">" + minutes + "<", " selected>" + minutes + "<"); - form.replace("%OPTIONS%", options); - form.replace("%REFRESH_DISPLAY%", String(minutesBetweenScrolling)); - - server.sendContent(form); //Send another chunk of the form - - form = FPSTR(CHANGE_FORM3); - String isUseSecurityChecked = ""; - if (IS_BASIC_AUTH) { - isUseSecurityChecked = "checked='checked'"; - } - form.replace("%IS_BASICAUTH_CHECKED%", isUseSecurityChecked); - form.replace("%USERID%", String(www_username)); - form.replace("%STATIONPASSWORD%", String(www_password)); - - server.sendContent(form); // Send the second chunk of Data - - sendFooter(); - - server.sendContent(""); - server.client().stop(); - digitalWrite(externalLight, HIGH); -} - -void handleDisplay() { - if (!athentication()) { - return server.requestAuthentication(); - } - enableDisplay(!displayOn); - String state = "OFF"; - if (displayOn) { - state = "ON"; - } - displayMessage("Display is now " + state); -} - -//*********************************************************************** -void getWeatherData() //client function to send/receive GET request data. -{ - digitalWrite(externalLight, LOW); - matrix.fillScreen(LOW); // show black - Serial.println(); - - if (displayOn) { - // only pull the weather data if display is on - if (firstEpoch != 0) { - centerPrint(hourMinutes(true), true); - } else { - centerPrint("..."); - } - matrix.drawPixel(0, 7, HIGH); - matrix.drawPixel(0, 6, HIGH); - matrix.drawPixel(0, 5, HIGH); - matrix.write(); - - weatherClient.updateWeather(); - if (weatherClient.getError() != "") { - scrollMessage(weatherClient.getError()); - } - } - - Serial.println("Updating Time..."); - //Update the Time - matrix.drawPixel(0, 4, HIGH); - matrix.drawPixel(0, 3, HIGH); - matrix.drawPixel(0, 2, HIGH); - Serial.println("matrix Width:" + matrix.width()); - matrix.write(); - TimeDB.updateConfig(TIMEDBKEY, weatherClient.getLat(0), weatherClient.getLon(0)); - time_t currentTime = TimeDB.getTime(); - if(currentTime > 5000 || firstEpoch == 0) { - setTime(currentTime); - } else { - Serial.println("Time update unsuccessful!"); - } - lastEpoch = now(); - if (firstEpoch == 0) { - firstEpoch = now(); - Serial.println("firstEpoch is: " + String(firstEpoch)); - } - - if (NEWS_ENABLED && displayOn) { - matrix.drawPixel(0, 2, HIGH); - matrix.drawPixel(0, 1, HIGH); - matrix.drawPixel(0, 0, HIGH); - matrix.write(); - Serial.println("Getting News Data for " + NEWS_SOURCE); - newsClient.updateNews(); - } - - if (displayOn) { - bitcoinClient.updateBitcoinData(BitcoinCurrencyCode); // does nothing if BitCoinCurrencyCode is "NONE" or empty - } - - Serial.println("Version: " + String(VERSION)); - Serial.println(); - digitalWrite(externalLight, HIGH); -} - -void displayMessage(String message) { - digitalWrite(externalLight, LOW); - - server.sendHeader("Cache-Control", "no-cache, no-store"); - server.sendHeader("Pragma", "no-cache"); - server.sendHeader("Expires", "-1"); - server.setContentLength(CONTENT_LENGTH_UNKNOWN); - server.send(200, "text/html", ""); - sendHeader(); - server.sendContent(message); - sendFooter(); - server.sendContent(""); - server.client().stop(); - - digitalWrite(externalLight, HIGH); -} - -void redirectHome() { - // Send them back to the Root Directory - server.sendHeader("Location", String("/"), true); - server.sendHeader("Cache-Control", "no-cache, no-store"); - server.sendHeader("Pragma", "no-cache"); - server.sendHeader("Expires", "-1"); - server.send(302, "text/plain", ""); - server.client().stop(); - delay(1000); -} - -void sendHeader() { - String html = ""; - html += "Marquee Scroller"; - html += ""; - html += ""; - html += ""; - html += ""; - html += ""; - html += ""; - server.sendContent(html); - html = ""; - html += "

Weather Marquee

"; - html += ""; - html += "
"; - server.sendContent(html); -} - -void sendFooter() { - int8_t rssi = getWifiQuality(); - Serial.print("Signal Strength (RSSI): "); - Serial.print(rssi); - Serial.println("%"); - String html = "


"; - html += "
"; - html += "
"; - html += " Version: " + String(VERSION) + "
"; - html += " Next Update: " + getTimeTillUpdate() + "
"; - html += " Signal Strength: "; - html += String(rssi) + "%"; - html += "
"; - html += ""; - server.sendContent(html); -} - -void displayWeatherData() { - digitalWrite(externalLight, LOW); - String html = ""; - - server.sendHeader("Cache-Control", "no-cache, no-store"); - server.sendHeader("Pragma", "no-cache"); - server.sendHeader("Expires", "-1"); - server.setContentLength(CONTENT_LENGTH_UNKNOWN); - server.send(200, "text/html", ""); - sendHeader(); - - String temperature = weatherClient.getTemp(0); - - if ((temperature.indexOf(".") != -1) && (temperature.length() >= (temperature.indexOf(".") + 2))) { - temperature.remove(temperature.indexOf(".") + 2); - } - - String time = TimeDB.getDayName() + ", " + TimeDB.getMonthName() + " " + day() + ", " + hourFormat12() + ":" + TimeDB.zeroPad(minute()) + " " + TimeDB.getAmPm(); - - Serial.println(weatherClient.getCity(0)); - Serial.println(weatherClient.getCondition(0)); - Serial.println(weatherClient.getDescription(0)); - Serial.println(temperature); - Serial.println(time); - - if (TIMEDBKEY == "") { - html += "

Please Configure TimeZoneDB with API key.

"; - } - - if (weatherClient.getCity(0) == "") { - html += "

Please Configure Weather API

"; - if (weatherClient.getError() != "") { - html += "

Weather Error: " + weatherClient.getError() + "

"; - } - } else { - html += "

" + weatherClient.getCity(0) + ", " + weatherClient.getCountry(0) + "

"; - html += "
"; - html += "" + weatherClient.getDescription(0) + "
"; - html += weatherClient.getHumidity(0) + "% Humidity
"; - html += weatherClient.getDirection(0) + " deg/" + weatherClient.getWind(0) + " " + getSpeedSymbol() + " Wind
"; - html += weatherClient.getPressure(0) + " Pressure
"; - html += "
"; - html += "

"; - html += weatherClient.getCondition(0) + " (" + weatherClient.getDescription(0) + ")
"; - html += temperature + " " + getTempSymbol() + "
"; - html += weatherClient.getHigh(0) + "/" + weatherClient.getLow(0) + " " + getTempSymbol() + "
"; - html += time + "
"; - html += " Map It!
"; - html += "


"; - } - - - server.sendContent(String(html)); // spit out what we got - html = ""; // fresh start - - - if (OCTOPRINT_ENABLED) { - html = "
OctoPrint Status: "; - if (printerClient.isPrinting()) { - html += printerClient.getState() + " " + printerClient.getFileName() + " (" + printerClient.getProgressCompletion() + "%)"; - } else if (printerClient.isOperational()) { - html += printerClient.getState(); - } else if (printerClient.getError() != "") { - html += printerClient.getError(); - } else { - html += "Not Connected"; - } - html += "


"; - server.sendContent(String(html)); - html = ""; - } - - if (BitcoinCurrencyCode != "NONE" && BitcoinCurrencyCode != "") { - html = "
Bitcoin value: " + bitcoinClient.getRate() + " " + bitcoinClient.getCode() + "


"; - server.sendContent(String(html)); - html = ""; - } - - if (USE_PIHOLE) { - if (piholeClient.getError() == "") { - html = "
Pi-hole
" - "Total Queries (" + piholeClient.getUniqueClients() + " clients): " + piholeClient.getDnsQueriesToday() + "
" - "Queries Blocked: " + piholeClient.getAdsBlockedToday() + "
" - "Percent Blocked: " + piholeClient.getAdsPercentageToday() + "%
" - "Domains on Blocklist: " + piholeClient.getDomainsBeingBlocked() + "
" - "Status: " + piholeClient.getPiHoleStatus() + "
" - "


"; - } else { - html = "
Pi-hole Error"; - html += "Please Configure for Pi-hole
"; - html += "Status: Error Getting Data
"; - html += "Reason: " + piholeClient.getError() + "


"; - } - server.sendContent(html); - html = ""; - } - - if (NEWS_ENABLED) { - html = "

News (" + NEWS_SOURCE + ")

"; - if (newsClient.getTitle(0) == "") { - html += "

Please Configure News API

"; - server.sendContent(html); - html = ""; - } else { - for (int inx = 0; inx < 10; inx++) { - html = ""; - html += newsClient.getDescription(inx) + "

"; - server.sendContent(html); - html = ""; - } - } - } - - sendFooter(); - server.sendContent(""); - server.client().stop(); - digitalWrite(externalLight, HIGH); -} - -void configModeCallback (WiFiManager *myWiFiManager) { - Serial.println("Entered config mode"); - Serial.println(WiFi.softAPIP()); - Serial.println("Wifi Manager"); - Serial.println("Please connect to AP"); - Serial.println(myWiFiManager->getConfigPortalSSID()); - Serial.println("To setup Wifi Configuration"); - scrollMessage("Please Connect to AP: " + String(myWiFiManager->getConfigPortalSSID())); - centerPrint("wifi"); -} - -void flashLED(int number, int delayTime) { - for (int inx = 0; inx < number; inx++) { - tone(BUZZER_PIN, 440, delayTime); - delay(delayTime); - digitalWrite(externalLight, LOW); - delay(delayTime); - digitalWrite(externalLight, HIGH); - delay(delayTime); - } - noTone(BUZZER_PIN); -} - -String getTempSymbol() { - String rtnValue = "F"; - if (IS_METRIC) { - rtnValue = "C"; - } - return rtnValue; -} - -String getSpeedSymbol() { - String rtnValue = "mph"; - if (IS_METRIC) { - rtnValue = "kph"; - } - return rtnValue; -} - -String getPressureSymbol() -{ - String rtnValue = ""; - if (IS_METRIC) - { - rtnValue = "mb"; - } - return rtnValue; -} - -// converts the dBm to a range between 0 and 100% -int8_t getWifiQuality() { - int32_t dbm = WiFi.RSSI(); - if (dbm <= -100) { - return 0; - } else if (dbm >= -50) { - return 100; - } else { - return 2 * (dbm + 100); - } -} - -String getTimeTillUpdate() { - String rtnValue = ""; - - long timeToUpdate = (((minutesBetweenDataRefresh * 60) + lastEpoch) - now()); - - int hours = numberOfHours(timeToUpdate); - int minutes = numberOfMinutes(timeToUpdate); - int seconds = numberOfSeconds(timeToUpdate); - - rtnValue += String(hours) + ":"; - if (minutes < 10) { - rtnValue += "0"; - } - rtnValue += String(minutes) + ":"; - if (seconds < 10) { - rtnValue += "0"; - } - rtnValue += String(seconds); - - return rtnValue; -} - -int getMinutesFromLastRefresh() { - int minutes = (now() - lastEpoch) / 60; - return minutes; -} - -int getMinutesFromLastDisplay() { - int minutes = (now() - displayOffEpoch) / 60; - return minutes; -} - -void enableDisplay(boolean enable) { - displayOn = enable; - if (enable) { - if (getMinutesFromLastDisplay() >= minutesBetweenDataRefresh) { - // The display has been off longer than the minutes between refresh -- need to get fresh data - lastEpoch = 0; // this should force a data pull of the weather - displayOffEpoch = 0; // reset - } - matrix.shutdown(false); - matrix.fillScreen(LOW); // show black - Serial.println("Display was turned ON: " + now()); - } else { - matrix.shutdown(true); - Serial.println("Display was turned OFF: " + now()); - displayOffEpoch = lastEpoch; - } -} - -// Toggle on and off the display if user defined times -void checkDisplay() { - if (timeDisplayTurnsOn == "" || timeDisplayTurnsOff == "") { - return; // nothing to do - } - String currentTime = TimeDB.zeroPad(hour()) + ":" + TimeDB.zeroPad(minute()); - - if (currentTime == timeDisplayTurnsOn && !displayOn) { - Serial.println("Time to turn display on: " + currentTime); - flashLED(1, 500); - enableDisplay(true); - } - - if (currentTime == timeDisplayTurnsOff && displayOn) { - Serial.println("Time to turn display off: " + currentTime); - flashLED(2, 500); - enableDisplay(false); - } -} - -String writeCityIds() { - // Save decoded message to SPIFFS file for playback on power up. - File f = SPIFFS.open(CONFIG, "w"); - if (!f) { - Serial.println("File open failed!"); - } else { - Serial.println("Saving settings now..."); - f.println("TIMEDBKEY=" + TIMEDBKEY); - f.println("APIKEY=" + APIKEY); - f.println("CityID=" + String(CityIDs[0])); - f.println("marqueeMessage=" + marqueeMessage); - f.println("newsSource=" + NEWS_SOURCE); - f.println("timeDisplayTurnsOn=" + timeDisplayTurnsOn); - f.println("timeDisplayTurnsOff=" + timeDisplayTurnsOff); - f.println("ledIntensity=" + String(displayIntensity)); - f.println("scrollSpeed=" + String(displayScrollSpeed)); - f.println("isNews=" + String(NEWS_ENABLED)); - f.println("newsApiKey=" + NEWS_API_KEY); - f.println("isFlash=" + String(flashOnSeconds)); - f.println("is24hour=" + String(IS_24HOUR)); - f.println("isPM=" + String(IS_PM)); - f.println("wideclockformat=" + Wide_Clock_Style); - f.println("isMetric=" + String(IS_METRIC)); - f.println("refreshRate=" + String(minutesBetweenDataRefresh)); - f.println("minutesBetweenScrolling=" + String(minutesBetweenScrolling)); - f.println("isOctoPrint=" + String(OCTOPRINT_ENABLED)); - f.println("isOctoProgress=" + String(OCTOPRINT_PROGRESS)); - f.println("octoKey=" + OctoPrintApiKey); - f.println("octoServer=" + OctoPrintServer); - f.println("octoPort=" + String(OctoPrintPort)); - f.println("octoUser=" + OctoAuthUser); - f.println("octoPass=" + OctoAuthPass); - f.println("www_username=" + String(www_username)); - f.println("www_password=" + String(www_password)); - f.println("IS_BASIC_AUTH=" + String(IS_BASIC_AUTH)); - f.println("BitcoinCurrencyCode=" + BitcoinCurrencyCode); - f.println("SHOW_CITY=" + String(SHOW_CITY)); - f.println("SHOW_CONDITION=" + String(SHOW_CONDITION)); - f.println("SHOW_HUMIDITY=" + String(SHOW_HUMIDITY)); - f.println("SHOW_WIND=" + String(SHOW_WIND)); - f.println("SHOW_PRESSURE=" + String(SHOW_PRESSURE)); - f.println("SHOW_HIGHLOW=" + String(SHOW_HIGHLOW)); - f.println("SHOW_DATE=" + String(SHOW_DATE)); - f.println("USE_PIHOLE=" + String(USE_PIHOLE)); - f.println("PiHoleServer=" + PiHoleServer); - f.println("PiHolePort=" + String(PiHolePort)); - } - f.close(); - readCityIds(); - weatherClient.updateCityIdList(CityIDs, 1); - String cityIds = weatherClient.getMyCityIDs(); - return cityIds; -} - -void readCityIds() { - if (SPIFFS.exists(CONFIG) == false) { - Serial.println("Settings File does not yet exists."); - writeCityIds(); - return; - } - File fr = SPIFFS.open(CONFIG, "r"); - String line; - while (fr.available()) { - line = fr.readStringUntil('\n'); - if (line.indexOf("TIMEDBKEY=") >= 0) { - TIMEDBKEY = line.substring(line.lastIndexOf("TIMEDBKEY=") + 10); - TIMEDBKEY.trim(); - Serial.println("TIMEDBKEY: " + TIMEDBKEY); - } - if (line.indexOf("APIKEY=") >= 0) { - APIKEY = line.substring(line.lastIndexOf("APIKEY=") + 7); - APIKEY.trim(); - Serial.println("APIKEY: " + APIKEY); - } - if (line.indexOf("CityID=") >= 0) { - CityIDs[0] = line.substring(line.lastIndexOf("CityID=") + 7).toInt(); - Serial.println("CityID: " + String(CityIDs[0])); - } - if (line.indexOf("newsSource=") >= 0) { - NEWS_SOURCE = line.substring(line.lastIndexOf("newsSource=") + 11); - NEWS_SOURCE.trim(); - Serial.println("newsSource=" + NEWS_SOURCE); - } - if (line.indexOf("isNews=") >= 0) { - NEWS_ENABLED = line.substring(line.lastIndexOf("isNews=") + 7).toInt(); - Serial.println("NEWS_ENABLED=" + String(NEWS_ENABLED)); - } - if (line.indexOf("newsApiKey=") >= 0) { - NEWS_API_KEY = line.substring(line.lastIndexOf("newsApiKey=") + 11); - NEWS_API_KEY.trim(); - Serial.println("NEWS_API_KEY: " + NEWS_API_KEY); - } - if (line.indexOf("isFlash=") >= 0) { - flashOnSeconds = line.substring(line.lastIndexOf("isFlash=") + 8).toInt(); - Serial.println("flashOnSeconds=" + String(flashOnSeconds)); - } - if (line.indexOf("is24hour=") >= 0) { - IS_24HOUR = line.substring(line.lastIndexOf("is24hour=") + 9).toInt(); - Serial.println("IS_24HOUR=" + String(IS_24HOUR)); - } - if (line.indexOf("isPM=") >= 0) { - IS_PM = line.substring(line.lastIndexOf("isPM=") + 5).toInt(); - Serial.println("IS_PM=" + String(IS_PM)); - } - if (line.indexOf("wideclockformat=") >= 0) { - Wide_Clock_Style = line.substring(line.lastIndexOf("wideclockformat=") + 16); - Wide_Clock_Style.trim(); - Serial.println("Wide_Clock_Style=" + Wide_Clock_Style); - } - if (line.indexOf("isMetric=") >= 0) { - IS_METRIC = line.substring(line.lastIndexOf("isMetric=") + 9).toInt(); - Serial.println("IS_METRIC=" + String(IS_METRIC)); - } - if (line.indexOf("refreshRate=") >= 0) { - minutesBetweenDataRefresh = line.substring(line.lastIndexOf("refreshRate=") + 12).toInt(); - if (minutesBetweenDataRefresh == 0) { - minutesBetweenDataRefresh = 15; // can't be zero - } - Serial.println("minutesBetweenDataRefresh=" + String(minutesBetweenDataRefresh)); - } - if (line.indexOf("minutesBetweenScrolling=") >= 0) { - displayRefreshCount = 1; - minutesBetweenScrolling = line.substring(line.lastIndexOf("minutesBetweenScrolling=") + 24).toInt(); - Serial.println("minutesBetweenScrolling=" + String(minutesBetweenScrolling)); - } - if (line.indexOf("marqueeMessage=") >= 0) { - marqueeMessage = line.substring(line.lastIndexOf("marqueeMessage=") + 15); - marqueeMessage.trim(); - Serial.println("marqueeMessage=" + marqueeMessage); - } - if (line.indexOf("timeDisplayTurnsOn=") >= 0) { - timeDisplayTurnsOn = line.substring(line.lastIndexOf("timeDisplayTurnsOn=") + 19); - timeDisplayTurnsOn.trim(); - Serial.println("timeDisplayTurnsOn=" + timeDisplayTurnsOn); - } - if (line.indexOf("timeDisplayTurnsOff=") >= 0) { - timeDisplayTurnsOff = line.substring(line.lastIndexOf("timeDisplayTurnsOff=") + 20); - timeDisplayTurnsOff.trim(); - Serial.println("timeDisplayTurnsOff=" + timeDisplayTurnsOff); - } - if (line.indexOf("ledIntensity=") >= 0) { - displayIntensity = line.substring(line.lastIndexOf("ledIntensity=") + 13).toInt(); - Serial.println("displayIntensity=" + String(displayIntensity)); - } - if (line.indexOf("scrollSpeed=") >= 0) { - displayScrollSpeed = line.substring(line.lastIndexOf("scrollSpeed=") + 12).toInt(); - Serial.println("displayScrollSpeed=" + String(displayScrollSpeed)); - } - if (line.indexOf("isOctoPrint=") >= 0) { - OCTOPRINT_ENABLED = line.substring(line.lastIndexOf("isOctoPrint=") + 12).toInt(); - Serial.println("OCTOPRINT_ENABLED=" + String(OCTOPRINT_ENABLED)); - } - if (line.indexOf("isOctoProgress=") >= 0) { - OCTOPRINT_PROGRESS = line.substring(line.lastIndexOf("isOctoProgress=") + 15).toInt(); - Serial.println("OCTOPRINT_PROGRESS=" + String(OCTOPRINT_PROGRESS)); - } - if (line.indexOf("octoKey=") >= 0) { - OctoPrintApiKey = line.substring(line.lastIndexOf("octoKey=") + 8); - OctoPrintApiKey.trim(); - Serial.println("OctoPrintApiKey=" + OctoPrintApiKey); - } - if (line.indexOf("octoServer=") >= 0) { - OctoPrintServer = line.substring(line.lastIndexOf("octoServer=") + 11); - OctoPrintServer.trim(); - Serial.println("OctoPrintServer=" + OctoPrintServer); - } - if (line.indexOf("octoPort=") >= 0) { - OctoPrintPort = line.substring(line.lastIndexOf("octoPort=") + 9).toInt(); - Serial.println("OctoPrintPort=" + String(OctoPrintPort)); - } - if (line.indexOf("octoUser=") >= 0) { - OctoAuthUser = line.substring(line.lastIndexOf("octoUser=") + 9); - OctoAuthUser.trim(); - Serial.println("OctoAuthUser=" + OctoAuthUser); - } - if (line.indexOf("octoPass=") >= 0) { - OctoAuthPass = line.substring(line.lastIndexOf("octoPass=") + 9); - OctoAuthPass.trim(); - Serial.println("OctoAuthPass=" + OctoAuthPass); - } - if (line.indexOf("www_username=") >= 0) { - String temp = line.substring(line.lastIndexOf("www_username=") + 13); - temp.trim(); - temp.toCharArray(www_username, sizeof(temp)); - Serial.println("www_username=" + String(www_username)); - } - if (line.indexOf("www_password=") >= 0) { - String temp = line.substring(line.lastIndexOf("www_password=") + 13); - temp.trim(); - temp.toCharArray(www_password, sizeof(temp)); - Serial.println("www_password=" + String(www_password)); - } - if (line.indexOf("IS_BASIC_AUTH=") >= 0) { - IS_BASIC_AUTH = line.substring(line.lastIndexOf("IS_BASIC_AUTH=") + 14).toInt(); - Serial.println("IS_BASIC_AUTH=" + String(IS_BASIC_AUTH)); - } - if (line.indexOf("BitcoinCurrencyCode=") >= 0) { - BitcoinCurrencyCode = line.substring(line.lastIndexOf("BitcoinCurrencyCode=") + 20); - BitcoinCurrencyCode.trim(); - Serial.println("BitcoinCurrencyCode=" + BitcoinCurrencyCode); - } - if (line.indexOf("SHOW_CITY=") >= 0) { - SHOW_CITY = line.substring(line.lastIndexOf("SHOW_CITY=") + 10).toInt(); - Serial.println("SHOW_CITY=" + String(SHOW_CITY)); - } - if (line.indexOf("SHOW_CONDITION=") >= 0) { - SHOW_CONDITION = line.substring(line.lastIndexOf("SHOW_CONDITION=") + 15).toInt(); - Serial.println("SHOW_CONDITION=" + String(SHOW_CONDITION)); - } - if (line.indexOf("SHOW_HUMIDITY=") >= 0) { - SHOW_HUMIDITY = line.substring(line.lastIndexOf("SHOW_HUMIDITY=") + 14).toInt(); - Serial.println("SHOW_HUMIDITY=" + String(SHOW_HUMIDITY)); - } - if (line.indexOf("SHOW_WIND=") >= 0) { - SHOW_WIND = line.substring(line.lastIndexOf("SHOW_WIND=") + 10).toInt(); - Serial.println("SHOW_WIND=" + String(SHOW_WIND)); - } - if (line.indexOf("SHOW_PRESSURE=") >= 0) { - SHOW_PRESSURE = line.substring(line.lastIndexOf("SHOW_PRESSURE=") + 14).toInt(); - Serial.println("SHOW_PRESSURE=" + String(SHOW_PRESSURE)); - } - - if (line.indexOf("SHOW_HIGHLOW=") >= 0) { - SHOW_HIGHLOW = line.substring(line.lastIndexOf("SHOW_HIGHLOW=") + 13).toInt(); - Serial.println("SHOW_HIGHLOW=" + String(SHOW_HIGHLOW)); - } - - if (line.indexOf("SHOW_DATE=") >= 0) { - SHOW_DATE = line.substring(line.lastIndexOf("SHOW_DATE=") + 10).toInt(); - Serial.println("SHOW_DATE=" + String(SHOW_DATE)); - } - if (line.indexOf("USE_PIHOLE=") >= 0) { - USE_PIHOLE = line.substring(line.lastIndexOf("USE_PIHOLE=") + 11).toInt(); - Serial.println("USE_PIHOLE=" + String(USE_PIHOLE)); - } - if (line.indexOf("PiHoleServer=") >= 0) { - PiHoleServer = line.substring(line.lastIndexOf("PiHoleServer=") + 13); - PiHoleServer.trim(); - Serial.println("PiHoleServer=" + PiHoleServer); - } - if (line.indexOf("PiHolePort=") >= 0) { - PiHolePort = line.substring(line.lastIndexOf("PiHolePort=") + 11).toInt(); - Serial.println("PiHolePort=" + String(PiHolePort)); - } - } - fr.close(); - matrix.setIntensity(displayIntensity); - newsClient.updateNewsClient(NEWS_API_KEY, NEWS_SOURCE); - weatherClient.updateWeatherApiKey(APIKEY); - weatherClient.setMetric(IS_METRIC); - weatherClient.updateCityIdList(CityIDs, 1); - printerClient.updateOctoPrintClient(OctoPrintApiKey, OctoPrintServer, OctoPrintPort, OctoAuthUser, OctoAuthPass); -} - -void scrollMessage(String msg) { - msg += " "; // add a space at the end - for ( int i = 0 ; i < width * msg.length() + matrix.width() - 1 - spacer; i++ ) { - if (WEBSERVER_ENABLED) { - server.handleClient(); - } - if (ENABLE_OTA) { - ArduinoOTA.handle(); - } - if (refresh == 1) i = 0; - refresh = 0; - matrix.fillScreen(LOW); - - int letter = i / width; - int x = (matrix.width() - 1) - i % width; - int y = (matrix.height() - 8) / 2; // center the text vertically - - while ( x + width - spacer >= 0 && letter >= 0 ) { - if ( letter < msg.length() ) { - matrix.drawChar(x, y, msg[letter], HIGH, LOW, 1); - } - - letter--; - x -= width; - } - - matrix.write(); // Send bitmap to display - delay(displayScrollSpeed); - } - matrix.setCursor(0, 0); -} - -void drawPiholeGraph() { - if (!USE_PIHOLE || piholeClient.getBlockedCount() == 0) { - return; - } - int count = piholeClient.getBlockedCount(); - int high = 0; - int row = matrix.width() - 1; - int yval = 0; - - int totalRows = count - matrix.width(); - - if (totalRows < 0) { - totalRows = 0; - } - - // get the high value for the sample that will be on the screen - for (int inx = count; inx >= totalRows; inx--) { - if (piholeClient.getBlockedAds()[inx] > high) { - high = (int)piholeClient.getBlockedAds()[inx]; - } - } - - int currentVal = 0; - for (int inx = (count-1); inx >= totalRows; inx--) { - currentVal = (int)piholeClient.getBlockedAds()[inx]; - yval = map(currentVal, 0, high, 7, 0); - //Serial.println("Value: " + String(currentVal)); - //Serial.println("x: " + String(row) + " y:" + String(yval) + " h:" + String(8-yval)); - matrix.drawFastVLine(row, yval, 8-yval, HIGH); - if (row == 0) { - break; - } - row--; - } - matrix.write(); - for (int wait = 0; wait < 500; wait++) { - if (WEBSERVER_ENABLED) { - server.handleClient(); - } - if (ENABLE_OTA) { - ArduinoOTA.handle(); - } - delay(20); - } -} - -void centerPrint(String msg) { - centerPrint(msg, false); -} - -void centerPrint(String msg, boolean extraStuff) { - int x = (matrix.width() - (msg.length() * width)) / 2; - - // Print the static portions of the display before the main Message - if (extraStuff) { - if (!IS_24HOUR && IS_PM && isPM()) { - matrix.drawPixel(matrix.width() - 1, 6, HIGH); - } - - if (OCTOPRINT_ENABLED && OCTOPRINT_PROGRESS && printerClient.isPrinting()) { - int numberOfLightPixels = (printerClient.getProgressCompletion().toFloat() / float(100)) * (matrix.width() - 1); - matrix.drawFastHLine(0, 7, numberOfLightPixels, HIGH); - } - - } - - matrix.setCursor(x, 0); - matrix.print(msg); - - matrix.write(); -} - -String decodeHtmlString(String msg) { - String decodedMsg = msg; - // Restore special characters that are misformed to %char by the client browser - decodedMsg.replace("+", " "); - decodedMsg.replace("%21", "!"); - decodedMsg.replace("%22", ""); - decodedMsg.replace("%23", "#"); - decodedMsg.replace("%24", "$"); - decodedMsg.replace("%25", "%"); - decodedMsg.replace("%26", "&"); - decodedMsg.replace("%27", "'"); - decodedMsg.replace("%28", "("); - decodedMsg.replace("%29", ")"); - decodedMsg.replace("%2A", "*"); - decodedMsg.replace("%2B", "+"); - decodedMsg.replace("%2C", ","); - decodedMsg.replace("%2F", "/"); - decodedMsg.replace("%3A", ":"); - decodedMsg.replace("%3B", ";"); - decodedMsg.replace("%3C", "<"); - decodedMsg.replace("%3D", "="); - decodedMsg.replace("%3E", ">"); - decodedMsg.replace("%3F", "?"); - decodedMsg.replace("%40", "@"); - decodedMsg.toUpperCase(); - decodedMsg.trim(); - return decodedMsg; -} +/** The MIT License (MIT) + + Copyright (c) 2018 David Payne + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE. +*/ + +/********************************************** + Edit Settings.h for personalization +***********************************************/ + +#include "Settings.h" + +#define VERSION "2.15" + +#define HOSTNAME "CLOCK-" +#define CONFIG "/conf.txt" +#define BUZZER_PIN D2 + +/* Useful Constants */ +#define SECS_PER_MIN (60UL) +#define SECS_PER_HOUR (3600UL) +#define SECS_PER_DAY (SECS_PER_HOUR * 24L) + +/* Useful Macros for getting elapsed time */ +#define numberOfSeconds(_time_) (_time_ % SECS_PER_MIN) +#define numberOfMinutes(_time_) ((_time_ / SECS_PER_MIN) % SECS_PER_MIN) +#define numberOfHours(_time_) (( _time_% SECS_PER_DAY) / SECS_PER_HOUR) +#define elapsedDays(_time_) ( _time_ / SECS_PER_DAY) + +//declairing prototypes +void configModeCallback (WiFiManager *myWiFiManager); +int8_t getWifiQuality(); + +// LED Settings +const int offset = 1; +int refresh = 0; +String message = "hello"; +int spacer = 1; // dots between letters +int width = 5 + spacer; // The font width is 5 pixels + spacer +Max72xxPanel matrix = Max72xxPanel(pinCS, numberOfHorizontalDisplays, numberOfVerticalDisplays); +String Wide_Clock_Style = "1"; //1="hh:mm Temp", 2="hh:mm:ss", 3="hh:mm" +float UtcOffset; //time zone offsets that correspond with the CityID above (offset from GMT) + +// Time +TimeDB TimeDB(""); +String lastMinute = "xx"; +int displayRefreshCount = 1; +long lastEpoch = 0; +long firstEpoch = 0; +long displayOffEpoch = 0; +boolean displayOn = true; + +// News Client +NewsApiClient newsClient(NEWS_API_KEY, NEWS_SOURCE); +int newsIndex = 0; + +// Weather Client +OpenWeatherMapClient weatherClient(APIKEY, CityIDs, 1, IS_METRIC); +// (some) Default Weather Settings +boolean SHOW_DATE = false; +boolean SHOW_CITY = true; +boolean SHOW_CONDITION = true; +boolean SHOW_HUMIDITY = true; +boolean SHOW_WIND = true; +boolean SHOW_WINDDIR = true; +boolean SHOW_PRESSURE = false; +boolean SHOW_HIGHLOW = true; + +// OctoPrint Client +OctoPrintClient printerClient(OctoPrintApiKey, OctoPrintServer, OctoPrintPort, OctoAuthUser, OctoAuthPass); +int printerCount = 0; + +// Pi-hole Client +PiHoleClient piholeClient; + +// Bitcoin Client +BitcoinApiClient bitcoinClient; + +ESP8266WebServer server(WEBSERVER_PORT); +ESP8266HTTPUpdateServer serverUpdater; + +static const char WEB_ACTIONS1[] PROGMEM = " Home" + " Configure" + " News" + " OctoPrint"; + +static const char WEB_ACTIONS2[] PROGMEM = " Bitcoin" + " Pi-hole" + " Refresh Data" + ""; + +static const char WEB_ACTION3[] PROGMEM = " Reset Settings" + " Forget WiFi" + " Firmware Update" + " About"; + +static const char CHANGE_FORM1[] PROGMEM = "

Configure:

" + "" + "" + "" + "" + "

" + "

" + "

Use Metric (Celsius)

" + "

Display Date

" + "

Display City Name

" + "

Display Daily High/Low Temperatures

" + "

Display Weather Condition

" + "

Display Humidity

" + "

Display Wind

" + "

Display Barometric Pressure

" + "

Use 24 Hour Clock (military time)

"; + +static const char CHANGE_FORM2[] PROGMEM = "

Show PM indicator (only 12h format)

" + "

Flash : in the time

" + "

" + "

" + "

" + "

Display Brightness

" + "

Display Scroll Speed

" + "

Minutes Between Refresh Data

" + "

Minutes Between Scrolling Data

"; + +static const char CHANGE_FORM3[] PROGMEM = "

Use Security Credentials for Configuration Changes

" + "

" + "

" + "

" + ""; + +static const char BITCOIN_FORM[] PROGMEM = "

Bitcoin Configuration:

" + "

Select Bitcoin Currency

" + "
"; + +static const char CURRENCY_OPTIONS[] PROGMEM = "" + "" + "" + "" + "" + "" + "" + "" + "" + ""; + +static const char WIDECLOCK_FORM[] PROGMEM = "

Wide Clock Configuration:

" + "

Wide Clock Display Format

" + "
"; + +static const char PIHOLE_FORM[] PROGMEM = "

Pi-hole Configuration:

" + "

Show Pi-hole Statistics

" + "" + "" + "

" + "
" + ""; + +static const char PIHOLE_TEST[] PROGMEM = ""; + +static const char NEWS_FORM1[] PROGMEM = "

News Configuration:

" + "

Display News Headlines

" + "" + "" + "

Select News Source

" + "" + "
"; + +static const char OCTO_FORM[] PROGMEM = "

OctoPrint Configuration:

" + "

Show OctoPrint Status

" + "

Show OctoPrint progress with clock

" + "" + "" + "" + "" + "" + "
" + ""; + + + +const int TIMEOUT = 500; // 500 = 1/2 second +int timeoutCount = 0; + +// Change the externalLight to the pin you wish to use if other than the Built-in LED +int externalLight = LED_BUILTIN; // LED_BUILTIN is is the built in LED on the Wemos + +void setup() { + Serial.begin(115200); + SPIFFS.begin(); + //SPIFFS.remove(CONFIG); + delay(10); + + // Initialize digital pin for LED + pinMode(externalLight, OUTPUT); + + //New Line to clear from start garbage + Serial.println(); + + readCityIds(); + + Serial.println("Number of LED Displays: " + String(numberOfHorizontalDisplays)); + // initialize dispaly + matrix.setIntensity(0); // Use a value between 0 and 15 for brightness + + int maxPos = numberOfHorizontalDisplays * numberOfVerticalDisplays; + for (int i = 0; i < maxPos; i++) { + matrix.setRotation(i, ledRotation); + matrix.setPosition(i, maxPos - i - 1, 0); + } + + Serial.println("matrix created"); + matrix.fillScreen(LOW); // show black + centerPrint("hello"); + + tone(BUZZER_PIN, 415, 500); + delay(500 * 1.3); + tone(BUZZER_PIN, 466, 500); + delay(500 * 1.3); + tone(BUZZER_PIN, 370, 1000); + delay(1000 * 1.3); + noTone(BUZZER_PIN); + + for (int inx = 0; inx <= 15; inx++) { + matrix.setIntensity(inx); + delay(100); + } + for (int inx = 15; inx >= 0; inx--) { + matrix.setIntensity(inx); + delay(60); + } + delay(1000); + matrix.setIntensity(displayIntensity); + //noTone(BUZZER_PIN); + + //WiFiManager + //Local intialization. Once its business is done, there is no need to keep it around + WiFiManager wifiManager; + + // Uncomment for testing wifi manager + //wifiManager.resetSettings(); + wifiManager.setAPCallback(configModeCallback); + + //Custom Station (client) Static IP Configuration - Set custom IP for your Network (IP, Gateway, Subnet mask) + //wifiManager.setSTAStaticIPConfig(IPAddress(192,168,0,99), IPAddress(192,168,0,1), IPAddress(255,255,255,0)); + + String hostname(HOSTNAME); + hostname += String(ESP.getChipId(), HEX); + if (!wifiManager.autoConnect((const char *)hostname.c_str())) {// new addition + delay(3000); + WiFi.disconnect(true); + ESP.reset(); + delay(5000); + } + + // print the received signal strength: + Serial.print("Signal Strength (RSSI): "); + Serial.print(getWifiQuality()); + Serial.println("%"); + + if (ENABLE_OTA) { + ArduinoOTA.onStart([]() { + Serial.println("Start"); + }); + ArduinoOTA.onEnd([]() { + Serial.println("\nEnd"); + }); + ArduinoOTA.onProgress([](unsigned int progress, unsigned int total) { + Serial.printf("Progress: %u%%\r", (progress / (total / 100))); + }); + ArduinoOTA.onError([](ota_error_t error) { + Serial.printf("Error[%u]: ", error); + if (error == OTA_AUTH_ERROR) Serial.println("Auth Failed"); + else if (error == OTA_BEGIN_ERROR) Serial.println("Begin Failed"); + else if (error == OTA_CONNECT_ERROR) Serial.println("Connect Failed"); + else if (error == OTA_RECEIVE_ERROR) Serial.println("Receive Failed"); + else if (error == OTA_END_ERROR) Serial.println("End Failed"); + }); + ArduinoOTA.setHostname((const char *)hostname.c_str()); + if (OTA_Password != "") { + ArduinoOTA.setPassword(((const char *)OTA_Password.c_str())); + } + ArduinoOTA.begin(); + } + + if (WEBSERVER_ENABLED) { + server.on("/", displayWeatherData); + server.on("/pull", handlePull); + server.on("/locations", handleLocations); + server.on("/savebitcoin", handleSaveBitcoin); + server.on("/savewideclock", handleSaveWideClock); + server.on("/savenews", handleSaveNews); + server.on("/saveoctoprint", handleSaveOctoprint); + server.on("/savepihole", handleSavePihole); + server.on("/systemreset", handleSystemReset); + server.on("/forgetwifi", handleForgetWifi); + server.on("/configure", handleConfigure); + server.on("/configurebitcoin", handleBitcoinConfigure); + server.on("/configurewideclock", handleWideClockConfigure); + server.on("/configurenews", handleNewsConfigure); + server.on("/configureoctoprint", handleOctoprintConfigure); + server.on("/configurepihole", handlePiholeConfigure); + server.on("/display", handleDisplay); + server.onNotFound(redirectHome); + serverUpdater.setup(&server, "/update", www_username, www_password); + // Start the server + server.begin(); + Serial.println("Server started"); + // Print the IP address + String webAddress = "http://" + WiFi.localIP().toString() + ":" + String(WEBSERVER_PORT) + "/"; + Serial.println("Use this URL : " + webAddress); + scrollMessage(" v" + String(VERSION) + " IP: " + WiFi.localIP().toString() + " "); + } else { + Serial.println("Web Interface is Disabled"); + scrollMessage("Web Interface is Disabled"); + } + + flashLED(1, 500); +} + +//************************************************************ +// Main Looop +//************************************************************ +void loop() { + //Get some Weather Data to serve + if ((getMinutesFromLastRefresh() >= minutesBetweenDataRefresh) || lastEpoch == 0) { + getWeatherData(); + } + checkDisplay(); // this will see if we need to turn it on or off for night mode. + + if (lastMinute != TimeDB.zeroPad(minute())) { + lastMinute = TimeDB.zeroPad(minute()); + + if (weatherClient.getError() != "") { + scrollMessage(weatherClient.getError()); + return; + } + + if (displayOn) { + matrix.shutdown(false); + } + matrix.fillScreen(LOW); // show black + if (OCTOPRINT_ENABLED) { + if (displayOn && ((printerClient.isOperational() || printerClient.isPrinting()) || printerCount == 0)) { + // This should only get called if the printer is actually running or if it has been 2 minutes since last check + printerClient.getPrinterJobResults(); + } + printerCount += 1; + if (printerCount > 2) { + printerCount = 0; + } + } + + displayRefreshCount --; + // Check to see if we need to Scroll some Data + if (displayRefreshCount <= 0) { + displayRefreshCount = minutesBetweenScrolling; + String temperature = weatherClient.getTempRounded(0); + String description = weatherClient.getDescription(0); + description.toUpperCase(); + String msg; + msg += " "; + + if (SHOW_DATE) { + msg += TimeDB.getDayName() + ", "; + msg += TimeDB.getMonthName() + " " + day() + " "; + } + if (SHOW_CITY) { + msg += weatherClient.getCity(0) + " "; + } + msg += temperature + getTempSymbol() + " "; + + //show high/low temperature + if (SHOW_HIGHLOW) { + msg += "High/Low:" + weatherClient.getHigh(0) + "/" + weatherClient.getLow(0) + " " + getTempSymbol() + " "; + } + + if (SHOW_CONDITION) { + msg += description + " "; + } + if (SHOW_HUMIDITY) { + msg += "Humidity:" + weatherClient.getHumidityRounded(0) + "% "; + } + if (SHOW_WIND) { + msg += "Wind: " + weatherClient.getDirectionText(0) + " @ " + weatherClient.getWindRounded(0) + " " + getSpeedSymbol() + " "; + } + //line to show barometric pressure + if (SHOW_PRESSURE) { + msg += "Pressure:" + weatherClient.getPressure(0) + getPressureSymbol() + " "; + } + + msg += marqueeMessage + " "; + + if (NEWS_ENABLED) { + msg += " " + NEWS_SOURCE + ": " + newsClient.getTitle(newsIndex) + " "; + newsIndex += 1; + if (newsIndex > 9) { + newsIndex = 0; + } + } + if (OCTOPRINT_ENABLED && printerClient.isPrinting()) { + msg += " " + printerClient.getFileName() + " "; + msg += "(" + printerClient.getProgressCompletion() + "%) "; + } + if (BitcoinCurrencyCode != "NONE" && BitcoinCurrencyCode != "") { + msg += " Bitcoin: " + bitcoinClient.getRate() + " " + bitcoinClient.getCode() + " "; + } + if (USE_PIHOLE) { + piholeClient.getPiHoleData(PiHoleServer, PiHolePort); + piholeClient.getGraphData(PiHoleServer, PiHolePort); + if (piholeClient.getPiHoleStatus() != "") { + msg += " Pi-hole (" + piholeClient.getPiHoleStatus() + "): " + piholeClient.getAdsPercentageToday() + "% "; + } + } + + scrollMessage(msg); + drawPiholeGraph(); + } + } + + String currentTime = hourMinutes(false); + + if (numberOfHorizontalDisplays >= 8) { + if (Wide_Clock_Style == "1") { + // On Wide Display -- show the current temperature as well + String currentTemp = weatherClient.getTempRounded(0); + String timeSpacer = " "; + if (currentTemp.length() >= 3) { + timeSpacer = " "; + } + currentTime += timeSpacer + currentTemp + getTempSymbol(); + } + if (Wide_Clock_Style == "2") { + currentTime += secondsIndicator(false) + TimeDB.zeroPad(second()); + matrix.fillScreen(LOW); // show black + } + if (Wide_Clock_Style == "3") { + // No change this is normal clock display + } + } + matrix.fillScreen(LOW); + centerPrint(currentTime, true); + + if (WEBSERVER_ENABLED) { + server.handleClient(); + } + if (ENABLE_OTA) { + ArduinoOTA.handle(); + } +} + +String hourMinutes(boolean isRefresh) { + if (IS_24HOUR) { + return hour() + secondsIndicator(isRefresh) + TimeDB.zeroPad(minute()); + } else { + return hourFormat12() + secondsIndicator(isRefresh) + TimeDB.zeroPad(minute()); + } +} + +String secondsIndicator(boolean isRefresh) { + String rtnValue = ":"; + if (isRefresh == false && (flashOnSeconds && (second() % 2) == 0)) { + rtnValue = " "; + } + return rtnValue; +} + +boolean athentication() { + if (IS_BASIC_AUTH) { + return server.authenticate(www_username, www_password); + } + return true; // Authentication not required +} + +void handlePull() { + getWeatherData(); // this will force a data pull for new weather + displayWeatherData(); +} + +void handleSaveBitcoin() { + if (!athentication()) { + return server.requestAuthentication(); + } + BitcoinCurrencyCode = server.arg("bitcoincurrency"); + writeCityIds(); + bitcoinClient.updateBitcoinData(BitcoinCurrencyCode); // does nothing if BitCoinCurrencyCode is "NONE" or empty + redirectHome(); +} + +void handleSaveWideClock() { + if (!athentication()) { + return server.requestAuthentication(); + } + if (numberOfHorizontalDisplays >= 8) { + Wide_Clock_Style = server.arg("wideclockformat"); + writeCityIds(); + matrix.fillScreen(LOW); // show black + } + redirectHome(); +} + +void handleSaveNews() { + if (!athentication()) { + return server.requestAuthentication(); + } + NEWS_ENABLED = server.hasArg("displaynews"); + NEWS_API_KEY = server.arg("newsApiKey"); + NEWS_SOURCE = server.arg("newssource"); + matrix.fillScreen(LOW); // show black + writeCityIds(); + newsClient.updateNews(); + redirectHome(); +} + +void handleSaveOctoprint() { + if (!athentication()) { + return server.requestAuthentication(); + } + OCTOPRINT_ENABLED = server.hasArg("displayoctoprint"); + OCTOPRINT_PROGRESS = server.hasArg("octoprintprogress"); + OctoPrintApiKey = server.arg("octoPrintApiKey"); + OctoPrintServer = server.arg("octoPrintAddress"); + OctoPrintPort = server.arg("octoPrintPort").toInt(); + OctoAuthUser = server.arg("octoUser"); + OctoAuthPass = server.arg("octoPass"); + matrix.fillScreen(LOW); // show black + writeCityIds(); + if (OCTOPRINT_ENABLED) { + printerClient.getPrinterJobResults(); + } + redirectHome(); +} + +void handleSavePihole() { + if (!athentication()) { + return server.requestAuthentication(); + } + USE_PIHOLE = server.hasArg("displaypihole"); + PiHoleServer = server.arg("piholeAddress"); + PiHolePort = server.arg("piholePort").toInt(); + writeCityIds(); + if (USE_PIHOLE) { + piholeClient.getPiHoleData(PiHoleServer, PiHolePort); + piholeClient.getGraphData(PiHoleServer, PiHolePort); + } + redirectHome(); +} + +void handleLocations() { + if (!athentication()) { + return server.requestAuthentication(); + } + TIMEDBKEY = server.arg("TimeZoneDB"); + APIKEY = server.arg("openWeatherMapApiKey"); + CityIDs[0] = server.arg("city1").toInt(); + flashOnSeconds = server.hasArg("flashseconds"); + IS_24HOUR = server.hasArg("is24hour"); + IS_PM = server.hasArg("isPM"); + SHOW_DATE = server.hasArg("showdate"); + SHOW_CITY = server.hasArg("showcity"); + SHOW_CONDITION = server.hasArg("showcondition"); + SHOW_HUMIDITY = server.hasArg("showhumidity"); + SHOW_WIND = server.hasArg("showwind"); + SHOW_PRESSURE = server.hasArg("showpressure"); + SHOW_HIGHLOW = server.hasArg("showhighlow"); + IS_METRIC = server.hasArg("metric"); + marqueeMessage = decodeHtmlString(server.arg("marqueeMsg")); + timeDisplayTurnsOn = decodeHtmlString(server.arg("startTime")); + timeDisplayTurnsOff = decodeHtmlString(server.arg("endTime")); + displayIntensity = server.arg("ledintensity").toInt(); + minutesBetweenDataRefresh = server.arg("refresh").toInt(); + minutesBetweenScrolling = server.arg("refreshDisplay").toInt(); + displayScrollSpeed = server.arg("scrollspeed").toInt(); + IS_BASIC_AUTH = server.hasArg("isBasicAuth"); + String temp = server.arg("userid"); + temp.toCharArray(www_username, sizeof(temp)); + temp = server.arg("stationpassword"); + temp.toCharArray(www_password, sizeof(temp)); + weatherClient.setMetric(IS_METRIC); + matrix.fillScreen(LOW); // show black + writeCityIds(); + getWeatherData(); // this will force a data pull for new weather + redirectHome(); +} + +void handleSystemReset() { + if (!athentication()) { + return server.requestAuthentication(); + } + Serial.println("Reset System Configuration"); + if (SPIFFS.remove(CONFIG)) { + redirectHome(); + ESP.restart(); + } +} + +void handleForgetWifi() { + if (!athentication()) { + return server.requestAuthentication(); + } + //WiFiManager + //Local intialization. Once its business is done, there is no need to keep it around + redirectHome(); + WiFiManager wifiManager; + wifiManager.resetSettings(); + ESP.restart(); +} + +void handleBitcoinConfigure() { + if (!athentication()) { + return server.requestAuthentication(); + } + digitalWrite(externalLight, LOW); + String html = ""; + + server.sendHeader("Cache-Control", "no-cache, no-store"); + server.sendHeader("Pragma", "no-cache"); + server.sendHeader("Expires", "-1"); + server.setContentLength(CONTENT_LENGTH_UNKNOWN); + server.send(200, "text/html", ""); + + sendHeader(); + + String form = FPSTR(BITCOIN_FORM); + String bitcoinOptions = FPSTR(CURRENCY_OPTIONS); + bitcoinOptions.replace(BitcoinCurrencyCode + "'", BitcoinCurrencyCode + "' selected"); + form.replace("%BITCOINOPTIONS%", bitcoinOptions); + server.sendContent(form); //Send another Chunk of form + + sendFooter(); + + server.sendContent(""); + server.client().stop(); + digitalWrite(externalLight, HIGH); +} + +void handleWideClockConfigure() { + if (!athentication()) { + return server.requestAuthentication(); + } + digitalWrite(externalLight, LOW); + + server.sendHeader("Cache-Control", "no-cache, no-store"); + server.sendHeader("Pragma", "no-cache"); + server.sendHeader("Expires", "-1"); + server.setContentLength(CONTENT_LENGTH_UNKNOWN); + server.send(200, "text/html", ""); + + sendHeader(); + + if (numberOfHorizontalDisplays >= 8) { + // Wide display options + String form = FPSTR(WIDECLOCK_FORM); + String clockOptions = ""; + clockOptions.replace(Wide_Clock_Style + "'", Wide_Clock_Style + "' selected"); + form.replace("%WIDECLOCKOPTIONS%", clockOptions); + server.sendContent(form); + } + + sendFooter(); + + server.sendContent(""); + server.client().stop(); + digitalWrite(externalLight, HIGH); +} + +void handleNewsConfigure() { + if (!athentication()) { + return server.requestAuthentication(); + } + digitalWrite(externalLight, LOW); + + server.sendHeader("Cache-Control", "no-cache, no-store"); + server.sendHeader("Pragma", "no-cache"); + server.sendHeader("Expires", "-1"); + server.setContentLength(CONTENT_LENGTH_UNKNOWN); + server.send(200, "text/html", ""); + + sendHeader(); + + String form = FPSTR(NEWS_FORM1); + String isNewsDisplayedChecked = ""; + if (NEWS_ENABLED) { + isNewsDisplayedChecked = "checked='checked'"; + } + form.replace("%NEWSCHECKED%", isNewsDisplayedChecked); + form.replace("%NEWSKEY%", NEWS_API_KEY); + form.replace("%NEWSSOURCE%", NEWS_SOURCE); + server.sendContent(form); //Send news form + + sendFooter(); + + server.sendContent(""); + server.client().stop(); + digitalWrite(externalLight, HIGH); +} + +void handleOctoprintConfigure() { + if (!athentication()) { + return server.requestAuthentication(); + } + digitalWrite(externalLight, LOW); + + server.sendHeader("Cache-Control", "no-cache, no-store"); + server.sendHeader("Pragma", "no-cache"); + server.sendHeader("Expires", "-1"); + server.setContentLength(CONTENT_LENGTH_UNKNOWN); + server.send(200, "text/html", ""); + + sendHeader(); + + String form = FPSTR(OCTO_FORM); + String isOctoPrintDisplayedChecked = ""; + if (OCTOPRINT_ENABLED) { + isOctoPrintDisplayedChecked = "checked='checked'"; + } + form.replace("%OCTOCHECKED%", isOctoPrintDisplayedChecked); + String isOctoPrintProgressChecked = ""; + if (OCTOPRINT_PROGRESS) { + isOctoPrintProgressChecked = "checked='checked'"; + } + form.replace("%OCTOPROGRESSCHECKED%", isOctoPrintProgressChecked); + form.replace("%OCTOKEY%", OctoPrintApiKey); + form.replace("%OCTOADDRESS%", OctoPrintServer); + form.replace("%OCTOPORT%", String(OctoPrintPort)); + form.replace("%OCTOUSER%", OctoAuthUser); + form.replace("%OCTOPASS%", OctoAuthPass); + server.sendContent(form); + + sendFooter(); + + server.sendContent(""); + server.client().stop(); + digitalWrite(externalLight, HIGH); +} + +void handlePiholeConfigure() { + if (!athentication()) { + return server.requestAuthentication(); + } + digitalWrite(externalLight, LOW); + + server.sendHeader("Cache-Control", "no-cache, no-store"); + server.sendHeader("Pragma", "no-cache"); + server.sendHeader("Expires", "-1"); + server.setContentLength(CONTENT_LENGTH_UNKNOWN); + server.send(200, "text/html", ""); + + sendHeader(); + + server.sendContent(FPSTR(PIHOLE_TEST)); + + String form = FPSTR(PIHOLE_FORM); + String isPiholeDisplayedChecked = ""; + if (USE_PIHOLE) { + isPiholeDisplayedChecked = "checked='checked'"; + } + form.replace("%PIHOLECHECKED%", isPiholeDisplayedChecked); + form.replace("%PIHOLEADDRESS%", PiHoleServer); + form.replace("%PIHOLEPORT%", String(PiHolePort)); + + server.sendContent(form); + form = ""; + + sendFooter(); + + server.sendContent(""); + server.client().stop(); + digitalWrite(externalLight, HIGH); +} + +void handleConfigure() { + if (!athentication()) { + return server.requestAuthentication(); + } + digitalWrite(externalLight, LOW); + String html = ""; + + server.sendHeader("Cache-Control", "no-cache, no-store"); + server.sendHeader("Pragma", "no-cache"); + server.sendHeader("Expires", "-1"); + server.setContentLength(CONTENT_LENGTH_UNKNOWN); + server.send(200, "text/html", ""); + + sendHeader(); + + String form = FPSTR(CHANGE_FORM1); + form.replace("%TIMEDBKEY%", TIMEDBKEY); + form.replace("%WEATHERKEY%", APIKEY); + + + String cityName = ""; + if (weatherClient.getCity(0) != "") { + cityName = weatherClient.getCity(0) + ", " + weatherClient.getCountry(0); + } + form.replace("%CITYNAME1%", cityName); + form.replace("%CITY1%", String(CityIDs[0])); + String isDateChecked = ""; + if (SHOW_DATE) { + isDateChecked = "checked='checked'"; + } + form.replace("%DATE_CHECKED%", isDateChecked); + String isCityChecked = ""; + if (SHOW_CITY) { + isCityChecked = "checked='checked'"; + } + form.replace("%CITY_CHECKED%", isCityChecked); + String isConditionChecked = ""; + if (SHOW_CONDITION) { + isConditionChecked = "checked='checked'"; + } + form.replace("%CONDITION_CHECKED%", isConditionChecked); + String isHumidityChecked = ""; + if (SHOW_HUMIDITY) { + isHumidityChecked = "checked='checked'"; + } + form.replace("%HUMIDITY_CHECKED%", isHumidityChecked); + String isWindChecked = ""; + if (SHOW_WIND) { + isWindChecked = "checked='checked'"; + } + form.replace("%WIND_CHECKED%", isWindChecked); + String isPressureChecked = ""; + if (SHOW_PRESSURE) { + isPressureChecked = "checked='checked'"; + } + form.replace("%PRESSURE_CHECKED%", isPressureChecked); + + String isHighlowChecked = ""; + if (SHOW_HIGHLOW) { + isHighlowChecked = "checked='checked'"; + } + form.replace("%HIGHLOW_CHECKED%", isHighlowChecked); + + + String is24hourChecked = ""; + if (IS_24HOUR) { + is24hourChecked = "checked='checked'"; + } + form.replace("%IS_24HOUR_CHECKED%", is24hourChecked); + String checked = ""; + if (IS_METRIC) { + checked = "checked='checked'"; + } + form.replace("%CHECKED%", checked); + server.sendContent(form); + + form = FPSTR(CHANGE_FORM2); + String isPmChecked = ""; + if (IS_PM) { + isPmChecked = "checked='checked'"; + } + form.replace("%IS_PM_CHECKED%", isPmChecked); + String isFlashSecondsChecked = ""; + if (flashOnSeconds) { + isFlashSecondsChecked = "checked='checked'"; + } + form.replace("%FLASHSECONDS%", isFlashSecondsChecked); + form.replace("%MSG%", marqueeMessage); + form.replace("%STARTTIME%", timeDisplayTurnsOn); + form.replace("%ENDTIME%", timeDisplayTurnsOff); + form.replace("%INTENSITYOPTIONS%", String(displayIntensity)); + String dSpeed = String(displayScrollSpeed); + String scrollOptions = ""; + scrollOptions.replace(dSpeed + "'", dSpeed + "' selected" ); + form.replace("%SCROLLOPTIONS%", scrollOptions); + String minutes = String(minutesBetweenDataRefresh); + String options = ""; + options.replace(">" + minutes + "<", " selected>" + minutes + "<"); + form.replace("%OPTIONS%", options); + form.replace("%REFRESH_DISPLAY%", String(minutesBetweenScrolling)); + + server.sendContent(form); //Send another chunk of the form + + form = FPSTR(CHANGE_FORM3); + String isUseSecurityChecked = ""; + if (IS_BASIC_AUTH) { + isUseSecurityChecked = "checked='checked'"; + } + form.replace("%IS_BASICAUTH_CHECKED%", isUseSecurityChecked); + form.replace("%USERID%", String(www_username)); + form.replace("%STATIONPASSWORD%", String(www_password)); + + server.sendContent(form); // Send the second chunk of Data + + sendFooter(); + + server.sendContent(""); + server.client().stop(); + digitalWrite(externalLight, HIGH); +} + +void handleDisplay() { + if (!athentication()) { + return server.requestAuthentication(); + } + enableDisplay(!displayOn); + String state = "OFF"; + if (displayOn) { + state = "ON"; + } + displayMessage("Display is now " + state); +} + +//*********************************************************************** +void getWeatherData() //client function to send/receive GET request data. +{ + digitalWrite(externalLight, LOW); + matrix.fillScreen(LOW); // show black + Serial.println(); + + if (displayOn) { + // only pull the weather data if display is on + if (firstEpoch != 0) { + centerPrint(hourMinutes(true), true); + } else { + centerPrint("..."); + } + matrix.drawPixel(0, 7, HIGH); + matrix.drawPixel(0, 6, HIGH); + matrix.drawPixel(0, 5, HIGH); + matrix.write(); + + weatherClient.updateWeather(); + if (weatherClient.getError() != "") { + scrollMessage(weatherClient.getError()); + } + } + + Serial.println("Updating Time..."); + //Update the Time + matrix.drawPixel(0, 4, HIGH); + matrix.drawPixel(0, 3, HIGH); + matrix.drawPixel(0, 2, HIGH); + Serial.println("matrix Width:" + matrix.width()); + matrix.write(); + TimeDB.updateConfig(TIMEDBKEY, weatherClient.getLat(0), weatherClient.getLon(0)); + time_t currentTime = TimeDB.getTime(); + if(currentTime > 5000 || firstEpoch == 0) { + setTime(currentTime); + } else { + Serial.println("Time update unsuccessful!"); + } + lastEpoch = now(); + if (firstEpoch == 0) { + firstEpoch = now(); + Serial.println("firstEpoch is: " + String(firstEpoch)); + } + + if (NEWS_ENABLED && displayOn) { + matrix.drawPixel(0, 2, HIGH); + matrix.drawPixel(0, 1, HIGH); + matrix.drawPixel(0, 0, HIGH); + matrix.write(); + Serial.println("Getting News Data for " + NEWS_SOURCE); + newsClient.updateNews(); + } + + if (displayOn) { + bitcoinClient.updateBitcoinData(BitcoinCurrencyCode); // does nothing if BitCoinCurrencyCode is "NONE" or empty + } + + Serial.println("Version: " + String(VERSION)); + Serial.println(); + digitalWrite(externalLight, HIGH); +} + +void displayMessage(String message) { + digitalWrite(externalLight, LOW); + + server.sendHeader("Cache-Control", "no-cache, no-store"); + server.sendHeader("Pragma", "no-cache"); + server.sendHeader("Expires", "-1"); + server.setContentLength(CONTENT_LENGTH_UNKNOWN); + server.send(200, "text/html", ""); + sendHeader(); + server.sendContent(message); + sendFooter(); + server.sendContent(""); + server.client().stop(); + + digitalWrite(externalLight, HIGH); +} + +void redirectHome() { + // Send them back to the Root Directory + server.sendHeader("Location", String("/"), true); + server.sendHeader("Cache-Control", "no-cache, no-store"); + server.sendHeader("Pragma", "no-cache"); + server.sendHeader("Expires", "-1"); + server.send(302, "text/plain", ""); + server.client().stop(); + delay(1000); +} + +void sendHeader() { + String html = ""; + html += "Marquee Scroller"; + html += ""; + html += ""; + html += ""; + html += ""; + html += ""; + html += ""; + server.sendContent(html); + html = ""; + html += "

Weather Marquee

"; + html += ""; + html += "
"; + server.sendContent(html); +} + +void sendFooter() { + int8_t rssi = getWifiQuality(); + Serial.print("Signal Strength (RSSI): "); + Serial.print(rssi); + Serial.println("%"); + String html = "


"; + html += "
"; + html += "
"; + html += " Version: " + String(VERSION) + "
"; + html += " Next Update: " + getTimeTillUpdate() + "
"; + html += " Signal Strength: "; + html += String(rssi) + "%"; + html += "
"; + html += ""; + server.sendContent(html); +} + +void displayWeatherData() { + digitalWrite(externalLight, LOW); + String html = ""; + + server.sendHeader("Cache-Control", "no-cache, no-store"); + server.sendHeader("Pragma", "no-cache"); + server.sendHeader("Expires", "-1"); + server.setContentLength(CONTENT_LENGTH_UNKNOWN); + server.send(200, "text/html", ""); + sendHeader(); + + String temperature = weatherClient.getTemp(0); + + if ((temperature.indexOf(".") != -1) && (temperature.length() >= (temperature.indexOf(".") + 2))) { + temperature.remove(temperature.indexOf(".") + 2); + } + + String time = TimeDB.getDayName() + ", " + TimeDB.getMonthName() + " " + day() + ", " + hourFormat12() + ":" + TimeDB.zeroPad(minute()) + " " + TimeDB.getAmPm(); + + Serial.println(weatherClient.getCity(0)); + Serial.println(weatherClient.getCondition(0)); + Serial.println(weatherClient.getDescription(0)); + Serial.println(temperature); + Serial.println(time); + + if (TIMEDBKEY == "") { + html += "

Please Configure TimeZoneDB with API key.

"; + } + + if (weatherClient.getCity(0) == "") { + html += "

Please Configure Weather API

"; + if (weatherClient.getError() != "") { + html += "

Weather Error: " + weatherClient.getError() + "

"; + } + } else { + html += "

" + weatherClient.getCity(0) + ", " + weatherClient.getCountry(0) + "

"; + html += "
"; + html += "" + weatherClient.getDescription(0) + "
"; + html += weatherClient.getHumidity(0) + "% Humidity
"; + html += weatherClient.getDirectionText(0) + " / " + weatherClient.getWind(0) + " " + getSpeedSymbol() + " Wind
"; + html += weatherClient.getPressure(0) + " Pressure
"; + html += "
"; + html += "

"; + html += weatherClient.getCondition(0) + " (" + weatherClient.getDescription(0) + ")
"; + html += temperature + " " + getTempSymbol() + "
"; + html += weatherClient.getHigh(0) + "/" + weatherClient.getLow(0) + " " + getTempSymbol() + "
"; + html += time + "
"; + html += " Map It!
"; + html += "


"; + } + + + server.sendContent(String(html)); // spit out what we got + html = ""; // fresh start + + + if (OCTOPRINT_ENABLED) { + html = "
OctoPrint Status: "; + if (printerClient.isPrinting()) { + html += printerClient.getState() + " " + printerClient.getFileName() + " (" + printerClient.getProgressCompletion() + "%)"; + } else if (printerClient.isOperational()) { + html += printerClient.getState(); + } else if (printerClient.getError() != "") { + html += printerClient.getError(); + } else { + html += "Not Connected"; + } + html += "


"; + server.sendContent(String(html)); + html = ""; + } + + if (BitcoinCurrencyCode != "NONE" && BitcoinCurrencyCode != "") { + html = "
Bitcoin value: " + bitcoinClient.getRate() + " " + bitcoinClient.getCode() + "


"; + server.sendContent(String(html)); + html = ""; + } + + if (USE_PIHOLE) { + if (piholeClient.getError() == "") { + html = "
Pi-hole
" + "Total Queries (" + piholeClient.getUniqueClients() + " clients): " + piholeClient.getDnsQueriesToday() + "
" + "Queries Blocked: " + piholeClient.getAdsBlockedToday() + "
" + "Percent Blocked: " + piholeClient.getAdsPercentageToday() + "%
" + "Domains on Blocklist: " + piholeClient.getDomainsBeingBlocked() + "
" + "Status: " + piholeClient.getPiHoleStatus() + "
" + "


"; + } else { + html = "
Pi-hole Error"; + html += "Please Configure for Pi-hole
"; + html += "Status: Error Getting Data
"; + html += "Reason: " + piholeClient.getError() + "


"; + } + server.sendContent(html); + html = ""; + } + + if (NEWS_ENABLED) { + html = "

News (" + NEWS_SOURCE + ")

"; + if (newsClient.getTitle(0) == "") { + html += "

Please Configure News API

"; + server.sendContent(html); + html = ""; + } else { + for (int inx = 0; inx < 10; inx++) { + html = ""; + html += newsClient.getDescription(inx) + "

"; + server.sendContent(html); + html = ""; + } + } + } + + sendFooter(); + server.sendContent(""); + server.client().stop(); + digitalWrite(externalLight, HIGH); +} + +void configModeCallback (WiFiManager *myWiFiManager) { + Serial.println("Entered config mode"); + Serial.println(WiFi.softAPIP()); + Serial.println("Wifi Manager"); + Serial.println("Please connect to AP"); + Serial.println(myWiFiManager->getConfigPortalSSID()); + Serial.println("To setup Wifi Configuration"); + scrollMessage("Please Connect to AP: " + String(myWiFiManager->getConfigPortalSSID())); + centerPrint("wifi"); +} + +void flashLED(int number, int delayTime) { + for (int inx = 0; inx < number; inx++) { + tone(BUZZER_PIN, 440, delayTime); + delay(delayTime); + digitalWrite(externalLight, LOW); + delay(delayTime); + digitalWrite(externalLight, HIGH); + delay(delayTime); + } + noTone(BUZZER_PIN); +} + +String getTempSymbol() { + String rtnValue = "F"; + if (IS_METRIC) { + rtnValue = "C"; + } + return rtnValue; +} + +String getSpeedSymbol() { + String rtnValue = "mph"; + if (IS_METRIC) { + rtnValue = "kph"; + } + return rtnValue; +} + +String getPressureSymbol() +{ + String rtnValue = ""; + if (IS_METRIC) + { + rtnValue = "mb"; + } + return rtnValue; +} + +// converts the dBm to a range between 0 and 100% +int8_t getWifiQuality() { + int32_t dbm = WiFi.RSSI(); + if (dbm <= -100) { + return 0; + } else if (dbm >= -50) { + return 100; + } else { + return 2 * (dbm + 100); + } +} + +String getTimeTillUpdate() { + String rtnValue = ""; + + long timeToUpdate = (((minutesBetweenDataRefresh * 60) + lastEpoch) - now()); + + int hours = numberOfHours(timeToUpdate); + int minutes = numberOfMinutes(timeToUpdate); + int seconds = numberOfSeconds(timeToUpdate); + + rtnValue += String(hours) + ":"; + if (minutes < 10) { + rtnValue += "0"; + } + rtnValue += String(minutes) + ":"; + if (seconds < 10) { + rtnValue += "0"; + } + rtnValue += String(seconds); + + return rtnValue; +} + +int getMinutesFromLastRefresh() { + int minutes = (now() - lastEpoch) / 60; + return minutes; +} + +int getMinutesFromLastDisplay() { + int minutes = (now() - displayOffEpoch) / 60; + return minutes; +} + +void enableDisplay(boolean enable) { + displayOn = enable; + if (enable) { + if (getMinutesFromLastDisplay() >= minutesBetweenDataRefresh) { + // The display has been off longer than the minutes between refresh -- need to get fresh data + lastEpoch = 0; // this should force a data pull of the weather + displayOffEpoch = 0; // reset + } + matrix.shutdown(false); + matrix.fillScreen(LOW); // show black + Serial.println("Display was turned ON: " + now()); + } else { + matrix.shutdown(true); + Serial.println("Display was turned OFF: " + now()); + displayOffEpoch = lastEpoch; + } +} + +// Toggle on and off the display if user defined times +void checkDisplay() { + if (timeDisplayTurnsOn == "" || timeDisplayTurnsOff == "") { + return; // nothing to do + } + String currentTime = TimeDB.zeroPad(hour()) + ":" + TimeDB.zeroPad(minute()); + + if (currentTime == timeDisplayTurnsOn && !displayOn) { + Serial.println("Time to turn display on: " + currentTime); + flashLED(1, 500); + enableDisplay(true); + } + + if (currentTime == timeDisplayTurnsOff && displayOn) { + Serial.println("Time to turn display off: " + currentTime); + flashLED(2, 500); + enableDisplay(false); + } +} + +String writeCityIds() { + // Save decoded message to SPIFFS file for playback on power up. + File f = SPIFFS.open(CONFIG, "w"); + if (!f) { + Serial.println("File open failed!"); + } else { + Serial.println("Saving settings now..."); + f.println("TIMEDBKEY=" + TIMEDBKEY); + f.println("APIKEY=" + APIKEY); + f.println("CityID=" + String(CityIDs[0])); + f.println("marqueeMessage=" + marqueeMessage); + f.println("newsSource=" + NEWS_SOURCE); + f.println("timeDisplayTurnsOn=" + timeDisplayTurnsOn); + f.println("timeDisplayTurnsOff=" + timeDisplayTurnsOff); + f.println("ledIntensity=" + String(displayIntensity)); + f.println("scrollSpeed=" + String(displayScrollSpeed)); + f.println("isNews=" + String(NEWS_ENABLED)); + f.println("newsApiKey=" + NEWS_API_KEY); + f.println("isFlash=" + String(flashOnSeconds)); + f.println("is24hour=" + String(IS_24HOUR)); + f.println("isPM=" + String(IS_PM)); + f.println("wideclockformat=" + Wide_Clock_Style); + f.println("isMetric=" + String(IS_METRIC)); + f.println("refreshRate=" + String(minutesBetweenDataRefresh)); + f.println("minutesBetweenScrolling=" + String(minutesBetweenScrolling)); + f.println("isOctoPrint=" + String(OCTOPRINT_ENABLED)); + f.println("isOctoProgress=" + String(OCTOPRINT_PROGRESS)); + f.println("octoKey=" + OctoPrintApiKey); + f.println("octoServer=" + OctoPrintServer); + f.println("octoPort=" + String(OctoPrintPort)); + f.println("octoUser=" + OctoAuthUser); + f.println("octoPass=" + OctoAuthPass); + f.println("www_username=" + String(www_username)); + f.println("www_password=" + String(www_password)); + f.println("IS_BASIC_AUTH=" + String(IS_BASIC_AUTH)); + f.println("BitcoinCurrencyCode=" + BitcoinCurrencyCode); + f.println("SHOW_CITY=" + String(SHOW_CITY)); + f.println("SHOW_CONDITION=" + String(SHOW_CONDITION)); + f.println("SHOW_HUMIDITY=" + String(SHOW_HUMIDITY)); + f.println("SHOW_WIND=" + String(SHOW_WIND)); + f.println("SHOW_PRESSURE=" + String(SHOW_PRESSURE)); + f.println("SHOW_HIGHLOW=" + String(SHOW_HIGHLOW)); + f.println("SHOW_DATE=" + String(SHOW_DATE)); + f.println("USE_PIHOLE=" + String(USE_PIHOLE)); + f.println("PiHoleServer=" + PiHoleServer); + f.println("PiHolePort=" + String(PiHolePort)); + } + f.close(); + readCityIds(); + weatherClient.updateCityIdList(CityIDs, 1); + String cityIds = weatherClient.getMyCityIDs(); + return cityIds; +} + +void readCityIds() { + if (SPIFFS.exists(CONFIG) == false) { + Serial.println("Settings File does not yet exists."); + writeCityIds(); + return; + } + File fr = SPIFFS.open(CONFIG, "r"); + String line; + while (fr.available()) { + line = fr.readStringUntil('\n'); + if (line.indexOf("TIMEDBKEY=") >= 0) { + TIMEDBKEY = line.substring(line.lastIndexOf("TIMEDBKEY=") + 10); + TIMEDBKEY.trim(); + Serial.println("TIMEDBKEY: " + TIMEDBKEY); + } + if (line.indexOf("APIKEY=") >= 0) { + APIKEY = line.substring(line.lastIndexOf("APIKEY=") + 7); + APIKEY.trim(); + Serial.println("APIKEY: " + APIKEY); + } + if (line.indexOf("CityID=") >= 0) { + CityIDs[0] = line.substring(line.lastIndexOf("CityID=") + 7).toInt(); + Serial.println("CityID: " + String(CityIDs[0])); + } + if (line.indexOf("newsSource=") >= 0) { + NEWS_SOURCE = line.substring(line.lastIndexOf("newsSource=") + 11); + NEWS_SOURCE.trim(); + Serial.println("newsSource=" + NEWS_SOURCE); + } + if (line.indexOf("isNews=") >= 0) { + NEWS_ENABLED = line.substring(line.lastIndexOf("isNews=") + 7).toInt(); + Serial.println("NEWS_ENABLED=" + String(NEWS_ENABLED)); + } + if (line.indexOf("newsApiKey=") >= 0) { + NEWS_API_KEY = line.substring(line.lastIndexOf("newsApiKey=") + 11); + NEWS_API_KEY.trim(); + Serial.println("NEWS_API_KEY: " + NEWS_API_KEY); + } + if (line.indexOf("isFlash=") >= 0) { + flashOnSeconds = line.substring(line.lastIndexOf("isFlash=") + 8).toInt(); + Serial.println("flashOnSeconds=" + String(flashOnSeconds)); + } + if (line.indexOf("is24hour=") >= 0) { + IS_24HOUR = line.substring(line.lastIndexOf("is24hour=") + 9).toInt(); + Serial.println("IS_24HOUR=" + String(IS_24HOUR)); + } + if (line.indexOf("isPM=") >= 0) { + IS_PM = line.substring(line.lastIndexOf("isPM=") + 5).toInt(); + Serial.println("IS_PM=" + String(IS_PM)); + } + if (line.indexOf("wideclockformat=") >= 0) { + Wide_Clock_Style = line.substring(line.lastIndexOf("wideclockformat=") + 16); + Wide_Clock_Style.trim(); + Serial.println("Wide_Clock_Style=" + Wide_Clock_Style); + } + if (line.indexOf("isMetric=") >= 0) { + IS_METRIC = line.substring(line.lastIndexOf("isMetric=") + 9).toInt(); + Serial.println("IS_METRIC=" + String(IS_METRIC)); + } + if (line.indexOf("refreshRate=") >= 0) { + minutesBetweenDataRefresh = line.substring(line.lastIndexOf("refreshRate=") + 12).toInt(); + if (minutesBetweenDataRefresh == 0) { + minutesBetweenDataRefresh = 15; // can't be zero + } + Serial.println("minutesBetweenDataRefresh=" + String(minutesBetweenDataRefresh)); + } + if (line.indexOf("minutesBetweenScrolling=") >= 0) { + displayRefreshCount = 1; + minutesBetweenScrolling = line.substring(line.lastIndexOf("minutesBetweenScrolling=") + 24).toInt(); + Serial.println("minutesBetweenScrolling=" + String(minutesBetweenScrolling)); + } + if (line.indexOf("marqueeMessage=") >= 0) { + marqueeMessage = line.substring(line.lastIndexOf("marqueeMessage=") + 15); + marqueeMessage.trim(); + Serial.println("marqueeMessage=" + marqueeMessage); + } + if (line.indexOf("timeDisplayTurnsOn=") >= 0) { + timeDisplayTurnsOn = line.substring(line.lastIndexOf("timeDisplayTurnsOn=") + 19); + timeDisplayTurnsOn.trim(); + Serial.println("timeDisplayTurnsOn=" + timeDisplayTurnsOn); + } + if (line.indexOf("timeDisplayTurnsOff=") >= 0) { + timeDisplayTurnsOff = line.substring(line.lastIndexOf("timeDisplayTurnsOff=") + 20); + timeDisplayTurnsOff.trim(); + Serial.println("timeDisplayTurnsOff=" + timeDisplayTurnsOff); + } + if (line.indexOf("ledIntensity=") >= 0) { + displayIntensity = line.substring(line.lastIndexOf("ledIntensity=") + 13).toInt(); + Serial.println("displayIntensity=" + String(displayIntensity)); + } + if (line.indexOf("scrollSpeed=") >= 0) { + displayScrollSpeed = line.substring(line.lastIndexOf("scrollSpeed=") + 12).toInt(); + Serial.println("displayScrollSpeed=" + String(displayScrollSpeed)); + } + if (line.indexOf("isOctoPrint=") >= 0) { + OCTOPRINT_ENABLED = line.substring(line.lastIndexOf("isOctoPrint=") + 12).toInt(); + Serial.println("OCTOPRINT_ENABLED=" + String(OCTOPRINT_ENABLED)); + } + if (line.indexOf("isOctoProgress=") >= 0) { + OCTOPRINT_PROGRESS = line.substring(line.lastIndexOf("isOctoProgress=") + 15).toInt(); + Serial.println("OCTOPRINT_PROGRESS=" + String(OCTOPRINT_PROGRESS)); + } + if (line.indexOf("octoKey=") >= 0) { + OctoPrintApiKey = line.substring(line.lastIndexOf("octoKey=") + 8); + OctoPrintApiKey.trim(); + Serial.println("OctoPrintApiKey=" + OctoPrintApiKey); + } + if (line.indexOf("octoServer=") >= 0) { + OctoPrintServer = line.substring(line.lastIndexOf("octoServer=") + 11); + OctoPrintServer.trim(); + Serial.println("OctoPrintServer=" + OctoPrintServer); + } + if (line.indexOf("octoPort=") >= 0) { + OctoPrintPort = line.substring(line.lastIndexOf("octoPort=") + 9).toInt(); + Serial.println("OctoPrintPort=" + String(OctoPrintPort)); + } + if (line.indexOf("octoUser=") >= 0) { + OctoAuthUser = line.substring(line.lastIndexOf("octoUser=") + 9); + OctoAuthUser.trim(); + Serial.println("OctoAuthUser=" + OctoAuthUser); + } + if (line.indexOf("octoPass=") >= 0) { + OctoAuthPass = line.substring(line.lastIndexOf("octoPass=") + 9); + OctoAuthPass.trim(); + Serial.println("OctoAuthPass=" + OctoAuthPass); + } + if (line.indexOf("www_username=") >= 0) { + String temp = line.substring(line.lastIndexOf("www_username=") + 13); + temp.trim(); + temp.toCharArray(www_username, sizeof(temp)); + Serial.println("www_username=" + String(www_username)); + } + if (line.indexOf("www_password=") >= 0) { + String temp = line.substring(line.lastIndexOf("www_password=") + 13); + temp.trim(); + temp.toCharArray(www_password, sizeof(temp)); + Serial.println("www_password=" + String(www_password)); + } + if (line.indexOf("IS_BASIC_AUTH=") >= 0) { + IS_BASIC_AUTH = line.substring(line.lastIndexOf("IS_BASIC_AUTH=") + 14).toInt(); + Serial.println("IS_BASIC_AUTH=" + String(IS_BASIC_AUTH)); + } + if (line.indexOf("BitcoinCurrencyCode=") >= 0) { + BitcoinCurrencyCode = line.substring(line.lastIndexOf("BitcoinCurrencyCode=") + 20); + BitcoinCurrencyCode.trim(); + Serial.println("BitcoinCurrencyCode=" + BitcoinCurrencyCode); + } + if (line.indexOf("SHOW_CITY=") >= 0) { + SHOW_CITY = line.substring(line.lastIndexOf("SHOW_CITY=") + 10).toInt(); + Serial.println("SHOW_CITY=" + String(SHOW_CITY)); + } + if (line.indexOf("SHOW_CONDITION=") >= 0) { + SHOW_CONDITION = line.substring(line.lastIndexOf("SHOW_CONDITION=") + 15).toInt(); + Serial.println("SHOW_CONDITION=" + String(SHOW_CONDITION)); + } + if (line.indexOf("SHOW_HUMIDITY=") >= 0) { + SHOW_HUMIDITY = line.substring(line.lastIndexOf("SHOW_HUMIDITY=") + 14).toInt(); + Serial.println("SHOW_HUMIDITY=" + String(SHOW_HUMIDITY)); + } + if (line.indexOf("SHOW_WIND=") >= 0) { + SHOW_WIND = line.substring(line.lastIndexOf("SHOW_WIND=") + 10).toInt(); + Serial.println("SHOW_WIND=" + String(SHOW_WIND)); + } + if (line.indexOf("SHOW_PRESSURE=") >= 0) { + SHOW_PRESSURE = line.substring(line.lastIndexOf("SHOW_PRESSURE=") + 14).toInt(); + Serial.println("SHOW_PRESSURE=" + String(SHOW_PRESSURE)); + } + + if (line.indexOf("SHOW_HIGHLOW=") >= 0) { + SHOW_HIGHLOW = line.substring(line.lastIndexOf("SHOW_HIGHLOW=") + 13).toInt(); + Serial.println("SHOW_HIGHLOW=" + String(SHOW_HIGHLOW)); + } + + if (line.indexOf("SHOW_DATE=") >= 0) { + SHOW_DATE = line.substring(line.lastIndexOf("SHOW_DATE=") + 10).toInt(); + Serial.println("SHOW_DATE=" + String(SHOW_DATE)); + } + if (line.indexOf("USE_PIHOLE=") >= 0) { + USE_PIHOLE = line.substring(line.lastIndexOf("USE_PIHOLE=") + 11).toInt(); + Serial.println("USE_PIHOLE=" + String(USE_PIHOLE)); + } + if (line.indexOf("PiHoleServer=") >= 0) { + PiHoleServer = line.substring(line.lastIndexOf("PiHoleServer=") + 13); + PiHoleServer.trim(); + Serial.println("PiHoleServer=" + PiHoleServer); + } + if (line.indexOf("PiHolePort=") >= 0) { + PiHolePort = line.substring(line.lastIndexOf("PiHolePort=") + 11).toInt(); + Serial.println("PiHolePort=" + String(PiHolePort)); + } + } + fr.close(); + matrix.setIntensity(displayIntensity); + newsClient.updateNewsClient(NEWS_API_KEY, NEWS_SOURCE); + weatherClient.updateWeatherApiKey(APIKEY); + weatherClient.setMetric(IS_METRIC); + weatherClient.updateCityIdList(CityIDs, 1); + printerClient.updateOctoPrintClient(OctoPrintApiKey, OctoPrintServer, OctoPrintPort, OctoAuthUser, OctoAuthPass); +} + +void scrollMessage(String msg) { + msg += " "; // add a space at the end + for ( int i = 0 ; i < width * msg.length() + matrix.width() - 1 - spacer; i++ ) { + if (WEBSERVER_ENABLED) { + server.handleClient(); + } + if (ENABLE_OTA) { + ArduinoOTA.handle(); + } + if (refresh == 1) i = 0; + refresh = 0; + matrix.fillScreen(LOW); + + int letter = i / width; + int x = (matrix.width() - 1) - i % width; + int y = (matrix.height() - 8) / 2; // center the text vertically + + while ( x + width - spacer >= 0 && letter >= 0 ) { + if ( letter < msg.length() ) { + matrix.drawChar(x, y, msg[letter], HIGH, LOW, 1); + } + + letter--; + x -= width; + } + + matrix.write(); // Send bitmap to display + delay(displayScrollSpeed); + } + matrix.setCursor(0, 0); +} + +void drawPiholeGraph() { + if (!USE_PIHOLE || piholeClient.getBlockedCount() == 0) { + return; + } + int count = piholeClient.getBlockedCount(); + int high = 0; + int row = matrix.width() - 1; + int yval = 0; + + int totalRows = count - matrix.width(); + + if (totalRows < 0) { + totalRows = 0; + } + + // get the high value for the sample that will be on the screen + for (int inx = count; inx >= totalRows; inx--) { + if (piholeClient.getBlockedAds()[inx] > high) { + high = (int)piholeClient.getBlockedAds()[inx]; + } + } + + int currentVal = 0; + for (int inx = (count-1); inx >= totalRows; inx--) { + currentVal = (int)piholeClient.getBlockedAds()[inx]; + yval = map(currentVal, 0, high, 7, 0); + //Serial.println("Value: " + String(currentVal)); + //Serial.println("x: " + String(row) + " y:" + String(yval) + " h:" + String(8-yval)); + matrix.drawFastVLine(row, yval, 8-yval, HIGH); + if (row == 0) { + break; + } + row--; + } + matrix.write(); + for (int wait = 0; wait < 500; wait++) { + if (WEBSERVER_ENABLED) { + server.handleClient(); + } + if (ENABLE_OTA) { + ArduinoOTA.handle(); + } + delay(20); + } +} + +void centerPrint(String msg) { + centerPrint(msg, false); +} + +void centerPrint(String msg, boolean extraStuff) { + int x = (matrix.width() - (msg.length() * width)) / 2; + + // Print the static portions of the display before the main Message + if (extraStuff) { + if (!IS_24HOUR && IS_PM && isPM()) { + matrix.drawPixel(matrix.width() - 1, 6, HIGH); + } + + if (OCTOPRINT_ENABLED && OCTOPRINT_PROGRESS && printerClient.isPrinting()) { + int numberOfLightPixels = (printerClient.getProgressCompletion().toFloat() / float(100)) * (matrix.width() - 1); + matrix.drawFastHLine(0, 7, numberOfLightPixels, HIGH); + } + + } + + matrix.setCursor(x, 0); + matrix.print(msg); + + matrix.write(); +} + +String decodeHtmlString(String msg) { + String decodedMsg = msg; + // Restore special characters that are misformed to %char by the client browser + decodedMsg.replace("+", " "); + decodedMsg.replace("%21", "!"); + decodedMsg.replace("%22", ""); + decodedMsg.replace("%23", "#"); + decodedMsg.replace("%24", "$"); + decodedMsg.replace("%25", "%"); + decodedMsg.replace("%26", "&"); + decodedMsg.replace("%27", "'"); + decodedMsg.replace("%28", "("); + decodedMsg.replace("%29", ")"); + decodedMsg.replace("%2A", "*"); + decodedMsg.replace("%2B", "+"); + decodedMsg.replace("%2C", ","); + decodedMsg.replace("%2F", "/"); + decodedMsg.replace("%3A", ":"); + decodedMsg.replace("%3B", ";"); + decodedMsg.replace("%3C", "<"); + decodedMsg.replace("%3D", "="); + decodedMsg.replace("%3E", ">"); + decodedMsg.replace("%3F", "?"); + decodedMsg.replace("%40", "@"); + decodedMsg.toUpperCase(); + decodedMsg.trim(); + return decodedMsg; +} From 5150f42f10be21513dd81f0fe26bfb4cf52bbcc1 Mon Sep 17 00:00:00 2001 From: Chrome Legion Date: Thu, 4 Jul 2019 19:35:23 -0700 Subject: [PATCH 3/3] Qrome - compiled bin files --- ...i_2.14.bin => marquee.ino.d1_mini_2.15.bin | Bin 461312 -> 462240 bytes ...4.bin => marquee.ino.d1_mini_wide_2.15.bin | Bin 462336 -> 463232 bytes 2 files changed, 0 insertions(+), 0 deletions(-) rename marquee.ino.d1_mini_2.14.bin => marquee.ino.d1_mini_2.15.bin (52%) rename marquee.ino.d1_mini_wide_2.14.bin => marquee.ino.d1_mini_wide_2.15.bin (51%) diff --git a/marquee.ino.d1_mini_2.14.bin b/marquee.ino.d1_mini_2.15.bin similarity index 52% rename from marquee.ino.d1_mini_2.14.bin rename to marquee.ino.d1_mini_2.15.bin index 199eb361adea3d9cbecfac681aaaf395392401b6..177485721083f06b9e32f1fd1311c57dca5cc0af 100644 GIT binary patch delta 90696 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 delta 90543 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 diff --git a/marquee.ino.d1_mini_wide_2.14.bin b/marquee.ino.d1_mini_wide_2.15.bin similarity index 51% rename from marquee.ino.d1_mini_wide_2.14.bin rename to marquee.ino.d1_mini_wide_2.15.bin index 7e5b33070addf177d1951a53f9e16f3fb381cf08..8d1d8e900463fb415664b53a53603253f538e92b 100644 GIT binary patch delta 91926 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 E2T7R(Gynhq delta 90635 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 QC2SR}4 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