예제 #1
0
def get_settings():
    settings = {}

    try:
        my_file = Path(settingsFile)
        my_abs_path = my_file.resolve()

        if str(getpwuid(os.stat(settingsFile).st_uid).pw_name) != "www-data":
            os.system("sudo chown www-data " + str(settingsFile))
        if str(getgrgid(os.stat(settingsFile).st_gid).gr_name) != "www-data":
            os.system("sudo chgrp www-data " + str(settingsFile))

        # Check wittypi_scheduleFile
        if os.path.exists(wittypi_scheduleFile):
            if str(getpwuid(os.stat(
                    wittypi_scheduleFile).st_uid).pw_name) != "www-data":
                os.system("sudo chown www-data " + str(wittypi_scheduleFile))
            if str(getgrgid(os.stat(
                    wittypi_scheduleFile).st_gid).gr_name) != "www-data":
                os.system("sudo chgrp www-data " + str(wittypi_scheduleFile))

        with io.open(settingsFile, encoding="utf-8") as data_file:
            settings = json.loads(data_file.read())
    except Exception as ex:
        error_log(
            "Warning: Loading default settings because File does not exist.")
        # FileNotFoundError: doesn't exist => default values
        # FileReadError / json.loads Error => default values
        settings = get_defaults()
        write_settings(settings)

    settings = validate_settings(settings)
    return settings
예제 #2
0
def write_csv(ts_fields):
    try:
        csv_file = scriptsFolder + '/offline.csv'
        # Allowed ThingSpeak fields:
        csv_columns = [
            'datetime', 'field1', 'field2', 'field3', 'field4', 'field5',
            'field6', 'field7', 'field8', 'latitude', 'longitude', 'elevation',
            'status'
        ]
        check_file(csv_file, 5, 10, 1)

        # Create row with data
        row = {}
        row['datetime'] = datetime.now()
        for key, value in ts_fields.items():
            row[key] = str(value)

        # Write to CSV File
        write_header = (not os.path.isfile(csv_file)
                        or os.stat(csv_file).st_size == 0
                        )  # exists or is empty
        with io.open(csv_file, 'a', newline='', encoding='utf8') as csvfile:
            writer = csv.DictWriter(csvfile,
                                    fieldnames=csv_columns,
                                    extrasaction='ignore',
                                    delimiter=',',
                                    lineterminator='\n')
            if write_header:
                writer.writeheader()  # file doesn't exist yet, write a header
            writer.writerow(row)

    except IOError as ex1:
        error_log(ex1, "Write-CSV IOError")
    except Exception as ex:
        error_log(ex, "Write-CSV Exception")
예제 #3
0
 async def event_command_error(self, ctx: commands.Context, error: Exception):
     if type(error) == commands.errors.CommandNotFound:
         await ctx.send("[Not a valid command!]")
         return
     print(f'"{type(error)}"')
     print(f'"{commands.errors.CommandNotFound}"')
     traceback.print_exception(type(error), error, error.__traceback__)
     error_log(f"({type(error)})\n{error}\n{error.__traceback__}")
예제 #4
0
async def routine_check_better_server():
    print("[Subroutine] Better Server Check")
    try:
        while CFG.crashed:
            print("[Better Server Check] Currently crashed, waiting...")
            await async_sleep(60)
        await CFG.add_action_queue(ActionQueueItem("check_for_better_server"))
    except Exception:
        error_log(traceback.format_exc())
예제 #5
0
async def routine_crash_check():
    if CFG.crashed:
        return
    try:
        crashed = await do_crash_check()
        if crashed:
            print("[Routine] Crash detected")
            await CFG.add_action_queue(ActionQueueItem("handle_crash"))
            await async_sleep(60)
    except Exception:
        error_log(traceback.format_exc())
예제 #6
0
async def routine_anti_afk():
    print("[Subroutine] AntiAFK")
    try:
        await CFG.add_action_queue(ActionQueueItem("anti_afk"))
        CFG.anti_afk_runs += 1
        if CFG.anti_afk_runs % 3 == 0:
            await CFG.add_action_queue(ActionQueueItem("chat", {"msgs": ["/clear"]}))
            await CFG.add_action_queue(ActionQueueItem("advert"))
            print("[Subroutine] Queued Advert")
            CFG.anti_afk_runs = 0
    except Exception:
        error_log(traceback.format_exc())
