Source code for sensors.Utilities.write_meta_data
from random import random, choice
import bme280
[docs]class WriteMetaData:
"""Class to write meta data to ``data.json``.
:param config: configuration including sensor objects
:type config: object
:param data_json: json dictionary with import/output-format for KInsecta web app
:type data_json: dictionary
"""
def __init__(self, config, data_json):
self.config = config
self.bme280_sensor = config.bme280_sensor
self.bh1750_sensor = config.bh1750_sensor
self.as7341_sensor = config.as7341_sensor
self.pmsa003i_sensor = config.pmsa003i_sensor
self.data_json = data_json
[docs] @staticmethod
def random_number(value_min, value_max, formatting):
value = float(formatting.format(value_min + (random() * (value_max - value_min))))
return value
[docs] def write_humidity_temperature_air_pressure(self):
"""Writes humidity, temperature and air pressure measured with BME280 sensor to ``data.json``.
"""
if self.bme280_sensor[2] is not None:
data = bme280.sample(self.bme280_sensor[0], self.bme280_sensor[1], self.bme280_sensor[2])
self.data_json["temperature"]["value"] = float("{:2.1f}".format(round(data.temperature, 1)))
self.data_json["air_pressure"]["value"] = float("{:1.3f}".format(round(data.pressure, 0)/1000))
self.data_json["humidity"]["value"] = float("{:3.1f}".format(round(data.humidity, 1)))
[docs] def write_luminosity(self):
"""Writes luminosity measured with BH1750 sensor to ``data.json``.
"""
if self.bh1750_sensor is not None:
luminosity = float("{:4.1f}".format(self.bh1750_sensor.lux))
self.data_json["luminosity"]["value"] = luminosity
[docs] def write_spectrum(self):
"""Writes spectral distribution measured with AS7441 sensor to ``data.json``.
"""
if self.as7341_sensor is not None:
self.data_json["spectrum"]["channel_415nm"] = self.as7341_sensor.channel_415nm
self.data_json["spectrum"]["channel_445nm"] = self.as7341_sensor.channel_445nm
self.data_json["spectrum"]["channel_480nm"] = self.as7341_sensor.channel_480nm
self.data_json["spectrum"]["channel_515nm"] = self.as7341_sensor.channel_515nm
self.data_json["spectrum"]["channel_555nm"] = self.as7341_sensor.channel_555nm
self.data_json["spectrum"]["channel_590nm"] = self.as7341_sensor.channel_590nm
self.data_json["spectrum"]["channel_630nm"] = self.as7341_sensor.channel_630nm
self.data_json["spectrum"]["channel_680nm"] = self.as7341_sensor.channel_680nm
self.data_json["spectrum"]["clear_light"] = self.as7341_sensor.channel_clear
self.data_json["spectrum"]["near_ir"] = self.as7341_sensor.channel_nir
[docs] def write_particulate_matter(self):
"""Writes air quality and particle sizes measured with PMSA003I sensor to ``data.json``.
"""
if self.pmsa003i_sensor is not None:
aq_data = self.pmsa003i_sensor.read()
self.data_json["particulate_matter"]["pm1"] = aq_data["pm10 standard"]
self.data_json["particulate_matter"]["pm2p5"] = aq_data["pm25 standard"]
self.data_json["particulate_matter"]["pm10"] = aq_data["pm100 standard"]
self.data_json["particulate_matter"]["particles_03um"] = aq_data["particles 03um"]
self.data_json["particulate_matter"]["particles_05um"] = aq_data["particles 05um"]
self.data_json["particulate_matter"]["particles_10um"] = aq_data["particles 10um"]
self.data_json["particulate_matter"]["particles_25um"] = aq_data["particles 25um"]
self.data_json["particulate_matter"]["particles_50um"] = aq_data["particles 50um"]
self.data_json["particulate_matter"]["particles_100um"] = aq_data["particles 100um"]
[docs] def write_size_insect(self):
# self.data_json["size_insect"]["length"] = self.random_number(0.2, 39, "{:2.1f}")
# self.data_json["size_insect"]["width"] = self.random_number(0.2, 22, "{:2.1f}")
pass
[docs] def write_rainfall(self):
# self.data_json["rainfall"]["quantity"] = self.random_number(0, 25, "{:3.2f}")
pass
[docs] def write_wind_sensor(self):
# directions = ["N", "NNE", "NE", "ENE", "E", "ESE", "SE", "SSE", "S",
# "SSW", "SW", "WSW", "W", "WNW", "NW", "NNW"]
# self.data_json["wind_sensor"]["speed"] = self.random_number(0, 15, "{:3.2f}")
# self.data_json["wind_sensor"]["direction"] = choice(directions)
pass
[docs] def prepare_data_json_upload(self):
"""Method deletes keys and child properties that have null values from the ``data.json``. \
Does not apply to all keys, some may have null values which won't violate the import format of the \
KInsecta Web App.
"""
if self.data_json['video']['filename'] is None:
del self.data_json['video']
del self.data_json['images']
if self.data_json['wingbeat']['filename'] is None:
del self.data_json['wingbeat']
else:
# not included in import/export format in web app proto typ
del self.data_json['wingbeat']['classifications']
if self.data_json['main_classifications'][0]['type'] is None:
self.data_json['main_classifications'] = []
[docs] def write_all_data(self):
"""Method that calls all methods to write sensor measurements to ``data.json`` and prepares it for upload.
"""
# implemented
self.write_humidity_temperature_air_pressure()
self.write_luminosity()
self.write_spectrum()
self.write_particulate_matter()
# not implemented
self.write_size_insect()
self.write_rainfall()
self.write_wind_sensor()
# prepare data.json for upload, according to import/export specifications of web app
self.prepare_data_json_upload()