Back to Teslamate

Manually fixing data

website/docs/maintenance/manually_fixing_data.mdx

3.0.05.6 KB
Original Source

:::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 :::

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 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;
  1. 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)