예제 #7
0
def main():
    global isActive, measurement_stop, measurement, debug, gpio, GPIO_LED

    # setup LED
    #GPIO.setwarnings(False) # Ignore warning for now
    GPIO.setmode(GPIO.BCM)  # Zaehlweise der GPIO-PINS auf der Platine
    GPIO.setup(GPIO_LED, GPIO.OUT)  # Set pin 21 to led output

    # by default is AccessPoint down
    stop_ap(1)

    # blink with LED on startup
    blink_led()

    settings = get_settings()  # read settings for number of GPIO pin
    debug = settings[
        "debug"]  # flag to enable debug mode (HDMI output enabled and no rebooting)
    if not debug:
        # stop HDMI power (save energy)
        print("Shutting down HDMI to save energy.")
        stop_tv()

    if debug:
        error_log("Info: Raspberry Pi has been powered on.")

    # Create virtual uap0 for WLAN
    create_ap()
    # start as seperate background thread
    # because Taster pressing was not recognised
    measurement_stop = threading.Event()  # create event to stop measurement
    measurement = threading.Thread(target=start_measurement,
                                   args=(measurement_stop, ))
    measurement.start()  # start measurement

    # setup Button
    gpio = settings["button_pin"]  # read pin from settings
    GPIO.setup(
        gpio, GPIO.IN, pull_up_down=GPIO.PUD_DOWN
    )  # Set pin 16 to be an input pin and set initial value to be pulled low (off)
    bouncetime = 300  # ignoring further edges for 300ms for switch bounce handling
    # register button press event
    GPIO.add_event_detect(gpio,
                          GPIO.BOTH,
                          callback=button_pressed,
                          bouncetime=bouncetime)

    # Main Lopp: Cancel with STRG+C
    while True:
        time.sleep(0.2)  # wait 200 ms to give CPU chance to do other things
        pass

    print("This text will never be printed.")
def manage_transfer_to_ts(ts_channels, ts_fields, server_url, offline, debug):
    # update ThingSpeak / transfer values
    connectionErrorHappened = transfer_all_channels_to_ts(
        ts_channels, ts_fields, server_url, debug)

    if connectionErrorHappened:
        # Write to CSV-File if ConnectionError occured
        if offline == 2:
            s = write_csv(ts_fields, ts_channels)
            if s and debug:
                error_log("Info: Data succesfully saved to CSV-File.")

    return connectionErrorHappened
예제 #9
0
def button_pressed_falling():
    global time_start, debug
    time_end = miliseconds()
    time_elapsed = time_end - time_start
    MIN_TIME_TO_ELAPSE = 500  # miliseconds
    MAX_TIME_TO_ELAPSE = 3000
    if time_elapsed >= MIN_TIME_TO_ELAPSE and time_elapsed <= MAX_TIME_TO_ELAPSE:
        time_start = 0  # reset to prevent multiple fallings from the same rising
        toggle_measurement()
    elif time_elapsed >= 5000 and time_elapsed <= 10000:
        time_start = 0  # reset to prevent multiple fallings from the same rising
        shutdown()
    elif debug:
        error_log(
            "Info: Too short Button press, Too long Button press OR inteference occured."
        )
예제 #10
0
def measure_voltage(ts_sensor):
    fields = {}

    # I2C-address of YL-40 PCF8591
    address = 0x48

    try:
        # Create I2C instance and open the bus
        PCF8591 = smbus.SMBus(get_smbus())

        # read pin from ts_sensor settings
        if 'pin' in ts_sensor and ts_sensor['pin'] is not None:
            pin = int(ts_sensor['pin'])
        else:
            pin = 2

        # AIN0 => Pin 0
        # AIN1 => Pin 1
        # AIN2 => Pin 2 (default)
        # AIN3 => Pin 3

        #factor = 0.09765625 # 25V/256 (=5V analog output signal)
        factor = 16.5 / 256  # 16.5V/256 | 16.5V max voltage for 0xff (=3.3V analog output signal)
        if 'I2CVoltage' in ts_sensor and ts_sensor['I2CVoltage'] is not None:
            # convert 8 bit number to voltage
            factor = float(ts_sensor['I2CVoltage']) / 256

        PCF8591.write_byte(address, 0x40 +
                           pin)  # set channel to AIN0, AIN1, AIN2 or AIN3

        # measure once just for fun
        _v = PCF8591.read_byte(address)

        Voltage_8bit = PCF8591.read_byte(address)  # = i2cget -y 1 0x48
        voltage = Voltage_8bit * factor  # convert 8 bit number to voltage

        if 'ts_field' in ts_sensor and isinstance(voltage, (int, float)):
            fields[ts_sensor["ts_field"]] = round(voltage, 4)

        return fields

    except Exception as e:
        error_log(
            e,
            'Error while reading PCF8591 (Voltage). Is the Sensor connected?')

    return None
예제 #11
0
def measure_aht10(ts_sensor):
    try:
        fields = {}
        temperature,humidity = read_aht10(DEVICE)
        # ThingSpeak fields
        # Create returned dict if ts_field is defined
        if 'ts_field_temperature' in ts_sensor and isinstance(temperature, (int, float)):
            if 'offset' in ts_sensor and ts_sensor["offset"] is not None:
                temperature = temperature-ts_sensor["offset"]
            fields[ts_sensor["ts_field_temperature"]] = round(temperature, 2)
        if 'ts_field_humidity' in ts_sensor and isinstance(humidity, (int, float)):
            fields[ts_sensor["ts_field_humidity"]] = round(humidity, 2)
        return fields
        
    except Exception as e:
        error_log(e, 'Error: Error while reading AHT10 Sensor. Is it connected?')
    return None
예제 #12
0
def toggle_measurement():
    global isActive, measurement_stop, measurement
    if isActive == 0:
        print("Button was pressed: Stop measurement")
        # stop the measurement by event's flag
        measurement_stop.set()
        start_ap()  # finally start AP
    else:
        print("Button was pressed: Start measurement")
        if measurement.is_alive():
            error_log("Warning: Thread should not be active anymore")
        measurement_stop.clear()  # reset flag
        measurement_stop = threading.Event(
        )  # create event to stop measurement
        measurement = threading.Thread(target=start_measurement,
                                       args=(measurement_stop, ))
        measurement.start()  # start measurement
        stop_ap()  # finally stop AP
예제 #13
0
def button_pressed_falling():
    global time_rising, debug
    time_falling = miliseconds()
    time_elapsed = time_falling - time_rising
    time_rising = 0  # reset to prevent multiple fallings from the same rising
    MIN_TIME_TO_ELAPSE = 500  # miliseconds
    MAX_TIME_TO_ELAPSE = 3000
    stop_led()
    if time_elapsed >= MIN_TIME_TO_ELAPSE and time_elapsed <= MAX_TIME_TO_ELAPSE:
        toggle_measurement()
    elif time_elapsed >= 5000 and time_elapsed <= 10000:
        shutdown()
    elif time_elapsed >= 10000 and time_elapsed <= 15000:
        delete_settings()
        shutdown()
    elif debug:
        error_log(
            "Info: Too short Button press, Too long Button press OR inteference occured: "
            + str(time_elapsed) + "ms elapsed.")
예제 #14
0
async def routine_ocr():
    if (
        CFG.action_running
        or CFG.crashed
        or (not CFG.chat_cleared_after_response)
        or (not CFG.chat_ocr_ready)
    ):
        return

    if not CFG.chat_ocr_active:
        if not CFG.chat_ocr_activation_queued and await can_activate_ocr():
            await CFG.add_action_queue(ActionQueueItem("activate_ocr"))
    else:
        try:
            # HACK: psuedo-blocking, make non-async
            CFG.chat_ocr_ready = False
            await do_chat_ocr()
        except Exception:
            CFG.chat_ocr_ready = True
            CFG.chat_cleared_after_response = True
            error_log(traceback.format_exc())
예제 #15
0
def diag():
    diag = ""
    try:
        os.system(
            "echo '\n\nUnterspannung seit Bootvorgang:\n' >> /tmp/diag.txt")
        os.system("sudo vcgencmd get_throttled >> /tmp/diag.txt")
        os.system(
            "echo '0x50000 = Unterspannung seit Systemstart\n' > /tmp/diag.txt"
        )
        os.system(
            "echo '0x50005 = Unterspannung seit Systemstart\n\n' > /tmp/diag.txt"
        )
        os.system("echo 'ifconfig:\n' > /tmp/diag.txt")
        os.system("sudo ifconfig >> /tmp/diag.txt")
        os.system("echo '\n\nroute:\n' >> /tmp/diag.txt")
        os.system("sudo route >> /tmp/diag.txt")
        os.system("echo '\n\nWLAN0 status:\n' >> /tmp/diag.txt")
        os.system("sudo wpa_cli -i wlan0 status >> /tmp/diag.txt")
        os.system("echo '\n\nlsusb:\n' >> /tmp/diag.txt")
        os.system("sudo lsusb >> /tmp/diag.txt")
        os.system("echo '\n\ndmesg:\n' >> /tmp/diag.txt")
        os.system("sudo dmesg | grep USB >> /tmp/diag.txt")
        os.system("sudo dmesg | grep ttyUSB >> /tmp/diag.txt")
        os.system("echo '\n\nttyUSB*:\n' >> /tmp/diag.txt")
        os.system("sudo ls -la /dev/ttyUSB* >> /tmp/diag.txt")
        os.system("echo '\n\nlog:\n' >> /tmp/diag.txt")
        os.system(
            "sudo grep -a -B 2 -A 2 'usb_modeswitch\|modem\|pppd\|PPP\|ppp0\|ttyUSB0\|wvdial' /var/log/messages >> /tmp/diag.txt"
        )
        os.system("echo '\n\nFirmware:\n' >> /tmp/diag.txt")
        os.system("sudo uname -a >> /tmp/diag.txt")
        with io.open("/tmp/diag.txt", encoding="utf-8") as data_file:
            diag = data_file.read()
        return diag

    except Exception as e:
        error_log(e, "Unhandled Exception in diag")

    # Error occured
    return diag
예제 #16
0
def _measure_all():
    address = 0x5e  #I2C-address of EE-895

    try:
        # Create I2C instance and open the bus
        EE895 = smbus.SMBus(get_smbus())

        _c = EE895.read_word_data(address, 0x0)  # co2
        _t = EE895.read_word_data(address, 0x2)  # temp
        _p = EE895.read_word_data(address, 0x6)  # pressure

        co = _switchBit(_c)
        temp = _switchBit(_t) / 100
        pressure = _switchBit(_p) / 10

        return co, temp, pressure

    except Exception as e:
        error_log(e,
                  'Error: Error while reading EE895 Sensor. Is it connected?')

    return None, None, None
