Temperaturen

Das Thema hatte ich ja noch aus der wandboard-Aktion offen. Da der Server direkt an der Wand zum Wohnzimmer steht, habe ich einfach zwei USB-Sticks gekauft, einen davon mit Messfuehler an etwa 30cm Kabel, dazu noch einen passiven USB-Hub und das Ganze ans Wandboard gesteckt. Den Temperatur-Fuehler natuerlich durch die Wand ins Wohnzimmer.

Die Temperatur-Fuehler finden sich unter den Stichwort “temper usb” und kosten so um die 10 EUR pro Stueck. Die noetige Software findet sich in diversen Varianten unter der Bezeichnung “pcsensor” auf github. Da ich ja mehrere Sticks habe, habe ich mir eine Variante gesucht, die das auch unterstuetzt: https://github.com/padelt/pcsensor-temper.git

Ein munin-plugin war auch wiedermal kein Problem und schon entstanden schöne Graphen. Ganz besondere Graphen: die Temperaturen in meiner Wohnung schwanken doch erheblich musste ich festellen, um gut 5 Grad innerhalb weniger Minuten. Vor allem wunderbar synchron: wurdes es im Arbeitszimmer kalt, so wurde es im Wohnzimmer warm. Und umgekehrt. (Man muss wissen, dass das ganze Rechner-Geraffel im Arbeitszimmer in einer Ecke steht, dort es natuergemaess immer schön warm, während im Wohnzimmer nur Abends geheizt wird). Anscheinend tauschen die beiden Sticks ab und an ihre Anzeigen. Das kann natuerlich nicht sein, also mal geforscht und folgende Nettigkeit gefunden:


Feb 13 15:10:01 wandboard CRON[6959]: (munin) CMD (if [ -x /usr/bin/munin-cron ]; then /usr/bin/munin-cron; fi)
Feb 13 15:10:20 wandboard kernel: [2244286.093234] usb 2-1.4: USB disconnect, device number 61
Feb 13 15:10:20 wandboard kernel: [2244286.465417] usb 2-1.4: new low speed USB device number 63 using fsl-ehci
Feb 13 15:10:20 wandboard kernel: [2244286.608508] input: RDing TEMPerV1.4 as /devices/platform/fsl-ehci.1/usb2/2-1/2-1.4/2-1.4:1.0/input/input58

Also munin läuft los und daraufhin verliert der temper-Stick den Kontakt und muss neu initialisiert werden. Offenbar verändert sich dabei auch die Reihenfolge, in der die Devices von der libusb gefunden werden. Dem pcsensor gebe ich aber nur eine Nummerierung mit.

Problem erkannt, aber wie lösen. Ich habe eine ganze Weile auf die Ausgabe von lsusb gestarrt, erst ein diff brachte die Lösung: im Feld iProduct unterscheiden sich beide Sticks durch ein char. Was ein Glück. Also pcsensor schnell gepatcht: https://github.com/valpo/pcsensor-temper: pcsensor -s findet jetzt den richtigen Stick.

Übrigends kann man in der libusb-1.0 schauen, an welchem Port ein device sitzt, laut doc soll sich dieser Wert nie ändern. pcsensor nutzt leider noch libusb-0.1, dort habe ich sowas nicht gefunden. Und portieren ging auch nicht – das Ubuntu auf dem wandboard hat zwar eine libusb-1.0, aber die ist entweder völlig veraltert oder kaputt. Da das Problem für mich gelöst ist, habe ich die Sache erstmal auf Eis gelegt, wer eine Portierung braucht kann sich ja melden.

Bleibt noch das Problem mit dem usb-reset – in solchen Fällen bekommt man natürlich statt eines Wertes nur eine Fehlermeldung vom device. Also noch schnell das munin-plugin angepasst (if in doubt use brute force):

#!/bin/bash
case $1 in
config)
cat <<'EOM'
graph_title External temperature (living room)
graph_vlabel temperature temperature.label C
temperature.warning 30
temperature.critical 35
EOM
exit 0;;
esac

printf "temperature.value "
tmp="xUSBx"
while [[ $tmp =~ .*(USB|not).* ]]; do
tmp="$(/usr/local/bin/pcsensor -sTEMPerV1.4 -cm 2>&1 | head -n1)"
done
echo $tmp

Das tut es erstmal.