a collection of simple shellscripts to
- collect data from external wireless temperature/humidity sensors
- calculate dewpoint temperature
- turn on/off a fan (through a smartplug)
when last did you ventilate the cellar?
the choise of the components was defined by availability in my stuff box. :)
add support for wired sensors (i2c/onewire)?
- an OpenWRT compatible router (e.g. some from TP-Link) with USB port
- a Realtek RTL2832 based DVB dongle (https://osmocom.org/projects/rtl-sdr/wiki)
- some temperature/humidity sensors (433/868Mhz)
- (os) http://openwrt.org
- (sdr) https://github.com/merbanan/rtl_433 /
- (broker) https://mosquitto.org
reads rtl_433 sensor data from 'rtl_433/{hostname}/events' (rtl_433 default topic)
{
"time": "2024-04-07 16:27:27.095538",
"model": "Nexus-TH",
"id": 231,
"channel": 1,
"battery_ok": 1,
"temperature_C": 27.4,
"humidity": 35
}
{
"time": "2024-04-07 16:27:27.095538",
"model": "Bresser-3CH",
"id": 116,
"channel": 3,
"battery_ok": 1,
"temperature_C": 15.5,
"humidity": 63,
"mic": "CHECKSUM"
}
and publishes to 'app/dewpoint/sensors/in'
{ "name": "id1-231", "temperature_C": 27.4, "humidity": 35 }
{ "name": "id3-116", "temperature_C": 15.5, "humidity": 63 }
reads sensor data from 'app/dewpoint/sensor/in'
{ "name": "id1-231", "temperature_C": 27.4, "humidity": 35 }
{ "name": "id3-116", "temperature_C": 15.5, "humidity": 63 }
uses a configuration to map from external sensor ids to internal names
[
{
"name":"id3-116",
"id":"keller1"
},
{
"name":"id1-231",
"id":"aussen1stock"
}
]
calculate dewpoint according to temperature / humidity and publishes to 'app/dewpoint/in'
{
"ts":"2024-04-07_16:27:29+CEST",
"name":"aussen1stock",
"temperature_C":27.4,
"humidity":35,
"dew":10.5808
}
{
"ts":"2024-04-07_16:27:30+CEST",
"name":"keller1",
"temperature_C":15.5,
"humidity":63,
"dew":8.48191
}
read from 'app/dewpoint/in'
{
"ts":"2024-04-07_16:27:29+CEST",
"name":"aussen1stock",
"temperature_C":27.4,
"humidity":35,
"dew":10.5808
}
{
"ts":"2024-04-07_16:27:30+CEST",
"name":"keller1",
"temperature_C":15.5,
"humidity":63,
"dew":8.48191
}
has a mapping where multiple indoor/outdoor sensors can be configured.
{
"insensors": [
"keller1"
],
"outsensors": [
"aussen1stock"
]
}
when data from every sensor is available
average outdoor/indoor temperature, humidity and dewpoint are calculated.
publishes to 'app/dewpoint/out'
{
"ts": "2024-04-07_16:27:32+CEST",
"dew_avg": {
"delta": -2.09889,
"indoor": 8.48191,
"outdoor": 10.5808
},
"temperature_avg": {
"indoor": 15.5,
"outdoor": 27.4
},
"humidity_avg": {
"indoor": 63,
"outdoor": 35
},
"sensors": {
"indoor": [
{
"ts": "2024-04-07_16:26:10+CEST",
"name": "keller1",
"temperature_C": 15.5,
"humidity": 63,
"dew": 8.48191
}
],
"outdoor": [
{
"ts": "2024-04-07_16:27:29+CEST",
"name": "aussen1stock",
"temperature_C": 27.4,
"humidity": 35,
"dew": 10.5808
}
]
},
"app": {
"dew_diff_min": 1.0,
"dew_diff_max": 2.3,
"room_temperature_min": 10.0
}
}
reads from 'app/dewpoint/out'
{
"ts": "2024-04-07_16:27:32+CEST",
"dew_avg": {
"delta": -2.09889,
"indoor": 8.48191,
"outdoor": 10.5808
},
"temperature_avg": {
"indoor": 15.5,
"outdoor": 27.4
},
"humidity_avg": {
"indoor": 63,
"outdoor": 35
},
"sensors": {
"indoor": [
{
"ts": "2024-04-07_16:26:10+CEST",
"name": "keller1",
"temperature_C": 15.5,
"humidity": 63,
"dew": 8.48191
}
],
"outdoor": [
{
"ts": "2024-04-07_16:27:29+CEST",
"name": "aussen1stock",
"temperature_C": 27.4,
"humidity": 35,
"dew": 10.5808
}
]
},
"app": {
"dew_diff_min": 1.0,
"dew_diff_max": 2.3,
"room_temperature_min": 10.0
}
}
calculates if fan should be turned on/off according temperature / dewpoint data.
publishes to 'app/dewpoint/control'
{
"ts":"2024-04-07_16:27:37+CEST",
"type":"control",
"fan":0
}
reads from 'app/dewpoint/control'
{
"ts":"2024-04-07_16:27:37+CEST",
"type":"control",
"fan":0
}
read user provided functions from '/etc/opendew/custom.sh'
# custom user actions can be executed here
custom_fanon() {
logger "custom fan on :)"
curl http://espplug.fritz.box/cm?cmnd=Power%20on
}
custom_fanoff() {
logger "custom fan off :)"
curl http://espplug.fritz.box/cm?cmnd=Power%20off
}
custom_status_on() {
logger "custom status changed to on"
}
custom_status_off() {
logger "custom status changed to off"
}
executes custom_fanoff() or custom_fanon() functions (if defined).
configfile '/etc/opendew/opendew.cfg'
MQTTHOST="localhost"
MQTTPORT="1883"
MQTTUSER=""
MQTTPASS=""
MQTTTOPICBASE="app/dewpoint"
MQTTREADER_INTOPIC="rtl_433/+/events"
DEW_DIFF_MAX=2.3
DEW_DIFF_MIN=1.0
ROOM_TEMP_MIN=10.0
SENSORMASTERCONFIG='[{"name":"id3-116","id":"keller1"},{"name":"id1-231","id":"aussen1stock"}]'
SENSORCONFIG='{"insensors":["keller1"],"outsensors":["aussen1stock"]}'
SENSORMASTERCONFIG='[{"name":"id3-116","id":"keller1"},{"name":"id1-231","id":"aussen1stock"}]'
In a first step, the sensor data must be converted from the rtl_433 proprietary format into the application's own data format.
// rtl_433 specific
{
"time": "2024-04-07 16:27:27.095538",
"model": "Bresser-3CH",
"id": 116,
"channel": 3,
"battery_ok": 1,
"temperature_C": 15.5,
"humidity": 63,
"mic": "CHECKSUM"
}
to
// dew app specific
{
"name": "id3-116",
"temperature_C": 15.5,
"humidity": 63
}
During this process, a unique ID is also assigned to each sensor, which is then used internally. In the event of a sensor replacement (e.g., due to a defect), only the mapping to the internal name/ID needs to be changed.
The ID generation follows the following pattern:
id{rtl_433.channel}-{rtl_433.id}
e.g.
id:116, channel=3 -> 'id3-116'
SENSORCONFIG='{"insensors":["keller1","keller2","keller3"],"outsensors":["aussen1stock","aussenterrasse"]}'
Indoor and outdoor sensors can be defined as 1 to n sensors each. The respective value (temperature, humidity, and dew point) is determined as the average across all configured sensors for indoor/outdoor use.
Probably.
The shellscripts should run on any linux system, but startup scripts for initd / systemd are necessary.
No.
Use your favorite home automation system.
For example: FHEM