This commit is contained in:
vitrinekast 2024-10-31 17:46:43 +01:00
commit 89e8eabde5
33 changed files with 1733 additions and 625 deletions

3
.gitignore vendored
View File

@ -2,4 +2,5 @@ secrets.h
arduino/MQTT/secret.h
arduino/MQTT/secrets.h
venv
rule-listener/secrets.py
rule-listener/secrets.py
visualiser/secrets.el

View File

@ -6,30 +6,13 @@ date: Tuesday, October 22, 2024
# Listening Daemon
Current structure of the repository
Communication between things in this room goes via a server running a
Message Queuing Telemetry Transport (MQTT) broker. MQTT is a protocol
for communication in which participants publish and subscribe to
so-called topics. The broker acts a centralised point of exchange in
this process, ensuring messages reach their intended targets.
```
.
├── arduino
│ ├── motor_shield_one
│ │ ├── makefile
│ │ └── motor_shield_one.ino
│ ├── motor_shield_two
│ │ ├── makefile
│ │ └── motor_shield_two.ino
│ ├── relay_shield
│ │ ├── makefile
│ │ └── relay_shield.ino
│ └── sensors
│ ├── makefile
│ └── sensors.ino
└── tidal
├── boot
└── compositions
```
The `arduino` directory contains code for each microcontroller.
The `tidal` directory features a combination of boot files and
compositions.
The server is also hosting the webpage displayed on the screen. The
server is the Klankschool server. Klankschool are a growing community
of people working with sound in and around Rotterdam, which both of us
are part of.

View File

@ -1,121 +0,0 @@
digraph map {
graph [fontname = "Cantarell-VF"];
node [fontname = "Cantarell-VF", fontsize="18"];
edge [fontname = "Cantarell"]
"door two" [style=filled, fillcolor=brown]
"door one" [style=filled, fillcolor=brown]
"magnet one" [style=filled, fillcolor=yellow]
"magnet two" [style=filled, fillcolor=yellow]
"ldr one" [style=filled, fillcolor=yellow]
"ldr two" [style=filled, fillcolor=yellow]
"ldr three" [style=filled, fillcolor=yellow]
"piezo one" [style=filled, fillcolor=yellow]
"piezo two" [style=filled, fillcolor=yellow]
"piezo three" [style=filled, fillcolor=yellow]
"printer one" [style=filled, fillcolor=magenta]
"printer two" [style=filled, fillcolor=magenta]
"printer three" [style=filled, fillcolor=magenta]
"lamp one" [style=filled, fillcolor=tomato]
"lamp two" [style=filled, fillcolor=tomato]
"lamp three" [style=filled, fillcolor=tomato]
"ventilator one" [style=filled, fillcolor=tomato]
"ventilator two" [style=filled, fillcolor=tomato]
"ventilator three" [style=filled, fillcolor=tomato]
"motor shield one" [style=filled, fillcolor=gray]
"motor shield two" [style=filled, fillcolor=gray]
"relay shield" [style=filled,fillcolor=gray]
subgraph tidal_ports {
8001 [style=filled, fillcolor=cyan]
8002 [style=filled, fillcolor=cyan]
8003 [style=filled, fillcolor=cyan]
8004 [style=filled, fillcolor=cyan]
8005 [style=filled, fillcolor=cyan]
8006 [style=filled, fillcolor=cyan]
8007 [style=filled, fillcolor=cyan]
8008 [style=filled, fillcolor=cyan]
8009 [style=filled, fillcolor=cyan]
8010 [style=filled, fillcolor=cyan]
8011 [style=filled, fillcolor=cyan]
8012 [style=filled, fillcolor=cyan]
8013 [style=filled, fillcolor=cyan]
8014 [style=filled, fillcolor=cyan]
8015 [style=filled, fillcolor=cyan]
8016 [style=filled, fillcolor=cyan]
}
subgraph relay {
"relay shield" -> {"lamp one" "lamp two" "lamp three" "ventilator one" "ventilator two" "ventilator three" }
}
subgraph ports {
8005 -> "printer one" [label="slow(er)",color=orange]
8006 -> "printer one" [label="fast(er)",color=orange]
8007 -> "printer two" [label="slow(er)",color=orange]
8008 -> "printer two" [label="fast(er)",color=orange]
8009 -> "printer three" [label="slow(er)",color=orange]
8010 -> "printer three" [label="fast(er)",color=orange]
8011 -> "printer one" [label="go", color=orange]
8012 -> "printer one" [label="stop",color=orange]
8013 -> "printer two" [label="go", color=orange]
8014 -> "printer two" [label="stop",color=orange]
8015 -> "printer three"[label="go", color=orange]
8016 -> "printer three" [label="stop",color=orange]
}
subgraph fans {
"ventilator one" -> "piezo one"
"ventilator two" -> "piezo two"
"ventilator three" -> "piezo three"
}
subgraph motor_shields {
"motor shield one" -> "printer one"
"motor shield two" -> {"printer two" "printer three"}
}
subgraph sensors {
//"esp32 one" -> {"magnet one" "magnet two" "ldr one" "ldr two"}
"magnet one" -> 8001 [color=red,label="off"]
"magnet one" -> 8002 [color=green,label="on"]
"magnet two" -> 8003 [color=red,label="off"]
"magnet two" -> 8004 [color=green,label="on"]
"ldr one" -> 8005 [color=red,label="off"]
"ldr one" -> 8006 [color=green,label="on"]
"ldr two" -> 8007 [color=red,label="off"]
"ldr two" -> 8008 [color=green,label="on"]
"ldr three" -> 8015 [color=red,label="off"]
"ldr three" -> 8016 [color=green,label="on"]
"piezo one" -> 8009 [label="low",color="green"]
"piezo one" -> 8010 [label="high",color="red"]
"piezo two" -> 8011 [label="low",color="green"]
"piezo two" -> 8012 [label="high",color="red"]
"piezo three" -> 8013 [label="high",color="red"]
"piezo three" -> 8014 [label="low",color="green"]
}
subgraph lamps {
"lamp one" -> "ldr one"
"lamp two" -> "ldr two"
"lamp three" -> "ldr three"
8001 -> "lamp one" [color=red,label="off"]
8002 -> "lamp one" [color=green,label="on"]
8003 -> "lamp two" [color=red,label="off"]
8004 -> "lamp two" [color=green,label="on"]
}
subgraph doors {
"door one" -> "magnet one"
"door two" -> "magnet two"
}
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 206 KiB

View File

@ -1,173 +0,0 @@
:set -XOverloadedStrings
:set prompt ""
import Sound.Tidal.Context
import System.IO (hSetEncoding, stdout, utf8)
hSetEncoding stdout utf8
listenPortOne = 8001
listenPortTwo = 8002
listenPortThree = 8003
listenPortFour = 8004
listenPortFive = 8005
listenPortSix = 8006
listenPortSeven = 8007
listenPortEight = 8008
listenPortNine = 8009
listenPortTen = 8010
listenPortEleven = 8011
listenPortTwelve = 8012
listenPortThriteen = 8013
listenPortFourteen = 8014
listenPortFifteen = 8015
listenPortSixteen = 8016
listenPortSeventeen = 8017
listenPortEighteen = 8018
listenPortNineteen = 8019
listenPortTwenty = 8020
listenPortTwentyOne = 8021
listenPortTwentyTwo = 8022
listenPortTwentyThree = 8023
listenPortTwentyFour = 8024
listenPortTwentyFive = 8025
listenPortTwentySix = 8026
listenPortTwentySeven = 8027
listenPortTwentyEight = 8028
listenPortTwentyNine = 8029
listenPortThirty = 8030
listenPortThirtyOne = 8031
listenPortThirtyTwo = 8032
:{
let lolinTarget =
Target {oName = "lolin",
oAddress = "192.168.1.110",
oPort = 7000,
oLatency = 0.15,
oSchedule = Live,
oWindow = Nothing,
oHandshake = False,
oBusPort = Nothing
}
lolinLedAnalog = [("intensity", Just $ VF 0)]
lolinLedDigital = [("blink", Just $ VS "off")]
lolinFormats = [(OSC "/led/analog" $ ArgList lolinLedAnalog),
(OSC "/led/digital" $ ArgList lolinLedDigital)
]
lolinMap = [(lolinTarget, lolinFormats)]
:}
lolinStream <- startStream (defaultConfig {cCtrlAddr = "0.0.0.0", cCtrlPort = 6010}) lolinMap
h1 = streamReplace lolinStream 1
:{
let devkitTarget =
Target {oName = "devkit",
oAddress = "192.168.1.111",
oPort = 7000,
oLatency = 0.15,
oSchedule = Live,
oWindow = Nothing,
oHandshake = False,
oBusPort = Nothing
}
devkitLedAnalog = [("intensity", Just $ VF 0)]
devkitLedDigital = [("blink", Just $ VS "off")]
devkitFormats = [(OSC "/led/analog" $ ArgList devkitLedAnalog),
(OSC "/led/digital" $ ArgList devkitLedDigital)
]
devkitMap = [(devkitTarget, devkitFormats)]
:}
devkitStream <- startStream (defaultConfig {cCtrlAddr = "0.0.0.0", cCtrlPort = 6020}) devkitMap
h2 = streamReplace devkitStream 1
:{
let intensity = pF "intensity"
blink = pS "blink"
:}
tidal <- startTidal (superdirtTarget {oLatency = 0.05, oAddress = "127.0.0.1", oPort = 57120}) (defaultConfig {cVerbose = True, cFrameTimespan = 1/20, cCtrlAddr = "0.0.0.0", cCtrlPort = 6030})
:{
let only = (hush >>)
p = streamReplace tidal
hush = streamHush tidal
panic = do hush
once $ sound "superpanic"
list = streamList tidal
mute = streamMute tidal
unmute = streamUnmute tidal
unmuteAll = streamUnmuteAll tidal
unsoloAll = streamUnsoloAll tidal
solo = streamSolo tidal
unsolo = streamUnsolo tidal
once = streamOnce tidal
first = streamFirst tidal
asap = once
nudgeAll = streamNudgeAll tidal
all = streamAll tidal
resetCycles = streamResetCycles tidal
setCycle = streamSetCycle tidal
setcps = asap . cps
getcps = streamGetcps tidal
getnow = streamGetnow tidal
xfade i = transition tidal True (Sound.Tidal.Transition.xfadeIn 4) i
xfadeIn i t = transition tidal True (Sound.Tidal.Transition.xfadeIn t) i
histpan i t = transition tidal True (Sound.Tidal.Transition.histpan t) i
wait i t = transition tidal True (Sound.Tidal.Transition.wait t) i
waitT i f t = transition tidal True (Sound.Tidal.Transition.waitT f t) i
jump i = transition tidal True (Sound.Tidal.Transition.jump) i
jumpIn i t = transition tidal True (Sound.Tidal.Transition.jumpIn t) i
jumpIn' i t = transition tidal True (Sound.Tidal.Transition.jumpIn' t) i
jumpMod i t = transition tidal True (Sound.Tidal.Transition.jumpMod t) i
jumpMod' i t p = transition tidal True (Sound.Tidal.Transition.jumpMod' t p) i
mortal i lifespan release = transition tidal True (Sound.Tidal.Transition.mortal lifespan release) i
interpolate i = transition tidal True (Sound.Tidal.Transition.interpolate) i
interpolateIn i t = transition tidal True (Sound.Tidal.Transition.interpolateIn t) i
clutch i = transition tidal True (Sound.Tidal.Transition.clutch) i
clutchIn i t = transition tidal True (Sound.Tidal.Transition.clutchIn t) i
anticipate i = transition tidal True (Sound.Tidal.Transition.anticipate) i
anticipateIn i t = transition tidal True (Sound.Tidal.Transition.anticipateIn t) i
forId i t = transition tidal False (Sound.Tidal.Transition.mortalOverlay t) i
d1 = p 1 . (|< orbit 0)
d2 = p 2 . (|< orbit 1)
d3 = p 3 . (|< orbit 2)
d4 = p 4 . (|< orbit 3)
d5 = p 5 . (|< orbit 4)
d6 = p 6 . (|< orbit 5)
d7 = p 7 . (|< orbit 6)
d8 = p 8 . (|< orbit 7)
d9 = p 9 . (|< orbit 8)
d10 = p 10 . (|< orbit 9)
d11 = p 11 . (|< orbit 10)
d12 = p 12 . (|< orbit 11)
d13 = p 13
d14 = p 14
d15 = p 15
d16 = p 16
:}
:{
let getState = streamGet tidal
setI = streamSetI tidal
setF = streamSetF tidal
setS = streamSetS tidal
setR = streamSetR tidal
setB = streamSetB tidal
:}
:set prompt "> "
:set prompt-cont ""
default (Pattern String, Integer, Double)

View File

