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: 872

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


Tweakers vormt samen met Tweakers Elect, Hardware.Info, Autotrack, Nationale Vacaturebank en Intermediair de Persgroep Online Services B.V.
Alle rechten voorbehouden © 1998 - 2018 Hosting door True