Skip to content
RealMerlin edited this page Feb 2, 2018 · 8 revisions

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

Abfragen

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.

Frames mit 16Bit Werten interpretieren

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

Anwenungsbeispiel: Graphik der Aussentemperatur

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:

aussentemp

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

aussentemp-januar

Wenn man das Ganze jetzt noch in einen Cronjob und etwas HTML verpackt, hat man eine nette kleine Wetterstationsseite :-)

Clone this wiki locally