@ -1,217 +0,0 @@
:set -XOverloadedStrings
:set prompt ""
import Sound.Tidal.Context
import System.IO (hSetEncoding, stdout, utf8)
hSetEncoding stdout utf8
listenPortOne = 8001
listenPortTwo = 8002
listenPortThree = 8003
listenPortFour = 8004
listenPortFive = 8005
listenPortSix = 8006
listenPortSeven = 8007
listenPortEight = 8008
listenPortNine = 8009
listenPortTen = 8010
listenPortEleven = 8011
listenPortTwelve = 8012
listenPortThriteen = 8013
listenPortFourteen = 8014
listenPortFifteen = 8015
listenPortSixteen = 8016
listenPortSeventeen = 8017
listenPortEighteen = 8018
listenPortNineteen = 8019
listenPortTwenty = 8020
listenPortTwentyOne = 8021
listenPortTwentyTwo = 8022
listenPortTwentyThree = 8023
listenPortTwentyFour = 8024
listenPortTwentyFive = 8025
listenPortTwentySix = 8026
listenPortTwentySeven = 8027
listenPortTwentyEight = 8028
listenPortTwentyNine = 8029
listenPortThirty = 8030
listenPortThirtyOne = 8031
listenPortThirtyTwo = 8032
:{
let lolinTarget =
Target {oName = "lolin",
oAddress = "192.168.1.110",
oPort = 7000,
oLatency = 0.15,
oSchedule = Live,
oWindow = Nothing,
oHandshake = False,
oBusPort = Nothing
}
lolinLedAnalog = [("intensity", Just $ VF 0)]
lolinLedDigital = [("blink", Just $ VS "off")]
lolinFormats = [(OSC "/led/analog" $ ArgList lolinLedAnalog),
(OSC "/led/digital" $ ArgList lolinLedDigital)
]
lolinMap = [(lolinTarget, lolinFormats)]
:}
lolinStream <- startStream (defaultConfig {cCtrlAddr = "0.0.0.0", cCtrlPort = 6010}) lolinMap
h1 = streamReplace lolinStream 1
:{
let devkitTarget =
Target {oName = "devkit",
oAddress = "192.168.1.111",
oPort = 7000,
oLatency = 0.15,
oSchedule = Live,
oWindow = Nothing,
oHandshake = False,
oBusPort = Nothing
}
devkitLedAnalog = [("intensity", Just $ VF 0)]
devkitLedDigital = [("blink", Just $ VS "off")]
devkitFormats = [(OSC "/led/analog" $ ArgList devkitLedAnalog),
(OSC "/led/digital" $ ArgList devkitLedDigital)
]
devkitMap = [(devkitTarget, devkitFormats)]
:}
devkitStream <- startStream (defaultConfig {cCtrlAddr = "0.0.0.0", cCtrlPort = 6020}) devkitMap
h2 = streamReplace devkitStream 1
:{
let intensity = pF "intensity"
blink = pS "blink"
:}
:{
let motorShieldOneTarget =
Target {oName = "motorShieldOne",
oAddress = "192.168.1.100",
oPort = 7000,
oLatency = 0.15,
oSchedule = Live,
oWindow = Nothing,
oHandshake = False,
oBusPort = Nothing
}
motorShieldOneSpeed = [("speed", Just $ VI 150)]
motorShieldOneDirection = [("direction", Just $ VS "r")]
motorShieldOneFeedFormats = [(OSC "/feed/direction" $ ArgList motorShieldOneDirection),
(OSC "/feed/speed" $ ArgList motorShieldOneSpeed)
]
motorShieldOneHeadFormats = [(OSC "/head/speed" $ ArgList motorShieldOneSpeed),
(OSC "/head/direction" $ ArgList motorShieldOneDirection)
]
motorShieldOneFeedMap = [(motorShieldOneTarget, motorShieldOneFeedFormats)]
motorShieldOneHeadMap = [(motorShieldOneTarget, motorShieldOneHeadFormats)]
:}
motorShieldOneFeedStream <- startStream (defaultConfig {cCtrlAddr = "0.0.0.0", cCtrlPort = 6040}) motorShieldOneFeedMap
m1f = streamReplace motorShieldOneFeedStream
motorShieldOneHeadStream <- startStream (defaultConfig {cCtrlAddr = "0.0.0.0", cCtrlPort = 6040}) motorShieldOneHeadMap
m1h = streamReplace motorShieldOneHeadStream
m1 = m1f 1
m2 = m1h 1
:{
let speed = pI "speed"
direction = pS "direction"
:}
tidal <- startTidal (superdirtTarget {oLatency = 0.05, oAddress = "127.0.0.1", oPort = 57120}) (defaultConfig {cVerbose = True, cFrameTimespan = 1/20, cCtrlAddr = "0.0.0.0", cCtrlPort = 6030})
:{
let only = (hush >>)
p = streamReplace tidal
hush = streamHush tidal
panic = do hush
once $ sound "superpanic"
list = streamList tidal
mute = streamMute tidal
unmute = streamUnmute tidal
unmuteAll = streamUnmuteAll tidal
unsoloAll = streamUnsoloAll tidal
solo = streamSolo tidal
unsolo = streamUnsolo tidal
once = streamOnce tidal
first = streamFirst tidal
asap = once
nudgeAll = streamNudgeAll tidal
all = streamAll tidal
resetCycles = streamResetCycles tidal
setCycle = streamSetCycle tidal
setcps = asap . cps
getcps = streamGetcps tidal
getnow = streamGetnow tidal
xfade i = transition tidal True (Sound.Tidal.Transition.xfadeIn 4) i
xfadeIn i t = transition tidal True (Sound.Tidal.Transition.xfadeIn t) i
histpan i t = transition tidal True (Sound.Tidal.Transition.histpan t) i
wait i t = transition tidal True (Sound.Tidal.Transition.wait t) i
waitT i f t = transition tidal True (Sound.Tidal.Transition.waitT f t) i
jump i = transition tidal True (Sound.Tidal.Transition.jump) i
jumpIn i t = transition tidal True (Sound.Tidal.Transition.jumpIn t) i
jumpIn' i t = transition tidal True (Sound.Tidal.Transition.jumpIn' t) i
jumpMod i t = transition tidal True (Sound.Tidal.Transition.jumpMod t) i
jumpMod' i t p = transition tidal True (Sound.Tidal.Transition.jumpMod' t p) i
mortal i lifespan release = transition tidal True (Sound.Tidal.Transition.mortal lifespan release) i
interpolate i = transition tidal True (Sound.Tidal.Transition.interpolate) i
interpolateIn i t = transition tidal True (Sound.Tidal.Transition.interpolateIn t) i
clutch i = transition tidal True (Sound.Tidal.Transition.clutch) i
clutchIn i t = transition tidal True (Sound.Tidal.Transition.clutchIn t) i
anticipate i = transition tidal True (Sound.Tidal.Transition.anticipate) i
anticipateIn i t = transition tidal True (Sound.Tidal.Transition.anticipateIn t) i
forId i t = transition tidal False (Sound.Tidal.Transition.mortalOverlay t) i
d1 = p 1 . (|< orbit 0)
d2 = p 2 . (|< orbit 1)
d3 = p 3 . (|< orbit 2)
d4 = p 4 . (|< orbit 3)
d5 = p 5 . (|< orbit 4)
d6 = p 6 . (|< orbit 5)
d7 = p 7 . (|< orbit 6)
d8 = p 8 . (|< orbit 7)
d9 = p 9 . (|< orbit 8)
d10 = p 10 . (|< orbit 9)
d11 = p 11 . (|< orbit 10)
d12 = p 12 . (|< orbit 11)
d13 = p 13
d14 = p 14
d15 = p 15
d16 = p 16
:}
:{
let getState = streamGet tidal
setI = streamSetI tidal
setF = streamSetF tidal
setS = streamSetS tidal
setR = streamSetR tidal
setB = streamSetB tidal
:}
:set prompt "> "
:set prompt-cont ""
default (Pattern String, Integer, Double)

View File

@ -1,80 +0,0 @@
-- (setq tidal-boot-script-path "~/.config/tidal/LolinAndDevkit.hs")
-- (setq tidal-boot-script-path "~/.config/tidal/example_1.hs")
p1 $ blink "off"
p2 $ blink "off"
import Data.Maybe
import Sound.Osc.Fd as O
import Control.Concurrent
actOne :: Udp -> Maybe O.Message -> IO ()
actOne _ _ = do
h1 $ slow 8 $ blink "on"
-- d1 $ fast 4 $ sound "sn" # pan (range 0 1 square)
actTwo :: Udp -> Maybe O.Message -> IO ()
actTwo _ _ = do
h1 $ slow 4 $ blink "off"
listenOne :: IO ()
listenOne = do udp <- udpServer "0.0.0.0" listenPortOne
loop udp
where
loop udp =
do m <- recvMessage udp
actOne udp m
loop udp
listenTwo :: IO ()
listenTwo = do udp <- udpServer "0.0.0.0" listenPortTwo
loop udp
where
loop udp =
do m <- recvMessage udp
actTwo udp m
loop udp
actThree :: Udp -> Maybe O.Message -> IO ()
actThree _ _ = do
h2 $ slow 8 $ blink "off"
-- d1 $ fast 4 $ sound "sn" # pan (range 0 1 square)
actFour :: Udp -> Maybe O.Message -> IO ()
actFour _ _ = do
h2 $ slow 4 $ blink "on"
listenThree :: IO ()
listenThree = do udp <- udpServer "0.0.0.0" listenPortThree
loop udp
where
loop udp =
do m <- recvMessage udp
actOne udp m
loop udp
listenFour :: IO ()
listenFour = do udp <- udpServer "0.0.0.0" listenPortFour
loop udp
where
loop udp =
do m <- recvMessage udp
actTwo udp m
loop udp
office = do
forkIO listenOne
forkIO listenTwo
forkIO listenThree
forkIO listenFour
office

View File

@ -1,7 +0,0 @@
(setq tidal-boot-script-path "~/.config/tidal/MotorShieldOne.hs")
m1 $ slow 6 $ speed 125 # direction "f b f b"
m2 $ slow 4 $ speed 150 # direction "f b r f b r"
hush

View File

@ -0,0 +1,37 @@
graph {
fan_one [shape=circle, style=filled, fillcolor=invis,label="",color=invis]
fan_two [shape=circle, style=filled, fillcolor=invis,label="",color=invis]
radio_one [shape=invtrapezium,style=filled,fillcolor=invis,label="",color=invis]
lamp_one [shape=cylinder,style=filled,fillcolor=invis,label="",color=invis]
lamp_two [shape=cylinder,style=filled,fillcolor=invis,label="",color=invis]
printer_one [shape=box,style=filled,fillcolor=invis,label="",color=invis]
printer_two [shape=box,style=filled,fillcolor=invis,label="",color=invis]
fan_one -- fan_two [color=invis]
fan_one -- radio_one [color=invis]
fan_one -- lamp_one [color=invis]
fan_one -- lamp_two [color=invis]
fan_one -- printer_one [color=invis]
fan_one -- printer_two [color=invis]
fan_two -- radio_one [color=invis]
fan_two -- lamp_one [color=invis]
fan_two -- lamp_two [color=invis]
fan_two -- printer_one [color=invis]
fan_two -- printer_two [color=invis]
radio_one -- lamp_one [color=invis]
radio_one -- lamp_two [color=invis]
radio_one -- printer_one [color=invis]
radio_one -- printer_two [color=invis]
lamp_one -- lamp_two [color=invis]
lamp_one -- printer_one [color=invis]
lamp_one -- printer_two [color=invis]
lamp_two -- printer_one [color=invis]
lamp_two -- printer_two [color=invis]
printer_one -- printer_two [color=invis]
# 63 "/root/Applications/listeningdaemon/visualiser/main.dot"
}

View File

@ -0,0 +1,37 @@
graph {
fan_one [shape=circle, style=filled, fillcolor=green,label="",color=green]
fan_two [shape=circle, style=filled, fillcolor=invis,label="",color=invis]
radio_one [shape=invtrapezium,style=filled,fillcolor=invis,label="",color=invis]
lamp_one [shape=cylinder,style=filled,fillcolor=invis,label="",color=invis]
lamp_two [shape=cylinder,style=filled,fillcolor=invis,label="",color=invis]
printer_one [shape=box,style=filled,fillcolor=invis,label="",color=invis]
printer_two [shape=box,style=filled,fillcolor=invis,label="",color=invis]
fan_one -- fan_two [color=invis]
fan_one -- radio_one [color=invis]
fan_one -- lamp_one [color=invis]
fan_one -- lamp_two [color=invis]
fan_one -- printer_one [color=invis]
fan_one -- printer_two [color=invis]
fan_two -- radio_one [color=invis]
fan_two -- lamp_one [color=invis]
fan_two -- lamp_two [color=invis]
fan_two -- printer_one [color=invis]
fan_two -- printer_two [color=invis]
radio_one -- lamp_one [color=invis]
radio_one -- lamp_two [color=invis]
radio_one -- printer_one [color=invis]
radio_one -- printer_two [color=invis]
lamp_one -- lamp_two [color=invis]
lamp_one -- printer_one [color=invis]
lamp_one -- printer_two [color=invis]
lamp_two -- printer_one [color=invis]
lamp_two -- printer_two [color=invis]
printer_one -- printer_two [color=invis]
# 63 "/root/Applications/listeningdaemon/visualiser/main.dot"
}

View File

@ -0,0 +1,37 @@
graph {
fan_one [shape=circle, style=filled, fillcolor=green,label="",color=green]
fan_two [shape=circle, style=filled, fillcolor=blue,label="",color=blue]
radio_one [shape=invtrapezium,style=filled,fillcolor=invis,label="",color=invis]
lamp_one [shape=cylinder,style=filled,fillcolor=invis,label="",color=invis]
lamp_two [shape=cylinder,style=filled,fillcolor=invis,label="",color=invis]
printer_one [shape=box,style=filled,fillcolor=invis,label="",color=invis]
printer_two [shape=box,style=filled,fillcolor=invis,label="",color=invis]
fan_one -- fan_two [color=invis]
fan_one -- radio_one [color=invis]
fan_one -- lamp_one [color=invis]
fan_one -- lamp_two [color=invis]
fan_one -- printer_one [color=invis]
fan_one -- printer_two [color=invis]
fan_two -- radio_one [color=invis]
fan_two -- lamp_one [color=invis]
fan_two -- lamp_two [color=invis]
fan_two -- printer_one [color=invis]
fan_two -- printer_two [color=invis]
radio_one -- lamp_one [color=invis]
radio_one -- lamp_two [color=invis]
radio_one -- printer_one [color=invis]
radio_one -- printer_two [color=invis]
lamp_one -- lamp_two [color=invis]
lamp_one -- printer_one [color=invis]
lamp_one -- printer_two [color=invis]
lamp_two -- printer_one [color=invis]
lamp_two -- printer_two [color=invis]
printer_one -- printer_two [color=invis]
# 63 "/root/Applications/listeningdaemon/visualiser/main.dot"
}

View File

@ -0,0 +1,37 @@
graph {
fan_one [shape=circle, style=filled, fillcolor=green,label="",color=green]
fan_two [shape=circle, style=filled, fillcolor=blue,label="",color=blue]
radio_one [shape=invtrapezium,style=filled,fillcolor=invis,label="",color=invis]
lamp_one [shape=cylinder,style=filled,fillcolor=invis,label="",color=invis]
lamp_two [shape=cylinder,style=filled,fillcolor=invis,label="",color=invis]
printer_one [shape=box,style=filled,fillcolor=yellow,label="",color=yellow]
printer_two [shape=box,style=filled,fillcolor=invis,label="",color=invis]
fan_one -- fan_two [color=invis]
fan_one -- radio_one [color=invis]
fan_one -- lamp_one [color=invis]
fan_one -- lamp_two [color=invis]
fan_one -- printer_one [color=invis]
fan_one -- printer_two [color=invis]
fan_two -- radio_one [color=invis]
fan_two -- lamp_one [color=invis]
fan_two -- lamp_two [color=invis]
fan_two -- printer_one [color=invis]
fan_two -- printer_two [color=invis]
radio_one -- lamp_one [color=invis]
radio_one -- lamp_two [color=invis]
radio_one -- printer_one [color=invis]
radio_one -- printer_two [color=invis]
lamp_one -- lamp_two [color=invis]
lamp_one -- printer_one [color=invis]
lamp_one -- printer_two [color=invis]
lamp_two -- printer_one [color=invis]
lamp_two -- printer_two [color=invis]
printer_one -- printer_two [color=invis]
# 63 "/root/Applications/listeningdaemon/visualiser/main.dot"
}

