From 4ec7641cc9189a87f973b027b83fa3cc57715cfc Mon Sep 17 00:00:00 2001 From: podput Date: Tue, 4 Jan 2022 00:10:08 +0200 Subject: [PATCH] cleanup --- src/camera.py | 35 ++++ src/flask/HTP | Bin 0 -> 18228 bytes src/flask/api/all.json | 338 +++++++++++++++++++++++++++++++++ src/flask/api/daily.json | 1 + src/flask/main.py | 80 ++++++++ src/flask/saver.py | 35 ++++ src/flask/static/style.css | 24 +++ src/flask/templates/index.html | 24 +++ src/oled_stats.py | 130 +++++++++++++ test | 0 10 files changed, 667 insertions(+) create mode 100644 src/camera.py create mode 100755 src/flask/HTP create mode 100644 src/flask/api/all.json create mode 100644 src/flask/api/daily.json create mode 100644 src/flask/main.py create mode 100644 src/flask/saver.py create mode 100644 src/flask/static/style.css create mode 100644 src/flask/templates/index.html create mode 100644 src/oled_stats.py delete mode 100644 test diff --git a/src/camera.py b/src/camera.py new file mode 100644 index 0000000..694f59a --- /dev/null +++ b/src/camera.py @@ -0,0 +1,35 @@ +import picamera +import pyshine as ps # pip3 install pyshine==0.0.9 +HTML=""" + + +PyShine Live Streaming + + + +

PyShine Live Streaming using OpenCV

