Top Banner
Implementing a Rule Language for the Internet of Things Phil Windley Office of the CIO Brigham Young University
109

Rule Language for IoT

Jul 27, 2015

Download

Internet

Phil Windley
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: Rule Language for IoT

Implementing a Rule Language for the Internet of Things

Phil Windley Office of the CIO

Brigham Young University

Page 2: Rule Language for IoT

The great question (about power) is who should have it.

– John Locke

Page 3: Rule Language for IoT
Page 4: Rule Language for IoT

The Web (circa 1996)

Page 5: Rule Language for IoT

ClientSpace

ServerSpace

Google FacebookiCloud

Web 2.0

Page 6: Rule Language for IoT

ClientSpace

ServerSpace

Google FacebookiCloud

Web 2.0

Page 7: Rule Language for IoT

ClientSpace

ServerSpace

Google FacebookiCloud

Web 2.0

Page 8: Rule Language for IoT

So long as we are merely clients of servers, we cannot be independent

Page 9: Rule Language for IoT
Page 10: Rule Language for IoT
Page 11: Rule Language for IoT
Page 12: Rule Language for IoT
Page 13: Rule Language for IoT
Page 14: Rule Language for IoT
Page 15: Rule Language for IoT

Internet of Things

Page 16: Rule Language for IoT

Lorem Ipsum Dolor

Page 17: Rule Language for IoT

But it’s bigger than that…

Everything will have an online representation.

Page 18: Rule Language for IoT

But it’s not just about manufactured things...

Page 19: Rule Language for IoT

What will its architecture be?

Page 20: Rule Language for IoT

Trillion node networks

Page 21: Rule Language for IoT

Imagine a mountain representing today’s

billion node network...

Page 22: Rule Language for IoT

Lorem Ipsum Dolor

From Trillions by Maya Design

Page 23: Rule Language for IoT

From Trillions by Maya Design

Page 24: Rule Language for IoT

The Current IoT Model Won’t Scale

Page 25: Rule Language for IoT

Me

Page 26: Rule Language for IoT

Me

Page 27: Rule Language for IoT
Page 28: Rule Language for IoT

GE

Page 29: Rule Language for IoT

Internet of My Things

Me

GE

Page 30: Rule Language for IoT

• decentralized • heterarchical • interoperable

Page 31: Rule Language for IoT

1. Distributed transaction processing and applications

2. Peer-to-peer messaging and sharing

3. Autonomous coordination and contracts between peers

Page 32: Rule Language for IoT

picos

Page 33: Rule Language for IoT

Picos are online computers• persistent—retain state based on past operations. • unique—identity that is immutable. • online—available on the Internet and respond to events and

queries. • concurrent—operate independently of one another and process

events and queries asynchronously. • event-driven—respond to events by changing state and sending

new events. • rule-based—behavior is expressed as rules that pattern-match

against incoming events.

Page 34: Rule Language for IoT

http://joinfuse.com

Page 35: Rule Language for IoT
Page 36: Rule Language for IoT

Owner Pico

Fleet Pico

Vehicle Pico

Vehicle Pico

Vehicle Pico

Page 37: Rule Language for IoT

Owner Pico

Fleet Pico

Vehicle Pico

Vehicle Pico

Vehicle Pico

Owner Pico

Page 38: Rule Language for IoT
Page 39: Rule Language for IoT
Page 40: Rule Language for IoT

Phil's Pico

owner

Page 41: Rule Language for IoT

Phil's Pico

owner

Lynne's Pico

owner

Page 42: Rule Language for IoT

Phil's Pico Tom's Pico

owner

Lynne's Pico

owner

Page 43: Rule Language for IoT

Phil's Pico Tom's Pico

owner

Lynne's Pico

owner

Page 44: Rule Language for IoT

Phil's Pico Tom's Pico

owner

Lynne's Pico

owner

Page 45: Rule Language for IoT

Phil's Pico Tom's Pico

owner

Lynne's Pico

ownerborrower

Page 46: Rule Language for IoT

Domain-Specific Languages

Page 47: Rule Language for IoT
Page 48: Rule Language for IoT

devices standardsidentityAPIsprotocols

Page 49: Rule Language for IoT

devices standardsidentityAPIsprotocols

architecture

Page 50: Rule Language for IoT

devices standardsidentityAPIsprotocols

