GeekMagic Mini-TV mit ESPHome nutzen

Falls Du den nächsten Schritt machen willst, hier mit Temperatur und Abfahrtzeiten der S-Bahn. Letztere sensor.abfahrt_s3und sensor.abfahrt_s4 sind einfache Textsensoren. Kannst Du also einfach anpassen. Der Sensor für die Temperatur ist sensor.wetterstation_temperature den Du dann auch anpassen musst.

esphome:
  name: espminidisplay1
  friendly_name: ESP MiniDisplay 1

esp8266:
  board: d1_mini

wifi:
  ssid: !secret wifi_ssid
  password: !secret wifi_password  

#enable HA API
api:

ota:
  - platform: esphome

#enable logger
logger:



spi:
  clk_pin: GPIO14
  mosi_pin: GPIO13
  id: spihwd

output:
  - platform: esp8266_pwm
    pin: GPIO05
    id: backlight_pwm
    inverted: true

light:
  - platform: monochromatic
    output: backlight_pwm
    name: "Backlight"
    id: backlight
    restore_mode: RESTORE_AND_ON

time:
  - platform: homeassistant
    id: ha_time

font:
  - file:
      type: gfonts
      family: Roboto
      weight: 500
    id: font_time
    size: 78
    glyphs: "0123456789:"

  - file:
      type: gfonts
      family: Roboto
      weight: 400
    id: font_date
    size: 20
    glyphs: "!\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyzöäüÄÜÖß° "
    #glyphs: "0123456789.- "

  - file:
      type: gfonts
      family: Roboto
      weight: 500
    id: font_temperatur
    size: 30
    glyphs: "0123456789.,-°C "

text_sensor:
  - platform: homeassistant
    id: sensor_s3
    entity_id: sensor.abfahrt_s3
    internal: true
  - platform: homeassistant
    id: sensor_s4
    entity_id: sensor.abfahrt_s4
    internal: true
  - platform: homeassistant
    id: temperatur
    entity_id: sensor.wetterstation_temperature
    internal: true

sensor:
  - platform: homeassistant
    id: temperatur2
    entity_id: sensor.wetterstation_temperature
    internal: true

display:
  - platform: mipi_spi
    model: st7789v
    spi_id: spihwd
    dc_pin: GPIO00
    reset_pin: GPIO02
    color_depth: 8
    invert_colors: true
    spi_mode: mode3
    dimensions:
      width: 240
      height: 240
    update_interval: 5s
    lambda: |-
      // Schwarzer Hintergrund
      it.fill(Color(0, 0, 0));

      auto now = id(ha_time).now();
      if (!now.is_valid()) {
        // Noch keine Zeit → einfach leerer Screen
        return;
      }

      // Uhrzeit HH:MM
      char time_str[6];
      snprintf(time_str, sizeof(time_str),
               "%02d:%02d", now.hour, now.minute);

      // Datum DD.MM.YYYY
      char date_str[11];
      snprintf(date_str, sizeof(date_str),
               "%02d.%02d.%04d",
               now.day_of_month, now.month, now.year);

      // Uhrzeit → weiß
      it.printf(120, 50, id(font_time),
                Color(255, 255, 255),
                TextAlign::CENTER, "%s", time_str);

      // Datum → gelb
      it.printf(120, 100, id(font_date),
                Color(255, 255, 0),
                TextAlign::CENTER, "%s", date_str);

      it.printf(120, 130, id(font_temperatur), Color(0, 0, 255), TextAlign::CENTER, "%s °C", id(temperatur).state.c_str());


      // Werte vorbereiten als Strings
      char s3_str[16];
      snprintf(s3_str, sizeof(s3_str), "%.2f", id(sensor_s3).state);

      char s4_str[16];
      snprintf(s4_str, sizeof(s4_str), "%.2f", id(sensor_s4).state);

      // Rechteck-Hintergründe zeichnen
      it.filled_rectangle(0, 160, 240, 30, Color(128, 0, 128));  // Lila S3-Hintergrund
      it.filled_rectangle(0, 200, 240, 30, Color(255, 0, 0));    // Rot S4-Hintergrund

      // Text auf Rechteck zeichnen
      it.printf(10, 183, id(font_date), Color(255, 255, 255), TextAlign::BASELINE_LEFT, "%s", id(sensor_s3).state.c_str());
      it.printf(10, 223, id(font_date), Color(255, 255, 255), TextAlign::BASELINE_LEFT, "%s", id(sensor_s4).state.c_str());