예제 #17
0
def measurement():
    # dict with all fields and values which will be tranfered to ThingSpeak later
    ts_fields = {}
    try:
        # load settings
        settings = get_settings()
        # read configured sensors from settings.json
        ds18b20Sensors = get_sensors(settings, 0)
        bme680Sensors = get_sensors(settings, 1)
        weightSensors = get_sensors(settings, 2)
        dhtSensors = get_sensors(settings, 3)
        tcSensors = get_sensors(settings, 4)
        bme280Sensors = get_sensors(settings, 5)
        voltageSensors = get_sensors(settings, 6)
        ee895Sensors = get_sensors(settings, 7)
        aht10Sensors = get_sensors(settings, 8)
        sht31Sensors = get_sensors(settings, 9)
        hdc1008Sensors = get_sensors(settings, 10)
        bme680IsInitialized = {}

        # if bme680 is configured
        for (sensorIndex, bme680Sensor) in enumerate(bme680Sensors):
            bme680IsInitialized[sensorIndex] = 0
            bme680IsInitialized[sensorIndex] = initBME680FromMain(bme680Sensor)

        ts_fields = measure_all_sensors(False, None, ds18b20Sensors,
                                        bme680Sensors, bme680IsInitialized,
                                        dhtSensors, aht10Sensors, sht31Sensors,
                                        hdc1008Sensors, tcSensors,
                                        bme280Sensors, voltageSensors,
                                        ee895Sensors, weightSensors, None)
        return json.dumps(ts_fields)

    except Exception as e:
        error_log(e, "Unhandled Exception in Measurement 2")

    # Error occured
    return {}
예제 #18
0
def measure_ee895(ts_sensor):

    fields = {}
    try:
        #read all values from sensor
        co2, temp, pressure = _measure_all()

        # ThingSpeak fields
        # Create returned dict if ts-field is defined
        if 'ts_field' in ts_sensor and isinstance(co2, (int, float)):
            fields[ts_sensor["ts_field"]] = round(co2, 2)
        if 'ts_field_temperature' in ts_sensor and isinstance(
                temp, (int, float)):
            fields[ts_sensor["ts_field_temperature"]] = round(temp, 1)
        if 'ts_field_air_pressure' in ts_sensor and isinstance(
                pressure, (int, float)):
            fields[ts_sensor["ts_field_air_pressure"]] = round(pressure, 1)
    except OSError:
        error_log('Warning: No EE895 Sensor connected.')
    except Exception as ex:
        error_log(ex, 'Error: Error while measuring EE895 Sensor.')

    return fields
예제 #19
0
def transfer_all_channels_to_ts(ts_channels, ts_fields, server_url, debug):
    connectionErrorWithinAnyChannel = []
    for (channelIndex, channel) in enumerate(ts_channels, 0):
        channel_id = channel["ts_channel_id"]
        write_key = channel["ts_write_key"]
        if channel_id and write_key:
            if debug:
                print('Channel ' + str(channelIndex) + ' with ID ' +
                      str(channel_id))
            ts_fields_cleaned = clean_fields(ts_fields, channelIndex, False)
            if ts_fields_cleaned:
                connectionError = upload_single_channel(
                    write_key, ts_fields_cleaned, server_url, debug)
                connectionErrorWithinAnyChannel.append(connectionError)
            else:
                error_log(
                    "Warning: No ThingSpeak data transfer because no fields defined for Channel "
                    + str(channelIndex))
        else:
            error_log("Warning: No ThingSpeak upload for this channel (" +
                      str(channelIndex) +
                      ") because because channel_id or write_key is None.")

    return any(c == True for c in connectionErrorWithinAnyChannel)
예제 #20
0
    GPIO.setup(
        gpio, GPIO.IN, pull_up_down=GPIO.PUD_DOWN
    )  # Set pin 16 to be an input pin and set initial value to be pulled low (off)
    bouncetime = 300  # ignoring further edges for 300ms for switch bounce handling
    # register button press event
    GPIO.add_event_detect(gpio,
                          GPIO.BOTH,
                          callback=button_pressed,
                          bouncetime=bouncetime)

    # Main Lopp: Cancel with STRG+C
    while True:
        time.sleep(0.2)  # wait 200 ms to give CPU chance to do other things
        pass

    print("This text will never be printed.")


if __name__ == '__main__':
    try:
        main()

    except (KeyboardInterrupt, SystemExit):
        close_script()

    except Exception as e:
        error_log(e, "Unhandled Exception in Main")
        if not debug:
            time.sleep(60)
            reboot()
예제 #21
0
def position_enum_values():
    starttime = time.time()
    csvfile = utilities.opencsv()
    api_url, headers = utilities.login()
    for i, row in enumerate(csvfile, 1):
        try:
            enum_value_uri = row[0]
            desired_position = row[1]
            get_enum_value = requests.get(api_url + enum_value_uri,
                                          headers=headers).json()
            enum_value_json = requests.post(
                api_url + enum_value_uri + '/position?position=' +
                desired_position,
                headers=headers,
                data=json.dumps(get_enum_val)).json()
        except Exception as exc:
            logging.debug(record_uri)
            logging.exception('Error: ')
            print(record_uri)
            print(traceback.format_exc())
    logging.debug('Total update attempts: ' + str(i))
    logging.debug('Records updated successfully: ' + str(x))
    print('All Done!')
    print('Total update attempts: ' + str(i))
    print('Records updated successfully: ' + str(x))
    utilities.keeptime(starttime)


if __name__ == "__main__":
    utilities.error_log()
    position_enum_values()
