<html>
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
  </head>
  <body text="#000000" bgcolor="#FFFFFF">
    <p>Hallo nochmal,<br>
    </p>
    <br>
    <div class="moz-cite-prefix">Am 25.03.2018 um 15:23 schrieb Rupert
      Schöttler:<br>
    </div>
    <blockquote type="cite"
      cite="mid:6c7a5743-fe58-7f1d-63b1-d0ee086fe1bc@gmx.de">
      <pre wrap="">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.
</pre>
    </blockquote>
    <br>
    Hier eine funktionierende Lösung mit dem Protokoll "exec".<br>
    <br>
    1. vzlogger neu kompilieren mit dem Kompiler-Schalter
    -DMETEREXEC_ROOTACCESS=true. <br>
    Gemäß
<a class="moz-txt-link-freetext" href="https://wiki.volkszaehler.org/software/controller/vzlogger/installation_cpp-version#build_von_hand">https://wiki.volkszaehler.org/software/controller/vzlogger/installation_cpp-version#build_von_hand</a>,
    Abschnitt "Building vzlogger", aber mit <br>
    <pre class="code">cmake -DMETEREXEC_ROOTACCESS=true ..
</pre>
    statt nur "cmake ..". Das Ganze dauert ein Weilchen.<br>
    <br>
    2. Meine vzlogger-conf von vorgestern war nicht 100% korrekt zur
    Nutzung dieses Protokolls. So funktioniert's:<br>
    <br>
    <tt>    {    // #4: Light sensor by exec:</tt><tt><br>
    </tt><tt><br>
    </tt><tt>            "enabled": true,      // disabled meters will
      be ignored</tt><tt><br>
    </tt><tt>            "allowskip": true,    // if enabled, errors
      when opening meter will lead to meter being ignored</tt><tt><br>
    </tt><tt>            "protocol": "exec",</tt><tt><br>
    </tt><tt>            "command": "echo \"Licht = `gpio -g read
      23`\"", // is the command line as you'll type it in the shell</tt><tt><br>
    </tt><tt>                       "format": "$i = $v",  // a format
      string for parsing complex logfiles</tt><tt><br>
    </tt><tt>                                             // arbitrary
      text and whitespaces are allowed, see 'scanf()'</tt><tt><br>
    </tt><tt>                                             // at least $v
      has to be used</tt><tt><br>
    </tt><tt>                                             // $i =>
      identifier, $v => value, $t => timestamp</tt><tt><br>
    </tt><tt>            "interval": 10,</tt><tt><br>
    </tt><tt>            "channel": {</tt><tt><br>
    </tt><tt>                 // Kellerlicht:</tt><tt><br>
    </tt><tt>                "uuid": "my_uuid_9fe3",</tt><tt><br>
    </tt><tt>                "identifier": "Licht", // identifier
      mandatory!?!</tt><tt><br>
    </tt><tt>                "duplicates": 3600,    // duplicates only
      very 3600 sec (1h)</tt><tt><br>
    </tt><tt>                "middleware": <a class="moz-txt-link-rfc2396E" href="http://ras3/middleware.php">"http://ras3/middleware.php"</a></tt><tt><br>
    </tt><tt>            }</tt><tt><br>
    </tt><tt>    }    // meter #4: Light sensor</tt><tt><br>
    </tt><br>
    Das Kommando kommt nun ohne Shell-Skript aus. Man beachte den
    Backslash, damit das Anführungszeichen in den Kommandostring
    übergeben wird.<br>
    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.<br>
    <br>
    Auszug aus dem logfile:<br>
    <tt>pi@ras2:~ $ grep -iE "(mtr4|chn6|exec|9fe3)"
      /var/log/vzlogger.log<br>
      [Mar 27 19:57:10][mtr4] Creating new meter with protocol exec.<br>
      [Mar 27 19:57:10][exec] MeterExec::MeterExec: Parsed format string
      "$i = $v" => "%2$ms = %1$lf"<br>
      [Mar 27 19:57:10][mtr4] Meter configured, enabled.<br>
      [Mar 27 19:57:10]       New meter initialized (protocol=exec)<br>
      [Mar 27 19:57:10][chn6] New channel initialized (uuid=...159fe3
      api=volkszaehler id=Licht)<br>
      [Mar 27 19:57:10][exec] MeterExec::open: MeterExec protocol is
      compiled with root privileges!<br>
      [Mar 27 19:57:10][exec] MeterExec::open: Testing command line
      'echo "Licht = `gpio -g read 23`"': Success<br>
      [Mar 27 19:57:10][mtr4] Meter connection established<br>
      [Mar 27 19:57:10][mtr4] Meter thread started<br>
      [Mar 27 19:57:10][mtr4] Meter is opened. Starting channels.<br>
      [Mar 27 19:57:10][chn6] Logging thread started<br>
      [Mar 27 19:57:10][chn6] Start logging thread for volkszaehler-api.
      Running as daemon: no<br>
      [Mar 27 19:57:10][chn6] Using default volkszaehler api.<br>
      [Mar 27 19:57:10][mtr4] Number of readers: 32<br>
      [Mar 27 19:57:10][mtr4] Config.daemon: 0<br>
      [Mar 27 19:57:10][mtr4] Config.local: 1<br>
      [Mar 27 19:57:10][exec] MeterExec::read: Calling 'echo "Licht =
      `gpio -g read 23`"'<br>
      [Mar 27 19:57:10][exec] MeterExec::read: Reading line: 'Licht = 0'<br>
      [Mar 27 19:57:10][exec] MeterExec::read: string: Licht, value:
      0.000000, timestamp: -1.000000<br>
      [Mar 27 19:57:10][exec] MeterExec::read: Closing process 'echo
      "Licht = `gpio -g read 23`"'<br>
      [Mar 27 19:57:10][chn6] Adding reading to queue (value=0.00
      ts=1522173430960)<br>
      [Mar 27 19:57:10][chn6] ==> number of tuples: 1<br>
      [Mar 27 19:57:10][chn6] compare: 0 1522173430960<br>
      [Mar 27 19:57:10][chn6] JSON request body: [ [ 1522173430960, 0 ]
      ]<br>
      [Mar 27 19:57:10][mtr4] Next reading in 10 seconds<br>
      [Mar 27 19:57:11][chn6] CURL Request succeeded with code: 200<br>
      [Mar 27 19:57:20][exec] MeterExec::read: Calling 'echo "Licht =
      `gpio -g read 23`"'<br>
      [Mar 27 19:57:21][exec] MeterExec::read: Reading line: 'Licht = 0'<br>
      [Mar 27 19:57:21][exec] MeterExec::read: string: Licht, value:
      0.000000, timestamp: -1.000000<br>
      [Mar 27 19:57:21][exec] MeterExec::read: Closing process 'echo
      "Licht = `gpio -g read 23`"'<br>
      [Mar 27 19:57:21][chn6] Adding reading to queue (value=0.00
      ts=1522173441004)<br>
      [Mar 27 19:57:21][chn6] ==> number of tuples: 1<br>
      [Mar 27 19:57:21][chn6] compare: 1522173430960 1522173441004<br>
      [Mar 27 19:57:21][chn6] JSON request body is null. Nothing to send
      now.<br>
      [Mar 27 19:57:21][mtr4] Next reading in 10 seconds<br>
      [Mar 27 19:57:31][exec] MeterExec::read: Calling 'echo "Licht =
      `gpio -g read 23`"'<br>
      [Mar 27 19:57:31][exec] MeterExec::read: Reading line: 'Licht = 0'<br>
      [Mar 27 19:57:31][exec] MeterExec::read: string: Licht, value:
      0.000000, timestamp: -1.000000<br>
      [Mar 27 19:57:31][exec] MeterExec::read: Closing process 'echo
      "Licht = `gpio -g read 23`"'<br>
      [Mar 27 19:57:31][chn6] Adding reading to queue (value=0.00
      ts=1522173451061)<br>
      [Mar 27 19:57:31][chn6] ==> number of tuples: 1<br>
      [Mar 27 19:57:31][chn6] compare: 1522173430960 1522173451061<br>
      [Mar 27 19:57:31][chn6] JSON request body is null. Nothing to send
      now.<br>
      [Mar 27 19:57:31][mtr4] Next reading in 10 seconds<br>
      <br>
    </tt>usw.<br>
    <br>
    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.<br>
    <br>
    Feine Sache das! <span class="moz-smiley-s5"><span>:-D</span></span><br>
    <br>
    Schönen Abend <br>
    Rupert<br>
  </body>
</html>