View File

@ -0,0 +1,37 @@
graph {
fan_one [shape=circle, style=filled, fillcolor=green,label="",color=green]
fan_two [shape=circle, style=filled, fillcolor=blue,label="",color=blue]
radio_one [shape=invtrapezium,style=filled,fillcolor=invis,label="",color=invis]
lamp_one [shape=cylinder,style=filled,fillcolor=invis,label="",color=invis]
lamp_two [shape=cylinder,style=filled,fillcolor=invis,label="",color=invis]
printer_one [shape=box,style=filled,fillcolor=yellow,label="",color=yellow]
printer_two [shape=box,style=filled,fillcolor=invis,label="",color=invis]
fan_one -- fan_two [color=green]
fan_one -- radio_one [color=invis]
fan_one -- lamp_one [color=invis]
fan_one -- lamp_two [color=invis]
fan_one -- printer_one [color=invis]
fan_one -- printer_two [color=invis]
fan_two -- radio_one [color=invis]
fan_two -- lamp_one [color=invis]
fan_two -- lamp_two [color=invis]
fan_two -- printer_one [color=invis]
fan_two -- printer_two [color=invis]
radio_one -- lamp_one [color=invis]
radio_one -- lamp_two [color=invis]
radio_one -- printer_one [color=invis]
radio_one -- printer_two [color=invis]
lamp_one -- lamp_two [color=invis]
lamp_one -- printer_one [color=invis]
lamp_one -- printer_two [color=invis]
lamp_two -- printer_one [color=invis]
lamp_two -- printer_two [color=invis]
printer_one -- printer_two [color=invis]
# 63 "/root/Applications/listeningdaemon/visualiser/main.dot"
}

View File

@ -0,0 +1,37 @@
graph {
fan_one [shape=circle, style=filled, fillcolor=green,label="",color=green]
fan_two [shape=circle, style=filled, fillcolor=blue,label="",color=blue]
radio_one [shape=invtrapezium,style=filled,fillcolor=invis,label="",color=invis]
lamp_one [shape=cylinder,style=filled,fillcolor=invis,label="",color=invis]
lamp_two [shape=cylinder,style=filled,fillcolor=invis,label="",color=invis]
printer_one [shape=box,style=filled,fillcolor=yellow,label="",color=yellow]
printer_two [shape=box,style=filled,fillcolor=invis,label="",color=invis]
fan_one -- fan_two [color=invis]
fan_one -- radio_one [color=invis]
fan_one -- lamp_one [color=invis]
fan_one -- lamp_two [color=invis]
fan_one -- printer_one [color=invis]
fan_one -- printer_two [color=invis]
fan_two -- radio_one [color=invis]
fan_two -- lamp_one [color=invis]
fan_two -- lamp_two [color=invis]
fan_two -- printer_one [color=invis]
fan_two -- printer_two [color=invis]
radio_one -- lamp_one [color=invis]
radio_one -- lamp_two [color=invis]
radio_one -- printer_one [color=invis]
radio_one -- printer_two [color=invis]
lamp_one -- lamp_two [color=invis]
lamp_one -- printer_one [color=invis]
lamp_one -- printer_two [color=invis]
lamp_two -- printer_one [color=invis]
lamp_two -- printer_two [color=invis]
printer_one -- printer_two [color=invis]
# 63 "/root/Applications/listeningdaemon/visualiser/main.dot"
}

View File

@ -0,0 +1,37 @@
graph {
fan_one [shape=circle, style=filled, fillcolor=green,label="",color=green]
fan_two [shape=circle, style=filled, fillcolor=blue,label="",color=blue]
radio_one [shape=invtrapezium,style=filled,fillcolor=invis,label="",color=invis]
lamp_one [shape=cylinder,style=filled,fillcolor=invis,label="",color=invis]
lamp_two [shape=cylinder,style=filled,fillcolor=invis,label="",color=invis]
printer_one [shape=box,style=filled,fillcolor=yellow,label="",color=yellow]
printer_two [shape=box,style=filled,fillcolor=invis,label="",color=invis]
fan_one -- fan_two [color=magenta]
fan_one -- radio_one [color=invis]
fan_one -- lamp_one [color=invis]
fan_one -- lamp_two [color=invis]
fan_one -- printer_one [color=invis]
fan_one -- printer_two [color=invis]
fan_two -- radio_one [color=invis]
fan_two -- lamp_one [color=invis]
fan_two -- lamp_two [color=invis]
fan_two -- printer_one [color=invis]
fan_two -- printer_two [color=invis]
radio_one -- lamp_one [color=invis]
radio_one -- lamp_two [color=invis]
radio_one -- printer_one [color=invis]
radio_one -- printer_two [color=invis]
lamp_one -- lamp_two [color=invis]
lamp_one -- printer_one [color=invis]
lamp_one -- printer_two [color=invis]
lamp_two -- printer_one [color=invis]
lamp_two -- printer_two [color=invis]
printer_one -- printer_two [color=invis]
# 63 "/root/Applications/listeningdaemon/visualiser/main.dot"
}

63
visualiser/main.dot Normal file
View File

@ -0,0 +1,63 @@
graph {
fan_one [shape=circle, style=filled, fillcolor=FAN_ONE,label="",color=FAN_ONE]
fan_two [shape=circle, style=filled, fillcolor=FAN_TWO,label="",color=FAN_TWO]
radio_one [shape=invtrapezium,style=filled,fillcolor=RADIO_ONE,label="",color=RADIO_ONE]
lamp_one [shape=cylinder,style=filled,fillcolor=LAMP_ONE,label="",color=LAMP_ONE]
lamp_two [shape=cylinder,style=filled,fillcolor=LAMP_TWO,label="",color=LAMP_TWO]
printer_one [shape=box,style=filled,fillcolor=PRINTER_ONE,label="",color=PRINTER_ONE]
printer_two [shape=box,style=filled,fillcolor=PRINTER_TWO,label="",color=PRINTER_TWO]
fan_one -- fan_two [color=FAN_ONE_FAN_TWO]
fan_one -- radio_one [color=FAN_ONE_RADIO_ONE]
fan_one -- lamp_one [color=FAN_ONE_LAMP_ONE]
fan_one -- lamp_two [color=FAN_ONE_LAMP_TWO]
fan_one -- printer_one [color=FAN_ONE_PRINTER_ONE]
fan_one -- printer_two [color=FAN_ONE_PRINTER_TWO]
fan_two -- radio_one [color=FAN_TWO_RADIO_ONE]
fan_two -- lamp_one [color=FAN_TWO_LAMP_ONE]
fan_two -- lamp_two [color=FAN_TWO_LAMP_TWO]
fan_two -- printer_one [color=FAN_TWO_PRINTER_ONE]
fan_two -- printer_two [color=FAN_TWO_PRINTER_TWO]
radio_one -- lamp_one [color=RADIO_ONE_LAMP_ONE]
radio_one -- lamp_two [color=RADIO_ONE_LAMP_TWO]
radio_one -- printer_one [color=RADIO_ONE_PRINTER_ONE]
radio_one -- printer_two [color=RADIO_ONE_PRINTER_TWO]
lamp_one -- lamp_two [color=LAMP_ONE_LAMP_TWO]
lamp_one -- printer_one [color=LAMP_ONE_PRINTER_ONE]
lamp_one -- printer_two [color=LAMP_ONE_PRINTER_TWO]
lamp_two -- printer_one [color=LAMP_TWO_PRINTER_ONE]
lamp_two -- printer_two [color=LAMP_TWO_PRINTER_TWO]
printer_one -- printer_two [color=PRINTER_ONE_PRINTER_TWO]
// printer_two -- printer_one [color=PRINTER_ONE_PRINTER_TWO]
// printer_two -- lamp_two [color=LAMP_TWO_PRINTER_TWO]
// printer_two -- lamp_one [color=LAMP_ONE_PRINTER_TWO]
// printer_two -- radio_one [color=RADIO_ONE_PRINTER_TWO]
// printer_two -- fan_two [color=FAN_TWO_PRINTER_TWO]
// printer_two -- fan_one [color=FAN_ONE_PRINTER_TWO]
// printer_one -- lamp_two [color=LAMP_TWO_PRINTER_ONE]
// printer_one -- lamp_one [color=LAMP_ONE_PRINTER_ONE]
// printer_one -- radio_one [color=RADIO_ONE_PRINTER_ONE]
// printer_one -- fan_two [color=FAN_TWO_PRINTER_ONE]
// printer_one -- fan_one [color=FAN_ONE_PRINTER_ONE]
// lamp_two -- lamp_one [color=LAMP_ONE_LAMP_TWO]
// lamp_two -- radio_one [color=RADIO_ONE_LAMP_TWO]
// lamp_two -- fan_two [color=FAN_TWO_LAMP_TWO]
// lamp_two -- fan_one [color=FAN_ONE_LAMP_TWO]
// lamp_one -- radio_one [color=RADIO_ONE_LAMP_ONE]
// lamp_one -- fan_two [color=FAN_TWO_LAMP_ONE]
// lamp_one -- fan_one [color=FAN_ONE_LAMP_ONE]
// radio_one -- fan_two [color=FAN_TWO_RADIO_ONE]
// radio_one -- fan_one [color=FAN_ONE_RADIO_ONE]
// fan_two -- fan_one [color=FAN_ONE_FAN_TWO]
}

View File

