💡 Warum ist EVCC 2025 ein Gamechanger?

EVCC ist eine der beliebtesten Lösungen fĂŒr das intelligente Laden von Elektroautos mit PV-Überschuss. Die neue Version bringt einige tiefgreifende Änderungen mit sich, die sowohl die Basisinstallation als auch die Konfiguration betreffen.

Einige Highlights der neuen Version:

✅ Überarbeitete Konfigurationsstruktur
✅ Verbesserte Integration in Home Assistant
✅ Erweiterte UnterstĂŒtzung fĂŒr verschiedene Wechselrichter und Stromtarife
✅ Neue Funktionen fĂŒr mehrphasiges Laden & Batteriespeicher

Egal, ob du bereits EVCC nutzt oder gerade erst startest – diese Änderungen solltest du kennen!

đŸ› ïž EVCC in Home Assistant 2025 installieren

Die Installation von EVCC unter Home Assistant ist einfacher geworden, erfordert aber einige Anpassungen. Hier sind die wichtigsten Schritte:

Basisinstallation und erste Konfiguration

Nach der Installation sind einige grundlegende Konfigurationsschritte erforderlich:

đŸ”č MQTT einrichten ( nicht zwingend notwendig )
đŸ”č Ladepunkt hinzufĂŒgen und mit dem EVCC-System verbinden
đŸ”č PV-Anlage & Batteriespeicher konfigurieren
đŸ”č Dynamische Stromtarife einbinden

Migration von einer bestehenden Installation

Falls du EVCC bereits nutzt, solltest du einige Punkte beachten:

⚡ Backup der aktuellen Konfiguration
⚡ ÜberprĂŒfung der YAML-Struktur (einige Parameter haben sich geĂ€ndert)
⚡ Anpassung an die neuen Konfigurationsmöglichkeiten

In meinem Video zeige ich dir Schritt fĂŒr Schritt, wie du EVCC installierst und die wichtigsten Änderungen ĂŒbernimmst.

🚀 Fazit: Lohnt sich das Update?

Definitiv! Die neuen Funktionen machen EVCC noch leistungsfĂ€higer und die Integration in Home Assistant wurde weiter verbessert. Besonders die neuen Einstellungen fĂŒr Stromtarife, PV-Prognosen und Batteriespeicher bringen das Smart Charging auf das nĂ€chste Level.

Wenn du bereits EVCC nutzt, solltest du dich mit den Änderungen vertraut machen – und falls du gerade erst startest, ist jetzt der perfekte Zeitpunkt, um EVCC in dein Smart Home zu integrieren!

🔋 Besuche die EVCC Homepage

EVCC Add-on ĂŒber HACS in Home Assistant installieren

EVCC kann ĂŒber das Home Assistant Community Store (HACS) Add-on integriert werden. Die aktuellste Version findest du hier:
👉 EVCC HACS Add-on auf GitHub

Damit bekommst du Zugriff und Steuerungsmöglichkeiten auf EVCC EntitÀten in Home Assistant. Beachte dabei meine Installationsanleitung.

YouTube player

Paperless NGX komplett einrichten – mit REST API Home Assistant Sensor

👉 Direkt auf YouTube schauen und abonnieren:
Smart Home & More auf YouTube

In diesem Video zeige ich euch, wie ihr unter Proxmox ( LXC oder VM), oder einem separaten PC Paperless NGX einrichtet. Da es recht viele Dinge dabei zu berĂŒcksichtigen gibt, habe ich euch dafĂŒr 3 Skripte erstellt.

  1. Installation
  2. Backup
  3. Restore

Mit diesen Skripten wird euch fast die gesamte Arbeit abgenommen.

Möchtest du Paperless ngx als Home Assistant Addon installieren, findest du hier eine Anleitung dazu:
https://youtu.be/wCiSkHQtYEE

Wichtiger Hinweis ! Bitte unbedingt beachten!

Ich habe die Freigabenamen umbenannt. Im Video bin ich darauf nochmal kurz eingegangen. Die Freigaben heißen nun:

consume

backup

restore

D.h. , wenn unter Windows die Freigaben gemountet werden, mĂŒssen diese Freigabenamen verwendet werden !

Skript install_paperless.sh

Hinweis: Die Skripte wurden auf Postgres 17, Redis 8 und Gotenberg „latest“ aktualisiert ( 12.11.2025)

#!/bin/bash
set -euo pipefail

# ---------------------------------------
# Helpers
# ---------------------------------------
log()  { echo -e "\033[1;32m[INFO]\033[0m $*"; }
warn() { echo -e "\033[1;33m[WARN]\033[0m $*"; }
err()  { echo -e "\033[1;31m[ERR ]\033[0m $*"; }

# ---------------------------------------
# Passwörter & Admin
# ---------------------------------------
prompt_for_password() {
  local password password_confirm
  if [[ "$1" == "PAPERLESS_PASSWORD" ]]; then
    echo -e "\n💡 Hinweis: Dieses Passwort wird fĂŒr den Linux-Benutzer 'paperless' und den Samba-Server verwendet."
    echo -e "Es wird fĂŒr den Zugriff auf freigegebene Samba-Ordner benötigt.\n"
  fi
  while true; do
    echo -e "\n🔒 Bitte geben Sie das Passwort fĂŒr **$1** ein:"
    read -s password
    echo -e "\n🔒 Bitte bestĂ€tigen Sie das Passwort:"
    read -s password_confirm
    if [[ "$password" == "$password_confirm" ]]; then
      echo -e "\n✅ Passwort erfolgreich gesetzt fĂŒr **$1**.\n"
      eval "$2='$password'"
      break
    else
      echo -e "\n❌ Die Passwörter stimmen nicht ĂŒberein. Bitte erneut eingeben.\n"
    fi
  done
}

prompt_for_admin_user() {
  echo -e "\nđŸ‘€ Bitte geben Sie den **Admin-Benutzernamen** ein (Standard: paperless):"
  read -r admin_user_input
  ADMIN_USER="${admin_user_input:-paperless}"
  echo -e "\n✅ Admin-Benutzer wurde auf **'$ADMIN_USER'** gesetzt.\n"
}

# Eingaben
prompt_for_password "PAPERLESS_PASSWORD" PAPERLESS_PASSWORD
prompt_for_admin_user
prompt_for_password "ADMIN_PASSWORD" ADMIN_PASSWORD

SAMBA_PASSWORD="$PAPERLESS_PASSWORD"
DB_PASSWORD="paperless"

# ---------------------------------------
# Pakete & Docker-Repo
# ---------------------------------------
update_and_install_dependencies() {
  log "Aktualisiere Paketliste und installiere benötigte Pakete
"
  sudo apt update
  sudo apt install -y apt-transport-https curl jq gnupg openssh-server \
                      samba samba-common-bin ca-certificates lsb-release
}

add_docker_repo() {
  log "FĂŒge Docker GPG-SchlĂŒssel und Repository hinzu
"
  sudo mkdir -p /etc/apt/keyrings
  if [[ ! -f /etc/apt/keyrings/docker.gpg ]]; then
    curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
    sudo chmod a+r /etc/apt/keyrings/docker.gpg
  fi
  . /etc/os-release
  DOCKER_REPO="deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu $VERSION_CODENAME stable"
  echo "$DOCKER_REPO" | sudo tee /etc/apt/sources.list.d/docker.list >/dev/null
  sudo apt update
}

# ---------------------------------------
# User/Gruppe
# ---------------------------------------
ensure_paperless_user_and_group() {
  if ! getent group paperless &>/dev/null; then
    log "Erstelle Gruppe 'paperless' mit GID 1002
"
    sudo groupadd -g 1002 paperless
  fi
  if ! id -u paperless &>/dev/null; then
    log "Erstelle Benutzer 'paperless' (UID 1002, GID 1002)
"
    sudo useradd -m -s /bin/bash -u 1002 -g paperless paperless
    echo "paperless:$PAPERLESS_PASSWORD" | sudo chpasswd
  fi
}

# ---------------------------------------
# Docker installieren
# ---------------------------------------
install_docker() {
  if ! command -v docker &>/dev/null; then
    log "Installiere Docker
"
    sudo apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
    sudo systemctl enable --now docker
  fi
  if ! groups paperless | grep -q "\bdocker\b"; then
    log "FĂŒge Benutzer 'paperless' zur Gruppe 'docker' hinzu
"
    sudo usermod -aG docker paperless
  fi
}

