diff --git a/assets/capture.jpg b/assets/capture.jpg new file mode 100644 index 0000000..c947d79 Binary files /dev/null and b/assets/capture.jpg differ diff --git a/assets/favicon/android-chrome-192x192.png b/assets/favicon/android-chrome-192x192.png new file mode 100644 index 0000000..9ff5268 Binary files /dev/null and b/assets/favicon/android-chrome-192x192.png differ diff --git a/assets/favicon/android-chrome-512x512.png b/assets/favicon/android-chrome-512x512.png new file mode 100644 index 0000000..509f07f Binary files /dev/null and b/assets/favicon/android-chrome-512x512.png differ diff --git a/assets/favicon/apple-touch-icon.png b/assets/favicon/apple-touch-icon.png new file mode 100644 index 0000000..cd58ffe Binary files /dev/null and b/assets/favicon/apple-touch-icon.png differ diff --git a/assets/favicon/favicon-16x16.png b/assets/favicon/favicon-16x16.png new file mode 100644 index 0000000..25894a9 Binary files /dev/null and b/assets/favicon/favicon-16x16.png differ diff --git a/assets/favicon/favicon-32x32.png b/assets/favicon/favicon-32x32.png new file mode 100644 index 0000000..650c5c1 Binary files /dev/null and b/assets/favicon/favicon-32x32.png differ diff --git a/assets/favicon/favicon.ico b/assets/favicon/favicon.ico new file mode 100644 index 0000000..1747122 Binary files /dev/null and b/assets/favicon/favicon.ico differ diff --git a/assets/favicon/site.webmanifest b/assets/favicon/site.webmanifest new file mode 100644 index 0000000..45dc8a2 --- /dev/null +++ b/assets/favicon/site.webmanifest @@ -0,0 +1 @@ +{"name":"","short_name":"","icons":[{"src":"/android-chrome-192x192.png","sizes":"192x192","type":"image/png"},{"src":"/android-chrome-512x512.png","sizes":"512x512","type":"image/png"}],"theme_color":"#ffffff","background_color":"#ffffff","display":"standalone"} \ No newline at end of file diff --git a/server.py b/server.py new file mode 100644 index 0000000..1e55140 --- /dev/null +++ b/server.py @@ -0,0 +1,72 @@ +import os +import sys +import yaml +from flask import Flask, request, render_template, send_file, redirect, send_from_directory +from brewSensor import BCM600Sensor, DHT11Sensor, BrewSensor +from brewCamera import BrewCamera +from brewRelay import BrewRelay + +app = Flask(__name__) +brewCamera = BrewCamera(20) + +def readYaml(filePath): + loader = yaml.SafeLoader + loader.add_constructor('!Relay', BrewRelay.fromYaml) + loader.add_constructor('!bcm600', BCM600Sensor.fromYaml) + loader.add_constructor('!dht11', DHT11Sensor.fromYaml) + return yaml.load(open(filePath, "rb"), Loader=loader) + +rangers = readYaml('brew.yaml') +sensors = rangers['sensors'] +relays = rangers['relays'] + +if sys.argv[-1] == '-c': + brewCamera.spawnBackgroundCapture() + + for sensor in sensors: + sensor.spawnBackgroundSensorLog() + +def sensorTemp(location): + sensor = BrewSensor.getSensorByItsLocation(sensors, location) + if sensor: + return sensor.temp + return 'not found :(' + +@app.route('/toggle/', methods=['POST', 'GET']) +def toggle(controls): + if request.method == 'GET': + return redirect('/') + + relay = BrewRelay.getRelayByWhatItControls(relays, controls) + if relay: + relay.set(not relay.state) + if relay.controls == 'light': + brewCamera.capture() + else: + print('relay {} not found'.format(controls)) + + return redirect('/') + +@app.route('/assets/') +def assets(filename): + return send_file('./assets/{}'.format(filename)) + +@app.route('/favicon.ico') +def favicon(): + faviconPath = os.path.join(app.root_path, 'assets/favicon') + return send_from_directory(faviconPath, 'favicon.ico') + +@app.route('/feed') +def feed(): + return send_file('./foo.jpg') + +@app.route('/') +def index(): + return render_template('./index.html', + sensors=sensors, + sensorTemp=sensorTemp, + relays=relays, + captureInterval=brewCamera.interval) + +if __name__ == '__main__': + app.run(host='0.0.0.0') diff --git a/templates/index.html b/templates/index.html new file mode 100644 index 0000000..891b08a --- /dev/null +++ b/templates/index.html @@ -0,0 +1,95 @@ + + + + + + + + + Brewpi + + + +
+
+

Brewpi

+ + {% for sensor in sensors %} +

{{ sensor.location }} temp: {{ sensorTemp(sensor.location) }}°C

+ {% endfor %} + + {% for relay in relays %} +
+

{{ relay.controls }} relay is: {{ relay.state }}

+ +
+ {% endfor %} +
+ +
+

Live brew-feed

+ + Updates every {{ captureInterval }} seconds or on relay toggle + + +
+
+ +
+

Graphs

+ + +
+ + + + +