예제 #22
0
        # ThingSpeak fields
        # Create returned dict if ts-field is defined
        if 'ts_field' in ts_sensor and isinstance(co2, (int, float)):
            fields[ts_sensor["ts_field"]] = round(co2, 2)
        if 'ts_field_temperature' in ts_sensor and isinstance(
                temp, (int, float)):
            fields[ts_sensor["ts_field_temperature"]] = round(temp, 1)
        if 'ts_field_air_pressure' in ts_sensor and isinstance(
                pressure, (int, float)):
            fields[ts_sensor["ts_field_air_pressure"]] = round(pressure, 1)
    except OSError:
        error_log('Warning: No EE895 Sensor connected.')
    except Exception as ex:
        error_log(ex, 'Error: Error while measuring EE895 Sensor.')

    return fields


if __name__ == '__main__':
    try:

        # just for testing the values
        print(measure_raw())

    except (KeyboardInterrupt, SystemExit):
        pass

    except Exception as e:
        error_log(e, "Unhandled Exception in EE895 Measurement")
예제 #23
0
def start_measurement(measurement_stop):
    try:
        start_time = time.time()

        # load settings
        settings = get_settings()
        # ThingSpeak data
        channel_id = settings["ts_channel_id"]
        write_key = settings["ts_write_key"]
        interval = settings["interval"]
        debug = settings[
            "debug"]  # flag to enable debug mode (HDMI output enabled and no rebooting)
        shutdownAfterTransfer = settings["shutdownAfterTransfer"]
        offline = settings["offline"]  # flag to enable offline csv storage

        if debug:
            print("Debug-Mode is enabled.")
            error_log("Info: The measurements have started.")

        # with process shared variables
        connectionErrors = Value('i', 0)
        measurementIsRunning = Value('i', 0)

        if interval and not isinstance(
                interval,
                int) or interval == 0 or not channel_id or not write_key:
            error_log(
                "Info: No measurement because ThingSpeak settings are not complete or measurement interval is null."
            )
            measurement_stop.set()

        # read configured sensors from settings.json
        ds18b20Sensors = get_sensors(settings, 0)
        bme680Sensors = get_sensors(settings, 1)
        weightSensors = get_sensors(settings, 2)
        dhtSensors = get_sensors(settings, 3)
        tcSensors = get_sensors(settings, 4)
        bme280Sensors = get_sensors(settings, 5)

        # -- Run Pre Configuration --
        # if bme680 is configured
        if bme680Sensors and len(bme680Sensors) == 1:
            bme680IsInitialized = initBME680FromMain()
        else:
            bme680IsInitialized = 0

        # if hx711 is set
        hxInits = []
        for (i, sensor) in enumerate(weightSensors):
            _hx = init_hx711(sensor, debug)
            hxInits.append(_hx)

        # ThingSpeak channel
        channel = thingspeak.Channel(id=channel_id, write_key=write_key)

        # start at -6 because we want to get 6 values before we can filter some out
        counter = -6
        time_measured = 0
        while not measurement_stop.is_set():
            counter += 1

            # read values from sensors every second
            for (sensorIndex, sensor) in enumerate(ds18b20Sensors):
                checkIfSensorExistsInArray(sensorIndex)
                if 'device_id' in sensor:
                    read_unfiltered_temperatur_values(sensorIndex,
                                                      sensor['device_id'])

            # wait seconds of interval before next check
            # free ThingSpeak account has an upload limit of 15 seconds
            time_now = time.time()
            isTimeToMeasure = (time_now - time_measured >= interval
                               ) and counter > 0  # old: counter%interval == 0
            if isTimeToMeasure or interval == 1:
                now = time.strftime("%H:%M", time.localtime(time_now))
                lastMeasurement = time.strftime("%H:%M",
                                                time.localtime(time_measured))
                if time_measured == 0:
                    print("First time measurement. Now: " + str(now))
                else:
                    print("Last measurement was at " + str(lastMeasurement))
                    print("Time over for a new measurement. Time is now: " +
                          str(now))
                time_measured = time.time()

                if measurementIsRunning.value == 0:
                    q = Queue()
                    p = Process(target=measure,
                                args=(offline, debug, channel,
                                      filtered_temperature, ds18b20Sensors,
                                      bme680Sensors, bme680IsInitialized,
                                      dhtSensors, tcSensors, bme280Sensors,
                                      weightSensors, hxInits, connectionErrors,
                                      measurementIsRunning))
                    p.start()
                    p.join()
                else:
                    error_log(
                        "Warning: Forerun measurement is not finished yet. Consider increasing interval."
                    )

                # stop measurements after uploading once
                if interval == 1:
                    print("Only one measurement was set => stop measurements.")
                    measurement_stop.set()

                    if shutdownAfterTransfer:
                        print(
                            "Shutting down was set => Waiting 10seconds and then shutdown."
                        )
                        time.sleep(10)
                        shutdown()

            time.sleep(6)  # wait 6 seconds before next measurement check

        end_time = time.time()
        time_taken = end_time - start_time  # time_taken is in seconds
        time_taken_s = float(
            "{0:.2f}".format(time_taken))  # remove microseconds
        print("Measurement-Script runtime was " + str(time_taken_s) +
              " seconds.")

    except Exception as e:
        error_log(e, "Unhandled Exception while Measurement")
        if not debug:
            time.sleep(10)
            reboot()
