ESSP
Python 3 implementation of the Encrypted Smiley Secure Protocol
Install / Use
/learn @Minege/ESSPREADME
Encrypted Smiley Secure Protocol - eSSP
In Python 3
eSSP version : 6
Officialy Support :
- NV200
- NV11
- NV10
Maybe that other models works, but we haven't tested them.
Installation
Over PIP :
pip install eSSP6
or for the latest version ( maybe unstable )
pip install git+https://github.com/Minege/eSSP
Functionalities
- Multi-currency support
- Poll events interaction
- Response data interaction
- Route to storage
- Route to cashbox
- Payout
- Payout next note (NV11 Only)
- Stack next note (NV11 Only)
- Disable the validator
- Disable the payout device
- Reset the validator
- Empty the storage ( Send all storage's bills in the cashbox quickly )
- Get note amount
Example
import threading
from eSSP.constants import Status
from eSSP import eSSP # Import the library
from time import sleep
# Create a new object ( Validator Object ) and initialize it ( In debug mode, so it will print debug infos )
validator = eSSP(com_port="/dev/ttyUSB0", ssp_address="0", nv11=False, debug=True)
def event_loop():
while True:
# ---- Example of interaction with events ---- #
if validator.nv11: # If the model is an NV11, put every 100 note in the storage, and others in the stack(cashbox), but that's just for this example
(note, currency,event) = validator.get_last_event()
if note == 0 or currency == 0 or event == 0:
pass # Operation that do not send money info, we don't do anything with it
else:
if note != 4 and event == Status.SSP_POLL_CREDIT:
validator.print_debug("NOT A 100 NOTE")
validator.nv11_stack_next_note()
validator.enable_validator()
elif note == 4 and event == Status.SSP_POLL_READ:
validator.print_debug("100 NOTE")
validator.set_route_storage(100) # Route to storage
validator.do_actions()
validator.set_route_cashbox(50) # Everything under or equal to 50 to cashbox ( NV11 )
sleep(0.5)
t1 = threading.Thread(target=event_loop) # Create a new thread on the Validator System Loop ( needed for the signal )
t1.setDaemon(True) # Set the thread as daemon because it don't catch the KeyboardInterrupt, so it will stop when we cut the main thread
t1.start() # Start the validator system loop thread ( Needed for starting sending action )
try: # Command Interpreter
while True:
choice = input("")
if choice == "p": # Payout "choice" value bill ( 10, 20, 50, 100, etc. )
choice = input("")
validator.payout(int(choice))
elif choice == "s": # Route to cashbox ( In NV11, it is any amount <= than "choice" )
choice = input("")
validator.set_route_storage(int(choice))
elif choice == "c": # Route to cashbox ( In NV11, it is any amount <= than "choice" )
choice = input("")
validator.set_route_cashbox(int(choice))
elif choice == "e": # Enable ( Automaticaly disabled after a payout )
validator.enable_validator()
elif choice == "r": # Reset ( It's like a "reboot" of the validator )
validator.reset()
elif choice == "y": # NV11 Payout last entered ( next available )
print("Payout next 1")
validator.nv11_payout_next_note()
elif choice == "d": # Disable
validator.disable_validator()
elif choice == "D": # Disable the payout device
validator.disable_payout()
elif choice == "E": # Empty the storage to the cashbox
validator.empty_storage()
elif choice == "g": # Get the number of bills denominated with their values
choice = input("")
validator.get_note_amount(int(choice))
sleep(1)
print("Number of bills of %s : %s"%(choice, validator.response_data['getnoteamount_response']))
except KeyboardInterrupt: # If user do CTRL+C
validator.close() # Close the connection with the validator
print("Exiting")
exit(0)
Running example 1 with a NV200 :
Set to storage 10 CHF and 20 CHF, putting 10 CHF and 20 CHF, and payout 10 CHF and 20 CHF.

© Loan V.
Related Skills
node-connect
349.7kDiagnose OpenClaw node connection and pairing failures for Android, iOS, and macOS companion apps
claude-opus-4-5-migration
109.7kMigrate prompts and code from Claude Sonnet 4.0, Sonnet 4.5, or Opus 4.1 to Opus 4.5
frontend-design
109.7kCreate distinctive, production-grade frontend interfaces with high design quality. Use this skill when the user asks to build web components, pages, or applications. Generates creative, polished code that avoids generic AI aesthetics.
model-usage
349.7kUse CodexBar CLI local cost usage to summarize per-model usage for Codex or Claude, including the current (most recent) model or a full model breakdown. Trigger when asked for model-level usage/cost data from codexbar, or when you need a scriptable per-model summary from codexbar cost JSON.
