apiVersion: v1 kind: ConfigMap metadata: name: grafana-dashboard-taupi-fan namespace: monitoring labels: grafana_dashboard: '1' annotations: grafana_dashboard_folder: "Grabengasse7" data: taupi-fan.json: | { "uid": "taupi-fan", "title": "💨 Cellar Fan (TAUPI)", "tags": ["climate", "fan", "cellar", "taupi", "prometheus"], "timezone": "browser", "schemaVersion": 41, "version": 5, "refresh": "30s", "editable": false, "graphTooltip": 2, "time": { "from": "now-24h", "to": "now" }, "templating": { "list": [ { "name": "datasource", "type": "datasource", "pluginId": "prometheus", "includeAll": false, "label": "Prometheus", "current": { "selected": true, "text": "prometheus", "value": "prometheus" } } ] }, "panels": [ { "title": "⚡ Status & Real-Time KPIs", "type": "row", "gridPos": {"h": 1, "w": 24, "x": 0, "y": 0}, "collapsed": false }, { "id": 1, "title": "Fan Power Relay", "type": "stat", "datasource": {"type": "prometheus", "uid": "${datasource}"}, "gridPos": {"h": 4, "w": 4, "x": 0, "y": 1}, "fieldConfig": { "defaults": { "mappings": [ {"type": "value", "options": {"0": {"text": "OFF (Idle)", "color": "blue"}, "1": {"text": "VENTILATING", "color": "orange"}}} ], "color": {"mode": "thresholds"} } }, "options": { "graphMode": "none", "colorMode": "background", "textMode": "auto", "reduceOptions": {"values": false, "calcs": ["lastNotNull"]} }, "targets": [ {"expr": "taupi_relay_status", "legendFormat": "Relay", "refId": "A"} ] }, { "id": 2, "title": "Drying Quality Score", "description": "Calculated 0-100 score based on Dewpoint Spread. Higher score allows longer continuous ventilation runtime.", "type": "stat", "datasource": {"type": "prometheus", "uid": "${datasource}"}, "gridPos": {"h": 4, "w": 4, "x": 4, "y": 1}, "fieldConfig": { "defaults": { "unit": "none", "min": 0, "max": 100, "color": {"mode": "thresholds"}, "thresholds": { "mode": "absolute", "steps": [ {"color": "gray", "value": null}, {"color": "yellow", "value": 40}, {"color": "green", "value": 70}, {"color": "purple", "value": 90} ] } } }, "options": { "graphMode": "none", "colorMode": "background", "textMode": "auto", "reduceOptions": {"values": false, "calcs": ["lastNotNull"]} }, "targets": [ {"expr": "taupi_quality_score", "legendFormat": "Quality Score", "refId": "A"} ] }, { "id": 3, "title": "Dewpoint Drying Spread", "description": "Indoor Dewpoint − Outdoor Dewpoint. Must be > 2.0°C for drying.", "type": "stat", "datasource": {"type": "prometheus", "uid": "${datasource}"}, "gridPos": {"h": 4, "w": 4, "x": 8, "y": 1}, "fieldConfig": { "defaults": { "unit": "celsius", "decimals": 1, "color": {"mode": "thresholds"}, "thresholds": { "mode": "absolute", "steps": [ {"color": "red", "value": null}, {"color": "yellow", "value": 0}, {"color": "green", "value": 2.0} ] } } }, "options": { "graphMode": "none", "colorMode": "background", "textMode": "auto", "reduceOptions": {"values": false, "calcs": ["lastNotNull"]} }, "targets": [ {"expr": "taupi_dewpoint_spread_celsius", "legendFormat": "Dewpoint Spread", "refId": "A"} ] }, { "id": 4, "title": "Thermal Governor State", "description": "Thermal operating regime (Warm Cooling, Comfort 14-20°C, Cold Restricted, Frost Floor)", "type": "stat", "datasource": {"type": "prometheus", "uid": "${datasource}"}, "gridPos": {"h": 4, "w": 4, "x": 12, "y": 1}, "fieldConfig": { "defaults": { "mappings": [ {"type": "value", "options": {"0": {"text": "INIT", "color": "gray"}, "1": {"text": "FROST FLOOR", "color": "blue"}, "2": {"text": "COMFORT (14-20°)", "color": "green"}, "3": {"text": "WARM (Cooling)", "color": "orange"}, "4": {"text": "COLD RESTRICTED", "color": "purple"}}} ] } }, "options": { "graphMode": "none", "colorMode": "background", "textMode": "auto", "reduceOptions": {"values": false, "calcs": ["lastNotNull"]} }, "targets": [ {"expr": "taupi_thermal_governor_state", "legendFormat": "Governor", "refId": "A"} ] }, { "id": 5, "title": "Dynamic Max Burst Runtime", "description": "Dynamic max continuous runtime allowed based on drying quality", "type": "stat", "datasource": {"type": "prometheus", "uid": "${datasource}"}, "gridPos": {"h": 4, "w": 4, "x": 16, "y": 1}, "fieldConfig": { "defaults": { "unit": "m", "decimals": 0, "color": {"mode": "thresholds"}, "thresholds": { "mode": "absolute", "steps": [ {"color": "gray", "value": null}, {"color": "yellow", "value": 20}, {"color": "green", "value": 45}, {"color": "purple", "value": 90} ] } } }, "options": { "graphMode": "none", "colorMode": "background", "textMode": "auto", "reduceOptions": {"values": false, "calcs": ["lastNotNull"]} }, "targets": [ {"expr": "taupi_max_allowed_runtime_minutes", "legendFormat": "Max Runtime", "refId": "A"} ] }, { "id": 6, "title": "Controller Connectivity", "type": "stat", "datasource": {"type": "prometheus", "uid": "${datasource}"}, "gridPos": {"h": 4, "w": 4, "x": 20, "y": 1}, "fieldConfig": { "defaults": { "mappings": [ {"type": "value", "options": {"0": {"text": "OFFLINE", "color": "red"}, "1": {"text": "ONLINE", "color": "green"}}} ] } }, "options": { "graphMode": "none", "colorMode": "background", "textMode": "auto", "reduceOptions": {"values": false, "calcs": ["lastNotNull"]} }, "targets": [ {"expr": "up{job=\"taupi-fan\"}", "legendFormat": "Shelly Scrape", "refId": "A"} ] }, { "title": "🎯 PRIMARY GOAL: Humidity Reduction vs. Fan Operation", "type": "row", "gridPos": {"h": 1, "w": 24, "x": 0, "y": 5}, "collapsed": false }, { "id": 7, "title": "🎯 Primary Goal: Humidity High ➔ Fan Runs ➔ Humidity Drops", "description": "Visual validation of cellar drying: When Indoor Humidity rises above target, the orange Fan Active band engages until Indoor Humidity drops back down.", "type": "timeseries", "datasource": {"type": "prometheus", "uid": "${datasource}"}, "gridPos": {"h": 12, "w": 24, "x": 0, "y": 6}, "fieldConfig": { "defaults": { "unit": "percent", "custom": { "lineWidth": 2, "fillOpacity": 0, "spanNulls": true, "showPoints": "never" } }, "overrides": [ { "matcher": {"id": "byName", "options": "Fan Active (Running)"}, "properties": [ {"id": "color", "value": {"fixedColor": "#FF9800", "mode": "fixed"}}, {"id": "custom.axisPlacement", "value": "hidden"}, {"id": "custom.drawStyle", "value": "line"}, {"id": "custom.lineInterpolation", "value": "stepAfter"}, {"id": "custom.lineWidth", "value": 0}, {"id": "custom.fillOpacity", "value": 25}, {"id": "min", "value": 0}, {"id": "max", "value": 1}, {"id": "decimals", "value": 0}, {"id": "mappings", "value": [{"type": "value", "options": {"0": {"text": "OFF"}, "1": {"text": "ON"}}}]} ] }, { "matcher": {"id": "byName", "options": "Indoor Humidity (Cellar)"}, "properties": [ {"id": "custom.axisPlacement", "value": "left"}, {"id": "color", "value": {"fixedColor": "#00E5FF", "mode": "fixed"}}, {"id": "custom.lineWidth", "value": 3}, {"id": "custom.fillOpacity", "value": 12} ] }, { "matcher": {"id": "byName", "options": "Target Setpoint"}, "properties": [ {"id": "custom.axisPlacement", "value": "left"}, {"id": "color", "value": {"fixedColor": "#E040FB", "mode": "fixed"}}, {"id": "custom.lineStyle", "value": {"fill": "dash", "dash": [6, 4]}}, {"id": "custom.lineWidth", "value": 2} ] }, { "matcher": {"id": "byName", "options": "Mold Risk Limit (Sedlbauer)"}, "properties": [ {"id": "custom.axisPlacement", "value": "left"}, {"id": "color", "value": {"fixedColor": "#FF1744", "mode": "fixed"}}, {"id": "custom.lineStyle", "value": {"fill": "dash", "dash": [10, 5]}}, {"id": "custom.lineWidth", "value": 1.5} ] }, { "matcher": {"id": "byName", "options": "Outdoor Humidity"}, "properties": [ {"id": "custom.axisPlacement", "value": "left"}, {"id": "color", "value": {"fixedColor": "#448AFF", "mode": "fixed"}}, {"id": "custom.lineWidth", "value": 1.5}, {"id": "custom.lineStyle", "value": {"fill": "dot", "dash": [2, 4]}} ] } ] }, "options": { "legend": {"displayMode": "table", "placement": "bottom", "calcs": ["lastNotNull", "min", "max", "mean"]}, "tooltip": {"mode": "multi", "sort": "desc"} }, "targets": [ {"expr": "taupi_relay_status", "legendFormat": "Fan Active (Running)", "refId": "A"}, {"expr": "taupi_humidity_percent_innen", "legendFormat": "Indoor Humidity (Cellar)", "refId": "B"}, {"expr": "taupi_target_humidity_percent", "legendFormat": "Target Setpoint", "refId": "C"}, {"expr": "taupi_critical_humidity_threshold_percent", "legendFormat": "Mold Risk Limit (Sedlbauer)", "refId": "D"}, {"expr": "taupi_humidity_percent_aussen", "legendFormat": "Outdoor Humidity", "refId": "E"} ] }, { "title": "📊 Complete Climate & Psychrometric Correlation", "type": "row", "gridPos": {"h": 1, "w": 24, "x": 0, "y": 18}, "collapsed": false }, { "id": 8, "title": "📊 Full Telemetry Overview (Temperatures, Dewpoints, Humidity & Fan)", "description": "Comprehensive correlation: Left axis (°C) = Temperatures & Dewpoints. Right axis (%) = Humidity, Setpoint & Mold Limit. Orange shaded band = Fan Relay ON.", "type": "timeseries", "datasource": {"type": "prometheus", "uid": "${datasource}"}, "gridPos": {"h": 13, "w": 24, "x": 0, "y": 19}, "fieldConfig": { "defaults": { "custom": { "lineWidth": 2, "fillOpacity": 0, "spanNulls": true, "showPoints": "never" } }, "overrides": [ { "matcher": {"id": "byName", "options": "Fan Active"}, "properties": [ {"id": "color", "value": {"fixedColor": "#FF9800", "mode": "fixed"}}, {"id": "custom.axisPlacement", "value": "hidden"}, {"id": "custom.drawStyle", "value": "line"}, {"id": "custom.lineInterpolation", "value": "stepAfter"}, {"id": "custom.lineWidth", "value": 0}, {"id": "custom.fillOpacity", "value": 20}, {"id": "min", "value": 0}, {"id": "max", "value": 1}, {"id": "decimals", "value": 0}, {"id": "mappings", "value": [{"type": "value", "options": {"0": {"text": "OFF"}, "1": {"text": "ON"}}}]} ] }, { "matcher": {"id": "byName", "options": "Indoor Temp"}, "properties": [ {"id": "custom.axisPlacement", "value": "left"}, {"id": "unit", "value": "celsius"}, {"id": "color", "value": {"fixedColor": "#FF6D00", "mode": "fixed"}}, {"id": "custom.lineWidth", "value": 2} ] }, { "matcher": {"id": "byName", "options": "Outdoor Temp"}, "properties": [ {"id": "custom.axisPlacement", "value": "left"}, {"id": "unit", "value": "celsius"}, {"id": "color", "value": {"fixedColor": "#2979FF", "mode": "fixed"}}, {"id": "custom.lineWidth", "value": 2} ] }, { "matcher": {"id": "byName", "options": "Indoor Dewpoint"}, "properties": [ {"id": "custom.axisPlacement", "value": "left"}, {"id": "unit", "value": "celsius"}, {"id": "color", "value": {"fixedColor": "#FFB74D", "mode": "fixed"}}, {"id": "custom.lineStyle", "value": {"fill": "dash", "dash": [8, 4]}}, {"id": "custom.lineWidth", "value": 1.5} ] }, { "matcher": {"id": "byName", "options": "Outdoor Dewpoint"}, "properties": [ {"id": "custom.axisPlacement", "value": "left"}, {"id": "unit", "value": "celsius"}, {"id": "color", "value": {"fixedColor": "#90CAF9", "mode": "fixed"}}, {"id": "custom.lineStyle", "value": {"fill": "dash", "dash": [8, 4]}}, {"id": "custom.lineWidth", "value": 1.5} ] }, { "matcher": {"id": "byName", "options": "Indoor Humidity"}, "properties": [ {"id": "custom.axisPlacement", "value": "right"}, {"id": "unit", "value": "percent"}, {"id": "color", "value": {"fixedColor": "#00E5FF", "mode": "fixed"}}, {"id": "custom.lineWidth", "value": 2.5} ] }, { "matcher": {"id": "byName", "options": "Outdoor Humidity"}, "properties": [ {"id": "custom.axisPlacement", "value": "right"}, {"id": "unit", "value": "percent"}, {"id": "color", "value": {"fixedColor": "#448AFF", "mode": "fixed"}}, {"id": "custom.lineWidth", "value": 1} ] }, { "matcher": {"id": "byName", "options": "Target Setpoint"}, "properties": [ {"id": "custom.axisPlacement", "value": "right"}, {"id": "unit", "value": "percent"}, {"id": "color", "value": {"fixedColor": "#E040FB", "mode": "fixed"}}, {"id": "custom.lineStyle", "value": {"fill": "dash", "dash": [6, 4]}}, {"id": "custom.lineWidth", "value": 1.5} ] }, { "matcher": {"id": "byName", "options": "Mold Threshold"}, "properties": [ {"id": "custom.axisPlacement", "value": "right"}, {"id": "unit", "value": "percent"}, {"id": "color", "value": {"fixedColor": "#FF1744", "mode": "fixed"}}, {"id": "custom.lineStyle", "value": {"fill": "dash", "dash": [10, 5]}}, {"id": "custom.lineWidth", "value": 1.5} ] } ] }, "options": { "legend": {"displayMode": "table", "placement": "bottom", "calcs": ["lastNotNull", "min", "max", "mean"]}, "tooltip": {"mode": "multi", "sort": "desc"} }, "targets": [ {"expr": "taupi_relay_status", "legendFormat": "Fan Active", "refId": "A"}, {"expr": "taupi_temperature_celsius_innen", "legendFormat": "Indoor Temp", "refId": "B"}, {"expr": "taupi_temperature_celsius_aussen", "legendFormat": "Outdoor Temp", "refId": "C"}, {"expr": "taupi_dewpoint_celsius_innen", "legendFormat": "Indoor Dewpoint", "refId": "D"}, {"expr": "taupi_dewpoint_celsius_aussen", "legendFormat": "Outdoor Dewpoint", "refId": "E"}, {"expr": "taupi_humidity_percent_innen", "legendFormat": "Indoor Humidity", "refId": "F"}, {"expr": "taupi_humidity_percent_aussen", "legendFormat": "Outdoor Humidity", "refId": "G"}, {"expr": "taupi_target_humidity_percent", "legendFormat": "Target Setpoint", "refId": "H"}, {"expr": "taupi_critical_humidity_threshold_percent", "legendFormat": "Mold Threshold", "refId": "I"} ] }, { "title": "💧 Psychrometric Deltas & Safety Gates", "type": "row", "gridPos": {"h": 1, "w": 24, "x": 0, "y": 32}, "collapsed": false }, { "id": 9, "title": "💧 Dew Point Spread (Indoor − Outdoor) — Physical Drying Potential", "description": "Calculates physical moisture removal capacity. When Spread > 2.0°C (Green zone), outside air is dry enough to absorb moisture from the cellar.", "type": "timeseries", "datasource": {"type": "prometheus", "uid": "${datasource}"}, "gridPos": {"h": 8, "w": 12, "x": 0, "y": 33}, "fieldConfig": { "defaults": { "unit": "celsius", "custom": { "lineWidth": 2, "fillOpacity": 15, "spanNulls": true, "showPoints": "never", "gradientMode": "scheme", "thresholdsStyle": {"mode": "area"} }, "thresholds": { "mode": "absolute", "steps": [ {"color": "#F44336", "value": null}, {"color": "#FFC107", "value": 0}, {"color": "#4CAF50", "value": 2.0} ] } } }, "options": { "legend": {"displayMode": "table", "placement": "bottom", "calcs": ["min", "max", "mean", "lastNotNull"]}, "tooltip": {"mode": "multi", "sort": "desc"} }, "targets": [ {"expr": "taupi_dewpoint_spread_celsius", "legendFormat": "Dewpoint Spread (In − Out)", "refId": "A"} ] }, { "id": 10, "title": "🌡️ Temperature Delta (Indoor − Outdoor) & Heating Prevention", "description": "Positive = cellar warmer than outside. Summer heating rule: Fan blocked if Outdoor Temp > 20°C (or > Indoor Temp).", "type": "timeseries", "datasource": {"type": "prometheus", "uid": "${datasource}"}, "gridPos": {"h": 8, "w": 12, "x": 12, "y": 33}, "fieldConfig": { "defaults": { "unit": "celsius", "custom": { "lineWidth": 2, "fillOpacity": 10, "spanNulls": true, "showPoints": "never", "gradientMode": "scheme", "thresholdsStyle": {"mode": "area"} }, "thresholds": { "mode": "absolute", "steps": [ {"color": "#2196F3", "value": null}, {"color": "#4CAF50", "value": 0}, {"color": "#FF9800", "value": 5} ] } } }, "options": { "legend": {"displayMode": "table", "placement": "bottom", "calcs": ["min", "max", "mean", "lastNotNull"]}, "tooltip": {"mode": "multi", "sort": "desc"} }, "targets": [ {"expr": "taupi_temperature_celsius_innen - taupi_temperature_celsius_aussen", "legendFormat": "Temp Delta (In − Out)", "refId": "A"} ] }, { "title": "🔋 Hardware Diagnostics & Safety Timers", "type": "row", "gridPos": {"h": 1, "w": 24, "x": 0, "y": 41}, "collapsed": false }, { "id": 11, "title": "🔋 BLU Sensor Batteries", "type": "gauge", "datasource": {"type": "prometheus", "uid": "${datasource}"}, "gridPos": {"h": 7, "w": 12, "x": 0, "y": 42}, "fieldConfig": { "defaults": { "unit": "percent", "min": 0, "max": 100, "thresholds": { "mode": "absolute", "steps": [ {"color": "red", "value": null}, {"color": "orange", "value": 20}, {"color": "green", "value": 50} ] } } }, "options": { "reduceOptions": {"values": false, "calcs": ["lastNotNull"]}, "showThresholdLabels": false, "showThresholdMarkers": true }, "targets": [ {"expr": "taupi_battery_percent_innen", "legendFormat": "Indoor Sensor Battery", "refId": "A"}, {"expr": "taupi_battery_percent_aussen", "legendFormat": "Outdoor Sensor Battery", "refId": "B"} ] }, { "id": 12, "title": "⏱️ Duty Cycle & Staleness Timers", "type": "timeseries", "datasource": {"type": "prometheus", "uid": "${datasource}"}, "gridPos": {"h": 7, "w": 12, "x": 12, "y": 42}, "fieldConfig": { "defaults": { "unit": "s", "custom": { "lineWidth": 2, "fillOpacity": 5, "spanNulls": true, "showPoints": "never" } }, "overrides": [ { "matcher": {"id": "byName", "options": "Fan Running Time"}, "properties": [ {"id": "color", "value": {"fixedColor": "#FF9800", "mode": "fixed"}}, {"id": "custom.lineWidth", "value": 2} ] }, { "matcher": {"id": "byName", "options": "Cooldown Pause Remaining"}, "properties": [ {"id": "color", "value": {"fixedColor": "#AB47BC", "mode": "fixed"}}, {"id": "custom.lineWidth", "value": 2} ] } ] }, "options": { "legend": {"displayMode": "table", "placement": "bottom", "calcs": ["lastNotNull", "max"]}, "tooltip": {"mode": "multi", "sort": "desc"} }, "targets": [ {"expr": "taupi_fan_running_seconds", "legendFormat": "Fan Running Time", "refId": "A"}, {"expr": "taupi_fan_pause_remaining_seconds", "legendFormat": "Cooldown Pause Remaining", "refId": "B"}, {"expr": "taupi_lost_connection_seconds_innen", "legendFormat": "Indoor Signal Age", "refId": "C"}, {"expr": "taupi_lost_connection_seconds_aussen", "legendFormat": "Outdoor Signal Age", "refId": "D"} ] } ] }