-
Notifications
You must be signed in to change notification settings - Fork 6
hcandq
hcandq (HCAN Data Query) kann Dumpfiles, welche mit dem hcanswd geschrieben wurden, analysieren. Folgende Optionen stehen zur Verfuegung:
$ hcandq
hcandq options:
-h [ --help ] shows the available options
-i [ --in ] arg standard mode: file to query
-q [ --query ] arg query expression
-l [ --last ] arg show last n frames of query
-n [ --numeric ] numeric output
--nocolor no color
-I [ --interpret ] interpret frames
Beispiele:
Abfrage der letzten 2 Frames, die geloggt wurden:
$ hcandq -i /var/hcan/hdump/20090207.hdump -l 2
Sat Feb 7 14:12:41 2009 0518 -> 0401 :SFP HMS PING_REQUEST
Sat Feb 7 14:12:41 2009 0401 -> 0518 :SFP HMS PING_REPLAY
Abfrage der letzten 2 Frames, die vom Service "HES" waren:
$ hcandq -i /var/hcan/hdump/20090207.hdump -q 'd0 5 = ' -l 2
Sat Feb 7 14:14:33 2009 0407 -> 0036 :SFP HES 1WIRE_TEMPERATURE gruppe:160 temp_hi:1 temp_lo:21
Sat Feb 7 14:14:43 2009 0407 -> 0036 :SFP HES HEIZUNG_WAERMEBEDARF_INFO id:161 value:0
Das Gleiche nochmal, diesmal aber die Frames roh anzeigen:
$ hcandq -i /var/hcan/hdump/20090207.hdump -q 'd0 5 = ' -l 2 -n
Sat Feb 7 14:15:01 2009 0408 -> 0036 :1 [ 0x05 0x22 0xa4 0x01 0x31 ]
Sat Feb 7 14:15:02 2009 0402 -> 0036 :1 [ 0x05 0x22 0x0b 0x00 0x31 ]
Hat gestern das Board mit der Adresse 407 gebootet?
$ hcandq -i /var/hcan/hdump/20090206.hdump -q 'src 407 = d0 4 = && d1 1 = &&'
Fri Feb 6 07:54:05 2009 0407 -> 0040 :SFP SLS BOOT_RESETFLAG_LOG flag:8
Wann war heute der Reedkontakt 161 offen?
$ hcandq -i /var/hcan/hdump/20090207.hdump -q 'd0 5 = d1 43 = && d2 161 = &&'
Sat Feb 7 10:41:34 2009 0407 -> 0036 :SFP HES REEDKONTAKT_STATE_CHANGE gruppe:161 state:1
Sat Feb 7 11:12:27 2009 0407 -> 0036 :SFP HES REEDKONTAKT_STATE_CHANGE gruppe:161 state:0
Wie man an den Beispielen erkennen kann, lassen sich mit dem '-q' Parameter recht komplexe Abfragen realisieren. Es wird die RPN (reverse polish notation) verwendet, da sie sehr einfach parsebar ist. Es gibt Operanden und Operatoren. Operanden sind z.B. 'src', 'd0', Zahlen etc. Operatoren sind '=', '&&' etc.
Der Ausdruck stellt eine Liste von Operanden und Operatoren dar. Jeder Operand wird auf den Stack geschoben, und jeder Operator fuehrt eine Operation auf dem Stack aus.
| Operand | Beschreibung
| ------- | ------------
| src | Quelladresse
| dst | Zieladresse
| proto | Protokoll-ID
| size | Anzahl der Daten-Bytes
| d0 | Datenbyte 0
| d1 | ..
| d2 | ..
| d3 | ..
| d4 | ..
| d5 | ..
| d6 | ..
| d7 | ..
| Ganzzahl | Wert der Zahl
| Operator | Beschreibung
| -------- | ------------
| = | vergleicht stack[top] mit stack[top-1] und legt das Ergebnis auf den Stack
| != | negierter Vergleich
| ! | schreibt den logisch negierten Wert von stack[top] auf den Stack
| & | bitweises AND von stack[top] mit stack[top-1], Ergebnis auf den Stack
| && | logisches AND von stack[top] mit stack[top-1], Ergebnis auf den Stack
| | | bitweises OR von stack[top] mit stack[top-1], Ergebnis auf den Stack
| || | logisches OR von stack[top] mit stack[top-1], Ergebnis auf den Stack
Hinweis: Alle Operatoren nehmen die Operanden vom Stack, bevor sie das Ergebnis draufschieben!
Und wo bekommt man nun die Infos zu den Frames her?
Ganz einfach: aus der xml/hcan-protocols.xml bzw. /usr/share/hcan/hcan-protocol.xml. Wie das Protokoll genau aufgebaut ist, findet sich in hcan-protocol.
Eine in manchen Faellen (1WIRE_TEMPERATURE und HELLIGKEITS_INFO) sehr hilfreiche Funktion ist das Interpretieren von Frames (Parameter '-I'). Beispiel:
$ hcandq -i /var/hcan/hdump/20090207.hdump -q 'd0 5 = d1 34 = &&' -l2
Sat Feb 7 15:09:03 2009 0401 -> 0036 :SFP HES 1WIRE_TEMPERATURE gruppe:1 temp_hi:0 temp_lo:146
Sat Feb 7 15:09:04 2009 0406 -> 0036 :SFP HES 1WIRE_TEMPERATURE gruppe:71 temp_hi:1 temp_lo:47
$ hcandq -i /var/hcan/hdump/20090207.hdump -q 'd0 5 = d1 34 = &&' -l2 -I
Sat Feb 7 15:09:04 2009 tempsensor: 71 temp: 18.9375
Sat Feb 7 15:09:08 2009 tempsensor: 72 temp: 17.9375
und
$ hcandq -i /run/hcan/hdump/20180128.hdump -q 'd0 5 = d1 71 = &&' -l2
Sun Jan 28 19:17:08 2018 0348 -> 0035 :SFP HES HELLIGKEITS_INFO gruppe:145 brightness_hi:0 brightness_lo:7
Sun Jan 28 19:18:09 2018 0348 -> 0035 :SFP HES HELLIGKEITS_INFO gruppe:145 brightness_hi:0 brightness_lo:7
$ hcandq -i /run/hcan/hdump/20180128.hdump -q 'd0 5 = d1 71 = &&' -l2 -I
Sun Jan 28 19:17:08 2018 helligkeitssensor: 145 helligkeit: 7
Sun Jan 28 19:18:09 2018 helligkeitssensor: 145 helligkeit: 7
Es werden die letzten 300 1WIRE_TEMPERATURE Frames des Sensors 10 interpretiert in die Datei temp.log geschrieben.
Dann wird gnuplot verwendet, um eine Graphik zu erzeugen:
$ hcandq -i /var/hcan/hdump/20090207.hdump -q 'd0 5 = d1 34 = && d2 10 = &&' -l 300 --nocolor -I > temp.log
$ gnuplot -background coral << EOF
set xdata time
set timefmt "%H:%M:%S"
set format x "%H:%M"
set output "aussentemp.png"
set terminal png
set ylabel "Grad Celsius"
set term png size 700, 200 xeeeeee x770000 x0000ff
set grid xtics ytics
plot "temp.log" using 4:9 title "Aussentemperatur" with lines
EOF
Das Ergebnis:
Auch eine Uebersicht ueber den Januar ist kein Problem:
$ for i in /var/hcan/hdump/200901*.hdump; do
> hcandq -i $i -q 'd0 5 = d1 34 = && d2 10 = &&' --nocolor -I;
> done > temp.log
$ gnuplot -background coral << EOF
set xdata time
set timefmt "%d %H:%M:%S"
set format x "%d"
set output "aussentemp-januar.png"
set terminal png
set ylabel "Grad Celsius"
set term png size 700, 200 xeeeeee x770000 x0000ff
set grid xtics ytics
plot "temp.log" using 3:9 title "Aussentemperatur im Januar 2009" with lines
EOF
Wenn man das Ganze jetzt noch in einen Cronjob und etwas HTML verpackt, hat man eine nette kleine Wetterstationsseite :-)
-
Tutorials
-
FAQ
-
Referenz
- Konzepte
- Hardware
- Software/PC
- Software/Firmware
- Patches
- EDS - EEPROM Data System
- HCAN Protokoll
- HCAN Protokoll - Referenz