# ---------------------------------------
# AppArmor/runc-Bug NUR bei Bedarf mitigieren
# ---------------------------------------
mitigate_if_apparmor_bug() {
  . /etc/os-release
  if [[ "${ID:-}" != "ubuntu" ]]; then
    log "Nicht Ubuntu – ĂŒberspringe AppArmor/runc-Erkennung."
    return 0
  fi
  if ! command -v docker >/dev/null 2>&1; then
    warn "Docker noch nicht installiert – Erkennung wird spĂ€ter erneut versucht."
    return 0
  fi

  sudo systemctl enable --now docker >/dev/null 2>&1 || true
  docker pull hello-world >/dev/null 2>&1 || true
  docker pull busybox:latest >/dev/null 2>&1 || true

  local TEST_OUT=0 OUTPUT
  if ! OUTPUT="$(docker run --rm --pull=never hello-world 2>&1)"; then
    TEST_OUT=1
  fi
  if [[ $TEST_OUT -ne 0 ]]; then
    if ! OUTPUT="$(docker run --rm --pull=never busybox:latest true 2>&1)"; then
      TEST_OUT=2
    else
      TEST_OUT=0
    fi
  fi

  if [[ $TEST_OUT -ne 0 ]] && echo "$OUTPUT" | grep -q 'net\.ipv4\.ip_unprivileged_port_start.*permission denied'; then
    warn "Erkannt: AppArmor/runc-Problem beim Container-Start."
    if ! dpkg -s containerd.io >/dev/null 2>&1; then
      warn "containerd.io nicht installiert (vermutlich Ubuntu-Containerd). Downgrade wird ĂŒbersprungen."
      return 0
    fi
    local TARGET_VERSIONS=()
    case "$VERSION_CODENAME" in
      plucky) TARGET_VERSIONS=("1.7.28-1~ubuntu.25.04~plucky" "1.7.27-1") ;;
      noble)  TARGET_VERSIONS=("1.7.28-1~ubuntu.24.04~noble"  "1.7.27-1") ;;
      jammy)  TARGET_VERSIONS=("1.7.28-1~ubuntu.22.04~jammy"  "1.7.27-1") ;;
      *)      TARGET_VERSIONS=("1.7.27-1") ;;
    esac
    local CURR; CURR="$(dpkg-query -W -f='${Version}\n' containerd.io || true)"
    for v in "${TARGET_VERSIONS[@]}"; do
      if [[ "$CURR" == "$v" ]]; then
        log "containerd.io bereits auf gewĂŒnschter Version ($v). Setze Hold."
        sudo apt-mark hold containerd.io || true
        return 0
      fi
    done
    local AVAILABLE SELECTED
    AVAILABLE="$(apt-cache madison containerd.io | awk '{print $3}')"
    SELECTED=""
    for v in "${TARGET_VERSIONS[@]}"; do
      if echo "$AVAILABLE" | grep -qx "$v"; then SELECTED="$v"; break; fi
    done
    if [[ -z "$SELECTED" ]]; then
      warn "Keine passende containerd.io-Version im Repo gefunden – Mitigation ĂŒbersprungen."
      return 0
    fi
    log "Mitigation: Downgrade/Pin containerd.io → $SELECTED"
    sudo apt-mark unhold containerd.io || true
    sudo apt-get install -y --allow-downgrades "containerd.io=${SELECTED}"
    sudo apt-mark hold containerd.io
    sudo systemctl restart containerd docker
  else
    log "Kein AppArmor/runc-Problem erkannt – keine Mitigation nötig."
  fi
}

# ---------------------------------------
# Samba
# ---------------------------------------
configure_samba() {
  sudo cp /etc/samba/smb.conf /etc/samba/smb.conf.bak || true
  sudo mkdir -p /data/paperless/{backup,restore,consume,data,media,export,postgresql/_data,redis/_data}
  sudo chown -R paperless:paperless /data/paperless/
  sudo chmod -R 770 /data/paperless/

  if ! grep -q "^\[consume\]" /etc/samba/smb.conf; then
    sudo tee -a /etc/samba/smb.conf >/dev/null <<'EOF'

[consume]
   comment = Paperless Daten
   path = /data/paperless/consume
   browsable = yes
   writable = yes
   guest ok = no
   create mask = 0770
   directory mask = 0770
   valid users = paperless
EOF
  fi

  if ! grep -q "^\[backup\]" /etc/samba/smb.conf; then
    sudo tee -a /etc/samba/smb.conf >/dev/null <<'EOF'

[backup]
   comment = Paperless Backup Daten
   path = /data/paperless/backup
   browsable = yes
   writable = yes
   guest ok = no
   create mask = 0770
   directory mask = 0770
   valid users = paperless
EOF
  fi

  if ! grep -q "^\[restore\]" /etc/samba/smb.conf; then
    sudo tee -a /etc/samba/smb.conf >/dev/null <<'EOF'

[restore]
   comment = Paperless Restore Daten
   path = /data/paperless/restore
   browsable = yes
   writable = yes
   guest ok = no
   create mask = 0770
   directory mask = 0770
   valid users = paperless
EOF
  fi

  (echo "$SAMBA_PASSWORD"; echo "$SAMBA_PASSWORD") | sudo smbpasswd -a paperless -s
  sudo systemctl restart smbd
  log "Samba Shares [consume], [backup], [restore] wurden konfiguriert."
}

# ---------------------------------------
# Compose schreiben
# ---------------------------------------
write_compose() {
  log "Erstelle docker-compose.yml
"
  sudo mkdir -p /home/paperless
  sudo chown paperless:paperless /home/paperless

  cat <<EOL | sudo tee /home/paperless/docker-compose.yml >/dev/null
services:
  broker:
    image: redis:7
    container_name: broker
    restart: unless-stopped
    volumes:
      - /data/paperless/redis/_data:/data

  db:
    image: postgres:17
    container_name: db
    restart: unless-stopped
    volumes:
      - /data/paperless/postgresql/_data:/var/lib/postgresql/data
    environment:
      POSTGRES_DB: paperless
      POSTGRES_USER: paperless
      POSTGRES_PASSWORD: $DB_PASSWORD

  gotenberg:
    image: gotenberg/gotenberg:latest
    container_name: paperless-gotenberg-1
    restart: unless-stopped
    command:
      - "gotenberg"
      - "--chromium-disable-javascript=false"
      - "--chromium-allow-list=.*"

  tika:
    image: apache/tika:latest
    container_name: tika
    restart: unless-stopped

  webserver:
    image: ghcr.io/paperless-ngx/paperless-ngx:latest
    container_name: webserver
    restart: unless-stopped
    depends_on:
      - db
      - broker
      - gotenberg
      - tika
    ports:
      - "8001:8000"
    volumes:
      - /data/paperless/consume:/usr/src/paperless/consume
      - /data/paperless/data:/usr/src/paperless/data
      - /data/paperless/media:/usr/src/paperless/media
      - /data/paperless/export:/usr/src/paperless/export
    environment:
      PAPERLESS_ADMIN_USER: $ADMIN_USER
      PAPERLESS_ADMIN_PASSWORD: $ADMIN_PASSWORD
      PAPERLESS_REDIS: redis://broker:6379
      PAPERLESS_DBHOST: db
      PAPERLESS_TIKA_ENABLED: 1
      PAPERLESS_TIKA_GOTENBERG_ENDPOINT: http://gotenberg:3000
      PAPERLESS_TIKA_ENDPOINT: http://tika:9998
      PAPERLESS_OCR_LANGUAGE: deu
      PAPERLESS_TIME_ZONE: Europe/Berlin
      PAPERLESS_CONSUMER_ENABLE_BARCODES: "true"
      PAPERLESS_CONSUMER_ENABLE_ASN_BARCODE: "true"
      PAPERLESS_CONSUMER_BARCODE_SCANNER: ZXING
      PAPERLESS_EMAIL_TASK_CRON: '*/10 * * * *'
      USERMAP_UID: "1002"
      USERMAP_GID: "1002"
      PAPERLESS_DBSSLMODE: disable
EOL
}

# ---------------------------------------
# DB starten, pg_hba absichern, dann Rest starten
# ---------------------------------------
bringup_with_pg_hba_fix() {
  pushd /home/paperless >/dev/null

  log "Starte zunÀchst NUR Redis & Postgres
"
  sudo -u paperless docker compose up -d broker db

  # Auf DB warten
  log "Warte, bis Postgres erreichbar ist
"
  for i in {1..60}; do
    if sudo docker exec db pg_isready -q >/dev/null 2>&1; then
      break
    fi
    sleep 2
  done

  # Subnetz der Compose-Network ermitteln
  local NET="paperless_default"
  local SUBNET
  SUBNET="$(docker network inspect "$NET" 2>/dev/null | jq -r '.[0].IPAM.Config[0].Subnet' || true)"
  if [[ -z "${SUBNET:-}" || "${SUBNET}" == "null" ]]; then
    # Fallback: hÀufig 172.18.0.0/16
    SUBNET="172.18.0.0/16"
    warn "Konnte Subnetz nicht auslesen – nutze Fallback ${SUBNET}"
  else
    log "Ermitteltes Docker-Subnetz: ${SUBNET}"
  fi

  # pg_hba.conf patchen, falls Eintrag fehlt
  log "Sichere pg_hba.conf gegen 'no pg_hba.conf entry 
 no encryption' ab
"
  sudo docker exec db bash -lc "grep -q '${SUBNET} ' /var/lib/postgresql/data/pg_hba.conf || echo 'host all all ${SUBNET} scram-sha-256' >> /var/lib/postgresql/data/pg_hba.conf"

  # Postgres reload (ohne DB-Login)
  sudo docker exec db bash -lc 'kill -HUP 1'

  # Kurzer Probe-Connect (ohne SSL)
  export PGPASSWORD="$DB_PASSWORD"
  if ! sudo docker exec -e PGPASSWORD="$DB_PASSWORD" db psql -U paperless -d paperless -c 'SELECT 1;' >/dev/null 2>&1; then
    warn "Probe-Query fehlgeschlagen – fahre trotzdem fort (Paperless migriert beim Start)."
  else
    log "Probe-Query erfolgreich."
  fi
  unset PGPASSWORD

  log "Starte nun gotenberg, tika und webserver
"
  sudo -u paperless docker compose up -d gotenberg tika webserver
  popd >/dev/null
}

