Skip to content

JavaScript

Hilfe für Skripterstellung mit JavaScript

2.5k Topics 48.9k Posts

NEWS

  • [TypeSkript] Wetter.com Forecast/Vorhersage

    44
    4 Votes
    44 Posts
    978 Views
    Pedder007P
    ich denke bei 403 ist es das eher nicht., habs trotzdem probiert, aber gleiche Fehlermeldung. Ich hatte gerade mal parallel Gemini gefragt und dabei ist herausgekommen, dass es evtl. sein könnte, das der Provider den (2.ten) Zugang nicht freigibt, weil er mit der selben IP bereits einen aktiven Zugang sieht (bei mir läuft aktuell auch noch der dasWetter-Adapter) Ich habe zum zweiten Account (andere Mailadresse) auch bisher keine Bestätigungsmail bekommen!?
  • E3DC Hauskraftwerk steuern

    4k
    1
    3 Votes
    4k Posts
    2m Views
    D
    Hallo ArnoD ich habe seit 1 Jahr auch ein E3DC 10 Compat pro mit einem ZusazWechselrichter (auch von E3DC) und 58.74kWh Speicher (9 Batterien). Im Script bekomme ich diesen fehler seit ca. 3 Wochen. Habe Dein Update instaliert (script). Fehler ist immer noch. Was kann das sein? Bin Anfänger! "message":"-==== Charge-Control Version 1.6.8 ====-"}## "message":"-==== alle Objekt ID's angelegt ====-"}## "message":"-==== alle Objekte ID's überprüft ====-"}## "message":"-==== Speichergroesse_kWh=52 ====-"}## 12.2.2026, 16:01:24.929 [error]: javascript.0 (88626) script.js.common.Charge_Control: schedule(cron={"hour":"NaN","minute":"NaN"}): cannot create schedule "message":"-==== ScriptStart() erfolgreich abgeschlossen ====-"}## Dazu kommt das ich die 4 Diagramme nicht zum laufen bringe, es fehlt was. weis aber nicht was. (habe nur die Vis inportiert, 1-Temperatur WR, 2-String Diagramm, 3-SOH Diagramm, 4-Zell Temp Diagram). Danke schon mal zum voraus. Du hast da tolle Arbeit geleistet!! Vieeeeelen DANK. Und Deine detairte Beaschreibung ist klasse. Mod-Edit Bitte Logs in Code-Tags setzen!
  • [TypeSkript] Zendure SolarFlow 2400 AC - EVCC Steuerung

    61
    1 Votes
    61 Posts
    3k Views
    S
    @Berny-K oh sorry, da habe ich das irgendwie überlesen das es bei dir um ein 800 Pro ging.... Sorry!! Du kannst es testen, theoretisch sollte es auch funktionieren, würde nur interessant werden was bei Überschuss am Netzpunkt passiert... ob der 800pro anfängt dann über AC zu laden... Aber da "stecke" ich gar nicht im Thema
  • SQL-Abfrage aus Script an MariaDB

    8
    0 Votes
    8 Posts
    83 Views
    Norwegen60N
    @fuzzy1955 Ja, das hatte ich auch, aber ich dachte ich müsse hier auch in String wandeln und hatte let strSQL = "SELECT ioBroker.fn_energy('" + Mode + "', " + String(ID) + ", " + String(Offset) + ") AS energy;" // Und ich hatte es mit let sSQL5 = `SELECT ioBroker.fn_energy('${Mode}', ${ID}, ${Offset}) AS energy`; versucht, dort aber die falschen quotes verwendet. mit den nach rechts gekippten hat auch das funktioniert Das hier funktioniert jetzt incl. zurück holen des Wertes in Datapoint let sSQL0 = "SELECT ioBroker.fn_energy('" + Mode + "', " + ID + ", " + Offset + ") AS energy"; sendTo('sql.0', 'query', sSQL0, function (result) { let energy = result.result[0].energy; setState(DataPoint, {val: Number(energy), ack: true}); log('GetEnergy: ' + energy + ' -> ' + DataPoint, 'info'); }); Danke für die Unterstützung
  • Script für open meteo weather

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

    79
    1
    0 Votes
    79 Posts
    12k 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.
  • Integration einer Ambientika-Lüftungsanlage

    6
    0 Votes
    6 Posts
    410 Views
    B
    Ich war so frech und habe das Javaskript und ein vorhandenes python-Skript als Basis für einen Adapter verwendet. Ich hatte vor einiger Zeit mal einen Adapter-Request gestellt, aber als dort nichts passiert ist und ich immer mal wieder ein paar Skripte gefunden habe, habe ich mich nun mal selbst heran gewagt. Meine Programmierkenntnisse sind wirklich nahezu null, aber mit Hilfe von KI ist ein lauffähiger Adapter herausgekommen. Würde mich über ein paar Tester freuen: https://github.com/baeriwiliwonka/iobroker.suedwind-ambientika Aktuell unterstützt der Adapter: Multi Device Handling Diverse Daten lesen Schreiben von Modus, Luftfeuchtigkeitsschwellwert und Lüfterstufe Anpassen des Aktualisierungsintervalls In der Pipeline für eine v0.0.2 aktuell: Weitere Datenpunkte, z.B. IP-Adresse, Firmwareversion, Onlinestatus, verbleibende Filtertage Filterstatus zurücksetzen
  • Fehlerbehandlung httpGet/httPost

    37
    0 Votes
    37 Posts
    4k 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
    611 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
    4k 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
    80 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
  • Zendure SmartMode:1 SolarFlow2400 AC SolarFlow800 ( u. Pro)

    218
    7 Votes
    218 Posts
    13k Views
    B
    @Schimi Danke, gut zu wissen, mal sehen ob ich das hin bekomme
  • On ID Grundlage

    Moved
    23
    0 Votes
    23 Posts
    142 Views
    P
    @paul53 dafür ist das ack da. const DP ="0_userdata.0.Logik.TestZustand"; createState(DP, 0, false, { // Datenpunkt wird angelegt name: 'TestZustand', desc: 'Logik.TestZustand', type: 'boolean', def: 'false', role: 'value' }); /*So macht man es, wenn die Flanke wechselt (true - false - true*/ on({id:DP,val:false,change: 'ne'}, function(dp){ console.log("fallende Flanke"); }); /*So macht man es, wenn die Flanke NICHT wechselt (false - false - false)*/ on({id:DP,val:false,change: 'any'}, function(dp){ if(!dp.state.ack){ console.log("fallende Flanke"); setState(DP, false , true); //ack setzen. } });
  • ioBroker – Klipper – Spoolman Filament Monitoring

    1
    2
    1 Votes
    1 Posts
    60 Views
    No one has replied
  • HowTo: Zusatz-Programme fuer jarvis v3

    javascript
    894
    4 Votes
    894 Posts
    227k Views
    D
    @MCU Sorry das hab ich übersehen. Wieso auch immer die draussen war. Hab sie neu in Jarvis ausgewählt jetzt passt es wieder... Danke!
  • Skript zur Auswertung der Batterien unter 25% bei Zigbee.

    3
    0 Votes
    3 Posts
    76 Views
    D
    Alter wenn ich das gewusst hätte. Aber das schreiben der Skripte ist ja mittlerweile relativ einfach. Fleißarbeit "digital machen lassen" und feinarbeit manuell. Hätte ich mir echt sparen können. Denn ich habe nach Batteriestatus und Zigbee gesucht und auf die schnelle nichts passendes gefunden, daher ein bisschen Code gemacht.
  • [gelöst] Warnung bei Scriptausführung

    8
    1
    0 Votes
    8 Posts
    86 Views
    HomoranH
    @DGR sagte in [gelöst] Warnung bei Scriptausführung: Der Sensor liefert trotzdem normal Daten. bis auf die 10 Sekunden, die er disconnected war
  • Modulare scripte in javascript Adaper benutzen

    22
    3
    0 Votes
    22 Posts
    329 Views
    Thomas BraunT
    @Rudi-Restless sagte in Modulare scripte in javascript Adaper benutzen: bookworm ist erst mitte 2026 fällig so weit ich weiss. Stimmt. Aber man sollte es auch nicht ganz am Ende des Supportzeitraums machen. Jetzt wäre ein guter Zeitpunkt, die ersten 3 Pointreleases für Debian 13 Trixie sind da und damit sind die ersten Kinken raus.

680

Online

32.6k

Users

82.3k

Topics

1.3m

Posts