architecture

framework

Page 51: Rule Language for IoT

devices standardsidentityAPIsprotocols

architecture

framework

notation

Page 52: Rule Language for IoT
Page 53: Rule Language for IoT
Page 54: Rule Language for IoT
Page 55: Rule Language for IoT

Events vs Requests

Page 56: Rule Language for IoT

“this happened” vs

“do this”

Page 57: Rule Language for IoT
Page 58: Rule Language for IoT
Page 59: Rule Language for IoT

Event System Properties• Events are autonomous

• Event-driven system are more loosely coupled

• Downstream (receiver) driven flow control

• Near real-time propagation

Page 60: Rule Language for IoT

Web Application

Application Data

Browser

Page 61: Rule Language for IoT

Web Application

Application Data

Browser

Page 62: Rule Language for IoT
Page 63: Rule Language for IoT

Vehicle's Pico

iCalendar

Web

Mobile

Page 64: Rule Language for IoT

Rather than a model where a system presents an API for a collection of resources….

Page 65: Rule Language for IoT

Rather than a model where a system presents an API for a collection of resources….Picos present a model wherein each pico presents it’s own, customizable API

Page 66: Rule Language for IoT
Page 67: Rule Language for IoT

CloudOS• Pico Lifecycle

• Subscriptions

• Ruleset management

• Notifications

• Files

Page 68: Rule Language for IoT
Page 69: Rule Language for IoT

KRL

Page 70: Rule Language for IoT

Event-Condition-Actionrule check_subscriptions {

select when fuse subscription_check

pre {

vid = carvoyant:vehicle_id();

my_subs = carvoyant:getSubscription(vid);

should_have = required_subscription_list.length();

}

if(my_subs.length() < should_have) then

send_directive("not enough subscriptions")

fired {

log ">>>> vehicle #{vid} needs subscription check";

raise fuse event initial_carvoyant_subscriptions;

}

}

Page 71: Rule Language for IoT

Event-Condition-Actionrule check_subscriptions {

select when fuse subscription_check

pre {

vid = carvoyant:vehicle_id();

my_subs = carvoyant:getSubscription(vid);

should_have = required_subscription_list.length();

}

if(my_subs.length() < should_have) then

send_directive("not enough subscriptions")

fired {

log ">>>> vehicle #{vid} needs subscription check";

raise fuse event initial_carvoyant_subscriptions;

}

}

Page 72: Rule Language for IoT

Event-Condition-Actionrule check_subscriptions {

select when fuse subscription_check

pre {

vid = carvoyant:vehicle_id();

my_subs = carvoyant:getSubscription(vid);

should_have = required_subscription_list.length();

}

if(my_subs.length() < should_have) then

send_directive("not enough subscriptions")

fired {

log ">>>> vehicle #{vid} needs subscription check";

raise fuse event initial_carvoyant_subscriptions;

}

}

Page 73: Rule Language for IoT

Event-Condition-Actionrule check_subscriptions {

select when fuse subscription_check

pre {

vid = carvoyant:vehicle_id();

my_subs = carvoyant:getSubscription(vid);

should_have = required_subscription_list.length();

}

if(my_subs.length() < should_have) then

send_directive("not enough subscriptions")

fired {

log ">>>> vehicle #{vid} needs subscription check";

raise fuse event initial_carvoyant_subscriptions;

}

}

Page 74: Rule Language for IoT

Event-Condition-Actionrule check_subscriptions {

select when fuse subscription_check

pre {

vid = carvoyant:vehicle_id();

my_subs = carvoyant:getSubscription(vid);

should_have = required_subscription_list.length();

}

if(my_subs.length() < should_have) then

send_directive("not enough subscriptions")

fired {

log ">>>> vehicle #{vid} needs subscription check";

raise fuse event initial_carvoyant_subscriptions;

}

}

Page 75: Rule Language for IoT

select when web pageview re#/support/(\d+)# setting(issue_number) before (phone inboundcall or email received subj.match(re#issue_number#) )

Page 76: Rule Language for IoT

select when web pageview re#/support/(\d+)# setting(issue_number) before (phone inboundcall or email received subj.match(re#issue_number#) )

1

2

3

Page 77: Rule Language for IoT

select when web pageview re#/support/(\d+)# setting(issue_number) before (phone inboundcall or email received subj.match(re#issue_number#) )

