-
Notifications
You must be signed in to change notification settings - Fork 0
/
mhz19.lua
101 lines (86 loc) · 3.25 KB
/
mhz19.lua
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
do
-- connect MH-Z19 PWM output to D3
local MHZ19_PIN = 3
local DHT_PIN = 4
local TRIGGER_ON = "both"
local SEND_INTERVAL_MS = 10 * 1000
-- use envsubst to replace the placeholders with actual values
local WIFI_SSID = "${WIFI_SSID}"
local WIFI_PASSWORD = "${WIFI_PASSWORD}"
local LOGSTASH_URL = "${LOGSTASH_URL}"
local DEVICE_ID = "${DEVICE_ID}"
local lowDuration = 0
local highDuration = 0
local lastTimestamp = 0
local latestMeasurements = {}
local function calculateCo2Ppm(highDuration, lowDuration)
return 5000.0 * (1002.0 * highDuration - 2.0 * lowDuration) / 1000.0 / (highDuration + lowDuration);
end
local function mhz19InterruptHandler(level, timestamp)
print("mhz19InterruptHandler", level, timestamp)
if (level == gpio.LOW) then
highDuration = timestamp - lastTimestamp
else
lowDuration = timestamp - lastTimestamp
local co2 = calculateCo2Ppm(highDuration, lowDuration)
table.insert(latestMeasurements, co2)
print("co2", co2)
end
lastTimestamp = timestamp
end
local function httpPostCallback(status_code, body, headers)
if (status_code < 0) then
print("http error", status_code)
else
print("http done", status_code)
end
end
local function sendReadingsToLogstash()
print("sending readings to logstash")
local message = {}
message["device_id"] = DEVICE_ID
-- get a median of the latest CO2 readings
local measurements = latestMeasurements
latestMeasurements = {}
if (#measurements > 0) then
table.sort(measurements)
local median = measurements[math.ceil(#measurements / 2 + 1)]
print("CO2 median", median)
message["co2"] = median
else
print("WARN: no CO2 measurements found")
end
-- read temperature and humidity from DHT
local status, temp, humi, temp_dec, humi_dec = dht.read(DHT_PIN)
if status == dht.OK then
print("DHT Temperature:", temp, temp_dec, "Humidity:", humi, humi_dec)
message["temperature"] = temp
message["humidity"] = humi
elseif status == dht.ERROR_CHECKSUM then
print("DHT Checksum error")
elseif status == dht.ERROR_TIMEOUT then
print("DHT timed out")
else
print("DHT unknown status")
end
-- POST to LogStash
local jsonMessaage = sjson.encode(message)
local headers = 'Content-Type: application/json\r\n'
http.post(LOGSTASH_URL, headers, jsonMessaage, httpPostCallback)
end
-- configure reading of MHZ19
gpio.mode(MHZ19_PIN, gpio.INT)
gpio.trig(MHZ19_PIN, TRIGGER_ON, mhz19InterruptHandler)
-- TODO log wifi status events (if it isn't logged already)
-- TODO wifi.eventmon...
-- connect to WiFi
wifi.setmode(wifi.STATION)
local wifiConfig = {}
wifiConfig["ssid"] = WIFI_SSID
wifiConfig["pwd"] = WIFI_PASSWORD
wifi.sta.config(wifiConfig)
wifi.sta.connect()
-- configure sending to LogStash
local timer = tmr.create()
timer:alarm(SEND_INTERVAL_MS, tmr.ALARM_AUTO, sendReadingsToLogstash)
end