示例#1
0
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')
示例#2
0
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)
示例#3
0
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
示例#4
0
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()