Tritt unserer Matrix-Gruppe bei:
Entscheide dich, ob du ein:
sein möchtest.
Kurzfassung
- Repeater leiten Nachrichten weiter, können diese aber nicht lesen.
- Companions können Nachrichten lesen, aber nicht weiterleiten.
Öffne die folgende Website mit einem Chromium-basierten Browser:
Chromium Browser:
Wähle anschließend dein Gerät aus:
Je nachdem, wie du das Gerät flashen möchtest, wähle entweder Companion oder Repeater aus.
Wenn du dein Gerät neu flashst und keine alten Daten übernehmen möchtest, aktiviere:
Erase DeviceKlicke auf Flash und warte, bis der Vorgang abgeschlossen ist.
Das Gerät nach dem Flash rebooten (RST-Taste drücken für den reboot)
Wähle folgendes Frequenzband:
Narrow EU/UK
Vergleiche diese Werte mit den Voreinstellungen deines Geräts.
| Einstellung | Wert |
|---|---|
| Frequency | 869.618 |
| Bandwidth | 62.5 |
| Spreading Factor | 8 |
| Coding Rate | 8 |
| Tx Power | 22 (Heltec v3/v4) |
| Airtime Factor | 1 |
Über https://config.meshcore.io (Repeater):
Über die Meshcore App (Companion):
Du kannst zusätzlich:
Aux Ort ErkennbaresObjektInDerUmgebung
Beispiel:
Aux Augsburg Wasserturm
Download:
Geräte-Manager suchenFalls das nicht funktioniert, wende dich bitte an einen Admin.
Wir benutzen hauptsächlich diese Geräte, da sie ein gutes Preis-Leistungs-Verhältnis bieten.
Aktuell bestellen wir hauptsächlich Heltec v4.
| Hardware | Beschreibung |
|---|---|
| Heltec v4 | Repeater / Companion / Solar Nodes |
| Heltec v3 | Repeater / Companion / Solar Nodes |
| Heltec Mesh Node T114 | Gut für Solar Nodes |
| Hardware | Beschreibung |
|---|---|
| 10W Poly PET Solar Panel | Solar Nodes |
| MPPT Modul | Speicherung von Solarenergie |
Das aktuelle MPPT-Modul ist relativ teuer — günstigere Alternativen werden noch getestet.
| Hardware | Beschreibung |
|---|---|
| N-Type auf SMA Adapter | Antennen-Stecker |
| 8 dBi Antenne | Mehr Sendeleistung |
| 6.5 dBi Antenne | Standardantenne |
| Hardware | Beschreibung |
|---|---|
| Akkus | Repeater / Companion / Solar Nodes |
⚠️ Die Akkus müssen gelötet werden.
Zylinderförmige Akkus sind empfehlenswert.
⚠️ Niemals das Gerät ohne angeschlossene Antenne einschalten!
Andernfalls kann ein irreparabler Defekt entstehen.
¶ Beispiel:
Wir haben einen Heltec v4 und möchten exakt die erlaubten 27 dBm erreichen.
-1 dBm-1 dBmDer Antennengewinn bezieht sich auf einen Isotropenstrahler.
Formel:
dBd = dBi - 2,15
Bei einer Antenne mit 6,5 dBi und realistischen Verlusten von etwa 35 % (30-40%):
6,5 \cdot 0,65 - 2,15 = 2,105\,dBm
27\,dBm + (1 + 1) - 2,105\,dBm = 26,895\,dBm < 27\,dBm
Das liegt somit innerhalb des erlaubten Limits von 27 dBm.
TX-Power Rechner – Meshcore
¶ TX-Power Rechner – Meshcore Sendeleistung
<!-- DEVICE SELECTOR -->
<div class="card">
<p class="section-label">Gerät auswählen</p>
<div style="margin-bottom: 1rem">
<label>Heltec Gerät</label>
<select id="device" onchange="onDeviceChange()">
<option value="v3">WiFi LoRa 32 V3</option>
<option value="v4hp" selected>
WiFi LoRa 32 V4 (High Power, mit PA)
</option>
<option value="v4lp">WiFi LoRa 32 V4 (Low Power, ohne PA)</option>
<option value="tracker1">Wireless Tracker V1.0 / V1.1</option>
<option value="tracker2">Wireless Tracker V2 (mit PA)</option>
<option value="t190">Vision Master T190 (1.9" TFT)</option>
<option value="t096">Mesh Node T096 (nRF52840, mit PA)</option>
<option value="t114">Mesh Node T114 (nRF52840, ohne PA)</option>
<option value="generic">Generisch / Anderes Gerät</option>
</select>
</div>
<div class="device-info" id="device-info"></div>
</div>
<!-- PARAMETER INPUTS -->
<div class="card">
<p class="section-label">Eingabeparameter</p>
<div class="grid-inputs">
<div>
<label>Gesetzliches Limit (dBm)</label>
<input
type="number"
id="limit"
value="27"
step="0.1"
oninput="calc()"
/>
</div>
<div>
<label>Kabelverlust (dBm)</label>
<input
type="number"
id="cable"
value="1"
step="0.1"
min="0"
oninput="calc()"
/>
</div>
<div>
<label>Messtoleranzverlust (dBm)</label>
<input
type="number"
id="tolerance"
value="1"
step="0.1"
min="0"
oninput="calc()"
/>
</div>
<div>
<label>Antennengewinn laut Hersteller (dBi)</label>
<input
type="number"
id="antgain"
value="6.5"
step="0.1"
min="0"
oninput="calc()"
/>
</div>
<div>
<label>Realistischer Faktor Antennengewinn (%)</label>
<div class="range-row">
<input
type="range"
id="factor"
min="50"
max="100"
value="65"
step="1"
oninput="
document.getElementById('factor-out').textContent =
this.value + '%';
calc();
"
/>
<span id="factor-out" class="range-val">65%</span>
</div>
</div>
</div>
</div>
<!-- RESULT HIGHLIGHT -->
<div id="result-highlight" class="result-highlight">
<div>
<div class="rh-label">Empfohlener Meshcore TX-Wert</div>
<div>
<span id="rh-value" class="rh-value">—</span>
<span class="rh-unit">dBm eintragen</span>
</div>
</div>
<div style="text-align: right">
<div class="rh-label">Tatsächliche Ausgangsleistung</div>
<div>
<span id="rh-actual" class="rh-value" style="font-size: 20px">—</span>
<span class="rh-unit">dBm</span>
</div>
</div>
</div>
<div id="warn-box" class="warn-box"></div>
<!-- RECHENWEG -->
<div class="card bg-secondary" style="margin-top: 1.25rem">
<p class="section-label">Rechenweg</p>
<div id="steps" class="steps"></div>
</div>
<!-- METRIC CARDS -->
<div class="grid-cards">
<div class="metric-card">
<div class="metric-label">Realer Antennengewinn</div>
<div id="out-ant" class="metric-value">—</div>
<div class="metric-unit">dBd</div>
</div>
<div class="metric-card">
<div class="metric-label">Berechnete TX-Power</div>
<div id="out-tx" class="metric-value">—</div>
<div class="metric-unit">dBm (theoretisch)</div>
</div>
<div class="metric-card">
<div class="metric-label">Gesetzliches Limit</div>
<div id="out-limit" class="metric-value">—</div>
<div class="metric-unit">dBm</div>
</div>
<div id="status-card" class="metric-card">
<div class="metric-label">Status</div>
<div id="out-status" class="metric-value" style="font-size: 15px">
—
</div>
<div id="out-margin" class="metric-unit"></div>
</div>
</div>
<script>
const DEVICES = {
v3: {
name: "WiFi LoRa 32 V3",
chip: "ESP32-S3 + SX1262",
display: '0.96" OLED',
maxTxInput: 21,
paBoost: 0,
maxActual: 21,
note: "Kein PA-Verstärker. Einfache SX1262-Variante.",
},
v4hp: {
name: "WiFi LoRa 32 V4 (High Power)",
chip: "ESP32-S3 + SX1262 + PA",
display: '0.96" OLED',
maxTxInput: 22,
paBoost: 6,
maxActual: 28,
note: "Integrierter PA (SE2431L, +6 dBm). TX-Wert 22 → ~28 dBm Ausgang.",
},
v4lp: {
name: "WiFi LoRa 32 V4 (Low Power)",
chip: "ESP32-S3 + SX1262",
display: '0.96" OLED',
maxTxInput: 22,
paBoost: 0,
maxActual: 22,
note: "Gleiche Platine, aber ohne PA-Verstärker bestückt.",
},
tracker1: {
name: "Wireless Tracker V1.0/V1.1",
chip: "ESP32-S3 + SX1262",
display: '0.96" TFT',
maxTxInput: 21,
paBoost: 0,
maxActual: 21,
note: "Mit UC6580 GPS. Kein PA – gleiche Leistung wie V3.",
},
tracker2: {
name: "Wireless Tracker V2",
chip: "ESP32-S3 + SX1262 + PA",
display: "TFT",
maxTxInput: 22,
paBoost: 6,
maxActual: 28,
note: "Aufgerüsteter PA wie V4 (28±1 dBm). Mit GPS.",
},
t190: {
name: "Vision Master T190",
chip: "ESP32-S3 + SX1262 (HT-RA62)",
display: '1.9" TFT',
maxTxInput: 22,
paBoost: 0,
maxActual: 22,
note: "LoRa-Modul optional (HT-RA62). Kein integrierter PA.",
},
t096: {
name: "Mesh Node T096",
chip: "nRF52840 + SX1262 + PA",
display: "TFT + GPS",
maxTxInput: 22,
paBoost: 6,
maxActual: 28,
note: "nRF52840-basiert. Integrierter PA, 28±1 dBm. Mit GPS.",
},
t114: {
name: "Mesh Node T114",
chip: "nRF52840 + SX1262",
display: '1.14" TFT',
maxTxInput: 21,
paBoost: 0,
maxActual: 21,
note: "nRF52840, kein PA. ~21 dBm Ausgangsleistung.",
},
generic: {
name: "Generisch / Anderes Gerät",
chip: "—",
display: "—",
maxTxInput: null,
paBoost: 0,
maxActual: null,
note: "Eigene Gerätewerte manuell berücksichtigen.",
},
};
function onDeviceChange() {
const key = document.getElementById("device").value;
const d = DEVICES[key];
const info = document.getElementById("device-info");
if (key === "generic") {
info.innerHTML =
'<div class="device-chip"><div class="chip-label">Hinweis</div><div class="chip-val">Manuell konfigurieren</div></div>';
} else {
info.innerHTML =
'<div class="device-chip"><div class="chip-label">Chip</div><div class="chip-val">' +
d.chip +
"</div></div>" +
'<div class="device-chip"><div class="chip-label">Display</div><div class="chip-val">' +
d.display +
"</div></div>" +
'<div class="device-chip"><div class="chip-label">Max TX-Eingabe</div><div class="chip-val">' +
d.maxTxInput +
" dBm</div></div>" +
'<div class="device-chip"><div class="chip-label">PA-Boost</div><div class="chip-val">' +
(d.paBoost > 0
? "+" +
d.paBoost +
' dBm <span class="badge badge-pa">PA aktiv</span>'
: '0 dBm <span class="badge badge-nopa">kein PA</span>') +
"</div></div>" +
'<div class="device-chip"><div class="chip-label">Max Ausgang</div><div class="chip-val">' +
d.maxActual +
" dBm</div></div>" +
'<div class="device-chip" style="grid-column: 1/-1"><div class="chip-label">Hinweis</div><div class="chip-val" style="font-size:12px; font-weight:400">' +
d.note +
"</div></div>";
}
calc();
}
function calc() {
const limit = parseFloat(document.getElementById("limit").value) || 0;
const cable = parseFloat(document.getElementById("cable").value) || 0;
const tol = parseFloat(document.getElementById("tolerance").value) || 0;
const antGaindBi =
parseFloat(document.getElementById("antgain").value) || 0;
const factor =
parseFloat(document.getElementById("factor").value) / 100;
const key = document.getElementById("device").value;
const dev = DEVICES[key];
const antRealdBi = antGaindBi * factor;
const antdBd = antRealdBi - 2.15;
const txCalc = limit + (cable + tol) - antdBd;
const margin = limit - txCalc;
document.getElementById("out-ant").textContent =
antdBd.toFixed(3) + " dBd";
document.getElementById("out-tx").textContent = txCalc.toFixed(3);
document.getElementById("out-limit").textContent = limit.toFixed(1);
// Device-aware result
let txEnter,
actualOut,
warnText = "";
const warnBox = document.getElementById("warn-box");
const hl = document.getElementById("result-highlight");
if (key === "generic" || dev.maxTxInput === null) {
txEnter = txCalc;
actualOut = txCalc;
warnBox.style.display = "none";
hl.style.background = "#1a5a9a";
} else {
txEnter = Math.min(txCalc, dev.maxTxInput);
actualOut = txEnter + dev.paBoost;
if (txCalc > dev.maxTxInput) {
warnText =
"⚠️ Berechneter Idealwert (" +
txCalc.toFixed(2) +
" dBm) überschreitet das Gerätelimit von " +
dev.maxTxInput +
" dBm. Max. einstellbarer Wert (" +
dev.maxTxInput +
") wird verwendet → Ausgang: " +
actualOut.toFixed(1) +
" dBm.";
warnBox.style.display = "block";
warnBox.textContent = warnText;
} else {
warnBox.style.display = "none";
}
if (actualOut > limit) {
hl.style.background = "#8b1a1a";
} else {
hl.style.background = "#1a5a9a";
}
}
document.getElementById("rh-value").textContent =
Math.round(txEnter * 10) / 10;
document.getElementById("rh-actual").textContent =
Math.round(actualOut * 10) / 10 + " dBm";
// Status card
const statusEl = document.getElementById("out-status");
const marginEl = document.getElementById("out-margin");
const statusCard = document.getElementById("status-card");
if (actualOut <= limit) {
statusEl.className = "metric-value status-ok";
statusEl.textContent = "✓ Konform";
statusCard.className = "metric-card card-ok";
marginEl.textContent =
"Puffer: " + Math.abs(limit - actualOut).toFixed(3) + " dBm";
} else {
statusEl.className = "metric-value status-err";
statusEl.textContent = "✗ Limit überschritten";
statusCard.className = "metric-card card-err";
marginEl.textContent =
"Überschreitung: +" +
Math.abs(limit - actualOut).toFixed(3) +
" dBm";
}
// Rechenweg
let paLine = "";
if (key !== "generic" && dev.paBoost > 0) {
paLine =
"<b>5.</b> PA-Boost (" +
dev.name +
"): " +
txEnter.toFixed(2) +
" + " +
dev.paBoost +
" (PA) = <b>" +
actualOut.toFixed(2) +
" dBm tatsächliche Ausgangsleistung</b><br>";
}
document.getElementById("steps").innerHTML =
"<b>1.</b> Realer Antennengewinn (dBi): " +
antGaindBi +
" × " +
(factor * 100).toFixed(0) +
"% = " +
antRealdBi.toFixed(3) +
" dBi<br>" +
"<b>2.</b> Umrechnung dBi → dBd: " +
antRealdBi.toFixed(3) +
" − 2,15 = <b>" +
antdBd.toFixed(3) +
" dBd</b><br>" +
"<b>3.</b> Verluste gesamt: Kabelverlust (" +
cable +
") + Messtoleranzverlust (" +
tol +
") = " +
(cable + tol).toFixed(2) +
" dBm<br>" +
"<b>4.</b> Berechneter TX-Wert: " +
limit +
" + (" +
cable +
" + " +
tol +
") − " +
antdBd.toFixed(3) +
" = <b>" +
txCalc.toFixed(3) +
" dBm</b><br>" +
paLine +
"<b>→</b> In Meshcore eintragen: <b>" +
Math.round(txEnter * 10) / 10 +
" dBm</b>" +
(key !== "generic" && dev.maxTxInput !== null
? " (Gerätelimit: " + dev.maxTxInput + " dBm)"
: "");
}
onDeviceChange();
</script>