Skip to content

Instantly share code, notes, and snippets.

@dannyrandall
Created February 26, 2021 04:18
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save dannyrandall/994a91bec3d88d95a566494c7f2153cf to your computer and use it in GitHub Desktop.
Save dannyrandall/994a91bec3d88d95a566494c7f2153cf to your computer and use it in GitHub Desktop.
ruleset manage_sensor {
meta {
name "Manage Sensor"
author "Daniel Randall"
shares sensors, temperatures, profiles
}
global {
rulesets = {
"io.picolabs.wovyn.emitter": {
"url": meta:rulesetConfig{["rulesets", "io.picolabs.wovyn.emitter", "url"]}.defaultsTo("")
},
"twilio": {
"url": meta:rulesetConfig{["rulesets", "twilio", "url"]}.defaultsTo(""),
},
"sensor_profile": {
"url": meta:rulesetConfig{["rulesets", "sensor_profile", "url"]}.defaultsTo("")
},
"wovyn_base": {
"url": meta:rulesetConfig{["rulesets", "wovyn_base", "url"]}.defaultsTo(""),
"config": {
"accountSID": meta:rulesetConfig{["rulesets", "wovyn_base", "config", "accountSID"]}.defaultsTo(""),
"authToken": meta:rulesetConfig{["rulesets", "wovyn_base", "config", "authToken"]}.defaultsTo(""),
"notification_from": meta:rulesetConfig{["rulesets", "wovyn_base", "config", "notification_from"]}.defaultsTo("")
}
},
"temperature_store": {
"url": meta:rulesetConfig{["rulesets", "temperature_store", "url"]}.defaultsTo("")
}
}
defaults = {
"threshold": meta:rulesetConfig{["defaults", "threshold"]}.defaultsTo(100),
"notification_to": meta:rulesetConfig{["defaults", "notification_to"]}.defaultsTo("")
}
sensors = function() {
ent:sensors.defaultsTo({})
}
temperatures = function() {
ent:sensors.map(function(eci, name) {
ctx:query(eci, "temperature_store", "temperatures").defaultsTo([]).reverse().head()
})
}
profiles = function() {
ent:sensors.map(function(eci, name) {
ctx:query(eci, "sensor_profile", "profile").defaultsTo({})
})
}
}
rule add_sensor {
select when sensor new_sensor
pre {
name = event:attrs{"name"}
duplicate = ent:sensors && ent:sensors >< name
}
if duplicate then
send_directive("error", {"error": "cannot create duplicate child"})
notfired {
raise wrangler event "new_child_request" attributes {
"name": name
}
}
}
rule sensor_added {
select when wrangler new_child_created
foreach rulesets setting(rule)
pre {
name = event:attrs{"name"}
eci = event:attrs{"eci"}
}
if name && eci then
event:send({
"eci": eci,
"domain": "wrangler",
"type": "install_ruleset_request",
"attrs": {
"url": rule{"url"},
"config": rule{"config"},
}
})
fired {
ent:sensors := ent:sensors.defaultsTo({}).put(name, eci) on final
raise sensor event "sensor_added" attributes {
"name": name
} on final
}
}
rule configure_sensor {
select when sensor sensor_added where event:attrs{"name"} && ent:sensors{event:attrs{"name"}}
pre {
name = event:attrs{"name"}
eci = ent:sensors{name}
}
event:send({
"eci": eci,
"domain": "sensor",
"type": "profile_updated",
"attrs": {
"name": name,
"temperature_threshold": defaults{"threshold"},
"notification_to": defaults{"notification_to"}
}
})
}
rule delete_sensors {
select when sensor delete_sensors
foreach ent:sensors setting(eci, name)
always {
raise wrangler event "child_deletion_request" attributes {
"eci": eci
}
clear ent:sensors{name}
}
}
rule delete_sensor {
select when sensor unneeded_sensor where event:attrs{"name"} && ent:sensors{event:attrs{"name"}}
pre {
name = event:attrs{"name"}
eci = ent:sensors{name}
}
always {
raise wrangler event "child_deletion_request" attributes {
"eci": eci
}
clear ent:sensors{name}
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment