Let op: Tweakers stopt per 2023 met Tweakblogs. In dit artikel leggen we uit waarom we hiervoor hebben gekozen.

DSMR in docker op een Debian server en verbinding via een RPI

Door maxxie85 op zondag 11 november 2018 17:06 - Reacties (2)
Categorie: -, Views: 4.248

Ik ben een fan van Docker sinds ik ben begonnen met het automatiseren van mijn huis.
Ik vind het fijn om inzicht te krijgen in mijn energieverbruik.

Ik draai al mijn docker instances op een zelfgebouwde Debian server die in mijn woonkamer staat. In mijn meterkast heb ik geen bedraad netwerk dus dat is tot nu toe geen optie om daar de server neer te zetten. Ik heb daar wel een Pi die via wifi een aantal zaken voor mij regelt.

Eén van die zaken is het doorsturen van de P1 telegrammen naar mijn Debian server.

Aan mijn Pi zit een P1-USB kabel verbonden om mijn slimme meter uit te lezen. Echter moeten de telegrammen die uit de slimme meter komen binnenkomen op mijn Debian server. Want daar draai ik DSMR reader in Docker.

Ik gebruik hiervoor een programma dat heet ser2net. Dit programma is feitenlijk een netwerk server voor COM poorten en kan dus COM poorten aanbieden op een netwerkpoort. Hier vallen ook USB adapters onder. Ser2net kan je als source downloaden op je Pi en dan compilen en installeren. Zodra dit geïnstalleerd is kan je het programma starten via de CLI.

Ser2net maakt gebruik van configuratiebestanden. Voorbeeld van mijn configuratiebestand.
code:
1
2
3
BANNER:banner1:this is ser2net TCP port \p device \d serial parms \s\r\n

2001:raw:600:/dev/ttyUSB0:115200 NONE 1STOPBIT 8DATABITS XONXOFF LOCAL -RTSCTS

Met deze configuratie bied ik ttyUSB0 aan op poort 2001 van mijn Pi.

Natuurlijk wil ik dat ser2net wordt gestart bij elke reboot. Ik gebruik hiervoor rc.local met de volgende regel:
code:
1
/usr/local/sbin/ser2net -c /etc/ser2net.conf


Op mijn Debian server wil ik gebruik gaan maken van DSMR-reader, en dan de docker variant. DSMR reader wil direct toegang hebben tot de COM poort van de USB. Dat kan niet en daarom draai ik ser2net op de Pi. Echter heb je ook iets nodig dat verbinding kan maken met ser2net en dat weer in een virtuele-COM poort stopt. Ook daar is een programma voor en dat heet Socat.
code:
1
sudo apt-get install socat


Socat is een zeer veelzijdig programma maar bied wat ik nodig heb. Via de CLI kan Socat het commando krijgen om verbinding te maken met een ip4 adress en dit te koppelen aan een virtuele-COM poort. In mijn geval zal dat zijn:
code:
1
sudo socat pty,link=/dev/virtualcom0,raw tcp:IP_adress_van_Pi:2001&

Echter wil ik ook dat deze verbinding automatisch gestart wordt bij een reboot van mijn server. Aan deze kant gebruik ik systemd en maak ik een custom service. Hierbij geld wel dat Socat in een speciale modus moet draaien. En dat is de uni-directionele modus i.p.v. bi-directioneel.
In /etc/systemd/system heb ik mijn eigen socat.service gedefinieerd. Deze is als volgt:
code:
1
2
3
4
5
6
7
8
9
10
11
12
[Unit]
Description=Socat

[Service]
Type=simple
ExecStart=/usr/bin/socat -U pty,link=/dev/virtualcom0,raw tcp:(IP_adress_van_Pi):2001&
User=root
Restart=always
RestartSec=10

[Install]
WantedBy=multi-user.target

Zorg ervoor dat de permissies uitvoeren toelaten. Ik heb de eigenaar van de service hetzelfde gemaakt als bestaande services.

