Loading init.lua +31 −7 Original line number Diff line number Diff line Loading @@ -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() Loading @@ -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") Loading Loading @@ -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 Loading @@ -118,6 +137,7 @@ function push_data() publish_influx(influx_str) else gpio.write(ledpin, 1) prepare_get_status() collectgarbage() end end) Loading @@ -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 Loading Loading @@ -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}) Loading sen5x.lua +42 −0 Original line number Diff line number Diff line Loading @@ -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) Loading Loading @@ -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 Loading Loading
init.lua +31 −7 Original line number Diff line number Diff line Loading @@ -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() Loading @@ -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") Loading Loading @@ -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 Loading @@ -118,6 +137,7 @@ function push_data() publish_influx(influx_str) else gpio.write(ledpin, 1) prepare_get_status() collectgarbage() end end) Loading @@ -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 Loading Loading @@ -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}) Loading
sen5x.lua +42 −0 Original line number Diff line number Diff line Loading @@ -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) Loading Loading @@ -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 Loading