@jjlmoya/utils-drones 1.5.0 → 1.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (74) hide show
  1. package/package.json +64 -63
  2. package/src/category/i18n/de.ts +106 -0
  3. package/src/category/i18n/id.ts +106 -0
  4. package/src/category/i18n/it.ts +106 -0
  5. package/src/category/i18n/ja.ts +106 -0
  6. package/src/category/i18n/ko.ts +106 -0
  7. package/src/category/i18n/nl.ts +106 -0
  8. package/src/category/i18n/pl.ts +106 -0
  9. package/src/category/i18n/pt.ts +106 -0
  10. package/src/category/i18n/ru.ts +106 -0
  11. package/src/category/i18n/sv.ts +106 -0
  12. package/src/category/i18n/tr.ts +106 -0
  13. package/src/category/i18n/zh.ts +106 -0
  14. package/src/category/index.ts +12 -0
  15. package/src/components/SecurityWarning.astro +140 -0
  16. package/src/tests/faq_count.test.ts +1 -1
  17. package/src/tests/i18n_coverage.test.ts +36 -0
  18. package/src/tests/locale_completeness.test.ts +2 -2
  19. package/src/tests/schemas_fulfillment.test.ts +23 -0
  20. package/src/tests/slug_uniqueness.test.ts +81 -0
  21. package/src/tests/title_quality.test.ts +55 -0
  22. package/src/tool/antenna-length-calculator/component.astro +70 -13
  23. package/src/tool/antenna-length-calculator/i18n/de.ts +276 -0
  24. package/src/tool/antenna-length-calculator/i18n/en.ts +76 -38
  25. package/src/tool/antenna-length-calculator/i18n/es.ts +76 -38
  26. package/src/tool/antenna-length-calculator/i18n/fr.ts +76 -38
  27. package/src/tool/antenna-length-calculator/i18n/id.ts +242 -0
  28. package/src/tool/antenna-length-calculator/i18n/it.ts +276 -0
  29. package/src/tool/antenna-length-calculator/i18n/ja.ts +276 -0
  30. package/src/tool/antenna-length-calculator/i18n/ko.ts +276 -0
  31. package/src/tool/antenna-length-calculator/i18n/nl.ts +276 -0
  32. package/src/tool/antenna-length-calculator/i18n/pl.ts +276 -0
  33. package/src/tool/antenna-length-calculator/i18n/pt.ts +276 -0
  34. package/src/tool/antenna-length-calculator/i18n/ru.ts +276 -0
  35. package/src/tool/antenna-length-calculator/i18n/sv.ts +276 -0
  36. package/src/tool/antenna-length-calculator/i18n/tr.ts +276 -0
  37. package/src/tool/antenna-length-calculator/i18n/zh.ts +276 -0
  38. package/src/tool/antenna-length-calculator/index.ts +12 -0
  39. package/src/tool/drone-flight-time/component.astro +320 -319
  40. package/src/tool/drone-flight-time/components/FlightDashboard.astro +6 -0
  41. package/src/tool/drone-flight-time/i18n/de.ts +238 -0
  42. package/src/tool/drone-flight-time/i18n/en.ts +76 -38
  43. package/src/tool/drone-flight-time/i18n/es.ts +76 -38
  44. package/src/tool/drone-flight-time/i18n/fr.ts +76 -38
  45. package/src/tool/drone-flight-time/i18n/id.ts +238 -0
  46. package/src/tool/drone-flight-time/i18n/it.ts +238 -0
  47. package/src/tool/drone-flight-time/i18n/ja.ts +239 -0
  48. package/src/tool/drone-flight-time/i18n/ko.ts +239 -0
  49. package/src/tool/drone-flight-time/i18n/nl.ts +239 -0
  50. package/src/tool/drone-flight-time/i18n/pl.ts +239 -0
  51. package/src/tool/drone-flight-time/i18n/pt.ts +239 -0
  52. package/src/tool/drone-flight-time/i18n/ru.ts +239 -0
  53. package/src/tool/drone-flight-time/i18n/sv.ts +239 -0
  54. package/src/tool/drone-flight-time/i18n/tr.ts +239 -0
  55. package/src/tool/drone-flight-time/i18n/zh.ts +239 -0
  56. package/src/tool/drone-flight-time/index.ts +12 -0
  57. package/src/tool/gps-coordinates-converter/component.astro +473 -549
  58. package/src/tool/gps-coordinates-converter/components/GpsHistory.astro +6 -1
  59. package/src/tool/gps-coordinates-converter/i18n/de.ts +222 -0
  60. package/src/tool/gps-coordinates-converter/i18n/en.ts +76 -20
  61. package/src/tool/gps-coordinates-converter/i18n/es.ts +76 -20
  62. package/src/tool/gps-coordinates-converter/i18n/fr.ts +75 -2
  63. package/src/tool/gps-coordinates-converter/i18n/id.ts +222 -0
  64. package/src/tool/gps-coordinates-converter/i18n/it.ts +222 -0
  65. package/src/tool/gps-coordinates-converter/i18n/ja.ts +222 -0
  66. package/src/tool/gps-coordinates-converter/i18n/ko.ts +222 -0
  67. package/src/tool/gps-coordinates-converter/i18n/nl.ts +222 -0
  68. package/src/tool/gps-coordinates-converter/i18n/pl.ts +222 -0
  69. package/src/tool/gps-coordinates-converter/i18n/pt.ts +222 -0
  70. package/src/tool/gps-coordinates-converter/i18n/ru.ts +222 -0
  71. package/src/tool/gps-coordinates-converter/i18n/sv.ts +222 -0
  72. package/src/tool/gps-coordinates-converter/i18n/tr.ts +222 -0
  73. package/src/tool/gps-coordinates-converter/i18n/zh.ts +222 -0
  74. package/src/tool/gps-coordinates-converter/index.ts +12 -0
