Unverified Commit d527ba2e authored by Birte Kristina Friesel's avatar Birte Kristina Friesel
Browse files

Read out device status (and report it to HASS in example application)

parent 9acb73a6
Loading
Loading
Loading
Loading
+31 −7
Original line number Diff line number Diff line
@@ -26,15 +26,18 @@ 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)
		mqttclient:publish(mqtt_prefix .. "/data", json_str, 0, 0, function(client)
			publishing_mqtt = false
			push_timer:start()
			prepare_push_data()
		end)
	end)
end

function connect_mqtt()
@@ -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,15 +195,18 @@ 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})

+42 −0
Original line number Diff line number Diff line
@@ -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