SQL Abfragen

Erstellen Grafana-Panel

Dashboard → Add visualization

Wir können beide Sensoren mit einer Abfrage holen.

Kopiere diese Abfrage in Grafana:

WITH RECURSIVE
zeit AS (
    SELECT
        FROM_UNIXTIME(
            FLOOR($__unixEpochFrom() / 300) * 300
        ) AS time

    UNION ALL

    SELECT
        time + INTERVAL 5 MINUTE
    FROM zeit
    WHERE time + INTERVAL 5 MINUTE <=
          FROM_UNIXTIME($__unixEpochTo())
),
werte AS (
    SELECT
        FROM_UNIXTIME(
            FLOOR(s.last_updated_ts / 300) * 300
        ) AS time,

        sm.entity_id,

        AVG(CAST(s.state AS DECIMAL(10,2))) AS value

    FROM states s

    JOIN states_meta sm
        ON s.metadata_id = sm.metadata_id

    WHERE sm.entity_id IN (
        'sensor.gw1100a_outdoor_temperature_2',
        'sensor.snzb_02d_temperatur_temperatur_3'
    )

    AND s.last_updated_ts BETWEEN
        $__unixEpochFrom()
        AND $__unixEpochTo()

    AND s.state REGEXP '^-?[0-9]+([.][0-9]+)?$'

    GROUP BY
        FLOOR(s.last_updated_ts / 300),
        sm.entity_id
)

SELECT
    zeit.time,

    (
        SELECT value
        FROM werte
        WHERE entity_id =
            'sensor.gw1100a_outdoor_temperature_2'
        AND time <= zeit.time
        ORDER BY time DESC
        LIMIT 1
    ) AS `Außen`,

    (
        SELECT value
        FROM werte
        WHERE entity_id =
            'sensor.snzb_02d_temperatur_temperatur_3'
        AND time <= zeit.time
        ORDER BY time DESC
        LIMIT 1
    ) AS `Innen`

FROM zeit

ORDER BY zeit.time;


Um zwei verschiedene Metriken (Prozent und Watt/Kilowatt) in einem einzigen Grafana-Diagramm mit zwei separaten Y-Achsen anzuzeigen, müssen Sie die Daten beider Sensoren in einer Abfrage zusammenführen.
In SQL löst man das am besten, indem man die Sensoren über die Zeitstände (Timestamps) abfragt und Grafana über das Feld metric mitteilt, welche Datenlinie zu welchem Sensor gehört.
Hier ist die fertige SQL-Abfrage für Ihre Home Assistant Datenbank (kompatibel mit dem aktuellen Datenbankschema):

SELECT
s.last_updated_ts AS time,
CAST(s.state AS REAL) AS value,
CASE
WHEN m.entity_id = ’sensor.batterie_ladezustand‘ THEN ‚Batterie (%)‘
WHEN m.entity_id = ’sensor.pv_ertrag‘ THEN ‚PV-Ertrag (W)‘
END AS metric
FROM states s
JOIN states_meta m ON s.metadata_id = m.metadata_id
WHERE
m.entity_id IN (’sensor.batterie_ladezustand‘, ’sensor.pv_ertrag‘)
AND s.state NOT IN (‚unknown‘, ‚unavailable‘)
AND s.last_updated_ts >= $__unixEpochFrom()
AND s.last_updated_ts <= $__unixEpochTo()
ORDER BY s.last_updated_ts ASC;

Wann wurde geladen & wie viel? (Ladeleistung)

SELECT
  states.last_updated_ts AS time,
  CAST(states.state AS FLOAT) AS value
FROM states
LEFT JOIN state_metadata ON states.metadata_id = state_metadata.metadata_id
WHERE
  state_metadata.entity_id = 'sensor.evcc_loadpoint_1_charge_power'
  AND states.state NOT IN ('unknown', 'unavailable')
  AND states.last_updated_ts >= $__unixEpochFrom()
  AND states.last_updated_ts <= $__unixEpochTo()
ORDER BY states.last_updated_ts ASC;

Wie hoch war die PV-Leistung?

SELECT
  states.last_updated_ts AS time,
  CAST(states.state AS FLOAT) AS value
FROM states
LEFT JOIN state_metadata ON states.metadata_id = state_metadata.metadata_id
WHERE
  state_metadata.entity_id = 'sensor.evcc_pv_power'
  AND states.state NOT IN ('unknown', 'unavailable')
  AND states.last_updated_ts >= $__unixEpochFrom()
  AND states.last_updated_ts <= $__unixEpochTo()
ORDER BY states.last_updated_ts ASC;

Wie war der Batteriestand des Hausspeichers (in %)

SELECT
  states.last_updated_ts AS time,
  CAST(states.state AS FLOAT) AS value
