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;