@ -0,0 +1,154 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<!-- Generated by graphviz version 12.1.2 (0)
-->
<!-- Pages: 1 -->
<svg width="320pt" height="318pt"
viewBox="0.00 0.00 319.85 317.71" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 313.71)">
<polygon fill="white" stroke="none" points="-4,4 -4,-313.71 315.85,-313.71 315.85,4 -4,4"/>
<!-- fan_one -->
<g id="node1" class="node">
<title>fan_one</title>
<ellipse fill="none" stroke="none" cx="241" cy="-45.11" rx="18" ry="18"/>
</g>
<!-- fan_two -->
<g id="node2" class="node">
<title>fan_two</title>
<ellipse fill="none" stroke="none" cx="293.85" cy="-154.86" rx="18" ry="18"/>
</g>
<!-- fan_one&#45;&#45;fan_two -->
<g id="edge1" class="edge">
<title>fan_one&#45;&#45;fan_two</title>
<path fill="none" stroke="none" d="M248.79,-61.3C258.73,-81.93 275.81,-117.4 285.84,-138.24"/>
</g>
<!-- radio_one -->
<g id="node3" class="node">
<title>radio_one</title>
<polygon fill="none" stroke="none" points="11.23,-75.95 42.77,-75.95 54,-111.95 0,-111.95 11.23,-75.95"/>
</g>
<!-- fan_one&#45;&#45;radio_one -->
<g id="edge2" class="edge">
<title>fan_one&#45;&#45;radio_one</title>
<path fill="none" stroke="none" d="M223.12,-49.19C183.54,-58.22 88.74,-79.86 47.14,-89.35"/>
</g>
<!-- lamp_one -->
<g id="node4" class="node">
<title>lamp_one</title>
<path fill="none" stroke="none" d="M54,-230.49C54,-232.29 41.9,-233.76 27,-233.76 12.1,-233.76 0,-232.29 0,-230.49 0,-230.49 0,-201.03 0,-201.03 0,-199.23 12.1,-197.76 27,-197.76 41.9,-197.76 54,-199.23 54,-201.03 54,-201.03 54,-230.49 54,-230.49"/>
<path fill="none" stroke="none" d="M54,-230.49C54,-228.68 41.9,-227.22 27,-227.22 12.1,-227.22 0,-228.68 0,-230.49"/>
</g>
<!-- fan_one&#45;&#45;lamp_one -->
<g id="edge3" class="edge">
<title>fan_one&#45;&#45;lamp_one</title>
<path fill="none" stroke="none" d="M226.62,-56.57C189.98,-85.79 92.88,-163.22 49.04,-198.19"/>
</g>
<!-- lamp_two -->
<g id="node5" class="node">
<title>lamp_two</title>
<path fill="none" stroke="none" d="M149.24,-306.44C149.24,-308.24 137.14,-309.71 122.24,-309.71 107.34,-309.71 95.24,-308.24 95.24,-306.44 95.24,-306.44 95.24,-276.98 95.24,-276.98 95.24,-275.18 107.34,-273.71 122.24,-273.71 137.14,-273.71 149.24,-275.18 149.24,-276.98 149.24,-276.98 149.24,-306.44 149.24,-306.44"/>
<path fill="none" stroke="none" d="M149.24,-306.44C149.24,-304.63 137.14,-303.16 122.24,-303.16 107.34,-303.16 95.24,-304.63 95.24,-306.44"/>
</g>
<!-- fan_one&#45;&#45;lamp_two -->
<g id="edge4" class="edge">
<title>fan_one&#45;&#45;lamp_two</title>
<path fill="none" stroke="none" d="M233.02,-61.67C211.7,-105.95 153.48,-226.82 131.14,-273.23"/>
</g>
<!-- printer_one -->
<g id="node6" class="node">
<title>printer_one</title>
<polygon fill="none" stroke="none" points="268,-282.6 214,-282.6 214,-246.6 268,-246.6 268,-282.6"/>
</g>
<!-- fan_one&#45;&#45;printer_one -->
<g id="edge5" class="edge">
<title>fan_one&#45;&#45;printer_one</title>
<path fill="none" stroke="none" d="M241,-63.44C241,-104.76 241,-204.75 241,-246.17"/>
</g>
<!-- printer_two -->
<g id="node7" class="node">
<title>printer_two</title>
<polygon fill="none" stroke="none" points="149.24,-36 95.24,-36 95.24,0 149.24,0 149.24,-36"/>
</g>
<!-- fan_one&#45;&#45;printer_two -->
<g id="edge6" class="edge">
<title>fan_one&#45;&#45;printer_two</title>
<path fill="none" stroke="none" d="M223.22,-41.05C203.67,-36.59 172.05,-29.37 149.4,-24.2"/>
</g>
<!-- fan_two&#45;&#45;radio_one -->
<g id="edge7" class="edge">
<title>fan_two&#45;&#45;radio_one</title>
<path fill="none" stroke="none" d="M275.92,-150.76C229.07,-140.07 102.91,-111.28 50.42,-99.29"/>
</g>
<!-- fan_two&#45;&#45;lamp_one -->
<g id="edge8" class="edge">
<title>fan_two&#45;&#45;lamp_one</title>
<path fill="none" stroke="none" d="M275.92,-158.95C230.23,-169.37 109.16,-197.01 54.48,-209.49"/>
</g>
<!-- fan_two&#45;&#45;lamp_two -->
<g id="edge9" class="edge">
<title>fan_two&#45;&#45;lamp_two</title>
<path fill="none" stroke="none" d="M279.51,-166.29C249.46,-190.25 179.73,-245.86 144.07,-274.3"/>
</g>
<!-- fan_two&#45;&#45;printer_one -->
<g id="edge10" class="edge">
<title>fan_two&#45;&#45;printer_one</title>
<path fill="none" stroke="none" d="M286.05,-171.05C276.4,-191.08 260.01,-225.11 249.89,-246.14"/>
</g>
<!-- fan_two&#45;&#45;printer_two -->
<g id="edge11" class="edge">
<title>fan_two&#45;&#45;printer_two</title>
<path fill="none" stroke="none" d="M279.51,-143.42C249.79,-119.72 181.22,-65.03 145.23,-36.34"/>
</g>
<!-- radio_one&#45;&#45;lamp_one -->
<g id="edge12" class="edge">
<title>radio_one&#45;&#45;lamp_one</title>
<path fill="none" stroke="none" d="M27,-112.19C27,-135.15 27,-174.38 27,-197.4"/>
</g>
<!-- radio_one&#45;&#45;lamp_two -->
<g id="edge13" class="edge">
<title>radio_one&#45;&#45;lamp_two</title>
<path fill="none" stroke="none" d="M35.79,-112.2C53.89,-149.78 95.13,-235.43 113.33,-273.22"/>
</g>
<!-- radio_one&#45;&#45;printer_one -->
<g id="edge14" class="edge">
<title>radio_one&#45;&#45;printer_one</title>
<path fill="none" stroke="none" d="M49.9,-112.21C90.98,-144.97 176.74,-213.36 217.94,-246.21"/>
</g>
<!-- radio_one&#45;&#45;printer_two -->
<g id="edge15" class="edge">
<title>radio_one&#45;&#45;printer_two</title>
<path fill="none" stroke="none" d="M44.47,-80.02C59.83,-67.77 82.29,-49.85 99.13,-36.42"/>
</g>
<!-- lamp_one&#45;&#45;lamp_two -->
<g id="edge16" class="edge">
<title>lamp_one&#45;&#45;lamp_two</title>
<path fill="none" stroke="none" d="M49.09,-233.38C64.47,-245.65 84.91,-261.94 100.27,-274.19"/>
</g>
<!-- lamp_one&#45;&#45;printer_one -->
<g id="edge17" class="edge">
<title>lamp_one&#45;&#45;printer_one</title>
<path fill="none" stroke="none" d="M54.1,-221.95C95.15,-231.32 172.66,-249.01 213.78,-258.39"/>
</g>
<!-- lamp_one&#45;&#45;printer_two -->
<g id="edge18" class="edge">
<title>lamp_one&#45;&#45;printer_two</title>
<path fill="none" stroke="none" d="M35.79,-197.51C53.89,-159.93 95.13,-74.28 113.33,-36.49"/>
</g>
<!-- lamp_two&#45;&#45;printer_one -->
<g id="edge19" class="edge">
<title>lamp_two&#45;&#45;printer_one</title>
<path fill="none" stroke="none" d="M149.48,-285.49C168.79,-281.08 194.59,-275.2 213.88,-270.79"/>
</g>
<!-- lamp_two&#45;&#45;printer_two -->
<g id="edge20" class="edge">
<title>lamp_two&#45;&#45;printer_two</title>
<path fill="none" stroke="none" d="M122.24,-273.33C122.24,-223.46 122.24,-86.07 122.24,-36.3"/>
</g>
<!-- printer_one&#45;&#45;printer_two -->
<g id="edge21" class="edge">
<title>printer_one&#45;&#45;printer_two</title>
<path fill="none" stroke="none" d="M232.26,-246.47C210.35,-200.98 153.24,-82.37 131.14,-36.5"/>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 6.6 KiB

View File

@ -0,0 +1,154 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<!-- Generated by graphviz version 12.1.2 (0)
-->
<!-- Pages: 1 -->
<svg width="320pt" height="318pt"
viewBox="0.00 0.00 319.85 317.71" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 313.71)">
<polygon fill="white" stroke="none" points="-4,4 -4,-313.71 315.85,-313.71 315.85,4 -4,4"/>
<!-- fan_one -->
<g id="node1" class="node">
<title>fan_one</title>
<ellipse fill="green" stroke="green" cx="241" cy="-45.11" rx="18" ry="18"/>
</g>
<!-- fan_two -->
<g id="node2" class="node">
<title>fan_two</title>
<ellipse fill="none" stroke="none" cx="293.85" cy="-154.86" rx="18" ry="18"/>
</g>
<!-- fan_one&#45;&#45;fan_two -->
<g id="edge1" class="edge">
<title>fan_one&#45;&#45;fan_two</title>
<path fill="none" stroke="none" d="M248.79,-61.3C258.73,-81.93 275.81,-117.4 285.84,-138.24"/>
</g>
<!-- radio_one -->
<g id="node3" class="node">
<title>radio_one</title>
<polygon fill="none" stroke="none" points="11.23,-75.95 42.77,-75.95 54,-111.95 0,-111.95 11.23,-75.95"/>
</g>
<!-- fan_one&#45;&#45;radio_one -->
<g id="edge2" class="edge">
<title>fan_one&#45;&#45;radio_one</title>
<path fill="none" stroke="none" d="M223.12,-49.19C183.54,-58.22 88.74,-79.86 47.14,-89.35"/>
</g>
<!-- lamp_one -->
<g id="node4" class="node">
<title>lamp_one</title>
<path fill="none" stroke="none" d="M54,-230.49C54,-232.29 41.9,-233.76 27,-233.76 12.1,-233.76 0,-232.29 0,-230.49 0,-230.49 0,-201.03 0,-201.03 0,-199.23 12.1,-197.76 27,-197.76 41.9,-197.76 54,-199.23 54,-201.03 54,-201.03 54,-230.49 54,-230.49"/>
<path fill="none" stroke="none" d="M54,-230.49C54,-228.68 41.9,-227.22 27,-227.22 12.1,-227.22 0,-228.68 0,-230.49"/>
</g>
<!-- fan_one&#45;&#45;lamp_one -->
<g id="edge3" class="edge">
<title>fan_one&#45;&#45;lamp_one</title>
<path fill="none" stroke="none" d="M226.62,-56.57C189.98,-85.79 92.88,-163.22 49.04,-198.19"/>
</g>
<!-- lamp_two -->
<g id="node5" class="node">
<title>lamp_two</title>
<path fill="none" stroke="none" d="M149.24,-306.44C149.24,-308.24 137.14,-309.71 122.24,-309.71 107.34,-309.71 95.24,-308.24 95.24,-306.44 95.24,-306.44 95.24,-276.98 95.24,-276.98 95.24,-275.18 107.34,-273.71 122.24,-273.71 137.14,-273.71 149.24,-275.18 149.24,-276.98 149.24,-276.98 149.24,-306.44 149.24,-306.44"/>
<path fill="none" stroke="none" d="M149.24,-306.44C149.24,-304.63 137.14,-303.16 122.24,-303.16 107.34,-303.16 95.24,-304.63 95.24,-306.44"/>
</g>
<!-- fan_one&#45;&#45;lamp_two -->
<g id="edge4" class="edge">
<title>fan_one&#45;&#45;lamp_two</title>
<path fill="none" stroke="none" d="M233.02,-61.67C211.7,-105.95 153.48,-226.82 131.14,-273.23"/>
</g>
<!-- printer_one -->
<g id="node6" class="node">
<title>printer_one</title>
<polygon fill="none" stroke="none" points="268,-282.6 214,-282.6 214,-246.6 268,-246.6 268,-282.6"/>
</g>
<!-- fan_one&#45;&#45;printer_one -->
<g id="edge5" class="edge">
<title>fan_one&#45;&#45;printer_one</title>
<path fill="none" stroke="none" d="M241,-63.44C241,-104.76 241,-204.75 241,-246.17"/>
</g>
<!-- printer_two -->
<g id="node7" class="node">
<title>printer_two</title>
<polygon fill="none" stroke="none" points="149.24,-36 95.24,-36 95.24,0 149.24,0 149.24,-36"/>
</g>
<!-- fan_one&#45;&#45;printer_two -->
<g id="edge6" class="edge">
<title>fan_one&#45;&#45;printer_two</title>
<path fill="none" stroke="none" d="M223.22,-41.05C203.67,-36.59 172.05,-29.37 149.4,-24.2"/>
</g>
<!-- fan_two&#45;&#45;radio_one -->
<g id="edge7" class="edge">
<title>fan_two&#45;&#45;radio_one</title>
<path fill="none" stroke="none" d="M275.92,-150.76C229.07,-140.07 102.91,-111.28 50.42,-99.29"/>
</g>
<!-- fan_two&#45;&#45;lamp_one -->
<g id="edge8" class="edge">
<title>fan_two&#45;&#45;lamp_one</title>
<path fill="none" stroke="none" d="M275.92,-158.95C230.23,-169.37 109.16,-197.01 54.48,-209.49"/>
</g>
<!-- fan_two&#45;&#45;lamp_two -->
<g id="edge9" class="edge">
<title>fan_two&#45;&#45;lamp_two</title>
<path fill="none" stroke="none" d="M279.51,-166.29C249.46,-190.25 179.73,-245.86 144.07,-274.3"/>
</g>
<!-- fan_two&#45;&#45;printer_one -->
<g id="edge10" class="edge">
<title>fan_two&#45;&#45;printer_one</title>
<path fill="none" stroke="none" d="M286.05,-171.05C276.4,-191.08 260.01,-225.11 249.89,-246.14"/>
</g>
<!-- fan_two&#45;&#45;printer_two -->
<g id="edge11" class="edge">
<title>fan_two&#45;&#45;printer_two</title>
<path fill="none" stroke="none" d="M279.51,-143.42C249.79,-119.72 181.22,-65.03 145.23,-36.34"/>
</g>
<!-- radio_one&#45;&#45;lamp_one -->
<g id="edge12" class="edge">
<title>radio_one&#45;&#45;lamp_one</title>
<path fill="none" stroke="none" d="M27,-112.19C27,-135.15 27,-174.38 27,-197.4"/>
</g>
<!-- radio_one&#45;&#45;lamp_two -->
<g id="edge13" class="edge">
<title>radio_one&#45;&#45;lamp_two</title>
<path fill="none" stroke="none" d="M35.79,-112.2C53.89,-149.78 95.13,-235.43 113.33,-273.22"/>
</g>
<!-- radio_one&#45;&#45;printer_one -->
<g id="edge14" class="edge">
<title>radio_one&#45;&#45;printer_one</title>
<path fill="none" stroke="none" d="M49.9,-112.21C90.98,-144.97 176.74,-213.36 217.94,-246.21"/>
</g>
<!-- radio_one&#45;&#45;printer_two -->
<g id="edge15" class="edge">
<title>radio_one&#45;&#45;printer_two</title>
<path fill="none" stroke="none" d="M44.47,-80.02C59.83,-67.77 82.29,-49.85 99.13,-36.42"/>
</g>
<!-- lamp_one&#45;&#45;lamp_two -->
<g id="edge16" class="edge">
<title>lamp_one&#45;&#45;lamp_two</title>
<path fill="none" stroke="none" d="M49.09,-233.38C64.47,-245.65 84.91,-261.94 100.27,-274.19"/>
</g>
<!-- lamp_one&#45;&#45;printer_one -->
<g id="edge17" class="edge">
<title>lamp_one&#45;&#45;printer_one</title>
<path fill="none" stroke="none" d="M54.1,-221.95C95.15,-231.32 172.66,-249.01 213.78,-258.39"/>
</g>
<!-- lamp_one&#45;&#45;printer_two -->
<g id="edge18" class="edge">
<title>lamp_one&#45;&#45;printer_two</title>
<path fill="none" stroke="none" d="M35.79,-197.51C53.89,-159.93 95.13,-74.28 113.33,-36.49"/>
</g>
<!-- lamp_two&#45;&#45;printer_one -->
<g id="edge19" class="edge">
<title>lamp_two&#45;&#45;printer_one</title>
<path fill="none" stroke="none" d="M149.48,-285.49C168.79,-281.08 194.59,-275.2 213.88,-270.79"/>
</g>
<!-- lamp_two&#45;&#45;printer_two -->
<g id="edge20" class="edge">
<title>lamp_two&#45;&#45;printer_two</title>
<path fill="none" stroke="none" d="M122.24,-273.33C122.24,-223.46 122.24,-86.07 122.24,-36.3"/>
</g>
<!-- printer_one&#45;&#45;printer_two -->
<g id="edge21" class="edge">
<title>printer_one&#45;&#45;printer_two</title>
<path fill="none" stroke="none" d="M232.26,-246.47C210.35,-200.98 153.24,-82.37 131.14,-36.5"/>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 6.6 KiB

View File