예제 #24
0
def measure_all_sensors(debug, filtered_temperature, ds18b20Sensors,
                        bme680Sensors, bme680IsInitialized, dhtSensors,
                        aht10Sensors, sht31Sensors, hdc1008Sensors, tcSensors,
                        bme280Sensors, voltageSensors, ee895Sensors,
                        weightSensors, hxInits):

    ts_fields = {
    }  # dict with all fields and values which will be tranfered to ThingSpeak later
    try:

        # measure every sensor with type 0 (Ds18b20)
        try:
            for (sensorIndex, sensor) in enumerate(ds18b20Sensors):
                filter_temperatur_values(sensorIndex)
        except Exception as e:
            error_log(
                e,
                "Unhandled Exception in measure_all_sensors / ds18b20Sensors filter_temperatur_values"
            )

        try:
            for (sensorIndex, sensor) in enumerate(ds18b20Sensors):
                if filtered_temperature is not None and len(
                        filtered_temperature[sensorIndex]
                ) > 0 and 'ts_field' in sensor:
                    # if we have at leat one filtered value we can upload
                    ds18b20_temperature = filtered_temperature[
                        sensorIndex].pop()
                    if sensor["ts_field"] and ds18b20_temperature is not None:
                        if 'offset' in sensor and sensor["offset"] is not None:
                            ds18b20_temperature = ds18b20_temperature - float(
                                sensor["offset"])
                        ds18b20_temperature = float("{0:.2f}".format(
                            ds18b20_temperature))  # round to two decimals
                        ts_fields.update(
                            {sensor["ts_field"]: ds18b20_temperature})
                elif 'ts_field' in sensor:
                    # Case for filtered_temperature was not filled, use direct measured temperture in this case
                    ds18b20_temperature = measure_temperature(sensor)
                    if sensor["ts_field"] and ds18b20_temperature is not None:
                        if 'offset' in sensor and sensor["offset"] is not None:
                            ds18b20_temperature = ds18b20_temperature - float(
                                sensor["offset"])
                        ds18b20_temperature = float("{0:.2f}".format(
                            ds18b20_temperature))  # round to two decimals
                        ts_fields.update(
                            {sensor["ts_field"]: ds18b20_temperature})
        except Exception as e:
            error_log(
                e,
                "Unhandled Exception in measure_all_sensors / ds18b20Sensors")

        # measure BME680 (can only be one) [type 1]
        for (sensorIndex, bme680Sensor) in enumerate(bme680Sensors):
            if bme680IsInitialized[sensorIndex]:
                bme680_values = measure_bme680(bme680Sensor, 30)
                ts_fields.update(bme680_values)

        # measure every sensor with type 3 [DHT11/DHT22]
        for (i, sensor) in enumerate(dhtSensors):
            tempAndHum = measure_dht(sensor)
            ts_fields.update(tempAndHum)

        # measure every sensor with type 4 [MAX6675]
        for (i, sensor) in enumerate(tcSensors):
            tc_temp = measure_tc(sensor)
            ts_fields.update(tc_temp)

        # measure BME280 (can only be one) [type 5]
        if bme280Sensors and len(bme280Sensors) == 1:
            bme280_values = measure_bme280(bme280Sensors[0])
            ts_fields.update(bme280_values)

        # measure YL-40 PFC8591 (can only be one) [type 6]
        if voltageSensors and len(voltageSensors) == 1:
            voltage = measure_voltage(voltageSensors[0])
            if voltage is not None:
                ts_fields.update(voltage)

        # measure EE895 (can only be one) [type 7]
        if ee895Sensors and len(ee895Sensors) == 1:
            ee895_values = measure_ee895(ee895Sensors[0])
            if ee895_values is not None:
                ts_fields.update(ee895_values)

        # measure AHT10 (can only be one) [type 8]
        if aht10Sensors and len(aht10Sensors) == 1:
            aht10_fields = measure_aht10(aht10Sensors[0])
            if aht10_fields is not None:
                ts_fields.update(aht10_fields)

        # measure sht31 (can only be one) [type 9]
        if sht31Sensors and len(sht31Sensors) == 1:
            sht31_fields = measure_sht31(sht31Sensors[0])
            if sht31_fields is not None:
                ts_fields.update(sht31_fields)

        # measure hdc1008 (can only be one) [type 10]
        if hdc1008Sensors and len(hdc1008Sensors) == 1:
            hdc1008_fields = measure_hdc1008(hdc1008Sensors[0])
            if hdc1008_fields is not None:
                ts_fields.update(hdc1008_fields)

        # measure every sensor with type 2 [HX711]
        start_single()
        for (i, sensor) in enumerate(weightSensors):
            if hxInits is not None:
                weight = measure_weight(sensor, hxInits[i], debug)
                weight = compensate_temperature(sensor, weight, ts_fields)
                ts_fields.update(weight)
            else:
                weight = measure_weight(sensor)
                weight = compensate_temperature(sensor, weight, ts_fields)
                ts_fields.update(weight)
        stop_single()

        # print all measurement values stored in ts_fields
        if debug:
            for key, value in ts_fields.items():
                print(key + ": " + str(value))
        return ts_fields
    except Exception as ex:
        error_log(ex, "Exception during measurement 1")
        return ts_fields
