NEWS
gelöst: Zentrale Scripts mit Funktionen oder Konstanten
-
Hallo zusammen,
ich möchte in ioBroker ein oder zwei Scripte erstellen in denen ich für mein Projekt allgemeine Konstanten und Funktionen hinterlegen kann und von anderen Java-Scripten darauf zugreifen. Ich habe dazu im Ordner "Allgemeine Scripte (common)" das Script GPS_Config angleget
// -------------------------------------------------------------------------- // global/GPS_Config // 2026-06-12a: zentrale GPS Konfiguration // -------------------------------------------------------------------------- var GPS_Config = { LatHome: 47.3 LonHome: 7.8 RadiusHome: 500, MaxJump: 200, NightStart: 21, NightEnd: 7, PauseThreshold: 2 * 3600 * 1000 }; function haversine(lat1, lon1, lat2, lon2) { const R = 6371000; const toRad = x => x * Math.PI / 180; const dLat = toRad(lat2 - lat1); const dLon = toRad(lon2 - lon1); const a = Math.sin(dLat/2) * Math.sin(dLat/2) + Math.cos(toRad(lat1)) * Math.cos(toRad(lat2)) * Math.sin(dLon/2) * Math.sin(dLon/2); return R * 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a)); }Wenn ich auf die Werte und Funktionen mit
log(GPS_Config.LatHome); log(haversine(47.0, 7.0, 47.1, 7.1).toFixed(0) + 'm');zugreifen will bekomme ich
javascript.0 17:08:09.742 error Error: ReferenceError: GPS_Config is not defined javascript.0 17:08:09.742 error at script.js.GPS_Test:2:5 javascript.0 17:08:09.742 error at script.js.GPS_Test:9:3 javascript.0 17:08:09.742 error at Script.runInContext (node:vm:149:12)Gibt es eine Möglichkeit zentrale Konstanten und Funktionen zu definieren?
Danke und Grüße
Gerd -
Hallo zusammen,
ich möchte in ioBroker ein oder zwei Scripte erstellen in denen ich für mein Projekt allgemeine Konstanten und Funktionen hinterlegen kann und von anderen Java-Scripten darauf zugreifen. Ich habe dazu im Ordner "Allgemeine Scripte (common)" das Script GPS_Config angleget
// -------------------------------------------------------------------------- // global/GPS_Config // 2026-06-12a: zentrale GPS Konfiguration // -------------------------------------------------------------------------- var GPS_Config = { LatHome: 47.3 LonHome: 7.8 RadiusHome: 500, MaxJump: 200, NightStart: 21, NightEnd: 7, PauseThreshold: 2 * 3600 * 1000 }; function haversine(lat1, lon1, lat2, lon2) { const R = 6371000; const toRad = x => x * Math.PI / 180; const dLat = toRad(lat2 - lat1); const dLon = toRad(lon2 - lon1); const a = Math.sin(dLat/2) * Math.sin(dLat/2) + Math.cos(toRad(lat1)) * Math.cos(toRad(lat2)) * Math.sin(dLon/2) * Math.sin(dLon/2); return R * 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a)); }Wenn ich auf die Werte und Funktionen mit
log(GPS_Config.LatHome); log(haversine(47.0, 7.0, 47.1, 7.1).toFixed(0) + 'm');zugreifen will bekomme ich
javascript.0 17:08:09.742 error Error: ReferenceError: GPS_Config is not defined javascript.0 17:08:09.742 error at script.js.GPS_Test:2:5 javascript.0 17:08:09.742 error at script.js.GPS_Test:9:3 javascript.0 17:08:09.742 error at Script.runInContext (node:vm:149:12)Gibt es eine Möglichkeit zentrale Konstanten und Funktionen zu definieren?
Danke und Grüße
Gerd@Norwegen60 [sagte: Gibt es eine Möglichkeit zentrale Konstanten und Funktionen zu definieren?
Häufig verwendete eigene Funktionen werden in Skripten unter der Gruppe "global" (Expertenmodus) definiert.
Globale Skripte werden vor dem Kompilieren in alle anderen Skripte kopiert und dort ausgeführt. -
Vielen Dank für die schnelle Antwort. Gibt es einen Grund dass dort keine Konstanten definiert werden sollen. Es handelt sich um ein geschlossenes Projekt das auf dem Raspberry läuft. Die Anzahl der Scripte wird wohl bei 10 +/- liegen
-
Hallo zusammen,
ich möchte in ioBroker ein oder zwei Scripte erstellen in denen ich für mein Projekt allgemeine Konstanten und Funktionen hinterlegen kann und von anderen Java-Scripten darauf zugreifen. Ich habe dazu im Ordner "Allgemeine Scripte (common)" das Script GPS_Config angleget
// -------------------------------------------------------------------------- // global/GPS_Config // 2026-06-12a: zentrale GPS Konfiguration // -------------------------------------------------------------------------- var GPS_Config = { LatHome: 47.3 LonHome: 7.8 RadiusHome: 500, MaxJump: 200, NightStart: 21, NightEnd: 7, PauseThreshold: 2 * 3600 * 1000 }; function haversine(lat1, lon1, lat2, lon2) { const R = 6371000; const toRad = x => x * Math.PI / 180; const dLat = toRad(lat2 - lat1); const dLon = toRad(lon2 - lon1); const a = Math.sin(dLat/2) * Math.sin(dLat/2) + Math.cos(toRad(lat1)) * Math.cos(toRad(lat2)) * Math.sin(dLon/2) * Math.sin(dLon/2); return R * 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a)); }Wenn ich auf die Werte und Funktionen mit
log(GPS_Config.LatHome); log(haversine(47.0, 7.0, 47.1, 7.1).toFixed(0) + 'm');zugreifen will bekomme ich
javascript.0 17:08:09.742 error Error: ReferenceError: GPS_Config is not defined javascript.0 17:08:09.742 error at script.js.GPS_Test:2:5 javascript.0 17:08:09.742 error at script.js.GPS_Test:9:3 javascript.0 17:08:09.742 error at Script.runInContext (node:vm:149:12)Gibt es eine Möglichkeit zentrale Konstanten und Funktionen zu definieren?
Danke und Grüße
Gerdwie paul schon geschrieben hat, werden die globalskripte einfach nur intern vor jedes skript kopiert. das jeweilige skript läuft in seinem eigenen namensraum und weiß von den anderen skripten/global skripten erst einmal nichts.
dh Werte die in variablen gespeichert werden, stehen den anderen skripten nicht zur verfügung.
dazu müsste man ein separates skript schreiben mit welchem man mit messageTo und onMessage kommunizieren kann. Wobei da sich eher Datenpunkte anbieten.Aber für Konstanten und allgemeine Funktionen die zustandslos arbeiten ist das so ok
-
Ich weiß, ich könnte die Werte auch in Datenpunkte auslagern, aber der Weg über eine zentrale Config erschien mir für diese spezifischen Werte übersichtlicher als immer über GetState().val darauf zuzugreifen
-
Vielen Dank für die schnelle Antwort. Gibt es einen Grund dass dort keine Konstanten definiert werden sollen. Es handelt sich um ein geschlossenes Projekt das auf dem Raspberry läuft. Die Anzahl der Scripte wird wohl bei 10 +/- liegen
@Norwegen60 [sagte]: Gibt es einen Grund dass dort keine Konstanten definiert werden sollen.
Ich denke, dass Konstanten in jedem Skript RAM belegen, was auf getState(id) allerdings auch zutrifft.
-
Also der Tip mit Experten-Modus hat funktioniert. Danke.
Mein Script funktioniert jetzt auch. Incl. der Konstanten.
Wenn die Konstanten in jedes Script kopiert werden, benötigt das wahrscheinlich schon RAM, aber bei 10 Scripts dürfte das überschaubar sein. Auch wenn nicht alle Konstanten in allen Scripts benötigt werden. Wäre aber schon mal interessant.
Ich könnte die Konstanten mal raus schmeißen. Kann ich den RAM-Verbrauch irgendwo sehen? free -h ist da wohl etwas zu grob -
Also der Tip mit Experten-Modus hat funktioniert. Danke.
Mein Script funktioniert jetzt auch. Incl. der Konstanten.
Wenn die Konstanten in jedes Script kopiert werden, benötigt das wahrscheinlich schon RAM, aber bei 10 Scripts dürfte das überschaubar sein. Auch wenn nicht alle Konstanten in allen Scripts benötigt werden. Wäre aber schon mal interessant.
Ich könnte die Konstanten mal raus schmeißen. Kann ich den RAM-Verbrauch irgendwo sehen? free -h ist da wohl etwas zu grobdas ist vernachlässigbar, wenn du da nicht tonnen von text oder komplexe objekte ablegst.
ein einzelne number konstante verbraucht max 8 Byte
text ca 20-30 Bytes für die Verwaltung eines Strings plus 1 byte für einfache Zeichen oder 2-4 Bytes für unicode zeichen
Hey! Du scheinst an dieser Unterhaltung interessiert zu sein, hast aber noch kein Konto.
Hast du es satt, bei jedem Besuch durch die gleichen Beiträge zu scrollen? Wenn du dich für ein Konto anmeldest, kommst du immer genau dorthin zurück, wo du zuvor warst, und kannst dich über neue Antworten benachrichtigen lassen (entweder per E-Mail oder Push-Benachrichtigung). Du kannst auch Lesezeichen speichern und Beiträge positiv bewerten, um anderen Community-Mitgliedern deine Wertschätzung zu zeigen.
Mit deinem Input könnte dieser Beitrag noch besser werden 💗
Registrieren Anmelden