====== digitalSTROM ======
[[https://www.digitalstrom.com/ueber-uns/corporate/|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
* jsonclient
* Python
[[/software/clients/vzclient|VZClient]] und [[https://github.com/volkszaehler/volkszaehler.org/blob/master/bin/jsonclient|jsonclient]] sind Teil von volkszaehler.org. Wie man einen eigenen Volkszähler installiert findet man unter [[/howto/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 [[https://wiki.fhem.de/wiki/DigitalSTROM_einbinden|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 [[http://developer.digitalstrom.org/Architecture/system-interfaces.pdf|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:
* In die Adresszeile eines Browsers https://:8080/json/system/requestApplicationToken?applicationName=volkszaehler
eingeben, eventuell die Sicherheitshinweise wegen den Zertifikat bestätigen.
* Angezeigt wird wird die .json Antwort des dSS mit den benötigten Token.
* Den Token mit '//copy and paste//' sichern.
* In Firefox auf die Startseite des dSS gehen.
* Unten rechts ''Erweiterte Ansicht'' aktivieren.
* In den Reiter ''System'' wechseln.
* Unter ''Zugriffsberechtigung'' -> ''Applikation'' -> ''volkszaehler'' Zugriff erlauben\\ ''Uebernehmen'' nicht vergessen.
==== 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.
#!/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 //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://:8080/json
api=https://:8080/json
# Authentication token see chapter 6 in:
# http://developer.digitalstrom.org/Architecture/system-interfaces.pdf
app_token=
# Configuration of the actual counters according to the format
# [uuid]=dSMeter
# The is created in the middleware as
# "El. energy (counter readings)", resolution 1000.
# The 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://:8080/json
->Zeile 30: den Aplikation Token eintragen
app_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
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:
...Hilft dieser Issue:[[https://github.com/volkszaehler/volkszaehler.org/pull/712/commits/d0215c7a39c05795b6ca6ab655e10c8b92ab4013]]
Läuft das Script fehlerfrei, liegt unter %%http:///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 []=
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.