commit 754be12d70f21bdb6fe2f7a60d699cfc257c9131 Author: hermes Date: Tue Sep 8 14:43:28 2026 +0000 Initial: PostgreSQL CR, Grafana, Tecalor Dashboard, Ingress diff --git a/README.md b/README.md new file mode 100644 index 0000000..be8ec26 --- /dev/null +++ b/README.md @@ -0,0 +1,37 @@ +# HomeAssistant Observability + +## Komponenten + +- **PostgreSQL** (Zalando Operator) – Recorder-Backend für HomeAssistant +- **Grafana** – Visualisierung der Recorder-Daten +- **Ingress** (`grafana.kilhaasi-home.de`) – Grafana-Zugriff via HTTPS + +## Wichtige Hinweise + +### Historische Daten +HomeAssistant unterstützt **keine Migration** der Recorder-Historie von SQLite zu PostgreSQL. +Nur neue Daten ab dem Zeitpunkt der Umstellung werden in PostgreSQL gespeichert. + +### PostgreSQL-Passwort +Der Zalando-Operator generiert automatisch ein Passwort-Secret: +``` +homeassistant-observability.homeassistant-db-credentials.postgresql.acid.zalan.do +``` +Key: `password` (base64-kodiert) + +### HA-Recorder umstellen +In der HomeAssistant-Konfiguration (`recorder.yaml` oder über UI): + +```yaml +recorder: + db_url: postgresql://homeassistant:@10.0.0.36:5432/homeassistant +``` + +Dabei ist `` das aus dem Operator-Secret ausgelesene Passwort. + +## Deployment-Reihenfolge + +1. PostgreSQL CR anwenden → Operator erstellt DB und Secret +2. LoadBalancer-SERVICE prüfen (IP 10.0.0.36) +3. HA-Recorder auf PostgreSQL umstellen +4. Grafana-Pod startet automatisch (liest Passwort aus Secret) diff --git a/homeassistant-observability/db-lb-service.yaml b/homeassistant-observability/db-lb-service.yaml new file mode 100644 index 0000000..d40e1fa --- /dev/null +++ b/homeassistant-observability/db-lb-service.yaml @@ -0,0 +1,17 @@ +apiVersion: v1 +kind: Service +metadata: + name: homeassistant-db-lb + namespace: homeassistant-observability +spec: + type: LoadBalancer + loadBalancerIP: 10.0.0.36 + selector: + application: spilo + cluster-name: homeassistant-db + spilo-role: master + ports: + - name: postgresql + port: 5432 + targetPort: 5432 + protocol: TCP diff --git a/homeassistant-observability/gitops.yaml b/homeassistant-observability/gitops.yaml new file mode 100644 index 0000000..eb86307 --- /dev/null +++ b/homeassistant-observability/gitops.yaml @@ -0,0 +1,12 @@ +apiVersion: fleet.cattle.io/v1alpha1 +kind: GitRepo +metadata: + name: homeassistant-observability + namespace: fleet-local +spec: + repo: https://gitea.de.kilhaasi//hermes/homeassistant-observability.git + branch: main + paths: + - ./homeassistant-observability + clientSecretName: auth-gitea + insecureSkipTLSVerify: true diff --git a/homeassistant-observability/grafana-dashboards-cm.yaml b/homeassistant-observability/grafana-dashboards-cm.yaml new file mode 100644 index 0000000..fad0024 --- /dev/null +++ b/homeassistant-observability/grafana-dashboards-cm.yaml @@ -0,0 +1,18 @@ +apiVersion: v1 +kind: ConfigMap +metadata: + name: grafana-dashboards + namespace: homeassistant-observability +data: + dashboards.yaml: | + apiVersion: 1 + providers: + - name: default + orgId: 1 + folder: HomeAssistant + type: file + disableDeletion: false + editable: true + options: + path: /var/lib/grafana/dashboards + foldersFromFilesStructure: false diff --git a/homeassistant-observability/grafana-datasource-cm.yaml b/homeassistant-observability/grafana-datasource-cm.yaml new file mode 100644 index 0000000..e570b8d --- /dev/null +++ b/homeassistant-observability/grafana-datasource-cm.yaml @@ -0,0 +1,22 @@ +apiVersion: v1 +kind: ConfigMap +metadata: + name: grafana-datasources + namespace: homeassistant-observability +data: + datasources.yaml: | + apiVersion: 1 + datasources: + - name: HomeAssistant + type: postgres + access: proxy + url: homeassistant-db.homeassistant-observability:5432 + dbname: homeassistant + user: homeassistant + isDefault: true + jsonData: + sslmode: require + postgresVersion: 1600 + tlsSkipVerify: false + secureJsonData: + password: ${GF_DATASOURCE_HOMEASSISTANT_PASSWORD} diff --git a/homeassistant-observability/grafana-deployment.yaml b/homeassistant-observability/grafana-deployment.yaml new file mode 100644 index 0000000..ce3a38f --- /dev/null +++ b/homeassistant-observability/grafana-deployment.yaml @@ -0,0 +1,86 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: grafana + namespace: homeassistant-observability +spec: + replicas: 1 + selector: + matchLabels: + app: grafana + strategy: + type: Recreate + template: + metadata: + labels: + app: grafana + spec: + containers: + - name: grafana + image: grafana/grafana:11.3.0 + ports: + - containerPort: 3000 + name: http + protocol: TCP + env: + - name: GF_SECURITY_ADMIN_PASSWORD + value: admin + - name: GF_USERS_ALLOW_SIGN_UP + value: "false" + - name: GF_PATHS_PROVISIONING + value: /etc/grafana/provisioning + - name: GF_PATHS_DATA + value: /var/lib/grafana + - name: GF_PATHS_LOGS + value: /var/log/grafana + - name: GF_DATASOURCE_HOMEASSISTANT_PASSWORD + valueFrom: + secretKeyRef: + name: homeassistant-db-credentials + key: password + volumeMounts: + - name: grafana-data + mountPath: /var/lib/grafana + - name: grafana-datasources + mountPath: /etc/grafana/provisioning/datasources + - name: grafana-dashboards-config + mountPath: /etc/grafana/provisioning/dashboards + - name: grafana-dashboards + mountPath: /var/lib/grafana/dashboards + resources: + requests: + cpu: 100m + memory: 256Mi + limits: + cpu: 500m + memory: 512Mi + livenessProbe: + httpGet: + path: /api/health + port: 3000 + initialDelaySeconds: 30 + periodSeconds: 30 + readinessProbe: + httpGet: + path: /api/health + port: 3000 + initialDelaySeconds: 10 + periodSeconds: 10 + volumes: + - name: grafana-data + persistentVolumeClaim: + claimName: grafana-data + - name: grafana-datasources + configMap: + name: grafana-datasources + - name: grafana-dashboards-config + configMap: + name: grafana-dashboards + - name: grafana-dashboards + emptyDir: {} + - name: grafana-db-secret + secret: + secretName: homeassistant-db-credentials + - name: grafana-dashboards-vol + configMap: + name: tecalor-dashboard diff --git a/homeassistant-observability/grafana-ingress.yaml b/homeassistant-observability/grafana-ingress.yaml new file mode 100644 index 0000000..c055e55 --- /dev/null +++ b/homeassistant-observability/grafana-ingress.yaml @@ -0,0 +1,26 @@ +apiVersion: networking.k8s.io/v1 +kind: Ingress +metadata: + name: grafana + namespace: homeassistant-observability + annotations: + cert-manager.io/cluster-issuer: letsencrypt-prod + kubernetes.io/ingress.class: traefik + traefik.ingress.kubernetes.io/router.entrypoints: websecure + traefik.ingress.kubernetes.io/router.tls: "true" +spec: + tls: + - hosts: + - grafana.kilhaasi-home.de + secretName: grafana-tls + rules: + - host: grafana.kilhaasi-home.de + http: + paths: + - path: / + pathType: Prefix + backend: + service: + name: grafana + port: + number: 3000 diff --git a/homeassistant-observability/grafana-pvc.yaml b/homeassistant-observability/grafana-pvc.yaml new file mode 100644 index 0000000..16c5286 --- /dev/null +++ b/homeassistant-observability/grafana-pvc.yaml @@ -0,0 +1,12 @@ +apiVersion: v1 +kind: PersistentVolumeClaim +metadata: + name: grafana-data + namespace: homeassistant-observability +spec: + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 5Gi + storageClassName: longhorn diff --git a/homeassistant-observability/grafana-service.yaml b/homeassistant-observability/grafana-service.yaml new file mode 100644 index 0000000..2512c8e --- /dev/null +++ b/homeassistant-observability/grafana-service.yaml @@ -0,0 +1,14 @@ +apiVersion: v1 +kind: Service +metadata: + name: grafana + namespace: homeassistant-observability +spec: + type: ClusterIP + selector: + app: grafana + ports: + - name: http + port: 3000 + targetPort: 3000 + protocol: TCP diff --git a/homeassistant-observability/namespace.yaml b/homeassistant-observability/namespace.yaml new file mode 100644 index 0000000..09a880d --- /dev/null +++ b/homeassistant-observability/namespace.yaml @@ -0,0 +1,7 @@ +apiVersion: v1 +kind: Namespace +metadata: + name: homeassistant-observability + labels: + app.kubernetes.io/name: homeassistant-observability + app.kubernetes.io/managed-by: fleet diff --git a/homeassistant-observability/postgresql.yaml b/homeassistant-observability/postgresql.yaml new file mode 100644 index 0000000..cbfc722 --- /dev/null +++ b/homeassistant-observability/postgresql.yaml @@ -0,0 +1,54 @@ +apiVersion: acid.zalan.do/v1 +kind: postgresql +metadata: + name: homeassistant-db + namespace: homeassistant-observability +spec: + teamId: home + numberOfInstances: 2 + postgresql: + version: "16" + volume: + size: 10Gi + storageClass: longhorn + resources: + requests: + cpu: 250m + memory: 512Mi + limits: + cpu: "1" + memory: 1Gi + databases: + homeassistant: homeassistant + users: + homeassistant: + - superuser + env: + - name: WAL_S3_BUCKET + value: postgresql + - name: WALG_S3_PREFIX + value: s3://postgresql + - name: WAL_BUCKET_SCOPE_PREFIX + value: "" + - name: WAL_BUCKET_SCOPE_SUFFIX + value: "" + - name: USE_WALG_BACKUP + value: "true" + - name: USE_WALG_RESTORE + value: "true" + - name: BACKUP_SCHEDULE + value: 00 12 * * * + - name: AWS_ACCESS_KEY_ID + value: admin + - name: AWS_SECRET_ACCESS_KEY + value: Jupiter01! + - name: AWS_S3_FORCE_PATH_STYLE + value: "true" + - name: AWS_ENDPOINT + value: http://10.0.0.10:8333 + - name: WALG_DISABLE_S3_SSE + value: "true" + - name: BACKUP_NUM_TO_RETAIN + value: "5" + maintenanceWindows: [] + allowedSourceRanges: [] diff --git a/homeassistant-observability/tecalor-dashboard-cm.yaml b/homeassistant-observability/tecalor-dashboard-cm.yaml new file mode 100644 index 0000000..8bf9180 --- /dev/null +++ b/homeassistant-observability/tecalor-dashboard-cm.yaml @@ -0,0 +1,888 @@ +apiVersion: v1 +kind: ConfigMap +metadata: + name: tecalor-dashboard + namespace: homeassistant-observability +data: + tecalor-waermepumpe.json: | + { + "annotations": { + "list": [ + { + "builtIn": 1, + "datasource": { + "type": "grafana", + "uid": "-- Grafana --" + }, + "enable": true, + "hide": true, + "iconColor": "rgba(0, 211, 255, 1)", + "name": "Annotations & Alerts", + "type": "dashboard" + } + ] + }, + "editable": true, + "fiscalYearStartMonth": 0, + "graphTooltip": 1, + "id": null, + "links": [], + "liveNow": false, + "panels": [ + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 0 + }, + "id": 14, + "title": "Temperatures", + "panelType": "row", + "type": "row" + }, + { + "datasource": { + "type": "postgres", + "uid": "homeassistant" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "fillGradient": 0, + "lineInterpolation": "linear", + "lineWidth": 2, + "pointSize": 5, + "scaleDistribution": "linear", + "show": "default", + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + } + ] + }, + "unit": "°C" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 1 + }, + "id": 2, + "options": { + "legend": { + "calcs": ["lastNotNull", "max", "min"], + "displayMode": "table", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "multi", + "sort": "desc" + } + }, + "targets": [ + { + "datasource": { + "type": "postgres", + "uid": "homeassistant" + }, + "format": "time_series", + "rawQuery": true, + "rawSql": "SELECT\n last_changed AS time,\n state::float AS value,\n entity_id AS metric\nFROM recorder_states\nWHERE entity_id IN ('sensor.thzctl_vorlaufisttemp', 'sensor.thzctl_ruecklaufisttemp')\n AND $__timeFilter(last_changed)\nORDER BY last_changed", + "refId": "A" + } + ], + "title": "Vorlauf & Rücklauf Temperatur", + "type": "timeseries" + }, + { + "datasource": { + "type": "postgres", + "uid": "homeassistant" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "fillGradient": 0, + "lineInterpolation": "linear", + "lineWidth": 2, + "pointSize": 5, + "scaleDistribution": "linear", + "show": "default", + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + } + ] + }, + "unit": "°C" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 1 + }, + "id": 3, + "options": { + "legend": { + "calcs": ["lastNotNull", "max", "min"], + "displayMode": "table", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "multi", + "sort": "desc" + } + }, + "targets": [ + { + "datasource": { + "type": "postgres", + "uid": "homeassistant" + }, + "format": "time_series", + "rawQuery": true, + "rawSql": "SELECT\n last_changed AS time,\n state::float AS value,\n entity_id AS metric\nFROM recorder_states\nWHERE entity_id IN ('sensor.tecalor_thz5_5_eco_heissgas_temp', 'sensor.tecalor_thz5_5_eco_olsumpftemperatur', 'sensor.tecalor_thz5_5_eco_invertertemperatur')\n AND $__timeFilter(last_changed)\nORDER BY last_changed", + "refId": "A" + } + ], + "title": "Kesseltemperatur (Heissgas, Ölsumpftemp, Inverter)", + "type": "timeseries" + }, + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 9 + }, + "id": 15, + "title": "Druck & Zustand", + "panelType": "row" + }, + { + "datasource": { + "type": "postgres", + "uid": "homeassistant" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "fillGradient": 0, + "lineInterpolation": "linear", + "lineWidth": 2, + "pointSize": 5, + "scaleDistribution": "linear", + "show": "default", + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "bar" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 8, + "x": 0, + "y": 10 + }, + "id": 4, + "options": { + "legend": { + "calcs": ["lastNotNull", "max", "min"], + "displayMode": "table", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "multi", + "sort": "desc" + } + }, + "targets": [ + { + "datasource": { + "type": "postgres", + "uid": "homeassistant" + }, + "format": "time_series", + "rawQuery": true, + "rawSql": "SELECT\n last_changed AS time,\n state::float AS value,\n entity_id AS metric\nFROM recorder_states\nWHERE entity_id IN ('sensor.tecalor_thz5_5_eco_druck_hochdruck', 'sensor.tecalor_thz5_5_eco_druck_niederdruck', 'sensor.tecalor_thz5_5_eco_druck_heizkreis')\n AND $__timeFilter(last_changed)\nORDER BY last_changed", + "refId": "A" + } + ], + "title": "Druck (Hoch/Nieder/Heizkreis)", + "type": "timeseries" + }, + { + "datasource": { + "type": "postgres", + "uid": "homeassistant" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "fillGradient": 0, + "lineInterpolation": "linear", + "lineWidth": 2, + "pointSize": 5, + "scaleDistribution": "linear", + "show": "default", + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + } + ] + }, + "unit": "°C" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 8, + "x": 8, + "y": 10 + }, + "id": 5, + "options": { + "legend": { + "calcs": ["lastNotNull", "max", "min"], + "displayMode": "table", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "multi", + "sort": "desc" + } + }, + "targets": [ + { + "datasource": { + "type": "postgres", + "uid": "homeassistant" + }, + "format": "time_series", + "rawQuery": true, + "rawSql": "SELECT\n last_changed AS time,\n state::float AS value,\n entity_id AS metric\nFROM recorder_states\nWHERE entity_id IN ('sensor.tecalor_thz5_5_eco_verfluessiger_temp', 'sensor.tecalor_thz5_5_eco_speichersolltemp_tag')\n AND $__timeFilter(last_changed)\nORDER BY last_changed", + "refId": "A" + } + ], + "title": "Verflüssiger & Speichersoll", + "type": "timeseries" + }, + { + "datasource": { + "type": "postgres", + "uid": "homeassistant" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "fillGradient": 0, + "lineInterpolation": "linear", + "lineWidth": 2, + "pointSize": 5, + "scaleDistribution": "linear", + "show": "default", + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + } + ] + }, + "unit": "h" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 8, + "x": 16, + "y": 10 + }, + "id": 6, + "options": { + "legend": { + "calcs": ["lastNotNull", "max", "min"], + "displayMode": "table", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "multi", + "sort": "desc" + } + }, + "targets": [ + { + "datasource": { + "type": "postgres", + "uid": "homeassistant" + }, + "format": "time_series", + "rawQuery": true, + "rawSql": "SELECT\n last_changed AS time,\n state::float AS value,\n entity_id AS metric\nFROM recorder_states\nWHERE entity_id IN ('sensor.tecalor_thz5_5_eco_laufzeit_verdichter_heizen', 'sensor.tecalor_thz5_5_eco_laufzeit_verdichter_ww')\n AND $__timeFilter(last_changed)\nORDER BY last_changed", + "refId": "A" + } + ], + "title": "Laufzeit Verdichter (Heizen / WW)", + "type": "timeseries" + }, + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 18 + }, + "id": 16, + "title": "Energieverbrauch", + "panelType": "row" + }, + { + "datasource": { + "type": "postgres", + "uid": "homeassistant" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "fillGradient": 0, + "lineInterpolation": "linear", + "lineWidth": 2, + "pointSize": 5, + "scaleDistribution": "linear", + "show": "default", + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + } + ] + }, + "unit": "MWh" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 19 + }, + "id": 7, + "options": { + "legend": { + "calcs": ["lastNotNull", "max", "min"], + "displayMode": "table", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "multi", + "sort": "desc" + } + }, + "targets": [ + { + "datasource": { + "type": "postgres", + "uid": "homeassistant" + }, + "format": "time_series", + "rawQuery": true, + "rawSql": "SELECT\n last_changed AS time,\n state::float AS value,\n entity_id AS metric\nFROM recorder_states\nWHERE entity_id IN ('sensor.tecalor_thz5_5_eco_el_energieaufnahme_ww_summe_mwh', 'sensor.tecalor_thz5_5_eco_el_energieaufnahme_heiz_summe_mwh')\n AND $__timeFilter(last_changed)\nORDER BY last_changed", + "refId": "A" + } + ], + "title": "Energieaufnahme (WW / Heizung, kumuliert)", + "type": "timeseries" + }, + { + "datasource": { + "type": "postgres", + "uid": "homeassistant" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + } + ] + }, + "unit": "MWh" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 6, + "x": 12, + "y": 19 + }, + "id": 8, + "options": { + "colorMode": "background", + "graphMode": "area", + "justifyMode": "auto", + "orientation": "horizontal", + "reduceOptions": { + "calcs": ["lastNotNull"], + "fields": "", + "values": false + }, + "textMode": "auto" + }, + "targets": [ + { + "datasource": { + "type": "postgres", + "uid": "homeassistant" + }, + "format": "table", + "rawQuery": true, + "rawSql": "SELECT state::float AS value, entity_id AS metric\nFROM recorder_states\nWHERE entity_id = 'sensor.tecalor_thz5_5_eco_el_energieaufnahme_ww_summe_mwh'\nORDER BY last_changed DESC LIMIT 1", + "refId": "A" + } + ], + "title": "WW Gesamtenergie (MWh)", + "type": "stat" + }, + { + "datasource": { + "type": "postgres", + "uid": "homeassistant" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + } + ] + }, + "unit": "MWh" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 6, + "x": 18, + "y": 19 + }, + "id": 9, + "options": { + "colorMode": "background", + "graphMode": "area", + "justifyMode": "auto", + "orientation": "horizontal", + "reduceOptions": { + "calcs": ["lastNotNull"], + "fields": "", + "values": false + }, + "textMode": "auto" + }, + "targets": [ + { + "datasource": { + "type": "postgres", + "uid": "homeassistant" + }, + "format": "table", + "rawQuery": true, + "rawSql": "SELECT state::float AS value, entity_id AS metric\nFROM recorder_states\nWHERE entity_id = 'sensor.tecalor_thz5_5_eco_el_energieaufnahme_heiz_summe_mwh'\nORDER BY last_changed DESC LIMIT 1", + "refId": "A" + } + ], + "title": "Heizung Gesamtenergie (MWh)", + "type": "stat" + }, + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 27 + }, + "id": 17, + "title": "Zusatzinformationen", + "panelType": "row" + }, + { + "datasource": { + "type": "postgres", + "uid": "homeassistant" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + } + ] + }, + "unit": "short" + }, + "overrides": [] + }, + "gridPos": { + "h": 4, + "w": 4, + "x": 0, + "y": 28 + }, + "id": 10, + "options": { + "colorMode": "background", + "graphMode": "area", + "justifyMode": "auto", + "orientation": "horizontal", + "reduceOptions": { + "calcs": ["lastNotNull"], + "fields": "", + "values": false + }, + "textMode": "auto" + }, + "targets": [ + { + "datasource": { + "type": "postgres", + "uid": "homeassistant" + }, + "format": "table", + "rawQuery": true, + "rawSql": "SELECT state::float AS value, entity_id AS metric\nFROM recorder_states\nWHERE entity_id = 'sensor.tecalor_thz5_5_eco_firmware_version'\nORDER BY last_changed DESC LIMIT 1", + "refId": "A" + } + ], + "title": "Firmware Version", + "type": "stat" + }, + { + "datasource": { + "type": "postgres", + "uid": "homeassistant" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + } + ] + }, + "unit": "short" + }, + "overrides": [] + }, + "gridPos": { + "h": 4, + "w": 4, + "x": 4, + "y": 28 + }, + "id": 11, + "options": { + "colorMode": "background", + "graphMode": "area", + "justifyMode": "auto", + "orientation": "horizontal", + "reduceOptions": { + "calcs": ["lastNotNull"], + "fields": "", + "values": false + }, + "textMode": "auto" + }, + "targets": [ + { + "datasource": { + "type": "postgres", + "uid": "homeassistant" + }, + "format": "table", + "rawQuery": true, + "rawSql": "SELECT state::float AS value, entity_id AS metric\nFROM recorder_states\nWHERE entity_id = 'sensor.tecalor_thz5_5_eco_laufzeit_verdichter_heizen'\nORDER BY last_changed DESC LIMIT 1", + "refId": "A" + } + ], + "title": "Verdichter Laufzeit (Heizen, h)", + "type": "stat" + }, + { + "datasource": { + "type": "postgres", + "uid": "homeassistant" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + } + ] + }, + "unit": "short" + }, + "overrides": [] + }, + "gridPos": { + "h": 4, + "w": 4, + "x": 8, + "y": 28 + }, + "id": 12, + "options": { + "colorMode": "background", + "graphMode": "area", + "justifyMode": "auto", + "orientation": "horizontal", + "reduceOptions": { + "calcs": ["lastNotNull"], + "fields": "", + "values": false + }, + "textMode": "auto" + }, + "targets": [ + { + "datasource": { + "type": "postgres", + "uid": "homeassistant" + }, + "format": "table", + "rawQuery": true, + "rawSql": "SELECT state::float AS value, entity_id AS metric\nFROM recorder_states\nWHERE entity_id = 'sensor.tecalor_thz5_5_eco_laufzeit_verdichter_ww'\nORDER BY last_changed DESC LIMIT 1", + "refId": "A" + } + ], + "title": "Verdichter Laufzeit (WW, h)", + "type": "stat" + }, + { + "datasource": { + "type": "postgres", + "uid": "homeassistant" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + } + ] + }, + "unit": "short" + }, + "overrides": [] + }, + "gridPos": { + "h": 4, + "w": 4, + "x": 12, + "y": 28 + }, + "id": 13, + "options": { + "colorMode": "background", + "graphMode": "area", + "justifyMode": "auto", + "orientation": "horizontal", + "reduceOptions": { + "calcs": ["lastNotNull"], + "fields": "", + "values": false + }, + "textMode": "auto" + }, + "targets": [ + { + "datasource": { + "type": "postgres", + "uid": "homeassistant" + }, + "format": "table", + "rawQuery": true, + "rawSql": "SELECT state::float AS value, entity_id AS metric\nFROM recorder_states\nWHERE entity_id = 'sensor.tecalor_thz5_5_eco_raumsolltemp_tag'\nORDER BY last_changed DESC LIMIT 1", + "refId": "A" + } + ], + "title": "Raumsolltemp (Tag)", + "type": "stat" + } + ], + "refresh": "30s", + "schemaVersion": 40, + "tags": ["homeassistant", "tec", "heat-pump"], + "templating": { + "list": [] + }, + "time": { + "from": "now-24h", + "to": "now" + }, + "timepicker": {}, + "timezone": "browser", + "title": "Tecalor Wärmepumpe", + "uid": "tec-waermepumpe", + "version": 1 + } + diff --git a/homeassistant-observability/tecalor-dashboard.json b/homeassistant-observability/tecalor-dashboard.json new file mode 100644 index 0000000..0d5c145 --- /dev/null +++ b/homeassistant-observability/tecalor-dashboard.json @@ -0,0 +1,880 @@ +{ + "annotations": { + "list": [ + { + "builtIn": 1, + "datasource": { + "type": "grafana", + "uid": "-- Grafana --" + }, + "enable": true, + "hide": true, + "iconColor": "rgba(0, 211, 255, 1)", + "name": "Annotations & Alerts", + "type": "dashboard" + } + ] + }, + "editable": true, + "fiscalYearStartMonth": 0, + "graphTooltip": 1, + "id": null, + "links": [], + "liveNow": false, + "panels": [ + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 0 + }, + "id": 14, + "title": "Temperatures", + "panelType": "row", + "type": "row" + }, + { + "datasource": { + "type": "postgres", + "uid": "homeassistant" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "fillGradient": 0, + "lineInterpolation": "linear", + "lineWidth": 2, + "pointSize": 5, + "scaleDistribution": "linear", + "show": "default", + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + } + ] + }, + "unit": "°C" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 1 + }, + "id": 2, + "options": { + "legend": { + "calcs": ["lastNotNull", "max", "min"], + "displayMode": "table", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "multi", + "sort": "desc" + } + }, + "targets": [ + { + "datasource": { + "type": "postgres", + "uid": "homeassistant" + }, + "format": "time_series", + "rawQuery": true, + "rawSql": "SELECT\n last_changed AS time,\n state::float AS value,\n entity_id AS metric\nFROM recorder_states\nWHERE entity_id IN ('sensor.thzctl_vorlaufisttemp', 'sensor.thzctl_ruecklaufisttemp')\n AND $__timeFilter(last_changed)\nORDER BY last_changed", + "refId": "A" + } + ], + "title": "Vorlauf & Rücklauf Temperatur", + "type": "timeseries" + }, + { + "datasource": { + "type": "postgres", + "uid": "homeassistant" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "fillGradient": 0, + "lineInterpolation": "linear", + "lineWidth": 2, + "pointSize": 5, + "scaleDistribution": "linear", + "show": "default", + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + } + ] + }, + "unit": "°C" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 1 + }, + "id": 3, + "options": { + "legend": { + "calcs": ["lastNotNull", "max", "min"], + "displayMode": "table", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "multi", + "sort": "desc" + } + }, + "targets": [ + { + "datasource": { + "type": "postgres", + "uid": "homeassistant" + }, + "format": "time_series", + "rawQuery": true, + "rawSql": "SELECT\n last_changed AS time,\n state::float AS value,\n entity_id AS metric\nFROM recorder_states\nWHERE entity_id IN ('sensor.tecalor_thz5_5_eco_heissgas_temp', 'sensor.tecalor_thz5_5_eco_olsumpftemperatur', 'sensor.tecalor_thz5_5_eco_invertertemperatur')\n AND $__timeFilter(last_changed)\nORDER BY last_changed", + "refId": "A" + } + ], + "title": "Kesseltemperatur (Heissgas, Ölsumpftemp, Inverter)", + "type": "timeseries" + }, + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 9 + }, + "id": 15, + "title": "Druck & Zustand", + "panelType": "row" + }, + { + "datasource": { + "type": "postgres", + "uid": "homeassistant" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "fillGradient": 0, + "lineInterpolation": "linear", + "lineWidth": 2, + "pointSize": 5, + "scaleDistribution": "linear", + "show": "default", + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "bar" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 8, + "x": 0, + "y": 10 + }, + "id": 4, + "options": { + "legend": { + "calcs": ["lastNotNull", "max", "min"], + "displayMode": "table", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "multi", + "sort": "desc" + } + }, + "targets": [ + { + "datasource": { + "type": "postgres", + "uid": "homeassistant" + }, + "format": "time_series", + "rawQuery": true, + "rawSql": "SELECT\n last_changed AS time,\n state::float AS value,\n entity_id AS metric\nFROM recorder_states\nWHERE entity_id IN ('sensor.tecalor_thz5_5_eco_druck_hochdruck', 'sensor.tecalor_thz5_5_eco_druck_niederdruck', 'sensor.tecalor_thz5_5_eco_druck_heizkreis')\n AND $__timeFilter(last_changed)\nORDER BY last_changed", + "refId": "A" + } + ], + "title": "Druck (Hoch/Nieder/Heizkreis)", + "type": "timeseries" + }, + { + "datasource": { + "type": "postgres", + "uid": "homeassistant" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "fillGradient": 0, + "lineInterpolation": "linear", + "lineWidth": 2, + "pointSize": 5, + "scaleDistribution": "linear", + "show": "default", + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + } + ] + }, + "unit": "°C" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 8, + "x": 8, + "y": 10 + }, + "id": 5, + "options": { + "legend": { + "calcs": ["lastNotNull", "max", "min"], + "displayMode": "table", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "multi", + "sort": "desc" + } + }, + "targets": [ + { + "datasource": { + "type": "postgres", + "uid": "homeassistant" + }, + "format": "time_series", + "rawQuery": true, + "rawSql": "SELECT\n last_changed AS time,\n state::float AS value,\n entity_id AS metric\nFROM recorder_states\nWHERE entity_id IN ('sensor.tecalor_thz5_5_eco_verfluessiger_temp', 'sensor.tecalor_thz5_5_eco_speichersolltemp_tag')\n AND $__timeFilter(last_changed)\nORDER BY last_changed", + "refId": "A" + } + ], + "title": "Verflüssiger & Speichersoll", + "type": "timeseries" + }, + { + "datasource": { + "type": "postgres", + "uid": "homeassistant" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "fillGradient": 0, + "lineInterpolation": "linear", + "lineWidth": 2, + "pointSize": 5, + "scaleDistribution": "linear", + "show": "default", + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + } + ] + }, + "unit": "h" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 8, + "x": 16, + "y": 10 + }, + "id": 6, + "options": { + "legend": { + "calcs": ["lastNotNull", "max", "min"], + "displayMode": "table", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "multi", + "sort": "desc" + } + }, + "targets": [ + { + "datasource": { + "type": "postgres", + "uid": "homeassistant" + }, + "format": "time_series", + "rawQuery": true, + "rawSql": "SELECT\n last_changed AS time,\n state::float AS value,\n entity_id AS metric\nFROM recorder_states\nWHERE entity_id IN ('sensor.tecalor_thz5_5_eco_laufzeit_verdichter_heizen', 'sensor.tecalor_thz5_5_eco_laufzeit_verdichter_ww')\n AND $__timeFilter(last_changed)\nORDER BY last_changed", + "refId": "A" + } + ], + "title": "Laufzeit Verdichter (Heizen / WW)", + "type": "timeseries" + }, + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 18 + }, + "id": 16, + "title": "Energieverbrauch", + "panelType": "row" + }, + { + "datasource": { + "type": "postgres", + "uid": "homeassistant" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "fillGradient": 0, + "lineInterpolation": "linear", + "lineWidth": 2, + "pointSize": 5, + "scaleDistribution": "linear", + "show": "default", + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + } + ] + }, + "unit": "MWh" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 19 + }, + "id": 7, + "options": { + "legend": { + "calcs": ["lastNotNull", "max", "min"], + "displayMode": "table", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "multi", + "sort": "desc" + } + }, + "targets": [ + { + "datasource": { + "type": "postgres", + "uid": "homeassistant" + }, + "format": "time_series", + "rawQuery": true, + "rawSql": "SELECT\n last_changed AS time,\n state::float AS value,\n entity_id AS metric\nFROM recorder_states\nWHERE entity_id IN ('sensor.tecalor_thz5_5_eco_el_energieaufnahme_ww_summe_mwh', 'sensor.tecalor_thz5_5_eco_el_energieaufnahme_heiz_summe_mwh')\n AND $__timeFilter(last_changed)\nORDER BY last_changed", + "refId": "A" + } + ], + "title": "Energieaufnahme (WW / Heizung, kumuliert)", + "type": "timeseries" + }, + { + "datasource": { + "type": "postgres", + "uid": "homeassistant" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + } + ] + }, + "unit": "MWh" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 6, + "x": 12, + "y": 19 + }, + "id": 8, + "options": { + "colorMode": "background", + "graphMode": "area", + "justifyMode": "auto", + "orientation": "horizontal", + "reduceOptions": { + "calcs": ["lastNotNull"], + "fields": "", + "values": false + }, + "textMode": "auto" + }, + "targets": [ + { + "datasource": { + "type": "postgres", + "uid": "homeassistant" + }, + "format": "table", + "rawQuery": true, + "rawSql": "SELECT state::float AS value, entity_id AS metric\nFROM recorder_states\nWHERE entity_id = 'sensor.tecalor_thz5_5_eco_el_energieaufnahme_ww_summe_mwh'\nORDER BY last_changed DESC LIMIT 1", + "refId": "A" + } + ], + "title": "WW Gesamtenergie (MWh)", + "type": "stat" + }, + { + "datasource": { + "type": "postgres", + "uid": "homeassistant" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + } + ] + }, + "unit": "MWh" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 6, + "x": 18, + "y": 19 + }, + "id": 9, + "options": { + "colorMode": "background", + "graphMode": "area", + "justifyMode": "auto", + "orientation": "horizontal", + "reduceOptions": { + "calcs": ["lastNotNull"], + "fields": "", + "values": false + }, + "textMode": "auto" + }, + "targets": [ + { + "datasource": { + "type": "postgres", + "uid": "homeassistant" + }, + "format": "table", + "rawQuery": true, + "rawSql": "SELECT state::float AS value, entity_id AS metric\nFROM recorder_states\nWHERE entity_id = 'sensor.tecalor_thz5_5_eco_el_energieaufnahme_heiz_summe_mwh'\nORDER BY last_changed DESC LIMIT 1", + "refId": "A" + } + ], + "title": "Heizung Gesamtenergie (MWh)", + "type": "stat" + }, + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 27 + }, + "id": 17, + "title": "Zusatzinformationen", + "panelType": "row" + }, + { + "datasource": { + "type": "postgres", + "uid": "homeassistant" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + } + ] + }, + "unit": "short" + }, + "overrides": [] + }, + "gridPos": { + "h": 4, + "w": 4, + "x": 0, + "y": 28 + }, + "id": 10, + "options": { + "colorMode": "background", + "graphMode": "area", + "justifyMode": "auto", + "orientation": "horizontal", + "reduceOptions": { + "calcs": ["lastNotNull"], + "fields": "", + "values": false + }, + "textMode": "auto" + }, + "targets": [ + { + "datasource": { + "type": "postgres", + "uid": "homeassistant" + }, + "format": "table", + "rawQuery": true, + "rawSql": "SELECT state::float AS value, entity_id AS metric\nFROM recorder_states\nWHERE entity_id = 'sensor.tecalor_thz5_5_eco_firmware_version'\nORDER BY last_changed DESC LIMIT 1", + "refId": "A" + } + ], + "title": "Firmware Version", + "type": "stat" + }, + { + "datasource": { + "type": "postgres", + "uid": "homeassistant" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + } + ] + }, + "unit": "short" + }, + "overrides": [] + }, + "gridPos": { + "h": 4, + "w": 4, + "x": 4, + "y": 28 + }, + "id": 11, + "options": { + "colorMode": "background", + "graphMode": "area", + "justifyMode": "auto", + "orientation": "horizontal", + "reduceOptions": { + "calcs": ["lastNotNull"], + "fields": "", + "values": false + }, + "textMode": "auto" + }, + "targets": [ + { + "datasource": { + "type": "postgres", + "uid": "homeassistant" + }, + "format": "table", + "rawQuery": true, + "rawSql": "SELECT state::float AS value, entity_id AS metric\nFROM recorder_states\nWHERE entity_id = 'sensor.tecalor_thz5_5_eco_laufzeit_verdichter_heizen'\nORDER BY last_changed DESC LIMIT 1", + "refId": "A" + } + ], + "title": "Verdichter Laufzeit (Heizen, h)", + "type": "stat" + }, + { + "datasource": { + "type": "postgres", + "uid": "homeassistant" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + } + ] + }, + "unit": "short" + }, + "overrides": [] + }, + "gridPos": { + "h": 4, + "w": 4, + "x": 8, + "y": 28 + }, + "id": 12, + "options": { + "colorMode": "background", + "graphMode": "area", + "justifyMode": "auto", + "orientation": "horizontal", + "reduceOptions": { + "calcs": ["lastNotNull"], + "fields": "", + "values": false + }, + "textMode": "auto" + }, + "targets": [ + { + "datasource": { + "type": "postgres", + "uid": "homeassistant" + }, + "format": "table", + "rawQuery": true, + "rawSql": "SELECT state::float AS value, entity_id AS metric\nFROM recorder_states\nWHERE entity_id = 'sensor.tecalor_thz5_5_eco_laufzeit_verdichter_ww'\nORDER BY last_changed DESC LIMIT 1", + "refId": "A" + } + ], + "title": "Verdichter Laufzeit (WW, h)", + "type": "stat" + }, + { + "datasource": { + "type": "postgres", + "uid": "homeassistant" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + } + ] + }, + "unit": "short" + }, + "overrides": [] + }, + "gridPos": { + "h": 4, + "w": 4, + "x": 12, + "y": 28 + }, + "id": 13, + "options": { + "colorMode": "background", + "graphMode": "area", + "justifyMode": "auto", + "orientation": "horizontal", + "reduceOptions": { + "calcs": ["lastNotNull"], + "fields": "", + "values": false + }, + "textMode": "auto" + }, + "targets": [ + { + "datasource": { + "type": "postgres", + "uid": "homeassistant" + }, + "format": "table", + "rawQuery": true, + "rawSql": "SELECT state::float AS value, entity_id AS metric\nFROM recorder_states\nWHERE entity_id = 'sensor.tecalor_thz5_5_eco_raumsolltemp_tag'\nORDER BY last_changed DESC LIMIT 1", + "refId": "A" + } + ], + "title": "Raumsolltemp (Tag)", + "type": "stat" + } + ], + "refresh": "30s", + "schemaVersion": 40, + "tags": ["homeassistant", "tec", "heat-pump"], + "templating": { + "list": [] + }, + "time": { + "from": "now-24h", + "to": "now" + }, + "timepicker": {}, + "timezone": "browser", + "title": "Tecalor Wärmepumpe", + "uid": "tec-waermepumpe", + "version": 1 +}