@ -0,0 +1,154 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<!-- Generated by graphviz version 12.1.2 (0)
-->
<!-- Pages: 1 -->
<svg width="320pt" height="318pt"
viewBox="0.00 0.00 319.85 317.71" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 313.71)">
<polygon fill="white" stroke="none" points="-4,4 -4,-313.71 315.85,-313.71 315.85,4 -4,4"/>
<!-- fan_one -->
<g id="node1" class="node">
<title>fan_one</title>
<ellipse fill="green" stroke="green" cx="241" cy="-45.11" rx="18" ry="18"/>
</g>
<!-- fan_two -->
<g id="node2" class="node">
<title>fan_two</title>
<ellipse fill="blue" stroke="blue" cx="293.85" cy="-154.86" rx="18" ry="18"/>
</g>
<!-- fan_one&#45;&#45;fan_two -->
<g id="edge1" class="edge">
<title>fan_one&#45;&#45;fan_two</title>
<path fill="none" stroke="none" d="M248.79,-61.3C258.73,-81.93 275.81,-117.4 285.84,-138.24"/>
</g>
<!-- radio_one -->
<g id="node3" class="node">
<title>radio_one</title>
<polygon fill="none" stroke="none" points="11.23,-75.95 42.77,-75.95 54,-111.95 0,-111.95 11.23,-75.95"/>
</g>
<!-- fan_one&#45;&#45;radio_one -->
<g id="edge2" class="edge">
<title>fan_one&#45;&#45;radio_one</title>
<path fill="none" stroke="none" d="M223.12,-49.19C183.54,-58.22 88.74,-79.86 47.14,-89.35"/>
</g>
<!-- lamp_one -->
<g id="node4" class="node">
<title>lamp_one</title>
<path fill="none" stroke="none" d="M54,-230.49C54,-232.29 41.9,-233.76 27,-233.76 12.1,-233.76 0,-232.29 0,-230.49 0,-230.49 0,-201.03 0,-201.03 0,-199.23 12.1,-197.76 27,-197.76 41.9,-197.76 54,-199.23 54,-201.03 54,-201.03 54,-230.49 54,-230.49"/>
<path fill="none" stroke="none" d="M54,-230.49C54,-228.68 41.9,-227.22 27,-227.22 12.1,-227.22 0,-228.68 0,-230.49"/>
</g>
<!-- fan_one&#45;&#45;lamp_one -->
<g id="edge3" class="edge">
<title>fan_one&#45;&#45;lamp_one</title>
<path fill="none" stroke="none" d="M226.62,-56.57C189.98,-85.79 92.88,-163.22 49.04,-198.19"/>
</g>
<!-- lamp_two -->
<g id="node5" class="node">
<title>lamp_two</title>
<path fill="none" stroke="none" d="M149.24,-306.44C149.24,-308.24 137.14,-309.71 122.24,-309.71 107.34,-309.71 95.24,-308.24 95.24,-306.44 95.24,-306.44 95.24,-276.98 95.24,-276.98 95.24,-275.18 107.34,-273.71 122.24,-273.71 137.14,-273.71 149.24,-275.18 149.24,-276.98 149.24,-276.98 149.24,-306.44 149.24,-306.44"/>
<path fill="none" stroke="none" d="M149.24,-306.44C149.24,-304.63 137.14,-303.16 122.24,-303.16 107.34,-303.16 95.24,-304.63 95.24,-306.44"/>
</g>
<!-- fan_one&#45;&#45;lamp_two -->
<g id="edge4" class="edge">
<title>fan_one&#45;&#45;lamp_two</title>
<path fill="none" stroke="none" d="M233.02,-61.67C211.7,-105.95 153.48,-226.82 131.14,-273.23"/>
</g>
<!-- printer_one -->
<g id="node6" class="node">
<title>printer_one</title>
<polygon fill="none" stroke="none" points="268,-282.6 214,-282.6 214,-246.6 268,-246.6 268,-282.6"/>
</g>
<!-- fan_one&#45;&#45;printer_one -->
<g id="edge5" class="edge">
<title>fan_one&#45;&#45;printer_one</title>
<path fill="none" stroke="none" d="M241,-63.44C241,-104.76 241,-204.75 241,-246.17"/>
</g>
<!-- printer_two -->
<g id="node7" class="node">
<title>printer_two</title>
<polygon fill="none" stroke="none" points="149.24,-36 95.24,-36 95.24,0 149.24,0 149.24,-36"/>
</g>
<!-- fan_one&#45;&#45;printer_two -->
<g id="edge6" class="edge">
<title>fan_one&#45;&#45;printer_two</title>
<path fill="none" stroke="none" d="M223.22,-41.05C203.67,-36.59 172.05,-29.37 149.4,-24.2"/>
</g>
<!-- fan_two&#45;&#45;radio_one -->
<g id="edge7" class="edge">
<title>fan_two&#45;&#45;radio_one</title>
<path fill="none" stroke="none" d="M275.92,-150.76C229.07,-140.07 102.91,-111.28 50.42,-99.29"/>
</g>
<!-- fan_two&#45;&#45;lamp_one -->
<g id="edge8" class="edge">
<title>fan_two&#45;&#45;lamp_one</title>
<path fill="none" stroke="none" d="M275.92,-158.95C230.23,-169.37 109.16,-197.01 54.48,-209.49"/>
</g>
<!-- fan_two&#45;&#45;lamp_two -->
<g id="edge9" class="edge">
<title>fan_two&#45;&#45;lamp_two</title>
<path fill="none" stroke="none" d="M279.51,-166.29C249.46,-190.25 179.73,-245.86 144.07,-274.3"/>
</g>
<!-- fan_two&#45;&#45;printer_one -->
<g id="edge10" class="edge">
<title>fan_two&#45;&#45;printer_one</title>
<path fill="none" stroke="none" d="M286.05,-171.05C276.4,-191.08 260.01,-225.11 249.89,-246.14"/>
</g>
<!-- fan_two&#45;&#45;printer_two -->
<g id="edge11" class="edge">
<title>fan_two&#45;&#45;printer_two</title>
<path fill="none" stroke="none" d="M279.51,-143.42C249.79,-119.72 181.22,-65.03 145.23,-36.34"/>
</g>
<!-- radio_one&#45;&#45;lamp_one -->
<g id="edge12" class="edge">
<title>radio_one&#45;&#45;lamp_one</title>
<path fill="none" stroke="none" d="M27,-112.19C27,-135.15 27,-174.38 27,-197.4"/>
</g>
<!-- radio_one&#45;&#45;lamp_two -->
<g id="edge13" class="edge">
<title>radio_one&#45;&#45;lamp_two</title>
<path fill="none" stroke="none" d="M35.79,-112.2C53.89,-149.78 95.13,-235.43 113.33,-273.22"/>
</g>
<!-- radio_one&#45;&#45;printer_one -->
<g id="edge14" class="edge">
<title>radio_one&#45;&#45;printer_one</title>
<path fill="none" stroke="none" d="M49.9,-112.21C90.98,-144.97 176.74,-213.36 217.94,-246.21"/>
</g>
<!-- radio_one&#45;&#45;printer_two -->
<g id="edge15" class="edge">
<title>radio_one&#45;&#45;printer_two</title>
<path fill="none" stroke="none" d="M44.47,-80.02C59.83,-67.77 82.29,-49.85 99.13,-36.42"/>
</g>
<!-- lamp_one&#45;&#45;lamp_two -->
<g id="edge16" class="edge">
<title>lamp_one&#45;&#45;lamp_two</title>
<path fill="none" stroke="none" d="M49.09,-233.38C64.47,-245.65 84.91,-261.94 100.27,-274.19"/>
</g>
<!-- lamp_one&#45;&#45;printer_one -->
<g id="edge17" class="edge">
<title>lamp_one&#45;&#45;printer_one</title>
<path fill="none" stroke="none" d="M54.1,-221.95C95.15,-231.32 172.66,-249.01 213.78,-258.39"/>
</g>
<!-- lamp_one&#45;&#45;printer_two -->
<g id="edge18" class="edge">
<title>lamp_one&#45;&#45;printer_two</title>
<path fill="none" stroke="none" d="M35.79,-197.51C53.89,-159.93 95.13,-74.28 113.33,-36.49"/>
</g>
<!-- lamp_two&#45;&#45;printer_one -->
<g id="edge19" class="edge">
<title>lamp_two&#45;&#45;printer_one</title>
<path fill="none" stroke="none" d="M149.48,-285.49C168.79,-281.08 194.59,-275.2 213.88,-270.79"/>
</g>
<!-- lamp_two&#45;&#45;printer_two -->
<g id="edge20" class="edge">
<title>lamp_two&#45;&#45;printer_two</title>
<path fill="none" stroke="none" d="M122.24,-273.33C122.24,-223.46 122.24,-86.07 122.24,-36.3"/>
</g>
<!-- printer_one&#45;&#45;printer_two -->
<g id="edge21" class="edge">
<title>printer_one&#45;&#45;printer_two</title>
<path fill="none" stroke="none" d="M232.26,-246.47C210.35,-200.98 153.24,-82.37 131.14,-36.5"/>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 6.6 KiB

View File

@ -0,0 +1,154 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<!-- Generated by graphviz version 12.1.2 (0)
-->
<!-- Pages: 1 -->
<svg width="320pt" height="318pt"
viewBox="0.00 0.00 319.85 317.71" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 313.71)">
<polygon fill="white" stroke="none" points="-4,4 -4,-313.71 315.85,-313.71 315.85,4 -4,4"/>
<!-- fan_one -->
<g id="node1" class="node">
<title>fan_one</title>
<ellipse fill="green" stroke="green" cx="241" cy="-45.11" rx="18" ry="18"/>
</g>
<!-- fan_two -->
<g id="node2" class="node">
<title>fan_two</title>
<ellipse fill="blue" stroke="blue" cx="293.85" cy="-154.86" rx="18" ry="18"/>
</g>
<!-- fan_one&#45;&#45;fan_two -->
<g id="edge1" class="edge">
<title>fan_one&#45;&#45;fan_two</title>
<path fill="none" stroke="none" d="M248.79,-61.3C258.73,-81.93 275.81,-117.4 285.84,-138.24"/>
</g>
<!-- radio_one -->
<g id="node3" class="node">
<title>radio_one</title>
<polygon fill="none" stroke="none" points="11.23,-75.95 42.77,-75.95 54,-111.95 0,-111.95 11.23,-75.95"/>
</g>
<!-- fan_one&#45;&#45;radio_one -->
<g id="edge2" class="edge">
<title>fan_one&#45;&#45;radio_one</title>
<path fill="none" stroke="none" d="M223.12,-49.19C183.54,-58.22 88.74,-79.86 47.14,-89.35"/>
</g>
<!-- lamp_one -->
<g id="node4" class="node">
<title>lamp_one</title>
<path fill="none" stroke="none" d="M54,-230.49C54,-232.29 41.9,-233.76 27,-233.76 12.1,-233.76 0,-232.29 0,-230.49 0,-230.49 0,-201.03 0,-201.03 0,-199.23 12.1,-197.76 27,-197.76 41.9,-197.76 54,-199.23 54,-201.03 54,-201.03 54,-230.49 54,-230.49"/>
<path fill="none" stroke="none" d="M54,-230.49C54,-228.68 41.9,-227.22 27,-227.22 12.1,-227.22 0,-228.68 0,-230.49"/>
</g>
<!-- fan_one&#45;&#45;lamp_one -->
<g id="edge3" class="edge">
<title>fan_one&#45;&#45;lamp_one</title>
<path fill="none" stroke="none" d="M226.62,-56.57C189.98,-85.79 92.88,-163.22 49.04,-198.19"/>
</g>
<!-- lamp_two -->
<g id="node5" class="node">
<title>lamp_two</title>
<path fill="none" stroke="none" d="M149.24,-306.44C149.24,-308.24 137.14,-309.71 122.24,-309.71 107.34,-309.71 95.24,-308.24 95.24,-306.44 95.24,-306.44 95.24,-276.98 95.24,-276.98 95.24,-275.18 107.34,-273.71 122.24,-273.71 137.14,-273.71 149.24,-275.18 149.24,-276.98 149.24,-276.98 149.24,-306.44 149.24,-306.44"/>
<path fill="none" stroke="none" d="M149.24,-306.44C149.24,-304.63 137.14,-303.16 122.24,-303.16 107.34,-303.16 95.24,-304.63 95.24,-306.44"/>
</g>
<!-- fan_one&#45;&#45;lamp_two -->
<g id="edge4" class="edge">
<title>fan_one&#45;&#45;lamp_two</title>
<path fill="none" stroke="none" d="M233.02,-61.67C211.7,-105.95 153.48,-226.82 131.14,-273.23"/>
</g>
<!-- printer_one -->
<g id="node6" class="node">
<title>printer_one</title>
<polygon fill="yellow" stroke="yellow" points="268,-282.6 214,-282.6 214,-246.6 268,-246.6 268,-282.6"/>
</g>
<!-- fan_one&#45;&#45;printer_one -->
<g id="edge5" class="edge">
<title>fan_one&#45;&#45;printer_one</title>
<path fill="none" stroke="none" d="M241,-63.44C241,-104.76 241,-204.75 241,-246.17"/>
</g>
<!-- printer_two -->
<g id="node7" class="node">
<title>printer_two</title>
<polygon fill="none" stroke="none" points="149.24,-36 95.24,-36 95.24,0 149.24,0 149.24,-36"/>
</g>
<!-- fan_one&#45;&#45;printer_two -->
<g id="edge6" class="edge">
<title>fan_one&#45;&#45;printer_two</title>
<path fill="none" stroke="none" d="M223.22,-41.05C203.67,-36.59 172.05,-29.37 149.4,-24.2"/>
</g>
<!-- fan_two&#45;&#45;radio_one -->
<g id="edge7" class="edge">
<title>fan_two&#45;&#45;radio_one</title>
<path fill="none" stroke="none" d="M275.92,-150.76C229.07,-140.07 102.91,-111.28 50.42,-99.29"/>
</g>
<!-- fan_two&#45;&#45;lamp_one -->
<g id="edge8" class="edge">
<title>fan_two&#45;&#45;lamp_one</title>
<path fill="none" stroke="none" d="M275.92,-158.95C230.23,-169.37 109.16,-197.01 54.48,-209.49"/>
</g>
<!-- fan_two&#45;&#45;lamp_two -->
<g id="edge9" class="edge">
<title>fan_two&#45;&#45;lamp_two</title>
<path fill="none" stroke="none" d="M279.51,-166.29C249.46,-190.25 179.73,-245.86 144.07,-274.3"/>
</g>
<!-- fan_two&#45;&#45;printer_one -->
<g id="edge10" class="edge">
<title>fan_two&#45;&#45;printer_one</title>
<path fill="none" stroke="none" d="M286.05,-171.05C276.4,-191.08 260.01,-225.11 249.89,-246.14"/>
</g>
<!-- fan_two&#45;&#45;printer_two -->
<g id="edge11" class="edge">
<title>fan_two&#45;&#45;printer_two</title>
<path fill="none" stroke="none" d="M279.51,-143.42C249.79,-119.72 181.22,-65.03 145.23,-36.34"/>
</g>
<!-- radio_one&#45;&#45;lamp_one -->
<g id="edge12" class="edge">
<title>radio_one&#45;&#45;lamp_one</title>
<path fill="none" stroke="none" d="M27,-112.19C27,-135.15 27,-174.38 27,-197.4"/>
</g>
<!-- radio_one&#45;&#45;lamp_two -->
<g id="edge13" class="edge">
<title>radio_one&#45;&#45;lamp_two</title>
<path fill="none" stroke="none" d="M35.79,-112.2C53.89,-149.78 95.13,-235.43 113.33,-273.22"/>
</g>
<!-- radio_one&#45;&#45;printer_one -->
<g id="edge14" class="edge">
<title>radio_one&#45;&#45;printer_one</title>
<path fill="none" stroke="none" d="M49.9,-112.21C90.98,-144.97 176.74,-213.36 217.94,-246.21"/>
</g>
<!-- radio_one&#45;&#45;printer_two -->
<g id="edge15" class="edge">
<title>radio_one&#45;&#45;printer_two</title>
<path fill="none" stroke="none" d="M44.47,-80.02C59.83,-67.77 82.29,-49.85 99.13,-36.42"/>
</g>
<!-- lamp_one&#45;&#45;lamp_two -->
<g id="edge16" class="edge">
<title>lamp_one&#45;&#45;lamp_two</title>
<path fill="none" stroke="none" d="M49.09,-233.38C64.47,-245.65 84.91,-261.94 100.27,-274.19"/>
</g>
<!-- lamp_one&#45;&#45;printer_one -->
<g id="edge17" class="edge">
<title>lamp_one&#45;&#45;printer_one</title>
<path fill="none" stroke="none" d="M54.1,-221.95C95.15,-231.32 172.66,-249.01 213.78,-258.39"/>
</g>
<!-- lamp_one&#45;&#45;printer_two -->
<g id="edge18" class="edge">
<title>lamp_one&#45;&#45;printer_two</title>
<path fill="none" stroke="none" d="M35.79,-197.51C53.89,-159.93 95.13,-74.28 113.33,-36.49"/>
</g>
<!-- lamp_two&#45;&#45;printer_one -->
<g id="edge19" class="edge">
<title>lamp_two&#45;&#45;printer_one</title>
<path fill="none" stroke="none" d="M149.48,-285.49C168.79,-281.08 194.59,-275.2 213.88,-270.79"/>
</g>
<!-- lamp_two&#45;&#45;printer_two -->
<g id="edge20" class="edge">
<title>lamp_two&#45;&#45;printer_two</title>
<path fill="none" stroke="none" d="M122.24,-273.33C122.24,-223.46 122.24,-86.07 122.24,-36.3"/>
</g>
<!-- printer_one&#45;&#45;printer_two -->
<g id="edge21" class="edge">
<title>printer_one&#45;&#45;printer_two</title>
<path fill="none" stroke="none" d="M232.26,-246.47C210.35,-200.98 153.24,-82.37 131.14,-36.5"/>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 6.6 KiB

View File

@ -0,0 +1,154 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<!-- Generated by graphviz version 12.1.2 (0)
-->
<!-- Pages: 1 -->
<svg width="320pt" height="318pt"
viewBox="0.00 0.00 319.85 317.71" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 313.71)">
<polygon fill="white" stroke="none" points="-4,4 -4,-313.71 315.85,-313.71 315.85,4 -4,4"/>
<!-- fan_one -->
<g id="node1" class="node">
<title>fan_one</title>
<ellipse fill="green" stroke="green" cx="241" cy="-45.11" rx="18" ry="18"/>
</g>
<!-- fan_two -->
<g id="node2" class="node">
<title>fan_two</title>
<ellipse fill="blue" stroke="blue" cx="293.85" cy="-154.86" rx="18" ry="18"/>
</g>
<!-- fan_one&#45;&#45;fan_two -->
<g id="edge1" class="edge">
<title>fan_one&#45;&#45;fan_two</title>
<path fill="none" stroke="green" d="M248.79,-61.3C258.73,-81.93 275.81,-117.4 285.84,-138.24"/>
</g>
<!-- radio_one -->
<g id="node3" class="node">
<title>radio_one</title>
<polygon fill="none" stroke="none" points="11.23,-75.95 42.77,-75.95 54,-111.95 0,-111.95 11.23,-75.95"/>
</g>
<!-- fan_one&#45;&#45;radio_one -->
<g id="edge2" class="edge">
<title>fan_one&#45;&#45;radio_one</title>
<path fill="none" stroke="none" d="M223.12,-49.19C183.54,-58.22 88.74,-79.86 47.14,-89.35"/>
</g>
<!-- lamp_one -->
<g id="node4" class="node">
<title>lamp_one</title>
<path fill="none" stroke="none" d="M54,-230.49C54,-232.29 41.9,-233.76 27,-233.76 12.1,-233.76 0,-232.29 0,-230.49 0,-230.49 0,-201.03 0,-201.03 0,-199.23 12.1,-197.76 27,-197.76 41.9,-197.76 54,-199.23 54,-201.03 54,-201.03 54,-230.49 54,-230.49"/>
<path fill="none" stroke="none" d="M54,-230.49C54,-228.68 41.9,-227.22 27,-227.22 12.1,-227.22 0,-228.68 0,-230.49"/>
</g>
<!-- fan_one&#45;&#45;lamp_one -->
<g id="edge3" class="edge">
<title>fan_one&#45;&#45;lamp_one</title>
<path fill="none" stroke="none" d="M226.62,-56.57C189.98,-85.79 92.88,-163.22 49.04,-198.19"/>
</g>
<!-- lamp_two -->
<g id="node5" class="node">
<title>lamp_two</title>
<path fill="none" stroke="none" d="M149.24,-306.44C149.24,-308.24 137.14,-309.71 122.24,-309.71 107.34,-309.71 95.24,-308.24 95.24,-306.44 95.24,-306.44 95.24,-276.98 95.24,-276.98 95.24,-275.18 107.34,-273.71 122.24,-273.71 137.14,-273.71 149.24,-275.18 149.24,-276.98 149.24,-276.98 149.24,-306.44 149.24,-306.44"/>
<path fill="none" stroke="none" d="M149.24,-306.44C149.24,-304.63 137.14,-303.16 122.24,-303.16 107.34,-303.16 95.24,-304.63 95.24,-306.44"/>
</g>
<!-- fan_one&#45;&#45;lamp_two -->
<g id="edge4" class="edge">
<title>fan_one&#45;&#45;lamp_two</title>
<path fill="none" stroke="none" d="M233.02,-61.67C211.7,-105.95 153.48,-226.82 131.14,-273.23"/>
</g>
<!-- printer_one -->
<g id="node6" class="node">
<title>printer_one</title>
<polygon fill="yellow" stroke="yellow" points="268,-282.6 214,-282.6 214,-246.6 268,-246.6 268,-282.6"/>
</g>
<!-- fan_one&#45;&#45;printer_one -->
<g id="edge5" class="edge">
<title>fan_one&#45;&#45;printer_one</title>
<path fill="none" stroke="none" d="M241,-63.44C241,-104.76 241,-204.75 241,-246.17"/>
</g>
<!-- printer_two -->
<g id="node7" class="node">
<title>printer_two</title>
<polygon fill="none" stroke="none" points="149.24,-36 95.24,-36 95.24,0 149.24,0 149.24,-36"/>
</g>
<!-- fan_one&#45;&#45;printer_two -->
<g id="edge6" class="edge">
<title>fan_one&#45;&#45;printer_two</title>
<path fill="none" stroke="none" d="M223.22,-41.05C203.67,-36.59 172.05,-29.37 149.4,-24.2"/>
</g>
<!-- fan_two&#45;&#45;radio_one -->
<g id="edge7" class="edge">
<title>fan_two&#45;&#45;radio_one</title>
<path fill="none" stroke="none" d="M275.92,-150.76C229.07,-140.07 102.91,-111.28 50.42,-99.29"/>
</g>
<!-- fan_two&#45;&#45;lamp_one -->
<g id="edge8" class="edge">
<title>fan_two&#45;&#45;lamp_one</title>
<path fill="none" stroke="none" d="M275.92,-158.95C230.23,-169.37 109.16,-197.01 54.48,-209.49"/>
</g>
<!-- fan_two&#45;&#45;lamp_two -->
<g id="edge9" class="edge">
<title>fan_two&#45;&#45;lamp_two</title>
<path fill="none" stroke="none" d="M279.51,-166.29C249.46,-190.25 179.73,-245.86 144.07,-274.3"/>
</g>
<!-- fan_two&#45;&#45;printer_one -->
<g id="edge10" class="edge">
<title>fan_two&#45;&#45;printer_one</title>
<path fill="none" stroke="none" d="M286.05,-171.05C276.4,-191.08 260.01,-225.11 249.89,-246.14"/>
</g>
<!-- fan_two&#45;&#45;printer_two -->
<g id="edge11" class="edge">
<title>fan_two&#45;&#45;printer_two</title>
<path fill="none" stroke="none" d="M279.51,-143.42C249.79,-119.72 181.22,-65.03 145.23,-36.34"/>
</g>
<!-- radio_one&#45;&#45;lamp_one -->
<g id="edge12" class="edge">
<title>radio_one&#45;&#45;lamp_one</title>
<path fill="none" stroke="none" d="M27,-112.19C27,-135.15 27,-174.38 27,-197.4"/>
</g>
<!-- radio_one&#45;&#45;lamp_two -->
<g id="edge13" class="edge">
<title>radio_one&#45;&#45;lamp_two</title>
<path fill="none" stroke="none" d="M35.79,-112.2C53.89,-149.78 95.13,-235.43 113.33,-273.22"/>
</g>
<!-- radio_one&#45;&#45;printer_one -->
<g id="edge14" class="edge">
<title>radio_one&#45;&#45;printer_one</title>
<path fill="none" stroke="none" d="M49.9,-112.21C90.98,-144.97 176.74,-213.36 217.94,-246.21"/>
</g>
<!-- radio_one&#45;&#45;printer_two -->
<g id="edge15" class="edge">
<title>radio_one&#45;&#45;printer_two</title>
<path fill="none" stroke="none" d="M44.47,-80.02C59.83,-67.77 82.29,-49.85 99.13,-36.42"/>
</g>
<!-- lamp_one&#45;&#45;lamp_two -->
<g id="edge16" class="edge">
<title>lamp_one&#45;&#45;lamp_two</title>
<path fill="none" stroke="none" d="M49.09,-233.38C64.47,-245.65 84.91,-261.94 100.27,-274.19"/>
</g>
<!-- lamp_one&#45;&#45;printer_one -->
<g id="edge17" class="edge">
<title>lamp_one&#45;&#45;printer_one</title>
<path fill="none" stroke="none" d="M54.1,-221.95C95.15,-231.32 172.66,-249.01 213.78,-258.39"/>
</g>
<!-- lamp_one&#45;&#45;printer_two -->
<g id="edge18" class="edge">
<title>lamp_one&#45;&#45;printer_two</title>
<path fill="none" stroke="none" d="M35.79,-197.51C53.89,-159.93 95.13,-74.28 113.33,-36.49"/>
</g>
<!-- lamp_two&#45;&#45;printer_one -->
<g id="edge19" class="edge">
<title>lamp_two&#45;&#45;printer_one</title>
<path fill="none" stroke="none" d="M149.48,-285.49C168.79,-281.08 194.59,-275.2 213.88,-270.79"/>
</g>
<!-- lamp_two&#45;&#45;printer_two -->
<g id="edge20" class="edge">
<title>lamp_two&#45;&#45;printer_two</title>
<path fill="none" stroke="none" d="M122.24,-273.33C122.24,-223.46 122.24,-86.07 122.24,-36.3"/>
</g>
<!-- printer_one&#45;&#45;printer_two -->
<g id="edge21" class="edge">
<title>printer_one&#45;&#45;printer_two</title>
<path fill="none" stroke="none" d="M232.26,-246.47C210.35,-200.98 153.24,-82.37 131.14,-36.5"/>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 6.6 KiB

View File