@@ -0,0 +1,55 @@
1
+ import { describe, it } from 'vitest';
2
+ import fs from 'node:fs';
3
+ import path from 'node:path';
4
+
5
+ function getFiles(dir: string, ext: string[]): string[] {
6
+ const results: string[] = [];
7
+ if (!fs.existsSync(dir)) return results;
8
+ const list = fs.readdirSync(dir);
9
+ for (const file of list) {
10
+ const fullPath = path.join(dir, file);
11
+ const stat = fs.statSync(fullPath);
12
+ if (stat && stat.isDirectory()) {
13
+ results.push(...getFiles(fullPath, ext));
14
+ } else if (ext.some((e) => file.endsWith(e))) {
15
+ results.push(fullPath);
16
+ }
17
+ }
18
+ return results;
19
+ }
20
+
21
+ const SRC_DIR = path.join(process.cwd(), 'src');
22
+
23
+ describe('Project Titles - Separator Validation', () => {
24
+ const files = [
25
+ ...getFiles(path.join(SRC_DIR, 'tool'), ['.ts']),
26
+ ...getFiles(path.join(SRC_DIR, 'category'), ['.ts']),
27
+ ].filter(f => f.includes('i18n'));
28
+
29
+ it.each(files)('Verify that titles in %s do not contain | or -', (filePath) => {
30
+ const content = fs.readFileSync(filePath, 'utf-8');
31
+ const relativePath = path.relative(process.cwd(), filePath);
32
+
33
+ const titlePatterns = [
34
+ /const\s+title\s*=\s*['"]([^'"]+)['"]/g,
35
+ /title\s*:\s*['"]([^'"]+)['"]/g,
36
+ ];
37
+
38
+ const findings: string[] = [];
39
+
40
+ for (const pattern of titlePatterns) {
41
+ let match;
42
+ while ((match = pattern.exec(content)) !== null) {
43
+ const title = match[1];
44
+ if (title.includes('|') || title.includes('-')) {
45
+ findings.push(title);
46
+ }
47
+ }
48
+ }
49
+
50
+ if (findings.length > 0) {
51
+ const list = findings.map((f) => ` - "${f}"`).join('\n');
52
+ throw new Error(`Forbidden separators (| or -) found in titles in ${relativePath}:\n${list}`);
53
+ }
54
+ });
55
+ });
@@ -213,26 +213,35 @@ const materials = [
213
213
  }
214
214
  }
215
215
 
