Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: Dashboard refinements and standardization #4367

Merged
merged 29 commits into from
Nov 18, 2024
Merged
Show file tree
Hide file tree
Changes from 3 commits
Commits
Show all changes
29 commits
Select commit Hold shift + click to select a range
ff925d3
use Unit kwatth instead of custom SQL
swiffer Nov 9, 2024
f55e7cb
replace last usage of case when with convert_km
swiffer Nov 10, 2024
4dd4c3b
Naming Conventions, Descriptions & Alignments in Calculations
swiffer Nov 10, 2024
ec0120e
use same query as in statistics
swiffer Nov 10, 2024
6a442cb
adapt Driving Efficiency in Drives (more in line with Efficiency and …
swiffer Nov 11, 2024
89a4dd9
fix hard-coded length unit
swiffer Nov 11, 2024
0f346ac
fix division by zero
swiffer Nov 11, 2024
904a5ad
fix: min allowed of minWidth is 50
swiffer Nov 11, 2024
e4a9434
a little more space here...
swiffer Nov 11, 2024
9e2da67
fix: minWidth for auto-scaling
swiffer Nov 11, 2024
e69c0cf
accurate consumption gross (exclude charges only)
swiffer Nov 12, 2024
e901ac1
. instead of ,
swiffer Nov 13, 2024
6387d39
improve consumption gross while charging
swiffer Nov 13, 2024
51dfeb5
faster consumption gross calculation
swiffer Nov 13, 2024
bdbc003
consistent # of X for counts
swiffer Nov 15, 2024
d3b2bbc
fix units of xy chart in battery health dashboard
swiffer Nov 16, 2024
1c765ee
fix labels of xy charts & add decimals in top suc in charging stats d…
swiffer Nov 16, 2024
0035868
change default time for trip to last 24h
swiffer Nov 16, 2024
0d2db6f
rework the query for better performance
swiffer Nov 16, 2024
bb08af6
perf-fix
swiffer Nov 16, 2024
2656fdf
high precision mode in statistics (consumption gross)
swiffer Nov 16, 2024
5ea2ec8
typo
swiffer Nov 16, 2024
f65a69a
same query in both dashboards - trips defaulting to high precision mo…
swiffer Nov 16, 2024
643e37f
remove starting at, covered by period
swiffer Nov 16, 2024
25c35ef
fix for periods starting and ending with charges + max one drive
swiffer Nov 16, 2024
a993710
further improve accuracy in low precision mode and low data sample count
swiffer Nov 17, 2024
7fe7d42
short, fast, accurate
swiffer Nov 17, 2024
b2636fa
fix sorting
swiffer Nov 17, 2024
b1eab61
fix / improve condition for auto-enabling high precision mode
swiffer Nov 18, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
96 changes: 28 additions & 68 deletions grafana/dashboards/battery-health.json

Large diffs are not rendered by default.

28 changes: 14 additions & 14 deletions grafana/dashboards/charges.json
Original file line number Diff line number Diff line change
Expand Up @@ -131,7 +131,7 @@
"properties": [
{
"id": "displayName",
"value": "Energy added:"
"value": "Total Energy added:"
JakobLichterfeld marked this conversation as resolved.
Show resolved Hide resolved
}
]
}
Expand Down Expand Up @@ -229,7 +229,7 @@
"properties": [
{
"id": "displayName",
"value": "Energy used:"
"value": "Total Energy used:"
}
]
}
Expand Down Expand Up @@ -328,7 +328,7 @@
"properties": [
{
"id": "displayName",
"value": "Cost:"
"value": "Total Charging Cost:"
}
]
}
Expand Down Expand Up @@ -428,7 +428,7 @@
"properties": [
{
"id": "displayName",
"value": "Average duration:"
"value": "Ø Duration:"
JakobLichterfeld marked this conversation as resolved.
Show resolved Hide resolved
}
]
}
Expand Down Expand Up @@ -560,15 +560,15 @@
"properties": [
{
"id": "displayName",
"value": "Added kWh"
"value": "Energy added"
JakobLichterfeld marked this conversation as resolved.
Show resolved Hide resolved
},
{
"id": "decimals",
"value": 2
},
{
"id": "custom.minWidth",
"value": 95
"value": 115
}
]
},
Expand All @@ -592,7 +592,7 @@
},
{
"id": "custom.minWidth",
"value": 62
"value": 70
}
]
},
Expand All @@ -616,7 +616,7 @@
},
{
"id": "custom.minWidth",
"value": 62
"value": 65
}
]
},
Expand All @@ -640,7 +640,7 @@
},
{
"id": "custom.minWidth",
"value": 75
"value": 80
}
]
},
Expand Down Expand Up @@ -994,15 +994,15 @@
"properties": [
{
"id": "displayName",
"value": "Used kWh"
"value": "Energy used"
},
{
"id": "decimals",
"value": 2
},
{
"id": "custom.minWidth",
"value": 85
"value": 105
}
]
},
Expand Down Expand Up @@ -1043,7 +1043,7 @@
},
{
"id": "custom.minWidth",
"value": 100
"value": 120
}
]
},
Expand Down Expand Up @@ -1079,7 +1079,7 @@
"properties": [
{
"id": "displayName",
"value": "Cost/kWh"
"value": "Cost / kWh"
},
{
"id": "decimals",
Expand Down Expand Up @@ -1221,7 +1221,7 @@
"group": [],
"metricColumn": "none",
"rawQuery": true,
"rawSql": "WITH data AS (\n SELECT\n (round(extract(epoch FROM start_date) - 10) * 1000) AS start_date_ts,\n (round(extract(epoch FROM end_date) + 10) * 1000) AS end_date_ts,\n start_date,\n end_date,\n CONCAT_WS(', ', COALESCE(addresses.name, nullif(CONCAT_WS(' ', addresses.road, addresses.house_number), '')), addresses.city) AS address,\n g.name as geofence_name,\n g.id as geofence_id,\n p.latitude,\n p.longitude,\n cp.charge_energy_added,\n cp.charge_energy_used,\n duration_min,\n start_battery_level,\n end_battery_level,\n end_${preferred_range}_range_km - start_${preferred_range}_range_km as range_added,\n outside_temp_avg,\n cp.id,\n p.odometer - lag(p.odometer) OVER (ORDER BY start_date) AS distance,\n cars.efficiency,\n cp.car_id,\n cost,\n max(c.charger_voltage) as max_charger_voltage,\n CASE WHEN NULLIF(mode() within group (order by charger_phases),0) is null THEN 'DC' ELSE 'AC' END AS charge_type,\n p.odometer as odometer\n FROM\n charging_processes cp\n\tLEFT JOIN charges c ON cp.id = c.charging_process_id\n LEFT JOIN positions p ON p.id = cp.position_id\n LEFT JOIN cars ON cars.id = cp.car_id\n LEFT JOIN addresses ON addresses.id = cp.address_id\n LEFT JOIN geofences g ON g.id = geofence_id\n WHERE \n cp.car_id = $car_id AND\n $__timeFilter(start_date) AND\n (cp.charge_energy_added IS NULL OR cp.charge_energy_added > 0) AND\n ('${geofence:pipe}' = '-1' OR geofence_id in ($geofence))\n GROUP BY 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 19, p.odometer\n ORDER BY\n start_date\n)\nSELECT\n start_date_ts,\n end_date_ts,\n CASE WHEN geofence_id IS NULL THEN CONCAT('new?lat=', latitude, '&lng=', longitude)\n WHEN geofence_id IS NOT NULL THEN CONCAT(geofence_id, '/edit')\n END as path,\n car_id,\n id,\n -- Columns\n start_date,\n end_date,\n COALESCE(geofence_name, address) as address, \n charge_type,\n duration_min,\n cost,\n cost / NULLIF(greatest(charge_energy_added, charge_energy_used), 0) as cost_per_kwh,\n charge_energy_added,\n charge_energy_used,\n CASE WHEN charge_energy_used IS NULL THEN NULL ELSE LEAST(charge_energy_added / NULLIF(charge_energy_used, 0), 1.0) END as charging_efficiency,\n convert_celsius(outside_temp_avg, '$temp_unit') AS outside_temp_avg_$temp_unit,\n charge_energy_added * 60 / NULLIF (duration_min, 0) AS charge_energy_added_per_hour,\n convert_km(range_added * 60 / NULLIF (duration_min, 0), '$length_unit') AS range_added_per_hour_$length_unit,\n convert_km(range_added, '$length_unit') AS range_added_$length_unit,\n start_battery_level,\n end_battery_level,\n convert_km(odometer::numeric, '$length_unit') AS odometer_$length_unit\n FROM\n data\nWHERE\n (distance >= 0 OR distance IS NULL)\n AND duration_min >= '$min_duration_min'\n AND \n CASE\n WHEN '$cost' !~ '^[0-9]+$' THEN TRUE \n ELSE cost >= COALESCE(NULLIF('$cost', '')::NUMERIC, 0) \n END\n AND charge_type = ANY(CASE WHEN array_to_string(ARRAY[$charge_type], ',') = 'DC' THEN ARRAY['DC'] WHEN array_to_string(ARRAY[$charge_type], ',') = 'AC' THEN ARRAY['AC'] ELSE ARRAY['DC', 'AC'] END)\n AND address ILIKE '%$location%'\nORDER BY\n start_date DESC;",
"rawSql": "WITH data AS (\n SELECT\n (round(extract(epoch FROM start_date) - 10) * 1000) AS start_date_ts,\n (round(extract(epoch FROM end_date) + 10) * 1000) AS end_date_ts,\n start_date,\n end_date,\n CONCAT_WS(', ', COALESCE(addresses.name, nullif(CONCAT_WS(' ', addresses.road, addresses.house_number), '')), addresses.city) AS address,\n g.name as geofence_name,\n g.id as geofence_id,\n p.latitude,\n p.longitude,\n cp.charge_energy_added,\n cp.charge_energy_used,\n duration_min,\n start_battery_level,\n end_battery_level,\n end_${preferred_range}_range_km - start_${preferred_range}_range_km as range_added,\n outside_temp_avg,\n cp.id,\n p.odometer - lag(p.odometer) OVER (ORDER BY start_date) AS distance,\n cars.efficiency,\n cp.car_id,\n cost,\n max(c.charger_voltage) as max_charger_voltage,\n CASE WHEN NULLIF(mode() within group (order by charger_phases),0) is null THEN 'DC' ELSE 'AC' END AS charge_type,\n p.odometer as odometer\n FROM\n charging_processes cp\n\tLEFT JOIN charges c ON cp.id = c.charging_process_id\n LEFT JOIN positions p ON p.id = cp.position_id\n LEFT JOIN cars ON cars.id = cp.car_id\n LEFT JOIN addresses ON addresses.id = cp.address_id\n LEFT JOIN geofences g ON g.id = geofence_id\n WHERE \n cp.car_id = $car_id AND\n $__timeFilter(start_date) AND\n (cp.charge_energy_added IS NULL OR cp.charge_energy_added > 0) AND\n ('${geofence:pipe}' = '-1' OR geofence_id in ($geofence))\n GROUP BY 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 19, p.odometer\n ORDER BY\n start_date\n)\nSELECT\n start_date_ts,\n end_date_ts,\n CASE WHEN geofence_id IS NULL THEN CONCAT('new?lat=', latitude, '&lng=', longitude)\n WHEN geofence_id IS NOT NULL THEN CONCAT(geofence_id, '/edit')\n END as path,\n car_id,\n id,\n -- Columns\n start_date,\n end_date,\n COALESCE(geofence_name, address) as address, \n charge_type,\n duration_min,\n cost,\n cost / NULLIF(greatest(charge_energy_added, charge_energy_used), 0) as cost_per_kwh,\n charge_energy_added,\n greatest(charge_energy_used, charge_energy_added) as charge_energy_used,\n charge_energy_added / greatest(charge_energy_used, charge_energy_added) as charging_efficiency,\n convert_celsius(outside_temp_avg, '$temp_unit') AS outside_temp_avg_$temp_unit,\n charge_energy_added * 60 / NULLIF (duration_min, 0) AS charge_energy_added_per_hour,\n convert_km(range_added * 60 / NULLIF (duration_min, 0), '$length_unit') AS range_added_per_hour_$length_unit,\n convert_km(range_added, '$length_unit') AS range_added_$length_unit,\n start_battery_level,\n end_battery_level,\n convert_km(odometer::numeric, '$length_unit') AS odometer_$length_unit\n FROM\n data\nWHERE\n (distance >= 0 OR distance IS NULL)\n AND duration_min >= '$min_duration_min'\n AND \n CASE\n WHEN '$cost' !~ '^[0-9]+$' THEN TRUE \n ELSE cost >= COALESCE(NULLIF('$cost', '')::NUMERIC, 0) \n END\n AND charge_type = ANY(CASE WHEN array_to_string(ARRAY[$charge_type], ',') = 'DC' THEN ARRAY['DC'] WHEN array_to_string(ARRAY[$charge_type], ',') = 'AC' THEN ARRAY['AC'] ELSE ARRAY['DC', 'AC'] END)\n AND address ILIKE '%$location%'\nORDER BY\n start_date DESC;",
"refId": "A",
"select": [
[
Expand Down
57 changes: 50 additions & 7 deletions grafana/dashboards/charging-stats.json
Original file line number Diff line number Diff line change
Expand Up @@ -291,7 +291,7 @@
]
}
],
"title": "Charged in total",
"title": "Total Energy added",
JakobLichterfeld marked this conversation as resolved.
Show resolved Hide resolved
"type": "stat"
},
{
Expand Down Expand Up @@ -1219,7 +1219,7 @@
"viz": false
}
},
"decimals": 0,
"decimals": 2,
"mappings": [],
"unit": "kwatth"
},
Expand Down Expand Up @@ -1298,11 +1298,12 @@
"type": "grafana-postgresql-datasource",
"uid": "TeslaMate"
},
"editorMode": "code",
"format": "time_series",
"group": [],
"metricColumn": "none",
"rawQuery": true,
"rawSql": "WITH data AS (\n SELECT\n\t\tcp.id,\n\t\tcp.charge_energy_added,\n\t\tCASE WHEN NULLIF(mode() within group (order by charger_phases),0) is null THEN 'DC'\n\t\t\t\t ELSE 'AC'\n\t\tEND AS current\n\tFROM charging_processes cp\n RIGHT JOIN charges ON cp.id = charges.charging_process_id\n WHERE\n\t cp.car_id = $car_id\n\t AND cp.charge_energy_added > 0.01\n\t AND $__timeFilter(start_date)\n GROUP BY 1,2\n)\nSELECT\n\tnow() AS time,\n\tsum(charge_energy_added) AS value,\n\tcurrent AS metric\nFROM data\nGROUP BY 3\nORDER BY metric DESC;",
"rawSql": "WITH data AS (\n SELECT\n\t\tcp.id,\n\t\tcp.charge_energy_added,\n\t\tCASE WHEN NULLIF(mode() within group (order by charger_phases),0) is null THEN 'DC'\n\t\t\t\t ELSE 'AC'\n\t\tEND AS current,\n\t\tcp.charge_energy_used\n\tFROM charging_processes cp\n RIGHT JOIN charges ON cp.id = charges.charging_process_id\n WHERE\n\t cp.car_id = $car_id\n\t AND cp.charge_energy_added > 0.01\n\t AND $__timeFilter(start_date)\n GROUP BY 1,2\n)\nSELECT\n\tnow() AS time,\n\tSUM(GREATEST(charge_energy_added, charge_energy_used)) AS value,\n\tcurrent AS metric\nFROM data\nGROUP BY 3\nORDER BY metric DESC;",
"refId": "A",
"select": [
[
Expand All @@ -1314,6 +1315,23 @@
}
]
],
"sql": {
"columns": [
{
"parameters": [],
"type": "function"
}
],
"groupBy": [
{
"property": {
"type": "string"
},
"type": "groupBy"
}
],
"limit": 50
},
"table": "addresses",
"timeColumn": "inserted_at",
"timeColumnType": "timestamp",
Expand All @@ -1326,7 +1344,7 @@
]
}
],
"title": "AC/DC - kWh",
"title": "AC/DC - Energy Used",
JakobLichterfeld marked this conversation as resolved.
Show resolved Hide resolved
"type": "piechart"
},
{
Expand Down Expand Up @@ -2331,6 +2349,14 @@
{
"id": "custom.align",
"value": "left"
},
{
"id": "unit",
"value": "kwatth"
},
{
"id": "decimals",
"value": 0
}
]
}
Expand Down Expand Up @@ -2362,11 +2388,12 @@
"type": "grafana-postgresql-datasource",
"uid": "TeslaMate"
},
"editorMode": "code",
"format": "table",
"group": [],
"metricColumn": "none",
"rawQuery": true,
"rawSql": "SELECT\n\tCOALESCE(geofence.name, CONCAT_WS(', ', COALESCE(address.name, nullif(CONCAT_WS(' ', address.road, address.house_number), '')), address.city)) AS location,\n\tCASE\n WHEN SUM(charge_energy_added) < 1000 THEN SUM(charge_energy_added)::NUMERIC(4,0)::VARCHAR || ' kWh' \n WHEN SUM(charge_energy_added) < 1000000 THEN (SUM(charge_energy_added) / 1000)::NUMERIC(9, 3)::VARCHAR || ' MWh' \n WHEN SUM(charge_energy_added) >= 1000000 THEN (SUM(charge_energy_added) / 1000000)::NUMERIC(9, 3)::VARCHAR || ' GWh' \n END as charge_energy_added\nFROM\n\tcharging_processes c\nLEFT JOIN addresses address ON c.address_id = address.id\nLEFT JOIN geofences geofence ON geofence_id = geofence.id\nWHERE\n\t$__timeFilter(end_date)\n\tAND car_id = $car_id\nGROUP BY\n\t1\nORDER BY\n\tSUM(charge_energy_added) DESC\nLIMIT 17;",
"rawSql": "SELECT\n\tCOALESCE(geofence.name, CONCAT_WS(', ', COALESCE(address.name, nullif(CONCAT_WS(' ', address.road, address.house_number), '')), address.city)) AS location,\n sum(charge_energy_added) as charge_energy_added\nFROM\n\tcharging_processes c\nLEFT JOIN addresses address ON c.address_id = address.id\nLEFT JOIN geofences geofence ON geofence_id = geofence.id\nWHERE\n\t$__timeFilter(end_date)\n\tAND car_id = $car_id\nGROUP BY\n\t1\nORDER BY\n\tSUM(charge_energy_added) DESC\nLIMIT 17;",
"refId": "A",
"select": [
[
Expand All @@ -2378,6 +2405,23 @@
}
]
],
"sql": {
"columns": [
{
"parameters": [],
"type": "function"
}
],
"groupBy": [
{
"property": {
"type": "string"
},
"type": "groupBy"
}
],
"limit": 50
},
"timeColumn": "time",
"where": [
{
Expand Down Expand Up @@ -2517,7 +2561,6 @@
"type": "table"
}
],
"refresh": false,
"schemaVersion": 39,
"tags": [
"tesla"
Expand Down Expand Up @@ -2627,6 +2670,6 @@
"timezone": "",
"title": "Charging Stats",
"uid": "-pkIkhmRz",
"version": 2,
"version": 1,
"weekStart": ""
}
Loading
Loading