@ -0,0 +1,154 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<!-- Generated by graphviz version 12.1.2 (0)
-->
<!-- Pages: 1 -->
<svg width="320pt" height="318pt"
viewBox="0.00 0.00 319.85 317.71" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 313.71)">
<polygon fill="white" stroke="none" points="-4,4 -4,-313.71 315.85,-313.71 315.85,4 -4,4"/>
<!-- fan_one -->
<g id="node1" class="node">
<title>fan_one</title>
<ellipse fill="green" stroke="green" cx="241" cy="-45.11" rx="18" ry="18"/>
</g>
<!-- fan_two -->
<g id="node2" class="node">
<title>fan_two</title>
<ellipse fill="blue" stroke="blue" cx="293.85" cy="-154.86" rx="18" ry="18"/>
</g>
<!-- fan_one&#45;&#45;fan_two -->
<g id="edge1" class="edge">
<title>fan_one&#45;&#45;fan_two</title>
<path fill="none" stroke="none" d="M248.79,-61.3C258.73,-81.93 275.81,-117.4 285.84,-138.24"/>
</g>
<!-- radio_one -->
<g id="node3" class="node">
<title>radio_one</title>
<polygon fill="none" stroke="none" points="11.23,-75.95 42.77,-75.95 54,-111.95 0,-111.95 11.23,-75.95"/>
</g>
<!-- fan_one&#45;&#45;radio_one -->
<g id="edge2" class="edge">
<title>fan_one&#45;&#45;radio_one</title>
<path fill="none" stroke="none" d="M223.12,-49.19C183.54,-58.22 88.74,-79.86 47.14,-89.35"/>
</g>
<!-- lamp_one -->
<g id="node4" class="node">
<title>lamp_one</title>
<path fill="none" stroke="none" d="M54,-230.49C54,-232.29 41.9,-233.76 27,-233.76 12.1,-233.76 0,-232.29 0,-230.49 0,-230.49 0,-201.03 0,-201.03 0,-199.23 12.1,-197.76 27,-197.76 41.9,-197.76 54,-199.23 54,-201.03 54,-201.03 54,-230.49 54,-230.49"/>
<path fill="none" stroke="none" d="M54,-230.49C54,-228.68 41.9,-227.22 27,-227.22 12.1,-227.22 0,-228.68 0,-230.49"/>
</g>
<!-- fan_one&#45;&#45;lamp_one -->
<g id="edge3" class="edge">
<title>fan_one&#45;&#45;lamp_one</title>
<path fill="none" stroke="none" d="M226.62,-56.57C189.98,-85.79 92.88,-163.22 49.04,-198.19"/>
</g>
<!-- lamp_two -->
<g id="node5" class="node">
<title>lamp_two</title>
<path fill="none" stroke="none" d="M149.24,-306.44C149.24,-308.24 137.14,-309.71 122.24,-309.71 107.34,-309.71 95.24,-308.24 95.24,-306.44 95.24,-306.44 95.24,-276.98 95.24,-276.98 95.24,-275.18 107.34,-273.71 122.24,-273.71 137.14,-273.71 149.24,-275.18 149.24,-276.98 149.24,-276.98 149.24,-306.44 149.24,-306.44"/>
<path fill="none" stroke="none" d="M149.24,-306.44C149.24,-304.63 137.14,-303.16 122.24,-303.16 107.34,-303.16 95.24,-304.63 95.24,-306.44"/>
</g>
<!-- fan_one&#45;&#45;lamp_two -->
<g id="edge4" class="edge">
<title>fan_one&#45;&#45;lamp_two</title>
<path fill="none" stroke="none" d="M233.02,-61.67C211.7,-105.95 153.48,-226.82 131.14,-273.23"/>
</g>
<!-- printer_one -->
<g id="node6" class="node">
<title>printer_one</title>
<polygon fill="yellow" stroke="yellow" points="268,-282.6 214,-282.6 214,-246.6 268,-246.6 268,-282.6"/>
</g>
<!-- fan_one&#45;&#45;printer_one -->
<g id="edge5" class="edge">
<title>fan_one&#45;&#45;printer_one</title>
<path fill="none" stroke="none" d="M241,-63.44C241,-104.76 241,-204.75 241,-246.17"/>
</g>
<!-- printer_two -->
<g id="node7" class="node">
<title>printer_two</title>
<polygon fill="none" stroke="none" points="149.24,-36 95.24,-36 95.24,0 149.24,0 149.24,-36"/>
</g>
<!-- fan_one&#45;&#45;printer_two -->
<g id="edge6" class="edge">
<title>fan_one&#45;&#45;printer_two</title>
<path fill="none" stroke="none" d="M223.22,-41.05C203.67,-36.59 172.05,-29.37 149.4,-24.2"/>
</g>
<!-- fan_two&#45;&#45;radio_one -->
<g id="edge7" class="edge">
<title>fan_two&#45;&#45;radio_one</title>
<path fill="none" stroke="none" d="M275.92,-150.76C229.07,-140.07 102.91,-111.28 50.42,-99.29"/>
</g>
<!-- fan_two&#45;&#45;lamp_one -->
<g id="edge8" class="edge">
<title>fan_two&#45;&#45;lamp_one</title>
<path fill="none" stroke="none" d="M275.92,-158.95C230.23,-169.37 109.16,-197.01 54.48,-209.49"/>
</g>
<!-- fan_two&#45;&#45;lamp_two -->
<g id="edge9" class="edge">
<title>fan_two&#45;&#45;lamp_two</title>
<path fill="none" stroke="none" d="M279.51,-166.29C249.46,-190.25 179.73,-245.86 144.07,-274.3"/>
</g>
<!-- fan_two&#45;&#45;printer_one -->
<g id="edge10" class="edge">
<title>fan_two&#45;&#45;printer_one</title>
<path fill="none" stroke="none" d="M286.05,-171.05C276.4,-191.08 260.01,-225.11 249.89,-246.14"/>
</g>
<!-- fan_two&#45;&#45;printer_two -->
<g id="edge11" class="edge">
<title>fan_two&#45;&#45;printer_two</title>
<path fill="none" stroke="none" d="M279.51,-143.42C249.79,-119.72 181.22,-65.03 145.23,-36.34"/>
</g>
<!-- radio_one&#45;&#45;lamp_one -->
<g id="edge12" class="edge">
<title>radio_one&#45;&#45;lamp_one</title>
<path fill="none" stroke="none" d="M27,-112.19C27,-135.15 27,-174.38 27,-197.4"/>
</g>
<!-- radio_one&#45;&#45;lamp_two -->
<g id="edge13" class="edge">
<title>radio_one&#45;&#45;lamp_two</title>
<path fill="none" stroke="none" d="M35.79,-112.2C53.89,-149.78 95.13,-235.43 113.33,-273.22"/>
</g>
<!-- radio_one&#45;&#45;printer_one -->
<g id="edge14" class="edge">
<title>radio_one&#45;&#45;printer_one</title>
<path fill="none" stroke="none" d="M49.9,-112.21C90.98,-144.97 176.74,-213.36 217.94,-246.21"/>
</g>
<!-- radio_one&#45;&#45;printer_two -->
<g id="edge15" class="edge">
<title>radio_one&#45;&#45;printer_two</title>
<path fill="none" stroke="none" d="M44.47,-80.02C59.83,-67.77 82.29,-49.85 99.13,-36.42"/>
</g>
<!-- lamp_one&#45;&#45;lamp_two -->
<g id="edge16" class="edge">
<title>lamp_one&#45;&#45;lamp_two</title>
<path fill="none" stroke="none" d="M49.09,-233.38C64.47,-245.65 84.91,-261.94 100.27,-274.19"/>
</g>
<!-- lamp_one&#45;&#45;printer_one -->
<g id="edge17" class="edge">
<title>lamp_one&#45;&#45;printer_one</title>
<path fill="none" stroke="none" d="M54.1,-221.95C95.15,-231.32 172.66,-249.01 213.78,-258.39"/>
</g>
<!-- lamp_one&#45;&#45;printer_two -->
<g id="edge18" class="edge">
<title>lamp_one&#45;&#45;printer_two</title>
<path fill="none" stroke="none" d="M35.79,-197.51C53.89,-159.93 95.13,-74.28 113.33,-36.49"/>
</g>
<!-- lamp_two&#45;&#45;printer_one -->
<g id="edge19" class="edge">
<title>lamp_two&#45;&#45;printer_one</title>
<path fill="none" stroke="none" d="M149.48,-285.49C168.79,-281.08 194.59,-275.2 213.88,-270.79"/>
</g>
<!-- lamp_two&#45;&#45;printer_two -->
<g id="edge20" class="edge">
<title>lamp_two&#45;&#45;printer_two</title>
<path fill="none" stroke="none" d="M122.24,-273.33C122.24,-223.46 122.24,-86.07 122.24,-36.3"/>
</g>
<!-- printer_one&#45;&#45;printer_two -->
<g id="edge21" class="edge">
<title>printer_one&#45;&#45;printer_two</title>
<path fill="none" stroke="none" d="M232.26,-246.47C210.35,-200.98 153.24,-82.37 131.14,-36.5"/>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 6.6 KiB

View File

@ -0,0 +1,154 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<!-- Generated by graphviz version 12.1.2 (0)
-->
<!-- Pages: 1 -->
<svg width="320pt" height="318pt"
viewBox="0.00 0.00 319.85 317.71" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 313.71)">
<polygon fill="white" stroke="none" points="-4,4 -4,-313.71 315.85,-313.71 315.85,4 -4,4"/>
<!-- fan_one -->
<g id="node1" class="node">
<title>fan_one</title>
<ellipse fill="green" stroke="green" cx="241" cy="-45.11" rx="18" ry="18"/>
</g>
<!-- fan_two -->
<g id="node2" class="node">
<title>fan_two</title>
<ellipse fill="blue" stroke="blue" cx="293.85" cy="-154.86" rx="18" ry="18"/>
</g>
<!-- fan_one&#45;&#45;fan_two -->
<g id="edge1" class="edge">
<title>fan_one&#45;&#45;fan_two</title>
<path fill="none" stroke="magenta" d="M248.79,-61.3C258.73,-81.93 275.81,-117.4 285.84,-138.24"/>
</g>
<!-- radio_one -->
<g id="node3" class="node">
<title>radio_one</title>
<polygon fill="none" stroke="none" points="11.23,-75.95 42.77,-75.95 54,-111.95 0,-111.95 11.23,-75.95"/>
</g>
<!-- fan_one&#45;&#45;radio_one -->
<g id="edge2" class="edge">
<title>fan_one&#45;&#45;radio_one</title>
<path fill="none" stroke="none" d="M223.12,-49.19C183.54,-58.22 88.74,-79.86 47.14,-89.35"/>
</g>
<!-- lamp_one -->
<g id="node4" class="node">
<title>lamp_one</title>
<path fill="none" stroke="none" d="M54,-230.49C54,-232.29 41.9,-233.76 27,-233.76 12.1,-233.76 0,-232.29 0,-230.49 0,-230.49 0,-201.03 0,-201.03 0,-199.23 12.1,-197.76 27,-197.76 41.9,-197.76 54,-199.23 54,-201.03 54,-201.03 54,-230.49 54,-230.49"/>
<path fill="none" stroke="none" d="M54,-230.49C54,-228.68 41.9,-227.22 27,-227.22 12.1,-227.22 0,-228.68 0,-230.49"/>
</g>
<!-- fan_one&#45;&#45;lamp_one -->
<g id="edge3" class="edge">
<title>fan_one&#45;&#45;lamp_one</title>
<path fill="none" stroke="none" d="M226.62,-56.57C189.98,-85.79 92.88,-163.22 49.04,-198.19"/>
</g>
<!-- lamp_two -->
<g id="node5" class="node">
<title>lamp_two</title>
<path fill="none" stroke="none" d="M149.24,-306.44C149.24,-308.24 137.14,-309.71 122.24,-309.71 107.34,-309.71 95.24,-308.24 95.24,-306.44 95.24,-306.44 95.24,-276.98 95.24,-276.98 95.24,-275.18 107.34,-273.71 122.24,-273.71 137.14,-273.71 149.24,-275.18 149.24,-276.98 149.24,-276.98 149.24,-306.44 149.24,-306.44"/>
<path fill="none" stroke="none" d="M149.24,-306.44C149.24,-304.63 137.14,-303.16 122.24,-303.16 107.34,-303.16 95.24,-304.63 95.24,-306.44"/>
</g>
<!-- fan_one&#45;&#45;lamp_two -->
<g id="edge4" class="edge">
<title>fan_one&#45;&#45;lamp_two</title>
<path fill="none" stroke="none" d="M233.02,-61.67C211.7,-105.95 153.48,-226.82 131.14,-273.23"/>
</g>
<!-- printer_one -->
<g id="node6" class="node">
<title>printer_one</title>
<polygon fill="yellow" stroke="yellow" points="268,-282.6 214,-282.6 214,-246.6 268,-246.6 268,-282.6"/>
</g>
<!-- fan_one&#45;&#45;printer_one -->
<g id="edge5" class="edge">
<title>fan_one&#45;&#45;printer_one</title>
<path fill="none" stroke="none" d="M241,-63.44C241,-104.76 241,-204.75 241,-246.17"/>
</g>
<!-- printer_two -->
<g id="node7" class="node">
<title>printer_two</title>
<polygon fill="none" stroke="none" points="149.24,-36 95.24,-36 95.24,0 149.24,0 149.24,-36"/>
</g>
<!-- fan_one&#45;&#45;printer_two -->
<g id="edge6" class="edge">
<title>fan_one&#45;&#45;printer_two</title>
<path fill="none" stroke="none" d="M223.22,-41.05C203.67,-36.59 172.05,-29.37 149.4,-24.2"/>
</g>
<!-- fan_two&#45;&#45;radio_one -->
<g id="edge7" class="edge">
<title>fan_two&#45;&#45;radio_one</title>
<path fill="none" stroke="none" d="M275.92,-150.76C229.07,-140.07 102.91,-111.28 50.42,-99.29"/>
</g>
<!-- fan_two&#45;&#45;lamp_one -->
<g id="edge8" class="edge">
<title>fan_two&#45;&#45;lamp_one</title>
<path fill="none" stroke="none" d="M275.92,-158.95C230.23,-169.37 109.16,-197.01 54.48,-209.49"/>
</g>
<!-- fan_two&#45;&#45;lamp_two -->
<g id="edge9" class="edge">
<title>fan_two&#45;&#45;lamp_two</title>
<path fill="none" stroke="none" d="M279.51,-166.29C249.46,-190.25 179.73,-245.86 144.07,-274.3"/>
</g>
<!-- fan_two&#45;&#45;printer_one -->
<g id="edge10" class="edge">
<title>fan_two&#45;&#45;printer_one</title>
<path fill="none" stroke="none" d="M286.05,-171.05C276.4,-191.08 260.01,-225.11 249.89,-246.14"/>
</g>
<!-- fan_two&#45;&#45;printer_two -->
<g id="edge11" class="edge">
<title>fan_two&#45;&#45;printer_two</title>
<path fill="none" stroke="none" d="M279.51,-143.42C249.79,-119.72 181.22,-65.03 145.23,-36.34"/>
</g>
<!-- radio_one&#45;&#45;lamp_one -->
<g id="edge12" class="edge">
<title>radio_one&#45;&#45;lamp_one</title>
<path fill="none" stroke="none" d="M27,-112.19C27,-135.15 27,-174.38 27,-197.4"/>
</g>
<!-- radio_one&#45;&#45;lamp_two -->
<g id="edge13" class="edge">
<title>radio_one&#45;&#45;lamp_two</title>
<path fill="none" stroke="none" d="M35.79,-112.2C53.89,-149.78 95.13,-235.43 113.33,-273.22"/>
</g>
<!-- radio_one&#45;&#45;printer_one -->
<g id="edge14" class="edge">
<title>radio_one&#45;&#45;printer_one</title>
<path fill="none" stroke="none" d="M49.9,-112.21C90.98,-144.97 176.74,-213.36 217.94,-246.21"/>
</g>
<!-- radio_one&#45;&#45;printer_two -->
<g id="edge15" class="edge">
<title>radio_one&#45;&#45;printer_two</title>
<path fill="none" stroke="none" d="M44.47,-80.02C59.83,-67.77 82.29,-49.85 99.13,-36.42"/>
</g>
<!-- lamp_one&#45;&#45;lamp_two -->
<g id="edge16" class="edge">
<title>lamp_one&#45;&#45;lamp_two</title>
<path fill="none" stroke="none" d="M49.09,-233.38C64.47,-245.65 84.91,-261.94 100.27,-274.19"/>
</g>
<!-- lamp_one&#45;&#45;printer_one -->
<g id="edge17" class="edge">
<title>lamp_one&#45;&#45;printer_one</title>
<path fill="none" stroke="none" d="M54.1,-221.95C95.15,-231.32 172.66,-249.01 213.78,-258.39"/>
</g>
<!-- lamp_one&#45;&#45;printer_two -->
<g id="edge18" class="edge">
<title>lamp_one&#45;&#45;printer_two</title>
<path fill="none" stroke="none" d="M35.79,-197.51C53.89,-159.93 95.13,-74.28 113.33,-36.49"/>
</g>
<!-- lamp_two&#45;&#45;printer_one -->
<g id="edge19" class="edge">
<title>lamp_two&#45;&#45;printer_one</title>
<path fill="none" stroke="none" d="M149.48,-285.49C168.79,-281.08 194.59,-275.2 213.88,-270.79"/>
</g>
<!-- lamp_two&#45;&#45;printer_two -->
<g id="edge20" class="edge">
<title>lamp_two&#45;&#45;printer_two</title>
<path fill="none" stroke="none" d="M122.24,-273.33C122.24,-223.46 122.24,-86.07 122.24,-36.3"/>
</g>
<!-- printer_one&#45;&#45;printer_two -->
<g id="edge21" class="edge">
<title>printer_one&#45;&#45;printer_two</title>
<path fill="none" stroke="none" d="M232.26,-246.47C210.35,-200.98 153.24,-82.37 131.14,-36.5"/>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 6.6 KiB

