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

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


# Deployment

rule inside  : node_attr_match(index=["address", {"locality": "inside"}])
rule outside : node_attr_match(index=["address", {"locality": "outside"}])
rule server  : runtime_name(name="server")

apply button : outside
apply bell   : inside
apply camera : server
apply screen : server