pyowfs - python wrapper for owfs
This is the home of pyowfs It now has a new home on GitHub ;), a small wrapper for OWFS's libowcapi for python done with ctypes.
The motivation for this project came out of the fact that the "original" OWFS provided python bindings are not able to sufficiently access binary data contained in memory locations of 1wire devices. This is because the swig-generated bindings handle the binary content of a sensor's memory locations as a c-string - so when there is a NULL byte somewhere in your "binary" data, it gets truncated at exactly this position - which obviously is not what you want.
Well, i took a look at the swig sources, but for me it was easier to hack together some ctypes wrapper than digging around in the wonderful swig magic ;-)
Note that pyowfs tries not to be API-compatible with the OWFS python bindings. This is due to the fact that the OWFS python bindings can not access entries with dots in their names, nor are they able to access entries in the form of e.g. "pages/page.0". pyowfs addresses this by using a "dictionary like" interface with .get () and .put () methods and a "Directory" node to access subentries. But see yourself:
typical usage :
>>> from pyowfs import Connection
>>> root = Connection ("192.168.2.112:3030")
>>> for s in root.find () : print s
...
<Sensor /20.C1A00B000000/ - DS2450>
<Sensor /12.E8F672000000/ - DS2406>
<Sensor /29.336C08000000/ - DS2408>
disabling the cache is reflected in the %r of the sensor :
>>> s.use_cache (0)
>>> for s in root.find () : print s
...
<Sensor /uncached/20.C1A00B000000/ - DS2450>
<Sensor /uncached/12.E8F672000000/ - DS2406>
<Sensor /uncached/29.336C08000000/ - DS2408>
find sensors of a specific type :
>>> s = root.find (type="DS2406")[0]
dump all entries of the sensor :
>>> for e in s.iter_entries () : print e
...
PIO.BYTE
PIO.ALL
PIO.A
PIO.B
<Dir '/12.E8F672000000/T8A/'>
<Dir '/12.E8F672000000/TAI8570/'>
address
alias
channels
crc8
family
flipflop.BYTE
flipflop.ALL
flipflop.A
flipflop.B
id
latch.BYTE
latch.ALL
latch.A
latch.B
locator
memory
<Dir '/12.E8F672000000/pages/'>
power
present
r_address
r_id
r_locator
sensed.BYTE
sensed.ALL
sensed.A
sensed.B
set_alarm
type
access 'memory' :
>>> s.get ("memory")
"h\xaa\xaa\x1d\xc6\x00|\xcd\xa1;P\9d3\xd5\x91" ...
'pages' is a directory, so lets see whats beneath it :
>>> s.get ("pages")
<Dir '/12.E8F672000000/pages/'>
>>> for e in s.get ("pages").iter_entries () : print e
...
page.ALL
page.0
page.1
page.2
page.3
access to individual pages :
>>> s.get ("pages").get ("page.1")
'\xff\x00\x8b\xa3J\r\x1e\x84\xcd\x90\x15:\x9d' ...
>>> s.get ("pages").get ("page.2")
'\xb1k-\x0bQ\x04\xe7\xdfh\xa1\d\xc6\x84|\xcd2' ...
also possible to access long paths directly via underlying libowcapi :
>>> root.capi.get ("/bus.0/interface/settings/usb/datasampleoffset")
' 8'
>>> root.capi.put ("/bus.0/interface/settings/usb/datasampleoffset", "10")
True
>>> root.capi.get ("/bus.0/interface/settings/usb/datasampleoffset")
' 10'
If you find this useful, or have comments and/or suggestions - or want to write an even smarter owfs wrapper on top of it ;-) - drop me a note on the owfs-developers mailing list.
pyowfs can now be found on the python package index - the newest version can always be found there.