mirror of
https://github.com/teslamate-org/teslamate.git
synced 2026-01-24 21:06:08 +08:00
* feat(nix): add idiomatic maintenance scripts
* docs: update changelog
* docs: update changelog
* fix(nix): pass required arguments to maintenance.nix (getExe, teslamate)
* fix(nix): escape ${1} in maintenance shell scripts to prevent evaluation errors
* fix(nix): make RELEASE_COOKIE available to maintenance scripts by exporting it after sourcing
* docs: add reference to idiomatic nix backup and restore scripts
* docs: add reference to idiomatic nix maintenance scripts
216 lines
5.7 KiB
Plaintext
216 lines
5.7 KiB
Plaintext
---
|
|
title: Manually fixing data
|
|
---
|
|
|
|
:::note
|
|
If you are using `docker-compose`, you are using Docker Compose v1, which has been deprecated. Docker Compose commands refer to Docker Compose v2. Consider upgrading your docker setup, see [Migrate to Compose V2](https://docs.docker.com/compose/migrate/)
|
|
:::
|
|
|
|
## Get the ID
|
|
|
|
First you need to find out the ID of the drive or charge:
|
|
|
|
import Tabs from "@theme/Tabs";
|
|
import TabItem from "@theme/TabItem";
|
|
|
|
<Tabs
|
|
defaultValue="drive"
|
|
groupId="type"
|
|
values={[
|
|
{ label: 'Drive', value: 'drive', },
|
|
{ label: 'Charge', value: 'charge', },
|
|
]}>
|
|
<TabItem value="drive">
|
|
|
|
- Open the `Drives` dashboard and click on the start date of the drive.
|
|
- The URL will contain the drive ID, for example `&var-drive_id=9999`.
|
|
|
|
</TabItem>
|
|
<TabItem value="charge">
|
|
|
|
- Open the `Charges` dashboard and click on the start date of the charge.
|
|
- The URL will contain the charge id, for example `&var-charging_process_id=9999`.
|
|
|
|
</TabItem>
|
|
</Tabs>
|
|
|
|
## Terminate a drive or charge
|
|
|
|
If for some reason a drive or charge hasn't been fully recorded, for example due to a bug or an unexpected restart, you can terminate it manually. Among other things, this assigns an end date to the drive/charge.
|
|
|
|
Replace `9999` with the actual ID then run the command while the TeslaMate container is running:
|
|
|
|
<Tabs
|
|
defaultValue="drive"
|
|
groupId="type"
|
|
values={[
|
|
{ label: 'Drive', value: 'drive', },
|
|
{ label: 'Charge', value: 'charge', },
|
|
{ label: 'Drive (NixOS)', value: 'drive-nixos', },
|
|
{ label: 'Charge (NixOS)', value: 'charge-nixos', },
|
|
]}>
|
|
<TabItem value="drive">
|
|
|
|
```bash
|
|
docker compose exec teslamate bin/teslamate rpc \
|
|
"TeslaMate.Repo.get!(TeslaMate.Log.Drive, 9999) |> TeslaMate.Log.close_drive()"
|
|
```
|
|
|
|
</TabItem>
|
|
<TabItem value="charge">
|
|
|
|
```bash
|
|
docker compose exec teslamate bin/teslamate rpc \
|
|
"TeslaMate.Repo.get!(TeslaMate.Log.ChargingProcess, 9999) |> TeslaMate.Log.complete_charging_process()"
|
|
```
|
|
|
|
</TabItem>
|
|
<TabItem value="drive-nixos">
|
|
|
|
```bash
|
|
teslamate-close-drive 9999
|
|
```
|
|
|
|
</TabItem>
|
|
<TabItem value="charge-nixos">
|
|
|
|
```bash
|
|
teslamate-close-charge 9999
|
|
```
|
|
|
|
</TabItem>
|
|
</Tabs>
|
|
|
|
## Delete a drive or charge
|
|
|
|
If for some reason a drive or charge was recorded incorrectly, you can delete it.
|
|
|
|
<Tabs
|
|
defaultValue="drive"
|
|
groupId="type"
|
|
values={[
|
|
{ label: 'Drive', value: 'drive', },
|
|
{ label: 'Charge', value: 'charge', },
|
|
{ label: 'Drive (NixOS)', value: 'drive-nixos', },
|
|
{ label: 'Charge (NixOS)', value: 'charge-nixos', },
|
|
]}>
|
|
<TabItem value="drive">
|
|
|
|
1. Attach to the **running** database container:
|
|
|
|
```bash
|
|
docker compose exec database psql teslamate teslamate
|
|
```
|
|
|
|
:::note
|
|
If you get the error `No such service: database`, update your _docker-compose.yml_ or use `db` instead of `database` in the above command.
|
|
:::
|
|
|
|
2. Afterwards replace `9999` with the actual ID then run the query:
|
|
|
|
```sql
|
|
DELETE FROM drives WHERE id = 9999;
|
|
```
|
|
|
|
</TabItem>
|
|
<TabItem value="charge">
|
|
|
|
1. Attach to the **running** database container:
|
|
|
|
```bash
|
|
docker compose exec database psql teslamate teslamate
|
|
```
|
|
|
|
:::note
|
|
If you get the error `No such service: database`, update your _docker-compose.yml_ or use `db` instead of `database` in the above command.
|
|
:::
|
|
|
|
2. Afterwards replace `9999` with the actual ID then run the query:
|
|
|
|
```sql
|
|
DELETE FROM charging_processes WHERE id = 9999;
|
|
```
|
|
|
|
</TabItem>
|
|
|
|
<TabItem value="drive-nixos">
|
|
|
|
You can use the idiomatic maintenance script:
|
|
|
|
```bash
|
|
teslamate-delete-drive 9999
|
|
```
|
|
|
|
</TabItem>
|
|
<TabItem value="charge-nixos">
|
|
|
|
You can use the idiomatic maintenance script:
|
|
|
|
```bash
|
|
teslamate-delete-charge 9999
|
|
```
|
|
|
|
</TabItem>
|
|
</Tabs>
|
|
|
|
## Remove a vehicle from the database
|
|
|
|
**NOTE:** Always [backup](https://docs.teslamate.org/docs/maintenance/backup_restore "backup") your data before performing any database changes.
|
|
|
|
1. Connect to your running TeslaMate database
|
|
|
|
```bash
|
|
docker compose exec database psql teslamate teslamate
|
|
```
|
|
|
|
:::note
|
|
If you get the error `No such service: database`, update your _docker-compose.yml_ or use `db` instead of `database` in the above command.
|
|
:::
|
|
|
|
2. Identify the right car ID in the database to remove
|
|
|
|
```sql
|
|
SELECT id, vin FROM cars;
|
|
```
|
|
|
|
3. Based upon the output, run the following command replacing `num` with the ID from the previous command.
|
|
|
|
```sql
|
|
DELETE FROM cars WHERE id = num;
|
|
DELETE FROM car_settings WHERE id = num;
|
|
DELETE FROM charging_processes WHERE car_id = num;
|
|
DELETE from charges WHERE charging_process_id in (select id from charging_processes where car_id = num);
|
|
DELETE FROM drives WHERE car_id = num;
|
|
DELETE FROM positions WHERE car_id = num;
|
|
DELETE FROM states WHERE car_id = num;
|
|
DELETE FROM updates WHERE car_id = num;
|
|
```
|
|
|
|
## Reindex Database
|
|
|
|
**NOTE:** If your database experiences a lot of updates or deletions, like importing data from other sources or deleting a loaner car or some other similar situation, you might encounter index bloat, which can degrade performance. In such cases, reindexing could be beneficial.
|
|
|
|
In summary, you don't necessarily need to run REINDEX periodically unless your database workload involves significant amounts of updates and deletions, if so, you may you may proceed as indicated in the following steps:
|
|
|
|
1. Connect to your running TeslaMate database
|
|
|
|
```bash
|
|
docker compose exec -T database psql teslamate teslamate
|
|
```
|
|
|
|
:::note
|
|
If you get the error `No such service: database`, update your _docker-compose.yml_ or use `db` instead of `database` in the above command.
|
|
:::
|
|
|
|
2. Run the following script (copy and paste)
|
|
|
|
```sql
|
|
REINDEX DATABASE teslamate
|
|
```
|
|
|
|
3. Exit the prompt by typing:
|
|
|
|
```bash
|
|
\q (or press CTRL + C)
|
|
```
|