2025-02-04 00:00:12 +01:00
2025-02-02 11:49:45 +01:00
2025-02-02 11:49:45 +01:00
2025-02-02 11:49:45 +01:00
2025-02-02 11:49:45 +01:00
2025-02-02 11:49:45 +01:00
2025-02-03 23:59:23 +01:00
2025-02-02 11:49:45 +01:00
2025-02-02 11:49:45 +01:00
2025-02-02 11:49:45 +01:00
2025-02-02 11:49:45 +01:00
2025-02-02 11:48:37 +01:00
2025-02-02 11:49:45 +01:00
2025-02-02 11:49:45 +01:00
2025-02-04 00:00:12 +01:00
2025-02-02 11:49:45 +01:00
2025-02-02 11:49:45 +01:00
2025-02-02 11:49:45 +01:00
2025-02-02 11:49:45 +01:00

Scanner Service und Frontend Software (Kugelstoßmeeting Rochlitz)

  • Geschrieben von Mario Voigt (2024 - 2025)
  • License: MIT

WARNUNG: UGLY SOFTWARE. Das ist ein "works for me" Projekt

Konzept

Achtung: Frontend und Scan-Service müssen auf die gleiche Datenbankdatei konfiguriert werden!

Installation

Siehe auch https://pypi.org/project/cysystemd/

Fedora:

dnf install -y systemd-devel python3-venv
sudo usermod -G dialout -a $USER #den aktuellen User zu dialout hinzufügen

Ubuntu:

apt install build-essential libsystemd-dev systemd-dev python3-venv
sudo usermod -G dialout -a $USER #den aktuellen User zu dialout hinzufügen
cd /opt/
git clone https://gitea.fablabchemnitz.de/vmario/kugelstossmeeting-ticketing.git
cd kugelstossmeeting-ticketing/
python3 -m venv venv
venv/bin/pip install -r requirements.txt

USB Scanner betriebsbereit machen

USB-Geräte anzeigen und nach Scanner prüfen:

lsusb -v
#idVendor           0x0581 Racal Data Group
#idProduct          0x0115 Tera 5100
lsusb
#Bus 003 Device 003: ID 0581:0115 Racal Data Group Tera 5100

USB-Gerät Berechtigungen anpassen:

vim /etc/udev/rules.d/55-barcode-scanner.rules
# Set permissions to let anyone use barcode scanner
SUBSYSTEM=="usb", ATTR{idVendor}=="0581", ATTR{idProduct}=="0115", MODE="666"

Änderungen übernehmen:

udevadm control --reload-rules && udevadm trigger

Dienst starten und prüfen:

ln -sf /etc/systemd/system/usb-scanner.service /opt/kugelstossmeeting-ticketing/usb-scanner.service
systemctl enable usb-scanner.service --now
journalctl -f -u usb-scanner.service

Codes scannen

Folgende Codes scannen wir ein, um den Scanner korrekt zu konfigurieren: QR Code Config

Der Scanner kann zurückgesetzt werden, indem wir ihn per QR Code ausschalten und vom USB-Port trennen.

Datenbankoperationen

SQLite installieren:

Fedora:

sudo dnf install sqlite3

Ubuntu:

sudo apt install sqlite3

Datenbank per Shell leeren:

sqlite3 kugelstossmeeting-prod.db "DELETE FROM tickets;"
sqlite3 kugelstossmeeting-prod.db "DELETE FROM scans;"
sqlite3 kugelstossmeeting-prod.db "VACUUM;"

Datenbank per DB Browser for SQLite bearbeiten/ansehen:

Fedora:

sudo dnf install sqlitebrowser

Ubuntu:

sudo apt install sqlitebrowser

DB Browser for SQLite DB Browser for SQLite DB Browser for SQLite

Bestehende Tabelle mit neuem Inhalt aus CSV Datei überschreiben: DB Browser for SQLite

Datenbankstruktur erzeugen:

