diff --git a/static/alarms.html b/static/alarms.html index e6adb1f..616a188 100644 --- a/static/alarms.html +++ b/static/alarms.html @@ -1,379 +1,379 @@ - - - - - - Force Monitor — Alarms - - - -
- - -
-
-
-
Force Monitor
-

Alarm Timeline

-
Advanced event view with filters, summary cards, active-only mode, CSV export, and auto-refresh.
-
-
-
- Status: idle - Last refresh: -- -
-
-
- - - -
-
Loaded events
0
Current filtered set
-
Active alarms
0
State = active
-
Critical
0
Severity critical
-
Warning
0
Severity warning
-
- -
-
- - - - - - - - -
-
- Tip: “active only” helps operators see what still matters right now. -
-
- -
- - - - - - - - - - - - - - - -
TimeSeveritySourceStateEventValueLimit
Loading alarms...
-
-
- - - - - + + + + + + Force Monitor — Alarms + + + +
+ + +
+
+
+
Force Monitor
+

Alarm Timeline

+
Advanced event view with filters, summary cards, active-only mode, CSV export, and auto-refresh.
+
+
+
+ Status: idle + Last refresh: -- +
+
+
+ + + +
+
Loaded events
0
Current filtered set
+
Active alarms
0
State = active
+
Critical
0
Severity critical
+
Warning
0
Severity warning
+
+ +
+
+ + + + + + + + +
+
+ Tip: “active only” helps operators see what still matters right now. +
+
+ +
+ + + + + + + + + + + + + + + +
TimeSeveritySourceStateEventValueLimit
Loading alarms...
+
+
+ + + + + diff --git a/static/app-common.js b/static/app-common.js index 67bb52b..c3eb44d 100644 --- a/static/app-common.js +++ b/static/app-common.js @@ -1,176 +1,176 @@ -(function(){ - const THEME_KEY = 'force-monitor-theme'; - const FULLSCREEN_INTENT_KEY = 'force-monitor-fullscreen-intent'; - - function byId(id){ return id ? document.getElementById(id) : null; } - - function getFullscreenIntent(){ - try { return sessionStorage.getItem(FULLSCREEN_INTENT_KEY) === '1'; } catch (_) { return false; } - } - - function setFullscreenIntent(enabled){ - try { sessionStorage.setItem(FULLSCREEN_INTENT_KEY, enabled ? '1' : '0'); } catch (_) {} - } - - function setTheme(theme, opts){ - opts = opts || {}; - const t = theme === 'light' ? 'light' : 'dark'; - document.body.setAttribute('data-theme', t); - try { localStorage.setItem(THEME_KEY, t); } catch (_) {} - const btn = byId(opts.buttonId || 'theme-toggle'); - if (btn) btn.textContent = t === 'light' ? 'Dark theme' : 'Light theme'; - if (typeof opts.onChange === 'function') opts.onChange(t); - return t; - } - - function initTheme(opts){ - opts = opts || {}; - let theme = 'dark'; - try { - const stored = localStorage.getItem(THEME_KEY); - if (stored === 'light' || stored === 'dark') theme = stored; - else if (window.matchMedia && window.matchMedia('(prefers-color-scheme: light)').matches) theme = 'light'; - } catch (_) {} - setTheme(theme, opts); - const btn = byId(opts.buttonId || 'theme-toggle'); - if (btn && !btn.dataset.themeBound) { - btn.dataset.themeBound = '1'; - btn.addEventListener('click', function(){ - setTheme(document.body.getAttribute('data-theme') === 'light' ? 'dark' : 'light', opts); - }); - } - return theme; - } - - function updateFullscreenButton(buttonId){ - const btn = byId(buttonId || 'fullscreen-toggle'); - if (!btn) return; - if (document.fullscreenElement) { - btn.textContent = 'Exit fullscreen'; - return; - } - btn.textContent = getFullscreenIntent() ? 'Restore fullscreen' : 'Enter fullscreen'; - } - - async function requestFullscreenSafe(){ - if (document.fullscreenElement) return true; - if (!document.fullscreenEnabled) return false; - try { - await document.documentElement.requestFullscreen(); - setFullscreenIntent(true); - return true; - } catch (err) { - console.warn('Fullscreen restore/request blocked:', err); - return false; - } - } - - async function toggleFullscreen(buttonId){ - try { - if (!document.fullscreenElement) { - await requestFullscreenSafe(); - } else { - setFullscreenIntent(false); - await document.exitFullscreen(); - } - } catch (err) { - console.warn('Fullscreen error:', err); - } finally { - updateFullscreenButton(buttonId || 'fullscreen-toggle'); - } - } - - function bindFullscreenNavPersistence(){ - if (document.documentElement.dataset.fsNavBound) return; - document.documentElement.dataset.fsNavBound = '1'; - - document.addEventListener('click', function(ev){ - const link = ev.target && ev.target.closest ? ev.target.closest('a[href]') : null; - if (!link) return; - const href = link.getAttribute('href') || ''; - const target = link.getAttribute('target') || ''; - if (!href || href.startsWith('#') || target === '_blank' || link.hasAttribute('download')) return; - try { - const url = new URL(link.href, window.location.href); - if (url.origin !== window.location.origin) return; - } catch (_) { - return; - } - if (document.fullscreenElement || getFullscreenIntent()) { - setFullscreenIntent(true); - } - }, true); - - window.addEventListener('pageshow', function(){ - document.querySelectorAll('#fullscreen-toggle, #fullscreen-btn').forEach(function(el){ - updateFullscreenButton(el.id); - }); - }); - } - - async function initFullscreen(opts){ - opts = opts || {}; - const buttonId = opts.buttonId || 'fullscreen-toggle'; - const btn = byId(buttonId); - if (btn && !btn.dataset.fsBound) { - btn.dataset.fsBound = '1'; - btn.addEventListener('click', function(){ toggleFullscreen(buttonId); }); - } - if (!document.documentElement.dataset.fsListenerBound) { - document.documentElement.dataset.fsListenerBound = '1'; - document.addEventListener('fullscreenchange', function(){ - setFullscreenIntent(!!document.fullscreenElement); - document.querySelectorAll('#fullscreen-toggle, #fullscreen-btn').forEach(function(el){ - updateFullscreenButton(el.id); - }); - }); - } - bindFullscreenNavPersistence(); - updateFullscreenButton(buttonId); - - if (getFullscreenIntent() && !document.fullscreenElement) { - // Best effort only: some browsers require a fresh user gesture after navigation. - requestAnimationFrame(function(){ - requestFullscreenSafe().finally(function(){ updateFullscreenButton(buttonId); }); - }); - } - } - - async function fetchJson(url, opts){ - opts = opts || {}; - const controller = new AbortController(); - const timeoutMs = opts.timeoutMs || 8000; - const timer = setTimeout(function(){ controller.abort(); }, timeoutMs); - try { - const res = await fetch(url, { - method: opts.method || 'GET', - headers: opts.headers || undefined, - body: opts.body, - cache: 'no-store', - signal: controller.signal - }); - let data = null; - try { data = await res.json(); } catch (_) { data = null; } - if (!res.ok) { - const err = new Error(data && data.error ? data.error : ('HTTP ' + res.status)); - err.response = res; - err.data = data; - throw err; - } - return data; - } finally { - clearTimeout(timer); - } - } - - window.AppUI = { - setTheme, - initTheme, - updateFullscreenButton, - toggleFullscreen, - initFullscreen, - fetchJson, - getFullscreenIntent, - setFullscreenIntent - }; -})(); +(function(){ + const THEME_KEY = 'force-monitor-theme'; + const FULLSCREEN_INTENT_KEY = 'force-monitor-fullscreen-intent'; + + function byId(id){ return id ? document.getElementById(id) : null; } + + function getFullscreenIntent(){ + try { return sessionStorage.getItem(FULLSCREEN_INTENT_KEY) === '1'; } catch (_) { return false; } + } + + function setFullscreenIntent(enabled){ + try { sessionStorage.setItem(FULLSCREEN_INTENT_KEY, enabled ? '1' : '0'); } catch (_) {} + } + + function setTheme(theme, opts){ + opts = opts || {}; + const t = theme === 'light' ? 'light' : 'dark'; + document.body.setAttribute('data-theme', t); + try { localStorage.setItem(THEME_KEY, t); } catch (_) {} + const btn = byId(opts.buttonId || 'theme-toggle'); + if (btn) btn.textContent = t === 'light' ? 'Dark theme' : 'Light theme'; + if (typeof opts.onChange === 'function') opts.onChange(t); + return t; + } + + function initTheme(opts){ + opts = opts || {}; + let theme = 'dark'; + try { + const stored = localStorage.getItem(THEME_KEY); + if (stored === 'light' || stored === 'dark') theme = stored; + else if (window.matchMedia && window.matchMedia('(prefers-color-scheme: light)').matches) theme = 'light'; + } catch (_) {} + setTheme(theme, opts); + const btn = byId(opts.buttonId || 'theme-toggle'); + if (btn && !btn.dataset.themeBound) { + btn.dataset.themeBound = '1'; + btn.addEventListener('click', function(){ + setTheme(document.body.getAttribute('data-theme') === 'light' ? 'dark' : 'light', opts); + }); + } + return theme; + } + + function updateFullscreenButton(buttonId){ + const btn = byId(buttonId || 'fullscreen-toggle'); + if (!btn) return; + if (document.fullscreenElement) { + btn.textContent = 'Exit fullscreen'; + return; + } + btn.textContent = getFullscreenIntent() ? 'Restore fullscreen' : 'Enter fullscreen'; + } + + async function requestFullscreenSafe(){ + if (document.fullscreenElement) return true; + if (!document.fullscreenEnabled) return false; + try { + await document.documentElement.requestFullscreen(); + setFullscreenIntent(true); + return true; + } catch (err) { + console.warn('Fullscreen restore/request blocked:', err); + return false; + } + } + + async function toggleFullscreen(buttonId){ + try { + if (!document.fullscreenElement) { + await requestFullscreenSafe(); + } else { + setFullscreenIntent(false); + await document.exitFullscreen(); + } + } catch (err) { + console.warn('Fullscreen error:', err); + } finally { + updateFullscreenButton(buttonId || 'fullscreen-toggle'); + } + } + + function bindFullscreenNavPersistence(){ + if (document.documentElement.dataset.fsNavBound) return; + document.documentElement.dataset.fsNavBound = '1'; + + document.addEventListener('click', function(ev){ + const link = ev.target && ev.target.closest ? ev.target.closest('a[href]') : null; + if (!link) return; + const href = link.getAttribute('href') || ''; + const target = link.getAttribute('target') || ''; + if (!href || href.startsWith('#') || target === '_blank' || link.hasAttribute('download')) return; + try { + const url = new URL(link.href, window.location.href); + if (url.origin !== window.location.origin) return; + } catch (_) { + return; + } + if (document.fullscreenElement || getFullscreenIntent()) { + setFullscreenIntent(true); + } + }, true); + + window.addEventListener('pageshow', function(){ + document.querySelectorAll('#fullscreen-toggle, #fullscreen-btn').forEach(function(el){ + updateFullscreenButton(el.id); + }); + }); + } + + async function initFullscreen(opts){ + opts = opts || {}; + const buttonId = opts.buttonId || 'fullscreen-toggle'; + const btn = byId(buttonId); + if (btn && !btn.dataset.fsBound) { + btn.dataset.fsBound = '1'; + btn.addEventListener('click', function(){ toggleFullscreen(buttonId); }); + } + if (!document.documentElement.dataset.fsListenerBound) { + document.documentElement.dataset.fsListenerBound = '1'; + document.addEventListener('fullscreenchange', function(){ + setFullscreenIntent(!!document.fullscreenElement); + document.querySelectorAll('#fullscreen-toggle, #fullscreen-btn').forEach(function(el){ + updateFullscreenButton(el.id); + }); + }); + } + bindFullscreenNavPersistence(); + updateFullscreenButton(buttonId); + + if (getFullscreenIntent() && !document.fullscreenElement) { + // Best effort only: some browsers require a fresh user gesture after navigation. + requestAnimationFrame(function(){ + requestFullscreenSafe().finally(function(){ updateFullscreenButton(buttonId); }); + }); + } + } + + async function fetchJson(url, opts){ + opts = opts || {}; + const controller = new AbortController(); + const timeoutMs = opts.timeoutMs || 8000; + const timer = setTimeout(function(){ controller.abort(); }, timeoutMs); + try { + const res = await fetch(url, { + method: opts.method || 'GET', + headers: opts.headers || undefined, + body: opts.body, + cache: 'no-store', + signal: controller.signal + }); + let data = null; + try { data = await res.json(); } catch (_) { data = null; } + if (!res.ok) { + const err = new Error(data && data.error ? data.error : ('HTTP ' + res.status)); + err.response = res; + err.data = data; + throw err; + } + return data; + } finally { + clearTimeout(timer); + } + } + + window.AppUI = { + setTheme, + initTheme, + updateFullscreenButton, + toggleFullscreen, + initFullscreen, + fetchJson, + getFullscreenIntent, + setFullscreenIntent + }; +})(); diff --git a/static/history.html b/static/history.html index 39bf114..7d68b8c 100644 --- a/static/history.html +++ b/static/history.html @@ -1,546 +1,546 @@ - - - - - - Force Monitor — History & Analytics - - - - -
- - -
-
-
-
Force Monitor
-

Engineering History & Executive Analytics

-
Longer-window peak force analytics, imbalance risk, percentile-based engineering metrics, alarm density, previous-window comparison, and top-event tables for engineering and management.
-
-
-
- Status: idle - Last refresh: -- - Window: -- -
-
-
- - - -
-
-
- - - - - - - -
-
- - - -
-
-
-
- - - - - - -
-
Thresholds loading…
-
-
- -
-
Avg total peak
--
Window average
-
Max total peak
--
Highest total in window
-
P95 / P99 total
--
Engineering percentiles
-
Avg imbalance
--
Process centering quality
-
Critical sample rate
--
% of samples in critical zone
-
Alarm transitions
--
Window event density
-
Vs previous window
--
Average total comparison
-
Stability verdict
--
Analytics interpretation
-
- -
-
-
-

Expanded Trend View

-
Overlay left, right, total, and imbalance across the selected window. Imbalance uses the right axis so engineering can see centering drift without losing total-force detail.
-
-
Refresh cadence follows the current page only. Open the dashboard for operator live view.
-
-
-
- -
-
-
-

Top total peaks

- stress points -
-
Highest total peaks in the selected window. This helps engineering review overload clusters and lets management see the true worst-case demand.
-
- - - -
TimeTotal %Total kNL %R %Imb %
No data
-
-
-
-
-

Worst imbalances

- centering risk -
-
Largest left-right differences in the selected window. This is ideal for die setup review, mechanical alignment checks, and boss-level trend summaries.
-
- - - -
TimeImb %Total %L %R %Total kN
No data
-
-
-
- -
-
-

Executive interpretation

- loading -
-
Loading analytics…
-
-
- - - - + + + + + + Force Monitor — History & Analytics + + + + +
+ + +
+
+
+
Force Monitor
+

Engineering History & Executive Analytics

+
Longer-window peak force analytics, imbalance risk, percentile-based engineering metrics, alarm density, previous-window comparison, and top-event tables for engineering and management.
+
+
+
+ Status: idle + Last refresh: -- + Window: -- +
+
+
+ + + +
+
+
+ + + + + + + +
+
+ + + +
+
+
+
+ + + + + + +
+
Thresholds loading…
+
+
+ +
+
Avg total peak
--
Window average
+
Max total peak
--
Highest total in window
+
P95 / P99 total
--
Engineering percentiles
+
Avg imbalance
--
Process centering quality
+
Critical sample rate
--
% of samples in critical zone
+
Alarm transitions
--
Window event density
+
Vs previous window
--
Average total comparison
+
Stability verdict
--
Analytics interpretation
+
+ +
+
+
+

Expanded Trend View

+
Overlay left, right, total, and imbalance across the selected window. Imbalance uses the right axis so engineering can see centering drift without losing total-force detail.
+
+
Refresh cadence follows the current page only. Open the dashboard for operator live view.
+
+
+
+ +
+
+
+

Top total peaks

+ stress points +
+
Highest total peaks in the selected window. This helps engineering review overload clusters and lets management see the true worst-case demand.
+
+ + + +
TimeTotal %Total kNL %R %Imb %
No data
+
+
+
+
+

Worst imbalances

+ centering risk +
+
Largest left-right differences in the selected window. This is ideal for die setup review, mechanical alignment checks, and boss-level trend summaries.
+
+ + + +
TimeImb %Total %L %R %Total kN
No data
+
+
+
+ +
+
+

Executive interpretation

+ loading +
+
Loading analytics…
+
+
+ + + + \ No newline at end of file diff --git a/static/index.html b/static/index.html index 86084ed..5f4dadf 100644 --- a/static/index.html +++ b/static/index.html @@ -1,1417 +1,1417 @@ - - - - - - {{.Title}} - - - - - -
-
-
- -
Embedded UI navigation
-
-
- - -
-
-

{{.Title}}

-

{{.Subtitle}}

-

MAX_TONNAGE = {{printf "%.1f" .MaxTonnage}} {{.UnitForce}}

-
- -
- {{if .ShowHeaderControls}} -
- - -
- {{end}} - -
-
-
- Disconnected -
- -
Last update: --:--:--.---
- -
Dropped S: 0 | E: 0
-
-
-
- - - - -
- {{if .ShowVerdict}} -
-
-
Machine verdict
-
NO DATA
-
-
Waiting for PLC data
-
- {{end}} - - {{if .ShowSummaryBar}} -
-
-
-
-
-
FORCE
-
NO DATA
-
-
-
--
-
- -
-
-
-
-
IMBALANCE
-
NO DATA
-
-
-
--
-
- -
-
-
-
-
PLC
-
OFFLINE
-
-
-
Disconnected
-
-
- {{end}} - - {{if .ShowOverview}} -
-
-
-
TOTAL PEAK FORCE
-
-
0.0
-
{{.UnitForce}}
-
-
- -
-
-
TOTAL %
-
0.0 {{.UnitPct}}
-
-
-
IMBALANCE
-
0.0 {{.UnitPct}}
-
abs(L - R)
-
-
-
BIAS
-
0.0 {{.UnitPct}}
-
L - R
-
-
-
LIMITS
-
Force W {{printf "%.0f" .WarningPercent}} / C {{printf "%.0f" .CriticalPercent}}
-
Imb W {{printf "%.0f" .ImbalanceWarningPercent}} / C {{printf "%.0f" .ImbalanceCriticalPercent}}
-
-
-
-
- {{end}} - - {{if .ShowIntelligence}} -
-
-
-

Drift / Deterioration Intelligence

-
Averages, drift direction, imbalance deterioration and process stability
-
-
- - - - -
- - -
-
-
-
-
-
AVG PEAK 5 MIN
-
--
-
No data
-
-
-
AVG PEAK 1 HOUR
-
--
-
No data
-
-
-
FORCE TREND
-
--
-
No data
-
-
-
IMBALANCE TREND
-
--
-
No data
-
-
-
PROCESS STABILITY
-
--
-
No data
-
-
-
- {{end}} - - {{if .ShowAlarmTimeline}} -
-
-
-

Event / Alarm Timeline

-
Recent transitions show exactly when the process began drifting, overloading, losing balance, or losing PLC communication
-
-
Newest events first • clear events included
-
-
- - - - - - - - - - - - - - -
TimeSeveritySourceEventValueLimit
No events yet
-
-
- {{end}} - - {{if .ShowGauges}} -
-
- {{if .ShowGaugeDigital}} -
-
-
-
-

{{.LeftLabel}}

-
NORMAL
-
-
-
-
0.0
-
{{.UnitPct}}
-
0.0 {{.UnitForce}}
-
-
- {{else}} -
-
-
-

{{.LeftLabel}}

-
NORMAL
-
-
- {{end}} -
- -
-
- -
- {{if .ShowGaugeDigital}} -
-
-
-
-

{{.RightLabel}}

-
NORMAL
-
-
-
-
0.0
-
{{.UnitPct}}
-
0.0 {{.UnitForce}}
-
-
- {{else}} -
-
-
-

{{.RightLabel}}

-
NORMAL
-
-
- {{end}} -
- -
-
-
- {{end}} - - {{if .ShowTrendChart}} -
-
-
-
-

Peak Trend

-
Piezo peak/stroke history from SQLite with visible warning and critical limits
-
-
- - - - - - - -
- - -
-
-
-
- -
-
-
- {{end}} -
-
- - - - - + + + + + + {{.Title}} + + + + + +
+
+
+ +
Embedded UI navigation
+
+
+ + +
+
+

{{.Title}}

+

{{.Subtitle}}

+

MAX_TONNAGE = {{printf "%.1f" .MaxTonnage}} {{.UnitForce}}

+
+ +
+ {{if .ShowHeaderControls}} +
+ + +
+ {{end}} + +
+
+
+ Disconnected +
+ +
Last update: --:--:--.---
+ +
Dropped S: 0 | E: 0
+
+
+
+ + + + +
+ {{if .ShowVerdict}} +
+
+
Machine verdict
+
NO DATA
+
+
Waiting for PLC data
+
+ {{end}} + + {{if .ShowSummaryBar}} +
+
+
+
+
+
FORCE
+
NO DATA
+
+
+
--
+
+ +
+
+
+
+
IMBALANCE
+
NO DATA
+
+
+
--
+
+ +
+
+
+
+
PLC
+
OFFLINE
+
+
+
Disconnected
+
+
+ {{end}} + + {{if .ShowOverview}} +
+
+
+
TOTAL PEAK FORCE
+
+
0.0
+
{{.UnitForce}}
+
+
+ +
+
+
TOTAL %
+
0.0 {{.UnitPct}}
+
+
+
IMBALANCE
+
0.0 {{.UnitPct}}
+
abs(L - R)
+
+
+
BIAS
+
0.0 {{.UnitPct}}
+
L - R
+
+
+
LIMITS
+
Force W {{printf "%.0f" .WarningPercent}} / C {{printf "%.0f" .CriticalPercent}}
+
Imb W {{printf "%.0f" .ImbalanceWarningPercent}} / C {{printf "%.0f" .ImbalanceCriticalPercent}}
+
+
+
+
+ {{end}} + + {{if .ShowIntelligence}} +
+
+
+

Drift / Deterioration Intelligence

+
Averages, drift direction, imbalance deterioration and process stability
+
+
+ + + + +
+ + +
+
+
+
+
+
AVG PEAK 5 MIN
+
--
+
No data
+
+
+
AVG PEAK 1 HOUR
+
--
+
No data
+
+
+
FORCE TREND
+
--
+
No data
+
+
+
IMBALANCE TREND
+
--
+
No data
+
+
+
PROCESS STABILITY
+
--
+
No data
+
+
+
+ {{end}} + + {{if .ShowAlarmTimeline}} +
+
+
+

Event / Alarm Timeline

+
Recent transitions show exactly when the process began drifting, overloading, losing balance, or losing PLC communication
+
+
Newest events first • clear events included
+
+
+ + + + + + + + + + + + + + +
TimeSeveritySourceEventValueLimit
No events yet
+
+
+ {{end}} + + {{if .ShowGauges}} +
+
+ {{if .ShowGaugeDigital}} +
+
+
+
+

{{.LeftLabel}}

+
NORMAL
+
+
+
+
0.0
+
{{.UnitPct}}
+
0.0 {{.UnitForce}}
+
+
+ {{else}} +
+
+
+

{{.LeftLabel}}

+
NORMAL
+
+
+ {{end}} +
+ +
+
+ +
+ {{if .ShowGaugeDigital}} +
+
+
+
+

{{.RightLabel}}

+
NORMAL
+
+
+
+
0.0
+
{{.UnitPct}}
+
0.0 {{.UnitForce}}
+
+
+ {{else}} +
+
+
+

{{.RightLabel}}

+
NORMAL
+
+
+ {{end}} +
+ +
+
+
+ {{end}} + + {{if .ShowTrendChart}} +
+
+
+
+

Peak Trend

+
Piezo peak/stroke history from SQLite with visible warning and critical limits
+
+
+ + + + + + + +
+ + +
+
+
+
+ +
+
+
+ {{end}} +
+
+ + + + + diff --git a/static/kiosk.html b/static/kiosk.html index a1214c6..4001f0c 100644 --- a/static/kiosk.html +++ b/static/kiosk.html @@ -1,104 +1,104 @@ - - - - - - Force Monitor — Kiosk - - - -
- - -
-
Force Monitor
LOADING
Preparing kiosk view…
--
-
-
-
Total peak
--
kN / %
-
Left
--
kN / %
-
Right
--
kN / %
-
Imbalance
--
bias / trend
-
-
-
-

Live production verdict

Data freshness: --
-
WAITING
-
No PLC data yet.
-
-
Trend direction
--
force drift
-
Process stability
--
stability
-
-
-
-

Active attention items

Last refresh: --
-
  • Loading live status…
-
-
-
- - - + + + + + + Force Monitor — Kiosk + + + +
+ + +
+
Force Monitor
LOADING
Preparing kiosk view…
--
+
+
+
Total peak
--
kN / %
+
Left
--
kN / %
+
Right
--
kN / %
+
Imbalance
--
bias / trend
+
+
+
+

Live production verdict

Data freshness: --
+
WAITING
+
No PLC data yet.
+
+
Trend direction
--
force drift
+
Process stability
--
stability
+
+
+
+

Active attention items

Last refresh: --
+
  • Loading live status…
+
+
+
+ + + \ No newline at end of file diff --git a/static/license.html b/static/license.html index 4d88966..242c993 100644 --- a/static/license.html +++ b/static/license.html @@ -1,336 +1,336 @@ - - - - - - Force Monitor — License - - - -
- - -
-
-
-
Force Monitor
-

License Center

-
Status, fingerprint, activation request, local license import, and signed license activation.
-
-
-
- mode: loading - locked: -- - tamper: -- -
-
-
-
- -
-
Current mode
--
Loading...
-
Days remaining
--
Trial or expiry information
-
Activation configured
--
Public key present or not
-
Fingerprint
--
Short fingerprint
-
- -
-
-
-
-
Activation request
-
Send this JSON to your private signing tool or license issuer.
-
-
- - -
-
-
Loading activation request...
-
- -
-
-
-
Activate signed license
-
Paste the signed license JSON or load it from a local file.
-
-
- - -
-
- -
-
- -
-
Status details
-
-
Message
--
-
Customer
--
-
License ID
--
-
Hostname
--
-
Fingerprint
--
-
Trial window
--
-
Expires at
--
-
Features
--
-
-
-
- - - - - + + + + + + Force Monitor — License + + + +
+ + +
+
+
+
Force Monitor
+

License Center

+
Status, fingerprint, activation request, local license import, and signed license activation.
+
+
+
+ mode: loading + locked: -- + tamper: -- +
+
+
+
+ +
+
Current mode
--
Loading...
+
Days remaining
--
Trial or expiry information
+
Activation configured
--
Public key present or not
+
Fingerprint
--
Short fingerprint
+
+ +
+
+
+
+
Activation request
+
Send this JSON to your private signing tool or license issuer.
+
+
+ + +
+
+
Loading activation request...
+
+ +
+
+
+
Activate signed license
+
Paste the signed license JSON or load it from a local file.
+
+
+ + +
+
+ +
+
+ +
+
Status details
+
+
Message
--
+
Customer
--
+
License ID
--
+
Hostname
--
+
Fingerprint
--
+
Trial window
--
+
Expires at
--
+
Features
--
+
+
+
+ + + + + diff --git a/static/process-capability.html b/static/process-capability.html index a58daaf..8e68214 100644 --- a/static/process-capability.html +++ b/static/process-capability.html @@ -1,28 +1,28 @@ - -Force Monitor — Process Capability - - -
- -
Engineering capability

Process Capability & Distribution

Histogram-based force and imbalance capability, one-sided CPU/CPK-style indicators against your configured thresholds, correlation between left and right columns, and suggested engineering action.
Window: --
-
-
Total Cpk @ critical
--
Capability versus critical load limit
Imbalance Cpk @ critical
--
Capability versus critical imbalance limit
Left ↔ right correlation
--
Closer to 1.00 means both sides move together
Suggested action
--
Loading capability guidance…
-

Total force distribution

histogram
Distribution of total peak force against configured warning and critical boundaries.

Imbalance distribution

histogram
Distribution of imbalance magnitude. A tight distribution below warning is usually what engineering wants.
-
Mean / σ total
--
P95 / P99 and warning occupancy
Mean / σ imbalance
--
P95 and critical occupancy
CPU warning / critical
--
One-sided capability against upper limits
Stability
--
Loading…
-

Top outliers

review points
Combined overload and imbalance stress points worth engineering review.
TimeTotal %Total kNL %R %Imb %
No data
-
- - + +
+ +
Engineering capability

Process Capability & Distribution

Histogram-based force and imbalance capability, one-sided CPU/CPK-style indicators against your configured thresholds, correlation between left and right columns, and suggested engineering action.
Window: --
+
+
Total Cpk @ critical
--
Capability versus critical load limit
Imbalance Cpk @ critical
--
Capability versus critical imbalance limit
Left ↔ right correlation
--
Closer to 1.00 means both sides move together
Suggested action
--
Loading capability guidance…
+

Total force distribution

histogram
Distribution of total peak force against configured warning and critical boundaries.

Imbalance distribution

histogram
Distribution of imbalance magnitude. A tight distribution below warning is usually what engineering wants.
+
Mean / σ total
--
P95 / P99 and warning occupancy
Mean / σ imbalance
--
P95 and critical occupancy
CPU warning / critical
--
One-sided capability against upper limits
Stability
--
Loading…
+

Top outliers

review points
Combined overload and imbalance stress points worth engineering review.
TimeTotal %Total kNL %R %Imb %
No data
+
+ + \ No newline at end of file diff --git a/static/reports.html b/static/reports.html index b841be3..c26642d 100644 --- a/static/reports.html +++ b/static/reports.html @@ -1,25 +1,25 @@ - -Force Monitor — Reports - - -
- -
Management & engineering report

Shift, Day & Week Reports

A report-friendly view for engineering and boss departments with health score, availability estimate, event counts, peak summaries, trend deltas, and a bucket chart for the selected period.
Window: --
-
-
Health score
--
Availability and event pressure
Avg / peak total
--
Total force summary
Avg / peak imbalance
--
Centering summary
Events
--
Warnings, criticals, PLC disconnects
-

Executive summary

loading
Loading report…
-

Bucket trend

selected period
Each bucket summarizes average total force, maximum force, and event density inside the selected report window.
-

Top peaks in report window

top load moments
TimeTotal %Total kNImb %L %R %
No data
-
- - + +
+ +
Management & engineering report

Shift, Day & Week Reports

A report-friendly view for engineering and boss departments with health score, availability estimate, event counts, peak summaries, trend deltas, and a bucket chart for the selected period.
Window: --
+
+
Health score
--
Availability and event pressure
Avg / peak total
--
Total force summary
Avg / peak imbalance
--
Centering summary
Events
--
Warnings, criticals, PLC disconnects
+

Executive summary

loading
Loading report…
+

Bucket trend

selected period
Each bucket summarizes average total force, maximum force, and event density inside the selected report window.
+

Top peaks in report window

top load moments
TimeTotal %Total kNImb %L %R %
No data
+
+ + \ No newline at end of file