This commit is contained in:
podput 2022-01-04 00:11:01 +02:00
parent 4ec7641cc9
commit 5daa54d5c6
7 changed files with 0 additions and 363 deletions

View File

@ -1,35 +0,0 @@
import picamera
import pyshine as ps # pip3 install pyshine==0.0.9
HTML="""
<html>
<head>
<title>PyShine Live Streaming</title>
</head>
<body>
<center><h1> PyShine Live Streaming using OpenCV </h1></center>
<center><img src="stream.mjpg" width='640' height='480' autoplay></center>
</body>
</html>
"""
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()

80
main.py
View File

@ -1,80 +0,0 @@
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')

View File

@ -1,35 +0,0 @@
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")

View File

@ -1,24 +0,0 @@
@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;
}

130
stats.py
View File

@ -1,130 +0,0 @@
# 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)

View File

@ -1,35 +0,0 @@
from main import stinker, htp
from datetime import datetime
import pytz, json
tz = pytz.timezone('Europe/Sofia')
date = datetime.now(tz).strftime("%x")
specific_time = datetime.now(tz).strftime("%H:%M:%S")
def get_data():
data = htp()
data["air_pollution"] = stinker()
data["time"] = specific_time
return data
def daily_data():
data = get_data()
with open("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():
data = get_data()
data["time"] = date
with open("api/all.json", "r+") as f:
f_data = json.load(f)
f_data[specific_time] = data
f.seek(0)
json.dump(f_data, f, indent=4)
f.close()
manual_data()

View File

@ -1,24 +0,0 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="stylesheet" href="{{ url_for('static', filename='style.css') }}">
<title>PWSS</title>
</head>
<body>
<img id="camera" src="http://openwebrx.local:9000/stream.mjpg" width="640" height="480" autoplay="">
<div id="weather-data">
<ul>
<li>{{stinker}}</li>
{% for i in HTP.keys() %}
<li>{{HTP[i]}}</li>
{% endfor %}
</ul>
<form action="/api/save" method="post">
<button type="submit" name="foo" value="upvote"> Save data </button>
</form>
</div>
</body>
</html>