V 1.3.2 - X-Achse dazu

This commit is contained in:
rxf
2024-07-23 16:50:51 +02:00
parent bcba2bc319
commit 7281feca71
8 changed files with 146 additions and 33 deletions

46
doc/mqtt.md Normal file
View File

@@ -0,0 +1,46 @@
# MQTT - Kommandos
Da das **ESPAsyncMQTT** (meines Erachtens) nicht mehrere verschiedene Topics subscriben kann, wird auf **nuccy** mit Hilfe von **Node-Red** aus den jeweiligen unterschiedlichen Smart-Home-Daten ein eigenes Topic erzeugt. Dieses heißt immer **CYD/** und hat verschiedene Untertopics (die über die Wildcard **#** subscribed werden können).
Das generelle Topic, auf das subscribed und das published wird ist **CYD/**.
Dahinter gibt 2 Haupt-Topics:
* **CYD/set/**
* **CYD/get/**
### set-Topic
Hier werden z Zt. folgende Subtopics verwendet
* **hm/aussen/**
Es werden die Aussen-Temperatur und die Aussen-Feuchte vom Homatic-Sensor übertragen. Die Payload ist:
**{"temperature": tttt}** bzw. **{"humidity:" hhhhh}**
wobei beide Zahlen Floats sind.
* **dht52/**
Auch hier werden die Temperatur und die Feuchte, die der Sensor DHT52 mißt und via TTN-Netz weiter leitet, übertragen. Die Payload ist:
**{"temperature": tttt,"humidity:" hhhhh}**
Auch hier sind es Float-Zahlen
* **parameter/**
Hiermit können divere Parameter des Gerätes gesetzt werden. Unterschieden werden sie in der Payload. Im Moment sind folgende Parameter möglich:
* **{"bmerate": rrr}**
Einstellen der Einleserate des BME280-Sensors (in Sekunden).
* **{"updaterate": rrr}**
Einstellen der Updaterate der Grafik (in Sekunden).
### get-Topic
Folgende daten werden aus dem Gerät heraus gesendet:
* **CYD/get/bme280**
mit der Payload:
**{"temperature": tttt, "humidity": hhhh"}**
Wieder mit Float-Zahlen. Dies sind die Werte, die mit dem lokalen BME280 gemessen werden.
## Versionen
|Version | Datum | Bemerkung |
|--------|-------|---------|
|1.0 | 2024-07-22 | erste Version |

View File

@@ -25,6 +25,7 @@ void setup_grafik(void)
} }
} }
void buildarc(ARC arc) void buildarc(ARC arc)
{ {
lv_obj_set_size(arc.arc, arc.size, arc.size); lv_obj_set_size(arc.arc, arc.size, arc.size);
@@ -87,15 +88,26 @@ void showAussenData(float val, bool what)
{ {
ta_label = lv_label_create(lv_screen_active()); ta_label = lv_label_create(lv_screen_active());
lv_label_set_text(ta_label," "); lv_label_set_text(ta_label," ");
tta_label = lv_label_create(lv_screen_active());
lv_label_set_text(tta_label," ");
fa_label = lv_label_create(lv_screen_active()); fa_label = lv_label_create(lv_screen_active());
lv_label_set_text(fa_label," "); lv_label_set_text(fa_label," ");
tfa_label = lv_label_create(lv_screen_active());
lv_label_set_text(tfa_label," ");
static lv_style_t style_ta_label; static lv_style_t style_ta_label;
lv_style_init(&style_ta_label); lv_style_init(&style_ta_label);
lv_style_set_text_font(&style_ta_label, &lv_font_montserrat_16); lv_style_set_text_font(&style_ta_label, &lv_font_montserrat_16);
lv_obj_add_style(ta_label, &style_ta_label, 0); lv_obj_add_style(ta_label, &style_ta_label, 0);
lv_obj_add_style(fa_label, &style_ta_label, 0); lv_obj_add_style(fa_label, &style_ta_label, 0);
static lv_style_t style_tta_label;
lv_style_init(&style_tta_label);
lv_style_set_text_font(&style_tta_label, &lv_font_montserrat_10);
lv_style_set_text_color(&style_tta_label, LV_COLOR_MAKE(0x60, 0x60, 0xFF));
lv_obj_add_style(tta_label, &style_tta_label, 0);
lv_obj_add_style(tfa_label, &style_tta_label, 0);
} }
void lv_create_main_gui(void) void lv_create_main_gui(void)
@@ -162,6 +174,8 @@ void lv_create_main_gui(void)
showAussenData(0, true); showAussenData(0, true);
showAussenData(0, false); showAussenData(0, false);
// show2lines();
} }
void setValuetoArc(ARC arc, float value) void setValuetoArc(ARC arc, float value)
@@ -201,6 +215,7 @@ void setValuetoArc(ARC arc, float value)
void drawChart() void drawChart()
{ {
Serial.println("draw_chart "); Serial.println("draw_chart ");
int scaleHeight = 85;
// Create a container to display the chart and scale // Create a container to display the chart and scale
lv_obj_t *container_row = lv_obj_create(lv_screen_active()); lv_obj_t *container_row = lv_obj_create(lv_screen_active());
@@ -219,7 +234,7 @@ void drawChart()
// linke Axe // linke Axe
lv_obj_t *scaleT = lv_scale_create(container_row); lv_obj_t *scaleT = lv_scale_create(container_row);
lv_obj_set_size(scaleT, 30, 75); lv_obj_set_size(scaleT, 30, scaleHeight);
lv_scale_set_mode(scaleT, LV_SCALE_MODE_VERTICAL_LEFT); lv_scale_set_mode(scaleT, LV_SCALE_MODE_VERTICAL_LEFT);
static const char *scaleT_labels[6] = {"15°C", "20°C", "25°C", "30°C", "35°C"}; static const char *scaleT_labels[6] = {"15°C", "20°C", "25°C", "30°C", "35°C"};
@@ -244,7 +259,7 @@ void drawChart()
lv_obj_add_style(scaleT, &style_scaleT, 0); lv_obj_add_style(scaleT, &style_scaleT, 0);
// Create a chart // Create a chart
// Info: die Breite eines X-Abschnittes (von vertikaler Linie zu vertikaler Linie) beträgt 55 Pixel
chart = lv_chart_create(container_row); chart = lv_chart_create(container_row);
lv_obj_set_size(chart, CHART_WIDTH, CHART_HEIGHT); lv_obj_set_size(chart, CHART_WIDTH, CHART_HEIGHT);
lv_chart_set_type(chart, LV_CHART_TYPE_LINE); /*Show lines and points too*/ lv_chart_set_type(chart, LV_CHART_TYPE_LINE); /*Show lines and points too*/
@@ -269,7 +284,7 @@ void drawChart()
// rechte Axe // rechte Axe
lv_obj_t *scale = lv_scale_create(container_row); lv_obj_t *scale = lv_scale_create(container_row);
lv_obj_set_size(scale, 30, 75); lv_obj_set_size(scale, 30, scaleHeight);
lv_scale_set_mode(scale, LV_SCALE_MODE_VERTICAL_RIGHT); lv_scale_set_mode(scale, LV_SCALE_MODE_VERTICAL_RIGHT);
static const char *scale_labels[5] = {"40%", "55%", "70%", "85%", "100%"}; static const char *scale_labels[5] = {"40%", "55%", "70%", "85%", "100%"};
@@ -293,15 +308,33 @@ void drawChart()
lv_style_set_text_color(&style_scale, lv_color_hex(0xFF0000)); lv_style_set_text_color(&style_scale, lv_color_hex(0xFF0000));
lv_obj_add_style(scale, &style_scale, 0); lv_obj_add_style(scale, &style_scale, 0);
/* // Label an der Axe // X-Achse
lv_obj_t * unitxAx_label = lv_label_create(container_row); lv_obj_t *xscale = lv_scale_create(chart);
lv_label_set_text(unitxAx_label, "°C"); lv_obj_set_size(xscale, 220, 30);
lv_obj_align(unitxAx_label, LV_ALIGN_TOP_RIGHT, -20, 8); lv_scale_set_mode(xscale, LV_SCALE_MODE_HORIZONTAL_TOP);
static lv_style_t style_unitxAx_label;
lv_style_init(&style_unitxAx_label); //static const char *xscale_labels[6] = {"200", "150", "100", "50", "0"};
lv_style_set_text_font(&style_unitxAx_label, &lv_font_montserrat_12); //lv_scale_set_text_src(xscale, xscale_labels);
lv_obj_add_style(unitxAx_label, &style_unitxAx_label, 0); lv_scale_set_label_show(xscale, true);
*/
lv_scale_set_total_tick_count(xscale, 21);
lv_scale_set_major_tick_every(xscale, 5);
lv_obj_set_style_length(xscale, 0, LV_PART_ITEMS);
lv_obj_set_style_length(xscale, 0, LV_PART_INDICATOR);
lv_obj_set_style_line_width(xscale, 0, LV_PART_ITEMS);
lv_obj_set_style_line_width(xscale, 0, LV_PART_INDICATOR);
lv_obj_set_style_line_width(xscale, 0, LV_PART_MAIN);
lv_scale_set_range(xscale, -110, 0);
lv_obj_set_pos(xscale, 5, -25);
static lv_style_t style_xscale;
lv_style_init(&style_xscale);
lv_style_set_text_font(&style_xscale, &lv_font_montserrat_10);
lv_style_set_text_color(&style_xscale, lv_color_hex(0x0000FF));
lv_obj_add_style(xscale, &style_xscale, 0);
/* ganz unten etwas Info anzeigen */ /* ganz unten etwas Info anzeigen */
// Style dafür // Style dafür
@@ -315,16 +348,16 @@ void drawChart()
char ver[20]; char ver[20];
sprintf(ver, "V %s %s", VERSION, VDATE); sprintf(ver, "V %s %s", VERSION, VDATE);
lv_label_set_text(version_label, ver); lv_label_set_text(version_label, ver);
lv_obj_align(version_label, LV_ALIGN_BOTTOM_RIGHT, -10, 0); lv_obj_align(version_label, LV_ALIGN_BOTTOM_MID, 0, 0);
lv_obj_add_style(version_label, &style_info_label, LV_PART_MAIN); lv_obj_add_style(version_label, &style_info_label, LV_PART_MAIN);
// links davon die Abtastrate // links davon die Abtastrate
bmr_label = lv_label_create(lv_screen_active()); // bmr_label = lv_label_create(lv_screen_active());
char rate[20]; // char rate[20];
sprintf(rate, "Rate: %ds", updateTime / 1000); // sprintf(rate, "Rate: %ds", updateTime / 1000);
lv_label_set_text(bmr_label, rate); // lv_label_set_text(bmr_label, rate);
lv_obj_align(bmr_label, LV_ALIGN_BOTTOM_LEFT, 10, 0); // lv_obj_align(bmr_label, LV_ALIGN_BOTTOM_LEFT, 40, 0);
lv_obj_add_style(bmr_label, &style_info_label, LV_PART_MAIN); // lv_obj_add_style(bmr_label, &style_info_label, LV_PART_MAIN);
} }
void showRate(int r) { void showRate(int r) {
@@ -348,18 +381,43 @@ void updatechartData(float value, float humvalue)
lv_chart_refresh(chart); lv_chart_refresh(chart);
} }
void setAussenDataValues(float val, bool what) void setAussenDataValues(float val, bool what, struct tm t)
{ {
if (what) if (what)
{ {
lv_label_set_text_fmt(ta_label,"Ta:\n%.1f °C", val); lv_label_set_text_fmt(ta_label,"Ta:\n%.1f °C", val);
lv_obj_align(ta_label, LV_ALIGN_TOP_LEFT, 10, 10); lv_obj_align(ta_label, LV_ALIGN_TOP_LEFT, 10, 10);
lv_label_set_text_fmt(tta_label,"%02d:%02d\n", t.tm_hour, t.tm_min);
lv_obj_align(tta_label, LV_ALIGN_TOP_LEFT, 10, 45);
} }
else else
{ {
lv_label_set_text_fmt(fa_label,"Fa:\n%.0f %%", val); lv_label_set_text_fmt(fa_label,"Fa:\n%.0f %%", val);
lv_obj_align(fa_label, LV_ALIGN_TOP_RIGHT, -10, 10); lv_obj_align(fa_label, LV_ALIGN_TOP_RIGHT, -10, 10);
lv_label_set_text_fmt(tfa_label,"%02d:%02d\n", t.tm_hour, t.tm_min);
lv_obj_align(tfa_label, LV_ALIGN_TOP_RIGHT, -23, 45);
} }
} }
void show2lines() {
int x1 = 104;
int x2 = x1 + 56;
static lv_point_precise_t line1_points[] = { {x1, 70}, {x1, 220} };
static lv_point_precise_t line2_points[] = { {x2, 70}, {x2, 220}};
static lv_style_t style_line;
lv_style_init(&style_line);
lv_style_set_line_width(&style_line, 1);
lv_style_set_line_color(&style_line, lv_palette_main(LV_PALETTE_BLUE));
lv_obj_t *line1, *line2;
line1 = lv_line_create(lv_screen_active());
lv_line_set_points(line1, line1_points, 2);
lv_obj_add_style(line1, &style_line, 0);
line2 = lv_line_create(lv_screen_active());
lv_line_set_points(line2, line2_points, 2);
lv_obj_add_style(line2, &style_line, 0);
}

