node-dht-sensor
Version:
Reads data from DHT sensors on Raspberry Pi
247 lines (182 loc) • 7.52 kB
Markdown
# node-dht-sensor
A simple node.js module for reading temperature and relative humidity using a compatible DHT sensor.

[](https://www.npmjs.com/package/node-dht-sensor)
[](https://www.npmjs.com/package/node-dht-sensor)
[](https://github.com/momenso/node-dht-sensor/blob/master/LICENSE)
## Installation
```shell session
$ npm install node-dht-sensor
```
For use with the Raspberry Pi 5, creating dependency on libgpiod, installation is as follows:
```shell session
$ npm install node-dht-sensor --use_libgpiod=true
```
The above accounts for the architectural changes in the Raspberry Pi 5 which are incompatible with the BCM2835 library.
## Usage
To initialize the sensor, you have to specify the sensor type and the [GPIO pin](https://www.raspberrypi.org/documentation/usage/gpio/) where the sensor is connected to. It should work for DHT11, DHT22 and AM2302 sensors.
You should use sensorType value to match the sensor as follows:
| Sensor | sensorType value |
| --------------- | :--------------: |
| DHT11 | 11 |
| DHT22 or AM2302 | 22 |
If the initialization succeeds when you can call the read function to obtain the latest readout from the sensor. Readout values contains a temperature and a humidity property.
### First Example

This sample queries a DHT11 sensor connected to the GPIO 4 and prints out the result on the console.
```javascript
var sensor = require("node-dht-sensor");
sensor.read(11, 4, function(err, temperature, humidity) {
if (!err) {
console.log(`temp: ${temperature}°C, humidity: ${humidity}%`);
}
});
```
### Multiple Sensors Example

The following example shows a method for querying multiple sensors connected to the same Raspberry Pi. For this example, we have two sensors:
1. A DHT11 sensor connected to GPIO 17
2. High-resolution DHT22 sensor connected to GPIO 4
```javascript
var sensorLib = require("node-dht-sensor");
var app = {
sensors: [
{
name: "Indoor",
type: 11,
pin: 17
},
{
name: "Outdoor",
type: 22,
pin: 4
}
],
read: function() {
for (var sensor in this.sensors) {
var readout = sensorLib.read(
this.sensors[sensor].type,
this.sensors[sensor].pin
);
console.log(
`[${this.sensors[sensor].name}] ` +
`temperature: ${readout.temperature.toFixed(1)}°C, ` +
`humidity: ${readout.humidity.toFixed(1)}%`
);
}
setTimeout(function() {
app.read();
}, 2000);
}
};
app.read();
```
### Promises API
Promises API provides an alternative `read` method that returns a Promise object rather than using a callback. The API is accessible via `require('node-dht-sensor').promises`.
```javascript
var sensor = require("node-dht-sensor").promises;
// You can use `initialize` and `setMaxTries` just like before
sensor.setMaxRetries(10);
sensor.initialize(22, 17);
// You can still use the synchronous version of `read`:
// var readout = sensor.readSync(22, 4);
sensor.read(22, 17).then(
function(res) {
console.log(
`temp: ${res.temperature.toFixed(1)}°C, ` +
`humidity: ${res.humidity.toFixed(1)}%`
);
},
function(err) {
console.error("Failed to read sensor data:", err);
}
);
```
Using `async/await`:
```javascript
const sensor = require("node-dht-sensor").promises;
async function exec() {
try {
const res = await sensor.read(22, 4);
console.log(
`temp: ${res.temperature.toFixed(1)}°C, ` +
`humidity: ${res.humidity.toFixed(1)}%`
);
} catch (err) {
console.error("Failed to read sensor data:", err);
}
}
exec();
```
### Test mode
A _test mode_ of operation is available since version `0.2.0`. In this mode of operation, the library does not communicate with the sensor hardware via the **GPIO** but instead it returns a pre-configured readout value. You can use the test mode during development without the need to have an actual sensor connected.
To enable the _test mode_, fake values must be defined at initialization. In the example below we specify fixed values for temperature equal to 21°C and humidity equal to 60%.
```javascript
sensor.initialize({
test: {
fake: {
temperature: 21,
humidity: 60
}
}
});
```
After initialization, we can call the `read` method as usual.
```javascript
sensor.read(22, 4, function(err, temperature, humidity) {
if (!err) {
console.log(
`temp: ${temperature.toFixed(1)}°C, ` +
`humidity: ${humidity.toFixed(1)}%`
);
}
});
```
And the result will always be the configured readout value defined at initialization.
```shell session
$ node examples/fake-test.js
temp: 21.0°C, humidity: 60.0%
$ node examples/fake-test.js
temp: 21.0°C, humidity: 60.0%
```
You can find a complete source code example in [examples/fake-test.js](https://github.com/momenso/node-dht-sensor/blob/master/examples/fake-test.js).
### Reference for building from source
Standard node-gyp commands are used to build the module. So, just make sure you have node and node-gyp as well as the Broadcom library to build the project.
1. In case, you don't have node-gyp, install it first:
```shell session
$ sudo npm install -g node-gyp
$ sudo update-alternatives --install /usr/bin/node-gyp node-gyp /opt/node-v10.15.3-linux-armv7l/bin/node-gyp 1
```
2. Generate the configuration files
```shell session
$ node-gyp configure
```
3. Build the component
```shell session
$ node-gyp build
```
### Tracing and Debugging
Verbose output from the module can be enabled by by specifying the `--dht_verbose=true` flag when installing the node via npm.
```shell session
$ npm install node-dht-sensor --dht_verbose=true
```
if you are interested in enabling trace when building directly from source you can enable the `-Ddht_verbose` flag when running node-gyp configure.
```shell session
$ node-gyp configure -- -Ddht_verbose=true
```
### Appendix A: Quick Node.js installation guide
There are many ways you can get Node.js installed on your Raspberry Pi. Here is just one of way you can do it.
```shell session
$ wget https://nodejs.org/dist/v14.15.4/node-v14.15.4-linux-armv7l.tar.xz
$ tar xvfJ node-v14.15.4-linux-armv7l.tar.xz
$ sudo mv node-v14.15.4-linux-armv7l /opt
$ sudo update-alternatives --install /usr/bin/node node /opt/node-v14.15.4-linux-armv7l/bin/node 1
$ sudo update-alternatives --set node /opt/node-v14.15.4-linux-armv7l/bin/node
$ sudo update-alternatives --install /usr/bin/npm npm /opt/node-v14.15.4-linux-armv7l/bin/npm 1
```
Please note that you may have to use armv6l instead of arm7l if you have an early Raspberry Pi model.
### References
[1]: Node.js download - https://nodejs.org/en/download/
[2]: BCM2835 - http://www.airspayce.com/mikem/bcm2835/
[3]: Node.js native addon build tool - https://github.com/TooTallNate/node-gyp
[4]: GPIO: Raspbery Pi Models A and B - https://www.raspberrypi.org/documentation/usage/gpio/