diff --git a/landing/app.js b/landing/app.js index 76c444834..be2110ca8 100644 --- a/landing/app.js +++ b/landing/app.js @@ -12,6 +12,13 @@ favicon.type = 'image/x-icon'; favicon.setAttribute('sizes', '16x16 32x32 48x48'); + if (!document.querySelector('link[href="smart-reporting.css"]')) { + const reportingStyles = document.createElement('link'); + reportingStyles.rel = 'stylesheet'; + reportingStyles.href = 'smart-reporting.css'; + document.head.appendChild(reportingStyles); + } + const brandStyle = document.createElement('style'); brandStyle.textContent = ` .brand-mark.brand-mark-app-icon { @@ -39,6 +46,119 @@ mark.classList.add('brand-mark-app-icon'); }); + const smartReportingHref = 'smart-reporting.html'; + const currentPage = window.location.pathname.split('/').pop() || 'index.html'; + + const setMeta = (selector, content) => { + const element = document.querySelector(selector); + if (element) element.setAttribute('content', content); + }; + + document.querySelectorAll('.nav-links').forEach(nav => { + let link = [...nav.querySelectorAll('a')].find(item => item.getAttribute('href') === smartReportingHref); + if (!link) { + link = document.createElement('a'); + link.href = smartReportingHref; + link.textContent = 'Smart Reporting'; + const overview = [...nav.querySelectorAll('a')].find(item => item.textContent.trim() === 'Overview'); + overview?.insertAdjacentElement('afterend', link); + } + if (currentPage === smartReportingHref) link?.setAttribute('aria-current', 'page'); + }); + + document.querySelectorAll('.footer-grid > div').forEach(column => { + const title = column.querySelector('.footer-title'); + const links = column.querySelector('.footer-links'); + if (!title || !links || title.textContent.trim() !== 'Product') return; + if ([...links.querySelectorAll('a')].some(item => item.getAttribute('href') === smartReportingHref)) return; + + const link = document.createElement('a'); + link.href = smartReportingHref; + link.textContent = 'Smart Reporting'; + const overview = [...links.querySelectorAll('a')].find(item => item.textContent.trim() === 'Overview'); + if (overview) overview.insertAdjacentElement('afterend', link); + else links.prepend(link); + }); + + const smartReportingSection = ` +
+
+
+
+ Smart Reporting +

Select the signals. ARSAS handles the report engineering.

+

Manual DataSet, BRCB, URCB, GI, and fallback configuration can delay the first useful value. ARSAS treats reporting as an automatic acquisition strategy—not a prerequisite the engineer must configure by hand.

+
+
+
01
Immediate MMS image

Selected values begin reading while report setup is validated in the background.

+
02
Use existing BRCB or URCB

Configured DataSets and RCBs are discovered, ranked, and checked for exact usable coverage.

+
03
Repair exact gaps

Where the IED permits writes, ARSAS can create an association-scoped temporary DataSet and use a suitable available URCB/RCB.

+
04
Keep polling as the safety net

Empty DataSet, no usable RCB, rejected write, or unverified report change? Only those points remain in bounded MMS polling.

