Weiter zum Inhalt

Skripten / Logik

16.8k Themen 216.9k Beiträge

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

NEWS

Unterkategorien


  • Hilfe für Skripterstellung mit JavaScript

    3k 50k
    3k Themen
    50k Beiträge
    maxclaudiM
    03.11.2026 (Testgeräte HUB2000 / Hyper 2000 / 1600AC+ / 2400 ACpro) Technische Beobachtung in aktuellen Zendure-Firmware-Versionen:  Es fällt auf, dass das Verhalten bei (Cloud-)MQTT-Publishes angepasst wurde, was das Echtzeit-Streaming von Werten betrifft. Alle Beobachtungen beziehen sich hierbei auf die properties/report-Meldungen:  Früher: Sobald sich Werte von PV-Modulen oder Batterien änderten, wurden diese sofort per MQTT (in Echtzeit) im Report gemeldet. Jetzt: Unabhängig von tatsächlichen Wertänderungen wird die properties/report-Meldung nun starr in einem festen Intervall von 5000 ms publiziert. Werte scheinen dort gesammelt übertragen zu werden. Aktive Abfrage / externe Befehle: Werden explizite Anfragen oder Befehle an das Gerät gerichtet, erfolgt die Antwort-Veröffentlichung und Änderung – wie bisher – sofort. HEMS-Ausnahme: Ist HEMS „in der App aktiviert“ und die Steuerung läuft über die Cloud, scheint es Ausnahmen von dieser Begrenzung zu geben. Zum Teil läuft es scheinbar wie zuvor, damit vermutlich schneller geregelt werden kann (Wertänderungen werden schneller gesendet als das Intervall). Ob bei deaktiviertem HEMS bei extrem drastischen Wertsprüngen zwischendurch doch ein Sofort-Publish vom Gerät getriggert wird, weiß ich (noch) nicht. Ich kann es nur hoffen und werde das Verhalten weiter beobachten und versuchen, es in zwei Firmware-Versionen zu analysieren.  Die Anpassung dient vermutlich der Reduzierung des Traffics der Geräte zur Cloud und der Entlastung des ESP32.  Die aktuellen Firmware-Versionen von HUB2000, ace1500 und die letzte Firmware-Version vom Hyper < 2 (vor TLS) sind von dieser Änderung nach meinem Kenntnisstand und den vorhandenen Test-Geräten nicht betroffen.
  • Hilfe für Skripterstellung mit Blockly

    7k 81k
    7k Themen
    81k Beiträge
    S
    Danke für deine schnelle Antwort. Werde es versuchen.
  • Hilfe für Skripterstellung mit Node-RED

    970 13k
    970 Themen
    13k Beiträge
    mickymM
    @ak68 Ich habe zwar diese Nodes nicht. Aber wie die Werte interpretiert werden, hängt meines Erachtens ja auch noch vom topic ab, dass Du mitschicken musst. [image: image.jpeg] Sprich neben der Position musst Du das topic ja noch auf "blindPosition" setzen.
  • Scriptsammlung Vol. 2

    Angeheftet
    3
    3 Stimmen
    3 Beiträge
    8k Aufrufe
    NegaleinN
    Achtung: Diese Scripts sind teils auch ungetestet bzw. nur vom Ersteller getestet worden. Blockly diverse Scripte Schimpfwortgenerator (BananaJoe, Nikolai Radke) Ein Schimpfwortgenerator ioBroker-Forum-Thread: Schimpfwortgenerator Witze aus API (mading) Ein Witzegenerator ioBroker-Forum-Thread: Witzegenerator Bilder mittels LLM ChatGPT Vision ananalysieren (David G.) Bilder mit ChatGPT ananalysieren ioBroker-Forum-Thread: Bilder mittels LLM ChatGPT Vision ananalysieren Visualisierung Agentdvr-Aufnahmen in der Visualisierung darstellen (David G.) Agentdvr-Aufnahmen anzeigen ioBroker-Forum-Thread: Agentdvr-Aufnahmen in der Visualisierung darstellen Trash HTML Widget VIS2 (skvarel) Trash HTML Widget VIS2 ioBroker-Forum-Thread: Trash HTML Widget VIS2 GitHub GitHub
  • Scriptsammlung Vol. 2 -- Diskussion

    Angeheftet
    71
    1 Stimmen
    71 Beiträge
    28k Aufrufe
    NegaleinN
    @fischi87 sagte: vielleicht etwas für die Sammlung. habs in "Hardware generell" eingetragen
  • Funktionspläne (FBD)

    3
    0 Stimmen
    3 Beiträge
    168 Aufrufe
    fu_zhouF
    Super, danke, ich mache mal in Github weiter. Den SEL/MUX habe ich schon mit dem JS-Block gebaut, allerdings mit deutlich umfangreicherem Code als der kurze Einzeiler oben 😉
  • Ecowater Systems Wasseraufbereitung

    6
    0 Stimmen
    6 Beiträge
    642 Aufrufe
    S
    besteht hier noch interesse? ich hätte ein JS-Skript...
  • Proxmox-Updater (Host/LXC/VM) auch ioBroker,piHole,etc

    137
    3 Stimmen
    137 Beiträge
    22k Aufrufe
    Bass-TB
    @Negalein Vielen Dank für deine Rückmeldung und vor allem dafür, dass du dir die Mühe gemacht hast, selbst eine Lösung zu entwickeln und uns deine angepasste status-model.sh zur Verfügung zu stellen! 👍 Ich habe deine Änderungen inzwischen vollständig geprüft und mit dem aktuellen Entwicklungsstand verglichen. Dein Ansatz ist gut und wurde bereits in den offiziellen Entwicklungszweig (develop) übernommen! :) Wir haben deine HTML-Konvertierung als Grundlage verwendet und noch ein paar kleinere Verbesserungen ergänzt: Zeilenumbrüche und Leerzeilen bleiben erhalten. Einrückungen und längere Zeilen werden korrekt dargestellt. Umlaute und Emojis bleiben erhalten. HTML-Sonderzeichen werden sicher behandelt. Der HTML-Versand wurde auch in die weiteren Benachrichtigungspfade integriert. Die eigentliche Statusauswertung und die bisherigen E-Mail-Einstellungen bleiben dabei unverändert. Alle 157 Regressionstests wurden erfolgreich abgeschlossen. Der Fix ist bereits auf GitHub verfügbar: https://github.com/BassT23/Proxmox/commit/d45dae2bde1eb90d07243c42b25f3e48da03c0c9 Und selbstverständlich habe ich dich auch als Mitwirkenden in unsere Projekt-Credits aufgenommen: https://github.com/BassT23/Proxmox/blob/develop/docs/acknowledgments.md Die tatsächliche Darstellung in Outlook müssen wir mit dem integrierten Stand noch einmal testen. Da deine ursprüngliche Lösung bei dir bereits funktioniert, bin ich aber zuversichtlich. Der Fix wird mit der nächsten Beta verfügbar sein. Wenn es so weit ist, wäre es schön, wenn du die Darstellung in Outlook noch einmal überprüfen könntest. Nochmals vielen Dank für deine Unterstützung und dafür, dass du deine Lösung mit der Community geteilt hast! Genau von solcher Zusammenarbeit lebt ein Open-Source-Projekt. :) Viele Grüße Bass-T
  • [Vorlage] Luftqualitätswerte abrufen

    65
    2
    4 Stimmen
    65 Beiträge
    12k Aufrufe
    BoronsbruderB
    @Siggi0904 Doch: Hier
  • Alexa Shopping List mit Bring synchronisieren

    189
    0 Stimmen
    189 Beiträge
    68k Aufrufe
    mcBirneM
    habe das Skript um "excludeWords" erweitert. Bis jetzt klappt es. /** * Alexa Voice-Input to Bring! List Pushing Engine * * Erkennt Sprachbefehle aus der Alexa-History, wandelt Zahlwörter um, * trennt Mengen sauber ab (z.B. "3 Erdbeeren" -> "Erdbeeren, 3" für Bring!), * formatiert den Artikel und löscht ihn anschließend sofort von Alexa. */ // --- KONFIGURATION --- // ID des Datenpunkts für die Alexa History Zusammenfassung und Antworttext const alexaHistorySummaryId = 'alexa2.0.History.summary'; const alexaHistoryAnswerId = 'alexa2.0.History.answerText'; // Basis-ID deiner Bring! Adapter-Instanz (HIER DEINE EIGENE ID EINTRAGEN) const bringBaseId = 'bring.0.7066fb7c-0b17-4f30-b988-30182e89b59a'; const bringAddItemStateId = bringBaseId + '.saveItem'; // Pfad zur Alexa-Einkaufsliste (Basis und JSON) const alexa2BaseId = 'alexa2.0.Lists.SHOP'; const alexaShoppingListJsonId = `${alexa2BaseId}.json`; // Schalter für Debug-Ausgaben im ioBroker-Log const printDebug = true; // Array für laufende Timeouts (verhindert Fehler bei Skript-Neustart) let activeTimeouts = []; // --- HILFSFUNKTIONEN --- function debug(msg) { if (printDebug) { log('[Alexa->Bring Push] ' + msg); } } // Schneidet führende Alexa-Befehlswörter ab function stripPrefixes(text) { if (!text) return ''; const prefixesToRemove = [ /^(?:hey\s+)?alexa,\s*/i, /^(?:hey\s+)?alexa\s+/i, /^füge\s+/i, /^setz\s+/i, /^setze\s+/i, /^packe\s+/i, /^pack\s+/i, /^schreib\s+/i, /^schreibe\s+/i, /^notiere\s+/i ]; let result = String(text).trim(); let changed = true; while (changed) { let startLen = result.length; for (const prefixRegex of prefixesToRemove) { result = result.replace(prefixRegex, '').trim(); } changed = result.length !== startLen; } return result; } // Prüft alte und neue Mengen und addiert sie, falls die Einheiten passen function mergeQuantities(oldSpec, newSpec) { if (!oldSpec) return newSpec; if (!newSpec) return oldSpec; const regex = /^(\d+(?:[.,]\d+)?)\s*(.*)$/i; const matchOld = String(oldSpec).match(regex); const matchNew = String(newSpec).match(regex); if (matchOld && matchNew) { let numOld = parseFloat(matchOld[1].replace(',', '.')); let numNew = parseFloat(matchNew[1].replace(',', '.')); let unitOld = matchOld[2].trim().toLowerCase(); let unitNew = matchNew[2].trim().toLowerCase(); // Wenn die Einheiten gleich sind (oder eine fehlt), wird addiert if (unitOld === unitNew || unitOld === '' || unitNew === '') { let total = numOld + numNew; let unitToUse = matchNew[2].trim() || matchOld[2].trim(); return unitToUse ? `${total} ${unitToUse}` : `${total}`; } else { // Wenn Einheiten unterschiedlich sind (z.B. "500 g" und "1 Packung"), // hängen wir sie einfach mit einem "+" zusammen return `${oldSpec} + ${newSpec}`; } } return newSpec; // Fallback, falls keine Zahlen gefunden wurden } // Zuverlässiger Parser für deutsche Zahlwörter function wordsToNumbersSmart(text) { if (!text) return ''; try { let t = String(text).toLowerCase().replace(/\s+/g, ' '); const ones = { "null": 0, "eins": 1, "eine": 1, "einen": 1, "ein": 1, "milli": 1, "zwei": 2, "drei": 3, "vier": 4, "fünf": 5, "sechs": 6, "sieben": 7, "acht": 8, "neun": 9, "zehn": 10, "elf": 11, "zwölf": 12, "dreizehn": 13, "vierzehn": 14, "fünfzehn": 15, "sechzehn": 16, "siebzehn": 17, "achtzehn": 18, "neunzehn": 19 }; const tens = { "zwanzig": 20, "dreißig": 30, "dreissig": 30, "vierzig": 40, "fünfzig": 50, "sechzig": 60, "siebzig": 70, "achtzig": 80, "neunzig": 90 }; const multipliers = { "hundert": 100, "tausend": 1000 }; const skipWords = ["und"]; const words = t.split(/\s+/).filter(Boolean); const out = []; let currentNumber = 0; let hasNumber = false; for (let i = 0; i < words.length; i++) { const w = words[i]; if (ones[w] !== undefined) { currentNumber += ones[w]; hasNumber = true; } else if (tens[w] !== undefined) { currentNumber += tens[w]; hasNumber = true; } else if (multipliers[w] !== undefined) { if (currentNumber === 0) currentNumber = 1; currentNumber *= multipliers[w]; hasNumber = true; } else if (!isNaN(Number(w))) { if (hasNumber) { out.push(String(currentNumber)); currentNumber = 0; hasNumber = false; } out.push(w); } else if (skipWords.includes(w) && hasNumber) { continue; } else { if (hasNumber) { out.push(String(currentNumber)); currentNumber = 0; hasNumber = false; } if (out.length === 0 || !isNaN(Number(out[out.length - 1]))) { out.push(w.charAt(0).toUpperCase() + w.slice(1)); } else { out.push(w); } } } if (hasNumber) { out.push(String(currentNumber)); } let resultString = out.join(" "); // Brüche umwandeln resultString = resultString.replace(/\b(1\s+)?halbe?s?\b/gi, '0.5'); resultString = resultString.replace(/\b(1\s+)?viertel\b/gi, '0.25'); return resultString; } catch (err) { log(`Fehler in wordsToNumbersSmart bei Text "${text}": ${err.message}`, 'warn'); return String(text); } } // Bereinigt den Text, trennt Mengen ab und sorgt für korrekte Groß-/Kleinschreibung function ListCleaner(Eintrag = '') { if (!Eintrag) return { formatted: '', product: '', quantity: '' }; try { let textWithNumbers = wordsToNumbersSmart(Eintrag); if (!textWithNumbers || typeof textWithNumbers !== 'string') { textWithNumbers = String(Eintrag); } textWithNumbers = textWithNumbers.trim(); const quantityRegex = /^(\d+(?:[.,]\d+)?)(?:\s*(mal|x|stck|stück|l|ltr|liter|kg|kilo|g|gramm|pfund|flasche|flaschen|packung|packungen|päckchen|dose|dosen|becher|glas|gläser|rolle|rollen|tube|tuben|tafel|tafeln|kiste|kisten|karton|kartons))?\s+(.+)$/i; const match = textWithNumbers.match(quantityRegex); if (match && match[1] && match[3]) { let quantity = String(match[1]).trim(); let unit = match[2] ? String(match[2]).trim().toLowerCase() : ''; let product = String(match[3]).trim(); if (product.length > 0) { product = product.charAt(0).toUpperCase() + product.slice(1); if (['kilo', 'kg'].includes(unit)) { unit = 'kg'; } else if (['gramm', 'g'].includes(unit)) { unit = 'g'; } else if (['liter', 'l', 'ltr'].includes(unit)) { unit = 'l'; } else if (['stck', 'stück'].includes(unit)) { unit = 'Stück'; } else if (['mal', 'x'].includes(unit)) { unit = ''; } else if (unit) { unit = unit.charAt(0).toUpperCase() + unit.slice(1); } let finalQuantity = unit ? `${quantity} ${unit}` : quantity; debug(`Menge erkannt: "${finalQuantity}", Produkt: "${product}" -> Formatiere für Bring als "${product}, ${finalQuantity}"`); return { formatted: `${product}, ${finalQuantity}`, product: product, quantity: finalQuantity }; } } let normProduct = textWithNumbers.charAt(0).toUpperCase() + textWithNumbers.slice(1); return { formatted: normProduct, product: normProduct, quantity: '' }; } catch (err) { log(`Fehler in ListCleaner bei Eintrag "${Eintrag}": ${err.message}`, 'error'); let fallbackProduct = String(Eintrag).charAt(0).toUpperCase() + String(Eintrag).slice(1); return { formatted: fallbackProduct, product: fallbackProduct, quantity: '' }; } } // Intelligente Löschfunktion mit Cloud-Warteschleife und Multi-Match-Logik function removeItemFromAlexaList(itemName, extractedProduct, attempt = 1) { const maxAttempts = 5; const retryDelay = 3000; let cleanedAlexaName = stripPrefixes(itemName); debug(`Versuche, "${cleanedAlexaName}" (Produkt-Match: "${extractedProduct}") von der Alexa-Liste zu entfernen (Versuch ${attempt}/${maxAttempts}).`); try { const listState = getState(alexaShoppingListJsonId); if (!listState || !listState.val) { debug("Alexa Einkaufslisten-JSON ist leer. Warte auf Adapter-Update..."); if (attempt < maxAttempts) { let timer = setTimeout(() => removeItemFromAlexaList(itemName, extractedProduct, attempt + 1), retryDelay); activeTimeouts.push(timer); } return; } const shoppingList = JSON.parse(listState.val); let itemIdToDelete = null; const search1 = cleanedAlexaName.toLowerCase(); const search2 = extractedProduct.toLowerCase(); for (const item of shoppingList) { if (item && item.value) { const valLower = item.value.toLowerCase(); if (valLower === search1 || valLower === search2 || search1.includes(valLower) || valLower.includes(search2)) { itemIdToDelete = item.id; cleanedAlexaName = item.value; break; } } } if (itemIdToDelete) { const deleteStateId = `${alexa2BaseId}.items.${itemIdToDelete}.#delete`; debug(`Artikel-ID gefunden. Sende Löschbefehl an: ${deleteStateId}`); setState(deleteStateId, true); debug(`Löschbefehl für "${cleanedAlexaName}" erfolgreich an Amazon übermittelt.`); } else { if (attempt < maxAttempts) { debug(`Artikel "${cleanedAlexaName}" / "${extractedProduct}" noch nicht im JSON. Cloud synchronisiert noch... Erneuter Versuch in 3 Sek.`); let timer = setTimeout(() => removeItemFromAlexaList(itemName, extractedProduct, attempt + 1), retryDelay); activeTimeouts.push(timer); } else { debug(`Artikel wurde nach ${maxAttempts} Versuchen nicht im JSON gefunden.`); } } } catch (e) { log(`Fehler beim Entfernen des Artikels von der Alexa-Liste: ${e}`, 'error'); } } // --- HAUPTLOGIK --- on({ id: alexaHistorySummaryId, change: "any", ack: true }, function (obj) { try { if (!obj.state || !obj.state.val || typeof obj.state.val !== 'string') return; const summaryTextFull = obj.state.val; const summaryText = summaryTextFull.toLowerCase(); const alexaAnswer = getState(alexaHistoryAnswerId)?.val || 'Keine Antwort aufgezeichnet'; debug(`Neuer History Summary Eintrag: "${summaryTextFull}" | Alexa Antwort: "${alexaAnswer}"`); // Wörter, bei denen kein Eintrag zu Bring! erfolgen soll const excludeWords = ['playlist']; // Trigger-Phrasen inklusive "hinzu" aus dem Forum const triggerPhrases = [' auf die einkaufsliste', ' zur einkaufsliste', ' hinzu', ' hinzufügen']; let itemFound = false; let itemNameRaw = ''; for (const phrase of triggerPhrases) { const index = summaryText.lastIndexOf(phrase); if (index !== -1 && index > 0) { itemNameRaw = summaryTextFull.substring(0, index).trim(); itemNameRaw = stripPrefixes(itemNameRaw); itemFound = true; break; } } if (itemFound && itemNameRaw) {   const isExcluded = excludeWords.some(word => itemNameRaw.toLowerCase().includes(word.toLowerCase()) );   if (isExcluded) { debug(`Artikel "${itemNameRaw}" enthält ein Ausschlusswort und wird ignoriert.`); return; } // 1. Text bei Komma oder " und " aufteilen für Multi-Item-Support const itemsToProcess = itemNameRaw.split(/,\s*|\s+und\s+/i).filter(Boolean); debug(`Multi-Item-Erkennung: Satz wurde in ${itemsToProcess.length} Artikel geteilt.`); // 2. Jeden Artikel einzeln verarbeiten itemsToProcess.forEach((singleItemRaw, index) => { const cleanResult = ListCleaner(singleItemRaw); const cleanedItemName = cleanResult.formatted; const originalItemName = singleItemRaw.trim(); if (cleanedItemName) { // --- NEU: Bring! JSON prüfen und Mengen addieren --- let finalItemNameToBring = cleanedItemName; try { const bringContentState = getState(bringBaseId + '.content'); if (bringContentState && bringContentState.val) { let bringList = typeof bringContentState.val === 'string' ? JSON.parse(bringContentState.val) : bringContentState.val; // Sucht, ob das Produkt schon auf der Bring!-Liste steht let existingItem = bringList.find(i => i.name.toLowerCase() === cleanResult.product.toLowerCase()); if (existingItem && existingItem.specification) { let mergedSpec = mergeQuantities(existingItem.specification, cleanResult.quantity); finalItemNameToBring = `${cleanResult.product}, ${mergedSpec}`; debug(`Artikel "${cleanResult.product}" existiert bereits. Addiere Menge: "${existingItem.specification}" + "${cleanResult.quantity}" -> "${mergedSpec}"`); } } } catch (e) { debug(`Fehler beim Auslesen der bestehenden Bring-Liste: ${e.message}`); } // --------------------------------------------------- // 3. Gestaffelte Ausführung (1.5 Sekunden Abstand pro Artikel), // damit der Bring! Adapter sich nicht verschluckt. let processingDelay = index * 1500; let processTimer = setTimeout(() => { debug(`[Artikel ${index + 1}/${itemsToProcess.length}] Roh: "${originalItemName}" -> Bring!: "${finalItemNameToBring}".`); // Schritt 1: Zu Bring! hinzufügen (mit eventuell addierter Menge) setState(bringAddItemStateId, finalItemNameToBring, false); // Schritt 2: Verzögertes Löschen auf Alexa-Seite triggern let deleteTimer = setTimeout(() => { removeItemFromAlexaList(originalItemName, cleanResult.product); }, 4000); activeTimeouts.push(deleteTimer); }, processingDelay); activeTimeouts.push(processTimer); } else { debug(`Artikel "${originalItemName}" ist nach Bereinigung leer. Ignoriere.`); } }); } } catch (globalErr) { log(`Unerwarteter globaler Fehler in der Hauptschleife: ${globalErr.message}`, 'error'); } }); // --- CLEANUP BEIM BEENDEN --- onStop(function () { activeTimeouts.forEach(timer => clearTimeout(timer)); activeTimeouts = []; debug("Skript gestoppt. Alle laufenden Timeouts wurden sicher beendet."); }, 10); // --- SKRIPTSTART --- debug("Skript gestartet. Multi-Item-Parser, Mengen-Addierer und erweiterte Triggerwörter aktiv.");
  • [erledigt] JS und influx: Wert wird falsch in DB geschrieben

    10
    2
    0 Stimmen
    10 Beiträge
    350 Aufrufe
    I
    Ich habe nun einen Tag lang die Option "trotzdem gleiche Werte speichern..." ausgeschaltet, und es tritt kein Fehler mehr auf. Noch besser ist der Vorschlag von paul53: @paul53 sagte: Dann nimm den Haken bei "Nur Änderungen aufzeichnen" raus. Damit ist das Problem erledigt, danke an alle!
  • Synchrone Abfrage unterschiedlicher Werte aus der History

    6
    0 Stimmen
    6 Beiträge
    205 Aufrufe
    S
    @ofri2607 await... manchmal sieht man den Wald vor lauter Bäumen nicht. :) VIELEN DANK!
  • Anwesenheitserkennung mit Hping3

    20
    3
    0 Stimmen
    20 Beiträge
    2k Aufrufe
    Michael SchmittM
    mit meinem zweiten Script kann ich das ständige flapping zum Glück so abfangen das ich nicht ständig Telegram Meldungen bekomme mit online offline oder das selbe in Iqontrol passiert.
  • Woher kommt das ? KI ?

    69
    1
    0 Stimmen
    69 Beiträge
    4k Aufrufe
    Michael SchmittM
    mit der 10.2.4 getestet und ja es läßt sich abschalten :)
  • eigene Funktion in Blockly (widerkehrende Funktion)

    19
    1
    0 Stimmen
    19 Beiträge
    663 Aufrufe
    OliverIOO
    @Codierknecht Wenn du mehr darüber lesen willst kannst du mal nach block scope variables, shadowing und hoisting suchen. Deren leider nicht immer offensichtliche Funktionsweise bei JavaScript führt gelegentlich zu Problemen. Da findet man auch den Unterschied zwischen let und var https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Grammar_and_types#variables Und die darauf anschließenden Abschnitte
  • Abrufen der Json von pass.telekom

    Verschoben
    25
    0 Stimmen
    25 Beiträge
    7k Aufrufe
    T
    @ossilampe sagte: http://pass.telekom.de/api/service/generic/v1/status Hallo zusammen. Ich bekomme seit einigen Wochen auf die Anfrage http://pass.telekom.de/api/service/generic/v1/status nun als Antwort den HTTP-Status 404, was evtl. bedeutet dass die angeforderte Resssource nicht mehr gültig ist. Kennt jemand einen update von der Telekom ? Vielen Dank !
  • Mitsubishi Home Assistant: externe Sensoren & MELCloud

    climate heating
    1
    0 Stimmen
    1 Beiträge
    141 Aufrufe
    Niemand hat geantwortet
  • Solax X1-Micro 4 in 1 über neue Developer Cloud API auslesen

    1
    0 Stimmen
    1 Beiträge
    71 Aufrufe
    Niemand hat geantwortet
  • Ecovacs Deebot mit dynamischer Karte

    javascript
    10
    3
    0 Stimmen
    10 Beiträge
    387 Aufrufe
    H
    @sigi234 sieht doch gut aus
  • HEIZUNG / TADO mit externen Sensoren

    1
    1
    0 Stimmen
    1 Beiträge
    70 Aufrufe
    Niemand hat geantwortet
  • verschiedene Skripte

    javascript
    12
    1
    0 Stimmen
    12 Beiträge
    822 Aufrufe
    H
    Habe die einzelnen Sachen getrennt: Musikstatus für Alexa und /oder Sonos: https://forum.iobroker.net/post/1352784 Tado mit externen Sensoren: https://forum.iobroker.net/post/1352786 Ecovacs Deebot dynamische Karte mit Fahrspur: https://forum.iobroker.net/post/1352789
  • Blockly + Javascripte aus einer script.json extrahieren

    24
    5
    3 Stimmen
    24 Beiträge
    2k Aufrufe
    Michael SchmittM
    Nice, muss ich mir gleich nach der Arbeit anschauen. @shadowhunter23 .....
  • Anker Solix 4 Pro per Modbus regeln – 0-einspeisung mit ioB

    1
    0 Stimmen
    1 Beiträge
    404 Aufrufe
    Niemand hat geantwortet

425

Online

33.1k

Benutzer

84.2k

Themen

1.4m

Beiträge