from read_hx711 import measure_weight
from utilities import start_single, stop_single, blockPrinting, error_log
import sys

@blockPrinting
def get_weight(sensor):
    start_single()
    weight = measure_weight(sensor)
    stop_single()

    # return weight in gramms
    return weight

if __name__ == '__main__':
    try:

        weight_sensor = {}
        weight_sensor["pin_dt"] = int(sys.argv[1])
        weight_sensor["pin_sck"] = int(sys.argv[2])
        weight_sensor["channel"] = sys.argv[3]
        weight_sensor["offset"] = 0
        weight_sensor["reference_unit"] = 1

        print(get_weight(weight_sensor))

    except (KeyboardInterrupt, SystemExit):
        pass

    except Exception as e:
        error_log(e, "Unhandled Exception in Weight Measurement")
예제 #26
0
def measure(offline, debug, channel, filtered_temperature, ds18b20Sensors,
            bme680Sensors, bme680IsInitialized, dhtSensors, tcSensors,
            bme280Sensors, weightSensors, hxInits, connectionErrors,
            measurementIsRunning):
    measurementIsRunning.value = 1  # set flag

    # filter the values out
    for (sensorIndex, sensor) in enumerate(ds18b20Sensors):
        filter_temperatur_values(sensorIndex)

    # dict with all fields and values which will be tranfered to ThingSpeak later
    ts_fields = {}

    # measure every sensor with type 0
    for (sensorIndex, sensor) in enumerate(ds18b20Sensors):
        # if we have at leat one filtered value we can upload
        if len(filtered_temperature[sensorIndex]) > 0 and 'ts_field' in sensor:
            ds18b20_temperature = filtered_temperature[sensorIndex].pop(
            )  # get last value from array
            ts_field_ds18b20 = sensor["ts_field"]
            if ts_field_ds18b20:
                ts_fields.update({ts_field_ds18b20: ds18b20_temperature})

    # measure BME680 (can only be one) [type 1]
    if bme680Sensors and len(bme680Sensors) == 1 and bme680IsInitialized:
        bme680_values = measure_bme680(bme680Sensors[0], 30)
        ts_fields.update(bme680_values)

    # measure every sensor with type 3 [DHT11/DHT22]
    for (i, sensor) in enumerate(dhtSensors):
        tempAndHum = measure_dht(sensor)
        ts_fields.update(tempAndHum)

    # measure every sensor with type 4 [MAX6675]
    for (i, sensor) in enumerate(tcSensors):
        tc_temp = measure_tc(sensor)
        ts_fields.update(tc_temp)

    # measure BME280 (can only be one) [type 5]
    if bme280Sensors and len(bme280Sensors) == 1:
        bme280_values = measure_bme280(bme280Sensors[0])
        ts_fields.update(bme280_values)

    start_single()
    # measure every sensor with type 2 [HX711]
    for (i, sensor) in enumerate(weightSensors):
        weight = measure_weight(sensor, hxInits[i])
        weight = compensate_temperature(sensor, weight, ts_fields)
        ts_fields.update(weight)
    stop_single()

    # print all measurement values stored in ts_fields
    for key, value in ts_fields.items():
        print(key + ": " + str(value))

    if len(ts_fields) > 0:
        if offline == 1 or offline == 3:
            try:
                s = write_csv(ts_fields)
                if s and debug:
                    error_log("Info: Data succesfully saved to CSV-File.")
            except Exception as ex:
                error_log(ex, "Exception")

        # if transfer to thingspeak is set
        if offline == 0 or offline == 1 or offline == 2:

            # do-while to retry failed transfer
            retries = 0
            connectionError = True
            while True:
                try:
                    # update ThingSpeak / transfer values
                    channel.update(ts_fields)
                    if debug:
                        error_log(
                            "Info: Data succesfully transfered to ThingSpeak.")
                    if connectionErrors.value > 0:
                        if debug:
                            error_log("Info: Connection Errors (" +
                                      str(connectionErrors.value) +
                                      ") Counting resetet.")
                        # reset connectionErrors because transfer succeded
                        connectionErrors.value = 0
                    # break do-while because transfer succeded
                    connectionError = False
                    break
                except requests.exceptions.HTTPError as errh:
                    error_log(errh, "Http Error")
                except requests.exceptions.ConnectionError as errc:
                    pass
                except requests.exceptions.Timeout as errt:
                    error_log(errt, "Timeout Error")
                except requests.exceptions.RequestException as err:
                    error_log(err, "Something Else")
                except Exception as ex:
                    error_log(ex, "Exception while sending Data")
                finally:
                    if connectionError:
                        print(
                            "Warning: Waiting for internet connection to try transfer again..."
                        )
                        wait_for_internet_connection(
                            15)  # wait before next try
                        retries += 1
                        # Maximum 3 retries
                        if retries >= 3:
                            break  # break do-while

            if connectionError:
                # Write to CSV-File if ConnectionError occured
                if offline == 2:
                    s = write_csv(ts_fields)
                    if s and debug:
                        error_log("Info: Data succesfully saved to CSV-File.")
                # Do Rebooting if to many connectionErrors in a row
                connectionErrors.value += 1
                error_log("Error: Failed internet connection. Count: " +
                          str(connectionErrors.value))
                if connectionErrors.value >= 5:
                    if not debug:
                        error_log(
                            "Info: Too many ConnectionErrors in a row => Rebooting"
                        )
                        time.sleep(4)
                        reboot()
                    else:
                        error_log(
                            "Info: Did not reboot because debug mode is enabled."
                        )

    elif debug:
        error_log("Info: No measurement data to send.")

    measurementIsRunning.value = 0  # clear flag