+
+
+ No report dead end. + Live values continue even when the IED reporting configuration is incomplete, unavailable, or behaves differently from its model. + Explore Smart Reporting → +
+
+
+
`; + + if (currentPage === 'index.html') { + setMeta('meta[name="description"]', 'ARSAS is an IEC 61850 workstation with Smart Reporting: static BRCB/URCB first, dynamic DataSet recovery where permitted, and bounded MMS polling fallback for easy live values.'); + setMeta('meta[property="og:description"]', 'Connect, select signals, and see live values. ARSAS combines static BRCB/URCB reporting, dynamic recovery, and bounded MMS polling fallback.'); + setMeta('meta[name="twitter:description"]', 'Smart IEC 61850 reporting without manual DataSet or RCB setup: static reports, dynamic recovery, and polling fallback in one workspace.'); + + const heroCopy = document.querySelector('.hero-copy'); + if (heroCopy) heroCopy.textContent = 'Connect an IED, select the signals, and see live values without manually engineering DataSets or Report Control Blocks. ARSAS Smart Reporting uses existing BRCB and URCB coverage first, creates dynamic coverage where the IED permits it, and keeps bounded MMS polling as a non-blocking fallback.'; + + const proof = document.querySelector('.hero-proof'); + if (proof) { + proof.replaceChildren(...[ + 'Smart Reporting without manual RCB setup', + 'Independent multi-IED sessions', + 'Live values are not blocked by report gaps' + ].map(text => { + const span = document.createElement('span'); + span.textContent = text; + return span; + })); + } + + const chipOne = document.querySelector('.floating-chip.one'); + const chipTwo = document.querySelector('.floating-chip.two'); + if (chipOne) chipOne.innerHTML = ' Static → dynamic → polling'; + if (chipTwo) chipTwo.innerHTML = ' Immediate live values'; + + const firstMetric = document.querySelector('.metrics .metric:first-child'); + if (firstMetric) firstMetric.innerHTML = 'Smart ReportingBRCB · URCB · dynamic DataSet · polling fallback'; + + const metrics = document.querySelector('.metrics'); + if (metrics && !document.querySelector('#smart-reporting')) metrics.insertAdjacentHTML('afterend', smartReportingSection); + + const reportCard = [...document.querySelectorAll('#capabilities .card')].find(card => card.querySelector('h3')?.textContent.trim() === 'Report-first acquisition'); + if (reportCard) reportCard.innerHTML = 'Available

Smart Reporting

Start live MMS values immediately, use configured BRCB/URCB coverage where proven, create dynamic recovery where permitted, and keep polling only for uncovered or unverified points.

'; + } + + if (currentPage === 'features.html') { + setMeta('meta[name="description"]', 'Explore ARSAS Smart Reporting: static BRCB/URCB monitoring, dynamic DataSet recovery where permitted, immediate MMS values, and bounded polling fallback alongside GOOSE, files, SMV, SCL, diagnostics, and control.'); + setMeta('meta[property="og:description"]', 'Smart Reporting combines static BRCB/URCB coverage, dynamic DataSet recovery, and bounded MMS polling fallback so live values are not blocked by report engineering.'); + + const reportCard = [...document.querySelectorAll('.card')].find(card => card.querySelector('h3')?.textContent.trim() === 'Report-first monitoring'); + if (reportCard) reportCard.innerHTML = 'Smart Reporting

Live values without report-engineering blockers

Start the selected MMS values immediately, prefer configured BRCB or URCB coverage, build dynamic recovery for exact gaps where permitted, and retain polling for anything still uncovered or unverified.

'; + + const acquisitionHead = [...document.querySelectorAll('.section-head')].find(head => head.querySelector('.kicker')?.textContent.trim() === 'Acquisition strategy'); + if (acquisitionHead) { + acquisitionHead.querySelector('h2').textContent = 'Static reports first. Dynamic recovery for gaps. Polling when required.'; + acquisitionHead.querySelector('p').textContent = 'ARSAS never treats a report candidate as proof of coverage. It validates exact membership and observed behavior, while selected live values continue through MMS and only proven report-covered points leave the fast polling queue.'; + const workflow = acquisitionHead.closest('.workflow'); + const pre = workflow?.querySelector('pre'); + if (pre) pre.innerHTML = '0. Start immediate MMS reads for the selected live values\n1. Discover and rank existing DataSets, BRCBs and URCBs\n2. Validate exact members, order and usable static coverage\n3. Create a temporary dynamic DataSet + available URCB/RCB for gaps*\n4. Keep uncovered or unverified points in bounded MMS polling\n5. Detect missed changes and restore fast polling fallback\n✓ Show value, quality, IED timestamp, reason and acquisition source\n\n* Dynamic writes are attempted only when the IED and approved workflow permit them.'; + const section = workflow?.closest('section'); + if (section && !section.querySelector('.reporting-fallback')) section.insertAdjacentHTML('beforeend', '
Empty DataSet or no usable RCB?Monitoring still continues through bounded polling instead of blocking the engineering workflow.Explore Smart Reporting →
'); + } + } + const toggle = document.querySelector('[data-menu-toggle]'); const links = document.querySelector('[data-nav-links]'); diff --git a/landing/sitemap.xml b/landing/sitemap.xml index 9a906f5ab..9d962d53f 100644 --- a/landing/sitemap.xml +++ b/landing/sitemap.xml @@ -6,6 +6,12 @@ weekly 1.0 + + https://masarray.github.io/arsas/smart-reporting.html + 2026-07-18 + monthly + 0.95 + https://masarray.github.io/arsas/features.html 2026-07-18 diff --git a/landing/smart-reporting.css b/landing/smart-reporting.css new file mode 100644 index 000000000..5d408f048 --- /dev/null +++ b/landing/smart-reporting.css @@ -0,0 +1,4 @@ +/* Smart Reporting — compact, engineering-first presentation */ +.smart-reporting-promo{padding-top:4.5rem}.smart-reporting-shell{padding:clamp(1.35rem,3vw,2.2rem);border:1px solid rgba(56,189,248,.22);border-radius:28px;background:radial-gradient(circle at 10% 0%,rgba(56,189,248,.13),transparent 22rem),radial-gradient(circle at 90% 100%,rgba(139,92,246,.1),transparent 22rem),rgba(255,255,255,.035);box-shadow:0 24px 70px rgba(0,0,0,.22)}.smart-reporting-shell .section-head{max-width:900px;margin-bottom:1.55rem}.reporting-lane{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));border:1px solid var(--line);border-radius:19px;overflow:hidden;background:rgba(4,13,25,.5)}.reporting-step{display:grid;grid-template-columns:auto 1fr;gap:.72rem;min-width:0;padding:1.05rem}.reporting-step+.reporting-step{border-left:1px solid var(--line)}.reporting-step-number{width:28px;height:28px;display:grid;place-items:center;border:1px solid rgba(56,189,248,.22);border-radius:9px;color:#dff6ff;background:rgba(56,189,248,.13);font-size:.7rem;font-weight:820}.reporting-step strong{display:block;font-size:.93rem;letter-spacing:-.015em}.reporting-step p{margin:.34rem 0 0;color:var(--subtle);font-size:.81rem;line-height:1.55}.reporting-fallback{display:flex;align-items:center;flex-wrap:wrap;gap:.55rem 1rem;margin-top:1rem;padding:.9rem 1rem;border:1px solid rgba(52,211,153,.18);border-radius:15px;background:rgba(52,211,153,.055)}.reporting-fallback strong{font-size:.92rem}.reporting-fallback span{flex:1 1 420px;color:var(--muted);font-size:.86rem}.reporting-fallback a{color:#9be7ff;font-size:.84rem;font-weight:720;text-decoration:none}.reporting-fallback a:hover{text-decoration:underline} +.reporting-page-hero{padding-bottom:4rem}.reporting-hero-grid{display:grid;grid-template-columns:1.02fr .98fr;gap:3rem;align-items:center}.reporting-page-hero h1{max-width:850px}.reporting-visual{margin:0;border:1px solid rgba(255,255,255,.16);border-radius:23px;overflow:hidden;background:rgba(255,255,255,.05);box-shadow:var(--shadow)}.reporting-visual img{display:block;width:100%}.reporting-visual figcaption{padding:.8rem 1rem;color:var(--subtle);font-size:.82rem}.scenario-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:.85rem}.scenario{padding:1.2rem;border:1px solid var(--line);border-radius:18px;background:rgba(255,255,255,.035)}.scenario-label{display:inline-flex;padding:.27rem .54rem;border:1px solid rgba(56,189,248,.2);border-radius:999px;color:#bcecff;background:rgba(56,189,248,.07);font-size:.68rem;font-weight:800;letter-spacing:.07em;text-transform:uppercase}.scenario h3{margin-top:.72rem;font-size:1.06rem}.scenario p{margin:.5rem 0 0;color:var(--muted);font-size:.88rem}.reporting-boundary{padding:1.7rem;border:1px solid rgba(56,189,248,.2);border-radius:23px;background:linear-gradient(135deg,rgba(59,130,246,.09),rgba(139,92,246,.06))}.reporting-boundary p{color:var(--muted);margin-bottom:0} +@media(max-width:980px){.reporting-hero-grid{grid-template-columns:1fr}.reporting-lane{grid-template-columns:repeat(2,minmax(0,1fr))}.reporting-step:nth-child(3){border-left:0;border-top:1px solid var(--line)}.reporting-step:nth-child(4){border-top:1px solid var(--line)}}@media(max-width:760px){.reporting-lane,.scenario-grid{grid-template-columns:1fr}.reporting-step+.reporting-step{border-left:0;border-top:1px solid var(--line)}.reporting-visual{border-radius:17px}} \ No newline at end of file diff --git a/landing/smart-reporting.html b/landing/smart-reporting.html new file mode 100644 index 000000000..bfaddcac7 --- /dev/null +++ b/landing/smart-reporting.html @@ -0,0 +1,126 @@ + + + + + + IEC 61850 Smart Reporting — BRCB, URCB & Polling | ARSAS + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+ + Available now · per IED · evidence-driven +

Select the signals.
ARSAS handles the report engineering.

+

IEC 61850 reporting is powerful, but manually checking DataSets, BRCBs, URCBs, trigger options, reservations, GI, and fallback behavior can delay FAT, SAT, and commissioning. ARSAS automates the acquisition path so engineers can reach trustworthy live values without first repairing every reporting configuration issue.

+ +
Configured BRCB and URCB supportDynamic recovery where permittedPolling remains available
+
+
ARSAS unified IEC 61850 live-value viewer for multiple IEDs
One live-value workspace whether each point comes from a configured report, temporary dynamic report, or bounded MMS polling.
+
+
+ +
+
+
Automatic acquisition path

Reporting is optimized per selected point—not treated as an all-or-nothing prerequisite.

ARSAS begins with live MMS values, proves report coverage, repairs exact gaps where allowed, and keeps fallback only where it is still required.

+
+
01
Immediate MMS image

Selected values begin reading while report setup is validated.

+
02
Configured reports first

Discover and validate exact DataSet membership for BRCBs and URCBs.

+
03
Dynamic gap recovery

Use an association-scoped temporary DataSet and suitable available URCB/RCB where permitted.

+
04
Bounded polling fallback

Poll only uncovered, rejected, unverified, or degraded points.

+
+
No report dead end.Empty DataSet, no usable RCB, rejected write, or missing report change does not block the live-value workflow.Explore all capabilities →
+
+
+ +
+
+
Failure-aware by design

The application does not trust a report merely because an RCB exists.

Coverage must be usable or observed. ARSAS retains MMS verification and can return a point to faster polling when report traffic misses an actual change.

+
+
Configured

Usable static BRCB or URCB

Use event-driven reporting while preserving DataSet order, reasons, sequence information, quality, and IED timestamps.

+
Incomplete

Partial or empty coverage

Attempt dynamic recovery for the exact uncovered selected points when the IED and approved workflow permit writes.

+
Unavailable

No usable RCB or write permission

Continue with bounded MMS polling rather than forcing the engineer into a separate configuration tool.

+
Degraded

A real change is missed

Verification detects the mismatch, records diagnostics, and restores polling until event delivery is proven again.

+
+
+
+ +
Engineering boundary

Automatic does not mean uncontrolled.

The engineer selects the required signals. Existing static reporting is preferred. Temporary dynamic changes are association-scoped and attempted only when enabled and supported. Rejections remain visible, cleanup is attempted where permitted by the IED, and polling remains the non-blocking fallback.

+
+ + + + + diff --git a/scripts/validate-landing.py b/scripts/validate-landing.py index c3e5ba3cc..6a2be53e1 100644 --- a/scripts/validate-landing.py +++ b/scripts/validate-landing.py @@ -16,6 +16,7 @@ CANONICAL_ROOT = "https://masarray.github.io/arsas/" HTML_FILES = [ SITE / "index.html", + SITE / "smart-reporting.html", SITE / "features.html", SITE / "control.html", SITE / "architecture.html", @@ -148,7 +149,7 @@ def validate_structured_files(errors: list[str]) -> None: sitemap = SITE / "sitemap.xml" if sitemap.exists(): sitemap_text = sitemap.read_text(encoding="utf-8") - for page in ("features.html", "control.html", "architecture.html", "roadmap.html"): + for page in ("smart-reporting.html", "features.html", "control.html", "architecture.html", "roadmap.html"): expected = f"{CANONICAL_ROOT}{page}" if expected not in sitemap_text: errors.append(f"landing/sitemap.xml: missing {expected}")