Get the temperature from your w1 therm sensor in a single line of code!
It's designed to be used with the Rasperry Pi hardware but also works on a Beagle Bone and others.
Raspberry Pi: this package is available in Raspbian as python-w1thermsensor
and python3-w1thermsensor
.
The following w1 therm sensor devices are supported:
- DS18S20
- DS1822
- DS18B20
- DS28EA00
- DS1825/MAX31850K
The following hardware is needed:
- w1 therm compatible sensor (some of them can be bought here: Adafruit: DS18B20)
- wires to connect the sensor to your board (you might need a breadboard, too)
- a board like the Raspberry Pi or the Beagle Bone)
On the Raspberry Pi, you will need to add dtoverlay=w1-gpio"
(for regular connection) or dtoverlay=w1-gpio,pullup="y"
(for parasitic connection) to your /boot/config.txt. The default data pin is GPIO4 (RaspPi connector pin 7), but that can be changed from 4 to x
with dtoverlay=w1-gpio,gpiopin=x
.
This possibility is supported on all distributions:
pip install w1thermsensor
Note: maybe root privileges are required
If you are using the w1thermsensor
module on a Rasperry Pi running Raspbian you can install it from the official repository:
sudo apt-get install python3-w1thermsensor
Or if you are still using Python 2:
sudo apt-get install python-w1thermsensor
Note: For older versions of this package you might get the following error: ImportError: No module named 'pkg_resources'
which indicates that you need to install python-setuptools
or python3-setuptools
respectively.
Note 2: The Python 2 package does not contain the CLI tool.
debuild -us -uc
dpkg -i ../python3-w1thermsensor_*.deb
The usage is very simple and the interface clean..
All examples are with the DS18B20
sensor - It works the same way for the other supported devices.
from w1thermsensor import W1ThermSensor
sensor = W1ThermSensor()
temperature_in_celsius = sensor.get_temperature()
temperature_in_fahrenheit = sensor.get_temperature(W1ThermSensor.DEGREES_F)
temperature_in_all_units = sensor.get_temperatures([
W1ThermSensor.DEGREES_C,
W1ThermSensor.DEGREES_F,
W1ThermSensor.KELVIN])
The need kernel modules will be automatically loaded in the constructor of the W1ThermSensor
class.
If something went wrong an exception is raised.
The first found sensor will be taken
The DS18B20 sensor with the ID 00000588806a
will be taken.
from w1thermsensor import W1ThermSensor
sensor = W1ThermSensor(W1ThermSensor.THERM_SENSOR_DS18B20, "00000588806a")
temperature_in_celsius = sensor.get_temperature()
With the get_available_sensors
class-method you can get the ids of all available sensors.
from w1thermsensor import W1ThermSensor
for sensor in W1ThermSensor.get_available_sensors():
print("Sensor %s has temperature %.2f" % (sensor.id, sensor.get_temperature()))
Only sensors of a specific therm sensor type:
from w1thermsensor import W1ThermSensor
for sensor in W1ThermSensor.get_available_sensors([W1ThermSensor.THERM_SENSOR_DS18B20]):
print("Sensor %s has temperature %.2f" % (sensor.id, sensor.get_temperature()))
Some w1 therm sensors support changing the precision for the temperature reads.
w1thermsensor
enables to do so with the W1ThermSensor.set_precision()
method:
sensor = W1ThermSensor(W1ThermSensor.THERM_SENSOR_DS18B20, "00000588806a")
sensor.set_precision(5)
If the persist
argument is set to False
this value
is "only" stored in the volatile SRAM, so it is reset when
the sensor gets power-cycled.
If the persist
argument is set to True
the current set
precision is stored into the EEPROM. Since the EEPROM has a limited
amount of writes (>50k), this command should be used wisely.
sensor = W1ThermSensor(W1ThermSensor.THERM_SENSOR_DS18B20, "00000588806a")
sensor.set_precision(5, persist=True)
Note: this is supported since Linux Kernel 4.7
Upon import of the w1thermsensor
package the w1-therm
and w1-gpio
kernel modules get loaded automatically.
This requires the python process to run as root. Sometimes that's not what you want, thus you can disable the auto loading
and load the kernel module yourself prior to talk to your sensors with w1thermsensor
.
You can disable the auto loading feature by setting the W1THERMSENSOR_NO_KERNEL_MODULE
environment variable to 1
:
# set it globally for your shell so that sub-processes will inherit it.
export W1THERMSENSOR_NO_KERNEL_MODULE=1
# set it just for your Python process
W1THERMSENSOR_NO_KERNEL_MODULE=1 python my_awesome_thermsensor_script.py
Every other values assigned to W1THERMSENSOR_NO_KERNEL_MODULE
will case w1thermsensor
to load the kernel modules.
Note: the examples above also apply for the CLI tool usage. See below.
The w1thermsensor module can be used as CLI tool since version 0.3.0
.
Please note that the CLI tool will only get installed with the Raspbian Python 3 package (sudo apt-get install python3-w1thermsensor
)
List all available sensors:
$ w1thermsensor ls
$ w1thermsensor ls --json # show results in JSON format
List only sensors of a specific type:
$ w1thermsensor ls --type DS1822
$ w1thermsensor ls --type DS1822 --type MAX31850K # specify multiple sensor types
$ w1thermsensor ls --type DS1822 --json # show results in JSON format
Show temperature of all available sensors: (Same synopsis as ls
)
$ w1thermsensor all --type DS1822
$ w1thermsensor all --type DS1822 --type MAX31850K # specify multiple sensor types
$ w1thermsensor all --type DS1822 --json # show results in JSON format
Show temperature of a single sensor:
$ w1thermsensor get 1 # 1 is the id obtained by the ls command
$ w1thermsensor get --hwid 00000588806a --type DS18B20
$ w1thermsensor get 1 # show results in JSON format
Show temperature of a single sensor in the given precision
$ w1thermsensor get 1 --precision 10
$ w1thermsensor get --hwid 00000588806a --type DS18B20 --precision 11
$ w1thermsensor precision 10 1
$ w1thermsensor precision --hwid 00000588806a --type DS18B20 11
I'm happy about all types of contributions to this project! 🍻
This project is published under MIT.
A Timo Furrer project.
- 🎉 -