Weiter zum Inhalt

JavaScript

2.5k Themen 49.4k Beiträge

Hilfe für Skripterstellung mit JavaScript

NEWS

  • Vorschlag zu globalen Scripten

    11
    0 Stimmen
    11 Beiträge
    477 Aufrufe
    OliverIOO
    @legro Das ist eigentlich eine Grundfunktion von Javaskript/node https://developer.mozilla.org/en-US/docs/Glossary/Just_In_Time_Compilation Da jedes Script in einer eigenen VM (nicht zu verwechseln mit einer VM bspw in proxmox) Ausgeführt wird, gibt es zwischen den Skripten keine Optimierung https://nodejs.org/api/vm.html
  • FritzDect - Extended

    5
    0 Stimmen
    5 Beiträge
    207 Aufrufe
    Ro75R
    Ich habe den Code bzgl. axios angepasst. Wie gesagt, unter JS-Adapter 8.x war es nicht nötig, unter 9.x bei mir schon. Ich habe wie gesagt, den Code jetzt etwas angepasst und nun geht es auch ohne das axios als zusätzliches NPM-Paket eingetragen werden muss. Ro75.
  • clearSchedule löscht keine Schedules (mehr)

    3
    0 Stimmen
    3 Beiträge
    161 Aufrufe
    R
    https://github.com/ioBroker/ioBroker.javascript/issues/2164
  • wo sind Scripte gespeichert?

    javascript
    7
    0 Stimmen
    7 Beiträge
    206 Aufrufe
    etvE
    klar - passiert am ioBroker Raspi täglich, aber OC holt nur und schreibt nicht 😉
  • [Gelöst] setState in "Binding"

    7
    0 Stimmen
    7 Beiträge
    210 Aufrufe
    P
    @bahnuhr zur Erläuterung meines Vorgehens: Ausgehend von einer Navigation über ein ein Widget "Universal (Schalter, Taster, Nav & mehr)" aus inventwo design... [image: 1775024353201-navigation.png] ...wähle ich eine PDF-Datei eines Kalenders, dessen Dateiname mit Pfad dann in einen Datenpunkt geschrieben wird. [image: 1775024467571-objekt.png] Dieser Datenpunkt wird dann verwendet um die ausgewählte Datei in einem iFrame anzuzeigen. [image: 1775024571909-kalender24.png]
  • Navimow Steuerung ioBroker

    7
    3
    0 Stimmen
    7 Beiträge
    176 Aufrufe
    K
    Hallo Tombox 🙋‍♂️ Kannste mir wohl noch sagen welches Widget ich haben muss mit welchen Einstellungen für den Countdown in der IoBroker Vis
  • getState liefert anders Ergebnis als bei Objekt

    Ungelöst
    21
    0 Stimmen
    21 Beiträge
    321 Aufrufe
    OliverIOO
    @paul53 sagte: @OliverIO [sagte]: Meinung das das der Adapter machen muss. Als Javascript-Programmierer sollte man wissen, dass Arrays und Objekte referenziert werden. Das weiß ich schon, Aber mehrfaches lesen eines datenpunkts sollte konsistent auch den echten Inhalt des datenpunkts liefern, auch wenn man in die variable das zwischenzeitlich was reinschreibt. Die meisten Nutzer wissen ja nix vom caching, welches sich ja auch noch an und ausschalten lässt.
  • Shelly Verbrauchs-Historie für Tag, Woche, Monat, Jahr

    144
    1
    1 Stimmen
    144 Beiträge
    28k Aufrufe
    crunchipC
    @micklafisch sagte in Shelly Verbrauchs-Historie für Tag, Woche, Monat, Jahr: von daher die offene Frage ob ich hier etwas vielleicht übersehen habe ne, nichts übersehen, außer wenn du die Datenpunkte schon bereits irgendwo in eine Datenbank schreibst, diese zu mappen
  • Skript aufteilen möglich?

    20
    0 Stimmen
    20 Beiträge
    786 Aufrufe
    OliverIOO
    @ple Du könntest ein Service Script laufen lassen, das alles mit supabase macht, also anmelden, abrufen, schreiben etc. So wie @ticaki oben vorgeschlagen hat horcht dieses Skript dann auf bestimmte befehlsworte, führt die jeweilige Aktion aus und gibt die Daten zurück, ohne das sichnjedes einzelne Skripte um die supabase Details kümmern muss. Klar kann man auch einzelne Programmatiken lokal ablegen und auch einbinden. Da gibt es hier im Forum Beispiele dazu. Müsste ich suchen wenn das das Ziel wäre. Dann könnte man noch ein öffentliches npm Paket machen, das finde ich nicht so optimal, theoretisch auch ein privates Paket, das habe ich noch nie ausprobiert. Wenn ich etwas umfangreicheres benötige, mit mehreren Dateien, dann würde ich lieber einen eigenen Adapter machen, da hat man dann alle Möglichkeiten.
  • [Vorlage] Denon HEOS Script

    Verschoben javascript template
    359
    1
    1 Stimmen
    359 Beiträge
    93k Aufrufe
    S
    Hi zusammen! Ich nutze einen Denon und mir fehlt der Ordner heos.0.sources.1028... Demnach kann ich die Favoriten auch nicht ansteuern. Mit dem Adapter soll das Skript aus dem ersten Post doch überflüssig sein, oder?
  • [Skript] Absolute Feuchte berechnen

    Verschoben
    741
    1
    2 Stimmen
    741 Beiträge
    255k Aufrufe
    C
    Ich bin grade total begeistert, hab die Version 0.6.8 grade kopiert, meine Werte eingefügt, und es läuft auf Anhieb! Alles was ich brauche :-) Hab in der Mietwohnung unten nach neuen Fenstern an den Kältebrücken leichte Schimmelprobleme, um dem zu begegnen gibt es jetzt a) eine Lüftungsanlage und b) in den Gefährdeten Bereichen eine kleine Heizung im Putz um die Temperatur dort über dem Taupunkt zu halten. Das Script liefert mir nun alle Werte die ich brauche, Mega!! Wem Schuld ich denn nun den Kaffee, ich mein... an dem Script schreiben mehrere?
  • [TypeSkript] Zendure SolarFlow 2400 AC - EVCC Steuerung

    65
    1 Stimmen
    65 Beiträge
    5k Aufrufe
    portyP
    Guten Morgen @schimi wie bereits im EDIT erwähnt funktionierte es ab dem nächsten Morgen doch. HEMS war deaktivert und auch die anderen Settings (SmartMode Off etc ) waren so eingestellt wie du es mal in irgend einem Post mal erwähnt hattest. Device ID etc war natürlich drin, sieht man in meinem Bild schlecht da schwarz auf schwarz ausgeblendet :) wir waren unterwegs an dem Tag und ich hatte es nur in der App gesehen das der Modus auf "Standby" stand obwohl wir zu dem Zeitpunkt einen Verbrauch von ca. 450W hatten. Habe dann in der App auf "Netzausgangsmodus" gestellt. Am nächsten Morgen dann das Script gestoppt, den Modus von Hand über den MQTT-Datenpunkt geändert was auch funktionierte. Was ich nicht drin hatte da es als "optional" eingetragen war, war der Datenpunkt "evccModus: "0_userdata.0.zendure.EVCC_Modus", diesen hatte ich noch hinzugefügt. Danach mal das Script von @maxclaudi gestartet und den Modus darüber ungestellt, auch erfolgreich. Gestern hat es mit deinem Script jedenfalls wunderbar funkioniert, wobei ich auch schon überlegt habe nich auf 0 sondern eher auf Minimalbezug zu stellen. Habe den Aktuellen Stromverbrauch mal auf meine Ulanzi TC001 gelegt und das springt nicht schlecht :) Danke fürs Update von deinem Script, schaue ich mir nachher Zuhause mal an.
  • Json für SourceAnalytics

    83
    1
    4 Stimmen
    83 Beiträge
    11k Aufrufe
    H
    @crunchip Passt, vielen Dank...
  • Skript zur Darstellung Position Sonne / Mond mit Schatten

    3
    0 Stimmen
    3 Beiträge
    160 Aufrufe
    bahnuhrB
    @MarkA sagte in Skript zur Darstellung Position Sonne / Mond mit Schatten: Kann das auch für IOBroker implementiert werden? Mir fehlen da leider die Programmierfähigkeiten... Dann musste mal die Suche benutzen. Scripte diesbezüglich wurden hier schon mehrfach kundgetan. Und in VIS dann z.B. so: [image: 1773248490490-cbdbeb92-2725-4b5a-860f-caf7ac2b2265-image.png]
  • Script für Formel 1 - Kalender, Ergebnisse und Wertungen

    40
    7
    5 Stimmen
    40 Beiträge
    6k Aufrufe
    da_WoodyD
    @stenmic sagte in Script für Formel 1 - Kalender, Ergebnisse und Wertungen: Eigentlich sollte alles fehlerfrei funktionieren aber eventuell muss ich nächste Saison nachbessern falls er zu Fehlermeldungen wegen dem Jahr kommt. Dass kann ich jetzt noch nicht wirklich alles prüfen. tja, neues jahr, neues glück. ;) rennkalender 2026 klappt. rennen 1 sieht etwas dubios aus. fahrer und konstrukteur wertung klapp nicht mehr...
  • ABRP API

    13
    0 Stimmen
    13 Beiträge
    1k Aufrufe
    C
    so läuft bei jetzt auch bei mir wer es als js haben will: /*************************************************************** * VW → ABRP Telemetry Script * für ioBroker Javascript Adapter * * Funktionen: * 1. Sendet Fahrzeugdaten alle 5 Minuten an ABRP * 2. Sendet sofort wenn sich der SOC ändert * * Gesendete Daten: * - SOC (Batteriestand) * - GPS Position * - Odometer * - Batteriekapazität * - Timestamp * * API: * https://api.iternio.com/1/tlm/send ***************************************************************/ const apiKey = "API-KEY-von-iternio.com"; const token = "Token-aus-der-APP"; const vin = "VIN-des-Autos"; /*********************** * Datenpunkte ***********************/ const dp_soc = "vw-connect.0." + vin + ".status.charging.status.battery.stateOfChargeInPercent"; const dp_odometer = "vw-connect.0." + vin + ".mqtt.events.charging-completed.data.odometer"; const dp_lat = "vw-connect.0." + vin + ".status.position.parkingPosition.gpsCoordinates.latitude"; const dp_lon = "vw-connect.0." + vin + ".status.position.parkingPosition.gpsCoordinates.longitude"; /*********************** * Funktion zum Senden ***********************/ function sendToABRP(trigger) { const soc = getState(dp_soc).val; const odometer = getState(dp_odometer).val; const lat = getState(dp_lat).val; const lon = getState(dp_lon).val; // Prüfen ob wichtige Daten vorhanden sind if (soc === null || lat === null || lon === null) { log("ABRP: Daten fehlen → kein Versand", "warn"); return; } const utc = Math.round(Date.now() / 1000); const tlm = { utc: utc, soc: soc, capacity: 85, odometer: odometer, lat: lat, lon: lon }; const url = "https://api.iternio.com/1/tlm/send?api_key=" + apiKey + "&token=" + token + "&tlm=" + encodeURIComponent(JSON.stringify(tlm)); httpGet(url, { timeout: 2000 }, function (err, response) { if (err) { log("ABRP Fehler: " + err, "error"); } else { log("ABRP gesendet (" + trigger + "): " + JSON.stringify(tlm), "info"); } }); } /*********************** * 1️⃣ Alle 5 Minuten senden ***********************/ schedule("*/5 * * * *", function () { sendToABRP("Timer"); }); /*********************** * 2️⃣ Senden wenn SOC sich ändert ***********************/ on({ id: dp_soc, change: "ne" }, function (obj) { log("SOC Änderung erkannt: " + obj.state.val + "%", "info"); sendToABRP("SOC Änderung"); });
  • JS zum senden über "Dockerized Signal Messenger REST API"

    15
    0 Stimmen
    15 Beiträge
    1k Aufrufe
    K
    Hui, da muß ich das Thema nochmal aufwärmen oder eher erweitern. Kann ich denn auch verschwindende Nachrichten generieren ? Ich habe was vom Parameter "expired_time" gehört aber noch kein funktionierendes Script gefunden. Wie geht das? MfG
  • ecoflow-connector-Script zur dynamischen Leistungsanpassung

    Verschoben
    2k
    3
    7 Stimmen
    2k Beiträge
    802k Aufrufe
    G
    @Waly_de da fehlt der Anfang irgendwie ;-) Schaue ich mir wie gesagt man an. Was nutzt Du sonst als "Entwicklungsumgebung"? Testest Du direkt in iobroker mit debug-Ausgaben oder gibt's da noch einen anderen Weg? ("echtes" debugging?)
  • Script für open meteo weather

    Verschoben
    6
    1
    3 Stimmen
    6 Beiträge
    325 Aufrufe
    R
    hier noch etwas überarbeitet und ohne Warnungen // version: 0.2.6 ////////////////////////////////////////////////// const locationName = 'wo auch immer'; ////////////////////////////////////////////////// // Schriftgrößen-Konfiguration const fontSizeCurrentLabel = '1.3rem'; const fontSizeTempBig = '3.8rem'; const fontSizeDescription = '1.1rem'; const fontSizeInfoGrid = '0.85rem'; const fontSizeSunMoon = '0.8rem'; const fontSizeHourly = '0.75rem'; const fontSizeHourlyRain = '0.65rem'; const fontSizeForecastDay = '0.75rem'; const fontSizeForecastText = '0.65rem'; const fontSizeForecastTempMax = '1rem'; const fontSizeForecastTempMin = '0.85rem'; const fontSizeForecastDetails = '0.65rem'; const version = '0.2.6'; const dpBase = 'open-meteo-weather.0.' + locationName + '.weather'; const forecast = dpBase + '.forecast'; const targetDP = '0_userdata.0.Wetter_Widget_HTML'; // Sprach-Check let sysLang = 'de'; try { const systemConfig = getObject("system.config"); sysLang = systemConfig.common.language || 'de'; } catch (e) { sysLang = 'de'; } const i18n = { de: { current: "Aktuell" }, en: { current: "Current" } }; const lang = i18n[sysLang] || i18n['en']; // DP anlegen falls nicht vorhanden if (!existsState(targetDP)) { createState(targetDP, '', { name: 'Weather Widget for VIS', type: 'string', role: 'html' }); } // ------------------------------------------------------------ // Hilfsfunktionen // ------------------------------------------------------------ // HEUTE aus JavaScript, kompakt function getToday() { const d = new Date(); const day = String(d.getDate()).padStart(2, "0"); const month = String(d.getMonth() + 1).padStart(2, "0"); const year = d.getFullYear(); return `${day}.${month}.${year}`; } function getVal(id, unit = "") { if (!existsState(id)) return "--" + unit; let state = getState(id); if (!state || state.val === null || state.val === undefined) return "--" + unit; return state.val + unit; } function getImg(id, size = "20px") { if (!existsState(id)) return ""; let state = getState(id); if (!state || !state.val) return ""; return `<img src="${state.val}" style="width:${size}; height:${size}; object-fit:contain;">`; } function getNum(id) { let s = getState(id); return (!s || s.val === null || s.val === undefined) ? null : Number(s.val); } function getSunHours(id) { let sec = getNum(id); if (sec === null) return "--h"; return (sec / 3600).toFixed(1) + "h"; } // ------------------------------------------------------------ // Hauptfunktion // ------------------------------------------------------------ function updateWeatherWidget() { // ⭐ AB HIER: ALLES UNVERÄNDERT GELASSEN let html = ` <style> @keyframes moonGlow { 0% { filter: drop-shadow(0 0 2px #fbbf24); opacity: 0.85; } 50% { filter: drop-shadow(0 0 6px #fbbf24); opacity: 1; } 100% { filter: drop-shadow(0 0 2px #fbbf24); opacity: 0.85; } } .moon-anim { animation: moonGlow 3.5s ease-in-out infinite; } .w-container { font-family: 'Segoe UI', sans-serif; background: linear-gradient(160deg, #1e293b 0%, #0f172a 100%); color: #f1f5f9; padding: 10px; border-radius: 20px; border: 1px solid #334155; box-shadow: 0 10px 30px rgba(0,0,0,0.5); } .w-header { display: grid; grid-template-columns: 1.2fr 1.5fr 1fr; gap: 10px; background: rgba(255,255,255,0.05); padding: 10px; border-radius: 10px; margin-bottom: 10px; border: 1px solid rgba(255,255,255,0.1); } .w-temp-big { font-size: ${fontSizeTempBig}; font-weight: 900; color: #fbbf24; line-height: 1; } .w-desc { font-size: ${fontSizeDescription}; color: #38bdf8; font-weight: 600; } .w-info-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 8px; font-size: ${fontSizeInfoGrid}; margin-top: 10px; } .w-info-item { background: rgba(0,0,0,0.2); padding: 6px 10px; border-radius: 10px; display: flex; align-items: center; gap: 5px; } .w-sun-moon { font-size: ${fontSizeSunMoon}; line-height: 1.6; border-left: 1px solid rgba(255,255,255,0.1); padding-left: 15px; } .w-hourly { display: grid; grid-template-columns: repeat(6, 1fr); gap: 8px; margin-bottom: 10px; background: rgba(0,0,0,0.15); padding: 10px; border-radius: 15px; } .w-h-item { text-align: center; font-size: ${fontSizeHourly}; } .w-h-time { font-weight: bold; color: #38bdf8; } .w-h-temp { font-weight: bold; color: #fbbf24; display: block; } .w-h-rain { font-size: ${fontSizeHourlyRain}; color: #94a3b8; } .w-forecast { display: grid; grid-template-columns: repeat(6, 1fr); gap: 10px; } .w-fc-day { background: rgba(255,255,255,0.03); padding: 12px 8px; border-radius: 18px; text-align: center; border: 1px solid rgba(255,255,255,0.05); display: flex; flex-direction: column; justify-content: space-between; } .w-fc-name { font-weight: bold; color: #38bdf8; font-size: ${fontSizeForecastDay}; text-transform: uppercase; margin-bottom: 2px; } .w-fc-text { font-size: ${fontSizeForecastText}; color: #94a3b8; min-height: 2.2em; display: flex; align-items: center; justify-content: center; text-align: center; margin-bottom: 5px; } .w-fc-temp-max { color: #f87171; font-weight: bold; font-size: ${fontSizeForecastTempMax}; display: block; text-align: center; } .w-fc-temp-min { color: #60a5fa; font-size: ${fontSizeForecastTempMin}; display: block; margin-bottom: 5px; text-align: center; } .w-fc-day img { margin: 2px 0 4px 0; } .w-fc-details { font-size: ${fontSizeForecastDetails}; color: #94a3b8; border-top: 1px solid rgba(255,255,255,0.05); margin-top: 8px; padding-top: 8px; } </style> <div class="w-container"> <div class="w-header"> <div style="text-align: center;"> <div style="font-size:${fontSizeCurrentLabel}; font-weight:bold;"> ${lang.current} / ${getVal(forecast + '.day0.name_day')} </div> <div style="font-size:0.75rem; color:#94a3b8; margin-top:0;"> ${getToday()} </div> ${getImg(dpBase + '.current.icon_url', "80px")} <div class="w-desc">${getVal(dpBase + '.current.weather_text')}</div> </div> <div> <div class="w-temp-big">${getVal(dpBase + '.current.temperature_2m', " °C")}</div> <div style="font-weight:bold; margin-bottom:10px;"> <span style="color:#f87171">${getVal(forecast + '.day0.temperature_2m_max', " °C")}</span> | <span style="color:#60a5fa">${getVal(forecast + '.day0.temperature_2m_min', " °C")}</span> </div> <div class="w-info-grid"> <div class="w-info-item">💧 ${getVal(dpBase + '.current.relative_humidity_2m', "%")}</div> <div class="w-info-item">🌧️ ${getVal(forecast + '.day0.precipitation_sum', "mm")}</div> <div class="w-info-item">☀️ ${getSunHours(forecast + '.day0.sunshine_duration')}</div> <div class="w-info-item">☁️ ${getVal(dpBase + '.current.cloud_cover', "%")}</div> <div class="w-info-item">💨 Wind ${getVal(dpBase + '.current.wind_speed_10m', " km/h")}</div> <div class="w-info-item">🌬️ Böen ${getVal(dpBase + '.current.wind_gusts_10m', " km/h")}</div> </div> </div> <div class="w-sun-moon" style="position:relative;"> 🌅 ${getVal(forecast + '.day0.sunrise')}<br> 🌇 ${getVal(forecast + '.day0.sunset')}<br> 🌙 ${getVal(forecast + '.day0.moonrise')}<br> 🌘 ${getVal(forecast + '.day0.moonset')}<br> <div style="margin-top:6px;"> ${getImg(forecast + '.day0.moon_phase_icon', "34px")} <div class="moon-anim" style="font-size:0.75rem; color:#cbd5e1;"> ${getVal(forecast + '.day0.moon_phase_text')} </div> </div> <div style="margin-top:10px;"> 💨 Richtung: ${getVal(dpBase + '.current.wind_direction_text')}<br> ${getImg(dpBase + '.current.wind_direction_icon', "30px")} </div> <div style="position:absolute; bottom:-10px; right:0; font-size:0.6rem; color:#475569; opacity:0.8;"> Script Version ${version} </div> </div> </div> <div class="w-hourly"> `; // Stunden – mit Wind + Mond for (let h = 0; h <= 5; h++) { let hPath = forecast + '.hourly.next_hours.hour' + h; let isNight = getNum(hPath + '.is_day') === 0; html += ` <div class="w-h-item"> <div class="w-h-time">${getVal(hPath + '.time')}</div> ${getImg(hPath + '.icon_url', "30px")} <span class="w-h-temp">${getVal(hPath + '.temperature_2m', " °C")}</span> <span class="w-h-rain"> 🌧️${getVal(hPath + '.precipitation_probability', "%")} / ${getVal(hPath + '.precipitation', "mm")} </span> <div style="margin-top:4px; font-size:0.7rem; color:#cbd5e1;"> 💨 ${getVal(hPath + '.wind_speed_10m', " km/h")} 🌬️ ${getVal(hPath + '.wind_gusts_10m', " km/h")} </div> <div style="margin-top:2px;"> ${getImg(hPath + '.wind_direction_icon', "32px")} <span style="font-size:0.7rem; color:#94a3b8;"> ${getVal(hPath + '.wind_direction_text')} </span> </div> ${ isNight ? ` <div style="margin-top:4px;"> ${getImg(hPath + '.moon_phase_icon', "24px")} <div style="font-size:0.65rem; color:#cbd5e1;"> ${getVal(hPath + '.moon_phase_text')} </div> </div> ` : "" } </div> `; } html += ` </div> <div class="w-forecast"> `; // 6-Tage-Vorhersage for (let i = 1; i <= 6; i++) { let d = forecast + '.day' + i; html += ` <div class="w-fc-day"> <div> <div class="w-fc-name">${getVal(d + '.name_day')}</div> <div class="w-fc-text">${getVal(d + '.weather_text')}</div> ${getImg(d + '.icon_url', "50px")} <span class="w-fc-temp-max">${getVal(d + '.temperature_2m_max', " °C")}</span> <span class="w-fc-temp-min">${getVal(d + '.temperature_2m_min', " °C")}</span> </div> <div class="w-fc-details"> 🌧️ ${getVal(d + '.precipitation_sum', "mm")} (${getVal(d + '.precipitation_probability_max', "%")})<br> 💧 ${getVal(d + '.relative_humidity_2m_mean', "%")}<br> 💨 Wind ${getVal(d + '.wind_speed_10m_max', " km/h")}<br> 🌬️ Böen ${getVal(d + '.wind_gusts_10m_max', " km/h")}<br> ${getVal(d + '.wind_direction_text')}<br> ${getImg(d + '.wind_direction_icon', "32px")}<br> ${getImg(d + '.wind_gust_icon', "24px")}<br> ☀️ ${getSunHours(d + '.sunshine_duration')} </div> </div> `; } html += `</div></div>`; setState(targetDP, html, true); console.log("Weather widget: HTML successfully generated (v0.2.6-XYZ-SUN-CLOUD-C-DATE-COMPACT)."); } // Trigger updateWeatherWidget(); schedule("*/5 * * * *", updateWeatherWidget); on({id: dpBase + '.current.temperature_2m', change: 'any'}, updateWeatherWidget); on({id: forecast + '.hourly.next_hours.hour0.time', change: 'any'}, updateWeatherWidget); [image: 1770566801260-43377c6a-c836-4580-8f67-56ca3bac553b-image.png]
  • Javascript Adapter startet nicht mehr

    15
    0 Stimmen
    15 Beiträge
    522 Aufrufe
    W
    Nachdem ich Typescript neu installiert habe funktioniert es jetzt

585

Online

32.9k

Benutzer

83.0k

Themen

1.3m

Beiträge