Wichtig: Die Reihenfolge der Spalten in den Tabellen darf nicht verändert werden, da die GUI TreeViews fest zugewiesen sind!

CREATE TABLE "tickets" (
	"BarcodeContent" TEXT,                 /* Barcode (5-stellig) {str} */
	"Nr" INTEGER,                          /* Ticket Nummer {int} */
	"VIP" TEXT,                            /* VIP Status {y/n} - VIPs bekommen kostenfreie Verköstigung und Parkplatz */
	"Medium" TEXT,                         /* {Kartonage; Online-Ticket (PDF) */
	"Aushändigung" TEXT,                   /* {Barverkauf/Tageskasse; Persönliche Aushänding; Email} */
	"Bestellnummer/Verwendungszweck" TEXT, /* Bestellnummer Online (6-stellig) {str} */
	"Bezahlt am" TEXT,                     /* {TT.MM.JJJJ} */
	"Hinweise" TEXT,                       /* {str} - etwaige Bemerkungen */
	"Besteller" TEXT,                      /* {str} - Vor- und Zuname des Käufers */
	"Typ" TEXT                             /* {E = Erwachsen; K = Kind; 0 = kostenfrei} */
);
CREATE TABLE "scans" (
	"unixtimestamp_created"INTEGER NOT NULL, /* Zeitstempel, wann der Barcode gescannt wurde */
	"barcode" TEXT NOT NULL,                 /* Der 5-stellige Barcode */
	"validated" INTEGER,                     /* {0;1} - Barcode entwertet? */
	"hint"	TEXT,                            /* Der beim Scannen optional eingetragene Kommentar */
	"unixtimestamp_checked"	INTEGER,         /* Zeitstempel, wann der Barcode entwertet wurde */
	"skipped"	INTEGER                      /* {0;1} - Barcode übersprungen? */
);

Datenbankstruktur ändern (Spalten):

Die Reihenfolge der Spalten in der Tabelle ist entscheidend, da diese statisch im Quellcode referenziert wird. Anpassungen (Löschen) zum Beispiel wie folgt:

ALTER TABLE tickets DROP COLUMN 'BarcodeFile';
ALTER TABLE tickets DROP COLUMN 'Ticketbeschriftung';

Test-Scan mit Pseudo-Barcode und Zeitstempel erzeugen:

INSERT 
	INTO scans(unixtimestamp_created,barcode,validated,hint,unixtimestamp_checked,skipped) 
	VALUES(CAST(unixepoch('now') AS FLOAT)*1e9,'12345',0,'None',CAST(unixepoch('now') AS FLOAT)*1e9,0)
;

GUI starten

/opt/kugelstossmeeting-ticketing/venv/bin/python3 /opt/kugelstossmeeting-ticketing/sqlite.py

... oder

/opt/kugelstossmeeting-ticketing/sqlite.py #siehe python3 Header

... oder die .desktop-Verknüpfung benutzen

GUI

Notwendig für den Betrieb

  • Notebook mit Netzteil
  • USB Scanner mit USB-C Kabel
  • Stempel + Stempelfarbe
  • Alle Tickets als PDF-Backup (falls Was nicht klappt)
  • eine aktuell befüllte SQ-Lite Datenbank

FAQs

Der Barcode auf dem Ticket ist schwer oder nicht scanbar. Was nun?

In diesem Fall kann die Klarnummer des Tickets verwendet werden und manuell in der Liste ausgewählt werden. Dort wird auch der Barcode angezeigt. Dieser müsste sich mit dem gedruckten Ticket oder Online-PDF decken.

Mögliche Verbesserungen der Software

  • SQLite DB gegen netzwerkfähige MySQL/PGSQL tauschen und multimandantenfähig machen (2 Rechner, 2 Barcode Scanner)
  • Programm so beschränken, dass es nicht mehrfach gestartet werden kann (PID Kontrolle o.ä.)
  • siehe Code-Kommentare
  • TK GUI modernisieren
Languages
Python 98.9%
Shell 1.1%