Added vwfriend ha evcc
This commit is contained in:
parent
e4d75f78ad
commit
b93e84b8c3
18
.env
18
.env
|
|
@ -1,5 +1,5 @@
|
||||||
UID=1000
|
UID=1000
|
||||||
GID=1000
|
GID=1004
|
||||||
DIR=/srv/docker
|
DIR=/srv/docker
|
||||||
DOMAIN=milvert.com
|
DOMAIN=milvert.com
|
||||||
DOMAIN_PEEK=peekskog.se
|
DOMAIN_PEEK=peekskog.se
|
||||||
|
|
@ -30,10 +30,24 @@ LIBRESPEED_PW=NDVlMzA0MzQ0YmM3NTA0OGIxMzEzMjk4
|
||||||
PIHOLE_PW=NmE4Njc4Y2RjMmUxZmIxMWZkOTg1NTZj
|
PIHOLE_PW=NmE4Njc4Y2RjMmUxZmIxMWZkOTg1NTZj
|
||||||
|
|
||||||
UUID=1000
|
UUID=1000
|
||||||
PGID=1000
|
PGID=1004
|
||||||
TZ=Europe/Stockholm
|
TZ=Europe/Stockholm
|
||||||
|
|
||||||
TGRAMAPI=5306622927:AAGsDD83H1joum_hlTiCtSFWwIyM3nEEntU
|
TGRAMAPI=5306622927:AAGsDD83H1joum_hlTiCtSFWwIyM3nEEntU
|
||||||
TGRAMCHAT=-1005306622927
|
TGRAMCHAT=-1005306622927
|
||||||
TGRAM_SHOUTRRR_ADDRESS=telegram://5306622927:AAGsDD83H1joum_hlTiCtSFWwIyM3nEEntU@telegram?chats=-1001662562579
|
TGRAM_SHOUTRRR_ADDRESS=telegram://5306622927:AAGsDD83H1joum_hlTiCtSFWwIyM3nEEntU@telegram?chats=-1001662562579
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
VWSFRIEND_USERNAME='admin'
|
||||||
|
VWSFRIEND_HOSTNAME='vwsfriend'
|
||||||
|
VWSFRIEND_PASSWORD='bajsa123'
|
||||||
|
WECONNECT_USER='simon@milvert.com'
|
||||||
|
WECONNECT_PASSWORD='khLe86qM925qkB'
|
||||||
|
WECONNECT_SPIN=9331
|
||||||
|
WECONNECT_INTERVAL=180
|
||||||
|
VW_DB_HOSTNAME='postgres'
|
||||||
|
VW_DB_NAME='vwfriend'
|
||||||
|
VW_DB_USER='vwfriend'
|
||||||
|
VW_DB_PASSWORD='icCJ8iwKJBeRBg'
|
||||||
|
ADDITIONAL_PARAMETERS=-vv --mqttbroker mqtt --mqttport 1883 -mu simon -mp bajsa123
|
||||||
|
|
|
||||||
|
|
@ -54,7 +54,7 @@ services:
|
||||||
- PUID=${UID}
|
- PUID=${UID}
|
||||||
- PGID=${GID}
|
- PGID=${GID}
|
||||||
labels:
|
labels:
|
||||||
- "traefik.enable=true"
|
- "traefik.enable=false"
|
||||||
- "traefik.http.services.landet_domo-service.loadbalancer.server.port=8080"
|
- "traefik.http.services.landet_domo-service.loadbalancer.server.port=8080"
|
||||||
- "traefik.http.routers.landet_domo-secure.entrypoints=web-secure"
|
- "traefik.http.routers.landet_domo-secure.entrypoints=web-secure"
|
||||||
- "traefik.http.routers.landet_domo-secure.rule=Host(`landet.${DOMAIN}`)"
|
- "traefik.http.routers.landet_domo-secure.rule=Host(`landet.${DOMAIN}`)"
|
||||||
|
|
|
||||||
|
|
@ -11,7 +11,7 @@ services:
|
||||||
max-file: "3"
|
max-file: "3"
|
||||||
networks:
|
networks:
|
||||||
- backend
|
- backend
|
||||||
image: koenkk/zigbee2mqtt:1.30.4
|
image: koenkk/zigbee2mqtt:1.32.0
|
||||||
restart: always
|
restart: always
|
||||||
volumes:
|
volumes:
|
||||||
- ./zigbee_home_2:/app/data
|
- ./zigbee_home_2:/app/data
|
||||||
|
|
@ -41,7 +41,7 @@ services:
|
||||||
max-file: "5"
|
max-file: "5"
|
||||||
networks:
|
networks:
|
||||||
- backend
|
- backend
|
||||||
image: koenkk/zigbee2mqtt:1.30.4
|
image: koenkk/zigbee2mqtt:1.32.0
|
||||||
restart: always
|
restart: always
|
||||||
volumes:
|
volumes:
|
||||||
- ${DIR}/zigbee2matt:/app/data
|
- ${DIR}/zigbee2matt:/app/data
|
||||||
|
|
@ -63,30 +63,6 @@ services:
|
||||||
- "traefik.http.routers.zig1-secure.middlewares=chain-authelia@file"
|
- "traefik.http.routers.zig1-secure.middlewares=chain-authelia@file"
|
||||||
- "traefik.http.routers.zig1-secure.tls=true"
|
- "traefik.http.routers.zig1-secure.tls=true"
|
||||||
|
|
||||||
grafana:
|
|
||||||
image: grafana/grafana:9.3.6
|
|
||||||
container_name: grafana
|
|
||||||
logging:
|
|
||||||
driver: "json-file"
|
|
||||||
options:
|
|
||||||
max-size: "10m"
|
|
||||||
max-file: "5"
|
|
||||||
restart: always
|
|
||||||
networks:
|
|
||||||
- backend
|
|
||||||
volumes:
|
|
||||||
- ./grafana/grafana.ini:/etc/grafana/grafana.ini
|
|
||||||
# Data persistency
|
|
||||||
# sudo mkdir -p /srv/docker/grafana/data; chown 472:472 /srv/docker/grafana/data
|
|
||||||
- "${DIR}/grafana:/var/lib/grafana"
|
|
||||||
labels:
|
|
||||||
- diun.enable=true
|
|
||||||
- "traefik.enable=true"
|
|
||||||
- "traefik.http.routers.grafana-secure.entrypoints=web-secure"
|
|
||||||
- "traefik.http.routers.grafana-secure.rule=Host(`data.${DOMAIN}`)"
|
|
||||||
- "traefik.http.routers.grafana-secure.middlewares=chain-no-auth@file"
|
|
||||||
- "traefik.http.routers.grafana-secure.tls.certresolver=milvert_dns"
|
|
||||||
- "traefik.http.routers.grafana-secure.tls=true"
|
|
||||||
|
|
||||||
influx:
|
influx:
|
||||||
image: influxdb:2.6
|
image: influxdb:2.6
|
||||||
|
|
@ -195,7 +171,7 @@ services:
|
||||||
|
|
||||||
mqtt:
|
mqtt:
|
||||||
# image: eclipse-mosquitto:1.6.13
|
# image: eclipse-mosquitto:1.6.13
|
||||||
image: eclipse-mosquitto:2.0
|
image: eclipse-mosquitto:2.0.17
|
||||||
container_name: mqtt
|
container_name: mqtt
|
||||||
logging:
|
logging:
|
||||||
driver: "json-file"
|
driver: "json-file"
|
||||||
|
|
@ -203,7 +179,6 @@ services:
|
||||||
max-size: "10m"
|
max-size: "10m"
|
||||||
max-file: "5"
|
max-file: "5"
|
||||||
networks:
|
networks:
|
||||||
- frontend
|
|
||||||
- backend
|
- backend
|
||||||
restart: always
|
restart: always
|
||||||
ports:
|
ports:
|
||||||
|
|
@ -327,10 +302,6 @@ services:
|
||||||
restart: unless-stopped
|
restart: unless-stopped
|
||||||
networks:
|
networks:
|
||||||
backend:
|
backend:
|
||||||
backend_macvlan:
|
|
||||||
ipv4_address: 10.0.0.201
|
|
||||||
pihole_net:
|
|
||||||
ipv4_address: 10.0.5.3
|
|
||||||
labels:
|
labels:
|
||||||
- diun.enable=true
|
- diun.enable=true
|
||||||
- "traefik.enable=true"
|
- "traefik.enable=true"
|
||||||
|
|
@ -348,15 +319,3 @@ networks:
|
||||||
external: true
|
external: true
|
||||||
backend:
|
backend:
|
||||||
external: false
|
external: false
|
||||||
backend_macvlan:
|
|
||||||
driver: macvlan
|
|
||||||
driver_opts:
|
|
||||||
parent: eno1
|
|
||||||
ipam:
|
|
||||||
config:
|
|
||||||
- subnet: 10.0.0.200/27
|
|
||||||
pihole_net:
|
|
||||||
driver: bridge
|
|
||||||
ipam:
|
|
||||||
config:
|
|
||||||
- subnet: 10.0.5.0/29
|
|
||||||
|
|
|
||||||
|
|
@ -13,6 +13,10 @@ secrets:
|
||||||
file: $SECRETSDIR/authelia_notifier_smtp_password
|
file: $SECRETSDIR/authelia_notifier_smtp_password
|
||||||
authelia_duo_api_secret_key:
|
authelia_duo_api_secret_key:
|
||||||
file: $SECRETSDIR/authelia_duo_api_secret_key
|
file: $SECRETSDIR/authelia_duo_api_secret_key
|
||||||
|
vwfriend_password:
|
||||||
|
file: $SECRETSDIR/vwfriend_password
|
||||||
|
vwconnect_password:
|
||||||
|
file: $SECRETSDIR/vwconnect_password
|
||||||
|
|
||||||
|
|
||||||
########################### EXTENSION FIELDS ##########################
|
########################### EXTENSION FIELDS ##########################
|
||||||
|
|
@ -21,8 +25,8 @@ secrets:
|
||||||
#######################################################################
|
#######################################################################
|
||||||
x-environment: &default-tz-puid-pgid
|
x-environment: &default-tz-puid-pgid
|
||||||
- TZ=$TZ
|
- TZ=$TZ
|
||||||
- PUID=$PUID
|
- PUID=${UID}
|
||||||
- PGID=$PGID
|
- PGID=${GID}
|
||||||
|
|
||||||
x-common-keys-monitoring: &common-keys-monitoring
|
x-common-keys-monitoring: &common-keys-monitoring
|
||||||
networks:
|
networks:
|
||||||
|
|
@ -85,7 +89,6 @@ services:
|
||||||
- ./notify.txt:/tmp/authelia/notification.txt
|
- ./notify.txt:/tmp/authelia/notification.txt
|
||||||
networks:
|
networks:
|
||||||
- backend
|
- backend
|
||||||
- frontend
|
|
||||||
ports:
|
ports:
|
||||||
# The HTTP port
|
# The HTTP port
|
||||||
- "9091:9091"
|
- "9091:9091"
|
||||||
|
|
@ -252,9 +255,272 @@ services:
|
||||||
#entrypoint: redis-server --appendonly yes --requirepass $REDIS_PASSWORD --maxmemory 512mb --maxmemory-policy allkeys-lru
|
#entrypoint: redis-server --appendonly yes --requirepass $REDIS_PASSWORD --maxmemory 512mb --maxmemory-policy allkeys-lru
|
||||||
labels:
|
labels:
|
||||||
- diun.enable=true
|
- diun.enable=true
|
||||||
|
|
||||||
|
######################### HOME ############################
|
||||||
|
#
|
||||||
|
# HOME
|
||||||
|
#
|
||||||
|
###############################################################
|
||||||
|
|
||||||
|
ha:
|
||||||
|
container_name: ha
|
||||||
|
image: homeassistant/home-assistant:2023.8
|
||||||
|
restart: always
|
||||||
|
privileged: true
|
||||||
|
networks:
|
||||||
|
backend:
|
||||||
|
docker_vlan:
|
||||||
|
ipv4_address: 10.0.0.203
|
||||||
|
depends_on:
|
||||||
|
- postgres
|
||||||
|
ports:
|
||||||
|
- 8123:8123
|
||||||
|
volumes:
|
||||||
|
- ./ha/config:/config
|
||||||
|
- /etc/localtime:/etc/localtime:ro
|
||||||
|
environment:
|
||||||
|
- PUID=${UUID}
|
||||||
|
- PGID=${PGID}
|
||||||
|
- TZ=${TZ}
|
||||||
|
labels:
|
||||||
|
- diun.enable=true
|
||||||
|
- "traefik.enable=true"
|
||||||
|
- "traefik.http.routers.ha.entrypoints=web-secure"
|
||||||
|
- "traefik.http.routers.ha.rule=Host(`ha.${DOMAIN}`)"
|
||||||
|
- "traefik.http.routers.ha.middlewares=chain-no-auth@file"
|
||||||
|
- "traefik.http.routers.ha.tls.certresolver=milvert_dns"
|
||||||
|
- "traefik.http.routers.ha.tls=true"
|
||||||
|
- "traefik.http.services.ha.loadbalancer.server.port=8123"
|
||||||
|
|
||||||
|
hassconf:
|
||||||
|
container_name: hassconf
|
||||||
|
image: causticlab/hass-configurator-docker:0.5.2
|
||||||
|
restart: unless-stopped
|
||||||
|
networks:
|
||||||
|
- backend
|
||||||
|
ports:
|
||||||
|
- 3218:3218
|
||||||
|
volumes:
|
||||||
|
- ./ha/hass_config:/config
|
||||||
|
- ./ha/config:/hass-config
|
||||||
|
depends_on:
|
||||||
|
- ha
|
||||||
|
labels:
|
||||||
|
- diun.enable=true
|
||||||
|
environment:
|
||||||
|
- PUID=${UUID}
|
||||||
|
- PGID=${PGID}
|
||||||
|
- TZ=${TZ}
|
||||||
|
|
||||||
|
appdaemon:
|
||||||
|
container_name: appdaemon
|
||||||
|
image: acockburn/appdaemon:4.4.2
|
||||||
|
restart: unless-stopped
|
||||||
|
depends_on:
|
||||||
|
- ha
|
||||||
|
labels:
|
||||||
|
- diun.enable=true
|
||||||
|
volumes:
|
||||||
|
- ./ha/appdaemon_config:/conf
|
||||||
|
- /etc/localtime:/etc/localtime:ro
|
||||||
|
ports:
|
||||||
|
- 5050:5050
|
||||||
|
networks:
|
||||||
|
- backend
|
||||||
|
environment:
|
||||||
|
- PUID=${UUID}
|
||||||
|
- PGID=${PGID}
|
||||||
|
- TZ=${TZ}
|
||||||
|
# The following values ar overridden in docker-compose.override.yml
|
||||||
|
- HA_URL=http://ha:8123
|
||||||
|
- DASH_URL=http://appdaemon:5050
|
||||||
|
- TOKEN=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJmZmM0YTI1ZjVlYWM0NGY5OTA3OGFmOWJiMTJmYmUzZCIsImlhdCI6MTY5MzczMDQwNSwiZXhwIjoyMDA5MDkwNDA1fQ.YVH8WhH6FMvTkecJ-taCACP6kVG9is2hHmTR3tk3cns
|
||||||
|
|
||||||
|
evcc:
|
||||||
|
command:
|
||||||
|
- evcc
|
||||||
|
container_name: evcc
|
||||||
|
image: evcc/evcc:0.120.0
|
||||||
|
ports:
|
||||||
|
- 7070:7070/tcp
|
||||||
|
dns:
|
||||||
|
- 8.8.8.8
|
||||||
|
volumes:
|
||||||
|
- "./evcc/evcc.yaml:/etc/evcc.yaml:ro"
|
||||||
|
- ./evcc/evcc:/root/.evcc
|
||||||
|
restart: unless-stopped
|
||||||
|
networks:
|
||||||
|
- backend
|
||||||
|
labels:
|
||||||
|
- diun.enable=true
|
||||||
|
- "traefik.enable=true"
|
||||||
|
- "traefik.http.routers.evcc.entrypoints=web-secure"
|
||||||
|
- "traefik.http.routers.evcc.rule=Host(`box.${DOMAIN}`)"
|
||||||
|
- "traefik.http.services.evcc.loadbalancer.server.port=7070"
|
||||||
|
- "traefik.http.routers.evcc.middlewares=chain-no-auth@file"
|
||||||
|
- "traefik.http.routers.evcc.tls.certresolver=milvert_dns"
|
||||||
|
- "traefik.http.routers.evcc.tls=true"
|
||||||
|
|
||||||
|
grafana:
|
||||||
|
image: grafana/grafana:10.0.0
|
||||||
|
container_name: grafana
|
||||||
|
logging:
|
||||||
|
driver: "json-file"
|
||||||
|
options:
|
||||||
|
max-size: "10m"
|
||||||
|
max-file: "5"
|
||||||
|
restart: always
|
||||||
|
networks:
|
||||||
|
- backend
|
||||||
|
volumes:
|
||||||
|
- ./grafana/grafana.ini:/etc/grafana/grafana.ini
|
||||||
|
# Data persistency
|
||||||
|
# sudo mkdir -p /srv/docker/grafana/data; chown 472:472 /srv/docker/grafana/data
|
||||||
|
- "${DIR}/grafana:/var/lib/grafana"
|
||||||
|
labels:
|
||||||
|
- diun.enable=true
|
||||||
|
- "traefik.enable=true"
|
||||||
|
- "traefik.http.routers.grafana-secure.entrypoints=web-secure"
|
||||||
|
- "traefik.http.routers.grafana-secure.rule=Host(`data.${DOMAIN}`)"
|
||||||
|
- "traefik.http.routers.grafana-secure.middlewares=chain-no-auth@file"
|
||||||
|
- "traefik.http.routers.grafana-secure.tls.certresolver=milvert_dns"
|
||||||
|
- "traefik.http.routers.grafana-secure.tls=true"
|
||||||
|
|
||||||
|
######################### WEB ############################
|
||||||
|
#
|
||||||
|
# WEB
|
||||||
|
#
|
||||||
|
###############################################################
|
||||||
|
|
||||||
|
librespeed:
|
||||||
|
image: ghcr.io/linuxserver/librespeed:5.2.5
|
||||||
|
container_name: librespeed
|
||||||
|
environment:
|
||||||
|
- PUID=${UUID}
|
||||||
|
- PGID=${PGID}
|
||||||
|
- TZ=${TZ}
|
||||||
|
- PASSWORD=${LIBRESPEED_PW}
|
||||||
|
- CUSTOM_RESULTS=false
|
||||||
|
- DB_TYPE=sqlite
|
||||||
|
volumes:
|
||||||
|
- ./librespeed/config:/config
|
||||||
|
restart: unless-stopped
|
||||||
|
networks:
|
||||||
|
- backend
|
||||||
|
labels:
|
||||||
|
- diun.enable=true
|
||||||
|
- "traefik.enable=true"
|
||||||
|
- "traefik.http.routers.librespeed.entrypoints=web-secure"
|
||||||
|
- "traefik.http.routers.librespeed.rule=Host(`librespeed.${DOMAIN}`)"
|
||||||
|
- "traefik.http.routers.librespeed.middlewares=chain-authelia@file"
|
||||||
|
- "traefik.http.routers.librespeed.tls.certresolver=milvert_dns"
|
||||||
|
- "traefik.http.routers.librespeed.tls=true"
|
||||||
|
|
||||||
|
|
||||||
|
vwsfriend:
|
||||||
|
image: tillsteinbach/vwsfriend:0.23.11
|
||||||
|
container_name: vwfriend
|
||||||
|
ports:
|
||||||
|
- ${VWSFRIEND_PORT-4000}:${VWSFRIEND_PORT-4000}
|
||||||
|
networks:
|
||||||
|
- backend
|
||||||
|
volumes:
|
||||||
|
- ./vwsfriend_data:/config
|
||||||
|
environment:
|
||||||
|
- VWSFRIEND_USERNAME=${VWSFRIEND_USERNAME-admin}
|
||||||
|
- VWSFRIEND_PASSWORD=${VWSFRIEND_PASSWORD}
|
||||||
|
- VWSFRIEND_PORT=${VWSFRIEND_PORT-4000}
|
||||||
|
- WECONNECT_USER
|
||||||
|
- WECONNECT_PASSWORD
|
||||||
|
- WECONNECT_SPIN
|
||||||
|
- WECONNECT_INTERVAL
|
||||||
|
- DATABASE_URL=postgresql://${VW_DB_USER}:${VW_DB_PASSWORD}@${VW_DB_HOSTNAME}:5432/${VW_DB_NAME}
|
||||||
|
- ADDITIONAL_PARAMETERS=--with-database --with-abrp ${ADDITIONAL_PARAMETERS}
|
||||||
|
depends_on:
|
||||||
|
- postgres
|
||||||
|
restart: unless-stopped
|
||||||
|
dns:
|
||||||
|
- 8.8.8.8
|
||||||
|
healthcheck:
|
||||||
|
test: (wget -qO- http://localhost:${VWSFRIEND_PORT-4000}/healthcheck | grep "ok" -q) || exit 1
|
||||||
|
interval: 60s
|
||||||
|
timeout: 10s
|
||||||
|
retries: 3
|
||||||
|
secrets:
|
||||||
|
- vwfriend_password
|
||||||
|
- vwconnect_password
|
||||||
|
labels:
|
||||||
|
- diun.enable=true
|
||||||
|
- "traefik.enable=true"
|
||||||
|
- "traefik.http.services.vwsfriend-service.loadbalancer.server.port=4000"
|
||||||
|
- "traefik.http.routers.vwsfriend.entrypoints=web-secure"
|
||||||
|
- "traefik.http.routers.vwsfriend.rule=Host(`vw.${DOMAIN}`)"
|
||||||
|
- "traefik.http.routers.vwsfriend.middlewares=chain-no-auth@file"
|
||||||
|
- "traefik.http.routers.vwsfriend.tls.certresolver=milvert_dns"
|
||||||
|
- "traefik.http.routers.vwsfriend.tls=true"
|
||||||
|
|
||||||
|
vwgrafana:
|
||||||
|
image: tillsteinbach/vwsfriend-grafana:0.23.11
|
||||||
|
container_name: vwgrafana
|
||||||
|
ports:
|
||||||
|
- ${GF_SERVER_HTTP_PORT-3001}:${GF_SERVER_HTTP_PORT-3000}
|
||||||
|
networks:
|
||||||
|
backend:
|
||||||
|
volumes:
|
||||||
|
- ./vwfriend_grafana/data:/var/lib/grafana
|
||||||
|
- ./vwfriend_grafana/dashboard:/home/grafana/dummy
|
||||||
|
environment:
|
||||||
|
- PUID=${UUID}
|
||||||
|
- PGID=${PGID}
|
||||||
|
- TZ=${TZ}
|
||||||
|
- GF_SECURITY_ADMIN_USER=${VWSFRIEND_USERNAME-admin}
|
||||||
|
- GF_SECURITY_ADMIN_PASSWORD=${VWSFRIEND_PASSWORD-secret}
|
||||||
|
- GF_SERVER_HTTP_PORT=${GF_SERVER_HTTP_PORT-3000}
|
||||||
|
- DB_USER=${VW_DB_USER-admin}
|
||||||
|
- DB_PASSWORD=${VW_DB_PASSWORD-secret}
|
||||||
|
- DB_HOSTNAME=${vw_DB_HOSTNAME-postgres}
|
||||||
|
- DB_PORT=${DB_PORT-5432}
|
||||||
|
- DB_NAME=${VW_DB_NAME-vwsfriend}
|
||||||
|
- VWSFRIEND_USERNAME=${VWSFRIEND_USERNAME-admin}
|
||||||
|
- VWSFRIEND_PASSWORD=${VWSFRIEND_PASSWORD-secret}
|
||||||
|
- VWSFRIEND_HOSTNAME=${VWSFRIEND_HOSTNAME-vwsfriendbackend}
|
||||||
|
- VWSFRIEND_PORT=${VWSFRIEND_PORT-4000}
|
||||||
|
restart: unless-stopped
|
||||||
|
healthcheck:
|
||||||
|
test: ["CMD-SHELL", "(wget -qO- http://localhost:${GF_SERVER_HTTP_PORT-3000}/api/health | grep '\"database\": \"ok\"' -q) || exit 1"]
|
||||||
|
interval: 60s
|
||||||
|
timeout: 10s
|
||||||
|
retries: 3
|
||||||
|
labels:
|
||||||
|
- diun.enable=true
|
||||||
|
- "traefik.enable=true"
|
||||||
|
- "traefik.http.services.vwgrafana.loadbalancer.server.port=3000"
|
||||||
|
- "traefik.http.routers.vwgrafana.entrypoints=web-secure"
|
||||||
|
- "traefik.http.routers.vwgrafana.rule=Host(`vwgrafana.${DOMAIN}`)"
|
||||||
|
- "traefik.http.routers.vwgrafana.middlewares=chain-no-auth@file"
|
||||||
|
- "traefik.http.routers.vwgrafana.tls.certresolver=milvert_dns"
|
||||||
|
- "traefik.http.routers.vwgrafana.tls=true"
|
||||||
|
|
||||||
|
|
||||||
networks:
|
networks:
|
||||||
frontend:
|
frontend:
|
||||||
external: true
|
external: true
|
||||||
backend:
|
backend:
|
||||||
external: false
|
external: false
|
||||||
|
|
||||||
|
# MACVLAN guide: https://blog.oddbit.com/post/2018-03-12-using-docker-macvlan-networks/
|
||||||
|
# ip link add vlan-shim link eno1 type macvlan mode bridge
|
||||||
|
# ip addr add 10.0.0.223/32 dev vlan-shim
|
||||||
|
# ip link set vlan-shim up
|
||||||
|
# ip route add 10.0.0.192/27 dev vlan-shim
|
||||||
|
docker_vlan:
|
||||||
|
external: true
|
||||||
|
driver: macvlan
|
||||||
|
driver_opts:
|
||||||
|
parent: eno1
|
||||||
|
ipam:
|
||||||
|
config:
|
||||||
|
- subnet: 10.0.0.200/27
|
||||||
|
|
||||||
|
volumes:
|
||||||
|
vwfriend_grafana:
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,133 @@
|
||||||
|
sponsortoken: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3ODEzODIyNTYsImlhdCI6MTY4Njc3NDI1NiwiaXNzIjoiZXZjYy5pbyIsInN1YiI6Im1pbHZlcnQifQ.HUEmc0NSPt9x5MbOHUAGU6bp3H3E3qwu6O6BAHH9FvE
|
||||||
|
|
||||||
|
#log: debug
|
||||||
|
#levels:
|
||||||
|
# easee: trace
|
||||||
|
|
||||||
|
interval: 30s
|
||||||
|
|
||||||
|
vehicles:
|
||||||
|
- name: car
|
||||||
|
type: custom
|
||||||
|
title: id4
|
||||||
|
capacity: 79 # kWh
|
||||||
|
soc:
|
||||||
|
source: mqtt
|
||||||
|
topic: weconnect/0/vehicles/WVGZZZE2ZPE051949/domains/fuelStatus/rangeStatus/primaryEngine/currentSOC_pct
|
||||||
|
range:
|
||||||
|
source: mqtt
|
||||||
|
topic: weconnect/0/vehicles/WVGZZZE2ZPE051949/domains/fuelStatus/rangeStatus/primaryEngine/remainingRange_km
|
||||||
|
onIdentify: # set defaults when vehicle is identified
|
||||||
|
mode: pv # enable PV-charging when vehicle is identified
|
||||||
|
minSoC: 20 # immediately charge to 0% regardless of mode unless "off" (disabled)
|
||||||
|
targetSoC: 90 # limit charge to 90%
|
||||||
|
|
||||||
|
chargers:
|
||||||
|
- name: wallbox
|
||||||
|
type: easee
|
||||||
|
user: simon+easee@milvert.com
|
||||||
|
password: X7#aEzjlEysBgl
|
||||||
|
charger: EHCNF485
|
||||||
|
|
||||||
|
loadpoints:
|
||||||
|
- title: Garage
|
||||||
|
charger: wallbox
|
||||||
|
vehicle: car
|
||||||
|
mode: pv
|
||||||
|
phases: 3
|
||||||
|
mincurrent: 6
|
||||||
|
maxcurrent: 16
|
||||||
|
resetOnDisconnect: True
|
||||||
|
enable:
|
||||||
|
threshold: 0
|
||||||
|
delay: 15s
|
||||||
|
disable:
|
||||||
|
threshold: 500
|
||||||
|
delay:
|
||||||
|
2m
|
||||||
|
|
||||||
|
site:
|
||||||
|
title: Hemma
|
||||||
|
meters:
|
||||||
|
pv:
|
||||||
|
- pv
|
||||||
|
grid: my_grid
|
||||||
|
|
||||||
|
meters:
|
||||||
|
- name: pv
|
||||||
|
type: custom
|
||||||
|
power:
|
||||||
|
source: mqtt
|
||||||
|
topic: inverter/measure/active_power
|
||||||
|
jq: .value
|
||||||
|
energy:
|
||||||
|
source: mqtt
|
||||||
|
topic: inverter/calculated/accumulated_yield_energy
|
||||||
|
jq: .value
|
||||||
|
timeout: 1h
|
||||||
|
currents:
|
||||||
|
- source: mqtt
|
||||||
|
topic: inverter/measure/phase_A_current
|
||||||
|
jq: .value
|
||||||
|
- source: mqtt
|
||||||
|
topic: inverter/measure/phase_B_current
|
||||||
|
jq: .value
|
||||||
|
- source: mqtt
|
||||||
|
topic: inverter/measure/phase_C_current
|
||||||
|
jq: .value
|
||||||
|
|
||||||
|
- name: my_grid
|
||||||
|
type: custom
|
||||||
|
power:
|
||||||
|
source: calc
|
||||||
|
add:
|
||||||
|
- source: mqtt
|
||||||
|
topic: dsmr/reading/electricity_currently_returned
|
||||||
|
scale: -1000
|
||||||
|
- source: mqtt
|
||||||
|
topic: dsmr/reading/electricity_currently_delivered
|
||||||
|
scale: 1000
|
||||||
|
energy:
|
||||||
|
source: calc
|
||||||
|
add:
|
||||||
|
- source: mqtt
|
||||||
|
topic: dsmr/reading/electricity_returned
|
||||||
|
scale: 0.001
|
||||||
|
- source: mqtt
|
||||||
|
topic: dsmr/reading/electricity_delivered
|
||||||
|
scale: -0.001
|
||||||
|
|
||||||
|
currents:
|
||||||
|
- source: calc
|
||||||
|
add:
|
||||||
|
- source: mqtt
|
||||||
|
topic: dsmr/reading/phase_currently_delivered_l1
|
||||||
|
scale: -1
|
||||||
|
- source: mqtt
|
||||||
|
topic: dsmr/reading/phase_currently_returned_l1
|
||||||
|
- source: calc
|
||||||
|
add:
|
||||||
|
- source: mqtt
|
||||||
|
topic: dsmr/reading/phase_currently_delivered_l2
|
||||||
|
scale: -1
|
||||||
|
- source: mqtt
|
||||||
|
topic: dsmr/reading/phase_currently_returned_l2
|
||||||
|
- source: calc
|
||||||
|
add:
|
||||||
|
- source: mqtt
|
||||||
|
topic: dsmr/reading/phase_currently_delivered_l3
|
||||||
|
scale: -1
|
||||||
|
- source: mqtt
|
||||||
|
topic: dsmr/reading/phase_currently_returned_l3
|
||||||
|
|
||||||
|
influx:
|
||||||
|
url: http://influx:8086
|
||||||
|
database: Car
|
||||||
|
token: H7m068KDh84kcmmkz3fy-dEsKoeYv90rnNXIidPZoBy240Jzdbr2uDtGveiuDz4rGK4jmMI8J00zVwgIBYJxXA==
|
||||||
|
org: milvert
|
||||||
|
|
||||||
|
mqtt:
|
||||||
|
broker: mqtt:1883
|
||||||
|
user: simon
|
||||||
|
password: bajsa123
|
||||||
|
topic: evcc
|
||||||
Binary file not shown.
|
|
@ -0,0 +1,18 @@
|
||||||
|
appdaemon:
|
||||||
|
latitude: 0
|
||||||
|
longitude: 0
|
||||||
|
elevation: 30
|
||||||
|
time_zone: Europe/Berlin
|
||||||
|
plugins:
|
||||||
|
HASS:
|
||||||
|
type: hass
|
||||||
|
ha_url: http://ha:8123
|
||||||
|
token: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJmZmM0YTI1ZjVlYWM0NGY5OTA3OGFmOWJiMTJmYmUzZCIsImlhdCI6MTY5MzczMDQwNSwiZXhwIjoyMDA5MDkwNDA1fQ.YVH8WhH6FMvTkecJ-taCACP6kVG9is2hHmTR3tk3cns
|
||||||
|
cert_verify: False
|
||||||
|
loglevel: DEBUG
|
||||||
|
module_debug:
|
||||||
|
http:
|
||||||
|
url: http://appdaemon:5050
|
||||||
|
admin:
|
||||||
|
api:
|
||||||
|
hadashboard:
|
||||||
Binary file not shown.
|
|
@ -0,0 +1,3 @@
|
||||||
|
hello_world:
|
||||||
|
module: hello
|
||||||
|
class: HelloWorld
|
||||||
|
|
@ -0,0 +1,3 @@
|
||||||
|
hello_world:
|
||||||
|
module: hello
|
||||||
|
class: HelloWorld
|
||||||
|
|
@ -0,0 +1,13 @@
|
||||||
|
import hassapi as hass
|
||||||
|
|
||||||
|
#
|
||||||
|
# Hello World App
|
||||||
|
#
|
||||||
|
# Args:
|
||||||
|
#
|
||||||
|
|
||||||
|
|
||||||
|
class HelloWorld(hass.Hass):
|
||||||
|
def initialize(self):
|
||||||
|
self.log("Hello from AppDaemon")
|
||||||
|
self.log("You are now ready to run Apps!")
|
||||||
|
|
@ -0,0 +1,240 @@
|
||||||
|
|
||||||
|
html {
|
||||||
|
font-size: 100%;
|
||||||
|
-webkit-text-size-adjust: 100%;
|
||||||
|
-ms-text-size-adjust: 100%;
|
||||||
|
padding: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
body {
|
||||||
|
margin: 0;
|
||||||
|
background-color: #222;
|
||||||
|
font-size: 15px;
|
||||||
|
color: #fff;
|
||||||
|
padding: 0;
|
||||||
|
line-height: 1;
|
||||||
|
font-family: 'Helvetica Neue', 'Helvetica', 'Open Sans', 'Arial'
|
||||||
|
}
|
||||||
|
|
||||||
|
b, strong {
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
|
||||||
|
a {
|
||||||
|
text-decoration: none;
|
||||||
|
color: inherit;
|
||||||
|
}
|
||||||
|
|
||||||
|
img {
|
||||||
|
border: 0;
|
||||||
|
-ms-interpolation-mode: bicubic;
|
||||||
|
vertical-align: middle;
|
||||||
|
}
|
||||||
|
|
||||||
|
img, object {
|
||||||
|
max-width: 100%;
|
||||||
|
-webkit-border-radius: 5px;
|
||||||
|
-moz-border-radius: 5px;
|
||||||
|
border-radius: 5px;}
|
||||||
|
|
||||||
|
iframe {
|
||||||
|
max-width: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
table {
|
||||||
|
border-collapse: collapse;
|
||||||
|
border-spacing: 0;
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
td {
|
||||||
|
vertical-align: middle;
|
||||||
|
}
|
||||||
|
|
||||||
|
ul, ol {
|
||||||
|
padding: 0;
|
||||||
|
margin: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
h1, h2, h3, h4, h5, p {
|
||||||
|
padding: 0;
|
||||||
|
margin: 0;
|
||||||
|
}
|
||||||
|
h1 {
|
||||||
|
margin-bottom: 6px;
|
||||||
|
text-align: center;
|
||||||
|
font-size: 100%;
|
||||||
|
font-weight: 200;
|
||||||
|
}
|
||||||
|
h2 {
|
||||||
|
font-size: 300%;
|
||||||
|
font-weight: 400;
|
||||||
|
color: #fff;
|
||||||
|
}
|
||||||
|
h3 {
|
||||||
|
font-size: 125%;
|
||||||
|
font-weight: 300;
|
||||||
|
color: #fff;
|
||||||
|
}
|
||||||
|
|
||||||
|
input {
|
||||||
|
background-color: #444;
|
||||||
|
border: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.dashboard_main {
|
||||||
|
margin: 0px auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
.gridster {
|
||||||
|
margin: 0px auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-background {
|
||||||
|
pointer-events: none;
|
||||||
|
width: 100%!important;
|
||||||
|
height: 100%;
|
||||||
|
position: absolute;
|
||||||
|
left: 0;
|
||||||
|
top: 0;
|
||||||
|
opacity: 0.1;
|
||||||
|
font-size: 1375%;
|
||||||
|
text-align: center;
|
||||||
|
margin-top: 82px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.list-nostyle {
|
||||||
|
list-style: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.gridster ul {
|
||||||
|
list-style: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.gs-w {
|
||||||
|
width: 100%;
|
||||||
|
display: table;
|
||||||
|
cursor: pointer;
|
||||||
|
z-index: auto !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.iframe {
|
||||||
|
position: relative;
|
||||||
|
overflow: hidden;
|
||||||
|
-webkit-border-radius: 5px;
|
||||||
|
-moz-border-radius: 5px;
|
||||||
|
border-radius: 5px;}
|
||||||
|
|
||||||
|
.widget {
|
||||||
|
padding: 0px 0px;
|
||||||
|
text-align: center;
|
||||||
|
width: 100%;
|
||||||
|
display: table-cell;
|
||||||
|
vertical-align: middle;
|
||||||
|
background-color: #444444;
|
||||||
|
-webkit-border-radius: 5px;
|
||||||
|
-moz-border-radius: 5px;
|
||||||
|
border-radius: 5px;}
|
||||||
|
|
||||||
|
.title {
|
||||||
|
color: #fff;
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-inactive {
|
||||||
|
color: #888;
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-active {
|
||||||
|
color: #aaff00;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#container {
|
||||||
|
padding-top: 0px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.modalDialog {
|
||||||
|
position: fixed;
|
||||||
|
top: 0;
|
||||||
|
right: 0;
|
||||||
|
bottom: 0;
|
||||||
|
left: 0;
|
||||||
|
background: rgba(0,0,0,0.8);
|
||||||
|
z-index: 9999;
|
||||||
|
opacity:0;
|
||||||
|
-webkit-transition: opacity 400ms ease-in;
|
||||||
|
-moz-transition: opacity 400ms ease-in;
|
||||||
|
transition: opacity 400ms ease-in;
|
||||||
|
pointer-events: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.modalDialogOpen {
|
||||||
|
opacity:0.95;
|
||||||
|
pointer-events: auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
.modalDialogClose {
|
||||||
|
opacity:0;
|
||||||
|
pointer-events: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.modalDialog > div {
|
||||||
|
width: 275px;
|
||||||
|
position: relative;
|
||||||
|
margin: 3% auto;
|
||||||
|
padding: 5px 20px 13px 20px;
|
||||||
|
border-radius: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.modalDialogCloseButton {
|
||||||
|
line-height: 50px;
|
||||||
|
position: absolute;
|
||||||
|
right: -25px;
|
||||||
|
text-align: center;
|
||||||
|
top: -20px;
|
||||||
|
width: 50px;
|
||||||
|
text-decoration: none;
|
||||||
|
font-weight: bold;
|
||||||
|
-webkit-border-radius: 25px;
|
||||||
|
-moz-border-radius: 25px;
|
||||||
|
border-radius: 25px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.modalDialogCloseButton:hover { background: #444; }
|
||||||
|
|
||||||
|
.widget-basedisplay-default-label .unit {
|
||||||
|
font-size: 225%;
|
||||||
|
font-weight: 400;
|
||||||
|
display: inline-block;
|
||||||
|
vertical-align: top;
|
||||||
|
margin-left: 5px;
|
||||||
|
margin-top: 5px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.widget-basedisplay-default-label .value {
|
||||||
|
display: inline-block;
|
||||||
|
vertical-align: middle;
|
||||||
|
}
|
||||||
|
|
||||||
|
.widget-basedisplay-default-label .valueunit {
|
||||||
|
width: 100%;
|
||||||
|
vertical-align: middle;
|
||||||
|
}
|
||||||
|
|
||||||
|
.widget-basedisplay-default-label .title {
|
||||||
|
position: absolute;
|
||||||
|
top: 5px;
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.widget-basedisplay-default-label .title2 {
|
||||||
|
position: absolute;
|
||||||
|
top: 23px;
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.widget-basedisplay-default-label .state_text {
|
||||||
|
position: absolute;
|
||||||
|
bottom: -3px;
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,6 @@
|
||||||
|
<! body tags ->
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<! body tags go here ->
|
||||||
|
|
||||||
|
|
@ -0,0 +1,6 @@
|
||||||
|
<! head tags ->
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<! head tags go here ->
|
||||||
|
|
||||||
File diff suppressed because it is too large
Load Diff
|
|
@ -0,0 +1,130 @@
|
||||||
|
var myDeviceID;
|
||||||
|
$(function(){ //DOM Ready
|
||||||
|
|
||||||
|
function navigate(url)
|
||||||
|
{
|
||||||
|
window.location.href = url;
|
||||||
|
}
|
||||||
|
|
||||||
|
$(document).attr("title", "Hello Panel");
|
||||||
|
content_width = (120 + 5) * 8 + 5
|
||||||
|
$('.gridster').width(content_width)
|
||||||
|
$(".gridster ul").gridster({
|
||||||
|
widget_margins: [5, 5],
|
||||||
|
widget_base_dimensions: [120, 120],
|
||||||
|
avoid_overlapped_widgets: true,
|
||||||
|
max_rows: 15,
|
||||||
|
max_size_x: 8,
|
||||||
|
shift_widgets_up: false
|
||||||
|
}).data('gridster').disable();
|
||||||
|
|
||||||
|
// Add Widgets
|
||||||
|
|
||||||
|
var gridster = $(".gridster ul").gridster().data('gridster');
|
||||||
|
|
||||||
|
gridster.add_widget('<li><div data-bind="attr: {style: widget_style}" class="widget widget-basedisplay-default-label" id="default-label"><h1 class="title" data-bind="text: title, attr:{ style: title_style}"></h1><h1 class="title2" data-bind="text: title2, attr:{ style: title2_style}"></h1><div class="valueunit" data-bind="attr:{ style: container_style}"><h2 class="value" data-bind="html: value, attr:{ style: value_style}"></h2><p class="unit" data-bind="html: unit, attr:{ style: unit_style}"></p></div><h1 class="state_text" data-bind="text: state_text, attr: {style: state_text_style}"></h1></div></li>', 2, 2, 1, 1)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
var widgets = {}
|
||||||
|
// Initialize Widgets
|
||||||
|
|
||||||
|
widgets["default-label"] = new basedisplay("default-label", "", "default", {'widget_type': 'basedisplay', 'fields': {'title': '', 'title2': '', 'value': 'Hello World', 'unit': '', 'state_text': ''}, 'static_css': {'title_style': 'color: #fff;', 'title2_style': 'color: #fff;', 'unit_style': '', 'value_style': 'color: #fff;', 'state_text_style': 'color: #fff;', 'widget_style': 'background-color: #444;', 'container_style': ''}, 'css': {}, 'icons': [], 'static_icons': [], 'namespace': 'default'})
|
||||||
|
|
||||||
|
|
||||||
|
// Setup click handler to cancel timeout navigations
|
||||||
|
|
||||||
|
$( ".gridster" ).click(function(){
|
||||||
|
clearTimeout(myTimeout);
|
||||||
|
if (myTimeoutSticky) {
|
||||||
|
myTimeout = setTimeout(function() { navigate(myTimeoutUrl); }, myTimeoutDelay);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// Set up timeout
|
||||||
|
|
||||||
|
var myTimeout;
|
||||||
|
var myTimeoutUrl;
|
||||||
|
var myTimeoutDelay;
|
||||||
|
var myTimeoutSticky = 0;
|
||||||
|
if (location.search != "")
|
||||||
|
{
|
||||||
|
console.log("begin")
|
||||||
|
var query = location.search.substr(1);
|
||||||
|
var result = {};
|
||||||
|
query.split("&").forEach(function(part) {
|
||||||
|
var item = part.split("=");
|
||||||
|
result[item[0]] = decodeURIComponent(item[1]);
|
||||||
|
});
|
||||||
|
|
||||||
|
if ("deviceid" in result)
|
||||||
|
{
|
||||||
|
myDeviceID = result.deviceid;
|
||||||
|
try
|
||||||
|
{
|
||||||
|
setCookie('ADdevID', myDeviceID);
|
||||||
|
}
|
||||||
|
catch (e)
|
||||||
|
{
|
||||||
|
console.log(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
myDeviceID = getCookie('ADdevID');
|
||||||
|
}
|
||||||
|
catch (e)
|
||||||
|
{
|
||||||
|
console.log(e);
|
||||||
|
myDeviceID = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if ("timeout" in result && "return" in result)
|
||||||
|
{
|
||||||
|
url = result.return
|
||||||
|
argcount = 0
|
||||||
|
for (arg in result)
|
||||||
|
{
|
||||||
|
if (arg != "timeout" && arg != "return" && arg != "sticky")
|
||||||
|
{
|
||||||
|
if (argcount == 0)
|
||||||
|
{
|
||||||
|
url += "?";
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
url += "&";
|
||||||
|
}
|
||||||
|
argcount ++;
|
||||||
|
url += arg + "=" + result[arg]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if ("sticky" in result)
|
||||||
|
{
|
||||||
|
myTimeoutSticky = (result.sticky == "1");
|
||||||
|
}
|
||||||
|
myTimeoutUrl = url;
|
||||||
|
myTimeoutDelay = result.timeout * 1000;
|
||||||
|
myTimeout = setTimeout(function() { navigate(url); }, result.timeout * 1000);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
myDeviceID = getCookie('ADdevID');
|
||||||
|
}
|
||||||
|
catch (e)
|
||||||
|
{
|
||||||
|
console.log(e);
|
||||||
|
myDeviceID = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Start listening for AD Events
|
||||||
|
|
||||||
|
window.dashstream = new DashStream("ws", location.protocol, document.domain, location.port, "Hello Panel", widgets);
|
||||||
|
|
||||||
|
});
|
||||||
|
|
@ -0,0 +1,14 @@
|
||||||
|
#
|
||||||
|
# Main arguments, all optional
|
||||||
|
#
|
||||||
|
title: Hello Panel
|
||||||
|
widget_dimensions: [120, 120]
|
||||||
|
widget_margins: [5, 5]
|
||||||
|
columns: 8
|
||||||
|
|
||||||
|
label:
|
||||||
|
widget_type: label
|
||||||
|
text: Hello World
|
||||||
|
|
||||||
|
layout:
|
||||||
|
- label(2x2)
|
||||||
|
|
@ -0,0 +1 @@
|
||||||
|
[]
|
||||||
|
|
@ -0,0 +1,55 @@
|
||||||
|
blueprint:
|
||||||
|
name: Motion-activated Light
|
||||||
|
description: Turn on a light when motion is detected.
|
||||||
|
domain: automation
|
||||||
|
source_url: https://github.com/home-assistant/core/blob/dev/homeassistant/components/automation/blueprints/motion_light.yaml
|
||||||
|
author: Home Assistant
|
||||||
|
input:
|
||||||
|
motion_entity:
|
||||||
|
name: Motion Sensor
|
||||||
|
selector:
|
||||||
|
entity:
|
||||||
|
domain: binary_sensor
|
||||||
|
device_class: motion
|
||||||
|
light_target:
|
||||||
|
name: Light
|
||||||
|
selector:
|
||||||
|
target:
|
||||||
|
entity:
|
||||||
|
domain: light
|
||||||
|
no_motion_wait:
|
||||||
|
name: Wait time
|
||||||
|
description: Time to leave the light on after last motion is detected.
|
||||||
|
default: 120
|
||||||
|
selector:
|
||||||
|
number:
|
||||||
|
min: 0
|
||||||
|
max: 3600
|
||||||
|
unit_of_measurement: seconds
|
||||||
|
|
||||||
|
# If motion is detected within the delay,
|
||||||
|
# we restart the script.
|
||||||
|
mode: restart
|
||||||
|
max_exceeded: silent
|
||||||
|
|
||||||
|
trigger:
|
||||||
|
platform: state
|
||||||
|
entity_id: !input motion_entity
|
||||||
|
from: "off"
|
||||||
|
to: "on"
|
||||||
|
|
||||||
|
action:
|
||||||
|
- alias: "Turn on the light"
|
||||||
|
service: light.turn_on
|
||||||
|
target: !input light_target
|
||||||
|
- alias: "Wait until there is no motion from device"
|
||||||
|
wait_for_trigger:
|
||||||
|
platform: state
|
||||||
|
entity_id: !input motion_entity
|
||||||
|
from: "on"
|
||||||
|
to: "off"
|
||||||
|
- alias: "Wait the number of seconds that has been set"
|
||||||
|
delay: !input no_motion_wait
|
||||||
|
- alias: "Turn off the light"
|
||||||
|
service: light.turn_off
|
||||||
|
target: !input light_target
|
||||||
|
|
@ -0,0 +1,47 @@
|
||||||
|
blueprint:
|
||||||
|
name: Zone Notification
|
||||||
|
description: Send a notification to a device when a person leaves a specific zone.
|
||||||
|
domain: automation
|
||||||
|
source_url: https://github.com/home-assistant/core/blob/dev/homeassistant/components/automation/blueprints/notify_leaving_zone.yaml
|
||||||
|
author: Home Assistant
|
||||||
|
input:
|
||||||
|
person_entity:
|
||||||
|
name: Person
|
||||||
|
selector:
|
||||||
|
entity:
|
||||||
|
domain: person
|
||||||
|
zone_entity:
|
||||||
|
name: Zone
|
||||||
|
selector:
|
||||||
|
entity:
|
||||||
|
domain: zone
|
||||||
|
notify_device:
|
||||||
|
name: Device to notify
|
||||||
|
description: Device needs to run the official Home Assistant app to receive notifications.
|
||||||
|
selector:
|
||||||
|
device:
|
||||||
|
integration: mobile_app
|
||||||
|
|
||||||
|
trigger:
|
||||||
|
platform: state
|
||||||
|
entity_id: !input person_entity
|
||||||
|
|
||||||
|
variables:
|
||||||
|
zone_entity: !input zone_entity
|
||||||
|
# This is the state of the person when it's in this zone.
|
||||||
|
zone_state: "{{ states[zone_entity].name }}"
|
||||||
|
person_entity: !input person_entity
|
||||||
|
person_name: "{{ states[person_entity].name }}"
|
||||||
|
|
||||||
|
condition:
|
||||||
|
condition: template
|
||||||
|
# The first case handles leaving the Home zone which has a special state when zoning called 'home'.
|
||||||
|
# The second case handles leaving all other zones.
|
||||||
|
value_template: "{{ zone_entity == 'zone.home' and trigger.from_state.state == 'home' and trigger.to_state.state != 'home' or trigger.from_state.state == zone_state and trigger.to_state.state != zone_state }}"
|
||||||
|
|
||||||
|
action:
|
||||||
|
- alias: "Notify that a person has left the zone"
|
||||||
|
domain: mobile_app
|
||||||
|
type: notify
|
||||||
|
device_id: !input notify_device
|
||||||
|
message: "{{ person_name }} has left {{ zone_state }}"
|
||||||
|
|
@ -0,0 +1,85 @@
|
||||||
|
blueprint:
|
||||||
|
name: Confirmable Notification
|
||||||
|
description: >-
|
||||||
|
A script that sends an actionable notification with a confirmation before
|
||||||
|
running the specified action.
|
||||||
|
domain: script
|
||||||
|
source_url: https://github.com/home-assistant/core/blob/master/homeassistant/components/script/blueprints/confirmable_notification.yaml
|
||||||
|
author: Home Assistant
|
||||||
|
input:
|
||||||
|
notify_device:
|
||||||
|
name: Device to notify
|
||||||
|
description: Device needs to run the official Home Assistant app to receive notifications.
|
||||||
|
selector:
|
||||||
|
device:
|
||||||
|
integration: mobile_app
|
||||||
|
title:
|
||||||
|
name: "Title"
|
||||||
|
description: "The title of the button shown in the notification."
|
||||||
|
default: ""
|
||||||
|
selector:
|
||||||
|
text:
|
||||||
|
message:
|
||||||
|
name: "Message"
|
||||||
|
description: "The message body"
|
||||||
|
selector:
|
||||||
|
text:
|
||||||
|
confirm_text:
|
||||||
|
name: "Confirmation Text"
|
||||||
|
description: "Text to show on the confirmation button"
|
||||||
|
default: "Confirm"
|
||||||
|
selector:
|
||||||
|
text:
|
||||||
|
confirm_action:
|
||||||
|
name: "Confirmation Action"
|
||||||
|
description: "Action to run when notification is confirmed"
|
||||||
|
default: []
|
||||||
|
selector:
|
||||||
|
action:
|
||||||
|
dismiss_text:
|
||||||
|
name: "Dismiss Text"
|
||||||
|
description: "Text to show on the dismiss button"
|
||||||
|
default: "Dismiss"
|
||||||
|
selector:
|
||||||
|
text:
|
||||||
|
dismiss_action:
|
||||||
|
name: "Dismiss Action"
|
||||||
|
description: "Action to run when notification is dismissed"
|
||||||
|
default: []
|
||||||
|
selector:
|
||||||
|
action:
|
||||||
|
|
||||||
|
mode: restart
|
||||||
|
|
||||||
|
sequence:
|
||||||
|
- alias: "Set up variables"
|
||||||
|
variables:
|
||||||
|
action_confirm: "{{ 'CONFIRM_' ~ context.id }}"
|
||||||
|
action_dismiss: "{{ 'DISMISS_' ~ context.id }}"
|
||||||
|
- alias: "Send notification"
|
||||||
|
domain: mobile_app
|
||||||
|
type: notify
|
||||||
|
device_id: !input notify_device
|
||||||
|
title: !input title
|
||||||
|
message: !input message
|
||||||
|
data:
|
||||||
|
actions:
|
||||||
|
- action: "{{ action_confirm }}"
|
||||||
|
title: !input confirm_text
|
||||||
|
- action: "{{ action_dismiss }}"
|
||||||
|
title: !input dismiss_text
|
||||||
|
- alias: "Awaiting response"
|
||||||
|
wait_for_trigger:
|
||||||
|
- platform: event
|
||||||
|
event_type: mobile_app_notification_action
|
||||||
|
event_data:
|
||||||
|
action: "{{ action_confirm }}"
|
||||||
|
- platform: event
|
||||||
|
event_type: mobile_app_notification_action
|
||||||
|
event_data:
|
||||||
|
action: "{{ action_dismiss }}"
|
||||||
|
- choose:
|
||||||
|
- conditions: "{{ wait.trigger.event.data.action == action_confirm }}"
|
||||||
|
sequence: !input confirm_action
|
||||||
|
- conditions: "{{ wait.trigger.event.data.action == action_dismiss }}"
|
||||||
|
sequence: !input dismiss_action
|
||||||
|
|
@ -0,0 +1,35 @@
|
||||||
|
|
||||||
|
# Loads default set of integrations. Do not remove.
|
||||||
|
default_config:
|
||||||
|
|
||||||
|
# Load frontend themes from the themes folder
|
||||||
|
frontend:
|
||||||
|
themes: !include_dir_merge_named themes
|
||||||
|
|
||||||
|
automation: !include automations.yaml
|
||||||
|
script: !include scripts.yaml
|
||||||
|
scene: !include scenes.yaml
|
||||||
|
|
||||||
|
homeassistant:
|
||||||
|
external_url: https://ha.milvert.com
|
||||||
|
auth_providers:
|
||||||
|
- type: homeassistant
|
||||||
|
- type: legacy_api_password
|
||||||
|
api_password: !secret http_password
|
||||||
|
|
||||||
|
http:
|
||||||
|
use_x_forwarded_for: true
|
||||||
|
ip_ban_enabled: false
|
||||||
|
trusted_proxies:
|
||||||
|
- 172.19.0.26
|
||||||
|
- 10.0.0.223
|
||||||
|
- 172.19.0.39
|
||||||
|
|
||||||
|
panel_iframe:
|
||||||
|
configurator:
|
||||||
|
title: Configurator
|
||||||
|
icon: mdi:wrench
|
||||||
|
url: http://10.0.0.3:3218
|
||||||
|
require_admin: true
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -0,0 +1 @@
|
||||||
|
Subproject commit 1e383bbca8eac8d3d6d50e291ba4130a3eee4ee9
|
||||||
|
|
@ -0,0 +1,5 @@
|
||||||
|
|
||||||
|
# Use this file to store secrets like usernames and passwords.
|
||||||
|
# Learn more at https://www.home-assistant.io/docs/configuration/secrets/
|
||||||
|
some_password: welcome
|
||||||
|
http_password: mGwmLFbniCZz7t8JUhGT
|
||||||
|
|
@ -0,0 +1,5 @@
|
||||||
|
{
|
||||||
|
"BASEPATH": "/hass-config",
|
||||||
|
"ENFORCE_BASEPATH": true,
|
||||||
|
"DIRSFIRST": true
|
||||||
|
}
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
## Version 2022/08/16 - Changelog: https://github.com/linuxserver/docker-baseimage-alpine-nginx/commits/master/root/defaults/nginx/nginx.conf.sample
|
## Version 2023/04/13 - Changelog: https://github.com/linuxserver/docker-baseimage-alpine-nginx/commits/master/root/defaults/nginx/nginx.conf.sample
|
||||||
|
|
||||||
### Based on alpine defaults
|
### Based on alpine defaults
|
||||||
# https://git.alpinelinux.org/aports/tree/main/nginx/nginx.conf?h=3.15-stable
|
# https://git.alpinelinux.org/aports/tree/main/nginx/nginx.conf?h=3.15-stable
|
||||||
|
|
@ -55,7 +55,7 @@ http {
|
||||||
tcp_nopush on;
|
tcp_nopush on;
|
||||||
|
|
||||||
# all ssl related config moved to ssl.conf
|
# all ssl related config moved to ssl.conf
|
||||||
include /config/nginx/ssl.conf;
|
# included in server blocks where listen 443 is defined
|
||||||
|
|
||||||
# Enable gzipping of responses.
|
# Enable gzipping of responses.
|
||||||
#gzip on;
|
#gzip on;
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
## Version 2022/10/04 - Changelog: https://github.com/linuxserver/docker-baseimage-alpine-nginx/commits/master/root/defaults/nginx/site-confs/default.conf.sample
|
## Version 2023/04/13 - Changelog: https://github.com/linuxserver/docker-baseimage-alpine-nginx/commits/master/root/defaults/nginx/site-confs/default.conf.sample
|
||||||
|
|
||||||
server {
|
server {
|
||||||
listen 80 default_server;
|
listen 80 default_server;
|
||||||
|
|
@ -9,6 +9,8 @@ server {
|
||||||
|
|
||||||
server_name _;
|
server_name _;
|
||||||
|
|
||||||
|
include /config/nginx/ssl.conf;
|
||||||
|
|
||||||
set $root /app/www/public;
|
set $root /app/www/public;
|
||||||
if (!-d /app/www/public) {
|
if (!-d /app/www/public) {
|
||||||
set $root /config/www;
|
set $root /config/www;
|
||||||
|
|
|
||||||
|
|
@ -1,8 +1,8 @@
|
||||||
## Version 2022/08/20 - Changelog: https://github.com/linuxserver/docker-baseimage-alpine-nginx/commits/master/root/defaults/nginx/ssl.conf.sample
|
## Version 2023/06/24 - Changelog: https://github.com/linuxserver/docker-baseimage-alpine-nginx/commits/master/root/defaults/nginx/ssl.conf.sample
|
||||||
|
|
||||||
### Mozilla Recommendations
|
### Mozilla Recommendations
|
||||||
# generated 2022-08-05, Mozilla Guideline v5.6, nginx 1.17.7, OpenSSL 1.1.1k, intermediate configuration
|
# generated 2023-06-25, Mozilla Guideline v5.7, nginx 1.24.0, OpenSSL 3.1.1, intermediate configuration
|
||||||
# https://ssl-config.mozilla.org/#server=nginx&version=1.17.7&config=intermediate&openssl=1.1.1k&guideline=5.6
|
# https://ssl-config.mozilla.org/#server=nginx&version=1.24.0&config=intermediate&openssl=3.1.1&guideline=5.7
|
||||||
|
|
||||||
ssl_certificate /config/keys/cert.crt;
|
ssl_certificate /config/keys/cert.crt;
|
||||||
ssl_certificate_key /config/keys/cert.key;
|
ssl_certificate_key /config/keys/cert.key;
|
||||||
|
|
@ -15,7 +15,7 @@ ssl_dhparam /config/nginx/dhparams.pem;
|
||||||
|
|
||||||
# intermediate configuration
|
# intermediate configuration
|
||||||
ssl_protocols TLSv1.2 TLSv1.3;
|
ssl_protocols TLSv1.2 TLSv1.3;
|
||||||
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;
|
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-CHACHA20-POLY1305;
|
||||||
ssl_prefer_server_ciphers off;
|
ssl_prefer_server_ciphers off;
|
||||||
|
|
||||||
# HSTS (ngx_http_headers_module is required) (63072000 seconds)
|
# HSTS (ngx_http_headers_module is required) (63072000 seconds)
|
||||||
|
|
@ -30,8 +30,8 @@ ssl_prefer_server_ciphers off;
|
||||||
|
|
||||||
# Optional additional headers
|
# Optional additional headers
|
||||||
#add_header Cache-Control "no-transform" always;
|
#add_header Cache-Control "no-transform" always;
|
||||||
#add_header Content-Security-Policy "upgrade-insecure-requests; frame-ancestors 'self'";
|
#add_header Content-Security-Policy "upgrade-insecure-requests; frame-ancestors 'self'" always;
|
||||||
#add_header Permissions-Policy "interest-cohort=()";
|
#add_header Permissions-Policy "interest-cohort=()" always;
|
||||||
#add_header Referrer-Policy "same-origin" always;
|
#add_header Referrer-Policy "same-origin" always;
|
||||||
#add_header X-Content-Type-Options "nosniff" always;
|
#add_header X-Content-Type-Options "nosniff" always;
|
||||||
#add_header X-Frame-Options "SAMEORIGIN" always;
|
#add_header X-Frame-Options "SAMEORIGIN" always;
|
||||||
|
|
|
||||||
Binary file not shown.
|
|
@ -49,7 +49,7 @@ http:
|
||||||
landet_zigbee-service:
|
landet_zigbee-service:
|
||||||
loadBalancer:
|
loadBalancer:
|
||||||
servers:
|
servers:
|
||||||
- url: "http://10.1.0.4:8082"
|
- url: "http://10.0.10.2:8082"
|
||||||
lampa-service:
|
lampa-service:
|
||||||
loadBalancer:
|
loadBalancer:
|
||||||
servers:
|
servers:
|
||||||
|
|
|
||||||
|
|
@ -1,10 +1,10 @@
|
||||||
http:
|
http:
|
||||||
routers:
|
routers:
|
||||||
landet_zigbee-router:
|
landet-router:
|
||||||
rule: "Host(`zig3.milvert.com`)"
|
rule: "Host(`landet.milvert.com`)"
|
||||||
service: landet_zigbee-service
|
service: landet-service
|
||||||
middlewares:
|
middlewares:
|
||||||
- auth
|
- chain-no-auth
|
||||||
entryPoints:
|
entryPoints:
|
||||||
- web-secure
|
- web-secure
|
||||||
tls:
|
tls:
|
||||||
|
|
@ -46,10 +46,10 @@ http:
|
||||||
priority: 1
|
priority: 1
|
||||||
|
|
||||||
services:
|
services:
|
||||||
landet_zigbee-service:
|
landet-service:
|
||||||
loadBalancer:
|
loadBalancer:
|
||||||
servers:
|
servers:
|
||||||
- url: "http://10.1.0.4:8082"
|
- url: "http://10.0.10.3:8123"
|
||||||
lampa-service:
|
lampa-service:
|
||||||
loadBalancer:
|
loadBalancer:
|
||||||
servers:
|
servers:
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
homeassistant: false
|
homeassistant: true
|
||||||
permit_join: false
|
permit_join: false
|
||||||
mqtt:
|
mqtt:
|
||||||
base_topic: zigbee2mqtt
|
base_topic: zigbee2mqtt
|
||||||
|
|
@ -73,10 +73,6 @@ devices:
|
||||||
friendly_name: '0x0017880106fc9e16'
|
friendly_name: '0x0017880106fc9e16'
|
||||||
'0x00158d0004889e4a':
|
'0x00158d0004889e4a':
|
||||||
friendly_name: sensor/inne/matrum/th003
|
friendly_name: sensor/inne/matrum/th003
|
||||||
'0x00158d0004889e47':
|
|
||||||
friendly_name: sensor/ute/garage/th004
|
|
||||||
'0x680ae2fffeb15687':
|
|
||||||
friendly_name: Garage
|
|
||||||
'0x588e81fffe14100f':
|
'0x588e81fffe14100f':
|
||||||
friendly_name: Ute_soptunna
|
friendly_name: Ute_soptunna
|
||||||
'0x0017880108c48479':
|
'0x0017880108c48479':
|
||||||
|
|
@ -93,6 +89,10 @@ devices:
|
||||||
friendly_name: sensor/inne/ada/th002
|
friendly_name: sensor/inne/ada/th002
|
||||||
'0x90fd9ffffe6e8fe2':
|
'0x90fd9ffffe6e8fe2':
|
||||||
friendly_name: arum gullampa
|
friendly_name: arum gullampa
|
||||||
|
'0x847127fffebe9e0d':
|
||||||
|
friendly_name: '0x847127fffebe9e0d'
|
||||||
|
'0x5c0272fffe8ab0ce':
|
||||||
|
friendly_name: Garage_inne_tak
|
||||||
groups:
|
groups:
|
||||||
'1':
|
'1':
|
||||||
friendly_name: Kök_ct
|
friendly_name: Kök_ct
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
homeassistant: false
|
homeassistant: true
|
||||||
permit_join: false
|
permit_join: false
|
||||||
mqtt:
|
mqtt:
|
||||||
base_topic: zigbee_home_2
|
base_topic: zigbee_home_2
|
||||||
|
|
@ -133,7 +133,23 @@ devices:
|
||||||
'0x040d84fffe8b00b0':
|
'0x040d84fffe8b00b0':
|
||||||
friendly_name: matrum_fönster_2
|
friendly_name: matrum_fönster_2
|
||||||
'0x847127fffebe9e0d':
|
'0x847127fffebe9e0d':
|
||||||
friendly_name: '0x847127fffebe9e0d'
|
friendly_name: sensor/ute/uppfart/m003
|
||||||
|
'0x00124b002a51bd18':
|
||||||
|
friendly_name: sensor/inne/badrum_nere/th013
|
||||||
|
'0x00124b002a51c5f1':
|
||||||
|
friendly_name: sensor/inne/uppe_vrum/th014
|
||||||
|
'0xa4c138a7ea206c89':
|
||||||
|
friendly_name: Garage_spot
|
||||||
|
'0x00158d00076ab301':
|
||||||
|
friendly_name: sensor/inne/ada/dt004
|
||||||
|
'0x00158d00076ab041':
|
||||||
|
friendly_name: sensor/inne/oscar/dt005
|
||||||
|
'0x00158d00075bdae2':
|
||||||
|
friendly_name: sensor/inne/uppe_vrum/dt006
|
||||||
|
'0x9035eafffefd9103':
|
||||||
|
friendly_name: Ute_woox
|
||||||
|
'0x00158d0004889e47':
|
||||||
|
friendly_name: sensor/ute/garage/th004
|
||||||
groups:
|
groups:
|
||||||
'0':
|
'0':
|
||||||
friendly_name: default_0
|
friendly_name: default_0
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue