{"id":34114340,"url":"https://github.com/base4sistemas/pyescpos","last_synced_at":"2026-04-08T19:33:34.918Z","repository":{"id":29508210,"uuid":"33046401","full_name":"base4sistemas/pyescpos","owner":"base4sistemas","description":"Support for Epson ESC/POS printer command system.","archived":false,"fork":false,"pushed_at":"2023-06-22T14:02:25.000Z","size":199,"stargazers_count":78,"open_issues_count":11,"forks_count":31,"subscribers_count":12,"default_branch":"master","last_synced_at":"2026-03-13T21:52:46.358Z","etag":null,"topics":["escpos","point-of-sale","printing","python","retail-automation"],"latest_commit_sha":null,"homepage":null,"language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/base4sistemas.png","metadata":{"files":{"readme":"README.rst","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2015-03-28T19:05:01.000Z","updated_at":"2026-03-10T03:48:47.000Z","dependencies_parsed_at":"2022-08-09T01:00:04.357Z","dependency_job_id":null,"html_url":"https://github.com/base4sistemas/pyescpos","commit_stats":null,"previous_names":[],"tags_count":10,"template":false,"template_full_name":null,"purl":"pkg:github/base4sistemas/pyescpos","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/base4sistemas%2Fpyescpos","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/base4sistemas%2Fpyescpos/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/base4sistemas%2Fpyescpos/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/base4sistemas%2Fpyescpos/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/base4sistemas","download_url":"https://codeload.github.com/base4sistemas/pyescpos/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/base4sistemas%2Fpyescpos/sbom","scorecard":{"id":226578,"data":{"date":"2025-08-11","repo":{"name":"github.com/base4sistemas/pyescpos","commit":"e0d435789542b4fb640c6f1b994136f01fffc99a"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":3.4,"checks":[{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"Dangerous-Workflow","score":10,"reason":"no dangerous workflow patterns detected","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"Code-Review","score":0,"reason":"Found 1/28 approved changesets -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"Token-Permissions","score":0,"reason":"detected GitHub workflow tokens with excessive permissions","details":["Warn: no topLevel permission defined: .github/workflows/testsrunner.yml:1","Info: no jobLevel write permissions found"],"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"Maintained","score":0,"reason":"0 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"Pinned-Dependencies","score":0,"reason":"dependency not pinned by hash detected -- score normalized to 0","details":["Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/testsrunner.yml:17: update your workflow using https://app.stepsecurity.io/secureworkflow/base4sistemas/pyescpos/testsrunner.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/testsrunner.yml:20: update your workflow using https://app.stepsecurity.io/secureworkflow/base4sistemas/pyescpos/testsrunner.yml/master?enable=pin","Warn: pipCommand not pinned by hash: .github/workflows/testsrunner.yml:27","Info:   0 out of   2 GitHub-owned GitHubAction dependencies pinned","Info:   0 out of   1 pipCommand dependencies pinned"],"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"Vulnerabilities","score":10,"reason":"0 existing vulnerabilities detected","details":null,"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE:0","Info: FSF or OSI recognized license: Apache License 2.0: LICENSE:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Signed-Releases","score":-1,"reason":"no releases found","details":null,"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"Branch-Protection","score":0,"reason":"branch protection not enabled on development/release branches","details":["Warn: branch protection not enabled for branch 'master'"],"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}},{"name":"SAST","score":0,"reason":"SAST tool is not run on all commits -- score normalized to 0","details":["Warn: 0 commits out of 3 are checked with a SAST tool"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}}]},"last_synced_at":"2025-08-17T03:55:47.161Z","repository_id":29508210,"created_at":"2025-08-17T03:55:47.161Z","updated_at":"2025-08-17T03:55:47.161Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31571601,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-08T14:31:17.711Z","status":"ssl_error","status_checked_at":"2026-04-08T14:31:17.202Z","response_time":54,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["escpos","point-of-sale","printing","python","retail-automation"],"created_at":"2025-12-14T19:32:32.784Z","updated_at":"2026-04-08T19:33:34.909Z","avatar_url":"https://github.com/base4sistemas.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"\nPyESCPOS\n========\n\n.. image:: https://img.shields.io/pypi/status/pyescpos.svg\n    :target: https://pypi.python.org/pypi/pyescpos/\n    :alt: Development status\n\n.. image:: https://img.shields.io/pypi/pyversions/pyescpos.svg\n    :target: https://pypi.python.org/pypi/pyescpos/\n    :alt: Supported Python versions\n\n.. image:: https://img.shields.io/pypi/l/pyescpos.svg\n    :target: https://pypi.python.org/pypi/pyescpos/\n    :alt: License\n\n.. image:: https://img.shields.io/pypi/v/pyescpos.svg\n    :target: https://pypi.python.org/pypi/pyescpos/\n    :alt: Latest version\n\n-------\n\nA Python support for Epson |copy| ESC/POS |reg| compatible printers. Read more\nat `Epson ESCPOS`_ Command Reference.\n\nThe ESC/POS |reg| is a standard that every manufacturer work on and modify to\nsuit their needs. That way, a sequence of commands in one printer does not\nnecessarily works (or does not work as expected) on another. At a distance, you\ncan say that all those tricky commands are identical from model to model (a\nstandard), but when you look just a little bit more deeper, you quickly realize\nthat they can be completely different, even between models belonging to the\nsame manufacturer.\n\nThis project aims to simplify the usage of printers, seeking for a lowest common\ndenominator between needed features and providing implementations that meet this\nminimum for known models, so you do not have to modify the application code.\n\n\nCurrent Implementations\n=======================\n\nCurrent implementations was tested against following hardware:\n\n+-------------------------+-------------------+-------------------+-----------------------------------------+\n| Manufacturer            | Models            | Firmware Versions | Notes                                   |\n+=========================+===================+===================+=========================================+\n| `Bematech S/A`_         | MP-2800 TH        | 2.2.1BQL          |                                         |\n|                         |                   |                   |                                         |\n+-------------------------+-------------------+-------------------+-----------------------------------------+\n| `Bematech S/A`_         | MP-4200 TH        | 1.3, 1.6          |                                         |\n|                         |                   |                   |                                         |\n+-------------------------+-------------------+-------------------+-----------------------------------------+\n| `Control iD`_           | Print iD Touch    | 1.3.0             |                                         |\n|                         |                   |                   |                                         |\n+-------------------------+-------------------+-------------------+-----------------------------------------+\n| `Epson`_                | TM-T20            | 1.14              |                                         |\n|                         |                   |                   |                                         |\n+-------------------------+-------------------+-------------------+-----------------------------------------+\n| `Elgin`_                | Elgin i9          | 1.03.20,          |                                         |\n|                         |                   | 1.03.24,          |                                         |\n|                         |                   | 1.03.31           |                                         |\n+-------------------------+-------------------+-------------------+-----------------------------------------+\n| `Elgin`_                | Elgin i7          | 1.00.08           |                                         |\n|                         |                   |                   |                                         |\n+-------------------------+-------------------+-------------------+-----------------------------------------+\n| `Elgin`_                | Elgin RM-22       | 1.00.09           | Elgin RM-22 portable thermal mini       |\n|                         |                   |                   | printer                                 |\n+-------------------------+-------------------+-------------------+-----------------------------------------+\n| `Nitere`_               | NPDV-1020         | -                 | Multifunction Terminal model TMF-101/IG |\n|                         |                   |                   | (an alias for CB55-C model)             |\n+-------------------------+-------------------+-------------------+-----------------------------------------+\n| Unknown OEM             | CB55-C            | 1.3.5             | Embedded in `Nitere`_ NPDV-1020 (model  |\n|                         |                   |                   | TMF-101/IG)                             |\n+-------------------------+-------------------+-------------------+-----------------------------------------+\n| `Urmet Daruma`_         | DR700 L/H/M and   | 02.51.00,         |                                         |\n|                         | DR700 L-e/H-e     | 01.20.00,         |                                         |\n|                         |                   | 01.21.00          |                                         |\n+-------------------------+-------------------+-------------------+-----------------------------------------+\n| `Urmet Daruma`_         | DR800 L/H         | 03.13.01          |                                         |\n|                         |                   |                   |                                         |\n|                         |                   |                   |                                         |\n+-------------------------+-------------------+-------------------+-----------------------------------------+\n\nYou can get a list of all available implementations with the following snippet:\n\n.. sourcecode:: python\n\n    from escpos import helpers\n\n    for impl in helpers.find_implementations(sort_by='model.name'):\n        print('{:.\u003c25} {}'.format(impl.model.name, impl.fqname))\n\nWhich produces an output similar to::\n\n    Bematech MP-2800 TH...... escpos.impl.bematech.MP2800TH\n    Bematech MP-4200 TH...... escpos.impl.bematech.MP4200TH\n    CB55-C................... escpos.impl.unknown.CB55C\n    Daruma DR700............. escpos.impl.daruma.DR700\n    Daruma DR800............. escpos.impl.daruma.DR800\n    Elgin I7................. escpos.impl.elgin.ElginI7\n    Elgin I9................. escpos.impl.elgin.ElginI9\n    Elgin RM-22.............. escpos.impl.elgin.ElginRM22\n    Epson TM-T20............. escpos.impl.epson.TMT20\n    Generic Daruma........... escpos.impl.daruma.DarumaGeneric\n    Generic ESC/POS.......... escpos.impl.epson.GenericESCPOS\n    Generic Elgin............ escpos.impl.elgin.ElginGeneric\n    Nitere NPDV-1020......... escpos.impl.nitere.NitereNPDV1020\n    Print iD Touch........... escpos.impl.controlid.PrintIdTouch\n\n\nUsage Examples\n==============\n\nNetwork TCP/IP Example\n----------------------\n\nYou can connect to your printer through network TCP/IP interface:\n\n.. sourcecode:: python\n\n    from escpos import NetworkConnection\n    from escpos.impl.epson import GenericESCPOS\n\n    conn = NetworkConnection.create('10.0.0.101:9100')\n    printer = GenericESCPOS(conn)\n    printer.init()\n    printer.text('Hello World!')\n\n\nSerial Example\n--------------\n\nSupport for Serial connections is optional. If you need it you should have\n`PySerial`_ library installed. You may do it through PIP issuing ``pip install\nPyESCPOS[serial]``.\n\nHere is how you can make a Serial connection:\n\n.. sourcecode:: python\n\n    from escpos import SerialConnection\n    from escpos.impl.epson import GenericESCPOS\n\n    # connect to port 'ttyS5' @ 9600 Bps, assuming RTS/CTS for handshaking\n    conn = SerialConnection.create('/dev/ttyS5:9600,8,1,N')\n    printer = GenericESCPOS(conn)\n    printer.init()\n    printer.text('Hello World!')\n\n\nBluetooth Example\n-----------------\n\nSupport for Bluetooth (via RFCOMM) connection is optional. If you need it you\nshould have `PyBluez`_ library installed. One option may be installing PyESCPOS\nthrough PIP issuing ``pip install PyESCPOS[bluetooth]``.\n\nHere is how you can make a Bluetooth connection:\n\n.. sourcecode:: python\n\n    from escpos import BluetoothConnection\n    from escpos.impl.epson import GenericESCPOS\n\n    # uses SPD (service port discovery) services to find which port to connect to\n    conn = BluetoothConnection.create('00:01:02:03:04:05')\n    printer = GenericESCPOS(conn)\n    printer.init()\n    printer.text('Hello World!')\n\nIf you know in which port you can connect beforehand, just pass its number after\ndevice address using a forward slash, for example ``00:01:02:03:04:05/4``, will\nconnect to port ``4`` on ``00:01:02:03:04:05`` address.\n\n\nUSB Example\n-----------\n\nSupport for USB connections is optional. If you need it you should have\n`PyUSB`_ library installed. You may do it through PIP issuing ``pip install\nPyESCPOS[usb]``. Be aware for printers with more than one USB interface, so\nyou may have to configure which interface is active.\n\nHere is how you can make an USB connection:\n\n.. sourcecode:: python\n\n    from escpos.ifusb import USBConnection\n    from escpos.impl.elgin import ElginRM22\n\n    conn = USBConnection.create('20d1:7008,interface=0,ep_out=3,ep_in=0')\n    printer = ElginRM22(conn)\n    printer.init()\n    printer.text('Hello World!')\n\n\nFile Print Example\n------------------\n\nThis printer “prints” just into a file-handle. Especially on \\*nix-systems this\ncomes very handy. A common use case is when you have a parallel port printer or\nany other printer that are directly attached to the file system. Note that you\nmay want to stay away from using USB-to- Parallel-Adapters since they are\nextremely unreliable and produce many arbitrary errors.\n\n.. sourcecode:: python\n\n    from escpos import FileConnection\n    from escpos.impl.elgin import ElginI9\n\n    conn = FileConnection('/dev/usb/lp1')\n    printer = ElginI9(conn)\n    printer.init()\n    printer.text('Hello World!')\n    print(printer.device.output)\n\n\nDummy Print Example\n-------------------\n\nThe Dummy-printer is mainly for testing- and debugging-purposes. It stores all\nof the “output” as raw ESC/POS in a string and returns that.\n\n.. sourcecode:: python\n\n    from escpos import DummyConnection\n    from escpos.impl.epson import GenericESCPOS\n\n    conn = DummyConnection()\n    printer = GenericESCPOS(conn)\n    printer.init()\n    printer.text('Hello World!')\n    print(printer.device.output)\n\n\nPrinting Barcodes\n-----------------\n\nThere is a default set of parameters for printing barcodes. Each ESC/POS\nimplementation will take care of the details and try their best to print your\nbarcode as you asked.\n\n.. sourcecode:: python\n\n    from escpos import barcode\n    from escpos import SerialConnection\n    from escpos.impl.epson import GenericESCPOS\n\n    conn = SerialConnection.create('COM1:9600,8,1,N')\n    printer = GenericESCPOS(conn)\n    printer.init()\n    printer.code128(\n            '0123456789',\n            barcode_height=96,  # ~12mm (~1/2\")\n            barcode_width=barcode.BARCODE_DOUBLE_WIDTH,\n            barcode_hri=barcode.BARCODE_HRI_BOTTOM\n        )\n\n    printer.lf()\n\n    printer.ean13(\n            '4007817525074',\n            barcode_height=120,  # ~15mm (~9/16\"),\n            barcode_width=barcode.BARCODE_NORMAL_WIDTH,\n            barcode_hri=barcode.BARCODE_HRI_TOP\n        )\n\n    printer.cut()\n\nThe barcode data you pass as a parameter should be complete including check\ndigits and any other payload data required that makes that data valid for the\nsymbology you're dealing with. Thus, if you need to print an EAN-13 barcode,\nfor example, you need to provide all thirteen digits.\n\n\nConfiguring Resilient Connections\n---------------------------------\n\nNetwork (TCP/IP) and Bluetooth (RFCOMM) connections provided by PyESCPOS both\nuse a simple `exponential backoff`_ algorithm to implement a (more) resilient\nconnection to the device. Your application or your users can configure retry\nparameters through environment variables (or files):\n\n* ``ESCPOS_BACKOFF_MAXTRIES`` (int ``\u003e 0``, defaults to ``3``) Number of tries\n  before give up;\n\n* ``ESCPOS_BACKOFF_DELAY`` (int ``\u003e 0``, defaults to ``3``) Delay in seconds\n  between retries;\n\n* ``ESCPOS_BACKOFF_FACTOR`` (int ``\u003e 1``, defaults to ``2``) Multiply factor\n  in which delay will be increased each retry.\n\nThis library may use `python-decouple`_ if available to grab those\nconfiguration values from environment variables or from a settings file,\ndepending on how you have configured ``decouple``. If not, it falls back to\nstandard lib ``os.getenv``.\n\n\nMore Information\n----------------\n\nYou will find more information in the `PyESCPOS wiki`_ pages.\n\n\nYou are Welcome to Help\n=======================\n\nHere is how you setup a development enviroment:\n\n.. sourcecode:: sh\n\n    git clone git@github.com:base4sistemas/pyescpos.git\n    cd pyescpos\n    python -m venv .env_escpos\n    source .env_escpos/bin/activate\n    pip install -r requirements/dev.txt\n    tox\n\nIf you gonna work with a specific type of connection (eg. Bluetooth or Serial)\nyou may use ``requirements/bluetooth.txt`` or ``requirements/serial.txt``.\nHave a look inside ``requirements/`` directory for the options available.\n\n\nAcknowledgement\n===============\n\nThis project is inspired on Manuel F. Martinez work for `python-escpos`_\nimplementation, among other projects, whose specific bits of work (available\nhere on Github and many other open-source repositories) has helped so much.\n\n\nDisclaimer\n==========\n\nPlease, read this **disclaimer**.\n\n    None of the vendors cited in this project agree or endorse any of the\n    patterns or implementations. Its names are used only to maintain context.\n\n..\n    Sphinx Documentation: Substitutions at\n    http://sphinx-doc.org/rest.html#substitutions\n    Codes copied from reStructuredText Standard Definition Files at\n    http://docutils.sourceforge.net/docutils/parsers/rst/include/isonum.txt\n\n.. |copy| unicode:: U+00A9 .. COPYRIGHT SIGN\n    :ltrim:\n\n.. |reg|  unicode:: U+00AE .. REGISTERED SIGN\n    :ltrim:\n\n.. _`PyESCPOS wiki`: https://github.com/base4sistemas/pyescpos/wiki\n.. _`Epson ESCPOS`: https://reference.epson-biz.com/modules/ref_escpos/index.php?content_id=2\n.. _`python-escpos`: https://github.com/manpaz/python-escpos\n.. _`python-decouple`: https://github.com/henriquebastos/python-decouple\n.. _`PySerial`: https://pyserial.readthedocs.io/en/latest/\n.. _`PyBluez`: http://karulis.github.io/pybluez/\n.. _`PyUSB`: https://pyusb.github.io/pyusb/\n.. _`Epson`: http://www.epson.com/\n.. _`Elgin`: http://www.elgin.com.br/\n.. _`Nitere`: http://www.nitere.com.br/\n.. _`Bematech S/A`: http://www.bematechus.com/\n.. _`Control iD`: https://www.controlid.com.br/\n.. _`Urmet Daruma`: http://daruma.com.br/\n.. _`exponential backoff`: https://en.wikipedia.org/wiki/Exponential_backoff\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbase4sistemas%2Fpyescpos","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fbase4sistemas%2Fpyescpos","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbase4sistemas%2Fpyescpos/lists"}