Friday, February 11, 2011

How do I use owfs to read an iButton temperature logger?

I've installed owfs and am trying to read the data off a iButton temperature logger.

owfs lets me mount the iButton as a fuse filesystem and I can see all the data. I'm having trouble figuring out what is the best way to access the data though. I can get individual readings by catting the files, e.g. cat onewire/{deviceid}/log/temperature.1, but the onewire/{deviceid}/log/temperature.ALL file is "broken" (possible too large, as histogram/temperature.ALL work fine).

A python script to read all files seems to work but takes a very long time. Is there a better way to do it? Does anyone have any examples?

I'm using Ubuntu 8.04 and couldn't get the java "one wire viewer" app to run.

Update: Using owpython (installed with owfs), I can get the current temperature but can't figure out how to get access to the recorded logs:

>>> 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 gives an AttributeError.

  • I don't think there is a clever way. owpython doesn't support that telling from the API documentation. I guess /proc is your safest bet. Maybe have a look at the source of the owpython module and check if you can find out how it works.

    Tom : I wasn't able to find any documentation other than the docstrings. Is there anything else?
  • I've also had problems with owfs. I found it to be an overengineered solution to what is a simple problem. Now I'm using the DigiTemp code without a problem. I found it to be flexible and reliable. For instance, I store the room's temperature in a log file every minute by running

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

    To reach that point I downloaded the source file, untarred it and then did the following.

    # 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
    

    I also hand-edited my configuration file to adjust it to my setup. This is how it ended-up.

    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
    

    In my case I also created a /etc/init.d/digitemp file and enabled it to run at startup.

    #! /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
    
    Tom : Thanks for the info, but I don't think that helps getting access to the log stored on the DS1922T. I can read the current temperature using owpython or owfs, it's just accessing the stored measurements that I'm struggling with.
  • This is crazy complicated. Has anybody figured out a SIMPLE way to do this? I used to be able to get the onewire viewer to work in Windows, but I can't get it to work in Ubuntu. The OWFS just plain confounds me, and digitemp is no better. All that configuration for such a simple little device? I can interface with my mobile phone with less config than that!

    Any smart solutions out there?

    From mlissner
  • Well I have just started to look at ibuttons and want to use python.

    This looks more promising:

    http://www.ohloh.net/p/pyonewire

    From Buteman

0 comments:

Post a Comment