From edf32d14745a67527e2139687450436c839b250b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 12 Nov 2023 17:12:53 +0000 Subject: [PATCH 001/113] Bump @babel/traverse from 7.22.5 to 7.23.3 in /website Bumps [@babel/traverse](https://github.com/babel/babel/tree/HEAD/packages/babel-traverse) from 7.22.5 to 7.23.3. - [Release notes](https://github.com/babel/babel/releases) - [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md) - [Commits](https://github.com/babel/babel/commits/v7.23.3/packages/babel-traverse) --- updated-dependencies: - dependency-name: "@babel/traverse" dependency-type: indirect ... Signed-off-by: dependabot[bot] --- website/package-lock.json | 167 ++++++++++++++++++++++++++------------ 1 file changed, 116 insertions(+), 51 deletions(-) diff --git a/website/package-lock.json b/website/package-lock.json index cb2a6cfa37..1afcd353a8 100644 --- a/website/package-lock.json +++ b/website/package-lock.json @@ -189,16 +189,81 @@ } }, "node_modules/@babel/code-frame": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.5.tgz", - "integrity": "sha512-Xmwn266vad+6DAqEB2A6V/CcZVp62BbwVmcOJc2RPuwih1kw02TjQvWVWlcKGbBPd+8/0V5DEkOcizRGYsspYQ==", + "version": "7.22.13", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz", + "integrity": "sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==", "dependencies": { - "@babel/highlight": "^7.22.5" + "@babel/highlight": "^7.22.13", + "chalk": "^2.4.2" }, "engines": { "node": ">=6.9.0" } }, + "node_modules/@babel/code-frame/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/code-frame/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/code-frame/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@babel/code-frame/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" + }, + "node_modules/@babel/code-frame/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@babel/code-frame/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/code-frame/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/@babel/compat-data": { "version": "7.22.5", "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.22.5.tgz", @@ -245,11 +310,11 @@ } }, "node_modules/@babel/generator": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.22.5.tgz", - "integrity": "sha512-+lcUbnTRhd0jOewtFSedLyiPsD5tswKkbgcezOqqWFUVNEwoUTlpPOBmvhG7OXWLR4jMdv0czPGH5XbflnD1EA==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.3.tgz", + "integrity": "sha512-keeZWAV4LU3tW0qRi19HRpabC/ilM0HRBBzf9/k8FFiG4KVpiv0FIy4hHfLfFQZNhziCTPTmd59zoyv6DNISzg==", "dependencies": { - "@babel/types": "^7.22.5", + "@babel/types": "^7.23.3", "@jridgewell/gen-mapping": "^0.3.2", "@jridgewell/trace-mapping": "^0.3.17", "jsesc": "^2.5.1" @@ -385,20 +450,20 @@ } }, "node_modules/@babel/helper-environment-visitor": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.5.tgz", - "integrity": "sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q==", + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", + "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-function-name": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.22.5.tgz", - "integrity": "sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", + "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", "dependencies": { - "@babel/template": "^7.22.5", - "@babel/types": "^7.22.5" + "@babel/template": "^7.22.15", + "@babel/types": "^7.23.0" }, "engines": { "node": ">=6.9.0" @@ -530,9 +595,9 @@ } }, "node_modules/@babel/helper-split-export-declaration": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.5.tgz", - "integrity": "sha512-thqK5QFghPKWLhAV321lxF95yCg2K3Ob5yw+M3VHWfdia0IkPXUtoLH8x/6Fh486QUvzhb8YOWHChTVen2/PoQ==", + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", + "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", "dependencies": { "@babel/types": "^7.22.5" }, @@ -549,9 +614,9 @@ } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.5.tgz", - "integrity": "sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==", + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", + "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", "engines": { "node": ">=6.9.0" } @@ -592,12 +657,12 @@ } }, "node_modules/@babel/highlight": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.5.tgz", - "integrity": "sha512-BSKlD1hgnedS5XRnGOljZawtag7H1yPfQp0tdNJCHoH6AZ+Pcm9VvkrK59/Yy593Ypg0zMxH2BxD1VPYUQ7UIw==", + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.20.tgz", + "integrity": "sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==", "dependencies": { - "@babel/helper-validator-identifier": "^7.22.5", - "chalk": "^2.0.0", + "@babel/helper-validator-identifier": "^7.22.20", + "chalk": "^2.4.2", "js-tokens": "^4.0.0" }, "engines": { @@ -669,9 +734,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.5.tgz", - "integrity": "sha512-DFZMC9LJUG9PLOclRC32G63UXwzqS2koQC8dkx+PLdmt1xSePYpbT/NbsrJy8Q/muXz7o/h/d4A7Fuyixm559Q==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.3.tgz", + "integrity": "sha512-uVsWNvlVsIninV2prNz/3lHCb+5CJ+e+IUBfbjToAHODtfGYLfCFuY4AU7TskI+dAKk+njsPiBjq1gKTvZOBaw==", "bin": { "parser": "bin/babel-parser.js" }, @@ -2018,31 +2083,31 @@ } }, "node_modules/@babel/template": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.5.tgz", - "integrity": "sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", + "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", "dependencies": { - "@babel/code-frame": "^7.22.5", - "@babel/parser": "^7.22.5", - "@babel/types": "^7.22.5" + "@babel/code-frame": "^7.22.13", + "@babel/parser": "^7.22.15", + "@babel/types": "^7.22.15" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.5.tgz", - "integrity": "sha512-7DuIjPgERaNo6r+PZwItpjCZEa5vyw4eJGufeLxrPdBXBoLcCJCIasvK6pK/9DVNrLZTLFhUGqaC6X/PA007TQ==", - "dependencies": { - "@babel/code-frame": "^7.22.5", - "@babel/generator": "^7.22.5", - "@babel/helper-environment-visitor": "^7.22.5", - "@babel/helper-function-name": "^7.22.5", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.3.tgz", + "integrity": "sha512-+K0yF1/9yR0oHdE0StHuEj3uTPzwwbrLGfNOndVJVV2TqA5+j3oljJUb4nmB954FLGjNem976+B+eDuLIjesiQ==", + "dependencies": { + "@babel/code-frame": "^7.22.13", + "@babel/generator": "^7.23.3", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.5", - "@babel/parser": "^7.22.5", - "@babel/types": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/parser": "^7.23.3", + "@babel/types": "^7.23.3", "debug": "^4.1.0", "globals": "^11.1.0" }, @@ -2051,12 +2116,12 @@ } }, "node_modules/@babel/types": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.5.tgz", - "integrity": "sha512-zo3MIHGOkPOfoRXitsgHLjEXmlDaD/5KU1Uzuc9GNiZPhSqVxVRtxuPaSBZDsYZ9qV88AjtMtWW7ww98loJ9KA==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.3.tgz", + "integrity": "sha512-OZnvoH2l8PK5eUvEcUyCt/sXgr/h+UWpVuBbOljwcrAgUl6lpchoQ++PHGyQy1AtYnVA6CEq3y5xeEI10brpXw==", "dependencies": { "@babel/helper-string-parser": "^7.22.5", - "@babel/helper-validator-identifier": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.20", "to-fast-properties": "^2.0.0" }, "engines": { From b995693fd79d7ff94f4e79f28873d747e733d4a9 Mon Sep 17 00:00:00 2001 From: ivanovd Date: Sun, 12 Nov 2023 19:13:20 +0200 Subject: [PATCH 002/113] Update freebsd.md (#3394) Updated the instructions. Tested on FreeBSD 13.2 jail - fresh install. --- website/docs/installation/freebsd.md | 22 ++++++++++++++++------ 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/website/docs/installation/freebsd.md b/website/docs/installation/freebsd.md index 607337604f..299a16d6b3 100644 --- a/website/docs/installation/freebsd.md +++ b/website/docs/installation/freebsd.md @@ -42,6 +42,7 @@ pkg install erlang
Elixir (v1.12+) + ```bash pkg install elixir ``` @@ -52,20 +53,29 @@ pkg install elixir Postgres (v14+) ```bash -pkg install postgresql14-server -pkg install postgresql14-contrib +pkg install postgresql16-server-16.0 +pkg install postgresql16-contrib-16.0 echo postgres_enable="yes" >> /etc/rc.conf ```
+
+ Initialize the database + +```bash +service postgresql initdb +``` + +
+
Grafana (v8.3.4+) & Plugins -The latest Grafana from ports/pkg has a startup issue with the rc script, starting via rc.local is the workaround. +(might be obsolete with Grafana 9, I had no issues with a fresh install) The latest Grafana from ports/pkg has a startup issue with the rc script, starting via rc.local is the workaround. ```bash -pkg install grafana8 +pkg install grafana9-9.5.7_2 echo grafana_enable="yes" >> /etc/rc.conf # Only needed if grafana fails to start via rc.conf echo "cd /tmp && /usr/local/etc/rc.d/grafana onestart" >> /etc/rc.local @@ -88,7 +98,7 @@ echo mosquitto_enable="yes" >> /etc/rc.conf ```bash pkg install node -pkg install npm-node +pkg install npm-node20-10.2.0 ```
@@ -215,7 +225,7 @@ service teslamate start ## Import Grafana Dashboards -1. Visit [localhost:3000](http://localhost:3000) and log in. The default credentials are: `admin:admin`. +1. Visit [localhost:3000](http://localhost:3000) and log in (don't forget to start the service: service grafana start). The default credentials are: `admin:admin`. 2. Create a data source with the name "TeslaMate": From 2202ca90c23d48792615a777c882b3caeed1514d Mon Sep 17 00:00:00 2001 From: Johannes Heck Date: Sun, 12 Nov 2023 18:15:30 +0100 Subject: [PATCH 003/113] Show all vehicles on drive stats dashboard (#3342) * show all vehicles on drive stats dashboard * fix car selection for efficiency and projected range dashboards as well --- grafana/dashboards/drive-stats.json | 4 ++-- grafana/dashboards/efficiency.json | 4 ++-- grafana/dashboards/projected-range.json | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/grafana/dashboards/drive-stats.json b/grafana/dashboards/drive-stats.json index 8f63018b34..d3298cccc6 100644 --- a/grafana/dashboards/drive-stats.json +++ b/grafana/dashboards/drive-stats.json @@ -1039,8 +1039,8 @@ "allValue": null, "current": { "selected": false, - "text": "1", - "value": "1" + "text": "All", + "value": "$__all" }, "datasource": "TeslaMate", "definition": "SELECT name AS __text, id AS __value FROM cars ORDER BY display_priority ASC, name ASC;", diff --git a/grafana/dashboards/efficiency.json b/grafana/dashboards/efficiency.json index 2fa2be68bb..1bd2bcb865 100644 --- a/grafana/dashboards/efficiency.json +++ b/grafana/dashboards/efficiency.json @@ -1052,8 +1052,8 @@ "allValue": null, "current": { "selected": false, - "text": "1", - "value": "1" + "text": "All", + "value": "$__all" }, "datasource": "TeslaMate", "definition": "SELECT name AS __text, id AS __value FROM cars ORDER BY display_priority ASC, name ASC;", diff --git a/grafana/dashboards/projected-range.json b/grafana/dashboards/projected-range.json index 9e829655a5..37b4b9f0eb 100644 --- a/grafana/dashboards/projected-range.json +++ b/grafana/dashboards/projected-range.json @@ -577,8 +577,8 @@ "allValue": null, "current": { "selected": false, - "text": "1", - "value": "1" + "text": "All", + "value": "$__all" }, "datasource": "TeslaMate", "definition": "SELECT name AS __text, id AS __value FROM cars ORDER BY display_priority ASC, name ASC;", From 38b1f8ac0c1815fc91c212374bb035a1aa3ed663 Mon Sep 17 00:00:00 2001 From: Dulanic <2948206+Dulanic@users.noreply.github.com> Date: Sun, 12 Nov 2023 11:21:46 -0600 Subject: [PATCH 004/113] Update updates.json (#3289) Fix for div by zero error. --- grafana/dashboards/updates.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/grafana/dashboards/updates.json b/grafana/dashboards/updates.json index 76ef746f9b..27d8029ae8 100644 --- a/grafana/dashboards/updates.json +++ b/grafana/dashboards/updates.json @@ -571,7 +571,7 @@ "group": [], "metricColumn": "none", "rawQuery": true, - "rawSql": "with u as (\r\n select *, coalesce(lag(start_date) over(order by start_date desc), now()) as next_start_date \r\n from updates\r\n where car_id = $car_id and $__timeFilter(start_date)\r\n),\r\nrng as (\r\n SELECT\r\n\t to_timestamp(floor(extract(epoch from date)/21600)*21600) AS date,\r\n\t (sum([[preferred_range]]_battery_range_km) / sum(coalesce(usable_battery_level,battery_level)) * 100 ) AS \"battery_rng\"\r\n FROM (\r\n select battery_level, usable_battery_level, date, rated_battery_range_km, ideal_battery_range_km\r\n from positions\r\n where car_id = $car_id and $__timeFilter(date) and ideal_battery_range_km is not null\r\n union all\r\n select battery_level, coalesce(usable_battery_level,battery_level) as usable_battery_level, date, rated_battery_range_km, ideal_battery_range_km\r\n from charges c\r\n join charging_processes p ON p.id = c.charging_process_id \r\n where $__timeFilter(date) and p.car_id = $car_id\r\n ) as data\r\n GROUP BY 1\r\n)\r\n\r\nselect\t\r\n u.start_date as time,\r\n\textract(EPOCH FROM u.end_date - u.start_date) AS update_duration,\r\n\textract(EPOCH FROM u.start_date - lag(u.start_date) OVER (ORDER BY u.start_date)) AS since_last_update,\r\n\tsplit_part(u.version, ' ', 1) as version,\r\n\tcount(distinct cp.id) as chg_ct,\r\n\tconvert_km(avg(r.battery_rng), '$length_unit')::numeric(6,2) AS avg_[[preferred_range]]_range_[[length_unit]]\r\nfrom u u\r\nleft join charging_processes cp\r\n\tON u.car_id = cp.car_id\r\n \tand cp.start_date between u.start_date and u.next_start_date\r\nleft join rng r\r\n\tON r.date between u.start_date and u.next_start_date\r\ngroup by u.car_id,\r\n\tu.start_date,\r\n\tu.end_date,\r\n\tnext_start_date,\r\n\tsplit_part(u.version, ' ', 1)", + "rawSql": "with u as (\r\n select *, coalesce(lag(start_date) over(order by start_date desc), now()) as next_start_date \r\n from updates\r\n where car_id = $car_id and $__timeFilter(start_date)\r\n),\r\nrng as (\r\n SELECT\r\n\t to_timestamp(floor(extract(epoch from date)/21600)*21600) AS date,\r\n\t (sum([[preferred_range]]_battery_range_km) / nullif(sum(coalesce(usable_battery_level,battery_level)),0) * 100 ) AS \"battery_rng\"\r\n FROM (\r\n select battery_level, usable_battery_level, date, rated_battery_range_km, ideal_battery_range_km\r\n from positions\r\n where car_id = $car_id and $__timeFilter(date) and ideal_battery_range_km is not null\r\n union all\r\n select battery_level, coalesce(usable_battery_level,battery_level) as usable_battery_level, date, rated_battery_range_km, ideal_battery_range_km\r\n from charges c\r\n join charging_processes p ON p.id = c.charging_process_id \r\n where $__timeFilter(date) and p.car_id = $car_id\r\n ) as data\r\n GROUP BY 1\r\n)\r\n\r\nselect\t\r\n u.start_date as time,\r\n\textract(EPOCH FROM u.end_date - u.start_date) AS update_duration,\r\n\textract(EPOCH FROM u.start_date - lag(u.start_date) OVER (ORDER BY u.start_date)) AS since_last_update,\r\n\tsplit_part(u.version, ' ', 1) as version,\r\n\tcount(distinct cp.id) as chg_ct,\r\n\tconvert_km(avg(r.battery_rng), '$length_unit')::numeric(6,2) AS avg_[[preferred_range]]_range_[[length_unit]]\r\nfrom u u\r\nleft join charging_processes cp\r\n\tON u.car_id = cp.car_id\r\n \tand cp.start_date between u.start_date and u.next_start_date\r\nleft join rng r\r\n\tON r.date between u.start_date and u.next_start_date\r\ngroup by u.car_id,\r\n\tu.start_date,\r\n\tu.end_date,\r\n\tnext_start_date,\r\n\tsplit_part(u.version, ' ', 1)", "refId": "A", "select": [ [ From 8283be8b6d6003238d10a800a3360033c7913b92 Mon Sep 17 00:00:00 2001 From: DrMichael Date: Sun, 12 Nov 2023 18:22:21 +0100 Subject: [PATCH 005/113] Update charge-details.json (#3294) Show location name in charge details. As proposed in https://github.com/adriankumpf/teslamate/issues/3293 --- grafana/dashboards/internal/charge-details.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/grafana/dashboards/internal/charge-details.json b/grafana/dashboards/internal/charge-details.json index 77906afa39..6bbcb0690e 100644 --- a/grafana/dashboards/internal/charge-details.json +++ b/grafana/dashboards/internal/charge-details.json @@ -612,10 +612,10 @@ "calcs": [ "lastNotNull" ], - "fields": "", + "fields": "/.*/", "values": false }, - "textMode": "auto" + "textMode": "value" }, "pluginVersion": "8.5.4", "targets": [ From 3387b07be512118e5bd207705cd845df8ecf9d99 Mon Sep 17 00:00:00 2001 From: jlestel Date: Sun, 12 Nov 2023 18:28:12 +0100 Subject: [PATCH 006/113] Fix: broken links when orgId is not 1 (#3380) * fix: broken links when orgId is not 1 * fix --------- Co-authored-by: Julien --- grafana/dashboards/overview.json | 8 ++++---- grafana/dashboards/statistics.json | 8 ++++---- grafana/dashboards/timeline.json | 4 ++-- grafana/dashboards/trip.json | 2 +- 4 files changed, 11 insertions(+), 11 deletions(-) diff --git a/grafana/dashboards/overview.json b/grafana/dashboards/overview.json index 1bf67a9aac..088fd910e0 100644 --- a/grafana/dashboards/overview.json +++ b/grafana/dashboards/overview.json @@ -368,7 +368,7 @@ { "targetBlank": true, "title": "Drive details", - "url": "/d/zm7wN6Zgz/drive-details?orgId=1" + "url": "/d/zm7wN6Zgz/drive-details" } ], "options": { @@ -770,7 +770,7 @@ { "targetBlank": true, "title": "Updates", - "url": "/d/IiC07mgWz/updates?orgId=1" + "url": "/d/IiC07mgWz/updates" } ], "maxDataPoints": 100, @@ -882,7 +882,7 @@ { "targetBlank": true, "title": "Mileage", - "url": "/d/NjtMTFggz/mileage?orgId=1" + "url": "/d/NjtMTFggz/mileage" } ], "maxDataPoints": 100, @@ -1094,7 +1094,7 @@ { "targetBlank": true, "title": "Charging Details", - "url": "/d/BHhxFeZRz/charge-details?orgId=1" + "url": "/d/BHhxFeZRz/charge-details" } ], "options": { diff --git a/grafana/dashboards/statistics.json b/grafana/dashboards/statistics.json index bfab7cd838..5ec6f69dac 100644 --- a/grafana/dashboards/statistics.json +++ b/grafana/dashboards/statistics.json @@ -121,7 +121,7 @@ { "targetBlank": true, "title": "Trip", - "url": "d/FkUpJpQZk/trip?orgId=1&from=${__data.fields.date_from}&to=${__data.fields.date_to}&var-car_id=$car_id" + "url": "d/FkUpJpQZk/trip?from=${__data.fields.date_from}&to=${__data.fields.date_to}&var-car_id=$car_id" } ] } @@ -179,7 +179,7 @@ { "targetBlank": true, "title": "Charging stats", - "url": "d/-pkIkhmRz/charging-stats?orgId=1&from=${__data.fields.date_from}&to=${__data.fields.date_to}&var-car_id=$car_id" + "url": "d/-pkIkhmRz/charging-stats?from=${__data.fields.date_from}&to=${__data.fields.date_to}&var-car_id=$car_id" } ] }, @@ -229,7 +229,7 @@ { "targetBlank": true, "title": "Charges", - "url": "d/TSmNYvRRk/charges?orgId=1&from=${__data.fields.date_from}&to=${__data.fields.date_to}&var-car_id=$car_id" + "url": "d/TSmNYvRRk/charges?from=${__data.fields.date_from}&to=${__data.fields.date_to}&var-car_id=$car_id" } ] } @@ -247,7 +247,7 @@ { "targetBlank": true, "title": "Drives", - "url": "d/Y8upc6ZRk/drives?orgId=1&from=${__data.fields.date_from}&to=${__data.fields.date_to}&var-car_id=$car_id" + "url": "d/Y8upc6ZRk/drives?from=${__data.fields.date_from}&to=${__data.fields.date_to}&var-car_id=$car_id" } ] } diff --git a/grafana/dashboards/timeline.json b/grafana/dashboards/timeline.json index a624a1d1f1..4c946ce14f 100644 --- a/grafana/dashboards/timeline.json +++ b/grafana/dashboards/timeline.json @@ -112,7 +112,7 @@ { "targetBlank": true, "title": "", - "url": "d/FkUpJpQZk/trip?orgId=1&from=${__data.fields.start_date_ts}&to=${__data.fields.end_date_ts}&var-car_id=$car_id" + "url": "d/FkUpJpQZk/trip?from=${__data.fields.start_date_ts}&to=${__data.fields.end_date_ts}&var-car_id=$car_id" } ] } @@ -544,7 +544,7 @@ "group": [], "metricColumn": "none", "rawQuery": true, - "rawSql": "SELECT\r\n start_date AS \"Start\",\r\n end_date AS \"End\",\r\n ROUND(EXTRACT(EPOCH FROM start_date))*1000 AS start_date_ts,\r\n ROUND(EXTRACT(EPOCH FROM end_date))*1000 AS end_date_ts,\r\n '🚗 Driving' AS \"Action\",\r\n drives.duration_min AS \"Duration\",\r\n CASE WHEN start_geofence_id IS NULL THEN CONCAT('new?lat=', TP1.latitude, '&lng=', TP1.longitude)\r\n WHEN start_geofence_id IS NOT NULL THEN CONCAT(start_geofence_id, '/edit')\r\n END AS start_path,\r\n CASE WHEN end_geofence_id IS NULL THEN CONCAT('new?lat=', TP2.latitude, '&lng=', TP2.longitude)\r\n WHEN start_geofence_id IS NOT NULL THEN CONCAT(end_geofence_id, '/edit')\r\n END AS end_path,\r\n COALESCE(start_geofence.name, CONCAT_WS(', ', COALESCE(start_address.name, nullif(CONCAT_WS(' ', start_address.road, start_address.house_number), '')), start_address.city)) AS \"Start Address\",\r\n COALESCE(end_geofence.name, CONCAT_WS(', ', COALESCE(end_address.name, nullif(CONCAT_WS(' ', end_address.road, end_address.house_number), '')), end_address.city)) AS \"End Address\",\r\n convert_km(end_km::NUMERIC, '$length_unit') AS odometer_$length_unit,\r\n convert_km(distance::NUMERIC, '$length_unit') AS distance_$length_unit,\r\n convert_km(end_[[preferred_range]]_range_km::NUMERIC, '$length_unit') AS end_range_$length_unit,\r\n convert_km((end_[[preferred_range]]_range_km - start_[[preferred_range]]_range_km)::NUMERIC, '$length_unit') * efficiency AS \"kWh\",\r\n convert_km((end_[[preferred_range]]_range_km - start_[[preferred_range]]_range_km)::NUMERIC, '$length_unit') AS range_diff_$length_unit,\r\n TP2.battery_level AS \"SoC\",\r\n TP2.battery_level-TP1.battery_level AS \"SoC Diff\",\r\n convert_celsius(outside_temp_avg, '$temp_unit') AS outside_temp_avg_$temp_unit,\r\n CONCAT('d/zm7wN6Zgz/drive-details?orgId=1&from=', ROUND(EXTRACT(EPOCH FROM start_date))*1000, '&to=', ROUND(EXTRACT(EPOCH FROM end_date))*1000, '&var-car_id=', drives.car_id, '&var-drive_id=', drives.id) AS slotlink\r\nFROM drives\r\n LEFT OUTER JOIN positions AS TP1 on drives.start_position_id = TP1.id\r\n LEFT OUTER JOIN positions AS TP2 on drives.end_position_id = TP2.id\r\n LEFT JOIN addresses start_address ON start_address_id = start_address.id\r\n LEFT JOIN addresses end_address ON end_address_id = end_address.id\r\n LEFT JOIN geofences start_geofence ON start_geofence_id = start_geofence.id\r\n LEFT JOIN geofences end_geofence ON end_geofence_id = end_geofence.id\r\n JOIN cars ON cars.id = drives.car_id\r\nWHERE \r\n $__timeFilter(drives.start_date)\r\n AND drives.car_id = $car_id\r\n AND '🚗 Driving' in ($action_filter)\r\n AND\r\n (COALESCE(start_geofence.name, CONCAT_WS(', ', COALESCE(start_address.name, nullif(CONCAT_WS(' ', start_address.road, start_address.house_number), '')), start_address.city))::TEXT like '%$text_filter%' or\r\n COALESCE(end_geofence.name, CONCAT_WS(', ', COALESCE(end_address.name, nullif(CONCAT_WS(' ', end_address.road, end_address.house_number), '')), end_address.city))::TEXT like '%$text_filter%')\r\n\r\nUNION\r\nSELECT\r\n start_date AS \"Start\",\r\n end_date AS \"End\",\r\n ROUND(EXTRACT(EPOCH FROM start_date))*1000 AS start_date_ts,\r\n ROUND(EXTRACT(EPOCH FROM end_date))*1000 AS end_date_ts,\r\n '🔋 Charging' AS \"Action\",\r\n charging_processes.duration_min AS \"Duration\",\r\n CASE WHEN geofence_id IS NULL THEN CONCAT('new?lat=', address.latitude, '&lng=', address.longitude)\r\n WHEN geofence_id IS NOT NULL THEN CONCAT(geofence_id, '/edit')\r\n END AS start_path,\r\n NULL AS end_path,\r\n COALESCE(geofence.name, CONCAT_WS(', ', COALESCE(address.name, nullif(CONCAT_WS(' ', address.road, address.house_number), '')), address.city)) AS \"Start Address\",\r\n '' AS \"End Address\",\r\n convert_km(position.odometer::NUMERIC, '$length_unit') AS odometer_$length_unit,\r\n NULL AS distance_$length_unit,\r\n convert_km(end_[[preferred_range]]_range_km::NUMERIC, '$length_unit') AS end_range_$length_unit,\r\n charging_processes.charge_energy_added AS \"kWh\",\r\n convert_km((end_[[preferred_range]]_range_km - start_[[preferred_range]]_range_km)::NUMERIC, '$length_unit') AS range_diff_$length_unit, \r\n end_battery_level AS \"SoC\",\r\n end_battery_level - start_battery_level AS \"SoC Diff\",\r\n convert_celsius(outside_temp_avg, '$temp_unit') AS outside_temp_avg_$temp_unit,\r\n CONCAT('d/BHhxFeZRz/charge-details?orgId=1&from=', ROUND(EXTRACT(EPOCH FROM start_date)-10)*1000, '&to=', ROUND(EXTRACT(EPOCH FROM end_date)+10)*1000, '&var-car_id=', charging_processes.car_id, '&var-charging_process_id=', charging_processes.id) AS slotlink\r\nFROM charging_processes\r\n INNER JOIN positions AS position ON position_id = position.id\r\n LEFT JOIN addresses address ON address_id = address.id\r\n LEFT JOIN geofences geofence ON geofence_id = geofence.id\r\nWHERE\r\n $__timeFilter(charging_processes.start_date)\r\n AND charging_processes.charge_energy_added > 0\r\n AND charging_processes.car_id = $car_id\r\n AND '🔋 Charging' in ($action_filter)\r\n AND COALESCE(geofence.name, CONCAT_WS(', ', COALESCE(address.name, nullif(CONCAT_WS(' ', address.road, address.house_number), '')), address.city))::TEXT like '%$text_filter%'\r\nUNION\r\nSELECT\r\n d.end_date AS \"Start\",\r\n LEAD(d.start_date) over w AS \"End\",\r\n ROUND(EXTRACT(EPOCH FROM d.end_date)) * 1000 AS start_date_ts,\r\n ROUND(EXTRACT(EPOCH FROM LEAD(d.start_date) over w))*1000 AS end_date_ts,\r\n '🅿️ Parking' AS \"Action\",\r\n EXTRACT(EPOCH FROM LEAD(d.start_date) over w - d.end_date)/60 AS \"Duration\",\r\n CASE WHEN d.end_geofence_id IS NULL THEN CONCAT('new?lat=', end_position.latitude, '&lng=', end_position.longitude)\r\n WHEN d.end_geofence_id IS NOT NULL THEN CONCAT(d.end_geofence_id, '/edit')\r\n END AS start_path,\r\n NULL AS end_path,\r\n COALESCE(geofence.name, CONCAT_WS(', ', COALESCE(address.name, nullif(CONCAT_WS(' ', address.road, address.house_number), '')), address.city)) AS \"Start Address\",\r\n '' AS \"End Address\",\r\n convert_km(end_position.odometer::NUMERIC, '$length_unit') AS odometer_$length_unit,\r\n NULL AS distance_$length_unit,\r\n convert_km(LEAD(d.start_[[preferred_range]]_range_km) over w::NUMERIC, '$length_unit') AS end_range_$length_unit,\r\n convert_km(((LEAD(d.start_[[preferred_range]]_range_km) over w + (LEAD(d.start_km) over w - d.end_km)) - d.end_[[preferred_range]]_range_km)::NUMERIC, '$length_unit') * efficiency AS \"kWh\",\r\n convert_km(((LEAD(d.start_[[preferred_range]]_range_km) over w + (LEAD(d.start_km) over w - d.end_km)) - d.end_[[preferred_range]]_range_km)::NUMERIC, '$length_unit') AS range_diff_$length_unit,\r\n LEAD(start_position.battery_level) over w AS \"SoC\",\r\n LEAD(start_position.battery_level) over w - end_position.battery_level AS \"SoC Diff\",\r\n convert_celsius(outside_temp_avg, '$temp_unit') AS outside_temp_avg_$temp_unit,\r\n CONCAT('d/FkUpJpQZk/trip?orgId=1&from=', ROUND(EXTRACT(EPOCH FROM d.end_date))*1000, '&to=', ROUND(EXTRACT(EPOCH FROM LEAD(d.start_date) over w))*1000, '&var-car_id=', d.car_id) AS slotlink\r\nFROM\r\n drives AS d\r\n LEFT OUTER JOIN positions start_position on d.start_position_id = start_position.id\r\n LEFT OUTER JOIN positions end_position on d.end_position_id = end_position.id\r\n LEFT JOIN addresses address ON d.end_address_id = address.id\r\n LEFT JOIN geofences geofence ON d.end_geofence_id = geofence.id\r\n JOIN cars ON cars.id = d.car_id\r\nWHERE\r\n $__timeFilter(d.end_date)\r\n AND d.car_id=$car_id\r\n AND '🅿️ Parking' in ($action_filter)\r\n AND COALESCE(geofence.name, CONCAT_WS(', ', COALESCE(address.name, nullif(CONCAT_WS(' ', address.road, address.house_number), '')), address.city))::TEXT like '%$text_filter%'\r\nWINDOW w as (ORDER BY d.id ASC)\r\n\r\nUNION\r\nSELECT\r\n\tT1.end_date +(1 * interval '1 second') AS \"Start\", -- added 1 sec to get it after the corresponding Parking row\r\n\tT2.start_date AS \"End\",\r\n\tROUND(EXTRACT(EPOCH FROM T2.start_date)) * 1000 - 1 AS start_date_ts,\r\n\tROUND(EXTRACT(EPOCH FROM T2.start_date)) * 1000 - 1 AS end_date_ts,\r\n\t'❓ Missing' AS \"Action\",\r\n\t-- EXTRACT(EPOCH FROM T2.start_date - T1.end_date)/60 AS \"Duration\",\r\n\tNULL AS \"Duration\",\r\n\tCASE WHEN T1.end_geofence_id IS NULL THEN CONCAT('new?lat=', TP1.latitude, '&lng=', TP1.longitude)\r\n\t\tWHEN T1.end_geofence_id IS NOT NULL THEN CONCAT(T1.end_geofence_id, '/edit')\r\n\tEND AS start_path,\r\n\tCASE WHEN T2.start_geofence_id IS NULL THEN CONCAT('new?lat=', TP2.latitude, '&lng=', TP2.longitude)\r\n\t\tWHEN T2.start_geofence_id IS NOT NULL THEN CONCAT(T2.start_geofence_id, '/edit')\r\n\tEND AS end_path,\r\n\tCOALESCE(start_geofence.name, CONCAT_WS(', ', COALESCE(start_address.name, nullif(CONCAT_WS(' ', start_address.road, start_address.house_number), '')), start_address.city)) AS \"Start Address\",\r\n\tCOALESCE(end_geofence.name, CONCAT_WS(', ', COALESCE(end_address.name, nullif(CONCAT_WS(' ', end_address.road, end_address.house_number), '')), end_address.city)) AS \"End Address\",\r\n\tconvert_km(TP2.odometer::INTEGER, '$length_unit') AS odometer_$length_unit,\r\n\tconvert_km((TP2.odometer - TP1.odometer)::INTEGER, '$length_unit') AS distance_$length_unit,\r\n convert_km(T2.end_[[preferred_range]]_range_km::NUMERIC, '$length_unit') AS end_range_$length_unit,\r\n\tconvert_km(((TP2.[[preferred_range]]_battery_range_km + (TP2.odometer - TP1.odometer)) - TP1.[[preferred_range]]_battery_range_km)::INTEGER, '$length_unit')::INTEGER * efficiency AS \"kWh\",\r\n\tconvert_km(((TP2.[[preferred_range]]_battery_range_km + (TP2.odometer - TP1.odometer)) - TP1.[[preferred_range]]_battery_range_km)::INTEGER, '$length_unit') AS range_diff_$length_unit,\r\n\tNULL AS \"SoC\",\r\n\tNULL AS \"SoC Diff\",\r\n\tNULL AS outside_temp_avg_$temp_unit,\r\n\tNULL AS slotlink\r\n\t-- TP2.battery_level AS \"SoC\",\r\n\t-- TP2.battery_level-TP1.battery_level AS \"SoC Diff\",\r\n\t-- (T1.outside_temp_avg+T2.outside_temp_avg)/2 AS outside_temp_avg_$temp_unit\r\nFROM\r\n\t(SELECT row_number() over(ORDER BY start_date) AS time_id, * FROM drives) AS T1\r\n\tLEFT OUTER JOIN (SELECT row_number() over(ORDER BY start_date) AS time_id, * FROM drives ) AS T2 on T1.time_id + 1 = T2.time_id\r\n\tLEFT OUTER JOIN positions AS TP1 on T1.end_position_id = TP1.id\r\n\tLEFT OUTER JOIN positions AS TP2 on T2.start_position_id = TP2.id\r\n\tLEFT JOIN addresses start_address ON T1.end_address_id = start_address.id\r\n\tLEFT JOIN addresses end_address ON T2.start_address_id = end_address.id\r\n\tLEFT JOIN geofences start_geofence ON T1.end_geofence_id = start_geofence.id\r\n\tLEFT JOIN geofences end_geofence ON T2.start_geofence_id = end_geofence.id\r\n\tJOIN cars ON cars.id = T2.car_id\r\nWHERE\r\n\t$__timeFilter(T1.end_date)\r\n\tAND T1.car_id=$car_id \r\n\tAND T2.car_id=$car_id \r\n\tAND TP2.car_id=$car_id \r\n\tAND TP1.car_id=$car_id \r\n\tAND TP2.odometer - TP1.odometer > 0.5\r\n\tAND T1.end_address_id <> T2.start_address_id AND ((T1.end_geofence_id IS NOT NULL OR T2.end_geofence_id IS NOT NULL) OR T1.end_geofence_id <> T2.start_geofence_id)\r\n\tAND '❓ Missing' in ($action_filter)\r\n\tAND (\r\n\t (COALESCE(start_geofence.name, CONCAT_WS(', ', COALESCE(start_address.name, nullif(CONCAT_WS(' ', start_address.road, start_address.house_number), '')), start_address.city))::TEXT like '%$text_filter%') or\r\n\t (COALESCE(end_geofence.name, CONCAT_WS(', ', COALESCE(end_address.name, nullif(CONCAT_WS(' ', end_address.road, end_address.house_number), '')), end_address.city)))::TEXT like '%$text_filter%')\r\nUNION\r\nSELECT\r\n start_date AS \"Start\",\r\n end_date AS \"End\",\r\n ROUND(EXTRACT(EPOCH FROM start_date))*1000 AS start_date_ts, \r\n ROUND(EXTRACT(EPOCH FROM end_date))*1000 AS end_date_ts, \r\n '💾 Updating' AS \"Action\",\r\n\tEXTRACT(EPOCH FROM end_date - start_date)/60 AS \"Duration\",\r\n NULL AS start_path,\r\n NULL AS end_path,\r\n version AS \"Start Address\",\r\n '' AS \"End Address\",\r\n NULL AS odometer_$length_unit,\r\n NULL AS distance_$length_unit,\r\n NULL AS end_range_$length_unit,\r\n NULL AS \"kWh\",\r\n NULL AS range_diff_$length_unit,\r\n NULL AS \"SoC\",\r\n NULL AS \"SoC Diff\",\r\n NULL AS outside_temp_avg_$temp_unit,\r\n CONCAT('https://www.notateslaapp.com/software-updates/version/', split_part(version, ' ', 1), '/release-notes') AS slotlink\r\nFROM updates\r\nWHERE \r\n $__timeFilter(start_date)\r\n AND car_id = $car_id \r\n AND '💾 Updating' in ($action_filter)\r\n AND version::TEXT like '%$text_filter%'\r\n\r\nORDER BY \"Start\" DESC;", + "rawSql": "SELECT\r\n start_date AS \"Start\",\r\n end_date AS \"End\",\r\n ROUND(EXTRACT(EPOCH FROM start_date))*1000 AS start_date_ts,\r\n ROUND(EXTRACT(EPOCH FROM end_date))*1000 AS end_date_ts,\r\n '🚗 Driving' AS \"Action\",\r\n drives.duration_min AS \"Duration\",\r\n CASE WHEN start_geofence_id IS NULL THEN CONCAT('new?lat=', TP1.latitude, '&lng=', TP1.longitude)\r\n WHEN start_geofence_id IS NOT NULL THEN CONCAT(start_geofence_id, '/edit')\r\n END AS start_path,\r\n CASE WHEN end_geofence_id IS NULL THEN CONCAT('new?lat=', TP2.latitude, '&lng=', TP2.longitude)\r\n WHEN start_geofence_id IS NOT NULL THEN CONCAT(end_geofence_id, '/edit')\r\n END AS end_path,\r\n COALESCE(start_geofence.name, CONCAT_WS(', ', COALESCE(start_address.name, nullif(CONCAT_WS(' ', start_address.road, start_address.house_number), '')), start_address.city)) AS \"Start Address\",\r\n COALESCE(end_geofence.name, CONCAT_WS(', ', COALESCE(end_address.name, nullif(CONCAT_WS(' ', end_address.road, end_address.house_number), '')), end_address.city)) AS \"End Address\",\r\n convert_km(end_km::NUMERIC, '$length_unit') AS odometer_$length_unit,\r\n convert_km(distance::NUMERIC, '$length_unit') AS distance_$length_unit,\r\n convert_km(end_[[preferred_range]]_range_km::NUMERIC, '$length_unit') AS end_range_$length_unit,\r\n convert_km((end_[[preferred_range]]_range_km - start_[[preferred_range]]_range_km)::NUMERIC, '$length_unit') * efficiency AS \"kWh\",\r\n convert_km((end_[[preferred_range]]_range_km - start_[[preferred_range]]_range_km)::NUMERIC, '$length_unit') AS range_diff_$length_unit,\r\n TP2.battery_level AS \"SoC\",\r\n TP2.battery_level-TP1.battery_level AS \"SoC Diff\",\r\n convert_celsius(outside_temp_avg, '$temp_unit') AS outside_temp_avg_$temp_unit,\r\n CONCAT('d/zm7wN6Zgz/drive-details?from=', ROUND(EXTRACT(EPOCH FROM start_date))*1000, '&to=', ROUND(EXTRACT(EPOCH FROM end_date))*1000, '&var-car_id=', drives.car_id, '&var-drive_id=', drives.id) AS slotlink\r\nFROM drives\r\n LEFT OUTER JOIN positions AS TP1 on drives.start_position_id = TP1.id\r\n LEFT OUTER JOIN positions AS TP2 on drives.end_position_id = TP2.id\r\n LEFT JOIN addresses start_address ON start_address_id = start_address.id\r\n LEFT JOIN addresses end_address ON end_address_id = end_address.id\r\n LEFT JOIN geofences start_geofence ON start_geofence_id = start_geofence.id\r\n LEFT JOIN geofences end_geofence ON end_geofence_id = end_geofence.id\r\n JOIN cars ON cars.id = drives.car_id\r\nWHERE \r\n $__timeFilter(drives.start_date)\r\n AND drives.car_id = $car_id\r\n AND '🚗 Driving' in ($action_filter)\r\n AND\r\n (COALESCE(start_geofence.name, CONCAT_WS(', ', COALESCE(start_address.name, nullif(CONCAT_WS(' ', start_address.road, start_address.house_number), '')), start_address.city))::TEXT like '%$text_filter%' or\r\n COALESCE(end_geofence.name, CONCAT_WS(', ', COALESCE(end_address.name, nullif(CONCAT_WS(' ', end_address.road, end_address.house_number), '')), end_address.city))::TEXT like '%$text_filter%')\r\n\r\nUNION\r\nSELECT\r\n start_date AS \"Start\",\r\n end_date AS \"End\",\r\n ROUND(EXTRACT(EPOCH FROM start_date))*1000 AS start_date_ts,\r\n ROUND(EXTRACT(EPOCH FROM end_date))*1000 AS end_date_ts,\r\n '🔋 Charging' AS \"Action\",\r\n charging_processes.duration_min AS \"Duration\",\r\n CASE WHEN geofence_id IS NULL THEN CONCAT('new?lat=', address.latitude, '&lng=', address.longitude)\r\n WHEN geofence_id IS NOT NULL THEN CONCAT(geofence_id, '/edit')\r\n END AS start_path,\r\n NULL AS end_path,\r\n COALESCE(geofence.name, CONCAT_WS(', ', COALESCE(address.name, nullif(CONCAT_WS(' ', address.road, address.house_number), '')), address.city)) AS \"Start Address\",\r\n '' AS \"End Address\",\r\n convert_km(position.odometer::NUMERIC, '$length_unit') AS odometer_$length_unit,\r\n NULL AS distance_$length_unit,\r\n convert_km(end_[[preferred_range]]_range_km::NUMERIC, '$length_unit') AS end_range_$length_unit,\r\n charging_processes.charge_energy_added AS \"kWh\",\r\n convert_km((end_[[preferred_range]]_range_km - start_[[preferred_range]]_range_km)::NUMERIC, '$length_unit') AS range_diff_$length_unit, \r\n end_battery_level AS \"SoC\",\r\n end_battery_level - start_battery_level AS \"SoC Diff\",\r\n convert_celsius(outside_temp_avg, '$temp_unit') AS outside_temp_avg_$temp_unit,\r\n CONCAT('d/BHhxFeZRz/charge-details?from=', ROUND(EXTRACT(EPOCH FROM start_date)-10)*1000, '&to=', ROUND(EXTRACT(EPOCH FROM end_date)+10)*1000, '&var-car_id=', charging_processes.car_id, '&var-charging_process_id=', charging_processes.id) AS slotlink\r\nFROM charging_processes\r\n INNER JOIN positions AS position ON position_id = position.id\r\n LEFT JOIN addresses address ON address_id = address.id\r\n LEFT JOIN geofences geofence ON geofence_id = geofence.id\r\nWHERE\r\n $__timeFilter(charging_processes.start_date)\r\n AND charging_processes.charge_energy_added > 0\r\n AND charging_processes.car_id = $car_id\r\n AND '🔋 Charging' in ($action_filter)\r\n AND COALESCE(geofence.name, CONCAT_WS(', ', COALESCE(address.name, nullif(CONCAT_WS(' ', address.road, address.house_number), '')), address.city))::TEXT like '%$text_filter%'\r\nUNION\r\nSELECT\r\n d.end_date AS \"Start\",\r\n LEAD(d.start_date) over w AS \"End\",\r\n ROUND(EXTRACT(EPOCH FROM d.end_date)) * 1000 AS start_date_ts,\r\n ROUND(EXTRACT(EPOCH FROM LEAD(d.start_date) over w))*1000 AS end_date_ts,\r\n '🅿️ Parking' AS \"Action\",\r\n EXTRACT(EPOCH FROM LEAD(d.start_date) over w - d.end_date)/60 AS \"Duration\",\r\n CASE WHEN d.end_geofence_id IS NULL THEN CONCAT('new?lat=', end_position.latitude, '&lng=', end_position.longitude)\r\n WHEN d.end_geofence_id IS NOT NULL THEN CONCAT(d.end_geofence_id, '/edit')\r\n END AS start_path,\r\n NULL AS end_path,\r\n COALESCE(geofence.name, CONCAT_WS(', ', COALESCE(address.name, nullif(CONCAT_WS(' ', address.road, address.house_number), '')), address.city)) AS \"Start Address\",\r\n '' AS \"End Address\",\r\n convert_km(end_position.odometer::NUMERIC, '$length_unit') AS odometer_$length_unit,\r\n NULL AS distance_$length_unit,\r\n convert_km(LEAD(d.start_[[preferred_range]]_range_km) over w::NUMERIC, '$length_unit') AS end_range_$length_unit,\r\n convert_km(((LEAD(d.start_[[preferred_range]]_range_km) over w + (LEAD(d.start_km) over w - d.end_km)) - d.end_[[preferred_range]]_range_km)::NUMERIC, '$length_unit') * efficiency AS \"kWh\",\r\n convert_km(((LEAD(d.start_[[preferred_range]]_range_km) over w + (LEAD(d.start_km) over w - d.end_km)) - d.end_[[preferred_range]]_range_km)::NUMERIC, '$length_unit') AS range_diff_$length_unit,\r\n LEAD(start_position.battery_level) over w AS \"SoC\",\r\n LEAD(start_position.battery_level) over w - end_position.battery_level AS \"SoC Diff\",\r\n convert_celsius(outside_temp_avg, '$temp_unit') AS outside_temp_avg_$temp_unit,\r\n CONCAT('d/FkUpJpQZk/trip?from=', ROUND(EXTRACT(EPOCH FROM d.end_date))*1000, '&to=', ROUND(EXTRACT(EPOCH FROM LEAD(d.start_date) over w))*1000, '&var-car_id=', d.car_id) AS slotlink\r\nFROM\r\n drives AS d\r\n LEFT OUTER JOIN positions start_position on d.start_position_id = start_position.id\r\n LEFT OUTER JOIN positions end_position on d.end_position_id = end_position.id\r\n LEFT JOIN addresses address ON d.end_address_id = address.id\r\n LEFT JOIN geofences geofence ON d.end_geofence_id = geofence.id\r\n JOIN cars ON cars.id = d.car_id\r\nWHERE\r\n $__timeFilter(d.end_date)\r\n AND d.car_id=$car_id\r\n AND '🅿️ Parking' in ($action_filter)\r\n AND COALESCE(geofence.name, CONCAT_WS(', ', COALESCE(address.name, nullif(CONCAT_WS(' ', address.road, address.house_number), '')), address.city))::TEXT like '%$text_filter%'\r\nWINDOW w as (ORDER BY d.id ASC)\r\n\r\nUNION\r\nSELECT\r\n\tT1.end_date +(1 * interval '1 second') AS \"Start\", -- added 1 sec to get it after the corresponding Parking row\r\n\tT2.start_date AS \"End\",\r\n\tROUND(EXTRACT(EPOCH FROM T2.start_date)) * 1000 - 1 AS start_date_ts,\r\n\tROUND(EXTRACT(EPOCH FROM T2.start_date)) * 1000 - 1 AS end_date_ts,\r\n\t'❓ Missing' AS \"Action\",\r\n\t-- EXTRACT(EPOCH FROM T2.start_date - T1.end_date)/60 AS \"Duration\",\r\n\tNULL AS \"Duration\",\r\n\tCASE WHEN T1.end_geofence_id IS NULL THEN CONCAT('new?lat=', TP1.latitude, '&lng=', TP1.longitude)\r\n\t\tWHEN T1.end_geofence_id IS NOT NULL THEN CONCAT(T1.end_geofence_id, '/edit')\r\n\tEND AS start_path,\r\n\tCASE WHEN T2.start_geofence_id IS NULL THEN CONCAT('new?lat=', TP2.latitude, '&lng=', TP2.longitude)\r\n\t\tWHEN T2.start_geofence_id IS NOT NULL THEN CONCAT(T2.start_geofence_id, '/edit')\r\n\tEND AS end_path,\r\n\tCOALESCE(start_geofence.name, CONCAT_WS(', ', COALESCE(start_address.name, nullif(CONCAT_WS(' ', start_address.road, start_address.house_number), '')), start_address.city)) AS \"Start Address\",\r\n\tCOALESCE(end_geofence.name, CONCAT_WS(', ', COALESCE(end_address.name, nullif(CONCAT_WS(' ', end_address.road, end_address.house_number), '')), end_address.city)) AS \"End Address\",\r\n\tconvert_km(TP2.odometer::INTEGER, '$length_unit') AS odometer_$length_unit,\r\n\tconvert_km((TP2.odometer - TP1.odometer)::INTEGER, '$length_unit') AS distance_$length_unit,\r\n convert_km(T2.end_[[preferred_range]]_range_km::NUMERIC, '$length_unit') AS end_range_$length_unit,\r\n\tconvert_km(((TP2.[[preferred_range]]_battery_range_km + (TP2.odometer - TP1.odometer)) - TP1.[[preferred_range]]_battery_range_km)::INTEGER, '$length_unit')::INTEGER * efficiency AS \"kWh\",\r\n\tconvert_km(((TP2.[[preferred_range]]_battery_range_km + (TP2.odometer - TP1.odometer)) - TP1.[[preferred_range]]_battery_range_km)::INTEGER, '$length_unit') AS range_diff_$length_unit,\r\n\tNULL AS \"SoC\",\r\n\tNULL AS \"SoC Diff\",\r\n\tNULL AS outside_temp_avg_$temp_unit,\r\n\tNULL AS slotlink\r\n\t-- TP2.battery_level AS \"SoC\",\r\n\t-- TP2.battery_level-TP1.battery_level AS \"SoC Diff\",\r\n\t-- (T1.outside_temp_avg+T2.outside_temp_avg)/2 AS outside_temp_avg_$temp_unit\r\nFROM\r\n\t(SELECT row_number() over(ORDER BY start_date) AS time_id, * FROM drives) AS T1\r\n\tLEFT OUTER JOIN (SELECT row_number() over(ORDER BY start_date) AS time_id, * FROM drives ) AS T2 on T1.time_id + 1 = T2.time_id\r\n\tLEFT OUTER JOIN positions AS TP1 on T1.end_position_id = TP1.id\r\n\tLEFT OUTER JOIN positions AS TP2 on T2.start_position_id = TP2.id\r\n\tLEFT JOIN addresses start_address ON T1.end_address_id = start_address.id\r\n\tLEFT JOIN addresses end_address ON T2.start_address_id = end_address.id\r\n\tLEFT JOIN geofences start_geofence ON T1.end_geofence_id = start_geofence.id\r\n\tLEFT JOIN geofences end_geofence ON T2.start_geofence_id = end_geofence.id\r\n\tJOIN cars ON cars.id = T2.car_id\r\nWHERE\r\n\t$__timeFilter(T1.end_date)\r\n\tAND T1.car_id=$car_id \r\n\tAND T2.car_id=$car_id \r\n\tAND TP2.car_id=$car_id \r\n\tAND TP1.car_id=$car_id \r\n\tAND TP2.odometer - TP1.odometer > 0.5\r\n\tAND T1.end_address_id <> T2.start_address_id AND ((T1.end_geofence_id IS NOT NULL OR T2.end_geofence_id IS NOT NULL) OR T1.end_geofence_id <> T2.start_geofence_id)\r\n\tAND '❓ Missing' in ($action_filter)\r\n\tAND (\r\n\t (COALESCE(start_geofence.name, CONCAT_WS(', ', COALESCE(start_address.name, nullif(CONCAT_WS(' ', start_address.road, start_address.house_number), '')), start_address.city))::TEXT like '%$text_filter%') or\r\n\t (COALESCE(end_geofence.name, CONCAT_WS(', ', COALESCE(end_address.name, nullif(CONCAT_WS(' ', end_address.road, end_address.house_number), '')), end_address.city)))::TEXT like '%$text_filter%')\r\nUNION\r\nSELECT\r\n start_date AS \"Start\",\r\n end_date AS \"End\",\r\n ROUND(EXTRACT(EPOCH FROM start_date))*1000 AS start_date_ts, \r\n ROUND(EXTRACT(EPOCH FROM end_date))*1000 AS end_date_ts, \r\n '💾 Updating' AS \"Action\",\r\n\tEXTRACT(EPOCH FROM end_date - start_date)/60 AS \"Duration\",\r\n NULL AS start_path,\r\n NULL AS end_path,\r\n version AS \"Start Address\",\r\n '' AS \"End Address\",\r\n NULL AS odometer_$length_unit,\r\n NULL AS distance_$length_unit,\r\n NULL AS end_range_$length_unit,\r\n NULL AS \"kWh\",\r\n NULL AS range_diff_$length_unit,\r\n NULL AS \"SoC\",\r\n NULL AS \"SoC Diff\",\r\n NULL AS outside_temp_avg_$temp_unit,\r\n CONCAT('https://www.notateslaapp.com/software-updates/version/', split_part(version, ' ', 1), '/release-notes') AS slotlink\r\nFROM updates\r\nWHERE \r\n $__timeFilter(start_date)\r\n AND car_id = $car_id \r\n AND '💾 Updating' in ($action_filter)\r\n AND version::TEXT like '%$text_filter%'\r\n\r\nORDER BY \"Start\" DESC;", "refId": "A", "select": [ [ diff --git a/grafana/dashboards/trip.json b/grafana/dashboards/trip.json index df99b6b478..3f75aa1004 100644 --- a/grafana/dashboards/trip.json +++ b/grafana/dashboards/trip.json @@ -1637,7 +1637,7 @@ { "targetBlank": false, "title": "View charge details", - "url": "d/BHhxFeZRz?orgId=1&from=${__data.fields.start_date_ts.numeric}&to=${__data.fields.end_date_ts.numeric}&var-car_id=${__data.fields.car_id.numeric}&var-charging_process_id=${__data.fields.id.numeric}" + "url": "d/BHhxFeZRz?from=${__data.fields.start_date_ts.numeric}&to=${__data.fields.end_date_ts.numeric}&var-car_id=${__data.fields.car_id.numeric}&var-charging_process_id=${__data.fields.id.numeric}" } ] }, From d83eb2ea7813ff3f2211b88ffd85fc10654660fb Mon Sep 17 00:00:00 2001 From: Juan Carlos Heredia <45735191+jheredianet@users.noreply.github.com> Date: Sun, 12 Nov 2023 18:29:53 +0100 Subject: [PATCH 007/113] Update query to get car efficiency on Battery Health dashboard (#3245) * Update query to get car efficiency on Battery Health dasboard * Improve query to avoid nulls when there are no long charging sessions * fix misspelled word * Fix hints and improve queries * Fix calculations to get Max battery Capacity --- grafana/dashboards/battery-health.json | 46 +++++++++++++++----------- 1 file changed, 27 insertions(+), 19 deletions(-) diff --git a/grafana/dashboards/battery-health.json b/grafana/dashboards/battery-health.json index 8ba0fc6429..1c0d72d425 100644 --- a/grafana/dashboards/battery-health.json +++ b/grafana/dashboards/battery-health.json @@ -17,7 +17,7 @@ "type": "grafana", "id": "grafana", "name": "Grafana", - "version": "8.5.15" + "version": "8.5.26" }, { "type": "panel", @@ -70,7 +70,7 @@ "fiscalYearStartMonth": 0, "graphTooltip": 1, "id": null, - "iteration": 1681039491922, + "iteration": 1689940704136, "links": [ { "icon": "dashboard", @@ -97,7 +97,7 @@ "type": "postgres", "uid": "TeslaMate" }, - "description": "**Usable (now)** is the estimated current battery capacity. \n\n**Usable (new)** is the estimated Battery Capacity since you begun to use Teslamate. That's why, the more data you have logged from your brand new car the better. ", + "description": "**Usable (now)** is the estimated current battery capacity. It is calculated based on the last 5 long charging sessions to have a better estimation.\n\nIf you see just '1.0 kWh' here, it means that you need at least a long charge session.\n\n**Usable (new)** is the estimated Battery Capacity since you begun to use Teslamate. That's why, the more data you have logged from your brand new car the better. For those who have not used Teslamate since they got their new car, or for those who have bought it second hand, it's possible to set the max range to 100% and the battery capacity of the car battery when it was new in order to get a better and accurate estimation.", "fieldConfig": { "defaults": { "color": { @@ -111,6 +111,14 @@ { "color": "super-light-blue", "value": null + }, + { + "color": "dark-red", + "value": 1 + }, + { + "color": "super-light-blue", + "value": 2 } ] }, @@ -139,7 +147,7 @@ }, "textMode": "value_and_name" }, - "pluginVersion": "8.5.15", + "pluginVersion": "8.5.26", "targets": [ { "datasource": { @@ -284,7 +292,7 @@ }, "textMode": "value_and_name" }, - "pluginVersion": "8.5.15", + "pluginVersion": "8.5.26", "targets": [ { "datasource": { @@ -367,7 +375,7 @@ }, "textMode": "value_and_name" }, - "pluginVersion": "8.5.15", + "pluginVersion": "8.5.26", "targets": [ { "datasource": { @@ -444,7 +452,7 @@ "type": "postgres", "uid": "TeslaMate" }, - "description": "", + "description": "Estimated charging cycles are based on the whole energy added to the battery. So, the more data you logged the better. ", "fieldConfig": { "defaults": { "mappings": [], @@ -501,7 +509,7 @@ }, "textMode": "value_and_name" }, - "pluginVersion": "8.5.15", + "pluginVersion": "8.5.26", "targets": [ { "datasource": { @@ -629,7 +637,7 @@ "showThresholdLabels": false, "showThresholdMarkers": true }, - "pluginVersion": "8.5.15", + "pluginVersion": "8.5.26", "targets": [ { "datasource": { @@ -724,7 +732,7 @@ }, "showUnfilled": true }, - "pluginVersion": "8.5.15", + "pluginVersion": "8.5.26", "targets": [ { "datasource": { @@ -767,7 +775,7 @@ "type": "postgres", "uid": "TeslaMate" }, - "description": "Estimated charging cycles are based on the whole energy added to the battery. So the more data you logged the better. \n", + "description": "", "fieldConfig": { "defaults": { "color": { @@ -807,7 +815,7 @@ }, "textMode": "value_and_name" }, - "pluginVersion": "8.5.15", + "pluginVersion": "8.5.26", "targets": [ { "datasource": { @@ -1030,7 +1038,7 @@ "showUnfilled": true, "text": {} }, - "pluginVersion": "8.5.15", + "pluginVersion": "8.5.26", "targets": [ { "datasource": { @@ -1147,7 +1155,7 @@ "showUnfilled": true, "text": {} }, - "pluginVersion": "8.5.15", + "pluginVersion": "8.5.26", "targets": [ { "datasource": { @@ -1344,7 +1352,7 @@ "hide": false, "metricColumn": "none", "rawQuery": true, - "rawSql": "SELECT convert_km(AVG(p.odometer)::numeric,'$length_unit') AS odometer, \r\n\tAVG(c.rated_battery_range_km) * ('$aux'::json -> 'RatedEfficiency')::text::float / AVG(c.usable_battery_level) AS \"kWh\",\r\n\tMAX(cp.id) AS id,\r\n\tto_char(cp.end_date, 'YYYY-MM-dd') AS Title\r\n\tFROM charging_processes cp\r\n\t\tJOIN (SELECT charging_process_id, MAX(date) as date\tFROM charges GROUP BY charging_process_id) AS last_charges\tON cp.id = last_charges.charging_process_id\r\n\t\tINNER JOIN charges c\r\n\t\tON c.charging_process_id = cp.id AND c.date = last_charges.date\r\n\t\tINNER JOIN positions p ON p.id = cp.position_id\r\n\tWHERE cp.car_id = $car_id\r\n\t\tAND cp.end_date IS NOT NULL\r\n\t\tAND cp.end_rated_range_km > cp.start_rated_range_km\r\n\tGROUP BY 4", + "rawSql": "SELECT convert_km(AVG(p.odometer)::numeric,'$length_unit') AS odometer, \r\n\tAVG(c.rated_battery_range_km * ('$aux'::json -> 'RatedEfficiency')::text::float / c.usable_battery_level) AS \"kWh\",\r\n\tMAX(cp.id) AS id,\r\n\tto_char(cp.end_date, 'YYYY-MM-dd') AS Title\r\n\tFROM charging_processes cp\r\n\t\tJOIN (SELECT charging_process_id, MAX(date) as date\tFROM charges WHERE usable_battery_level > 0 GROUP BY charging_process_id) AS last_charges\tON cp.id = last_charges.charging_process_id\r\n\t\tINNER JOIN charges c\r\n\t\tON c.charging_process_id = cp.id AND c.date = last_charges.date\r\n\t\tINNER JOIN positions p ON p.id = cp.position_id\r\n\tWHERE cp.car_id = $car_id\r\n\t\tAND cp.end_date IS NOT NULL\r\n\t\tAND cp.charge_energy_added >= ('$aux'::json -> 'RatedEfficiency')::text::float\r\n\tGROUP BY 4", "refId": "Projected Range", "select": [ [ @@ -1376,7 +1384,7 @@ "hide": false, "metricColumn": "none", "rawQuery": true, - "rawSql": "SELECT \n ROUND(MIN(convert_km(p.odometer::numeric,'$length_unit')),0) AS \"M-Odometer\",\n\tROUND(PERCENTILE_CONT(0.5) WITHIN GROUP(ORDER BY c.rated_battery_range_km * ('$aux'::json -> 'RatedEfficiency')::text::float / c.usable_battery_level)::numeric,1) AS \"M-kWh\",\n\tto_char(cp.end_date, 'YYYYMM') || CASE WHEN to_char(cp.end_date, 'DD')::int <= 15 THEN '1' ELSE '2' END AS Title\n\tFROM charging_processes cp\n\t\tJOIN (SELECT charging_process_id, MAX(date) as date\tFROM charges GROUP BY charging_process_id) AS last_charges\tON cp.id = last_charges.charging_process_id\n\t\tINNER JOIN charges c\n\t\tON c.charging_process_id = cp.id AND c.date = last_charges.date\n\t\tINNER JOIN positions p ON p.id = cp.position_id\n\tWHERE cp.car_id = $car_id\n\t\tAND cp.end_date IS NOT NULL\n\t\tAND cp.end_rated_range_km > cp.start_rated_range_km\n\tGROUP BY 3", + "rawSql": "SELECT \n ROUND(MIN(convert_km(p.odometer::numeric,'$length_unit')),0) AS \"M-Odometer\",\n\tROUND(PERCENTILE_CONT(0.5) WITHIN GROUP(ORDER BY c.rated_battery_range_km * ('$aux'::json -> 'RatedEfficiency')::text::float / c.usable_battery_level)::numeric,1) AS \"M-kWh\",\n\tto_char(cp.end_date, 'YYYYMM') || CASE WHEN to_char(cp.end_date, 'DD')::int <= 15 THEN '1' ELSE '2' END AS Title\n\tFROM charging_processes cp\n\t\tJOIN (SELECT charging_process_id, MAX(date) as date\tFROM charges WHERE usable_battery_level > 0 GROUP BY charging_process_id) AS last_charges\tON cp.id = last_charges.charging_process_id\n\t\tINNER JOIN charges c\n\t\tON c.charging_process_id = cp.id AND c.date = last_charges.date\n\t\tINNER JOIN positions p ON p.id = cp.position_id\n\tWHERE cp.car_id = $car_id\n\t\tAND cp.end_date IS NOT NULL\n\t\tAND cp.charge_energy_added >= ('$aux'::json -> 'RatedEfficiency')::text::float\n\tGROUP BY 3", "refId": "Median", "select": [ [ @@ -1488,13 +1496,13 @@ "type": "postgres", "uid": "TeslaMate" }, - "definition": "-- CONCATENATED JOIN QUERIES TO IMPROVE PERFORMANCE\nWITH\naux\tAS\n(\n\tSELECT cp.charge_energy_added,\n\t\tcp.car_id, cp.charge_energy_added / (cp.end_rated_range_km - cp.start_rated_range_km) * 100.0 AS rated_efficiency,\n\t\t(cp.end_rated_range_km - cp.start_rated_range_km) AS added_range_km\n\tFROM charging_processes cp\n\t\tJOIN (SELECT charging_process_id, MAX(date) as date\n\t\tFROM charges\n\t\tGROUP BY charging_process_id) AS last_charges\n\t\tON cp.id = last_charges.charging_process_id\n\t\tINNER JOIN charges c\n\t\tON c.charging_process_id = cp.id AND c.date = last_charges.date\n\tWHERE cp.car_id = $car_id\n\t\tAND cp.end_date IS NOT NULL\n\t\tAND cp.end_rated_range_km > cp.start_rated_range_km\n\tORDER BY cp.end_date DESC \n\tLIMIT 1\n), \nCurrentCapacity\t AS\n(\n\tSELECT AVG(Capacity) AS CurrentCapacity FROM\n (SELECT (100.0 * cp.charge_energy_added) / (GREATEST(1,MAX(usable_battery_level) - MIN(usable_battery_level))) AS Capacity\t\n FROM charging_processes cp\n\t INNER JOIN charges c\tON cp.id = c.charging_process_id\n INNER JOIN aux ON cp.car_id = aux.car_id\n\t WHERE cp.car_id = $car_id AND cp.charge_energy_added >= aux.rated_efficiency AND cp.end_date >= date_trunc('month', current_date - interval '1 month') \n GROUP BY cp.charge_energy_added, cp.end_date\n ) AS lastEstimatedCapacity\n), \nMaxCapacity AS\n(\n\tSELECT MAX(c.rated_battery_range_km * cars.efficiency * 100.0 / c.usable_battery_level) AS MaxCapacity\n\tFROM charging_processes cp\n\t\tJOIN (SELECT charging_process_id, MAX(date) as date\n\t\tFROM charges\n\t\tGROUP BY charging_process_id) AS last_charges\n\t\tON cp.id = last_charges.charging_process_id\n\t\tINNER JOIN charges c\n\t\tON c.charging_process_id = cp.id AND c.date = last_charges.date\n\t\tINNER JOIN cars ON cp.car_id = cars.id\n\tWHERE cp.car_id = $car_id\n\t\tAND cp.end_date IS NOT NULL\n\t\tAND cp.end_rated_range_km > cp.start_rated_range_km\n\t\tAND c.charge_energy_added >= cars. Efficiency\n), \nCurrentRange AS\n(\n SELECT\n\t\tfloor(extract(epoch from date)/86400)*86400 AS timecurrent,\n\t\tsum(rated_battery_range_km) / sum(usable_battery_level) * 100 AS rated_range_km\n\tFROM (\n\t\tSELECT battery_level, usable_battery_level, date, rated_battery_range_km from charges c \n\t\tJOIN charging_processes p ON p.id = c.charging_process_id \n\t\tWHERE p.car_id = $car_id AND usable_battery_level IS NOT NULL) AS data\n\tGROUP BY 1\n\tORDER BY 1 DESC\n\tLIMIT 1\n), \nMaxRange AS\n(\n SELECT\n\t\tfloor(extract(epoch from date)/86400)*86400 AS time,\n\t\tsum(rated_battery_range_km) / sum(usable_battery_level) * 100 AS max_rated_range_km\n\tFROM (\n\t\tSELECT battery_level, usable_battery_level, date, rated_battery_range_km from charges c \n\t\tJOIN charging_processes p ON p.id = c.charging_process_id \n\t\tWHERE p.car_id = $car_id AND usable_battery_level IS NOT NULL) AS data\n\tGROUP BY 1\n\tORDER BY 2 DESC\n\tLIMIT 1\n) \nSELECT CONCAT('{\"LastChargekWhAdded\": ', aux.charge_energy_added, \n ', \"LastMileageAdded\" : ', convert_km(aux.added_range_km,'$length_unit'),\n ', \"MaxRange\": ', convert_km(MaxRange.max_rated_range_km,'$length_unit'),\n ', \"CurrentRange\": ',convert_km(CurrentRange.rated_range_km,'$length_unit'),\n ', \"MaxCapacity\": ', MaxCapacity.MaxCapacity,\n ', \"CurrentCapacity\": ',CurrentCapacity.CurrentCapacity,\n ', \"RatedEfficiency\": ',aux.rated_efficiency, '}') \nFROM MaxRange, CurrentRange, Aux, MaxCapacity, CurrentCapacity;\n-- The following query is the result of many tests and hours of work. This panel is for your own personal use. \n-- If you think you can improve it and contribute, please create a pull request and do not take it to your repository, \n-- much less upload it to another repository as if the original idea were yours, nor do you share it on social media\n-- without mentioning the author. Respect the ingenuity and work of others. Cheers!\n-- 16/04/2023\n-- By @jheredianet - Twitter: @juanheredia", + "definition": "-- CONCATENATED JOIN QUERIES TO IMPROVE PERFORMANCE\n-- The following query is the result of many tests and hours of work. This panel is for your own personal use. \n-- If you think you can improve it and contribute, please create a pull request and do not take it to your repository, \n-- much less upload it to another repository as if the original idea were yours, nor do you share it on social media\n-- without mentioning the author. Respect the ingenuity and work of others. Cheers!\n-- 2023-07-21\n-- By @jheredianet - Twitter: @juanheredia", "hide": 2, "includeAll": false, "multi": false, "name": "aux", "options": [], - "query": "-- CONCATENATED JOIN QUERIES TO IMPROVE PERFORMANCE\nWITH\naux\tAS\n(\n\tSELECT cp.charge_energy_added,\n\t\tcp.car_id, cp.charge_energy_added / (cp.end_rated_range_km - cp.start_rated_range_km) * 100.0 AS rated_efficiency,\n\t\t(cp.end_rated_range_km - cp.start_rated_range_km) AS added_range_km\n\tFROM charging_processes cp\n\t\tJOIN (SELECT charging_process_id, MAX(date) as date\n\t\tFROM charges\n\t\tGROUP BY charging_process_id) AS last_charges\n\t\tON cp.id = last_charges.charging_process_id\n\t\tINNER JOIN charges c\n\t\tON c.charging_process_id = cp.id AND c.date = last_charges.date\n\tWHERE cp.car_id = $car_id\n\t\tAND cp.end_date IS NOT NULL\n\t\tAND cp.end_rated_range_km > cp.start_rated_range_km\n\tORDER BY cp.end_date DESC \n\tLIMIT 1\n), \nCurrentCapacity\t AS\n(\n\tSELECT AVG(Capacity) AS CurrentCapacity FROM\n (SELECT (100.0 * cp.charge_energy_added) / (GREATEST(1,MAX(usable_battery_level) - MIN(usable_battery_level))) AS Capacity\t\n FROM charging_processes cp\n\t INNER JOIN charges c\tON cp.id = c.charging_process_id\n INNER JOIN aux ON cp.car_id = aux.car_id\n\t WHERE cp.car_id = $car_id AND cp.charge_energy_added >= aux.rated_efficiency AND cp.end_date >= date_trunc('month', current_date - interval '1 month') \n GROUP BY cp.charge_energy_added, cp.end_date\n ) AS lastEstimatedCapacity\n), \nMaxCapacity AS\n(\n\tSELECT MAX(c.rated_battery_range_km * cars.efficiency * 100.0 / c.usable_battery_level) AS MaxCapacity\n\tFROM charging_processes cp\n\t\tJOIN (SELECT charging_process_id, MAX(date) as date\n\t\tFROM charges\n\t\tGROUP BY charging_process_id) AS last_charges\n\t\tON cp.id = last_charges.charging_process_id\n\t\tINNER JOIN charges c\n\t\tON c.charging_process_id = cp.id AND c.date = last_charges.date\n\t\tINNER JOIN cars ON cp.car_id = cars.id\n\tWHERE cp.car_id = $car_id\n\t\tAND cp.end_date IS NOT NULL\n\t\tAND cp.end_rated_range_km > cp.start_rated_range_km\n\t\tAND c.charge_energy_added >= cars. Efficiency\n), \nCurrentRange AS\n(\n SELECT\n\t\tfloor(extract(epoch from date)/86400)*86400 AS timecurrent,\n\t\tsum(rated_battery_range_km) / sum(usable_battery_level) * 100 AS rated_range_km\n\tFROM (\n\t\tSELECT battery_level, usable_battery_level, date, rated_battery_range_km from charges c \n\t\tJOIN charging_processes p ON p.id = c.charging_process_id \n\t\tWHERE p.car_id = $car_id AND usable_battery_level IS NOT NULL) AS data\n\tGROUP BY 1\n\tORDER BY 1 DESC\n\tLIMIT 1\n), \nMaxRange AS\n(\n SELECT\n\t\tfloor(extract(epoch from date)/86400)*86400 AS time,\n\t\tsum(rated_battery_range_km) / sum(usable_battery_level) * 100 AS max_rated_range_km\n\tFROM (\n\t\tSELECT battery_level, usable_battery_level, date, rated_battery_range_km from charges c \n\t\tJOIN charging_processes p ON p.id = c.charging_process_id \n\t\tWHERE p.car_id = $car_id AND usable_battery_level IS NOT NULL) AS data\n\tGROUP BY 1\n\tORDER BY 2 DESC\n\tLIMIT 1\n) \nSELECT CONCAT('{\"LastChargekWhAdded\": ', aux.charge_energy_added, \n ', \"LastMileageAdded\" : ', convert_km(aux.added_range_km,'$length_unit'),\n ', \"MaxRange\": ', convert_km(MaxRange.max_rated_range_km,'$length_unit'),\n ', \"CurrentRange\": ',convert_km(CurrentRange.rated_range_km,'$length_unit'),\n ', \"MaxCapacity\": ', MaxCapacity.MaxCapacity,\n ', \"CurrentCapacity\": ',CurrentCapacity.CurrentCapacity,\n ', \"RatedEfficiency\": ',aux.rated_efficiency, '}') \nFROM MaxRange, CurrentRange, Aux, MaxCapacity, CurrentCapacity;\n-- The following query is the result of many tests and hours of work. This panel is for your own personal use. \n-- If you think you can improve it and contribute, please create a pull request and do not take it to your repository, \n-- much less upload it to another repository as if the original idea were yours, nor do you share it on social media\n-- without mentioning the author. Respect the ingenuity and work of others. Cheers!\n-- 16/04/2023\n-- By @jheredianet - Twitter: @juanheredia", + "query": "WITH\naux\tAS\n(\n\tSELECT cp.charge_energy_added,\n\t\tcp.car_id, (SELECT efficiency FROM cars WHERE id = $car_id) * 100.0 AS rated_efficiency,\n\t\t(cp.end_rated_range_km - cp.start_rated_range_km) AS added_range_km\n\tFROM charging_processes cp\n\t\tJOIN (SELECT charging_process_id, MAX(date) as date\n\t\tFROM charges\n\t\tGROUP BY charging_process_id) AS last_charges\n\t\tON cp.id = last_charges.charging_process_id\n\t\tINNER JOIN charges c\n\t\tON c.charging_process_id = cp.id AND c.date = last_charges.date\n\tWHERE cp.car_id = $car_id\n\t\tAND cp.end_date IS NOT NULL\n\t\tAND cp.end_rated_range_km > cp.start_rated_range_km\n\tORDER BY cp.end_date DESC \n\tLIMIT 1\n), \nCurrentCapacity\t AS\n(\n\tSELECT AVG(Capacity) AS CurrentCapacity FROM\n (SELECT (100.0 * cp.charge_energy_added) / (GREATEST(1,MAX(usable_battery_level) - MIN(usable_battery_level))) AS Capacity\t\n FROM charging_processes cp\n\t INNER JOIN charges c\tON cp.id = c.charging_process_id\n INNER JOIN aux ON cp.car_id = aux.car_id\n\t WHERE cp.car_id = $car_id AND cp.charge_energy_added >= aux.rated_efficiency \n GROUP BY cp.charge_energy_added, cp.end_date\n ORDER BY cp.end_date DESC \n LIMIT 5\n ) AS lastEstimatedCapacity\n), \nMaxCapacity AS\n(\n SELECT AVG(c.rated_battery_range_km * aux.rated_efficiency / c.usable_battery_level) AS MaxCapacity, cp.id\n FROM charging_processes cp\n\tJOIN (SELECT charging_process_id, MAX(date) as date FROM charges \n WHERE usable_battery_level > 0 GROUP BY charging_process_id) AS last_charges\t\n ON cp.id = last_charges.charging_process_id\n\tINNER JOIN charges c ON c.charging_process_id = cp.id AND c.date = last_charges.date\n\tINNER JOIN positions p ON p.id = cp.position_id\n INNER JOIN aux ON cp.car_id = aux.car_id\n\tWHERE cp.car_id = $car_id\n\t\tAND cp.end_date IS NOT NULL\n\t\tAND cp.charge_energy_added >= aux.rated_efficiency \n\tGROUP BY cp.id \n ORDER BY 1 DESC \n LIMIT 1\n), \nCurrentRange AS\n(\n SELECT\n\t\tfloor(extract(epoch from date)/86400)*86400 AS timecurrent,\n\t\tsum(rated_battery_range_km) / sum(usable_battery_level) * 100 AS rated_range_km\n\tFROM (\n\t\tSELECT battery_level, usable_battery_level, date, rated_battery_range_km from charges c \n\t\tJOIN charging_processes p ON p.id = c.charging_process_id \n\t\tWHERE p.car_id = $car_id AND usable_battery_level IS NOT NULL) AS data\n\tGROUP BY 1\n\tORDER BY 1 DESC\n\tLIMIT 1\n), \nMaxRange AS\n(\n SELECT\n\t\tfloor(extract(epoch from date)/86400)*86400 AS time,\n\t\tsum(rated_battery_range_km) / sum(usable_battery_level) * 100 AS max_rated_range_km\n\tFROM (\n\t\tSELECT battery_level, usable_battery_level, date, rated_battery_range_km from charges c \n\t\tJOIN charging_processes p ON p.id = c.charging_process_id \n\t\tWHERE p.car_id = $car_id AND usable_battery_level IS NOT NULL) AS data\n\tGROUP BY 1\n\tORDER BY 2 DESC\n\tLIMIT 1\n) \nSELECT CONCAT('{\"LastChargekWhAdded\": ', aux.charge_energy_added, \n ', \"LastMileageAdded\" : ', convert_km(aux.added_range_km,'$length_unit'),\n ', \"MaxRange\": ', convert_km(MaxRange.max_rated_range_km,'$length_unit'),\n ', \"CurrentRange\": ',convert_km(CurrentRange.rated_range_km,'$length_unit'),\n ', \"MaxCapacity\": ', MaxCapacity.MaxCapacity,\n ', \"CurrentCapacity\": ', CASE WHEN CurrentCapacity.CurrentCapacity IS NULL THEN 1 ELSE CurrentCapacity.CurrentCapacity END,\n ', \"RatedEfficiency\": ',aux.rated_efficiency, '}') \nFROM MaxRange, CurrentRange, Aux, MaxCapacity, CurrentCapacity;", "refresh": 1, "regex": "", "skipUrlSync": false, @@ -1553,6 +1561,6 @@ "timezone": "browser", "title": "Battery Health", "uid": "jchmRiqUfXgTM", - "version": 7, + "version": 10, "weekStart": "" } \ No newline at end of file From e636380affe74cdd78a5bbbdc52f532c64b9a866 Mon Sep 17 00:00:00 2001 From: Adrian Kumpf <8999358+adriankumpf@users.noreply.github.com> Date: Sun, 12 Nov 2023 18:37:15 +0100 Subject: [PATCH 008/113] Update srtm to 0.8.0 --- lib/teslamate/terrain.ex | 42 ++++++------------- mix.exs | 2 +- mix.lock | 2 +- test/support/mocks/srtm.ex | 10 ++--- .../terrain/update_positions_test.exs | 12 +++--- test/teslamate/terrain_test.exs | 24 ++++------- 6 files changed, 33 insertions(+), 59 deletions(-) diff --git a/lib/teslamate/terrain.ex b/lib/teslamate/terrain.ex index 4ba664a431..634c53ebc5 100644 --- a/lib/teslamate/terrain.ex +++ b/lib/teslamate/terrain.ex @@ -6,7 +6,7 @@ defmodule TeslaMate.Terrain do alias TeslaMate.Log.Position alias TeslaMate.Log - defstruct [:client, :timeout, :deps, :name] + defstruct [:timeout, :deps, :name] alias __MODULE__, as: Data @name __MODULE__ @@ -25,15 +25,9 @@ defmodule TeslaMate.Terrain do @impl true def init(opts) do - {:ok, client} = - SRTM.Client.new(cache_path(), - adapter: {Tesla.Adapter.Finch, name: TeslaMate.HTTP, receive_timeout: 60_000} - ) - data = %Data{ timeout: Keyword.get(opts, :timeout, 100), name: Keyword.get(opts, :name, @name), - client: client, deps: %{ srtm: Keyword.get(opts, :deps_srtm, SRTM), log: Keyword.get(opts, :deps_log, Log) @@ -42,7 +36,6 @@ defmodule TeslaMate.Terrain do case Keyword.get(opts, :disabled, false) do false -> - {:ok, _ref} = :timer.send_interval(:timer.hours(3), self(), :purge_srtm_in_memory_cache) {:ok, :ready, data, {:next_event, :internal, {:fetch_positions, 0}}} true -> @@ -57,8 +50,8 @@ defmodule TeslaMate.Terrain do task = Task.async(fn -> do_get_elevation({lat, lng}, data) end) case Task.yield(task, data.timeout) do - {:ok, {:ok, elevation, client}} -> - {:keep_state, %Data{data | client: client}, {:reply, from, elevation}} + {:ok, {:ok, elevation}} -> + {:keep_state_and_data, {:reply, from, elevation}} {:ok, {:error, :unavailable}} -> {:keep_state_and_data, {:reply, from, nil}} @@ -97,11 +90,7 @@ defmodule TeslaMate.Terrain do ## Cast def handle_event(:cast, :process, {:update, [], next, nil}, data) do - {:next_state, :ready, data, - [ - {:next_event, :info, :purge_srtm_in_memory_cache}, - {:next_event, :internal, {:fetch_positions, next}} - ]} + {:next_state, :ready, data, {:next_event, :internal, {:fetch_positions, next}}} end def handle_event(:cast, :process, {:update, [%Position{} = p | rest], next, nil}, data) do @@ -117,10 +106,10 @@ defmodule TeslaMate.Terrain do end) case Task.yield(task, data.timeout) do - {:ok, {:ok, elevation, client}} -> + {:ok, {:ok, elevation}} -> {:ok, _pos} = call(data.deps.log, :update_position, [p, %{elevation: elevation}]) :ok = GenStateMachine.cast(self(), :process) - {:next_state, {:update, rest, next, nil}, %Data{data | client: client}} + {:next_state, {:update, rest, next, nil}, data} {:ok, {:error, :unavailable}} -> :ok = GenStateMachine.cast(self(), :process) @@ -141,9 +130,9 @@ defmodule TeslaMate.Terrain do def handle_event(:info, {ref, result}, {:waiting, ref}, data) do case result do - {:ok, elevation, %SRTM.Client{} = client} -> + {:ok, elevation} -> Logger.debug("Received delayed SRTM message: #{elevation}m") - {:next_state, :ready, %Data{data | client: client}, schedule_fetch()} + {:next_state, :ready, data, schedule_fetch()} {:error, reason} -> log_warning(reason) @@ -153,11 +142,11 @@ defmodule TeslaMate.Terrain do def handle_event(:info, {ref, result}, {:update, [%Position{} = p | rest], next, ref}, data) do case result do - {:ok, elevation, %SRTM.Client{} = client} -> + {:ok, elevation} -> Logger.debug("Received delayed SRTM message: #{elevation}m") {:ok, _pos} = call(data.deps.log, :update_position, [p, %{elevation: elevation}]) :ok = GenStateMachine.cast(self(), :process) - {:next_state, {:update, rest, next, nil}, %Data{data | client: client}} + {:next_state, {:update, rest, next, nil}, data} {:error, reason} -> log_warning(reason) @@ -170,12 +159,6 @@ defmodule TeslaMate.Terrain do :keep_state_and_data end - def handle_event(:info, :purge_srtm_in_memory_cache, _state, %Data{client: client} = data) do - Logger.debug("Purging SRTM in-memory cache ...") - {:ok, client} = SRTM.Client.purge_in_memory_cache(client, keep: 2) - {:keep_state, %Data{data | client: client}, {:next_event, :info, :garbage_collect}} - end - def handle_event(:info, :garbage_collect, _state, _data) do :erlang.garbage_collect(self()) :keep_state_and_data @@ -183,10 +166,11 @@ defmodule TeslaMate.Terrain do # Private - defp do_get_elevation({lat, lng}, %Data{client: client, deps: %{srtm: srtm}, name: name} = data) do + defp do_get_elevation({lat, lng}, %Data{deps: %{srtm: srtm}, name: name} = data) do case :fuse.ask(name, :sync) do :ok -> - with {:error, reason} <- call(srtm, :get_elevation, [client, lat, lng]) do + with {:error, reason} <- + call(srtm, :get_elevation, [lat, lng, [disk_cache_path: cache_path()]]) do :fuse.melt(name) {:error, reason} end diff --git a/mix.exs b/mix.exs index 75389a1c20..c4d0d16dbb 100644 --- a/mix.exs +++ b/mix.exs @@ -57,7 +57,7 @@ defmodule TeslaMate.MixProject do {:phoenix_pubsub, "~> 2.0"}, {:plug_cowboy, "~> 2.0"}, {:postgrex, ">= 0.0.0"}, - {:srtm, "~> 0.6.0"}, + {:srtm, "~> 0.8.0"}, {:tesla, "~> 1.4"}, {:timex, "~> 3.0"}, {:tortoise, "~> 0.10"}, diff --git a/mix.lock b/mix.lock index e4a668e98b..84d06f066d 100644 --- a/mix.lock +++ b/mix.lock @@ -51,7 +51,7 @@ "plug_crypto": {:hex, :plug_crypto, "1.2.5", "918772575e48e81e455818229bf719d4ab4181fcbf7f85b68a35620f78d89ced", [:mix], [], "hexpm", "26549a1d6345e2172eb1c233866756ae44a9609bd33ee6f99147ab3fd87fd842"}, "postgrex": {:hex, :postgrex, "0.17.3", "c92cda8de2033a7585dae8c61b1d420a1a1322421df84da9a82a6764580c503d", [:mix], [{:db_connection, "~> 2.1", [hex: :db_connection, repo: "hexpm", optional: false]}, {:decimal, "~> 1.5 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:table, "~> 0.1.0", [hex: :table, repo: "hexpm", optional: true]}], "hexpm", "946cf46935a4fdca7a81448be76ba3503cff082df42c6ec1ff16a4bdfbfb098d"}, "ranch": {:hex, :ranch, "1.8.0", "8c7a100a139fd57f17327b6413e4167ac559fbc04ca7448e9be9057311597a1d", [:make, :rebar3], [], "hexpm", "49fbcfd3682fab1f5d109351b61257676da1a2fdbe295904176d5e521a2ddfe5"}, - "srtm": {:hex, :srtm, "0.6.0", "314ddbd8fb3f7ef5c5e81543b874967a36dc8e0350a32e95d1480f05f642c706", [:mix], [{:hackney, "~> 1.15", [hex: :hackney, repo: "hexpm", optional: true]}, {:jason, "~> 1.1", [hex: :jason, repo: "hexpm", optional: false]}, {:tesla, "~> 1.3", [hex: :tesla, repo: "hexpm", optional: false]}], "hexpm", "6fe10a869d8458aa96fad55ae5a591c19a9a4e2fffdc6d98f5944fa215942fe3"}, + "srtm": {:hex, :srtm, "0.8.0", "b01eb8b1487b021a0a5851b5e4cdbd113b6f72c502ae988e7ce1ac35f856302d", [:mix], [{:castore, "~> 1.0", [hex: :castore, repo: "hexpm", optional: true]}], "hexpm", "7ec2a2ced7c3c0c1bdcfca67ce4d466d77e66cf52589f546c91b96b4c79b6923"}, "ssl_verify_fun": {:hex, :ssl_verify_fun, "1.1.7", "354c321cf377240c7b8716899e182ce4890c5938111a1296add3ec74cf1715df", [:make, :mix, :rebar3], [], "hexpm", "fe4c190e8f37401d30167c8c405eda19469f34577987c76dde613e838bbc67f8"}, "telemetry": {:hex, :telemetry, "1.2.1", "68fdfe8d8f05a8428483a97d7aab2f268aaff24b49e0f599faa091f1d4e7f61c", [:rebar3], [], "hexpm", "dad9ce9d8effc621708f99eac538ef1cbe05d6a874dd741de2e689c47feafed5"}, "tesla": {:hex, :tesla, "1.8.0", "d511a4f5c5e42538d97eef7c40ec4f3e44effdc5068206f42ed859e09e51d1fd", [:mix], [{:castore, "~> 0.1 or ~> 1.0", [hex: :castore, repo: "hexpm", optional: true]}, {:exjsx, ">= 3.0.0", [hex: :exjsx, repo: "hexpm", optional: true]}, {:finch, "~> 0.13", [hex: :finch, repo: "hexpm", optional: true]}, {:fuse, "~> 2.4", [hex: :fuse, repo: "hexpm", optional: true]}, {:gun, ">= 1.0.0", [hex: :gun, repo: "hexpm", optional: true]}, {:hackney, "~> 1.6", [hex: :hackney, repo: "hexpm", optional: true]}, {:ibrowse, "4.4.2", [hex: :ibrowse, repo: "hexpm", optional: true]}, {:jason, ">= 1.0.0", [hex: :jason, repo: "hexpm", optional: true]}, {:mime, "~> 1.0 or ~> 2.0", [hex: :mime, repo: "hexpm", optional: false]}, {:mint, "~> 1.0", [hex: :mint, repo: "hexpm", optional: true]}, {:msgpax, "~> 2.3", [hex: :msgpax, repo: "hexpm", optional: true]}, {:poison, ">= 1.0.0", [hex: :poison, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: true]}], "hexpm", "10501f360cd926a309501287470372af1a6e1cbed0f43949203a4c13300bc79f"}, diff --git a/test/support/mocks/srtm.ex b/test/support/mocks/srtm.ex index ef00b47978..3d35737841 100644 --- a/test/support/mocks/srtm.ex +++ b/test/support/mocks/srtm.ex @@ -10,8 +10,8 @@ defmodule SRTMMock do GenServer.start_link(__MODULE__, opts, name: Keyword.fetch!(opts, :name)) end - def get_elevation(name, client, lat, lng) do - GenServer.call(name, {:get_elevation, client, lat, lng}) + def get_elevation(name, lat, lng, opts \\ []) do + GenServer.call(name, {:get_elevation, lat, lng, opts}) end # Callbacks @@ -22,15 +22,15 @@ defmodule SRTMMock do end @impl true - def handle_call({:get_elevation, client, lat, lng}, _, %State{responses: r} = state) do + def handle_call({:get_elevation, lat, lng, opts}, _, %State{responses: r} = state) do lat = with %Decimal{} <- lat, do: Decimal.to_float(lat) lng = with %Decimal{} <- lng, do: Decimal.to_float(lng) - send(state.pid, {SRTM, {:get_elevation, client, lat, lng}}) + send(state.pid, {SRTM, {:get_elevation, lat, lng, opts}}) response = with {:ok, elevation} <- Map.fetch!(r, {lat, lng}).() do - {:ok, elevation, client} + {:ok, elevation} end {:reply, response, state} diff --git a/test/teslamate/terrain/update_positions_test.exs b/test/teslamate/terrain/update_positions_test.exs index 4c81ae2950..2a9a251950 100644 --- a/test/teslamate/terrain/update_positions_test.exs +++ b/test/teslamate/terrain/update_positions_test.exs @@ -46,9 +46,9 @@ defmodule TeslaMate.Terrain.UpdatePositionsTest do for {_, i} <- Enum.with_index(positions) do if i in [50, 150] do - assert_receive {SRTM, {:get_elevation, %SRTM.Client{}, 1.0, 1.0}} + assert_receive {SRTM, {:get_elevation, 1.0, 1.0, _opts}} else - assert_receive {SRTM, {:get_elevation, %SRTM.Client{}, 0.0, 0.0}} + assert_receive {SRTM, {:get_elevation, 0.0, 0.0, _opts}} end end @@ -101,10 +101,10 @@ defmodule TeslaMate.Terrain.UpdatePositionsTest do end }) - assert_receive {SRTM, {:get_elevation, %SRTM.Client{}, 0.0, 0.0}} - assert_receive {SRTM, {:get_elevation, %SRTM.Client{}, 1.0, 1.0}} - assert_receive {SRTM, {:get_elevation, %SRTM.Client{}, 42.0, 42.0}} - assert_receive {SRTM, {:get_elevation, %SRTM.Client{}, 42.0, 42.0}} + assert_receive {SRTM, {:get_elevation, 0.0, 0.0, _opts}} + assert_receive {SRTM, {:get_elevation, 1.0, 1.0, _opts}} + assert_receive {SRTM, {:get_elevation, 42.0, 42.0, _opts}} + assert_receive {SRTM, {:get_elevation, 42.0, 42.0, _opts}} # 4th and 5th are :unavailable diff --git a/test/teslamate/terrain_test.exs b/test/teslamate/terrain_test.exs index 01eecffc8c..a7138fcb26 100644 --- a/test/teslamate/terrain_test.exs +++ b/test/teslamate/terrain_test.exs @@ -28,7 +28,7 @@ defmodule TeslaMate.TerrainTest do :ok = start_terrain(name, %{{0, 0} => fn -> {:ok, 42} end}) assert 42 == Terrain.get_elevation(name, {0, 0}) - assert_received {SRTM, {:get_elevation, %SRTM.Client{}, 0, 0}} + assert_received {SRTM, {:get_elevation, 0, 0, [disk_cache_path: ".srtm_cache"]}} refute_receive _ end @@ -40,7 +40,7 @@ defmodule TeslaMate.TerrainTest do assert Terrain.get_elevation(name, {0, 0}) == nil TestHelper.eventually(fn -> - assert_received {SRTM, {:get_elevation, %SRTM.Client{}, 0, 0}} + assert_received {SRTM, {:get_elevation, 0, 0, _opts}} end) refute_receive _ @@ -58,7 +58,7 @@ defmodule TeslaMate.TerrainTest do assert Terrain.get_elevation(name, {0, 0}) == nil TestHelper.eventually(fn -> - assert_received {SRTM, {:get_elevation, %SRTM.Client{}, 0, 0}} + assert_received {SRTM, {:get_elevation, 0, 0, _opts}} end) # still blocked @@ -80,7 +80,7 @@ defmodule TeslaMate.TerrainTest do assert Terrain.get_elevation(name, {1, 1}) == nil TestHelper.eventually(fn -> - assert_received {SRTM, {:get_elevation, %SRTM.Client{}, 1, 1}} + assert_received {SRTM, {:get_elevation, 1, 1, _opts}} end) refute_receive _ @@ -102,9 +102,9 @@ defmodule TeslaMate.TerrainTest do # circuit broke after 3 attempts TestHelper.eventually( fn -> - assert_received {SRTM, {:get_elevation, %SRTM.Client{}, 0, 0}} - assert_received {SRTM, {:get_elevation, %SRTM.Client{}, 0, 0}} - assert_received {SRTM, {:get_elevation, %SRTM.Client{}, 0, 0}} + assert_received {SRTM, {:get_elevation, 0, 0, _opts}} + assert_received {SRTM, {:get_elevation, 0, 0, _opts}} + assert_received {SRTM, {:get_elevation, 0, 0, _opts}} end, attempts: 25 ) @@ -112,14 +112,4 @@ defmodule TeslaMate.TerrainTest do refute_receive _ end end - - describe "handle_info/2" do - test "handles :purge_srtm_in_memory_cache message", %{test: name} do - :ok = start_terrain(name) - - send(name, :purge_srtm_in_memory_cache) - - refute_receive _ - end - end end From af4ce1898bb60a797498100c82356f8a53f116a8 Mon Sep 17 00:00:00 2001 From: Adrian Kumpf <8999358+adriankumpf@users.noreply.github.com> Date: Sun, 12 Nov 2023 18:59:15 +0100 Subject: [PATCH 009/113] Fix warnings on Elixir 1.16 --- test/teslamate/log/log_drive_test.exs | 16 ++++++++-------- test/teslamate/terrain/update_positions_test.exs | 4 ++-- .../teslamate/vehicles/vehicle/charging_test.exs | 16 ++++++++-------- .../vehicles/vehicle/streaming_test.exs | 10 ++++++---- .../vehicles/vehicle/suspend_logging_test.exs | 2 +- test/teslamate/vehicles/vehicle/suspend_test.exs | 4 ++-- 6 files changed, 27 insertions(+), 25 deletions(-) diff --git a/test/teslamate/log/log_drive_test.exs b/test/teslamate/log/log_drive_test.exs index e225e10571..6df1820af2 100644 --- a/test/teslamate/log/log_drive_test.exs +++ b/test/teslamate/log/log_drive_test.exs @@ -158,7 +158,7 @@ defmodule TeslaMate.LogDriveTest do car = car_fixture() assert {:ok, %Drive{} = drive} = Log.start_drive(car) - assert {:ok, %Drive{id: id, distance: 0.0, duration_min: 0}} = Log.close_drive(drive) + assert {:ok, %Drive{id: id, distance: +0.0, duration_min: 0}} = Log.close_drive(drive) assert nil == Repo.get(Drive, id) end @@ -166,7 +166,7 @@ defmodule TeslaMate.LogDriveTest do car = car_fixture() positions = [ - %{date: "2019-04-06 10:00:00", latitude: 0.0, longitude: 0.0, odometer: 100} + %{date: "2019-04-06 10:00:00", latitude: +0.0, longitude: +0.0, odometer: 100} ] assert {:ok, drive} = Log.start_drive(car) @@ -175,7 +175,7 @@ defmodule TeslaMate.LogDriveTest do assert {:ok, _} = Log.insert_position(drive, p) end - assert {:ok, %Drive{id: id, distance: 0.0, duration_min: 0}} = Log.close_drive(drive) + assert {:ok, %Drive{id: id, distance: +0.0, duration_min: 0}} = Log.close_drive(drive) assert nil == Repo.get(Drive, id) end @@ -185,15 +185,15 @@ defmodule TeslaMate.LogDriveTest do positions = [ %{ date: "2019-04-06 10:00:00", - latitude: 0.0, - longitude: 0.0, + latitude: +0.0, + longitude: +0.0, odometer: 100, ideal_battery_range_km: 300 }, %{ date: "2019-04-06 10:05:00", - latitude: 0.0, - longitude: 0.0, + latitude: +0.0, + longitude: +0.0, odometer: 100, ideal_battery_range_km: 300 } @@ -205,7 +205,7 @@ defmodule TeslaMate.LogDriveTest do assert {:ok, _} = Log.insert_position(drive, p) end - assert {:ok, %Drive{id: id, distance: 0.0}} = Log.close_drive(drive) + assert {:ok, %Drive{id: id, distance: +0.0}} = Log.close_drive(drive) assert nil == Repo.get(Drive, id) end end diff --git a/test/teslamate/terrain/update_positions_test.exs b/test/teslamate/terrain/update_positions_test.exs index 2a9a251950..3d34530146 100644 --- a/test/teslamate/terrain/update_positions_test.exs +++ b/test/teslamate/terrain/update_positions_test.exs @@ -48,7 +48,7 @@ defmodule TeslaMate.Terrain.UpdatePositionsTest do if i in [50, 150] do assert_receive {SRTM, {:get_elevation, 1.0, 1.0, _opts}} else - assert_receive {SRTM, {:get_elevation, 0.0, 0.0, _opts}} + assert_receive {SRTM, {:get_elevation, +0.0, +0.0, _opts}} end end @@ -101,7 +101,7 @@ defmodule TeslaMate.Terrain.UpdatePositionsTest do end }) - assert_receive {SRTM, {:get_elevation, 0.0, 0.0, _opts}} + assert_receive {SRTM, {:get_elevation, +0.0, +0.0, _opts}} assert_receive {SRTM, {:get_elevation, 1.0, 1.0, _opts}} assert_receive {SRTM, {:get_elevation, 42.0, 42.0, _opts}} assert_receive {SRTM, {:get_elevation, 42.0, 42.0, _opts}} diff --git a/test/teslamate/vehicles/vehicle/charging_test.exs b/test/teslamate/vehicles/vehicle/charging_test.exs index 5b916829a1..7ad386076c 100644 --- a/test/teslamate/vehicles/vehicle/charging_test.exs +++ b/test/teslamate/vehicles/vehicle/charging_test.exs @@ -33,7 +33,7 @@ defmodule TeslaMate.Vehicles.Vehicle.ChargingTest do assert_receive {:insert_position, ^car, %{}} assert_receive {:pubsub, {:broadcast, _, _, %Summary{state: :online, since: s0}}} - assert_receive {:start_charging_process, ^car, %{latitude: 0.0, longitude: 0.0}, + assert_receive {:start_charging_process, ^car, %{latitude: +0.0, longitude: +0.0}, [lookup_address: true]} assert_receive {:"$websockex_cast", :disconnect} @@ -100,7 +100,7 @@ defmodule TeslaMate.Vehicles.Vehicle.ChargingTest do events = [ {:ok, online_event()}, - {:ok, online_event(drive_state: %{timestamp: now_ts, latitude: 0.0, longitude: 0.0})}, + {:ok, online_event(drive_state: %{timestamp: now_ts, latitude: +0.0, longitude: +0.0})}, {:ok, charging_event(now_ts + 1, "Charging", 0.1)}, {:ok, charging_event(now_ts + 2, "Charging", 0.2)}, {:error, :vehicle_unavailable}, @@ -123,7 +123,7 @@ defmodule TeslaMate.Vehicles.Vehicle.ChargingTest do assert_receive {:insert_position, ^car, %{}} assert_receive {:pubsub, {:broadcast, _, _, %Summary{state: :online}}} - assert_receive {:start_charging_process, ^car, %{latitude: 0.0, longitude: 0.0}, + assert_receive {:start_charging_process, ^car, %{latitude: +0.0, longitude: +0.0}, [lookup_address: true]} assert_receive {:"$websockex_cast", :disconnect} @@ -159,7 +159,7 @@ defmodule TeslaMate.Vehicles.Vehicle.ChargingTest do events = [ {:ok, online_event()}, - {:ok, online_event(drive_state: %{timestamp: now_ts, latitude: 0.0, longitude: 0.0})}, + {:ok, online_event(drive_state: %{timestamp: now_ts, latitude: +0.0, longitude: +0.0})}, {:ok, charging_event(now_ts + 1, "Charging", 0.1)}, {:ok, %TeslaApi.Vehicle{state: "online", charge_state: nil}}, {:ok, %TeslaApi.Vehicle{state: "online", charge_state: nil}}, @@ -178,7 +178,7 @@ defmodule TeslaMate.Vehicles.Vehicle.ChargingTest do assert_receive {:insert_position, ^car, %{}} assert_receive {:pubsub, {:broadcast, _, _, %Summary{state: :online}}} - assert_receive {:start_charging_process, ^car, %{latitude: 0.0, longitude: 0.0}, + assert_receive {:start_charging_process, ^car, %{latitude: +0.0, longitude: +0.0}, [lookup_address: true]} assert_receive {:"$websockex_cast", :disconnect} @@ -223,7 +223,7 @@ defmodule TeslaMate.Vehicles.Vehicle.ChargingTest do assert_receive {:insert_position, ^car, %{}} assert_receive {:pubsub, {:broadcast, _, _, %Summary{state: :online}}} - assert_receive {:start_charging_process, ^car, %{latitude: 0.0, longitude: 0.0}, + assert_receive {:start_charging_process, ^car, %{latitude: +0.0, longitude: +0.0}, [lookup_address: true]} assert_receive {:"$websockex_cast", :disconnect} @@ -239,7 +239,7 @@ defmodule TeslaMate.Vehicles.Vehicle.ChargingTest do events = [ {:ok, online_event()}, - {:ok, online_event(drive_state: %{timestamp: now_ts, latitude: 0.0, longitude: 0.0})}, + {:ok, online_event(drive_state: %{timestamp: now_ts, latitude: +0.0, longitude: +0.0})}, {:ok, charging_event(now_ts + 1, "Charging", 0.1)}, {:ok, charging_event(now_ts + 2, "Charging", 0.2)}, {:error, :vehicle_unavailable}, @@ -255,7 +255,7 @@ defmodule TeslaMate.Vehicles.Vehicle.ChargingTest do assert_receive {:insert_position, ^car, %{}} assert_receive {:pubsub, {:broadcast, _, _, %Summary{state: :online}}} - assert_receive {:start_charging_process, ^car, %{latitude: 0.0, longitude: 0.0}, + assert_receive {:start_charging_process, ^car, %{latitude: +0.0, longitude: +0.0}, [lookup_address: true]} assert_receive {:"$websockex_cast", :disconnect} diff --git a/test/teslamate/vehicles/vehicle/streaming_test.exs b/test/teslamate/vehicles/vehicle/streaming_test.exs index 8f0d5ebbde..9befa38d91 100644 --- a/test/teslamate/vehicles/vehicle/streaming_test.exs +++ b/test/teslamate/vehicles/vehicle/streaming_test.exs @@ -338,8 +338,8 @@ defmodule TeslaMate.Vehicles.Vehicle.StreamingTest do stream(name, %{shift_state: nil, power: -1, time: now}) send(:"api_#{name}", :continue) - assert_receive {:start_charging_process, ^car, %{latitude: 0.0}, [lookup_address: true]} - assert_receive {:insert_charge, cproc, %{date: _, charge_energy_added: 0.0}} + assert_receive {:start_charging_process, ^car, %{latitude: +0.0}, [lookup_address: true]} + assert_receive {:insert_charge, cproc, %{date: _, charge_energy_added: +0.0}} assert_receive {:"$websockex_cast", :disconnect} assert_receive {:pubsub, {:broadcast, _, _, %Summary{state: :charging}}} @@ -517,8 +517,10 @@ defmodule TeslaMate.Vehicles.Vehicle.StreamingTest do assert_receive :continue? send(:"api_#{name}", :continue) - assert_receive {:start_charging_process, ^car, %{latitude: 0.0}, [lookup_address: true]}, 1000 - assert_receive {:insert_charge, _cproc, %{date: _, charge_energy_added: 0.0}} + assert_receive {:start_charging_process, ^car, %{latitude: +0.0}, [lookup_address: true]}, + 1000 + + assert_receive {:insert_charge, _cproc, %{date: _, charge_energy_added: +0.0}} assert_receive {:"$websockex_cast", :disconnect} assert_receive {:pubsub, {:broadcast, _, _, %Summary{state: :charging}}} diff --git a/test/teslamate/vehicles/vehicle/suspend_logging_test.exs b/test/teslamate/vehicles/vehicle/suspend_logging_test.exs index ad2c837a58..ae3d6677c7 100644 --- a/test/teslamate/vehicles/vehicle/suspend_logging_test.exs +++ b/test/teslamate/vehicles/vehicle/suspend_logging_test.exs @@ -316,7 +316,7 @@ defmodule TeslaMate.Vehicles.Vehicle.SuspendLoggingTest do assert_receive {:insert_position, ^car, %{}} assert_receive {:pubsub, {:broadcast, _, _, %Summary{state: :online, since: s0}}} - assert_receive {:start_charging_process, ^car, %{latitude: 0.0, longitude: 0.0}, + assert_receive {:start_charging_process, ^car, %{latitude: +0.0, longitude: +0.0}, [lookup_address: true]} assert_receive {:"$websockex_cast", :disconnect} diff --git a/test/teslamate/vehicles/vehicle/suspend_test.exs b/test/teslamate/vehicles/vehicle/suspend_test.exs index 30ebe77909..1331e9effe 100644 --- a/test/teslamate/vehicles/vehicle/suspend_test.exs +++ b/test/teslamate/vehicles/vehicle/suspend_test.exs @@ -344,7 +344,7 @@ defmodule TeslaMate.Vehicles.Vehicle.SuspendTest do assert_receive {:insert_position, ^car, %{}} assert_receive {:pubsub, {:broadcast, _, _, %Summary{state: :online}}} - assert_receive {:start_charging_process, ^car, %{latitude: 0.0, longitude: 0.0}, + assert_receive {:start_charging_process, ^car, %{latitude: +0.0, longitude: +0.0}, [lookup_address: true]} assert_receive {:"$websockex_cast", :disconnect} @@ -399,7 +399,7 @@ defmodule TeslaMate.Vehicles.Vehicle.SuspendTest do assert_receive {:insert_position, ^car, %{}} assert_receive {:pubsub, {:broadcast, _, _, %Summary{state: :online}}} - assert_receive {:start_charging_process, ^car, %{latitude: 0.0, longitude: 0.0}, + assert_receive {:start_charging_process, ^car, %{latitude: +0.0, longitude: +0.0}, [lookup_address: true]} assert_receive {:insert_charge, cproc_0, %{date: _, charge_energy_added: 0.1}} From 78533fd51f5beda80ab29da7ea652e4e199ba0d9 Mon Sep 17 00:00:00 2001 From: Adrian Kumpf <8999358+adriankumpf@users.noreply.github.com> Date: Sun, 12 Nov 2023 19:26:52 +0100 Subject: [PATCH 010/113] Remove donation links --- .github/FUNDING.yml | 12 ------- README.md | 1 - .../controllers/donate_controller.ex | 27 ---------------- lib/teslamate_web/plugs/donate.ex | 31 ------------------- lib/teslamate_web/router.ex | 3 -- .../templates/layout/root.html.heex | 11 +------ test/teslamate_web/live/settings_test.exs | 4 +-- 7 files changed, 2 insertions(+), 87 deletions(-) delete mode 100644 .github/FUNDING.yml delete mode 100644 lib/teslamate_web/controllers/donate_controller.ex delete mode 100644 lib/teslamate_web/plugs/donate.ex diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml deleted file mode 100644 index 30e59285b0..0000000000 --- a/.github/FUNDING.yml +++ /dev/null @@ -1,12 +0,0 @@ -# These are supported funding model platforms - -github: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2] -patreon: # Replace with a single Patreon username -open_collective: # Replace with a single Open Collective username -ko_fi: # Replace with a single Ko-fi username -tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel -community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry -liberapay: # Replace with a single Liberapay username -issuehunt: # Replace with a single IssueHunt username -otechie: # Replace with a single Otechie username -custom: https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=YE4CPXRAV9CVL&source=url diff --git a/README.md b/README.md index 6faee5abed..464328237f 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,6 @@ [![](https://img.shields.io/docker/v/teslamate/teslamate/latest)](https://hub.docker.com/r/teslamate/teslamate) [![](https://img.shields.io/docker/image-size/teslamate/teslamate/latest)](https://hub.docker.com/r/teslamate/teslamate) [![](https://img.shields.io/docker/pulls/teslamate/teslamate?color=%23099cec)](https://hub.docker.com/r/teslamate/teslamate) -[![](https://img.shields.io/badge/Donate-PayPal-ff69b4.svg)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=YE4CPXRAV9CVL&source=url) A powerful, self-hosted data logger for your Tesla. diff --git a/lib/teslamate_web/controllers/donate_controller.ex b/lib/teslamate_web/controllers/donate_controller.ex deleted file mode 100644 index 610df6c0b5..0000000000 --- a/lib/teslamate_web/controllers/donate_controller.ex +++ /dev/null @@ -1,27 +0,0 @@ -defmodule TeslaMateWeb.DonateController do - use TeslaMateWeb, :controller - - alias TeslaMateWeb.Plugs.Donate - - action_fallback TeslaMateWeb.FallbackController - - @url "https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=YE4CPXRAV9CVL&source=url" - - def index(conn, _opts) do - value = to_string(times_clicked(conn) + 1) - - conn - |> put_resp_cookie("donate", value, max_age: Donate.max_age()) - |> redirect(external: @url) - |> halt() - end - - defp times_clicked(conn) do - with %{cookies: %{"donate" => n}} <- conn, - {n, ""} <- Integer.parse(n) do - n - else - _ -> 0 - end - end -end diff --git a/lib/teslamate_web/plugs/donate.ex b/lib/teslamate_web/plugs/donate.ex deleted file mode 100644 index 9c219c0ba0..0000000000 --- a/lib/teslamate_web/plugs/donate.ex +++ /dev/null @@ -1,31 +0,0 @@ -defmodule TeslaMateWeb.Plugs.Donate do - import Plug.Conn - - alias TeslaMate.{Release, Import} - - @max_age 30 * 24 * 60 * 60 - def max_age, do: @max_age - - def init(opts), do: opts - - def call(%{req_cookies: %{"donate" => n}} = conn, _opts) when is_binary(n), do: conn - def call(conn, _opts), do: put_donate_cookie(conn) - - defp put_donate_cookie(conn) do - if importing_data?() or Release.seconds_since_last_migration() < @max_age / 2 do - put_resp_cookie(conn, "donate", "0", max_age: @max_age, same_site: "Strict") - else - conn - end - end - - defp importing_data? do - with pid when is_pid(pid) <- Process.whereis(Import), - true <- Process.alive?(pid), - %Import.Status{state: s} when s != :error <- Import.get_status() do - true - else - _ -> false - end - end -end diff --git a/lib/teslamate_web/router.ex b/lib/teslamate_web/router.ex index d8233805b1..246b47fabb 100644 --- a/lib/teslamate_web/router.ex +++ b/lib/teslamate_web/router.ex @@ -1,7 +1,6 @@ defmodule TeslaMateWeb.Router do use TeslaMateWeb, :router - alias TeslaMateWeb.Plugs.Donate alias TeslaMate.Settings pipeline :browser do @@ -24,7 +23,6 @@ defmodule TeslaMateWeb.Router do plug :put_root_layout, {TeslaMateWeb.LayoutView, :root} plug :protect_from_forgery plug :put_secure_browser_headers - plug Donate plug :fetch_settings end @@ -37,7 +35,6 @@ defmodule TeslaMateWeb.Router do get "/", CarController, :index get "/drive/:id/gpx", DriveController, :gpx - get "/donate", DonateController, :index live_session :default do live "/sign_in", SignInLive.Index diff --git a/lib/teslamate_web/templates/layout/root.html.heex b/lib/teslamate_web/templates/layout/root.html.heex index d79f156d1e..65703235cd 100644 --- a/lib/teslamate_web/templates/layout/root.html.heex +++ b/lib/teslamate_web/templates/layout/root.html.heex @@ -64,11 +64,10 @@ - <% show_donate_button = @conn.cookies["donate"] in Enum.map(0..1, &to_string/1) %> <% update = TeslaMate.Updater.get_update() %> -
+
<%= if not TeslaMate.Vault.encryption_key_provided?() or (not TeslaMate.Api.signed_in?() and not TeslaMate.Auth.can_decrypt_tokens?()) do %> @@ -96,14 +95,6 @@