PS: Dran denken dass der Anfang vom Code bei Dir ggf anders lautet und Du den dann anpassen musst. Also das hier:

esphome:
  name: espminidisplay1
  friendly_name: ESP MiniDisplay 1

Viel Spaß beim basteln.

Ich habe inzwischen schon die Pro Version mit ESP 32 und Touchbutton am laufen, welche ich im nächsten Schritt noch mit BT Proxy und weiteren Funktionen erweitern werde.

Danke für den Tipp, hab ich schon beachtet :wink:

Ich werd jetzt erstmal ein bisschen rumprobieren, welche Zeile für was zuständig ist usw.

Ziel ist, den Tibberstrompreis einmal pro Minute zu aktualisieren und die Uhrzeit darunter anzuzeigen.

*edit:

ging schneller als ich dachte, ich glaub ich lass das so :slight_smile:

Falls es wen interessiert, hier der Code den ich dafür zusammen gebastelt hab:

esphome:
  name: minitv
  friendly_name: GeekMagic Mini-TV

esp8266:
  board: d1_mini

wifi:
  ssid: !secret wifi_ssid
  password: !secret wifi_password  

#enable HA API
api:

ota:
  - platform: esphome

#enable logger
logger:



spi:
  clk_pin: GPIO14
  mosi_pin: GPIO13
  id: spihwd

output:
  - platform: esp8266_pwm
    pin: GPIO05
    id: backlight_pwm
    inverted: true

light:
  - platform: monochromatic
    output: backlight_pwm
    name: "Backlight"
    id: backlight
    restore_mode: RESTORE_AND_ON

time:
  - platform: homeassistant
    id: ha_time

font:
  - file:
      type: gfonts
      family: Roboto
      weight: 500
    id: font_time
    size: 50
    glyphs: "0123456789:"

  - file:
      type: gfonts
      family: Roboto
      weight: 500
    id: font_tibberpreis
    size: 50
    glyphs: "0123456789.,-€ "

text_sensor:
  - platform: homeassistant
    id: tibberpreis
    entity_id: sensor.tibber_strompreis
    internal: true

display:
  - platform: mipi_spi
    model: st7789v
    spi_id: spihwd
    dc_pin: GPIO00
    reset_pin: GPIO02
    color_depth: 8
    invert_colors: true
    spi_mode: mode3
    dimensions:
      width: 240
      height: 240
    update_interval: 5s
    lambda: |-
      // Schwarzer Hintergrund
      it.fill(Color(0, 0, 0));

      auto now = id(ha_time).now();
      if (!now.is_valid()) {
        // Noch keine Zeit → einfach leerer Screen
        return;
      }

      // Uhrzeit HH:MM
      char time_str[6];
      snprintf(time_str, sizeof(time_str),
               "%02d:%02d", now.hour, now.minute);

      // Uhrzeit → grau
      it.printf(120, 50, id(font_time),
                Color(120, 120, 120),
                TextAlign::CENTER, "%s", time_str);

      // Tibberpreis → blau
      it.printf(120, 130, id(font_tibberpreis),
                Color(0, 0, 255),
                TextAlign::CENTER, "%s €", id(tibberpreis).state.c_str());

gibt es eine Möglichkeit, die Helligkeit einzustellen? Ich vermute, da muss irgendwo noch ein “brightness“ mit entsprechendem Wert eingefügt werden.

Das kannst Du direkt über HA machen.

ahhhh, OK, habs gefunden, Danke :slight_smile:

Hallo @olli,
nach deinem Tutorial habe ich auch einen Geekmagic Ultra gekauft.
Nach dem Flashen leuchtet er aber nur mehr kurz blau, wird dann weder in ESPHome noch im Netzwerk erkannt. Auch ESPHome Web findet das Gerät über USB nicht. Ich vermute, dass es statt der 4 MB-Version eine 1 MB-Version des ESP8266mod ist wie @hans oben erwähnt hat und deshalb bei mir „d1_mini“ falsch ist (?)
Gibt es noch eine Möglichkeit, das Teil zu retten, oder muss ich ein neues bestellen?
Anbei YAML und ein Foto des Boards.

