cleanup
This commit is contained in:
parent
81eafb085f
commit
4ec7641cc9
35
src/camera.py
Normal file
35
src/camera.py
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
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()
|
||||||
|
|
BIN
src/flask/HTP
Executable file
BIN
src/flask/HTP
Executable file
Binary file not shown.
338
src/flask/api/all.json
Normal file
338
src/flask/api/all.json
Normal file
@ -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"
|
||||||
|
}
|
||||||
|
}
|
1
src/flask/api/daily.json
Normal file
1
src/flask/api/daily.json
Normal file
@ -0,0 +1 @@
|
|||||||
|
{}
|
80
src/flask/main.py
Normal file
80
src/flask/main.py
Normal file
@ -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')
|
35
src/flask/saver.py
Normal file
35
src/flask/saver.py
Normal file
@ -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")
|
||||||
|
|
||||||
|
|
24
src/flask/static/style.css
Normal file
24
src/flask/static/style.css
Normal file
@ -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;
|
||||||
|
}
|
24
src/flask/templates/index.html
Normal file
24
src/flask/templates/index.html
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
<!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>
|
130
src/oled_stats.py
Normal file
130
src/oled_stats.py
Normal file
@ -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)
|
Loading…
x
Reference in New Issue
Block a user