Skip to main content
iVentureTeam

point_of_sale_test_epos

New in Odoo 19, the Test button next to your Epson ePOS settings is a view widget. point_of_sale_test_epos fires a real receipt at the printer and translates Epson's cryptic error codes into readable advice.

Siddharth JambukiyaSiddharth JambukiyaOdoo Techno-Functional Consultant
August 25, 2026Updated August 25, 20266 min read
Technical namepoint_of_sale_test_epos
Viewsform (view widget, element)
Modulepoint_of_sale
Used in core3 occurrences: POS settings, the POS config form and the printer form in point_of_sale
VersionsOdoo 20.0, Odoo 19.0
No-code setupNo. Added in view XML; end users just click the Test button
Alternativesiap_buy_more_credits, documentation_link, actionable_errors

What the ePOS test button does

Epson ePOS printers are configured in Odoo with nothing but an IP address, and until Odoo 19 the only way to know whether that address worked was to open a session and try to print a receipt. This widget is the shortcut: a Test button that talks to the printer directly from the settings form.

What the click does, verified in the source: it builds a minimal ePOS-Print XML envelope, one centered line reading This is a test receipt, three line feeds and a cut, and POSTs it to /cgi-bin/epos/service.cgi?devid=local_printer on the configured IP with a 15 second abort timer. It then parses the SOAP response: on success you get a confirmation toast, and on failure the Epson error code is looked up in a table of nine known conditions and shown as a readable warning.

The widget renders a plain secondary button and stores nothing. It is registered in the view widgets registry, so it appears in XML as a <widget> element, and core places it in three spots: the POS settings page, the POS config form and the printer form, where it hides unless the printer type is epson_epos.

What this means for your team

Receipt printers fail at the worst possible moment: during opening hour with a queue at the till. Every minute a cashier spends wondering whether the problem is the network, the printer or Odoo is a minute of lost sales. This button collapses that triage to one click made before the shop opens.

The error mapping is the real value. Printer cover is open, The paper is empty, Check the Device ID setting, it should be local_printer: each of these turns a support ticket into a ten second fix by the person standing next to the printer. For multi-site retailers, having store managers run the test after any router or printer change keeps the helpdesk out of the loop entirely.

Working examples

On the printer form, gated by printer type

<widget name="point_of_sale_test_epos"
        invisible="printer_type != 'epson_epos'"/>

Verbatim from the core printer form: the button only appears for ePOS printers, not IoT ones.

Next to the settings field

<field name="pos_epson_printer_ip"/>
<widget name="point_of_sale_test_epos"/>

The settings page pattern: the widget picks up pos_epson_printer_ip from the record because the field sits in the same view.

HTTPS, LNA and the devid contract

The protocol selection is where real deployments stumble, and the source is explicit about it. When Local Network Access is off, the request uses window.location.protocol: an Odoo database served over HTTPS will therefore call the printer over HTTPS too. Consumer ePOS printers do not ship trusted certificates, so the browser blocks the request and you land in the catch-all message about checking the URL and the network, even though the IP is perfectly right. That is exactly the scenario Epson's self-signed certificate procedure, or Odoo's LNA mode, exists to solve.

With LNA enabled, the widget takes the other branch: at load it asks the server's pos.printer.use_local_network_access, and on click it forces plain http:, attaches the browser's target address space hint and walks the LNA permission flow before sending anything. A denied permission aborts the test cleanly rather than reporting a printer fault.

One more hardcoded contract: the query string pins devid=local_printer. If the printer's internal Device ID setting differs, Epson answers DeviceNotFound, and the widget's mapped message tells you precisely which setting to fix. The nine mapped codes also include the drier hardware ones: cutter jam, mechanical error, low voltage, bad port and a plain timeout.

Version compatibility

VersionStatusNotes
Odoo 20.0In developmentNot released. Major rework on the development branch: multi-printer tests, ZPL labels. See below.
Odoo 19.0VerifiedIntroduced here; verified against the shipped source.
Odoo 18.0Not availableWidget does not exist; testing meant printing from a live session.
Odoo 17.0Not availableWidget does not exist.
Odoo 16.0Not availableWidget does not exist.

Upgrade note. Coming from Odoo 18 or earlier there is nothing to migrate, the widget simply appears with 19. If you patched core views to add your own test button in older versions, drop the patch and let the core widget take over.

