Met de flukso v2b kan ik ook de datastroom aftappen die de slimme meter levert aan de flukso. Die gegevens worden weergegeven in een datapakket dat ze telegram noemen. Dat telegram wordt iedere 10 seconden geleverd, en bevat de volgende gegevens:


0-0:96.1.1(4B413XXXXXXXXXXXXXXXXXXXXXXXXXXX)           - stroommeter serial (HEX ascii)
1-0:1.8.1(10435.217*kWh)                               - laag tarief meter geleverd
1-0:1.8.2(10317.329*kWh)                               - hoog tarief meter geleverd
1-0:2.8.1(00000.003*kWh)                               - laag tarief meter retour
1-0:2.8.2(00000.001*kWh)                               - hoog tarief meter retour
0-0:96.14.0(0001)                                      - tarief indicator (0001 - laag   0002 - hoog)
1-0:1.7.0(0000.60*kW)                                  - huidig verbruik
1-0:2.7.0(0000.00*kW)                                  - huidige teruglevering
0-0:17.0.0(0999.00*kW)                                 - maximum stroom per fase
0-0:96.3.10(1)                                         - stand schakelaar (1 = aan)
0-0:96.13.1()                                          - bericht numeriek
0-0:96.13.0()                                          - bericht tekst
0-1:24.1.0(3)                                          - andere apparaten op de M-bus
0-1:96.1.0(32383XXXXXXXXXXXXXXXXXXXXXXXXXXXXX)         - gasmeter , serial
0-1:24.3.0(140906160000)(00)(60)(1)(0-1:24.2.1)(m3)    - gasmeterstand, laatste doorgifte moment (14-09-06 16:00)
(03414.918)                                            - gasmeterstand, totaal in m3
0-1:24.4.0(1)                                          - stand gasklep (1 = aan)


Er zitten een paar dingen in, zo kun je zien dat in theorie de gasmeter en stroommeter of afstand af te sluiten zijn.

Mij ging het hier om de meterstanden, en die zitten er in.
Ophalen gaat als volgt, hiervoor gebruik ik een linux-machine:

- met een expect script inloggen, en een cat doen van de seriële poort waar de  slimme meter aangesloten is:

cat /dev/ttyS0 | head -30

- data afvangen in een script, alleen het laatste telegram er uit halen en dat uit elkaar rafelen.

De uitdagingen zaten in het feit dat een cat van de seriële poort natuurlijk nooit ophoudt, en daarmee zou het script nooit aan een eind komen. Daarvoor heb ik de timeout van expect gebruikt, na 25 seconden wordt het script gewoon afgeknipt, en dan hebben we ook genoeg data. Een nadeel is, dat het niet snel is, het duurt echt 25 seconden voordat je output hebt. Deze data gebruik in om iedere dag de meterstand op te vragen en die vast te leggen in een tabel.

expect-script:


#!/usr/bin/expect -f
#
# fetch one telegram (and probably more)
#

set timeout 25
spawn ssh Dit e-mailadres wordt beveiligd tegen spambots. JavaScript dient ingeschakeld te zijn om het te bekijken.
# Dit e-mailadres wordt beveiligd tegen spambots. JavaScript dient ingeschakeld te zijn om het te bekijken.'s password:
expect " password: "
# default password, you should change that
send "root\r"
expect "~# "

#
# Start logging to file

log_file -noappend /tmp/telegram.out

#
# only fetch 30 lines, should include one complete telegram

send "cat /dev/ttyS0 | head -30 \r"
expect "~# "

#
# End logging
log_file

send "exit\r"

Mijn flukso heeft een vast ip-adres.

shell-script dat alles aanroept:

#!/bin/bash

#
# get data, create output-file /tmp/telegram.out

/path_to_expect_script/expect_script > /dev/null 2>&1

#
# Strip to only one telegram

cat /tmp/telegram.out | grep -A20 "\!" > /tmp/telegram.clean

grep "1-0:1.8.1" /tmp/telegram.clean | sed "s/.*(/Laag meterstand /;s/).*//;s/\*/ /"
grep "1-0:1.8.2" /tmp/telegram.clean | sed "s/.*(/Hoog meterstand /;s/).*//;s/\*/ /"
grep "1-0:1.7.0" /tmp/telegram.clean | sed "s/.*(/Huidig verbruik /;s/).*//;s/\*/ /"
grep "0-0:96.14.0" /tmp/telegram.clean | sed "s/.*(//;s/).*//;s/\*/ /"| awk '{ if ($1 eq '0001') print "Huidig tarief Laag"; else print "Huidig tarief Hoog" } '

# Gas
grep "0-1:24.3.0" /tmp/telegram.clean | awk '{ print "gasmeter data doorgegeven op " substr($1,16,2)"-"substr($1,14,2)"-"substr($1,12,2)" "substr($1,18,2)":"substr($1,20,2)":"substr($1,22,2) }'
grep "^(" /tmp/telegram.clean | sed "s/.*(/Gas meterstand /;s/).*//;s/\*/ /"

en de uitvoer is dan:


Laag meterstand 10435.217 kWh
Hoog meterstand 10317.329 kWh
Huidig verbruik 0000.60 kW
Huidig tarief Laag
gasmeter data doorgegeven op 06-09-14 16:00:00
Gas meterstand 03414.918

Hiermee is het niet moeilijk meer de data toe te voegen aan een tabel. Om de ssh-aanroep mogelijk te maken, heb ik dat aangezet (zie hier). Hints over hoe je dit kunt doen zonder flukso vind je bijvoorbeeld hier.