def test_noise_get_amplitudes_at_frequency_ranges(sounddevice, numpy): from enviroplus.noise import Noise noise = Noise(sample_rate=16000, duration=0.1) noise.get_amplitudes_at_frequency_ranges([(100, 500), (501, 1000)]) sounddevice.rec.assert_called_with(0.1 * 16000, samplerate=16000, blocking=True, channels=1, dtype='float64')
class SoundDetector(Thread): def __init__(self, soundLevelToReach, interval, frequency_ranges, onSoundEventCallback): self.soundLevelToReach = soundLevelToReach self.interval = interval self.onSoundEvent = onSoundEventCallback self.frequency_ranges = frequency_ranges self.noise = Noise() # init and start thread: Thread.__init__(self) self.daemon = True self.start() def get_noise(self, frequency_ranges): amps = self.noise.get_amplitudes_at_frequency_ranges(frequency_ranges) return amps def is_shouting(self, amps): for i in range(len(amps)): if amps[i] > self.soundLevelToReach: return amps[i] def run(self): while True: amps = self.get_noise(self.frequency_ranges) reachedValue = self.is_shouting(amps) if reachedValue and self.onSoundEvent: self.onSoundEvent(amps, reachedValue) time.sleep(self.interval)
class Sensors: def __init__(self): # BME280 temperature/pressure/humidity sensor self.bme280 = BME280() # Light sensor self.ltr559 = LTR559() self.noise = Noise() self.cpu_temps = None self.factor = 2.25 # Get the temperature of the CPU for compensation def get_cpu_temperature(self): process = Popen(['vcgencmd', 'measure_temp'], stdout=PIPE, universal_newlines=True) output, _error = process.communicate() return float(output[output.index('=') + 1:output.rindex("'")]) def get_temperature(self): return self.bme280.get_temperature() def get_correct_temperature(self): if self.cpu_temps is None: self.cpu_temps = [self.get_cpu_temperature()] * 5 cpu_temp = self.get_cpu_temperature() # Smooth out with some averaging to decrease jitter self.cpu_temps = self.cpu_temps[1:] + [cpu_temp] avg_cpu_temp = sum(self.cpu_temps) / float(len(self.cpu_temps)) raw_temp = self.get_temperature() raw_data = raw_temp - ((avg_cpu_temp - raw_temp) / self.factor) return raw_data def get_pressure(self): return self.bme280.get_pressure() def get_humidity(self): return self.bme280.get_humidity() def get_correct_humidity(self): dewpoint = self.get_temperature() - ((100 - self.get_humidity()) / 5) corr_humidity = 100 - (5 * (self.get_correct_temperature() - dewpoint)) return min(100, corr_humidity) def get_lux(self): return self.ltr559.get_lux() def get_proximity(self): return self.ltr559.get_proximity() def get_noise_amp(self): amps = self.noise.get_amplitudes_at_frequency_ranges([(100, 200), (500, 600), (1000, 1200), (2000, 3000)]) amps = [n * 32 for n in amps] return amps
def read_values(): values = {} cpu_temp = get_cpu_temperature() raw_temp = bme280.get_temperature() comp_temp = raw_temp - ((cpu_temp - raw_temp) / comp_factor) lux = ltr559.get_lux() proximity = ltr559.get_proximity() readings = gas.read_all() oxidising = readings.oxidising nh3 = readings.nh3 reducing = readings.reducing adc = readings.adc noise = Noise() amps = noise.get_amplitudes_at_frequency_ranges([(100, 200), (500, 600), (1000, 1200)]) amps = [n * 32 for n in amps] values["temperature"] = "{:.2f}".format(comp_temp) values["cpu_temp"] = "{:.2f}".format(cpu_temp) values["pressure"] = "{:.2f}".format(bme280.get_pressure() * 100) values["humidity"] = "{:.2f}".format(bme280.get_humidity()) values["lux"] = "{:05.02f}".format(lux) values["proximity"] = "{:05.02f}".format(proximity) values["nh3"] = "{:05.02f}".format(nh3) values["oxidising"] = "{:05.02f}".format(oxidising) values["reducing"] = "{:05.02f}".format(reducing) values["adc"] = "{:05.02f}".format(adc) values["amp_100_200"] = "{:05.02f}".format(amps[0]) values["amp_500_600"] = "{:05.02f}".format(amps[1]) values["amp_1000_1200"] = "{:05.02f}".format(amps[2]) try: pm_values = pms5003.read() values["P2"] = str(pm_values.pm_ug_per_m3(2.5)) values["P1"] = str(pm_values.pm_ug_per_m3(10)) except ReadTimeoutError: pms5003.reset() pm_values = pms5003.read() values["P2"] = str(pm_values.pm_ug_per_m3(2.5)) values["P1"] = str(pm_values.pm_ug_per_m3(10)) return values
font_lg, align_right=True) pressure_desc = describe_pressure(mean_pressure).upper() spacing = font_lg.getsize(pressure_string.replace(",", ""))[1] + 1 img = overlay_text(img, (WIDTH - margin - 1, 48 + spacing), pressure_desc, font_sm, align_right=True, rectangle=True) pressure_icon = Image.open( f"{path}/icons/weather-{pressure_desc.lower()}.png") img.paste(pressure_icon, (80, 48), mask=pressure_icon) # Noise at frequencies amps = noise.get_amplitudes_at_frequency_ranges([(100, 500), (500, 1000), (1000, 4000)]) amps = [n * 32 for n in amps] low_freq = amps[0] mid_freq = amps[1] high_freq = amps[2] logging.info("Temp: {}, Humid: {}, Light: {}, Press: {}".format( corr_temperature, humidity, light, pressure)) logging.info("Low Freq: {}, Mid Freq: {}, High Freq: {}".format( low_freq, mid_freq, high_freq)) if time_elapsed > 60: # Log to Influx DB influxtime = datetime.utcnow()