+
+ + +""" +def main(): + StreamProps = ps.StreamProps + StreamProps.set_Page(StreamProps,HTML) + address = ('0.0.0.0',9000) # Enter your IP address + StreamProps.set_Mode(StreamProps,'picamera') + with picamera.PiCamera(resolution='640x480', framerate=30) as camera: + output = ps.StreamOut() + StreamProps.set_Output(StreamProps,output) + camera.rotation = 90 + camera.start_recording(output, format='mjpeg') + try: + server = ps.Streamer(address, StreamProps) + print('Camera serving started at','http://'+address[0]+':'+str(address[1])) + server.serve_forever() + finally: + camera.stop_recording() + + +if __name__=='__main__': + main() + diff --git a/src/flask/HTP b/src/flask/HTP new file mode 100755 index 0000000000000000000000000000000000000000..a2d3a54f9a69ddec020aad06df6ccd8efe9ac592 GIT binary patch literal 18228 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 literal 0 HcmV?d00001 diff --git a/src/flask/api/all.json b/src/flask/api/all.json new file mode 100644 index 0000000..584543c --- /dev/null +++ b/src/flask/api/all.json @@ -0,0 +1,338 @@ +{ + "04:06:52": { + "temperature": "25.12C", + "pressure": "960.19hPa", + "humidity": "33.21%", + "air_quality": false, + "time": "04:06:52" + }, + "04:06:58": { + "temperature": "25.12C", + "pressure": "960.22hPa", + "humidity": "33.19%", + "air_quality": false, + "time": "04:06:58" + }, + "04:07:50": { + "temperature": "25.06C", + "pressure": "960.19hPa", + "humidity": "33.26%", + "air_quality": false, + "time": "01/02/22" + }, + "04:08:14": { + "temperature": "25.06C", + "pressure": "960.21hPa", + "humidity": "33.23%", + "air_pollution": false, + "time": "01/02/22" + }, + "22:21:30": { + "temperature": "26.07C", + "pressure": "953.17hPa", + "humidity": "33.67%", + "air_pollution": false, + "time": "01/03/22" + }, + "22:24:42": { + "temperature": "26.20C", + "pressure": "953.12hPa", + "humidity": "33.93%", + "air_pollution": false, + "time": "01/03/22" + }, + "22:26:27": { + "temperature": "26.18C", + "pressure": "953.11hPa", + "humidity": "34.19%", + "air_pollution": false, + "time": "01/03/22" + }, + "22:27:44": { + "temperature": "26.24C", + "pressure": "953.05hPa", + "humidity": "34.07%", + "air_pollution": false, + "time": "01/03/22" + }, + "22:28:10": { + "temperature": "26.22C", + "pressure": "953.06hPa", + "humidity": "34.16%", + "air_pollution": false, + "time": "01/03/22" + }, + "22:29:16": { + "temperature": "26.25C", + "pressure": "953.10hPa", + "humidity": "34.27%", + "air_pollution": false, + "time": "01/03/22" + }, + "22:30:02": { + "temperature": "26.24C", + "pressure": "953.10hPa", + "humidity": "34.28%", + "air_pollution": false, + "time": "01/03/22" + }, + "22:30:59": { + "temperature": "26.26C", + "pressure": "953.14hPa", + "humidity": "34.68%", + "air_pollution": false, + "time": "01/03/22" + }, + "22:34:52": { + "temperature": "26.25C", + "pressure": "953.17hPa", + "humidity": "34.40%", + "air_pollution": false, + "time": "01/03/22" + }, + "22:17:28": { + "temperature": "26.14C", + "pressure": "953.12hPa", + "humidity": "34.81%", + "air_pollution": false, + "time": "01/03/22" + }, + "22:39:56": { + "temperature": "26.23C", + "pressure": "953.08hPa", + "humidity": "34.97%", + "air_pollution": false, + "time": "01/03/22" + }, + "22:42:23": { + "temperature": "26.24C", + "pressure": "953.10hPa", + "humidity": "34.89%", + "air_pollution": false, + "time": "01/03/22" + }, + "22:43:45": { + "temperature": "26.16C", + "pressure": "953.07hPa", + "humidity": "35.37%", + "air_pollution": false, + "time": "01/03/22" + }, + "22:44:59": { + "temperature": "26.24C", + "pressure": "953.01hPa", + "humidity": "35.27%", + "air_pollution": false, + "time": "01/03/22" + }, + "22:45:38": { + "temperature": "26.21C", + "pressure": "952.99hPa", + "humidity": "35.36%", + "air_pollution": false, + "time": "01/03/22" + }, + "22:45:54": { + "temperature": "26.20C", + "pressure": "953.01hPa", + "humidity": "35.22%", + "air_pollution": false, + "time": "01/03/22" + }, + "22:47:05": { + "temperature": "26.18C", + "pressure": "952.85hPa", + "humidity": "35.44%", + "air_pollution": false, + "time": "01/03/22" + }, + "22:47:25": { + "temperature": "26.14C", + "pressure": "952.83hPa", + "humidity": "35.38%", + "air_pollution": false, + "time": "01/03/22" + }, + "22:50:17": { + "temperature": "26.06C", + "pressure": "952.77hPa", + "humidity": "35.76%", + "air_pollution": false, + "time": "01/03/22" + }, + "22:51:01": { + "temperature": "26.12C", + "pressure": "952.77hPa", + "humidity": "35.77%", + "air_pollution": false, + "time": "01/03/22" + }, + "22:17:25": { + "temperature": "26.09C", + "pressure": "952.79hPa", + "humidity": "36.00%", + "air_pollution": false, + "time": "01/03/22" + }, + "22:53:52": { + "temperature": "26.10C", + "pressure": "952.76hPa", + "humidity": "35.94%", + "air_pollution": false, + "time": "01/03/22" + }, + "22:56:31": { + "temperature": "26.09C", + "pressure": "952.74hPa", + "humidity": "35.91%", + "air_pollution": false, + "time": "01/03/22" + }, + "22:57:19": { + "temperature": "26.15C", + "pressure": "952.94hPa", + "humidity": "36.03%", + "air_pollution": false, + "time": "01/03/22" + }, + "23:03:05": { + "temperature": "26.25C", + "pressure": "952.85hPa", + "humidity": "35.84%", + "air_pollution": false, + "time": "01/03/22" + }, + "23:05:28": { + "temperature": "26.26C", + "pressure": "952.82hPa", + "humidity": "35.85%", + "air_pollution": false, + "time": "01/03/22" + }, + "23:06:05": { + "temperature": "25.75C", + "pressure": "952.98hPa", + "humidity": "33.05%", + "air_pollution": false, + "time": "01/03/22" + }, + "23:39:00": { + "temperature": "25.93C", + "pressure": "952.91hPa", + "humidity": "32.69%", + "air_pollution": false, + "time": "01/03/22" + }, + "23:39:33": { + "temperature": "25.97C", + "pressure": "952.92hPa", + "humidity": "32.74%", + "air_pollution": false, + "time": "01/03/22" + }, + "23:39:50": { + "temperature": "26.03C", + "pressure": "952.91hPa", + "humidity": "32.82%", + "air_pollution": false, + "time": "01/03/22" + }, + "23:44:42": { + "temperature": "25.99C", + "pressure": "952.93hPa", + "humidity": "33.10%", + "air_pollution": false, + "time": "01/03/22" + }, + "23:45:39": { + "temperature": "25.99C", + "pressure": "952.85hPa", + "humidity": "33.77%", + "air_pollution": false, + "time": "01/03/22" + }, + "23:47:43": { + "temperature": "26.00C", + "pressure": "952.82hPa", + "humidity": "33.70%", + "air_pollution": false, + "time": "01/03/22" + }, + "23:49:18": { + "temperature": "26.08C", + "pressure": "952.76hPa", + "humidity": "34.56%", + "air_pollution": false, + "time": "01/03/22" + }, + "23:54:37": { + "temperature": "26.20C", + "pressure": "952.92hPa", + "humidity": "34.15%", + "air_pollution": false, + "time": "01/03/22" + }, + "23:58:26": { + "temperature": "26.20C", + "pressure": "952.88hPa", + "humidity": "34.52%", + "air_pollution": false, + "time": "01/03/22" + }, + "00:01:46": { + "temperature": "25.66C", + "pressure": "952.87hPa", + "humidity": "28.34%", + "air_pollution": false, + "time": "01/04/22" + }, + "00:01:47": { + "temperature": "25.62C", + "pressure": "952.86hPa", + "humidity": "28.26%", + "air_pollution": false, + "time": "01/04/22" + }, + "00:01:48": { + "temperature": "25.64C", + "pressure": "952.88hPa", + "humidity": "28.22%", + "air_pollution": false, + "time": "01/04/22" + }, + "00:01:49": { + "temperature": "25.63C", + "pressure": "952.87hPa", + "humidity": "28.22%", + "air_pollution": false, + "time": "01/04/22" + }, + "00:01:51": { + "temperature": "25.62C", + "pressure": "952.88hPa", + "humidity": "28.20%", + "air_pollution": false, + "time": "01/04/22" + }, + "00:01:52": { + "temperature": "25.64C", + "pressure": "952.85hPa", + "humidity": "28.22%", + "air_pollution": false, + "time": "01/04/22" + }, + "00:01:53": { + "temperature": "25.61C", + "pressure": "952.86hPa", + "humidity": "28.25%", + "air_pollution": false, + "time": "01/04/22" + }, + "00:04:22_01/04/22": { + "temperature": "25.32C", + "pressure": "952.88hPa", + "humidity": "25.90%", + "air_pollution": false, + "time": "00:04:22" + } +} \ No newline at end of file diff --git a/src/flask/api/daily.json b/src/flask/api/daily.json new file mode 100644 index 0000000..9e26dfe --- /dev/null +++ b/src/flask/api/daily.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/src/flask/main.py b/src/flask/main.py new file mode 100644 index 0000000..2c3bd77 --- /dev/null +++ b/src/flask/main.py @@ -0,0 +1,80 @@ +from flask import Flask, render_template, jsonify, redirect, abort, request +import RPi.GPIO as gpio +from time import sleep +import subprocess +import json +import saver + +# Change this if you change the dir +HOME_DIR = "/home/pi/PWSS/" + +# MQ-135 gas sensor +def stinker(): + gpio.setmode(gpio.BCM) + gpio.setup(4, gpio.IN) + + try: + if gpio.input(4): + return False + else: + return True + sleep(2) + except KeyboardInterrupt: + pass + finally: + gpio.cleanup() + +# BME280 Humidity, Temperature, Pressure sensor +def htp(): + string = subprocess.check_output([f"{HOME_DIR}/HTP"]).decode(encoding='UTF-8',errors='strict') + string = string.split("temperature:")[1] + temperature = string.split(" pressure:")[0].replace("*C", "C") + string = string.split(" pressure:")[1] + pressure = string.split(" humidity:")[0] + humidity = string.split(" humidity:")[1].replace("\r\n", "") + result = { + "temperature":temperature.replace(" ", ""), + "pressure":pressure.replace(" ", ""), + "humidity":humidity.replace(" ", "") + } + # for i in string: + # if i.isdigit(): + # result.append(i) + + return result +# Flask server +app = Flask(__name__) + +@app.route("/") +def home(): + hpt = htp() + stank = stinker() + return render_template("index.html", HTP=hpt, stinker=stank) + +@app.route("/api/all") +def all_data(): + with open(f"{HOME_DIR}/api/all.json","r") as f: + data = json.load(f) + return jsonify(data) + + +@app.route("/api/daily") +def daily_data(): + with open(f"{HOME_DIR}/api/daily.json","r") as f: + data = json.load(f) + return jsonify(data) + + +@app.route("/api/save", methods = ['GET', 'POST']) +def save_data(): + if request.method == "POST": + print("will it save?") + saver.manual() + print("saved main") + return redirect("/") + else: + return redirect("/api/all") + + +if __name__=="__main__": + app.run(host='0.0.0.0') \ No newline at end of file diff --git a/src/flask/saver.py b/src/flask/saver.py new file mode 100644 index 0000000..6f25f79 --- /dev/null +++ b/src/flask/saver.py @@ -0,0 +1,35 @@ +from main import stinker, htp, HOME_DIR +from datetime import datetime +import pytz, json + +tz = pytz.timezone('Europe/Sofia') + + +def get(): + data = htp() + data["air_pollution"] = stinker() + data["time"] = datetime.now(tz).strftime("%H:%M:%S") + return data + +def daily(): + data = get() + with open("{HOME_DIR}/api/daily.json", "r+") as f: + f_data = json.load(f) + f_data[date] = data + f.seek(0) + json.dump(f_data, f, indent=4) + f.close() + + +def manual(): + data = get() + + with open(f"{HOME_DIR}/api/all.json", "r+") as f: + f_data = json.load(f) + f_data[f'{datetime.now(tz).strftime("%H:%M:%S")}&{datetime.now(tz).strftime("%x")}'] = data + f.seek(0) + json.dump(f_data, f, indent=4) + + print("Saved") + + diff --git a/src/flask/static/style.css b/src/flask/static/style.css new file mode 100644 index 0000000..8f8e147 --- /dev/null +++ b/src/flask/static/style.css @@ -0,0 +1,24 @@ +@import url("https://fonts.googleapis.com/css?family=Ubuntu"); + +body{ + height:100%; + display:flex; + align-items: center; + justify-content: space-around; + flex-direction: column; + font-family:"Ubuntu"; +} + +#weather-data li{ + list-style: none; +} + +#weather-data{ + font-size: xx-large; + background-color: lightgray; + padding-right: 25px; +} + +#camera{ + padding: 20px; +} \ No newline at end of file diff --git a/src/flask/templates/index.html b/src/flask/templates/index.html new file mode 100644 index 0000000..cdb4658 --- /dev/null +++ b/src/flask/templates/index.html @@ -0,0 +1,24 @@ + + + + + + + + PWSS + + + +
+
    +
  • {{stinker}}
  • + {% for i in HTP.keys() %} +
  • {{HTP[i]}}
  • + {% endfor %} +
+
+ +
+
+ + \ No newline at end of file diff --git a/src/oled_stats.py b/src/oled_stats.py new file mode 100644 index 0000000..ce1cb63 --- /dev/null +++ b/src/oled_stats.py @@ -0,0 +1,130 @@ +# Copyright (c) 2017 Adafruit Industries +# Author: Tony DiCola & James DeVito +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. +import time + +import Adafruit_GPIO.SPI as SPI +import Adafruit_SSD1306 + +from PIL import Image +from PIL import ImageDraw +from PIL import ImageFont + +import subprocess + +# Raspberry Pi pin configuration: +RST = None # on the PiOLED this pin isnt used +# Note the following are only used with SPI: +DC = 23 +SPI_PORT = 0 +SPI_DEVICE = 0 + +# Beaglebone Black pin configuration: +# RST = 'P9_12' +# Note the following are only used with SPI: +# DC = 'P9_15' +# SPI_PORT = 1 +# SPI_DEVICE = 0 + +# 128x32 display with hardware I2C: +disp = Adafruit_SSD1306.SSD1306_128_32(rst=RST) + +# 128x64 display with hardware I2C: +# disp = Adafruit_SSD1306.SSD1306_128_64(rst=RST) + +# Note you can change the I2C address by passing an i2c_address parameter like: +# disp = Adafruit_SSD1306.SSD1306_128_64(rst=RST, i2c_address=0x3C) + +# Alternatively you can specify an explicit I2C bus number, for example +# with the 128x32 display you would use: +# disp = Adafruit_SSD1306.SSD1306_128_32(rst=RST, i2c_bus=2) + +# 128x32 display with hardware SPI: +# disp = Adafruit_SSD1306.SSD1306_128_32(rst=RST, dc=DC, spi=SPI.SpiDev(SPI_PORT, SPI_DEVICE, max_speed_hz=8000000)) + +# 128x64 display with hardware SPI: +# disp = Adafruit_SSD1306.SSD1306_128_64(rst=RST, dc=DC, spi=SPI.SpiDev(SPI_PORT, SPI_DEVICE, max_speed_hz=8000000)) + +# Alternatively you can specify a software SPI implementation by providing +# digital GPIO pin numbers for all the required display pins. For example +# on a Raspberry Pi with the 128x32 display you might use: +# disp = Adafruit_SSD1306.SSD1306_128_32(rst=RST, dc=DC, sclk=18, din=25, cs=22) + +# Initialize library. +disp.begin() + +# Clear display. +disp.clear() +disp.display() + +# Create blank image for drawing. +# Make sure to create image with mode '1' for 1-bit color. +width = disp.width +height = disp.height +image = Image.new('1', (width, height)) + +# Get drawing object to draw on image. +draw = ImageDraw.Draw(image) + +# Draw a black filled box to clear the image. +draw.rectangle((0,0,width,height), outline=0, fill=0) + +# Draw some shapes. +# First define some constants to allow easy resizing of shapes. +padding = -2 +top = padding +bottom = height-padding +# Move left to right keeping track of the current x position for drawing shapes. +x = 0 + + +# Load default font. +font = ImageFont.load_default() + +# Alternatively load a TTF font. Make sure the .ttf font file is in the same directory as the python script! +# Some other nice fonts to try: http://www.dafont.com/bitmap.php +# font = ImageFont.truetype('Minecraftia.ttf', 8) + +while True: + + # Draw a black filled box to clear the image. + draw.rectangle((0,0,width,height), outline=0, fill=0) + + # Shell scripts for system monitoring from here : https://unix.stackexchange.com/questions/119126/command-to-display-memory-usage-disk-usage-and-cpu-load + cmd = "hostname -I | cut -d\' \' -f1" + IP = subprocess.check_output(cmd, shell = True ) + cmd = "top -bn1 | grep load | awk '{printf \"CPU Load: %.2f\", $(NF-2)}'" + CPU = subprocess.check_output(cmd, shell = True ) + cmd = "free -m | awk 'NR==2{printf \"Mem: %s/%sMB %.2f%%\", $3,$2,$3*100/$2 }'" + MemUsage = subprocess.check_output(cmd, shell = True ) + cmd = "df -h | awk '$NF==\"/\"{printf \"Disk: %d/%dGB %s\", $3,$2,$5}'" + Disk = subprocess.check_output(cmd, shell = True ) + + # Write two lines of text. + + draw.text((x, top), "IP: " + str(IP), font=font, fill=255) + draw.text((x, top+8), str(CPU), font=font, fill=255) + draw.text((x, top+16), str(MemUsage), font=font, fill=255) + draw.text((x, top+25), str(Disk), font=font, fill=255) + + # Display image. + disp.image(image) + disp.display() + time.sleep(.1) diff --git a/test b/test deleted file mode 100644 index e69de29..0000000