# ---------------------------------------
# MAIN
# ---------------------------------------
update_and_install_dependencies
add_docker_repo
ensure_paperless_user_and_group
install_docker
mitigate_if_apparmor_bug
configure_samba
write_compose
bringup_with_pg_hba_fix

sleep 2
sudo chown -R paperless:paperless /data/paperless

LOCAL_IP=$(hostname -I | awk '{print $1}')
echo -e "\n🚀 **Paperless ist jetzt bereit!**"
echo -e "🔗 **Zugriff im Browser:** http://$LOCAL_IP:8001\n"
echo -e "🔁 **Bitte einmal neu booten, falls Docker neu installiert wurde.**"

Um die Scripte unter Linux vom Webserver zu laden, kannst du auch folgenden Befehl verwenden.

wget https://smarthomeundmore.de/wp-content/uploads/install_paperless.sh
wget https://smarthomeundmore.de/wp-content/uploads/backup.sh
wget https://smarthomeundmore.de/wp-content/uploads/restore.sh

Danach mĂŒssen sie mit:

chmod +x install_paperless.sh
chmod +x backup.sh
chmod +x restore.sh

ausfĂŒhrbar gemacht werden.

Script backup.sh

#!/bin/bash
# Skript: backup.sh
# Dieses Skript fĂŒhrt ein Backup ĂŒber docker-compose aus und verschiebt anschließend die Backup-Datei(en).

echo "Starte Backup: Ein Backup wird jetzt durchgefĂŒhrt..."

# Wechsel in das Verzeichnis, in dem sich die docker-compose Datei befindet
cd /home/paperless || { echo "Fehler: Verzeichnis /home/paperless nicht gefunden."; exit 1; }

# FĂŒhre den docker-compose Befehl aus
sudo docker compose exec webserver document_exporter ../export -z

