# Lightning Payment Dual Beer Tap Controller A Bitcoin Lightning Network payment-activated dual beer tap controller using Raspberry Pi and LNbits. Monitor two different Lightning wallets and control two separate beer taps independently. ## πŸš€ Project Overview This enhanced system monitors **two different LNbits Lightning wallets** for incoming payments and automatically activates the corresponding 12V solenoid valve when payments are received. Perfect for Bitcoin-powered dual beer taps, different beer types, pricing tiers, or any beverage dispensing application requiring independent payment-activated hardware control. - bitcoinswitch_tester.py - python file to test your lnbits api - lightning_solenoid_polling.py - python script to test controls of a single solenoid - dual_beer_tap.py - final solution to control 2 beer taps, each for a different lnbits wallet - config_example.py - example configurations for dual_beer_tap ## ⚑ Features - **Dual beer tap system** - Monitor two different LNbits wallets simultaneously - **Independent tap control** - Each wallet triggers its own beer tap - **Fast internal payment detection** - Catches instant payments within the same LNbits server - **Timezone-aware timestamp handling** - Proper handling of API timestamps - **Real-time Lightning payment detection** via LNbits API polling - **Reliable payment verification** using dedicated payment status endpoints - **Hardware control** via GPIO relay switching for two separate relays - **Smart filtering** - only new payments trigger activation (ignores historical) - **Configurable settings per beer tap** - Different minimum payments, pour rates, durations - **Automatic reconnection** and error handling - **Memory management** - Prevents memory leaks with payment tracking cleanup - **Detailed logging** for monitoring and debugging both beer taps ## πŸ›  Hardware Requirements ### Core Components - **Raspberry Pi Zero W** (with WiFi) or Raspberry Pi 4 - **MicroSD card** (8GB+, Class 10 recommended) - **2x 5V Relay Modules** (3-terminal: COM, NO, NC) - or 1x dual relay module - **2x 12V Solenoid Valves** (2-wire, normally closed recommended) - for beer tap control - **12V Power Supply** (5A+ recommended for dual beer taps) - **Jumper wires** for connections ### Pi pinout ``` Left Side (Odd pins): Right Side (Even pins): ═════════════════════ ═══════════════════════ Pin 1 - 3V3 Pin 2 - 5V (Relay 1) Pin 3 - GPIO2 Pin 4 - 5V (Relay 2) Pin 5 - GPIO3 Pin 6 - GND (Relay 1) ... ... Pin 11 - GPIO17 Pin 12 - GPIO18 (Relay 1) Pin 13 - GPIO27 Pin 14 - GND (Button 1) Pin 15 - GPIO22 Pin 16 - GPIO23 (Button 1) Pin 17 - 3V3 Pin 18 - GPIO24 (Button 2) Pin 19 - GPIO10 Pin 20 - GND (Button 2) ... ... Pin 35 - GPIO19 (Relay 2) Pin 36 - GPIO16 Pin 37 - GPIO26 Pin 38 - GPIO20 Pin 39 - GND (Relay 2) Pin 40 - GPIO21 β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ LIGHTNING PAYMENT DUAL SOLENOID SYSTEM WITH BUTTONS β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ RELAY 1 (GPIO 18): ═══════════════════ Pi Pin 12 (GPIO18) ──────► Relay 1 Signal (S) Pi Pin 2 (5V) ──────► Relay 1 VCC (+) Pi Pin 6 (GND) ──────► Relay 1 GND (-) Relay 1 Power Side: 12V+ ──► COM (center) NO (left) ──► Solenoid 1 Wire 1 Solenoid 1 Wire 2 ──► 12V- RELAY 2 (GPIO 19): ═══════════════════ Pi Pin 35 (GPIO19) ──────► Relay 2 Signal (S) Pi Pin 4 (5V) ──────► Relay 2 VCC (+) Pi Pin 39 (GND) ──────► Relay 2 GND (-) Relay 2 Power Side: 12V+ ──► COM (center) NO (left) ──► Solenoid 2 Wire 1 Solenoid 2 Wire 2 ──► 12V- BUTTONS: ════════ Pi Pin 16 (GPIO23) ──┬─[ Button 1 ]─┬── Pi Pin 14 (GND) β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ Pi Pin 18 (GPIO24) ──┬─[ Button 2 ]─┬── Pi Pin 20 (GND) β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ 12V POWER DISTRIBUTION: ═══════════════════════ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ 12V Power β”‚ β”‚ Supply β”‚ β”‚ (+) (-) β”‚ β””β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”˜ β”‚ β”‚ β”‚ β”œβ”€β”€β”€β”€β”€β”€β–Ί Solenoid 1 Wire 2 β”‚ └──────► Solenoid 2 Wire 2 β”‚ β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β–Ί Relay 1 COM └────────────► Relay 2 COM ``` ### Relay Connections ``` Relay Module β†’ Pi Zero W Pin VCC β†’ Pin 2 (5V) GND β†’ Pin 6 (GND) IN β†’ Pin 12 (GPIO 18) ``` ### Power Circuit (12V side): ``` 12V Power Supply (+) β†’ Relay COM terminal Relay NO terminal β†’ Solenoid cable 2 Solenoid cable 1 β†’ 12V Power Supply (-) ``` ### Control Circuit (Pi side): ``` Pi GPIO 18 (Pin 12) β†’ Relay S pin βœ… Pi 5V (Pin 2) β†’ Relay + pin βœ… Pi GND (Pin 6) β†’ Relay - pin βœ… ``` ### Complete Wirig Diagram ``` β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ LIGHTNING PAYMENT DUAL SOLENOID SYSTEM WITH BUTTONS β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ Raspberry Pi β”‚ β”‚ Relay 1 β”‚ β”‚ Relay 2 β”‚ β”‚ Solenoids β”‚ β”‚ Zero W β”‚ β”‚ (GPIO18) β”‚ β”‚ (GPIO19) β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ [GPIO Layout] β”‚ β”‚ [Ctrl] β”‚ β”‚ [Ctrl] β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ S ───── β”‚ β”‚ S ───── β”‚ β”‚ β”‚ β”‚ Pin 1 (3V3) β”‚ β”‚ + ───── β”‚ β”‚ + ───── β”‚ β”‚ β”‚ β”‚ Pin 2 (5V) ────┼────┼─── β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ Pin 3 (GPIO2) β”‚ β”‚ - ───── β”‚ β”‚ - ───── β”‚ β”‚ β”‚ β”‚ Pin 4 (5V) ────┼────┼──────────────┼─── β”‚ β”‚ β”‚ β”‚ Pin 5 (GPIO3) β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ Pin 6 (GND)────┼────┼─── β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ Pin 7 (GPIO4) β”‚ β”‚ [Power] β”‚ β”‚ [Power] β”‚ β”‚ β”‚ β”‚ Pin 8 (GPIO14) β”‚ β”‚ NO(L)────┼──┼───────────┼───── Solenoid 1+ β”‚ β”‚ Pin 9 (GND) β”‚ β”‚ COM(C)───┼──┼───────┐ β”‚ β”‚ β”‚ β”‚ Pin 10 (GPIO15) β”‚ β”‚ NC(R) β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ Pin 11 (GPIO17) β”‚ β”‚ β”‚ β”‚ NO(L)────┼───── Solenoid 2+ β”‚ β”‚ Pin 12 (GPIO18)─┼────┼──► S β”‚ β”‚ COM(C)───┼────┼──┐ β”‚ β”‚ Pin 13 (GPIO27) β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ NC(R) β”‚ β”‚ β”‚ β”‚ β”‚ Pin 14 (GND)────┼────┐ β”‚ G S β”‚ β”‚ β”‚ β”‚ β”‚ Pin 15 (GPIO22) β”‚ β”‚ └──────|─|β”€β”€β”˜ β”‚ β”‚ β”‚ β”‚ Pin 16 (GPIO23)─┼──┐ β”‚ | | β”‚ β”‚ β”‚ β”‚ Pin 17 (3V3) β”‚ β”‚ β”‚ | | β”‚ β”‚ β”‚ β”‚ Pin 18 (GPIO24)─┼─┐│ β”‚ | | β”‚ β”‚ β”‚ β”‚ Pin 19 (GPIO10) β”‚ β”‚β”‚ β”‚ | | β”‚ β”‚ β”‚ β”‚ Pin 20 (GND)────┼┐││ β”‚ | | β”‚ β”‚ β”‚ β”‚ Pin 21 (GPIO9) β”‚β”‚β”‚β”‚β”‚ | | β”‚ β”‚ β”‚ β”‚ Pin 22 (GPIO25) β”‚β”‚β”‚β”‚β”‚ | | β”‚ β”‚ β”‚ β”‚ Pin 24 (GPIO8) β”‚β”‚β”‚β”‚β”‚ | | β”‚ β”‚ β”‚ β”‚ Pin 25 (GND) β”‚β”‚β”‚β”‚β”‚ | | β”‚ β”‚ β”‚ β”‚ Pin 26 (GPIO7) β”‚β”‚β”‚β”‚β”‚ | | β”‚ β”‚ β”‚ β”‚ Pin 27 (ID_SD) β”‚β”‚β”‚β”‚β”‚ | | β”‚ β”‚ β”‚ β”‚ Pin 28 (ID_SC) β”‚β”‚β”‚β”‚β”‚ | | β”‚ β”‚ β”‚ β”‚ Pin 29 (GPIO5) β”‚β”‚β”‚β”‚β”‚ | | β”‚ β”‚ β”‚ β”‚ Pin 30 (GND) β”‚β”‚β”‚β”‚β”‚ | | β”‚ β”‚ β”‚ β”‚ Pin 31 (GPIO6) β”‚β”‚β”‚β”‚β”‚ | | β”‚ β”‚ β”‚ β”‚ Pin 32 (GPIO12) β”‚β”‚β”‚β”‚β”‚ | | β”‚ β”‚ β”‚ β”‚ Pin 33 (GPIO13) β”‚β”‚β”‚β”‚β”‚ | | β”‚ β”‚ β”‚ β”‚ Pin 34 (GND) β”‚β”‚β”‚β”‚β”‚ | | β”‚ β”‚ β”‚ β”‚ Pin 35 (GPIO19)─┼┼┼┼┼──────────────────────|─| S β”‚ β”‚ β”‚ β”‚ Pin 36 (GPIO16) β”‚β”‚β”‚β”‚β”‚ | β”‚ β”‚ β”‚ β”‚ Pin 37 (GPIO26) β”‚β”‚β”‚β”‚β”‚ | β”‚ β”‚ β”‚ β”‚ Pin 38 (GPIO20) β”‚β”‚β”‚β”‚β”‚ | β”‚ β”‚ β”‚ β”‚ Pin 39 (GND)────┼┼┼┼┼─────────────────────── β”‚ β”‚ β”‚ β”‚ Pin 40 (GPIO21) β”‚β”‚β”‚β”‚β”‚ β”‚ β”‚ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜β”‚β”‚β”‚β”‚β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚β”‚β”‚β”‚β”‚ β”‚ β”‚ β”‚β”‚β”‚β”‚β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β”‚β”‚β”‚β”‚β”‚ β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚β”‚β”‚β”‚β”‚ β”Œβ”€β”€β”€β”€β”€β–Όβ”€β”€β–Όβ”€β”€β”€β”€β”€β” β”‚β”‚β”‚β”‚β”‚ β”‚ 12V DC β”‚ β”‚β”‚β”‚β”‚β”‚ β”‚ Power β”‚ β”‚β”‚β”‚β”‚β”‚ β”‚ Supply β”‚ β”‚β”‚β”‚β”‚β”‚ β”‚ (+) (βˆ’) β”‚ β”‚β”‚β”‚β”‚β”‚ β””β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”˜ β”‚β”‚β”‚β”‚β”‚ β”‚ β”‚ β”‚β”‚β”‚β”‚β”‚ β”‚ └────► Solenoid 1- β”‚β”‚β”‚β”‚β”‚ β”‚ └────► Solenoid 2- β”‚β”‚β”‚β”‚β”‚ β”‚ ││││└──────┐ │││└────┐ β”‚ ││└──┐ β”‚ β”‚ │└─┐ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”Œβ”€β–Όβ”€β”€β–Όβ”€β” β”Œβ–Όβ”€β”€β–Όβ”€β” β”‚Buttonβ”‚ β”‚Buttonβ”‚ β”‚ 1 β”‚ β”‚ 2 β”‚ β”‚ [ ] β”‚ β”‚ [ ] β”‚ β””β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”˜ ```