hier noch mein yaml code und bild des boards

esphome:
name: minitv
friendly_name: GeekMagic Mini-TV

esp8266:
board: d1_mini

wifi:
ssid: "SSID“
password: "Password“

#enable HA API
api:

ota:

platform: esphome

#enable logger
logger:


P.S.: Ich habe auch hier gepostet, bis jetzt ohne Erfolg.
Vielen Dank an alle!

Hans hatte ja zurecht darauf hingewiesen, dass die bis dahin im Code vorhandene Definition

board: esp01_1m

für den ESP unpassend sein kann.

Entsprechend habe ich das aufgrund von mehreren Einschätzungen anderer auf

board: d1_mini

geändert. Und auch damit sind die oben von mir geposteten Codes mit dem Modell funktional.

Also kann es eigentlich an einem “Fehler” beim Flashen, einem Hardware-Defekt oder einer doch anderen ESP-Variante liegen :thinking:

Aus der Ferne würde ich sagen, dass ein TTL-Adapter vermutlich benötigt wird.

Vielen Dank für deine Antwort!

Da ich board: d1_mini für meine yaml verwendet habe, denke ich, wäre für mein board sogar
esp01_1m richtig gewesen, so oder so, werde ich einen TTL adapter bestellen müssen und dann versuchen das Teil zu retten, vielen Dank für deine coolen Tutorials.

Ich hoffe, dass das ESP HomeDesigner video noch kommt, wenn support für den Geekmagic da ist.

ich muss nochmal wegen der Helligkeitseinstellung nachhaken, sorry :wink:

Also ich hab mir eine einzelne Buttonkarte angelegt, mit der ich die Helligkeit (light.geekmagic_mini_tv_backlight) ein- und ausschalten und zugleich die Helligkeit einstellen kann. Ich hab den Wert auf 25 gestellt, aber nach jedem Start “brüllt“ mich das helle Display wieder an und ich muss die Helligkeit manuell auf 25 zurückstellen :slight_smile:

Mit einer Automatisierung funktioniert das auch nicht, da reagiert das Display nichtmal ansatzweise drauf :frowning:

Gibt es da nicht eine Stelle im ESP-Code, wo ich “brightness: 25“ fix einstellen kann? Hab das schon an mehreren Stellen probiert, bekomme aber immer eine Fehlermeldung beim hochladen: “[brightness] is an invalid option“ … oder benutze ich den falschen Begriff? Gibts da was anderes als “brightness“ ?

Also ich steuere die Helligkeit dynamisch je nach Tageszeit. Morgens bspw. “fahre” ich die Helligkeit über eine Automation mit folgendem Code “hoch”:

action: light.turn_on
target:
  entity_id: light.mini_display_tv_backlight
data:
  brightness_pct: 89

und abends dann wieder runter:

action: light.turn_on
target:
  entity_id: light.mini_display_tv_backlight
data:
  brightness_pct: 19

Das funktioniert so eigentlich stabil bei mir.

Starr eine Helligkeit zu definieren in ESPHome, halte ich für nicht praktisch, da ich das zuvor genannte Beispiel mit der dynamischen Helligkeit nicht missen will.

VG Olli

OK, versteh ich, ich möchte es immer abgedunkelt, aber egal :slight_smile:

Ich hab mir jetzt ne Automation zusammen gebastelt, die endlich funktioniert und den Zweck für mich erfüllt :wink:

alias: GeekMagic Mini Tibberanzeige Helligkeit
description: ""
triggers:
  - trigger: state
    entity_id:
      - light.geekmagic_mini_tv_backlight
    to:
      - "on"
  - trigger: numeric_state
    entity_id:
      - light.geekmagic_mini_tv_backlight
    for:
      hours: 0
      minutes: 0
      seconds: 5
    attribute: brightness
    above: 26
conditions: []
actions:
  - delay:
      hours: 0
      minutes: 0
      seconds: 15
      milliseconds: 0
  - action: light.turn_on
    metadata: {}
    target:
      entity_id: light.geekmagic_mini_tv_backlight
    data:
      brightness_pct: 25
mode: single