216
- function calculate() {
217
- const freq = parseFloat(freqInput.value);
218
- const vf = parseFloat(vfInput.value);
219
- const waveType = getWaveType();
220
-
221
- if (!freq || freq <= 0) return;
216
+ function validateInputs() {
217
+ if (!freqInput || !(freqInput as HTMLInputElement).value || !vfInput) return null;
218
+ const freq = parseFloat((freqInput as HTMLInputElement).value);
219
+ const vf = parseFloat((vfInput as HTMLSelectElement).value);
220
+ return freq > 0 ? { freq, vf } : null;
221
+ }
222
222
 
223
+ function calculateLengths(freq, vf, waveType) {
223
224
  const lambda = 300000 / freq;
224
225
  const totalPhysicalLambda = lambda * vf;
225
-
226
226
  const totalLen = waveType === 'half' ? totalPhysicalLambda / 2 : totalPhysicalLambda / 4;
227
227
  const branchLen = waveType === 'half' ? totalLen / 2 : totalLen;
228
+ return { totalLen, branchLen };
229
+ }
228
230
 
229
- updateLayerVisibility(waveType);
230
- updateVisuals(waveType, waveType === 'half' ? branchLen : totalLen);
231
-
231
+ function displayLengths(totalLen, branchLen) {
232
232
  if (elements.total) elements.total.textContent = Math.round(totalLen).toString();
233
233
  if (elements.branch) elements.branch.textContent = Math.round(branchLen).toString();
234
+ }
234
235
 
235
- updateHarmonics(freq);
236
+ function calculate() {
237
+ const inputs = validateInputs();
238
+ if (!inputs) return;
239
+ const waveType = getWaveType();
240
+ const { totalLen, branchLen } = calculateLengths(inputs.freq, inputs.vf, waveType);
241
+ updateLayerVisibility(waveType);
242
+ updateVisuals(waveType, waveType === 'half' ? branchLen : totalLen);
243
+ displayLengths(totalLen, branchLen);
244
+ updateHarmonics(inputs.freq);
236
245
  }
237
246
 
238
247
  function setArmAttributes(x, isLeft) {
@@ -1005,7 +1014,8 @@ const materials = [
1005
1014
  box-shadow: 0 2px 5px rgba(0,0,0,0.02);
1006
1015
  }
1007
1016
 
1008
- :global(.dark) .custom-select-premium {
1017
+ :global([data-theme="dark"]) .custom-select-premium,
1018
+ :global(.theme-dark) .custom-select-premium {
1009
1019
  background-color: rgba(15, 23, 42, 0.4);
1010
1020
  border-color: rgba(255,255,255,0.1);
1011
1021
  color: white;
@@ -1024,7 +1034,54 @@ const materials = [
1024
1034
  letter-spacing: 0.1em;
1025
1035
  }
1026
1036
 
1027
- :global(.dark) .svg-label-text {
1037
+ :global([data-theme="dark"]) .svg-label-text,
1038
+ :global(.theme-dark) .svg-label-text {
1028
1039
  fill: #666;
1029
1040
  }
1041
+ .antenna-calculator-ui .security-warning {
1042
+ margin-top: 2rem;
1043
+ padding: 1.5rem 2rem;
1044
+ background: rgba(239, 68, 68, 0.05);
1045
+ border: 1px solid rgba(239, 68, 68, 0.2);
1046
+ border-left: 4px solid #ef4444;
1047
+ border-radius: 20px;
1048
+ display: flex;
1049
+ align-items: flex-start;
1050
+ gap: 1.25rem;
1051
+ transition: all 0.3s ease;
1052
+ }
1053
+
1054
+ :global([data-theme="dark"]) .antenna-calculator-ui .security-warning,
1055
+ :global(.theme-dark) .antenna-calculator-ui .security-warning {
1056
+ background: rgba(239, 68, 68, 0.1);
1057
+ border-color: rgba(239, 68, 68, 0.3);
1058
+ }
1059
+
1060
+ .antenna-calculator-ui .security-warning:hover {
1061
+ transform: translateY(-2px);
1062
+ background: rgba(239, 68, 68, 0.08);
1063
+ box-shadow: 0 15px 30px rgba(239, 68, 68, 0.1);
1064
+ }
1065
+
1066
+ .antenna-calculator-ui .security-warning [data-icon] {
1067
+ width: 24px;
1068
+ height: 24px;
1069
+ color: #ef4444;
1070
+ flex-shrink: 0;
1071
+ }
1072
+
1073
+ .antenna-calculator-ui .security-warning p {
1074
+ margin: 0;
1075
+ font-size: 0.95rem;
1076
+ line-height: 1.6;
1077
+ color: var(--antenna-text);
1078
+ font-weight: 500;
1079
+ }
1080
+
1081
+ .antenna-calculator-ui .security-warning strong {
1082
+ color: #ef4444;
1083
+ font-weight: 800;
1084
+ text-transform: uppercase;
1085
+ letter-spacing: 0.02em;
1086
+ }
1030
1087
  </style>
@@ -0,0 +1,276 @@
1
+ import type { AntennaLengthCalculatorLocaleContent } from '../index';
2
+ import type { WithContext, SoftwareApplication, FAQPage, HowTo } from 'schema-dts';
3
+
4
+ const slug = 'rf-antennenlaenge-rechner';
5
+ const title = 'RF Antennenlaenge Rechner fur FPV Dipole und Peitschen';
6
+ const description = 'Berechnen Sie die genaue Messung für Ihre 868-MHz-, 2,4-GHz- und 5,8-GHz-Antennen. Verbessern Sie die Reichweite Ihrer Drohne und vermeiden Sie, Ihren Sender mit optimiertem SWR zu verbrennen.';
7
+
8
+ const faqItems = [
9
+ {
10
+ question: 'Warum muss mein Antennendraht eine bestimmte Länge haben?',
11
+ answer: 'Funkwellen resonieren bei Vielfachen ihrer Wellenlänge. Wenn der Draht nicht mit dieser Resonanz übereinstimmt, wird Energie an den Sender zurückreflektiert, anstatt abgestrahlt zu werden, was das Gerät verbrennen kann.',
12
+ },
13
+ {
14
+ question: 'Was ist der Verkürzungsfaktor (Vf)?',
15
+ answer: 'Das ist das Verhältnis zwischen der Geschwindigkeit, mit der sich ein Signal durch einen Leiter bewegt, und der Lichtgeschwindigkeit. Bei Kupfer liegt er typischerweise bei 0.95, was bedeutet, dass die Welle 5% langsamer ist und die Antenne 5% kürzer sein muss.',
16
+ },
17
+ {
18
+ question: 'Ist ein Dipol oder eine Peitschenantenne besser?',
19
+ answer: 'Ein Dipol (1/2 Welle) ist effizienter und vorhersehbarer, aber voluminöser. Eine Peitsche (1/4 Welle) ist kompakt und ideal für kleine Empfänger, erfordert aber eine Massefläche (Ground plane), um gut zu funktionieren.',
20
+ },
21
+ {
22
+ question: 'Welchen Einfluss hat die Kabeldicke auf die Antenne?',
23
+ answer: 'Dickere Drähte haben eine größere Bandbreite (sie sind weniger kritisch hinsichtlich der genauen Frequenz), aber ihr Verkürzungsfaktor ändert sich leicht. Für die meisten FPV-Drohnen ist handelsüblicher 20-22AWG-Draht ideal.',
24
+ },
25
+ ];
26
+
27
+ const howToSteps = [
28
+ {
29
+ name: 'Frequenz auswählen',
30
+ text: 'Geben Sie die genaue Frequenz in MHz ein oder verwenden Sie einen der Schnellbuttons für 5.8GHz, 2.4GHz oder 868MHz.',
31
+ },
32
+ {
33
+ name: 'Antennentyp wählen',
34
+ text: 'Entscheiden Sie sich, ob sie einen vollen Dipol (1/2 Welle) oder eine vertikale Peitschenantenne (1/4 Welle) bauen.',
35
+ },
36
+ {
37
+ name: 'Material anpassen',
38
+ text: 'Wählen Sie den Drahttrakt aus, damit der Kalkulator den korrekten Verkürzungsfaktor anwenden kann.',
39
+ },
40
+ {
41
+ name: 'Mit Präzision zuschneiden',
42
+ text: 'Verwenden Sie das Maß "Länge pro Arm", um jedes Element zu schneiden. Vergessen Sie nicht, ab dem Lötpunkt zu messen.',
43
+ },
44
+ ];
45
+
46
+ const schemas: AntennaLengthCalculatorLocaleContent['schemas'] = [
47
+ {
48
+ '@context': 'https://schema.org',
49
+ '@type': 'FAQPage',
50
+ mainEntity: faqItems.map((item) => ({
51
+ '@type': 'Question',
52
+ name: item.question,
53
+ acceptedAnswer: { '@type': 'Answer', text: item.answer },
54
+ })),
55
+ } as WithContext<FAQPage>,
56
+ {
57
+ '@context': 'https://schema.org',
58
+ '@type': 'HowTo',
59
+ name: title,
60
+ description: description,
61
+ step: howToSteps.map((step, i) => ({
62
+ '@type': 'HowToStep',
63
+ position: i + 1,
64
+ name: step.name,
65
+ text: step.text,
66
+ })),
67
+ } as WithContext<HowTo>,
68
+ {
69
+ '@context': 'https://schema.org',
70
+ '@type': 'SoftwareApplication',
71
+ name: title,
72
+ description: description,
73
+ applicationCategory: 'OtherApplication',
74
+ operatingSystem: 'Web',
75
+ offers: { '@type': 'Offer', price: '0', priceCurrency: 'EUR' },
76
+ } as WithContext<SoftwareApplication>,
77
+ ];
78
+
79
+ export const content: AntennaLengthCalculatorLocaleContent = {
80
+ slug,
81
+ title,
82
+ description,
83
+ faqTitle: 'Häufig gestellte Fragen',
84
+ bibliographyTitle: 'Literaturhinweise',
85
+ ui: {
86
+ faqTitle: 'Häufig gestellte Fragen',
87
+ bibliographyTitle: 'Literaturhinweise',
88
+ signalParameters: 'Signalparameter',
89
+ antennaType: 'Antennentyp',
90
+ dipole: 'Dipol (1/2 λ)',
91
+ whip: 'Peitsche (1/4 λ)',
92
+ conductorMedium: 'Leitermedium',
93
+ totalLength: 'Gesamtlänge',
94
+ branchLength: 'Zweiglänge',
95
+ secondaryResonance: 'Sekundäre Resonanzpunkte',
96
+ swrIdeal: 'Ideales SWR',
97
+ impedance: 'Impedanz',
98
+ criticalNotice: 'Wichtiger Hinweis',
99
+ criticalNoticeText: 'Eine schlecht geschnittene Antenne erzeugt ein hohes SWR, das die Leistungsendstufen Ihres Senders in Sekunden überhitzen und zerstören kann.',
100
+ dynamicScheme: 'Dynamisches Schema (mm)',
101
+ harmonicLabel: 'Harmonische',
102
+ presetFpv: '5.8 GHz (FPV)',
103
+ presetWifi: '2.4 GHz (Wi-Fi)',
104
+ presetElrs: '915 MHz (ELRS)',
105
+ presetLrs: '868 MHz (LRS)',
106
+ presetUhf: '433 MHz (UHF)',
107
+ presetMbus: '169 MHz (M-Bus)',
108
+ materialBareCopper: 'Blankes Kupfer (0.95)',
109
+ materialPvcInsulated: 'PVC isoliertes Kabel (0.92)',
110
+ materialSolidRod: 'Massivstab (0.97)',
111
+ materialCoaxial: 'Koaxialkabel (0.66)',
112
+ },
113
+ seo: [
114
+ {
115
+ type: 'title',
116
+ text: 'Warum ist die Länge Ihrer RF-Antenne so wichtig?',
117
+ level: 2,
118
+ },
119
+ {
120
+ type: 'paragraph',
121
+ html: 'Wenn Sie sich jemals gefragt haben, warum Antennen von FPV-Renndrohnen, Long-Range-Fernsteuerungen oder sogar von Ihrem WLAN-Router so spezifische Längen aufweisen, liegt die Antwort in der Physik der Resonanz. Eine Antenne ist mehr als nur ein Stück leitfähiger Draht; es ist ein Bauteil, das mit der Frequenz der elektromagnetischen Welle "in Resonanz" stehen muss, die es empfängt oder abstrahlt.',
122
+ },
123
+ {
124
+ type: 'paragraph',
125
+ html: 'Wenn Sie Ihre eigene Antenne bauen, sei es ein <strong>Dipol</strong> für 868 MHz oder eine <strong>Peitschenantenne</strong> für 5,8 GHz, wird die Genauigkeit in Millimetern gemessen. Ein Fehler von nur 2 oder 3 mm kann dazu führen, dass die Antenne ineffizient wird, was ein hohes Stehwellenverhältnis (SWR, Standing Wave Ratio) verursacht.',
126
+ },
127
+ {
128
+ type: 'title',
129
+ text: 'Grundkonzepte: Wellenlänge und Resonanz',
130
+ level: 3,
131
+ },
132
+ {
133
+ type: 'paragraph',
134
+ html: 'Hochfrequenz (RF) reist mit Lichtgeschwindigkeit (ca. 300.000 Kilometer pro Sekunde). Damit eine Antenne Energie optimal abgeben oder empfangen kann, muss ihre physische Größe in direktem Verhältnis zur Strecke stehen, die ein vollständiger Zyklus der Welle zurücklegt – der sogenannten <strong>Wellenlänge (λ)</strong>.',
135
+ },
136
+ {
137
+ type: 'paragraph',
138
+ html: 'Die Grundformel zur Berechnung der Wellenlänge lautet λ = v / f, wobei \'v\' die Ausbreitungsgeschwindigkeit und \'f\' die Frequenz ist. In der realen Welt bewegt sich Strom durch Metalle jedoch etwas langsamer aus als im Vakuum. Hier kommt der <strong>Verkürzungsfaktor (Vf)</strong> ins Spiel.',
139
+ },
140
+ {
141
+ type: 'list',
142
+ items: [
143
+ 'Blankes Kupfer: Hat einen Vf von etwa 0.95.',
144
+ 'Isolierte Kabel (PVC): Die Isolierung verlangsamt die Welle und senkt den Faktor auf 0.92 oder weniger.',
145
+ 'Massiver Kupferstab: Da sie dicker und gut leitend sind, steigt der Faktor leicht auf 0.97.',
146
+ ],
147
+ },
148
+ {
149
+ type: 'title',
150
+ text: 'Gängige Antennentypen für Drohnen und Maker-Projekte',
151
+ level: 3,
152
+ },
153
+ {
154
+ type: 'paragraph',
155
+ html: '<strong>1. Halbwellen-Dipolantenne (1/2 λ):</strong> Dies ist der Goldstandard für viele Anwendungen. Sie besteht aus zwei Armen (strahlenden Elementen), die zusammen die Hälfte der Wellenlänge der Betriebsfrequenz ausmachen. Sie ist eine symmetrische Antenne, die ein "Donut"-förmiges Strahlungsmuster bietet und sehr einfach aus Koaxialkabel hergestellt werden kann.',
156
+ },
157
+ {
158
+ type: 'paragraph',
159
+ html: '<strong>2. Viertelwellen-Peitsche oder Monopolantenne (1/4 λ):</strong> Das ist es, was wir normalerweise an Funkempfängern oder kleinen Drohnen sehen. Sie hat nur ein Strahlerelement und nutzt das Chassis des Geräts oder eine Massefläche, um die andere Hälfte der Welle zu "reflektieren". Ihre Länge entspricht genau der Hälfte eines Dipols, daher der Name Viertelwelle.',
160
+ },
161
+ {
162
+ type: 'title',
163
+ text: 'Kritische Frequenzen und Anwendungen',
164
+ level: 3,
165
+ },
166
+ {
167
+ type: 'paragraph',
168
+ html: 'Jedes Frequenzband hat seine Eigenheiten. Mit unserem Rechner können Sie die Messungen für die am häufigsten im Hobby verwendeten Bänder anpassen:',
169
+ },
170
+ {
171
+ type: 'list',
172
+ items: [
173
+ '5,8 GHz (FPV Video): Die Längen sind winzig (ca. 12-13 mm für den Strahler). Jedes bisschen zu viel Lötzinn kann die Leistung ruinieren.',
174
+ '2,4 GHz (Steuerung und WLAN): Ein stark genutztes Band, bei dem die Antenneneffizienz der Schlüssel zur Vermeidung von Verbindungsverlusten (Failsafe) ist.',
175
+ '868 MHz / 915 MHz (Long Range): Verwendet von Systemen wie Team BlackSheep Crossfire oder ExpressLRS. Hier sind die Antennen größer (ca. 8 cm pro Arm) und durchdringen Hindernisse leichter.',
176
+ '433 MHz (UHF): Der alte Long-Range-Standard mit großen Antennen, ideal für Flüge über viele Kilometer.',
177
+ ],
178
+ },
179
+ {
180
+ type: 'title',
181
+ text: 'Technische Referenz: SWR- und Verlusttabelle',
182
+ level: 3,
183
+ },
184
+ {
185
+ type: 'paragraph',
186
+ html: 'Für eine optimale Leistung sollte das SWR so nah wie möglich bei 1.0 liegen. Hier ist eine Referenz, wie das SWR Ihre Übertragungsleistung beeinflusst:',
187
+ },
188
+ {
189
+ type: 'table',
190
+ headers: ['SWR', 'Rückflussdämpfung', 'Reflektierte Leistung', 'Status'],
191
+ rows: [
192
+ ['1.0:1', '-∞ dB', '0%', '<strong>Perfekt</strong>'],
193
+ ['1.2:1', '-21 dB', '0.8%', 'Exzellent'],
194
+ ['1.5:1', '-14 dB', '4.0%', 'Gut'],
195
+ ['2.0:1', '-9.5 dB', '11.1%', 'Akzeptables Limit'],
196
+ ['3.0:1', '-6.0 dB', '25.0%', '<strong>Gefährlich</strong>'],
197
+ ],
198
+ },
199
+ {
200
+ type: 'title',
201
+ text: 'Die Bedeutung der 50 Ohm',
202
+ level: 3,
203
+ },
204
+ {
205
+ type: 'paragraph',
206
+ html: 'Fast alle Funksysteme, die in Drohnen und RC-Modellen verwendet werden (VTx, Empfänger, Steuerungen), sind für eine <strong>charakteristische Impedanz von 50 Ohm</strong> ausgelegt. Eine perfekt resonante Dipolantenne hat im freien Raum typischerweise eine Impedanz nahe 73 Ohm, aber wenn sie auf einer Drohne installiert wird oder wenn der Armwinkel angepasst wird (Inverted-V), nähert sie sich den idealen 50 Ohm. Die Verwendung von 75-Ohm-Koaxialkabeln (wie bei alten TV-Kabeln) führt zu einer Fehlanpassung, die das Signal verschlechtert, egal wie gut Sie die Antenne zuschneiden.',
207
+ },
208
+ {
209
+ type: 'title',
210
+ text: 'Die Gefahr von hohem SWR: Schützen Sie Ihren VTx',
211
+ level: 3,
212
+ },
213
+ {
214
+ type: 'paragraph',
215
+ html: 'Warum bestehen wir so sehr auf Genauigkeit? Wenn die Antenne nicht die richtige Länge hat, kann sie nicht die gesamte Energie abstrahlen, die vom Videosender (VTx) gesendet wird. Diese Energie "prallt ab" und kehrt als Wärme zum Sender zurück.',
216
+ },
217
+ {
218
+ type: 'paragraph',
219
+ html: 'Ein hohes SWR ist die häufigste Ursache für verbrannte Sender. Wenn Sie ohne Antenne oder mit einer schlecht geschnittenen fliegen, überhitzen die internen Komponenten in Sekundenschnelle und machen Ihr Gerät unbrauchbar. Die Nutzung dieses Tools zur Überprüfung Ihrer Zuschnitte ist die beste Sicherheitsinvestition für Ihre Drohne.',
220
+ },
221
+ {
222
+ type: 'title',
223
+ text: 'Harmonische Oberwellen: Interferenz verstehen',
224
+ level: 3,
225
+ },
226
+ {
227
+ type: 'paragraph',
228
+ html: 'Eine auf 868 MHz zugeschnittene Antenne resoniert nicht nur auf dieser Frequenz. Auf Grund der Natur von Sinuswellen wird sie auch Resonanzpunkte bei ihren ungeraden Vielfachen (3., 5., 7. Harmonische) haben.',
229
+ },
230
+ {
231
+ type: 'paragraph',
232
+ html: 'Das ist besonders wichtig zu wissen, denn selbst wenn Ihre Antenne auf 868 MHz sendet, könnten Sie "Rauschen" oder Interferenzen auf höheren Frequenzen erzeugen, falls der Sender nicht gut gefiltert ist. Der Harmonikarechner hilft Ihnen, vorherzusagen, wo diese Phantom-Signale auftreten könnten.',
233
+ },
234
+ ],
235
+ faq: [
236
+ {
237
+ question: 'Warum muss mein Antennendraht eine bestimmte Länge haben?',
238
+ answer: 'Funkwellen resonieren bei Vielfachen ihrer Wellenlänge. Wenn der Draht nicht mit dieser Resonanz übereinstimmt, wird Energie an den Sender zurückreflektiert, anstatt abgestrahlt zu werden, was das Gerät verbrennen kann.',
239
+ },
240
+ {
241
+ question: 'Was ist der Verkürzungsfaktor (Vf)?',
242
+ answer: 'Das ist das Verhältnis zwischen der Geschwindigkeit, mit der sich ein Signal durch einen Leiter bewegt, und der Lichtgeschwindigkeit. Bei Kupfer liegt er typischerweise bei 0.95, was bedeutet, dass die Welle 5% langsamer ist und die Antenne 5% kürzer sein muss.',
243
+ },
244
+ {
245
+ question: 'Ist ein Dipol oder eine Peitschenantenne besser?',
246
+ answer: 'Ein Dipol (1/2 Welle) ist effizienter und vorhersehbarer, aber voluminöser. Eine Peitsche (1/4 Welle) ist kompakt und ideal für kleine Empfänger, erfordert aber eine Massefläche (Ground plane), um gut zu funktionieren.',
247
+ },
248
+ {
249
+ question: 'Welchen Einfluss hat die Kabeldicke auf die Antenne?',
250
+ answer: 'Dickere Drähte haben eine größere Bandbreite (sie sind weniger kritisch hinsichtlich der genauen Frequenz), aber ihr Verkürzungsfaktor ändert sich leicht. Für die meisten FPV-Drohnen ist handelsüblicher 20-22AWG-Draht ideal.',
251
+ },
252
+ ],
253
+ bibliography: [
254
+ { name: 'Der Viertelwellen-Monopol', url: 'https://www.antenna-theory.com/antennas/monopole.php' },
255
+ { name: 'Verkürzungsfaktor von Übertragungsleitungen', url: 'https://en.wikipedia.org/wiki/Velocity_factor' },
256
+ ],
257
+ howTo: [
258
+ {
259
+ name: 'Frequenz auswählen',
260
+ text: 'Geben Sie die genaue Frequenz in MHz ein oder verwenden Sie einen der Schnellbuttons für 5.8GHz, 2.4GHz oder 868MHz.',
261
+ },
262
+ {
263
+ name: 'Antennentyp wählen',
264
+ text: 'Entscheiden Sie sich, ob sie einen vollen Dipol (1/2 Welle) oder eine vertikale Peitschenantenne (1/4 Welle) bauen.',
265
+ },
266
+ {
267
+ name: 'Material anpassen',
268
+ text: 'Wählen Sie den Drahttrakt aus, damit der Kalkulator den korrekten Verkürzungsfaktor anwenden kann.',
269
+ },
270
+ {
271
+ name: 'Mit Präzision zuschneiden',
272
+ text: 'Verwenden Sie das Maß "Länge pro Arm", um jedes Element zu schneiden. Vergessen Sie nicht, ab dem Lötpunkt zu messen.',
273
+ },
274
+ ],
275
+ schemas,
276
+ };
@@ -1,9 +1,81 @@
1
1
  import type { AntennaLengthCalculatorLocaleContent } from '../index';
2
+ import type { WithContext, SoftwareApplication, FAQPage, HowTo } from 'schema-dts';
2
3
 
3
4
  const slug = 'antenna-length-calculator';
4
- const title = 'RF Antenna Length Calculator | FPV Dipoles and Whips';
5
+ const title = 'RF Antenna Length Calculator for FPV Dipoles and Whips';
5
6
  const description = 'Calculate the exact measurement for your 868MHz, 2.4GHz, and 5.8GHz antennas. Improve your drone\'s range and avoid burning your transmitter with optimized SWR.';
6
7
 
8
+ const faqItems = [
9
+ {
10
+ question: 'Why must my antenna wire have a specific length?',
11
+ answer: 'Radio waves resonate at multiples of their wavelength. If the wire doesn\'t match this resonance, energy reflects back to the transmitter instead of radiating, which can burn the equipment.',
12
+ },
13
+ {
14
+ question: 'What is the Velocity Factor (Vf)?',
15
+ answer: 'It is the ratio between the speed at which a signal travels through a conductor and the speed of light. In copper, it is typically 0.95, meaning the wave travels 5% slower and the antenna must be 5% shorter.',
16
+ },
17
+ {
18
+ question: 'Is a dipole or a whip antenna better?',
19
+ answer: 'A dipole (1/2 wave) is more efficient and predictable but bulkier. A whip (1/4 wave) is compact and ideal for small receivers, though it requires a ground plane to function well.',
20
+ },
21
+ {
22
+ question: 'How does wire thickness affect the antenna?',
23
+ answer: 'Thicker wires have a wider bandwidth (they are less critical regarding exact frequency), but their velocity factor changes slightly. For most FPV drones, standard 20-22AWG wire is ideal.',
24
+ },
25
+ ];
26
+
27
+ const howToSteps = [
28
+ {
29
+ name: 'Select Frequency',
30
+ text: 'Enter the exact frequency in MHz or use one of the quick buttons for 5.8GHz, 2.4GHz, or 868MHz.',
31
+ },
32
+ {
33
+ name: 'Choose Antenna Type',
34
+ text: 'Decide whether you will make a full dipole (1/2 wave) or a vertical whip antenna (1/4 wave).',
35
+ },
36
+ {
37
+ name: 'Adjust Material',
38
+ text: 'Choose the type of wire you will use so the calculator applies the correct velocity factor.',
39
+ },
40
+ {
41
+ name: 'Cut with Precision',
42
+ text: 'Use the "Length per arm" measurement to cut each element. Remember to measure from the solder point.',
43
+ },
44
+ ];
45
+
46
+ const schemas: AntennaLengthCalculatorLocaleContent['schemas'] = [
47
+ {
48
+ '@context': 'https://schema.org',
49
+ '@type': 'FAQPage',
50
+ mainEntity: faqItems.map((item) => ({
51
+ '@type': 'Question',
52
+ name: item.question,
53
+ acceptedAnswer: { '@type': 'Answer', text: item.answer },
54
+ })),
55
+ } as WithContext<FAQPage>,
56
+ {
57
+ '@context': 'https://schema.org',
58
+ '@type': 'HowTo',
59
+ name: title,
60
+ description: description,
61
+ step: howToSteps.map((step, i) => ({
62
+ '@type': 'HowToStep',
63
+ position: i + 1,
64
+ name: step.name,
65
+ text: step.text,
66
+ })),
67
+ } as WithContext<HowTo>,
68
+ {
69
+ '@context': 'https://schema.org',
70
+ '@type': 'SoftwareApplication',
71
+ name: title,
72
+ description: description,
73
+ applicationCategory: 'OtherApplication',
74
+ operatingSystem: 'Web',
75
+ offers: { '@type': 'Offer', price: '0', priceCurrency: 'EUR' },
76
+ } as WithContext<SoftwareApplication>,
77
+ ];
78
+
7
79
  export const content: AntennaLengthCalculatorLocaleContent = {
8
80
  slug,
9
81
  title,
@@ -160,45 +232,11 @@ export const content: AntennaLengthCalculatorLocaleContent = {
160
232
  html: 'This is vital to know because even if your antenna is emitting at 868MHz, you could be generating "noise" or interference at higher frequencies if the transmitter is not well-filtered. The harmonics calculator helps you predict where these ghost signals might appear.',
161
233
  },
162
234
  ],
163
- faq: [
164
- {
165
- question: 'Why must my antenna wire have a specific length?',
166
- answer: 'Radio waves resonate at multiples of their wavelength. If the wire doesn\'t match this resonance, energy reflects back to the transmitter instead of radiating, which can burn the equipment.',
167
- },
168
- {
169
- question: 'What is the Velocity Factor (Vf)?',
170
- answer: 'It is the ratio between the speed at which a signal travels through a conductor and the speed of light. In copper, it is typically 0.95, meaning the wave travels 5% slower and the antenna must be 5% shorter.',
171
- },
172
- {
173
- question: 'Is a dipole or a whip antenna better?',
174
- answer: 'A dipole (1/2 wave) is more efficient and predictable but bulkier. A whip (1/4 wave) is compact and ideal for small receivers, though it requires a ground plane to function well.',
175
- },
176
- {
177
- question: 'How does wire thickness affect the antenna?',
178
- answer: 'Thicker wires have a wider bandwidth (they are less critical regarding exact frequency), but their velocity factor changes slightly. For most FPV drones, standard 20-22AWG wire is ideal.',
179
- },
180
- ],
235
+ faq: faqItems,
181
236
  bibliography: [
182
237
  { name: 'The Quarter-Wave Monopole', url: 'https://www.antenna-theory.com/antennas/monopole.php' },
183
238
  { name: 'Velocity Factor of Transmission Lines', url: 'https://en.wikipedia.org/wiki/Velocity_factor' },
184
239
  ],
185
- howTo: [
186
- {
187
- name: 'Select Frequency',
188
- text: 'Enter the exact frequency in MHz or use one of the quick buttons for 5.8GHz, 2.4GHz, or 868MHz.',
189
- },
190
- {
191
- name: 'Choose Antenna Type',
192
- text: 'Decide whether you will make a full dipole (1/2 wave) or a vertical whip antenna (1/4 wave).',
193
- },
194
- {
195
- name: 'Adjust Material',
196
- text: 'Choose the type of wire you will use so the calculator applies the correct velocity factor.',
197
- },
198
- {
199
- name: 'Cut with Precision',
200
- text: 'Use the "Length per arm" measurement to cut each element. Remember to measure from the solder point.',
201
- },
202
- ],
203
- schemas: [],
240
+ howTo: howToSteps,
241
+ schemas,
204
242
  };