Nadat je de socat.service hebt toegevoegd moet deze nog wel ge-enabled worden voordat systemd deze automatisch start bij een reboot. Eerst moet systemctl de nieuwe service herkennen.
code:
1
sudo systemctl reload-daemon

Nu kun je de service eerst uittesten. Dit doe je door hem te starten.
code:
1
sudo systemctl start socat.service

Vervolgens kan je checken of de telegrammen van de slimme meter binnen komen op virtualcom0. Controleer dit via
code:
1
sudo cat /dev/virtualcom0

Als je hier de telegrammen ziet verschijnen werkt socat zoals bedoeld. Nu kun je de service enablen zodat deze start bij boot
code:
1
sudo systemctl enable socat.service

Nu start de service automatisch bij een reboot.

Nu komt de P1 data binnen op /dev/virtualcom0. Hartstikke mooi ik heb een COM poort waar DSMR zich mee kan verbinden.
In de docker-compose van DSMR geef ik /dev mee als locatie. Dit is niet ideaal want eigenlijk moet alleen virtualcom0 meegegeven worden. Maar hier had ik nog een issue mee wat ik nog moet uitzoeken. Zodra de container is opgestart moet eenmalig in de configuratie van DSMR-reader de poort aangepast worden naar virtualcom0 en daarna werkt het.

De docker-compose van DSMR-reader
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
version: '3'

services:
  dsmrdb:
    image: postgres
    container_name: dsmrdb
    volumes:
      - ~/dsmr_reader/dsmrdb:/var/lib/postgresql/data
      - ~/dsmr_reader/dsmrdb_backups:/home/dsmr/app/backups
    restart: always
    environment:
      - POSTGRES_USER=dsmrreader
      - POSTGRES_PASSWORD=dsmrreader
      - POSTGRES_DB=dsmrreader
    networks:
      - dsmr_network

  dsmr:
    #build: .
    image: xirixiz/dsmr-reader-docker
    container_name: dsmr
    links:
      - dsmrdb
    restart: always
    environment:
      - DB_HOST=dsmrdb
      - DSMR_USER=admin
      - DSMR_EMAIL=root@localhost
      - DSMR_PASSWORD=admin
      - VIRTUAL_HOST=localhost
    ports:
      - 2507:80
      - 2508:443
    #devices:
    #  - "/dev/virtualcom0:/dev/virtualcom0"
    volumes:
      - /dev/:/dev/
    networks:
      - dsmr_network

networks:
  dsmr_network:
    driver: bridge

Reacties


Door Tweakers user S0epkip, maandag 12 november 2018 09:48

Bedankt voor het delen!
Bij mij draait DSMR-reader op een Pi in de meterkast, maar de pi wil nog wel eens uitvallen, door een corrupte SD ofzo.
Gelukkig bied een daily database backup dan wel een makkelijke restore, maar misschien is het extern draaien - zoals jij doet - wel wat stabieler.

Door Tweakers user maxxie85, maandag 12 november 2018 10:58

S0epkip schreef op maandag 12 november 2018 @ 09:48:
Bedankt voor het delen!
Bij mij draait DSMR-reader op een Pi in de meterkast, maar de pi wil nog wel eens uitvallen, door een corrupte SD ofzo.
Gelukkig bied een daily database backup dan wel een makkelijke restore, maar misschien is het extern draaien - zoals jij doet - wel wat stabieler.
Zoals jij het draait ga ik het ook bij mijn vader implementeren, daar staat ook geen server.
Daar ben ik ook nog aan het nadenken over hoe ik daar de data altijd veilig houdt. Want als die daily database backup ook op de SD terecht komt schiet je daar niet heel veel mee op.

Over stabieliteit heb ik niks geschreven omdat ik nog geen hick-up ben tegengekomen. Het draait nu bij mij bijna een maand op deze manier.

[Reactie gewijzigd op maandag 12 november 2018 10:59]


Reageren is niet meer mogelijk