287
visualiser/visualiser.el Normal file
View File

@ -0,0 +1,287 @@
;; visualiser.el
(load-file "~/.emacs.d/elpa/dash-20240510.1327/dash.elc")
(load-file "~/.emacs.d/elpa/mqtt-mode-20180611.1735/mqtt-mode.elc")
(require 'dash)
(require 'mqtt-mode)
(toggle-debug-on-error)
;; directory variables
(defconst graphviz-command "circo")
(defconst graphviz-graph-output-format "svg")
(defconst graphviz-graph-output-dir "graphs/")
(defconst graphviz-image-output-dir (concat graphviz-graph-output-format "s/"))
(defconst working-directory "~/Applications/listeningdaemon/visualiser/")
(load-file (concat working-directory "secrets.el"))
;; colors
;; (defconst on-color "black" "The default color for objects which are active")
(defconst off-color "invis" "The default color for objects which are not active")
(defvar colors '("black" "red" "green" "blue" "magenta" "yellow" "orange" "purple" "cyan")
"colors for the nodes and edges to choose from")
;;; nodes
;; default colors
(defvar fan-one-color off-color)
(defvar fan-two-color off-color)
(defvar radio-one-color off-color)
(defvar lamp-one-color off-color)
(defvar lamp-two-color off-color)
(defvar printer-one-color off-color)
(defvar printer-two-color off-color)
;;; edges
;; default colors
(defvar fan-one-fan-two-color off-color)
(defvar fan-one-radio-one-color off-color)
(defvar fan-one-lamp-one-color off-color)
(defvar fan-one-lamp-two-color off-color)
(defvar fan-one-printer-one-color off-color)
(defvar fan-one-printer-two-color off-color)
(defvar fan-two-radio-one-color off-color)
(defvar fan-two-lamp-one-color off-color)
(defvar fan-two-lamp-two-color off-color)
(defvar fan-two-printer-one-color off-color)
(defvar fan-two-printer-two-color off-color)
(defvar radio-one-lamp-one-color off-color)
(defvar radio-one-lamp-two-color off-color)
(defvar radio-one-printer-one-color off-color)
(defvar radio-one-printer-two-color off-color)
(defvar lamp-one-lamp-two-color off-color)
(defvar lamp-one-printer-one-color off-color)
(defvar lamp-one-printer-two-color off-color)
(defvar lamp-two-printer-one-color off-color)
(defvar lamp-two-printer-two-color off-color)
(defvar printer-one-printer-two-color off-color)
(setq snapshot 10000)
(defun turn-object-on (object)
"Turn an object on"
nil
nil
(setq on-color (elt colors (random (length colors))))
(cond ((equal object 'fan-one)
(setq fan-one-color on-color)
(format-graph))
((equal object 'fan-two)
(setq fan-two-color on-color)
(format-graph))
((equal object 'lamp-one)
(setq lamp-one-color on-color)
(format-graph))
((equal object 'lamp-two)
(setq lamp-two-color on-color)
(format-graph))
((equal object 'radio-one)
(setq radio-one-color on-color)
(format-graph))
((equal object 'printer-one)
(setq printer-one-color on-color)
(format-graph))
((equal object 'printer-two)
(setq printer-two-color on-color)
(format-graph))))
(defun turn-object-off (object)
"Turn an object off"
nil
nil
(cond ((equal object 'fan-one)
(setq fan-one-color off-color)
(format-graph))
((equal object 'fan-two)
(setq fan-two-color off-color)
(format-graph))
((equal object 'lamp-one)
(setq lamp-one-color off-color)
(format-graph))
((equal object 'lamp-two)
(setq lamp-two-color off-color)
(format-graph))
((equal object 'radio-one)
(setq radio-one-color off-color)
(format-graph))
((equal object 'printer-one)
(setq printer-one-color off-color)
(format-graph))
((equal object 'printer-two)
(setq printer-one-color off-color)
(format-graph))))
(defun graph-write-file-quietly ()
"Write the graph buffer to a graphviz file quietly"
(let ((inhibit-message t))
(write-file (concat working-directory graphviz-graph-output-dir "graph" (number-to-string snapshot) ".dot") t)))
(defun format-graph-image-numbered ()
"format the numbered image of the graph quietly, for the .gif"
(let ((inhibit-message t))
(shell-command
(concat graphviz-command " -T" graphviz-graph-output-format " "
working-directory graphviz-graph-output-dir (concat "graph" (number-to-string snapshot) ".dot")
" -o "
working-directory graphviz-image-output-dir
(concat "graph" (number-to-string snapshot) "." graphviz-graph-output-format)))))
(defun format-graph-image-main ()
"format the image of the main graph quietly"
nil
nil
(let ((inhibit-message t))
(shell-command
(concat graphviz-command " -T" graphviz-graph-output-format " "
working-directory graphviz-graph-output-dir (concat "graph" (number-to-string snapshot) ".dot")
" -o "
;; working-directory "main." graphviz-graph-output-format
;; output the generated image to /var/www/ so that the webpage stays updated
"/var/www/img/main." graphviz-graph-output-format
))))
(defun format-graph ()
"Series of functions to format the graph to display in the browser
and ultimately turn into a .gif"
nil
nil
;; preprocess graph
(shell-command (concat "cpp -DFAN_ONE=" fan-one-color " "
"-DFAN_TWO=" fan-two-color " "
"-DRADIO_ONE=" radio-one-color " "
"-DLAMP_ONE=" lamp-one-color " "
"-DLAMP_TWO=" lamp-two-color " "
"-DPRINTER_ONE=" printer-one-color " "
"-DPRINTER_TWO=" printer-two-color " "
"-DFAN_ONE_FAN_TWO=" fan-one-fan-two-color " "
"-DFAN_ONE_RADIO_ONE=" fan-one-radio-one-color " "
"-DFAN_ONE_LAMP_ONE=" fan-one-lamp-one-color " "
"-DFAN_ONE_LAMP_TWO=" fan-one-lamp-two-color " "
"-DFAN_ONE_PRINTER_ONE=" fan-one-printer-one-color " "
"-DFAN_ONE_PRINTER_TWO=" fan-one-printer-two-color " "
"-DFAN_TWO_RADIO_ONE=" fan-two-radio-one-color " "
"-DFAN_TWO_LAMP_ONE=" fan-two-lamp-one-color " "
"-DFAN_TWO_LAMP_TWO=" fan-two-lamp-two-color " "
"-DFAN_TWO_PRINTER_ONE=" fan-two-printer-one-color " "
"-DFAN_TWO_PRINTER_TWO=" fan-two-printer-two-color " "
"-DRADIO_ONE_LAMP_ONE=" radio-one-lamp-one-color " "
"-DRADIO_ONE_LAMP_TWO=" radio-one-lamp-two-color " "
"-DRADIO_ONE_PRINTER_ONE=" radio-one-printer-one-color " "
"-DRADIO_ONE_PRINTER_TWO=" radio-one-printer-two-color " "
"-DLAMP_ONE_LAMP_TWO=" lamp-one-lamp-two-color " "
"-DLAMP_ONE_PRINTER_ONE=" lamp-one-printer-one-color " "
"-DLAMP_ONE_PRINTER_TWO=" lamp-one-printer-two-color " "
"-DLAMP_TWO_PRINTER_ONE=" lamp-two-printer-one-color " "
"-DLAMP_TWO_PRINTER_TWO=" lamp-two-printer-two-color " "
"-DPRINTER_ONE_PRINTER_TWO=" printer-one-printer-two-color " "
working-directory "main.dot")
(concat "graph" (number-to-string snapshot) ".dot") "*Error*")
(switch-to-buffer-other-window
(concat "graph" (number-to-string snapshot) ".dot"))
(set-mark (point))
(forward-line 6)
(kill-region 0 (point) t)
(graph-write-file-quietly)
;; create a backup of the graph, for the .gif
(format-graph-image-numbered)
;; change main.png for displaying in the browser
(format-graph-image-main)
(setq snapshot (+ snapshot 1)))
;; (illuminate-edges '("transform" "printer" "one" "fan" "two") "1")
(defun illuminate-edges (topic payload)
"Function to illuminate the edges of the graph"
nil
nil
(setq on-color (elt colors (random (length colors))))
(let ((payload (string-limit payload 1)))
(let ((from-object (string-join (list (cadr topic) (caddr topic)) "-"))
(to-object (string-join (list (cadddr topic) (car (last topic))) "-")))
(message "From: %s" from-object)
(message "To: %s" to-object)
(when (string-equal payload "1")
(set (intern (concat from-object "-" to-object "-color")) on-color)
(set (intern (concat to-object "-" from-object "-color")) on-color))
(when (string-equal payload "0")
(set (intern (concat from-object "-" to-object "-color")) off-color)
(set (intern (concat to-object "-" from-object "-color")) off-color))
(format-graph))))
(defun illuminate-nodes (topic payload)
"Function to illuminate the nodes on the graph, a decision tree"
nil
nil
(setq on-color (elt colors (random (length colors))))
(let ((payload (string-limit payload 1)))
;;(message "Topic: %s. Payload %s." topic payload)
(cond ((and (member "fan" topic) (member "one" topic) (string-equal "1" payload))
(turn-object-on 'fan-one)
(message "Fan one turns on"))
((and (member "fan" topic) (member "one" topic) (string-equal "0" payload))
(message "Fan one turns off")
(turn-object-off 'fan-one))
((and (member "fan" topic) (member "two" topic) (string-equal "1" payload))
(message "Fan two turns on")
(turn-object-on 'fan-two))
((and (member "fan" topic) (member "two" topic) (string-equal "0" payload))
(message "Fan two turns off")
(turn-object-off 'fan-two))
((and (member "lamp" topic) (member "one" topic) (string-equal "1" payload))
(message "Lamp one turns on")
(turn-object-on 'lamp-one))
((and (member "lamp" topic) (member "one" topic) (string-equal "0" payload))
(message "Lamp one turns off")
(turn-object-off 'lamp-one))
((and (member "lamp" topic) (member "two" topic) (string-equal "1" payload))
(message "lamp two turns on")
(turn-object-on 'lamp-two))
((and (member "lamp" topic) (member "two" topic) (string-equal "0" payload))
(message "lamp two turns off")
(turn-object-off 'lamp-two))
((and (member "radio" topic) (member "one" topic) (string-equal "1" payload))
(turn-object-on 'radio-one))
((and (member "radio" topic) (member "one" topic) (string-equal "0" payload))
(turn-object-off 'radio-one))
((and (member "printer" topic) (member "one" topic) (string-equal "2" payload))
(turn-object-on 'printer-one))
((and (member "printer" topic) (member "one" topic) (string-equal "1" payload))
(turn-object-on 'printer-one))
((and (member "printer" topic) (member "one" topic) (string-equal "0" payload))
(turn-object-off 'printer-one))
((and (member "printer" topic) (member "two" topic) (string-equal "2" payload))
(turn-object-on 'printer-two))
((and (member "printer" topic) (member "two" topic) (string-equal "1" payload))
(turn-object-on 'printer-two))
((and (member "printer" topic) (member "two" topic) (string-equal "0" payload))
(turn-object-off 'printer-two)))))
;; printers
(add-to-list 'mqtt-message-receive-functions
(lambda (msg)
"Functions to execute on recieving a message"
nil
(let ((m (string-split msg " ")))
(let ((msg-car (car m))
(payload (cdr m)))
(let ((topic (string-split msg-car "/")))
;; (message "Topic: %s. Payload %s" topic payload)
(cond ((member "transform" topic)
(illuminate-edges topic (car payload)))
((member "main" topic)
(illuminate-nodes topic (car payload)))
;; ((member "gesture" topic)
;; (display-gesture))
))))))
(format-graph)
;; (start-process-shell-command "browser" nil (concat "firefox " working-directory "main.html --kiosk"))
(mqtt-start-consumer)

17
web/index.html Normal file
View File

@ -0,0 +1,17 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet" href="style.css">
<title>free / abandoned / open / obsolete</title>
<script src="refreshImage.js"></script>
<script>
setInterval(() => {updateImage();}, 1000);
</script>
</head>
<body>
<img id="dynamicImage" class="center">
</body>
</html>

10
web/refreshImage.js Normal file
View File

@ -0,0 +1,10 @@
var newImage = new Image();
newImage.src = "img/main.svg";
function updateImage() {
if(newImage.complete) {
document.getElementById("dynamicImage").src = newImage.src;
newImage = new Image();
newImage.src = "img/main.svg#" + new Date().getTime();
}
}

8
web/style.css Normal file
View File

@ -0,0 +1,8 @@
.center {
display: block;
margin-left: auto;
margin-top: auto;
margin-bottom: auto;
margin-right: auto;
height: 100vh;
}