50
PYTHON AND IOT: From Chips and Bits to Data Science Jeff Fischer Data-Ken Research [email protected] https://data-ken.org Sunnyvale, California, USA BayPiggies October 2016

PYTHON AND IOT · 2018-08-21 · AntEvents 15 ¨ Python3 library for processing IoT event streams ¤ Built on Python 3.4’s asyncio module ¤ Port to Micropython, which runs on the

  • Upload
    others

  • View
    17

  • Download
    0

Embed Size (px)

Citation preview

Page 1: PYTHON AND IOT · 2018-08-21 · AntEvents 15 ¨ Python3 library for processing IoT event streams ¤ Built on Python 3.4’s asyncio module ¤ Port to Micropython, which runs on the

PYTHON AND IOT: From Chips and Bits to Data Science

Jeff Fischer Data-Ken Research [email protected] https://data-ken.org Sunnyvale, California, USA

BayPiggies October 2016

Page 2: PYTHON AND IOT · 2018-08-21 · AntEvents 15 ¨ Python3 library for processing IoT event streams ¤ Built on Python 3.4’s asyncio module ¤ Port to Micropython, which runs on the

Agenda

¨  Project overview ¨  Hardware ¨  Data capture ¨  Data analysis ¨  Player ¨  Parting thoughts

2

© 2016 Jeff Fischer

Page 3: PYTHON AND IOT · 2018-08-21 · AntEvents 15 ¨ Python3 library for processing IoT event streams ¤ Built on Python 3.4’s asyncio module ¤ Port to Micropython, which runs on the

Project Motivation 3

¨  If out of town for the weekend, don’t want to leave the house dark

¨  Timers are flakey and predictable ¨  Would like a self-contained solution

¤ Avoid security issues with cloud solutions

¨  “Wouldn’t be cool to use machine learning?”

© 2016 Jeff Fischer

Page 4: PYTHON AND IOT · 2018-08-21 · AntEvents 15 ¨ Python3 library for processing IoT event streams ¤ Built on Python 3.4’s asyncio module ¤ Port to Micropython, which runs on the

Lighting Replay Application 4

Smart Lights

Data Capture

© 2016 Jeff Fischer

Analysis and Machine Learning

Player Application

Lux Sensors

Page 5: PYTHON AND IOT · 2018-08-21 · AntEvents 15 ¨ Python3 library for processing IoT event streams ¤ Built on Python 3.4’s asyncio module ¤ Port to Micropython, which runs on the

Lighting Replay Application: Capture 5

Lux Sensor ESP8266

Front Bedroom Sensor Node

Lux Sensor ESP8266

Back Bedroom Sensor Node

Raspberry Pi (Dining Room)

© 2016 Jeff Fischer

MQTT

Data Capture

App

Lux Sensor

Flat Files

Page 6: PYTHON AND IOT · 2018-08-21 · AntEvents 15 ¨ Python3 library for processing IoT event streams ¤ Built on Python 3.4’s asyncio module ¤ Port to Micropython, which runs on the

Lighting Replay Application: Analysis 6

Raspberry Pi (Dining Room)

© 2016 Jeff Fischer

Flat Files

HMM definitions

Laptop

Jupyter Notebook

file copy

Page 7: PYTHON AND IOT · 2018-08-21 · AntEvents 15 ¨ Python3 library for processing IoT event streams ¤ Built on Python 3.4’s asyncio module ¤ Port to Micropython, which runs on the

Lighting Replay Application: Replay 7

Front Room Smart Light

Raspberry Pi (Dining Room)

© 2016 Jeff Fischer

HMM definitions

Player Script

Back Room Smart Light

Philips Hue Bridge

WiFi Router and Switch

ZigBee

HTTP

Page 8: PYTHON AND IOT · 2018-08-21 · AntEvents 15 ¨ Python3 library for processing IoT event streams ¤ Built on Python 3.4’s asyncio module ¤ Port to Micropython, which runs on the

Hardware 8

© 2016 Jeff Fischer

Page 9: PYTHON AND IOT · 2018-08-21 · AntEvents 15 ¨ Python3 library for processing IoT event streams ¤ Built on Python 3.4’s asyncio module ¤ Port to Micropython, which runs on the

