Grafana : production du jour par chargeur ; suiveur V1 ajoute a l'export InfluxDB
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_011uJ47NxgfpGnuuMr3f2n7Z
This commit is contained in:
@@ -341,6 +341,22 @@ nuit = dashboard("evcs-nuit", "La nuit", (
|
||||
# =====================================================================
|
||||
# 2. LE SOLAIRE — excedent, censure, et ce que les chargeurs disent
|
||||
# =====================================================================
|
||||
# Rendement journalier declare par chaque chargeur (MANUEL §0 : la production
|
||||
# reelle du jour est leur SOMME, jamais un sous-tracker du 450/200 en plus).
|
||||
RENDEMENTS_FLUX = (
|
||||
'from(bucket: "evcs")\n'
|
||||
' |> range(start: v.timeRangeStart, stop: v.timeRangeStop)\n'
|
||||
' |> filter(fn: (r) => r._measurement == "kWh" and r._field == "value")\n'
|
||||
' |> filter(fn: (r) => r.entity_id == "airtria_mppt1_yield_today"\n'
|
||||
' or r.entity_id == "mppt_450_200_hq2449yr9pt_yield_today"\n'
|
||||
' or r.entity_id == "v1_yield_today")\n'
|
||||
' |> aggregateWindow(every: v.windowPeriod, fn: last, createEmpty: false)\n'
|
||||
' |> map(fn: (r) => ({ r with chargeur:\n'
|
||||
' if r.entity_id =~ /^airtria/ then "MPPT 250/70 sud-est"\n'
|
||||
' else if r.entity_id =~ /^mppt_450/ then "RS 450/200 sud + ouest"\n'
|
||||
' else "150/35 suiveur" }))\n'
|
||||
' |> group()\n')
|
||||
|
||||
solaire = dashboard("evcs-solaire", "Le solaire", (
|
||||
"La production mesuree n'est jamais la production disponible : sans "
|
||||
"injection, le MPPT ne produit que ce que le systeme peut absorber. "
|
||||
@@ -393,7 +409,8 @@ solaire = dashboard("evcs-solaire", "Le solaire", (
|
||||
' |> filter(fn: (r) => r._measurement =~ /operation_mode$/)\n'
|
||||
' |> aggregateWindow(every: v.windowPeriod, fn: last, createEmpty: false)\n'
|
||||
' |> map(fn: (r) => ({ r with tracker:\n'
|
||||
' if r._measurement =~ /solar_1/ then "Sud 1"\n'
|
||||
' if r._measurement =~ /^v1_/ then "Suiveur"\n'
|
||||
' else if r._measurement =~ /solar_1/ then "Sud 1"\n'
|
||||
' else if r._measurement =~ /solar_2/ then "Sud 2"\n'
|
||||
' else if r._measurement =~ /solar_3/ then "Sud 3"\n'
|
||||
' else if r._measurement =~ /solar_4/ then "Ouest"\n'
|
||||
@@ -411,6 +428,35 @@ solaire = dashboard("evcs-solaire", "Le solaire", (
|
||||
"voltage_current_limited": {"color": "orange", "index": 1},
|
||||
"off": {"color": "dark-blue", "index": 2}}}]),
|
||||
|
||||
ts("Production du jour par chargeur", [
|
||||
flux("A", RENDEMENTS_FLUX + ' |> keep(columns: ["_time", "_value", "chargeur"])\n'
|
||||
' |> pivot(rowKey: ["_time"], columnKey: ["chargeur"], valueColumn: "_value")\n'
|
||||
' |> sort(columns: ["_time"])'),
|
||||
flux("B", RENDEMENTS_FLUX +
|
||||
' |> keep(columns: ["_time", "_value", "chargeur"])\n'
|
||||
' |> pivot(rowKey: ["_time"], columnKey: ["chargeur"], valueColumn: "_value")\n'
|
||||
' |> sort(columns: ["_time"])\n'
|
||||
' |> fill(usePrevious: true, column: "MPPT 250/70 sud-est")\n'
|
||||
' |> fill(usePrevious: true, column: "RS 450/200 sud + ouest")\n'
|
||||
' |> fill(usePrevious: true, column: "150/35 suiveur")\n'
|
||||
' |> filter(fn: (r) => exists r["MPPT 250/70 sud-est"] and exists r["RS 450/200 sud + ouest"]\n'
|
||||
' and exists r["150/35 suiveur"])\n'
|
||||
' |> map(fn: (r) => ({ _time: r._time, Total: r["MPPT 250/70 sud-est"]\n'
|
||||
' + r["RS 450/200 sud + ouest"] + r["150/35 suiveur"] }))')],
|
||||
IN, 0, 23, 24, 8, "kwatth",
|
||||
"Le rendement du jour que chaque chargeur declare lui-meme (yield_today), "
|
||||
"remis a zero chaque nuit. C'est la production REELLE (MANUEL §0), la meme "
|
||||
"que sensor.evcs_production_jour_kwh et que l'agent vocal. Le Total "
|
||||
"n'apparait que si les trois chargeurs publient : un chargeur muet donne "
|
||||
"un total partiel, qu'on ne trace pas. Les trois ne se remettent pas a "
|
||||
"zero a la meme minute (vers 00:40). Le suiveur n'est exporte que depuis "
|
||||
"le 25/09.",
|
||||
extra={"overrides": [
|
||||
{"matcher": {"id": "byName", "options": "Total"},
|
||||
"properties": [{"id": "color", "value": {"mode": "fixed", "fixedColor": "yellow"}},
|
||||
{"id": "custom.lineWidth", "value": 3},
|
||||
{"id": "custom.fillOpacity", "value": 0}]}]}),
|
||||
|
||||
ts("Batterie", [
|
||||
sql("A", "SELECT date_trunc('minute', ts) AS time, avg(valeur) AS \"SOC\"\n"
|
||||
"FROM mesure WHERE cle = 'sensor.victron_battery_soc'\n"
|
||||
@@ -852,7 +898,13 @@ se = base
|
||||
or r.entity_id == "airtria_mppt1_pv_yield_power")
|
||||
|> map(fn: (r) => ({ r with tracker: "Sud-est (10 pan.)" }))
|
||||
|
||||
union(tables: [rs, se])
|
||||
sv = base
|
||||
|> filter(fn: (r) => r.entity_id == "v1_pv_bus_voltage"
|
||||
or r.entity_id == "v1_pv_current"
|
||||
or r.entity_id == "v1_pv_yield_power")
|
||||
|> map(fn: (r) => ({ r with tracker: "Suiveur (3 pan.)" }))
|
||||
|
||||
union(tables: [rs, se, sv])
|
||||
|> keep(columns: ["tracker", "_measurement", "_value"])
|
||||
|> pivot(rowKey: ["tracker"], columnKey: ["_measurement"], valueColumn: "_value")
|
||||
|> sort(columns: ["tracker"])'''
|
||||
@@ -968,8 +1020,9 @@ systeme = dashboard("evcs-systeme", "Le systeme", (
|
||||
dict(table("Detail par tracker", [flux("A", TRACKERS_FLUX)],
|
||||
IN, 5, 7, 13, 8,
|
||||
"Les 52 panneaux en quatre plans : sud-est 40 degres, trois chaines sud "
|
||||
"35 degres, ouest 45 degres. Le suiveur de trois panneaux ne publie pas "
|
||||
"de mode de fonctionnement et n'apparait donc pas ici.",
|
||||
"35 degres, ouest 45 degres, et le suiveur de trois panneaux. Le suiveur "
|
||||
"n'est exporte vers InfluxDB que depuis le 25/09 (il manquait a la liste "
|
||||
"d'export de Home Assistant, et non faute de publier).",
|
||||
overrides=[sur("tracker", [{"id": "displayName", "value": "Tracker"},
|
||||
{"id": "custom.width", "value": 200}]),
|
||||
sur("V", [{"id": "displayName", "value": "Tension"},
|
||||
|
||||
Reference in New Issue
Block a user