View File

@@ -43,6 +43,8 @@ lv_obj_t * time_label;
lv_obj_t * ta_label; lv_obj_t * ta_label;
lv_obj_t * fa_label; lv_obj_t * fa_label;
lv_obj_t * bmr_label; lv_obj_t * bmr_label;
lv_obj_t * tta_label;
lv_obj_t * tfa_label;
#else #else
extern ARC arcTemp; extern ARC arcTemp;
extern ARC arcHum; extern ARC arcHum;
@@ -51,6 +53,8 @@ extern lv_obj_t * time_label;
extern lv_obj_t * ta_label; extern lv_obj_t * ta_label;
extern lv_obj_t * fa_label; extern lv_obj_t * fa_label;
extern lv_obj_t * bmr_label; extern lv_obj_t * bmr_label;
extern lv_obj_t * tta_label;
extern lv_obj_t * tfa_label;
#endif #endif
@@ -59,8 +63,10 @@ void lv_create_main_gui(void);
void setValuetoArc(ARC arc, float value); void setValuetoArc(ARC arc, float value);
void drawChart(); void drawChart();
void updatechartData(float value, float value_hum); void updatechartData(float value, float value_hum);
void setAussenDataValues(float val, bool what); void setAussenDataValues(float val, bool what, struct tm t);
void showRate(int r); void showRate(int r);
void show2lines();

