From 3e7f68d3a76c5cc723dda79fe3f3ad7ae171b0f7 Mon Sep 17 00:00:00 2001 From: David Monnom Date: Fri, 13 Feb 2026 14:20:30 +0100 Subject: [PATCH] [IMP] point_of_sale: local network access for IoT devices - Add documentation for local network access required for local devices - Add warning about LNA on Self-signed certificate for ePOS SSC printers - Add warning about LNA on pos_iot documentation closes odoo/documentation#16041 Signed-off-by: Audrey Vandromme (auva) --- .../sales/point_of_sale/configuration.rst | 3 +- .../configuration/epos_printers.rst | 34 +++++----- .../point_of_sale/configuration/epos_ssc.rst | 16 ++--- .../point_of_sale/configuration/pos_lna.rst | 62 ++++++++++++++++++ .../configuration/pos_lna/pos-lna.png | Bin 0 -> 10467 bytes 5 files changed, 89 insertions(+), 26 deletions(-) create mode 100644 content/applications/sales/point_of_sale/configuration/pos_lna.rst create mode 100644 content/applications/sales/point_of_sale/configuration/pos_lna/pos-lna.png diff --git a/content/applications/sales/point_of_sale/configuration.rst b/content/applications/sales/point_of_sale/configuration.rst index 6a86b4e35a..cca9724527 100644 --- a/content/applications/sales/point_of_sale/configuration.rst +++ b/content/applications/sales/point_of_sale/configuration.rst @@ -5,6 +5,7 @@ Configuration .. toctree:: :titlesonly: - configuration/pos_iot + configuration/pos_lna configuration/epos_printers configuration/epos_ssc + configuration/pos_iot diff --git a/content/applications/sales/point_of_sale/configuration/epos_printers.rst b/content/applications/sales/point_of_sale/configuration/epos_printers.rst index bcc1d074f9..8add209e53 100644 --- a/content/applications/sales/point_of_sale/configuration/epos_printers.rst +++ b/content/applications/sales/point_of_sale/configuration/epos_printers.rst @@ -21,26 +21,25 @@ To use an ePos printer in Point of Sale: .. note:: When the printer connects to a network, it automatically prints a ticket with its IP address. +.. _pos/epos_printers/supported-printers: + Directly supported ePOS printers ================================ -The following ePOS printers are directly compatible with Odoo without needing an :doc:`IoT system -`. +The **Epson TM-m30 i/ii/iii (Wi-Fi or Ethernet only) models** are strongly recommended, as they have +been fully tested with Odoo Point of Sale. -- Epson TM-m30 i/ii/iii (Wi-Fi/Ethernet models only; Recommended) -- Epson TM-H6000IV-DT (Receipt printer only) -- Epson TM-T70II-DT -- Epson TM-T88V-DT -- Epson TM-L90-i -- Epson TM-T70-i -- Epson TM-T82II-i -- Epson TM-T83II-i -- Epson TM-U220-i -- Epson TM-m10 -- Epson TM-P20 (Wi-Fi® model) -- Epson TM-P60II (Receipt: Wi-Fi® model) -- Epson TM-P60II (Peeler: Wi-Fi® model) -- Epson TM-P80 (Wi-Fi® model) +Other Wi-Fi or Ethernet Epson printer models that support the **ePoS protocol** should also be +compatible. + +.. important:: + - The ePoS printer must be capable of operating in HTTP mode. + - When using :doc:`Local Network Access (LNA) + `, the ePOS printer must have a + **static IP address**; otherwise, it may become unreachable. The static IP should be configured + through the router. + +.. _pos/epos_printers/iot-supported-printers: ePOS printers with IoT system integration ========================================= @@ -64,4 +63,5 @@ be compatible with Odoo: - Epson printers that connect via Bluetooth are **not compatible**. .. seealso:: - :doc:`epos_ssc` + - :doc:`pos_lna` + - :doc:`epos_ssc` diff --git a/content/applications/sales/point_of_sale/configuration/epos_ssc.rst b/content/applications/sales/point_of_sale/configuration/epos_ssc.rst index 17906d19af..032267393d 100644 --- a/content/applications/sales/point_of_sale/configuration/epos_ssc.rst +++ b/content/applications/sales/point_of_sale/configuration/epos_ssc.rst @@ -4,19 +4,19 @@ Self-signed certificate for ePOS printers ========================================= +.. important:: + Since the `Chromium 142 update `_, using a + self-signed certificate is no longer required. The recommended approach is to use the + :doc:`Local Network Access ` method instead. + To work with Odoo, some printer models that can be used without an :doc:`IoT system ` may require the HTTPS protocol to establish a secure connection between the browser and the printer. However, trying to reach the printer's IP address -using HTTPS leads to a warning page on most web browsers. In that case, you can temporarily -:ref:`force the connection `, which allows you to reach the page in HTTPS and -use the ePOS printer in Odoo as long as the browser window stays open. +using HTTPS leads to a warning page on most web browsers. -.. warning:: - The connection is lost after closing the browser window. Therefore, this method should only be - used as a **workaround** or as a pre-requisite for the :ref:`following instructions - `. -.. _epos_ssc/instructions: +.. seealso:: + :doc:`pos_lna` Generate, export, and import self-signed certificates ===================================================== diff --git a/content/applications/sales/point_of_sale/configuration/pos_lna.rst b/content/applications/sales/point_of_sale/configuration/pos_lna.rst new file mode 100644 index 0000000000..d0aee51c72 --- /dev/null +++ b/content/applications/sales/point_of_sale/configuration/pos_lna.rst @@ -0,0 +1,62 @@ +.. |LNA| replace:: :abbr:`LNA (Local Network Access)` + +==================== +Local Network Access +==================== + +`Local Network Access `_ +is a security feature that limits a website's ability to send requests to servers on a local +network. Access requires explicit user permission, which makes it possible to grant network access +to a specific web page. Using |LNA|, Odoo Point of Sale can communicate with devices with local +access, such as :ref:`supported ePOS printers `, directly +from the browser and without requiring an :doc:`SSL certificate `. + +.. note:: + Local Network Access is available in most browsers based on `Chromium version 142 + `_ or higher, including Google Chrome, Brave, + Microsoft Edge, Vivaldi, and Opera. + +.. important:: + The ePOS printer must have a **static IP address**; otherwise, it may become unreachable. The + static IP should be configured through the router. + +Activation +========== + +To activate |LNA| and ensure POS uses it over a secure connection, create a new system parameter +as follows: + +#. :ref:`Enable the developer mode `. +#. Go to :menuselection:`Settings --> Technical --> System Parameters`. +#. Click :guilabel:`New` and fill in the fields: + + - :guilabel:`Key`: `point_of_sale.use_lna` + - :guilabel:`Value`: `True` + +#. Click :guilabel:`Save`. + +Browser permission +================== + +Once |LNA| is activated in Odoo and a device with local access, such as an :ref:`ePOS printer +`, is configured, the browser displays a popup requesting +permission to communicate with the devices on the local network. + +.. image:: pos_lna/pos-lna.png + :alt: Permission popup to access local network devices + +.. note:: + - If the popup does not appear, permission can be granted manually through the browser's site + settings. + - Some browsers may require enabling a flag to activate the feature: + + - Brave: `brave://flags/#local-network-access-check` + - Google Chrome: `chrome://flags/#local-network-access-check` + +Point of sale LNA status +======================== + +To view the point of sale's |LNA| status, :ref:`open ` or access the +register, click the :icon:`fa-bars` (:guilabel:`hamburger menu`) icon in the top-right corner, then +click the :guilabel:`Local Network Access` button at the bottom of the menu. The current |LNA| +status details are then displayed in the :guilabel:`LNA Permission status` popup. diff --git a/content/applications/sales/point_of_sale/configuration/pos_lna/pos-lna.png b/content/applications/sales/point_of_sale/configuration/pos_lna/pos-lna.png new file mode 100644 index 0000000000000000000000000000000000000000..dcf6e9ae89b088706bb60c84a377cf4f39affbda GIT binary patch literal 10467 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 literal 0 HcmV?d00001