Aplicatie Flask + SQLite pentru productie alimentara: cantarirea componentelor unui produs finit si tiparirea etichetei prin QZ Tray. - produse finite (retete) formate din componente cantarite - designer vizual de etichete (mm/px, zona sigura, campuri variabile, cod QR cu continut din mai multe bucati) - legare produs finit -> sablon de eticheta - navigare pe doua taburi: Cantarire / Setari - administrare: componente, produse finite, sabloane, campuri, istoric - backup, resetare baza de date, checklist de pregatire, /healthz - CLI de administrare si serviciu systemd pentru productie - vendor/syncpulse-scale-bridge (GPL-3.0-or-later) pentru citirea cantarului
6.8 KiB
Punere în funcțiune
Ghid pas cu pas pentru o stație de producție (cântar + imprimantă de etichete).
Aplicația rulează local, fără servicii externe: Flask + SQLite, fișierele stau în instance/.
1. Cerințe pe stație
| Ce | Detaliu |
|---|---|
| Python | 3.10+ (testat pe 3.13) |
| Cântar | Bizerba BC800 pe RJ11/10P4C → adaptor USB-serial (apare ca COMx) |
| Imprimantă | termică de etichete, separată de cântar |
| QZ Tray | 2.2.x instalat și pornit (localhost:8181) pentru tipărire directă |
| Rețea | nu e nevoie de internet; doar rețeaua locală dacă vrei acces din alt PC |
2. Instalare
git clone <repo> cantarire-etichetare
cd cantarire-etichetare
python -m venv .venv
source .venv/bin/activate # Windows: .venv\Scripts\activate
pip install -r requirements.txt
Configurare (recomandat): copiază .env.example în .env și completează cel puțin cheia:
python -c "import secrets; print(secrets.token_urlsafe(48))"
3. Prima pornire
python run.py
La prima rulare se creează automat instance/cantarire.db, cu schema completă, setările
implicite și un șablon de etichetă. Sumarul din consolă arată calea bazei și ce mai lipsește:
Cantarire & etichetare - server flask
URL http://127.0.0.1:5000/
Baza /.../instance/cantarire.db (64.0 kB, schema v5)
Date 0 componente / 0 produse finite / 1 sabloane
De completat: Datele firmei, Componente, Produse finite (lista apare pe pagina principală)
Pagina Cântărire afișează un checklist până când totul e pregătit. Ordinea firească:
- Setări → Date firmă — denumirea care apare pe etichetă, telefon.
- Setări → Componente — ce se cântărește (Fasole, Carne, ...).
- Setări → Produse finite — denumirea de pe etichetă + componentele în ordinea cântăririi, opțional șablonul de etichetă propriu.
- Setări → Șabloane — dacă vrei alt design decât cel implicit (designer vizual).
- Setări → Câmpuri — opțional, texte reutilizabile pentru etichete.
- Setări → Cântar — alege profilul activ din
instance/bridge.json.
Verificare rapidă, din consolă:
python -m cantarire.tools.admin status
python -m cantarire.tools.admin check
check întoarce cod 0 doar când elementele obligatorii sunt completate (util în scripturi).
4. Cântarul
Profilul serial stă în instance/bridge.json. Dacă nu ai încă unul:
python -m cantarire.tools.monitor --list
python -m cantarire.tools.monitor COM7 --baud 9600
Monitorul doar ascultă (nu scrie pe port), decodează cadrele cunoscute și poate salva o captură
pentru analiză. Când ai o captură, profilul se adaugă în bridge.json (sau din
Setări → Monitor serial). Pentru teste fără hardware:
CANTARIRE_SIMULATE=mahak_mds python run.py
Fără profil activ aplicația funcționează normal, cu introducere manuală a greutății.
5. Imprimanta (QZ Tray)
- Instalează QZ Tray pe stație și pornește-l.
- Deschide aplicația: pastila QZ Tray din dreapta sus trebuie să devină verde.
- Setări → Imprimantă implicită → alege imprimanta termică.
- Tipărește test — trebuie să iasă o etichetă demo.
Dacă QZ nu răspunde, aplicația cade automat pe tipărirea din browser (fereastră de print), deci eticheta iese oricum.
6. Producție
python run.py --production # waitress, 0.0.0.0:5000
python run.py --production --port 8080
Serverul de dezvoltare Flask nu se folosește în producție. --production pornește
waitress (WSGI, 8 fire) și afișează un avertisment dacă CANTARIRE_SECRET_KEY lipsește.
Linux (systemd)
sudo useradd -r -s /usr/sbin/nologin cantarire
sudo mkdir -p /opt/cantarire-etichetare /var/lib/cantarire
sudo chown -R cantarire:cantarire /opt/cantarire-etichetare /var/lib/cantarire
# copiază proiectul în /opt/cantarire-etichetare, apoi:
sudo cp deploy/cantarire.service /etc/systemd/system/
sudo systemctl edit --full cantarire # verifică utilizatorul și calea
sudo systemctl enable --now cantarire
EnvironmentFile=-/etc/cantarire.env conține variabilele din .env.example; fișierul e opțional.
Serviciul rulează cu ProtectSystem=full și scrie doar în /var/lib/cantarire.
Windows (stația de producție)
Rulează deploy\start-windows.bat. Scriptul creează .venv dacă lipsește, generează o cheie de
sesiune în instance\secret.key (refolosită la următoarele porniri) și pornește serverul.
Pentru pornire automată: creează un shortcut către acel .bat în
shell:startup (Win+R → shell:startup).
7. Backup și reset
python -m cantarire.tools.admin backup # instance/backups/cantarire-<data>.db
python -m cantarire.tools.admin backup --keep 30 # păstrează ultimele 30
python -m cantarire.tools.admin reset --yes # golește datele (face backup automat)
python -m cantarire.tools.admin seed-demo # repune datele demo pentru instruire
Backup-ul folosește API-ul SQLite (consistent și cu WAL activ), nu o simplă copiere de fișier. Din interfață: Setări → Descarcă backup produce un backup proaspăt și îl descarcă.
reset șterge componente, produse finite, pachete, șabloane și câmpuri, readuce setările
implicite și recreează șablonul de etichetă standard — exact starea de după o instalare nouă.
8. Monitorizare
| Endpoint | Rol |
|---|---|
GET /healthz |
JSON cu starea bazei (integritate, schema, număr de înregistrări) și setup.ready; 503 dacă baza e inaccesibilă |
GET /setari |
cardul Sistem: cale, mărime, integritate, backup-uri |
Jurnalele ajung la stdout (systemd: journalctl -u cantarire -f). Polling-ul greutății
(/api/weight) este filtrat din jurnal ca să nu umple discul.
9. Actualizare
python -m cantarire.tools.admin backup
git pull
pip install -r requirements.txt
sudo systemctl restart cantarire # Windows: închide și redeschide start-windows.bat
Migrările de schemă rulează automat la pornire (v1 → v5); coloanele noi se adaugă fără pierdere
de date. Rulează check după actualizare.
10. Dacă ceva nu merge
| Simptom | Cauză probabilă |
|---|---|
| Lista de pornire nu dispare | lipsește un produs finit cu componente active |
| Pastila QZ e roșie | agentul QZ Tray nu e pornit; pornește-l și apasă Conectează |
| Greutatea nu se mișcă | profil greșit sau port ocupat — verifică în Monitor serial |
Database is locked |
două instanțe pe aceeași bază; oprește serviciul vechi |
| Eticheta iese goală | produsul finit e legat de un șablon șters — verifică Șabloane și resetează designul |
503 la /healthz |
baza e coruptă sau fără drepturi de scriere; restaurează ultimul backup |