github

توثيق 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+
Python3.10 أو أحدث
Odoo17 · 18 · 19
الذاكرة256 MB على الأقل (512 MB موصى به)

التثبيت

طريقة واحدة موصى بها: سكريبت تلقائي يُثبّت كل شيء في أقل من 5 دقائق.

التثبيت التلقائي

bash
$ 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 ويثبّت التبعيات.

  • 05
    udev + systemd

    يُركّب قواعد udev للطابعات ويُسجّل خدمة rpidriver.service.

الخدمة لا تبدأ تلقائياً — يجب تعديل config.ini أولاً ثم تشغيل الخدمة يدوياً.

بعد التثبيت

bash
# 1. عدّل الإعدادات
$ sudo nano /etc/rpidriver/config.ini

# 2. شغّل الخدمة
$ sudo systemctl start rpidriver

# 3. راقب السجل
$ journalctl -u rpidriver -f

التثبيت اليدوي

bash
$ 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 بأقسام لكل مكوّن.

ini — /etc/rpidriver/config.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="كلمة-سر-قوية"

مرجع الخيارات

الخيار القسم الافتراضي الوصف
hostrpidriver0.0.0.0عنوان الاستماع
portrpidriver8069منفذ HTTP
driversrpidriverقائمة الـ plugins بفواصل
paper_widthescpos_driver576عرض الورق بالبكسل
arabic_font_pathescpos_driverمسار ملف TTF لطباعة العربية
protocolscale_drivertoledo8217بروتوكول الميزان

طابعة ESC/POS

يدعم RPiDriver طابعات USB ESC/POS من Epson وStar Micronics وأي طابعة متوافقة.

الطابعات المعتمدة

الطابعة Vendor ID Product ID
Epson TM-T880x04B80x0202
Epson TM-T20 / T20III0x04B80x0E15
Epson TM-T820x04B80x0E28
Star Micronics TSP0x05190x0003
أي طابعة Epson (fallback)0x04B8أي

معرفة Vendor ID للطابعة

bash
$ lsusb
Bus 001 Device 005: ID 04b8:0e15 Seiko Epson Corp. TM-T20

إعداد عرض الورق

الورقالعرض بالممالبكسلالأحرف
ورق عريض80mm57642
ورق ضيق58mm38432
تحقق من توصيل الطابعة عبر واجهة الويب: http://[Pi-IP]:8069/usb_devices

الميزان

يدعم RPiDriver موازين Toledo 8217 وAdam Equipment عبر المنفذ التسلسلي.

الموازين المدعومة

الميزانالبروتوكولالـ Baud
Mettler Toledo 8217toledo82179600
Adam Equipment (AZextra, CB)adam9600

إعداد config.ini

ini
[scale_driver]
port     = /dev/ttyUSB0   # أو /dev/ttyS0 للمنفذ التسلسلي المدمج
baudrate = 9600
protocol = toledo8217     # toledo8217 | adam
timeout  = 1.0

اختبار الميزان

bash
$ 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-1100USB-CDC/dev/ttyACM0
Epson DM-D110 / OCD300RS-232/dev/ttyS0
النص العربي غير مدعوم على شاشات العملاء — العتاد يقبل ASCII/cp437 فقط.

CUPS

طباعة عبر خادم CUPS (طباعة شبكة) — بديل لاتصال USB المباشر.

ini
[cups_driver]
cups_host    = localhost       # أو IP خادم CUPS
cups_port    = 631
printer_name = Receipt_Printer # اسم الطابعة في CUPS

إضافة طابعة في CUPS

bash
# افتح واجهة 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: اطبع إيصال اختبار وتحقق من أن الطابعة تستجيب.

إذا كنت تستخدم Odoo 19، تأكد من فحص compatibility notes في الـ CHANGELOG.

مرجع API

جميع نقاط النهاية تحت /hw_proxy — بروتوكول JSON-RPC 2.0.

GET /hw_proxy/hello
فحص الاتصال — يرجع النص ping. يستخدمه Odoo للتحقق من توفر الوسيط.
POST /hw_proxy/handshake

مصافحة أولية — يُستدعى عند بدء POS. يرجع true.

json
// request
{"jsonrpc":"2.0","method":"call","id":1,"params":{}}

// response
{"jsonrpc":"2.0","id":1,"result":true}
POST /hw_proxy/status_json

حالة جميع الـ drivers المُسجَّلين.

json
{"jsonrpc":"2.0","id":2,"result":{
  "escpos_driver": {"status":"connected","messages":[]},
  "scale_driver":  {"status":"connected","messages":[]},
  "display_driver":{"status":"disconnected","messages":["Port unavailable"]}
}}
POST /hw_proxy/scale_read

قراءة الوزن الحالي من الميزان.

json
{"jsonrpc":"2.0","id":3,"result":{"weight":1.234,"unit":"kg","status":"ok"}}
POST /hw_proxy/print_receipt

طباعة إيصال. يقبل dict (كائن Odoo) أو string أو list.

json
{"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 المثبت مسبقاً:

ini
[escpos_driver]
arabic_font_path = /usr/share/fonts/truetype/noto/NotoSansArabic-Regular.ttf

أمر ESC/POS المستخدم

يستخدم RPiDriver أمر GS v 0 (raster bitmap) لطباعة النص العربي:

python
# 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
الأسطر اللاتينية (ASCII) تُطبع كنص عادي cp437 — أسرع وأوضح من الطباعة كصورة.

systemd

RPiDriver يعمل كخدمة systemd تبدأ تلقائياً مع نظام Pi.

bash
# حالة الخدمة
$ 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

حل المشكلات

الطابعة: لا تُكتشف

bash
# تحقق من USB
$ lsusb | grep -i epson

# تحقق من الصلاحيات
$ ls -la /dev/bus/usb/*/*

# أعد تحميل udev
$ sudo udevadm control --reload-rules && sudo udevadm trigger

الميزان: خطأ في المنفذ

bash
# اكتشف المنفذ
$ 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 يدعم العربية.
bash
# تحقق من وجود الخط
$ ls /usr/share/fonts/truetype/noto/NotoSansArabic*

# ثبّت إذا غاب
$ sudo apt-get install -y fonts-noto-core fonts-noto-extra

الخدمة لا تبدأ

bash
# راجع السبب
$ journalctl -u rpidriver -n 50 --no-pager

# شغّل يدوياً لرؤية الخطأ
$ sudo -u rpidriver /opt/rpidriver/.venv/bin/rpidriver

Odoo لا يتصل بالـ Pi

المشكلة الأكثر شيوعاً — تحقق من هذه النقاط بالترتيب:

bash
# 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 خاطئ في Odoohostname -I للحصول على الـ IP الصحيح
الخدمة متوقفةsudo systemctl start rpidriver
جدار الحماية يحجب المنفذsudo ufw allow 8069/tcp
Odoo وPi على شبكتين مختلفتينتأكد أن كليهما على نفس الـ LAN
config.ini → host خاطئhost = 0.0.0.0

الحصول على الدعم

افتح Issue على GitHub  ·  راسلنا على [email protected]