[vz-users] [gelöst] Meter Protocol "exec"
Rupert Schöttler
rupert.schoettler at gmx.de
Tue Mar 27 20:37:13 CEST 2018
Hallo nochmal,
Am 25.03.2018 um 15:23 schrieb Rupert Schöttler:
> als "Abfallprodukt" der Abtastung meiner Wasseruhr mittels Laser- und
> Photodiode (Thread "Wasserzähler mit Laser als S0 auslesen" vom
> 30.12.2017) habe ich mit einer weiteren Photodiode an einem anderen
> Arduino-Eingang einen Lichtsensor für den Keller gebastelt und an an
> einen GPIO des Pi angeschlossen: Dort erhalte ich eine 1, wenn das Licht
> an ist, und eine 0 für aus. Damit möchte ich einen Hinweis erzeugen,
> wenn vergessen wird, das Licht auszumachen. Bzw. als ersten Schritt die
> einfache Info "Licht ist an oder aus" mal in den VZ pumpen.
Hier eine funktionierende Lösung mit dem Protokoll "exec".
1. vzlogger neu kompilieren mit dem Kompiler-Schalter
-DMETEREXEC_ROOTACCESS=true.
Gemäß
https://wiki.volkszaehler.org/software/controller/vzlogger/installation_cpp-version#build_von_hand,
Abschnitt "Building vzlogger", aber mit
cmake -DMETEREXEC_ROOTACCESS=true ..
statt nur "cmake ..". Das Ganze dauert ein Weilchen.
2. Meine vzlogger-conf von vorgestern war nicht 100% korrekt zur Nutzung
dieses Protokolls. So funktioniert's:
{ // #4: Light sensor by exec:
"enabled": true, // disabled meters will be ignored
"allowskip": true, // if enabled, errors when opening
meter will lead to meter being ignored
"protocol": "exec",
"command": "echo \"Licht = `gpio -g read 23`\"", // is the
command line as you'll type it in the shell
"format": "$i = $v", // a format string for
parsing complex logfiles
// arbitrary text and
whitespaces are allowed, see 'scanf()'
// at least $v has to be used
// $i => identifier, $v =>
value, $t => timestamp
"interval": 10,
"channel": {
// Kellerlicht:
"uuid": "my_uuid_9fe3",
"identifier": "Licht", // identifier mandatory!?!
"duplicates": 3600, // duplicates only very 3600 sec (1h)
"middleware": "http://ras3/middleware.php"
}
} // meter #4: Light sensor
Das Kommando kommt nun ohne Shell-Skript aus. Man beachte den Backslash,
damit das Anführungszeichen in den Kommandostring übergeben wird.
Offensichtlich ist der identifier im Channel verpflichtend, daher lasse
ich ein "Licht =" ausgeben und parse danach mittels "$i = $v".
Jedenfalls wurde nichts erkannt oder eingelesen ohne "identifier" und
nur mit "format": "$v", d.h. der Konfiguration von Sonntag.
Auszug aus dem logfile:
pi at ras2:~ $ grep -iE "(mtr4|chn6|exec|9fe3)" /var/log/vzlogger.log
[Mar 27 19:57:10][mtr4] Creating new meter with protocol exec.
[Mar 27 19:57:10][exec] MeterExec::MeterExec: Parsed format string "$i =
$v" => "%2$ms = %1$lf"
[Mar 27 19:57:10][mtr4] Meter configured, enabled.
[Mar 27 19:57:10] New meter initialized (protocol=exec)
[Mar 27 19:57:10][chn6] New channel initialized (uuid=...159fe3
api=volkszaehler id=Licht)
[Mar 27 19:57:10][exec] MeterExec::open: MeterExec protocol is compiled
with root privileges!
[Mar 27 19:57:10][exec] MeterExec::open: Testing command line 'echo
"Licht = `gpio -g read 23`"': Success
[Mar 27 19:57:10][mtr4] Meter connection established
[Mar 27 19:57:10][mtr4] Meter thread started
[Mar 27 19:57:10][mtr4] Meter is opened. Starting channels.
[Mar 27 19:57:10][chn6] Logging thread started
[Mar 27 19:57:10][chn6] Start logging thread for volkszaehler-api.
Running as daemon: no
[Mar 27 19:57:10][chn6] Using default volkszaehler api.
[Mar 27 19:57:10][mtr4] Number of readers: 32
[Mar 27 19:57:10][mtr4] Config.daemon: 0
[Mar 27 19:57:10][mtr4] Config.local: 1
[Mar 27 19:57:10][exec] MeterExec::read: Calling 'echo "Licht = `gpio -g
read 23`"'
[Mar 27 19:57:10][exec] MeterExec::read: Reading line: 'Licht = 0'
[Mar 27 19:57:10][exec] MeterExec::read: string: Licht, value: 0.000000,
timestamp: -1.000000
[Mar 27 19:57:10][exec] MeterExec::read: Closing process 'echo "Licht =
`gpio -g read 23`"'
[Mar 27 19:57:10][chn6] Adding reading to queue (value=0.00
ts=1522173430960)
[Mar 27 19:57:10][chn6] ==> number of tuples: 1
[Mar 27 19:57:10][chn6] compare: 0 1522173430960
[Mar 27 19:57:10][chn6] JSON request body: [ [ 1522173430960, 0 ] ]
[Mar 27 19:57:10][mtr4] Next reading in 10 seconds
[Mar 27 19:57:11][chn6] CURL Request succeeded with code: 200
[Mar 27 19:57:20][exec] MeterExec::read: Calling 'echo "Licht = `gpio -g
read 23`"'
[Mar 27 19:57:21][exec] MeterExec::read: Reading line: 'Licht = 0'
[Mar 27 19:57:21][exec] MeterExec::read: string: Licht, value: 0.000000,
timestamp: -1.000000
[Mar 27 19:57:21][exec] MeterExec::read: Closing process 'echo "Licht =
`gpio -g read 23`"'
[Mar 27 19:57:21][chn6] Adding reading to queue (value=0.00
ts=1522173441004)
[Mar 27 19:57:21][chn6] ==> number of tuples: 1
[Mar 27 19:57:21][chn6] compare: 1522173430960 1522173441004
[Mar 27 19:57:21][chn6] JSON request body is null. Nothing to send now.
[Mar 27 19:57:21][mtr4] Next reading in 10 seconds
[Mar 27 19:57:31][exec] MeterExec::read: Calling 'echo "Licht = `gpio -g
read 23`"'
[Mar 27 19:57:31][exec] MeterExec::read: Reading line: 'Licht = 0'
[Mar 27 19:57:31][exec] MeterExec::read: string: Licht, value: 0.000000,
timestamp: -1.000000
[Mar 27 19:57:31][exec] MeterExec::read: Closing process 'echo "Licht =
`gpio -g read 23`"'
[Mar 27 19:57:31][chn6] Adding reading to queue (value=0.00
ts=1522173451061)
[Mar 27 19:57:31][chn6] ==> number of tuples: 1
[Mar 27 19:57:31][chn6] compare: 1522173430960 1522173451061
[Mar 27 19:57:31][chn6] JSON request body is null. Nothing to send now.
[Mar 27 19:57:31][mtr4] Next reading in 10 seconds
usw.
3. Der Kanal "Licht" enthält 1 für an und 0 für aus. Er ist vom Typ
"universalsensor" bzw. "Sensor" mit Einheit "An" und wird im Stil
"states" dargestellt.
Feine Sache das! :-D
Schönen Abend
Rupert
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://demo.volkszaehler.org/pipermail/volkszaehler-users/attachments/20180327/dab54790/attachment-0001.html>
More information about the volkszaehler-users
mailing list