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
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.
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:
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.
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:
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:
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.
Nu kun je de service eerst uittesten. Dit doe je door hem te starten.
Vervolgens kan je checken of de telegrammen van de slimme meter binnen komen op virtualcom0. Controleer dit via
Als je hier de telegrammen ziet verschijnen werkt socat zoals bedoeld. Nu kun je de service enablen zodat deze start bij boot
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
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 |