diff --git a/README.md b/README.md
index 1338d30..f3a4dc5 100644
--- a/README.md
+++ b/README.md
@@ -10,8 +10,8 @@ artifact, regenerated from NetBox and committed so history shows what the
| file | what it is |
| --- | --- |
-| `export_topology.py` | Run inside the NetBox Django shell. Walks every field/distribution switch's cable path (through patch panels and splice modules), then pulls every real `Cable` among the devices it found so each edge carries the exact port name on both ends. Read-only. |
-| `topo_full.json` | Latest exported snapshot: devices (id, name, role, site, status) + edges (`{a, a_port, b, b_port}`, one per cable). |
+| `export_topology.py` | Run inside the NetBox Django shell. Walks every field/distribution switch's cable path (through patch panels and splice modules), then pulls every real `Cable` among the devices it found so each edge carries the exact port name on both ends, plus that port's 802.1Q mode/untagged/tagged VLANs where the port is a real interface. Also exports every `ipam.VLAN`. Read-only. |
+| `topo_full.json` | Latest exported snapshot: devices (id, name, role, site, status), edges (`{a, a_port, a_vlan, b, b_port, b_vlan}`, one per cable), and `vlans` (every VLAN in NetBox). |
| `generate_drawio.py` | Pure-Python renderer: `topo_full.json` → `Field-Switch-Topology.drawio`. No NetBox access needed. |
| `Field-Switch-Topology.drawio` | The diagram. Open at [app.diagrams.net](https://app.diagrams.net) (or the desktop app, or the VS Code draw.io extension) -- free, no license needed. |
| `render_png.js` + `render_host.html` | Renders the `.drawio` through a real draw.io instance (embed.diagrams.net, driven headlessly with Puppeteer) to produce `Field-Switch-Topology.png` -- an actual render, not an approximation. Needs `npm install puppeteer` and network access. |
@@ -29,6 +29,17 @@ switches/patch panels look the part: switches get draw.io's built-in network
switch icon, patch panels get a small rack-unit look (header strip + port
ticks) rather than a plain box.
+A **VLAN table** sits at the top of the diagram (VLAN / Name / Description /
+Subnet / Site). As of this writing NetBox has no VLANs defined here, so it
+renders as an explicit "not configured yet" placeholder rather than being
+silently omitted or -- worse -- filled in with invented VLAN numbers. Add
+VLANs and interface tagged/untagged assignments in NetBox and regenerate
+(no code changes needed): the table populates for real, and every connector
+whose port has VLAN config picks up a short suffix like `9·V10 ↔ 1·V10`.
+Deliberately left out: literal switch CLI config dumps -- those belong in
+the switches' NetBox config-context/notes, not pasted into a topology
+diagram where they'd immediately go stale.
+
Connectors in the `.drawio` file are glued by shape id (draw.io's native
`source`/`target` reference on each edge) -- drag a switch or panel in the
app and its links follow, port-tick decorations included since they're
diff --git a/topology/Field-Switch-Topology.drawio b/topology/Field-Switch-Topology.drawio
index b804f08..4f4c1d4 100644
--- a/topology/Field-Switch-Topology.drawio
+++ b/topology/Field-Switch-Topology.drawio
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/topology/Field-Switch-Topology.png b/topology/Field-Switch-Topology.png
index b489a86..6588199 100644
Binary files a/topology/Field-Switch-Topology.png and b/topology/Field-Switch-Topology.png differ
diff --git a/topology/export_topology.py b/topology/export_topology.py
index aaa21d9..9c4359c 100644
--- a/topology/export_topology.py
+++ b/topology/export_topology.py
@@ -22,10 +22,38 @@ Two passes:
2. Pull every real Cable among those devices directly, so each edge
carries the exact port name on both ends (what generate_drawio.py
labels connectors with) instead of just "these two are connected."
+
+Also exports every ipam.VLAN (with its prefixes) and, for each edge whose
+endpoint is a real Interface (not a passive patch-panel port), that
+interface's 802.1Q mode/untagged/tagged VLANs. As of this writing NetBox
+has zero VLANs defined here, so `vlans` comes back `[]` and every edge's
+`a_vlan`/`b_vlan` comes back `null` -- generate_drawio.py renders that as
+an explicit "not configured yet" placeholder rather than silently
+omitting the VLAN legend. The moment VLANs and interface assignments get
+added in NetBox, rerunning this (no code changes needed) starts filling
+the diagram in for real.
"""
from dcim.models import Device, Interface, Cable
+from ipam.models import VLAN
import json
+def vlan_info(vlan):
+ if not vlan:
+ return None
+ prefixes = [str(p.prefix) for p in vlan.prefixes.all()]
+ return {"vid": vlan.vid, "name": vlan.name, "prefix": prefixes[0] if prefixes else None}
+
+def port_vlans(termination):
+ """VLAN mode/tagging for a real Interface termination; None for a
+ passive patch-panel front/rear port, which has no 802.1Q concept."""
+ if not isinstance(termination, Interface):
+ return None
+ return {
+ "mode": termination.mode,
+ "untagged": vlan_info(termination.untagged_vlan),
+ "tagged": [vlan_info(v) for v in termination.tagged_vlans.all()],
+ }
+
switch_ids = set(
Device.objects.filter(
role__slug__in=["core-switch", "dist-switch", "field-switch"]
@@ -66,8 +94,8 @@ for c in cables:
if da.id in touched_devices and db.id in touched_devices and da.id != db.id:
key = tuple(sorted((da.id, db.id)))
edges[key] = {
- "a": da.id, "a_port": ta.termination.name,
- "b": db.id, "b_port": tb.termination.name,
+ "a": da.id, "a_port": ta.termination.name, "a_vlan": port_vlans(ta.termination),
+ "b": db.id, "b_port": tb.termination.name, "b_vlan": port_vlans(tb.termination),
}
devs = Device.objects.filter(id__in=touched_devices).select_related(
@@ -88,5 +116,11 @@ out = {
for d in devs
],
"edges": list(edges.values()),
+ "vlans": [
+ {"vid": v.vid, "name": v.name, "description": v.description,
+ "prefixes": [str(p.prefix) for p in v.prefixes.all()],
+ "site": v.site.name if v.site else ""}
+ for v in VLAN.objects.all().select_related("site").order_by("vid")
+ ],
}
print(json.dumps(out))
diff --git a/topology/generate_drawio.py b/topology/generate_drawio.py
index ea332e6..72abcbf 100644
--- a/topology/generate_drawio.py
+++ b/topology/generate_drawio.py
@@ -20,7 +20,26 @@ OUT_PATH = sys.argv[2] if len(sys.argv) > 2 else "Field-Switch-Topology.drawio"
data = json.load(open(IN_PATH))
devs = {d["id"]: d for d in data["devices"]}
-edges = data["edges"] # [{a, a_port, b, b_port}, ...]
+edges = data["edges"] # [{a, a_port, a_vlan, b, b_port, b_vlan}, ...]
+vlans = data.get("vlans", []) # [{vid, name, description, prefixes, site}, ...]
+
+VLAN_PALETTE = ["#D6603F", "#3C9D6B", "#E8A33D", "#5B7FD9", "#9A6BC9", "#3FAAB0", "#C2547E", "#7A8C3F"]
+def vlan_color(vid):
+ return VLAN_PALETTE[hash(vid) % len(VLAN_PALETTE)]
+
+def vlan_tag(pv):
+ """Short connector-label suffix for a port's VLAN config, e.g. 'V10' or
+ 'V10,20T'. Empty string when the port has no 802.1Q config -- which, as
+ of this export, is every port (see export_topology.py docstring)."""
+ if not pv:
+ return ""
+ parts = []
+ if pv.get("untagged"):
+ parts.append(str(pv["untagged"]["vid"]))
+ tagged = pv.get("tagged") or []
+ if tagged:
+ parts.append(",".join(str(v["vid"]) for v in tagged) + "T")
+ return f' · V{"+".join(parts)}' if parts else ""
# ---------------- components ----------------
adj = {d: [] for d in devs}
@@ -105,7 +124,13 @@ def place_section(depth_map, yslot_map, y_offset):
return width, height
TITLE_H = 60
-cursor_y = MARGIN + TITLE_H
+LEGEND_ROW_H = 34
+VLAN_ROW_H = 20
+VLAN_HEADER_H = 24
+VLAN_TABLE_W = 900
+vlan_rows = max(1, len(vlans)) # the placeholder counts as one row
+VLAN_TABLE_H = VLAN_HEADER_H + vlan_rows * VLAN_ROW_H + 16
+cursor_y = MARGIN + TITLE_H + LEGEND_ROW_H + VLAN_TABLE_H + 20
w_main, h_main = place_section(depth_main, yslot_main, cursor_y)
main_top = cursor_y
@@ -128,7 +153,7 @@ iso_rows = (len(iso_sorted) + ISO_COLS - 1) // ISO_COLS
w_iso = MARGIN * 2 + PAD * 2 + (ISO_COLS - 1) * COL_W + SWITCH_ICON
h_iso = PAD * 2 + LABEL_STRIP + (iso_rows - 1) * ROW_H + SWITCH_ICON + SWITCH_LABEL_H
-PAGE_W = max(w_main, w_dmo, w_iso)
+PAGE_W = max(w_main, w_dmo, w_iso, VLAN_TABLE_W + MARGIN * 2)
PAGE_H = cursor_y + h_iso + MARGIN
# ---------------- style palette ----------------
@@ -242,7 +267,7 @@ for did, dev in devs.items():
for idx, e in enumerate(edges):
a, b = e["a"], e["b"]
if a in pos and b in pos:
- label = f'{e["a_port"]} ↔ {e["b_port"]}'
+ label = f'{e["a_port"]}{vlan_tag(e.get("a_vlan"))} ↔ {e["b_port"]}{vlan_tag(e.get("b_vlan"))}'
edge(f"e{idx}", f"n{a}", f"n{b}",
"edgeStyle=orthogonalEdgeStyle;rounded=1;html=1;strokeColor=#9AA6B8;strokeWidth=1.2;"
"startArrow=none;endArrow=none;"
@@ -271,6 +296,68 @@ for i, (fill, stroke, label) in enumerate(legend_items):
)
lx += 260
+# ---------------- VLAN legend / mapping table ----------------
+# Structure is always rendered; content depends on whether NetBox actually
+# has VLANs defined yet (see export_topology.py). Nothing here is invented --
+# an empty table renders as an explicit "not configured" placeholder, not as
+# blank space or made-up VLAN numbers.
+vt_x, vt_y = MARGIN, MARGIN + TITLE_H + LEGEND_ROW_H
+vt_cols = [("VLAN", 60), ("Name", 130), ("Description", 300), ("Subnet", 160), ("Site", 170)]
+add_cell(
+ f''
+)
+add_cell(
+ f''
+ f''
+)
+cx = vt_x + 90
+for label, w in vt_cols:
+ add_cell(
+ f''
+ f''
+ )
+ cx += w
+
+row_y = vt_y + VLAN_HEADER_H
+if not vlans:
+ add_cell(
+ f''
+ f''
+ )
+ add_cell(
+ f''
+ )
+else:
+ for v in vlans:
+ add_cell(
+ f''
+ f''
+ )
+ row_vals = [
+ str(v["vid"]), v["name"], v.get("description") or "—",
+ ", ".join(v.get("prefixes") or []) or "—", v.get("site") or "—",
+ ]
+ cx = vt_x + 90
+ for (label, w), val in zip(vt_cols, row_vals):
+ add_cell(
+ f''
+ f''
+ )
+ cx += w
+ row_y += VLAN_ROW_H
+
xml = (
''
f''
diff --git a/topology/topo_full.json b/topology/topo_full.json
index 5a93c54..69ec793 100644
--- a/topology/topo_full.json
+++ b/topology/topo_full.json
@@ -1 +1 @@
-{"devices": [{"id": 57, "name": "afl-104", "role": "patch-panel", "role_name": "Patch Panel", "site": "Highway 104 Base Station", "status": "active", "device_type": "AFL 12-Port Splice Module"}, {"id": 92, "name": "afl-cr13", "role": "patch-panel", "role_name": "Patch Panel", "site": "County Road 13 Base Station", "status": "active", "device_type": "AFL 12-Port Splice Module"}, {"id": 85, "name": "afl-lem", "role": "patch-panel", "role_name": "Patch Panel", "site": "Lemler Substation", "status": "active", "device_type": "AFL 12-Port Splice Module"}, {"id": 58, "name": "afl-mag", "role": "patch-panel", "role_name": "Patch Panel", "site": "Magnolia Springs Base Station", "status": "active", "device_type": "AFL 12-Port Splice Module"}, {"id": 82, "name": "afl-swf", "role": "patch-panel", "role_name": "Patch Panel", "site": "Southwest Foley Substation", "status": "active", "device_type": "AFL 12-Port Splice Module"}, {"id": 42, "name": "bs-104-sw01", "role": "field-switch", "role_name": "Field Switch", "site": "Highway 104 Base Station", "status": "active", "device_type": "IES3110-8TFP-R"}, {"id": 93, "name": "bs-cr13-sw01", "role": "field-switch", "role_name": "Field Switch", "site": "County Road 13 Base Station", "status": "active", "device_type": "IES3110-8TFP-R"}, {"id": 40, "name": "bs-lem-sw01", "role": "field-switch", "role_name": "Field Switch", "site": "Lemler Substation", "status": "active", "device_type": "IES3110-8TFP-R"}, {"id": 38, "name": "bs-lil-sw01", "role": "field-switch", "role_name": "Field Switch", "site": "Lillian Substation", "status": "active", "device_type": "IES3110-8TFP-R"}, {"id": 43, "name": "bs-mag-sw01", "role": "field-switch", "role_name": "Field Switch", "site": "Magnolia Springs Base Station", "status": "active", "device_type": "IES3110-8TFP-R"}, {"id": 41, "name": "bs-nwt-sw01", "role": "field-switch", "role_name": "Field Switch", "site": "North Water Tank", "status": "active", "device_type": "IES3110-8TFP-R"}, {"id": 39, "name": "bs-swf-sw01", "role": "field-switch", "role_name": "Field Switch", "site": "Southwest Foley Substation", "status": "active", "device_type": "IES3110-8TFP-R"}, {"id": 7, "name": "dmo-lob-sw35a", "role": "dist-switch", "role_name": "Distribution Switch", "site": "DMO-LOB", "status": "active", "device_type": "S4112F-ON"}, {"id": 2, "name": "FCHE-PP-32B", "role": "patch-panel", "role_name": "Patch Panel", "site": "FCHE Cable Headend", "status": "active", "device_type": "LS Series 288-Port LC UPC"}, {"id": 4, "name": "FCHE-PP17D", "role": "patch-panel", "role_name": "Patch Panel", "site": "FCHE Cable Headend", "status": "active", "device_type": "FIS 48-Port LC UPC"}, {"id": 3, "name": "FCHE-PP34A", "role": "patch-panel", "role_name": "Patch Panel", "site": "FCHE Cable Headend", "status": "active", "device_type": "FIS 144-Port LC UPC 12-Slot"}, {"id": 1, "name": "fche-sw17a", "role": "dist-switch", "role_name": "Distribution Switch", "site": "FCHE Cable Headend", "status": "active", "device_type": "ProCurve 5412zl"}, {"id": 63, "name": "fis-nwt", "role": "patch-panel", "role_name": "Patch Panel", "site": "North Water Tank", "status": "active", "device_type": "F1-DW2X"}, {"id": 11, "name": "gs-nff-sw01", "role": "field-switch", "role_name": "Field Switch", "site": "North Foley Field Gas Regulator", "status": "active", "device_type": "IES3110-8TFP-R"}, {"id": 19, "name": "ls-avls-sw01", "role": "field-switch", "role_name": "Field Switch", "site": "Aaronville Lift Station", "status": "active", "device_type": "IES3110-8TFP-R"}, {"id": 14, "name": "ls-bsls-sw01", "role": "field-switch", "role_name": "Field Switch", "site": "Bay Street Lift Station", "status": "active", "device_type": "IES3110-8TFP-R"}, {"id": 20, "name": "ls-clls-sw01", "role": "field-switch", "role_name": "Field Switch", "site": "Cornerstone Lodge Lift Station", "status": "active", "device_type": "IES3110-8TFP-R"}, {"id": 10, "name": "ls-guls-sw01", "role": "field-switch", "role_name": "Field Switch", "site": "Gulftel Lift Station", "status": "active", "device_type": "IES3110-8TFP-R"}, {"id": 25, "name": "ls-mals-sw01", "role": "field-switch", "role_name": "Field Switch", "site": "Marlin Place Lift Station", "status": "active", "device_type": "IES3110-8TFP-R"}, {"id": 23, "name": "ls-mmls-sw01", "role": "field-switch", "role_name": "Field Switch", "site": "Majestic Manor Lift Station", "status": "active", "device_type": "IES3110-8TFP-R"}, {"id": 26, "name": "ls-mpls-sw01", "role": "field-switch", "role_name": "Field Switch", "site": "McSwain Place Lift Station", "status": "active", "device_type": "IES3110-8TFP-R"}, {"id": 9, "name": "ls-pals-sw01", "role": "field-switch", "role_name": "Field Switch", "site": "Peachtree Lift Station", "status": "active", "device_type": "IES3110-8TFP-R"}, {"id": 21, "name": "ls-rols-sw01", "role": "field-switch", "role_name": "Field Switch", "site": "River Oaks Lift Station", "status": "active", "device_type": "IES3110-8TFP-R"}, {"id": 24, "name": "ls-spls-sw01", "role": "field-switch", "role_name": "Field Switch", "site": "South Pointe Lift Station", "status": "active", "device_type": "IES3110-8TFP-R"}, {"id": 22, "name": "ls-vhls-sw01", "role": "field-switch", "role_name": "Field Switch", "site": "Villages at Hickory Lift Station", "status": "active", "device_type": "IES3110-8TFP-R"}, {"id": 76, "name": "primex-ebert", "role": "patch-panel", "role_name": "Patch Panel", "site": "Ebert Substation", "status": "active", "device_type": "Primex 12-Port LC Panel"}, {"id": 79, "name": "primex-holk", "role": "patch-panel", "role_name": "Patch Panel", "site": "Holk Substation", "status": "active", "device_type": "Primex 12-Port LC Panel"}, {"id": 80, "name": "primex-lem", "role": "patch-panel", "role_name": "Patch Panel", "site": "Lemler Substation", "status": "active", "device_type": "Primex 12-Port LC Panel"}, {"id": 81, "name": "primex-lil", "role": "patch-panel", "role_name": "Patch Panel", "site": "Lillian Substation", "status": "active", "device_type": "Primex 12-Port LC Panel"}, {"id": 83, "name": "primex-wpb", "role": "patch-panel", "role_name": "Patch Panel", "site": "West Perdido Beach Substation", "status": "active", "device_type": "Primex 12-Port LC Panel"}, {"id": 33, "name": "rec-10000-sw01", "role": "field-switch", "role_name": "Field Switch", "site": "Bay St @ Azalea Recloser", "status": "active", "device_type": "IES3110-8TFP-R"}, {"id": 34, "name": "rec-10008-sw01", "role": "field-switch", "role_name": "Field Switch", "site": "Cedar @ Michigan Recloser", "status": "active", "device_type": "IES3110-8TFP-R"}, {"id": 17, "name": "rec-10016-sw01", "role": "field-switch", "role_name": "Field Switch", "site": "Underwood Rd Recloser", "status": "active", "device_type": "IES3110-8TFP-R"}, {"id": 28, "name": "rec-10018-sw01", "role": "field-switch", "role_name": "Field Switch", "site": "Summerdale Recloser", "status": "active", "device_type": "IES3110-8TFP-R"}, {"id": 18, "name": "rec-10136-sw01", "role": "field-switch", "role_name": "Field Switch", "site": "WHEP Recloser", "status": "active", "device_type": "IES3110-8TFP-R"}, {"id": 15, "name": "rec-10160-sw01", "role": "field-switch", "role_name": "Field Switch", "site": "Coca Cola Plant Hwy 104 Recloser", "status": "active", "device_type": "IES3110-8TFP-R"}, {"id": 32, "name": "rec-10660-sw01", "role": "field-switch", "role_name": "Field Switch", "site": "Old Foley Rd Recloser", "status": "active", "device_type": "IES3110-8TFP-R"}, {"id": 16, "name": "rec-13032-sw01", "role": "field-switch", "role_name": "Field Switch", "site": "Peachtree Recloser", "status": "active", "device_type": "IES3110-8TFP-R"}, {"id": 30, "name": "rec-50094-sw01", "role": "field-switch", "role_name": "Field Switch", "site": "Randall Ave @ Hwy 98 Recloser", "status": "active", "device_type": "IES3110-8TFP-R"}, {"id": 31, "name": "rec-52882-sw01", "role": "field-switch", "role_name": "Field Switch", "site": "Pollard Rd Recloser", "status": "active", "device_type": "IES3110-8TFP-R"}, {"id": 87, "name": "sec-holk-sw01", "role": "field-switch", "role_name": "Field Switch", "site": "Holk Substation", "status": "active", "device_type": "IES3110-8TFP-R"}, {"id": 88, "name": "sec-lem-sw01", "role": "field-switch", "role_name": "Field Switch", "site": "Lemler Substation", "status": "active", "device_type": "IES3110-8TFP-R"}, {"id": 89, "name": "sec-swf-sw01", "role": "field-switch", "role_name": "Field Switch", "site": "Southwest Foley Substation", "status": "active", "device_type": "IES3110-8TFP-R"}, {"id": 45, "name": "spare-163", "role": "field-switch", "role_name": "Field Switch", "site": "FCHE Cable Headend", "status": "inventory", "device_type": "IES3220-8T4F"}, {"id": 46, "name": "spare-164", "role": "field-switch", "role_name": "Field Switch", "site": "FCHE Cable Headend", "status": "inventory", "device_type": "IES3220-8T4F"}, {"id": 47, "name": "spare-165", "role": "field-switch", "role_name": "Field Switch", "site": "FCHE Cable Headend", "status": "inventory", "device_type": "IES3220-8T4F"}, {"id": 48, "name": "spare-166", "role": "field-switch", "role_name": "Field Switch", "site": "FCHE Cable Headend", "status": "inventory", "device_type": "IES3220-8T4F"}, {"id": 36, "name": "sub-ebert-sw01", "role": "field-switch", "role_name": "Field Switch", "site": "Ebert Substation", "status": "active", "device_type": "IES3110-8TFP-R"}, {"id": 13, "name": "sub-fair-sw01", "role": "field-switch", "role_name": "Field Switch", "site": "Fairhope Substation", "status": "active", "device_type": "IES3110-8TFP-R"}, {"id": 29, "name": "sub-holk-sw01", "role": "field-switch", "role_name": "Field Switch", "site": "Holk Substation", "status": "active", "device_type": "IES3110-8TFP-R"}, {"id": 49, "name": "sub-lem-sw01", "role": "field-switch", "role_name": "Field Switch", "site": "Lemler Substation", "status": "active", "device_type": "IES3110-8TFP-R"}, {"id": 35, "name": "sub-lem-sw01-decommissioned", "role": "field-switch", "role_name": "Field Switch", "site": "Lemler Substation", "status": "decommissioning", "device_type": "2930F"}, {"id": 8, "name": "sub-lil-sw01", "role": "field-switch", "role_name": "Field Switch", "site": "Lillian Substation", "status": "active", "device_type": "IES3110-8TFP-R"}, {"id": 27, "name": "sub-swf-sw01", "role": "field-switch", "role_name": "Field Switch", "site": "Southwest Foley Substation", "status": "active", "device_type": "IES3110-8TFP-R"}, {"id": 37, "name": "sub-wpb-sw01", "role": "field-switch", "role_name": "Field Switch", "site": "West Perdido Beach Substation", "status": "active", "device_type": "IES3110-8TFP-R"}, {"id": 90, "name": "wtr-cwt-sw01", "role": "field-switch", "role_name": "Field Switch", "site": "Cypress Water Tank", "status": "active", "device_type": "IES3110-8TFP-R"}, {"id": 12, "name": "wtr-ecc-sw01", "role": "field-switch", "role_name": "Field Switch", "site": "Elberta Cross Connect", "status": "active", "device_type": "IES3110-8TFP-R"}, {"id": 44, "name": "wtr-w12-sw01", "role": "field-switch", "role_name": "Field Switch", "site": "Well 12", "status": "planned", "device_type": "IES3110-8TFP-R"}, {"id": 51, "name": "xpak-10000", "role": "patch-panel", "role_name": "Patch Panel", "site": "Bay St @ Azalea Recloser", "status": "active", "device_type": "xPAK 6-Port SC/APC"}, {"id": 53, "name": "xpak-10008", "role": "patch-panel", "role_name": "Patch Panel", "site": "Cedar @ Michigan Recloser", "status": "active", "device_type": "xPAK 6-Port SC/APC"}, {"id": 72, "name": "xpak-10016", "role": "patch-panel", "role_name": "Patch Panel", "site": "Underwood Rd Recloser", "status": "active", "device_type": "xPAK 6-Port SC/APC"}, {"id": 71, "name": "xpak-10018", "role": "patch-panel", "role_name": "Patch Panel", "site": "Summerdale Recloser", "status": "active", "device_type": "xPAK 6-Port SC/APC"}, {"id": 74, "name": "xpak-10136", "role": "patch-panel", "role_name": "Patch Panel", "site": "WHEP Recloser", "status": "active", "device_type": "xPAK 6-Port SC/APC"}, {"id": 54, "name": "xpak-10160", "role": "patch-panel", "role_name": "Patch Panel", "site": "Coca Cola Plant Hwy 104 Recloser", "status": "active", "device_type": "xPAK 6-Port SC/APC"}, {"id": 64, "name": "xpak-10660", "role": "patch-panel", "role_name": "Patch Panel", "site": "Old Foley Rd Recloser", "status": "active", "device_type": "xPAK 6-Port SC/APC"}, {"id": 66, "name": "xpak-13032", "role": "patch-panel", "role_name": "Patch Panel", "site": "Peachtree Recloser", "status": "active", "device_type": "xPAK 6-Port SC/APC"}, {"id": 68, "name": "xpak-50094", "role": "patch-panel", "role_name": "Patch Panel", "site": "Randall Ave @ Hwy 98 Recloser", "status": "active", "device_type": "xPAK 6-Port SC/APC"}, {"id": 67, "name": "xpak-52882", "role": "patch-panel", "role_name": "Patch Panel", "site": "Pollard Rd Recloser", "status": "active", "device_type": "xPAK 6-Port SC/APC"}, {"id": 50, "name": "xpak-avls", "role": "patch-panel", "role_name": "Patch Panel", "site": "Aaronville Lift Station", "status": "active", "device_type": "xPAK 6-Port SC/APC"}, {"id": 52, "name": "xpak-bsls", "role": "patch-panel", "role_name": "Patch Panel", "site": "Bay Street Lift Station", "status": "active", "device_type": "xPAK 6-Port SC/APC"}, {"id": 55, "name": "xpak-clls", "role": "patch-panel", "role_name": "Patch Panel", "site": "Cornerstone Lodge Lift Station", "status": "active", "device_type": "xPAK 6-Port SC/APC"}, {"id": 91, "name": "xpak-cwt", "role": "patch-panel", "role_name": "Patch Panel", "site": "Cypress Water Tank", "status": "active", "device_type": "xPAK 6-Port SC/APC"}, {"id": 56, "name": "xpak-guls", "role": "patch-panel", "role_name": "Patch Panel", "site": "Gulftel Lift Station", "status": "active", "device_type": "xPAK 6-Port SC/APC"}, {"id": 60, "name": "xpak-mals", "role": "patch-panel", "role_name": "Patch Panel", "site": "Marlin Place Lift Station", "status": "active", "device_type": "xPAK 6-Port SC/APC"}, {"id": 59, "name": "xpak-mmls", "role": "patch-panel", "role_name": "Patch Panel", "site": "Majestic Manor Lift Station", "status": "active", "device_type": "xPAK 6-Port SC/APC"}, {"id": 61, "name": "xpak-mpls", "role": "patch-panel", "role_name": "Patch Panel", "site": "McSwain Place Lift Station", "status": "active", "device_type": "xPAK 6-Port SC/APC"}, {"id": 62, "name": "xpak-nff", "role": "patch-panel", "role_name": "Patch Panel", "site": "North Foley Field Gas Regulator", "status": "active", "device_type": "xPAK 6-Port SC/APC"}, {"id": 65, "name": "xpak-pals", "role": "patch-panel", "role_name": "Patch Panel", "site": "Peachtree Lift Station", "status": "active", "device_type": "xPAK 6-Port SC/APC"}, {"id": 69, "name": "xpak-rols", "role": "patch-panel", "role_name": "Patch Panel", "site": "River Oaks Lift Station", "status": "active", "device_type": "xPAK 6-Port SC/APC"}, {"id": 70, "name": "xpak-spls", "role": "patch-panel", "role_name": "Patch Panel", "site": "South Pointe Lift Station", "status": "active", "device_type": "xPAK 6-Port SC/APC"}, {"id": 73, "name": "xpak-vhls", "role": "patch-panel", "role_name": "Patch Panel", "site": "Villages at Hickory Lift Station", "status": "active", "device_type": "xPAK 6-Port SC/APC"}], "edges": [{"a": 7, "a_port": "4", "b": 13, "b_port": "9"}, {"a": 41, "a_port": "Gi1/10", "b": 63, "b_port": "P2:6"}, {"a": 63, "a_port": "P2:8", "b": 3, "b_port": "55"}, {"a": 1, "a_port": "E3", "b": 3, "b_port": "51"}, {"a": 19, "a_port": "10", "b": 50, "b_port": "2"}, {"a": 14, "a_port": "10", "b": 52, "b_port": "2"}, {"a": 20, "a_port": "9", "b": 55, "b_port": "1"}, {"a": 10, "a_port": "9", "b": 56, "b_port": "1"}, {"a": 25, "a_port": "9", "b": 60, "b_port": "1"}, {"a": 23, "a_port": "10", "b": 59, "b_port": "2"}, {"a": 26, "a_port": "10", "b": 61, "b_port": "2"}, {"a": 9, "a_port": "10", "b": 65, "b_port": "2"}, {"a": 21, "a_port": "10", "b": 69, "b_port": "2"}, {"a": 24, "a_port": "9", "b": 70, "b_port": "1"}, {"a": 22, "a_port": "10", "b": 73, "b_port": "2"}, {"a": 52, "a_port": "2", "b": 50, "b_port": "1"}, {"a": 50, "a_port": "2", "b": 69, "b_port": "1"}, {"a": 69, "a_port": "2", "b": 73, "b_port": "1"}, {"a": 73, "a_port": "2", "b": 59, "b_port": "1"}, {"a": 59, "a_port": "2", "b": 61, "b_port": "1"}, {"a": 61, "a_port": "2", "b": 55, "b_port": "1"}, {"a": 65, "a_port": "2", "b": 56, "b_port": "1"}, {"a": 33, "a_port": "10", "b": 51, "b_port": "2"}, {"a": 34, "a_port": "10", "b": 53, "b_port": "2"}, {"a": 17, "a_port": "10", "b": 72, "b_port": "2"}, {"a": 28, "a_port": "9", "b": 71, "b_port": "1"}, {"a": 18, "a_port": "10", "b": 74, "b_port": "2"}, {"a": 15, "a_port": "9", "b": 54, "b_port": "1"}, {"a": 32, "a_port": "9", "b": 64, "b_port": "1"}, {"a": 16, "a_port": "10", "b": 66, "b_port": "2"}, {"a": 30, "a_port": "9", "b": 68, "b_port": "1"}, {"a": 31, "a_port": "9", "b": 67, "b_port": "1"}, {"a": 7, "a_port": "11", "b": 67, "b_port": "1"}, {"a": 7, "a_port": "1", "b": 68, "b_port": "1"}, {"a": 66, "a_port": "2", "b": 72, "b_port": "1"}, {"a": 72, "a_port": "2", "b": 74, "b_port": "1"}, {"a": 74, "a_port": "2", "b": 71, "b_port": "1"}, {"a": 51, "a_port": "2", "b": 53, "b_port": "1"}, {"a": 1, "a_port": "E12", "b": 2, "b_port": "7"}, {"a": 1, "a_port": "E2", "b": 4, "b_port": "10"}, {"a": 4, "a_port": "31", "b": 64, "b_port": "1"}, {"a": 4, "a_port": "27", "b": 12, "b_port": "9"}, {"a": 76, "a_port": "6", "b": 36, "b_port": "10"}, {"a": 4, "a_port": "12", "b": 76, "b_port": "5"}, {"a": 76, "a_port": "8", "b": 83, "b_port": "3"}, {"a": 83, "a_port": "4", "b": 37, "b_port": "10"}, {"a": 83, "a_port": "6", "b": 81, "b_port": "12"}, {"a": 81, "a_port": "10", "b": 8, "b_port": "9"}, {"a": 2, "a_port": "49", "b": 70, "b_port": "1"}, {"a": 2, "a_port": "3", "b": 60, "b_port": "1"}, {"a": 85, "a_port": "2", "b": 40, "b_port": "Gi1/10"}, {"a": 2, "a_port": "15", "b": 85, "b_port": "1"}, {"a": 85, "a_port": "2", "b": 82, "b_port": "3"}, {"a": 82, "a_port": "6", "b": 39, "b_port": "10"}, {"a": 82, "a_port": "6", "b": 58, "b_port": "1"}, {"a": 58, "a_port": "1", "b": 43, "b_port": "Gi1/9"}, {"a": 2, "a_port": "4", "b": 52, "b_port": "1"}, {"a": 3, "a_port": "96", "b": 54, "b_port": "1"}, {"a": 3, "a_port": "1", "b": 66, "b_port": "1"}, {"a": 3, "a_port": "53", "b": 62, "b_port": "1"}, {"a": 62, "a_port": "1", "b": 11, "b_port": "9"}, {"a": 3, "a_port": "51", "b": 65, "b_port": "1"}, {"a": 2, "a_port": "14", "b": 79, "b_port": "5"}, {"a": 79, "a_port": "4", "b": 29, "b_port": "10"}, {"a": 79, "a_port": "4", "b": 51, "b_port": "1"}, {"a": 82, "a_port": "1", "b": 27, "b_port": "9"}, {"a": 79, "a_port": "6", "b": 87, "b_port": "10"}, {"a": 80, "a_port": "4", "b": 88, "b_port": "10"}, {"a": 79, "a_port": "6", "b": 80, "b_port": "3"}, {"a": 80, "a_port": "2", "b": 82, "b_port": "1"}, {"a": 82, "a_port": "2", "b": 89, "b_port": "9"}, {"a": 53, "a_port": "2", "b": 80, "b_port": "1"}, {"a": 80, "a_port": "2", "b": 49, "b_port": "10"}, {"a": 81, "a_port": "12", "b": 38, "b_port": "Gi1/9"}, {"a": 2, "a_port": "7", "b": 91, "b_port": "1"}, {"a": 90, "a_port": "9", "b": 91, "b_port": "1"}, {"a": 42, "a_port": "Gi1/10", "b": 57, "b_port": "2"}, {"a": 57, "a_port": "1", "b": 63, "b_port": "P2:6"}, {"a": 57, "a_port": "2", "b": 92, "b_port": "1"}, {"a": 93, "a_port": "Gi1/9", "b": 92, "b_port": "1"}]}
+{"devices": [{"id": 57, "name": "afl-104", "role": "patch-panel", "role_name": "Patch Panel", "site": "Highway 104 Base Station", "status": "active", "device_type": "AFL 12-Port Splice Module"}, {"id": 92, "name": "afl-cr13", "role": "patch-panel", "role_name": "Patch Panel", "site": "County Road 13 Base Station", "status": "active", "device_type": "AFL 12-Port Splice Module"}, {"id": 85, "name": "afl-lem", "role": "patch-panel", "role_name": "Patch Panel", "site": "Lemler Substation", "status": "active", "device_type": "AFL 12-Port Splice Module"}, {"id": 58, "name": "afl-mag", "role": "patch-panel", "role_name": "Patch Panel", "site": "Magnolia Springs Base Station", "status": "active", "device_type": "AFL 12-Port Splice Module"}, {"id": 82, "name": "afl-swf", "role": "patch-panel", "role_name": "Patch Panel", "site": "Southwest Foley Substation", "status": "active", "device_type": "AFL 12-Port Splice Module"}, {"id": 42, "name": "bs-104-sw01", "role": "field-switch", "role_name": "Field Switch", "site": "Highway 104 Base Station", "status": "active", "device_type": "IES3110-8TFP-R"}, {"id": 93, "name": "bs-cr13-sw01", "role": "field-switch", "role_name": "Field Switch", "site": "County Road 13 Base Station", "status": "active", "device_type": "IES3110-8TFP-R"}, {"id": 40, "name": "bs-lem-sw01", "role": "field-switch", "role_name": "Field Switch", "site": "Lemler Substation", "status": "active", "device_type": "IES3110-8TFP-R"}, {"id": 38, "name": "bs-lil-sw01", "role": "field-switch", "role_name": "Field Switch", "site": "Lillian Substation", "status": "active", "device_type": "IES3110-8TFP-R"}, {"id": 43, "name": "bs-mag-sw01", "role": "field-switch", "role_name": "Field Switch", "site": "Magnolia Springs Base Station", "status": "active", "device_type": "IES3110-8TFP-R"}, {"id": 41, "name": "bs-nwt-sw01", "role": "field-switch", "role_name": "Field Switch", "site": "North Water Tank", "status": "active", "device_type": "IES3110-8TFP-R"}, {"id": 39, "name": "bs-swf-sw01", "role": "field-switch", "role_name": "Field Switch", "site": "Southwest Foley Substation", "status": "active", "device_type": "IES3110-8TFP-R"}, {"id": 7, "name": "dmo-lob-sw35a", "role": "dist-switch", "role_name": "Distribution Switch", "site": "DMO-LOB", "status": "active", "device_type": "S4112F-ON"}, {"id": 2, "name": "FCHE-PP-32B", "role": "patch-panel", "role_name": "Patch Panel", "site": "FCHE Cable Headend", "status": "active", "device_type": "LS Series 288-Port LC UPC"}, {"id": 4, "name": "FCHE-PP17D", "role": "patch-panel", "role_name": "Patch Panel", "site": "FCHE Cable Headend", "status": "active", "device_type": "FIS 48-Port LC UPC"}, {"id": 3, "name": "FCHE-PP34A", "role": "patch-panel", "role_name": "Patch Panel", "site": "FCHE Cable Headend", "status": "active", "device_type": "FIS 144-Port LC UPC 12-Slot"}, {"id": 1, "name": "fche-sw17a", "role": "dist-switch", "role_name": "Distribution Switch", "site": "FCHE Cable Headend", "status": "active", "device_type": "ProCurve 5412zl"}, {"id": 63, "name": "fis-nwt", "role": "patch-panel", "role_name": "Patch Panel", "site": "North Water Tank", "status": "active", "device_type": "F1-DW2X"}, {"id": 11, "name": "gs-nff-sw01", "role": "field-switch", "role_name": "Field Switch", "site": "North Foley Field Gas Regulator", "status": "active", "device_type": "IES3110-8TFP-R"}, {"id": 19, "name": "ls-avls-sw01", "role": "field-switch", "role_name": "Field Switch", "site": "Aaronville Lift Station", "status": "active", "device_type": "IES3110-8TFP-R"}, {"id": 14, "name": "ls-bsls-sw01", "role": "field-switch", "role_name": "Field Switch", "site": "Bay Street Lift Station", "status": "active", "device_type": "IES3110-8TFP-R"}, {"id": 20, "name": "ls-clls-sw01", "role": "field-switch", "role_name": "Field Switch", "site": "Cornerstone Lodge Lift Station", "status": "active", "device_type": "IES3110-8TFP-R"}, {"id": 10, "name": "ls-guls-sw01", "role": "field-switch", "role_name": "Field Switch", "site": "Gulftel Lift Station", "status": "active", "device_type": "IES3110-8TFP-R"}, {"id": 25, "name": "ls-mals-sw01", "role": "field-switch", "role_name": "Field Switch", "site": "Marlin Place Lift Station", "status": "active", "device_type": "IES3110-8TFP-R"}, {"id": 23, "name": "ls-mmls-sw01", "role": "field-switch", "role_name": "Field Switch", "site": "Majestic Manor Lift Station", "status": "active", "device_type": "IES3110-8TFP-R"}, {"id": 26, "name": "ls-mpls-sw01", "role": "field-switch", "role_name": "Field Switch", "site": "McSwain Place Lift Station", "status": "active", "device_type": "IES3110-8TFP-R"}, {"id": 9, "name": "ls-pals-sw01", "role": "field-switch", "role_name": "Field Switch", "site": "Peachtree Lift Station", "status": "active", "device_type": "IES3110-8TFP-R"}, {"id": 21, "name": "ls-rols-sw01", "role": "field-switch", "role_name": "Field Switch", "site": "River Oaks Lift Station", "status": "active", "device_type": "IES3110-8TFP-R"}, {"id": 24, "name": "ls-spls-sw01", "role": "field-switch", "role_name": "Field Switch", "site": "South Pointe Lift Station", "status": "active", "device_type": "IES3110-8TFP-R"}, {"id": 22, "name": "ls-vhls-sw01", "role": "field-switch", "role_name": "Field Switch", "site": "Villages at Hickory Lift Station", "status": "active", "device_type": "IES3110-8TFP-R"}, {"id": 76, "name": "primex-ebert", "role": "patch-panel", "role_name": "Patch Panel", "site": "Ebert Substation", "status": "active", "device_type": "Primex 12-Port LC Panel"}, {"id": 79, "name": "primex-holk", "role": "patch-panel", "role_name": "Patch Panel", "site": "Holk Substation", "status": "active", "device_type": "Primex 12-Port LC Panel"}, {"id": 80, "name": "primex-lem", "role": "patch-panel", "role_name": "Patch Panel", "site": "Lemler Substation", "status": "active", "device_type": "Primex 12-Port LC Panel"}, {"id": 81, "name": "primex-lil", "role": "patch-panel", "role_name": "Patch Panel", "site": "Lillian Substation", "status": "active", "device_type": "Primex 12-Port LC Panel"}, {"id": 83, "name": "primex-wpb", "role": "patch-panel", "role_name": "Patch Panel", "site": "West Perdido Beach Substation", "status": "active", "device_type": "Primex 12-Port LC Panel"}, {"id": 33, "name": "rec-10000-sw01", "role": "field-switch", "role_name": "Field Switch", "site": "Bay St @ Azalea Recloser", "status": "active", "device_type": "IES3110-8TFP-R"}, {"id": 34, "name": "rec-10008-sw01", "role": "field-switch", "role_name": "Field Switch", "site": "Cedar @ Michigan Recloser", "status": "active", "device_type": "IES3110-8TFP-R"}, {"id": 17, "name": "rec-10016-sw01", "role": "field-switch", "role_name": "Field Switch", "site": "Underwood Rd Recloser", "status": "active", "device_type": "IES3110-8TFP-R"}, {"id": 28, "name": "rec-10018-sw01", "role": "field-switch", "role_name": "Field Switch", "site": "Summerdale Recloser", "status": "active", "device_type": "IES3110-8TFP-R"}, {"id": 18, "name": "rec-10136-sw01", "role": "field-switch", "role_name": "Field Switch", "site": "WHEP Recloser", "status": "active", "device_type": "IES3110-8TFP-R"}, {"id": 15, "name": "rec-10160-sw01", "role": "field-switch", "role_name": "Field Switch", "site": "Coca Cola Plant Hwy 104 Recloser", "status": "active", "device_type": "IES3110-8TFP-R"}, {"id": 32, "name": "rec-10660-sw01", "role": "field-switch", "role_name": "Field Switch", "site": "Old Foley Rd Recloser", "status": "active", "device_type": "IES3110-8TFP-R"}, {"id": 16, "name": "rec-13032-sw01", "role": "field-switch", "role_name": "Field Switch", "site": "Peachtree Recloser", "status": "active", "device_type": "IES3110-8TFP-R"}, {"id": 30, "name": "rec-50094-sw01", "role": "field-switch", "role_name": "Field Switch", "site": "Randall Ave @ Hwy 98 Recloser", "status": "active", "device_type": "IES3110-8TFP-R"}, {"id": 31, "name": "rec-52882-sw01", "role": "field-switch", "role_name": "Field Switch", "site": "Pollard Rd Recloser", "status": "active", "device_type": "IES3110-8TFP-R"}, {"id": 87, "name": "sec-holk-sw01", "role": "field-switch", "role_name": "Field Switch", "site": "Holk Substation", "status": "active", "device_type": "IES3110-8TFP-R"}, {"id": 88, "name": "sec-lem-sw01", "role": "field-switch", "role_name": "Field Switch", "site": "Lemler Substation", "status": "active", "device_type": "IES3110-8TFP-R"}, {"id": 89, "name": "sec-swf-sw01", "role": "field-switch", "role_name": "Field Switch", "site": "Southwest Foley Substation", "status": "active", "device_type": "IES3110-8TFP-R"}, {"id": 45, "name": "spare-163", "role": "field-switch", "role_name": "Field Switch", "site": "FCHE Cable Headend", "status": "inventory", "device_type": "IES3220-8T4F"}, {"id": 46, "name": "spare-164", "role": "field-switch", "role_name": "Field Switch", "site": "FCHE Cable Headend", "status": "inventory", "device_type": "IES3220-8T4F"}, {"id": 47, "name": "spare-165", "role": "field-switch", "role_name": "Field Switch", "site": "FCHE Cable Headend", "status": "inventory", "device_type": "IES3220-8T4F"}, {"id": 48, "name": "spare-166", "role": "field-switch", "role_name": "Field Switch", "site": "FCHE Cable Headend", "status": "inventory", "device_type": "IES3220-8T4F"}, {"id": 36, "name": "sub-ebert-sw01", "role": "field-switch", "role_name": "Field Switch", "site": "Ebert Substation", "status": "active", "device_type": "IES3110-8TFP-R"}, {"id": 13, "name": "sub-fair-sw01", "role": "field-switch", "role_name": "Field Switch", "site": "Fairhope Substation", "status": "active", "device_type": "IES3110-8TFP-R"}, {"id": 29, "name": "sub-holk-sw01", "role": "field-switch", "role_name": "Field Switch", "site": "Holk Substation", "status": "active", "device_type": "IES3110-8TFP-R"}, {"id": 49, "name": "sub-lem-sw01", "role": "field-switch", "role_name": "Field Switch", "site": "Lemler Substation", "status": "active", "device_type": "IES3110-8TFP-R"}, {"id": 35, "name": "sub-lem-sw01-decommissioned", "role": "field-switch", "role_name": "Field Switch", "site": "Lemler Substation", "status": "decommissioning", "device_type": "2930F"}, {"id": 8, "name": "sub-lil-sw01", "role": "field-switch", "role_name": "Field Switch", "site": "Lillian Substation", "status": "active", "device_type": "IES3110-8TFP-R"}, {"id": 27, "name": "sub-swf-sw01", "role": "field-switch", "role_name": "Field Switch", "site": "Southwest Foley Substation", "status": "active", "device_type": "IES3110-8TFP-R"}, {"id": 37, "name": "sub-wpb-sw01", "role": "field-switch", "role_name": "Field Switch", "site": "West Perdido Beach Substation", "status": "active", "device_type": "IES3110-8TFP-R"}, {"id": 90, "name": "wtr-cwt-sw01", "role": "field-switch", "role_name": "Field Switch", "site": "Cypress Water Tank", "status": "active", "device_type": "IES3110-8TFP-R"}, {"id": 12, "name": "wtr-ecc-sw01", "role": "field-switch", "role_name": "Field Switch", "site": "Elberta Cross Connect", "status": "active", "device_type": "IES3110-8TFP-R"}, {"id": 44, "name": "wtr-w12-sw01", "role": "field-switch", "role_name": "Field Switch", "site": "Well 12", "status": "planned", "device_type": "IES3110-8TFP-R"}, {"id": 51, "name": "xpak-10000", "role": "patch-panel", "role_name": "Patch Panel", "site": "Bay St @ Azalea Recloser", "status": "active", "device_type": "xPAK 6-Port SC/APC"}, {"id": 53, "name": "xpak-10008", "role": "patch-panel", "role_name": "Patch Panel", "site": "Cedar @ Michigan Recloser", "status": "active", "device_type": "xPAK 6-Port SC/APC"}, {"id": 72, "name": "xpak-10016", "role": "patch-panel", "role_name": "Patch Panel", "site": "Underwood Rd Recloser", "status": "active", "device_type": "xPAK 6-Port SC/APC"}, {"id": 71, "name": "xpak-10018", "role": "patch-panel", "role_name": "Patch Panel", "site": "Summerdale Recloser", "status": "active", "device_type": "xPAK 6-Port SC/APC"}, {"id": 74, "name": "xpak-10136", "role": "patch-panel", "role_name": "Patch Panel", "site": "WHEP Recloser", "status": "active", "device_type": "xPAK 6-Port SC/APC"}, {"id": 54, "name": "xpak-10160", "role": "patch-panel", "role_name": "Patch Panel", "site": "Coca Cola Plant Hwy 104 Recloser", "status": "active", "device_type": "xPAK 6-Port SC/APC"}, {"id": 64, "name": "xpak-10660", "role": "patch-panel", "role_name": "Patch Panel", "site": "Old Foley Rd Recloser", "status": "active", "device_type": "xPAK 6-Port SC/APC"}, {"id": 66, "name": "xpak-13032", "role": "patch-panel", "role_name": "Patch Panel", "site": "Peachtree Recloser", "status": "active", "device_type": "xPAK 6-Port SC/APC"}, {"id": 68, "name": "xpak-50094", "role": "patch-panel", "role_name": "Patch Panel", "site": "Randall Ave @ Hwy 98 Recloser", "status": "active", "device_type": "xPAK 6-Port SC/APC"}, {"id": 67, "name": "xpak-52882", "role": "patch-panel", "role_name": "Patch Panel", "site": "Pollard Rd Recloser", "status": "active", "device_type": "xPAK 6-Port SC/APC"}, {"id": 50, "name": "xpak-avls", "role": "patch-panel", "role_name": "Patch Panel", "site": "Aaronville Lift Station", "status": "active", "device_type": "xPAK 6-Port SC/APC"}, {"id": 52, "name": "xpak-bsls", "role": "patch-panel", "role_name": "Patch Panel", "site": "Bay Street Lift Station", "status": "active", "device_type": "xPAK 6-Port SC/APC"}, {"id": 55, "name": "xpak-clls", "role": "patch-panel", "role_name": "Patch Panel", "site": "Cornerstone Lodge Lift Station", "status": "active", "device_type": "xPAK 6-Port SC/APC"}, {"id": 91, "name": "xpak-cwt", "role": "patch-panel", "role_name": "Patch Panel", "site": "Cypress Water Tank", "status": "active", "device_type": "xPAK 6-Port SC/APC"}, {"id": 56, "name": "xpak-guls", "role": "patch-panel", "role_name": "Patch Panel", "site": "Gulftel Lift Station", "status": "active", "device_type": "xPAK 6-Port SC/APC"}, {"id": 60, "name": "xpak-mals", "role": "patch-panel", "role_name": "Patch Panel", "site": "Marlin Place Lift Station", "status": "active", "device_type": "xPAK 6-Port SC/APC"}, {"id": 59, "name": "xpak-mmls", "role": "patch-panel", "role_name": "Patch Panel", "site": "Majestic Manor Lift Station", "status": "active", "device_type": "xPAK 6-Port SC/APC"}, {"id": 61, "name": "xpak-mpls", "role": "patch-panel", "role_name": "Patch Panel", "site": "McSwain Place Lift Station", "status": "active", "device_type": "xPAK 6-Port SC/APC"}, {"id": 62, "name": "xpak-nff", "role": "patch-panel", "role_name": "Patch Panel", "site": "North Foley Field Gas Regulator", "status": "active", "device_type": "xPAK 6-Port SC/APC"}, {"id": 65, "name": "xpak-pals", "role": "patch-panel", "role_name": "Patch Panel", "site": "Peachtree Lift Station", "status": "active", "device_type": "xPAK 6-Port SC/APC"}, {"id": 69, "name": "xpak-rols", "role": "patch-panel", "role_name": "Patch Panel", "site": "River Oaks Lift Station", "status": "active", "device_type": "xPAK 6-Port SC/APC"}, {"id": 70, "name": "xpak-spls", "role": "patch-panel", "role_name": "Patch Panel", "site": "South Pointe Lift Station", "status": "active", "device_type": "xPAK 6-Port SC/APC"}, {"id": 73, "name": "xpak-vhls", "role": "patch-panel", "role_name": "Patch Panel", "site": "Villages at Hickory Lift Station", "status": "active", "device_type": "xPAK 6-Port SC/APC"}], "edges": [{"a": 7, "a_port": "4", "a_vlan": {"mode": null, "untagged": null, "tagged": []}, "b": 13, "b_port": "9", "b_vlan": {"mode": null, "untagged": null, "tagged": []}}, {"a": 41, "a_port": "Gi1/10", "a_vlan": {"mode": null, "untagged": null, "tagged": []}, "b": 63, "b_port": "P2:6", "b_vlan": null}, {"a": 63, "a_port": "P2:8", "a_vlan": null, "b": 3, "b_port": "55", "b_vlan": null}, {"a": 1, "a_port": "E3", "a_vlan": {"mode": null, "untagged": null, "tagged": []}, "b": 3, "b_port": "51", "b_vlan": null}, {"a": 19, "a_port": "10", "a_vlan": {"mode": null, "untagged": null, "tagged": []}, "b": 50, "b_port": "2", "b_vlan": null}, {"a": 14, "a_port": "10", "a_vlan": {"mode": null, "untagged": null, "tagged": []}, "b": 52, "b_port": "2", "b_vlan": null}, {"a": 20, "a_port": "9", "a_vlan": {"mode": null, "untagged": null, "tagged": []}, "b": 55, "b_port": "1", "b_vlan": null}, {"a": 10, "a_port": "9", "a_vlan": {"mode": null, "untagged": null, "tagged": []}, "b": 56, "b_port": "1", "b_vlan": null}, {"a": 25, "a_port": "9", "a_vlan": {"mode": null, "untagged": null, "tagged": []}, "b": 60, "b_port": "1", "b_vlan": null}, {"a": 23, "a_port": "10", "a_vlan": {"mode": null, "untagged": null, "tagged": []}, "b": 59, "b_port": "2", "b_vlan": null}, {"a": 26, "a_port": "10", "a_vlan": {"mode": null, "untagged": null, "tagged": []}, "b": 61, "b_port": "2", "b_vlan": null}, {"a": 9, "a_port": "10", "a_vlan": {"mode": null, "untagged": null, "tagged": []}, "b": 65, "b_port": "2", "b_vlan": null}, {"a": 21, "a_port": "10", "a_vlan": {"mode": null, "untagged": null, "tagged": []}, "b": 69, "b_port": "2", "b_vlan": null}, {"a": 24, "a_port": "9", "a_vlan": {"mode": null, "untagged": null, "tagged": []}, "b": 70, "b_port": "1", "b_vlan": null}, {"a": 22, "a_port": "10", "a_vlan": {"mode": null, "untagged": null, "tagged": []}, "b": 73, "b_port": "2", "b_vlan": null}, {"a": 52, "a_port": "2", "a_vlan": null, "b": 50, "b_port": "1", "b_vlan": null}, {"a": 50, "a_port": "2", "a_vlan": null, "b": 69, "b_port": "1", "b_vlan": null}, {"a": 69, "a_port": "2", "a_vlan": null, "b": 73, "b_port": "1", "b_vlan": null}, {"a": 73, "a_port": "2", "a_vlan": null, "b": 59, "b_port": "1", "b_vlan": null}, {"a": 59, "a_port": "2", "a_vlan": null, "b": 61, "b_port": "1", "b_vlan": null}, {"a": 61, "a_port": "2", "a_vlan": null, "b": 55, "b_port": "1", "b_vlan": null}, {"a": 65, "a_port": "2", "a_vlan": null, "b": 56, "b_port": "1", "b_vlan": null}, {"a": 33, "a_port": "10", "a_vlan": {"mode": null, "untagged": null, "tagged": []}, "b": 51, "b_port": "2", "b_vlan": null}, {"a": 34, "a_port": "10", "a_vlan": {"mode": null, "untagged": null, "tagged": []}, "b": 53, "b_port": "2", "b_vlan": null}, {"a": 17, "a_port": "10", "a_vlan": {"mode": null, "untagged": null, "tagged": []}, "b": 72, "b_port": "2", "b_vlan": null}, {"a": 28, "a_port": "9", "a_vlan": {"mode": null, "untagged": null, "tagged": []}, "b": 71, "b_port": "1", "b_vlan": null}, {"a": 18, "a_port": "10", "a_vlan": {"mode": null, "untagged": null, "tagged": []}, "b": 74, "b_port": "2", "b_vlan": null}, {"a": 15, "a_port": "9", "a_vlan": {"mode": null, "untagged": null, "tagged": []}, "b": 54, "b_port": "1", "b_vlan": null}, {"a": 32, "a_port": "9", "a_vlan": {"mode": null, "untagged": null, "tagged": []}, "b": 64, "b_port": "1", "b_vlan": null}, {"a": 16, "a_port": "10", "a_vlan": {"mode": null, "untagged": null, "tagged": []}, "b": 66, "b_port": "2", "b_vlan": null}, {"a": 30, "a_port": "9", "a_vlan": {"mode": null, "untagged": null, "tagged": []}, "b": 68, "b_port": "1", "b_vlan": null}, {"a": 31, "a_port": "9", "a_vlan": {"mode": null, "untagged": null, "tagged": []}, "b": 67, "b_port": "1", "b_vlan": null}, {"a": 7, "a_port": "11", "a_vlan": {"mode": null, "untagged": null, "tagged": []}, "b": 67, "b_port": "1", "b_vlan": null}, {"a": 7, "a_port": "1", "a_vlan": {"mode": null, "untagged": null, "tagged": []}, "b": 68, "b_port": "1", "b_vlan": null}, {"a": 66, "a_port": "2", "a_vlan": null, "b": 72, "b_port": "1", "b_vlan": null}, {"a": 72, "a_port": "2", "a_vlan": null, "b": 74, "b_port": "1", "b_vlan": null}, {"a": 74, "a_port": "2", "a_vlan": null, "b": 71, "b_port": "1", "b_vlan": null}, {"a": 51, "a_port": "2", "a_vlan": null, "b": 53, "b_port": "1", "b_vlan": null}, {"a": 1, "a_port": "E12", "a_vlan": {"mode": null, "untagged": null, "tagged": []}, "b": 2, "b_port": "7", "b_vlan": null}, {"a": 1, "a_port": "E2", "a_vlan": {"mode": null, "untagged": null, "tagged": []}, "b": 4, "b_port": "10", "b_vlan": null}, {"a": 4, "a_port": "31", "a_vlan": null, "b": 64, "b_port": "1", "b_vlan": null}, {"a": 4, "a_port": "27", "a_vlan": null, "b": 12, "b_port": "9", "b_vlan": {"mode": null, "untagged": null, "tagged": []}}, {"a": 76, "a_port": "6", "a_vlan": null, "b": 36, "b_port": "10", "b_vlan": {"mode": null, "untagged": null, "tagged": []}}, {"a": 4, "a_port": "12", "a_vlan": null, "b": 76, "b_port": "5", "b_vlan": null}, {"a": 76, "a_port": "8", "a_vlan": null, "b": 83, "b_port": "3", "b_vlan": null}, {"a": 83, "a_port": "4", "a_vlan": null, "b": 37, "b_port": "10", "b_vlan": {"mode": null, "untagged": null, "tagged": []}}, {"a": 83, "a_port": "6", "a_vlan": null, "b": 81, "b_port": "12", "b_vlan": null}, {"a": 81, "a_port": "10", "a_vlan": null, "b": 8, "b_port": "9", "b_vlan": {"mode": null, "untagged": null, "tagged": []}}, {"a": 2, "a_port": "49", "a_vlan": null, "b": 70, "b_port": "1", "b_vlan": null}, {"a": 2, "a_port": "3", "a_vlan": null, "b": 60, "b_port": "1", "b_vlan": null}, {"a": 85, "a_port": "2", "a_vlan": null, "b": 40, "b_port": "Gi1/10", "b_vlan": {"mode": null, "untagged": null, "tagged": []}}, {"a": 2, "a_port": "15", "a_vlan": null, "b": 85, "b_port": "1", "b_vlan": null}, {"a": 85, "a_port": "2", "a_vlan": null, "b": 82, "b_port": "3", "b_vlan": null}, {"a": 82, "a_port": "6", "a_vlan": null, "b": 39, "b_port": "10", "b_vlan": {"mode": null, "untagged": null, "tagged": []}}, {"a": 82, "a_port": "6", "a_vlan": null, "b": 58, "b_port": "1", "b_vlan": null}, {"a": 58, "a_port": "1", "a_vlan": null, "b": 43, "b_port": "Gi1/9", "b_vlan": {"mode": null, "untagged": null, "tagged": []}}, {"a": 2, "a_port": "4", "a_vlan": null, "b": 52, "b_port": "1", "b_vlan": null}, {"a": 3, "a_port": "96", "a_vlan": null, "b": 54, "b_port": "1", "b_vlan": null}, {"a": 3, "a_port": "1", "a_vlan": null, "b": 66, "b_port": "1", "b_vlan": null}, {"a": 3, "a_port": "53", "a_vlan": null, "b": 62, "b_port": "1", "b_vlan": null}, {"a": 62, "a_port": "1", "a_vlan": null, "b": 11, "b_port": "9", "b_vlan": {"mode": null, "untagged": null, "tagged": []}}, {"a": 3, "a_port": "51", "a_vlan": null, "b": 65, "b_port": "1", "b_vlan": null}, {"a": 2, "a_port": "14", "a_vlan": null, "b": 79, "b_port": "5", "b_vlan": null}, {"a": 79, "a_port": "4", "a_vlan": null, "b": 29, "b_port": "10", "b_vlan": {"mode": null, "untagged": null, "tagged": []}}, {"a": 79, "a_port": "4", "a_vlan": null, "b": 51, "b_port": "1", "b_vlan": null}, {"a": 82, "a_port": "1", "a_vlan": null, "b": 27, "b_port": "9", "b_vlan": {"mode": null, "untagged": null, "tagged": []}}, {"a": 79, "a_port": "6", "a_vlan": null, "b": 87, "b_port": "10", "b_vlan": {"mode": null, "untagged": null, "tagged": []}}, {"a": 80, "a_port": "4", "a_vlan": null, "b": 88, "b_port": "10", "b_vlan": {"mode": null, "untagged": null, "tagged": []}}, {"a": 79, "a_port": "6", "a_vlan": null, "b": 80, "b_port": "3", "b_vlan": null}, {"a": 80, "a_port": "2", "a_vlan": null, "b": 82, "b_port": "1", "b_vlan": null}, {"a": 82, "a_port": "2", "a_vlan": null, "b": 89, "b_port": "9", "b_vlan": {"mode": null, "untagged": null, "tagged": []}}, {"a": 53, "a_port": "2", "a_vlan": null, "b": 80, "b_port": "1", "b_vlan": null}, {"a": 80, "a_port": "2", "a_vlan": null, "b": 49, "b_port": "10", "b_vlan": {"mode": null, "untagged": null, "tagged": []}}, {"a": 81, "a_port": "12", "a_vlan": null, "b": 38, "b_port": "Gi1/9", "b_vlan": {"mode": null, "untagged": null, "tagged": []}}, {"a": 2, "a_port": "7", "a_vlan": null, "b": 91, "b_port": "1", "b_vlan": null}, {"a": 90, "a_port": "9", "a_vlan": {"mode": null, "untagged": null, "tagged": []}, "b": 91, "b_port": "1", "b_vlan": null}, {"a": 42, "a_port": "Gi1/10", "a_vlan": {"mode": null, "untagged": null, "tagged": []}, "b": 57, "b_port": "2", "b_vlan": null}, {"a": 57, "a_port": "1", "a_vlan": null, "b": 63, "b_port": "P2:6", "b_vlan": null}, {"a": 57, "a_port": "2", "a_vlan": null, "b": 92, "b_port": "1", "b_vlan": null}, {"a": 93, "a_port": "Gi1/9", "a_vlan": {"mode": null, "untagged": null, "tagged": []}, "b": 92, "b_port": "1", "b_vlan": null}], "vlans": []}