Skip to content

JavaScript

Hilfe für Skripterstellung mit JavaScript

2.5k Themen 49.0k Beiträge

NEWS

  • [TypeSkript] Wetter.com Forecast/Vorhersage

    55
    4 Stimmen
    55 Beiträge
    2k Aufrufe
    Pedder007P
    @Schimi Danke, läuft nun auch bei mir :-)
  • ecoflow-connector-Script zur dynamischen Leistungsanpassung

    Verschoben
    2k
    3
    7 Stimmen
    2k Beiträge
    780k 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?)
  • [TypeSkript] Zendure SolarFlow 2400 AC - EVCC Steuerung

    62
    1 Stimmen
    62 Beiträge
    3k Aufrufe
    H
    Für den 800 Pro passt das Script leider nicht ganz. Man muss da ein paar Kleinigkeiten anpassen. Bin da gerade dabei. Bisher aber nur Einspeisung getestet, da es gerade dunkel ist :-). Also noch kein Test bei Überschuss, sollte aber auch machbar sein. Bei Interesse kann ich meinen Stand hier zur Verfügung stellen.
  • E3DC Hauskraftwerk steuern

    4k
    1
    3 Stimmen
    4k Beiträge
    2m Aufrufe
    D
    @ArnoD Vielen Dank werde ich morgen machen! Super es funktioniert. Vielen dank!!! ;)
  • SQL-Abfrage aus Script an MariaDB

    8
    0 Stimmen
    8 Beiträge
    136 Aufrufe
    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

    Verschoben
    6
    1
    3 Stimmen
    6 Beiträge
    162 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
    316 Aufrufe
    W
    Nachdem ich Typescript neu installiert habe funktioniert es jetzt
  • Plötzlich ReferenceError: request is not defined

    79
    1
    0 Stimmen
    79 Beiträge
    12k Aufrufe
    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 Stimmen
    37 Beiträge
    4k Aufrufe
    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 Stimmen
    31 Beiträge
    653 Aufrufe
    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 Stimmen
    17 Beiträge
    2k Aufrufe
    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 Stimmen
    69 Beiträge
    4k Aufrufe
    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 Stimmen
    4 Beiträge
    103 Aufrufe
    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 Stimmen
    218 Beiträge
    14k Aufrufe
    B
    @Schimi Danke, gut zu wissen, mal sehen ob ich das hin bekomme
  • On ID Grundlage

    Verschoben
    23
    0 Stimmen
    23 Beiträge
    230 Aufrufe
    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 Stimmen
    1 Beiträge
    67 Aufrufe
    Niemand hat geantwortet
  • HowTo: Zusatz-Programme fuer jarvis v3

    javascript
    894
    4 Stimmen
    894 Beiträge
    229k Aufrufe
    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 Stimmen
    3 Beiträge
    84 Aufrufe
    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 Stimmen
    8 Beiträge
    94 Aufrufe
    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 Stimmen
    22 Beiträge
    395 Aufrufe
    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.

386

Online

32.7k

Benutzer

82.4k

Themen

1.3m

Beiträge