iobroker.jetframe 1.0.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 (107) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +357 -0
  3. package/admin/SF-Pro.ttf +0 -0
  4. package/admin/admin.d.ts +65 -0
  5. package/admin/frame.html +982 -0
  6. package/admin/frame.html.bak-aircraft-card-real-row-20260518-1608 +1236 -0
  7. package/admin/frame.html.bak-aircraft-card-structure-20260518-1517 +1236 -0
  8. package/admin/frame.html.bak-aircraft-logo-id-fix-20260518-1639 +1239 -0
  9. package/admin/frame.html.bak-shortcut-test +1236 -0
  10. package/admin/frame.html.bak-tablet-class-20260518-1729 +1239 -0
  11. package/admin/heatmap.html +216 -0
  12. package/admin/index.html +268 -0
  13. package/admin/index_m.html +1749 -0
  14. package/admin/jetframe.css +1260 -0
  15. package/admin/jetframe.css.bak-airbus-landscape-fix +4630 -0
  16. package/admin/jetframe.css.bak-aircraft-card-clean-equal-20260518-1438 +4899 -0
  17. package/admin/jetframe.css.bak-aircraft-card-real-row-20260518-1608 +4814 -0
  18. package/admin/jetframe.css.bak-aircraft-card-row-left-20260518-1525 +4604 -0
  19. package/admin/jetframe.css.bak-aircraft-card-slim-equal-20260518-1446 +4647 -0
  20. package/admin/jetframe.css.bak-aircraft-card-structure-20260518-1517 +4646 -0
  21. package/admin/jetframe.css.bak-aircraft-inline-final-20260518-1527 +4654 -0
  22. package/admin/jetframe.css.bak-aircraft-row-compact-fix-20260518-1639 +4763 -0
  23. package/admin/jetframe.css.bak-before-aircrafttype-purge +4818 -0
  24. package/admin/jetframe.css.bak-before-cleanup +4670 -0
  25. package/admin/jetframe.css.bak-before-remove-tablet-only-20260518-1711 +4896 -0
  26. package/admin/jetframe.css.bak-before-tablet-layout-rework-20260518-1650 +4914 -0
  27. package/admin/jetframe.css.bak-clean-duplicate-fonts-20260518-1340 +4975 -0
  28. package/admin/jetframe.css.bak-clean-old-index-fix-20260518-1937 +5167 -0
  29. package/admin/jetframe.css.bak-hardleft-airbus +4751 -0
  30. package/admin/jetframe.css.bak-index-iphone-landscape-20260518-1931 +5030 -0
  31. package/admin/jetframe.css.bak-index-landscape-final-20260518-1941 +5167 -0
  32. package/admin/jetframe.css.bak-index-landscape-real-20260518-1936 +5186 -0
  33. package/admin/jetframe.css.bak-landscape-compact-jumbo-bold-20260518-1343 +4802 -0
  34. package/admin/jetframe.css.bak-logo-align-final +4551 -0
  35. package/admin/jetframe.css.bak-logo-final2 +4551 -0
  36. package/admin/jetframe.css.bak-narrowbody-font-fix +4992 -0
  37. package/admin/jetframe.css.bak-nuke-airbus-align +4790 -0
  38. package/admin/jetframe.css.bak-pill-balance-20260518-1603 +4773 -0
  39. package/admin/jetframe.css.bak-pill-balance-fix +4910 -0
  40. package/admin/jetframe.css.bak-radar-fix-fonts +4710 -0
  41. package/admin/jetframe.css.bak-shortcut-test +4899 -0
  42. package/admin/jetframe.css.bak-smaller-aircraft-card-fonts-20260518-1345 +4897 -0
  43. package/admin/jetframe.css.bak-tablet-fix-real-20260518-1748 +4945 -0
  44. package/admin/jetframe.css.bak-tablet-fullscreen-fix-20260518-1804 +4972 -0
  45. package/admin/jetframe.css.bak-tablet-landscape-layout-20260518-1645 +4802 -0
  46. package/admin/jetframe.css.bak-tablet-layout-final-20260518-1839 +4802 -0
  47. package/admin/jetframe.css.bak-tablet-layout-v3-20260518-1729 +4802 -0
  48. package/admin/jetframe.css.bak-tablet-layout-v4-20260518-1801 +4957 -0
  49. package/admin/jetframe.css.bak-tablet-layout-v5-20260518-1843 +4970 -0
  50. package/admin/jetframe.css.bak-tablet-layout-v6-20260518-1848 +4958 -0
  51. package/admin/jetframe.css.bak-tablet-layout-v7-20260518-1909 +4985 -0
  52. package/admin/jetframe.css.bak-tablet-only-landscape-v2-20260518-1707 +4802 -0
  53. package/admin/jetframe.css.bak-tablet-pages-final-20260519-1857 +5188 -0
  54. package/admin/jetframe.css.bak-tablet-pages-final-20260519-1859 +5347 -0
  55. package/admin/jetframe.css.bak-tablet-pages-v2-20260519-190807 +5349 -0
  56. package/admin/jetframe.css.bak-typography-align-final +4818 -0
  57. package/admin/jetframe.png +0 -0
  58. package/admin/manifest.webmanifest +15 -0
  59. package/admin/src/app.tsx +58 -0
  60. package/admin/src/components/settings.tsx +97 -0
  61. package/admin/src/i18n/de.json +11 -0
  62. package/admin/src/i18n/en.json +11 -0
  63. package/admin/src/i18n/es.json +11 -0
  64. package/admin/src/i18n/fr.json +11 -0
  65. package/admin/src/i18n/i18n.d.ts +28 -0
  66. package/admin/src/i18n/it.json +11 -0
  67. package/admin/src/i18n/nl.json +11 -0
  68. package/admin/src/i18n/pl.json +11 -0
  69. package/admin/src/i18n/pt.json +11 -0
  70. package/admin/src/i18n/ru.json +11 -0
  71. package/admin/src/i18n/uk.json +11 -0
  72. package/admin/src/i18n/zh-cn.json +11 -0
  73. package/admin/src/index.tsx +25 -0
  74. package/admin/stats.html +228 -0
  75. package/admin/style.css +32 -0
  76. package/admin/tsconfig.json +11 -0
  77. package/admin/words.js +46 -0
  78. package/build/lib/adsb.js +218 -0
  79. package/build/lib/adsb.js.map +7 -0
  80. package/build/lib/airportNamesDe.js +131 -0
  81. package/build/lib/airportNamesDe.js.map +7 -0
  82. package/build/lib/airports.js +281 -0
  83. package/build/lib/airports.js.map +7 -0
  84. package/build/lib/classify.js +339 -0
  85. package/build/lib/classify.js.map +7 -0
  86. package/build/lib/config.js +103 -0
  87. package/build/lib/config.js.map +7 -0
  88. package/build/lib/flightInfo.js +1409 -0
  89. package/build/lib/flightInfo.js.map +7 -0
  90. package/build/lib/geo.js +84 -0
  91. package/build/lib/geo.js.map +7 -0
  92. package/build/lib/images.js +422 -0
  93. package/build/lib/images.js.map +7 -0
  94. package/build/lib/specialLiveries.js +342 -0
  95. package/build/lib/specialLiveries.js.map +7 -0
  96. package/build/lib/states.js +971 -0
  97. package/build/lib/states.js.map +7 -0
  98. package/build/lib/staticFiles.js +73 -0
  99. package/build/lib/staticFiles.js.map +7 -0
  100. package/build/lib/types.js +17 -0
  101. package/build/lib/types.js.map +7 -0
  102. package/build/lib/visConfig.js +52 -0
  103. package/build/lib/visConfig.js.map +7 -0
  104. package/build/main.js +1454 -0
  105. package/build/main.js.map +7 -0
  106. package/io-package.json +169 -0
  107. package/package.json +82 -0
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/lib/states.ts"],
4
+ "sourcesContent": ["import type { Aircraft, JetFrameConfig, AdapterLike } from './types';\nimport { round } from './geo';\nimport { cacheExternalLogoUrl, MANUFACTURER_LOGO_CACHE_DIR } from './images';\n\nconst LAST_SPEECH_TRIGGER: Record<string, string> = {};\n\n/**\n *\n */\nexport async function ensureState(\n\tadapter: AdapterLike,\n\tid: string,\n\tdef: ioBroker.StateValue,\n\ttype: ioBroker.CommonType,\n\trole: string,\n): Promise<void> {\n\tconst obj = await adapter.getForeignObjectAsync(id);\n\n\tif (!obj) {\n\t\tawait adapter.setForeignObjectAsync(id, {\n\t\t\ttype: 'state',\n\t\t\tcommon: {\n\t\t\t\tname: id.split('.').pop() || id,\n\t\t\t\ttype,\n\t\t\t\trole,\n\t\t\t\tread: true,\n\t\t\t\twrite: true,\n\t\t\t},\n\t\t\tnative: {},\n\t\t});\n\n\t\tawait adapter.setForeignStateAsync(id, def, true);\n\t}\n}\n\n/**\n *\n */\nexport async function ensureBaseStates(adapter: AdapterLike, config: JetFrameConfig): Promise<void> {\n\tawait ensureState(adapter, `${config.dpRoot}.enabled`, config.enabled !== false, 'boolean', 'switch');\n\n\tawait adapter.setForeignStateAsync(`${config.dpRoot}.enabled`, config.enabled !== false, true);\n\tawait ensureState(adapter, `${config.dpRoot}.status`, 'init', 'string', 'text');\n\tawait ensureState(adapter, `${config.dpRoot}.lastUpdate`, '', 'string', 'text');\n\tawait ensureState(adapter, `${config.dpRoot}.allCount`, 0, 'number', 'value');\n\tawait ensureState(adapter, `${config.dpRoot}.matchCount`, 0, 'number', 'value');\n\tawait ensureState(adapter, `${config.dpRoot}.clearImageCache`, false, 'boolean', 'button');\n\n\tawait ensureState(adapter, config.airportJsonDp, '[]', 'string', 'json');\n\tawait ensureState(adapter, `${config.dpRoot}.airportjsonLastUpdate`, '', 'string', 'text');\n\tawait ensureState(adapter, `${config.dpRoot}.specialLiveries`, '[]', 'string', 'json');\n\tawait ensureState(adapter, `${config.dpRoot}.specialLiveriesLastUpdate`, '', 'string', 'text');\n\n\tawait ensureState(adapter, `${config.dpRoot}.speechMode`, 'browser', 'string', 'text');\n\tawait ensureState(\n\t\tadapter,\n\t\t`${config.dpRoot}.speechTemplate`,\n\t\t'{modeSpeechText}: {airlineName} {bestCallsign} {routeDirectionText} {routeOtherAirport} in {altitudeFt} Fu\u00DF. {windowPositionSpeechText}.',\n\t\t'string',\n\t\t'text',\n\t);\n\n\tawait adapter.setForeignStateAsync(`${config.dpRoot}.speechMode`, config.speechMode || 'browser', true);\n\n\t// speechEnabled Master\n\ttry {\n\t\tconst speechEnabledObj = await adapter.getForeignObjectAsync(`${config.dpRoot}.speechEnabled`);\n\t\tif (!speechEnabledObj) {\n\t\t\tawait adapter.setForeignObjectAsync(`${config.dpRoot}.speechEnabled`, {\n\t\t\t\ttype: 'state',\n\t\t\t\tcommon: {\n\t\t\t\t\tname: 'Sprachausgabe aktiv',\n\t\t\t\t\ttype: 'boolean',\n\t\t\t\t\trole: 'switch',\n\t\t\t\t\tread: true,\n\t\t\t\t\twrite: true,\n\t\t\t\t\tdef: true,\n\t\t\t\t},\n\t\t\t\tnative: {},\n\t\t\t});\n\t\t}\n\n\t\tconst speechEnabledState = await adapter.getForeignStateAsync(`${config.dpRoot}.speechEnabled`);\n\t\tif (speechEnabledState?.val === null || speechEnabledState?.val === undefined) {\n\t\t\tawait adapter.setForeignStateAsync(`${config.dpRoot}.speechEnabled`, true, true);\n\t\t}\n\t} catch {\n\t\t// ignore\n\t}\n\tawait adapter.setForeignStateAsync(\n\t\t`${config.dpRoot}.speechTemplate`,\n\t\tconfig.speechTemplate ||\n\t\t\t'{modeSpeechText}: {airlineName} {bestCallsign} {routeDirectionText} {routeOtherAirport} in {altitudeFt} Fuss. {windowPositionSpeechText}.',\n\t\ttrue,\n\t);\n\n\tawait ensureFlightStates(adapter, `${config.dpRoot}.current`);\n\tawait ensureFlightStates(adapter, `${config.dpRoot}.airport`);\n\tawait ensureFlightStates(adapter, `${config.dpRoot}.overflight`);\n}\n\n/**\n *\n */\nexport async function ensureFlightStates(adapter: AdapterLike, base: string): Promise<void> {\n\tconst strings = [\n\t\t'.text',\n\t\t'.callsign',\n\t\t'.rawCallsign',\n\t\t'.cleanedCallsign',\n\t\t'.operationalCallsign',\n\t\t'.routeCallsign',\n\t\t'.hex',\n\t\t'.mode',\n\t\t'.flightPhase',\n\t\t'.directionText',\n\t\t'.trackDirectionText',\n\n\t\t'.modeVisText',\n\n\t\t'.windowPositionText',\n\t\t'.windowPositionClass',\n\t\t'.windowPositionSpeechText',\n\n\t\t'.probableRunway',\n\t\t'.probableRunwayText',\n\n\t\t'.probableRunway',\n\t\t'.probableRunwayText',\n\n\t\t'.airlineName',\n\t\t'.airlineIata',\n\t\t'.airlineIcao',\n\n\t\t'.originIata',\n\t\t'.destIata',\n\t\t'.originName',\n\t\t'.destName',\n\n\t\t'.originDisplayName',\n\t\t'.destDisplayName',\n\t\t'.departureAirport',\n\t\t'.approachAirport',\n\n\t\t'.routeText',\n\t\t'.routeTextLong',\n\t\t'.routeWarning',\n\t\t'.routeSource',\n\n\t\t'.routeDisplayText',\n\t\t'.routeCodesText',\n\n\t\t'.aircraftModel',\n\t\t'.aircraftType',\n\t\t'.registration',\n\n\t\t'.manufacturer',\n\t\t'.manufacturerLogoText',\n\t\t'.manufacturerLogoUrl',\n\n\t\t'.aircraftTypeText',\n\t\t'.aircraftSize',\n\t\t'.squawk',\n\t\t'.emergency',\n\t\t'.emergencyType',\n\t\t'.emergencyText',\n\t\t'.squawk',\n\t\t'.emergency',\n\t\t'.emergencyType',\n\t\t'.emergencyText',\n\n\t\t'.logoUrl',\n\t\t'.jetphotosUrl',\n\t\t'.jetphotosImageUrl',\n\n\t\t'.localLogoUrl',\n\t\t'.localImageUrl',\n\t\t'.finalImageUrl',\n\n\t\t'.specialText',\n\t\t'.specialLiveryTitle',\n\t\t'.specialLiveryDescription',\n\t\t'.specialLiveryFull',\n\t\t'.specialLiveryVisText',\n\t\t'.specialDisplayText',\n\t\t'.speechText',\n\t];\n\n\tfor (const s of strings) {\n\t\tawait ensureState(adapter, base + s, '', 'string', 'text');\n\t}\n\n\tconst bools = ['.statistics.today.rushHourNow'];\n\n\tconst nums = [\n\t\t'.altitudeFt',\n\t\t'.speedKt',\n\t\t'.verticalRate',\n\t\t'.trackDeg',\n\n\t\t'.distHomeNm',\n\t\t'.distanceKm',\n\t\t'.distAirportNm',\n\n\t\t'.bearingHomeDeg',\n\t\t'.windowDiffDeg',\n\n\t\t'.probableRunwayHeading',\n\t\t'.probableRunwayDiffDeg',\n\t\t'.runwayConfidence',\n\n\t\t'.bearingAircraftToAirportDeg',\n\t\t'.bearingAirportToAircraftDeg',\n\n\t\t'.landingTrackDiffDeg',\n\t\t'.takeoffTrackDiffDeg',\n\t\t'.airportTrackDiffDeg',\n\t];\n\n\tfor (const n of nums) {\n\t\tawait ensureState(adapter, base + n, 0, 'number', 'value');\n\t}\n\n\tawait ensureState(adapter, `${base}.routeReliable`, false, 'boolean', 'indicator');\n\tawait ensureState(adapter, `${base}.isSpecial`, false, 'boolean', 'indicator');\n\tawait ensureState(adapter, `${base}.isEmergency`, false, 'boolean', 'indicator');\n\tawait ensureState(adapter, `${base}.speechTrigger`, false, 'boolean', 'button');\n}\n\nfunction cleanRouteCallsign(a: Aircraft): string {\n\tconst v = String(a.routeCallsign || '')\n\t\t.trim()\n\t\t.toUpperCase();\n\n\tconst own = String(a.callsign || '')\n\t\t.trim()\n\t\t.toUpperCase();\n\n\tif (!v) {\n\t\treturn '';\n\t}\n\tif (v === own) {\n\t\treturn '';\n\t}\n\tif (/^\\d+$/.test(v)) {\n\t\treturn '';\n\t}\n\tif (!/[A-Z]/.test(v)) {\n\t\treturn '';\n\t}\n\tif (v.length < 4 || v.length > 8) {\n\t\treturn '';\n\t}\n\n\treturn v;\n}\n\n/**\n *\n */\nexport function trackDirectionText(degRaw: unknown): string {\n\tconst deg = Number(degRaw);\n\n\tif (!Number.isFinite(deg)) {\n\t\treturn '';\n\t}\n\n\tconst normalized = ((deg % 360) + 360) % 360;\n\n\tconst dirs = ['\u2191 Norden', '\u2197 Nordost', '\u2192 Osten', '\u2198 S\u00FCdost', '\u2193 S\u00FCden', '\u2199 S\u00FCdwest', '\u2190 Westen', '\u2196 Nordwest'];\n\n\tconst index = Math.round(normalized / 45) % 8;\n\n\treturn dirs[index];\n}\n\nfunction getFlightPhase(a: any): string {\n\tconst mode = String(a.mode || '').toUpperCase();\n\tconst altFt = Number(a.altFt || a.altitudeFt || 0);\n\tconst vr = Number(a.verticalRate || 0);\n\tconst distAirportNm = Number(a.distAirportNm || 0);\n\n\tif (mode === 'LANDING') {\n\t\tif (altFt > 0 && altFt <= 1800) {\n\t\t\treturn 'landing';\n\t\t}\n\n\t\tif (distAirportNm > 0 && distAirportNm <= 12) {\n\t\t\treturn 'approach';\n\t\t}\n\n\t\tif (vr < -300) {\n\t\t\treturn 'descent';\n\t\t}\n\n\t\treturn 'approach';\n\t}\n\n\tif (mode === 'TAKEOFF') {\n\t\tif (altFt > 0 && altFt <= 1800) {\n\t\t\treturn 'departure';\n\t\t}\n\n\t\tif (vr > 300) {\n\t\t\treturn 'climb';\n\t\t}\n\n\t\treturn 'departure';\n\t}\n\n\tif (mode === 'OVERFLIGHT') {\n\t\tif (vr < -500) {\n\t\t\treturn 'descent';\n\t\t}\n\n\t\tif (vr > 500) {\n\t\t\treturn 'climb';\n\t\t}\n\n\t\treturn 'cruise';\n\t}\n\n\tif (vr < -500) {\n\t\treturn 'descent';\n\t}\n\n\tif (vr > 500) {\n\t\treturn 'climb';\n\t}\n\n\tif (altFt > 8000) {\n\t\treturn 'cruise';\n\t}\n\n\treturn 'unknown';\n}\n\nasync function setForeignStateChanged(adapter: AdapterLike, id: string, value: any, ack = true): Promise<void> {\n\ttry {\n\t\tconst oldState = await adapter.getForeignStateAsync(id);\n\n\t\tif (oldState && oldState.val === value && oldState.ack === ack) {\n\t\t\treturn;\n\t\t}\n\t} catch {\n\t\t// Wenn Lesen fehlschl\u00E4gt, trotzdem schreiben\n\t}\n\n\tawait adapter.setForeignStateAsync(id, value, ack);\n}\n\nexport async function writeFlight(adapter: AdapterLike, base: string, a: Aircraft): Promise<void> {\n\tconst routeCallsign = String(a.routeCallsign || a.callsign || '')\n\t\t.trim()\n\t\t.toUpperCase();\n\tconst display = await buildDisplayInfo(adapter, adapter.config as JetFrameConfig, a);\n\tdisplay.speechText = await buildSpeechTextForWrite(adapter, base, a, display);\n\n\tawait setForeignStateChanged(adapter, `${base}.text`, buildMessage(a), true);\n\n\tconst rawCallsign = String((a as any).rawCallsign || a.callsign || '').trim();\n\tconst cleanedCallsign = String((a as any).cleanedCallsign || a.callsign || '')\n\t\t.trim()\n\t\t.replace(/\\s+/g, '')\n\t\t.toUpperCase();\n\n\tawait setForeignStateChanged(adapter, `${base}.callsign`, a.callsign || '', true);\n\tawait setForeignStateChanged(adapter, `${base}.rawCallsign`, rawCallsign, true);\n\tawait setForeignStateChanged(adapter, `${base}.cleanedCallsign`, cleanedCallsign, true);\n\n\tawait setForeignStateChanged(\n\t\tadapter,\n\t\t`${base}.operationalCallsign`,\n\t\ta.operationalCallsign || a.callsign || '',\n\t\ttrue,\n\t);\n\n\tawait setForeignStateChanged(adapter, `${base}.routeCallsign`, routeCallsign, true);\n\tawait setForeignStateChanged(adapter, `${base}.hex`, a.hex || '', true);\n\tawait setForeignStateChanged(adapter, `${base}.mode`, a.mode || '', true);\n\tawait setForeignStateChanged(adapter, `${base}.flightPhase`, getFlightPhase(a), true);\n\tawait setForeignStateChanged(adapter, `${base}.directionText`, a.directionText || '', true);\n\n\tawait setForeignStateChanged(adapter, `${base}.modeVisText`, display.modeVisText, true);\n\n\tawait setForeignStateChanged(adapter, `${base}.windowPositionText`, display.windowPositionText, true);\n\tawait setForeignStateChanged(adapter, `${base}.windowPositionClass`, display.windowPositionClass, true);\n\tawait setForeignStateChanged(adapter, `${base}.windowPositionSpeechText`, display.windowPositionSpeechText, true);\n\n\tawait setForeignStateChanged(adapter, `${base}.probableRunway`, (a as any).probableRunway || '', true);\n\tawait setForeignStateChanged(adapter, `${base}.probableRunwayText`, (a as any).probableRunwayText || '', true);\n\tawait setForeignStateChanged(adapter, `${base}.probableRunwayHeading`, (a as any).probableRunwayHeading || 0, true);\n\tawait setForeignStateChanged(adapter, `${base}.probableRunwayDiffDeg`, (a as any).probableRunwayDiffDeg || 0, true);\n\tawait setForeignStateChanged(adapter, `${base}.runwayConfidence`, (a as any).runwayConfidence || 0, true);\n\n\tawait setForeignStateChanged(adapter, `${base}.airlineName`, a.airlineName || '', true);\n\tawait setForeignStateChanged(adapter, `${base}.airlineIata`, a.airlineIata || '', true);\n\tawait setForeignStateChanged(adapter, `${base}.airlineIcao`, a.airlineIcao || '', true);\n\n\tawait setForeignStateChanged(adapter, `${base}.originIata`, a.originIata || '', true);\n\tawait setForeignStateChanged(adapter, `${base}.destIata`, a.destIata || '', true);\n\tawait setForeignStateChanged(adapter, `${base}.originName`, a.originName || '', true);\n\tawait setForeignStateChanged(adapter, `${base}.destName`, a.destName || '', true);\n\n\tawait setForeignStateChanged(adapter, `${base}.originDisplayName`, display.originDisplayName, true);\n\tawait setForeignStateChanged(adapter, `${base}.destDisplayName`, display.destDisplayName, true);\n\n\tawait setForeignStateChanged(adapter, `${base}.departureAirport`, display.departureAirport, true);\n\tawait setForeignStateChanged(adapter, `${base}.approachAirport`, display.approachAirport, true);\n\n\tawait setForeignStateChanged(adapter, `${base}.routeText`, a.routeText || '', true);\n\tawait setForeignStateChanged(adapter, `${base}.routeTextLong`, a.routeTextLong || '', true);\n\tawait setForeignStateChanged(adapter, `${base}.routeReliable`, !!a.routeReliable, true);\n\tawait setForeignStateChanged(adapter, `${base}.routeWarning`, a.routeWarning || '', true);\n\tawait setForeignStateChanged(adapter, `${base}.routeSource`, a.routeSource || '', true);\n\n\tawait setForeignStateChanged(adapter, `${base}.routeDisplayText`, display.routeDisplayText, true);\n\tawait setForeignStateChanged(adapter, `${base}.routeCodesText`, display.routeCodesText, true);\n\n\tawait setForeignStateChanged(adapter, `${base}.aircraftModel`, a.aircraftModel || '', true);\n\tawait setForeignStateChanged(adapter, `${base}.aircraftType`, a.aircraftType || a.type || '', true);\n\tawait setForeignStateChanged(adapter, `${base}.registration`, a.registration || '', true);\n\n\tawait setForeignStateChanged(adapter, `${base}.manufacturer`, display.manufacturer, true);\n\tawait setForeignStateChanged(adapter, `${base}.manufacturerLogoText`, display.manufacturerLogoText, true);\n\tawait setForeignStateChanged(adapter, `${base}.manufacturerLogoUrl`, display.manufacturerLogoUrl, true);\n\n\tawait setForeignStateChanged(adapter, `${base}.aircraftTypeText`, display.aircraftTypeText, true);\n\tawait setForeignStateChanged(adapter, `${base}.aircraftSize`, display.aircraftSize, true);\n\n\tawait setForeignStateChanged(adapter, `${base}.squawk`, a.squawk || '', true);\n\tawait setForeignStateChanged(adapter, `${base}.emergency`, a.emergency || '', true);\n\tawait setForeignStateChanged(adapter, `${base}.emergencyType`, a.emergencyType || '', true);\n\tawait setForeignStateChanged(adapter, `${base}.emergencyText`, a.emergencyText || '', true);\n\n\tawait setForeignStateChanged(adapter, `${base}.logoUrl`, a.logoUrl || '', true);\n\tawait setForeignStateChanged(adapter, `${base}.jetphotosUrl`, a.jetphotosUrl || '', true);\n\tawait setForeignStateChanged(adapter, `${base}.jetphotosImageUrl`, a.jetphotosImageUrl || '', true);\n\n\tconst localLogoUrl = await keepExistingStringState(adapter, `${base}.localLogoUrl`, a.localLogoUrl);\n\n\tconst localImageUrl = await keepExistingStringState(adapter, `${base}.localImageUrl`, a.localImageUrl);\n\n\tconst preferredImage = a.jetphotosImageUrl || a.finalImageUrl || localImageUrl || '';\n\n\tconst finalImageUrl = await keepExistingStringState(adapter, `${base}.finalImageUrl`, preferredImage);\n\n\tawait setForeignStateChanged(adapter, `${base}.localLogoUrl`, localLogoUrl, true);\n\tawait setForeignStateChanged(adapter, `${base}.localImageUrl`, localImageUrl, true);\n\tawait setForeignStateChanged(adapter, `${base}.finalImageUrl`, finalImageUrl, true);\n\n\tawait setForeignStateChanged(adapter, `${base}.altitudeFt`, Math.round(a.altFt || 0), true);\n\tawait setForeignStateChanged(adapter, `${base}.speedKt`, Math.round(a.speedKt || 0), true);\n\tawait setForeignStateChanged(adapter, `${base}.verticalRate`, Math.round(a.verticalRate || 0), true);\n\tawait setForeignStateChanged(adapter, `${base}.trackDeg`, Math.round(a.trackDeg || 0), true);\n\tawait setForeignStateChanged(adapter, `${base}.trackDirectionText`, trackDirectionText(a.trackDeg), true);\n\n\tawait setForeignStateChanged(adapter, `${base}.distHomeNm`, a.distHomeNm || 0, true);\n\n\tawait setForeignStateChanged(\n\t\tadapter,\n\t\t`${base}.distanceKm`,\n\t\tMath.round(Number(a.distHomeNm || 0) * 1.852 * 10) / 10,\n\t\ttrue,\n\t);\n\tawait setForeignStateChanged(adapter, `${base}.distAirportNm`, round(a.distAirportNm || 0, 1), true);\n\tawait setForeignStateChanged(adapter, `${base}.bearingHomeDeg`, round(a.bearingHomeDeg || 0, 1), true);\n\tawait setForeignStateChanged(adapter, `${base}.windowDiffDeg`, round(a.windowDiffDeg || 0, 1), true);\n\n\tawait setForeignStateChanged(\n\t\tadapter,\n\t\t`${base}.bearingAircraftToAirportDeg`,\n\t\tround(a.bearingAircraftToAirportDeg || 0, 1),\n\t\ttrue,\n\t);\n\tawait setForeignStateChanged(\n\t\tadapter,\n\t\t`${base}.bearingAirportToAircraftDeg`,\n\t\tround(a.bearingAirportToAircraftDeg || 0, 1),\n\t\ttrue,\n\t);\n\tawait setForeignStateChanged(adapter, `${base}.landingTrackDiffDeg`, round(a.landingTrackDiffDeg || 0, 1), true);\n\tawait setForeignStateChanged(adapter, `${base}.takeoffTrackDiffDeg`, round(a.takeoffTrackDiffDeg || 0, 1), true);\n\tawait setForeignStateChanged(adapter, `${base}.airportTrackDiffDeg`, round(a.airportTrackDiffDeg || 0, 1), true);\n\n\tawait setForeignStateChanged(adapter, `${base}.specialText`, a.specialText || '', true);\n\tawait setForeignStateChanged(adapter, `${base}.specialLiveryTitle`, a.specialLiveryTitle || '', true);\n\tawait setForeignStateChanged(adapter, `${base}.specialLiveryDescription`, a.specialLiveryDescription || '', true);\n\tawait setForeignStateChanged(adapter, `${base}.specialLiveryFull`, a.specialLiveryFull || '', true);\n\tawait setForeignStateChanged(adapter, `${base}.specialLiveryVisText`, a.specialLiveryVisText || '', true);\n\tawait setForeignStateChanged(adapter, `${base}.specialDisplayText`, display.specialDisplayText, true);\n\tawait setForeignStateChanged(adapter, `${base}.speechText`, display.speechText, true);\n\n\tawait setForeignStateChanged(adapter, `${base}.isSpecial`, !!a.isSpecial, true);\n\tawait setForeignStateChanged(adapter, `${base}.isEmergency`, !!a.isEmergency, true);\n\n\tawait maybeTriggerSpeech(adapter, base, a, display.speechText);\n}\n\n/**\n *\n */\nexport async function clearFlight(adapter: AdapterLike, base: string): Promise<void> {\n\tconst strings = [\n\t\t'.text',\n\t\t'.callsign',\n\t\t'.operationalCallsign',\n\t\t'.routeCallsign',\n\t\t'.hex',\n\t\t'.mode',\n\t\t'.directionText',\n\n\t\t'.modeVisText',\n\n\t\t'.windowPositionText',\n\t\t'.windowPositionClass',\n\t\t'.windowPositionSpeechText',\n\n\t\t'.airlineName',\n\t\t'.airlineIata',\n\t\t'.airlineIcao',\n\n\t\t'.originIata',\n\t\t'.destIata',\n\t\t'.originName',\n\t\t'.destName',\n\n\t\t'.originDisplayName',\n\t\t'.destDisplayName',\n\t\t'.departureAirport',\n\t\t'.approachAirport',\n\n\t\t'.routeText',\n\t\t'.routeTextLong',\n\t\t'.routeWarning',\n\t\t'.routeSource',\n\n\t\t'.routeDisplayText',\n\t\t'.routeCodesText',\n\n\t\t'.aircraftModel',\n\t\t'.aircraftType',\n\t\t'.registration',\n\n\t\t'.manufacturer',\n\t\t'.manufacturerLogoText',\n\t\t'.manufacturerLogoUrl',\n\n\t\t'.aircraftTypeText',\n\t\t'.aircraftSize',\n\n\t\t'.logoUrl',\n\t\t'.jetphotosUrl',\n\t\t'.jetphotosImageUrl',\n\n\t\t'.localLogoUrl',\n\t\t'.localImageUrl',\n\t\t'.finalImageUrl',\n\n\t\t'.specialText',\n\t\t'.specialLiveryTitle',\n\t\t'.specialLiveryDescription',\n\t\t'.specialLiveryFull',\n\t\t'.specialLiveryVisText',\n\t\t'.specialDisplayText',\n\t\t'.speechText',\n\t];\n\n\tfor (const s of strings) {\n\t\tawait setForeignStateChanged(adapter, base + s, '', true);\n\t}\n\n\tconst nums = [\n\t\t'.altitudeFt',\n\t\t'.speedKt',\n\t\t'.verticalRate',\n\t\t'.trackDeg',\n\n\t\t'.distHomeNm',\n\t\t'.distAirportNm',\n\n\t\t'.bearingHomeDeg',\n\t\t'.windowDiffDeg',\n\n\t\t'.probableRunwayHeading',\n\t\t'.probableRunwayDiffDeg',\n\t\t'.runwayConfidence',\n\n\t\t'.bearingAircraftToAirportDeg',\n\t\t'.bearingAirportToAircraftDeg',\n\n\t\t'.landingTrackDiffDeg',\n\t\t'.takeoffTrackDiffDeg',\n\t\t'.airportTrackDiffDeg',\n\t];\n\n\tfor (const n of nums) {\n\t\tawait setForeignStateChanged(adapter, base + n, 0, true);\n\t}\n\n\tawait setForeignStateChanged(adapter, `${base}.routeReliable`, false, true);\n\tawait setForeignStateChanged(adapter, `${base}.isSpecial`, false, true);\n\tawait setForeignStateChanged(adapter, `${base}.isEmergency`, false, true);\n\tawait setForeignStateChanged(adapter, `${base}.speechTrigger`, false, true);\n}\n\nasync function buildDisplayInfo(\n\tadapter: AdapterLike,\n\tconfig: JetFrameConfig,\n\ta: Aircraft,\n): Promise<Record<string, string>> {\n\tconst originDisplayName = cityOnly(a.originName) || String(a.originIata || '').trim() || '\u2014';\n\n\tconst destDisplayName = cityOnly(a.destName) || String(a.destIata || '').trim() || '\u2014';\n\n\tconst routeDisplayText = `${originDisplayName} \u2192 ${destDisplayName}`;\n\n\tconst routeCodesText = `${a.originIata || '\u2014'} \u2192 ${a.destIata || '\u2014'}`;\n\n\tconst configuredAirportLabel = airportLabel(\n\t\tconfig.airport?.name || config.airport?.iata || '',\n\t\tconfig.airport?.iata || '',\n\t);\n\n\tconst mode = String(a.mode || '').toUpperCase();\n\n\tconst departureAirport =\n\t\tairportLabel(originDisplayName, a.originIata) || (mode === 'TAKEOFF' ? configuredAirportLabel : '');\n\n\tconst approachAirport =\n\t\tairportLabel(destDisplayName, a.destIata) || (mode === 'LANDING' ? configuredAirportLabel : '');\n\n\tconst modeVisText = modeVisTextFromFlight(a, originDisplayName, destDisplayName);\n\n\tconst window = windowPositionInfo(a);\n\n\tconst aircraft = await aircraftDisplayInfo(adapter, config, a);\n\n\tconst specialDisplayText = String(a.specialLiveryVisText || a.specialLiveryFull || a.specialText || '').trim();\n\n\tconst speechText = buildSpeechText(a, {\n\t\toriginDisplayName,\n\t\tdestDisplayName,\n\t\tdepartureAirport,\n\t\tapproachAirport,\n\t\trouteDisplayText,\n\t\trouteCodesText,\n\t\tspecialDisplayText,\n\t\twindowPositionSpeechText: window.speechText,\n\t\taircraftTypeText: aircraft.aircraftTypeText,\n\t\taircraftSize: aircraft.aircraftSize,\n\t});\n\n\treturn {\n\t\tmodeVisText,\n\n\t\twindowPositionText: window.text,\n\t\twindowPositionClass: window.className,\n\t\twindowPositionSpeechText: window.speechText,\n\n\t\toriginDisplayName,\n\t\tdestDisplayName,\n\t\tdepartureAirport,\n\t\tapproachAirport,\n\t\trouteDisplayText,\n\t\trouteCodesText,\n\n\t\tspecialDisplayText,\n\n\t\tmanufacturer: aircraft.manufacturer,\n\t\tmanufacturerLogoText: aircraft.manufacturerLogoText,\n\t\tmanufacturerLogoUrl: aircraft.manufacturerLogoUrl,\n\t\taircraftTypeText: aircraft.aircraftTypeText,\n\t\taircraftSize: aircraft.aircraftSize,\n\t};\n}\n\nfunction airportLabel(name: unknown, iata: unknown): string {\n\tconst n = String(name || '').trim();\n\tconst c = String(iata || '')\n\t\t.trim()\n\t\t.toUpperCase();\n\n\tif (n && c && n !== '\u2014') {\n\t\treturn `${n} (${c})`;\n\t}\n\n\tif (c) {\n\t\treturn c;\n\t}\n\n\tif (n && n !== '\u2014') {\n\t\treturn n;\n\t}\n\n\treturn '';\n}\n\nfunction modeVisTextFromFlight(a: Aircraft, originDisplayName: string, destDisplayName: string): string {\n\tconst mode = String(a.mode || '').toUpperCase();\n\n\tif (mode === 'TAKEOFF') {\n\t\treturn `\uD83D\uDEEB Start ${originDisplayName !== '\u2014' ? originDisplayName : ''}`.trim();\n\t}\n\n\tif (mode === 'LANDING') {\n\t\treturn `\uD83D\uDEEC Landung ${destDisplayName !== '\u2014' ? destDisplayName : ''}`.trim();\n\t}\n\n\tif (mode === 'OVERFLIGHT') {\n\t\treturn '\uD83D\uDEE9\uFE0F \u00DCberflug';\n\t}\n\n\treturn '\u2708\uFE0F Flight';\n}\n\nfunction windowPositionInfo(a: Aircraft): {\n\ttext: string;\n\tclassName: string;\n\tspeechText: string;\n} {\n\tconst bearing = Number(a.bearingHomeDeg || 0);\n\tconst diff = Number(a.windowDiffDeg || 0);\n\n\tif (!bearing && !diff) {\n\t\treturn {\n\t\t\ttext: '\u2197\uFE0F Position unbekannt',\n\t\t\tclassName: 'side',\n\t\t\tspeechText: 'am Fenster',\n\t\t};\n\t}\n\n\tconst abs = Math.abs(diff);\n\n\tif (abs <= 8) {\n\t\treturn {\n\t\t\ttext: '\u2B06\uFE0F direkt vor dem Fenster',\n\t\t\tclassName: 'center',\n\t\t\tspeechText: 'direkt vor dem Fenster',\n\t\t};\n\t}\n\n\tif (diff < 0) {\n\t\treturn {\n\t\t\ttext: `\u2B05\uFE0F links vom Fenster \u00B7 ${Math.round(abs)}\u00B0`,\n\t\t\tclassName: 'side',\n\t\t\tspeechText: 'links vom Fenster',\n\t\t};\n\t}\n\n\treturn {\n\t\ttext: `\u27A1\uFE0F rechts vom Fenster \u00B7 ${Math.round(abs)}\u00B0`,\n\t\tclassName: 'side',\n\t\tspeechText: 'rechts vom Fenster',\n\t};\n}\n\nasync function aircraftDisplayInfo(\n\tadapter: AdapterLike,\n\tconfig: JetFrameConfig,\n\ta: Aircraft,\n): Promise<{\n\tmanufacturer: string;\n\tmanufacturerLogoText: string;\n\tmanufacturerLogoUrl: string;\n\taircraftTypeText: string;\n\taircraftSize: string;\n}> {\n\tconst raw = String(a.aircraftModel || a.aircraftType || a.type || '').trim();\n\n\tconst type = String(a.aircraftType || a.type || '')\n\t\t.trim()\n\t\t.toUpperCase();\n\n\tconst model = String(a.aircraftModel || '')\n\t\t.trim()\n\t\t.toUpperCase();\n\n\tconst all = `${type} ${model} ${raw}`.toUpperCase();\n\n\tlet manufacturer = 'Flugzeug';\n\tlet manufacturerLogoText = '\u2708';\n\tlet aircraftTypeText = raw || type || '\u2014';\n\n\tif (all.includes('AIRBUS') || /^A\\d/.test(type)) {\n\t\tmanufacturer = 'Airbus';\n\t\tmanufacturerLogoText = 'A';\n\n\t\tif (type && /^A\\d/.test(type)) {\n\t\t\taircraftTypeText = `Airbus ${type}`;\n\t\t}\n\t} else if (all.includes('BOEING') || /^B\\d/.test(type)) {\n\t\tmanufacturer = 'Boeing';\n\t\tmanufacturerLogoText = 'B';\n\n\t\tif (type && /^B\\d/.test(type)) {\n\t\t\taircraftTypeText = `Boeing ${type}`;\n\t\t}\n\t} else if (all.includes('EMBRAER') || /^E\\d/.test(type) || all.includes('E-JET')) {\n\t\tmanufacturer = 'Embraer';\n\t\tmanufacturerLogoText = 'E';\n\n\t\tif (type) {\n\t\t\taircraftTypeText = `Embraer ${type}`;\n\t\t}\n\t} else if (all.includes('ATR') || /^AT\\d/.test(type)) {\n\t\tmanufacturer = 'ATR';\n\t\tmanufacturerLogoText = 'ATR';\n\n\t\tif (type) {\n\t\t\taircraftTypeText = `ATR ${type}`;\n\t\t}\n\t} else if (all.includes('DASSAULT') || all.includes('FALCON')) {\n\t\tmanufacturer = 'Dassault';\n\t\tmanufacturerLogoText = 'D';\n\n\t\tif (type) {\n\t\t\taircraftTypeText = `Dassault ${type}`;\n\t\t}\n\t} else if (all.includes('LOCKHEED') || all.includes('HERCULES') || all.includes('C130')) {\n\t\tmanufacturer = 'Lockheed';\n\t\tmanufacturerLogoText = 'L';\n\n\t\tif (type) {\n\t\t\taircraftTypeText = `Lockheed ${type}`;\n\t\t}\n\t} else if (all.includes('HONDA') || all.includes('HONDAJET')) {\n\t\tmanufacturer = 'Honda';\n\t\tmanufacturerLogoText = 'H';\n\n\t\tif (type) {\n\t\t\taircraftTypeText = `HondaJet ${type}`;\n\t\t}\n\t} else if (all.includes('BOMBARDIER') || all.includes('CRJ') || all.includes('CSERIES') || all.includes('A220')) {\n\t\tmanufacturer = all.includes('A220') ? 'Airbus' : 'Bombardier';\n\t\tmanufacturerLogoText = manufacturer === 'Airbus' ? 'A' : 'B';\n\n\t\tif (type) {\n\t\t\taircraftTypeText = `${manufacturer} ${type}`;\n\t\t}\n\t}\n\n\tconst aircraftSize = aircraftSizeLabel(all);\n\n\tlet manufacturerLogoUrl = findConfiguredManufacturerLogo(config, manufacturer, all);\n\n\tif (manufacturerLogoUrl && config.cacheExternalImages) {\n\t\tmanufacturerLogoUrl = await cacheExternalLogoUrl(\n\t\t\tadapter,\n\t\t\tmanufacturerLogoUrl,\n\t\t\tmanufacturer,\n\t\t\tMANUFACTURER_LOGO_CACHE_DIR,\n\t\t\tadapter.log.debug.bind(adapter.log),\n\t\t\tadapter.log.warn.bind(adapter.log),\n\t\t);\n\t}\n\n\treturn {\n\t\tmanufacturer,\n\t\tmanufacturerLogoText,\n\t\tmanufacturerLogoUrl,\n\t\taircraftTypeText,\n\t\taircraftSize,\n\t};\n}\n\nfunction findConfiguredManufacturerLogo(config: JetFrameConfig, manufacturer: string, allText: string): string {\n\tif (!config.externalManufacturerLogos) {\n\t\treturn '';\n\t}\n\n\tconst entries = parseManufacturerLogoConfig(config.manufacturerLogoUrls);\n\n\tif (!entries.length) {\n\t\treturn '';\n\t}\n\n\tconst haystack = `${manufacturer} ${allText}`.toUpperCase();\n\n\tfor (const entry of entries) {\n\t\tif (haystack.includes(entry.key)) {\n\t\t\treturn entry.url;\n\t\t}\n\t}\n\n\treturn '';\n}\n\nfunction parseManufacturerLogoConfig(raw: string): Array<{ key: string; url: string }> {\n\tconst text = String(raw || '').trim();\n\n\tif (!text) {\n\t\treturn [];\n\t}\n\n\ttry {\n\t\tconst obj = JSON.parse(text) as Record<string, string>;\n\n\t\tif (obj && typeof obj === 'object' && !Array.isArray(obj)) {\n\t\t\treturn Object.entries(obj)\n\t\t\t\t.map(([key, url]) => ({\n\t\t\t\t\tkey: String(key || '')\n\t\t\t\t\t\t.trim()\n\t\t\t\t\t\t.toUpperCase(),\n\t\t\t\t\turl: String(url || '').trim(),\n\t\t\t\t}))\n\t\t\t\t.filter(entry => !!entry.key && /^https?:\\/\\//i.test(entry.url));\n\t\t}\n\t} catch {\n\t\t// Fallback: Zeilenformat KEY=https://...\n\t}\n\n\treturn text\n\t\t.split(/\\r?\\n/)\n\t\t.map(line => line.trim())\n\t\t.filter(Boolean)\n\t\t.map(line => {\n\t\t\tconst idx = line.indexOf('=');\n\n\t\t\tif (idx < 1) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\tkey: line.slice(0, idx).trim().toUpperCase(),\n\t\t\t\turl: line.slice(idx + 1).trim(),\n\t\t\t};\n\t\t})\n\t\t.filter((entry): entry is { key: string; url: string } => !!entry?.key && /^https?:\\/\\//i.test(entry.url));\n}\n\nfunction aircraftSizeLabel(allText: string): string {\n\tconst all = String(allText || '')\n\t\t.toUpperCase()\n\t\t.replace(/[\\s_-]/g, '');\n\n\t// Superjumbo / Jumbo\n\tif (/A38|A380|A388/.test(all)) {\n\t\treturn 'Superjumbo';\n\t}\n\tif (/B74|B747|B741|B742|B743|B744|B748/.test(all)) {\n\t\treturn 'Jumbo';\n\t}\n\n\t// Heavy Cargo / Military Transport\n\tif (/AN124|AN225|C5M|GALAXY|C17|C17A|GLOBEMASTER/.test(all)) {\n\t\treturn 'Heavy Cargo';\n\t}\n\tif (/A400|A400M|C130|HERCULES|KC135|KC46|E3|E7/.test(all)) {\n\t\treturn 'Military';\n\t}\n\n\t// Widebody\n\tif (\n\t\t/A300|A310|A330|A332|A333|A338|A339/.test(all) ||\n\t\t/A340|A342|A343|A345|A346/.test(all) ||\n\t\t/A350|A359|A35K|A351/.test(all) ||\n\t\t/B757|B752|B753/.test(all) ||\n\t\t/B767|B762|B763|B764/.test(all) ||\n\t\t/B777|B772|B773|B77W|B778|B779|B77L|B77F/.test(all) ||\n\t\t/B787|B788|B789|B78X/.test(all) ||\n\t\t/DC10|MD11|IL86|IL96|L1011/.test(all)\n\t) {\n\t\treturn 'Widebody';\n\t}\n\n\t// Cargo\n\tif (/A300F|A330F|B763F|B752F|B733F|B734F|B738F|AN12|AN26/.test(all)) {\n\t\treturn 'Cargo';\n\t}\n\n\t// Narrowbody\n\tif (\n\t\t/A220|A221|A223|BCS1|BCS3|CS100|CS300/.test(all) ||\n\t\t/A318|A319|A320|A321|A20N|A21N/.test(all) ||\n\t\t/B707|B717|B727|B737|B731|B732|B733|B734|B735|B736|B738|B739|B38M|B39M/.test(all) ||\n\t\t/DC8|DC9|MD80|MD81|MD82|MD83|MD87|MD88|MD90/.test(all) ||\n\t\t/TU134|TU154|TU204|TU214|C919|ARJ21|MC21/.test(all)\n\t) {\n\t\treturn 'Narrowbody';\n\t}\n\n\t// Regional\n\tif (\n\t\t/CRJ|CRJ1|CRJ2|CRJ7|CRJ9|CRJX|CRJ100|CRJ200|CRJ700|CRJ900|CRJ1000/.test(all) ||\n\t\t/ERJ|E135|E140|E145|E170|E175|E190|E195|E290|E295/.test(all) ||\n\t\t/AT42|AT43|AT45|AT46|AT72|AT75|AT76|ATR/.test(all) ||\n\t\t/DH8|DHC8|Q200|Q300|Q400/.test(all) ||\n\t\t/SF34|SF340|SB20|F50|F70|F100|DO228|DO328|RJ70|RJ85|RJ100/.test(all)\n\t) {\n\t\treturn 'Regional';\n\t}\n\n\t// Business Jet\n\tif (\n\t\t/GLEX|GLF|G280|G450|G500|G550|G650|G700/.test(all) ||\n\t\t/CL30|CL35|CL60|GLOBAL|CHALLENGER/.test(all) ||\n\t\t/FALCON|FA7X|FA8X|FA50|FA90|F2TH|F900|F2000/.test(all) ||\n\t\t/CITATION|C25A|C25B|C25C|C56X|C68A|C700|LJ35|LJ45|LJ60|LJ75/.test(all) ||\n\t\t/LEGACY|PRAETOR|PHENOM|E50P|E55P|HA420|PC24/.test(all)\n\t) {\n\t\treturn 'Business Jet';\n\t}\n\n\t// General Aviation\n\tif (/C172|C182|C206|C208|PA28|PA34|BE20|BE9L|PC12|DA40|DA42/.test(all)) {\n\t\treturn 'General Aviation';\n\t}\n\n\t// Helicopter\n\tif (/EC135|EC145|H135|H145|H160|AW109|AW139|AW169|AW189|S76|S92|UH60|CH47|MI8|KA32/.test(all)) {\n\t\treturn 'Helicopter';\n\t}\n\n\t// Military Jet / Bomber\n\tif (\n\t\t/F14|F15|F16|F18|F22|F35|EUROFIGHTER|TYPHOON|RAFALE|GRIPEN|MIRAGE|SU27|SU30|SU35|MIG29|B1|B2|B52|TU95|TU160/.test(\n\t\t\tall,\n\t\t)\n\t) {\n\t\treturn 'Military';\n\t}\n\n\treturn 'Unknown';\n}\n\nfunction buildSpeechText(a: Aircraft, display: Record<string, string>): string {\n\tconst mode = String(a.mode || '').toUpperCase();\n\n\tlet modeSpeechText = 'Flug';\n\tlet routeDirectionText = 'von';\n\tlet routeOtherAirport = display.originDisplayName || display.destDisplayName || '';\n\n\tif (mode === 'LANDING') {\n\t\tmodeSpeechText = 'Landung';\n\t\trouteDirectionText = 'aus';\n\t\trouteOtherAirport = display.originDisplayName || '';\n\t}\n\n\tif (mode === 'TAKEOFF') {\n\t\tmodeSpeechText = 'Start';\n\t\trouteDirectionText = 'nach';\n\t\trouteOtherAirport = display.destDisplayName || '';\n\t}\n\n\tif (mode === 'OVERFLIGHT') {\n\t\tmodeSpeechText = '\u00DCberflug';\n\t\trouteDirectionText = 'von';\n\t\trouteOtherAirport = display.routeDisplayText || '';\n\t}\n\n\tconst bestCallsign = String(a.routeCallsign || a.callsign || '').trim();\n\n\tconst template =\n\t\t'{modeSpeechText}: {airlineName} {bestCallsign} {routeDirectionText} {routeOtherAirport} in {altitudeFt} Fu\u00DF. {windowPositionSpeechText}.';\n\n\tconst values: Record<string, string> = {\n\t\tmodeSpeechText,\n\t\trouteDirectionText,\n\t\trouteOtherAirport,\n\t\tbestCallsign,\n\n\t\tairlineName: String(a.airlineName || 'Unbekannte Airline'),\n\t\tcallsign: String(a.callsign || ''),\n\t\toperationalCallsign: String(a.operationalCallsign || a.callsign || ''),\n\t\trouteCallsign: String(a.routeCallsign || a.callsign || ''),\n\t\toriginDisplayName: display.originDisplayName || '',\n\t\tdestDisplayName: display.destDisplayName || '',\n\t\trouteDisplayText: display.routeDisplayText || '',\n\t\trouteCodesText: display.routeCodesText || '',\n\t\taircraftTypeText: display.aircraftTypeText || '',\n\t\taircraftSize: display.aircraftSize || '',\n\t\tregistration: String(a.registration || ''),\n\t\taltitudeFt: String(Math.round(a.altFt || 0)),\n\t\tspeedKt: String(Math.round(a.speedKt || 0)),\n\t\tverticalRate: String(Math.round(a.verticalRate || 0)),\n\t\ttrackDeg: String(Math.round(a.trackDeg || 0)),\n\t\twindowPositionSpeechText: display.windowPositionSpeechText || '',\n\t\tspecialDisplayText: display.specialDisplayText || '',\n\t};\n\n\treturn template\n\t\t.replace(/\\{([a-zA-Z0-9_]+)\\}/g, (_match, key) => values[key] || '')\n\t\t.replace(/\\s+/g, ' ')\n\t\t.replace(/\\s+\\./g, '.')\n\t\t.trim();\n}\n\nasync function maybeTriggerSpeech(adapter: AdapterLike, base: string, a: Aircraft, speechText: string): Promise<void> {\n\tif (!base.endsWith('.current')) {\n\t\treturn;\n\t}\n\n\tconst root = base.split('.').slice(0, -1).join('.');\n\n\tlet speechMode = 'browser';\n\n\ttry {\n\t\tconst st = await adapter.getForeignStateAsync(`${root}.speechMode`);\n\t\tspeechMode = String(st?.val || 'browser');\n\t} catch {\n\t\tspeechMode = 'browser';\n\t}\n\n\tif (speechMode !== 'external' && speechMode !== 'both') {\n\t\treturn;\n\t}\n\n\tconst key = [\n\t\tString(a.callsign || ''),\n\t\tString(a.routeCallsign || ''),\n\t\tString(a.registration || ''),\n\t\tString(speechText || ''),\n\t].join('|');\n\n\tif (!key || LAST_SPEECH_TRIGGER[base] === key) {\n\t\treturn;\n\t}\n\n\tLAST_SPEECH_TRIGGER[base] = key;\n\n\tawait adapter.setForeignStateAsync(`${base}.speechTrigger`, true, true);\n\n\tsetTimeout(() => {\n\t\tadapter.setForeignStateAsync(`${base}.speechTrigger`, false, true).catch(() => {});\n\t}, 500);\n}\n\nasync function buildSpeechTextForWrite(\n\tadapter: AdapterLike,\n\tbase: string,\n\ta: Aircraft,\n\tdisplay: Record<string, string>,\n): Promise<string> {\n\tconst root = base.split('.').slice(0, -1).join('.');\n\n\tlet template =\n\t\t'{modeSpeechText}: {airlineName} {bestCallsign} {routeDirectionText} {routeOtherAirport} in {altitudeFt} Fuss. {windowPositionSpeechText}.';\n\n\ttry {\n\t\tconst st = await adapter.getForeignStateAsync(`${root}.speechTemplate`);\n\t\tif (st?.val) {\n\t\t\ttemplate = String(st.val);\n\t\t}\n\t} catch {}\n\n\treturn buildSpeechTextFromTemplate(a, display, template);\n}\n\nfunction buildSpeechTextFromTemplate(a: Aircraft, display: Record<string, string>, template: string): string {\n\tconst mode = String(a.mode || '').toUpperCase();\n\n\tlet modeSpeechText = 'Flug';\n\tlet routeDirectionText = 'von';\n\tlet routeOtherAirport = display.originDisplayName || display.destDisplayName || '';\n\n\tif (mode === 'LANDING') {\n\t\tmodeSpeechText = 'Landung';\n\t\trouteDirectionText = 'aus';\n\t\trouteOtherAirport = display.originDisplayName || '';\n\t}\n\n\tif (mode === 'TAKEOFF') {\n\t\tmodeSpeechText = 'Start';\n\t\trouteDirectionText = 'nach';\n\t\trouteOtherAirport = display.destDisplayName || '';\n\t}\n\n\tif (mode === 'OVERFLIGHT') {\n\t\tmodeSpeechText = '\u00DCberflug';\n\t\trouteDirectionText = 'von';\n\t\trouteOtherAirport = display.routeDisplayText || '';\n\t}\n\n\tconst bestCallsign = String(a.routeCallsign || a.callsign || '').trim();\n\n\tconst values: Record<string, string> = {\n\t\tmodeSpeechText,\n\t\trouteDirectionText,\n\t\trouteOtherAirport,\n\t\tbestCallsign,\n\n\t\tairlineName: String(a.airlineName || 'Unbekannte Airline'),\n\t\tcallsign: String(a.callsign || ''),\n\t\toperationalCallsign: String(a.operationalCallsign || a.callsign || ''),\n\t\trouteCallsign: String(a.routeCallsign || a.callsign || ''),\n\t\toriginDisplayName: display.originDisplayName || '',\n\t\tdestDisplayName: display.destDisplayName || '',\n\t\trouteDisplayText: display.routeDisplayText || '',\n\t\trouteCodesText: display.routeCodesText || '',\n\t\taircraftTypeText: display.aircraftTypeText || '',\n\t\taircraftSize: display.aircraftSize || '',\n\t\tregistration: String(a.registration || ''),\n\t\taltitudeFt: String(Math.round(a.altFt || 0)),\n\t\tspeedKt: String(Math.round(a.speedKt || 0)),\n\t\tverticalRate: String(Math.round(a.verticalRate || 0)),\n\t\ttrackDeg: String(Math.round(a.trackDeg || 0)),\n\t\twindowPositionSpeechText: display.windowPositionSpeechText || '',\n\t\tspecialDisplayText: display.specialDisplayText || '',\n\t};\n\n\treturn String(template || '')\n\t\t.replace(/\\{([a-zA-Z0-9_]+)\\}/g, (_match, key) => values[key] || '')\n\t\t.replace(/\\s+/g, ' ')\n\t\t.replace(/\\s+\\./g, '.')\n\t\t.trim();\n}\n\nfunction cityOnly(name: unknown): string {\n\tconst v = String(name || '')\n\t\t.replace(/\\bAirport\\b/gi, '')\n\t\t.replace(/\\bInternational\\b/gi, '')\n\t\t.replace(/\\bIntl\\b/gi, '')\n\t\t.replace(/\\bFlughafen\\b/gi, '')\n\t\t.replace(/\\bFort Worth\\b/gi, '')\n\t\t.replace(/\\bMain\\b/gi, '')\n\t\t.replace(/\\s+/g, ' ')\n\t\t.trim();\n\n\tif (v === 'Frankfurt am') {\n\t\treturn 'Frankfurt';\n\t}\n\n\treturn v;\n}\n\nfunction buildMessage(a: Aircraft): string {\n\tconst lines: string[] = [];\n\tconst routeCallsign = String(a.routeCallsign || a.callsign || '')\n\t\t.trim()\n\t\t.toUpperCase();\n\n\tlines.push('\u2708\uFE0F JetFrame');\n\tlines.push('');\n\n\tlines.push(`${a.icon || '\u2708\uFE0F'} ${modeText(a.mode || '')}`);\n\tlines.push(`Flug: ${a.callsign || a.hex || 'unbekannt'}`);\n\n\tif (routeCallsign) {\n\t\tlines.push(`Route \u00FCber: ${routeCallsign}`);\n\t}\n\n\tif (a.airlineName) {\n\t\tlines.push(`Airline: ${a.airlineName}`);\n\t}\n\n\tif (a.routeTextLong) {\n\t\tlines.push(`Route: ${a.routeTextLong}`);\n\t} else if (a.routeText) {\n\t\tlines.push(`Route: ${a.routeText}`);\n\t} else if (a.routeWarning) {\n\t\tlines.push(`Route: ${a.routeWarning}`);\n\t} else if (a.directionText) {\n\t\tlines.push(`Richtung: ${a.directionText}`);\n\t}\n\n\tif (a.routeSource) {\n\t\tlines.push(`Quelle: ${a.routeSource}`);\n\t}\n\n\tif (a.aircraftModel) {\n\t\tlines.push(`Flugzeug: ${a.aircraftModel}`);\n\t} else if (a.aircraftType || a.type) {\n\t\tlines.push(`Typ: ${a.aircraftType || a.type}`);\n\t}\n\n\tif (a.registration) {\n\t\tlines.push(`Kennz.: ${a.registration}`);\n\t}\n\n\tlines.push('');\n\tlines.push(`H\u00F6he: ${Math.round(a.altFt || 0)} ft`);\n\tlines.push(`Speed: ${Math.round(a.speedKt || 0)} kt`);\n\tlines.push(`Steigrate: ${Math.round(a.verticalRate || 0)} ft/min`);\n\tlines.push(`Kurs: ${Math.round(a.trackDeg || 0)}\u00B0`);\n\n\tconst specialDisplayText = a.specialLiveryVisText || a.specialLiveryFull || a.specialText || '';\n\n\tif (specialDisplayText) {\n\t\tlines.push('');\n\t\tlines.push(`${a.isSpecial ? '\u2B50 Besonderheit: ' : '\u2139\uFE0F Info: '}${specialDisplayText}`);\n\t}\n\treturn lines.join('\\n');\n}\n\nfunction modeText(mode: string): string {\n\tif (mode === 'LANDING') {\n\t\treturn 'Landung';\n\t}\n\tif (mode === 'TAKEOFF') {\n\t\treturn 'Start';\n\t}\n\tif (mode === 'OVERFLIGHT') {\n\t\treturn '\u00DCberflug';\n\t}\n\treturn 'Flug';\n}\n\n/**\n *\n */\nexport async function ensureStates(adapter: AdapterLike, config: JetFrameConfig): Promise<void> {\n\tawait ensureBaseStates(adapter, config);\n}\n\nasync function keepExistingStringState(adapter: AdapterLike, id: string, value: unknown): Promise<string> {\n\tconst next = String(value || '').trim();\n\n\tif (next) {\n\t\treturn next;\n\t}\n\n\ttry {\n\t\tconst oldState = await adapter.getForeignStateAsync(id);\n\t\treturn String(oldState?.val || '').trim();\n\t} catch {\n\t\treturn '';\n\t}\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -0,0 +1,73 @@
1
+ "use strict";
2
+ var __create = Object.create;
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __getProtoOf = Object.getPrototypeOf;
7
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __export = (target, all) => {
9
+ for (var name in all)
10
+ __defProp(target, name, { get: all[name], enumerable: true });
11
+ };
12
+ var __copyProps = (to, from, except, desc) => {
13
+ if (from && typeof from === "object" || typeof from === "function") {
14
+ for (let key of __getOwnPropNames(from))
15
+ if (!__hasOwnProp.call(to, key) && key !== except)
16
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
17
+ }
18
+ return to;
19
+ };
20
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
21
+ // If the importer is in node compatibility mode or this is not an ESM
22
+ // file that has been converted to a CommonJS file using a Babel-
23
+ // compatible transform (i.e. "__esModule" has not been set), then set
24
+ // "default" to the CommonJS "module.exports" for node compatibility.
25
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
26
+ mod
27
+ ));
28
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
+ var staticFiles_exports = {};
30
+ __export(staticFiles_exports, {
31
+ copyStaticFiles: () => copyStaticFiles
32
+ });
33
+ module.exports = __toCommonJS(staticFiles_exports);
34
+ var fs = __toESM(require("fs"));
35
+ var path = __toESM(require("path"));
36
+ async function copyStaticFiles(adapter) {
37
+ const sourceDir = path.resolve(__dirname, "../../admin");
38
+ adapter.log.debug(`[JetFrame] Static source: ${sourceDir}`);
39
+ if (!fs.existsSync(sourceDir)) {
40
+ adapter.log.warn(`[JetFrame] Static source fehlt: ${sourceDir}`);
41
+ return;
42
+ }
43
+ await copyRecursiveToIoBrokerFiles(adapter, sourceDir, "");
44
+ adapter.log.debug("[JetFrame] Static files copied to ioBroker files");
45
+ }
46
+ async function copyRecursiveToIoBrokerFiles(adapter, srcDir, relDir) {
47
+ const entries = fs.readdirSync(srcDir, { withFileTypes: true });
48
+ for (const entry of entries) {
49
+ if (entry.name === "src") {
50
+ continue;
51
+ }
52
+ if (entry.name.endsWith(".ts")) {
53
+ continue;
54
+ }
55
+ if (entry.name === "tsconfig.json") {
56
+ continue;
57
+ }
58
+ const srcPath = path.join(srcDir, entry.name);
59
+ const relPath = relDir ? `${relDir}/${entry.name}` : entry.name;
60
+ if (entry.isDirectory()) {
61
+ await copyRecursiveToIoBrokerFiles(adapter, srcPath, relPath);
62
+ continue;
63
+ }
64
+ const buffer = fs.readFileSync(srcPath);
65
+ await adapter.writeFileAsync("jetframe.admin", relPath, buffer);
66
+ adapter.log.debug(`[JetFrame] Static written: jetframe.admin/${relPath}`);
67
+ }
68
+ }
69
+ // Annotate the CommonJS export names for ESM import in node:
70
+ 0 && (module.exports = {
71
+ copyStaticFiles
72
+ });
73
+ //# sourceMappingURL=staticFiles.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/lib/staticFiles.ts"],
4
+ "sourcesContent": ["import type { AdapterLike } from './types';\nimport * as fs from 'fs';\nimport * as path from 'path';\n\n/**\n *\n */\nexport async function copyStaticFiles(adapter: AdapterLike): Promise<void> {\n\tconst sourceDir = path.resolve(__dirname, '../../admin');\n\n\tadapter.log.debug(`[JetFrame] Static source: ${sourceDir}`);\n\n\tif (!fs.existsSync(sourceDir)) {\n\t\tadapter.log.warn(`[JetFrame] Static source fehlt: ${sourceDir}`);\n\t\treturn;\n\t}\n\n\tawait copyRecursiveToIoBrokerFiles(adapter, sourceDir, '');\n\n\tadapter.log.debug('[JetFrame] Static files copied to ioBroker files');\n}\n\nasync function copyRecursiveToIoBrokerFiles(adapter: AdapterLike, srcDir: string, relDir: string): Promise<void> {\n\tconst entries = fs.readdirSync(srcDir, { withFileTypes: true });\n\n\tfor (const entry of entries) {\n\t\tif (entry.name === 'src') {\n\t\t\tcontinue;\n\t\t}\n\t\tif (entry.name.endsWith('.ts')) {\n\t\t\tcontinue;\n\t\t}\n\t\tif (entry.name === 'tsconfig.json') {\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst srcPath = path.join(srcDir, entry.name);\n\t\tconst relPath = relDir ? `${relDir}/${entry.name}` : entry.name;\n\n\t\tif (entry.isDirectory()) {\n\t\t\tawait copyRecursiveToIoBrokerFiles(adapter, srcPath, relPath);\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst buffer = fs.readFileSync(srcPath);\n\n\t\tawait adapter.writeFileAsync('jetframe.admin', relPath, buffer);\n\n\t\tadapter.log.debug(`[JetFrame] Static written: jetframe.admin/${relPath}`);\n\t}\n}\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,SAAoB;AACpB,WAAsB;AAKtB,eAAsB,gBAAgB,SAAqC;AAC1E,QAAM,YAAY,KAAK,QAAQ,WAAW,aAAa;AAEvD,UAAQ,IAAI,MAAM,6BAA6B,SAAS,EAAE;AAE1D,MAAI,CAAC,GAAG,WAAW,SAAS,GAAG;AAC9B,YAAQ,IAAI,KAAK,mCAAmC,SAAS,EAAE;AAC/D;AAAA,EACD;AAEA,QAAM,6BAA6B,SAAS,WAAW,EAAE;AAEzD,UAAQ,IAAI,MAAM,kDAAkD;AACrE;AAEA,eAAe,6BAA6B,SAAsB,QAAgB,QAA+B;AAChH,QAAM,UAAU,GAAG,YAAY,QAAQ,EAAE,eAAe,KAAK,CAAC;AAE9D,aAAW,SAAS,SAAS;AAC5B,QAAI,MAAM,SAAS,OAAO;AACzB;AAAA,IACD;AACA,QAAI,MAAM,KAAK,SAAS,KAAK,GAAG;AAC/B;AAAA,IACD;AACA,QAAI,MAAM,SAAS,iBAAiB;AACnC;AAAA,IACD;AAEA,UAAM,UAAU,KAAK,KAAK,QAAQ,MAAM,IAAI;AAC5C,UAAM,UAAU,SAAS,GAAG,MAAM,IAAI,MAAM,IAAI,KAAK,MAAM;AAE3D,QAAI,MAAM,YAAY,GAAG;AACxB,YAAM,6BAA6B,SAAS,SAAS,OAAO;AAC5D;AAAA,IACD;AAEA,UAAM,SAAS,GAAG,aAAa,OAAO;AAEtC,UAAM,QAAQ,eAAe,kBAAkB,SAAS,MAAM;AAE9D,YAAQ,IAAI,MAAM,6CAA6C,OAAO,EAAE;AAAA,EACzE;AACD;",
6
+ "names": []
7
+ }
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __copyProps = (to, from, except, desc) => {
7
+ if (from && typeof from === "object" || typeof from === "function") {
8
+ for (let key of __getOwnPropNames(from))
9
+ if (!__hasOwnProp.call(to, key) && key !== except)
10
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
11
+ }
12
+ return to;
13
+ };
14
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
15
+ var types_exports = {};
16
+ module.exports = __toCommonJS(types_exports);
17
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/lib/types.ts"],
4
+ "sourcesContent": ["/**\n * Minimal ioBroker adapter interface used by lib functions.\n * Using this instead of `any` gives better IDE support while\n * avoiding a circular import of adapter-core in every lib file.\n */\nexport interface AdapterLike {\n\tnamespace: string;\n\tinstance?: number;\n\tconfig: any;\n\n\tlog: {\n\t\tinfo: (msg: string) => void;\n\t\twarn: (msg: string) => void;\n\t\terror: (msg: string) => void;\n\t\tdebug: (msg: string) => void;\n\t};\n\n\tgetForeignStateAsync(id: string): Promise<ioBroker.State | null | undefined>;\n\tsetForeignStateAsync(id: string, value: ioBroker.StateValue, ack?: boolean): Promise<any>;\n\n\tgetForeignObjectAsync(id: string): Promise<ioBroker.Object | null | undefined>;\n\tsetForeignObjectAsync(id: string, obj: any): Promise<any>;\n\n\treadDirAsync(adapter: string, path: string): Promise<any[]>;\n\treadFileAsync(adapter: string, path: string): Promise<any>;\n\twriteFileAsync(adapter: string, path: string, data: Buffer | string): Promise<any>;\n\tunlinkAsync(adapter: string, path: string): Promise<any>;\n}\n\nexport type FlightMode = 'TAKEOFF' | 'LANDING' | 'OVERFLIGHT' | '';\n\n/**\n *\n */\nexport interface JetFrameConfig {\n\tenabled: boolean;\n\n\thomeLat: number;\n\n\thomeLon: number;\n\n\tairport: {\n\t\t/**\n\t\t *\n\t\t */\n\t\tiata: string;\n\t\t/**\n\t\t *\n\t\t */\n\t\ticao?: string;\n\t\t/**\n\t\t *\n\t\t */\n\t\tname: string;\n\t\t/**\n\t\t *\n\t\t */\n\t\tlat: number;\n\t\t/**\n\t\t *\n\t\t */\n\t\tlon: number;\n\t};\n\n\tradiusNm: number;\n\n\tadsbCustomUrl: string;\n\tmaxHomeDistanceNm: number;\n\n\tsearchPollSeconds: number;\n\n\tlivePollSeconds: number;\n\n\tliveMaxSeconds: number;\n\n\twindowBearingDeg: number;\n\n\twindowFovDeg: number;\n\n\tminAltitudeFt: number;\n\n\tmaxAltitudeFt: number;\n\n\tautoRunwayTrackToleranceDeg: number;\n\n\tminClimbRate: number;\n\n\tminSinkRate: number;\n\n\toverflightEnabled: boolean;\n\n\toverflightOnly: boolean;\n\tpriorityEnabled: boolean;\n\tprioritySpecialLivery: boolean;\n\tpriorityAircraftSize: boolean;\n\tpriorityMilitaryGov: boolean;\n\temergencyPriorityEnabled: boolean;\n\temergencySpeechEnabled: boolean;\n\temergencySquawk7500: boolean;\n\temergencySquawk7600: boolean;\n\temergencySquawk7700: boolean;\n\n\texternalManufacturerLogos: boolean;\n\tmanufacturerLogoUrls: string;\n\texternalAirlineLogos: boolean;\n\tairlineLogoBaseUrl: string;\n\tcacheExternalImages: boolean;\n\n\toverflightMaxDistanceNm: number;\n\n\toverflightMinAltitudeFt: number;\n\n\toverflightMaxAltitudeFt: number;\n\n\toverflightRequiresWindow: boolean;\n\n\tdpRoot: string;\n\n\tairportJsonDp: string;\n\n\tspeechMode?: 'browser' | 'external' | 'both' | 'off';\n\n\tspeechTemplate?: string;\n\n\tspeechEnabled: boolean;\n}\n\n/**\n *\n */\nexport interface Aircraft {\n\thex: string;\n\n\tcallsign: string;\n\n\toperationalCallsign?: string;\n\trouteCallsign?: string;\n\n\ttype: string;\n\n\tregistration: string;\n\n\tlat: number;\n\n\tlon: number;\n\n\taltFt: number;\n\n\tspeedKt: number;\n\n\ttrackDeg: number;\n\n\tverticalRate: number;\n\n\tseenSec: number;\n\n\tbearingHomeDeg?: number;\n\n\tdistHomeNm?: number;\n\tdistanceKm?: number;\n\n\tdistAirportNm?: number;\n\n\tbearingAircraftToAirportDeg?: number;\n\n\tbearingAirportToAircraftDeg?: number;\n\n\tlandingTrackDiffDeg?: number;\n\n\ttakeoffTrackDiffDeg?: number;\n\n\tairportTrackDiffDeg?: number;\n\n\twindowDiffDeg?: number;\n\n\twindowDiffAbsDeg?: number;\n\n\tinWindow?: boolean;\n\n\trelevant?: boolean;\n\n\tpriority?: number;\n\n\tmode?: FlightMode;\n\n\ticon?: string;\n\n\tdirectionText?: string;\n\n\tairlineName?: string;\n\n\tairlineIata?: string;\n\n\tairlineIcao?: string;\n\n\toriginIata?: string;\n\n\tdestIata?: string;\n\n\toriginName?: string;\n\n\tdestName?: string;\n\n\trouteText?: string;\n\n\trouteTextLong?: string;\n\n\trouteReliable?: boolean;\n\n\trouteWarning?: string;\n\n\trouteSource?: string;\n\n\taircraftModel?: string;\n\n\taircraftType?: string;\n\n\tlogoUrl?: string;\n\n\tjetphotosUrl?: string;\n\n\tjetphotosImageUrl?: string;\n\n\tlocalLogoUrl?: string;\n\n\tlocalImageUrl?: string;\n\n\tfinalImageUrl?: string;\n\n\tspecialText?: string;\n\n\tspeechText?: string;\n\n\tspecialLiveryTitle?: string;\n\n\tspecialLiveryDescription?: string;\n\n\tspecialLiveryFull?: string;\n\n\tspecialLiveryVisText?: string;\n\n\tspecialDisplayText?: string;\n\n\tmodeVisText?: string;\n\n\tprobableRunway?: string;\n\tprobableRunwayText?: string;\n\tprobableRunwayHeading?: number;\n\tprobableRunwayDiffDeg?: number;\n\trunwayConfidence?: number;\n\twindowPositionText?: string;\n\n\twindowPositionClass?: string;\n\n\twindowPositionSpeechText?: string;\n\n\toriginDisplayName?: string;\n\n\tdestDisplayName?: string;\n\tdepartureAirport?: string;\n\tapproachAirport?: string;\n\n\trouteDisplayText?: string;\n\n\trouteCodesText?: string;\n\n\tmanufacturer?: string;\n\n\tmanufacturerLogoText?: string;\n\n\tmanufacturerLogoUrl?: string;\n\n\taircraftTypeText?: string;\n\n\taircraftSize?: string;\n\n\tsquawk?: string;\n\temergency?: string;\n\tisEmergency?: boolean;\n\temergencyType?: string;\n\temergencyText?: string;\n\n\tisSpecial?: boolean;\n}\n"],
5
+ "mappings": ";;;;;;;;;;;;;;AAAA;AAAA;",
6
+ "names": []
7
+ }
@@ -0,0 +1,52 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+ var visConfig_exports = {};
20
+ __export(visConfig_exports, {
21
+ writeVisConfig: () => writeVisConfig
22
+ });
23
+ module.exports = __toCommonJS(visConfig_exports);
24
+ async function writeVisConfig(adapter, config, logDebug, logWarn) {
25
+ try {
26
+ const visualSource = String(config.visualSource || "current").toLowerCase();
27
+ const safeSource = ["current", "airport", "overflight"].includes(visualSource) ? visualSource : "current";
28
+ const data = {
29
+ simpleApiHost: String(config.simpleApiHost || "").trim(),
30
+ simpleApiPort: Number(config.simpleApiPort || 8087),
31
+ visualSource: safeSource,
32
+ instance: adapter.instance,
33
+ dpRoot: config.dpRoot || `jetframe.${adapter.instance}`,
34
+ updated: (/* @__PURE__ */ new Date()).toISOString()
35
+ };
36
+ await adapter.writeFileAsync(
37
+ "jetframe.admin",
38
+ "vis-config.json",
39
+ Buffer.from(JSON.stringify(data, null, 2), "utf8")
40
+ );
41
+ logDebug(
42
+ `VIS Config geschrieben: source=${data.visualSource}, apiHost=${data.simpleApiHost || "auto"}, apiPort=${data.simpleApiPort}`
43
+ );
44
+ } catch (e) {
45
+ logWarn(`VIS Config konnte nicht geschrieben werden: ${e instanceof Error ? e.message : String(e)}`);
46
+ }
47
+ }
48
+ // Annotate the CommonJS export names for ESM import in node:
49
+ 0 && (module.exports = {
50
+ writeVisConfig
51
+ });
52
+ //# sourceMappingURL=visConfig.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/lib/visConfig.ts"],
4
+ "sourcesContent": ["import type { AdapterLike } from './types';\nexport async function writeVisConfig(\n\tadapter: AdapterLike,\n\tconfig: any,\n\tlogDebug: (msg: string, level?: number) => void,\n\tlogWarn: (msg: string) => void,\n): Promise<void> {\n\ttry {\n\t\tconst visualSource = String(config.visualSource || 'current').toLowerCase();\n\n\t\tconst safeSource = ['current', 'airport', 'overflight'].includes(visualSource) ? visualSource : 'current';\n\n\t\tconst data = {\n\t\t\tsimpleApiHost: String(config.simpleApiHost || '').trim(),\n\t\t\tsimpleApiPort: Number(config.simpleApiPort || 8087),\n\t\t\tvisualSource: safeSource,\n\t\t\tinstance: adapter.instance,\n\t\t\tdpRoot: config.dpRoot || `jetframe.${adapter.instance}`,\n\t\t\tupdated: new Date().toISOString(),\n\t\t};\n\n\t\tawait adapter.writeFileAsync(\n\t\t\t'jetframe.admin',\n\t\t\t'vis-config.json',\n\t\t\tBuffer.from(JSON.stringify(data, null, 2), 'utf8'),\n\t\t);\n\n\t\tlogDebug(\n\t\t\t`VIS Config geschrieben: source=${data.visualSource}, apiHost=${data.simpleApiHost || 'auto'}, apiPort=${data.simpleApiPort}`,\n\t\t);\n\t} catch (e) {\n\t\tlogWarn(`VIS Config konnte nicht geschrieben werden: ${e instanceof Error ? e.message : String(e)}`);\n\t}\n}\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,eAAsB,eACrB,SACA,QACA,UACA,SACgB;AAChB,MAAI;AACH,UAAM,eAAe,OAAO,OAAO,gBAAgB,SAAS,EAAE,YAAY;AAE1E,UAAM,aAAa,CAAC,WAAW,WAAW,YAAY,EAAE,SAAS,YAAY,IAAI,eAAe;AAEhG,UAAM,OAAO;AAAA,MACZ,eAAe,OAAO,OAAO,iBAAiB,EAAE,EAAE,KAAK;AAAA,MACvD,eAAe,OAAO,OAAO,iBAAiB,IAAI;AAAA,MAClD,cAAc;AAAA,MACd,UAAU,QAAQ;AAAA,MAClB,QAAQ,OAAO,UAAU,YAAY,QAAQ,QAAQ;AAAA,MACrD,UAAS,oBAAI,KAAK,GAAE,YAAY;AAAA,IACjC;AAEA,UAAM,QAAQ;AAAA,MACb;AAAA,MACA;AAAA,MACA,OAAO,KAAK,KAAK,UAAU,MAAM,MAAM,CAAC,GAAG,MAAM;AAAA,IAClD;AAEA;AAAA,MACC,kCAAkC,KAAK,YAAY,aAAa,KAAK,iBAAiB,MAAM,aAAa,KAAK,aAAa;AAAA,IAC5H;AAAA,EACD,SAAS,GAAG;AACX,YAAQ,+CAA+C,aAAa,QAAQ,EAAE,UAAU,OAAO,CAAC,CAAC,EAAE;AAAA,EACpG;AACD;",
6
+ "names": []
7
+ }