import { transformSync } from 'esbuild'; import { readFileSync, writeFileSync } from 'fs'; import { pathToFileURL } from 'url'; function build(src, out) { let js = transformSync(readFileSync(src, 'utf8'), { loader: 'ts', format: 'esm', target: 'node20' }).code; js = js.replace(/from\s+['"]\.\/chart['"]/g, "from './chart.js'"); writeFileSync(out, js); } build('src/lib/wifi/chart.ts', '/tmp/chart.js'); build('src/lib/wifi/recommend.ts', '/tmp/recommend.js'); const { recommend24GhzChannels } = await import(pathToFileURL('/tmp/recommend.js').href); function alt(nets) { const w = (c, n) => { const d = Math.abs(c - n.channel); if (d >= 5) return 0; return (1 - d / 5) * Math.min(1, Math.max(0.1, (n.rssi + 90) / 60)); }; return [1, 6, 11].map((channel) => ({ channel, load: Math.round(nets.reduce((s, n) => s + w(channel, n), 0) * 100) / 100, })).sort((a, b) => a.load - b.load); } const FAELLE = [ { name: 'Demo-Lage (wie im Screenshot)', nets: [ { channel: 6, frequency: 2437, rssi: -53, band: '2.4 GHz', widthMhz: 20 }, { channel: 11, frequency: 2462, rssi: -61, band: '2.4 GHz', widthMhz: 20 }, { channel: 1, frequency: 2412, rssi: -75, band: '2.4 GHz', widthMhz: 40, centerFreq0: 2422 }, { channel: 11, frequency: 2462, rssi: -77, band: '2.4 GHz', widthMhz: 20 }, { channel: 13, frequency: 2472, rssi: -85, band: '2.4 GHz', widthMhz: 20 }, ], }, { name: 'STARKES 40-MHz-Netz auf Kanal 1, schwache Nachbarn auf 6 und 11', nets: [ { channel: 1, frequency: 2412, rssi: -45, band: '2.4 GHz', widthMhz: 40, centerFreq0: 2422 }, { channel: 6, frequency: 2437, rssi: -85, band: '2.4 GHz', widthMhz: 20 }, { channel: 11, frequency: 2462, rssi: -80, band: '2.4 GHz', widthMhz: 20 }, ], }, { name: 'Starkes 40-MHz-Netz auf Kanal 9 (überdeckt 6 UND 11)', nets: [ { channel: 9, frequency: 2452, rssi: -50, band: '2.4 GHz', widthMhz: 40, centerFreq0: 2442 }, { channel: 1, frequency: 2412, rssi: -70, band: '2.4 GHz', widthMhz: 20 }, ], }, ]; for (const f of FAELLE) { const neu = recommend24GhzChannels(f.nets); const a = alt(f.nets); const kippt = neu[0].channel !== a[0].channel; console.log(`\n${f.name}`); console.log(` ALT: ${a.map(r => `K${r.channel}=${r.load}`).join(' ')} -> empfiehlt Kanal ${a[0].channel}`); console.log(` NEU: ${neu.map(r => `K${r.channel}=${r.load}`).join(' ')} -> empfiehlt Kanal ${neu[0].channel}`); console.log(` ${kippt ? '>>> EMPFEHLUNG KIPPT — alte Formel hätte den falschen Kanal genannt' : ' (gleiche Empfehlung, nur andere Bewertung)'}`); }