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()