Manual install (FreeBSD)
This document provides the necessary steps for installation of TeslaMate in a FreeBSD jail. The recommended and most straightforward installation approach is through the use of Docker, however this walkthrough provides the necessary steps for manual installation in a FreeBSD 13.0 environment. It assumes that pre-requisites are met and only basic instructions are provided and should also work in FreeBSD before 13.0.
Requirements
Click on the following items to view detailed installation steps.
bash & jq
pkg install bash jq
bash
For simplicity reasons, follow the rest of the tutorial in bash rather the csh.
git
pkg install git
Erlang (v25+)
pkg install erlang
Elixir (v1.16+)
pkg install elixir
Postgres (v17+)
pkg install postgresql17-server-17.0
pkg install postgresql17-contrib-17.0
echo postgres_enable="yes" >> /etc/rc.conf
Initialize the database
service postgresql initdb
Grafana (v10.4.5+)
(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.
pkg install grafana-10.4.5_1
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
An MQTT Broker (e.g. Mosquitto)
pkg install mosquitto
echo mosquitto_enable="yes" >> /etc/rc.conf
Node.js (v20+)
pkg install node20-20.18.1
pkg install npm-node20-10.9.0
Clone TeslaMate git repository
The following command will clone the source files for the TeslaMate project. This should be run in an appropriate directory within which you would like to install TeslaMate. You should also record this path and provide them to the startup scripts proposed at the end of this guide.
cd /usr/local/src
git clone https://github.com/teslamate-org/teslamate.git
cd teslamate
git checkout $(git describe --tags `git rev-list --tags --max-count=1`) # Checkout the latest stable version
Create PostgreSQL database
The following commands will create a database called teslamate
on the PostgreSQL database server, and a user called teslamate
. When creating the teslamate
user, you will be prompted to enter a password for the user interactively. This password should be recorded and provided as an environment variable in the startup script at the end of this guide. Use 'su - postgres' if unable to enter psql console from current user.
psql
postgres=# create database teslamate;
postgres=# create user teslamate with encrypted password 'your_secure_password_here';
postgres=# grant all privileges on database teslamate to teslamate;
postgres=# ALTER USER teslamate WITH SUPERUSER;
postgres=# \q
Note: The superuser privileges can be revoked after running the initial database migrations.
Compile Elixir Project
mix local.hex --force; mix local.rebar --force
mix deps.get --only prod
npm install --prefix ./assets && npm run deploy --prefix ./assets
export MIX_ENV=prod
mix do phx.digest, release --overwrite
Starting TeslaMate at boot time
Create FreeBSD service definition /usr/local/etc/rc.d/teslamate
#!/bin/sh
# PROVIDE: teslamate
# REQUIRE: DAEMON
# KEYWORD: teslamate,tesla
. /etc/rc.subr
name=teslamate
rcvar=teslamate_enable
load_rc_config $name
user=teslamate
group=teslamate
#
# DO NOT CHANGE THESE DEFAULT VALUES HERE
# SET THEM IN THE /etc/rc.conf FILE
#
teslamate_enable=${teslamate_enable-"NO"}
pidfile=${teslamate_pidfile-"/var/run/${name}.pid"}
teslamate_enable_mqtt=${teslamate_enable_mqtt-"FALSE"}
teslamate_db_port=${teslamate_db_port-"5432"}
HTTP_BINDING_ADDRESS="0.0.0.0"; export HTTP_BINDING_ADDRESS
HOME="/usr/local/src/teslamate"; export HOME
PORT=${teslamate_port-"4000"}; export PORT
TZ=${teslamate_timezone-"Europe/Berlin"}; export TZ
LANG=${teslamate_locale-"en_US.UTF-8"}; export LANG
LC_CTYPE=${teslamate_locale-"en_US.UTF-8"}; export LC_TYPE
DATABASE_NAME=${teslamate_db-"teslamate"}; export DATABASE_NAME
DATABASE_HOST=${teslamate_db_host-"localhost"}; export DATABASE_HOST
DATABASE_USER=${teslamate_db_user-"teslamate"}; export DATABASE_USER
DATABASE_PASS=${teslamate_db_pass}; export DATABASE_PASS
ENCRYPTION_KEY=${teslamate_encryption_key}; export ENCRYPTION_KEY
DISABLE_MQTT=${teslamate_mqtt_enable-"FALSE"}; export DISABLE_MQTT
MQTT_HOST=${teslamate_mqtt_host-"localhost"}; export MQTT_HOST
# Uncomment if you need these
#MQTT_USERNAME=${teslamate_mqtt_user-"teslamate"}; export MQTT_USERNAME
#MQTT_PASSWORD=${teslamate_mqtt_pass-"mqttpassword"}; export MQTT_PASSWORD
VIRTUAL_HOST=${teslamate_virtual_host-"teslamate.example.com"}; export VIRTUAL_HOST
COMMAND=${teslamate_command-"${HOME}/_build/prod/rel/teslamate/bin/teslamate"}
teslamate_start()
{
${COMMAND} eval "TeslaMate.Release.migrate"
${COMMAND} daemon
}
start_cmd="${name}_start"
stop_cmd="${COMMAND} stop"
status_cmd="${COMMAND} pid"
run_rc_command "$1"
Update /etc/rc.conf
echo teslamate_enable="YES" >> /etc/rc.conf
echo teslamate_db_host="localhost" >> /etc/rc.conf
echo teslamate_db_port="5432" >> /etc/rc.conf
echo teslamate_db_pass="<super secret>" >> /etc/rc.conf
echo teslamate_encryption_key="<super secret encryption key>" >> /etc/rc.conf
echo teslamate_disable_mqtt="true" >> /etc/rc.conf
echo teslamate_timezone="<TZ Database>" >> /etc/rc.conf #i.e. Europe/Berlin, America/Los_Angeles
Start service
chmod +x /usr/local/etc/rc.d/teslamate
service teslamate start
Import Grafana Dashboards
-
Visit localhost:3000 and log in (don't forget to start the service: service grafana start). The default credentials are:
admin:admin
. -
Create a data source with the name "TeslaMate":
Type: PostgreSQL
Default: YES
Name: TeslaMate
Host: localhost
Database: teslamate
User: teslamate Password: your_secure_password_here
SSL-Mode: disable
Version: 10 -
Manually import the dashboard files or use the
dashboards.sh
script:$ ./grafana/dashboards.sh restore
URL: http://localhost:3000
LOGIN: admin:admin
DASHBOARDS_DIRECTORY: ./grafana/dashboards
RESTORED locations.json
RESTORED drive-stats.json
RESTORED updates.json
RESTORED drive-details.json
RESTORED charge-details.json
RESTORED states.json
RESTORED overview.json
RESTORED vampire-drain.json
RESTORED visited.json
RESTORED drives.json
RESTORED projected-range.json
RESTORED charge-level.json
RESTORED charging-stats.json
RESTORED mileage.json
RESTORED charges.json
RESTORED efficiency.jsontipTo use credentials other than the default, set the
LOGIN
variable:LOGIN=user:password ./grafana/dashboards.sh restore