diff --git a/.flake8 b/.flake8 new file mode 100644 index 0000000..1fd4893 --- /dev/null +++ b/.flake8 @@ -0,0 +1,2 @@ +[flake8] +max-line-length = 160 diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..5568589 --- /dev/null +++ b/.gitignore @@ -0,0 +1,130 @@ + +# Created by https://www.gitignore.io/api/python +# Edit at https://www.gitignore.io/?templates=python + +### Python ### +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class + +# C extensions +*.so + +# Distribution / packaging +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +pip-wheel-metadata/ +share/python-wheels/ +*.egg-info/ +.installed.cfg +*.egg +MANIFEST + +# PyInstaller +# Usually these files are written by a python script from a template +# before PyInstaller builds the exe, so as to inject date/other infos into it. +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.nox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*.cover +.hypothesis/ +.pytest_cache/ + +# Translations +*.mo +*.pot + +# Django stuff: +*.log +local_settings.py +db.sqlite3 + +# Flask stuff: +instance/ +.webassets-cache + +# Scrapy stuff: +.scrapy + +# Sphinx documentation +docs/_build/ + +# PyBuilder +target/ + +# Jupyter Notebook +.ipynb_checkpoints + +# IPython +profile_default/ +ipython_config.py + +# pyenv +.python-version + +# pipenv +# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. +# However, in case of collaboration, if having platform-specific dependencies or dependencies +# having no cross-platform support, pipenv may install dependencies that don’t work, or not +# install all needed dependencies. +#Pipfile.lock + +# celery beat schedule file +celerybeat-schedule + +# SageMath parsed files +*.sage.py + +# Environments +.env +.venv +env/ +venv/ +ENV/ +env.bak/ +venv.bak/ + +# Spyder project settings +.spyderproject +.spyproject + +# Rope project settings +.ropeproject + +# mkdocs documentation +/site + +# mypy +.mypy_cache/ +.dmypy.json +dmypy.json + +# Pyre type checker +.pyre/ + +# End of https://www.gitignore.io/api/python diff --git a/boot.py b/boot.py index c1ba6e7..0a827e5 100644 --- a/boot.py +++ b/boot.py @@ -1,6 +1,4 @@ -import machine import pycom -import time from wlanmanager import WLanManager from network import WLAN @@ -39,4 +37,4 @@ # Finished boot process # ############################################################################### -print("Boot finished.") \ No newline at end of file +print("Boot finished.") diff --git a/main.py b/main.py index 41c9cab..f27bea5 100644 --- a/main.py +++ b/main.py @@ -2,10 +2,10 @@ from machine import Timer, RTC import machine import binascii -import uos import network import pycom -import sys +from network import LTE + from sensors import ds1820, hx711, bme280 import logger @@ -14,33 +14,40 @@ from config import Config +boottime = Timer.Chrono() +boottime.start() + _config = Config() _wlan = network.WLAN(id=0) +lte = LTE() -_ds_positions = {v: k for k, v in +_ds_positions = {v: k for k, v in _config.get_value('sensors', 'ds1820', 'positions').items()} +_wm = WLanManager() + reset_causes = { - machine.PWRON_RESET: 'PWRON', # Press reset button on FiPy + machine.PWRON_RESET: 'PWRON', # Press reset button on FiPy machine.HARD_RESET: 'HARD', - machine.WDT_RESET: 'WDT', # Upload and restart from USB or machine.reset() + machine.WDT_RESET: 'WDT', # Upload and restart from USB or machine.reset() machine.DEEPSLEEP_RESET: 'DEEPSLEEP', machine.SOFT_RESET: 'SOFT', machine.BROWN_OUT_RESET: 'BROWN_OUT' } measurement_interval = _config.get_value('general', 'general', 'measurement_interval') -loop_run = True + def start_measurement(): + AP_TIME = 2 * 60 perf = Timer.Chrono() - global loop_run pycom.heartbeat(False) pycom.rgbled(0x000000) - while loop_run: - perf.start() + perf.start() + + while boottime.read() < AP_TIME: # Measure all enabled sensors data = {} if ds1820 is not None: @@ -53,15 +60,16 @@ def start_measurement(): ds_name = binascii.hexlify(rom).decode('utf-8') if ds_name in _ds_positions: data[_ds_positions[ds_name]] = ds_measurement - except: - log("Did not find rom") + except Exception as e: + log("Did not find rom" + str(e)) if bme280 is not None: try: (data['t'], - data['p'], - data['h']) = bme280.read_compensated_data() - data['p'] = data['p']/100 # Pa to mBar - except: + data['p'], + data['h']) = bme280.read_compensated_data() + + data['p'] = data['p'] / 100 # Pa to mBar + except Exception: log("BME280 not measuring.") if hx711 is not None: data['weight_kg'] = hx711.get_value(times=5) @@ -71,18 +79,30 @@ def start_measurement(): if _csv is not None: _csv.add_dict(data) if _wlan.mode() == network.WLAN.STA and _wlan.isconnected() and _beep is not None: + log("beep") _beep.add(data) - print(data) + log(data) perf.stop() time_elapsed = perf.read() perf.reset() time_until_measurement = measurement_interval - time_elapsed - print('Seconds elapsed: {:.2f}s, time until next measurement: {:.2f}s'.format(time_elapsed, time_until_measurement)) - if time_until_measurement > 0: - time.sleep_ms(int(time_until_measurement * 1000)) + log('SecondsO elapsed: {:.2f}s, time until next measurement: {:.2f}s'.format(time_elapsed, time_until_measurement)) + # 10 Minuten nach dem Strom an soll der AC da sein. + log('boottime: ' + str(boottime.read())) + if machine.reset_cause() != machine.DEEPSLEEP_RESET and boottime.read() < AP_TIME: + log('sleep') + time.sleep_ms(int(abs(time_until_measurement) * 1000)) + else: + lte.dettach() + _wlan.deinit() + log('deepsleep') + # machine.deepsleep(int(abs(time_until_measurement * 1000))) + machine.deepsleep(int(abs(10 * 1000))) + + log('Unexpected exited while loop') + machine.reset() -_wm = WLanManager() def log(message): if _csv is not None: @@ -90,18 +110,19 @@ def log(message): else: print(message) + def enable_ap(pin=None): - global _wm, loop_run, _wlan - print("Called. Pin {}.".format(pin)) + global _wm, _wlan + log("Called. Pin {}.".format(pin)) if not _wlan.mode == network.WLAN.AP: log("enabled ap") pycom.heartbeat(False) pycom.rgbled(0x111100) - loop_run = False getattr(_wm, 'enable_ap')() if not webserver.mws.IsStarted(): webserver.mws.Start(threaded=True) + if _config.get_value('general', 'general', 'button_ap_enabled'): button_ap = machine.Pin(_config.get_value('general', 'general', 'button_ap_pin'), mode=machine.Pin.IN, @@ -110,44 +131,35 @@ def enable_ap(pin=None): handler=enable_ap) -rtc = RTC() -rtc.init(time.gmtime(_config.get_value('general', 'general', 'initial_time'))) +try: + rtc = RTC() + rtc.init(time.gmtime(_config.get_value('general', 'general', 'initial_time'))) -_csv = logger.csv + _csv = logger.csv -print("SSID: {}".format(_config.get_value('networking', 'accesspoint', 'ssid'))) -log("Cause of restart: {}".format(reset_causes[machine.reset_cause()])) -log("Starting...") -# if the reset cause is not pressing the power button or reconnecting power -if (machine.reset_cause() != 0 or - _config.get_value('general', 'general', 'button_ap_enabled')): - try: - if _config.get_value('networking', 'wlan', 'enabled'): - _wm.enable_client() - _beep = logger.beep - if _wlan.mode() == network.WLAN.STA and _wlan.isconnected(): - try: - rtc.ntp_sync("pool.ntp.org") - except: - pass - start_measurement() - else: - if ((_config.get_value('networking', 'accesspoint', 'enabled') - or _csv is None) - and not _config.get_value('general', 'general', 'button_ap_enabled')): - enable_ap() - else: - start_measurement() - else: - _wlan.deinit() - start_measurement() - except OSError as e: - print(e) - print("error. reset machine") - machine.reset() - except: - print(sys.exc_info()[0]) - print("error. reset machine") - machine.reset() -else: # if the reset cause is pressing the power button or reconnecting power - enable_ap() + log("Starting from: {}".format(reset_causes[machine.reset_cause()])) + + if _config.get_value('networking', 'wlan', 'enabled'): + _wm.enable_client() + _beep = logger.beep + if _wlan.mode() == network.WLAN.STA and _wlan.isconnected(): + try: + log("Pre Time: " + str(rtc.now())) + rtc.ntp_sync("pool.ntp.org") + log("Time: " + str(rtc.now())) + except Exception as e: + log(str(e)) + + if machine.reset_cause() != machine.DEEPSLEEP_RESET: + log("Start AP") + # _thread.start_new_thread(enable_ap, ()) + enable_ap() + + log(boottime.read()) + start_measurement() + + # _wlan.deinit() +except Exception as e: + log("Exception: " + str(e)) +finally: + machine.reset()