
Einleitung
Irgendwann auf meiner Smart-Home Erkundungsreise bin ich auf einen Beitrag gestoßen, der zeigte wie man die in Home-Assistant gesammelten Werte, auf einem ePaper Display darstellen kann. Da ich gerne Dinge ausprobiere und ich unsere Smart-Home Zentrale etwas präsenter machen wollte, habe ich mir ein ePaper Display gekauft. Hier möchte ich euch zeigen, was ihr braucht (Hardware) und wie ihr die Werte aus HA auf das Display bekommt.
Hardware
Vorweg muss ich noch erwähnen, dass ich esphome nutze um das Display und den dazu notwendigen Mikrocontroller zu betrieben. Daher solltet ihr, falls ihr noch keine Hardware habt, darauf achten, dass die Hardware mit esphome kompatibel ist. Ich verwende folgende Teile:
- ESP32 Mikrocontroller
- 2,9 Zoll ePaper Display von Waveshare
- Micro-USB Netzteil
Software
Auf der esphome Oberfläche habe ich dann eine neue Konfiguration angelegt. Nachdem der Wizard beendet wurde, kann man die "yaml" Datei entsprechend anpassen. Hier mal meine komplette Datei:
esphome:
name: esp32-display
platform: ESP32
board: esp32dev
wifi:
ssid: !secret ssid
password: !secret wlan_pwd
# fast_connect: true
# Optional manual IP
manual_ip:
static_ip: 192.168.0.141
gateway: 192.168.0.1
subnet: 255.255.255.0
# Enable fallback hotspot (captive portal) in case wifi connection fails
ap:
ssid: "Wemos Display Fallback Hotspot"
password: "dDES3QVg9Asp"
captive_portal:
# Enable logging
logger:
# Enable Home Assistant API
api:
ota:
spi:
clk_pin: GPIO13
mosi_pin: GPIO14
display:
- platform: waveshare_epaper
id: epaper
cs_pin: GPIO15
dc_pin: GPIO27
busy_pin: GPIO25
reset_pin: GPIO26
model: 2.90in
rotation: 90°
full_update_every: 180
lambda: |-
// Print date and time
it.strftime(295, 0, id(comic15), TextAlign::TOP_RIGHT, "%H:%M", id(esptime).now());
it.strftime(140, 0, id(comic15), TextAlign::TOP_LEFT, "%d-%b-%y", id(esptime).now());
it.strftime(30, 0, id(comic15), TextAlign::TOP_LEFT, "%A", id(esptime).now());
// Print line underneath date and time
it.line(0, 20, 296, 20);
// Print weather info
it.printf(20, 22, id(comic15), "Wetterinfo:");
it.printf(5, 38, id(comic15), "Heute:");
// Print weather symbol
if (id(current_condition).has_state()) {
std::map<std::string, std::string> weather_icon_map
{
{"clear-night", "\U000F0594"},
{"cloudy", "\U000F0590"},
{"exceptional", "\U000F069B"},
{"fog", "\U000F0591"},
{"hail", "\U000F0592"},
{"lightning", "\U000F0593"},
{"lightning-rainy", "\U000F067E"},
{"partlycloudy", "\U000F0595"},
{"pouring", "\U000F0596"},
{"rainy", "\U000F0597"},
{"snwoy", "\U000F0598"},
{"snowy-rainy", "\U000F067F"},
{"sunny", "\U000F0599"},
{"windy", "\U000F059D"},
{"windy-variant", "\U000F059E"},
};
it.printf(20, 60, id(icon_font30), TextAlign::TOP_LEFT , weather_icon_map[id(current_condition).state.c_str()].c_str());
}
// Print weather forecast
it.printf(65, 38, id(comic15), "Morgen:");
if (id(forecast_condition).has_state()) {
std::map<std::string, std::string> weather_icon_map2
{
{"clear-night", "\U000F0594"},
{"cloudy", "\U000F0590"},
{"exceptional", "\U000F069B"},
{"fog", "\U000F0591"},
{"hail", "\U000F0592"},
{"lightning", "\U000F0593"},
{"lightning-rainy", "\U000F067E"},
{"partlycloudy", "\U000F0595"},
{"pouring", "\U000F0596"},
{"rainy", "\U000F0597"},
{"snwoy", "\U000F0598"},
{"snowy-rainy", "\U000F067F"},
{"sunny", "\U000F0599"},
{"windy", "\U000F059D"},
{"windy-variant", "\U000F059E"},
};
it.printf(80, 60, id(icon_font30), TextAlign::TOP_LEFT, weather_icon_map2[id(forecast_condition).state.c_str()].c_str());
}
// Print moon phase
it.printf(135, 22, id(comic15), TextAlign::TOP_LEFT, "Mond-");
it.printf(135, 39, id(comic15), TextAlign::TOP_LEFT, "phase:");
if (id(moon).has_state()) {
std::map<std::string, std::string> moon_icon_map
{
{"new_moon", "\U000F0F64"},
{"full_moon", "\U000F0F62"},
{"waxing_crescent", "\U000F0F67"},
{"first_quarter", "\U000F0F61"},
{"waxing_gibbous", "\U000F0F68"},
{"waning_gibbous", "\U000F0F66"},
{"lightning-rainy", "\U000F067E"},
{"last_quarter", "\U000F0F63"},
{"waning_crescent", "\U000F0F65"},
};
it.printf(155, 80, id(icon_font30), TextAlign::CENTER, moon_icon_map[id(moon).state.c_str()].c_str());
}
// Print line behind moon phase
it.line(185, 20, 185, 128);
// Print sunrise and sun sunset times
it.printf(195, 25, id(icon_font25), TextAlign::TOP_LEFT, "\U000F059C");
if (id(next_sunrise).has_state()) {
it.printf(225, 22, id(comic15), TextAlign::TOP_LEFT, "%s", id(next_sunrise).state.c_str());
}
it.printf(195, 53, id(icon_font25), TextAlign::TOP_LEFT, "\U000F059B");
if (id(next_sunset).has_state()) {
it.printf(225, 55, id(comic15), TextAlign::TOP_LEFT, "%s", id(next_sunset).state.c_str());
}
// Print outside temperature (from homeassistant sensor)
if (id(outside_temperature).has_state()) {
it.printf(40, 100, id(comic15), TextAlign::CENTER, "%.1f°", id(outside_temperature).state);
}
it.printf(10, 100, id(icon_font15), TextAlign::CENTER, "\U000F0599");
// Print inside temperature (from homeassistant sensor)
if (id(inside_temperature).has_state()) {
it.printf(40, 120, id(comic15), TextAlign::CENTER, "%.1f°", id(inside_temperature).state);
}
it.printf(10, 120, id(icon_font15), TextAlign::CENTER, "\U000F04B9");
// Print forecast temperature (from homeassistant sensor)
if (id(forecast_temp).has_state()) {
it.printf(102, 100, id(comic15), TextAlign::CENTER, "%.1f°", id(forecast_temp).state);
}
it.printf(75, 100, id(icon_font15), TextAlign::CENTER, "\U000F0737");
// Print forecast_low temperature (from homeassistant sensor)
if (id(forecast_temp_low).has_state()) {
it.printf(102, 120, id(comic15), TextAlign::CENTER, "%.1f°", id(forecast_temp_low).state);
}
it.printf(75, 120, id(icon_font15), TextAlign::CENTER, "\U000F072E");
// Print line behind weather info
it.line(130, 20, 130, 128);
// Print inside temperature (from homeassistant sensor)
// if (id(inside_temperature).has_state()) {
// it.printf(127, 80, id(font3), TextAlign::TOP_RIGHT , "%.1f°", id(inside_temperature).state);
// }
font:
- file: 'fonts/comicbd.ttf'
id: comic15
size: 15
glyphs:
['&', '@', '!', ',', '.', '"', '%', '(', ')', '+', '-', '_', ':', '°', '0',
'1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E',
'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S',
'T', 'U', 'V', 'W', 'X', 'Y', 'Z', ' ', 'a', 'b', 'c', 'd', 'e', 'f',
'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't',
'u', 'v', 'w', 'x', 'y', 'z','ü', 'ä', 'ö', '/','º','µ','³']
- file: 'fonts/comic.ttf'
id: comic20
size: 20
glyphs:
['&', '@', '!', ',', '.', '"', '%', '(', ')', '+', '-', '_', ':', '°', '0',
'1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E',
'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S',
'T', 'U', 'V', 'W', 'X', 'Y', 'Z', ' ', 'a', 'b', 'c', 'd', 'e', 'f',
'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't',
'u', 'v', 'w', 'x', 'y', 'z','ü', 'ä', 'ö', '/','º','µ','³']
- file: 'fonts/materialdesignicons-webfont.ttf'
id: icon_font30
size: 30
glyphs:
- "\U000F0590" # weather-cloudy
- "\U000F0F2F" # weather-cloudy-alert
- "\U000F0E6E" # weather-cloudy-arrow-right
- "\U000F0591" # weather-fog
- "\U000F0592" # weather-hail
- "\U000F0F30" # weather-hazy
- "\U000F0898" # weather-hurricane
- "\U000F0593" # weather-lightning
- "\U000F067E" # weather-lightning-rainy
- "\U000F0594" # weather-night
- "\U000F0F31" # weather-night-partly-cloudy
- "\U000F0595" # weather-partly-cloudy
- "\U000F0F32" # weather-partly-lightning
- "\U000F0F33" # weather-partly-rainy
- "\U000F0F34" # weather-partly-snowy
- "\U000F0F35" # weather-partly-snowy-rainy
- "\U000F0596" # weather-pouring
- "\U000F0597" # weather-rainy
- "\U000F0598" # weather-snowy
- "\U000F0F36" # weather-snowy-heavy
- "\U000F067F" # weather-snowy-rainy
- "\U000F0599" # weather-sunny
- "\U000F0F37" # weather-sunny-alert
- "\U000F14E4" # weather-sunny-off
- "\U000F059A" # weather-sunset
- "\U000F059B" # weather-sunset-down
- "\U000F059C" # weather-sunset-up
- "\U000F0F38" # weather-tornado
- "\U000F059D" # weather-windy
- "\U000F059E" # weather-windy-variant
- "\U000F069B" # emoticon-dead-outline for weather exeptional
- "\U000F0F61" # moon-first-quarter
- "\U000F0F62" # moon-full
- "\U000F0F63" # moon-last-quarter
- "\U000F0F64" # moon-new
- "\U000F0F65" # moon-waning-crescent
- "\U000F0F66" # moon-waning-gibbous
- "\U000F0F67" # moon-waxing-cresent
- "\U000F0F68" # moon-waxing-gibbous
- file: 'fonts/materialdesignicons-webfont.ttf'
id: icon_font20
size: 20
glyphs:
- "\U000F0F61" # moon-first-quarter
- "\U000F0F62" # moon-full
- "\U000F0F63" # moon-last-quarter
- "\U000F0F64" # moon-new
- "\U000F0F65" # moon-waning-crescent
- "\U000F0F66" # moon-waning-gibbous
- "\U000F0F67" # moon-waxing-cresent
- "\U000F0F68" # moon-waxing-gibbous
- "\U000F059B" # weather-sunset-down
- "\U000F059C" # weather-sunset-up
- file: 'fonts/materialdesignicons-webfont.ttf'
id: icon_font25
size: 25
glyphs:
- "\U000F059B" # weather-sunset-down
- "\U000F059C" # weather-sunset-up
- file: 'fonts/materialdesignicons-webfont.ttf'
id: icon_font15
size: 15
glyphs:
- "\U000F0737" # arrow-up-bold
- "\U000F072E" # arrow-down-bold
- "\U000F02DC" # home
- "\U000F04B9" # sofa
- "\U000F0599" # sun
time:
- platform: homeassistant
id: esptime
timezone: Europe/Berlin
sensor:
- platform: wifi_signal
name: "Wemos Display WiFi Signal"
update_interval: 900s
- platform: uptime
name: "Wemos Display Uptime"
- platform: homeassistant
id: outside_temperature
entity_id: sensor.aussentemperatur
internal: true
- platform: homeassistant
id: inside_temperature
entity_id: sensor.multisensor_wohnzimmer_2
internal: true
- platform: homeassistant
id: forecast_temp
entity_id: sensor.openweathermap_forecast_temperature
internal: true
- platform: homeassistant
id: forecast_temp_low
entity_id: sensor.openweathermap_forecast_temperature_low
internal: true
text_sensor:
- platform: homeassistant
id: next_sunset
entity_id: sensor.esphome_next_sunset
internal: true
- platform: homeassistant
id: next_sunrise
entity_id: sensor.esphome_next_sunrise
internal: true
- platform: homeassistant
id: moon
entity_id: sensor.moon
internal: true
- platform: homeassistant
id: forecast_condition
entity_id: sensor.openweathermap_forecast_condition
internal: true
- platform: homeassistant
id: current_condition
entity_id: sensor.openweathermap_condition
internal: true
- platform: wifi_info
ip_address:
name: "Wemos Dislpay IP"
- platform: version
name: Wemos Display ESPHome Version
hide_timestamp: True
switch:
- platform: restart
name: "Wemos Display Restart"
- platform: shutdown
name: "Wemos Display Shutdown"
Code Erläuterungen
Boah, ganz schön viel Code, schön dass du dennoch bis hierhin gescrolled hast. Dann jetzt mal der Reihe nach: Als erstes wird euch wahrscheinlich auffallen, dass ich !secrets
benutze. Das mache ich, damit ich nicht jedes mal das Passwort und die SSID für das Wlan eintragen muss. Solltet ihr die Secrets noch nicht nutzen, könnt ihr diese über "Secrets" oben rechts in der Oberfläche erstellen
Ich vergebe allen Geräten eine feste IP. Das macht das Hinzufügen zu Home-Assistant leichter und blockiert keine Adresen im DHCP Bereich. Ihr müsst die Adresse natürlich entsprechend anpassen, oder komplett löschen, wenn ihr DHCP nutzen wollt.
Nun folgt auch schon die Einrichtung des Displays, dieser verwendet den SPI Bus und somit muss dieser Konfiguriert werden. Die Pins müsst ihr natürlich entsprechend des verwendeten Mikrocontrollers anpassen. Je nachdem welches Display ihr verwendet, müsst ihr das Modell und evtl. auch die Ausrichtung anpassen.
Damit ihr etwas auf dem Display darstellen könnt, braucht ihr eine, oder auch mehrere Schriftarten. Die Schriften habe ich im Verzeichnis fonts
im /config
Ordner von esphome abgespeichert. Ich verwende zwei Schriftarten in verschiedenen Größen für den Text und für die Symbole verwende ich die materialdesignicons-webfont.ttf
, ebenfalls in verschiedenen Größen. Unter glyphs:
werden die zu darstellenden Zeichen / Symbole angegeben. Um die Codes für die Icons zu finden, könnt ihr hier nachsehen. Damit esphome etwas mit dem Code für ein Icon anfangen kann, müsst ihr vor den Code noch ein \U000
schreiben.
Unter lambda: |-
folgen dann die Anweisungen, damit etwas auf dem Bildschirm "geschrieben" wird. Um Werte von Home-Assistant auf dem Display darstellen zu können, müsst ihr die gewünschten Werte dem Mikrocontroller bekannt machen. Ich stelle hauptsächlich Wetterinformationen auf dem Display dar und habe die entsprechenden Sensoren unter sensor:
und text_sensor:
von HA übernommen. Um zu verhindern, dass der Mikrocontroller die Werte wieder zurück an HA sendet, solltet ihr den Wert internal
auf true
setzen.
Damit ich die Uhrzeit des Sonnenauf- und -untergangs auf dem Display darstellen konnte, habe ich in Home-Assistent Template-Sensoren angelegt:
# Sensor.yaml
- platform: template
sensors:
esphome_next_sunrise:
friendly_name: "Esphome Next Sunrise"
value_template: "{{ as_timestamp(states.sun.sun.attributes.next_dawn) | timestamp_custom ('%H:%M') }}"
esphome_next_sunset:
friendly_name: "Esphome Next Sunset"
value_template: "{{ as_timestamp(states.sun.sun.attributes.next_setting) | timestamp_custom ('%H:%M') }}"
Ihr findet den Code und die Schriftarten auch auf meinem GitHub Repo und könnt die Dateien von dort gerne herunterladen. Kopiert die Dateien dann in den /config
Ordner von esphome. Den Wizard zum anlegen einer neuen Datei braucht ihr dann nicht mehr. Sollte die neue Datei nicht sofort im Dashboard angezeigt werden, drückt einmal F5
. Habt ihr Fragen, oder Probleme beim Umsetzen des Projekts? Lasst gerne einen Kommentar da, oder schreibt mir eine Email.
Update vom 10.11.2021:
Ich habe dem Display eine zweite Seite hinzugefügt und stelle dort Wetterwarnungen des Deutschen Wetterdienst dar. Dazu müsst ihr zuerst die Daten des DWD in Home-Assistant einbinden. Da die kompletten Warnmeldungen zu lang für das Display sind, stelle ich lediglich die "Headline" und die Warnstufe auf dem Display dar. Dazu erstellen wir uns wieder zwei Template Sensoren:
# sensor.yaml
act_weather_warning_level:
friendly_name: "Aktuelle Warnstufe"
value_template: >-
{% if is_state('sensor.wetterwarnung_marburg_current_warning_level', '0') %}
0
{% else %}
{{ state_attr('sensor.wetterwarnung_marburg_current_warning_level', 'warning_1_level') }}
{% endif %}
icon_template: mdi:cloud-alert
act_weather_warning_headline:
friendly_name: "Aktuelle Kurzmeldung"
value_template: >-
{% if is_state('sensor.wetterwarnung_marburg_current_warning_level', '0') %}
Es liegen keine Meldungen vor
{% else %}
{{ state_attr('sensor.wetterwarnung_marburg_current_warning_level', 'warning_1_headline') }}
{% endif %}
icon_template: mdi:comment-alert
Dann holt ihr euch diese Sensoren wieder in esphome rein:
text_sensor:
- platform: homeassistant
id: akt_warning_headline
entity_id: sensor.act_weather_warning_headline
internal: true
- platform: homeassistant
id: akt_warning_level
entity_id: sensor.act_weather_warning_level
internal: true
Und zu guter Letzt müsst ihr natürlich die Ausgabe für das Display anpassen:
display:
...
# Definition der Seiten
pages:
- id: page1
lambda: |-
it.strftime(295, 0, id(comic15), TextAlign::TOP_RIGHT, "%H:%M", id(esptime).now());
it.strftime(140, 0, id(comic15), TextAlign::TOP_LEFT, "%d-%b-%y", id(esptime).now());
it.strftime(30, 0, id(comic15), TextAlign::TOP_LEFT, "%A", id(esptime).now());
// Print line underneath date and time
it.line(0, 20, 296, 20);
// Print Wetter Info
it.printf(20, 22, id(comic15), "Wetterinfo:");
it.printf(5, 38, id(comic15), "Heute:");
// Print Wetter Symbol
if (id(current_condition).has_state()) {
std::map<std::string, std::string> weather_icon_map
{
{"clear-night", "\U000F0594"},
{"cloudy", "\U000F0590"},
{"exceptional", "\U000F069B"},
{"fog", "\U000F0591"},
{"hail", "\U000F0592"},
{"lightning", "\U000F0593"},
{"lightning-rainy", "\U000F067E"},
{"partlycloudy", "\U000F0595"},
{"pouring", "\U000F0596"},
{"rainy", "\U000F0597"},
{"snwoy", "\U000F0598"},
{"snowy-rainy", "\U000F067F"},
{"sunny", "\U000F0599"},
{"windy", "\U000F059D"},
{"windy-variant", "\U000F059E"},
};
it.printf(20, 60, id(icon_font30), TextAlign::TOP_LEFT , weather_icon_map[id(current_condition).state.c_str()].c_str());
}
// Print Wetter Forecast
it.printf(65, 38, id(comic15), "Morgen:");
if (id(forecast_condition).has_state()) {
std::map<std::string, std::string> weather_icon_map2
{
{"clear-night", "\U000F0594"},
{"cloudy", "\U000F0590"},
{"exceptional", "\U000F069B"},
{"fog", "\U000F0591"},
{"hail", "\U000F0592"},
{"lightning", "\U000F0593"},
{"lightning-rainy", "\U000F067E"},
{"partlycloudy", "\U000F0595"},
{"pouring", "\U000F0596"},
{"rainy", "\U000F0597"},
{"snwoy", "\U000F0598"},
{"snowy-rainy", "\U000F067F"},
{"sunny", "\U000F0599"},
{"windy", "\U000F059D"},
{"windy-variant", "\U000F059E"},
};
it.printf(80, 60, id(icon_font30), TextAlign::TOP_LEFT, weather_icon_map2[id(forecast_condition).state.c_str()].c_str());
}
// Mondphase anzeigen
it.printf(135, 22, id(comic15), TextAlign::TOP_LEFT, "Mond-");
it.printf(135, 39, id(comic15), TextAlign::TOP_LEFT, "phase:");
if (id(moon).has_state()) {
std::map<std::string, std::string> moon_icon_map
{
{"new_moon", "\U000F0F64"},
{"full_moon", "\U000F0F62"},
{"waxing_crescent", "\U000F0F67"},
{"first_quarter", "\U000F0F61"},
{"waxing_gibbous", "\U000F0F68"},
{"waning_gibbous", "\U000F0F66"},
{"lightning-rainy", "\U000F067E"},
{"last_quarter", "\U000F0F63"},
{"waning_crescent", "\U000F0F65"},
};
it.printf(155, 80, id(icon_font30), TextAlign::CENTER, moon_icon_map[id(moon).state.c_str()].c_str());
}
// Print line behind moon phase
it.line(185, 20, 185, 128);
// Print sunrise and sun setting dates
it.printf(195, 25, id(icon_font25), TextAlign::TOP_LEFT, "\U000F059C");
if (id(next_sunrise).has_state()) {
it.printf(225, 22, id(comic15), TextAlign::TOP_LEFT, "%s", id(next_sunrise).state.c_str());
}
it.printf(195, 53, id(icon_font25), TextAlign::TOP_LEFT, "\U000F059B");
if (id(next_sunset).has_state()) {
it.printf(225, 55, id(comic15), TextAlign::TOP_LEFT, "%s", id(next_sunset).state.c_str());
}
// Print outside temperature (from homeassistant sensor)
if (id(outside_temperature).has_state()) {
it.printf(40, 100, id(comic15), TextAlign::CENTER, "%.1f°", id(outside_temperature).state);
}
it.printf(10, 100, id(icon_font15), TextAlign::CENTER, "\U000F0599");
// Print inside temperature (from homeassistant sensor)
if (id(inside_temperature).has_state()) {
it.printf(40, 120, id(comic15), TextAlign::CENTER, "%.1f°", id(inside_temperature).state);
}
it.printf(10, 120, id(icon_font15), TextAlign::CENTER, "\U000F04B9");
// Print forecast temperature (from homeassistant sensor)
if (id(forecast_temp).has_state()) {
it.printf(102, 100, id(comic15), TextAlign::CENTER, "%.1f°", id(forecast_temp).state);
}
it.printf(75, 100, id(icon_font15), TextAlign::CENTER, "\U000F0737");
// Print forecast_low temperature (from homeassistant sensor)
if (id(forecast_temp_low).has_state()) {
it.printf(102, 120, id(comic15), TextAlign::CENTER, "%.1f°", id(forecast_temp_low).state);
}
it.printf(75, 120, id(icon_font15), TextAlign::CENTER, "\U000F072E");
// Print line behind weather info
it.line(130, 20, 130, 128);
// Print inside temperature (from homeassistant sensor)
// if (id(inside_temperature).has_state()) {
// it.printf(127, 80, id(font3), TextAlign::TOP_RIGHT , "%.1f°", id(inside_temperature).state);
// }
- id: page2
lambda: |-
it.strftime(295, 0, id(comic15), TextAlign::TOP_RIGHT, "%H:%M", id(esptime).now());
it.strftime(140, 0, id(comic15), TextAlign::TOP_LEFT, "%d-%b-%y", id(esptime).now());
it.strftime(30, 0, id(comic15), TextAlign::TOP_LEFT, "%A", id(esptime).now());
// Print line underneath date and time
it.line(0, 20, 296, 20);
// Print Weather Warnings
it.printf(20, 22, id(comic15), "Wetterwarnungen:");
if (id(akt_warning_level).has_state()) {
it.printf(20,45, id(comic15), TextAlign::TOP_LEFT, "Die akt. Warnstufe ist: %s", id(akt_warning_level).state.c_str());
}
if (id(akt_warning_headline).has_state()) {
it.printf(20, 70, id(comic15), TextAlign::TOP_LEFT, "%s", id(akt_warning_headline).state.c_str());
}
//if (id(akt_warning_text).has_state()) {
// it.printf(20, 70, id(comic15), TextAlign::TOP_LEFT, "%s", id(akt_warning_text).state.c_str());
//}
# Automatischer Wechsel zwischen den Seiten
interval:
- interval: 5s
then:
- display.page.show_next: epaper
- component.update: epaper
Den kompletten angepassten Code findet ihr natürlich auch wieder auf meinem Github Repo.