Inhaltsverzeichnis

digitalSTROM

DigitalSTROM ist eine SmartHome Lösung der gleichnamigen Firma.

Im Folgenden ein einfaches Bash-Skript zum Auslesen von dSM-Zählerständen. Die Begriffe dSM und dSS werden hier nicht erläutert. Wer das System einsetzt, oder einsetzen möchte, sollte wissen wovon die Rede ist.

Vorbereitungen

Voraussetzungen

VZClient und jsonclient sind Teil von volkszaehler.org. Wie man einen eigenen Volkszähler installiert findet man unter getstarted.

Python lässt sich schnell mit folgendem Befehl installieren:

sudo apt install python-minimal

Erzeugen eines Application Tokens für den Zugriff auf den dSS

Aus der Doku von FHEM:

Die Authentifizierung im dSS erfolgt über einen zweistufigen Mechanismus mit Application-Token und Session-Token.
Im ersten Schritt wird ein Application Token erzeugt und anschliessend über den dS-Konfigurator aktiviert. Dieser Schritt muss nur einmal durchgeführt werden. Eine Anleitung dazu findet sich in der Dokumentation digitalSTROM API (Kapitel 6). Mit Hilfe dieses Application Tokens wird dann ein Session Token generiert, das bei den einzelnen Calls auf das JSON-API benutzt wird.


Der dSS verwendet ein selbst signiertes Zertifikat. Das wird von manchen Browsern als Sicherheitsrisiko gesehen. Mit den folgenden Schritten erhält man den Token:

Volkszähler

In /etc/vzclient.conf ist die Middleware einzutragen, in der Regel localhost.

:~$ sudo nano /etc/vzclient.conf
[default]
url:http://localhost/middleware.php

Über das Frontend werden die Kanäle angelegt.
Benötigt wird pro dSM ein Kanal Typ „El. Energie (Zählerstände)“ mit „Auflösung 1000“.

Verzeichnis ''/tmp''

Das Script schreibt bei jeden Aufruf eine Datei nach /tmp, und löscht diese wieder. Das ist tödlich für eine SD-Card.

Wer das Script auf einen RaspberryPi einsetzt, muss /tmp in eine RAM-Disk legen.

Script

Das folgende Script vorzugsweise unter /usr/local/bin/ ablegen.

dsm.sh
#!/bin/bash
#
# This is a simple bash script for reading digitalSTROM meters 
# connected to digitalSTROM server, and logs their values for the 
# project volkszaehler. The meter reading is queried, so it is 
# relatively unimportant how often it is queried.
# 
# Start it with a cronjob similar to this one:
# * * * * * sudo /<pfad>/dsm.sh >> /var/log/dsm.log
#
# @author Thomas Hoepfner
# 
 
 
# configuration
#
# jsonclient to disassemble
jc=jsonclient
 
# vzclient to save
# make sure vzclient.conf has middleware url configured or add below
vzc=vzclient
 
# digitalSTROM server
# api=https://<your server>:8080/json
api=https://<your server>:8080/json
 
# Authentication token see chapter 6 in:
# http://developer.digitalstrom.org/Architecture/system-interfaces.pdf
app_token=<personal token>
 
 
# Configuration of the actual counters according to the format 
# 			[uuid]=dSMeter 
# The <uuid> is created in the middleware as 
# "El. energy (counter readings)", resolution 1000.
# The <dSmeter> is easily determined from the json response. 
# Remove the comment character in the line: 
# cat "$tmp_file" > #/var/www/volkszaehler.org/htdocs/dsm.json (after get data)
# Run the script once. In dsm.json are all digitalSTROM meters with description.
# The digit after level "dSmeters:" is the corresponding dSM.
#
declare -A sensors
sensors=(
            [11111111-1111-1111-1111-111111111111]=0
            [22222222-2222-2222-2222-222222222222]=1
)
 
# loginto digitalSTROM server
token=$("$jc" --url "$api/system/loginApplication?loginToken=$app_token" -e result,token)
echo "Security token: $token"
 
# temp file for data
tmp_file=$(mktemp)
 
