mirror of
https://github.com/lildude/ha-addon-teslamate.git
synced 2026-10-13 13:10:30 -04:00
.
initial commit
This commit is contained in:
@@ -0,0 +1,93 @@
|
|||||||
|
name: teslamate
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches:
|
||||||
|
- '**'
|
||||||
|
paths:
|
||||||
|
- 'teslamate/**'
|
||||||
|
- '!**.md'
|
||||||
|
- '.github/workflows/teslamate.yml'
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
build:
|
||||||
|
env:
|
||||||
|
TESLAMATE_TAG: 1.20.1
|
||||||
|
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
|
strategy:
|
||||||
|
matrix:
|
||||||
|
arch: [amd64, armhf, armv7, aarch64]
|
||||||
|
fail-fast: true
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v2
|
||||||
|
with:
|
||||||
|
submodules: 'true'
|
||||||
|
- name: Docker version
|
||||||
|
run: docker version
|
||||||
|
- name: Setup qemu
|
||||||
|
id: qemu
|
||||||
|
uses: docker/setup-qemu-action@v1
|
||||||
|
with:
|
||||||
|
platforms: all
|
||||||
|
- name: Install buildx
|
||||||
|
id: buildx
|
||||||
|
uses: docker/setup-buildx-action@v1
|
||||||
|
with:
|
||||||
|
version: latest
|
||||||
|
- name: Available platforms
|
||||||
|
run: echo ${{ steps.buildx.outputs.platforms }}
|
||||||
|
- name: Set PLATFORM variable
|
||||||
|
run: |
|
||||||
|
case "${{ matrix.arch }}" in
|
||||||
|
"amd64" )
|
||||||
|
echo "PLATFORM=linux/amd64" >> $GITHUB_ENV ;;
|
||||||
|
"i386" )
|
||||||
|
echo "PLATFORM=linux/386" >> $GITHUB_ENV ;;
|
||||||
|
"aarch64" )
|
||||||
|
echo "PLATFORM=linux/arm64" >> $GITHUB_ENV ;;
|
||||||
|
"armhf" )
|
||||||
|
echo "PLATFORM=linux/arm/v7" >> $GITHUB_ENV ;;
|
||||||
|
"armv7" )
|
||||||
|
echo "PLATFORM=linux/arm/v7" >> $GITHUB_ENV ;;
|
||||||
|
esac
|
||||||
|
- name: Set environment variables from config.json
|
||||||
|
run: |
|
||||||
|
echo "ADDON_VERSION=$(jq -r .version < $GITHUB_WORKFLOW/config.json)" >> $GITHUB_ENV
|
||||||
|
echo "ADDON_NAME=$(jq -r .name < $GITHUB_WORKFLOW/config.json)" >> $GITHUB_ENV
|
||||||
|
echo "ADDON_DESCRIPTION=$(jq -r .description < $GITHUB_WORKFLOW/config.json)" >> $GITHUB_ENV
|
||||||
|
- name: Login to docker hub
|
||||||
|
run: sudo docker login -u ${{ secrets.DOCKER_USERNAME }} -p ${{ secrets.DOCKER_PASSWORD }}
|
||||||
|
- name: Buildx build (if not main)
|
||||||
|
run: |
|
||||||
|
DOCKER_CLI_EXPERIMENTAL=enabled sudo docker buildx build \
|
||||||
|
--pull \
|
||||||
|
--platform=$PLATFORM \
|
||||||
|
--build-arg TESLAMATE_TAG=$TESLAMATE_TAG \
|
||||||
|
--label io.hass.type="addon" \
|
||||||
|
--label io.hass.name="$ADDON_NAME" \
|
||||||
|
--label io.hass.description="$ADDON_DESCRIPTION" \
|
||||||
|
--label io.hass.version="$ADDON_VERSION" \
|
||||||
|
--label io.hass.arch="${{ matrix.arch }}" \
|
||||||
|
--label io.hass.url="https://github.com/matt-FFFFFF/hassio-addon-repository/blob/main/teslamate/README.md" \
|
||||||
|
-t ${{ secrets.DOCKER_USERNAME }}/teslamate-${{ matrix.arch }}:$ADDON_VERSION \
|
||||||
|
./$GITHUB_WORKFLOW
|
||||||
|
if: github.ref != 'refs/heads/main'
|
||||||
|
- name: Buildx build --push (if main)
|
||||||
|
run: |
|
||||||
|
DOCKER_CLI_EXPERIMENTAL=enabled sudo docker buildx build \
|
||||||
|
--pull \
|
||||||
|
--push \
|
||||||
|
--platform=$PLATFORM \
|
||||||
|
--build-arg TESLAMATE_TAG=$TESLAMATE_TAG \
|
||||||
|
--label io.hass.type="addon" \
|
||||||
|
--label io.hass.name="$ADDON_NAME" \
|
||||||
|
--label io.hass.description="$ADDON_DESCRIPTION" \
|
||||||
|
--label io.hass.version="$ADDON_VERSION" \
|
||||||
|
--label io.hass.arch="${{ matrix.arch }}" \
|
||||||
|
--label io.hass.url="https://github.com/matt-FFFFFF/hassio-addon-repository/blob/main/teslamate/README.md" \
|
||||||
|
-t ${{ secrets.DOCKER_USERNAME }}/teslamate-${{ matrix.arch }}:$ADDON_VERSION \
|
||||||
|
./$GITHUB_WORKFLOW
|
||||||
|
if: github.ref == 'refs/heads/main'
|
||||||
@@ -0,0 +1,48 @@
|
|||||||
|
# Changelog
|
||||||
|
|
||||||
|
## 0.4.0
|
||||||
|
|
||||||
|
* Teslamate 1.20.1
|
||||||
|
* Run as root <https://github.com/matt-FFFFFF/hassio-addon-repository/issues/8>
|
||||||
|
|
||||||
|
|
||||||
|
## 0.3.0
|
||||||
|
|
||||||
|
* Teslamate 1.20.0
|
||||||
|
|
||||||
|
## 0.2.0
|
||||||
|
|
||||||
|
* 🎉🎉🎉 Automatically deploy Grafana dashbaords 🎉🎉🎉 (if configured)
|
||||||
|
* Teslamate 1.19.3
|
||||||
|
* Drop support for i386
|
||||||
|
|
||||||
|
## 0.1.1
|
||||||
|
|
||||||
|
* Teslamate [1.19.1](https://github.com/adriankumpf/teslamate/releases/tag/v1.19.1)
|
||||||
|
|
||||||
|
## 0.1.0
|
||||||
|
|
||||||
|
* Teslamate [1.19.0](https://github.com/adriankumpf/teslamate/releases/tag/v1.19.0)
|
||||||
|
* Implement docker buildx
|
||||||
|
* Proper Raspberry Pi/ARM support (armv7 and arm64/aarch64)
|
||||||
|
* Use original Teslamate image as base
|
||||||
|
|
||||||
|
[Full Changelog](https://github.com/matt-FFFFFF/hassio-addon-repository/blob/master/teslamate/CHANGELOG.md)
|
||||||
|
|
||||||
|
## 0.0.7
|
||||||
|
|
||||||
|
* Disable Web UI link
|
||||||
|
* Disable ingress support
|
||||||
|
|
||||||
|
## 0.0.6
|
||||||
|
|
||||||
|
* Teslamate 1.18.2
|
||||||
|
|
||||||
|
## 0.0.5
|
||||||
|
|
||||||
|
* Teslamate 1.18.0
|
||||||
|
|
||||||
|
## 0.0.4
|
||||||
|
|
||||||
|
* Initial published version
|
||||||
|
* Teslamate version 1.17.0
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
# Changelog
|
||||||
|
|
||||||
|
## 0.4.0
|
||||||
|
|
||||||
|
* Teslamate 1.20.1
|
||||||
|
* Run as root <https://github.com/matt-FFFFFF/hassio-addon-repository/issues/8>
|
||||||
|
|
||||||
|
[Full Changelog](https://github.com/matt-FFFFFF/hassio-addon-repository/blob/master/teslamate/CHANGELOG.md)
|
||||||
+43
@@ -0,0 +1,43 @@
|
|||||||
|
ARG TESLAMATE_TAG
|
||||||
|
|
||||||
|
FROM teslamate/grafana:${TESLAMATE_TAG} as grafana
|
||||||
|
|
||||||
|
#---
|
||||||
|
|
||||||
|
FROM teslamate/teslamate:${TESLAMATE_TAG}
|
||||||
|
|
||||||
|
ARG BASHIO_VERSION=0.9.0
|
||||||
|
ARG S6_OVERLAY_VERSION=1.22.1.0
|
||||||
|
|
||||||
|
USER root
|
||||||
|
|
||||||
|
# Install bashio - from https://github.com/home-assistant/docker-base/blob/master/alpine/amd64/Dockerfile
|
||||||
|
RUN apk add --no-cache \
|
||||||
|
bash \
|
||||||
|
jq \
|
||||||
|
tzdata \
|
||||||
|
ca-certificates \
|
||||||
|
curl \
|
||||||
|
bind-tools \
|
||||||
|
\
|
||||||
|
&& curl -L -s "https://github.com/just-containers/s6-overlay/releases/download/v${S6_OVERLAY_VERSION}/s6-overlay-amd64.tar.gz" \
|
||||||
|
| tar zxvf - -C / \
|
||||||
|
&& mkdir -p /etc/fix-attrs.d \
|
||||||
|
&& mkdir -p /etc/services.d \
|
||||||
|
\
|
||||||
|
&& mkdir -p /tmp/bashio \
|
||||||
|
&& curl -L -s https://github.com/hassio-addons/bashio/archive/v${BASHIO_VERSION}.tar.gz | tar -xzf - --strip 1 -C /tmp/bashio \
|
||||||
|
&& mv /tmp/bashio/lib /usr/lib/bashio \
|
||||||
|
&& ln -s /usr/lib/bashio/bashio /usr/bin/bashio \
|
||||||
|
&& rm -rf /tmp/bashio
|
||||||
|
|
||||||
|
COPY --chown=root scripts/*.sh /
|
||||||
|
RUN chmod a+x /*.sh
|
||||||
|
|
||||||
|
COPY --from=grafana --chown=root /dashboards /dashboards
|
||||||
|
COPY --from=grafana --chown=root /dashboards_internal /dashboards
|
||||||
|
|
||||||
|
# USER nobody
|
||||||
|
|
||||||
|
ENTRYPOINT ["/ha-bootstrap.sh"]
|
||||||
|
CMD ["bin/teslamate", "start"]
|
||||||
@@ -0,0 +1,50 @@
|
|||||||
|
# TeslaMate Addon for Home Assistant
|
||||||
|
|
||||||
|
This addon builds on the excellent work of [Adrian Kumpf](https://github.com/adriankumpf/teslamate). See his repo for information regarding the TeslaMate application.
|
||||||
|
|
||||||
|
## DB Connection
|
||||||
|
|
||||||
|
If using the Postgres addon from this repo, the database host is ```29b65938-postgres```
|
||||||
|
|
||||||
|
## No Ingress Support
|
||||||
|
|
||||||
|
TeslaMate does not currently support a base path, so it expects all requests to be generated from the URL root ```/```.
|
||||||
|
See https://github.com/adriankumpf/teslamate/issues/494.
|
||||||
|
|
||||||
|
This means we cannot implement Ingress and must expose TeslaMate to the network.
|
||||||
|
I recommend you only do this to configure TeslaMate and you then remove the external port mapping.
|
||||||
|
|
||||||
|
## Grafana Configuration
|
||||||
|
|
||||||
|
> I recommend you use the existing Grafana addon from the community addons
|
||||||
|
|
||||||
|
**NEW - Automatic dashboard uploading!**
|
||||||
|
|
||||||
|
### Data Source
|
||||||
|
|
||||||
|
Configure a PostgreSQL data source as follows:
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
### Uploading Dashboards
|
||||||
|
|
||||||
|
Configure the **Grafana** addon and set the admin username and password:
|
||||||
|
|
||||||
|
```yml
|
||||||
|
env_vars:
|
||||||
|
- name: GF_SECURITY_ADMIN_USER
|
||||||
|
value: admin
|
||||||
|
- name: GF_SECURITY_ADMIN_PASSWORD
|
||||||
|
value: mysecretpassword
|
||||||
|
```
|
||||||
|
|
||||||
|
Now configure the **Teslamate** addon:
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
grafana_import_dashboards: true
|
||||||
|
grafana_folder_name: "TeslaMate"
|
||||||
|
grafana_host: "a0d7b954-grafana" # this is correct if you use the community addon
|
||||||
|
grafana_port: 3000 # this is correct if you use the community addon
|
||||||
|
grafana_user: "admin"
|
||||||
|
grafana_pass: "pass"
|
||||||
|
```
|
||||||
+64
@@ -0,0 +1,64 @@
|
|||||||
|
{
|
||||||
|
"name": "TeslaMate",
|
||||||
|
"version": "0.4.0",
|
||||||
|
"slug": "teslamate",
|
||||||
|
"description": "A self-hosted data logger for your Tesla.",
|
||||||
|
"arch": ["armhf", "armv7", "aarch64", "amd64"],
|
||||||
|
"startup": "application",
|
||||||
|
"boot": "auto",
|
||||||
|
"ingress": false,
|
||||||
|
"ports": {
|
||||||
|
"4000/tcp": null
|
||||||
|
},
|
||||||
|
"ports_description": {
|
||||||
|
"4000/tcp": "Insecure web interface - disable when not in use"
|
||||||
|
},
|
||||||
|
"options": {
|
||||||
|
"database_user": "user",
|
||||||
|
"database_pass": "pass",
|
||||||
|
"database_name": "dbname",
|
||||||
|
"database_host": "29b65938-postgres",
|
||||||
|
"database_ssl": false,
|
||||||
|
"database_port": 5432,
|
||||||
|
"disable_mqtt": false,
|
||||||
|
"grafana_import_dashboards": false,
|
||||||
|
"grafana_folder_name": "TeslaMate",
|
||||||
|
"grafana_host": "a0d7b954-grafana",
|
||||||
|
"grafana_port": 3000,
|
||||||
|
"grafana_user": "admin",
|
||||||
|
"grafana_pass": "pass",
|
||||||
|
"mqtt_host": "core-mosquitto",
|
||||||
|
"mqtt_user": "user",
|
||||||
|
"mqtt_pass": "pass",
|
||||||
|
"mqtt_tls": true,
|
||||||
|
"mqtt_tls_accept_invalid_certs": false,
|
||||||
|
"mqtt_namespace": "account_0",
|
||||||
|
"timezone": "Europe/London",
|
||||||
|
"port": 4000
|
||||||
|
},
|
||||||
|
"schema": {
|
||||||
|
"database_user": "str",
|
||||||
|
"database_pass": "str",
|
||||||
|
"database_name": "str",
|
||||||
|
"database_host": "str",
|
||||||
|
"database_ssl": "bool",
|
||||||
|
"database_port": "int",
|
||||||
|
"disable_mqtt": "bool",
|
||||||
|
"grafana_import_dashboards": "bool",
|
||||||
|
"grafana_folder_name": "str",
|
||||||
|
"grafana_host": "str",
|
||||||
|
"grafana_port": "int",
|
||||||
|
"grafana_user": "str",
|
||||||
|
"grafana_pass": "str",
|
||||||
|
"mqtt_host": "str",
|
||||||
|
"mqtt_user": "str",
|
||||||
|
"mqtt_pass": "str",
|
||||||
|
"mqtt_tls": "bool",
|
||||||
|
"mqtt_tls_accept_invalid_certs": "bool",
|
||||||
|
"mqtt_namespace": "str",
|
||||||
|
"timezone": "str",
|
||||||
|
"port": "int"
|
||||||
|
},
|
||||||
|
"url": "https://github.com/matt-FFFFFF/hassio-addon-repository/blob/master/teslamate/README.md",
|
||||||
|
"image": "mattffffff/teslamate-{arch}"
|
||||||
|
}
|
||||||
Binary file not shown.
|
After Width: | Height: | Size: 72 KiB |
@@ -0,0 +1,127 @@
|
|||||||
|
#!/usr/bin/env bashio
|
||||||
|
|
||||||
|
# The script assumes that basic authentication is configured
|
||||||
|
#
|
||||||
|
# DASHBOARDS_DIRECTORY represents the path to the directory
|
||||||
|
# where the JSON files corresponding to the dashboards exist.
|
||||||
|
# The default location is relative to the execution of the
|
||||||
|
# script.
|
||||||
|
#
|
||||||
|
# Source: https://github.com/cirocosta/sample-grafana/blob/master/update-dashboards.sh
|
||||||
|
|
||||||
|
set -o errexit
|
||||||
|
|
||||||
|
readonly HOST=$(bashio::config 'grafana_host')
|
||||||
|
readonly PORT=$(bashio::config 'grafana_port')
|
||||||
|
readonly USER=$(bashio::config 'grafana_user')
|
||||||
|
readonly PASS=$(bashio::config 'grafana_pass')
|
||||||
|
readonly DASHBOARDS_DIRECTORY="/dashboards"
|
||||||
|
readonly FOLDER_NAME=$(bashio::config 'grafana_folder_name')
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
main() {
|
||||||
|
local task=$1
|
||||||
|
|
||||||
|
URL="http://$HOST:$PORT"
|
||||||
|
LOGIN="$USER:$PASS"
|
||||||
|
|
||||||
|
case $task in
|
||||||
|
backup) backup;;
|
||||||
|
restore) restore;;
|
||||||
|
*) exit 1;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
backup() {
|
||||||
|
local dashboard_json
|
||||||
|
|
||||||
|
for dashboard in $(list_dashboards); do
|
||||||
|
dashboard_json=$(get_dashboard "$dashboard")
|
||||||
|
|
||||||
|
if [[ -z "$dashboard_json" ]]; then
|
||||||
|
echo "ERROR:
|
||||||
|
Couldn't retrieve dashboard $dashboard.
|
||||||
|
"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "$dashboard_json" > "$DASHBOARDS_DIRECTORY/$dashboard".json
|
||||||
|
|
||||||
|
echo "BACKED UP $(basename "$dashboard").json"
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
restore() {
|
||||||
|
bashio::log.info "Checking for Grafana folder: $FOLDER_NAME"
|
||||||
|
FLD=$(curl --silent --show-error \
|
||||||
|
--user "$LOGIN" -H "Content-Type: application/json" \
|
||||||
|
$URL/api/folders | jq ".[] | select(.title==\"$FOLDER_NAME\")")
|
||||||
|
|
||||||
|
if [[ -z "$FLD" ]]; then
|
||||||
|
bashio::log.info "Not found... creating"
|
||||||
|
FLD=$(curl \
|
||||||
|
--silent \
|
||||||
|
--show-error \
|
||||||
|
--user "$LOGIN" \
|
||||||
|
-X POST -H "Content-Type: application/json" \
|
||||||
|
-d "{\"title\":\"$FOLDER_NAME\"}" \
|
||||||
|
"$URL/api/folders")
|
||||||
|
fi
|
||||||
|
|
||||||
|
FOLDER_ID=$(echo $FLD | jq -r .id)
|
||||||
|
|
||||||
|
if [[ -z "$FOLDER_ID" ]]; then
|
||||||
|
bashio::log.error "Could not determine Grafana folder id"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
find "$DASHBOARDS_DIRECTORY" -type f -name \*.json -print0 |
|
||||||
|
while IFS= read -r -d '' dashboard; do
|
||||||
|
curl \
|
||||||
|
--silent --show-error --output /dev/null \
|
||||||
|
--user "$LOGIN" \
|
||||||
|
-X POST -H "Content-Type: application/json" \
|
||||||
|
-d "{\"dashboard\":$(cat "$dashboard"),\"overwrite\":true,\"folderId\":$FOLDER_ID, \
|
||||||
|
\"inputs\":[{\"name\":\"DS_POSTGRES\",\"type\":\"datasource\", \
|
||||||
|
\"pluginId\":\"postgres\",\"value\":\"TeslaMate\"}]}" \
|
||||||
|
"$URL/api/dashboards/import"
|
||||||
|
|
||||||
|
bashio::log.info "... RESTORED $(basename "$dashboard")"
|
||||||
|
done
|
||||||
|
bashio::log.info "Finished Importing Grafana Dashboards"
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
get_dashboard() {
|
||||||
|
local dashboard=$1
|
||||||
|
|
||||||
|
if [[ -z "$dashboard" ]]; then
|
||||||
|
echo "ERROR:
|
||||||
|
A dashboard must be specified.
|
||||||
|
"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
curl \
|
||||||
|
--silent \
|
||||||
|
--user "$LOGIN" \
|
||||||
|
"$URL/api/dashboards/db/$dashboard" |
|
||||||
|
jq '.dashboard | .id = null'
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
list_dashboards() {
|
||||||
|
curl \
|
||||||
|
--silent \
|
||||||
|
--user "$LOGIN" \
|
||||||
|
"$URL/api/search" |
|
||||||
|
jq -r '.[] | select(.type == "dash-db") | .uri' |
|
||||||
|
cut -d '/' -f2
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
main "$@"
|
||||||
Executable
+28
@@ -0,0 +1,28 @@
|
|||||||
|
#!/usr/bin/env bashio
|
||||||
|
|
||||||
|
# Database things
|
||||||
|
export DATABASE_USER=$(bashio::config 'database_user')
|
||||||
|
export DATABASE_PASS=$(bashio::config 'database_pass')
|
||||||
|
export DATABASE_NAME=$(bashio::config 'database_name')
|
||||||
|
export DATABASE_HOST=$(bashio::config 'database_host')
|
||||||
|
export DATABASE_PORT=$(bashio::config 'database_port')
|
||||||
|
|
||||||
|
# MQTT things
|
||||||
|
export DISABLE_MQTT=$(bashio::config 'disable_mqtt')
|
||||||
|
export MQTT_HOST=$(bashio::config 'mqtt_host')
|
||||||
|
export MQTT_USERNAME=$(bashio::config 'mqtt_user')
|
||||||
|
export MQTT_PASSWORD=$(bashio::config 'mqtt_pass')
|
||||||
|
export MQTT_TLS=$(bashio::config 'mqtt_tls')
|
||||||
|
export MQTT_TLS_ACCEPT_INVALID_CERTS=$(bashio::config 'mqtt_tls_accept_invalid_certs')
|
||||||
|
export MQTT_NAMESPACE=export MQTT_TLS=$(bashio::config 'mqtt_namespace')
|
||||||
|
|
||||||
|
# Other things
|
||||||
|
export TZ=$(bashio::config 'timezone')
|
||||||
|
export PORT=$(bashio::config 'port')
|
||||||
|
|
||||||
|
# Import dashboards
|
||||||
|
if [ $(bashio::config 'grafana_import_dashboards') == 'true' ]; then
|
||||||
|
/dashboards.sh restore
|
||||||
|
fi
|
||||||
|
|
||||||
|
exec $(/usr/bin/env sh) /entrypoint.sh "$@"
|
||||||
Reference in New Issue
Block a user