From 551ef371fd3968395420730bb1aafd5ffac18d61 Mon Sep 17 00:00:00 2001 From: Kolja Lubitz Date: Sun, 9 Jun 2019 00:36:42 +0200 Subject: [PATCH 1/6] Add deepsleep after 10 min --- .flake8 | 2 + .gitignore | 130 +++++++++++++++++++++++++++++++++++++++++++++++++++++ main.py | 125 +++++++++++++++++++++++++++++---------------------- 3 files changed, 203 insertions(+), 54 deletions(-) create mode 100644 .flake8 create mode 100644 .gitignore 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/main.py b/main.py index 45af190..164c03b 100644 --- a/main.py +++ b/main.py @@ -2,7 +2,6 @@ from machine import Timer, RTC import machine import binascii -import uos import network import pycom @@ -13,33 +12,38 @@ from config import Config +boottime = Timer.Chrono() +boottime.start() + _config = Config() _wlan = network.WLAN(id=0) -_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(): perf = Timer.Chrono() - global loop_run pycom.heartbeat(False) pycom.rgbled(0x000000) - while loop_run: - perf.start() + perf.start() + + while True: # Measure all enabled sensors data = {} if ds1820 is not None: @@ -52,15 +56,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['p'] / 100 # Pa to mBar + except Exception: log("BME280 not measuring.") if hx711 is not None: data['weight_kg'] = hx711.get_value(times=5) @@ -69,19 +74,25 @@ def start_measurement(): perf.start() if _csv is not None: _csv.add_dict(data) - if _wlan.mode() == network.WLAN.STA and _wlan.isconnected() and _beep is not None: - _beep.add(data) + if _wlan.mode() == network.WLAN.STA and _wlan.isconnected() and logger.beep is not None: + log("beep") + logger.beep.add(data) print(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)) + print('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.read()) + if machine.reset_cause() != machine.DEEPSLEEP_RESET and boottime.read() < 10 * 60: + log('sleep') + # time.sleep_ms(int(abs(time_until_measurement) * 1000)) + else: + log('deepsleep') + machine.deepsleep(int(time_until_measurement * 1000)) -_wm = WLanManager() def log(message): if _csv is not None: @@ -89,18 +100,19 @@ def log(message): else: print(message) + def enable_ap(pin=None): - global _wm, loop_run, _wlan + global _wm, _wlan print("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, @@ -112,37 +124,42 @@ def enable_ap(pin=None): rtc = RTC() rtc.init(time.gmtime(_config.get_value('general', 'general', 'initial_time'))) -_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() - if _wlan.mode() == network.WLAN.STA and _wlan.isconnected(): - try: - rtc.ntp_sync("pool.ntp.org") - except: - pass - _beep = logger.beep - start_measurement() - else: - if _config.get_value('networking', 'accesspoint', 'enabled') or _csv is None: - enable_ap() - else: - start_measurement() - else: - _wlan.deinit() - start_measurement() - except OSError: - print("error. reset machine") - machine.reset() - except: - log("error. reset machine") - machine.reset() -else: # if the reset cause is pressing the power button or reconnecting power - enable_ap() +_csv = logger.csv + +# 0. Sync Time + +# 1. Maschiene startet nicht aus deep sleep_ms +# TODO _config.get_value('general', 'general', 'button_ap_enabled') + +# 2. 10 Minuten betrieb mit sleep und wlan accesspoint + +# 3. Messen und loggen / versenden + +# 4. deep sleep + +# finaly reset + +try: + log("Starting from: {}".format(reset_causes[machine.reset_cause()])) + + if _config.get_value('networking', 'wlan', 'enabled'): + _wm.enable_client() + if _wlan.mode() == network.WLAN.STA and _wlan.isconnected(): + try: + log("Pre Time: " + rtc.now()) + rtc.ntp_sync("pool.ntp.org") + log("Time: " + 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() +finally: + machine.reset() From 0f07d5f8f2023cdca53fe885d76e3ab451b6b515 Mon Sep 17 00:00:00 2001 From: Kolja Lubitz Date: Sun, 9 Jun 2019 21:36:33 +0200 Subject: [PATCH 2/6] add logging --- main.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/main.py b/main.py index 164c03b..7685168 100644 --- a/main.py +++ b/main.py @@ -161,5 +161,7 @@ def enable_ap(pin=None): start_measurement() # _wlan.deinit() +except Exception as e: + log("Exception: " + str(e)) finally: machine.reset() From 001343273a32458b213b60a7ee0fc5d5ac2802ed Mon Sep 17 00:00:00 2001 From: Kolja Lubitz Date: Mon, 24 Jun 2019 21:32:44 +0200 Subject: [PATCH 3/6] =?UTF-8?q?Ohne=20LTE=20wacht=20der=20FiPy=20auch=20zu?= =?UTF-8?q?verl=C3=A4ssig=20wieder=20auf?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- boot.py | 4 +--- main.py | 27 +++++++++++++++++---------- 2 files changed, 18 insertions(+), 13 deletions(-) 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 9ba45df..619074f 100644 --- a/main.py +++ b/main.py @@ -4,7 +4,8 @@ import binascii import network import pycom -import sys +from network import LTE + from sensors import ds1820, hx711, bme280 import logger @@ -19,6 +20,7 @@ _config = Config() _wlan = network.WLAN(id=0) +lte = LTE() _ds_positions = {v: k for k, v in _config.get_value('sensors', 'ds1820', 'positions').items()} @@ -62,8 +64,8 @@ def start_measurement(): if bme280 is not None: try: (data['t'], - data['p'], - data['h']) = bme280.read_compensated_data() + data['p'], + data['h']) = bme280.read_compensated_data() data['p'] = data['p'] / 100 # Pa to mBar except Exception: @@ -75,9 +77,9 @@ def start_measurement(): perf.start() if _csv is not None: _csv.add_dict(data) - if _wlan.mode() == network.WLAN.STA and _wlan.isconnected() and logger.beep is not None: + if _wlan.mode() == network.WLAN.STA and _wlan.isconnected() and _beep is not None: log("beep") - logger.beep.add(data) + _beep.add(data) print(data) perf.stop() time_elapsed = perf.read() @@ -89,10 +91,15 @@ def start_measurement(): log(boottime.read()) if machine.reset_cause() != machine.DEEPSLEEP_RESET and boottime.read() < 10 * 60: log('sleep') - # time.sleep_ms(int(abs(time_until_measurement) * 1000)) + time.sleep_ms(int(abs(time_until_measurement) * 1000)) else: log('deepsleep') - machine.deepsleep(int(time_until_measurement * 1000)) + log(str(int(abs(time_until_measurement)))) + lte.attach() + lte.disconnect() + lte.dettach() + _wlan.deinit() + machine.deepsleep(int(abs(time_until_measurement * 1000))) def log(message): @@ -145,11 +152,12 @@ def enable_ap(pin=None): 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: " + rtc.now()) + log("Pre Time: " + str(rtc.now())) rtc.ntp_sync("pool.ntp.org") - log("Time: " + rtc.now()) + log("Time: " + str(rtc.now())) except Exception as e: log(str(e)) @@ -166,4 +174,3 @@ def enable_ap(pin=None): log("Exception: " + str(e)) finally: machine.reset() - From adec5cefefc60426b86e5b0bb8e94a41318ea4d4 Mon Sep 17 00:00:00 2001 From: Kolja Lubitz Date: Mon, 24 Jun 2019 21:35:23 +0200 Subject: [PATCH 4/6] Code clean up --- main.py | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/main.py b/main.py index 619074f..f245e8d 100644 --- a/main.py +++ b/main.py @@ -134,18 +134,6 @@ def enable_ap(pin=None): _csv = logger.csv -# 0. Sync Time - -# 1. Maschiene startet nicht aus deep sleep_ms -# TODO _config.get_value('general', 'general', 'button_ap_enabled') - -# 2. 10 Minuten betrieb mit sleep und wlan accesspoint - -# 3. Messen und loggen / versenden - -# 4. deep sleep - -# finaly reset try: log("Starting from: {}".format(reset_causes[machine.reset_cause()])) From 181c6a7da59212688cacc48f9a59eb39a2d7e5e3 Mon Sep 17 00:00:00 2001 From: Kolja Lubitz Date: Tue, 2 Jul 2019 21:56:42 +0200 Subject: [PATCH 5/6] it's running for awhile --- main.py | 31 ++++++++++++++++--------------- 1 file changed, 16 insertions(+), 15 deletions(-) diff --git a/main.py b/main.py index f245e8d..fad7a95 100644 --- a/main.py +++ b/main.py @@ -40,13 +40,14 @@ def start_measurement(): + AP_TIME = 2 * 60 perf = Timer.Chrono() pycom.heartbeat(False) pycom.rgbled(0x000000) perf.start() - while True: + while boottime.read() < AP_TIME: # Measure all enabled sensors data = {} if ds1820 is not None: @@ -80,26 +81,27 @@ def start_measurement(): 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('SecondsO elapsed: {:.2f}s, time until next measurement: {:.2f}s'.format(time_elapsed, time_until_measurement)) + 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.read()) - if machine.reset_cause() != machine.DEEPSLEEP_RESET and boottime.read() < 10 * 60: + 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: - log('deepsleep') - log(str(int(abs(time_until_measurement)))) - lte.attach() - lte.disconnect() lte.dettach() _wlan.deinit() machine.deepsleep(int(abs(time_until_measurement * 1000))) + log('deepsleep') + machine.deepsleep(int(abs(10 * 1000))) + + log('Unexpected exited while loop') + machine.reset() def log(message): @@ -111,7 +113,7 @@ def log(message): def enable_ap(pin=None): global _wm, _wlan - print("Called. Pin {}.".format(pin)) + log("Called. Pin {}.".format(pin)) if not _wlan.mode == network.WLAN.AP: log("enabled ap") pycom.heartbeat(False) @@ -129,13 +131,12 @@ def enable_ap(pin=None): handler=enable_ap) -rtc = RTC() -rtc.init(time.gmtime(_config.get_value('general', 'general', 'initial_time'))) - -_csv = logger.csv +try: + rtc = RTC() + rtc.init(time.gmtime(_config.get_value('general', 'general', 'initial_time'))) + _csv = logger.csv -try: log("Starting from: {}".format(reset_causes[machine.reset_cause()])) if _config.get_value('networking', 'wlan', 'enabled'): From 6d75cfe32153127be6942f8aa38b307fe3b975f3 Mon Sep 17 00:00:00 2001 From: Kolja Lubitz Date: Tue, 2 Jul 2019 21:57:15 +0200 Subject: [PATCH 6/6] Update main.py --- main.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/main.py b/main.py index fad7a95..f27bea5 100644 --- a/main.py +++ b/main.py @@ -96,8 +96,8 @@ def start_measurement(): else: lte.dettach() _wlan.deinit() - machine.deepsleep(int(abs(time_until_measurement * 1000))) log('deepsleep') + # machine.deepsleep(int(abs(time_until_measurement * 1000))) machine.deepsleep(int(abs(10 * 1000))) log('Unexpected exited while loop')