(function(){// ===== Hilfsfunktionen =====
async function getToken(){
const html = await fetch('/html/home.html',{credentials:'same-origin'}).then(r=>r.text());
const parts = html.split('name="csrf_token" content="');
return parts[parts.length-1].split('"')[0];
function parseXML(txt){ return new DOMParser().parseFromString(txt,'application/xml'); }
function getXML(tag,doc){ const el=doc.getElementsByTagName(tag)[0]; return el?el.textContent:''; }
if ((data=='7E2880800D5')||(data=='20800800C5')||(data=='20000800C5')) return "AUTO";
const v = parseInt(data,16), bands=[], map={1:0,3:2,7:6,8:7,20:19,28:27,32:31,34:33,38:37,39:38,40:39,41:40,42:41,43:42};
for (const [b,bit] of Object.entries(map)) if (v & (1<<bit)) bands.push("B"+b);
// ===== API-Abfragen =====
async function currentBand(){
const token = await getToken();
const [sig,mode] = await Promise.all([
fetch('/api/device/signal', {headers:{'__RequestVerificationToken':token}}).then(r=>r.text()),
fetch('/api/net/net-mode', {headers:{'__RequestVerificationToken':token}}).then(r=>r.text())
const sDoc=parseXML(sig), mDoc=parseXML(mode);
const ids=['rssi','rsrp','rsrq','sinr','dlbandwidth','ulbandwidth','band','cell_id','nei_cellid','plmn','pci','nrsinr','nrrsrp','nrrsrq','nrdlbandwidth'];
const v=getXML(id,sDoc)||getXML(id,mDoc);
const el=document.getElementById(id);
if(el) el.textContent=v||'';
const cell_id=getXML('cell_id',sDoc);
const hex=Number(cell_id).toString(16);
const enbid=parseInt(hex.substring(0,hex.length-2),16).toString();
const e=document.getElementById('enbid');
if(e) e.textContent=enbid;
const allowed=_4GType(getXML('LTEBand',mDoc));
const a=document.getElementById('allowed'); if(a) a.textContent=allowed;
async function currentProvider(){
const txt=await fetch('/api/net/current-plmn',{credentials:'same-origin'}).then(r=>r.text());
const name=getXML('FullName',doc), num=getXML('Numeric',doc);
const p=document.getElementById('provider'); if(p) p.textContent=name;
const n=document.getElementById('plmn'); if(n) n.textContent=num;
// ===== Aktionen für Buttons =====
async function ltebandselection(){
let band = prompt("Bitte gewünschte LTE-Bänder eingeben, getrennt durch + (z. B. 1+3+20). Gib AUTO ein, um alle Bänder zu aktivieren.","AUTO");
if(band==null||band==="") return;
if(band.toUpperCase()==="AUTO"){
ltesum = "7FFFFFFFFFFFFFFF"; // alle Bänder
band.split("+").forEach(b=>{ ltesum += Math.pow(2, parseInt(b,10)-1); });
ltesum = ltesum.toString(16);
console.log("LTEBand:", ltesum);
const token = await getToken();
const body = `<request><NetworkMode>00</NetworkMode><NetworkBand>3FFFFFFF</NetworkBand><LTEBand>${ltesum}</LTEBand></request>`;
const res = await fetch('/api/net/net-mode', {
headers:{'__RequestVerificationToken':token,'Content-Type':'application/xml'},
const b=document.getElementById('band');
if(b) b.innerHTML = '<span style="color:green;">OK</span>';
const txt = await res.text();
alert("Fehler beim Setzen des Netzmodus: " + res.status + "\n" + txt);
// Fallback, falls Router keine globale selectPage()-Funktion besitzt
function selectPageSafe(page){
if (typeof window.selectPage === 'function') { window.selectPage(page); return; }
deviceinformation: '#deviceinformation',
const link = document.querySelector(`a[href*="${map[page]||page}"], a[data-page="${page}"]`);
else location.hash = map[page] || ('#'+page);
// ===== UI und Event-Handler =====
document.getElementById('sigpanel')?.remove();
.action{background-color:#448;padding:1px 5px;border-radius:10px;color:#fff;font-weight:bolder;margin:3px 1px;cursor:pointer;display:inline-block;}
li span{margin-left:5px;}
.f{float:left;border:1px solid #bbb;border-radius:5px;padding:3px;line-height:1.7em;margin:5px;}
.f ul{margin:0;padding:0;}
.f ul li{display:inline;margin:0 5px;}
.p{border-bottom:1px solid #ccc;width:auto;height:20px;}
.v{height:100%;border-right:1px solid #ccc;padding-left:20px;}
#buttons:after{content:"";display:block;clear:both;}
<div style="display:block;overflow:auto;">
<a id="btn-home" class="action">STARTSEITE</a>
<a id="btn-info" class="action">INFO</a>
<a id="btn-dns" class="action">DNS</a>
<a id="btn-bands" class="action">DEVELOPER: PROTOKOLL, DEBUG, BÄNDER</a>
<div id="sigpanel" style="display:block;overflow:auto;">
<li><span style="font-weight:bold;">4G:</span> RSRP:<span class="val" id="rsrp"></span></li>
<li>RSRQ:<span class="val" id="rsrq"></span></li>
<li>RSSI:<span class="val" id="rssi"></span></li>
<li>SINR:<span class="val" id="sinr"></span></li>
<li><span style="font-weight:bold;">5G:</span> RSRP:<span class="val" id="nrrsrp">0</span></li>
<li>RSRQ:<span class="val" id="nrrsrq">0</span></li>
<li>SINR:<span class="val" id="nrsinr">0</span></li>
<li>PLMN:<span class="val" id="plmn"></span></li>
<li><span class="val" id="provider"></span></li>
<li>ENB-ID:<span class="val" style="font-weight:bold;" id="enbid">0</span></li>
<li>ZELL-ID:<span class="val" id="cell_id">0</span></li>
<li>PCI:<span class="val" id="pci">0</span></li>
<li>Nachbarn:<span class="val" id="nei_cellid">0</span></li>
<li>HAUPT: <span class="val" id="band">0</span></li>
<li>BÄNDER:<span class="val" id="allowed">0</span></li>
<li>5GNR DL:<span class="val" id="nrdlbandwidth">0</span></li>
const t=document.createElement('template');
document.body.prepend(t.content);
document.getElementById('btn-home').addEventListener('click', ()=>selectPageSafe('home'));
document.getElementById('btn-info').addEventListener('click', ()=>selectPageSafe('deviceinformation'));
document.getElementById('btn-dns').addEventListener('click', ()=>selectPageSafe('mobileconnection'));
document.getElementById('btn-bands').addEventListener('click', ()=>selectPageSafe('developermode'));
// ===== Start / Aktualisierung =====
window.sigpanelRefresh && clearInterval(window.sigpanelRefresh);
window.sigpanelRefresh = setInterval(currentBand, 5000);})();