# get data - dsm power,consumption
"$jc" --url "$api/property/query?query=/apartment/dSMeters/*(dSUID,name,powerConsumption,energyMeterValue)&token=$token" > "$tmp_file"
 
 
# analyze json response
#
#cat "$tmp_file" > /var/www/volkszaehler.org/htdocs/dsm.json
#
#exit  # Exit script here for testing
 
# parse data
for uuid in "${!sensors[@]}"; do
 sensor=${sensors[$uuid]}
 val=$("$jc" --file "$tmp_file" -e result,dSMeters,$sensor,energyMeterValue)
 echo $uuid  $val
 # save to vzclient
  if [ -n "$val" ]; then
   int=$(echo "($val+0.5)/1" | bc) 
   if [ "$int" -gt 0 ]; then "$vzc" -u $uuid add data value=$val; fi
  fi
done
 
rm "$tmp_file"

Die Datei ausführbar machen,

:~$ sudo chmod +x /usr/local/bin/dsm.sh

und editieren

:~$ sudo nano /usr/local/bin/dsm.sh

->Zeile 26: den dSS eintragen
api=https://<your server>:8080/json  

->Zeile 30: den Aplikation Token eintragen
app_token=<personal token>

->Zeile 62u.64: die 1.# entfernen
cat "$tmp_file" > /var/www/volkszaehler.org/htdocs/dsm.json
#
exit  # Exit script here for testing

-> speichern und Editor verlassen

Jetz wird das Script einmal ausgeführt.

:~$ sudo /usr/local/bin/dsm.sh

Kommen Fehlermedungen wie diese…

Traceback (most recent call last):
  File "/var/www/volkszaehler.org/bin/jsonclient", line 58, in <module>
    f=urllib2.urlopen(url);
  File "/usr/lib/python2.7/urllib2.py", line 154, in urlopen
    return opener.open(url, data, timeout)
  File "/usr/lib/python2.7/urllib2.py", line 429, in open
    response = self._open(req, data)
  File "/usr/lib/python2.7/urllib2.py", line 447, in _open
    '_open', req)
  File "/usr/lib/python2.7/urllib2.py", line 407, in _call_chain
    result = func(*args)
  File "/usr/lib/python2.7/urllib2.py", line 1241, in https_open
    context=self._context)
  File "/usr/lib/python2.7/urllib2.py", line 1198, in do_open
    raise URLError(err)
urllib2.URLError: <urlopen error [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:726)>

…Hilft dieser Issue:https://github.com/volkszaehler/volkszaehler.org/pull/712/commits/d0215c7a39c05795b6ca6ab655e10c8b92ab4013

Läuft das Script fehlerfrei, liegt unter http://<volkszaehler>/dsm.json die Antwort des dSS.
Die Ziffer unterhalb der Ebene „dSmeters:“ ist die dSM-ID die wir erfassen wollen.

Jetzt konfigurieren wir das Script abschließend:

:~$ sudo nano /usr/local/bin/dsm.sh

->Zeile 62u.64: wieder auskommentieren
#cat "$tmp_file" > /var/www/volkszaehler.org/htdocs/dsm.json
#
#exit  # Exit script here for testing

->ab Zeile 45 werden die Meters eingeben [<VZ-UIID>]=<dSM-ID>
sensors=(
            [11111111-1111-1111-1111-111111111111]=0
            [22222222-2222-2222-2222-222222222222]=1
)

mit den Befehle

:/$ sudo /usr/local/bin/dsm.sh

speichern wir den 1.Wert. In der Konsole sollte eine ähnliche Ausgabe erscheinen:

:/$ sudo /usr/local/bin/dsm.sh
Security token: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
11111111-1111-1111-1111-111111111111 xx.xxxx
{"version":"0.3","rows":1}
22222222-2222-2222-2222-222222222222 xx.xxxx
{"version":"0.3","rows":1}

cron

Um regelmäßig Daten zu erhalten richtet man einen cronjob ein

:/$ sudo crontab -e
# Edit this file to introduce tasks to be run by cron.

*/3 * * * * sudo /usr/local/bin/dsm.sh

Jetzt sollte alle 3 Minuten ein Wert je dSM in der Datenbank ankommen.