Created
February 26, 2021 04:18
-
-
Save dannyrandall/994a91bec3d88d95a566494c7f2153cf to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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