monitoring: render ups/climate/fan panels as row tables

This commit is contained in:
Brad Stein 2026-04-12 19:46:39 -03:00
parent 3271369e2d
commit ac71b4621c
5 changed files with 623 additions and 1193 deletions

View File

@ -594,6 +594,47 @@ CLIMATE_FAN_OUTSIDE_INLET_SERIES = (
CLIMATE_FAN_INTERIOR_SERIES = (
f'max without ({CLIMATE_DEDUP_LABELS}) (typhon_fan_speed_level{{fan_group=~"interior|unknown"}})'
)
def with_metric_label(expr, metric):
return f'label_replace(({expr}), "metric", "{metric}", "__name__", ".*")'
def with_ups_metric_labels(expr, ups, metric):
return (
f'label_replace('
f'label_replace(({expr}), "ups", "{ups}", "__name__", ".*"), '
f'"metric", "{metric}", "__name__", ".*"'
f')'
)
CLIMATE_CURRENT_ROW_EXPR = " or ".join(
[
with_metric_label(CLIMATE_TEMP_MAX, "Temp °C"),
with_metric_label(CLIMATE_TEMP_FAHRENHEIT_MAX, "Temp °F"),
with_metric_label(CLIMATE_HUMIDITY_MAX, "Humidity"),
with_metric_label(CLIMATE_PRESSURE_CURRENT, "Pressure"),
]
)
CLIMATE_FAN_CURRENT_ROW_EXPR = " or ".join(
[
with_metric_label(f"round({CLIMATE_FAN_OUTLET_CURRENT})", "Outlet"),
with_metric_label(f"round({CLIMATE_FAN_INSIDE_INLET_CURRENT})", "Inlet In"),
with_metric_label(f"round({CLIMATE_FAN_OUTSIDE_INLET_CURRENT})", "Inlet Out"),
with_metric_label(f"round({CLIMATE_FAN_INTERIOR_CURRENT})", "Interior"),
]
)
UPS_CURRENT_ROW_EXPR = " or ".join(
[
with_ups_metric_labels(ANANKE_UPS_DRAW_WATTS_DB, ANANKE_UPS_DB_NAME, "Draw (W)"),
with_ups_metric_labels(ANANKE_UPS_RUNTIME_DB, ANANKE_UPS_DB_NAME, "Discharge"),
with_ups_metric_labels(ANANKE_UPS_ON_BATTERY_DB, ANANKE_UPS_DB_NAME, "Status"),
with_ups_metric_labels(ANANKE_UPS_DRAW_WATTS_TETHYS, ANANKE_UPS_TETHYS_NAME, "Draw (W)"),
with_ups_metric_labels(ANANKE_UPS_RUNTIME_TETHYS, ANANKE_UPS_TETHYS_NAME, "Discharge"),
with_ups_metric_labels(ANANKE_UPS_ON_BATTERY_TETHYS, ANANKE_UPS_TETHYS_NAME, "Status"),
]
)
POSTGRES_CONN_USED = (
'label_replace(sum(pg_stat_activity_count), "conn", "used", "__name__", ".*") '
'or label_replace(max(pg_settings_max_connections), "conn", "max", "__name__", ".*")'
@ -861,6 +902,10 @@ def table_panel(
filterable=True,
footer=None,
format=None,
targets=None,
field_overrides=None,
links=None,
description=None,
):
"""Return a Grafana table panel definition."""
# Optional PromQL subquery helpers in expr: share(), etc.
@ -870,21 +915,29 @@ def table_panel(
if footer is not None:
panel_options["footer"] = footer
field_defaults = {"unit": unit, "custom": {"filterable": filterable}}
target = {"expr": expr, "refId": "A", **({"instant": True} if instant else {})}
target_list = targets if targets is not None else [{"expr": expr, "refId": "A"}]
if instant:
for target in target_list:
target.setdefault("instant", True)
if format:
target["format"] = format
for target in target_list:
target.setdefault("format", format)
panel = {
"id": panel_id,
"type": "table",
"title": title,
"datasource": PROM_DS,
"gridPos": grid,
"targets": [target],
"fieldConfig": {"defaults": field_defaults, "overrides": []},
"targets": target_list,
"fieldConfig": {"defaults": field_defaults, "overrides": field_overrides or []},
"options": panel_options,
}
if transformations:
panel["transformations"] = transformations
if links:
panel["links"] = links
if description:
panel["description"] = description
return panel
@ -1344,54 +1397,23 @@ def build_overview():
]
panels.append(
stat_panel(
table_panel(
40,
"UPS Current Load",
None,
UPS_CURRENT_ROW_EXPR,
{"h": 5, "w": 6, "x": 0, "y": 7},
unit="none",
decimals=1,
text_mode="name_and_value",
targets=[
{"refId": "A", "expr": ANANKE_UPS_DRAW_WATTS_DB, "legendFormat": f"{ANANKE_UPS_DB_NAME} Draw (W)", "instant": True},
{"refId": "B", "expr": ANANKE_UPS_RUNTIME_DB, "legendFormat": f"{ANANKE_UPS_DB_NAME} Discharge", "instant": True},
{"refId": "C", "expr": ANANKE_UPS_ON_BATTERY_DB, "legendFormat": f"{ANANKE_UPS_DB_NAME} Status", "instant": True},
{"refId": "D", "expr": ANANKE_UPS_DRAW_WATTS_TETHYS, "legendFormat": f"{ANANKE_UPS_TETHYS_NAME} Draw (W)", "instant": True},
{"refId": "E", "expr": ANANKE_UPS_RUNTIME_TETHYS, "legendFormat": f"{ANANKE_UPS_TETHYS_NAME} Discharge", "instant": True},
{"refId": "F", "expr": ANANKE_UPS_ON_BATTERY_TETHYS, "legendFormat": f"{ANANKE_UPS_TETHYS_NAME} Status", "instant": True},
instant=True,
transformations=[
{"id": "labelsToFields", "options": {"mode": "columns", "valueLabel": "metric"}},
{"id": "organize", "options": {"excludeByName": {"Time": True}}},
],
field_overrides=[
{
"matcher": {"id": "byName", "options": f"{ANANKE_UPS_DB_NAME} Draw (W)"},
"properties": [{"id": "unit", "value": "watt"}, {"id": "description", "value": f"Attached node: {ANANKE_UPS_DB_NODE}"}],
},
{
"matcher": {"id": "byName", "options": f"{ANANKE_UPS_TETHYS_NAME} Draw (W)"},
"properties": [{"id": "unit", "value": "watt"}, {"id": "description", "value": f"Attached node: {ANANKE_UPS_TETHYS_NODE}"}],
},
{
"matcher": {"id": "byName", "options": f"{ANANKE_UPS_DB_NAME} Discharge"},
"properties": [{"id": "unit", "value": "s"}, {"id": "description", "value": f"Attached node: {ANANKE_UPS_DB_NODE}"}],
},
{
"matcher": {"id": "byName", "options": f"{ANANKE_UPS_TETHYS_NAME} Discharge"},
"properties": [{"id": "unit", "value": "s"}, {"id": "description", "value": f"Attached node: {ANANKE_UPS_TETHYS_NODE}"}],
},
{
"matcher": {"id": "byName", "options": f"{ANANKE_UPS_DB_NAME} Status"},
"properties": [{"id": "mappings", "value": status_mapping}, {"id": "description", "value": f"Attached node: {ANANKE_UPS_DB_NODE}"}],
},
{
"matcher": {"id": "byName", "options": f"{ANANKE_UPS_TETHYS_NAME} Status"},
"properties": [{"id": "mappings", "value": status_mapping}, {"id": "description", "value": f"Attached node: {ANANKE_UPS_TETHYS_NODE}"}],
},
{"matcher": {"id": "byName", "options": "Draw (W)"}, "properties": [{"id": "unit", "value": "watt"}]},
{"matcher": {"id": "byName", "options": "Discharge"}, "properties": [{"id": "unit", "value": "s"}]},
{"matcher": {"id": "byName", "options": "Status"}, "properties": [{"id": "mappings", "value": status_mapping}]},
],
links=link_to("atlas-power"),
description="Per-UPS live snapshot: current draw, discharge, and charging/discharging status.",
orientation="horizontal",
wide_layout=False,
graph_mode="none",
justify_mode="auto",
description="Per-UPS two-row snapshot: draw (W), discharge runtime, and status.",
)
)
panels.append(
@ -1412,19 +1434,15 @@ def build_overview():
)
)
panels.append(
stat_panel(
table_panel(
42,
"Current Climate",
None,
CLIMATE_CURRENT_ROW_EXPR,
{"h": 6, "w": 6, "x": 0, "y": 12},
unit="none",
decimals=2,
text_mode="name_and_value",
targets=[
{"refId": "A", "expr": CLIMATE_TEMP_MAX, "legendFormat": "Temp °C", "instant": True},
{"refId": "B", "expr": CLIMATE_TEMP_FAHRENHEIT_MAX, "legendFormat": "Temp °F", "instant": True},
{"refId": "C", "expr": CLIMATE_HUMIDITY_MAX, "legendFormat": "Humidity", "instant": True},
{"refId": "D", "expr": CLIMATE_PRESSURE_CURRENT, "legendFormat": "Pressure", "instant": True},
instant=True,
transformations=[
{"id": "labelsToFields", "options": {"mode": "columns", "valueLabel": "metric"}},
{"id": "organize", "options": {"excludeByName": {"Time": True}}},
],
field_overrides=[
{"matcher": {"id": "byName", "options": "Temp °C"}, "properties": [{"id": "unit", "value": "celsius"}]},
@ -1433,11 +1451,7 @@ def build_overview():
{"matcher": {"id": "byName", "options": "Pressure"}, "properties": [{"id": "unit", "value": "suffix:kPa"}]},
],
links=link_to("atlas-power"),
description="Current tent values on one row: temperature (C/F), humidity (RH), and pressure proxy (VPD).",
orientation="horizontal",
wide_layout=False,
graph_mode="none",
justify_mode="auto",
description="Single-row climate snapshot: Temp °C, Temp °F, Humidity, Pressure.",
)
)
panels.append(
@ -1476,33 +1490,24 @@ def build_overview():
)
)
panels.append(
stat_panel(
table_panel(
140,
"Fan Activity",
None,
CLIMATE_FAN_CURRENT_ROW_EXPR,
{"h": 6, "w": 6, "x": 12, "y": 12},
unit="none",
decimals=0,
text_mode="name_and_value",
targets=[
{"refId": "A", "expr": f"round({CLIMATE_FAN_OUTLET_CURRENT})", "legendFormat": "Outlet", "instant": True},
{"refId": "B", "expr": f"round({CLIMATE_FAN_INSIDE_INLET_CURRENT})", "legendFormat": "Inlet In", "instant": True},
{"refId": "C", "expr": f"round({CLIMATE_FAN_OUTSIDE_INLET_CURRENT})", "legendFormat": "Inlet Out", "instant": True},
{"refId": "D", "expr": f"round({CLIMATE_FAN_INTERIOR_CURRENT})", "legendFormat": "Interior", "instant": True},
instant=True,
transformations=[
{"id": "labelsToFields", "options": {"mode": "columns", "valueLabel": "metric"}},
{"id": "organize", "options": {"excludeByName": {"Time": True}}},
],
field_overrides=[
{"matcher": {"id": "byName", "options": "Outlet"}, "properties": [{"id": "decimals", "value": 0}]},
{"matcher": {"id": "byName", "options": "Inlet In"}, "properties": [{"id": "decimals", "value": 0}]},
{"matcher": {"id": "byName", "options": "Inlet Out"}, "properties": [{"id": "decimals", "value": 0}]},
{"matcher": {"id": "byName", "options": "Interior"}, "properties": [{"id": "decimals", "value": 0}]},
],
thresholds={
"mode": "absolute",
"steps": [
{"color": "green", "value": None},
{"color": "yellow", "value": 7},
{"color": "red", "value": 9},
],
},
links=link_to("atlas-power"),
orientation="horizontal",
wide_layout=False,
graph_mode="none",
justify_mode="auto",
description="Single-row fan snapshot: outlet, inlet in, inlet out, interior (0-10).",
)
)
panels.append(
@ -3248,54 +3253,23 @@ def build_power_dashboard():
]
panels.append(
stat_panel(
table_panel(
1,
"UPS Current Load",
None,
UPS_CURRENT_ROW_EXPR,
{"h": 8, "w": 12, "x": 0, "y": 0},
unit="none",
decimals=1,
text_mode="name_and_value",
targets=[
{"refId": "A", "expr": ANANKE_UPS_DRAW_WATTS_DB, "legendFormat": f"{ANANKE_UPS_DB_NAME} Draw (W)", "instant": True},
{"refId": "B", "expr": ANANKE_UPS_RUNTIME_DB, "legendFormat": f"{ANANKE_UPS_DB_NAME} Discharge", "instant": True},
{"refId": "C", "expr": ANANKE_UPS_ON_BATTERY_DB, "legendFormat": f"{ANANKE_UPS_DB_NAME} Status", "instant": True},
{"refId": "D", "expr": ANANKE_UPS_DRAW_WATTS_TETHYS, "legendFormat": f"{ANANKE_UPS_TETHYS_NAME} Draw (W)", "instant": True},
{"refId": "E", "expr": ANANKE_UPS_RUNTIME_TETHYS, "legendFormat": f"{ANANKE_UPS_TETHYS_NAME} Discharge", "instant": True},
{"refId": "F", "expr": ANANKE_UPS_ON_BATTERY_TETHYS, "legendFormat": f"{ANANKE_UPS_TETHYS_NAME} Status", "instant": True},
instant=True,
transformations=[
{"id": "labelsToFields", "options": {"mode": "columns", "valueLabel": "metric"}},
{"id": "organize", "options": {"excludeByName": {"Time": True}}},
],
field_overrides=[
{
"matcher": {"id": "byName", "options": f"{ANANKE_UPS_DB_NAME} Draw (W)"},
"properties": [{"id": "unit", "value": "watt"}, {"id": "description", "value": f"Attached node: {ANANKE_UPS_DB_NODE}"}],
},
{
"matcher": {"id": "byName", "options": f"{ANANKE_UPS_TETHYS_NAME} Draw (W)"},
"properties": [{"id": "unit", "value": "watt"}, {"id": "description", "value": f"Attached node: {ANANKE_UPS_TETHYS_NODE}"}],
},
{
"matcher": {"id": "byName", "options": f"{ANANKE_UPS_DB_NAME} Discharge"},
"properties": [{"id": "unit", "value": "s"}, {"id": "description", "value": f"Attached node: {ANANKE_UPS_DB_NODE}"}],
},
{
"matcher": {"id": "byName", "options": f"{ANANKE_UPS_TETHYS_NAME} Discharge"},
"properties": [{"id": "unit", "value": "s"}, {"id": "description", "value": f"Attached node: {ANANKE_UPS_TETHYS_NODE}"}],
},
{
"matcher": {"id": "byName", "options": f"{ANANKE_UPS_DB_NAME} Status"},
"properties": [{"id": "mappings", "value": status_mapping}, {"id": "description", "value": f"Attached node: {ANANKE_UPS_DB_NODE}"}],
},
{
"matcher": {"id": "byName", "options": f"{ANANKE_UPS_TETHYS_NAME} Status"},
"properties": [{"id": "mappings", "value": status_mapping}, {"id": "description", "value": f"Attached node: {ANANKE_UPS_TETHYS_NODE}"}],
},
{"matcher": {"id": "byName", "options": "Draw (W)"}, "properties": [{"id": "unit", "value": "watt"}]},
{"matcher": {"id": "byName", "options": "Discharge"}, "properties": [{"id": "unit", "value": "s"}]},
{"matcher": {"id": "byName", "options": "Status"}, "properties": [{"id": "mappings", "value": status_mapping}]},
],
orientation="horizontal",
wide_layout=False,
graph_mode="none",
justify_mode="auto",
description=(
"Per-UPS live snapshot: current draw in watts, estimated battery runtime if discharge started now, and charging/discharging status."
"Per-UPS two-row snapshot: draw (W), discharge runtime, and charging/discharging status."
),
)
)
@ -3317,31 +3291,23 @@ def build_power_dashboard():
)
)
panels.append(
stat_panel(
table_panel(
3,
"Current Climate",
None,
CLIMATE_CURRENT_ROW_EXPR,
{"h": 8, "w": 12, "x": 0, "y": 8},
unit="none",
decimals=2,
text_mode="name_and_value",
targets=[
{"refId": "A", "expr": CLIMATE_TEMP_MAX, "legendFormat": "Tent Temp (°C)", "instant": True},
{"refId": "B", "expr": CLIMATE_TEMP_FAHRENHEIT_MAX, "legendFormat": "Tent Temp (°F)", "instant": True},
{"refId": "C", "expr": CLIMATE_HUMIDITY_MAX, "legendFormat": "Tent RH (%)", "instant": True},
{"refId": "D", "expr": CLIMATE_PRESSURE_CURRENT, "legendFormat": "Tent Pressure (VPD kPa)", "instant": True},
instant=True,
transformations=[
{"id": "labelsToFields", "options": {"mode": "columns", "valueLabel": "metric"}},
{"id": "organize", "options": {"excludeByName": {"Time": True}}},
],
field_overrides=[
{"matcher": {"id": "byName", "options": "Tent Temp (°C)"}, "properties": [{"id": "unit", "value": "celsius"}]},
{"matcher": {"id": "byName", "options": "Tent Temp (°F)"}, "properties": [{"id": "unit", "value": "fahrenheit"}]},
{"matcher": {"id": "byName", "options": "Tent RH (%)"}, "properties": [{"id": "unit", "value": "percent"}]},
{"matcher": {"id": "byName", "options": "Tent Pressure (VPD kPa)"}, "properties": [{"id": "unit", "value": "suffix:kPa"}]},
{"matcher": {"id": "byName", "options": "Temp °C"}, "properties": [{"id": "unit", "value": "celsius"}]},
{"matcher": {"id": "byName", "options": "Temp °F"}, "properties": [{"id": "unit", "value": "fahrenheit"}]},
{"matcher": {"id": "byName", "options": "Humidity"}, "properties": [{"id": "unit", "value": "percent"}]},
{"matcher": {"id": "byName", "options": "Pressure"}, "properties": [{"id": "unit", "value": "suffix:kPa"}]},
],
orientation="horizontal",
wide_layout=False,
graph_mode="none",
justify_mode="auto",
description="Current tent temperature in C/F, humidity, and pressure proxy (VPD kPa).",
description="Single-row climate snapshot: Temp °C, Temp °F, Humidity, Pressure.",
)
)
panels.append(
@ -3386,33 +3352,23 @@ def build_power_dashboard():
)
)
panels.append(
stat_panel(
table_panel(
5,
"Fan Activity",
None,
CLIMATE_FAN_CURRENT_ROW_EXPR,
{"h": 8, "w": 12, "x": 0, "y": 16},
unit="none",
decimals=0,
text_mode="name_and_value",
targets=[
{"refId": "A", "expr": f"round({CLIMATE_FAN_OUTLET_CURRENT})", "legendFormat": "Inside Outlet", "instant": True},
{"refId": "B", "expr": f"round({CLIMATE_FAN_INSIDE_INLET_CURRENT})", "legendFormat": "Inside Inlet", "instant": True},
{"refId": "C", "expr": f"round({CLIMATE_FAN_OUTSIDE_INLET_CURRENT})", "legendFormat": "Outside Inlet", "instant": True},
{"refId": "D", "expr": f"round({CLIMATE_FAN_INTERIOR_CURRENT})", "legendFormat": "Interior Fans", "instant": True},
instant=True,
transformations=[
{"id": "labelsToFields", "options": {"mode": "columns", "valueLabel": "metric"}},
{"id": "organize", "options": {"excludeByName": {"Time": True}}},
],
thresholds={
"mode": "absolute",
"steps": [
{"color": "green", "value": None},
{"color": "yellow", "value": 7},
{"color": "red", "value": 9},
],
},
orientation="horizontal",
wide_layout=False,
graph_mode="none",
justify_mode="auto",
description="Current fan activity levels (0-10): inside outlet, inside inlet, outside inlet, and interior fans.",
field_overrides=[
{"matcher": {"id": "byName", "options": "Outlet"}, "properties": [{"id": "decimals", "value": 0}]},
{"matcher": {"id": "byName", "options": "Inlet In"}, "properties": [{"id": "decimals", "value": 0}]},
{"matcher": {"id": "byName", "options": "Inlet Out"}, "properties": [{"id": "decimals", "value": 0}]},
{"matcher": {"id": "byName", "options": "Interior"}, "properties": [{"id": "decimals", "value": 0}]},
],
description="Single-row fan snapshot: outlet, inlet in, inlet out, interior (0-10).",
)
)
panels.append(

View File

@ -1072,7 +1072,7 @@
},
{
"id": 40,
"type": "stat",
"type": "table",
"title": "UPS Current Load",
"datasource": {
"type": "prometheus",
@ -1086,136 +1086,47 @@
},
"targets": [
{
"expr": "label_replace(label_replace((max((ananke_ups_load_percent{job=\"ananke-power\",source=\"Pyrphoros\"} * ananke_ups_power_nominal_watts{job=\"ananke-power\",source=\"Pyrphoros\"}) / 100) or on() vector(0)), \"ups\", \"Pyrphoros\", \"__name__\", \".*\"), \"metric\", \"Draw (W)\", \"__name__\", \".*\") or label_replace(label_replace((max(ananke_ups_runtime_seconds{job=\"ananke-power\",source=\"Pyrphoros\"}) or on() vector(0)), \"ups\", \"Pyrphoros\", \"__name__\", \".*\"), \"metric\", \"Discharge\", \"__name__\", \".*\") or label_replace(label_replace((max(ananke_ups_on_battery{job=\"ananke-power\",source=\"Pyrphoros\"}) or on() vector(0)), \"ups\", \"Pyrphoros\", \"__name__\", \".*\"), \"metric\", \"Status\", \"__name__\", \".*\") or label_replace(label_replace((max((ananke_ups_load_percent{job=\"ananke-power\",source=\"Statera\"} * ananke_ups_power_nominal_watts{job=\"ananke-power\",source=\"Statera\"}) / 100) or on() vector(0)), \"ups\", \"Statera\", \"__name__\", \".*\"), \"metric\", \"Draw (W)\", \"__name__\", \".*\") or label_replace(label_replace((max(ananke_ups_runtime_seconds{job=\"ananke-power\",source=\"Statera\"}) or on() vector(0)), \"ups\", \"Statera\", \"__name__\", \".*\"), \"metric\", \"Discharge\", \"__name__\", \".*\") or label_replace(label_replace((max(ananke_ups_on_battery{job=\"ananke-power\",source=\"Statera\"}) or on() vector(0)), \"ups\", \"Statera\", \"__name__\", \".*\"), \"metric\", \"Status\", \"__name__\", \".*\")",
"refId": "A",
"expr": "max((ananke_ups_load_percent{job=\"ananke-power\",source=\"Pyrphoros\"} * ananke_ups_power_nominal_watts{job=\"ananke-power\",source=\"Pyrphoros\"}) / 100) or on() vector(0)",
"legendFormat": "Pyrphoros Draw (W)",
"instant": true
},
{
"refId": "B",
"expr": "max(ananke_ups_runtime_seconds{job=\"ananke-power\",source=\"Pyrphoros\"}) or on() vector(0)",
"legendFormat": "Pyrphoros Discharge",
"instant": true
},
{
"refId": "C",
"expr": "max(ananke_ups_on_battery{job=\"ananke-power\",source=\"Pyrphoros\"}) or on() vector(0)",
"legendFormat": "Pyrphoros Status",
"instant": true
},
{
"refId": "D",
"expr": "max((ananke_ups_load_percent{job=\"ananke-power\",source=\"Statera\"} * ananke_ups_power_nominal_watts{job=\"ananke-power\",source=\"Statera\"}) / 100) or on() vector(0)",
"legendFormat": "Statera Draw (W)",
"instant": true
},
{
"refId": "E",
"expr": "max(ananke_ups_runtime_seconds{job=\"ananke-power\",source=\"Statera\"}) or on() vector(0)",
"legendFormat": "Statera Discharge",
"instant": true
},
{
"refId": "F",
"expr": "max(ananke_ups_on_battery{job=\"ananke-power\",source=\"Statera\"}) or on() vector(0)",
"legendFormat": "Statera Status",
"instant": true
}
],
"fieldConfig": {
"defaults": {
"color": {
"mode": "thresholds"
},
"mappings": [],
"thresholds": {
"mode": "absolute",
"steps": [
{
"color": "rgba(115, 115, 115, 1)",
"value": null
},
{
"color": "green",
"value": 1
}
]
},
"unit": "none",
"custom": {
"displayMode": "auto"
},
"decimals": 1
"filterable": true
}
},
"overrides": [
{
"matcher": {
"id": "byName",
"options": "Pyrphoros Draw (W)"
"options": "Draw (W)"
},
"properties": [
{
"id": "unit",
"value": "watt"
},
{
"id": "description",
"value": "Attached node: titan-db"
}
]
},
{
"matcher": {
"id": "byName",
"options": "Statera Draw (W)"
},
"properties": [
{
"id": "unit",
"value": "watt"
},
{
"id": "description",
"value": "Attached node: titan-24"
}
]
},
{
"matcher": {
"id": "byName",
"options": "Pyrphoros Discharge"
"options": "Discharge"
},
"properties": [
{
"id": "unit",
"value": "s"
},
{
"id": "description",
"value": "Attached node: titan-db"
}
]
},
{
"matcher": {
"id": "byName",
"options": "Statera Discharge"
},
"properties": [
{
"id": "unit",
"value": "s"
},
{
"id": "description",
"value": "Attached node: titan-24"
}
]
},
{
"matcher": {
"id": "byName",
"options": "Pyrphoros Status"
"options": "Status"
},
"properties": [
{
@ -1233,58 +1144,32 @@
}
}
]
},
{
"id": "description",
"value": "Attached node: titan-db"
}
]
},
{
"matcher": {
"id": "byName",
"options": "Statera Status"
},
"properties": [
{
"id": "mappings",
"value": [
{
"type": "value",
"options": {
"0": {
"text": "\u26a1 Charging"
},
"1": {
"text": "\ud83d\udd0b Discharging"
}
}
}
]
},
{
"id": "description",
"value": "Attached node: titan-24"
}
]
}
]
},
"options": {
"colorMode": "value",
"graphMode": "none",
"justifyMode": "auto",
"reduceOptions": {
"calcs": [
"lastNotNull"
],
"fields": "",
"values": false
},
"textMode": "name_and_value",
"orientation": "horizontal",
"wideLayout": false
"showHeader": true,
"columnFilters": false
},
"transformations": [
{
"id": "labelsToFields",
"options": {
"mode": "columns",
"valueLabel": "metric"
}
},
{
"id": "organize",
"options": {
"excludeByName": {
"Time": true
}
}
}
],
"links": [
{
"title": "Open atlas-power dashboard",
@ -1292,7 +1177,7 @@
"targetBlank": true
}
],
"description": "Per-UPS live snapshot: current draw, discharge, and charging/discharging status."
"description": "Per-UPS two-row snapshot: draw (W), discharge runtime, and status."
},
{
"id": 41,
@ -1350,7 +1235,7 @@
},
{
"id": 42,
"type": "stat",
"type": "table",
"title": "Current Climate",
"datasource": {
"type": "prometheus",
@ -1364,54 +1249,17 @@
},
"targets": [
{
"expr": "label_replace((max(max without (job,instance,pod,service,endpoint,namespace) (typhon_temperature_celsius)) or on() vector(0)), \"metric\", \"Temp \u00b0C\", \"__name__\", \".*\") or label_replace((max((max without (job,instance,pod,service,endpoint,namespace) (typhon_temperature_celsius)) * 9 / 5 + 32) or on() vector(0)), \"metric\", \"Temp \u00b0F\", \"__name__\", \".*\") or label_replace((max(max without (job,instance,pod,service,endpoint,namespace) (typhon_relative_humidity_percent)) or on() vector(0)), \"metric\", \"Humidity\", \"__name__\", \".*\") or label_replace((max(max without (job,instance,pod,service,endpoint,namespace) (typhon_vpd_kpa)) or on() vector(0)), \"metric\", \"Pressure\", \"__name__\", \".*\")",
"refId": "A",
"expr": "max(max without (job,instance,pod,service,endpoint,namespace) (typhon_temperature_celsius)) or on() vector(0)",
"legendFormat": "Temp \u00b0C",
"instant": true
},
{
"refId": "B",
"expr": "max((max without (job,instance,pod,service,endpoint,namespace) (typhon_temperature_celsius)) * 9 / 5 + 32) or on() vector(0)",
"legendFormat": "Temp \u00b0F",
"instant": true
},
{
"refId": "C",
"expr": "max(max without (job,instance,pod,service,endpoint,namespace) (typhon_relative_humidity_percent)) or on() vector(0)",
"legendFormat": "Humidity",
"instant": true
},
{
"refId": "D",
"expr": "max(max without (job,instance,pod,service,endpoint,namespace) (typhon_vpd_kpa)) or on() vector(0)",
"legendFormat": "Pressure",
"instant": true
}
],
"fieldConfig": {
"defaults": {
"color": {
"mode": "thresholds"
},
"mappings": [],
"thresholds": {
"mode": "absolute",
"steps": [
{
"color": "rgba(115, 115, 115, 1)",
"value": null
},
{
"color": "green",
"value": 1
}
]
},
"unit": "none",
"custom": {
"displayMode": "auto"
},
"decimals": 2
"filterable": true
}
},
"overrides": [
{
@ -1465,20 +1313,26 @@
]
},
"options": {
"colorMode": "value",
"graphMode": "none",
"justifyMode": "auto",
"reduceOptions": {
"calcs": [
"lastNotNull"
],
"fields": "",
"values": false
},
"textMode": "name_and_value",
"orientation": "horizontal",
"wideLayout": false
"showHeader": true,
"columnFilters": false
},
"transformations": [
{
"id": "labelsToFields",
"options": {
"mode": "columns",
"valueLabel": "metric"
}
},
{
"id": "organize",
"options": {
"excludeByName": {
"Time": true
}
}
}
],
"links": [
{
"title": "Open atlas-power dashboard",
@ -1486,7 +1340,7 @@
"targetBlank": true
}
],
"description": "Current tent values on one row: temperature (C/F), humidity (RH), and pressure proxy (VPD)."
"description": "Single-row climate snapshot: Temp \u00b0C, Temp \u00b0F, Humidity, Pressure."
},
{
"id": 43,
@ -1582,7 +1436,7 @@
},
{
"id": 140,
"type": "stat",
"type": "table",
"title": "Fan Activity",
"datasource": {
"type": "prometheus",
@ -1596,83 +1450,98 @@
},
"targets": [
{
"expr": "label_replace((round(max(max without (job,instance,pod,service,endpoint,namespace) (typhon_fan_speed_level{fan_group=\"outlet\"})) or on() vector(0))), \"metric\", \"Outlet\", \"__name__\", \".*\") or label_replace((round(max(max without (job,instance,pod,service,endpoint,namespace) (typhon_fan_speed_level{fan_group=\"inside_inlet\"})) or on() vector(0))), \"metric\", \"Inlet In\", \"__name__\", \".*\") or label_replace((round(max(max without (job,instance,pod,service,endpoint,namespace) (typhon_fan_speed_level{fan_group=\"outside_inlet\"})) or on() vector(0))), \"metric\", \"Inlet Out\", \"__name__\", \".*\") or label_replace((round(max(max without (job,instance,pod,service,endpoint,namespace) (typhon_fan_speed_level{fan_group=~\"interior|unknown\"})) or on() vector(0))), \"metric\", \"Interior\", \"__name__\", \".*\")",
"refId": "A",
"expr": "round(max(max without (job,instance,pod,service,endpoint,namespace) (typhon_fan_speed_level{fan_group=\"outlet\"})) or on() vector(0))",
"legendFormat": "Outlet",
"instant": true
},
{
"refId": "B",
"expr": "round(max(max without (job,instance,pod,service,endpoint,namespace) (typhon_fan_speed_level{fan_group=\"inside_inlet\"})) or on() vector(0))",
"legendFormat": "Inlet In",
"instant": true
},
{
"refId": "C",
"expr": "round(max(max without (job,instance,pod,service,endpoint,namespace) (typhon_fan_speed_level{fan_group=\"outside_inlet\"})) or on() vector(0))",
"legendFormat": "Inlet Out",
"instant": true
},
{
"refId": "D",
"expr": "round(max(max without (job,instance,pod,service,endpoint,namespace) (typhon_fan_speed_level{fan_group=~\"interior|unknown\"})) or on() vector(0))",
"legendFormat": "Interior",
"instant": true
}
],
"fieldConfig": {
"defaults": {
"color": {
"mode": "thresholds"
},
"mappings": [],
"thresholds": {
"mode": "absolute",
"steps": [
"unit": "none",
"custom": {
"filterable": true
}
},
"overrides": [
{
"matcher": {
"id": "byName",
"options": "Outlet"
},
"properties": [
{
"color": "green",
"value": null
},
{
"color": "yellow",
"value": 7
},
{
"color": "red",
"value": 9
"id": "decimals",
"value": 0
}
]
},
"unit": "none",
"custom": {
"displayMode": "auto"
{
"matcher": {
"id": "byName",
"options": "Inlet In"
},
"properties": [
{
"id": "decimals",
"value": 0
}
]
},
"decimals": 0
},
"overrides": []
{
"matcher": {
"id": "byName",
"options": "Inlet Out"
},
"properties": [
{
"id": "decimals",
"value": 0
}
]
},
{
"matcher": {
"id": "byName",
"options": "Interior"
},
"properties": [
{
"id": "decimals",
"value": 0
}
]
}
]
},
"options": {
"colorMode": "value",
"graphMode": "none",
"justifyMode": "auto",
"reduceOptions": {
"calcs": [
"lastNotNull"
],
"fields": "",
"values": false
},
"textMode": "name_and_value",
"orientation": "horizontal",
"wideLayout": false
"showHeader": true,
"columnFilters": false
},
"transformations": [
{
"id": "labelsToFields",
"options": {
"mode": "columns",
"valueLabel": "metric"
}
},
{
"id": "organize",
"options": {
"excludeByName": {
"Time": true
}
}
}
],
"links": [
{
"title": "Open atlas-power dashboard",
"url": "/d/atlas-power",
"targetBlank": true
}
]
],
"description": "Single-row fan snapshot: outlet, inlet in, inlet out, interior (0-10)."
},
{
"id": 141,

View File

@ -6,7 +6,7 @@
"panels": [
{
"id": 1,
"type": "stat",
"type": "table",
"title": "UPS Current Load",
"datasource": {
"type": "prometheus",
@ -20,136 +20,47 @@
},
"targets": [
{
"expr": "label_replace(label_replace((max((ananke_ups_load_percent{job=\"ananke-power\",source=\"Pyrphoros\"} * ananke_ups_power_nominal_watts{job=\"ananke-power\",source=\"Pyrphoros\"}) / 100) or on() vector(0)), \"ups\", \"Pyrphoros\", \"__name__\", \".*\"), \"metric\", \"Draw (W)\", \"__name__\", \".*\") or label_replace(label_replace((max(ananke_ups_runtime_seconds{job=\"ananke-power\",source=\"Pyrphoros\"}) or on() vector(0)), \"ups\", \"Pyrphoros\", \"__name__\", \".*\"), \"metric\", \"Discharge\", \"__name__\", \".*\") or label_replace(label_replace((max(ananke_ups_on_battery{job=\"ananke-power\",source=\"Pyrphoros\"}) or on() vector(0)), \"ups\", \"Pyrphoros\", \"__name__\", \".*\"), \"metric\", \"Status\", \"__name__\", \".*\") or label_replace(label_replace((max((ananke_ups_load_percent{job=\"ananke-power\",source=\"Statera\"} * ananke_ups_power_nominal_watts{job=\"ananke-power\",source=\"Statera\"}) / 100) or on() vector(0)), \"ups\", \"Statera\", \"__name__\", \".*\"), \"metric\", \"Draw (W)\", \"__name__\", \".*\") or label_replace(label_replace((max(ananke_ups_runtime_seconds{job=\"ananke-power\",source=\"Statera\"}) or on() vector(0)), \"ups\", \"Statera\", \"__name__\", \".*\"), \"metric\", \"Discharge\", \"__name__\", \".*\") or label_replace(label_replace((max(ananke_ups_on_battery{job=\"ananke-power\",source=\"Statera\"}) or on() vector(0)), \"ups\", \"Statera\", \"__name__\", \".*\"), \"metric\", \"Status\", \"__name__\", \".*\")",
"refId": "A",
"expr": "max((ananke_ups_load_percent{job=\"ananke-power\",source=\"Pyrphoros\"} * ananke_ups_power_nominal_watts{job=\"ananke-power\",source=\"Pyrphoros\"}) / 100) or on() vector(0)",
"legendFormat": "Pyrphoros Draw (W)",
"instant": true
},
{
"refId": "B",
"expr": "max(ananke_ups_runtime_seconds{job=\"ananke-power\",source=\"Pyrphoros\"}) or on() vector(0)",
"legendFormat": "Pyrphoros Discharge",
"instant": true
},
{
"refId": "C",
"expr": "max(ananke_ups_on_battery{job=\"ananke-power\",source=\"Pyrphoros\"}) or on() vector(0)",
"legendFormat": "Pyrphoros Status",
"instant": true
},
{
"refId": "D",
"expr": "max((ananke_ups_load_percent{job=\"ananke-power\",source=\"Statera\"} * ananke_ups_power_nominal_watts{job=\"ananke-power\",source=\"Statera\"}) / 100) or on() vector(0)",
"legendFormat": "Statera Draw (W)",
"instant": true
},
{
"refId": "E",
"expr": "max(ananke_ups_runtime_seconds{job=\"ananke-power\",source=\"Statera\"}) or on() vector(0)",
"legendFormat": "Statera Discharge",
"instant": true
},
{
"refId": "F",
"expr": "max(ananke_ups_on_battery{job=\"ananke-power\",source=\"Statera\"}) or on() vector(0)",
"legendFormat": "Statera Status",
"instant": true
}
],
"fieldConfig": {
"defaults": {
"color": {
"mode": "thresholds"
},
"mappings": [],
"thresholds": {
"mode": "absolute",
"steps": [
{
"color": "rgba(115, 115, 115, 1)",
"value": null
},
{
"color": "green",
"value": 1
}
]
},
"unit": "none",
"custom": {
"displayMode": "auto"
},
"decimals": 1
"filterable": true
}
},
"overrides": [
{
"matcher": {
"id": "byName",
"options": "Pyrphoros Draw (W)"
"options": "Draw (W)"
},
"properties": [
{
"id": "unit",
"value": "watt"
},
{
"id": "description",
"value": "Attached node: titan-db"
}
]
},
{
"matcher": {
"id": "byName",
"options": "Statera Draw (W)"
},
"properties": [
{
"id": "unit",
"value": "watt"
},
{
"id": "description",
"value": "Attached node: titan-24"
}
]
},
{
"matcher": {
"id": "byName",
"options": "Pyrphoros Discharge"
"options": "Discharge"
},
"properties": [
{
"id": "unit",
"value": "s"
},
{
"id": "description",
"value": "Attached node: titan-db"
}
]
},
{
"matcher": {
"id": "byName",
"options": "Statera Discharge"
},
"properties": [
{
"id": "unit",
"value": "s"
},
{
"id": "description",
"value": "Attached node: titan-24"
}
]
},
{
"matcher": {
"id": "byName",
"options": "Pyrphoros Status"
"options": "Status"
},
"properties": [
{
@ -167,59 +78,33 @@
}
}
]
},
{
"id": "description",
"value": "Attached node: titan-db"
}
]
},
{
"matcher": {
"id": "byName",
"options": "Statera Status"
},
"properties": [
{
"id": "mappings",
"value": [
{
"type": "value",
"options": {
"0": {
"text": "\u26a1 Charging"
},
"1": {
"text": "\ud83d\udd0b Discharging"
}
}
}
]
},
{
"id": "description",
"value": "Attached node: titan-24"
}
]
}
]
},
"options": {
"colorMode": "value",
"graphMode": "none",
"justifyMode": "auto",
"reduceOptions": {
"calcs": [
"lastNotNull"
],
"fields": "",
"values": false
},
"textMode": "name_and_value",
"orientation": "horizontal",
"wideLayout": false
"showHeader": true,
"columnFilters": false
},
"description": "Per-UPS live snapshot: current draw in watts, estimated battery runtime if discharge started now, and charging/discharging status."
"transformations": [
{
"id": "labelsToFields",
"options": {
"mode": "columns",
"valueLabel": "metric"
}
},
{
"id": "organize",
"options": {
"excludeByName": {
"Time": true
}
}
}
],
"description": "Per-UPS two-row snapshot: draw (W), discharge runtime, and charging/discharging status."
},
{
"id": 2,
@ -271,7 +156,7 @@
},
{
"id": 3,
"type": "stat",
"type": "table",
"title": "Current Climate",
"datasource": {
"type": "prometheus",
@ -285,60 +170,23 @@
},
"targets": [
{
"expr": "label_replace((max(max without (job,instance,pod,service,endpoint,namespace) (typhon_temperature_celsius)) or on() vector(0)), \"metric\", \"Temp \u00b0C\", \"__name__\", \".*\") or label_replace((max((max without (job,instance,pod,service,endpoint,namespace) (typhon_temperature_celsius)) * 9 / 5 + 32) or on() vector(0)), \"metric\", \"Temp \u00b0F\", \"__name__\", \".*\") or label_replace((max(max without (job,instance,pod,service,endpoint,namespace) (typhon_relative_humidity_percent)) or on() vector(0)), \"metric\", \"Humidity\", \"__name__\", \".*\") or label_replace((max(max without (job,instance,pod,service,endpoint,namespace) (typhon_vpd_kpa)) or on() vector(0)), \"metric\", \"Pressure\", \"__name__\", \".*\")",
"refId": "A",
"expr": "max(max without (job,instance,pod,service,endpoint,namespace) (typhon_temperature_celsius)) or on() vector(0)",
"legendFormat": "Tent Temp (\u00b0C)",
"instant": true
},
{
"refId": "B",
"expr": "max((max without (job,instance,pod,service,endpoint,namespace) (typhon_temperature_celsius)) * 9 / 5 + 32) or on() vector(0)",
"legendFormat": "Tent Temp (\u00b0F)",
"instant": true
},
{
"refId": "C",
"expr": "max(max without (job,instance,pod,service,endpoint,namespace) (typhon_relative_humidity_percent)) or on() vector(0)",
"legendFormat": "Tent RH (%)",
"instant": true
},
{
"refId": "D",
"expr": "max(max without (job,instance,pod,service,endpoint,namespace) (typhon_vpd_kpa)) or on() vector(0)",
"legendFormat": "Tent Pressure (VPD kPa)",
"instant": true
}
],
"fieldConfig": {
"defaults": {
"color": {
"mode": "thresholds"
},
"mappings": [],
"thresholds": {
"mode": "absolute",
"steps": [
{
"color": "rgba(115, 115, 115, 1)",
"value": null
},
{
"color": "green",
"value": 1
}
]
},
"unit": "none",
"custom": {
"displayMode": "auto"
},
"decimals": 2
"filterable": true
}
},
"overrides": [
{
"matcher": {
"id": "byName",
"options": "Tent Temp (\u00b0C)"
"options": "Temp \u00b0C"
},
"properties": [
{
@ -350,7 +198,7 @@
{
"matcher": {
"id": "byName",
"options": "Tent Temp (\u00b0F)"
"options": "Temp \u00b0F"
},
"properties": [
{
@ -362,7 +210,7 @@
{
"matcher": {
"id": "byName",
"options": "Tent RH (%)"
"options": "Humidity"
},
"properties": [
{
@ -374,7 +222,7 @@
{
"matcher": {
"id": "byName",
"options": "Tent Pressure (VPD kPa)"
"options": "Pressure"
},
"properties": [
{
@ -386,21 +234,27 @@
]
},
"options": {
"colorMode": "value",
"graphMode": "none",
"justifyMode": "auto",
"reduceOptions": {
"calcs": [
"lastNotNull"
],
"fields": "",
"values": false
},
"textMode": "name_and_value",
"orientation": "horizontal",
"wideLayout": false
"showHeader": true,
"columnFilters": false
},
"description": "Current tent temperature in C/F, humidity, and pressure proxy (VPD kPa)."
"transformations": [
{
"id": "labelsToFields",
"options": {
"mode": "columns",
"valueLabel": "metric"
}
},
{
"id": "organize",
"options": {
"excludeByName": {
"Time": true
}
}
}
],
"description": "Single-row climate snapshot: Temp \u00b0C, Temp \u00b0F, Humidity, Pressure."
},
{
"id": 4,
@ -506,7 +360,7 @@
},
{
"id": 5,
"type": "stat",
"type": "table",
"title": "Fan Activity",
"datasource": {
"type": "prometheus",
@ -520,77 +374,91 @@
},
"targets": [
{
"expr": "label_replace((round(max(max without (job,instance,pod,service,endpoint,namespace) (typhon_fan_speed_level{fan_group=\"outlet\"})) or on() vector(0))), \"metric\", \"Outlet\", \"__name__\", \".*\") or label_replace((round(max(max without (job,instance,pod,service,endpoint,namespace) (typhon_fan_speed_level{fan_group=\"inside_inlet\"})) or on() vector(0))), \"metric\", \"Inlet In\", \"__name__\", \".*\") or label_replace((round(max(max without (job,instance,pod,service,endpoint,namespace) (typhon_fan_speed_level{fan_group=\"outside_inlet\"})) or on() vector(0))), \"metric\", \"Inlet Out\", \"__name__\", \".*\") or label_replace((round(max(max without (job,instance,pod,service,endpoint,namespace) (typhon_fan_speed_level{fan_group=~\"interior|unknown\"})) or on() vector(0))), \"metric\", \"Interior\", \"__name__\", \".*\")",
"refId": "A",
"expr": "round(max(max without (job,instance,pod,service,endpoint,namespace) (typhon_fan_speed_level{fan_group=\"outlet\"})) or on() vector(0))",
"legendFormat": "Inside Outlet",
"instant": true
},
{
"refId": "B",
"expr": "round(max(max without (job,instance,pod,service,endpoint,namespace) (typhon_fan_speed_level{fan_group=\"inside_inlet\"})) or on() vector(0))",
"legendFormat": "Inside Inlet",
"instant": true
},
{
"refId": "C",
"expr": "round(max(max without (job,instance,pod,service,endpoint,namespace) (typhon_fan_speed_level{fan_group=\"outside_inlet\"})) or on() vector(0))",
"legendFormat": "Outside Inlet",
"instant": true
},
{
"refId": "D",
"expr": "round(max(max without (job,instance,pod,service,endpoint,namespace) (typhon_fan_speed_level{fan_group=~\"interior|unknown\"})) or on() vector(0))",
"legendFormat": "Interior Fans",
"instant": true
}
],
"fieldConfig": {
"defaults": {
"color": {
"mode": "thresholds"
},
"mappings": [],
"thresholds": {
"mode": "absolute",
"steps": [
"unit": "none",
"custom": {
"filterable": true
}
},
"overrides": [
{
"matcher": {
"id": "byName",
"options": "Outlet"
},
"properties": [
{
"color": "green",
"value": null
},
{
"color": "yellow",
"value": 7
},
{
"color": "red",
"value": 9
"id": "decimals",
"value": 0
}
]
},
"unit": "none",
"custom": {
"displayMode": "auto"
{
"matcher": {
"id": "byName",
"options": "Inlet In"
},
"properties": [
{
"id": "decimals",
"value": 0
}
]
},
"decimals": 0
},
"overrides": []
{
"matcher": {
"id": "byName",
"options": "Inlet Out"
},
"properties": [
{
"id": "decimals",
"value": 0
}
]
},
{
"matcher": {
"id": "byName",
"options": "Interior"
},
"properties": [
{
"id": "decimals",
"value": 0
}
]
}
]
},
"options": {
"colorMode": "value",
"graphMode": "none",
"justifyMode": "auto",
"reduceOptions": {
"calcs": [
"lastNotNull"
],
"fields": "",
"values": false
},
"textMode": "name_and_value",
"orientation": "horizontal",
"wideLayout": false
"showHeader": true,
"columnFilters": false
},
"description": "Current fan activity levels (0-10): inside outlet, inside inlet, outside inlet, and interior fans."
"transformations": [
{
"id": "labelsToFields",
"options": {
"mode": "columns",
"valueLabel": "metric"
}
},
{
"id": "organize",
"options": {
"excludeByName": {
"Time": true
}
}
}
],
"description": "Single-row fan snapshot: outlet, inlet in, inlet out, interior (0-10)."
},
{
"id": 6,

View File

@ -1081,7 +1081,7 @@ data:
},
{
"id": 40,
"type": "stat",
"type": "table",
"title": "UPS Current Load",
"datasource": {
"type": "prometheus",
@ -1095,136 +1095,47 @@ data:
},
"targets": [
{
"expr": "label_replace(label_replace((max((ananke_ups_load_percent{job=\"ananke-power\",source=\"Pyrphoros\"} * ananke_ups_power_nominal_watts{job=\"ananke-power\",source=\"Pyrphoros\"}) / 100) or on() vector(0)), \"ups\", \"Pyrphoros\", \"__name__\", \".*\"), \"metric\", \"Draw (W)\", \"__name__\", \".*\") or label_replace(label_replace((max(ananke_ups_runtime_seconds{job=\"ananke-power\",source=\"Pyrphoros\"}) or on() vector(0)), \"ups\", \"Pyrphoros\", \"__name__\", \".*\"), \"metric\", \"Discharge\", \"__name__\", \".*\") or label_replace(label_replace((max(ananke_ups_on_battery{job=\"ananke-power\",source=\"Pyrphoros\"}) or on() vector(0)), \"ups\", \"Pyrphoros\", \"__name__\", \".*\"), \"metric\", \"Status\", \"__name__\", \".*\") or label_replace(label_replace((max((ananke_ups_load_percent{job=\"ananke-power\",source=\"Statera\"} * ananke_ups_power_nominal_watts{job=\"ananke-power\",source=\"Statera\"}) / 100) or on() vector(0)), \"ups\", \"Statera\", \"__name__\", \".*\"), \"metric\", \"Draw (W)\", \"__name__\", \".*\") or label_replace(label_replace((max(ananke_ups_runtime_seconds{job=\"ananke-power\",source=\"Statera\"}) or on() vector(0)), \"ups\", \"Statera\", \"__name__\", \".*\"), \"metric\", \"Discharge\", \"__name__\", \".*\") or label_replace(label_replace((max(ananke_ups_on_battery{job=\"ananke-power\",source=\"Statera\"}) or on() vector(0)), \"ups\", \"Statera\", \"__name__\", \".*\"), \"metric\", \"Status\", \"__name__\", \".*\")",
"refId": "A",
"expr": "max((ananke_ups_load_percent{job=\"ananke-power\",source=\"Pyrphoros\"} * ananke_ups_power_nominal_watts{job=\"ananke-power\",source=\"Pyrphoros\"}) / 100) or on() vector(0)",
"legendFormat": "Pyrphoros Draw (W)",
"instant": true
},
{
"refId": "B",
"expr": "max(ananke_ups_runtime_seconds{job=\"ananke-power\",source=\"Pyrphoros\"}) or on() vector(0)",
"legendFormat": "Pyrphoros Discharge",
"instant": true
},
{
"refId": "C",
"expr": "max(ananke_ups_on_battery{job=\"ananke-power\",source=\"Pyrphoros\"}) or on() vector(0)",
"legendFormat": "Pyrphoros Status",
"instant": true
},
{
"refId": "D",
"expr": "max((ananke_ups_load_percent{job=\"ananke-power\",source=\"Statera\"} * ananke_ups_power_nominal_watts{job=\"ananke-power\",source=\"Statera\"}) / 100) or on() vector(0)",
"legendFormat": "Statera Draw (W)",
"instant": true
},
{
"refId": "E",
"expr": "max(ananke_ups_runtime_seconds{job=\"ananke-power\",source=\"Statera\"}) or on() vector(0)",
"legendFormat": "Statera Discharge",
"instant": true
},
{
"refId": "F",
"expr": "max(ananke_ups_on_battery{job=\"ananke-power\",source=\"Statera\"}) or on() vector(0)",
"legendFormat": "Statera Status",
"instant": true
}
],
"fieldConfig": {
"defaults": {
"color": {
"mode": "thresholds"
},
"mappings": [],
"thresholds": {
"mode": "absolute",
"steps": [
{
"color": "rgba(115, 115, 115, 1)",
"value": null
},
{
"color": "green",
"value": 1
}
]
},
"unit": "none",
"custom": {
"displayMode": "auto"
},
"decimals": 1
"filterable": true
}
},
"overrides": [
{
"matcher": {
"id": "byName",
"options": "Pyrphoros Draw (W)"
"options": "Draw (W)"
},
"properties": [
{
"id": "unit",
"value": "watt"
},
{
"id": "description",
"value": "Attached node: titan-db"
}
]
},
{
"matcher": {
"id": "byName",
"options": "Statera Draw (W)"
},
"properties": [
{
"id": "unit",
"value": "watt"
},
{
"id": "description",
"value": "Attached node: titan-24"
}
]
},
{
"matcher": {
"id": "byName",
"options": "Pyrphoros Discharge"
"options": "Discharge"
},
"properties": [
{
"id": "unit",
"value": "s"
},
{
"id": "description",
"value": "Attached node: titan-db"
}
]
},
{
"matcher": {
"id": "byName",
"options": "Statera Discharge"
},
"properties": [
{
"id": "unit",
"value": "s"
},
{
"id": "description",
"value": "Attached node: titan-24"
}
]
},
{
"matcher": {
"id": "byName",
"options": "Pyrphoros Status"
"options": "Status"
},
"properties": [
{
@ -1242,58 +1153,32 @@ data:
}
}
]
},
{
"id": "description",
"value": "Attached node: titan-db"
}
]
},
{
"matcher": {
"id": "byName",
"options": "Statera Status"
},
"properties": [
{
"id": "mappings",
"value": [
{
"type": "value",
"options": {
"0": {
"text": "\u26a1 Charging"
},
"1": {
"text": "\ud83d\udd0b Discharging"
}
}
}
]
},
{
"id": "description",
"value": "Attached node: titan-24"
}
]
}
]
},
"options": {
"colorMode": "value",
"graphMode": "none",
"justifyMode": "auto",
"reduceOptions": {
"calcs": [
"lastNotNull"
],
"fields": "",
"values": false
},
"textMode": "name_and_value",
"orientation": "horizontal",
"wideLayout": false
"showHeader": true,
"columnFilters": false
},
"transformations": [
{
"id": "labelsToFields",
"options": {
"mode": "columns",
"valueLabel": "metric"
}
},
{
"id": "organize",
"options": {
"excludeByName": {
"Time": true
}
}
}
],
"links": [
{
"title": "Open atlas-power dashboard",
@ -1301,7 +1186,7 @@ data:
"targetBlank": true
}
],
"description": "Per-UPS live snapshot: current draw, discharge, and charging/discharging status."
"description": "Per-UPS two-row snapshot: draw (W), discharge runtime, and status."
},
{
"id": 41,
@ -1359,7 +1244,7 @@ data:
},
{
"id": 42,
"type": "stat",
"type": "table",
"title": "Current Climate",
"datasource": {
"type": "prometheus",
@ -1373,54 +1258,17 @@ data:
},
"targets": [
{
"expr": "label_replace((max(max without (job,instance,pod,service,endpoint,namespace) (typhon_temperature_celsius)) or on() vector(0)), \"metric\", \"Temp \u00b0C\", \"__name__\", \".*\") or label_replace((max((max without (job,instance,pod,service,endpoint,namespace) (typhon_temperature_celsius)) * 9 / 5 + 32) or on() vector(0)), \"metric\", \"Temp \u00b0F\", \"__name__\", \".*\") or label_replace((max(max without (job,instance,pod,service,endpoint,namespace) (typhon_relative_humidity_percent)) or on() vector(0)), \"metric\", \"Humidity\", \"__name__\", \".*\") or label_replace((max(max without (job,instance,pod,service,endpoint,namespace) (typhon_vpd_kpa)) or on() vector(0)), \"metric\", \"Pressure\", \"__name__\", \".*\")",
"refId": "A",
"expr": "max(max without (job,instance,pod,service,endpoint,namespace) (typhon_temperature_celsius)) or on() vector(0)",
"legendFormat": "Temp \u00b0C",
"instant": true
},
{
"refId": "B",
"expr": "max((max without (job,instance,pod,service,endpoint,namespace) (typhon_temperature_celsius)) * 9 / 5 + 32) or on() vector(0)",
"legendFormat": "Temp \u00b0F",
"instant": true
},
{
"refId": "C",
"expr": "max(max without (job,instance,pod,service,endpoint,namespace) (typhon_relative_humidity_percent)) or on() vector(0)",
"legendFormat": "Humidity",
"instant": true
},
{
"refId": "D",
"expr": "max(max without (job,instance,pod,service,endpoint,namespace) (typhon_vpd_kpa)) or on() vector(0)",
"legendFormat": "Pressure",
"instant": true
}
],
"fieldConfig": {
"defaults": {
"color": {
"mode": "thresholds"
},
"mappings": [],
"thresholds": {
"mode": "absolute",
"steps": [
{
"color": "rgba(115, 115, 115, 1)",
"value": null
},
{
"color": "green",
"value": 1
}
]
},
"unit": "none",
"custom": {
"displayMode": "auto"
},
"decimals": 2
"filterable": true
}
},
"overrides": [
{
@ -1474,20 +1322,26 @@ data:
]
},
"options": {
"colorMode": "value",
"graphMode": "none",
"justifyMode": "auto",
"reduceOptions": {
"calcs": [
"lastNotNull"
],
"fields": "",
"values": false
},
"textMode": "name_and_value",
"orientation": "horizontal",
"wideLayout": false
"showHeader": true,
"columnFilters": false
},
"transformations": [
{
"id": "labelsToFields",
"options": {
"mode": "columns",
"valueLabel": "metric"
}
},
{
"id": "organize",
"options": {
"excludeByName": {
"Time": true
}
}
}
],
"links": [
{
"title": "Open atlas-power dashboard",
@ -1495,7 +1349,7 @@ data:
"targetBlank": true
}
],
"description": "Current tent values on one row: temperature (C/F), humidity (RH), and pressure proxy (VPD)."
"description": "Single-row climate snapshot: Temp \u00b0C, Temp \u00b0F, Humidity, Pressure."
},
{
"id": 43,
@ -1591,7 +1445,7 @@ data:
},
{
"id": 140,
"type": "stat",
"type": "table",
"title": "Fan Activity",
"datasource": {
"type": "prometheus",
@ -1605,83 +1459,98 @@ data:
},
"targets": [
{
"expr": "label_replace((round(max(max without (job,instance,pod,service,endpoint,namespace) (typhon_fan_speed_level{fan_group=\"outlet\"})) or on() vector(0))), \"metric\", \"Outlet\", \"__name__\", \".*\") or label_replace((round(max(max without (job,instance,pod,service,endpoint,namespace) (typhon_fan_speed_level{fan_group=\"inside_inlet\"})) or on() vector(0))), \"metric\", \"Inlet In\", \"__name__\", \".*\") or label_replace((round(max(max without (job,instance,pod,service,endpoint,namespace) (typhon_fan_speed_level{fan_group=\"outside_inlet\"})) or on() vector(0))), \"metric\", \"Inlet Out\", \"__name__\", \".*\") or label_replace((round(max(max without (job,instance,pod,service,endpoint,namespace) (typhon_fan_speed_level{fan_group=~\"interior|unknown\"})) or on() vector(0))), \"metric\", \"Interior\", \"__name__\", \".*\")",
"refId": "A",
"expr": "round(max(max without (job,instance,pod,service,endpoint,namespace) (typhon_fan_speed_level{fan_group=\"outlet\"})) or on() vector(0))",
"legendFormat": "Outlet",
"instant": true
},
{
"refId": "B",
"expr": "round(max(max without (job,instance,pod,service,endpoint,namespace) (typhon_fan_speed_level{fan_group=\"inside_inlet\"})) or on() vector(0))",
"legendFormat": "Inlet In",
"instant": true
},
{
"refId": "C",
"expr": "round(max(max without (job,instance,pod,service,endpoint,namespace) (typhon_fan_speed_level{fan_group=\"outside_inlet\"})) or on() vector(0))",
"legendFormat": "Inlet Out",
"instant": true
},
{
"refId": "D",
"expr": "round(max(max without (job,instance,pod,service,endpoint,namespace) (typhon_fan_speed_level{fan_group=~\"interior|unknown\"})) or on() vector(0))",
"legendFormat": "Interior",
"instant": true
}
],
"fieldConfig": {
"defaults": {
"color": {
"mode": "thresholds"
},
"mappings": [],
"thresholds": {
"mode": "absolute",
"steps": [
"unit": "none",
"custom": {
"filterable": true
}
},
"overrides": [
{
"matcher": {
"id": "byName",
"options": "Outlet"
},
"properties": [
{
"color": "green",
"value": null
},
{
"color": "yellow",
"value": 7
},
{
"color": "red",
"value": 9
"id": "decimals",
"value": 0
}
]
},
"unit": "none",
"custom": {
"displayMode": "auto"
{
"matcher": {
"id": "byName",
"options": "Inlet In"
},
"properties": [
{
"id": "decimals",
"value": 0
}
]
},
"decimals": 0
},
"overrides": []
{
"matcher": {
"id": "byName",
"options": "Inlet Out"
},
"properties": [
{
"id": "decimals",
"value": 0
}
]
},
{
"matcher": {
"id": "byName",
"options": "Interior"
},
"properties": [
{
"id": "decimals",
"value": 0
}
]
}
]
},
"options": {
"colorMode": "value",
"graphMode": "none",
"justifyMode": "auto",
"reduceOptions": {
"calcs": [
"lastNotNull"
],
"fields": "",
"values": false
},
"textMode": "name_and_value",
"orientation": "horizontal",
"wideLayout": false
"showHeader": true,
"columnFilters": false
},
"transformations": [
{
"id": "labelsToFields",
"options": {
"mode": "columns",
"valueLabel": "metric"
}
},
{
"id": "organize",
"options": {
"excludeByName": {
"Time": true
}
}
}
],
"links": [
{
"title": "Open atlas-power dashboard",
"url": "/d/atlas-power",
"targetBlank": true
}
]
],
"description": "Single-row fan snapshot: outlet, inlet in, inlet out, interior (0-10)."
},
{
"id": 141,

View File

@ -15,7 +15,7 @@ data:
"panels": [
{
"id": 1,
"type": "stat",
"type": "table",
"title": "UPS Current Load",
"datasource": {
"type": "prometheus",
@ -29,136 +29,47 @@ data:
},
"targets": [
{
"expr": "label_replace(label_replace((max((ananke_ups_load_percent{job=\"ananke-power\",source=\"Pyrphoros\"} * ananke_ups_power_nominal_watts{job=\"ananke-power\",source=\"Pyrphoros\"}) / 100) or on() vector(0)), \"ups\", \"Pyrphoros\", \"__name__\", \".*\"), \"metric\", \"Draw (W)\", \"__name__\", \".*\") or label_replace(label_replace((max(ananke_ups_runtime_seconds{job=\"ananke-power\",source=\"Pyrphoros\"}) or on() vector(0)), \"ups\", \"Pyrphoros\", \"__name__\", \".*\"), \"metric\", \"Discharge\", \"__name__\", \".*\") or label_replace(label_replace((max(ananke_ups_on_battery{job=\"ananke-power\",source=\"Pyrphoros\"}) or on() vector(0)), \"ups\", \"Pyrphoros\", \"__name__\", \".*\"), \"metric\", \"Status\", \"__name__\", \".*\") or label_replace(label_replace((max((ananke_ups_load_percent{job=\"ananke-power\",source=\"Statera\"} * ananke_ups_power_nominal_watts{job=\"ananke-power\",source=\"Statera\"}) / 100) or on() vector(0)), \"ups\", \"Statera\", \"__name__\", \".*\"), \"metric\", \"Draw (W)\", \"__name__\", \".*\") or label_replace(label_replace((max(ananke_ups_runtime_seconds{job=\"ananke-power\",source=\"Statera\"}) or on() vector(0)), \"ups\", \"Statera\", \"__name__\", \".*\"), \"metric\", \"Discharge\", \"__name__\", \".*\") or label_replace(label_replace((max(ananke_ups_on_battery{job=\"ananke-power\",source=\"Statera\"}) or on() vector(0)), \"ups\", \"Statera\", \"__name__\", \".*\"), \"metric\", \"Status\", \"__name__\", \".*\")",
"refId": "A",
"expr": "max((ananke_ups_load_percent{job=\"ananke-power\",source=\"Pyrphoros\"} * ananke_ups_power_nominal_watts{job=\"ananke-power\",source=\"Pyrphoros\"}) / 100) or on() vector(0)",
"legendFormat": "Pyrphoros Draw (W)",
"instant": true
},
{
"refId": "B",
"expr": "max(ananke_ups_runtime_seconds{job=\"ananke-power\",source=\"Pyrphoros\"}) or on() vector(0)",
"legendFormat": "Pyrphoros Discharge",
"instant": true
},
{
"refId": "C",
"expr": "max(ananke_ups_on_battery{job=\"ananke-power\",source=\"Pyrphoros\"}) or on() vector(0)",
"legendFormat": "Pyrphoros Status",
"instant": true
},
{
"refId": "D",
"expr": "max((ananke_ups_load_percent{job=\"ananke-power\",source=\"Statera\"} * ananke_ups_power_nominal_watts{job=\"ananke-power\",source=\"Statera\"}) / 100) or on() vector(0)",
"legendFormat": "Statera Draw (W)",
"instant": true
},
{
"refId": "E",
"expr": "max(ananke_ups_runtime_seconds{job=\"ananke-power\",source=\"Statera\"}) or on() vector(0)",
"legendFormat": "Statera Discharge",
"instant": true
},
{
"refId": "F",
"expr": "max(ananke_ups_on_battery{job=\"ananke-power\",source=\"Statera\"}) or on() vector(0)",
"legendFormat": "Statera Status",
"instant": true
}
],
"fieldConfig": {
"defaults": {
"color": {
"mode": "thresholds"
},
"mappings": [],
"thresholds": {
"mode": "absolute",
"steps": [
{
"color": "rgba(115, 115, 115, 1)",
"value": null
},
{
"color": "green",
"value": 1
}
]
},
"unit": "none",
"custom": {
"displayMode": "auto"
},
"decimals": 1
"filterable": true
}
},
"overrides": [
{
"matcher": {
"id": "byName",
"options": "Pyrphoros Draw (W)"
"options": "Draw (W)"
},
"properties": [
{
"id": "unit",
"value": "watt"
},
{
"id": "description",
"value": "Attached node: titan-db"
}
]
},
{
"matcher": {
"id": "byName",
"options": "Statera Draw (W)"
},
"properties": [
{
"id": "unit",
"value": "watt"
},
{
"id": "description",
"value": "Attached node: titan-24"
}
]
},
{
"matcher": {
"id": "byName",
"options": "Pyrphoros Discharge"
"options": "Discharge"
},
"properties": [
{
"id": "unit",
"value": "s"
},
{
"id": "description",
"value": "Attached node: titan-db"
}
]
},
{
"matcher": {
"id": "byName",
"options": "Statera Discharge"
},
"properties": [
{
"id": "unit",
"value": "s"
},
{
"id": "description",
"value": "Attached node: titan-24"
}
]
},
{
"matcher": {
"id": "byName",
"options": "Pyrphoros Status"
"options": "Status"
},
"properties": [
{
@ -176,59 +87,33 @@ data:
}
}
]
},
{
"id": "description",
"value": "Attached node: titan-db"
}
]
},
{
"matcher": {
"id": "byName",
"options": "Statera Status"
},
"properties": [
{
"id": "mappings",
"value": [
{
"type": "value",
"options": {
"0": {
"text": "\u26a1 Charging"
},
"1": {
"text": "\ud83d\udd0b Discharging"
}
}
}
]
},
{
"id": "description",
"value": "Attached node: titan-24"
}
]
}
]
},
"options": {
"colorMode": "value",
"graphMode": "none",
"justifyMode": "auto",
"reduceOptions": {
"calcs": [
"lastNotNull"
],
"fields": "",
"values": false
},
"textMode": "name_and_value",
"orientation": "horizontal",
"wideLayout": false
"showHeader": true,
"columnFilters": false
},
"description": "Per-UPS live snapshot: current draw in watts, estimated battery runtime if discharge started now, and charging/discharging status."
"transformations": [
{
"id": "labelsToFields",
"options": {
"mode": "columns",
"valueLabel": "metric"
}
},
{
"id": "organize",
"options": {
"excludeByName": {
"Time": true
}
}
}
],
"description": "Per-UPS two-row snapshot: draw (W), discharge runtime, and charging/discharging status."
},
{
"id": 2,
@ -280,7 +165,7 @@ data:
},
{
"id": 3,
"type": "stat",
"type": "table",
"title": "Current Climate",
"datasource": {
"type": "prometheus",
@ -294,60 +179,23 @@ data:
},
"targets": [
{
"expr": "label_replace((max(max without (job,instance,pod,service,endpoint,namespace) (typhon_temperature_celsius)) or on() vector(0)), \"metric\", \"Temp \u00b0C\", \"__name__\", \".*\") or label_replace((max((max without (job,instance,pod,service,endpoint,namespace) (typhon_temperature_celsius)) * 9 / 5 + 32) or on() vector(0)), \"metric\", \"Temp \u00b0F\", \"__name__\", \".*\") or label_replace((max(max without (job,instance,pod,service,endpoint,namespace) (typhon_relative_humidity_percent)) or on() vector(0)), \"metric\", \"Humidity\", \"__name__\", \".*\") or label_replace((max(max without (job,instance,pod,service,endpoint,namespace) (typhon_vpd_kpa)) or on() vector(0)), \"metric\", \"Pressure\", \"__name__\", \".*\")",
"refId": "A",
"expr": "max(max without (job,instance,pod,service,endpoint,namespace) (typhon_temperature_celsius)) or on() vector(0)",
"legendFormat": "Tent Temp (\u00b0C)",
"instant": true
},
{
"refId": "B",
"expr": "max((max without (job,instance,pod,service,endpoint,namespace) (typhon_temperature_celsius)) * 9 / 5 + 32) or on() vector(0)",
"legendFormat": "Tent Temp (\u00b0F)",
"instant": true
},
{
"refId": "C",
"expr": "max(max without (job,instance,pod,service,endpoint,namespace) (typhon_relative_humidity_percent)) or on() vector(0)",
"legendFormat": "Tent RH (%)",
"instant": true
},
{
"refId": "D",
"expr": "max(max without (job,instance,pod,service,endpoint,namespace) (typhon_vpd_kpa)) or on() vector(0)",
"legendFormat": "Tent Pressure (VPD kPa)",
"instant": true
}
],
"fieldConfig": {
"defaults": {
"color": {
"mode": "thresholds"
},
"mappings": [],
"thresholds": {
"mode": "absolute",
"steps": [
{
"color": "rgba(115, 115, 115, 1)",
"value": null
},
{
"color": "green",
"value": 1
}
]
},
"unit": "none",
"custom": {
"displayMode": "auto"
},
"decimals": 2
"filterable": true
}
},
"overrides": [
{
"matcher": {
"id": "byName",
"options": "Tent Temp (\u00b0C)"
"options": "Temp \u00b0C"
},
"properties": [
{
@ -359,7 +207,7 @@ data:
{
"matcher": {
"id": "byName",
"options": "Tent Temp (\u00b0F)"
"options": "Temp \u00b0F"
},
"properties": [
{
@ -371,7 +219,7 @@ data:
{
"matcher": {
"id": "byName",
"options": "Tent RH (%)"
"options": "Humidity"
},
"properties": [
{
@ -383,7 +231,7 @@ data:
{
"matcher": {
"id": "byName",
"options": "Tent Pressure (VPD kPa)"
"options": "Pressure"
},
"properties": [
{
@ -395,21 +243,27 @@ data:
]
},
"options": {
"colorMode": "value",
"graphMode": "none",
"justifyMode": "auto",
"reduceOptions": {
"calcs": [
"lastNotNull"
],
"fields": "",
"values": false
},
"textMode": "name_and_value",
"orientation": "horizontal",
"wideLayout": false
"showHeader": true,
"columnFilters": false
},
"description": "Current tent temperature in C/F, humidity, and pressure proxy (VPD kPa)."
"transformations": [
{
"id": "labelsToFields",
"options": {
"mode": "columns",
"valueLabel": "metric"
}
},
{
"id": "organize",
"options": {
"excludeByName": {
"Time": true
}
}
}
],
"description": "Single-row climate snapshot: Temp \u00b0C, Temp \u00b0F, Humidity, Pressure."
},
{
"id": 4,
@ -515,7 +369,7 @@ data:
},
{
"id": 5,
"type": "stat",
"type": "table",
"title": "Fan Activity",
"datasource": {
"type": "prometheus",
@ -529,77 +383,91 @@ data:
},
"targets": [
{
"expr": "label_replace((round(max(max without (job,instance,pod,service,endpoint,namespace) (typhon_fan_speed_level{fan_group=\"outlet\"})) or on() vector(0))), \"metric\", \"Outlet\", \"__name__\", \".*\") or label_replace((round(max(max without (job,instance,pod,service,endpoint,namespace) (typhon_fan_speed_level{fan_group=\"inside_inlet\"})) or on() vector(0))), \"metric\", \"Inlet In\", \"__name__\", \".*\") or label_replace((round(max(max without (job,instance,pod,service,endpoint,namespace) (typhon_fan_speed_level{fan_group=\"outside_inlet\"})) or on() vector(0))), \"metric\", \"Inlet Out\", \"__name__\", \".*\") or label_replace((round(max(max without (job,instance,pod,service,endpoint,namespace) (typhon_fan_speed_level{fan_group=~\"interior|unknown\"})) or on() vector(0))), \"metric\", \"Interior\", \"__name__\", \".*\")",
"refId": "A",
"expr": "round(max(max without (job,instance,pod,service,endpoint,namespace) (typhon_fan_speed_level{fan_group=\"outlet\"})) or on() vector(0))",
"legendFormat": "Inside Outlet",
"instant": true
},
{
"refId": "B",
"expr": "round(max(max without (job,instance,pod,service,endpoint,namespace) (typhon_fan_speed_level{fan_group=\"inside_inlet\"})) or on() vector(0))",
"legendFormat": "Inside Inlet",
"instant": true
},
{
"refId": "C",
"expr": "round(max(max without (job,instance,pod,service,endpoint,namespace) (typhon_fan_speed_level{fan_group=\"outside_inlet\"})) or on() vector(0))",
"legendFormat": "Outside Inlet",
"instant": true
},
{
"refId": "D",
"expr": "round(max(max without (job,instance,pod,service,endpoint,namespace) (typhon_fan_speed_level{fan_group=~\"interior|unknown\"})) or on() vector(0))",
"legendFormat": "Interior Fans",
"instant": true
}
],
"fieldConfig": {
"defaults": {
"color": {
"mode": "thresholds"
},
"mappings": [],
"thresholds": {
"mode": "absolute",
"steps": [
"unit": "none",
"custom": {
"filterable": true
}
},
"overrides": [
{
"matcher": {
"id": "byName",
"options": "Outlet"
},
"properties": [
{
"color": "green",
"value": null
},
{
"color": "yellow",
"value": 7
},
{
"color": "red",
"value": 9
"id": "decimals",
"value": 0
}
]
},
"unit": "none",
"custom": {
"displayMode": "auto"
{
"matcher": {
"id": "byName",
"options": "Inlet In"
},
"properties": [
{
"id": "decimals",
"value": 0
}
]
},
"decimals": 0
},
"overrides": []
{
"matcher": {
"id": "byName",
"options": "Inlet Out"
},
"properties": [
{
"id": "decimals",
"value": 0
}
]
},
{
"matcher": {
"id": "byName",
"options": "Interior"
},
"properties": [
{
"id": "decimals",
"value": 0
}
]
}
]
},
"options": {
"colorMode": "value",
"graphMode": "none",
"justifyMode": "auto",
"reduceOptions": {
"calcs": [
"lastNotNull"
],
"fields": "",
"values": false
},
"textMode": "name_and_value",
"orientation": "horizontal",
"wideLayout": false
"showHeader": true,
"columnFilters": false
},
"description": "Current fan activity levels (0-10): inside outlet, inside inlet, outside inlet, and interior fans."
"transformations": [
{
"id": "labelsToFields",
"options": {
"mode": "columns",
"valueLabel": "metric"
}
},
{
"id": "organize",
"options": {
"excludeByName": {
"Time": true
}
}
}
],
"description": "Single-row fan snapshot: outlet, inlet in, inlet out, interior (0-10)."
},
{
"id": 6,