Weiter zum Inhalt

Skripten / Logik

16.7k Themen 215.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
    @T-147 sagte: ...zwischen Laden und Entladen gewechselt werden soll, um die Relais zu schonen.... Wer zusätzliche Sicherheit möchte: Blockly – Einfache DPL-Regelung (Nulleinspeisung & AC-Laden) für Einsteiger in Verbindung mit dem Steuerungs-Script dieses Threads Post update 18.07.2026; 15:30h Version wie zuvor inkl. kritische Verbraucher + Neu: intervalSec_change_acModeAllowed intervalSec_change_acModeAllowed: acMode-Wechsel nur alle x Sekunden erlaubt. Schont Relais und verhindert häufiges Umschalten zwischen Laden und Entladen. 0 oder 10-60 sec. Auch > 60 möglich. Darf jede(r) für sich entscheiden. Je höher der Wert, desto später erfolgt der Wechsel zwischen Laden und Entladen. Da das Blockly im Inneren wieder sehr ausführlich kommentiert ist, verzichte ich hier auf eine lange Erklärung. Bitte die Hinweise direkt im Skript lesen. Import-Anleitung: Wie man ein Blockly importiert, ist in diesem Post hier beschrieben. Das Skript ist standardmäßig für einen Zendure 1600AC+ vorkonfiguriert. Bitte prüft vor dem ersten Start unbedingt die folgenden Variablen und passt sie an euer eigenes System an: max_outputLimit: 1600 max_inputLimit: 1600 criticalGridPower: 600 criticalOutputLimit: 1600 Urheberrechtshinweis Bitte respektiert die Arbeit, die in diesem Projekt steckt, und beachtet den Urheberhinweis direkt im Skript. Wenn ihr auf Basis dieses Skripts (oder Teilen davon) eigene Modifikationen veröffentlicht, fügt bitte eine kurze Verlinkung zu diesem Thread und / oder die Nennung meines Namens maxclaudi hinzu. Vielen Dank! Datei: maxclaudi_dpl_acMode_kV.zip enthält nur maxclaudi_dpl_acMode_kV.xml Datei herunterladen und Virenscan. maxclaudi_dpl_acMode_kV.zip entpacken in iobroker neues, leeres Blockly erstellen maxclaudi_dpl_acMode_kV.xml importieren. Download: maxclaudi_dpl_acMode_kV.zip Viel Spaß damit!
  • Hilfe für Skripterstellung mit Blockly

    7k 80k
    7k Themen
    80k Beiträge
    A
    @paul53 sagte: @andreas7712 [sagte]: als Taster funktioniert Also nur kurz einschaltet? Super so funktioniert es!!!! Vielen Dank!!!!!!
  • Hilfe für Skripterstellung mit Node-RED

    961 13k
    961 Themen
    13k Beiträge
    P
    Der "normale" TCP Request kann auch Rohdaten. Zumindest habe ich darüber damals mit einem Pioneer AVR gesprochen. Den Flow habe ich nicht mehr. Zum Testen / Probieren ein Grundgerüst: Spoiler [ { "id": "telnet_flow_group", "type": "group", "style": { "label": true }, "nodes": [ "inject_trigger", "change_add_newline", "tcp_telnet_request", "debug_response" ], "x": 34, "y": 79, "w": 712, "h": 122 }, { "id": "inject_trigger", "type": "inject", "z": "b59f3d99b19bc9e5", "g": "telnet_flow_group", "name": "Befehl senden", "props": [ { "p": "payload", "v": "help", "vt": "str" } ], "repeat": "", "crontab": "", "once": false, "onceDelay": 0.1, "topic": "", "x": 150, "y": 140, "wires": [ [ "change_add_newline" ] ] }, { "id": "change_add_newline", "type": "change", "z": "b59f3d99b19bc9e5", "g": "telnet_flow_group", "name": "Zeilenumbruch (\\r\\n)", "rules": [ { "t": "set", "p": "payload", "pt": "msg", "to": "$msg.payload & \"\\r\\n\"", "tot": "jsonata" } ], "action": "", "property": "", "from": "", "to": "", "reg": false, "x": 360, "y": 140, "wires": [ [ "tcp_telnet_request" ] ] }, { "id": "tcp_telnet_request", "type": "tcp request", "z": "b59f3d99b19bc9e5", "g": "telnet_flow_group", "server": "localhost", "port": "23", "out": "time", "splitc": "0", "name": "Telnet Server", "ret": "string", "newline": "", "tls": "", "x": 570, "y": 140, "wires": [ [ "debug_response" ] ] }, { "id": "debug_response", "type": "debug", "z": "b59f3d99b19bc9e5", "g": "telnet_flow_group", "name": "Antwort", "active": true, "tosidebar": true, "console": false, "tostatus": false, "complete": "payload", "targetType": "msg", "statusVal": "", "statusType": "auto", "x": 720, "y": 140, "wires": [] } ]
  • Habe ein Problem in Typescript ....Fehler im Script

    6
    0 Stimmen
    6 Beiträge
    2k Aufrufe
    T
    @OliverIO sagte: @ticaki Allerdings ist es meiner Meinung nach aktuell immer noch so ist, das man Grundlagen der Programmierung kennen muss. Wenn du absolut blank bist, verstehst du nichtmal die Ausgabe der KI und gibst beim 3 Versuch auf. Die Eisntiegshürden sind zwar wirklich gering geworden, aber man muss das auch lernen wollen und auch die prompts richtig formulieren. sonst kommt nur schrott raus. Das stimmt, war mir zuviel arbeit den Text rüber zu kopieren und passend zu formatieren. Umso mehr ahnung man hat umso schneller kommt man als Ziel außer man macht sowas: ❯ lass den quark und gehe es richtig an - setzte agenten darauf an im internet zu suchen wie man das macht und obs überhaupt geht - prüfe die infos und komme dann mit neuen vorschlägen :D
  • Einschaltverzögerung mit schwankenten Werten

    17
    0 Stimmen
    17 Beiträge
    4k Aufrufe
    J
    ich wollte hier keine Verwirrung auslösen, ich bin froh das hier Leute wie ihr bereit sind zu helfen und dann werden die Themen besprochen...Dank geht an Euch!
  • [gelöst] Wie Timer finden?

    10
    0 Stimmen
    10 Beiträge
    2k Aufrufe
    I
    DANKE! Ja, der Bekannte hat das Script (tatsächlich waren es noch 2 weitere verschollene) im Objektbaum javascript gesehen und dort zunächst disabled und gelöscht, und der Timer wird nicht mehr angezeigt. Jetzt warten wir noch 12:12 Uhr ab ;-) (Update: hat geklappt) Ich denke, das war's! Vielen Dank an alle für die freundliche Hilfe, eine kleine Spende für's Projekt geht gleich raus.
  • Mr Pure Salzelektrolyse

    6
    0 Stimmen
    6 Beiträge
    1k Aufrufe
    H
    also, ich habs also geschafft. in die Tuya App hinzugefügt und dann mittels Adapter. Ist allerdings ein bissl eine Spielerei mit dem Developer Account und dem verlinken...aber ich hab alle Daten DANKE
  • Proxmox-Updater (Host/LXC/VM) auch ioBroker,piHole,etc

    58
    3 Stimmen
    58 Beiträge
    14k Aufrufe
    da_WoodyD
    @Bass-T GRANULATION! hab ich schon lange geinstet, echt goil!
  • Daten Seriell von Paradigma Solaranlage lesen

    javascript communication heating
    55
    0 Stimmen
    55 Beiträge
    10k Aufrufe
    Samson71S
    @MatthiasROW Unabhängig davon, dass dieser Beitrag mit über 5 Jahren mehr als steinalt ist........ Schonmal auf der genannten Webseite selber nachgesehen? Nur weil ein (uralter) Link nicht mehr passt, existiert die Webseite und auch deren Inhalte grundsätzlich noch. Ich finde da jedenfalls ne Menge Infos zum Systa Aqua II - Logger incl. der Schaltungsbeschreibung.
  • Ecconreset bei mqtt Teilnehmer

    1
    2
    0 Stimmen
    1 Beiträge
    144 Aufrufe
    Niemand hat geantwortet
  • Ostrom Api auslesen

    4
    0 Stimmen
    4 Beiträge
    789 Aufrufe
    NicolomaN
    ich habe weiter ein anderes: const axios = require('axios'); // ======= OSTROM PROD ======= const CLIENT_ID = 'DEINE_ID'; const CLIENT_SECRET = 'DEIN_SECRET'; const ZIP = '59759'; // ======= INFLUXDB 2.x ======= const INFLUX_URL = 'http://192.168.178.103:8086'; const INFLUX_ORG = 'my_org'; const INFLUX_BUCKET = 'iobroker'; const INFLUX_TOKEN = 'DEIN_TOKEN'; // ======= IO BROKER ======= const BASE_DP = '0_userdata.0.ostrom'; const AUTH_URL = 'https://auth.production.ostrom-api.io/oauth2/token'; const API_URL = 'https://production.ostrom-api.io'; let isRunning = false; createStates(); // API nur selten abrufen schedule('30 14 * * *', fetchPrices); // Status stündlich aktualisieren schedule('0 * * * *', updateCurrentFromCache); // beim Start nur Status aus Cache aktualisieren setTimeout(updateCurrentFromCache, 10000); // manueller API-Abruf on({ id: `${BASE_DP}.control.runNow`, val: true }, async () => { await setStateAsync(`${BASE_DP}.control.runNow`, false, true); await fetchPrices(); }); async function fetchPrices() { if (isRunning) return; const lastFetch = getState(`${BASE_DP}.meta.lastFetch`)?.val || 0; const now = Date.now(); if (now - lastFetch < 120000) { log('Ostrom: Letzte API-Abfrage < 2 Minuten – überspringe', 'warn'); return; } isRunning = true; try { const token = await getAccessToken(); const prices = await getPrices(token); const sorted = prices .slice() .sort((a, b) => new Date(a.date).getTime() - new Date(b.date).getTime()); await setStateAsync(`${BASE_DP}.todayTomorrow.json`, JSON.stringify(sorted), true); await updateCurrentFromPrices(sorted); await updateForecast(sorted); await writeToInflux(sorted); await setStateAsync(`${BASE_DP}.meta.lastFetch`, now, true); await setStateAsync(`${BASE_DP}.meta.lastFetchReadable`, new Date(now).toLocaleString('de-DE'), true); log(`Ostrom OK: ${sorted.length} Preise`, 'info'); } catch (err) { if (err.response?.status === 429) { log('Ostrom 429: Rate Limit – später erneut versuchen', 'warn'); } else { log(`Ostrom Fehler: ${err.message}`, 'error'); } if (err.response) { log(`Status: ${err.response.status}`, 'error'); log(JSON.stringify(err.response.data), 'error'); } } finally { isRunning = false; } } async function updateCurrentFromCache() { const json = getState(`${BASE_DP}.todayTomorrow.json`)?.val; if (!json) { log('Ostrom: Kein Preis-Cache vorhanden', 'warn'); return; } try { const prices = JSON.parse(json); await updateCurrentFromPrices(prices); log('Ostrom current.isFree stündlich aktualisiert', 'info'); } catch (err) { log(`Ostrom Cache Fehler: ${err.message}`, 'error'); } } async function updateCurrentFromPrices(prices) { const current = findCurrentPrice(prices); if (!current) return; const grossKwhPrice = Number(current.grossKwhPrice ?? 0); const grossKwhTaxAndLevies = Number(current.grossKwhTaxAndLevies ?? 0); // echter variabler Bruttopreis ohne monatliche Kosten const effectiveGrossKwhPrice = grossKwhPrice + grossKwhTaxAndLevies; await setStateAsync(`${BASE_DP}.current.grossKwhPrice`, round(grossKwhPrice), true); await setStateAsync(`${BASE_DP}.current.grossKwhTaxAndLevies`, round(grossKwhTaxAndLevies), true); await setStateAsync(`${BASE_DP}.current.effectiveGrossKwhPrice`, round(effectiveGrossKwhPrice), true); await setStateAsync(`${BASE_DP}.current.date`, current.date, true); await setStateAsync(`${BASE_DP}.current.dateReadable`, new Date(current.date).toLocaleString('de-DE'), true); await setStateAsync(`${BASE_DP}.current.hour`, new Date(current.date).getHours(), true); await setStateAsync(`${BASE_DP}.current.isFree`, effectiveGrossKwhPrice <= 0, true); } async function updateForecast(prices) { const effectivePrices = prices.map(p => { const gross = Number(p.grossKwhPrice ?? 0); const tax = Number(p.grossKwhTaxAndLevies ?? 0); return { date: p.date, value: gross + tax }; }); const values = effectivePrices.map(p => p.value); const min = Math.min(...values); const max = Math.max(...values); const avg = values.reduce((a, b) => a + b, 0) / values.length; const cheapest = effectivePrices.find(p => p.value === min); const expensive = effectivePrices.find(p => p.value === max); const nextFree = effectivePrices.find(p => new Date(p.date).getTime() >= Date.now() && p.value <= 0); await setStateAsync(`${BASE_DP}.forecast.minEffectiveGrossKwhPrice`, round(min), true); await setStateAsync(`${BASE_DP}.forecast.maxEffectiveGrossKwhPrice`, round(max), true); await setStateAsync(`${BASE_DP}.forecast.avgEffectiveGrossKwhPrice`, round(avg), true); await setStateAsync(`${BASE_DP}.forecast.cheapestDate`, cheapest?.date || '', true); await setStateAsync(`${BASE_DP}.forecast.cheapestDateReadable`, cheapest ? new Date(cheapest.date).toLocaleString('de-DE') : '', true); await setStateAsync(`${BASE_DP}.forecast.mostExpensiveDate`, expensive?.date || '', true); await setStateAsync(`${BASE_DP}.forecast.mostExpensiveDateReadable`, expensive ? new Date(expensive.date).toLocaleString('de-DE') : '', true); await setStateAsync(`${BASE_DP}.forecast.nextFreeDate`, nextFree?.date || '', true); await setStateAsync(`${BASE_DP}.forecast.nextFreeDateReadable`, nextFree ? new Date(nextFree.date).toLocaleString('de-DE') : '', true); await setStateAsync(`${BASE_DP}.forecast.hasFreeHour`, !!nextFree, true); } async function getAccessToken() { const auth = Buffer.from(`${CLIENT_ID}:${CLIENT_SECRET}`).toString('base64'); const res = await axios.post( AUTH_URL, 'grant_type=client_credentials', { headers: { Authorization: `Basic ${auth}`, 'Content-Type': 'application/x-www-form-urlencoded' }, timeout: 15000 } ); return res.data.access_token; } async function getPrices(token) { const now = new Date(); const start = new Date(now.getFullYear(), now.getMonth(), now.getDate(), 0, 0, 0); const end = new Date(now.getFullYear(), now.getMonth(), now.getDate() + 2, 0, 0, 0); const res = await axios.get(`${API_URL}/spot-prices`, { params: { startDate: start.toISOString(), endDate: end.toISOString(), resolution: 'HOUR', zip: ZIP }, headers: { Authorization: `Bearer ${token}` }, timeout: 15000 }); return res.data.data || []; } async function writeToInflux(prices) { if (!prices.length) return; const lines = []; for (const p of prices) { const ts = BigInt(new Date(p.date).getTime()) * 1000000n; const grossKwhPrice = Number(p.grossKwhPrice ?? 0); const grossKwhTaxAndLevies = Number(p.grossKwhTaxAndLevies ?? 0); const effectiveGrossKwhPrice = grossKwhPrice + grossKwhTaxAndLevies; lines.push( `ostrom_prices,source=production,zip=${escapeTag(ZIP)} ` + `grossKwhPrice=${grossKwhPrice},` + `grossKwhTaxAndLevies=${grossKwhTaxAndLevies},` + `effectiveGrossKwhPrice=${effectiveGrossKwhPrice} ` + `${ts.toString()}` ); } const url = `${INFLUX_URL}/api/v2/write` + `?org=${encodeURIComponent(INFLUX_ORG)}` + `&bucket=${encodeURIComponent(INFLUX_BUCKET)}` + `&precision=ns`; await axios.post(url, lines.join('\n'), { headers: { Authorization: `Token ${INFLUX_TOKEN}`, 'Content-Type': 'text/plain' }, timeout: 15000 }); } function findCurrentPrice(prices) { const now = new Date(); return prices.find(p => { const start = new Date(p.date); const end = new Date(start.getTime() + 3600000); return now >= start && now < end; }); } async function createStates() { await ensure(`${BASE_DP}.control.runNow`, 'boolean', true, true, 'button'); await ensure(`${BASE_DP}.meta.lastFetch`, 'number', 0, true, 'value'); await ensure(`${BASE_DP}.meta.lastFetchReadable`, 'string', '', true, 'text'); await ensure(`${BASE_DP}.todayTomorrow.json`, 'string', '', true, 'json'); await ensure(`${BASE_DP}.current.grossKwhPrice`, 'number', 0, true, 'value', 'ct/kWh'); await ensure(`${BASE_DP}.current.grossKwhTaxAndLevies`, 'number', 0, true, 'value', 'ct/kWh'); await ensure(`${BASE_DP}.current.effectiveGrossKwhPrice`, 'number', 0, true, 'value', 'ct/kWh'); await ensure(`${BASE_DP}.current.date`, 'string', '', true, 'text'); await ensure(`${BASE_DP}.current.dateReadable`, 'string', '', true, 'text'); await ensure(`${BASE_DP}.current.hour`, 'number', 0, true, 'value', 'h'); await ensure(`${BASE_DP}.current.isFree`, 'boolean', false, true, 'indicator'); await ensure(`${BASE_DP}.forecast.minEffectiveGrossKwhPrice`, 'number', 0, true, 'value', 'ct/kWh'); await ensure(`${BASE_DP}.forecast.maxEffectiveGrossKwhPrice`, 'number', 0, true, 'value', 'ct/kWh'); await ensure(`${BASE_DP}.forecast.avgEffectiveGrossKwhPrice`, 'number', 0, true, 'value', 'ct/kWh'); await ensure(`${BASE_DP}.forecast.cheapestDate`, 'string', '', true, 'text'); await ensure(`${BASE_DP}.forecast.cheapestDateReadable`, 'string', '', true, 'text'); await ensure(`${BASE_DP}.forecast.mostExpensiveDate`, 'string', '', true, 'text'); await ensure(`${BASE_DP}.forecast.mostExpensiveDateReadable`, 'string', '', true, 'text'); await ensure(`${BASE_DP}.forecast.nextFreeDate`, 'string', '', true, 'text'); await ensure(`${BASE_DP}.forecast.nextFreeDateReadable`, 'string', '', true, 'text'); await ensure(`${BASE_DP}.forecast.hasFreeHour`, 'boolean', false, true, 'indicator'); } async function ensure(id, type, def, write, role, unit = '') { const exists = await existsStateAsync(id); if (!exists) { await createStateAsync(id, def, { type, role, read: true, write, unit }); } } function round(value) { return Math.round(value * 1000) / 1000; } function escapeTag(value) { return String(value) .replace(/ /g, '\\ ') .replace(/,/g, '\\,') .replace(/=/g, '\\='); }
  • [Vorlage] Anwesenheitssimulation mit dauerhaftem Lernen

    javascript template security
    21
    1 Stimmen
    21 Beiträge
    2k Aufrufe
    NashraN
    @mrMuppet Danke für die gute Erklärung
  • verschiedene Skripte

    javascript
    1
    1
    0 Stimmen
    1 Beiträge
    151 Aufrufe
    Niemand hat geantwortet
  • [Vorlage] Luftqualitätswerte abrufen

    55
    2
    4 Stimmen
    55 Beiträge
    10k Aufrufe
    Siggi0904S
    @Boronsbruder sagte: Wenn ich mal Zeit habe, schau ich mir APIv4 an ;) Wenn man in die News zur V4 schaut, sind "nur" Statistiken dazu gekommen. Ich habe bei mir auf die V4 mit den aktuellen Einstellungen umgestellt und es funktioniert bisher. Vielleicht kann man das Script noch ausbauen und weitere Funktionen der API implementieren. Danke und frohe Ostern.
  • Bambu Lab A1 - Status "fertig"

    6
    0 Stimmen
    6 Beiträge
    494 Aufrufe
    skvarelS
    Es gibt einen Datenpunkt im Bambu Adapter auf den ich reagiere ... zumindest für den P1S Ich prüfe alle 15 Minuten ob der Druck fertig ist und ob die Temperaturen niedrig genug sind. In der VIS habe ich einen Switch um das automatische Abschalten zu steuern. Man will ja nicht nach jedem Druck abschalten ;) Hier mal mein Script: [image: 1775111135695-0cb2eba1-8d7c-46d7-b489-669dc835de7e-image.jpeg] Die View dazu: [image: 1775111001000-fb8b3d6e-705a-4553-8ab5-8660c2ab8d28-image.jpeg]
  • Blockly: Astro-Block - (Zeit)-Versatz wird nicht ausgeführt

    4
    0 Stimmen
    4 Beiträge
    244 Aufrufe
    HomoranH
    @w00dy sagte: demnach passt es. Was immer du da vorhast, -45 Minuten ist vor Sonnenuntergang!
  • [gelöst]Lautstärke verändern mit Aquara Cube und Onkyo Amp

    5
    2
    0 Stimmen
    5 Beiträge
    222 Aufrufe
    J
    Ich habe den Fehler g[image: 1774804343972-bildschirmfoto-2026-03-29-um-19.10.27-resized.png] efunden, es war im Adapter limitiert, danke trotzdem
  • Auf Fehlermeldung im Log reagieren (gelöst)

    9
    0 Stimmen
    9 Beiträge
    423 Aufrufe
    G
    @paul53 Vielen DANK, hat geklappt :)
  • Bastellösung: Polestar Ladezustand via Tibber App API

    35
    10
    0 Stimmen
    35 Beiträge
    44k Aufrufe
    G
    Hallo, die Adapter-Lösung von @tombox läuft einwandfrei. Danke dafür!!! Allerdings ist das etwas am Thema dieses thread vorbei. Warum? Wie wir wahrscheinlich schon Alle erfahren mussten, ändert Polestar hin und wieder die API womit alle diese Bastellösungen wieder angepasst werden müssen. Das geht, je nach Lust, Laune und Zeit des jeweiligen Entwicklers 'mal schneller und auch 'mal langsamer, ganz selten auch gar nicht. Nicht falsch verstehen, das ist kein Vorwurf - es ist vollkommen klar das die Anpassung ein Hobby ist und ich bin jedem Profi dankbar der mir als DAU weiterhilft. Polestar macht ja leider keine Anstalten eine offizielle API anzubieten. Meine Erfahrung ist hier aber, dass die Tibber-API grundsätzlich seltener geändert wird. Deshalb hatte ich auf meinem System immer zwei Lösungen parallel am laufen - Polestar & Tibber. Sollte bei einer API keine sinnvollen Daten mehr kommen, wird automatisch auf die andere gewechselt. So habe ich eine, für mich ausreichende, Datensicherheit erreicht. Mittlerweile gibt es viele Lösungen die sich auf die Polestar-API stützen, aber seit Anfang 03/26 keine funktionierende Lösung für Tibber mehr. Ändert sich nun die Polestar-API versagen alle diese Lösungen gemeinsam. Ich habe leider bis dato keine Alternative gefunden und zum Analysieren der API und ein Script selbst schreiben fehlen mir die Kenntnisse. Lange Rede, wenig Sinn: hat/kennt einer eine Lösung für Tibber (oder was anderes, nicht Polestar) und könnte die bitte hier publizieren/verlinken?
  • [Vorlage] Automatisches Git-Backup für Skripte/Blockly

    javascript blockly
    5
    0 Stimmen
    5 Beiträge
    287 Aufrufe
    Meister MopperM
    @mrMuppet Ich empfehle, das Skript selbst in .gitignore zu setzen. Wenn es nämlich sich selbst aktualisiert - so ist es bei mir passiert - hat der js-controller es einfach gelöscht, weil er dachte, das gehört so. Seitdem spiegele ich meine Skripte in VS Code (geniale Erweiterung: ioBroker-javascript) und nutze für den Ordner ein lokales git. Mit der Erweiterung GitLens ist dann die Versionsverwaltung der Skripte ein Kinderspiel. Bei Bedarf kann man den Ordner mit einem privaten GitHub-Repo synchronsisieren.
  • Fußballergebnisse immer Live, ohne Konferenz. ;)

    Verschoben
    27
    1 Stimmen
    27 Beiträge
    4k Aufrufe
    icebearI
    @robson sagte in Fußballergebnisse immer Live, ohne Konferenz. ;): Genau, HA = Home Assistant Ich habe bei Github den Adapter direkt gefunden. Vllt genügt das schon als erste Doku: Ich hab das bei mir umgesetzt, zuerst mit der kompletten 1.BL und 2.BL und mit dem HA Adapter die ganzen Daten abgegriffen. Das Problem war allerdings und das beschreiben auch immer wieder die Football Nerds in den USA die die komplette NFL Season abbilden das das ganze sehr Ressourcen hungrig ist. Das kann ich auch bestätigen. An einem Spieltag der BL hat sich mein iobroker immer wieder aufgehangen (Synology NAS mit 16GB RAM). Deshalb hab ich das ganze Projekt mit der kompletten 1.BL und 2.BL und den Daten von HA nach iobroker wieder gecanceled. Ich hab jetzt nur noch meine Manschaft als TeamTracker Card mit Toralarm. Hier mal die DP's die von ESPN (HA) TeamTracker bereitgestellt werden: [image: 1773133226277-haf95-resized.png] Ich hab jetzt nur noch die TeamTracker Card die bei Spielbeginn auf meiner VIS Startseite angezeigt wird: [image: 1773133395206-team_tracker.png] und über ALEXA wird ein Sound abgespielt wenn ein Tor fällt. Der Tor-Alarm ist (bei mir) ca 1-2 min Zeitverzögert, das stört mich aber nicht so sehr, da das ja eh nur dafür ist wenn ich nicht live schauen kann und so trotzdem mitbekomme wenn ein Tor fällt.
  • [Vorlage] todoist.com To-Do-Listen Script für VIS

    Verschoben
    133
    2
    0 Stimmen
    133 Beiträge
    32k Aufrufe
    F
    danke für den Hinweis. Habe das Skript aber wieder zum laufen bekommen ;) Lösung waren einfach neue URLs: https://api.todoist.com/api/v2/projects https://api.todoist.com/api/v2/tasks
  • Analogwerte an loxone übertragen

    Verschoben
    19
    0 Stimmen
    19 Beiträge
    6k Aufrufe
    A
    Hallo, Habs nun hin bekommen. Man muss in der Loxone Config beim Virtuellen Eingang den hacken bei nur Status Anzeige" entfernen. Was für mich erst mal unlogisch ist, da ich ja mit dem Eingang nur was Anzeigen will. Egal nun funktioniert es perfekt.

463

Online

33.0k

Benutzer

83.4k

Themen

1.3m

Beiträge