Skip to content
Permalink
master
Switch branches/tags
Go to file
 
 
Cannot retrieve contributors at this time
164 lines (116 sloc) 4.92 KB

πŸ”Œ sweetd

license release

Sweet daemon for pairing and control of the Bitcoin-enabled candy dispenser

Intro

sweetd is the daemon process running on the Bitcoin-enabled candy dispenser. It manages pairing and control, which is used by the Candy Dispenser app:

The sweetd program offers the following features:

  • 🍬 Control of the motor for dispensing candy
  • πŸ“³ Control of the buzzer for user feedback
  • ☝️ React on events from the touch sensor
  • πŸ”΅ Pair through Bluetooth
  • 🌐 Set up Wi-Fi on candy dispenser
  • ⚑ Dispense candy on payments from remote lnd node
  • πŸ’… Customize name of your dispenser
  • πŸ”„ Update itself through app
  • βš™οΈ Ensure all system configs are made

Download

Download the pre-built binary for your system from the GitHub releases page.

Extract and open the downloaded archive, then run sweetd.

Structure

The sweetd program's source code is split into small modules:

  • πŸ”Œ api - REST api for remote management of the dispenser
  • βš™οΈ app - website for managing the dispenser
  • 🍬 dispenser - orchestrator for everything the dispenser does
  • ⚑️ lightning - controller for configured Lightning nodes, remote and local
  • πŸ”©οΈ machine - hardware controller for the touch sensor, motor and buzzer
  • πŸ“Ά network - network subsystem that handles Wi-Fi discovery and connectivity
  • πŸ€Ήβ€ nodeman - node manager
  • πŸ§… onion - Tor onion service conveniences and .onion address generation
  • πŸ“² pairing - pairing controller for BLE pairing
  • πŸ’΅ pos - point-of-sale website that creates invoices
  • πŸ›‘ reboot - methods for rebooting and shutting down the system
  • πŸ“ sweetdb - persistent database manager
  • πŸ“ƒ sweetlog - logging middleware for intercepting logs
  • πŸ”– sysid - methods for determining a system-specific id
  • πŸ”„ updater - update subsystem that controls system updates

Configure data directory

By default, sweetd stores all data to ./data. You can easily override this location:

sweetd --datadir=/data/sweetd

Configure machine access

Currently, the sweetd program is only tested and executed on a Raspberry Pi. Running the executable with no options is the same as providing the following options:

sweetd \
  --machine=raspberry \
  --raspberry.touchpin=25 \
  --raspberry.motorpin=23 \
  --raspberry.buzzerpin=24

You can also mock the underlying machine with the following option:

sweetd \
  --machine=mock \
  --mock.listen=localhost:5000

With this option, you can fake touches by sending simple HTTP requests to the mock machine:

curl http://localhost:5000/touch/on
curl http://localhost:5000/touch/off

Configure the sweetd API server

sweetd exposes a gRPC API. It can be used to configure the Wi-Fi network that the candy dispenser connects to, personalize it and change settings.

By default, the API server listens on 0.0.0.0:9000. This can be changed with the following option:

sweetd --listen=localhost:9000

It's also possible to specify multiple --listen options and listen to multiple interfaces at once.

Enable Wi-Fi hotspot pairing

At the moment, the only app pairing mechanism is through a Wi-Fi hotspot that is created by the sweetd program.

This feature needs to be activated first:

sweetd --ap

Make sure that the following dependencies are installed when running the access point mode:

hostapd wireless-tools wpasupplicant dnsmasq iw

The access point is configured with the below defaults. Any of these can be changed to your needs.

sweetd \
  --ap \
  --ap.ip=192.168.27.1/24 \
  --ap.interface=uap0 \
  --ap.ssid=candy \
  --ap.passphrase=reckless \
  --ap.dhcprange=192.168.27.100,192.168.27.150,1h

This will create a Wi-Fi network called candy with the passphrase reckless. An app will connect to that network for pairing and use the gRPC api that is provided by the sweetd program.

Development

go get -d github.com/the-lightning-land/sweetd

cd $GOPATH/src/github.com/the-lightning-land/sweetd

go build

./sweetd

Releasing using goreleaser

The tool goreleaser can automatically sign the release and upload it to GitHub.

git tag -a v0.1.0 -m "Release name"

git push origin v0.1.0

goreleaser --rm-dist