Skip to content

Installation Guide

Complete installation instructions for DSMR Reader Docker.


Prerequisites

Required

  • Docker 24.0.0 or newer (or Podman)
  • Docker Compose 2.0.0 or newer
  • 2GB RAM minimum (4GB recommended)
  • 10GB disk space minimum
  • USB serial port or network-connected smart meter

Operating Systems

  • Linux (Ubuntu, Debian, Raspbian, etc.)
  • macOS (Intel or Apple Silicon)
  • Windows (via WSL2 or Docker Desktop)

Quick Installation

Step 1: Install Docker

Ubuntu/Debian:

sudo apt-get update
sudo apt-get install docker.io docker-compose-plugin
sudo systemctl enable docker
sudo systemctl start docker

Other platforms: See Docker installation docs

Step 2: Configure User Permissions

# Add user to docker group
sudo usermod -aG docker $USER

# Add user to dialout group (for serial access)
sudo usermod -aG dialout $USER

# Log out and back in for groups to take effect

Step 3: Create Project Directory

mkdir ~/dsmr-reader
cd ~/dsmr-reader

Step 4: Create docker-compose.yaml

Create docker-compose.yaml with this content:

version: '3.8'

volumes:
  dsmrdb_data:

services:
  dsmrdb:
    image: postgres:17-alpine
    container_name: dsmrdb
    restart: always
    volumes:
      - dsmrdb_data:/var/lib/postgresql/data
    environment:
      POSTGRES_USER: dsmrreader
      POSTGRES_PASSWORD: dsmrreader
      POSTGRES_DB: dsmrreader

  dsmr:
    image: xirixiz/dsmr-reader-docker:latest
    container_name: dsmr
    restart: always
    depends_on:
      - dsmrdb
    ports:
      - "80:80"
    devices:
      - /dev/ttyUSB0:/dev/ttyUSB0
    environment:
      # Database
      DJANGO_DATABASE_HOST: dsmrdb
      DJANGO_DATABASE_NAME: dsmrreader
      DJANGO_DATABASE_USER: dsmrreader
      DJANGO_DATABASE_PASSWORD: dsmrreader

      # Application
      CONTAINER_RUN_MODE: standalone
      DJANGO_TIME_ZONE: Europe/Amsterdam
      DJANGO_SECRET_KEY: change-me-to-random-string
      DSMRREADER_ADMIN_USER: admin
      DSMRREADER_ADMIN_PASSWORD: admin

Step 5: Start Services

docker compose up -d

Step 6: Access Web Interface

Open browser to: http://localhost

Login with: - Username: admin - Password: admin

Step 7: Configure DSMR Version

  1. Navigate to: Configuration → Datalogger
  2. Set your DSMR version (e.g. 4/5, 2/3, Fluvius, etc)
  3. Save changes

Detailed Setup

Serial Device Setup

Find Your Device

# List USB serial devices
ls -l /dev/ttyUSB* /dev/ttyACM*

# Monitor device detection
dmesg | tail -20

Use the symlink script for stable device names:

# Download script
wget https://raw.githubusercontent.com/xirixiz/dsmr-reader-docker/main/container_host_scripts/host_dev_setup.sh

# Make executable
chmod +x host_dev_setup.sh

# Create symlink
sudo ./host_dev_setup.sh

# This creates /dev/dsmr_p1 → /dev/ttyUSB0

Update your docker-compose.yaml:

devices:
  - /dev/dsmr_p1:/dev/dsmr_p1

Manual Permissions (Alternative)

# Temporary fix
sudo chmod 666 /dev/ttyUSB0

# Permanent fix - add user to dialout group
sudo usermod -aG dialout $USER
# Log out and back in

Network Smart Meter Setup

This uses remote input (pull). It does NOT require remote_datalogger mode. For network-connected smart meters example configuration:

services:
  dsmr:
    image: xirixiz/dsmr-reader-docker:latest
    environment:
      CONTAINER_RUN_MODE: standalone
      DSMRREADER_REMOTE_DATALOGGER_INPUT_METHOD: ipv4
      DSMRREADER_REMOTE_DATALOGGER_NETWORK_HOST: 192.168.1.100
      DSMRREADER_REMOTE_DATALOGGER_NETWORK_PORT: 23
      # ... other configuration ...

