Skip to content

Commit

Permalink
support for cobia #102
Browse files Browse the repository at this point in the history
  • Loading branch information
tomaae committed Apr 3, 2024
1 parent 37c1373 commit 5d61497
Show file tree
Hide file tree
Showing 3 changed files with 172 additions and 54 deletions.
6 changes: 5 additions & 1 deletion custom_components/truenas/api.py
Original file line number Diff line number Diff line change
Expand Up @@ -121,7 +121,11 @@ def query(
errorcode,
)

if errorcode != 500 and service != "reporting/get_data":
if (
errorcode != 500
and service != "reporting/get_data"
and service != "reporting/netdata_get_data"
):
self._connected = False

self._error = errorcode
Expand Down
215 changes: 164 additions & 51 deletions custom_components/truenas/coordinator.py
Original file line number Diff line number Diff line change
Expand Up @@ -130,45 +130,86 @@ async def _async_update_data(self):
# ---------------------------
def get_systeminfo(self) -> None:
"""Get system info from TrueNAS."""
self.ds["system_info"] = parse_api(
data=self.ds["system_info"],
source=self.api.query("system/info"),
vals=[
{"name": "version", "default": "unknown"},
{"name": "hostname", "default": "unknown"},
{"name": "uptime_seconds", "default": 0},
{"name": "system_serial", "default": "unknown"},
{"name": "system_product", "default": "unknown"},
{"name": "system_manufacturer", "default": "unknown"},
],
ensure_vals=[
{"name": "uptimeEpoch", "default": 0},
{"name": "cpu_temperature", "default": 0.0},
{"name": "load_shortterm", "default": 0.0},
{"name": "load_midterm", "default": 0.0},
{"name": "load_longterm", "default": 0.0},
{"name": "cpu_interrupt", "default": 0.0},
{"name": "cpu_system", "default": 0.0},
{"name": "cpu_user", "default": 0.0},
{"name": "cpu_nice", "default": 0.0},
{"name": "cpu_idle", "default": 0.0},
{"name": "cpu_usage", "default": 0.0},
{"name": "cache_size-arc_value", "default": 0.0},
{"name": "cache_size-L2_value", "default": 0.0},
{"name": "cache_ratio-arc_value", "default": 0},
{"name": "cache_ratio-L2_value", "default": 0},
{"name": "memory-used_value", "default": 0.0},
{"name": "memory-free_value", "default": 0.0},
{"name": "memory-cached_value", "default": 0.0},
{"name": "memory-buffered_value", "default": 0.0},
{"name": "memory-total_value", "default": 0.0},
{"name": "memory-usage_percent", "default": 0},
{"name": "update_available", "type": "bool", "default": False},
{"name": "update_progress", "default": 0},
{"name": "update_jobid", "default": 0},
{"name": "update_state", "default": "unknown"},
],
)
if self._is_scale and self._version_major >= 23:
self.ds["system_info"] = parse_api(
data=self.ds["system_info"],
source=self.api.query("system/info"),
vals=[
{"name": "version", "default": "unknown"},
{"name": "hostname", "default": "unknown"},
{"name": "uptime_seconds", "default": 0},
{"name": "system_serial", "default": "unknown"},
{"name": "system_product", "default": "unknown"},
{"name": "system_manufacturer", "default": "unknown"},
],
ensure_vals=[
{"name": "uptimeEpoch", "default": 0},
{"name": "cpu_temperature", "default": 0.0},
{"name": "load_shortterm", "default": 0.0},
{"name": "load_midterm", "default": 0.0},
{"name": "load_longterm", "default": 0.0},
{"name": "cpu_interrupt", "default": 0.0},
{"name": "cpu_system", "default": 0.0},
{"name": "cpu_user", "default": 0.0},
{"name": "cpu_nice", "default": 0.0},
{"name": "cpu_idle", "default": 0.0},
{"name": "cpu_usage", "default": 0.0},
{"name": "cache_size-arc_value", "default": 0.0},
{"name": "cache_size-L2_value", "default": 0.0},
{"name": "cache_ratio-arc_value", "default": 0},
{"name": "cache_ratio-L2_value", "default": 0},
{"name": "memory-used_value", "default": 0.0},
{"name": "memory-free_value", "default": 0.0},
{"name": "memory-cached_value", "default": 0.0},
{"name": "memory-buffered_value", "default": 0.0},
{"name": "memory-total_value", "default": 0.0},
{"name": "memory-usage_percent", "default": 0},
{"name": "update_available", "type": "bool", "default": False},
{"name": "update_progress", "default": 0},
{"name": "update_jobid", "default": 0},
{"name": "update_state", "default": "unknown"},
],
)
else:
self.ds["system_info"] = parse_api(
data=self.ds["system_info"],
source=self.api.query("system/info"),
vals=[
{"name": "version", "default": "unknown"},
{"name": "hostname", "default": "unknown"},
{"name": "uptime_seconds", "default": 0},
{"name": "system_serial", "default": "unknown"},
{"name": "system_product", "default": "unknown"},
{"name": "system_manufacturer", "default": "unknown"},
],
ensure_vals=[
{"name": "uptimeEpoch", "default": 0},
{"name": "cpu_temperature", "default": 0.0},
{"name": "load_shortterm", "default": 0.0},
{"name": "load_midterm", "default": 0.0},
{"name": "load_longterm", "default": 0.0},
{"name": "cpu_interrupt", "default": 0.0},
{"name": "cpu_system", "default": 0.0},
{"name": "cpu_user", "default": 0.0},
{"name": "cpu_nice", "default": 0.0},
{"name": "cpu_idle", "default": 0.0},
{"name": "cpu_usage", "default": 0.0},
{"name": "cache_size-arc_value", "default": 0.0},
{"name": "cache_size-L2_value", "default": 0.0},
{"name": "cache_ratio-arc_value", "default": 0},
{"name": "cache_ratio-L2_value", "default": 0},
{"name": "memory-used_value", "default": 0.0},
{"name": "memory-free_value", "default": 0.0},
{"name": "memory-cached_value", "default": 0.0},
{"name": "memory-buffered_value", "default": 0.0},
{"name": "memory-total_value", "default": 0.0},
{"name": "memory-usage_percent", "default": 0},
{"name": "update_available", "type": "bool", "default": False},
{"name": "update_progress", "default": 0},
{"name": "update_jobid", "default": 0},
{"name": "update_state", "default": "unknown"},
],
)
if not self.api.connected():
return

