Interfacing Python, Odoo, dengan SATO Barcode Printer

Untuk bisa komunikasi langsung dengan printer barcode, misalnya merek SATO, kita harus punya dokumen Programming Guide nya, yang berisi command-command untuk mencetak label barcode, setting ukuran, dan lain sebagainya.

Untuk printer barcode SATO, ini link dokumen programming guidenya:

https://www.dropbox.com/s/00ny9ji7ie716bk/sbpl.pdf?dl=0

Jika bahasa yang kita gunakan udah di-support API nya, maka bisa juga digunakan library yang disediakan oleh vendor printer tersebut. Untuk python kebetulan belum ada API printer SATO jadi kita harus gunakan dokumen programming guide.

Caranya sebetulnya sederhana, yaitu bagaimana kita bisa kirimkan command-command (biasanya dalam bentuk ESCAPE sequence) langsung ke printer.

CG2

Install Driver Printer

Ini langkah pertama yang harus dilakukan agar laptop, pc, bisa mengenali printer yang tersambung, baik melalui USB atau parallel port.

Printer driver SATO bisa download dari sini:

https://www.satoamerica.com/resources/software

Command Barcode

Sesuai dokumentasi Programming Guide SATO, untuk mulai bisa mengirim perintah ke printer, semua harus diawali dengan karakter STX (0x02 hexa) sebagai awal dari paket data, dan diakhiri dengan karakter ETX (0x03 hexa) sebagai akhir dari paket data.

Lalu didalam paket data, harus diawali dengan karakter ESCAPE, yaitu karakter 0x1B hexa atau 27 decimal.

STX, ETX, dan ESC adalah karakter khusus di ASCII table yang tidak terlihat di layar tapi dia ada.

Setelah ESC baru dikeluarkan lagi karakter lanjutan sesuai command yang mau dikeluarkan, dilanjutkan dengan karakter parameter command jika ada.

Misalnya, untuk mengeluarkan text, kita gunakan perintah:

STX 
ESC + "A"
ESC + "XM*ini test text*"
ESC + "Q1"
ESC + "Z"
ETX

Bisa diliat, paket data yang dikirim berada dalam blok STX dan ETX, Lalu di dalamnya kita keluarkan sekuens dari command yang diawali oleh ESC. Paket data ini harus dikirim langsung ke printer dalam bentuk raw data.

Command ESC+A adalah penanda awal data, dan diakhiri dengan ESC+Z sebagai penanda akhir data.

Command ESC+XM adalah untuk mencetak text   *ini test text*.

Command ESC+Q untuk mencetak berapa lembar label, dalam hal ini 1 lembar saja.

Selengkapnya bisa diliat di dokumentasi Programming Guide SATO di atas.

Contoh lain, untuk mencetak barcode Code39 pada posisi 100,200 mm:

STX 
ESC + "A"
ESC + "V100"
ESC + "H200"
ESC + "B103080*12345*"
ESC + "Q1"
ESC + "Z"
ETX


Sama kan, formatnya...

Command ESC+V untuk menentukan posisi vertikal, yaitu 100 mm. 

Command ESC+H untuk menentukan posisi horizontal yaitu 200mm.

Command ESC+B untuk mencetak barcode, dengan type 1 (Code39), 03 kepadatan barcode, 080 tinggi barcode, dan kode yang mau dicetak adalah *12345*.

Semua command berada dalam block STX dan ETX.

Python Code

Lanjut tinggal translate command-command di atas dalam python dan kirim raw data ke printer. Gampang aja.. gini caranya:

STX = "\x02"
ESC = "\x1b"
ETX = "\x03"

data = (STX,
ESC , "A",
ESC , "XM*contoh text*",

ESC , "V100",
ESC , "H100",
ESC , "B103080*12345*",
ESC , "Q1",
ESC , "Z",
ETX)

for i in data:
print(i, end="")


Semua command-command diatas, kita masukkan ke dalam tuple data. Lalu tuple tadi kita looping dari print ke layar satu-per-satu karakter. Pada waktu print, gunakan parameter end="" supaya print tidak mencetak karakter newline "\n".

Done!

Jalankan Python script diatas misalnya test-sato.py:

