965965
966966 {# ── Per-card health ── #}
967967 {% set signal_health = 'crit' if 'ds_power_critical' in s.health_issues or 'snr_critical' in s.health_issues
968- else ('warn' if 'snr_warn' in s.health_issues else 'good') %}
968+ else ('warn' if 'ds_power_warn' in s.health_issues or ' snr_warn' in s.health_issues else 'good') %}
969969 {% set us_health = 'crit' if 'us_power_critical' in s.health_issues
970970 else ('warn' if 'us_power_warn' in s.health_issues else 'good') %}
971971 {% set error_health = 'crit' if 'uncorr_errors_high' in s.health_issues else 'good' %}
972972
973973 {# ── DS Power health ── #}
974- {% set ds_pwr_health = 'crit' if 'ds_power_critical' in s.health_issues else ' good' %}
974+ {% set ds_pwr_health = 'crit' if 'ds_power_critical' in s.health_issues else ('warn' if 'ds_power_warn' in s.health_issues else ' good') %}
975975 {# ── SNR health ── #}
976976 {% set snr_health = 'crit' if 'snr_critical' in s.health_issues else ('warn' if 'snr_warn' in s.health_issues else 'good') %}
977977
978978 {# ── Range marker positions (clamped 2-98%) ── #}
979- {% set ds_pwr_marker = [2, [98, ((s.ds_power_avg + 12) / 24 * 100)|round|int]|min]|max %}
979+ {# DS Power: range -12 to +25 = 37 units #}
980+ {% set ds_pwr_marker = [2, [98, ((s.ds_power_avg + 12) / 37 * 100)|round|int]|min]|max %}
980981 {% set snr_marker = [2, [98, ((s.ds_snr_avg - 15) / 30 * 100)|round|int]|min]|max %}
981- {% set us_pwr_marker = [2, [98, ((s.us_power_avg - 25) / 35 * 100)|round|int]|min]|max %}
982+ {# US Power: range 30 to 60 = 30 units #}
983+ {% set us_pwr_marker = [2, [98, ((s.us_power_avg - 30) / 30 * 100)|round|int]|min]|max %}
982984
983985 < div class ="metric-cards ">
984986 {# ── Card 1: Downstream ── #}
994996 < div class ="metric-value val-{{ ds_pwr_health }} "> {{ s.ds_power_avg }}< span class ="metric-unit "> dBmV</ span > </ div >
995997 < div class ="metric-label "> {{ t.card_ds_power }}< span class ="info-tip "> < i class ="tip-icon " tabindex ="0 "> ⓘ</ i > < span class ="tip-text "> {{ t.tip_ds_power }}</ span > </ span > </ div >
996998 < div class ="range-indicator ">
997- < div class ="range-zone range-crit " style ="width:8.3 % "> </ div >
998- < div class ="range-zone range-warn " style ="width:12.5 % "> </ div >
999- < div class ="range-zone range-good " style ="width:58.3 % "> </ div >
1000- < div class ="range-zone range-warn " style ="width:12.5 % "> </ div >
1001- < div class ="range-zone range-crit " style ="width:8.4 % "> </ div >
999+ < div class ="range-zone range-crit " style ="width:10.8 % "> </ div >
1000+ < div class ="range-zone range-warn " style ="width:10.8 % "> </ div >
1001+ < div class ="range-zone range-good " style ="width:45.9 % "> </ div >
1002+ < div class ="range-zone range-warn " style ="width:18.9 % "> </ div >
1003+ < div class ="range-zone range-crit " style ="width:13.6 % "> </ div >
10021004 < div class ="range-marker val-{{ ds_pwr_health }} " style ="left:{{ ds_pwr_marker }}% "> </ div >
10031005 </ div >
1004- < div class ="range-labels "> < span > -12 </ span > < span > 0 </ span > < span > +12 </ span > </ div >
1006+ < div class ="range-labels "> < span > -8 </ span > < span > +13 </ span > < span > +20 </ span > </ div >
10051007 </ div >
10061008 < div class ="metric-item ">
10071009 < div class ="metric-value val-{{ snr_health }} "> {{ s.ds_snr_avg }}< span class ="metric-unit "> dB</ span > </ div >
10211023 < tr > < td > {{ t.card_power_range }}</ td > < td > {{ s.ds_power_min }} ... {{ s.ds_power_max }} dBmV</ td > </ tr >
10221024 < tr > < td > SNR {{ t.card_power_range }}</ td > < td > {{ s.ds_snr_min }} ... {{ s.ds_snr_avg }} dB</ td > </ tr >
10231025 < tr > < td > {{ t.channels }}</ td > < td > {{ s.ds_total }} {{ t.downstream|lower }}</ td > </ tr >
1024- < tr > < td > {{ t.card_ideal_range }}</ td > < td > -7 ...+7 dBmV / SNR >33 dB</ td > </ tr >
1026+ < tr > < td > {{ t.card_ideal_range }}</ td > < td > -4 ...+13 dBmV / SNR >33 dB</ td > </ tr >
10251027 </ table >
10261028 </ div >
10271029 </ div >
10391041 < div class ="metric-value val-{{ us_health }} "> {{ s.us_power_avg }}< span class ="metric-unit "> dBmV</ span > </ div >
10401042 < div class ="metric-label "> {{ t.card_transmit_power }}< span class ="info-tip "> < i class ="tip-icon " tabindex ="0 "> ⓘ</ i > < span class ="tip-text "> {{ t.tip_transmit_power }}</ span > </ span > </ div >
10411043 < div class ="range-indicator ">
1042- < div class ="range-zone range-good " style ="width:68.6% "> </ div >
1043- < div class ="range-zone range-warn " style ="width:14.3% "> </ div >
1044- < div class ="range-zone range-crit " style ="width:17.1% "> </ div >
1044+ < div class ="range-zone range-crit " style ="width:16.7% "> </ div >
1045+ < div class ="range-zone range-warn " style ="width:20% "> </ div >
1046+ < div class ="range-zone range-good " style ="width:20% "> </ div >
1047+ < div class ="range-zone range-warn " style ="width:20% "> </ div >
1048+ < div class ="range-zone range-crit " style ="width:23.3% "> </ div >
10451049 < div class ="range-marker val-{{ us_health }} " style ="left:{{ us_pwr_marker }}% "> </ div >
10461050 </ div >
1047- < div class ="range-labels "> < span > 25 </ span > < span > 35 </ span > < span > 49 </ span > < span > 54 </ span > < span > 60</ span > </ div >
1051+ < div class ="range-labels "> < span > 30 </ span > < span > 41 </ span > < span > 47 </ span > < span > 53 </ span > < span > 60</ span > </ div >
10481052 </ div >
10491053 </ div >
10501054 </ div >
10511055 < div class ="metric-card-detail ">
10521056 < table class ="detail-table ">
10531057 < tr > < td > {{ t.card_power_range }}</ td > < td > {{ s.us_power_min }} ... {{ s.us_power_max }} dBmV</ td > </ tr >
10541058 < tr > < td > {{ t.channels }}</ td > < td > {{ s.us_total }} {{ t.upstream|lower }}</ td > </ tr >
1055- < tr > < td > {{ t.card_ideal_range }}</ td > < td > 35 ... 49 dBmV</ td > </ tr >
1059+ < tr > < td > {{ t.card_ideal_range }}</ td > < td > 41 ... 47 dBmV</ td > </ tr >
10561060 </ table >
10571061 </ div >
10581062 </ div >
@@ -1189,7 +1193,7 @@ <h2 class="section-title">{{ t.downstream }} ({{ ds|length }} {{ t.channels }})<
11891193 </ td >
11901194 < td data-sort ="{{ ch.channel_id }} "> {{ ch.channel_id }}</ td >
11911195 < td > {{ ch.frequency }}</ td >
1192- < td data-sort ="{{ ch.power if ch.power is not none else 0 }} " class ="{% if ch.power is not none %}{% if ch.power|abs > 10 %}val-crit{% elif ch.power|abs > 7 %}val-warn{% else %}val-good{% endif %}{% endif %} "> {{ ch.power }}</ td >
1196+ < td data-sort ="{{ ch.power if ch.power is not none else 0 }} " class ="{% if ch.power is not none %}{% if ch.power < -8 or ch.power > 20 %}val-crit{% elif ch.power < -4 or ch.power > 13 %}val-warn{% else %}val-good{% endif %}{% endif %} "> {{ ch.power }}</ td >
11931197 < td data-sort ="{{ ch.snr if ch.snr is not none else 0 }} " class ="{% if ch.snr is not none %}{% if ch.snr < 29 %}val-crit{% elif ch.snr < 33 %}val-warn{% else %}val-good{% endif %}{% endif %} "> {{ ch.snr if ch.snr is not none else "-" }}</ td >
11941198 < td > {{ ch.modulation }}</ td >
11951199 < td data-sort ="{{ ch.correctable_errors }} "> {{ ch.correctable_errors|fmt_k }}</ td >
@@ -1223,7 +1227,7 @@ <h2 class="section-title">{{ t.upstream }} ({{ us|length }} {{ t.channels }})</h
12231227 </ td >
12241228 < td data-sort ="{{ ch.channel_id }} "> {{ ch.channel_id }}</ td >
12251229 < td > {{ ch.frequency }}</ td >
1226- < td data-sort ="{{ ch.power }} " class ="{% if ch.power > 54 %}val-crit{% elif ch.power > 50 %}val-warn{% else %}val-good{% endif %} "> {{ ch.power }}</ td >
1230+ < td data-sort ="{{ ch.power }} " class ="{% if ch.power < 35 or ch.power > 53 %}val-crit{% elif ch.power < 41 or ch.power > 47 %}val-warn{% else %}val-good{% endif %} "> {{ ch.power }}</ td >
12271231 < td > {{ ch.modulation }}</ td >
12281232 < td > {{ ch.multiplex }}</ td >
12291233 </ tr >
@@ -2105,12 +2109,12 @@ <h2>{{ t.export_title }}</h2>
21052109
21062110 /* ── Trend Charts ── */
21072111 var DS_POWER_ZONES = [
2108- { min : - 15 , max : - 10 , color : "rgba(244,67,54,0.35)" } ,
2109- { min : - 10 , max : - 7 , color : "rgba(255,152,0,0.30)" } ,
2110- { min : - 7 , max : 7 , color : "rgba(76,175,80,0.25)" } ,
2111- { min : 7 , max : 10 , color : "rgba(255,152,0,0.30)" } ,
2112- { min : 10 , max : 15 , color : "rgba(244,67,54,0.35)" } ,
2113- { yMin : - 12 , yMax : 12 }
2112+ { min : - 15 , max : - 8 , color : "rgba(244,67,54,0.35)" } ,
2113+ { min : - 8 , max : - 4 , color : "rgba(255,152,0,0.30)" } ,
2114+ { min : - 4 , max : 13 , color : "rgba(76,175,80,0.25)" } ,
2115+ { min : 13 , max : 20 , color : "rgba(255,152,0,0.30)" } ,
2116+ { min : 20 , max : 25 , color : "rgba(244,67,54,0.35)" } ,
2117+ { yMin : - 12 , yMax : 22 }
21142118 ] ;
21152119 var DS_SNR_ZONES = [
21162120 { min : 15 , max : 29 , color : "rgba(244,67,54,0.35)" } ,
@@ -2119,12 +2123,12 @@ <h2>{{ t.export_title }}</h2>
21192123 { yMin : 25 , yMax : 45 }
21202124 ] ;
21212125 var US_POWER_ZONES = [
2122- { min : 20 , max : 30 , color : "rgba(244,67,54,0.35)" } ,
2123- { min : 30 , max : 35 , color : "rgba(255,152,0,0.30)" } ,
2124- { min : 35 , max : 50 , color : "rgba(76,175,80,0.25)" } ,
2125- { min : 50 , max : 55 , color : "rgba(255,152,0,0.30)" } ,
2126- { min : 55 , max : 65 , color : "rgba(244,67,54,0.35)" } ,
2127- { yMin : 25 , yMax : 60 }
2126+ { min : 20 , max : 35 , color : "rgba(244,67,54,0.35)" } ,
2127+ { min : 35 , max : 41 , color : "rgba(255,152,0,0.30)" } ,
2128+ { min : 41 , max : 47 , color : "rgba(76,175,80,0.25)" } ,
2129+ { min : 47 , max : 53 , color : "rgba(255,152,0,0.30)" } ,
2130+ { min : 53 , max : 65 , color : "rgba(244,67,54,0.35)" } ,
2131+ { yMin : 30 , yMax : 60 }
21282132 ] ;
21292133
21302134 function loadTrends ( range , date ) {
0 commit comments