summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBirte Kristina Friesel <derf@finalrewind.org>2024-01-17 21:17:21 +0100
committerBirte Kristina Friesel <derf@finalrewind.org>2024-01-17 21:17:21 +0100
commitd527ba2ec590040ee76365861434a06ca91dd37b (patch)
treea4865ee8f0df25cdcad3c26ff49d7fd5c433da66
parent9acb73a6e54a8b4234e308d660d1740a1e2487e3 (diff)
Read out device status (and report it to HASS in example application)
-rw-r--r--init.lua38
-rw-r--r--sen5x.lua42
2 files changed, 73 insertions, 7 deletions
diff --git a/init.lua b/init.lua
index cbacad4..fa1b53b 100644
--- a/init.lua
+++ b/init.lua
@@ -26,14 +26,17 @@ end
function setup_client()
print("Connected")
gpio.write(ledpin, 1)
+ local json_str = '{"status":"Initializing"}'
if not sen5x.start() then
- print("SEN5x initialization error")
+ json_str = '{"status":"Initialization failed"}'
end
publishing_mqtt = true
mqttclient:publish(mqtt_prefix .. "/state", "online", 0, 1, function(client)
- publishing_mqtt = false
- push_timer:start()
- prepare_push_data()
+ mqttclient:publish(mqtt_prefix .. "/data", json_str, 0, 0, function(client)
+ publishing_mqtt = false
+ push_timer:start()
+ prepare_push_data()
+ end)
end)
end
@@ -57,6 +60,22 @@ function connect_wifi()
wifi.sta.connect()
end
+function prepare_get_status()
+ if sen5x.prepare_read_status() == false then
+ print("SEN5x error")
+ else
+ local delayed_read_status = tmr.create()
+ delayed_read_status:register(20, tmr.ALARM_SINGLE, get_status)
+ delayed_read_status:start()
+ end
+end
+
+function get_status()
+ if sen5x.read_status() == false then
+ print("SEN5x error")
+ end
+end
+
function prepare_push_data()
if sen5x.prepare_read() == false then
print("SEN5x error")
@@ -105,7 +124,7 @@ function push_data()
json_str = string.format('%s"nox":%d.%01d,', json_str, sen5x.nox/10, sen5x.nox%10)
influx_str = string.format("%snox=%d.%01d,", influx_str, sen5x.nox/10, sen5x.nox%10)
end
- json_str = string.format('%s"rssi_dbm":%d}', json_str, wifi.sta.getrssi())
+ json_str = string.format('%s"status":"%s","rssi_dbm":%d}', json_str, sen5x.status, wifi.sta.getrssi())
influx_str = string.format("%srssi_dbm=%d", influx_str, wifi.sta.getrssi())
if not publishing_mqtt then
@@ -118,6 +137,7 @@ function push_data()
publish_influx(influx_str)
else
gpio.write(ledpin, 1)
+ prepare_get_status()
collectgarbage()
end
end)
@@ -131,6 +151,7 @@ function publish_influx(payload)
http.post(influx_url, influx_header, "sen5x" .. influx_attr .. " " .. payload, function(code, data)
publishing_http = false
gpio.write(ledpin, 1)
+ prepare_get_status()
collectgarbage()
end)
end
@@ -174,14 +195,17 @@ function hass_register()
local hass_humi = string.format('{%s,"name":"Humidity","object_id":"%s_humidity","unique_id":"%s_humidity","device_class":"humidity","unit_of_measurement":"%%","value_template":"{{value_json.humidity_relpercent}}"}', hass_entity_base, device_id, device_id)
table.insert(publish_queue, {"homeassistant/sensor/" .. device_id .. "/humidity/config", hass_humi})
- local hass_voc = string.format('{%s,"name":"VOC","object_id":"%s_voc","unique_id":"%s_voc","unit_of_measurement":"VOC","icon":"mdi:air-filter","value_template":"{{value_json.voc}}"}', hass_entity_base, device_id, device_id)
+ local hass_voc = string.format('{%s,"name":"VOC","object_id":"%s_voc","unique_id":"%s_voc","unit_of_measurement":"counts","icon":"mdi:air-filter","value_template":"{{value_json.voc}}"}', hass_entity_base, device_id, device_id)
table.insert(publish_queue, {"homeassistant/sensor/" .. device_id .. "/voc/config", hass_voc})
end
if product_name == "SEN55" then
- local hass_nox = string.format('{%s,"name":"NOx","object_id":"%s_nox","unique_id":"%s_nox","unit_of_measurement":"NOx","icon":"mdi:molecule","value_template":"{{value_json.nox}}"}', hass_entity_base, device_id, device_id)
+ local hass_nox = string.format('{%s,"name":"NOx","object_id":"%s_nox","unique_id":"%s_nox","unit_of_measurement":"counts","icon":"mdi:molecule","value_template":"{{value_json.nox}}"}', hass_entity_base, device_id, device_id)
table.insert(publish_queue, {"homeassistant/sensor/" .. device_id .. "/nox/config", hass_nox})
end
+
+ local hass_status = string.format('{%s,"name":"Status","object_id":"%s_status","unique_id":"%s_status","icon":"mdi:information","value_template":"{{value_json.status}}","entity_category":"diagnostic"}', hass_entity_base, device_id, device_id)
+ table.insert(publish_queue, {"homeassistant/sensor/" .. device_id .. "/status/config", hass_status})
local hass_rssi = string.format('{%s,"name":"RSSI","object_id":"%s_rssi","unique_id":"%s_rssi","device_class":"signal_strength","unit_of_measurement":"dBm","value_template":"{{value_json.rssi_dbm}}","entity_category":"diagnostic"}', hass_entity_base, device_id, device_id)
table.insert(publish_queue, {"homeassistant/sensor/" .. device_id .. "/rssi/config", hass_rssi})
diff --git a/sen5x.lua b/sen5x.lua
index 13bd972..3e6c7b9 100644
--- a/sen5x.lua
+++ b/sen5x.lua
@@ -2,6 +2,7 @@ local sen5x = {}
local device_address = 0x69
sen5x.bus_id = 0
+sen5x.status = "Initializing"
function sen5x.start()
i2c.start(sen5x.bus_id)
@@ -62,6 +63,47 @@ function sen5x.read()
return true
end
+function sen5x.prepare_read_status()
+ i2c.start(sen5x.bus_id)
+ if not i2c.address(sen5x.bus_id, device_address, i2c.TRANSMITTER) then
+ return false
+ end
+ i2c.write(sen5x.bus_id, {0xd2, 0x06})
+ i2c.stop(sen5x.bus_id)
+ return true
+end
+
+function sen5x.read_status()
+ i2c.start(sen5x.bus_id)
+ if not i2c.address(sen5x.bus_id, device_address, i2c.RECEIVER) then
+ return false
+ end
+ local data = i2c.read(sen5x.bus_id, 6)
+ i2c.stop(sen5x.bus_id)
+ if not sen5x.crc_valid(data, 6) then
+ return false
+ end
+ local status1 = string.byte(data, 1)
+ local status2 = string.byte(data, 5)
+
+ if bit.isset(status1, 5) then
+ sen5x.status = "Fan speed out of range"
+ elseif bit.isset(status1, 3) then
+ sen5x.status = "Fan cleaning active"
+ elseif bit.isset(status2, 7) then
+ sen5x.status = "Gas sensor error"
+ elseif bit.isset(status2, 6) then
+ sen5x.status = "RHT sensor error"
+ elseif bit.isset(status2, 5) then
+ sen5x.status = "Laser failure"
+ elseif bit.isset(status2, 4) then
+ sen5x.status = "Fan failure"
+ else
+ sen5x.status = "OK"
+ end
+ return true
+end
+
function sen5x.prepare_get_product()
i2c.start(sen5x.bus_id)
if not i2c.address(sen5x.bus_id, device_address, i2c.TRANSMITTER) then