Weiter zum Inhalt

Skripten / Logik

16.7k Themen 216.6k 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
    10.10.2026; 16:28h Memo: Ab Firmware > V2.0.2 (bzw. V2.0.4) wird eine weitere, spezifische proprietäre Endstelle/Adresse hinzugefügt. Spoiler Bisher nur: apiUrl: https://app.zendure.tech/as Nun zusätzlich: ocppUrl: wss://mq.zen-iot.com:33033/ocpp Hintergrund: OCPP (Open Charge Point Protocol) ist der weltweite Standard zur Steuerung von E-Auto-Ladestationen (Wallboxen). Die Aktivierung dieses Endpunkts signalisiert die firmwareseitige Vorbereitung oder bereits vorhandene Funktion auf integriertes EV-Charging (z. B. herstellereigene Wallbox oder Lademanagement). Für "Cloudless"-Setups: Wer sein System rein lokal betreibt, sollte diese WebSocket-Adresse im Router/DNS blockieren, um unbemerktes "Nachhausetelefonieren" zu verhindern.
  • Hilfe für Skripterstellung mit Blockly

    7k 81k
    7k Themen
    81k Beiträge
    W
    @rantanplan Danke für deine Ausführung und Erklärung. Also Langes Drücken = Ein und kurzes Drücken = aus. Etwas ähnliches habe ich mit dem Taster am Laufen, da Drücke ich kurz für Ein und die gleiche Taste kurz für Aus, funktioniert super. Nur jetzt brauche ich einen Ausschalter per Zeit. Aber tolle Idee mit dem Text. Gruß
  • Hilfe für Skripterstellung mit Node-RED

    969 13k
    969 Themen
    13k Beiträge
    mcm1957M
    weitere Fragen und Diskussionen zum aktuellen Shelly Adapter bitt im Shelly Topic. https://forum.iobroker.net/topic/81297/shelly-adapter-genereller-support
  • 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
    27k Aufrufe
    NegaleinN
    @fischi87 sagte: vielleicht etwas für die Sammlung. habs in "Hardware generell" eingetragen
  • [Vorlage] Luftqualitätswerte abrufen

    65
    2
    4 Stimmen
    65 Beiträge
    11k Aufrufe
    BoronsbruderB
    @Siggi0904 Doch: Hier
  • Proxmox-Updater (Host/LXC/VM) auch ioBroker,piHole,etc

    132
    3 Stimmen
    132 Beiträge
    20k Aufrufe
    Bass-TB
    @negalein update mit branch machst du mit update develop -up update beta -up update master -up Ja nachdem was du brauchst ;) EDIT: Zum Mail-Thema: Danke für die Header – die sehen soweit sauber aus. Die Mail wird als: Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: 8bit MIME-Version: 1.0 verschickt. Ein grundsätzlich falscher MIME-Aufbau ist damit eher unwahrscheinlich. Für die weitere Eingrenzung brauche ich bitte noch zwei Dinge: Aus derselben Original-Nachrichtenquelle den kompletten Teil AB MIME-Version: 1.0 bis zum Ende der Mail, also inklusive des eigentlichen Mail-Bodys. Wichtig: Bitte wirklich aus „Original anzeigen“ / „Nachrichtenquelle anzeigen“ kopieren und nicht den sichtbaren Text aus Outlook. Zusätzlich bitte auf dem Proxmox-Host ausführen und die komplette Ausgabe posten: echo '=== MAIL COMMAND ===' command -v mail readlink -f "$(command -v mail)" dpkg-query -S "$(readlink -f "$(command -v mail)")" 2>&1 mail --version 2>&1 | head -20 echo echo '=== MAIL PACKAGES ===' dpkg -l | grep -E '^ii[[:space:]]+(mailutils|bsd-mailx|s-nail|heirloom-mailx|postfix|exim4)' || true echo echo '=== POSTFIX ===' postconf mail_version 2>/dev/null || true echo echo '=== ULTIMATE UPDATER BODY BEFORE MAIL ===' bash -c ' source /etc/ultimate-updater/status-model.sh STATUS_MODEL_RENDER_NOTIFICATION /etc/ultimate-updater/status.json check ' > /tmp/ultimate-updater-mail-body.txt sed -n '1,200l' /tmp/ultimate-updater-mail-body.txt Vielen Dank
  • Alexa Shopping List mit Bring synchronisieren

    189
    0 Stimmen
    189 Beiträge
    66k 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
    281 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
    165 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
    529 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
    101 Aufrufe
    Niemand hat geantwortet
  • Solax X1-Micro 4 in 1 über neue Developer Cloud API auslesen

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

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

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

    javascript
    12
    1
    0 Stimmen
    12 Beiträge
    730 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
    334 Aufrufe
    Niemand hat geantwortet
  • NodeRed Iobroker Converter (WS Adapter kompatibel)

    node-red communication
    1
    0 Stimmen
    1 Beiträge
    123 Aufrufe
    Niemand hat geantwortet
  • Farbe bei Yahka(HomeKit) mit Yeelight

    javascript
    23
    0 Stimmen
    23 Beiträge
    4k Aufrufe
    AsgothianA
    Mir war schon klar was gemeint ist. Du musst folgendes testen: im Objektbaum, in den Datenpunkt der die Farbe steuert eine Zahl mit Nachkommastelle eingeben - stürzt der Yeelight Adapter dann ab ? an gleicher Stelle schnell, sprich 2 mal pro Sekunde jeweils einen anderen gültigen Wert eingeben. Stürzt der Yeelight Adapter dann ab ? an gleicher Stelle einen Wert ausserhalb der von Dir vorgegebenen Grenzen eingeben. Stürzt der Yeelight Adapter dann ab ? an gleicher Stelle Text eingeben. Stürzt der Yeelight Adapter dann ab ? A.

297

Online

33.1k

Benutzende

83.9k

Themen

1.4m

Beiträge