- 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:
Stephan Mühl
2023-03-26 21:08:18 +02:00
parent cf96c850d1
commit 689cba1c85
11 changed files with 109 additions and 35 deletions

Binary file not shown.

View File

@@ -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,

View File

@@ -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
{ {

View File

@@ -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);
}; };

View File

@@ -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

View File

@@ -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;

View File

@@ -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;

View File

@@ -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());
} }

View File

@@ -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:

View File

@@ -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);
}
} }
} }

View File

@@ -1 +1 @@
0.40 0.41