feat: MEI cash recycler driver for BATM3 #37

Open
opened 2026-06-13 22:02:56 +00:00 by padreug · 0 comments
Owner

Migrated from aiolabs/lamassu-next#37 — opened by @padreug on 2026-03-22.\n\n## Summary

The GeneralBytes BATM3 has a MEI cash recycler module with two 60-bill recycler cassettes + a 600-bill acceptor/cashbox. Currently we only use it as a validator (cashflowSc driver) — accepted bills go straight to the cashbox and are never redispensed.

Adding a recycler driver would let the ATM redispense accepted bills, reducing operator refill frequency.

Hardware Spec

Source: https://www.generalbytes.com/en/products/cash-recycler

Spec Value
Dimensions 518mm x 114mm x 236mm
Note validation 62mm–83mm width, 120mm–166mm length
Recycling cassette capacity 60 + 60 banknotes
Acceptor capacity 600 banknotes
Acceptance rate 98%+
Compatibility BATMTwoUltra, BATMFour, BATMThree

Current BATM3 Setup

Unit Driver Role
MEI Cash Recycler cashflowSc (validator-only) Cash-in: accept → cashbox
Puloon F56 f56 Cash-out: dispense from 2 cassettes

What Needs to Change

1. New recycler driver (@lamassu/hal)

  • Implement MEI SCR protocol (extends beyond the cashflowSc validator protocol)
  • Support recycler cassette operations: accept bills → route to recycler cassette (not just cashbox)
  • Support dispense from recycler cassettes
  • Track recycler cassette inventory (denomination, count, position)

2. HAL abstraction

  • New BillRecycler interface that combines validator + dispenser roles
  • Or extend existing BillValidator with optional recycler methods
  • Cassette configuration: which denominations go to recycler vs cashbox

3. State machine / store updates

  • Dispense logic needs to consider both F56 cassettes AND recycler cassettes as sources
  • Cassette inventory tracking already supports N cassettes (cassette_bills table) — just needs recycler entries
  • Cash-in flow needs to decide: route bill to cashbox vs recycler cassette (based on denomination + cassette capacity)

4. Operator configuration

  • Which denominations to recycle vs send to cashbox
  • Recycler cassette capacity limits
  • Inventory reporting across both F56 + recycler cassettes

Legacy Reference

  • Legacy cashflowSc driver: lamassu-machine/lib/mei/cashflow_sc.js — validator-only, no recycler support
  • Legacy gsr50 driver: lamassu-machine/lib/gsr50/gsr50.js — full recycler implementation (different hardware, but shows the pattern: CashIn, Dispense, Recycle modes)
  • No legacy config combines recycler + F56 — this is new territory

Impact

Recycling lets the ATM self-replenish dispenser inventory from accepted cash-in bills, meaning:

  • Less frequent operator visits for cassette refills
  • Higher uptime for cash-out operations
  • Better capital efficiency (cash-in bills immediately available for cash-out)
> _Migrated from [aiolabs/lamassu-next#37](https://git.atitlan.io/aiolabs/lamassu-next/issues/37) — opened by @padreug on 2026-03-22._\n\n## Summary The GeneralBytes BATM3 has a **MEI cash recycler module** with two 60-bill recycler cassettes + a 600-bill acceptor/cashbox. Currently we only use it as a validator (`cashflowSc` driver) — accepted bills go straight to the cashbox and are never redispensed. Adding a recycler driver would let the ATM **redispense accepted bills**, reducing operator refill frequency. ## Hardware Spec Source: https://www.generalbytes.com/en/products/cash-recycler | Spec | Value | |------|-------| | Dimensions | 518mm x 114mm x 236mm | | Note validation | 62mm–83mm width, 120mm–166mm length | | Recycling cassette capacity | 60 + 60 banknotes | | Acceptor capacity | 600 banknotes | | Acceptance rate | 98%+ | | Compatibility | BATMTwoUltra, BATMFour, BATMThree | ## Current BATM3 Setup | Unit | Driver | Role | |------|--------|------| | MEI Cash Recycler | `cashflowSc` (validator-only) | Cash-in: accept → cashbox | | Puloon F56 | `f56` | Cash-out: dispense from 2 cassettes | ## What Needs to Change ### 1. New recycler driver (`@lamassu/hal`) - Implement MEI SCR protocol (extends beyond the cashflowSc validator protocol) - Support recycler cassette operations: accept bills → route to recycler cassette (not just cashbox) - Support dispense from recycler cassettes - Track recycler cassette inventory (denomination, count, position) ### 2. HAL abstraction - New `BillRecycler` interface that combines validator + dispenser roles - Or extend existing `BillValidator` with optional recycler methods - Cassette configuration: which denominations go to recycler vs cashbox ### 3. State machine / store updates - Dispense logic needs to consider both F56 cassettes AND recycler cassettes as sources - Cassette inventory tracking already supports N cassettes (`cassette_bills` table) — just needs recycler entries - Cash-in flow needs to decide: route bill to cashbox vs recycler cassette (based on denomination + cassette capacity) ### 4. Operator configuration - Which denominations to recycle vs send to cashbox - Recycler cassette capacity limits - Inventory reporting across both F56 + recycler cassettes ## Legacy Reference - Legacy `cashflowSc` driver: `lamassu-machine/lib/mei/cashflow_sc.js` — validator-only, no recycler support - Legacy `gsr50` driver: `lamassu-machine/lib/gsr50/gsr50.js` — full recycler implementation (different hardware, but shows the pattern: `CashIn`, `Dispense`, `Recycle` modes) - No legacy config combines recycler + F56 — this is new territory ## Impact Recycling lets the ATM self-replenish dispenser inventory from accepted cash-in bills, meaning: - Less frequent operator visits for cassette refills - Higher uptime for cash-out operations - Better capital efficiency (cash-in bills immediately available for cash-out)
Sign in to join this conversation.
No labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
aiolabs/bitspire#37
No description provided.