v0.41
- adds new timeformats for a blinking second colon - awtrix now send stats to [PREFIX]/stats - fixes a bug where turning on an native app causes a crash.
This commit is contained in:
Binary file not shown.
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "AWTRIX Light",
|
"name": "AWTRIX Light",
|
||||||
"version": "0.40",
|
"version": "0.41",
|
||||||
"home_assistant_domain": "AwtrixLight",
|
"home_assistant_domain": "AwtrixLight",
|
||||||
"funding_url": "https://blueforcer.de",
|
"funding_url": "https://blueforcer.de",
|
||||||
"new_install_prompt_erase": true,
|
"new_install_prompt_erase": true,
|
||||||
|
|||||||
@@ -361,7 +361,14 @@ void DisplayManager_::loadNativeApps()
|
|||||||
{
|
{
|
||||||
if (show)
|
if (show)
|
||||||
{
|
{
|
||||||
Apps.insert(Apps.begin() + position, std::make_pair(name, callback));
|
if (position >= Apps.size())
|
||||||
|
{
|
||||||
|
Apps.push_back(std::make_pair(name, callback));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Apps.insert(Apps.begin() + position, std::make_pair(name, callback));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
@@ -568,7 +575,7 @@ void DisplayManager_::drawProgressBar(int cur, int total)
|
|||||||
matrix.show();
|
matrix.show();
|
||||||
}
|
}
|
||||||
|
|
||||||
void DisplayManager_::drawMenuIndicator(int cur, int total)
|
void DisplayManager_::drawMenuIndicator(int cur, int total, uint16_t color)
|
||||||
{
|
{
|
||||||
int menuItemWidth = 1;
|
int menuItemWidth = 1;
|
||||||
int totalWidth = total * menuItemWidth + (total - 1);
|
int totalWidth = total * menuItemWidth + (total - 1);
|
||||||
@@ -579,7 +586,7 @@ void DisplayManager_::drawMenuIndicator(int cur, int total)
|
|||||||
int x = leftMargin + i * (menuItemWidth + pixelSpacing);
|
int x = leftMargin + i * (menuItemWidth + pixelSpacing);
|
||||||
if (i == cur)
|
if (i == cur)
|
||||||
{
|
{
|
||||||
matrix.drawLine(x, 7, x + menuItemWidth - 1, 7, matrix.Color(255, 0, 0));
|
matrix.drawLine(x, 7, x + menuItemWidth - 1, 7, color);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -54,7 +54,7 @@ public:
|
|||||||
void drawGIF(uint16_t x, uint16_t y, fs::File gifFile);
|
void drawGIF(uint16_t x, uint16_t y, fs::File gifFile);
|
||||||
void drawJPG(uint16_t x, uint16_t y, fs::File jpgFile);
|
void drawJPG(uint16_t x, uint16_t y, fs::File jpgFile);
|
||||||
void drawProgressBar(int cur, int total);
|
void drawProgressBar(int cur, int total);
|
||||||
void drawMenuIndicator(int cur, int total);
|
void drawMenuIndicator(int cur, int total, uint16_t color);
|
||||||
void drawBMP(int16_t x, int16_t y, const uint16_t bitmap[], int16_t w, int16_t h);
|
void drawBMP(int16_t x, int16_t y, const uint16_t bitmap[], int16_t w, int16_t h);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
23
src/Frames.h
23
src/Frames.h
@@ -109,8 +109,27 @@ void TimeFrame(FastLED_NeoMatrix *matrix, MatrixDisplayUiState *state, int16_t x
|
|||||||
time_t now = time(nullptr);
|
time_t now = time(nullptr);
|
||||||
struct tm *timeInfo;
|
struct tm *timeInfo;
|
||||||
timeInfo = localtime(&now);
|
timeInfo = localtime(&now);
|
||||||
|
const char *timeformat = TIME_FORMAT.c_str();
|
||||||
char t[20];
|
char t[20];
|
||||||
strftime(t, sizeof(t), TIME_FORMAT.c_str(), localtime(&now));
|
char t2[20];
|
||||||
|
if (timeformat[2] == ' ')
|
||||||
|
{
|
||||||
|
strcpy(t2, timeformat);
|
||||||
|
if (now % 2)
|
||||||
|
{
|
||||||
|
t2[2] = ' ';
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
t2[2] = ':';
|
||||||
|
}
|
||||||
|
strftime(t, sizeof(t), t2, localtime(&now));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
strftime(t, sizeof(t), timeformat, localtime(&now));
|
||||||
|
}
|
||||||
|
|
||||||
DisplayManager.printText(0 + x, 6 + y, t, true, false);
|
DisplayManager.printText(0 + x, 6 + y, t, true, false);
|
||||||
|
|
||||||
if (!SHOW_WEEKDAY)
|
if (!SHOW_WEEKDAY)
|
||||||
@@ -184,7 +203,7 @@ void HumFrame(FastLED_NeoMatrix *matrix, MatrixDisplayUiState *state, int16_t x,
|
|||||||
return;
|
return;
|
||||||
CURRENT_APP = "Humidity";
|
CURRENT_APP = "Humidity";
|
||||||
DisplayManager.getInstance().resetTextColor();
|
DisplayManager.getInstance().resetTextColor();
|
||||||
matrix->drawRGBBitmap(x, y + 1, get_icon(2075), 8,8);
|
matrix->drawRGBBitmap(x, y + 1, get_icon(2075), 8, 8);
|
||||||
matrix->setCursor(14 + x, 6 + y);
|
matrix->setCursor(14 + x, 6 + y);
|
||||||
int humidity = CURRENT_HUM; // Temperatur ohne Nachkommastellen
|
int humidity = CURRENT_HUM; // Temperatur ohne Nachkommastellen
|
||||||
matrix->print(humidity); // Ausgabe der Temperatur
|
matrix->print(humidity); // Ausgabe der Temperatur
|
||||||
|
|||||||
@@ -91,7 +91,8 @@ float CURRENT_LUX;
|
|||||||
uint8_t BRIGHTNESS = 120;
|
uint8_t BRIGHTNESS = 120;
|
||||||
uint8_t BRIGHTNESS_PERCENT;
|
uint8_t BRIGHTNESS_PERCENT;
|
||||||
uint8_t BATTERY_PERCENT;
|
uint8_t BATTERY_PERCENT;
|
||||||
|
uint16_t BATTERY_RAW;
|
||||||
|
uint16_t LDR_RAW;
|
||||||
String TIME_FORMAT = "%H:%M:%S";
|
String TIME_FORMAT = "%H:%M:%S";
|
||||||
String DATE_FORMAT = "%d.%m.%y";
|
String DATE_FORMAT = "%d.%m.%y";
|
||||||
bool START_ON_MONDAY;
|
bool START_ON_MONDAY;
|
||||||
|
|||||||
@@ -39,8 +39,10 @@ extern bool UPPERCASE_LETTERS;
|
|||||||
extern float CURRENT_TEMP;
|
extern float CURRENT_TEMP;
|
||||||
extern float CURRENT_HUM;
|
extern float CURRENT_HUM;
|
||||||
extern float CURRENT_LUX;
|
extern float CURRENT_LUX;
|
||||||
|
extern uint16_t LDR_RAW;
|
||||||
extern String CURRENT_APP;
|
extern String CURRENT_APP;
|
||||||
extern uint8_t BATTERY_PERCENT;
|
extern uint8_t BATTERY_PERCENT;
|
||||||
|
extern uint16_t BATTERY_RAW;
|
||||||
extern uint8_t BRIGHTNESS;
|
extern uint8_t BRIGHTNESS;
|
||||||
extern uint8_t BRIGHTNESS_PERCENT;
|
extern uint8_t BRIGHTNESS_PERCENT;
|
||||||
extern String TEXTCOLOR;
|
extern String TEXTCOLOR;
|
||||||
|
|||||||
@@ -4,6 +4,7 @@
|
|||||||
#include "ServerManager.h"
|
#include "ServerManager.h"
|
||||||
#include <ArduinoHA.h>
|
#include <ArduinoHA.h>
|
||||||
#include <WiFi.h>
|
#include <WiFi.h>
|
||||||
|
#include <ArduinoJson.h>
|
||||||
|
|
||||||
WiFiClient espClient;
|
WiFiClient espClient;
|
||||||
uint8_t lastBrightness;
|
uint8_t lastBrightness;
|
||||||
@@ -306,20 +307,39 @@ void MQTTManager_::sendStats()
|
|||||||
if (HA_DISCOVERY)
|
if (HA_DISCOVERY)
|
||||||
{
|
{
|
||||||
char buffer[5];
|
char buffer[5];
|
||||||
snprintf(buffer, 5, "%d", BATTERY_PERCENT); // Formatieren von BATTERY_PERCENT als Integer
|
snprintf(buffer, 5, "%d", BATTERY_PERCENT);
|
||||||
battery.setValue(buffer); // Senden von BATTERY_PERCENT als const char*
|
battery.setValue(buffer);
|
||||||
|
|
||||||
snprintf(buffer, 5, "%.0f", CURRENT_TEMP); // Formatieren von CURRENT_TEMP als Float ohne Nachkommastellen
|
snprintf(buffer, 5, "%.0f", CURRENT_TEMP);
|
||||||
temperature.setValue(buffer); // Senden von CURRENT_TEMP als const char*
|
temperature.setValue(buffer);
|
||||||
|
|
||||||
snprintf(buffer, 5, "%.0f", CURRENT_HUM); // Formatieren von CURRENT_HUM als Float ohne Nachkommastellen
|
snprintf(buffer, 5, "%.0f", CURRENT_HUM);
|
||||||
humidity.setValue(buffer); // Senden von CURRENT_HUM als const char*
|
humidity.setValue(buffer);
|
||||||
|
|
||||||
snprintf(buffer, 5, "%.0f", CURRENT_LUX); // Formatieren von CURRENT_LUX als Double ohne Nachkommastellen
|
snprintf(buffer, 5, "%.0f", CURRENT_LUX);
|
||||||
illuminance.setValue(buffer); // Senden von CURRENT_LUX als const char*
|
illuminance.setValue(buffer);
|
||||||
|
|
||||||
BriMode.setState(AUTO_BRIGHTNESS, true);
|
BriMode.setState(AUTO_BRIGHTNESS, true);
|
||||||
Matrix.setBRIGHTNESS(BRIGHTNESS);
|
Matrix.setBRIGHTNESS(BRIGHTNESS);
|
||||||
Matrix.setState(!MATRIX_OFF, false);
|
Matrix.setState(!MATRIX_OFF, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
StaticJsonDocument<200> doc;
|
||||||
|
char buffer[5];
|
||||||
|
doc["bat"] = BATTERY_PERCENT;
|
||||||
|
doc["batraw"] = BATTERY_RAW;
|
||||||
|
snprintf(buffer, 5, "%.0f", CURRENT_LUX);
|
||||||
|
doc["lux"] = buffer;
|
||||||
|
doc["ldrraw"] = LDR_RAW;
|
||||||
|
doc["bri"] = BRIGHTNESS;
|
||||||
|
snprintf(buffer, 5, "%.0f", CURRENT_TEMP);
|
||||||
|
doc["temp"] = buffer;
|
||||||
|
snprintf(buffer, 5, "%.0f", CURRENT_HUM);
|
||||||
|
doc["hum"] = buffer;
|
||||||
|
String jsonString;
|
||||||
|
serializeJson(doc, jsonString);
|
||||||
|
char topic[50];
|
||||||
|
strcpy(topic, MQTT_PREFIX.c_str());
|
||||||
|
strcat(topic, "/stats");
|
||||||
|
mqtt.publish(topic, jsonString.c_str());
|
||||||
}
|
}
|
||||||
@@ -49,10 +49,13 @@ const char *timeFormat[] PROGMEM = {
|
|||||||
"%H:%M:%S",
|
"%H:%M:%S",
|
||||||
"%l:%M:%S",
|
"%l:%M:%S",
|
||||||
"%H:%M",
|
"%H:%M",
|
||||||
|
"%H %M",
|
||||||
"%l:%M",
|
"%l:%M",
|
||||||
"%l:%M %p"};
|
"%l %M",
|
||||||
|
"%l:%M %p",
|
||||||
|
"%l %M %p"};
|
||||||
int8_t timeFormatIndex;
|
int8_t timeFormatIndex;
|
||||||
uint8_t timeFormatCount = 5;
|
uint8_t timeFormatCount = 8;
|
||||||
|
|
||||||
const char *dateFormat[] PROGMEM = {
|
const char *dateFormat[] PROGMEM = {
|
||||||
"%d.%m.%y", // 01.04.22
|
"%d.%m.%y", // 01.04.22
|
||||||
@@ -110,16 +113,18 @@ String MenuManager_::menutext()
|
|||||||
{
|
{
|
||||||
time_t now = time(nullptr);
|
time_t now = time(nullptr);
|
||||||
char t[20];
|
char t[20];
|
||||||
|
char display[20];
|
||||||
switch (currentState)
|
switch (currentState)
|
||||||
{
|
{
|
||||||
case MainMenu:
|
case MainMenu:
|
||||||
DisplayManager.drawMenuIndicator(menuIndex, menuItemCount);
|
DisplayManager.drawMenuIndicator(menuIndex, menuItemCount, 0xF800);
|
||||||
return menuItems[menuIndex];
|
return menuItems[menuIndex];
|
||||||
case BrightnessMenu:
|
case BrightnessMenu:
|
||||||
return AUTO_BRIGHTNESS ? "AUTO" : String(BRIGHTNESS_PERCENT) + "%";
|
return AUTO_BRIGHTNESS ? "AUTO" : String(BRIGHTNESS_PERCENT) + "%";
|
||||||
case FPSMenu:
|
case FPSMenu:
|
||||||
return String(MATRIX_FPS) + " FPS";
|
return String(MATRIX_FPS) + " FPS";
|
||||||
case ColorMenu:
|
case ColorMenu:
|
||||||
|
DisplayManager.drawMenuIndicator(currentColor, sizeof(textColors) / sizeof(textColors[0]), 0xFBC0);
|
||||||
DisplayManager.setTextColor(textColors[currentColor]);
|
DisplayManager.setTextColor(textColors[currentColor]);
|
||||||
return "0x" + String(textColors[currentColor], HEX);
|
return "0x" + String(textColors[currentColor], HEX);
|
||||||
case SwitchMenu:
|
case SwitchMenu:
|
||||||
@@ -129,9 +134,29 @@ String MenuManager_::menutext()
|
|||||||
case AppTimeMenu:
|
case AppTimeMenu:
|
||||||
return String(TIME_PER_APP / 1000.0, 0) + "s";
|
return String(TIME_PER_APP / 1000.0, 0) + "s";
|
||||||
case TimeFormatMenu:
|
case TimeFormatMenu:
|
||||||
strftime(t, sizeof(t), timeFormat[timeFormatIndex], localtime(&now));
|
DisplayManager.drawMenuIndicator(timeFormatIndex, timeFormatCount, 0xFBC0);
|
||||||
return t;
|
if (timeFormat[timeFormatIndex][2] == ' ')
|
||||||
|
{
|
||||||
|
strcpy(display, timeFormat[timeFormatIndex]);
|
||||||
|
if (now % 2)
|
||||||
|
{
|
||||||
|
display[2] = ' ';
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
display[2] = ':';
|
||||||
|
}
|
||||||
|
strftime(t, sizeof(t), display, localtime(&now));
|
||||||
|
return t;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
strftime(t, sizeof(t), timeFormat[timeFormatIndex], localtime(&now));
|
||||||
|
return t;
|
||||||
|
}
|
||||||
|
|
||||||
case DateFormatMenu:
|
case DateFormatMenu:
|
||||||
|
DisplayManager.drawMenuIndicator(dateFormatIndex, dateFormatCount, 0xFBC0);
|
||||||
strftime(t, sizeof(t), dateFormat[dateFormatIndex], localtime(&now));
|
strftime(t, sizeof(t), dateFormat[dateFormatIndex], localtime(&now));
|
||||||
return t;
|
return t;
|
||||||
case WeekdayMenu:
|
case WeekdayMenu:
|
||||||
@@ -139,6 +164,7 @@ String MenuManager_::menutext()
|
|||||||
case TempMenu:
|
case TempMenu:
|
||||||
return IS_CELSIUS ? "°C" : "°F";
|
return IS_CELSIUS ? "°C" : "°F";
|
||||||
case Appmenu:
|
case Appmenu:
|
||||||
|
DisplayManager.drawMenuIndicator(appsIndex, appsCount, 0xFBC0);
|
||||||
switch (appsIndex)
|
switch (appsIndex)
|
||||||
{
|
{
|
||||||
case 0:
|
case 0:
|
||||||
|
|||||||
@@ -162,30 +162,25 @@ void PeripheryManager_::tick()
|
|||||||
button_right.read();
|
button_right.read();
|
||||||
button_select.read();
|
button_select.read();
|
||||||
|
|
||||||
|
|
||||||
unsigned long currentMillis_BatTempHum = millis();
|
unsigned long currentMillis_BatTempHum = millis();
|
||||||
if (currentMillis_BatTempHum - previousMillis_BatTempHum >= interval_BatTempHum)
|
if (currentMillis_BatTempHum - previousMillis_BatTempHum >= interval_BatTempHum)
|
||||||
{
|
{
|
||||||
previousMillis_BatTempHum = currentMillis_BatTempHum;
|
previousMillis_BatTempHum = currentMillis_BatTempHum;
|
||||||
uint16_t ADCVALUE = analogRead(BATTERY_PIN);
|
uint16_t ADCVALUE = analogRead(BATTERY_PIN);
|
||||||
BATTERY_PERCENT = min((int)map(ADCVALUE, 510, 665, 0, 100), 100);
|
BATTERY_PERCENT = min((int)map(ADCVALUE, 510, 665, 0, 100), 100);
|
||||||
CURRENT_LUX = (roundf(photocell.getSmoothedLux() * 1000) / 1000);
|
BATTERY_RAW = ADCVALUE;
|
||||||
sht31.readBoth(&CURRENT_TEMP, &CURRENT_HUM);
|
sht31.readBoth(&CURRENT_TEMP, &CURRENT_HUM);
|
||||||
CURRENT_TEMP -= 9.0;
|
CURRENT_TEMP -= 9.0;
|
||||||
checkAlarms();
|
checkAlarms();
|
||||||
MQTTManager.sendStats();
|
MQTTManager.sendStats();
|
||||||
uint32_t freeHeap = esp_get_free_heap_size();
|
|
||||||
float freeHeapKB = freeHeap / 1024.0;
|
|
||||||
Serial.print(ESP.getFreeHeap() / 1024);
|
|
||||||
Serial.println(" KB");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
unsigned long currentMillis_LDR = millis();
|
unsigned long currentMillis_LDR = millis();
|
||||||
if (currentMillis_LDR - previousMillis_LDR >= interval_LDR && AUTO_BRIGHTNESS)
|
if (currentMillis_LDR - previousMillis_LDR >= interval_LDR)
|
||||||
{
|
{
|
||||||
previousMillis_LDR = currentMillis_LDR;
|
previousMillis_LDR = currentMillis_LDR;
|
||||||
TotalLDRReadings[sampleIndex] = analogRead(LDR_PIN);
|
TotalLDRReadings[sampleIndex] = analogRead(LDR_PIN);
|
||||||
|
|
||||||
sampleIndex = (sampleIndex + 1) % LDRReadings;
|
sampleIndex = (sampleIndex + 1) % LDRReadings;
|
||||||
sampleSum = 0.0;
|
sampleSum = 0.0;
|
||||||
for (int i = 0; i < LDRReadings; i++)
|
for (int i = 0; i < LDRReadings; i++)
|
||||||
@@ -193,11 +188,15 @@ void PeripheryManager_::tick()
|
|||||||
sampleSum += TotalLDRReadings[i];
|
sampleSum += TotalLDRReadings[i];
|
||||||
}
|
}
|
||||||
sampleAverage = sampleSum / (float)LDRReadings;
|
sampleAverage = sampleSum / (float)LDRReadings;
|
||||||
|
LDR_RAW = sampleAverage;
|
||||||
brightnessPercent = sampleAverage / 4095.0 * 100.0;
|
CURRENT_LUX = (roundf(photocell.getSmoothedLux() * 1000) / 1000);
|
||||||
int brightness = map(brightnessPercent, 0, 100, 10, 120);
|
if (AUTO_BRIGHTNESS)
|
||||||
BRIGHTNESS = map(brightnessPercent, 0, 100, 0, 255);
|
{
|
||||||
DisplayManager.setBrightness(brightness);
|
brightnessPercent = sampleAverage / 4095.0 * 100.0;
|
||||||
|
BRIGHTNESS = map(brightnessPercent, 0, 100, 0, 255);
|
||||||
|
int brightness = map(brightnessPercent, 0, 100, 10, 120);
|
||||||
|
DisplayManager.setBrightness(brightness);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user