View File

@@ -104,7 +104,7 @@ void loop() {
timeinfo = gettheTime(NTPREADTIME); timeinfo = gettheTime(NTPREADTIME);
if (timeinfo.tm_sec == 0) { // minute over if (timeinfo.tm_sec == 0) { // minute over
showDateTime(timeinfo); showDateTime(timeinfo);
} }
if (millis() - bmeReadtimer > bmeReadTime) { if (millis() - bmeReadtimer > bmeReadTime) {
bmeReadtimer = millis(); bmeReadtimer = millis();
bmedata = readBME280(); bmedata = readBME280();

View File

@@ -6,8 +6,8 @@ extern "C" {
#include "freertos/timers.h" #include "freertos/timers.h"
} }
#define VERSION "1.3.1" #define VERSION "1.3.2"
#define VDATE "2024-07-22" #define VDATE "2024-07-23"
//#define MAXREADINGS 224 //#define MAXREADINGS 224
#define MAXREADINGS 200 #define MAXREADINGS 200
@@ -17,12 +17,13 @@ TimerHandle_t mqttReconnectTimer;
TimerHandle_t wifiReconnectTimer; TimerHandle_t wifiReconnectTimer;
int bmeReadTime = 10000; int bmeReadTime = 10000;
int updateTime = 30000; int updateTime = 30000;
struct tm timeinfo;
#else #else
extern TimerHandle_t mqttReconnectTimer; extern TimerHandle_t mqttReconnectTimer;
extern TimerHandle_t wifiReconnectTimer; extern TimerHandle_t wifiReconnectTimer;
extern int bmeReadTime; extern int bmeReadTime;
extern int updateTime; extern int updateTime;
extern struct tm timeinfo;
#endif #endif
void setBMEreadtime(int time); void setBMEreadtime(int time);

View File

@@ -71,13 +71,18 @@ void parseMQTTmessages(char *topic, String msg) {
return; return;
} }
// Extract values // Extract values
bool istemp = true;
float val = 0.0;
if (strcmp(topic, "CYD/set/hm/aussen") == 0) { if (strcmp(topic, "CYD/set/hm/aussen") == 0) {
if(doc.containsKey("temperature")) { if(doc.containsKey("temperature")) {
setAussenDataValues(doc["temperature"], true); istemp = true;
val = doc["temperature"];
} }
if(doc.containsKey("humidity")) { if(doc.containsKey("humidity")) {
setAussenDataValues(doc["humidity"], false); istemp = false;
val = doc["humidity"];
} }
setAussenDataValues(val, istemp, timeinfo);
} else if (strcmp(topic, "CYD/set/parameter") == 0) { } else if (strcmp(topic, "CYD/set/parameter") == 0) {
if(doc.containsKey("bmerate")) { if(doc.containsKey("bmerate")) {
setBMEreadtime(doc["bmerate"]); setBMEreadtime(doc["bmerate"]);
@@ -85,7 +90,7 @@ void parseMQTTmessages(char *topic, String msg) {
} }
if(doc.containsKey("updaterate")) { if(doc.containsKey("updaterate")) {
setBMEreadtime(doc["updaterate"]); setBMEreadtime(doc["updaterate"]);
showRate(doc["updaterate"]); // showRate(doc["updaterate"]);
} }
} }
} }

View File

@@ -2,6 +2,7 @@
#include "weifi.h" #include "weifi.h"
#include "mqtt.h" #include "mqtt.h"
#include "main.h"
struct tm gettheTime(int repeat) { struct tm gettheTime(int repeat) {
if(!getLocalTime(&timeinfo)){ if(!getLocalTime(&timeinfo)){

View File

@@ -6,11 +6,7 @@
#include "main.h" #include "main.h"
#ifdef MAIN
struct tm timeinfo;
#else
extern struct tm timeinfo;
#endif
#ifdef WEIFI #ifdef WEIFI
const char* ssid = "Mizar"; const char* ssid = "Mizar";