Skip to content

JavaScript

2.5k Topics 49.6k Posts

Hilfe für Skripterstellung mit JavaScript

NEWS

  • Navimow Steuerung ioBroker

    7
    3
    0 Votes
    7 Posts
    255 Views
    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

    Unsolved
    21
    0 Votes
    21 Posts
    422 Views
    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 Votes
    144 Posts
    31k Views
    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 Votes
    20 Posts
    965 Views
    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

    Moved javascript template
    359
    1
    1 Votes
    359 Posts
    101k Views
    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

    Moved
    741
    1
    2 Votes
    741 Posts
    269k Views
    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?
  • Json für SourceAnalytics

    83
    1
    4 Votes
    83 Posts
    13k Views
    H
    @crunchip Passt, vielen Dank...
  • Skript zur Darstellung Position Sonne / Mond mit Schatten

    3
    0 Votes
    3 Posts
    197 Views
    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 Votes
    40 Posts
    6k Views
    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 Votes
    13 Posts
    2k Views
    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 Votes
    15 Posts
    1k Views
    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

    Moved
    2k
    3
    7 Votes
    2k Posts
    858k Views
    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

    Moved
    6
    1
    3 Votes
    6 Posts
    474 Views
    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 Votes
    15 Posts
    741 Views
    W
    Nachdem ich Typescript neu installiert habe funktioniert es jetzt
  • Plötzlich ReferenceError: request is not defined

    79
    1
    0 Votes
    79 Posts
    15k Views
    haus-automatisierungH
    @bitwicht sagte in Plötzlich ReferenceError: request is not defined: Den Schedule habe ich zum Test gesetzt da ich mir auf die Schnelle nicht zu helfen wusste :-) Wenn Du gar keinen Trigger drumherum baust, wird die gesamte Logik ja bei jedem Script-Start einmalig ausgeführt. Dann musst Du gar nicht warten.
  • Fehlerbehandlung httpGet/httPost

    37
    0 Votes
    37 Posts
    5k Views
    P
    Oben steht, dass der Server öfter mal offline ist. Da ist ping meine erste Idee. Ob der Server auf Pings antwortet, weiß ich nicht. Reagiert der Server nicht auf ping, dann evtl. als Ersatz einen httpcheck nehmen. httpcheck nutze ich auf der Synology, bevor die auf den ioBroker zugreift. # ===== HTTP-Check statt Ping ===== curl -s --connect-timeout 3 "$BASE/system.adapter.admin.0.alive" > /dev/null || exit 1 Ist allerdings ein Bash-Skript. Das muss für die Zwecke angepasst werden.
  • Script: Google Shared Locations Cookie Fixer

    31
    6 Votes
    31 Posts
    2k Views
    GarfonsoG
    So, falls jemand testen mag: https://forum.iobroker.net/topic/83726/test-adapter-google-sharedlocations2 Es ist echt magisch. g Gerne in dem anderen Topic weiter diskutieren, falls es da Bedarf gibt.
  • Skript PING

    17
    1
    3 Votes
    17 Posts
    2k Views
    MartinPM
    StartPing() gibt es mehrmals ... https://www.geeksforgeeks.org/javascript/function-overloading-in-javascript/ Ich weiß aber nicht ob Schedules jeweils einen eigenen Scope haben ... Würde das aber auch nicht mit eigenen Schedules für jede Sorte Tierchen durchexerzieren... Edit: Nehme meine Vermutung zurück.... Test: schedule('*/2 * * * * *', async function Test() { console.info('Test1'); }); schedule('*/2 * * * * *', async function Test() { console.info('Test2'); }); Log - Ausgabe: ... javascript.0 18:40:44.001 info Test1 javascript.0 18:40:44.002 info Test2 javascript.0 18:40:46.001 info Test2 javascript.0 18:40:46.002 info Test1 javascript.0 18:40:48.002 info Test1 javascript.0 18:40:48.003 info Test2 ...
  • Skript für Mondphase, Mondauf- und Untergang

    69
    4
    3 Votes
    69 Posts
    7k Views
    jvfleJ
    @BananaJoe Das war das fehlende Puzzlestück. Jetzt funktioniert es und ich bin wieder ein μ schlauer. Vielen Dank für deine Hilfe und dem schönen Widget. BG
  • [TypeSkript] Zendure SolarFlow Steuerung: KI

    4
    0 Votes
    4 Posts
    259 Views
    S
    habe es mal auf mehrere Geräte erweitert.. die "Single" Regelung läuft bei mir, aber wie gut es mit mehreren läuft kann ich leider nicht testen

444

Online

33.0k

Users

83.3k

Topics

1.3m

Posts