# PrĂŒfe, ob der Befehl erfolgreich war
if [ $? -eq 0 ]; then
  echo "Backup erfolgreich abgeschlossen."
  
  # PrĂŒfen, ob das Quellverzeichnis existiert
  if [ -d "/data/paperless/export" ]; then
    # Sicherstellen, dass das Zielverzeichnis existiert (falls nicht, wird es angelegt)
    mkdir -p /data/paperless/backup

    # PrĂŒfen, ob im Quellverzeichnis Dateien vorhanden sind
    if compgen -G "/data/paperless/export/*" > /dev/null; then
      echo "Verschiebe Backup-Datei(en) nach /data/paperless/backup..."
      mv /data/paperless/export/* /data/paperless/backup/
      
      if [ $? -eq 0 ]; then
        echo "Datei(en) erfolgreich verschoben."
      else
        echo "Fehler beim Verschieben der Datei(en)."
      fi
    else
      echo "Keine Datei(en) im Verzeichnis /data/paperless/export gefunden."
    fi
  else
    echo "Quellverzeichnis /data/paperless/export existiert nicht."
  fi
else
  echo "Fehler beim Backup."
fi


Script restore.sh

#!/bin/bash
# Skript: restore.sh
# Dieses Skript stellt ein Backup wieder her.

set -e

echo "Starte Wiederherstellung: Das Backup wird nun wiederhergestellt..."

DOCKER_COMPOSE_FILE="/home/paperless/docker-compose.yml"

# Funktion zum Auskommentieren der Umgebungsvariablen in docker-compose.yml
comment_out_env_vars() {
  echo "Kommentiere PAPERLESS_ADMIN_USER und PAPERLESS_ADMIN_PASSWORD in der docker-compose.yml aus..."

  # Erstelle ein Backup der Datei, falls noch nicht gesichert
  if [ ! -f "${DOCKER_COMPOSE_FILE}.bak" ]; then
    sudo cp "$DOCKER_COMPOSE_FILE" "${DOCKER_COMPOSE_FILE}.bak"
  fi

  # Setze sicherheitshalber Schreibrechte
  sudo chmod u+w "$DOCKER_COMPOSE_FILE"

  # FĂŒge das `#` nur hinzu, falls es noch nicht vorhanden ist
  sudo sed -i 's/^\( *PAPERLESS_ADMIN_USER: \)/#\1/' "$DOCKER_COMPOSE_FILE"
  sudo sed -i 's/^\( *PAPERLESS_ADMIN_PASSWORD: \)/#\1/' "$DOCKER_COMPOSE_FILE"

  echo "Variablen erfolgreich auskommentiert."
}

# Variablen auskommentieren, bevor das Skript weiterlÀuft
comment_out_env_vars

# Verzeichnisse definieren
BACKUP_DIR="/data/paperless/restore"
EXPORT_DIR="/data/paperless/export"
DIRECTORIES_TO_DELETE=(
  "/data/paperless/consume"
  "/data/paperless/export"
  "/data/paperless/media"
  "/data/paperless/postgresql"
  "/data/paperless/redis"
)

# PrĂŒfe, ob das Backup-Verzeichnis existiert
if [ ! -d "$BACKUP_DIR" ]; then
  echo "Fehler: Backup-Verzeichnis $BACKUP_DIR existiert nicht."
  exit 1
fi

# Schritt 1: Docker Compose herunterfahren
echo "Wechsle in /home/paperless und fahre Docker Compose herunter..."
cd /home/paperless || { echo "Fehler: Verzeichnis /home/paperless nicht gefunden."; exit 1; }
sudo docker compose down

# Schritt 2: Lösche die angegebenen Verzeichnisse
echo "Lösche die folgenden Verzeichnisse:"
for dir in "${DIRECTORIES_TO_DELETE[@]}"; do
  echo "  $dir"
  if [ -d "$dir" ]; then
    sudo rm -rf "$dir"
    echo "    -> $dir gelöscht."
  else
    echo "    -> $dir existiert nicht, ĂŒberspringe..."
  fi
done

# Schritt 3: Erstelle das Export-Verzeichnis neu
echo "Erstelle das Verzeichnis $EXPORT_DIR..."
sudo mkdir -p "$EXPORT_DIR"
if [ $? -ne 0 ]; then
  echo "Fehler: Konnte $EXPORT_DIR nicht erstellen."
  exit 1
fi

# Schritt 4: Suche nach einer Archivdatei im Backup-Verzeichnis (z. B. *.zip)
ARCHIVE_FILE=$(find "$BACKUP_DIR" -maxdepth 1 -type f -name "*.zip" | head -n 1)
if [ -z "$ARCHIVE_FILE" ]; then
  echo "Fehler: Keine Archivdatei (*.zip) im Backup-Verzeichnis gefunden."
  exit 1
fi
echo "Gefundene Archivdatei: $ARCHIVE_FILE"

# Schritt 5: Kopiere die Archivdatei in das Export-Verzeichnis
echo "Kopiere die Archivdatei nach $EXPORT_DIR..."
sudo cp "$ARCHIVE_FILE" "$EXPORT_DIR"
if [ $? -ne 0 ]; then
  echo "Fehler beim Kopieren der Archivdatei."
  exit 1
fi

# Schritt 6: Wechsel in das Export-Verzeichnis und entpacke die Archivdatei
cd "$EXPORT_DIR" || { echo "Fehler: Konnte nicht in $EXPORT_DIR wechseln."; exit 1; }

# ÜberprĂŒfe, ob 'unzip' installiert ist und installiere es gegebenenfalls
if ! command -v unzip >/dev/null 2>&1; then
  echo "Das Paket 'unzip' ist nicht installiert. Versuche, es zu installieren..."
  if command -v apt-get >/dev/null 2>&1; then
    sudo apt-get update && sudo apt-get install -y unzip
  elif command -v yum >/dev/null 2>&1; then
    sudo yum install -y unzip
  else
    echo "Kein unterstĂŒtzter Paketmanager gefunden. Bitte installiere 'unzip' manuell."
    exit 1
  fi
fi

# Entpacken der Archivdatei
ARCHIVE_BASENAME=$(basename "$ARCHIVE_FILE")
echo "Entpacke $ARCHIVE_BASENAME..."
unzip "$ARCHIVE_BASENAME"
if [ $? -ne 0 ]; then
  echo "Fehler beim Entpacken von $ARCHIVE_BASENAME."
  exit 1
fi
echo "Archiv erfolgreich entpackt."

# Optional: Entferne die kopierte Archivdatei, falls sie nicht mehr benötigt wird
# sudo rm "$ARCHIVE_BASENAME"

# Schritt 7: Starte Docker Compose Container neu
echo "Wechsle zurĂŒck nach /home/paperless und starte die Container..."
cd /home/paperless || { echo "Fehler: Verzeichnis /home/paperless nicht gefunden."; exit 1; }
sudo -u paperless docker compose up -d
if [ $? -ne 0 ]; then
  echo "Fehler: Docker Compose konnte nicht gestartet werden."
  exit 1
fi

sudo chown -R paperless:paperless /data/paperless/consume /data/paperless/media
sudo chmod -R 775 /data/paperless/consume /data/paperless/media
sudo chown paperless:paperless /home/paperless/docker-compose.yml


sleep 60

cd /home/paperless
# Schritt 8: FĂŒhre den Importbefehl aus
echo "FĂŒhre Importbefehl aus..."
sudo docker compose exec webserver document_importer ../export
sudo chown -R paperless:paperless /data/paperless 
if [ $? -eq 0 ]; then
  echo "Import erfolgreich abgeschlossen."
else
  echo "Fehler beim Import."
  exit 1
fi
echo " Bitte einmal das System neu booten ! "
echo "---------------------------ENDE--------------------------------"

Upgrade Postgres 16 zu Postgres 17 ( bei vorhandener Installation )

ACHTUNG: Bitte zuvor unbedingt ein Backup der virtuellen Maschine oder des LXC Containers machen !

ZunÀchst begebt euch im Container oder der VM in das Verzeichnis /home/paperless. Dort findet ihr eine Datei docker-compose.yml.

Als ersten Schritt mĂŒssen wir nun die Docker Container beenden.

docker compose down

mit nano docker-compose.yml kontrollieren wir die Eintragungen der Compose Datei. Dabei ist folgender Abschnitt relevant:

Hier sieht man , dass aktuell das Image postgres:16 verwendet wird. Das brauchen wir fĂŒr den Migrationsprozess in genau dieser Form. Merkt euch zudem auch den POSTGRES_USER , den brauchen wir fĂŒr den nĂ€chsten Schritt.

Mit Strg+X beenden wir den Dateieditor und begeben uns in die Konsole.
Dort geben wir nun folgenden Befehl zum starten der Datenbank ein:

docker compose up -d db

Im nÀchsten Schritt sichern wir uns nun die aktuelle Datenbank:

docker exec -t db pg_dumpall -U DATENBANKUSER > all.sql

Bei DATENBANKUSER mĂŒsst ihr den User aus eurer docker-compose.yml eintragen. Im Beispiel ist es der User paperless.

Nachdem die Sicherung erfolgt ist, beenden wir erneut die Container:

docker compose down

Jetzt können wir erneut mit:

nano docker-compose.yml

unser Compose File editieren.

Jetzt mĂŒssen folgende Eintragungen angepasst werden:

Wir Ă€ndern also image: postgres:16 in image: postgres:17 und die Zeile volumes: …../_data in …./datav17

Danach starten wir erneut den Datenbank Container mit

docker compose up -d db

Jetzt mĂŒssen wir unsere Sicherung der Datenbank und die neu initialisierte Datenbank zurĂŒckkopieren.

Das können wir mit

cat all.sql | docker exec -i db psql -U DATENBANKUSER

machen. Dabei ist DATENBANKUSER wieder unser POSTGRES Datenbank Benutzer. In unserem Beispiel paperless.

Wenn der Import Vorgang nun ohne Fehler durchgelaufen ist, können wir mit

docker compose down
docker compose up -d

alle Container wieder starten.

Redis und Gotenberg Update

Um Redis und Gotenberg auf eine neue Version zu updaten sind auch wieder Anpassungen in der docker-compose.yml nötig.

Dazu mĂŒssen zunĂ€chst die Container gestoppt werden.

docker compose down

Danach editieren wir erneut die docker-compose.yml mit

nano docker-compose.yml

und Àndern folgende Zeilen:

Hier tragt die gewĂŒnschte Redis Version ein. In meinem Beispiel habe ich von Version 7 auf 8 gewechselt.

FĂŒr Gotenberg gehen wir Ă€hnlich vor. Hier habe ich mich entschieden, die „latest“ Variante zu verwenden.

Nach den Änderungen , beendet den Editor mit Strg+X und speichert mit „Yes“ die Datei.

Jetzt mĂŒssen wir noch die Container aktualisieren.

docker compose pull

und erneut starten.

docker compose up -d

Jetzt sollten alle Container in der aktuellen eingetragenen Version zur VerfĂŒgung stehen.

Update 23.09.2025 – Paperless-ngx: 1:1-Backup & Restore (Docker/Proxmox/LXC)

Überblick

Diese ErgĂ€nzung zeigt eine einfache, robuste 1:1-Sicherung und Wiederherstellung einer Paperless-ngx-Instanz – ohne export/import und ohne Manifest-Probleme. Geeignet fĂŒr UmzĂŒge auf eine neue LXC/VM und fĂŒr regelmĂ€ĂŸige Vollbackups.

Vorteile:

  • VollstĂ€ndiges Abbild von /data/paperless (Dokumente, Postgres, Redis, Konfiguration)
  • VersionsunabhĂ€ngig (kein Versions-Matching beim Import nötig)
  • Schnelle Wiederherstellung des exakten Zustands

Wichtig: Nach dem Restore sind die alten Benutzer & Passwörter der Quellinstanz wieder aktiv – auch wenn beim Neuaufsetzen andere Zugangsdaten vergeben wurden.


Voraussetzungen

  • Paperless-ngx lĂ€uft via Docker Compose.
  • Datenpfad: /data/paperless, Compose-Projekt: /home/paperless.
  • Auf der Zielinstanz wurde Paperless vorab mit dem bekannten Install-Skript bereitgestellt (Container/Volumes/ENV).

A) Backup auf der Quellinstanz erstellen

1) In das Arbeitsverzeichnis wechseln

cd /root

2) Backup-Skript laden und ausfĂŒhrbar machen

wget https://smarthomeundmore.de/wp-content/uploads/backup_new.sh
chmod +x backup_new.sh

3) Backup starten

./backup_new.sh

Ablauf:

  • Paperless-Container werden gestoppt.
  • Ein komprimiertes Archiv wird erstellt und in /data/paperless/backup abgelegt.
  • Container werden automatisch neu gestartet.

4) Backup ĂŒbertragen

Das erzeugte Archiv (z. B. paperless-backup-YYYY-MM-DD_HH-MM.tar.gz) auf die Zielinstanz kopieren (z. B. mit scp oder rsync).

B) Restore auf der Zielinstanz durchfĂŒhren

1) Zielumgebung bereitstellen

Paperless auf der Zielinstanz wie gewohnt mit dem Install-Skript einrichten (Compose/ENV).
Hinweis: Nach dem Restore gelten wieder die alten Credentials aus der gesicherten Instanz.

2) Backup-Datei platzieren

Backup nach /home/paperless kopieren.
Nicht nach /data/paperless/restore legen – das Restore-Skript löscht /data/paperless vollstĂ€ndig.

3) Restore-Skript laden und ausfĂŒhrbar machen

cd /root
wget https://smarthomeundmore.de/wp-content/uploads/restore_new.sh
chmod +x restore_new.sh

4) Restore ausfĂŒhren (mit absolutem Pfad)

./restore_new.sh /home/paperless/paperless-backup-YYYY-MM-DD_HH-MM.tar.gz

Ablauf:

  • Container werden gestoppt.
  • /data/paperless wird gelöscht.
  • Das Backup wird 1:1 mit korrekten Besitzrechten zurĂŒckgespielt (tar --same-owner --numeric-owner).
  • Container starten automatisch wieder.

ASN QR Codes generieren

Avery Zweckform QR-Code Generator von Tobias L. Meier: https://tobiasmaier.info/asn-qr-code-label-generator/

ErgÀnzung & Dank an Murat

An dieser Stelle auch ein herzliches Dankeschön an Murat, der mich nach einem meiner YouTube-Videos auf eine interessante ErgÀnzung aufmerksam gemacht hat.

Er hatte bei der Nutzung des ASN-QR-Code-Label-Generators von Tobias Maier Schwierigkeiten, die QR-Codes korrekt und passgenau zu drucken. Deshalb hat er kurzerhand ein eigenes Projekt gestartet, mit dem sich mehr Kontrolle ĂŒber den Druck realisieren lĂ€sst:

👉 ASN-QR-Code-Label-Generator von Murat auf GitHub

Vielleicht ist das auch fĂŒr dich hilfreich, wenn du Ă€hnliche Probleme beim Druck hast. Murat freut sich sicherlich ĂŒber Feedback und Tests aus der Community.

Home Assistant Rest API Sensoren

Im Video habe ich auch gezeigt, wie man einen Sensor in Home Assistant erstellt, um sich die Anzahl der Dokumente im Posteingang anzeigen zu lassen. Die Informationen dazu habe ich von FlemmingŽs Blog, wo einige Beispielsensoren zu finden sind. Tolle Arbeit und sehr gut erklÀrt.

Monitoring Paperless-ngx in Home-Assistant – Flemming’s Blog

Empfohlene Hardware fĂŒr die Digitalisierung und die QR Codes

Ein weiterer Scanner, der hÀufiger im Kontext mit paperless-ngx genannt wird, ist der Brother ADS-1700W. Da ich diesen allerdings nicht selber getestet habe, kann ich keine direkte Empfehlung dazu aussprechen.

Solltest du in den Scripten noch Fehler finden, kannst du mir gerne deine Korrekturen als Mail zukommen lassen. Meine Kontakdaten findest du im Impressum.

📌 Home Assistant Sensordaten exportieren & in Excel nutzen! 🚀

Möchtest du Sensordaten aus Home Assistant exportieren und diese in Excel oder anderen Tools weiterverarbeiten? In meinem neuesten Video zeige ich dir, wie du mit einfachen Schritten deine Daten extrahierst, speicherst und optimal aufbereitest. Dabei erhĂ€ltst du praktische Tipps, die dir helfen, deine Daten in handliche Formate zu ĂŒberfĂŒhren – ideal fĂŒr den privaten Gebrauch oder berufliche Projekte.

Lass dich von den vielfÀltigen Möglichkeiten inspirieren und erweitere deine Kenntnisse im Umgang mit Home Assistant. So wird der Datenexport zu einem spannenden und unkomplizierten Prozess!

Was dich im Video erwartet:

  • Wie du Sensordaten aus Home Assistant extrahierst 📡
  • Welche Möglichkeiten es fĂŒr den Export gibt 🔄
  • Wie du die Daten fĂŒr Excel & Co. optimierst 📊

Video:
Schau dir das Video hier an: https://youtu.be/iEUIEaDh5XU

Home Assistant: Kalender Automatisierungen gehen so einfach ! 📅 ( Einsteiger ready)

Oftmals hat man den Anwendungsfall, dass man auf ein Kalenderevent triggern möchte. Sei es, dass man sich eine đŸ“Č Benachrichtigung schicken lassen möchte, wenn ein Event ansteht, oder aber eine đŸ€– Automatisierung ausgefĂŒhrt werden soll. Ebenso interessant ist, wann welche đŸ—‘ïž MĂŒlltonne an die Straße gestellt werden muss. Desto lĂ€nger man drĂŒber nachdenkt, umso mehr AnwendungsfĂ€lle fallen einem ein. 🔧 MĂŒhsam? Nicht mit diesem Blueprint! Mit Templates und Automatisierungen in Home Assistant lĂ€sst sich das zwar umsetzen, aber heute stelle ich euch ein Blueprint vor, das euch diese Arbeit mit ein paar Klicks abnimmt. 🎁 Bonus: Ich zeige euch eine komplette Lösung fĂŒr euren MĂŒllkalender, inklusive einer Anzeige auf der Pixelclock Ulanzi TC001.

👉 FĂŒr den Ulanzi-Bonus mĂŒsst ihr als Basis dieses Video umgesetzt haben

🔗 Das Blueprint zum Video findet ihr hier

Tolle Arbeit des Entwicklers – ich war wirklich begeistert von diesem durchdachten Blueprint!

📱 Weitere Infos zu den Notification Sounds

YAML Code des Bonus Materials MĂŒll-Kalender

alias: MĂŒllkalender
description: ""
use_blueprint:
  path: Blackshome/calendar-notifications-and-actions.yaml
  input:
    calendar: calendar.smarthomeandmore
    include_calendar_trigger: disable_key_word
    start_calendar_offset:
      hours: 16
      minutes: 0
      seconds: 0
      days: -1
    include_start_notify: disable_start_notify_options
    start_notify_device:
      - d64818e1bf4a857f01f0f7589028ac75
    include_start_auto_actions:
      - enable_start_action_1
    start_action_1:
      - choose:
          - conditions:
              - condition: template
                value_template: "{{ \"Gelber Sack\" in trigger.calendar_event.summary }}"
            sequence:
              - action: input_boolean.turn_on
                metadata: {}
                data: {}
                target:
                  entity_id: input_boolean.gelber_sack
            alias: Gelber Sack
          - conditions:
              - condition: template
                value_template: "{{ \"Graue Tonne\" in trigger.calendar_event.summary }}"
            sequence:
              - action: input_boolean.turn_on
                metadata: {}
                data: {}
                target:
                  entity_id: input_boolean.graue_tonne
            alias: Graue Tonne
          - conditions:
              - condition: template
                value_template: "{{ \"GrĂŒne Tonne\" in trigger.calendar_event.summary }}"
            sequence:
              - action: input_boolean.turn_on
                metadata: {}
                data: {}
                target:
                  entity_id: input_boolean.grune_tonne
            alias: GrĂŒne Tonne
          - conditions:
              - condition: template
                value_template: "{{ \"SperrmĂŒll\" in trigger.calendar_event.summary }}"
            sequence:
              - action: input_boolean.turn_on
                metadata: {}
                data: {}
                target:
                  entity_id: input_boolean.sperrmull
            alias: SperrmĂŒll
          - conditions:
              - condition: template
                value_template: >-
                  {{ "Problemabfallsammeltermine" in
                  trigger.calendar_event.summary }}
            sequence:
              - action: input_boolean.turn_on
                metadata: {}
                data: {}
                target:
                  entity_id: input_boolean.problemabfallsammeltermine
            alias: Problemabfallsammeltermine
    include_end_notify: enable_end_notify_options
    end_notify_device:
      - d64818e1bf4a857f01f0f7589028ac75
    end_message: "{{ trigger.calendar_event.summary }} muss rausgestellt werden !"
    end_notify_interruption_level: critical
    include_end_action_buttons:
      - enable_end_action_button_1
    end_action_button_1: "{{ trigger.calendar_event.summary }} rausgestellt?"
    end_time_delay:
      hours: 20
      minutes: 0
      seconds: 0
    include_end_action_button_confirmation: enable_end_action_button_confirmation
    end_action_button_confirmation_title: MĂŒllinformation
    end_action_1:
      - choose:
          - conditions:
              - condition: template
                value_template: "{{ \"Gelber Sack\" in trigger.calendar_event.summary }}"
            sequence:
              - action: input_boolean.turn_off
                metadata: {}
                data: {}
                target:
                  entity_id: input_boolean.gelber_sack
            alias: Gelber Sack
          - conditions:
              - condition: template
                value_template: "{{ \"Graue Tonne\" in trigger.calendar_event.summary }}"
            sequence:
              - action: input_boolean.turn_off
                metadata: {}
                data: {}
                target:
                  entity_id: input_boolean.graue_tonne
            alias: Graue Tonne
          - conditions:
              - condition: template
                value_template: "{{ \"GrĂŒne Tonne\" in trigger.calendar_event.summary }}"
            sequence:
              - action: input_boolean.turn_off
                metadata: {}
                data: {}
                target:
                  entity_id: input_boolean.grune_tonne
            alias: GrĂŒne Tonne
          - conditions:
              - condition: template
                value_template: "{{ \"SperrmĂŒll\" in trigger.calendar_event.summary }}"
            sequence:
              - action: input_boolean.turn_off
                metadata: {}
                data: {}
                target:
                  entity_id: input_boolean.sperrmull
            alias: SperrmĂŒll
          - conditions:
              - condition: template
                value_template: >-
                  {{ "Problemabfallsammeltermine" in
                  trigger.calendar_event.summary }}
            sequence:
              - action: input_boolean.turn_off
                metadata: {}
                data: {}
                target:
                  entity_id: input_boolean.problemabfallsammeltermine
            alias: Problemabfallsammeltermine
    end_calendar_offset:
      hours: 16
      minutes: 0
      seconds: 0
      days: -2
    end_action_button_confirmation_message: "{{ trigger.calendar_event.summary }} wurde rausgestellt!"
    include_end_auto_actions:
      - enable_end_action_1
    start_title: "MĂŒll "
    end_time_delay_confirmation_message: >-
      {{ trigger.calendar_event.summary }} : MĂŒllabfuhr schon durch ! MĂŒll
      automatisch quittiert.
    start_notify_interruption_level: active
    start_message: "{{ trigger.calendar_event.summary }} muss rausgestellt werden!"
    end_title: MĂŒll
    end_action_button_stop_confirmation_message: "{{ trigger.calendar_event.summary }} Vorgang abgebrochen!"
    end_action_button_stop: Abbruch !

Hinweis: FĂŒr die Anzeige auf der Pixel Clock mĂŒssen die Inhalte dieses Videos umgesetzt worden sein!

YouTube player

YAML Code der Ulanzi TC-001 Awtrix 3 Anzeige

alias: Test MĂŒll
description: ""
triggers:
  - trigger: state
    entity_id:
      - input_boolean.gelber_sack
      - input_boolean.graue_tonne
      - input_boolean.grune_tonne
conditions: []
actions:
  - if:
      - condition: state
        entity_id: input_boolean.gelber_sack
        state: "on"
    then:
      - action: script.awtrix_new_app
        metadata: {}
        data:
          rainbow: false
          lifetime: 0
          duration: 10
          textcase: 0
          textcolor:
            - 255
            - 255
            - 255
          progress: 0
          topicname: Muell_Gelber_Sack
          text: "Gelber Sack "
          icon: "12345"
    else:
      - action: script.awtrix_delete_app
        metadata: {}
        data:
          topicname: Muell_Gelber_Sack
mode: single

EVCC spricht Home Assistant: So einfach geht’s jetzt mit HACS Integration 🚗⚡

YouTube player

Mit EVCC und Home Assistant wird das Management deines Elektroautos einfacher als je zuvor! 🚗⚡ In diesem Video zeige ich dir, wie du EVCC mit HACS und dem passenden Add-On in Home Assistant integrieren kannst. Egal ob Ladeplanung, Energieoptimierung oder smarte Automatisierungen – mit dieser Anleitung holst du das Maximum aus deinem Smart Home heraus. Schau rein und erfahre, wie simpel die Einrichtung wirklich ist!

HACS Integration: GitHub – marq24/ha-evcc: Home Assistant integration for evccâ˜€ïžđŸš˜- optimized charging of electric vehicles, connecting your EV charger with your PV system. The integration use local polling (interval configurable) of the evcc API. Please note, that this integration is not official and not supported by the evcc developers. This project is not affiliated with evcc in any way.

Wichtiger Hinweis !: Im Video habe ich an der Stelle 6:03 benannt, dass ihr die IP Eures Home Assistant Servers (mit dem Port 7070) angeben sollt. Dies ist korrekt, wenn Ihr zusĂ€tzlich das HomeAssistant EVCC Addon installiert habt. Sollte Euere EVCC Installation nicht innerhalb von Home Assistant laufen, mĂŒsst Ihr hier die Adresse, unter der die EVCC WeboberflĂ€che bei Euch im Netzwerk zu erreichen ist, eintragen. Nochmals der Hinweis, bevor ihr diese Integration ĂŒber HACS hinzufĂŒgt, mĂŒsst Ihr EVCC bei Euch installiert haben (hier der link zum Video).

Code zum Bonus im Video:

Hinweis ! Die EntitĂ€ten mĂŒsst ihr mit den Namen eurer EntitĂ€ten im YAML Code ersetzen
Template Sensor Helfer „evcc_Tariff_Level“

{% set current_time = now().replace(minute=0, second=0, microsecond=0) %}
{% set rates = state_attr('sensor.evcc_tariff_forecast', 'result')['rates'] %}
{% set future_rates = rates | selectattr('start', '>=', current_time.isoformat()) | list %}
{% if future_rates | length > 0 %}
  {% set prices = future_rates | map(attribute='price') | list %}
  {% set avg_price = prices | average(0) %}
  {% set min_price = prices | min(0) %}
  {% set max_price = prices | max(0) %}
  {% set current_price = states('sensor.evcc_tariff_grid_2') | float(0) %}
    {# Definiere den Schwellenwert in Prozent (z.B. 80%) #}
  {% set threshold_percent = 10 %}
  
  {# Berechne den Preisunterschied basierend auf dem Schwellenwert #}
  {% set price_diff = avg_price * (threshold_percent / 100) %}

  {# Kategorisiere den aktuellen Preis basierend auf der Berechnung #}
  {% if current_price < (avg_price - price_diff) %}
     gĂŒnstig
  {% elif current_price > (avg_price + price_diff) %}
     teuer
  {% else %}
     mittel
  {% endif %}
  
{% else %}
    unbekannt
{% endif %}

Bonus Automatisierung:

alias: EVCC_Speicherladung
description: ""
triggers:
  - entity_id:
      - sensor.evcc_battery_soc_2
    for:
      minutes: 1
    trigger: state
  - entity_id:
      - sensor.evcc_tariff_level
    for:
      minutes: 1
    trigger: state
  - entity_id:
      - sensor.solcast_pv_forecast_prognose_verbleibende_leistung_heute
    for:
      minutes: 1
    trigger: state
  - trigger: state
    entity_id:
      - sensor.evcc_tariff_grid_2
    for:
      hours: 0
      minutes: 1
      seconds: 0
conditions: []
actions:
  - if:
      - condition: or
        conditions:
          - condition: state
            entity_id: sensor.evcc_tariff_level
            state: mittel
          - condition: state
            entity_id: sensor.evcc_tariff_level
            state: teuer
          - condition: numeric_state
            entity_id: sensor.evcc_battery_soc_2
            above: 99
          - condition: numeric_state
            entity_id: sensor.solcast_pv_forecast_prognose_verbleibende_leistung_heute
            above: 10
    then:
      - action: number.set_value
        data:
          value: "0.0"
        target:
          entity_id: number.evcc_battery_grid_charge_limit
    else:
      - if:
          - condition: and
            conditions:
              - condition: state
                entity_id: sensor.evcc_tariff_level
                state: gĂŒnstig
                for:
                  minutes: 1
              - condition: numeric_state
                entity_id: >-
                  sensor.solcast_pv_forecast_prognose_verbleibende_leistung_heute
                below: 10
              - condition: numeric_state
                entity_id: sensor.evcc_battery_soc_2
                below: 100
        then:
          - action: number.set_value
            data:
              value: "{{ states('sensor.evcc_tariff_grid_2') | float(0) }}"
            target:
              entity_id: number.evcc_battery_grid_charge_limit
          - action: input_boolean.turn_on
            metadata: {}
            data: {}
            target:
              entity_id: input_boolean.test_speicherladung
        else:
          - action: number.set_value
            data:
              value: "0.0"
            target:
              entity_id: number.evcc_battery_grid_charge_limit
mode: single

Blogbeitrag und Youtube Video zum Thema dynamischen Strompreis aus EVCC auslesen.

Home Assistant: EVCC-Daten zu dynamischen Strompreisen auslesen, visualisieren und damit rechnen – smarthome & more

Home Assistant: Automatische Lichteffekte ohne Aufwand – Zeit sparen mit diesem Script ! 💡

Beschreibung

Hast du auch Beleuchtungen, die Effekte integriert haben ? Klar, nicht immer will man dieses Lichtspektakel, es gibt aber auch Jahreszeiten, wo man sich darĂŒber freut, dass man mal den einen oder anderen vielleicht „kitschigen“ Effekt laufen lĂ€sst. Und dann geht es los. Wie setze ich das um ?

Der erste Gedanke ist, dass man fĂŒr jeden Effekt eine eigene Szene erstellt.

Aber sind wir mal ehrlich, da hat man innerhalb kĂŒrzester Zeit keine Lust mehr. Und genau hier möchte ich euch eine Lösung zeigen, die euch automatisch die Effekte ausliest und entweder einen zufĂ€lligen Effekt auswĂ€hlt, oder aber die Effekte der Reihe nach durchgeht.

Wenn man in die Effektlisten der einzelnen Beleuchtungen schaut, dann können da schnell mal etliche Effekte zusammenkommen.

Um euch das Leben hier einfacher zu machen, habe ich euch ein Skript erstellt, in dem ihr eurer Licht ĂŒbergebt, ein paar Übergabeparameter setzt und schon könnt ihr eure gewĂŒnschten Effekte laufen lassen.

Dieses Skript lÀsst sich einfach handhaben und in einer Automatisierung umsetzen. Als Beispiel möchte ich euch meine Weihnachtsbaum Automatisierung vorstellen.

Die zu ĂŒbergebenden Parameter sind:

  • Licht ( beliebige LichtentitĂ€t mit Effekten)
  • random ( An / Aus )
  • brigthness ( 0% – 100%)
  • exclude ( Liste von Effekten, die bei der automatischen Selektion ausgeschlossen werden sollen )
  • transition ( Übergangszeit fĂŒr einen weichen Übergang zum nĂ€chsten Effekt ) -> Hinweis: Das wird nicht von jeder Beleuchtung unterstĂŒtzt. Ist diese Möglichkeit nicht vorhanden, so wird automatisch ohne Transition Time geschaltet.

In der obigen Beispielautomatisierung wird alle 30 Sekunden ein anderer Effekt selektiert. Der Zyklus ist vielleicht etwas kurz, aber hier könnt ihr frei entscheiden.

Gerne stelle ich euch das Script kostenfrei zur VerfĂŒgung und wĂŒrde mich ĂŒber Kommentare zum Video bei Youtube , aber auch ein Like und vielleicht ein Abo sehr freuen. Auch Anregungen zur sinnvollen Erweiterung finde ich immer sehr Klasse. Ich hoffe euch hilft diese Umsetzung und ihr könnt gerade in der aktuell adventlichen Zeit schnell ein paar schöne Effekte damit leuchten lassen. Wenn ihr dann noch eure Zeit dabei fĂŒr die Umsetzung spart, dann habe ich mein Ziel schon erreicht.

Ich wĂŒnsche euch eine ruhige und besinnliche Adventszeit ( auch, wenn vielleicht mal ein Lichtspektakel dabei ist 🙂 ).

Das Skript ✹ Light Effect Toggle als YAML Code:

alias: ✹ Light Effect Toggle
sequence:
  - action: light.turn_on
    metadata: {}
    data: {}
    target:
      entity_id: " {{ light }} "
    alias: first turn on light
  - variables:
      current_effect: "{{ state_attr(light, 'effect') }}"
      all_effects: >
        {% set exclude_list = (exclude | default('')).split(',') | map('trim') |
        list %} {{ state_attr(light, 'effect_list') | reject('in', exclude_list)
        | list }}
      effect_to_apply: |
        {% if random %}
          {{ all_effects | random }}
        {% else %}
          {% set idx = all_effects.index(current_effect) + 1 %}
          {% if idx >= all_effects | length %}
            {{ all_effects[0] }}
          {% else %}
            {{ all_effects[idx] }}
          {% endif %}
        {% endif %}
    alias: get effect list ( light is on )
  - action: light.turn_on
    metadata: {}
    data:
      effect: "{{ effect_to_apply }}"
      brightness_pct: "{{ brightness }}"
      transition: "{{ transition | default(0) }}"
    target:
      entity_id: "{{light}}"
    alias: apply effect
  - action: logbook.log
    data:
      name: Actual Effect
      message: "actual effect: {{ state_attr(light, 'effect') | default('None') }}"
  - action: logbook.log
    data:
      name: effect to apply
      message: "effect to apply: {{ state_attr(light, 'effect') | default('None') }}"
fields:
  light:
    name: Licht
    description: Die zu steuernde Licht-EntitÀt
    selector:
      entity:
        domain: light
  random:
    selector:
      boolean: {}
    name: random
  brightness:
    selector:
      number:
        min: 1
        max: 100
        step: 1
    name: brightness
    required: true
    default: 50
  exclude:
    selector:
      text: null
    name: exclude
    description: enter the effects you want to exclude here, separated by commas
  transition:
    selector:
      number:
        min: 1
        max: 10
        step: 0.1
    name: transition
    description: time in seconds
    default: 0
description: Toggles the effect of the specified light
mode: parallel
max: 10

đŸŽ„ Home Assistant meets Community – Gemeinsam smarter leben!

In der Welt von Home Assistant entstehen stÀndig neue, kreative Lösungen, um den Alltag smarter und einfacher zu gestalten. In meinem neuesten Video stellen Mitglieder der Home Assistant Community ihre beeindruckenden Automatisierungsprojekte vor. Hier sind einige Highlights, die du nicht verpassen solltest:

đŸ”č Christian hat ein cleveres Setup fĂŒr seine Waschmaschine und seinen Trockner entwickelt. Dank Home Assistant bekommt er immer rechtzeitig eine Benachrichtigung, wenn die WĂ€sche fertig ist – nie wieder zu spĂ€t die Maschine ausrĂ€umen oder den perfekten Zeitpunkt fĂŒr den Wechsel verpassen!

đŸ”č Patrick prĂ€sentiert sein selbstgebautes, smartes SchlĂŒsselbrett. Es kombiniert Technik und KreativitĂ€t auf eine beeindruckende Weise, die nicht nur praktisch ist, sondern auch stylisch in den Alltag integriert werden kann.

Diese Projekte zeigen, wie vielseitig Home Assistant eingesetzt werden kann – von nĂŒtzlichen Haushaltshelfern bis hin zu kreativen Ideen, die dein Zuhause einzigartig machen.

Hast du auch spannende Automatisierungen umgesetzt? Teile sie in den Kommentaren oder lass dich von der Community inspirieren! 🚀

Die von Christian erwĂ€hnte Pixelclock bekommt ihr hier: Ulanzi TV001 smarte Pixel Uhr *

In diesem Video findet ihr noch weitere Informationen zur Pixelclock mit awtrix 3:

YouTube player

Als zuverlĂ€ssigen TĂŒr/Fenstersensor auf Zigbee Basis kann ich euch den Sensor von Aqara * empfehlen.

📘 Home Assistant Helfer Kompendium 2/? đŸ“Č [ Statistik]

Optimierung von Home Assistant Automatisierungen mit dem Statistik-Helfer

In meinem heutigen Artikel möchte ich dir zeigen, wie du den Statistik-Helfer in Home Assistant effektiv nutzen kannst, um tiefere Einblicke in deine Smart Home-Daten zu erhalten. Durch die richtigen Berechnungen kannst du deine Automatisierungen noch prÀziser und smarter gestalten. Hier sind die wichtigsten Charakteristika, die du mit dem Statistik-Helfer auswerten kannst:

1. Absoluter Abstand

Der absolute Abstand zeigt dir den Unterschied zwischen zwei Messwerten, ohne die Richtung zu berĂŒcksichtigen. Diese Berechnung ist besonders nĂŒtzlich, wenn du Schwankungen in einem Wert ĂŒberwachen möchtest, ohne die genaue Richtung zu verfolgen. Ich nutze diese Methode oft, um schnelle VerĂ€nderungen zu erkennen.

2. Abstand von 95% und 99% der Werte

Mit dieser Berechnung kann ich herausfinden, wie sich ein Wert im Vergleich zu den meisten anderen Werten verhĂ€lt. Der Abstand von 95% und 99% der Werte hilft mir dabei, Ausreißer zu identifizieren und meine Automatisierungen so anzupassen, dass sie nur unter den typischen Bedingungen reagieren.

3. Ältester Zeitpunkt

Der Ă€lteste Zeitpunkt zeigt mir, wann der Ă€lteste Messwert aufgezeichnet wurde. Das ist besonders nĂŒtzlich, wenn ich nach Ă€lteren Daten suche oder herausfinden möchte, wie lange es her ist, dass ein Wert zuletzt aktualisiert wurde. Diese Information kann wichtige Auswirkungen auf Automatisierungen haben, die sich auf historische Daten stĂŒtzen.

4. Änderung

Die Änderung zeigt mir, wie stark sich ein Wert verĂ€ndert hat, sei es positiv oder negativ. Ich verwende diese Berechnung, um zu verstehen, wie schnell oder langsam sich Werte entwickeln, was fĂŒr zeitkritische Automatisierungen sehr hilfreich ist.

5. Anzahl der Werte

Die Anzahl der Werte gibt mir eine einfache Übersicht darĂŒber, wie viele Messwerte ĂŒber einen bestimmten Zeitraum hinweg erfasst wurden. Diese Zahl hilft mir dabei, Trends zu erkennen und zu ĂŒberprĂŒfen, ob die Sensoren korrekt arbeiten.

6. Arithmetisches Mittel

Das arithmetische Mittel (der Durchschnitt) ist eine der grundlegendsten Berechnungen und gibt mir eine Vorstellung vom allgemeinen Trend eines Messwerts. Ich nutze das Mittel, um Automatisierungen zu erstellen, die auf den durchschnittlichen Bedingungen basieren.

7. Durchschnittliche Änderung pro Probe oder Sekunde

Diese Berechnung zeigt mir, wie schnell sich ein Wert im Zeitverlauf verĂ€ndert. Ich finde diese Kennzahl besonders nĂŒtzlich bei der Überwachung von Sensoren, die schnelle Reaktionen erfordern, wie zum Beispiel Bewegungsmelder oder TemperaturfĂŒhler.

8. Gesamt

Die Gesamtberechnung summiert alle Werte innerhalb eines bestimmten Zeitrahmens. Ich verwende diese Methode oft, um den Gesamtverbrauch von Energie oder die Gesamtzahl von Ereignissen zu ermitteln. Diese Zahl ist besonders nĂŒtzlich, wenn ich die gesamte Leistung oder AktivitĂ€t ĂŒber einen lĂ€ngeren Zeitraum beobachten möchte.

9. Linearisierter Durchschnitt

Der linearisierte Durchschnitt hilft mir, Daten zu glĂ€tten und langfristige Trends zu erkennen. Diese Methode ist besonders hilfreich, wenn ich mit periodischen Schwankungen zu tun habe und die Daten auf eine lineare Skala ĂŒbertragen möchte, um langfristige Muster besser sichtbar zu machen.


Durch die Nutzung dieser Berechnungen und der Einblicke, die der Statistik-Helfer bietet, kann ich meine Automatisierungen in Home Assistant noch gezielter und effizienter gestalten. Egal, ob du den Abstand zwischen Messwerten ĂŒberwachen, die Änderungsgeschwindigkeit analysieren oder die Gesamttrends erkennen möchtest – dieser Helfer ist eine wertvolle UnterstĂŒtzung fĂŒr jede Home Assistant-Instanz.

In dieser Playlist findest du alle bisherigen und kommenden Videos zum Thema Home Assistant Helfer:

YouTube player

📘 Home Assistant Helfer Kompendium 1/? đŸ“Č Mehr Kontrolle, weniger Aufwand!

Du willst das Beste aus deinem Home Assistant herausholen und suchst nach Möglichkeiten, deine Automationen smarter und individueller zu gestalten? In diesem Beitrag stelle ich dir drei Home Assistant Helfer vor, die dir genau das ermöglichen: den Ableitungssensor, das Dropdown-MenĂŒ und den generischen Hygrostat. Mit diesen Tools kannst du prĂ€zise Automatisierungen erstellen, die deine WĂŒnsche und Anforderungen perfekt erfĂŒllen.

Inhalt

  1. Ableitungssensor – Dynamische Anpassungen leicht gemacht 🚀Der Ableitungssensor ist ein geniales Tool, wenn du auf dynamische VerĂ€nderungen reagieren möchtest. Er eignet sich zum Beispiel, um den Anstieg oder Abfall eines Werts (wie Temperatur oder Luftfeuchtigkeit) zu erfassen und daraus passende Aktionen abzuleiten. So lĂ€sst sich etwa erkennen, ob eine Temperatur schnell steigt oder sinkt, und dann eine entsprechende Automation aktivieren – perfekt fĂŒr Klimasteuerungen oder BelĂŒftungsmanagement!
  2. Dropdown – Auswahlmöglichkeiten im Smart Home schaffen 📋Mit Dropdown-Listen kannst du verschiedene Auswahloptionen fĂŒr dein Smart Home anlegen. Ob es sich um RĂ€ume, GerĂ€temodi oder Szenen handelt – Dropdown-MenĂŒs bieten dir eine bequeme und ĂŒbersichtliche Möglichkeit, Optionen zu verwalten und per Klick auszuwĂ€hlen. Damit sparst du dir manuelle Eingaben und kannst ĂŒber vordefinierte Auswahlfelder spezifische Aktionen und Automationen schnell und unkompliziert steuern.
  3. Generischer Hygrostat – Die perfekte Feuchtigkeitskontrolle đŸŒ«ïžDer generische Hygrostat ist dein Helfer, wenn es um die Steuerung der Luftfeuchtigkeit in deinem Zuhause geht. Gerade fĂŒr RĂ€ume wie das Badezimmer oder den Keller ist eine konstante Feuchtigkeitskontrolle entscheidend, um Schimmelbildung zu vermeiden und das Raumklima zu verbessern. Mit diesem Helfer kannst du gezielt LĂŒftungen oder Entfeuchter steuern und die Feuchtigkeit so optimal anpassen.

Fazit

Diese drei Home Assistant Helfer sind echte Multitalente und erweitern deine Möglichkeiten enorm. Von dynamischen Steuerungen mit dem Ableitungssensor ĂŒber bequeme Auswahlmöglichkeiten mit Dropdown-Listen bis hin zur genauen Feuchtigkeitsregulierung mit dem generischen Hygrostat – hier findest du die passenden Werkzeuge fĂŒr jede Automationsidee.

Falls du noch mehr ĂŒber diese und andere Home Assistant Helfer erfahren möchtest, schau gerne auch in das zugehörige Video rein! Ich zeige dir Schritt fĂŒr Schritt, wie du diese Helfer einrichten und nutzen kannst, um dein Smart Home noch intelligenter zu machen.


Willst du mehr solcher Smart-Home-Tipps und Ideen? Dann bleib dran – auf meinem Blog und YouTube-Kanal gibt’s regelmĂ€ĂŸig neue Inhalte, um dein Zuhause noch smarter zu gestalten!

In dieser Playlist findest du alle bisherigen und kommenden Videos zum Thema Home Assistant Helfer:

YouTube player

🔍 Überwache Dein Smart Home wie ein Profi! 📊 Home Assistant Systemmonitoring einfach erklĂ€rt 🚀

In diesem Video zeige ich dir, wie du dein Smart Home mit Home Assistant perfekt ĂŒberwachen kannst, damit alles reibungslos lĂ€uft! Durch das Systemmonitoring bleibst du immer ĂŒber den Zustand deines Systems informiert, erkennst Probleme rechtzeitig und hĂ€ltst die Leistung deines Smart Homes auf einem hohen Niveau. Gerade wenn du regelmĂ€ĂŸig GerĂ€te steuerst oder Automationen laufen lĂ€sst, ist ein zuverlĂ€ssiges Monitoring unverzichtbar. Es sorgt nicht nur fĂŒr Sicherheit, sondern gibt dir auch die Kontrolle, wie dein System „tickt“. Ich zeige dir, wie du das Monitoring-Tool in Home Assistant installieren und einrichten kannst – Schritt fĂŒr Schritt und einfach erklĂ€rt. Anschließend gehen wir darauf ein, wie die einzelnen Komponenten und Sensoren funktionieren, damit du genau weißt, welche Daten dir angezeigt werden und was diese bedeuten. Sensoren spielen hier eine zentrale Rolle, da sie dir wichtige Infos liefern: von der CPU-Auslastung ĂŒber die Temperatur bis hin zum freien Speicherplatz. So hast du alles auf einen Blick und kannst Störungen frĂŒhzeitig erkennen. Zum Schluss zeige ich dir, wie du diese Daten in eine kleine Automatisierung einbindest, sodass dein System im Notfall automatisch reagiert, etwa bei einem kritischen Speicherstand oder zu hoher Auslastung. Dein Home Assistant wird damit nicht nur smarter, sondern auch robuster. Perfekt fĂŒr Einsteiger und erfahrene Home-Assistant-Nutzer, die ihr System auf das nĂ€chste Level heben möchten. Abonniere, um keine Tipps rund um dein Smart Home zu verpassen, und lass uns loslegen! 🎉

Die Automatisierung aus dem Video:

alias: SystemzustĂ€nde ĂŒberwachen
description: >-
  Sendet eine Benachrichtigung, wenn wichtige SystemzustÀnde kritische Werte
  ĂŒberschreiten.
triggers:
  - entity_id: sensor.localhost_cpu_auslastung_2
    above: 80
    trigger: numeric_state
  - entity_id: sensor.localhost_speicherauslastung
    above: 75
    trigger: numeric_state
  - entity_id: sensor.localhost_data_datentragernutzung
    above: 90
    trigger: numeric_state
actions:
  - action: script.notify_all
    metadata: {}
    data:
      alexa: false
      message: "    Warnung: Ein kritischer Systemzustand wurde erreicht! {% if     trigger.entity_id == 'sensor.localhost_cpu_auslastung_2' %} CPU-Auslastung:     {{ states('sensor.localhost_cpu_auslastung_2') }}% {% elif trigger.entity_id     == 'sensor.localhost_speicherauslastung' %} RAM-Nutzung: {{     states('sensor.localhost_speicherauslastung') }}% {% elif trigger.entity_id     == 'sensor.localhost_data_datentragernutzung' %} Festplattennutzung: {{     states('sensor.localhost_data_datentragernutzung') }}% {% endif %}"
mode: single

Hinweis: In dieser Automatisierung wird ein Skript zur Ausgabe der Nachrichten verwendet. Weitere Informationen zum Skript findet ihr in hier. Bitte beachten, im Beispiel auf der verlinkten Seite nennt sich das Skript nicht „skript.notify_all“ sondern „script.notify_all_video2“. D.h. wenn ihr den Code kopieren wollt, mĂŒsst ihr den Namen des Skripts in der Automatisierung anpassen. Weitere Anpassungen von Device IDs und Notification EntitĂ€ten sind natĂŒrlich ebenfalls nach euren EntitĂ€ten anzupassen.

ErgĂ€nzend zum Blogbeitrag ĂŒber Skripte, möchte ich euch hier nochmal das passende Skript fĂŒr die obige Automatisierung veröffentlichen.

alias: notify_all
sequence:
  - action: notify.mobile_app_iphone_tobias
    metadata: {}
    data:
      message: "{{ message }}"
      title: "{{ title }}"
  - if:
      - condition: template
        value_template: "{{ alexa }}"
    then:
      - action: notify.alexa_media_keller
        metadata: {}
        data:
          message: "{{ message }}"
          title: "{{ title }}"
fields:
  message:
    selector:
      text: null
    name: message
  title:
    selector:
      text: null
    name: title
  alexa:
    selector:
      boolean: {}
    name: alexa
    default: false
description: ""