Shelfie
                        
                            Building a Physical Inventory Search Engine
                        
                        
                            Vinay Keerthi 
                        
                        
                     
                    
                
                
                    
                        My bookshelf runs on Python
                         
                        
                    
                    
                         
                        What do you mean your Bookshelf runs Python?
                        
                    
                    
                        Admission: I Own Over a 1000 Books
                        
                        
                    
                    
                        Seriously, it's hard to keep count.
                        
                        And I'm not the most organized of people.
                        
                    
                    
                        But couldn't you just use one of the following:
                        
                            - Physical Notebooks: Too troublesome to carry
- Spreadsheets: Easy at first, too difficult to sync. 
 Also Google Sheets on the phone? 🤮
- Goodreads: Annoying API. Seriously, Amazon, what the hell?
- LibraryThing: Free account has a limit of 250 books. Plus by this point I want the index to be local
I also own a lot of tech
                        
                        I think the AliExpress people know me well
                        
                    
                    
                        I ended up with a slightly over-engineered solution
                        
                            
                        
                        
                    
                    
                        I built a search engine for my bookshelf, using RGB LEDs
                        
                        
                    
                
                
                    
                        Introduction to Micropython
                         
                        
                    
                    
                        What is MicroPython?
                        
                            - Python for Microcontrollers
- Seriously, you can run Python on tiny boards.
- Tiny, includes a subset of CPython's libraries
Getting Started with MicroPython
                        
                            - Buy an ESP8266 or ESP32 based Chip (Available on Amazon / AliExpress)
- Flash MicroPython firmware
- Profit???
Nodemcu
                        
                        
                    
                    
                        Nodemcu
                        
                            - Based on the ESP8266 Wi-Fi SoC
- Runs Lua out of the box
- Can install MicroPython firmware
- Supports WiFi (2GHz only)
- Has 128kB RAM and 4MB ROM
- USB Interface
- Costs between INR 140 to INR 400 (or around 3-4 Euros) depending on where you get it from.
Flashing MicroPython
                        
                            - Download Suitable Firmware
- Setup Virtual Environment
- Run pip install esptool
- Add current user to dialout group (linux)
- Flash firmware: $ esptool.py --port /dev/ttyUSB0 --baud 115200 write_flash --flash_size=detect 0 esp8266-20190529-v1.11.bin
Getting Up and Running
                         
                        
                    
                    
                        You Don't need to be Hackerman: Introducing the WebREPL
                        
                            - Use picocom to activate the webREPL.
- Protip: screen /dev/ttyUSBx 115200 does the job better since it's easier to exit out of.
- Connect to the ESP's WiFi
- Use WebREPL to test out MicroPython
Activating the WebREPL
                         
                        
                    
                    
                        Using the WebREPL
                         ### Uploading Scripts using the webREPL CLI
                        ```
                        webrepl_cli.py -p PASSWORD local_file.py \
                            IP:/destination.py
                        ```
                        
                    
                    
                        ### Uploading Scripts using the webREPL CLI
                        ```
                        webrepl_cli.py -p PASSWORD local_file.py \
                            IP:/destination.py
                        ```
                    
                    
                        Lifecycle of a MicroPython Program
                        
                            - Very similar to Arduino
- First: boot.py
- (optional) webrepl_cfg.py
- Finally: main.py
Shelfie
                       Snakes on a Bookshelf
                        
                    
                    
                        Hardware
                        
                            - ESP8266: 3 Nos.
- Raspberry Pi 3B+: 1 Nos.
- Raspberry Pi Zero W: 4 Nos.
- Raspberry Pi Cluster Hat v2.2: 1 No.
- WS2812B Addressable RGB LED Strips: 10 meter
Architecture
                        
                        
                    
                    
                        Communicating with the ESP8266: The MQTT Protocol
                        
                            - A Lightweight Protocol for <buzzword>IoT</buzzword>
- Message Queuing Telemetry Transport
- Use Eclipse Mosquitto  for simplicity.
- Use the mqtt library in MicroPython, topics can be split using slashes.
MQTT Demo
                         
                        
                    
                    
                        WS2812B LED Strips
                         
                        
                    
                    
                        WS2812B LED Strips
                         
                        
                    
                
                
                    
                        Shelfie Server
                        CRUD! He's used Flask
                        
                    
                    
                        Flask
                        
                            - Lightweight and completely customizable.
- Easy to hack around with, nothing is predetermined.
- Simple is better than complex.
- Explicit is better than implicit.
- psycopg2 + flask_migrate + flask_sqlalchemy
DB Table Schema
                         
                        
                    
                    
                        UI with Flask-Admin
                         
                        
                    
                    
                        Indexing
                         
                        
                    
                    
                        Position
                        
                            - m:n.x, where m = column start, n = column end, x = row.
- Indexing books the first time was difficult, but now I can place books anywhere and the bookshelf can remember them.
- The shelf enables my lack of organization.
Alpha Stage Demos
                        
                    
                    
                        Blink, blink
                        
                        
                    
                    
                        What's Capacitance, Doc?
                        
                        
                    
                    
                        Improving Control
                        
                        
                    
                    
                        Indexing Books
                        
                        
                    
                    
                        The Prototype
                        curl -x GET http://server/api/v1/book/?title=the%20decline%20and%20fall
                        
                        
                    
                    
                        You curl for books?
                        That's boring!
                        Not exactly.
                        I said I wanted to ask my bookshelves for books.
                        So, I added another service.
                    
                
                
                    
                        Shelfie Voice
                         
                        
                    
                    
                        Enter Alexa
                         
                        
                    
                    
                        Building a Voice API with Flask
                        
                            - Flask_Ask is a great extension that enables Alexa skills.
- To run on a local server with access to the other API, use with ngrok.
- Can also be configured on AWS, if you want to avoid buying a Raspberry Pi cluster. (Why would you do that?)
Voice Server Architecture
                         
                        
                    
                    
                        Code
                         
                        
                    
                    
                        Amazon Developer Page: Configuring The Skill
                         
                        
                    
                    
                        Amazon Developer Page: Configuring The Query Variable
                         
                        Protip: When you want a raw string: use AMAZON.SearchQuery
                        
                    
                    
                        Caveats
                        
                            - A bit slow, could work better on AWS native instead of my ngrok hack
- Direct integration with the shelf server might be faster
- Other libraries to consider: AWS's own library for Alexa.
- Flask_Ask is poorly packaged. Has dependencies locked to older versions of cryptography
Now Presenting: Shelfie, The Bookshelf Search Engine
                        
                    
                    
                    
                        In your door! In your door, would you, could you, in the door?
                        
                        
                    
                    
                    
                        What if there are books behind books?
                        I'm glad you asked.
                        
                    
                
                
                    
                        Future Upgrades
                        Improved Interfaces
                        
                            - Web UI with flask_wtf
- Telegram Bot
- Bookshelf metrics: visualize read-count, days since last read stats with LEDs!
- Dialogue flow for Alexa skills.
- Use spacy for NLP
Challenges to a MicroPython Project
                        
                            - Poor learning material
- No examples for best practises
- Need some competence with electronics.
- Procuring components (depends on location)
Vinay Keerthi
                    
                        - Sr. Software Engineer @ Visa Inc.
- @stonecharioteer
- stonecharioteer.com
- github.com/stonecharioteer
- github.com/bookshelfie