Ordner für Gitea aufgeräumt
This commit is contained in:
parent
3ef60fa954
commit
d6ec14c4ac
1
.gitignore
vendored
1
.gitignore
vendored
@ -4,3 +4,4 @@
|
|||||||
.venv
|
.venv
|
||||||
users/
|
users/
|
||||||
backup/
|
backup/
|
||||||
|
Archiv/
|
||||||
|
Binary file not shown.
@ -1,13 +0,0 @@
|
|||||||
{
|
|
||||||
"admin_user": "admin",
|
|
||||||
"admin_password": "8c6976e5b5410415bde908bd4dee15dfb167a9c873fc4bb8a81f6f2ab448a918",
|
|
||||||
"port": "8090",
|
|
||||||
"secret": "ftgzuhjikg,mt5jn46uzer8sfi9okrmtzjhndfierko5zltjhdgise",
|
|
||||||
"times_on_touchscreen": true,
|
|
||||||
"photos_on_touchscreen": true,
|
|
||||||
"touchscreen": true,
|
|
||||||
"picure_height": 200,
|
|
||||||
"button_height": 300,
|
|
||||||
"user_notes": true,
|
|
||||||
"holidays": {}
|
|
||||||
}
|
|
23
playgound.py
23
playgound.py
@ -1,23 +0,0 @@
|
|||||||
import json
|
|
||||||
import urllib.request
|
|
||||||
|
|
||||||
from nicegui import ui, app
|
|
||||||
|
|
||||||
|
|
||||||
import segno
|
|
||||||
|
|
||||||
@app.get("/data")
|
|
||||||
async def deliver_data():
|
|
||||||
with open("settings.json") as json_file:
|
|
||||||
data = json.load(json_file)
|
|
||||||
return data
|
|
||||||
|
|
||||||
string = ""
|
|
||||||
for i in range(1000):
|
|
||||||
string += str(i)
|
|
||||||
|
|
||||||
qr_code = segno.make_qr(string).svg_data_uri()
|
|
||||||
#qr_code.save("qr_code.png", scale=5, border=0)
|
|
||||||
ui.image(qr_code)
|
|
||||||
|
|
||||||
ui.run(language="de-DE", port=9000)
|
|
163
qr_scanner.py
163
qr_scanner.py
@ -1,163 +0,0 @@
|
|||||||
#!/usr/bin/env python3
|
|
||||||
import base64
|
|
||||||
import signal
|
|
||||||
import time
|
|
||||||
import argparse
|
|
||||||
import requests
|
|
||||||
|
|
||||||
import cv2
|
|
||||||
import numpy as np
|
|
||||||
from fastapi import Response
|
|
||||||
from playsound3 import playsound
|
|
||||||
from definitions import app_title, app_version
|
|
||||||
|
|
||||||
from nicegui import Client, app, core, run, ui
|
|
||||||
|
|
||||||
class Commandline_Header:
|
|
||||||
message_string = f"{app_title} {app_version}"
|
|
||||||
underline = ""
|
|
||||||
for i in range(len(message_string)):
|
|
||||||
underline += "-"
|
|
||||||
print(message_string)
|
|
||||||
print(underline)
|
|
||||||
|
|
||||||
def visual_interface(port=9000):
|
|
||||||
# In case you don't have a webcam, this will provide a black placeholder image.
|
|
||||||
black_1px = 'iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAA1JREFUGFdjYGBg+A8AAQQBAHAgZQsAAAAASUVORK5CYII='
|
|
||||||
placeholder = Response(content=base64.b64decode(black_1px.encode('ascii')), media_type='image/png')
|
|
||||||
|
|
||||||
global convert
|
|
||||||
def convert(frame: np.ndarray) -> bytes:
|
|
||||||
"""Converts a frame from OpenCV to a JPEG image.
|
|
||||||
|
|
||||||
This is a free function (not in a class or inner-function),
|
|
||||||
to allow run.cpu_bound to pickle it and send it to a separate process.
|
|
||||||
"""
|
|
||||||
_, imencode_image = cv2.imencode('.jpg', frame)
|
|
||||||
return imencode_image.tobytes()
|
|
||||||
|
|
||||||
global setup
|
|
||||||
def setup() -> None:
|
|
||||||
|
|
||||||
url_string = ""
|
|
||||||
for i in list(app.urls):
|
|
||||||
url_string += f"{i}, "
|
|
||||||
url_string = url_string[0:-2]
|
|
||||||
print("Weboberfläche erreichbar unter: " + url_string)
|
|
||||||
|
|
||||||
# OpenCV is used to access the webcam.
|
|
||||||
video_capture = cv2.VideoCapture(0)
|
|
||||||
detector = cv2.QRCodeDetector()
|
|
||||||
|
|
||||||
blocker = False
|
|
||||||
blockset = 0
|
|
||||||
|
|
||||||
|
|
||||||
@app.get('/video/frame')
|
|
||||||
# Thanks to FastAPI's `app.get` it is easy to create a web route which always provides the latest image from OpenCV.
|
|
||||||
async def grab_video_frame() -> Response:
|
|
||||||
nonlocal blocker
|
|
||||||
if time.time() - blockset > 5:
|
|
||||||
blocker = False
|
|
||||||
|
|
||||||
if not video_capture.isOpened():
|
|
||||||
return placeholder
|
|
||||||
# The `video_capture.read` call is a blocking function.
|
|
||||||
# So we run it in a separate thread (default executor) to avoid blocking the event loop.
|
|
||||||
_, frame = await run.io_bound(video_capture.read)
|
|
||||||
if frame is None:
|
|
||||||
return placeholder
|
|
||||||
# `convert` is a CPU-intensive function, so we run it in a separate process to avoid blocking the event loop and GIL.
|
|
||||||
jpeg = await run.cpu_bound(convert, frame)
|
|
||||||
|
|
||||||
# QR-Handling
|
|
||||||
|
|
||||||
def function_call():
|
|
||||||
r = requests.get(str(a))
|
|
||||||
print(r.content())
|
|
||||||
print("Inside Function_call")
|
|
||||||
#b = webbrowser.open(str(a))
|
|
||||||
if r.status_code == 200:
|
|
||||||
print('Erkannt')
|
|
||||||
if r.json()["stampstatus"]:
|
|
||||||
playsound('ui-on.mp3')
|
|
||||||
elif not r.json()["stampstatus"]:
|
|
||||||
playsound('ui-off.mp3')
|
|
||||||
else:
|
|
||||||
playsound('ui-sound.mp3')
|
|
||||||
nonlocal blocker
|
|
||||||
nonlocal blockset
|
|
||||||
blocker = True
|
|
||||||
blockset = time.time()
|
|
||||||
|
|
||||||
if not blocker:
|
|
||||||
_, img = video_capture.read()
|
|
||||||
# detect and decode
|
|
||||||
data, bbox, _ = detector.detectAndDecode(img)
|
|
||||||
# check if there is a QRCode in the image
|
|
||||||
if data:
|
|
||||||
a = data
|
|
||||||
function_call()
|
|
||||||
# cv2.imshow("QRCODEscanner", img)
|
|
||||||
if cv2.waitKey(1) == ord("q"):
|
|
||||||
function_call()
|
|
||||||
|
|
||||||
return Response(content=jpeg, media_type='image/jpeg')
|
|
||||||
|
|
||||||
# For non-flickering image updates and automatic bandwidth adaptation an interactive image is much better than `ui.image()`.
|
|
||||||
video_image = ui.interactive_image().classes('w-full h-full')
|
|
||||||
# A timer constantly updates the source of the image.
|
|
||||||
# Because data from same paths is cached by the browser,
|
|
||||||
# we must force an update by adding the current timestamp to the source.
|
|
||||||
|
|
||||||
ui.timer(interval=0.1, callback=lambda: video_image.set_source(f'/video/frame?{time.time()}'))
|
|
||||||
|
|
||||||
async def disconnect() -> None:
|
|
||||||
"""Disconnect all clients from current running server."""
|
|
||||||
for client_id in Client.instances:
|
|
||||||
await core.sio.disconnect(client_id)
|
|
||||||
|
|
||||||
def handle_sigint(signum, frame) -> None:
|
|
||||||
# `disconnect` is async, so it must be called from the event loop; we use `ui.timer` to do so.
|
|
||||||
ui.timer(0.1, disconnect, once=True)
|
|
||||||
# Delay the default handler to allow the disconnect to complete.
|
|
||||||
ui.timer(1, lambda: signal.default_int_handler(signum, frame), once=True)
|
|
||||||
|
|
||||||
async def cleanup() -> None:
|
|
||||||
# This prevents ugly stack traces when auto-reloading on code change,
|
|
||||||
# because otherwise disconnected clients try to reconnect to the newly started server.
|
|
||||||
await disconnect()
|
|
||||||
# Release the webcam hardware so it can be used by other applications again.
|
|
||||||
video_capture.release()
|
|
||||||
|
|
||||||
app.on_shutdown(cleanup)
|
|
||||||
# We also need to disconnect clients when the app is stopped with Ctrl+C,
|
|
||||||
# because otherwise they will keep requesting images which lead to unfinished subprocesses blocking the shutdown.
|
|
||||||
signal.signal(signal.SIGINT, handle_sigint)
|
|
||||||
|
|
||||||
|
|
||||||
# All the setup is only done when the server starts. This avoids the webcam being accessed
|
|
||||||
# by the auto-reload main process (see https://github.com/zauberzeug/nicegui/discussions/2321).
|
|
||||||
app.on_startup(setup)
|
|
||||||
ui.run(favicon="favicon.svg", port=port, language='de-DE', show_welcome_message=False)
|
|
||||||
|
|
||||||
if __name__ in ("__main__", "__mp_main__"):
|
|
||||||
parser = argparse.ArgumentParser(description=f'{app_title}-QR-Scanner {app_version}')
|
|
||||||
parser.add_argument('--webgui', help='Web-GUI starten', action="store_true")
|
|
||||||
parser.add_argument('-p', help="Port, über den die Weboberfläche erreichbar ist")
|
|
||||||
args = parser.parse_args()
|
|
||||||
|
|
||||||
Commandline_Header()
|
|
||||||
print("QR-Scanner")
|
|
||||||
|
|
||||||
if args.webgui:
|
|
||||||
try:
|
|
||||||
port = int(args.p)
|
|
||||||
except:
|
|
||||||
port = False
|
|
||||||
if not port == False:
|
|
||||||
visual_interface(port)
|
|
||||||
else:
|
|
||||||
print("Ungültiger Port")
|
|
||||||
print("Beende")
|
|
||||||
quit()
|
|
@ -1,22 +0,0 @@
|
|||||||
import cv2
|
|
||||||
import webbrowser
|
|
||||||
|
|
||||||
cap = cv2.VideoCapture(0)
|
|
||||||
# initialize the cv2 QRCode detector
|
|
||||||
detector = cv2.QRCodeDetector()
|
|
||||||
|
|
||||||
while True:
|
|
||||||
_, img = cap.read()
|
|
||||||
# detect and decode
|
|
||||||
data, bbox, _ = detector.detectAndDecode(img)
|
|
||||||
# check if there is a QRCode in the image
|
|
||||||
if data:
|
|
||||||
a = data
|
|
||||||
break
|
|
||||||
cv2.imshow("QRCODEscanner", img)
|
|
||||||
if cv2.waitKey(1) == ord("q"):
|
|
||||||
break
|
|
||||||
|
|
||||||
b = webbrowser.open(str(a))
|
|
||||||
cap.release()
|
|
||||||
cv2.destroyAllWindows()
|
|
@ -1,12 +0,0 @@
|
|||||||
{
|
|
||||||
"admin_user": "admin",
|
|
||||||
"admin_password": "8d969eef6ecad3c29a3a629280e686cf0c3f5d5a86aff3ca12020c923adc6c92",
|
|
||||||
"port": "8090",
|
|
||||||
"secret": "ftgzuhjikg,mt5jn46uzer8sfi9okrmtzjhndfierko5zltjhdgise",
|
|
||||||
"holidays": {
|
|
||||||
"2024-05-01": "Tag der Arbeit",
|
|
||||||
"2024-12-25": "1. Weihnachtsfeiertag",
|
|
||||||
"2025-01-01": "Neujahr",
|
|
||||||
"2025-05-01": "Tag der Arbeit"
|
|
||||||
}
|
|
||||||
}
|
|
Binary file not shown.
BIN
sounds/beep.mp3
BIN
sounds/beep.mp3
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
sounds/ui-on.mp3
BIN
sounds/ui-on.mp3
Binary file not shown.
Binary file not shown.
22
test.json
22
test.json
@ -1,22 +0,0 @@
|
|||||||
{
|
|
||||||
"2024-04-01": {
|
|
||||||
"0": "0",
|
|
||||||
"1": "8",
|
|
||||||
"2": "8",
|
|
||||||
"3": "8",
|
|
||||||
"4": "8",
|
|
||||||
"5": "8",
|
|
||||||
"6": "0",
|
|
||||||
"vacation": "30"
|
|
||||||
},
|
|
||||||
"2024-04-07": {
|
|
||||||
"0": "0",
|
|
||||||
"1": "6",
|
|
||||||
"2": "6",
|
|
||||||
"3": "6",
|
|
||||||
"4": "8",
|
|
||||||
"5": "6",
|
|
||||||
"6": "0",
|
|
||||||
"vacation": "28"
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,113 +0,0 @@
|
|||||||
#!/usr/bin/env python3
|
|
||||||
import base64
|
|
||||||
import signal
|
|
||||||
import time
|
|
||||||
import webbrowser
|
|
||||||
|
|
||||||
import cv2
|
|
||||||
import numpy as np
|
|
||||||
from fastapi import Response
|
|
||||||
|
|
||||||
from nicegui import Client, app, core, run, ui
|
|
||||||
|
|
||||||
# In case you don't have a webcam, this will provide a black placeholder image.
|
|
||||||
black_1px = 'iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAA1JREFUGFdjYGBg+A8AAQQBAHAgZQsAAAAASUVORK5CYII='
|
|
||||||
placeholder = Response(content=base64.b64decode(black_1px.encode('ascii')), media_type='image/png')
|
|
||||||
|
|
||||||
|
|
||||||
def convert(frame: np.ndarray) -> bytes:
|
|
||||||
"""Converts a frame from OpenCV to a JPEG image.
|
|
||||||
|
|
||||||
This is a free function (not in a class or inner-function),
|
|
||||||
to allow run.cpu_bound to pickle it and send it to a separate process.
|
|
||||||
"""
|
|
||||||
_, imencode_image = cv2.imencode('.jpg', frame)
|
|
||||||
return imencode_image.tobytes()
|
|
||||||
|
|
||||||
|
|
||||||
def setup() -> None:
|
|
||||||
# OpenCV is used to access the webcam.
|
|
||||||
video_capture = cv2.VideoCapture(0)
|
|
||||||
detector = cv2.QRCodeDetector()
|
|
||||||
|
|
||||||
blocker = False
|
|
||||||
blockset = 0
|
|
||||||
|
|
||||||
@app.get('/video/frame')
|
|
||||||
# Thanks to FastAPI's `app.get` it is easy to create a web route which always provides the latest image from OpenCV.
|
|
||||||
async def grab_video_frame() -> Response:
|
|
||||||
nonlocal blocker
|
|
||||||
if time.time() - blockset > 5:
|
|
||||||
blocker = False
|
|
||||||
|
|
||||||
if not video_capture.isOpened():
|
|
||||||
return placeholder
|
|
||||||
# The `video_capture.read` call is a blocking function.
|
|
||||||
# So we run it in a separate thread (default executor) to avoid blocking the event loop.
|
|
||||||
_, frame = await run.io_bound(video_capture.read)
|
|
||||||
if frame is None:
|
|
||||||
return placeholder
|
|
||||||
# `convert` is a CPU-intensive function, so we run it in a separate process to avoid blocking the event loop and GIL.
|
|
||||||
jpeg = await run.cpu_bound(convert, frame)
|
|
||||||
|
|
||||||
# QR-Handling
|
|
||||||
|
|
||||||
def function_call():
|
|
||||||
b = webbrowser.open(str(a))
|
|
||||||
print('\a')
|
|
||||||
nonlocal blocker
|
|
||||||
nonlocal blockset
|
|
||||||
blocker = True
|
|
||||||
blockset = time.time()
|
|
||||||
|
|
||||||
if not blocker:
|
|
||||||
_, img = video_capture.read()
|
|
||||||
# detect and decode
|
|
||||||
data, bbox, _ = detector.detectAndDecode(img)
|
|
||||||
# check if there is a QRCode in the image
|
|
||||||
if data:
|
|
||||||
a = data
|
|
||||||
function_call()
|
|
||||||
# cv2.imshow("QRCODEscanner", img)
|
|
||||||
if cv2.waitKey(1) == ord("q"):
|
|
||||||
function_call()
|
|
||||||
|
|
||||||
return Response(content=jpeg, media_type='image/jpeg')
|
|
||||||
|
|
||||||
# For non-flickering image updates and automatic bandwidth adaptation an interactive image is much better than `ui.image()`.
|
|
||||||
video_image = ui.interactive_image().classes('w-full h-full')
|
|
||||||
# A timer constantly updates the source of the image.
|
|
||||||
# Because data from same paths is cached by the browser,
|
|
||||||
# we must force an update by adding the current timestamp to the source.
|
|
||||||
|
|
||||||
ui.timer(interval=0.1, callback=lambda: video_image.set_source(f'/video/frame?{time.time()}'))
|
|
||||||
|
|
||||||
async def disconnect() -> None:
|
|
||||||
"""Disconnect all clients from current running server."""
|
|
||||||
for client_id in Client.instances:
|
|
||||||
await core.sio.disconnect(client_id)
|
|
||||||
|
|
||||||
def handle_sigint(signum, frame) -> None:
|
|
||||||
# `disconnect` is async, so it must be called from the event loop; we use `ui.timer` to do so.
|
|
||||||
ui.timer(0.1, disconnect, once=True)
|
|
||||||
# Delay the default handler to allow the disconnect to complete.
|
|
||||||
ui.timer(1, lambda: signal.default_int_handler(signum, frame), once=True)
|
|
||||||
|
|
||||||
async def cleanup() -> None:
|
|
||||||
# This prevents ugly stack traces when auto-reloading on code change,
|
|
||||||
# because otherwise disconnected clients try to reconnect to the newly started server.
|
|
||||||
await disconnect()
|
|
||||||
# Release the webcam hardware so it can be used by other applications again.
|
|
||||||
video_capture.release()
|
|
||||||
|
|
||||||
app.on_shutdown(cleanup)
|
|
||||||
# We also need to disconnect clients when the app is stopped with Ctrl+C,
|
|
||||||
# because otherwise they will keep requesting images which lead to unfinished subprocesses blocking the shutdown.
|
|
||||||
signal.signal(signal.SIGINT, handle_sigint)
|
|
||||||
|
|
||||||
|
|
||||||
# All the setup is only done when the server starts. This avoids the webcam being accessed
|
|
||||||
# by the auto-reload main process (see https://github.com/zauberzeug/nicegui/discussions/2321).
|
|
||||||
app.on_startup(setup)
|
|
||||||
|
|
||||||
ui.run(port=9005)
|
|
Loading…
x
Reference in New Issue
Block a user