예제 #27
0
        # if bme680 is configured
        for (sensorIndex, bme680Sensor) in enumerate(bme680Sensors):
            bme680IsInitialized[sensorIndex] = 0
            bme680IsInitialized[sensorIndex] = initBME680FromMain(bme680Sensor)

        ts_fields = measure_all_sensors(False, None, ds18b20Sensors,
                                        bme680Sensors, bme680IsInitialized,
                                        dhtSensors, aht10Sensors, sht31Sensors,
                                        hdc1008Sensors, tcSensors,
                                        bme280Sensors, voltageSensors,
                                        ee895Sensors, weightSensors, None)
        return json.dumps(ts_fields)

    except Exception as e:
        error_log(e, "Unhandled Exception in Measurement 2")

    # Error occured
    return {}


if __name__ == '__main__':
    try:
        print(measurement())

    except (KeyboardInterrupt, SystemExit):
        pass

    except Exception as e:
        error_log(e, "Unhandled Exception in Measurement 3")
예제 #28
0
        # Create returned dict if ts_field is defined
        if 'ts_field_temperature' in ts_sensor and isinstance(
                temperature, (int, float)):
            if 'offset' in ts_sensor and ts_sensor["offset"] is not None:
                temperature = temperature - ts_sensor["offset"]
            fields[ts_sensor["ts_field_temperature"]] = round(temperature, 2)
        if 'ts_field_humidity' in ts_sensor and isinstance(
                humidity, (int, float)):
            fields[ts_sensor["ts_field_humidity"]] = round(humidity, 2)
        return fields

    except Exception as e:
        error_log(e,
                  'Error: Error while reading SHT3x Sensor. Is it connected?')
    return None


if __name__ == '__main__':
    try:

        cTemp, humidity = read_sht31(DEVICE)

        print("Temperature:", cTemp, "C")
        print("Humidity:", humidity, "%RH")

    except (KeyboardInterrupt, SystemExit):
        pass

    except Exception as e:
        error_log(e, "Unhandled Exception in SHT31 Measurement")
예제 #29
0
def upload_single_channel(write_key, ts_fields_cleaned, server_url, debug):
    # do-while to retry failed transfer
    retries = 0
    MAX_RETRIES = 3
    isConnectionError = True
    while isConnectionError:
        try:
            thingspeak_update(write_key, ts_fields_cleaned, server_url)
            if debug:
                error_log("Info: Data succesfully transfered to ThingSpeak.")
            # break because transfer succeded
            isConnectionError = False
            break
        except requests.exceptions.HTTPError as errh:
            error_log(errh,
                      "Warning: Propaply a wrong ThingSpeak WRITE API-Key.")
        except requests.exceptions.ConnectionError as errc:
            pass
        except requests.exceptions.Timeout as errt:
            error_log(errt, "Error: Timeout Error")
        except requests.exceptions.RequestException as err:
            error_log(err, "Error: Something Else")
        except Exception as ex:
            error_log(ex, "Error: Exception while sending Data")
        finally:
            if isConnectionError:
                retries += 1
                # Break after 3 retries
                if retries > MAX_RETRIES:
                    break
                error_log(
                    "Warning: Waiting 15 seconds for internet connection to try transfer again ("
                    + str(retries) + "/" + str(MAX_RETRIES) + ")...")
                wait_for_internet_connection(15)

    return isConnectionError
예제 #30
0
        os.system("sudo dmesg | grep USB >> /tmp/diag.txt")
        os.system("sudo dmesg | grep ttyUSB >> /tmp/diag.txt")
        os.system("echo '\n\nttyUSB*:\n' >> /tmp/diag.txt")
        os.system("sudo ls -la /dev/ttyUSB* >> /tmp/diag.txt")
        os.system("echo '\n\nlog:\n' >> /tmp/diag.txt")
        os.system(
            "sudo grep -a -B 2 -A 2 'usb_modeswitch\|modem\|pppd\|PPP\|ppp0\|ttyUSB0\|wvdial' /var/log/messages >> /tmp/diag.txt"
        )
        os.system("echo '\n\nFirmware:\n' >> /tmp/diag.txt")
        os.system("sudo uname -a >> /tmp/diag.txt")
        with io.open("/tmp/diag.txt", encoding="utf-8") as data_file:
            diag = data_file.read()
        return diag

    except Exception as e:
        error_log(e, "Unhandled Exception in diag")

    # Error occured
    return diag


if __name__ == '__main__':
    try:
        print(diag())

    except (KeyboardInterrupt, SystemExit):
        pass

    except Exception as e:
        error_log(e, "Unhandled Exception in diag")