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;