Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions .flake8
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
[flake8]
max-line-length = 160
130 changes: 130 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -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
4 changes: 1 addition & 3 deletions boot.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,4 @@
import machine
import pycom
import time

from wlanmanager import WLanManager
from network import WLAN
Expand Down Expand Up @@ -39,4 +37,4 @@
# Finished boot process #
###############################################################################

print("Boot finished.")
print("Boot finished.")
136 changes: 74 additions & 62 deletions main.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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:
Expand All @@ -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)
Expand All @@ -71,37 +79,50 @@ 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:
_csv.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,
Expand All @@ -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()