Created
March 11, 2021 06:04
-
-
Save dannyrandall/2a06c9779155c47a6656ae740bd32ae1 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" | |
use module io.picolabs.subscription alias subscription | |
shares sensors, temperatures, profiles, sensor_subs | |
} | |
global { | |
rulesets = { | |
"io.picolabs.wovyn.emitter": { | |
"url": meta:rulesetConfig{["rulesets", "io.picolabs.wovyn.emitter", "url"]}.defaultsTo("") | |
}, | |
"sensor_profile": { | |
"url": meta:rulesetConfig{["rulesets", "sensor_profile", "url"]}.defaultsTo("") | |
}, | |
"wovyn_base": { | |
"url": meta:rulesetConfig{["rulesets", "wovyn_base", "url"]}.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({}) | |
} | |
sensor_subs = function() { | |
subscription:established("Tx_role", "sensor").map(function(v) { | |
v.get(["Tx"]) | |
}) | |
} | |
temperatures = function() { | |
sensor_subs().map(function(s) { | |
{}.put(s, ctx:query(s, "temperature_store", "temperatures").defaultsTo([]).reverse().head()) | |
}) | |
} | |
profiles = function() { | |
sensor_subs().map(function(s) { | |
{}.put(s, ctx:query(s, "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 create_subscription { | |
select when sensor sensor_added where event:attrs{"name"} && ent:sensors{event:attrs{"name"}} | |
pre { | |
name = event:attrs{"name"} | |
eci = ent:sensors{name} | |
} | |
always { | |
raise wrangler event "subscription" attributes { | |
"name": name, | |
"wellKnown_Tx": eci, | |
"channel_type": "sensor_management", | |
"Rx_role": "sensor_manager", | |
"Tx_role": "sensor" | |
} | |
} | |
} | |
rule introduce_sensor { | |
select when sensor introduce | |
pre { | |
name = event:attrs{"name"} | |
eci = event:attrs{"eci"} | |
} | |
always { | |
raise wrangler event "subscription" attributes { | |
"name": name, | |
"wellKnown_Tx": eci, | |
"channel_type": "sensor_management", | |
"Rx_role": "sensor_manager", | |
"Tx_role": "sensor" | |
} | |
} | |
} | |
rule delete_all_sensors { | |
select when sensor delete_all_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} | |
} | |
} | |
rule sub_sensor_threshold_violation { | |
select when sensor_manager sub_sensor_threshold_violation | |
always { | |
raise sensor_manager_profile event "send_sms" attributes { | |
"msg": "detected threshold violation at " + event:attrs{"timestamp"} + ". temperature: " + event:attrs{"temperature"} | |
} | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment