██████╗ ██████╗ ██╗ ██████╗ ██████╗ ██╗██╗ ██╗███████╗██████╗
██╔══██╗██╔══██╗██║ ██╔══██╗██╔══██╗██║██║ ██║██╔════╝██╔══██╗
██████╔╝██████╔╝██║ ██║ ██║██████╔╝██║██║ ██║█████╗ ██████╔╝
██╔══██╗██╔═══╝ ██║ ██║ ██║██╔══██╗██║╚██╗ ██╔╝██╔══╝ ██╔══██╗
██║ ██║██║ ██║ ██████╔╝██║ ██║██║ ╚████╔╝ ███████╗██║ ██║
╚═╝ ╚═╝╚═╝ ╚═╝ ╚═════╝ ╚═╝ ╚═╝╚═╝ ╚═══╝ ╚══════╝╚═╝ ╚═╝
Smart hardware proxy for Odoo — built for Raspberry Pi
A fork of pywebdriver — rebuilt for the Arab market
RPiDriver is a lightweight, open-source hardware proxy that connects Odoo POS to physical hardware through a Raspberry Pi. It acts as a local server that bridges your Odoo instance with receipt printers, scales, and customer displays — with full Arabic language support built in from day one.
Most existing solutions are either expensive, lack Arabic support, or don't run reliably on ARM hardware. RPiDriver fixes all three.
# Install with one command
curl -fsSL https://ia.sa/rpidriver/install | sudo bashRunning Odoo POS in Arabic-speaking markets comes with a specific set of hardware challenges:
- Arabic receipt printing on ESC/POS printers requires RTL text shaping — most drivers get this wrong
- Odoo's official IoT Box is expensive and often overkill for small retailers
- Existing open-source proxies are built for x86 and don't support ARM64 natively
- Setup complexity puts hardware integration out of reach for non-technical shop owners
RPiDriver is the answer: a single curl command turns a $35 Raspberry Pi into a fully capable Odoo hardware hub.
| Feature | Details |
|---|---|
| Arabic ESC/POS Printing | Correct RTL rendering via arabic-reshaper + python-bidi + Pillow bitmap engine |
| Odoo 17, 18 & 19 | Full hw_proxy protocol — verified against all three versions |
| Image Receipt Printing | Odoo 17+ sends base64 JPEG receipts — rendered and printed natively |
| Cash Drawer | ESC p pulse command triggered from Odoo POS |
| Mada Payment Terminal | NeoLeap N950 over WebSocket — no IoT Box, no bank middleware |
| Bilingual Dashboard | Web interface in Arabic and English with RTL layout |
| Web Config Panel | Edit all settings from the browser — no SSH needed |
| Live Log Viewer | Real-time journal streaming with color-coded output |
| Serial Scale Support | Mettler Toledo 8217 (7E1) and Adam Equipment (8N1) protocols |
| Customer Display | Bixolon BCD-1000/1100, Epson OCD300 — 2×20 LCD over USB-CDC |
| CUPS Network Printing | Send jobs to shared CUPS printers over the network via IPP |
| HTTPS / SSL | Auto-generated self-signed certificate — required for Odoo 17+ |
| Plugin Architecture | Enable only the drivers you need via a single config line |
| ARM64 Native | Built and tested on Raspberry Pi 3B+, 4, and 5 |
| systemd Service | Auto-start on boot, crash recovery, secret key management |
| udev Rules | Automatic USB and serial port permissions — no sudo after setup |
| Feature | Details |
|---|---|
| Watchdog + Alerts | Telegram / WhatsApp notifications on hardware failures |
| Config Backup | Automated settings backup and restore |
| Multi-Device Dashboard | Manage multiple Raspberry Pi devices from one panel |
| Email Support | 48-hour response guarantee |
| Commercial License | No AGPL obligations — use in closed-source products |
$9/month per device · $79/year · Contact info@ia.sa
| Model | Status |
|---|---|
| Raspberry Pi 3B / 3B+ | ✓ Supported |
| Raspberry Pi 4 (all RAM variants) | ✓ Supported |
| Raspberry Pi 5 | ✓ Supported |
| Brand | Models | Connection |
|---|---|---|
| Epson TM series | T20, T82, T88 | USB |
| Star Micronics | TSP series | USB |
| Any ESC/POS printer | Generic | USB |
| Network printers | via CUPS/IPP | Network |
| Brand | Protocol | Serial Parameters |
|---|---|---|
| Mettler Toledo | Toledo 8217 | 9600 baud, 7E1 |
| Adam Equipment | Adam | 4800 baud, 8N1 |
| Brand | Model | Connection |
|---|---|---|
| Bixolon | BCD-1000, BCD-1100 | USB-CDC (ttyACM) |
| Epson | OCD300 | RS-232 |
| Brand | Model | Connection | Port |
|---|---|---|---|
| NeoLeap | N950 | WiFi (WebSocket) | 9998 |
Requires the
ia_mada_rpidriverOdoo module — see Modules.
┌─────────────────────────────────────────────────────────┐
│ Odoo POS (browser) │
└────────────────────────┬────────────────────────────────┘
│ hw_proxy / JSON-RPC 2.0
▼
┌─────────────────────────────────────────────────────────┐
│ RPiDriver (Raspberry Pi) │
│ │
│ ┌──────────┐ ┌─────────┐ ┌─────────┐ ┌─────────┐ │
│ │ escpos │ │ scale │ │ display │ │ neoleap │ │
│ │ driver │ │ driver │ │ driver │ │ driver │ │
│ └────┬─────┘ └────┬────┘ └────┬────┘ └────┬────┘ │
└───────┼─────────────┼────────────┼─────────────┼───────┘
│ │ │ │
▼ ▼ ▼ ▼ WebSocket
ESC/POS Toledo / Customer NeoLeap
Printer Adam Scale Display N950 Terminal
RPiDriver exposes a local Flask server on port 8069. Odoo connects to it exactly like it would connect to an official IoT Box — no Odoo module required, no cloud dependency.
| Endpoint | Method | Purpose |
|---|---|---|
/hw_proxy/hello |
GET | Connectivity probe |
/hw_proxy/handshake |
POST | POS startup handshake |
/hw_proxy/status_json |
POST | Driver status for all devices |
/hw_proxy/scale_read |
POST | Read current weight |
/hw_proxy/default_printer_action |
POST | Print receipt / open cashbox (Odoo 17–19) |
/hw_proxy/print_receipt |
POST | Legacy print endpoint (Odoo 13–16) |
/hw_proxy/open_cashbox |
POST | Dedicated cash drawer (Odoo 13–16) |
/hw_proxy/send_text_customer_display |
POST | Show text on customer display |
/hw_proxy/log |
POST | Receive and log POS client messages |
/hw_proxy/payment_terminal_transaction_start |
POST | Start a Mada payment transaction |
/hw_proxy/payment_terminal_transaction_status |
POST | Poll transaction status |
/hw_proxy/payment_terminal_transaction_cancel |
POST | Cancel active transaction |
# Run on your Raspberry Pi
curl -fsSL https://ia.sa/rpidriver/install | sudo bashThe installer will:
- Install system dependencies (libusb, CUPS, Noto Arabic fonts)
- Create a dedicated
rpidriversystem user with correct permissions - Install udev rules for USB printers and serial devices
- Generate a secure Flask secret key
- Register and enable the systemd service
# After install:
sudo nano /etc/rpidriver/config.ini # edit your hardware config
sudo systemctl start rpidriver
# Open https://[your-pi-ip]:8069SSL Note: The installer auto-generates a self-signed certificate and enables HTTPS automatically. Before connecting Odoo POS, open
https://[pi-ip]:8069in your browser and accept the certificate warning once. This is required because Odoo 17+ runs on HTTPS and the browser blocks connections to HTTP devices (mixed-content policy).
git clone https://github.com/ibrahimaljuhani/rpidriver.git
cd rpidriver
python3 -m venv .venv
source .venv/bin/activate
pip install -e ".[dev]"
cp config/config.ini.tmpl config/config.ini
# Edit config.ini to match your hardware
export RPIDRIVER_SECRET="your-dev-secret"
rpidriverCopy config/config.ini.tmpl to /etc/rpidriver/config.ini and edit to match your hardware. The Flask secret key is set via the environment variable RPIDRIVER_SECRET (generated automatically by the installer).
[rpidriver]
host = 0.0.0.0
port = 8069
debug = false
# Enable only the drivers you need:
drivers = escpos_driver, scale_driver
[escpos_driver]
# Paper width in pixels: 576 = 80mm @ 203dpi | 384 = 58mm @ 203dpi
paper_width = 576
# Arabic font — required for correct RTL receipt printing
# arabic_font_path = /usr/share/fonts/truetype/noto/NotoSansArabic-Regular.ttf
# Message printed at the bottom of every receipt
# thank_you_message = Thank you! — شكراً لزيارتكم
# USB vendor/product IDs (leave blank to auto-detect)
# usb_vendor = 04b8
# usb_product = 0e15
[scale_driver]
port = /dev/ttyUSB0
protocol = toledo8217 # toledo8217 | adam
timeout = 1.0
# baudrate = 9600 # override only if your scale is non-standard
[display_driver]
port = /dev/ttyACM0
baudrate = 9600
[cups_driver]
cups_host = localhost
cups_port = 631
printer_name = Receipt_Printer- Arabic ESC/POS printing engine (reshape → bidi → bitmap → raster)
- Odoo 17, 18 & 19 hw_proxy protocol — verified compatible
- Image receipt printing (base64 JPEG from Odoo 17+ canvas)
- Cash drawer support
- Serial scale drivers — Toledo 8217 and Adam Equipment
- Customer display driver — Bixolon / Epson
- CUPS network printing via IPP
- Bilingual web dashboard (AR / EN)
- One-command installer (
install_pi.sh) - systemd service with secret key management
- udev rules for all device types
- SSL / HTTPS with auto-generated self-signed certificate
- NeoLeap N950 Mada payment terminal (WebSocket, dual JSON+XML response format)
- Web config panel — edit all settings from the browser
- Live log viewer — real-time journal streaming (SSE + polling fallback)
- Service restart button — no SSH needed
-
v1.0.0— Initial public release - Debian package for Ubuntu 24.04 ARM64
- RPiDriver Pro — Watchdog + Telegram alerts
- RPiDriver Pro — Config backup and restore
- RPiDriver Pro — Multi-device dashboard
RPiDriver is completely free for non-profit organizations, schools, relief organizations, early-stage startups, and small local stores.
If your organization qualifies, reach out at info@ia.sa. The project's sustainability comes from businesses that can afford to pay — not from those who need help.
RPiDriver is a fork of pywebdriver by Akretion, licensed under AGPL-3.0.
All modifications are released under the same AGPL-3.0 license.
Contributions are welcome. To get started:
- Fork the repository and create a feature branch
- Run the test suite:
pytest tests/ -v - Open a pull request with a clear description of your change
Please open an issue first for significant changes so we can discuss the approach.
RPiDriver is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License v3.0 as published by the Free Software Foundation.
Copyright © 2026 Ibrahim Aljuhani · info@ia.sa
Based on pywebdriver © Akretion
See the full license text in LICENSE.
For commercial licensing (no AGPL obligations), contact info@ia.sa.