Nochmal zum Verständnis. Ich hatte eine neue Projektdatei per SFTP hochgeladen und den logger neu gestartet. Nach kurzer Zeit crashed er immer mit dem Fehler. Ich habe dann eine alte Projektdatei genutzt und auch dort kam der Fehler.
Dann habe ich ein Backup von Lens aus November eingespielt. Hier lief sowohl die neue als auch die alte Datei ohne Probleme.
Jetzt habe ich mich mal eingelesen und verschiedene Versionen über git checkout versucht. Komischerweise kann ich mit der neusten Projektedatei alle Versionen nutzen. Auch die aktuelle wirft keinen Fehler mehr aus. Ich verstehe es nicht und versuche es zu reproduzieren aber noch ist es mir nicht gelungen.
Somit aktuell neuste Lens-Version von git, neuste Projektdatei und auch nach Restart des Systems läuft alles ohne Problem. Ich werde jetzt nochmal ein bisschen spielen und schauen, ob ich den Fehler irgendwie reproduzieren kann.
Ankündigung
Einklappen
Keine Ankündigung bisher.
Vorstellung: KNX-Lens
Einklappen
X
-
Funktioniert der aktuelle Code mit der vorherigen projektdatei?
Einen Kommentar schreiben:
-
Habe ich bei Github irgendwie nicht gefunden, kenne nur die Release Versionen und da werden mir keine angezeigt. Muss ich mal Google fragen, wie das gehtZitat von henfri Beitrag anzeigenIn github kannst du zu beliebigen älteren Versionen zurückgehen.
Ja, habe verschiedene Projekt-Dateien versucht. Neue erstellt und auch alte Projekt-Backups eingespielt. Nur der Lens-Code aus November wirft keinen Fehler aus, auch mit der neuen Projektdatei. Der aktuelle Code läuft nach kurzem Anlauf immer in diesen Fehler.Zitat von henfri Beitrag anzeigenHast du es nochmal mit der älteren projektdatei versucht?
Einen Kommentar schreiben:
-
In github kannst du zu beliebigen älteren Versionen zurückgehen.
Hast du es nochmal mit der älteren projektdatei versucht?
Einen Kommentar schreiben:
-
Ich befürchte, dass es seit der letzten Anpassung von uns Probleme macht. Scheinbar hat es was mit unserer letzten Anpassung des Datei Uploads was zu tun. Ich habe ein Backup von davor eingespielt, welches keine Probleme hatte. Allerdings ist das aus November, ein anderes hatte ich leider nicht mehr.
henfri: Hast du noch eine Version ohne den Dateiupload? Auf Git liegt leider auch keine Version. Dann würde ich mal weiter testen.
Einen Kommentar schreiben:
-
Ich habe in letzter Zeit einige Anpassungen meiner Projektdatei gemacht und sie neu hochgeladen. Nun hat der Logger ständig ein Problem, was ich aber absolut nicht nachvollziehen kann. Auch Google und ChatGPT können mir nicht wirklich weiterhelfen. Jemand eine Idee, woran das liegen könnte:
Code:root@knx-lens:~# systemctl status -full knx-lens-logger.service systemctl: invalid option -- 'u' root@knx-lens:~# systemctl status -l knx-lens-logger.service * knx-lens-logger.service - KNX Lens Logger Service Loaded: loaded (/etc/systemd/system/knx-lens-logger.service; enabled; preset: enabled) Active: inactive (dead) since Fri 2026-04-03 16:51:11 CEST; 1min 15s ago Duration: 14.887s Process: 433 ExecStart=/root/knx-lens/.venv/bin/python /root/knx-lens/knx-lens-logger.py --daemon (code=exited, status=0/SUCCES> Main PID: 433 (code=exited, status=0/SUCCESS) CPU: 14.872s Apr 03 16:51:11 knx-lens python[433]: File "/usr/lib/python3.11/asyncio/base_events.py", line 653, in run_until_complete Apr 03 16:51:11 knx-lens python[433]: return future.result() Apr 03 16:51:11 knx-lens python[433]: ^^^^^^^^^^^^^^^ Apr 03 16:51:11 knx-lens python[433]: File "/root/knx-lens/knx-lens-logger.py", line 285, in start_logger_mode Apr 03 16:51:11 knx-lens python[433]: xknx.knxproj = knx_project Apr 03 16:51:11 knx-lens python[433]: ^^^^^^^^^^^^ Apr 03 16:51:11 knx-lens python[433]: AttributeError: 'XKNX' object has no attribute 'knxproj' Apr 03 16:51:11 knx-lens python[433]: 2026-04-03 16:51:11,037 [INFO] root: Anwendung heruntergefahren. Apr 03 16:51:11 knx-lens systemd[1]: knx-lens-logger.service: Deactivated successfully. Apr 03 16:51:11 knx-lens systemd[1]: knx-lens-logger.service: Consumed 14.872s CPU time.
Einen Kommentar schreiben:
-
Geht nicht so einfach.
Das Framework textual ist dafür da, Anwendungen gleichermaßen an der Kommandozeile und im Browser verfügbar zu machen.
In der Kommandozeile macht ein Upload button halt keinen Sinn und deshalb gibt es das halt 😁 m Framework nicht.
- Likes 1
Einen Kommentar schreiben:
-
Habe es mal installiert und getestet. Scheint gut zu funktionieren, vielen Dank
Den Teil mit einem Upload über die Website hast du bewusst nicht mit übernommen?
Einen Kommentar schreiben:
-
Selbst mit KI Hilfe (GitHub Copilot, kann Code bei mir ändern und ausführen, ein Gamechanger) erstellt und der deinen Vorschlag gegeben.
- Likes 1
Einen Kommentar schreiben:
-
Haste selbst was erstellt oder auf dem ChatGPT Vorschlag aufgebaut?
Auf jeden Fall schon mal vielen Dank. Hoffe, dass ich am Wochenende zum Testen komme
Einen Kommentar schreiben:
-
Ich hab das Laden der Projektdatei via Dateibrowser implementiert - aber nur einmal kurz getestet.
Gruß,
Hendrik
- Likes 1
Einen Kommentar schreiben:
-
Ne, kam ich noch nicht zu. Hab es mir quasi aus Langeweile unterwegs mal erstellen lassen und würde es die Tage mal Test. Falls einer schneller ist, go for it
Einen Kommentar schreiben:
-
Wie gesagt, bin ich leider kein Entwickler aber falls jemand Lust hat, das nachgefragt Feature umzusetzen, ich habe ChatGPT mal eine Grundlage dafür schreiben lassen. Wer mag, der kann darauf aufsetzen. Da ich leider weder weiß, wie man Fehler findet noch sonst was, kann ich nicht weiter dabei helfen. Sorry:
-------
Perfekt 👍
Hier ist ein Git-Patch im unified diff Format, der:- Upload-Ordner ergänzt
- Upload-Route hinzufügt
- Reload-Funktion ergänzt
- HTML-Formular einbaut
Ich gehe davon aus, dass:- knx-lens-web.py im Root liegt
- Templates unter templates/index.html liegen
- Das Projekt aktuell beim Start bereits einmal eingelesen wird
📦 Git Patch (unified diff)
Code:diff --git a/knx-lens-web.py b/knx-lens-web.py index 1234567..abcdef0 100644 --- a/knx-lens-web.py +++ b/knx-lens-web.py @@ -1,6 +1,16 @@ import os +from werkzeug.utils import secure_filename +from flask import request, redirect, flash app = Flask(__name__) +# -------------------------------------------------- +# Upload-Konfiguration +# -------------------------------------------------- +UPLOAD_FOLDER = os.path.join(os.getcwd(), "uploaded_projects") +ALLOWED_EXTENSIONS = {"knxproj"} +os.makedirs(UPLOAD_FOLDER, exist_ok=True) +app.config["UPLOAD_FOLDER"] = UPLOAD_FOLDER +app.config["MAX_CONTENT_LENGTH"] = 50 * 1024 * 1024 # 50 MB # -------------------------------------------------- # Bestehende Projekt-Initialisierung @@ -20,6 +30,41 @@ knx_project = load_project_from_env() +# -------------------------------------------------- +# Hilfsfunktion: Dateiendung prüfen +# -------------------------------------------------- +def allowed_file(filename): + return "." in filename and \ + filename.rsplit(".", 1)[1].lower() in ALLOWED_EXTENSIONS + + +# -------------------------------------------------- +# Projekt neu laden +# -------------------------------------------------- +def reload_project(path): + global knx_project + try: + knx_project = None + knx_project = load_project(path) # Bestehende Projekt-Ladefunktion verwenden! + print(f"Projekt neu geladen: {path}") + except Exception as e: + print(f"Fehler beim Neuladen: {e}") + + +# -------------------------------------------------- +# Upload-Route +# -------------------------------------------------- +@app.route("/upload_project", methods=["POST"]) +def upload_project(): + if "project_file" not in request.files: + flash("Keine Datei ausgewählt") + return redirect("/") + + file = request.files["project_file"] + + if file.filename == "": + flash("Dateiname leer") + return redirect("/") + + if not allowed_file(file.filename): + flash("Nur .knxproj Dateien erlaubt") + return redirect("/") + + # Alte Dateien löschen (optional: nur eine Projektdatei aktiv) + for f in os.listdir(app.config["UPLOAD_FOLDER"]): + os.remove(os.path.join(app.config["UPLOAD_FOLDER"], f)) + + filename = secure_filename(file.filename) + save_path = os.path.join(app.config["UPLOAD_FOLDER"], filename) + file.save(save_path) + + reload_project(save_path) + + flash("Projekt erfolgreich hochgeladen und neu geladen") + return redirect("/") + if __name__ == "__main__": app.run(host="0.0.0.0", port=5000) diff --git a/templates/index.html b/templates/index.html index 7654321..fedcba9 100644 --- a/templates/index.html +++ b/templates/index.html @@ -10,6 +10,29 @@ <body> + <!-- Flash-Messages --> + {% with messages = get_flashed_messages() %} + {% if messages %} + <ul style="color: green;"> + {% for message in messages %} + <li>{{ message }}</li> + {% endfor %} + </ul> + {% endif %} + {% endwith %} + + <hr> + <h3>Neues ETS-Projekt hochladen</h3> + + <form action="/upload_project" method="POST" enctype="multipart/form-data"> + <input type="file" + name="project_file" + accept=".knxproj" + required> + <button type="submit">Projekt hochladen</button> + </form> + <!-- Bestehender Seiteninhalt --> </body> </html>
🛠 Anwendung des Patches
Datei z. B. speichern als:
Dann im Projektordner ausführen:Code:knx-lens-upload.patch
Oder:Code:git apply knx-lens-upload.patch
Code:patch -p1 < knx-lens-upload.patch
⚠ Wichtiger Hinweis
Du musst in dieser Zeile:
die tatsächliche bestehende Projektladefunktion von KNX-Lens einsetzenCode:knx_project = load_project(path)
(z. B. load_project_from_env() oder wie sie im Original heißt).
Einen Kommentar schreiben:
-
Kann ich verstehen, muss ja auch nicht. Wie gesagt, das wäre *für mich* der einzige Grund warum das neu laden per Web was bringt. Da ich aber vorher auch die Projektdatei erstmal auf die Maschine bekommen muss kann ich da auch noch den Restart der beiden Services anstoßen
Einen Kommentar schreiben:


Einen Kommentar schreiben: