0.0
No commit activity in last 3 years
No release in over 3 years
Maxim's 1-wire binding backed on w1-gpio driver
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
 Dependencies

Development

>= 0
>= 0
>= 0
 Project Readme

One Wire

This is a ruby gem offering binding to w1-gpio kernel module.

GPIO w1 bus master driver by Ville Syrjala syrjala@sci.fi

https://www.kernel.org/doc/Documentation/w1/w1.generic

Installation

w1-gpio module should be loaded,

modprobe w1-gpio

depending on the device you want to control load one of these.

modprobe -a w1_bq27000 w1_ds2413 w1_ds2431 w1_ds2760 w1_ds2781 w1_therm w1_ds2408 w1_ds2423 w1_ds2433 w1_ds2780 w1_ds28e04 w1_smem

and of course

gem 'sysfs_one_wire'
#or in shell
gem install sysfs_one_wire

for loading the modules after reboot you need to add them in the boot sequence check these files depending on your OS

Debian/Raspian/Ubuntu

/etc/modules
/etc/modules.conf
/etc/modprobe.d/modeprobe.conf
/etc/modprobe.d/

Raspian

You will also need to activate the device tree :

cat 'dtoverlay=w1-gpio' > /boot/config.txt

Usage

	OneWire.slaves # return the paths of all the slaves on the line.
	OneWire.find(/2GAE/) # return the paths of slaves with the given pattern as id.

	OneWire.load(path) # return the devices objects for a given path
	OneWire.devices # return all the devices objects

Ok, with OneWire.devices we can see our sensor is well recognized because they are instantiated with a subclass of OneWire::Base given their type (Thermometer, switch, ...) Now, can get the corresponding OneWire::Thermometer object, with :

soil_sensor = OneWire.devices.first # if it is the first in the list
# or
soil_sensor = OneWire.load('/sys/bus/w1/devices/28-031581efxxxx') # because we already had the path, in a database for example...

then you have access to some methods such as :

soil_sensor.value               # current temperature in °C
soil_sensor.last_value          # last checked temperature, return nil if you didn't called value before
soil_sensor.id                  # 1wire device unique id, WARNING: this one is not tested
soil_sensor.name                # device unique name
soil_sensor.w1_slave            # return the w1_slave file, as in 'cat'
soil_sensor.dump                # return an array which can be stored in database for later usage.

Extend

I currently have only a DS18B20 to build and test this gem, but you can also extend it for memory, switch, or others devices supported by the kernel driver.

It is pretty easy to create other object by subclassing OneWire::Base.

module OneWire
	class Memory < OneWire::Base

	  PREFIX = %w{06 08 0A 0C}
	  attr_reader :last_value

	  def value
	    @last_value = @value
	    @value = w1_slave[/some regexp to isolate the content/, 1]
	  end

	  def value= arg
	   @last_value = @value
	   File.write(File.join(@path.to_s, 'w1_slave'), arg)
	  end
	end
end

Limitation/Alternative

This is a work in progress. It only support thermometer for now, but will be extented (and this is quite easy to do it)

If you need more, Maxim's Integrated offers a whole filesystem with OWFS

[https://github.com/mholling/one_wire] [https://github.com/pedrocr/ownet]

Need this? come and give a hand !