Mit fowsr die Daten der Wetterstation PCE FWS 20 auslesen

Die Tage stolperte ich über fowsr. Dabei handelt es sich über eine kleine Programmsammlung zum Auslesen und Verteilen der Daten aus verschiedenen Wetterstationen. Zu den unterstützten Stationen gehört neben meiner PCE FWS 20 auch folgende Typen:

Da ich mir gerade ein Laptop mit Ubuntu 12.04 LTS (beta) Precise Pangolin fertig gemacht hatte, war das doch der ideale Rechner, um fowsr auszuprobieren.

Doch nach einem einfachen make gab’s folgende Fehlermeldungen:

gcc    -c -o fowsr.o fowsr.c
fowsr.c: In function ‘CWS_print_decoded_data’:
fowsr.c:279:3: warning: format not a string literal and no format arguments [-Wformat-security]
fowsr.c: In function ‘CWS_decode’:
fowsr.c:477:4: warning: format ‘%x’ expects argument of type ‘unsigned int’, but argument 3 has type ‘double’ [-Wformat]
fowsr.c: In function ‘CWF_Write’:
fowsr.c:602:6: warning: field width used with ‘%A’ gnu_strftime format [-Wformat]
fowsr.c:602:6: warning: field width used with ‘%A’ gnu_strftime format [-Wformat]
gcc -lusb -lm -o fowsr  fowsr.o
fowsr.o: In function `list_devices':
fowsr.c:(.text+0x11d): undefined reference to `usb_get_busses'
fowsr.o: In function `find_device':
fowsr.c:(.text+0x188): undefined reference to `usb_get_busses'
fowsr.o: In function `CUSB_Open':
fowsr.c:(.text+0x200): undefined reference to `usb_init'
fowsr.c:(.text+0x20c): undefined reference to `usb_set_debug'
fowsr.c:(.text+0x211): undefined reference to `usb_find_busses'
fowsr.c:(.text+0x216): undefined reference to `usb_find_devices'
fowsr.c:(.text+0x267): undefined reference to `usb_open'
fowsr.c:(.text+0x2d5): undefined reference to `usb_get_driver_np'
fowsr.c:(.text+0x327): undefined reference to `usb_detach_kernel_driver_np'
fowsr.c:(.text+0x359): undefined reference to `usb_claim_interface'
fowsr.c:(.text+0x3a0): undefined reference to `usb_set_altinterface'
fowsr.c:(.text+0x402): undefined reference to `usb_get_descriptor'
fowsr.c:(.text+0x437): undefined reference to `usb_get_descriptor'
fowsr.c:(.text+0x46c): undefined reference to `usb_get_descriptor'
fowsr.c:(.text+0x487): undefined reference to `usb_release_interface'
fowsr.c:(.text+0x4c2): undefined reference to `usb_set_configuration'
fowsr.c:(.text+0x4dd): undefined reference to `usb_claim_interface'
fowsr.c:(.text+0x518): undefined reference to `usb_set_altinterface'
fowsr.c:(.text+0x565): undefined reference to `usb_control_msg'
fowsr.c:(.text+0x59a): undefined reference to `usb_get_descriptor'
fowsr.o: In function `CUSB_Close':
fowsr.c:(.text+0x5d4): undefined reference to `usb_release_interface'
fowsr.c:(.text+0x628): undefined reference to `usb_close'
fowsr.o: In function `CUSB_read_block':
fowsr.c:(.text+0x708): undefined reference to `usb_control_msg'
fowsr.c:(.text+0x737): undefined reference to `usb_interrupt_read'
fowsr.o: In function `CUSB_write_byte':
fowsr.c:(.text+0x7ef): undefined reference to `usb_control_msg'
fowsr.c:(.text+0x81e): undefined reference to `usb_interrupt_write'
fowsr.c:(.text+0x84d): undefined reference to `usb_interrupt_read'
fowsr.o: In function `CUSB_write_block':
fowsr.c:(.text+0x900): undefined reference to `usb_control_msg'
fowsr.c:(.text+0x92f): undefined reference to `usb_interrupt_write'
fowsr.c:(.text+0x95e): undefined reference to `usb_interrupt_read'
fowsr.o: In function `CWS_dew_point':
fowsr.c:(.text+0x10e7): undefined reference to `log'
collect2: ld returned 1 exit status
make: *** [fowsr] Error 1

Das sah gar nicht gut aus. Irgendetwas passte beim Linken nicht. Also habe ich erstmal ein wenig gegoogelt. Angeblich setzt fowsr libusb in der Version 0.1 voraus. Ich hatte sowohl die Pakete libusb-0.1-4 wie auch libusb-1.0-0 installiert. Für letzteres auch das Developer Paket.

Nun gut, da das nicht zum Erfolg führte, habe ich mir die libusb in der Version 0.1 unter /opt installiert.

Auch dann funktionierte das Kompilieren und Linken in einem Schritt nicht. Daher habe ich es manuell gebaut:

gcc -I/opt/include -L/opt/lib -lm -lusb fowsr.c -c -o fowsr.o
gcc -o fowsr ./fowsr.o -lusb -lm

Nachher fiel mir dann auf, dass es auch in einem Rutsch geht, wenn man die Optionen in der richtigen Reihenfolge setzt:

> gcc -o fowsr -I/opt/include -L/opt/lib  fowsr.c  -lm -lusb
fowsr.c: In function ‘CWS_print_decoded_data’:
fowsr.c:279:3: warning: format not a string literal and no format arguments [-Wformat-security]
fowsr.c: In function ‘CWS_decode’:
fowsr.c:477:4: warning: format ‘%x’ expects argument of type ‘unsigned int’, but argument 3 has type ‘double’ [-Wformat]
fowsr.c: In function ‘CWF_Write’:
fowsr.c:602:6: warning: field width used with ‘%A’ gnu_strftime format [-Wformat]
fowsr.c:602:6: warning: field width used with ‘%A’ gnu_strftime format [-Wformat]

Der erste Schritt war also getan. Nun ging es ans Auslesen.

Wichtig hierfür ist, dass das Programm nach /var schreiben kann. Dort wird das Ausgabe-File angelegt. Man kann dies nur im Quellcode überschreiben, wenn man will. Per Option geht das zur Laufzeit nicht mehr.

Wenn die Daten nun ausgelesen werden können, steht nun an, die Daten auch zu veröffentlichen. Dazu werden bei fowsr zwei Skripte mitgeliefert, die die Daten zum einen zu Weatherunderground, zum anderen zu PWSWeather schicken, sofern man dort jeweils einen Account hat.

Ich habe mich zunächst für Weatherunderground entschieden. Dort werden zum Beispiel diese Grafiken dann bereitgestellt:

One thought on “Mit fowsr die Daten der Wetterstation PCE FWS 20 auslesen”

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind markiert *