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

View File

@ -1072,7 +1072,7 @@
}, },
{ {
"id": 40, "id": 40,
"type": "stat", "type": "table",
"title": "UPS Current Load", "title": "UPS Current Load",
"datasource": { "datasource": {
"type": "prometheus", "type": "prometheus",
@ -1086,136 +1086,47 @@
}, },
"targets": [ "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", "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 "instant": true
} }
], ],
"fieldConfig": { "fieldConfig": {
"defaults": { "defaults": {
"color": {
"mode": "thresholds"
},
"mappings": [],
"thresholds": {
"mode": "absolute",
"steps": [
{
"color": "rgba(115, 115, 115, 1)",
"value": null
},
{
"color": "green",
"value": 1
}
]
},
"unit": "none", "unit": "none",
"custom": { "custom": {
"displayMode": "auto" "filterable": true
}, }
"decimals": 1
}, },
"overrides": [ "overrides": [
{ {
"matcher": { "matcher": {
"id": "byName", "id": "byName",
"options": "Pyrphoros Draw (W)" "options": "Draw (W)"
}, },
"properties": [ "properties": [
{ {
"id": "unit", "id": "unit",
"value": "watt" "value": "watt"
},
{
"id": "description",
"value": "Attached node: titan-db"
} }
] ]
}, },
{ {
"matcher": { "matcher": {
"id": "byName", "id": "byName",
"options": "Statera Draw (W)" "options": "Discharge"
},
"properties": [
{
"id": "unit",
"value": "watt"
},
{
"id": "description",
"value": "Attached node: titan-24"
}
]
},
{
"matcher": {
"id": "byName",
"options": "Pyrphoros Discharge"
}, },
"properties": [ "properties": [
{ {
"id": "unit", "id": "unit",
"value": "s" "value": "s"
},
{
"id": "description",
"value": "Attached node: titan-db"
} }
] ]
}, },
{ {
"matcher": { "matcher": {
"id": "byName", "id": "byName",
"options": "Statera Discharge" "options": "Status"
},
"properties": [
{
"id": "unit",
"value": "s"
},
{
"id": "description",
"value": "Attached node: titan-24"
}
]
},
{
"matcher": {
"id": "byName",
"options": "Pyrphoros Status"
}, },
"properties": [ "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": { "options": {
"colorMode": "value", "showHeader": true,
"graphMode": "none", "columnFilters": false
"justifyMode": "auto",
"reduceOptions": {
"calcs": [
"lastNotNull"
],
"fields": "",
"values": false
},
"textMode": "name_and_value",
"orientation": "horizontal",
"wideLayout": false
}, },
"transformations": [
{
"id": "labelsToFields",
"options": {
"mode": "columns",
"valueLabel": "metric"
}
},
{
"id": "organize",
"options": {
"excludeByName": {
"Time": true
}
}
}
],
"links": [ "links": [
{ {
"title": "Open atlas-power dashboard", "title": "Open atlas-power dashboard",
@ -1292,7 +1177,7 @@
"targetBlank": true "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, "id": 41,
@ -1350,7 +1235,7 @@
}, },
{ {
"id": 42, "id": 42,
"type": "stat", "type": "table",
"title": "Current Climate", "title": "Current Climate",
"datasource": { "datasource": {
"type": "prometheus", "type": "prometheus",
@ -1364,54 +1249,17 @@
}, },
"targets": [ "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", "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 "instant": true
} }
], ],
"fieldConfig": { "fieldConfig": {
"defaults": { "defaults": {
"color": {
"mode": "thresholds"
},
"mappings": [],
"thresholds": {
"mode": "absolute",
"steps": [
{
"color": "rgba(115, 115, 115, 1)",
"value": null
},
{
"color": "green",
"value": 1
}
]
},
"unit": "none", "unit": "none",
"custom": { "custom": {
"displayMode": "auto" "filterable": true
}, }
"decimals": 2
}, },
"overrides": [ "overrides": [
{ {
@ -1465,20 +1313,26 @@
] ]
}, },
"options": { "options": {
"colorMode": "value", "showHeader": true,
"graphMode": "none", "columnFilters": false
"justifyMode": "auto",
"reduceOptions": {
"calcs": [
"lastNotNull"
],
"fields": "",
"values": false
},
"textMode": "name_and_value",
"orientation": "horizontal",
"wideLayout": false
}, },
"transformations": [
{
"id": "labelsToFields",
"options": {
"mode": "columns",
"valueLabel": "metric"
}
},
{
"id": "organize",
"options": {
"excludeByName": {
"Time": true
}
}
}
],
"links": [ "links": [
{ {
"title": "Open atlas-power dashboard", "title": "Open atlas-power dashboard",
@ -1486,7 +1340,7 @@
"targetBlank": true "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, "id": 43,
@ -1582,7 +1436,7 @@
}, },
{ {
"id": 140, "id": 140,
"type": "stat", "type": "table",
"title": "Fan Activity", "title": "Fan Activity",
"datasource": { "datasource": {
"type": "prometheus", "type": "prometheus",
@ -1596,83 +1450,98 @@
}, },
"targets": [ "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", "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 "instant": true
} }
], ],
"fieldConfig": { "fieldConfig": {
"defaults": { "defaults": {
"color": { "unit": "none",
"mode": "thresholds" "custom": {
}, "filterable": true
"mappings": [], }
"thresholds": { },
"mode": "absolute", "overrides": [
"steps": [ {
"matcher": {
"id": "byName",
"options": "Outlet"
},
"properties": [
{ {
"color": "green", "id": "decimals",
"value": null "value": 0
},
{
"color": "yellow",
"value": 7
},
{
"color": "red",
"value": 9
} }
] ]
}, },
"unit": "none", {
"custom": { "matcher": {
"displayMode": "auto" "id": "byName",
"options": "Inlet In"
},
"properties": [
{
"id": "decimals",
"value": 0
}
]
}, },
"decimals": 0 {
}, "matcher": {
"overrides": [] "id": "byName",
"options": "Inlet Out"
},
"properties": [
{
"id": "decimals",
"value": 0
}
]
},
{
"matcher": {
"id": "byName",
"options": "Interior"
},
"properties": [
{
"id": "decimals",
"value": 0
}
]
}
]
}, },
"options": { "options": {
"colorMode": "value", "showHeader": true,
"graphMode": "none", "columnFilters": false
"justifyMode": "auto",
"reduceOptions": {
"calcs": [
"lastNotNull"
],
"fields": "",
"values": false
},
"textMode": "name_and_value",
"orientation": "horizontal",
"wideLayout": false
}, },
"transformations": [
{
"id": "labelsToFields",
"options": {
"mode": "columns",
"valueLabel": "metric"
}
},
{
"id": "organize",
"options": {
"excludeByName": {
"Time": true
}
}
}
],
"links": [ "links": [
{ {
"title": "Open atlas-power dashboard", "title": "Open atlas-power dashboard",
"url": "/d/atlas-power", "url": "/d/atlas-power",
"targetBlank": true "targetBlank": true
} }
] ],
"description": "Single-row fan snapshot: outlet, inlet in, inlet out, interior (0-10)."
}, },
{ {
"id": 141, "id": 141,

View File

@ -6,7 +6,7 @@
"panels": [ "panels": [
{ {
"id": 1, "id": 1,
"type": "stat", "type": "table",
"title": "UPS Current Load", "title": "UPS Current Load",
"datasource": { "datasource": {
"type": "prometheus", "type": "prometheus",
@ -20,136 +20,47 @@
}, },
"targets": [ "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", "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 "instant": true
} }
], ],
"fieldConfig": { "fieldConfig": {
"defaults": { "defaults": {
"color": {
"mode": "thresholds"
},
"mappings": [],
"thresholds": {
"mode": "absolute",
"steps": [
{
"color": "rgba(115, 115, 115, 1)",
"value": null
},
{
"color": "green",
"value": 1
}
]
},
"unit": "none", "unit": "none",
"custom": { "custom": {
"displayMode": "auto" "filterable": true
}, }
"decimals": 1
}, },
"overrides": [ "overrides": [
{ {
"matcher": { "matcher": {
"id": "byName", "id": "byName",
"options": "Pyrphoros Draw (W)" "options": "Draw (W)"
}, },
"properties": [ "properties": [
{ {
"id": "unit", "id": "unit",
"value": "watt" "value": "watt"
},
{
"id": "description",
"value": "Attached node: titan-db"
} }
] ]
}, },
{ {
"matcher": { "matcher": {
"id": "byName", "id": "byName",
"options": "Statera Draw (W)" "options": "Discharge"
},
"properties": [
{
"id": "unit",
"value": "watt"
},
{
"id": "description",
"value": "Attached node: titan-24"
}
]
},
{
"matcher": {
"id": "byName",
"options": "Pyrphoros Discharge"
}, },
"properties": [ "properties": [
{ {
"id": "unit", "id": "unit",
"value": "s" "value": "s"
},
{
"id": "description",
"value": "Attached node: titan-db"
} }
] ]
}, },
{ {
"matcher": { "matcher": {
"id": "byName", "id": "byName",
"options": "Statera Discharge" "options": "Status"
},
"properties": [
{
"id": "unit",
"value": "s"
},
{
"id": "description",
"value": "Attached node: titan-24"
}
]
},
{
"matcher": {
"id": "byName",
"options": "Pyrphoros Status"
}, },
"properties": [ "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": { "options": {
"colorMode": "value", "showHeader": true,
"graphMode": "none", "columnFilters": false
"justifyMode": "auto",
"reduceOptions": {
"calcs": [
"lastNotNull"
],
"fields": "",
"values": false
},
"textMode": "name_and_value",
"orientation": "horizontal",
"wideLayout": 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, "id": 2,
@ -271,7 +156,7 @@
}, },
{ {
"id": 3, "id": 3,
"type": "stat", "type": "table",
"title": "Current Climate", "title": "Current Climate",
"datasource": { "datasource": {
"type": "prometheus", "type": "prometheus",
@ -285,60 +170,23 @@
}, },
"targets": [ "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", "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 "instant": true
} }
], ],
"fieldConfig": { "fieldConfig": {
"defaults": { "defaults": {
"color": {
"mode": "thresholds"
},
"mappings": [],
"thresholds": {
"mode": "absolute",
"steps": [
{
"color": "rgba(115, 115, 115, 1)",
"value": null
},
{
"color": "green",
"value": 1
}
]
},
"unit": "none", "unit": "none",
"custom": { "custom": {
"displayMode": "auto" "filterable": true
}, }
"decimals": 2
}, },
"overrides": [ "overrides": [
{ {
"matcher": { "matcher": {
"id": "byName", "id": "byName",
"options": "Tent Temp (\u00b0C)" "options": "Temp \u00b0C"
}, },
"properties": [ "properties": [
{ {
@ -350,7 +198,7 @@
{ {
"matcher": { "matcher": {
"id": "byName", "id": "byName",
"options": "Tent Temp (\u00b0F)" "options": "Temp \u00b0F"
}, },
"properties": [ "properties": [
{ {
@ -362,7 +210,7 @@
{ {
"matcher": { "matcher": {
"id": "byName", "id": "byName",
"options": "Tent RH (%)" "options": "Humidity"
}, },
"properties": [ "properties": [
{ {
@ -374,7 +222,7 @@
{ {
"matcher": { "matcher": {
"id": "byName", "id": "byName",
"options": "Tent Pressure (VPD kPa)" "options": "Pressure"
}, },
"properties": [ "properties": [
{ {
@ -386,21 +234,27 @@
] ]
}, },
"options": { "options": {
"colorMode": "value", "showHeader": true,
"graphMode": "none", "columnFilters": false
"justifyMode": "auto",
"reduceOptions": {
"calcs": [
"lastNotNull"
],
"fields": "",
"values": false
},
"textMode": "name_and_value",
"orientation": "horizontal",
"wideLayout": 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, "id": 4,
@ -506,7 +360,7 @@
}, },
{ {
"id": 5, "id": 5,
"type": "stat", "type": "table",
"title": "Fan Activity", "title": "Fan Activity",
"datasource": { "datasource": {
"type": "prometheus", "type": "prometheus",
@ -520,77 +374,91 @@
}, },
"targets": [ "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", "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 "instant": true
} }
], ],
"fieldConfig": { "fieldConfig": {
"defaults": { "defaults": {
"color": { "unit": "none",
"mode": "thresholds" "custom": {
}, "filterable": true
"mappings": [], }
"thresholds": { },
"mode": "absolute", "overrides": [
"steps": [ {
"matcher": {
"id": "byName",
"options": "Outlet"
},
"properties": [
{ {
"color": "green", "id": "decimals",
"value": null "value": 0
},
{
"color": "yellow",
"value": 7
},
{
"color": "red",
"value": 9
} }
] ]
}, },
"unit": "none", {
"custom": { "matcher": {
"displayMode": "auto" "id": "byName",
"options": "Inlet In"
},
"properties": [
{
"id": "decimals",
"value": 0
}
]
}, },
"decimals": 0 {
}, "matcher": {
"overrides": [] "id": "byName",
"options": "Inlet Out"
},
"properties": [
{
"id": "decimals",
"value": 0
}
]
},
{
"matcher": {
"id": "byName",
"options": "Interior"
},
"properties": [
{
"id": "decimals",
"value": 0
}
]
}
]
}, },
"options": { "options": {
"colorMode": "value", "showHeader": true,
"graphMode": "none", "columnFilters": false
"justifyMode": "auto",
"reduceOptions": {
"calcs": [
"lastNotNull"
],
"fields": "",
"values": false
},
"textMode": "name_and_value",
"orientation": "horizontal",
"wideLayout": 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, "id": 6,

View File

@ -1081,7 +1081,7 @@ data:
}, },
{ {
"id": 40, "id": 40,
"type": "stat", "type": "table",
"title": "UPS Current Load", "title": "UPS Current Load",
"datasource": { "datasource": {
"type": "prometheus", "type": "prometheus",
@ -1095,136 +1095,47 @@ data:
}, },
"targets": [ "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", "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 "instant": true
} }
], ],
"fieldConfig": { "fieldConfig": {
"defaults": { "defaults": {
"color": {
"mode": "thresholds"
},
"mappings": [],
"thresholds": {
"mode": "absolute",
"steps": [
{
"color": "rgba(115, 115, 115, 1)",
"value": null
},
{
"color": "green",
"value": 1
}
]
},
"unit": "none", "unit": "none",
"custom": { "custom": {
"displayMode": "auto" "filterable": true
}, }
"decimals": 1
}, },
"overrides": [ "overrides": [
{ {
"matcher": { "matcher": {
"id": "byName", "id": "byName",
"options": "Pyrphoros Draw (W)" "options": "Draw (W)"
}, },
"properties": [ "properties": [
{ {
"id": "unit", "id": "unit",
"value": "watt" "value": "watt"
},
{
"id": "description",
"value": "Attached node: titan-db"
} }
] ]
}, },
{ {
"matcher": { "matcher": {
"id": "byName", "id": "byName",
"options": "Statera Draw (W)" "options": "Discharge"
},
"properties": [
{
"id": "unit",
"value": "watt"
},
{
"id": "description",
"value": "Attached node: titan-24"
}
]
},
{
"matcher": {
"id": "byName",
"options": "Pyrphoros Discharge"
}, },
"properties": [ "properties": [
{ {
"id": "unit", "id": "unit",
"value": "s" "value": "s"
},
{
"id": "description",
"value": "Attached node: titan-db"
} }
] ]
}, },
{ {
"matcher": { "matcher": {
"id": "byName", "id": "byName",
"options": "Statera Discharge" "options": "Status"
},
"properties": [
{
"id": "unit",
"value": "s"
},
{
"id": "description",
"value": "Attached node: titan-24"
}
]
},
{
"matcher": {
"id": "byName",
"options": "Pyrphoros Status"
}, },
"properties": [ "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": { "options": {
"colorMode": "value", "showHeader": true,
"graphMode": "none", "columnFilters": false
"justifyMode": "auto",
"reduceOptions": {
"calcs": [
"lastNotNull"
],
"fields": "",
"values": false
},
"textMode": "name_and_value",
"orientation": "horizontal",
"wideLayout": false
}, },
"transformations": [
{
"id": "labelsToFields",
"options": {
"mode": "columns",
"valueLabel": "metric"
}
},
{
"id": "organize",
"options": {
"excludeByName": {
"Time": true
}
}
}
],
"links": [ "links": [
{ {
"title": "Open atlas-power dashboard", "title": "Open atlas-power dashboard",
@ -1301,7 +1186,7 @@ data:
"targetBlank": true "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, "id": 41,
@ -1359,7 +1244,7 @@ data:
}, },
{ {
"id": 42, "id": 42,
"type": "stat", "type": "table",
"title": "Current Climate", "title": "Current Climate",
"datasource": { "datasource": {
"type": "prometheus", "type": "prometheus",
@ -1373,54 +1258,17 @@ data:
}, },
"targets": [ "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", "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 "instant": true
} }
], ],
"fieldConfig": { "fieldConfig": {
"defaults": { "defaults": {
"color": {
"mode": "thresholds"
},
"mappings": [],
"thresholds": {
"mode": "absolute",
"steps": [
{
"color": "rgba(115, 115, 115, 1)",
"value": null
},
{
"color": "green",
"value": 1
}
]
},
"unit": "none", "unit": "none",
"custom": { "custom": {
"displayMode": "auto" "filterable": true
}, }
"decimals": 2
}, },
"overrides": [ "overrides": [
{ {
@ -1474,20 +1322,26 @@ data:
] ]
}, },
"options": { "options": {
"colorMode": "value", "showHeader": true,
"graphMode": "none", "columnFilters": false
"justifyMode": "auto",
"reduceOptions": {
"calcs": [
"lastNotNull"
],
"fields": "",
"values": false
},
"textMode": "name_and_value",
"orientation": "horizontal",
"wideLayout": false
}, },
"transformations": [
{
"id": "labelsToFields",
"options": {
"mode": "columns",
"valueLabel": "metric"
}
},
{
"id": "organize",
"options": {
"excludeByName": {
"Time": true
}
}
}
],
"links": [ "links": [
{ {
"title": "Open atlas-power dashboard", "title": "Open atlas-power dashboard",
@ -1495,7 +1349,7 @@ data:
"targetBlank": true "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, "id": 43,
@ -1591,7 +1445,7 @@ data:
}, },
{ {
"id": 140, "id": 140,
"type": "stat", "type": "table",
"title": "Fan Activity", "title": "Fan Activity",
"datasource": { "datasource": {
"type": "prometheus", "type": "prometheus",
@ -1605,83 +1459,98 @@ data:
}, },
"targets": [ "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", "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 "instant": true
} }
], ],
"fieldConfig": { "fieldConfig": {
"defaults": { "defaults": {
"color": { "unit": "none",
"mode": "thresholds" "custom": {
}, "filterable": true
"mappings": [], }
"thresholds": { },
"mode": "absolute", "overrides": [
"steps": [ {
"matcher": {
"id": "byName",
"options": "Outlet"
},
"properties": [
{ {
"color": "green", "id": "decimals",
"value": null "value": 0
},
{
"color": "yellow",
"value": 7
},
{
"color": "red",
"value": 9
} }
] ]
}, },
"unit": "none", {
"custom": { "matcher": {
"displayMode": "auto" "id": "byName",
"options": "Inlet In"
},
"properties": [
{
"id": "decimals",
"value": 0
}
]
}, },
"decimals": 0 {
}, "matcher": {
"overrides": [] "id": "byName",
"options": "Inlet Out"
},
"properties": [
{
"id": "decimals",
"value": 0
}
]
},
{
"matcher": {
"id": "byName",
"options": "Interior"
},
"properties": [
{
"id": "decimals",
"value": 0
}
]
}
]
}, },
"options": { "options": {
"colorMode": "value", "showHeader": true,
"graphMode": "none", "columnFilters": false
"justifyMode": "auto",
"reduceOptions": {
"calcs": [
"lastNotNull"
],
"fields": "",
"values": false
},
"textMode": "name_and_value",
"orientation": "horizontal",
"wideLayout": false
}, },
"transformations": [
{
"id": "labelsToFields",
"options": {
"mode": "columns",
"valueLabel": "metric"
}
},
{
"id": "organize",
"options": {
"excludeByName": {
"Time": true
}
}
}
],
"links": [ "links": [
{ {
"title": "Open atlas-power dashboard", "title": "Open atlas-power dashboard",
"url": "/d/atlas-power", "url": "/d/atlas-power",
"targetBlank": true "targetBlank": true
} }
] ],
"description": "Single-row fan snapshot: outlet, inlet in, inlet out, interior (0-10)."
}, },
{ {
"id": 141, "id": 141,

View File

@ -15,7 +15,7 @@ data:
"panels": [ "panels": [
{ {
"id": 1, "id": 1,
"type": "stat", "type": "table",
"title": "UPS Current Load", "title": "UPS Current Load",
"datasource": { "datasource": {
"type": "prometheus", "type": "prometheus",
@ -29,136 +29,47 @@ data:
}, },
"targets": [ "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", "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 "instant": true
} }
], ],
"fieldConfig": { "fieldConfig": {
"defaults": { "defaults": {
"color": {
"mode": "thresholds"
},
"mappings": [],
"thresholds": {
"mode": "absolute",
"steps": [
{
"color": "rgba(115, 115, 115, 1)",
"value": null
},
{
"color": "green",
"value": 1
}
]
},
"unit": "none", "unit": "none",
"custom": { "custom": {
"displayMode": "auto" "filterable": true
}, }
"decimals": 1
}, },
"overrides": [ "overrides": [
{ {
"matcher": { "matcher": {
"id": "byName", "id": "byName",
"options": "Pyrphoros Draw (W)" "options": "Draw (W)"
}, },
"properties": [ "properties": [
{ {
"id": "unit", "id": "unit",
"value": "watt" "value": "watt"
},
{
"id": "description",
"value": "Attached node: titan-db"
} }
] ]
}, },
{ {
"matcher": { "matcher": {
"id": "byName", "id": "byName",
"options": "Statera Draw (W)" "options": "Discharge"
},
"properties": [
{
"id": "unit",
"value": "watt"
},
{
"id": "description",
"value": "Attached node: titan-24"
}
]
},
{
"matcher": {
"id": "byName",
"options": "Pyrphoros Discharge"
}, },
"properties": [ "properties": [
{ {
"id": "unit", "id": "unit",
"value": "s" "value": "s"
},
{
"id": "description",
"value": "Attached node: titan-db"
} }
] ]
}, },
{ {
"matcher": { "matcher": {
"id": "byName", "id": "byName",
"options": "Statera Discharge" "options": "Status"
},
"properties": [
{
"id": "unit",
"value": "s"
},
{
"id": "description",
"value": "Attached node: titan-24"
}
]
},
{
"matcher": {
"id": "byName",
"options": "Pyrphoros Status"
}, },
"properties": [ "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": { "options": {
"colorMode": "value", "showHeader": true,
"graphMode": "none", "columnFilters": false
"justifyMode": "auto",
"reduceOptions": {
"calcs": [
"lastNotNull"
],
"fields": "",
"values": false
},
"textMode": "name_and_value",
"orientation": "horizontal",
"wideLayout": 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, "id": 2,
@ -280,7 +165,7 @@ data:
}, },
{ {
"id": 3, "id": 3,
"type": "stat", "type": "table",
"title": "Current Climate", "title": "Current Climate",
"datasource": { "datasource": {
"type": "prometheus", "type": "prometheus",
@ -294,60 +179,23 @@ data:
}, },
"targets": [ "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", "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 "instant": true
} }
], ],
"fieldConfig": { "fieldConfig": {
"defaults": { "defaults": {
"color": {
"mode": "thresholds"
},
"mappings": [],
"thresholds": {
"mode": "absolute",
"steps": [
{
"color": "rgba(115, 115, 115, 1)",
"value": null
},
{
"color": "green",
"value": 1
}
]
},
"unit": "none", "unit": "none",
"custom": { "custom": {
"displayMode": "auto" "filterable": true
}, }
"decimals": 2
}, },
"overrides": [ "overrides": [
{ {
"matcher": { "matcher": {
"id": "byName", "id": "byName",
"options": "Tent Temp (\u00b0C)" "options": "Temp \u00b0C"
}, },
"properties": [ "properties": [
{ {
@ -359,7 +207,7 @@ data:
{ {
"matcher": { "matcher": {
"id": "byName", "id": "byName",
"options": "Tent Temp (\u00b0F)" "options": "Temp \u00b0F"
}, },
"properties": [ "properties": [
{ {
@ -371,7 +219,7 @@ data:
{ {
"matcher": { "matcher": {
"id": "byName", "id": "byName",
"options": "Tent RH (%)" "options": "Humidity"
}, },
"properties": [ "properties": [
{ {
@ -383,7 +231,7 @@ data:
{ {
"matcher": { "matcher": {
"id": "byName", "id": "byName",
"options": "Tent Pressure (VPD kPa)" "options": "Pressure"
}, },
"properties": [ "properties": [
{ {
@ -395,21 +243,27 @@ data:
] ]
}, },
"options": { "options": {
"colorMode": "value", "showHeader": true,
"graphMode": "none", "columnFilters": false
"justifyMode": "auto",
"reduceOptions": {
"calcs": [
"lastNotNull"
],
"fields": "",
"values": false
},
"textMode": "name_and_value",
"orientation": "horizontal",
"wideLayout": 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, "id": 4,
@ -515,7 +369,7 @@ data:
}, },
{ {
"id": 5, "id": 5,
"type": "stat", "type": "table",
"title": "Fan Activity", "title": "Fan Activity",
"datasource": { "datasource": {
"type": "prometheus", "type": "prometheus",
@ -529,77 +383,91 @@ data:
}, },
"targets": [ "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", "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 "instant": true
} }
], ],
"fieldConfig": { "fieldConfig": {
"defaults": { "defaults": {
"color": { "unit": "none",
"mode": "thresholds" "custom": {
}, "filterable": true
"mappings": [], }
"thresholds": { },
"mode": "absolute", "overrides": [
"steps": [ {
"matcher": {
"id": "byName",
"options": "Outlet"
},
"properties": [
{ {
"color": "green", "id": "decimals",
"value": null "value": 0
},
{
"color": "yellow",
"value": 7
},
{
"color": "red",
"value": 9
} }
] ]
}, },
"unit": "none", {
"custom": { "matcher": {
"displayMode": "auto" "id": "byName",
"options": "Inlet In"
},
"properties": [
{
"id": "decimals",
"value": 0
}
]
}, },
"decimals": 0 {
}, "matcher": {
"overrides": [] "id": "byName",
"options": "Inlet Out"
},
"properties": [
{
"id": "decimals",
"value": 0
}
]
},
{
"matcher": {
"id": "byName",
"options": "Interior"
},
"properties": [
{
"id": "decimals",
"value": 0
}
]
}
]
}, },
"options": { "options": {
"colorMode": "value", "showHeader": true,
"graphMode": "none", "columnFilters": false
"justifyMode": "auto",
"reduceOptions": {
"calcs": [
"lastNotNull"
],
"fields": "",
"values": false
},
"textMode": "name_and_value",
"orientation": "horizontal",
"wideLayout": 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, "id": 6,