python test-sato.py 

Muncul barisan karakter sbb:

100200103080*12345*1%                                                                                             

Karakter ESC, STX, dan ETX tidak terlihat di layar, tapi hakikatnya dia ada. BIsa di buka pakai program vi, kalau kita di linux/mac:

python test-sato.py > esc
vi esc


Itu dia, ada keliatan ^B, ^[, ^C. 

Kirim ke Printer

Step terakhir, kirim data diatas ke printer. Gampang aja, pake pipe di linux/mac.

python test-sato.py | lpr

Maka printer akan menerima karakter yang ada STX, ESC, dan ETX nya dan akan dianggap sebagai command untuk mencetak label, maka labelpun muncul di printer.

Done!

Interfacing ke Odoo

Berhubung Odoo aplikasi web, maka kita tidak bisa langsung akses ke command prompt untuk kirim data langsung ke printer. 

Harus ada jembatan berupa aplikasi proxy web (boleh python, php, dll). Intinya ada aplikasi web kecil yang jalan di localhost yang komunikasi langsung dengan printer. DIa listen di port misalnya 9000 yang siap diakses oleh javascript yang kita tanam di Odoo, misalnya form Lot atau Produk dalam rangka mencetak barcode nya.

Ini contoh script di Windows:

PRINTER_NAME = "SATO"

import win32print
from flask import Flask
from flask import jsonify
from flask import request
from flask_cors import CORS

app = Flask(__name__)
CORS(app)

@app.route('/barcode/print', methods=['POST'])
def index():
printer_data = request.form['printer_data']
p = win32print.OpenPrinter(PRINTER_NAME)
job = win32print.StartDocPrinter(p, 1, ("SATO", None, "RAW"))
win32print.StartPagePrinter(p)
win32print.WritePrinter(p, printer_data.encode())
win32print.EndPagePrinter(p)

out = {'status':'OK'}
return jsonify(out)



Jika dijalankan maka dia akan listen di port http modul Flask, yaitu 3000. dan menunggu request POST dengan variabel printer_data, dan mengirimkan apapun yang ada di variabel tersebut direct ke printer.

Lalu buat tombol custom di Odoo form yang me-request AJAX ke port tersebut.

Ini contohnya:

odoo.define('vit_barcode.print_button', function (require) {
"use strict";

var FormController = require('web.FormController');


FormController.include({
_onButtonClicked: function (event) {
if(event.data.attrs.custom === "print"){
//your code
var printer_data=event.data.record.data.printer_data;
if (!printer_data){
alert('No data to print. Please click Update Printer Data');
return;
}
console.log(printer_data);

var url = "http://localhost:3000/barcode/print";
$.ajax({
type: "POST",
url: url,
data: {
printer_data : printer_data
},
success: function(data) {
alert('Print Succeeded!');
console.log(data);
},
error: function(data) {
alert('Barcode Print Failed. Please check the Printer Proxy running');
console.log(data);
},
});
}
this._super(event);
},
});

});


Lalu attached javascrip tsb di suatu form ODoo:

<!-- Inherit Form View to Modify it -->
<record id="view_lot_form_dot" model="ir.ui.view">
<field name="name">view_lot_form_dot</field>
<field name="model">stock.production.lot</field>
<field name="inherit_id" ref="stock.view_stock_production_lot_form"/>
<field name="arch" type="xml">

<header position="inside">
<button type="object" name="dummy" string="Barcode" icon="fa-print" custom="print"/>
</header>


Jangan lupa buatkan method dummy di object, yang isinya cuma pass. 

---



DO NOT CLICK THIS https://bit.ly/3biXWMc

Videos fill be uploaded regularly, so subscribe our youtube Channel.

Visit YouTube Channel http://youtube.com/odooindonesia

Untuk trik Odoo lainnya bisa cek Udemy courses http://youtube.com/odooindonesia

Visit official site http://vitraining.com

One Touch and Go Live with Odoo http://1toucherp.com

Interfacing Python, Odoo, dengan SATO Barcode Printer
vitraining, odoo indonesia
23 June, 2020
Share this post
Archive
Sign in to leave a comment
How to run docker-compose up -d at system start up?
On Linux