توثيق RPiDriver
RPiDriver وسيط أجهزة مفتوح المصدر يربط Odoo POS بالأجهزة المادية عبر Raspberry Pi — طابعات ESC/POS، موازين Toledo، وشاشات العملاء. يدعم العربية كاملاً ويعمل مع Odoo 17 و18 و19.
متطلبات النظام
| المكوّن | المتطلب |
|---|---|
| الجهاز | Raspberry Pi 3B+ أو 4 أو 5 · Ubuntu ARM64 |
| نظام التشغيل | Raspberry Pi OS Bookworm / Bullseye · Ubuntu 22.04+ |
| Python | 3.10 أو أحدث |
| Odoo | 17 · 18 · 19 |
| الذاكرة | 256 MB على الأقل (512 MB موصى به) |
التثبيت
طريقة واحدة موصى بها: سكريبت تلقائي يُثبّت كل شيء في أقل من 5 دقائق.
التثبيت التلقائي
$ curl -fsSL https://ia.sa/rpidriver/install | sudo bash
السكريبت يقوم تلقائياً بـ:
- 01فحص الإصدار
يتحقق من Python 3.10+ وينبهك إذا كانت النسخة قديمة.
- 02حزم النظام
يثبّت libusb، cups، fonts-noto وكل ما يلزم.
- 03المستخدم والصلاحيات
ينشئ مستخدم نظام rpidriver مع صلاحيات lp وpludev.
- 04البيئة الافتراضية
ينشئ venv في /opt/rpidriver/.venv ويثبّت التبعيات.
- 05udev + systemd
يُركّب قواعد udev للطابعات ويُسجّل خدمة rpidriver.service.
بعد التثبيت
# 1. عدّل الإعدادات $ sudo nano /etc/rpidriver/config.ini # 2. شغّل الخدمة $ sudo systemctl start rpidriver # 3. راقب السجل $ journalctl -u rpidriver -f
التثبيت اليدوي
$ git clone https://github.com/ibrahimaljuhani/rpidriver.git $ cd rpidriver $ python3 -m venv .venv $ source .venv/bin/activate $ pip install -e . $ cp config/config.ini.tmpl /etc/rpidriver/config.ini $ rpidriver
الإعدادات
ملف الإعداد الرئيسي هو /etc/rpidriver/config.ini — صيغة INI بأقسام لكل مكوّن.
# ── الإعداد الرئيسي ────────────────────────────── [rpidriver] host = 0.0.0.0 # استمع على كل الواجهات port = 8069 debug = false drivers = escpos_driver, scale_driver, display_driver # ── طابعة ESC/POS ──────────────────────────────── [escpos_driver] paper_width = 576 # 576 = ورق 80mm, 384 = ورق 58mm arabic_font_path = /usr/share/fonts/truetype/noto/NotoSansArabic-Regular.ttf # ── الميزان التسلسلي ────────────────────────────── [scale_driver] port = /dev/ttyUSB0 baudrate = 9600 protocol = toledo8217 # toledo8217 | adam timeout = 1.0 # ── شاشة العميل ────────────────────────────────── [display_driver] port = /dev/ttyACM0 baudrate = 9600 # ── CUPS (طباعة عبر الشبكة) ─────────────────────── [cups_driver] cups_host = localhost cups_port = 631 printer_name = Receipt_Printer
RPIDRIVER_SECRET يحدد مفتاح Flask السري. لا تضعه في config.ini — استخدم: export RPIDRIVER_SECRET="كلمة-سر-قوية"
مرجع الخيارات
| الخيار | القسم | الافتراضي | الوصف |
|---|---|---|---|
host | rpidriver | 0.0.0.0 | عنوان الاستماع |
port | rpidriver | 8069 | منفذ HTTP |
drivers | rpidriver | — | قائمة الـ plugins بفواصل |
paper_width | escpos_driver | 576 | عرض الورق بالبكسل |
arabic_font_path | escpos_driver | — | مسار ملف TTF لطباعة العربية |
protocol | scale_driver | toledo8217 | بروتوكول الميزان |
طابعة ESC/POS
يدعم RPiDriver طابعات USB ESC/POS من Epson وStar Micronics وأي طابعة متوافقة.
الطابعات المعتمدة
| الطابعة | Vendor ID | Product ID |
|---|---|---|
| Epson TM-T88 | 0x04B8 | 0x0202 |
| Epson TM-T20 / T20III | 0x04B8 | 0x0E15 |
| Epson TM-T82 | 0x04B8 | 0x0E28 |
| Star Micronics TSP | 0x0519 | 0x0003 |
| أي طابعة Epson (fallback) | 0x04B8 | أي |
معرفة Vendor ID للطابعة
$ lsusb Bus 001 Device 005: ID 04b8:0e15 Seiko Epson Corp. TM-T20
إعداد عرض الورق
| الورق | العرض بالمم | البكسل | الأحرف |
|---|---|---|---|
| ورق عريض | 80mm | 576 | 42 |
| ورق ضيق | 58mm | 384 | 32 |
http://[Pi-IP]:8069/usb_devices
الميزان
يدعم RPiDriver موازين Toledo 8217 وAdam Equipment عبر المنفذ التسلسلي.
الموازين المدعومة
| الميزان | البروتوكول | الـ Baud |
|---|---|---|
| Mettler Toledo 8217 | toledo8217 | 9600 |
| Adam Equipment (AZextra, CB) | adam | 9600 |
إعداد config.ini
[scale_driver] port = /dev/ttyUSB0 # أو /dev/ttyS0 للمنفذ التسلسلي المدمج baudrate = 9600 protocol = toledo8217 # toledo8217 | adam timeout = 1.0
اختبار الميزان
$ curl -s -X POST http://localhost:8069/hw_proxy/scale_read \ -H 'Content-Type: application/json' \ -d '{"jsonrpc":"2.0","method":"call","id":1,"params":{}}' {"jsonrpc":"2.0","id":1,"result":{"weight":1.234,"unit":"kg","status":"ok"}}
شاشة العميل
تدعم شاشات العملاء ذات الـ 2×20 حرف عبر RS-232 أو USB-CDC.
الشاشات المدعومة
| الشاشة | الاتصال | المنفذ الافتراضي |
|---|---|---|
| Bixolon BCD-1000 / BCD-1100 | USB-CDC | /dev/ttyACM0 |
| Epson DM-D110 / OCD300 | RS-232 | /dev/ttyS0 |
CUPS
طباعة عبر خادم CUPS (طباعة شبكة) — بديل لاتصال USB المباشر.
[cups_driver] cups_host = localhost # أو IP خادم CUPS cups_port = 631 printer_name = Receipt_Printer # اسم الطابعة في CUPS
إضافة طابعة في CUPS
# افتح واجهة CUPS $ http://localhost:631 # أو أضف الطابعة من سطر الأوامر $ lpadmin -p Receipt_Printer -E -v usb://Epson/TM-T20 \ -m everywhere
ربط Odoo POS
RPiDriver يحاكي بروتوكول hw_proxy الخاص بـ IoT Box — Odoo لا يفرق بينهما.
- 01تأكد من التشغيل
افتح
http://[Pi-IP]:8069/hw_proxy/hello— يجب أن يرد بـping - 02في Odoo: الإعدادات ← نقطة البيع
فعّل خيار IoT Box أو Hardware Proxy.
- 03أدخل عنوان Pi
في حقل عنوان الـ IoT Box اكتب:
http://[Pi-IP]:8069 - 04اختبر الطباعة
من Odoo POS: اطبع إيصال اختبار وتحقق من أن الطابعة تستجيب.
مرجع API
جميع نقاط النهاية تحت /hw_proxy — بروتوكول JSON-RPC 2.0.
ping. يستخدمه Odoo للتحقق من توفر الوسيط.مصافحة أولية — يُستدعى عند بدء POS. يرجع true.
// request {"jsonrpc":"2.0","method":"call","id":1,"params":{}} // response {"jsonrpc":"2.0","id":1,"result":true}
حالة جميع الـ drivers المُسجَّلين.
{"jsonrpc":"2.0","id":2,"result":{
"escpos_driver": {"status":"connected","messages":[]},
"scale_driver": {"status":"connected","messages":[]},
"display_driver":{"status":"disconnected","messages":["Port unavailable"]}
}}
قراءة الوزن الحالي من الميزان.
{"jsonrpc":"2.0","id":3,"result":{"weight":1.234,"unit":"kg","status":"ok"}}
طباعة إيصال. يقبل dict (كائن Odoo) أو string أو list.
{"jsonrpc":"2.0","method":"call","id":4,
"params":{"receipt":{"company":{"name":"المتجر"},"total_with_tax":150.0,...}}}
// response
{"jsonrpc":"2.0","id":4,"result":true}
واجهة الويب
| URL | الوصف |
|---|---|
/ | الصفحة الرئيسية |
/status | حالة الـ drivers |
/system | معلومات النظام |
/usb_devices | أجهزة USB |
/lang/ar | تبديل إلى العربية |
/lang/en | تبديل إلى الإنجليزية |
الطباعة العربية
طابعات ESC/POS لا تدعم Unicode نفسها — RPiDriver يحوّل النص العربي إلى صورة bitmap ويطبعها كرسومات.
خط العربية
يُنصح بشدة بتعيين arabic_font_path في config.ini. أفضل خيار هو Noto Sans Arabic المثبت مسبقاً:
[escpos_driver] arabic_font_path = /usr/share/fonts/truetype/noto/NotoSansArabic-Regular.ttf
أمر ESC/POS المستخدم
يستخدم RPiDriver أمر GS v 0 (raster bitmap) لطباعة النص العربي:
# Pipeline: النص → reshape → bidi → PIL Image → ESC/POS bytes arabic_reshaper.reshape(text) # شكل الحروف السياقية → bidi.get_display(reshaped) # الترتيب RTL → PIL.Image → GS v 0 bytes # رندر وتحويل لبايتات ESC/POS
systemd
RPiDriver يعمل كخدمة systemd تبدأ تلقائياً مع نظام Pi.
# حالة الخدمة $ systemctl status rpidriver # بدء / إيقاف / إعادة تشغيل $ sudo systemctl start rpidriver $ sudo systemctl stop rpidriver $ sudo systemctl restart rpidriver # السجل المباشر $ journalctl -u rpidriver -f # سجل آخر 100 سطر $ journalctl -u rpidriver -n 100 --no-pager # تعطيل التشغيل التلقائي $ sudo systemctl disable rpidriver
حل المشكلات
الطابعة: لا تُكتشف
# تحقق من USB $ lsusb | grep -i epson # تحقق من الصلاحيات $ ls -la /dev/bus/usb/*/* # أعد تحميل udev $ sudo udevadm control --reload-rules && sudo udevadm trigger
الميزان: خطأ في المنفذ
# اكتشف المنفذ $ ls /dev/ttyUSB* /dev/ttyACM* /dev/ttyS* 2>/dev/null # اختبر الاستقبال مباشرة $ python3 -c "import serial; s=serial.Serial('/dev/ttyUSB0',9600); print(s.readline())"
العربية: تظهر مربعات
arabic_font_path في config.ini لمسار ملف TTF يدعم العربية.
# تحقق من وجود الخط $ ls /usr/share/fonts/truetype/noto/NotoSansArabic* # ثبّت إذا غاب $ sudo apt-get install -y fonts-noto-core fonts-noto-extra
الخدمة لا تبدأ
# راجع السبب $ journalctl -u rpidriver -n 50 --no-pager # شغّل يدوياً لرؤية الخطأ $ sudo -u rpidriver /opt/rpidriver/.venv/bin/rpidriver
Odoo لا يتصل بالـ Pi
المشكلة الأكثر شيوعاً — تحقق من هذه النقاط بالترتيب:
# 1. تأكد أن الخدمة تعمل $ systemctl status rpidriver # 2. اختبر الاتصال من نفس الشبكة $ curl http://[Pi-IP]:8069/hw_proxy/hello ping # 3. تحقق أن Port 8069 مفتوح $ ss -tlnp | grep 8069 # 4. تحقق من جدار الحماية $ sudo ufw status $ sudo ufw allow 8069/tcp
| السبب | الحل |
|---|---|
| IP خاطئ في Odoo | hostname -I للحصول على الـ IP الصحيح |
| الخدمة متوقفة | sudo systemctl start rpidriver |
| جدار الحماية يحجب المنفذ | sudo ufw allow 8069/tcp |
| Odoo وPi على شبكتين مختلفتين | تأكد أن كليهما على نفس الـ LAN |
| config.ini → host خاطئ | host = 0.0.0.0 |