Configuration Options

Generate Secure Secret Key

# Generate random secret key
python3 -c 'from django.core.management.utils import get_random_secret_key; print(get_random_secret_key())'

Use this in DJANGO_SECRET_KEY.

Set Timezone

Find your timezone:

timedatectl list-timezones | grep -i europe

Common timezones: - Europe/Amsterdam - Europe/Brussels - Europe/Berlin - America/New_York - America/Los_Angeles

Change Default Password

After first login: 1. Navigate to: Settings → Users 2. Click on admin user 3. Change password 4. Save

Or via environment variable:

environment:
  DSMRREADER_ADMIN_PASSWORD: your-secure-password


Post-Installation

Verify Installation

Check containers are running:

docker compose ps

Expected output:

NAME      IMAGE                              STATUS
dsmr      xirixiz/dsmr-reader-docker:latest  Up
dsmrdb    postgres:17-alpine                 Up

Check logs:

docker compose logs dsmr | tail -50

Should see: - No errors - "Server started" messages - Telegram processing messages

Test web interface:

curl http://localhost/healthcheck

Should return HTTP 200.

Configure Smart Meter

  1. Access web interface: http://localhost
  2. Login with admin credentials
  3. Navigate to: Configuration → Datalogger
  4. Configure:
  5. DSMR version (4.x or 5.x)
  6. Serial port: /dev/ttyUSB0 or /dev/dsmr_p1
  7. Baud rate: 115200 (DSMR 4/5) or 9600 (DSMR 2/3)
  8. Save changes
  9. Restart container: docker compose restart dsmr

Verify Data Collection

Check dashboard: - Navigate to Dashboard - Should see graphs within 10 seconds - Data updates every 10 seconds

Check database:

docker exec dsmrdb psql -U dsmrreader -d dsmrreader -c "SELECT COUNT(*) FROM dsmr_reading_dsmrreading;"

Should show increasing count.


Upgrade

Backup First

Database backup:

docker exec dsmrdb pg_dump -U dsmrreader dsmrreader > backup_$(date +%Y%m%d).sql

Configuration backup:

cp docker-compose.yaml docker-compose.yaml.backup

Pull New Image

# Stop services
docker compose down

# Pull latest image
docker compose pull

# Start services
docker compose up -d

# Check logs
docker compose logs -f

Upgrade to Specific Version

services:
  dsmr:
    image: xirixiz/dsmr-reader-docker:6.2.0  # Specific version

Then:

docker compose down
docker compose pull
docker compose up -d


Uninstallation

Remove Containers and Volumes

# Stop and remove containers
docker compose down

# Remove with volumes (deletes all data!)
docker compose down -v

# Remove images
docker rmi xirixiz/dsmr-reader-docker:latest
docker rmi postgres:17-alpine

Remove Project Files

cd ~
rm -rf dsmr-reader

Remove User Permissions

# Remove from docker group
sudo gpasswd -d $USER docker

# Remove from dialout group
sudo gpasswd -d $USER dialout

Troubleshooting Installation

Docker Won't Start

Check Docker is running:

sudo systemctl status docker

Start Docker:

sudo systemctl start docker

Permission Denied

Not in docker group:

# Add user
sudo usermod -aG docker $USER

# Log out and back in
# Verify
groups | grep docker

Port Already in Use

You may change the external port (left side) freely, for example 7777:80.

Change port in docker-compose.yaml:

ports:
  - "8080:80"  # Use port 8080 instead of 80

Container Won't Start

Check logs:

docker compose logs dsmr
docker compose logs dsmrdb

Enable debug mode:

environment:
  CONTAINER_ENABLE_DEBUG: "true"

Serial Device Not Found

Check device exists:

ls -l /dev/ttyUSB*

Check permissions:

ls -l /dev/ttyUSB0
groups | grep dialout

Verify in container:

docker exec dsmr ls -l /dev/ttyUSB0