Recommended Hardware Supplier: Adafruit

¨  Focused on the hobbyist

¨  Plenty of documentation and examples

¨  Breakout boards make it easy to work with peripheral ICs

9

© 2016 Jeff Fischer

Page 10: PYTHON AND IOT · 2018-08-21 · AntEvents 15 ¨ Python3 library for processing IoT event streams ¤ Built on Python 3.4’s asyncio module ¤ Port to Micropython, which runs on the

Recommended Tools 10

© 2016 Jeff Fischer

Solder

Multimeter Wire strippers

Soldering iron

Wire cutters Pliers

Breadboarding wires

Breadboards (get ½ and full sized)

Wire (#24 or #26)

Page 11: PYTHON AND IOT · 2018-08-21 · AntEvents 15 ¨ Python3 library for processing IoT event streams ¤ Built on Python 3.4’s asyncio module ¤ Port to Micropython, which runs on the

Raspberry Pi 11

© 2016 Jeff Fischer

Raspberry Pi 2

Breakout cable “Pi Cobbler Plus”

Two full-sized breadboards

Resistor

LED TSL2591 lux sensor breakout board

Page 12: PYTHON AND IOT · 2018-08-21 · AntEvents 15 ¨ Python3 library for processing IoT event streams ¤ Built on Python 3.4’s asyncio module ¤ Port to Micropython, which runs on the

ESP8266 12

© 2016 Jeff Fischer

TSL2591 lux sensor breakout board

Lithium Ion Polymer Battery 3.7v 350mAh

MicroUSB to USB cable

½ Size breadboard

Adafruit Feather HUZZAH ESP8266 breakout board

Page 13: PYTHON AND IOT · 2018-08-21 · AntEvents 15 ¨ Python3 library for processing IoT event streams ¤ Built on Python 3.4’s asyncio module ¤ Port to Micropython, which runs on the

Data Capture 13

© 2016 Jeff Fischer

Page 14: PYTHON AND IOT · 2018-08-21 · AntEvents 15 ¨ Python3 library for processing IoT event streams ¤ Built on Python 3.4’s asyncio module ¤ Port to Micropython, which runs on the

Lighting Replay Application: Capture 14

Lux Sensor ESP8266

Front Bedroom Sensor Node

Lux Sensor ESP8266

Back Bedroom Sensor Node

Raspberry Pi (Dining Room)

© 2016 Jeff Fischer

MQTT

Data Capture

App

Lux Sensor

Flat Files

Page 15: PYTHON AND IOT · 2018-08-21 · AntEvents 15 ¨ Python3 library for processing IoT event streams ¤ Built on Python 3.4’s asyncio module ¤ Port to Micropython, which runs on the

AntEvents 15

¨  Python3 library for processing IoT event streams ¤  Built on Python 3.4’s asyncio module ¤  Port to Micropython, which runs on the ESP8266

¨  Key library features: ¤  Push-style streams of events ¤ Assemble “elements” into a DAG

n  Fine-grained pub/sub model: an element is a publisher, a subscriber, or both

n  Special support for pipelines of stateful filters n  Elements can be proxies for external systems

¤  Event-driven scheduling, with separate threads for blocking elements

¨  https://github.com/mpi-sws-rse/antevents-python

© 2016 Jeff Fischer

Page 16: PYTHON AND IOT · 2018-08-21 · AntEvents 15 ¨ Python3 library for processing IoT event streams ¤ Built on Python 3.4’s asyncio module ¤ Port to Micropython, which runs on the

Simple AntEvents Example 16

¨  Sample a light sensor every two seconds and turn on an LED if the average of the last 5 samples exceeds a threshold

lux = LuxSensor() Lux.map(lambda e: e.val).running_avg(5) \ .map(lambda v: v > threshold).GpioPinOut() scheduler.schedule_recurring(lux, 2.0)

Lux Sensor LED Map

Running Average Map

© 2016 Jeff Fischer

Page 17: PYTHON AND IOT · 2018-08-21 · AntEvents 15 ¨ Python3 library for processing IoT event streams ¤ Built on Python 3.4’s asyncio module ¤ Port to Micropython, which runs on the

ESP8266 Code 17

© 2016 Jeff Fischer

from antevents import Scheduler from tsl2591 import Tsl2591 from mqtt_writer import MQTTWriter from wifi import wifi_connect import os # Params to set WIFI_SID= … WIFI_PW= … SENSOR_ID="front-room" BROKER='192.168.11.153' wifi_connect(WIFI_SID, WIFI_PW) sensor = Tsl2591() writer = MQTTWriter(SENSOR_ID, BROKER, 1883, 'remote-sensors') sched = Scheduler() sched.schedule_sensor(sensor, SENSOR_ID, 60, writer) sched.run_forever()

https://github.com/jfischer/micropython-tsl2591

Sample at 60 second intervals

The MQTT writer subscribes to events from The lux sensor.

See https://github.com/mpi-sws-rse/antevents-examples/blob/master/lighting_replay_app/capture/esp8266_main.py

Page 18: PYTHON AND IOT · 2018-08-21 · AntEvents 15 ¨ Python3 library for processing IoT event streams ¤ Built on Python 3.4’s asyncio module ¤ Port to Micropython, which runs on the

Raspberry Pi Code 18

© 2016 Jeff Fischer

Lux Sensor

MQTT Adapter

Map to

UTF8

Parse JSON

Map to

events Dispatch

CSV File Writer

(front room)

CSV File Writer

(back room)

CSV File Writer

(dining room)

https://github.com/mpi-sws-rse/antevents-examples/blob/master/lighting_replay_app/capture/sensor_capture.py

Page 19: PYTHON AND IOT · 2018-08-21 · AntEvents 15 ¨ Python3 library for processing IoT event streams ¤ Built on Python 3.4’s asyncio module ¤ Port to Micropython, which runs on the

Raspberry Pi Code: Threading Model 19

© 2016 Jeff Fischer

Lux Sensor

MQTT Adapter

Map to

UTF8

Parse JSON

Map to

events Dispatch

CSV File Writer

(front room)

CSV File Writer

(back room)

CSV File Writer

(dining room)

Main Thread

Separate Thread

Separate Thread

https://github.com/mpi-sws-rse/antevents-examples/blob/master/lighting_replay_app/capture/sensor_capture.py

Page 20: PYTHON AND IOT · 2018-08-21 · AntEvents 15 ¨ Python3 library for processing IoT event streams ¤ Built on Python 3.4’s asyncio module ¤ Port to Micropython, which runs on the

Data Analysis 20

© 2016 Jeff Fischer

Page 21: PYTHON AND IOT · 2018-08-21 · AntEvents 15 ¨ Python3 library for processing IoT event streams ¤ Built on Python 3.4’s asyncio module ¤ Port to Micropython, which runs on the

Lighting Replay Application: Analysis 21

Raspberry Pi (Dining Room)

© 2016 Jeff Fischer

Flat Files

HMM definitions

Laptop

Jupyter Notebook

file copy

Page 22: PYTHON AND IOT · 2018-08-21 · AntEvents 15 ¨ Python3 library for processing IoT event streams ¤ Built on Python 3.4’s asyncio module ¤ Port to Micropython, which runs on the

Steps in Data Analysis 22

1.  Read and preprocess data files 2.  Convert to discrete levels using K-means clustering 3.  Map to on-off values 4.  Train Hidden Markov Models (HMMs) on data 5.  Validate predictions 6.  Export HMM definitions for player

© 2016 Jeff Fischer https://github.com/mpi-sws-rse/antevents-examples/tree/master/lighting_replay_app/analysis

Page 23: PYTHON AND IOT · 2018-08-21 · AntEvents 15 ¨ Python3 library for processing IoT event streams ¤ Built on Python 3.4’s asyncio module ¤ Port to Micropython, which runs on the

Read and Process CSV Files (AntEvents running in a Jupyter Notebook)

23

© 2016 Jeff Fischer

CSV File Reader

Fill in missing times

Sliding Mean

Round values

Output Event Count

Capture NaN

Indexes

Pandas Writer

(raw series)

Pandas Writer

(smoothed series)

reader.fill_in_missing_times()\ .passthrough(raw_series_writer)\ .transduce(SensorSlidingMeanPassNaNs(5)).select(round_event_val).passthrough(smoothed_series_writer)\ .passthrough(capture_nan_indexes).output_count()

Page 24: PYTHON AND IOT · 2018-08-21 · AntEvents 15 ¨ Python3 library for processing IoT event streams ¤ Built on Python 3.4’s asyncio module ¤ Port to Micropython, which runs on the

Raw Sensor Data: Entire Set 24

© 2016 Jeff Fischer

Front room

Vacation!

Page 25: PYTHON AND IOT · 2018-08-21 · AntEvents 15 ¨ Python3 library for processing IoT event streams ¤ Built on Python 3.4’s asyncio module ¤ Port to Micropython, which runs on the

Raw Sensor Data: Entire Set 25

© 2016 Jeff Fischer

Front room Back room

Dining room

Page 26: PYTHON AND IOT · 2018-08-21 · AntEvents 15 ¨ Python3 library for processing IoT event streams ¤ Built on Python 3.4’s asyncio module ¤ Port to Micropython, which runs on the

Raw Sensor Data: Last Day Only 26

© 2016 Jeff Fischer

Front room

Data gaps

Page 27: PYTHON AND IOT · 2018-08-21 · AntEvents 15 ¨ Python3 library for processing IoT event streams ¤ Built on Python 3.4’s asyncio module ¤ Port to Micropython, which runs on the

Raw Sensor Data: Last Day Only 27

© 2016 Jeff Fischer

Front room Back room

Dining room

Page 28: PYTHON AND IOT · 2018-08-21 · AntEvents 15 ¨ Python3 library for processing IoT event streams ¤ Built on Python 3.4’s asyncio module ¤ Port to Micropython, which runs on the

Data Processing: Raw Data 28

© 2016 Jeff Fischer

Front room, last day

Page 29: PYTHON AND IOT · 2018-08-21 · AntEvents 15 ¨ Python3 library for processing IoT event streams ¤ Built on Python 3.4’s asyncio module ¤ Port to Micropython, which runs on the

Data Processing: Smoothed Data 29

© 2016 Jeff Fischer

Front room, last day

Page 30: PYTHON AND IOT · 2018-08-21 · AntEvents 15 ¨ Python3 library for processing IoT event streams ¤ Built on Python 3.4’s asyncio module ¤ Port to Micropython, which runs on the

Data Processing: K-Means Clustering 30

© 2016 Jeff Fischer

Front room, last day

Page 31: PYTHON AND IOT · 2018-08-21 · AntEvents 15 ¨ Python3 library for processing IoT event streams ¤ Built on Python 3.4’s asyncio module ¤ Port to Micropython, which runs on the

Data Processing: Mapping to on-off values 31

© 2016 Jeff Fischer

Front room, last day

Page 32: PYTHON AND IOT · 2018-08-21 · AntEvents 15 ¨ Python3 library for processing IoT event streams ¤ Built on Python 3.4’s asyncio module ¤ Port to Micropython, which runs on the

Hidden Markov Models (HMMs) 32

¨  In a Markov process, the probability distribution of future states is determined only by the current state, not on the sequence of events that preceded it.

¨  In a HMM, the states are not visible to the observer, only the outputs (“emissions”).

¨  In a machine learning context, we are given a sequence of emissions and a number of states. We want to infer the state machine.

¨  The hmmlearn library will do this for us. ¤  https://github.com/hmmlearn/hmmlearn

© 2016 Jeff Fischer

Example Markov process (from Wikipedia)

Page 33: PYTHON AND IOT · 2018-08-21 · AntEvents 15 ¨ Python3 library for processing IoT event streams ¤ Built on Python 3.4’s asyncio module ¤ Port to Micropython, which runs on the

Slicing Data into Time-based “Zones” 33

© 2016 Jeff Fischer

Sunrise

30 Minutes before sunset

Max(sunset+60m, 9:30 pm)

0 1 2 3 0

Page 34: PYTHON AND IOT · 2018-08-21 · AntEvents 15 ¨ Python3 library for processing IoT event streams ¤ Built on Python 3.4’s asyncio module ¤ Port to Micropython, which runs on the

HMM Training and Prediction Process 34

1.  Build a list of sample subsequences for each zone n  Drop the timestamps n  Beak into separate sequences at zone boundaries and NaNs

2.  Guess a number of states (e.g. 5)

3.  For each zone, create an HMM and call fit() with the subsequences

4.  For each zone of a given day: n  Run the associated HMM to generate N samples for an N

minute zone duration n  Associated a computed timestamp with each sample

© 2016 Jeff Fischer

Page 35: PYTHON AND IOT · 2018-08-21 · AntEvents 15 ¨ Python3 library for processing IoT event streams ¤ Built on Python 3.4’s asyncio module ¤ Port to Micropython, which runs on the

HMM Predicted Data 35

© 2016 Jeff Fischer

Front room, one week predicted data

Front room, one day predicted data

Page 36: PYTHON AND IOT · 2018-08-21 · AntEvents 15 ¨ Python3 library for processing IoT event streams ¤ Built on Python 3.4’s asyncio module ¤ Port to Micropython, which runs on the

Replaying the Lights 36

© 2016 Jeff Fischer

Page 37: PYTHON AND IOT · 2018-08-21 · AntEvents 15 ¨ Python3 library for processing IoT event streams ¤ Built on Python 3.4’s asyncio module ¤ Port to Micropython, which runs on the

Lighting Replay Application: Replay 37

Front Room Smart Light

Raspberry Pi (Dining Room)

© 2016 Jeff Fischer

HMM definitions

Player Script

Back Room Smart Light

Philips Hue Bridge

WiFi Router and Switch

ZigBee

HTTP

Page 38: PYTHON AND IOT · 2018-08-21 · AntEvents 15 ¨ Python3 library for processing IoT event streams ¤ Built on Python 3.4’s asyncio module ¤ Port to Micropython, which runs on the

Logic of the Replay Script 38

¨  Use phue library to control lights ¨  Reuse time zone logic and HMMs from analysis ¨  Pseudo-code:

Initial testing of lights while True:

compute predicted values for rest of day organize predictions into a time-sorted list of on/off events for each event:

sleep until event time send control message for event

wait until next day

© 2016 Jeff Fischer https://github.com/mpi-sws-rse/antevents-examples/blob/master/lighting_replay_app/player/lux_player.py

Page 39: PYTHON AND IOT · 2018-08-21 · AntEvents 15 ¨ Python3 library for processing IoT event streams ¤ Built on Python 3.4’s asyncio module ¤ Port to Micropython, which runs on the

Parting Thoughts 39

© 2016 Jeff Fischer

Page 40: PYTHON AND IOT · 2018-08-21 · AntEvents 15 ¨ Python3 library for processing IoT event streams ¤ Built on Python 3.4’s asyncio module ¤ Port to Micropython, which runs on the

Acknowledgements 40

¨  Rupak Majumdar, Max Planck Institute for Software Systems ¤ Co-designer of AntEvents

¨  Sze Ning Chng, Cambridge University ¤ First user of AntEvents while interning at MPI

¨  Dmitrill Lourovitski, BayPiggies ¤ Gave me advice regarding machine learning

techniques

© 2016 Jeff Fischer

Page 41: PYTHON AND IOT · 2018-08-21 · AntEvents 15 ¨ Python3 library for processing IoT event streams ¤ Built on Python 3.4’s asyncio module ¤ Port to Micropython, which runs on the

Lessons Learned 41

¨  An end-to-end project like this is a great way to learn a new area

¨  Applying machine learning to a problem can be very much a trial-and-error process

¨  Visualization is key to understanding/debugging these systems

¨  The Python ecosystem is great for both runtime IoT and offline analytics

© 2016 Jeff Fischer

Page 42: PYTHON AND IOT · 2018-08-21 · AntEvents 15 ¨ Python3 library for processing IoT event streams ¤ Built on Python 3.4’s asyncio module ¤ Port to Micropython, which runs on the

Future Work 42

¨  Gather more data and re-try other machine learning algorithms

¨  Integrate AntEvents with visualization (looking at Bokeh)

¨  What are the right abstractions for IoT analytics?

© 2016 Jeff Fischer

Page 43: PYTHON AND IOT · 2018-08-21 · AntEvents 15 ¨ Python3 library for processing IoT event streams ¤ Built on Python 3.4’s asyncio module ¤ Port to Micropython, which runs on the

ESP8266 Demo 43

© 2016 Jeff Fischer

Page 44: PYTHON AND IOT · 2018-08-21 · AntEvents 15 ¨ Python3 library for processing IoT event streams ¤ Built on Python 3.4’s asyncio module ¤ Port to Micropython, which runs on the

Questions?

Thank You 44

© 2016 Jeff Fischer

More information Website and blog: https://data-ken.org

AntEvents: https://github.com/mpi-sws-rse/antevents-python

Examples (including lighting replay app): https://github.com/mpi-sws-rse/antevents-examples

Page 45: PYTHON AND IOT · 2018-08-21 · AntEvents 15 ¨ Python3 library for processing IoT event streams ¤ Built on Python 3.4’s asyncio module ¤ Port to Micropython, which runs on the

Additional Details 45

© 2016 Jeff Fischer

Page 46: PYTHON AND IOT · 2018-08-21 · AntEvents 15 ¨ Python3 library for processing IoT event streams ¤ Built on Python 3.4’s asyncio module ¤ Port to Micropython, which runs on the

Raspberry Pi 2: Wiring Detail 46

© 2016 Jeff Fischer

Page 47: PYTHON AND IOT · 2018-08-21 · AntEvents 15 ¨ Python3 library for processing IoT event streams ¤ Built on Python 3.4’s asyncio module ¤ Port to Micropython, which runs on the

Raspberry Pi 2: Wiring Diagram 47

© 2016 Jeff Fischer

Resistor LED

Anode (long lead)

Cathode (short lead)

10k

GND

3.3V

SDA SCL

GPIO 0

Page 48: PYTHON AND IOT · 2018-08-21 · AntEvents 15 ¨ Python3 library for processing IoT event streams ¤ Built on Python 3.4’s asyncio module ¤ Port to Micropython, which runs on the

ESP8266: Wiring Diagram 48

© 2016 Jeff Fischer

SDA

SCL

GND

3V

Page 49: PYTHON AND IOT · 2018-08-21 · AntEvents 15 ¨ Python3 library for processing IoT event streams ¤ Built on Python 3.4’s asyncio module ¤ Port to Micropython, which runs on the

Third-party Resources 49

¨  Adafruit TSL2591 Lux Sensor tutorial https://learn.adafruit.com/adafruit-tsl2591

¨  Adafruit ESP8266 tutorial https://learn.adafruit.com/adafruit-feather-huzzah-esp8266

¨  LED tutorials n  https://learn.adafruit.com/all-about-leds/overview n  https://thepihut.com/blogs/raspberry-pi-tutorials/27968772-

turning-on-an-led-with-your-raspberry-pis-gpio-pins n  https://projects.drogon.net/raspberry-pi/gpio-examples/tux-

crossing/gpio-examples-1-a-single-led/

¨  Micropython Getting Started on ESP8266 https://docs.micropython.org/en/latest/esp8266/esp8266/tutorial/intro.html

© 2016 Jeff Fischer

Page 50: PYTHON AND IOT · 2018-08-21 · AntEvents 15 ¨ Python3 library for processing IoT event streams ¤ Built on Python 3.4’s asyncio module ¤ Port to Micropython, which runs on the

Machine Learning: Other Approaches Tried

50

¨  Feature data ¤  Time of day, zone, on-off value N-samples back ¤ Also tried the number of samples since the last value change – made results worse

¨  Algorithms tried ¤  K-nearest neighbors ¤  Logistic Regression ¤ Decision Tree (classifier, probabilistic classifier, regressor)

¨  Pure probability approach ¤  Build a probability distribution based on length of time at

current value – worked fairly well ¨  Conclusion: need more sample data

© 2016 Jeff Fischer