Custom Button Card wird nur auf Desktop PC richtig angezeigt, auf mobilen Geräten nicht

Hallo zusammen

Ich baue gerade mein Dashboard um und habe mir (mit Hilfe von ChatGPT) eine Custom Button Card bauen wollen, worauf Sonnenauf/untergang und Mondauf/untergang zu sehen sind.

Der nachfolgende Code funktioniert im Browser am PC, an dem ich das programmiert habe. Aber auf keinem meiner mobilen Geräte (alles Android).

Und zwar nicht nur in der Companion App, sondern auch nicht im Browser.

Dabei bin ich mir aber sicher, dass zwischenzeitlich die Icons angezeigt wurden. Danach habe ich dann die Textdarstellung der Sensoren gemacht und nun hab ich nur noch eine weiße Box. Interessant übrigens - keine Fehlermeldung oder anteilige Darstellung der Texte oder so → einfach eine leere Box.

type: custom:button-card
show_icon: false
styles:
  card:
    - padding: 0
    - border-radius: 16px
    - overflow: hidden
    - height: 100%
custom_fields:
  grid: |
    [[[ 
      const sunrise = hass.states['sensor.sonnenaufgang']?.state || '–';
      const sunset = hass.states['sensor.sonnenuntergang']?.state || '–';
      const moonrise = hass.states['sensor.mondaufgang']?.state || '–';
      const moonset = hass.states['sensor.monduntergang']?.state || '–';

      return `
        <div style="
          display: grid;
          grid-template-columns: repeat(4, 1fr);
          grid-template-rows: repeat(2, 1fr);
          gap: 20px;
          width: 100%;
          height: 100%;
        ">
          <div><img src='/local/sunrise.png' style="width:100%; height:100%; object-fit:cover;"></div>
          <div style="display:flex; align-items:center; justify-content:center; color:white;">${sunrise} Uhr</div>
          <div><img src='/local/sunset.png' style="width:100%; height:100%; object-fit:cover;"></div>
          <div style="display:flex; align-items:center; justify-content:center; color:white;">${sunset} Uhr</div>

          <!-- Zweite Zeile -->
          <div><img src='/local/moonrise.png' style="width:100%; height:100%; object-fit:cover;"></div>
          <div style="display:flex; align-items:center; justify-content:center; color:white;">${moonrise} Uhr</div>
          <div><img src='/local/moonset.png' style="width:100%; height:100%; object-fit:cover;"></div>
          <div style="display:flex; align-items:center; justify-content:center; color:white;">${moonset} Uhr</div>
        </div>
      `;
    ]]]
view_layout:
  grid-area: sm

Kann sich jemand darauf einen Reim machen?

Das ist immer so eine Sache mit KI. Hast Du auch in die Doku geschaut und versucht, Dinge nachzubauen? GitHub - custom-cards/button-card: ❇️ Lovelace button-card for home assistant Mit diesem Wissen kann man der KI auch bessere Fragen stellen.

Ich vermute, Dein custom_field Konstrukt, das HTML Code zurückgeben soll, überfordert die Möglichkeiten der custom-button-card. Das es im Desktop Browser funktioniert, liegt wahrscheinlich an der großzügigen Interpretation der Browser Engine, nicht am Funktionieren der Karte.

Ja, habe anfänglich versucht bestehende Cards umzubauen.

Bin dann aber nicht weiter gekommen, als es darum ging custom Icons zu nutzen.

Außerdem hatte der Code das Grid nicht richtig dargestellt. Ein Problem dass die KI dann übrigens auch hatte und deswegen mit der o.a. Lösung um die Ecke kam.

Alternativ bin ich auch dankbar für Lösungsansätze vier Sensoren mit jeweils dem dazugehörigen Icon darzustellen.

Ich denke, Deine Anforderung könnte man auch mit der custom-button-card umsetzen aber ich verspüre keinen Reiz, dies nachzubauen. Vielleicht findet sich einer.

Ich könnte Dir aber alternativ den Code einer Markdown Karte anbieten wo ich die Bilder entsprechend der Stati ändere. Das könnte man auch für die zweite Tabellenzeile machen, die bei mir statisch ist.

