2008-09-22 10 views
9

Ho installato owfs e sto provando a leggere i dati su uno iButton temperature logger.Come si usa owfs per leggere un registratore di temperatura iButton?

owfs mi consente di montare l'iButton come un file system di un fusibile e posso vedere tutti i dati. Sto avendo problemi a capire qual è il modo migliore per accedere ai dati però. Posso ottenere letture individuali per cat ting i file, ad es. cat onewire/{deviceid}/log/temperature.1, ma il file onewire/{deviceid}/log/temperature.ALL è "danneggiato" (possibile troppo grande, poiché histogram/temperature.ALL funziona correttamente).

Uno script python per leggere tutti i file sembra funzionare ma richiede molto tempo. C'è un modo migliore per farlo? Qualcuno ha qualche esempio?

Utilizzo Ubuntu 8.04 e non è stato possibile avviare l'applicazione java "one wire viewer".

Aggiornamento: Usando owpython (installato con owfs), posso ottenere la temperatura attuale, ma non riesce a capire come ottenere l'accesso ai dati registrati:

>>> import ow 
>>> ow.init("u") # initialize USB 
>>> ow.Sensor("/").sensorList() 
[Sensor("/81.7FD921000000"), Sensor("/21.C4B912000000")] 
>>> x = ow.Sensor("/21.C4B912000000") 
>>> print x.type, x.temperature 
DS1921   22 

x.log dà un AttributeError.

risposta

2

Non penso ci sia un modo intelligente. owpython non supporta questa descrizione dalla documentazione dell'API. Immagino che /proc sia la tua scommessa più sicura. Magari dai un'occhiata all'origine del modulo owpython e controlla se riesci a scoprire come funziona.

+0

non ero in grado di trovare alcuna documentazione diversa dalle docstring. C'è niente altro? – Tom

3

Ho anche avuto problemi con owfs. Ho trovato che si tratta di una soluzione ipersensibile a quello che è un problema semplice. Ora sto usando il codice DigiTemp senza problemi. L'ho trovato flessibile e affidabile. Per esempio, devo conservare la temperatura della stanza in un file di log ogni minuto eseguendo

/usr/local/bin/digitemp_DS9097U -c /usr/local/etc/digitemp.conf \ 
    -q -t0 -n0 -d60 -l/var/log/temperature 

Per raggiungere quel punto ho scaricato il file di origine, sterrata e poi fatto la seguente.

# Compile the hardware-specific command 
make ds9097u 
# Initialize the configuration file 
./digitemp_DS9097U -s/dev/ttyS0 -i 
# Run command to obtain temperature, and verify your setup 
./digitemp_DS9097U -a 
# Copy the configuration file to an accessible place 
cp .digitemprc /usr/local/etc/digitemp.conf 

Ho anche modificato manualmente il file di configurazione per adattarlo alla mia configurazione. Questo è come è finito.

TTY /dev/ttyS0 
READ_TIME 1000 
LOG_TYPE 1 
LOG_FORMAT "%b %d %H:%M:%S Sensor %s C: %.2C F: %.2F" 
CNT_FORMAT "%b %d %H:%M:%S Sensor %s #%n %C" 
HUM_FORMAT "%b %d %H:%M:%S Sensor %s C: %.2C F: %.2F H: %h%%" 
SENSORS 1 
ROM 0 0x10 0xD3 0x5B 0x07 0x00 0x00 0x00 0x05 

Nel mio caso ho anche creato un file /etc/init.d/digitemp e abilitati per eseguire all'avvio.

#! /bin/sh 
# 
# System startup script for the temperature monitoring daemon 
# 
### BEGIN INIT INFO 
# Provides: digitemp 
# Required-Start: 
# Should-Start: 
# Required-Stop: 
# Should-Stop: 
# Default-Start: 2 3 5 
# Default-Stop: 0 1 6 
# Description: Start the temperature monitoring daemon 
### END INIT INFO 

DIGITEMP=/usr/local/bin/digitemp_DS9097U 
test -x $DIGITEMP || exit 5 

DIGITEMP_CONFIG=/root/digitemp.conf 
test -f $DIGITEMP_CONFIG || exit 6 

DIGITEMP_LOGFILE=/var/log/temperature 

# Source SuSE config 
. /etc/rc.status 

rc_reset 
case "$1" in 
    start) 
     echo -n "Starting temperature monitoring daemon" 
     startproc $DIGITEMP -c $DIGITEMP_CONFIG -q -t0 -n0 -d60 -l$DIGITEMP_LOGFILE 
     rc_status -v 
     ;; 
    stop) 
     echo -n "Shutting down temperature monitoring daemon" 
     killproc -TERM $DIGITEMP 
     rc_status -v 
     ;; 
    try-restart) 
     $0 status >/dev/null && $0 restart 
     rc_status 
     ;; 
    restart) 
     $0 stop 
     $0 start 
     rc_status 
     ;; 
    force-reload) 
     $0 try-restart 
     rc_status 
     ;; 
    reload) 
     $0 try-restart 
     rc_status 
     ;; 
    status) 
     echo -n "Checking for temperature monitoring service" 
     checkproc $DIGITEMP 
     rc_status -v 
     ;; 
    *) 
     echo "Usage: $0 {start|stop|status|try-restart|restart|force-reload|reload}" 
     exit 1 
     ;; 
esac 
rc_exit 
+0

Grazie per le informazioni, ma non credo che questo aiuti a ottenere l'accesso al registro memorizzato sul DS1922T. Posso leggere la temperatura corrente usando owpython o owfs, è solo l'accesso alle misure memorizzate con cui sto lottando. – Tom