FROM states
LEFT JOIN state_metadata ON states.metadata_id = state_metadata.metadata_id
WHERE
  state_metadata.entity_id = 'sensor.evcc_battery_soc'
  AND states.state NOT IN ('unknown', 'unavailable')
  AND states.last_updated_ts >= $__unixEpochFrom()
  AND states.last_updated_ts <= $__unixEpochTo()
ORDER BY states.last_updated_ts ASC;

Zweite Y-Achse für die Batterie aktivieren:Gehen Sie im rechten Einstellungsmenü des Grafana-Panels ganz nach unten zu Overrides (Überschreibungen).
Klicken Sie auf + Add field override > Fields with name.
Wählen Sie das Feld für die Batterie aus (sensor.evcc_battery_soc).
Klicken Sie auf + Add override property und wählen Sie Axis > Placement.
Stellen Sie den Wert auf Right.
Fügen Sie eine weitere Eigenschaft hinzu: Standard options > Unit und wählen Sie Percent (0-100).
Abfragetyp: Stellen Sie unter dem SQL-Editor sicher, dass das Format auf Format as: Time series
steht.

Ladeleistung des Autos (Wann & Wie viel)

SELECT
  FROM_UNIXTIME(states.last_updated_ts) AS time,
  CAST(states.state AS DECIMAL(10,2)) AS value,
  'Ladeleistung' AS metric
FROM states
LEFT JOIN state_metadata ON states.metadata_id = state_metadata.metadata_id
WHERE
  state_metadata.entity_id = 'sensor.evcc_loadpoint_1_charge_power'
  AND states.state NOT IN ('unknown', 'unavailable')
  AND states.last_updated_ts BETWEEN $__unixEpochFrom() AND $__unixEpochTo()
ORDER BY states.last_updated_ts ASC;

PV-Leistung der Solaranlage

SELECT
  FROM_UNIXTIME(states.last_updated_ts) AS time,
  CAST(states.state AS DECIMAL(10,2)) AS value,
  'PV-Leistung' AS metric
FROM states
LEFT JOIN state_metadata ON states.metadata_id = state_metadata.metadata_id
WHERE
  state_metadata.entity_id = 'sensor.evcc_pv_power'
  AND states.state NOT IN ('unknown', 'unavailable')
  AND states.last_updated_ts BETWEEN $__unixEpochFrom() AND $__unixEpochTo()
ORDER BY states.last_updated_ts ASC;

Batteriestand des Hausspeichers (in %)

SELECT
  FROM_UNIXTIME(states.last_updated_ts) AS time,
  CAST(states.state AS DECIMAL(10,2)) AS value,
  'Batteriestand' AS metric
FROM states
LEFT JOIN state_metadata ON states.metadata_id = state_metadata.metadata_id
WHERE
  state_metadata.entity_id = 'sensor.evcc_battery_soc'
  AND states.state NOT IN ('unknown', 'unavailable')
  AND states.last_updated_ts BETWEEN $__unixEpochFrom() AND $__unixEpochTo()
ORDER BY states.last_updated_ts ASC;

Grafana-Tipp für die Anzeige:

Fügen Sie diese drei Abfragen als Query A, B und C in ein einziges Time Series Panel ein.

Um den Batteriestand (0–100 %) optisch von den hohen Watt-Zahlen (z. B. 0–11.000 W) zu trennen, richten Sie im rechten Grafana-Menü einen Override (Überschreibung) für die Serie Batteriestand ein:

  1. Rechts auf Overrides klicken -> + Add field override -> Fields with name.
  2. Batteriestand auswählen.
  3. + Add override property -> Axis > Placement auf Right stellen.
  4. + Add override property -> Standard options > Unit auf Percent (0-100) stellen.

Falls Grafana bei einer der Abfragen ein leeres Diagramm anzeigt, prüfen wir am besten die Sensornamen. Du kannst unter Einstellungen > Geräte & Dienste > evcc-Integration nachschauen: Heißt dein Ladeleistung-Sensor dort exakt sensor.evcc_loadpoint_1_charge_power oder weicht der Name (z. B. durch den Namen deines Autos oder deiner Wallbox) ab?

SELECT
  FROM_UNIXTIME(states.last_updated_ts) AS time,
  CAST(states.state AS DECIMAL(10,2)) AS value,
  'Ladeleistung Carport' AS metric
FROM states
LEFT JOIN state_metadata ON states.metadata_id = state_metadata.metadata_id
WHERE
  state_metadata.entity_id = 'sensor.evcc_carport_charge_power'
  AND states.state NOT IN ('unknown', 'unavailable')
  AND states.last_updated_ts BETWEEN $__unixEpochFrom() AND $__unixEpochTo()
ORDER BY states.last_updated_ts ASC;