Zusammenfassung
{# Define image filenames in a dictionary for better organization#}
{% set images = {
    'door_locked': 'haustuerZUZU.jpg',
    'door_unlocked': 'haustuerZUAUF.jpg',
    'door_open': 'haustuerAUF.jpg',
    'window_closed': 'fensterZU1.jpg',
    'window_open': 'fensterAUF1.jpg'
} -%}

{% set door_state = states('sensor.nuki_haustur_door_security_state') | lower -%}

{# Determine the image for the door status based on its state #}
{% set tuerstatus = 
    images['door_locked'] if door_state == 'closed & locked' else
    images['door_unlocked'] if door_state == 'closed & unlocked' else
    images['door_open'] if door_state == 'open' else
    None
-%}
{# Determine the image for the windows based on their state #}
{% set Oben = images['window_closed'] if (states('binary_sensor.fenster_oben') | lower) == 'off' else images['window_open'] -%}
{% set Mitte = images['window_closed'] if (states('binary_sensor.fenster_mitte') | lower) == 'off' else images['window_open'] -%}
{% set Unten = images['window_closed'] if (states('binary_sensor.fenster_unten') | lower) == 'off' else images['window_open'] -%}

<center>
<!--
 <center><font size=4>Ist irgendwo ein Fenster auf ?</font></center><br>
 -->
<table border = 0>
<tr>
  <td width=60><img src="http://192.168.1.100:8123/local/{{tuerstatus}}" /></td>
  <td width=40></td>
  <td width=60><img src="http://192.168.1.100:8123/local/{{Unten}}" /></td>
  <td width=5></td>
  <td width=60><img src="http://192.168.1.100:8123/local/{{Mitte}}" /></td>
  <td width=5></td>
  <td width=60><img src="http://192.168.1.100:8123/local/{{Oben}}" /></td>
<tr>
  <td><center><font size=3>Haustür</font><center></td>
  <td width=5></td>
  <td><center><font size=3>Unten</font><center></td>
  <td width=5></td>
  <td><center><font size=3>Mitte</font><center></td>
  <td width=5></td>
  <td><center><font size=3>Oben</font><center></td>
</tr>
</table>
</center>

EDIT: Verdammte Neugierde :slight_smile:

Ich habe obigen Markdown Code in ChatGPT geworfen und gesagt “diesen Code will ich in einer custom-button-card”. Danach kamen 2 Iterationen KI Müll und dann sagte ich: "


Dann ging alles.

Desktop

Handy

Interessanterweise, verfolgt er auch Deinen Ansatz mit dem custom-field und es funktioniert, aha nicht schlecht. Ich habe aber nicht verglichen was bei Dir anders ist. Das kriegst Du schon hin.

Hier der Code für die Custom-Button-Card

Zusammenfassung
type: custom:button-card
name: Fenster & Türstatus
show_icon: false
show_name: false
show_state: false
custom_fields:
  table: |
    [[[
      const images = {
        door_locked: 'haustuerZUZU.jpg',
        door_unlocked: 'haustuerZUAUF.jpg',
        door_open: 'haustuerAUF.jpg',
        window_closed: 'fensterZU1.jpg',
        window_open: 'fensterAUF1.jpg'
      };

      const door  = states['sensor.nuki_haustur_door_security_state']?.state?.toLowerCase();
      const oben  = states['binary_sensor.fenster_oben']?.state?.toLowerCase();
      const mitte = states['binary_sensor.fenster_mitte']?.state?.toLowerCase();
      const unten = states['binary_sensor.fenster_unten']?.state?.toLowerCase();

      let tuerstatus =
        door === 'closed & locked'   ? images.door_locked   :
        door === 'closed & unlocked' ? images.door_unlocked :
        door === 'open'              ? images.door_open     :
                                       'unknown.jpg';

      const obenImg  = oben  === 'off' ? images.window_closed : images.window_open;
      const mitteImg = mitte === 'off' ? images.window_closed : images.window_open;
      const untenImg = unten === 'off' ? images.window_closed : images.window_open;

      return `
        <table border="0" style="margin:0 auto;">
          <tr>
            <td width="60"><img src="/local/${tuerstatus}" width="60"/></td>
            <td width="40"></td>
            <td width="60"><img src="/local/${untenImg}" width="60"/></td>
            <td width="5"></td>
            <td width="60"><img src="/local/${mitteImg}" width="60"/></td>
            <td width="5"></td>
            <td width="60"><img src="/local/${obenImg}" width="60"/></td>
          </tr>
          <tr>
            <td><center><font size="3">Haustür</font></center></td>
            <td></td>
            <td><center><font size="3">Unten</font></center></td>
            <td></td>
            <td><center><font size="3">Mitte</font></center></td>
            <td></td>
            <td><center><font size="3">Oben</font></center></td>
          </tr>
        </table>
      `;
    ]]]
styles:
  grid:
    - grid-template-areas: "\"table\""
    - grid-template-columns: 1fr
    - grid-template-rows: 1fr
  custom_fields:
    table:
      - justify-self: center
      - align-self: center
      - text-align: center
  card:
    - padding: 10px
    - border-radius: 12px

Gutes Gelingen!

Hab mich nochmal mit Hilfe der KI und einem etwas anderen, grafischen Ansatz ran gemacht und nun klappt es.

Dies ist der Code:

type: custom:button-card
show_icon: false
show_name: false
show_state: false
custom_fields:
  sonnenaufgang: |
    [[[
      const s = states['sensor.sonnenaufgang']?.state || '—';
      return `<div style="text-align:center;">
                <img src="/local/sunrise.png" style="width:35px;height:35px;"><br>
                <span style="font-size:14px;font-weight:600;">${s} Uhr</span>
              </div>`;
    ]]]
  sonnenuntergang: |
    [[[
      const s = states['sensor.sonnenuntergang']?.state || '—';
      return `<div style="text-align:center;">
                <img src="/local/sunset.png" style="width:35px;height:35px;"><br>
                <span style="font-size:14px;font-weight:600;">${s} Uhr</span>
              </div>`;
    ]]]
  mondaufgang: |
    [[[
      const s = states['sensor.mondaufgang']?.state || '—';
      return `<div style="text-align:center;">
                <img src="/local/moonrise.png" style="width:35px;height:35px;"><br>
                <span style="font-size:14px;font-weight:600;">${s} Uhr</span>
              </div>`;
    ]]]
  monduntergang: |
    [[[
      const s = states['sensor.monduntergang']?.state || '—';
      return `<div style="text-align:center;">
                <img src="/local/moonset.png" style="width:35px;height:35px;"><br>
                <span style="font-size:14px;font-weight:600;">${s} Uhr</span>
              </div>`;
    ]]]
styles:
  card:
    - padding: 12px
    - border-radius: 12px
    - min-height: 140px
  grid:
    - grid-template-areas: |
        "sonnenaufgang sonnenuntergang"
        "mondaufgang monduntergang"
    - grid-template-columns: 1fr 1fr
    - grid-template-rows: 1fr 1fr
    - justify-items: center
    - align-items: center
    - gap: 12px
  custom_fields:
    sonnenaufgang:
      - grid-area: sonnenaufgang
    sonnenuntergang:
      - grid-area: sonnenuntergang
    mondaufgang:
      - grid-area: mondaufgang
    monduntergang:
      - grid-area: monduntergang
view_layout:
  grid-area: sm

Mal ganz abgesehen davon, dass custom_fields dafür gar nicht gedacht ist, diesen ganzen html-Code aufzunehmen, ist das was die KI da ausgespuckt hat, vor 12 Jahren, wo ich mit dem Webseiten-Scripten aufgehört habe schon hilflos veraltet gewesen.

Ich würde da 1. kein HTML einbauen und 2. schonmal lange keins das nicht den aktuellen Vorgaben entspricht… Ich glaube nen <br> war damals schon deprecated.

Auf Inline Styles würde ich auch verzichten. Du kannst in den custom_fields direkt CSS Formatierungen eintragen.

Kein Wunder das man damit Darstellungsprobleme bekommen kann.

Kann man nur hoffen, dass sich das nicht auch noch einer als Lösung kopiert, oder die KI den falschen Mist wieder aufsaugt und dem nächsten Unwissenden vorwirft…

Wo ist eigentlich der “Daumen runter” - Smilie” ? :wink: