Skip to content

Skripten / Logik

Hilfe zu JavaScript, Blockly, TypeScript, Node-RED, Scenes und text2command

16.5k Themen 213.3k Beiträge

NEWS

Unterkategorien


  • Hilfe für Skripterstellung mit JavaScript

    2k 49k
    2k Themen
    49k Beiträge
    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]
  • Hilfe für Skripterstellung mit Blockly

    7k 79k
    7k Themen
    79k Beiträge
    AsgothianA
    Ich denke in deinem Fall greift diese Lösung nicht. Die Lösung ist den Baustein [image: 1770589884460-screenshot-2026-02-08-at-23.31.01.png] durch das folgende Konstrukt zu ersetzen: [image: 1770590133517-screenshot-2026-02-08-at-23.35.29.png] Zusätzlich muss vor jeder anderen Ansteuerung der Aussenlampe Ecke ein [image: 1770590157266-screenshot-2026-02-08-at-23.35.55.png] gesetzt werden. A.
  • Hilfe für Skripterstellung mit Node-RED

    953 13k
    953 Themen
    13k Beiträge
    S
    welche Palette hast du installiert, damit du den "AND" Baustein hast?
  • Datenpunkte abfragen und andere damit steuern

    4
    1
    0 Stimmen
    4 Beiträge
    345 Aufrufe
    paul53P
    @kvn298 sagte: Status_Brunnenpumpe ist ein String. Laut API-Doku ist liefert das Attribut "ison" einen booleschen Wert.
  • Hue Dimmer Switch mit SSL

    4
    1
    0 Stimmen
    4 Beiträge
    360 Aufrufe
    SchmakusS
    @oli_g sagte in Hue Dimmer Switch mit SSL: Hallo, ich hatte bisher meinen Hue Adapter ohne SSL laufen und Polling aktiviert. Habe einen Hue Dimmer Switch und ein einfaches Test (Blockly) Skript: [image: 1699892485692-6dfd61a4-5c66-4dcc-bd01-ba6cb1cd7213-image.png] Ich möchte einfach bei Druck auf eine Taste eine bestimmte Steckdose (um-)schalten. Das hat mit den o.g. Einstellungen auch funktioniert. Das Test Skript gibt pro Druck auf eine der Tasten genau einen Log Eintrag aus, also bspw. bei Druck auf die obere Taste 1: script.js.Laden.Schalter_Steckdosen_Test: [Schalter] Last Updated: 2023-11-13T16:24:27, Status: 1002 Bei nochmaligem Druck auf die Taste 1: script.js.Laden.Schalter_Steckdosen_Test: [Schalter] Last Updated: 2023-11-13T16:26:03, Status: 1002 Drücke ich dann eine andere Taste, kommt auch genau eine Statusänderung an: script.js.Laden.Schalter_Steckdosen_Test: [Schalter] Last Updated: 2023-11-13T16:27:12, Status: 4002 Schalte ich nun beim Adapter SSL ein und schalte Polling aus, dann passieren bei Druck auf eine Taste offensichtlich zwei Statusupdates: script.js.Laden.Schalter_Steckdosen_Test: [Schalter] Last Updated: 2023-11-13T16:32:45.731Z, Status: 4000 script.js.Laden.Schalter_Steckdosen_Test: [Schalter] Last Updated: 2023-11-13T16:32:45.551Z, Status: 1002 Das erste Update bezieht sich irgendwie auf die zuvor gedrückte Taste, das zweite Update auf die aktuell gedrückte Taste. Aktuell funktioniert das Skript nur ohne SSL mit Pooling ... Kann mir jemand dieses Verhalten erklären? Danke und Grüße Hi, vielleicht kann @foxriver76 etwas dazu sagen. Andernfalls ein Issue auf Github erstellen. Aber was ist der Status 4000, bzw. 0 am Ende? Vielleicht doch alter Status?
  • Hilfe bei Strukturierung von Klassen in TypeScript

    29
    0 Stimmen
    29 Beiträge
    2k Aufrufe
    T
    ... ... ...
  • [Gelöst]Blockly Variable anlegen und Datenpunkt anlegen

    13
    2
    0 Stimmen
    13 Beiträge
    1k Aufrufe
    P
    @homoran Werde ich in Zukunft beachten. Habe halt heute gelernt wo man die eigenen Datenpunkte setzen muss.
  • Hilfe bei der Erstellung eines Log Files für die VIS

    blockly javascript template
    7
    2
    0 Stimmen
    7 Beiträge
    584 Aufrufe
    L
    @paul53 sagte in Hilfe bei der Erstellung eines Log Files für die VIS: @ltsalvatore Du hast nicht geschrieben wie die Darstellung in Vis aussehen soll. In einem Log werden die Ereignisse in der Reihenfolge ihres Auftretens protokolliert. Ansatz ohne die zusätzlichen Datenpunkte aus dem ersten Beitrag: const ids = Array.prototype.slice.apply($('*(functions=fenster)')); const idJSON = "0_userdata.0.Fenster.JSON"; var arr = []; if(getState(idJSON).val) arr = JSON.parse(getState(idJSON).val); on(ids, function(dp) { arr.unshift({Name: dp.common.name, Zustand: dp.state.val ? 'offen' : 'geschlossen', seit: formatDate(dp.state.lc, 'DD.MM. hh:mm')}); if(arr.length > 10) arr.pop(); setState(idJSON, JSON.stringify(arr), true); }); Erzeugt wird eine JSON-Table mit dem jüngsten Ereignis zuerst (oben). Danke für dein Feedback. Im VIS soll das Ganze chronologisch von oben nach unten oder von mir aus von unten nach oben dargestellt werden. Wie es bspw. auch beim ical der Fall ist (s.u.). Und in dieser Auflistung der letzten 10 Zustände soll der Wert von zwei Objekten angezeigt werden. In meinem Fall die beiden Objekte window_closed_since_BDZ und window_open_since_BDZ. aber auch nur wenn der Wert nicht gleich 0 ist, weil der Wert gleich 0 mir in der Auflistung nichts bringt. [image: 1699652076347-13cfc232-6a67-4a23-97d2-5e9630948dbf-image.png] Sowas Ähnliches gibt es ja auch bei der mihome app für die Sensoren, aber leider liest der Adapter diese Tabelle nicht aus: [image: 1699652626687-5fe3fac2-aee3-4a37-b027-9b0aea3e4885-image.png]
  • ESP32CAM Bilder mit Intervall auf FTP speichern

    9
    0 Stimmen
    9 Beiträge
    1k Aufrufe
    MartinPM
    @bärle man kann eine Textdatei verwenden, um ftp zu automatisieren. Siehe https://stackoverflow.com/questions/16158138/how-to-ftp-with-a-batch-file (Zielserver scheint Windows zu sein) Textdatei (abgewandelt) example.txt open 10.155.8.215 user password lcd /D "G:\Subfolder\" cd folder/ binary mput watermeter.jpg disconnect quit Aufruf mit ftp -s:example.txt Dadurch wird example.txt zeilenweise durch FTP abgearbeitet... die Datei "watermeter.jpg" würde natürlich alle 5 Minuten überschrieben, wenn ein neues Foto hereinkommt. Muss man schauen, wenn man das archivieren will ... Jedes Mal eine neue Text Datei mit einem anderen Ziel-Dateinamen erzeugen ist auch nicht gerade toll.
  • Steuerungsbefehle für Heishamon / iQontrol

    1
    1
    0 Stimmen
    1 Beiträge
    168 Aufrufe
    Niemand hat geantwortet
  • Awattar - die billigsten Strom-Stunden nutzen

    82
    1
    0 Stimmen
    82 Beiträge
    14k Aufrufe
    O
    @paul53 Ich bedanke mich bei allen Helfern => das Blockly liefert mir die Daten.
  • Datenpunkte sollen bei Ereignis geändert werden

    6
    3
    0 Stimmen
    6 Beiträge
    522 Aufrufe
    CodierknechtC
    @jones88 sagte in Datenpunkte sollen bei Ereignis geändert werden: Verstehe aktuell nicht wie ich einen Datenpunkt auf einen anderen schauen lassen kann. Du meinst per Java-Script oder wie? Nein. Kein Script. Du hast ja benutzerdefinierte DP in 0_userdata.0 angelegt, in die Du per Script Werte aus anderen DP schreiben willst. Das brauchst Du nicht. Statt der eigenen DP in 0_userdata.0 legst Du welche in alias.0 an und trägst bei denen die Konvertierungsfunktion ein. Die sind also quasi der Ersatz für Deine per Script aktualisierten DP. In der Vis nimmst Du dann die Alias-DP.
  • Hilfe gesucht. Wer kann per Skript E-Mails Parsen oder so?

    7
    0 Stimmen
    7 Beiträge
    716 Aufrufe
    HomoranH
    es g7bt einen ähnlichen Thread mit emails von ISTA
  • Velux KLF200 über KNX ansteuern klappt nicht

    12
    1
    0 Stimmen
    12 Beiträge
    1k Aufrufe
    C
    @mibr85 Hi, das Thema ist bereits schon älter, jedoch wollte ich die fragen, ob du auch Probleme mit der Positionsanzeige hast. Ich habe eine Gira X1 und es funktioniert fast alles tadellos... Wenn die Dachfenster jedoch über den eigenen Regensensor schließen, aktualisiert sich meine Statusanzeige im X1 nicht. Hast du bzw. jemand dazu eine Idee bzw. die Lösung. [image: 1699207166725-a6bac8ee-373a-45bd-a134-a2f70a549148-grafik.png]
  • Erledigt! Common/Global-Scripte mit unterschiedl. Instanzen

    9
    0 Stimmen
    9 Beiträge
    567 Aufrufe
    U
    @bahnuhr Ja war eher ein Fehler dann. Dachte initial, dass es erst einmal 2 Themen waren. Mittlerweilen ist es überlappend. Ich schließe diesen Thread hier. Sorry
  • (Erledigt!) TypeScript Kompilierfehler

    7
    0 Stimmen
    7 Beiträge
    641 Aufrufe
    U
    @ticaki PERFEKT. DANKE!!! Wirklich vielen Dank.
  • Awattar Adapter - aktueller Preis dieser Stunde

    2
    0 Stimmen
    2 Beiträge
    367 Aufrufe
    HomoranH
    @peterredl Das Forum ist voll mit solchen Skripten! z.b. https://forum.iobroker.net/post/1068257
  • ESPHome Grillthermometer

    2
    0 Stimmen
    2 Beiträge
    593 Aufrufe
    B
    @jacke Bist du da schon weiter? Ich suche eigentlich einen Thermometer mit 2 Fühlern die ich auslesen kann. Einen für Kerntemp und einen für den Innenraum des Gasers..... Perfekt wäre Tasmota zb auf einem Esp.
  • 3 Hue Motion Sensoren in einem Raum

    7
    0 Stimmen
    7 Beiträge
    841 Aufrufe
    R
    @karel-puhli Egal wie ich es programmiert hatte, sind die Lichter immer wieder augegangen, wenn man länger vor dem Rechner sitzen geblieben. Habe die Bewegungsmelder so programmiert das der Ablauftimer immer wieder die anderen Bewegungsmelder unterbrochen hat. Habe dann die Hue Schalter so programmiert, dass wenn ich die Eintaste drücke die Bewegungsmelder deaktiviert wurden und bei der Austaste sie wieder aktiviert werden sollten. Wie gesagt, entweder ist das Licht ausgegangen obwohl jemand im Raum war oder die Lichter haben länger gebrannt als sie sollten, weil niemand mehr im Raum war und man vergessen hatte wieder den BWM mit Tastendruck zu aktivieren. Mit dem Präsenzsensor ist es so perfekt, und die Lichter brennen jetzt nur noch 1 Minute wenn niemand mehr im Raum ist. Bei den BWM musste ich auf 10 Minuten den Timer stellen.
  • Globale Funktionen für Alias Konvertierung?

    19
    0 Stimmen
    19 Beiträge
    1k Aufrufe
    paul53P
    @xelarep sagte: 0_userdata vermeiden und direkt im Alias konvertieren. new Date(1000 * (val + 60 * new Date().getTimezoneOffset())).toLocaleTimeString('de-DE') ... bezieht sich auf Wandlung Sekunden nach "hh:mm:ss". EDIT(18:15 Uhr): Korrigiert um Zeitzone.
  • Status negiert übertragen

    Verschoben
    34
    0 Stimmen
    34 Beiträge
    4k Aufrufe
    HomoranH
    @zimbl sagte in Status negiert übertragen: Beim GPIO..state...switch findet keine Änderung statt.... heisst genau was? https://forum.iobroker.net/topic/51555/hinweise-für-gute-forenbeiträge/1 @zimbl sagte in Status negiert übertragen: das Skript scheint nichts zu bewirken... nochmal: @homoran sagte in Status negiert übertragen: welches Skript? @zimbl sagte in Status negiert übertragen: ich kann ihn von Hand aus umschalten...direkt unter Objekte. wie genau? alles zeigen! so istcdas ein großes Rätselraten.
  • MQTT Daten value entfernen

    2
    2
    0 Stimmen
    2 Beiträge
    202 Aufrufe
    paul53P
    @raue sagte: Kann man dies mit einem script korrigieren. Nicht im Original-Datenpunkt. Mit [Alias](Link Adresse) kommt man ohne Skript aus. Im Alias macht man eine Lesekonvertierung JSON.parse(val).value
  • Jarolift TDEF mit Shelly 1 und iobroker steuern

    11
    1
    1 Stimmen
    11 Beiträge
    3k Aufrufe
    S
    @larry210472 Nutzt du die Simulation so noch und funktioniert das zuverlässig ? Habe die gleichen Motoren und habe überall Shelly 2.5 verbaut Grüße

421

Online

32.6k

Benutzer

82.3k

Themen

1.3m

Beiträge