What is changing in Odoo 20

Odoo 20 is expected at Odoo Experience in Brussels, 24 to 26 September 2026. We read this widget's file on the public development branch at the time of writing; the branch is unstable and details can change before release.

The development branch rewrites the widget substantially: it fetches printer settings per printer via orm.read (printer_ip, printer_type, use_lna, paper_size), on the POS config form it iterates and tests all configured printers in one click, label printers with paper_size set to label get a raw ZPL test sent to /pstprnt instead of the ePOS SOAP call, the receipt text now includes the printer's name, and notifications are prefixed with the printer name and IP. Two long-standing typos in the error table (occured) are also fixed. We re-verify after release.

Common problems and fixes

SymptomCause and fix
Failed to reach the printer, though the IP is correctThe database runs on HTTPS and LNA is off, so the browser calls the printer over HTTPS and rejects its missing certificate. Install Epson's self-signed certificate procedure, or enable Local Network Access support.
Error mentions the Device ID settingThe printer answered DeviceNotFound: its internal Device ID is not local_printer, which the widget hardcodes. Set Device ID to local_printer in the printer's ePOS configuration page.
Please configure a valid ePoS urlNeither epson_printer_ip nor pos_epson_printer_ip has a value in the current view's record. Fill the printer IP field next to the button, and save the settings first.
The test hangs then fails after several secondsThe request carries a 15 second abort timer; an unreachable IP burns the full window. Verify the printer is on the same network and the IP is current; DHCP moves printers.
Cover open or paper empty warningsThe printer itself reports the condition through its ePOS error code. Close the cover or load paper; the mapped message names the exact hardware issue.
Button missing on the printer formIt is invisible unless printer_type is epson_epos. Switch the printer type; IoT printers are tested through the IoT box instead.

EPOS test button vs the alternatives

WidgetBest forKey difference
point_of_sale_test_eposOne-click verification that an Epson ePOS printer is reachable and healthyTalks SOAP to the printer hardware directly from the backend form; stores nothing
iap_buy_more_creditsA service-action button in settings viewsAlso a view widget, but it opens IAP account flows instead of touching hardware
documentation_linkPointing users at the relevant docs page from a formPure link rendering, no network calls
actionable_errorsRendering a list of configuration problems with fix actionsDisplays server-computed diagnostics; the ePOS widget generates its own by probing the device

This is the only core widget that speaks to a receipt printer from the backend. The neighbors below solve adjacent problems: signaling state on documents or linking out of a form, not exercising hardware.

Frequently asked questions

What exactly gets printed by the test?+
A minimal receipt: one centered line reading This is a test receipt, three feed lines and a paper cut, sent as an ePOS-Print XML envelope. If that comes out, Odoo can print real receipts.
Why does the test fail on HTTPS databases?+
Without Local Network Access the widget uses the page's own protocol. HTTPS to a printer without a trusted certificate is blocked by the browser, so either install the printer certificate per Epson's procedure or enable LNA, which switches the call to plain HTTP with an explicit browser permission.
Which printers does this work with?+
Epson ePOS-capable receipt printers configured by IP, the epson_epos printer type in Odoo. IoT-box printers do not use this path, and the button hides itself for them on the printer form.
Does the widget check the paper size or printer model?+
Not in Odoo 19: it only reports what the printer answers. The development branch adds paper size awareness, including a raw ZPL test for label printers, expected in Odoo 20.
Can I add the Test button to my own view?+
Yes: place <widget name="point_of_sale_test_epos"/> in a form whose model exposes epson_printer_ip or pos_epson_printer_ip, and make sure that field is loaded in the same view, the widget reads it from the record without declaring dependencies.

POS hardware acting up at the worst moments?

Printers, cash drawers, scales and flaky store networks are where POS projects live or die. Our Odoo support team hardens point of sale deployments, ePOS certificates and LNA setup included, so your tills print on the first try.

Book a free consultation

How this page was produced

Verified by reading test_epos.js and its button template in the Odoo 19.0 point_of_sale module, including the error table, the LNA branch and the receipt XML, plus the three core view usages. Absence in 16 through 18 was confirmed against those branches' file trees; the Odoo 20 rework was read on the public development branch. Spotted an error? Tell us and we will correct the page.