button : io.Button()
bell: media.PlayAudio(audiofile="dingdong.ogg")
camera : media.ImageSource()
screen : media.ImageSink()
fd : media.FaceCounter()

button.state > camera.trigger
camera.b64image > fd.b64image
camera.b64image > screen.b64image
fd.objects > bell.play


rule outside_rule : node_attr_match(index=["address", {"locality": "outside"}])
rule inside_rule : node_attr_match(index=["address", {"locality": "inside"}])
rule server_rule : node_attr_match(index=["node_name", {"name": "server"}])
apply button : outside_rule
apply bell : inside_rule
apply camera, screen, fd : server_rule