1

2

3

Page 78: Rule Language for IoT

Persistent Variablesrule name_trip { select when fuse trip_name pre { tid = mkTid(event:attr("tripId")); tname = event:attr(“tripName”).defaultsTo(“”, “no trip name”); tcategory = event:attr(“tripCategory”).defaultsTo(“”, “no trip category”); trip = ent:trip_summaries{tid}.defaultsTo({}); start = reducePrecision(trip{"startWaypoint"}); end = reducePrecision(trip{"endWaypoint"}); } if(not trip{"startWaypoint"}.isnull() && not trip{"endWaypoint"}.isnull()) then send_directive("Named trip") with tripId = tid and start = start and end = end;

fired { set ent:trip_names{[end, start]} mkTripMeta(tname, tcategory); } }

Page 79: Rule Language for IoT

Persistent Variablesrule name_trip { select when fuse trip_name pre { tid = mkTid(event:attr("tripId")); tname = event:attr(“tripName”).defaultsTo(“”, “no trip name”); tcategory = event:attr(“tripCategory”).defaultsTo(“”, “no trip category”); trip = ent:trip_summaries{tid}.defaultsTo({}); start = reducePrecision(trip{"startWaypoint"}); end = reducePrecision(trip{"endWaypoint"}); } if(not trip{"startWaypoint"}.isnull() && not trip{"endWaypoint"}.isnull()) then send_directive("Named trip") with tripId = tid and start = start and end = end;

fired { set ent:trip_names{[end, start]} mkTripMeta(tname, tcategory); } }

Page 80: Rule Language for IoT

Persistent Variablesrule name_trip { select when fuse trip_name pre { tid = mkTid(event:attr("tripId")); tname = event:attr(“tripName”).defaultsTo(“”, “no trip name”); tcategory = event:attr(“tripCategory”).defaultsTo(“”, “no trip category”); trip = ent:trip_summaries{tid}.defaultsTo({}); start = reducePrecision(trip{"startWaypoint"}); end = reducePrecision(trip{"endWaypoint"}); } if(not trip{"startWaypoint"}.isnull() && not trip{"endWaypoint"}.isnull()) then send_directive("Named trip") with tripId = tid and start = start and end = end;

fired { set ent:trip_names{[end, start]} mkTripMeta(tname, tcategory); } }

Page 81: Rule Language for IoT

persistent variables (cont)

ent:trips -> {“39.369,-111.456” : {“39.034,-110.915”: {“name” : “home/school”, “category” : “other”}}, “40.010,-111.456” : {“39.144,-112.324”: {“name” : “doctor’s office”, “category” : “medical”}}, … }

Page 82: Rule Language for IoT

persistent variables (cont)

tripMeta = function(start, end) { ent:trip_names{[reducePrecision(end), reducePrecision(start)]} }

Page 83: Rule Language for IoT

tripsByDate = function(start, end){

utc_start = common:convertToUTC(start); utc_end = common:convertToUTC(end); ent:trip_summaries.query([], { 'requires' : '$and', 'conditions' : [ { ‘search_key' : [ 'endWaypoint', 'timestamp'], 'operator' : '$gte', 'value' : utc_start }, { 'search_key' : [ 'endWaypoint', 'timestamp' ], 'operator' : '$lte', 'value' : utc_end } ]}, ‘return_values’) };

persistent variables (cont)

Page 84: Rule Language for IoT

tripsByDate = function(start, end){

utc_start = common:convertToUTC(start); utc_end = common:convertToUTC(end); ent:trip_summaries.query([], { 'requires' : '$and', 'conditions' : [ { ‘search_key' : [ 'endWaypoint', 'timestamp'], 'operator' : '$gte', 'value' : utc_start }, { 'search_key' : [ 'endWaypoint', 'timestamp' ], 'operator' : '$lte', 'value' : utc_end } ]}, ‘return_values’) };

persistent variables (cont)

Page 85: Rule Language for IoT

rulesets

Page 86: Rule Language for IoT
Page 87: Rule Language for IoT

pico engine (kre)

Page 88: Rule Language for IoT

Pico container is implemented as

Apache module in Perl

Page 89: Rule Language for IoT

We’ve got both kinds:C & Perl!

Page 90: Rule Language for IoT

Open standards Open source

http://github.com/kre

Page 91: Rule Language for IoT

Picos Support A Familiar Model

Kynetx Rules Engine

OtherData

Sources

WebServices

APIs

Rulesets PersistentData

APIs

engine

Page 92: Rule Language for IoT

Picos Support A Familiar Model

Kynetx Rules Engine

OtherData

Sources

WebServices

APIs

Rulesets PersistentData

APIs

engine

Persistent Compute Object containers

Page 93: Rule Language for IoT

Picos Support A Familiar Model

Kynetx Rules Engine

OtherData

Sources

WebServices

APIs

Rulesets PersistentData

APIs

engine

Persistent Compute Object containers

CloudOS

Confi

gura

tion

Man

agem

ent

Clou

dOS

Serv

ice

Notifi

catio

nSe

rvice

Pers

onal

Dat

a Se

rvice

UI S

uppo

rt

File

Soci

al

Soci

al Fuse

Libr

ary

Gua

rd

Tour

Libr

ary

libraries

Page 94: Rule Language for IoT

Picos Support A Familiar Model

Kynetx Rules Engine

OtherData

Sources

WebServices

APIs

Rulesets PersistentData

APIs

engine

Persistent Compute Object containers

Fore

vr.u

s(c

onta

ct)

Tim

elin

e(s

ocia

l)

To D

o &

Rem

inde

rs

Vehi

cle

Man

ange

men

t

Hom

e M

anag

emen

t

Inte

ntca

stin

g

Fuse

Gua

rd

Tour

applicationsCloudOS

Confi

gura

tion

Man

agem

ent

Clou

dOS

Serv

ice

Notifi

catio

nSe

rvice

Pers

onal

Dat

a Se

rvice

UI S

uppo

rt

File

Soci

al

Soci

al Fuse

Libr

ary

Gua

rd

Tour

Libr

ary

libraries

Page 95: Rule Language for IoT

Picos Are Decentralized & Networked

picopico

HostingSpace

PicoSpace

HostingCompany A

Hosting Company B

SelfHosted

pico

pico

pico

pico

picopico

pico

KRE KRE KRE PicoContainers

Page 96: Rule Language for IoT

Apache as an Application Server

Page 97: Rule Language for IoT

Modules are NOT CGI Programs

• Modules run inside the Apache process architecture

• Modules have access to and can replace all Apache services

• Uses the server API - not an embedded interpreter

• Access to every part of the HTTP request lifecycle

Page 98: Rule Language for IoT

Apache Server Lifecycle

Page 99: Rule Language for IoT

Apache HTTP Request Lifecycle

Page 100: Rule Language for IoT

Apache Application Services• Configuration

• Process and thread management

• Security

• Logging

• Interprocess communication

• Request dispatching

Page 101: Rule Language for IoT

Implementation• LOTS of libraries (~90)

• Any::Event • DateTime • Data::Diver • Cache::Memcached • WWW::Mechanize • Test::More

• Parser • Operators

Page 102: Rule Language for IoT

• Good support for shards

• Documents are JSON

• Capped collections

• TTL indexes

Page 103: Rule Language for IoT

wait

decodeevent

schedulerules

evalrules

assembleresponse

receiveevent explicit

event

directivedocument

scheduleobject

javaScript orJSON

eventobject

Pico Event Evaluation Cycle

event

directives

API interactions

external events

Page 104: Rule Language for IoT

wait

decodeevent

schedulerules

evalrules

assembleresponse

receiveevent

explicitevent

directivedocument

scheduleobject

javaScript orJSON

requestenv

Pico Event Evaluation Cyclewith container actions

event

directives

API interactions

external events

establishcontext event

object

establish identityload rulesets (parse/optimize)

calculate RIDscalculate salience graph

Page 105: Rule Language for IoT

Quickstart http://developer.kynetx.com

Page 106: Rule Language for IoT
Page 107: Rule Language for IoT

Lessons Learned• Understand language feng shui

• Parsing

• Don’t optimize too early

• Orthoganility

• Breadth first

• Languages evolve

• Leverage underlying language

• Build the language you want to use

• Use your language

• Picos are a decent abstraction

Page 108: Rule Language for IoT
Page 109: Rule Language for IoT

Implementing a Rule Language for the Internet of Things

Phil Windley [email protected]

www.windley.com @windley

windley