Expand Down Expand Up @@ -317,6 +358,22 @@ def get_systemstats(self) -> None:
"aggregate": True,
},
}
if self._is_scale and self._version_major >= 23:
tmp_params = {
"graphs": [
{"name": "load"},
{"name": "cputemp"},
{"name": "cpu"},
{"name": "arcsize"},
{"name": "arcactualrate"},
{"name": "memory"},
],
"reporting_query_netdata": {
"start": "-90",
"end": "-30",
"aggregate": True,
},
}

for uid, vals in self.ds["interface"].items():
tmp_params["graphs"].append({"name": "interface", "identifier": uid})
Expand All @@ -331,28 +388,46 @@ def get_systemstats(self) -> None:
if not tmp_params["graphs"]:
return

reporting_path = "reporting/get_data"
if self._is_scale and self._version_major >= 23:
reporting_path = "reporting/netdata_get_data"

tmp_graph = self.api.query(
"reporting/get_data",
reporting_path,
method="post",
params=tmp_params,
)

if not isinstance(tmp_graph, list):
if self.api.error == 500:
for tmp in tmp_params["graphs"]:
tmp2 = self.api.query(
"reporting/get_data",
method="post",
params={
tmp_params2 = {
"graphs": [
tmp,
],
"reporting_query": {
"start": "now-90s",
"end": "now-30s",
"aggregate": True,
},
}

if self._is_scale and self._version_major >= 23:
tmp_params2 = {
"graphs": [
tmp,
],
"reporting_query": {
"start": "now-90s",
"end": "now-30s",
"reporting_query_netdata": {
"start": "-90",
"end": "-30",
"aggregate": True,
},
},
}

tmp2 = self.api.query(
reporting_path,
method="post",
params=tmp_params2,
)
if not isinstance(tmp2, list) and self.api.error == 500:
self._systemstats_errored.append(tmp["name"])
Expand Down Expand Up @@ -382,11 +457,17 @@ def get_systemstats(self) -> None:
# CPU load
if tmp_graph[i]["name"] == "load":
tmp_arr = ("load_shortterm", "load_midterm", "load_longterm")
self._systemstats_process(tmp_arr, tmp_graph[i], "")
if self._is_scale and self._version_major >= 23:
tmp_arr = ("shortterm", "midterm", "longterm")

self._systemstats_process(tmp_arr, tmp_graph[i], "load")

# CPU usage
if tmp_graph[i]["name"] == "cpu":
tmp_arr = ("interrupt", "system", "user", "nice", "idle")
if self._is_scale and self._version_major >= 23:
tmp_arr = ("softirq", "system", "user", "nice", "iowait", "idle")

self._systemstats_process(tmp_arr, tmp_graph[i], "cpu")
self.ds["system_info"]["cpu_usage"] = round(
self.ds["system_info"]["cpu_system"]
Expand Down Expand Up @@ -444,12 +525,19 @@ def get_systemstats(self) -> None:
# arcsize
if tmp_graph[i]["name"] == "arcsize":
tmp_arr = ("cache_size-arc_value", "cache_size-L2_value")
self._systemstats_process(tmp_arr, tmp_graph[i], "memory")
if self._is_scale and self._version_major >= 23:
tmp_arr = "arc_size"
self._systemstats_process(tmp_arr, tmp_graph[i], "arcsize")

# arcratio
if tmp_graph[i]["name"] == "arcratio":
tmp_arr = ("cache_ratio-arc_value", "cache_ratio-L2_value")
self._systemstats_process(tmp_arr, tmp_graph[i], "")
self._systemstats_process(tmp_arr, tmp_graph[i], "arcratio")

# if tmp_graph[i]["name"] == "arcactualrate":
# print(tmp_graph[i])
# tmp_arr = ("hits", "misses")
# self._systemstats_process(tmp_arr, tmp_graph[i], "arcratio")

# ---------------------------
# _systemstats_process
Expand All @@ -459,11 +547,36 @@ def _systemstats_process(self, arr, graph, t) -> None:
for e in range(len(graph["legend"])):
tmp_var = graph["legend"][e]
if tmp_var in arr:
if self._is_scale and self._version_major >= 23:
e = tmp_var

tmp_val = graph["aggregations"]["mean"][e] or 0.0
if t == "memory":
self.ds["system_info"][tmp_var] = tmp_val
elif t == "cpu":
self.ds["system_info"][f"cpu_{tmp_var}"] = round(tmp_val, 2)
elif t == "load":
if self._is_scale and self._version_major >= 23:
self.ds["system_info"][f"load_{tmp_var}"] = round(
tmp_val, 2
)
else:
self.ds["system_info"][tmp_var] = round(tmp_val, 2)
elif t == "arcsize":
if self._is_scale and self._version_major >= 23:
tmp_val = tmp_val * 1024 * 1024
self.ds["system_info"]["cache_size-arc_value"] = round(
tmp_val, 2
)
else:
self.ds["system_info"][tmp_var] = round(tmp_val, 2)
elif t == "arcratio":
if self._is_scale and self._version_major >= 23:
self.ds["system_info"]["cache_ratio-arc_value"] = round(
tmp_val, 2
)
else:
self.ds["system_info"][tmp_var] = round(tmp_val, 2)
else:
self.ds["system_info"][tmp_var] = round(tmp_val, 2)
else:
Expand Down
5 changes: 3 additions & 2 deletions custom_components/truenas/sensor_types.py
Original file line number Diff line number Diff line change
Expand Up @@ -91,10 +91,11 @@
]

DEVICE_ATTRIBUTES_CPU = [
"cpu_interrupt",
"cpu_softirq",
"cpu_system",
"cpu_user",
"cpu_nice",
"cpu_iowait",
"cpu_idle",
]

Expand Down Expand Up @@ -280,7 +281,7 @@ class TrueNASSensorEntityDescription(SensorEntityDescription):
icon="mdi:memory",
native_unit_of_measurement=UnitOfInformation.BYTES,
suggested_unit_of_measurement=UnitOfInformation.GIGABYTES,
suggested_display_precision=0,
suggested_display_precision=1,
device_class=SensorDeviceClass.DATA_SIZE,
state_class=SensorStateClass.MEASUREMENT,
entity_category=EntityCategory.DIAGNOSTIC,
Expand Down

0 comments on commit 5d61497

Please sign in to comment.