{"id":10273,"date":"2026-08-15T01:03:31","date_gmt":"2026-08-14T23:03:31","guid":{"rendered":"https:\/\/www.lukaswojcik.com\/blog\/narzedzia\/unifi-zone-matrix-planner\/"},"modified":"2026-08-15T01:03:31","modified_gmt":"2026-08-14T23:03:31","slug":"unifi-zone-matrix-planner","status":"publish","type":"page","link":"https:\/\/www.lukaswojcik.com\/blog\/pl\/narzedzia\/unifi-zone-matrix-planner\/","title":{"rendered":"Planer macierzy stref UniFi"},"content":{"rendered":"<div class=\"gtm-analyser-container\" style=\"background: var(--bg-panel, #1e1e24); padding: 25px; border-radius: 8px; border: 1px solid var(--border, #2a2a35);\">\n<p style=\"color: var(--text-secondary, #a0a0b0); margin-bottom: 20px;\">Macierz stref czyta si\u0119 \u0142atwiej ni\u017c list\u0119 regu\u0142, bo pokazuje r\u00f3wnie\u017c to, czego brakuje. Nazwa\u0107 strefy, ustawi\u0107 ka\u017cdy kierunek i powstaje lista regu\u0142 wraz z otwarciami, kt\u00f3re po cichu znosz\u0105 rozdzielenie.<\/p>\n<p>    <label for=\"uz-zonen\" style=\"color: var(--text-secondary, #a0a0b0); display: block; font-size: 0.85rem; margin-bottom: 5px;\">Strefy, rozdzielone przecinkami<\/label><br \/>\n    <input type=\"text\" id=\"uz-zonen\" class=\"form-control\" style=\"width: 100%; padding: 10px; background: var(--bg-body, #14141a); border: 1px solid var(--border, #2a2a35); color: var(--text-primary, #e8e8ee); border-radius: 6px; font-family: monospace; box-sizing: border-box;\" value=\"Intern, IoT, Gast, Kameras, VPN, Extern\"><\/p>\n<div style=\"display: flex; gap: 10px; flex-wrap: wrap; margin: 15px 0 0;\">\n        <button id=\"uz-matrix\" class=\"button\" type=\"button\" style=\"background: transparent; color: var(--text-primary, #e8e8ee); border: 1px solid var(--border, #2a2a35); padding: 10px 18px; border-radius: 6px; font-weight: 700; cursor: pointer;\">Zbuduj macierz od nowa<\/button><br \/>\n        <button id=\"uz-btn\" class=\"button\" style=\"background: var(--accent, #7ee787); color: #0b1114; border: none; padding: 12px 24px; border-radius: 6px; font-weight: 700; cursor: pointer;\">Wyprowad\u017a regu\u0142y<\/button>\n    <\/div>\n<div id=\"uz-gitter\" style=\"margin-top: 20px; overflow-x: auto;\"><\/div>\n<div id=\"uz-ergebnis\" style=\"margin-top: 22px;\"><\/div>\n<\/div>\n<p><script>\n(function () {\n    'use strict';<\/p>\n<p>    const T = {\"einleitung\":\"Macierz stref czyta si\u0119 \u0142atwiej ni\u017c list\u0119 regu\u0142, bo pokazuje r\u00f3wnie\u017c to, czego brakuje. Nazwa\u0107 strefy, ustawi\u0107 ka\u017cdy kierunek i powstaje lista regu\u0142 wraz z otwarciami, kt\u00f3re po cichu znosz\u0105 rozdzielenie.\",\"label_zonen\":\"Strefy, rozdzielone przecinkami\",\"knopf\":\"Wyprowad\u017a regu\u0142y\",\"knopf_matrix\":\"Zbuduj macierz od nowa\",\"matrix_ecke\":\"z \u2192 do\",\"matrix_erklaerung\":\"Ka\u017cda kom\u00f3rka odpowiada kierunkowi z wiersza do kolumny. Odpowiedzi na dozwolone po\u0142\u0105czenie zawsze wracaj\u0105; osobna regu\u0142a jest potrzebna tylko wtedy, gdy druga strona sama otwiera po\u0142\u0105czenie.\",\"zustand_gesperrt\":\"zablokowane\",\"zustand_antwort\":\"tylko odpowiedzi\",\"zustand_erlaubt\":\"dozwolone\",\"fehler_zonen\":\"Potrzebne s\u0105 co najmniej dwie strefy.\",\"fehler_zuviele\":\"Powy\u017cej dwunastu stref macierz staje si\u0119 nieczytelna.\",\"fehler_doppelt\":\"Strefa %s wyst\u0119puje dwukrotnie.\",\"h_regeln\":\"Wynikaj\u0105ce z tego regu\u0142y\",\"h_befunde\":\"Ustalenia\",\"keine_regeln\":\"Ka\u017cdy kierunek jest zablokowany, nie zostaje wi\u0119c \u017caden ruch.\",\"regel_text\":\"zezw\u00f3l %v \u2192 %n\",\"zusammenfassung\":\"%e kierunk\u00f3w dozwolonych, %a ograniczonych do odpowiedzi, %g zablokowanych.\",\"b_iot_intern\":\"%v mo\u017ce si\u0119gn\u0105\u0107 do %n. Przej\u0119te gniazdko stoi wtedy po\u015brodku zaufanej sieci - to w\u0142a\u015bnie kierunek, kt\u00f3ry zwykle musi pozosta\u0107 zamkni\u0119ty.\",\"b_gast_intern\":\"%v mo\u017ce si\u0119gn\u0105\u0107 do %n. Dost\u0119p go\u015bcia do sieci wewn\u0119trznej znosi sens sieci go\u015bcinnej.\",\"b_kamera_extern\":\"%v ma wyj\u015bcie do internetu. Kamery dzwoni\u0105 do domu, a w\u0142a\u015bnie tego ruchu ma unika\u0107 lokalny rejestrator.\",\"b_iot_extern\":\"%v wychodzi do internetu. Wiele urz\u0105dze\u0144 potrzebuje tego wy\u0142\u0105cznie dla swojej chmury, a lokalna integracja zwykle to zast\u0119puje.\",\"b_intern_iot_gesperrt\":\"%v nie dosi\u0119ga %n. To odcina tak\u017ce aplikacj\u0119 w telefonie - sterowanie ze strony zaufanej zwykle pozostaje otwarte.\",\"b_ohne_intern\":\"\u017badna strefa nie czyta si\u0119 jako sie\u0107 wewn\u0119trzna. Ustalenia o segmentacji dzia\u0142aj\u0105 dopiero przy rozpoznawalnej nazwie.\",\"b_ohne_extern\":\"\u017badna strefa nie czyta si\u0119 jako internet. Bez niej nie da si\u0119 nic powiedzie\u0107 o ruchu wychodz\u0105cym.\",\"b_ganz_dicht\":\"%v nie si\u0119ga w og\u00f3le nigdzie, nawet do rozwi\u0105zywania nazw. Co\u015b w \u015brodku przestanie dzia\u0142a\u0107.\",\"b_zustand\":\"Zapora dzia\u0142a stanowo: to, co dozwolone w jedn\u0105 stron\u0119, samo niesie odpowiedzi z powrotem. Druga regu\u0142a jest potrzebna tylko wtedy, gdy druga strona otwiera po\u0142\u0105czenie.\",\"b_dns\":\"Nawet szczelnie zamkni\u0119ta strefa potrzebuje rozwi\u0105zywania nazw. W\u0105ska regu\u0142a do w\u0142asnego resolvera nale\u017cy do ka\u017cdej strefy, inaczej urz\u0105dzenia przejd\u0105 na resolvery publiczne albo przestan\u0105 dzia\u0142a\u0107.\",\"b_reihenfolge\":\"W macierzy stref rozstrzyga para stref, a nie pozycja na li\u015bcie. Przenosz\u0105c stary zestaw regu\u0142, trzeba sprawdzi\u0107 pojedynczo te zale\u017cne od kolejno\u015bci.\"};<\/p>\n<p>    \/\/ --- reine Rechenlogik ---<\/p>\n<p>    const ZUSTAENDE = ['gesperrt', 'antwort', 'erlaubt'];<\/p>\n<p>    function zonenLesen(text) {\n        return String(text === undefined || text === null ? '' : text)\n            .split(\/[,;\\n]+\/)\n            .map(function (z) { return z.trim(); })\n            .filter(function (z) { return z !== ''; });\n    }<\/p>\n<p>    function art(name) {\n        \/\/ Die Art der Zone wird am Namen erkannt, damit die Hinweise auch bei\n        \/\/ eigenen Bezeichnungen greifen.\n        const n = String(name).toLowerCase();\n        if (\/(extern|internet|wan|external)\/.test(n)) { return 'extern'; }\n        if (\/(iot|smart|geraet|ger\u00e4t|device)\/.test(n)) { return 'iot'; }\n        if (\/(gast|guest)\/.test(n)) { return 'gast'; }\n        if (\/(kamera|camera|cctv|nvr)\/.test(n)) { return 'kamera'; }\n        if (\/(vpn|wireguard|tailscale)\/.test(n)) { return 'vpn'; }\n        if (\/(dmz|server)\/.test(n)) { return 'dmz'; }\n        if (\/(intern|lan|trusted|vertrauen)\/.test(n)) { return 'intern'; }\n        return 'sonstige';\n    }<\/p>\n<p>    function auswerten(zonenText, richtlinien) {\n        const ergebnis = { ok: false, fehler: '', zonen: [], regeln: [], befunde: [], zaehler: { erlaubt: 0, antwort: 0, gesperrt: 0 } };\n        const zonen = zonenLesen(zonenText);<\/p>\n<p>        if (zonen.length < 2) { ergebnis.fehler = T.fehler_zonen; return ergebnis; }\n        if (zonen.length > 12) { ergebnis.fehler = T.fehler_zuviele; return ergebnis; }<\/p>\n<p>        const gesehen = {};\n        for (let i = 0; i < zonen.length; i++) {\n            const schluessel = zonen[i].toLowerCase();\n            if (gesehen[schluessel]) { ergebnis.fehler = T.fehler_doppelt.replace('%s', zonen[i]); return ergebnis; }\n            gesehen[schluessel] = true;\n        }\n\n        ergebnis.zonen = zonen.map(function (z) { return { name: z, art: art(z) }; });\n\n        const stand = richtlinien || {};\n        function zustand(von, nach) {\n            const zeile = stand[von] || {};\n            const wert = zeile[nach];\n            return ZUSTAENDE.indexOf(wert) !== -1 ? wert : 'gesperrt';\n        }\n\n        ergebnis.zonen.forEach(function (von) {\n            ergebnis.zonen.forEach(function (nach) {\n                if (von.name === nach.name) { return; }\n                const z = zustand(von.name, nach.name);\n                ergebnis.zaehler[z]++;\n                if (z !== 'gesperrt') {\n                    ergebnis.regeln.push({\n                        von: von.name, nach: nach.name, zustand: z,\n                        text: T.regel_text.replace('%v', von.name).replace('%n', nach.name)\n                            + (z === 'antwort' ? ' (' + T.zustand_antwort + ')' : '')\n                    });\n                }\n            });\n        });\n\n        \/\/ --- Befunde ---\n        function findeArt(kennung) {\n            return ergebnis.zonen.filter(function (z) { return z.art === kennung; });\n        }\n        const intern = findeArt('intern');\n        const iot = findeArt('iot');\n        const gast = findeArt('gast');\n        const kamera = findeArt('kamera');\n        const extern = findeArt('extern');\n\n        iot.forEach(function (q) {\n            intern.forEach(function (z) {\n                if (zustand(q.name, z.name) === 'erlaubt') {\n                    ergebnis.befunde.push({ schwer: true, text: T.b_iot_intern.replace('%v', q.name).replace('%n', z.name) });\n                }\n            });\n        });\n        gast.forEach(function (q) {\n            intern.forEach(function (z) {\n                if (zustand(q.name, z.name) === 'erlaubt') {\n                    ergebnis.befunde.push({ schwer: true, text: T.b_gast_intern.replace('%v', q.name).replace('%n', z.name) });\n                }\n            });\n        });\n        kamera.forEach(function (q) {\n            extern.forEach(function (z) {\n                if (zustand(q.name, z.name) === 'erlaubt') {\n                    ergebnis.befunde.push({ schwer: true, text: T.b_kamera_extern.replace('%v', q.name) });\n                }\n            });\n        });\n        iot.forEach(function (q) {\n            extern.forEach(function (z) {\n                if (zustand(q.name, z.name) === 'erlaubt') {\n                    ergebnis.befunde.push({ schwer: false, text: T.b_iot_extern.replace('%v', q.name) });\n                }\n            });\n        });\n        intern.forEach(function (q) {\n            iot.forEach(function (z) {\n                if (zustand(q.name, z.name) === 'gesperrt') {\n                    ergebnis.befunde.push({ schwer: true, text: T.b_intern_iot_gesperrt.replace('%v', q.name).replace('%n', z.name) });\n                }\n            });\n        });\n\n        if (!intern.length) { ergebnis.befunde.push({ schwer: false, text: T.b_ohne_intern }); }\n        if (!extern.length) { ergebnis.befunde.push({ schwer: false, text: T.b_ohne_extern }); }\n\n        const gesperrteZonen = ergebnis.zonen.filter(function (z) {\n            return ergebnis.zonen.every(function (andere) {\n                return andere.name === z.name || zustand(z.name, andere.name) === 'gesperrt';\n            });\n        });\n        gesperrteZonen.forEach(function (z) {\n            if (z.art !== 'extern') {\n                ergebnis.befunde.push({ schwer: false, text: T.b_ganz_dicht.replace('%v', z.name) });\n            }\n        });\n\n        ergebnis.befunde.push({ schwer: false, text: T.b_zustand });\n        ergebnis.befunde.push({ schwer: false, text: T.b_dns });\n        ergebnis.befunde.push({ schwer: false, text: T.b_reihenfolge });\n\n        ergebnis.ok = true;\n        return ergebnis;\n    }\n\n    function voreinstellung(zonen) {\n        \/\/ Ein brauchbarer Ausgangspunkt: nach aussen erlaubt, nach innen dicht.\n        const stand = {};\n        zonen.forEach(function (von) {\n            stand[von.name] = {};\n            zonen.forEach(function (nach) {\n                if (von.name === nach.name) { return; }\n                let wert = 'gesperrt';\n                if (nach.art === 'extern' &#038;&#038; von.art !== 'kamera') { wert = 'erlaubt'; }\n                if (von.art === 'intern' &#038;&#038; nach.art !== 'extern') { wert = 'erlaubt'; }\n                if (von.art === 'vpn' &#038;&#038; nach.art === 'intern') { wert = 'erlaubt'; }\n                if (von.art === 'kamera' &#038;&#038; nach.art === 'extern') { wert = 'gesperrt'; }\n                stand[von.name][nach.name] = wert;\n            });\n        });\n        return stand;\n    }\n\n    if (typeof window !== 'undefined') {\n        window.LW_TEST = window.LW_TEST || {};\n        window.LW_TEST.UZ = { auswerten: auswerten, zonenLesen: zonenLesen, art: art, voreinstellung: voreinstellung };\n    }\n\n    \/\/ --- Anbindung an das Dokument ---\n\n    const btn = document.getElementById('uz-btn');\n    const matrixBtn = document.getElementById('uz-matrix');\n    const gitter = document.getElementById('uz-gitter');\n    const out = document.getElementById('uz-ergebnis');\n    const zonenFeld = document.getElementById('uz-zonen');\n    if (!btn || !matrixBtn || !gitter || !out || !zonenFeld) { return; }\n\n    const KASTEN = 'background: var(--bg-body, #14141a); border: 1px solid var(--border, #2a2a35); border-radius: 6px; padding: 14px; margin-bottom: 18px;';\n    const UEBERSCHRIFT = 'color: var(--text-primary, #e8e8ee); font-weight: 700; margin-bottom: 8px;';\n\n    function el(tag, css, inhalt) {\n        const knoten = document.createElement(tag);\n        if (css) { knoten.setAttribute('style', css); }\n        if (inhalt !== undefined &#038;&#038; inhalt !== null) { knoten.textContent = inhalt; }\n        return knoten;\n    }\n\n    function gitterBauen() {\n        const namen = zonenLesen(zonenFeld.value);\n        gitter.textContent = '';\n        if (namen.length < 2) {\n            gitter.appendChild(el('div', 'color: #ffb86c;', T.fehler_zonen));\n            return;\n        }\n        const zonen = namen.map(function (z) { return { name: z, art: art(z) }; });\n        const stand = voreinstellung(zonen);\n\n        const tabelle = el('table', 'border-collapse: collapse; min-width: 100%;');\n        const kopf = el('tr', '');\n        kopf.appendChild(el('th', 'padding: 8px; color: var(--text-secondary, #a0a0b0); font-size: 0.78rem; text-align: left; white-space: nowrap;', T.matrix_ecke));\n        zonen.forEach(function (z) {\n            kopf.appendChild(el('th', 'padding: 8px; color: var(--text-secondary, #a0a0b0); font-size: 0.78rem; white-space: nowrap;', z.name));\n        });\n        tabelle.appendChild(kopf);\n\n        zonen.forEach(function (von) {\n            const zeile = el('tr', '');\n            zeile.appendChild(el('td', 'padding: 8px; color: var(--text-primary, #e8e8ee); font-size: 0.82rem; white-space: nowrap; border-top: 1px solid var(--border, #2a2a35);', von.name));\n            zonen.forEach(function (nach) {\n                const zelle = el('td', 'padding: 4px; border-top: 1px solid var(--border, #2a2a35); text-align: center;');\n                if (von.name === nach.name) {\n                    zelle.appendChild(el('span', 'color: var(--border, #2a2a35);', '-'));\n                } else {\n                    const auswahl = document.createElement('select');\n                    auswahl.setAttribute('data-von', von.name);\n                    auswahl.setAttribute('data-nach', nach.name);\n                    auswahl.setAttribute('style', 'padding: 5px; background: var(--bg-panel, #1e1e24); border: 1px solid var(--border, #2a2a35); color: var(--text-primary, #e8e8ee); border-radius: 5px; font-family: monospace; font-size: 0.75rem;');\n                    ZUSTAENDE.forEach(function (z) {\n                        const option = document.createElement('option');\n                        option.value = z;\n                        option.textContent = T['zustand_' + z];\n                        auswahl.appendChild(option);\n                    });\n                    auswahl.value = stand[von.name][nach.name];\n                    zelle.appendChild(auswahl);\n                }\n                zeile.appendChild(zelle);\n            });\n            tabelle.appendChild(zeile);\n        });\n\n        gitter.appendChild(el('div', 'color: var(--text-secondary, #a0a0b0); font-size: 0.82rem; margin-bottom: 8px;', T.matrix_erklaerung));\n        gitter.appendChild(tabelle);\n    }\n\n    function richtlinienLesen() {\n        const stand = {};\n        const felder = gitter.querySelectorAll('select[data-von]');\n        for (let i = 0; i < felder.length; i++) {\n            const von = felder[i].getAttribute('data-von');\n            const nach = felder[i].getAttribute('data-nach');\n            if (!stand[von]) { stand[von] = {}; }\n            stand[von][nach] = felder[i].value;\n        }\n        return stand;\n    }\n\n    matrixBtn.addEventListener('click', gitterBauen);\n\n    btn.addEventListener('click', function () {\n        if (!gitter.querySelector('select[data-von]')) { gitterBauen(); }\n        const erg = auswerten(zonenFeld.value, richtlinienLesen());\n\n        out.textContent = '';\n        if (!erg.ok) {\n            out.appendChild(el('div', 'background: var(--bg-body, #14141a); border: 1px solid var(--border, #2a2a35); border-left: 3px solid #ffb86c; color: var(--text-secondary, #a0a0b0); padding: 14px; border-radius: 6px;', erg.fehler));\n            return;\n        }\n\n        out.appendChild(el('div', UEBERSCHRIFT, T.h_regeln));\n        const kasten = el('div', KASTEN);\n        if (!erg.regeln.length) {\n            kasten.appendChild(el('div', 'color: var(--text-secondary, #a0a0b0);', T.keine_regeln));\n        }\n        erg.regeln.forEach(function (r, i) {\n            const z = el('div', 'display: flex; gap: 12px; align-items: baseline; padding: 5px 0; border-bottom: 1px solid var(--border, #2a2a35);');\n            z.appendChild(el('span', 'width: 28px; color: var(--text-secondary, #a0a0b0); font-family: monospace; font-size: 0.8rem;', String(i + 1)));\n            z.appendChild(el('span', 'flex: 1; color: var(--text-primary, #e8e8ee); font-family: monospace; font-size: 0.85rem;', r.text));\n            kasten.appendChild(z);\n        });\n        kasten.appendChild(el('div', 'color: var(--text-secondary, #a0a0b0); font-size: 0.85rem; padding-top: 10px;',\n            T.zusammenfassung.replace('%e', String(erg.zaehler.erlaubt)).replace('%a', String(erg.zaehler.antwort)).replace('%g', String(erg.zaehler.gesperrt))));\n        out.appendChild(kasten);\n\n        out.appendChild(el('div', UEBERSCHRIFT, T.h_befunde));\n        const befunde = el('div', KASTEN);\n        erg.befunde.forEach(function (b) {\n            const z = el('div', 'display: flex; gap: 10px; padding: 5px 0;');\n            z.appendChild(el('span', 'color: ' + (b.schwer ? '#ffb86c' : 'var(--text-secondary, #a0a0b0)') + '; font-family: monospace;', b.schwer ? '!' : '-'));\n            z.appendChild(el('span', 'color: var(--text-secondary, #a0a0b0); font-size: 0.9rem; line-height: 1.5;', b.text));\n            befunde.appendChild(z);\n        });\n        out.appendChild(befunde);\n    });\n\n    gitterBauen();\n})();\n<\/script><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Zamienia zestaw stref sieciowych w macierz polityk, wyprowadza z niej list\u0119 regu\u0142 i wskazuje otwarcia, kt\u00f3re znosz\u0105 segmentacj\u0119.<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":9284,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"template-tool-base.php","meta":{"footnotes":""},"tags":[92310,92328,92077],"class_list":["post-10273","page","type-page","status-publish","hentry","tag-networking-pl","tag-unifi-pl","tag-web-security-pl"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.1 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Planer macierzy stref UniFi - Lukas Wojcik - Blog<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.lukaswojcik.com\/blog\/pl\/narzedzia\/unifi-zone-matrix-planner\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Planer macierzy stref UniFi - Lukas Wojcik - Blog\" \/>\n<meta property=\"og:description\" content=\"Zamienia zestaw stref sieciowych w macierz polityk, wyprowadza z niej list\u0119 regu\u0142 i wskazuje otwarcia, kt\u00f3re znosz\u0105 segmentacj\u0119.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.lukaswojcik.com\/blog\/pl\/narzedzia\/unifi-zone-matrix-planner\/\" \/>\n<meta property=\"og:site_name\" content=\"Lukas Wojcik - Blog\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/08\/og-default.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"1200\" \/>\n\t<meta property=\"og:image:height\" content=\"630\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/narzedzia\\\/unifi-zone-matrix-planner\\\/\",\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/narzedzia\\\/unifi-zone-matrix-planner\\\/\",\"name\":\"Planer macierzy stref UniFi - Lukas Wojcik - Blog\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#website\"},\"datePublished\":\"2026-08-14T23:03:31+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/narzedzia\\\/unifi-zone-matrix-planner\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/narzedzia\\\/unifi-zone-matrix-planner\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/narzedzia\\\/unifi-zone-matrix-planner\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Toolbox\",\"item\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/toolbox-3\\\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Planer macierzy stref UniFi\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/\",\"name\":\"Lukas Wojcik - Blog\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#\\\/schema\\\/person\\\/895f7604f9b6b71aad9bba33af28d0f9\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#\\\/schema\\\/person\\\/895f7604f9b6b71aad9bba33af28d0f9\",\"name\":\"luky\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/lw-x2.jpg\",\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/lw-x2.jpg\",\"contentUrl\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/lw-x2.jpg\",\"width\":424,\"height\":636,\"caption\":\"luky\"},\"logo\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/lw-x2.jpg\"},\"sameAs\":[\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Planer macierzy stref UniFi - Lukas Wojcik - Blog","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.lukaswojcik.com\/blog\/pl\/narzedzia\/unifi-zone-matrix-planner\/","og_locale":"en_US","og_type":"article","og_title":"Planer macierzy stref UniFi - Lukas Wojcik - Blog","og_description":"Zamienia zestaw stref sieciowych w macierz polityk, wyprowadza z niej list\u0119 regu\u0142 i wskazuje otwarcia, kt\u00f3re znosz\u0105 segmentacj\u0119.","og_url":"https:\/\/www.lukaswojcik.com\/blog\/pl\/narzedzia\/unifi-zone-matrix-planner\/","og_site_name":"Lukas Wojcik - Blog","og_image":[{"width":1200,"height":630,"url":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/08\/og-default.jpg","type":"image\/jpeg"}],"twitter_card":"summary_large_image","schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.lukaswojcik.com\/blog\/pl\/narzedzia\/unifi-zone-matrix-planner\/","url":"https:\/\/www.lukaswojcik.com\/blog\/pl\/narzedzia\/unifi-zone-matrix-planner\/","name":"Planer macierzy stref UniFi - Lukas Wojcik - Blog","isPartOf":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/#website"},"datePublished":"2026-08-14T23:03:31+00:00","breadcrumb":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/pl\/narzedzia\/unifi-zone-matrix-planner\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.lukaswojcik.com\/blog\/pl\/narzedzia\/unifi-zone-matrix-planner\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.lukaswojcik.com\/blog\/pl\/narzedzia\/unifi-zone-matrix-planner\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.lukaswojcik.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Toolbox","item":"https:\/\/www.lukaswojcik.com\/blog\/toolbox-3\/"},{"@type":"ListItem","position":3,"name":"Planer macierzy stref UniFi"}]},{"@type":"WebSite","@id":"https:\/\/www.lukaswojcik.com\/blog\/#website","url":"https:\/\/www.lukaswojcik.com\/blog\/","name":"Lukas Wojcik - Blog","description":"","publisher":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/#\/schema\/person\/895f7604f9b6b71aad9bba33af28d0f9"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.lukaswojcik.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":["Person","Organization"],"@id":"https:\/\/www.lukaswojcik.com\/blog\/#\/schema\/person\/895f7604f9b6b71aad9bba33af28d0f9","name":"luky","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/07\/lw-x2.jpg","url":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/07\/lw-x2.jpg","contentUrl":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/07\/lw-x2.jpg","width":424,"height":636,"caption":"luky"},"logo":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/07\/lw-x2.jpg"},"sameAs":["https:\/\/www.lukaswojcik.com\/blog"]}]}},"_links":{"self":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/pages\/10273","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/comments?post=10273"}],"version-history":[{"count":0,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/pages\/10273\/revisions"}],"up":[{"embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/pages\/9284"}],"wp:attachment":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/media?parent=10273"}],"wp:term":[{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/tags?post=10273"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}