Skip to content

NEWS

  • Google Material 3 / Material You - Vis2

    Visualisierung vis material css
    5
    7
    1 Stimmen
    5 Beiträge
    50 Aufrufe
    M
    Freut mich, dass es euch gefällt. Aber mein Wissen ist tatsächlich hier mehr konzeptionell: ich habe das ganze ja von Gemini schreiben lassen. Ich habe einfach beschrieben was ich haben möchte, welche Datenpunkte ich dazu habe (am besten natürlich alles über alias und userdata) und dann wieder korrigieren lassen. Immer wieder musste ich auch bereits fertiggestellte Scripte wieder hochladen, damit Gemini die Zusammenhänge nicht vergisst, aber so hat es langsam funktioniert. Auch die Material 3 Unterlagen von Google habe ich mir recht ausführlich angeschaut, damit ich Gemini auf Fehler aufmerksam machen konnte. Also viel so in dem Stil "So, dass ist der Skript meiner Heizungsseite, jetzt füge bitte noch die Funktion XY ein." - "der neue Skript hat noch nicht funktioniert, ich habe folgenden Fehler: ..." - "jetzt klappts. bitte ergänze noch diese Funktion"... Wobei man natürlich schon ein bisschen verstehen muss, wie TS und JS Dateien aufgebaut sind, wie der Vis-Editor bedient wird etc. Aber letztlich kann einem die KI natürlich auch bei fast allen Problemen helfen.
  • E3DC Hauskraftwerk steuern

    JavaScript
    4k
    1
    3 Stimmen
    4k Beiträge
    2m Aufrufe
    A
    @azzkikrboy Verwendest du die Objekt-ID 0_userdata.0.Charge_Control.Allgemein.EigenverbrauchDurchschnitt ? Da sollten immer beide Werte angezeigt werden.
  • Fritz Box LAN Port nicht Raspi geeignet?

    Verschoben Off Topic
    13
    0 Stimmen
    13 Beiträge
    1k Aufrufe
    Michael SchmittM
    Komisch, sollte die 7690 aber haben. https://fritz.com/apps/knowledge-base/FRITZ-Box-7690/3817_Haufige-Abbruche-der-LAN-Verbindung
  • Zeigt her eure KI Projekte

    Plauderecke
    29
    2
    6 Stimmen
    29 Beiträge
    970 Aufrufe
    Jey CeeJ
    Hat nix mit iobroker zu tun. Ich hab mir eine Android APP gebaut um verschiedene Sachen zu Bündeln die bisher getrennt waren bei meiner Kundenverwaltung. Bisher war meine Zentrale Sammelstelle Obsidian für Zeit Erfassung und Notizen. Alles andere musste ich so in meine Ordner Struktur schieben. Gerade bei Bildern war das Umständlich. Die Zeiterfassung soll möglichst einfach sein und automatisch dem Kunden zugeordnet werden. Außerdem wollte ich in die Notizen auch Zeichnen können und Bilder einfügen. Da mein Backend aus Praktischen Gründen eine Ordnerstruktur ist, die auf einer Nextcloud Instanz liegt. Ist die APP so gebaut das diese Struktur lokal oder auf jedem WebDav abgelegt werden kann. Hier ein paar Eindrücke: [image: 1773094144273-18311.jpg] [image: 1773094144308-18312.jpg] [image: 1773094144341-18313.jpg] [image: 1773094144373-18314.jpg] [image: 1773094144405-18315.jpg] [image: 1773094144439-18316.jpg] [image: 1773094144473-18317.jpg]
  • SONOFF NSPanel mit Lovelace UI (TypeScript Version)

    Hardware lovelace ui nspanel sonoff
    8k
    12
    16 Stimmen
    8k Beiträge
    7m Aufrufe
    T
    @TimoWald wo und wie hast du denn den Offset gemacht. Hast du den Parameter auch so gesetzt, wie @ticaki geschrieben hat.
  • [gelöst] hue Adapter 3.16.2 und eWeLink Bulb

    ioBroker Allgemein
    16
    2
    0 Stimmen
    16 Beiträge
    162 Aufrufe
    RaspiUserR
    Manchmal ist es ganz einfach ... die Bridge einen knappen Meter weiter geschoben und hochkant gestellt ... jetzt geht's.
  • Moodvis - Native ioBroker Vis (Win/Android) - Tester gesucht

    Marktplatz
    124
    8
    2 Stimmen
    124 Beiträge
    2k Aufrufe
    p.endeP
    @da_woody und es wird bunt... Wenn man denn will. Wenn man nichts auswählt bleibt die Option "Auto" und die Linien orientieren sich an der Akzentfarbe der Kachel. [image: 1773092660581-7f38d796-b1b3-46cb-b8b3-0820b16a2c8e-image.png] [image: 1773092693650-97771d58-5c01-48dd-98e6-b088306101d0-image.png] Chart 1 optional auch als Liniendiagramm [image: 1773092706704-48b5143a-ffb2-44a5-a777-6b6e27c16c00-image.png] Damit ist die Chart Kachel wesentlich umfangreicher zu nutzen. Beispielsweise als Raumklima Anzeige.
  • Omlet Hühnerstall webhook API

    JavaScript
    29
    0 Stimmen
    29 Beiträge
    159 Aufrufe
    OliverIOO
    @jwerlsdf weiter gehts mit der nächsten version. vorgehensweise wie oben. es sind ein paar mehr datenpunkte dazugekommen bitte vorher die datenpunkte anlegen. typ und detailanweisung im zeilenkommentar beachten const dp_doorstop = '0_userdata.0.omlet.doorstop'; // datenpunkt mit typ bool und rolle button anlegen und namen hier eintragen const dp_doortimeopen = '0_userdata.0.omlet.doortimeopen'; // datenpunkt mit typ string, zeit im 24h format im format 06:00 oder 20:30 const dp_doortimeclose = '0_userdata.0.omlet.doortimeclose'; // datenpunkt mit typ string, zeit im 24h format im format 06:00 oder 20:30 const dp_devicedata = '0_userdata.0.omlet.devicedata'; //// datenpunkt mit typ string, hier wird nach jeder aktualisierung der aktuelle device status abgerufen und eingetragen wenn im datenpunkt dp_doortimeopen und dp_doortimeclose etwas eingetragen wird, dann sollte die jeweilige zeit gesetzt werden. im Anschluss wird die Konfiguration gleich abgerufen und im Datenpunkt dp_devicedata abgespeichert, sowie auch dp_doortimeopen und dp_doortimeclose wieder aktualisiert der button doorstop führt die entsprechende aktion aus. um mit dem angeschlossenen gerät nicht zu viel unruhe zu erzeugen, habe ich (hoffentlich) nur die lesenden aktionen ausgeführt. die schreibenden aktionen habe ich mal ausgelassen, was aber auch mangels test zu höheren fehlerrisiko neigt. aber mal schauen. bitte möglichst genau darüber berichten // -- configuration area const token = 'apitoken'; const outdoorDeviceId = 'laTnMsWSJxBMGgJD'; const dp_light = '0_userdata.0.omlet.light'; // datenpunkt mit typ bool anlegen und namen hier eintragen const dp_door = '0_userdata.0.omlet.door'; // datenpunkt mit typ bool anlegen und namen hier eintragen const dp_doorstop = '0_userdata.0.omlet.doorstop'; // datenpunkt mit typ bool und rolle button anlegen und namen hier eintragen const dp_doortimeopen = '0_userdata.0.omlet.doortimeopen'; // datenpunkt mit typ string, zeit im 24h format im format 06:00 oder 20:30 const dp_doortimeclose = '0_userdata.0.omlet.doortimeclose'; // datenpunkt mit typ string, zeit im 24h format im format 06:00 oder 20:30 const dp_devicedata = '0_userdata.0.omlet.devicedata'; //// datenpunkt mit typ string, hier wird nach jeder aktualisierung der aktuelle device status abgerufen und eingetragen // -- const axios = require("axios/dist/browser/axios.cjs"); const BASE_URL = 'https://x107.omlet.co.uk/api/v1'; //kann hier geprüft werden https://smart.omlet.de/developers/api let omlet = undefined; async function connect() { console.log("start main2"); omlet = await omletAPIClient(token); await getDevices(true); //console.log(JSON.stringify(await getDevices(), null, 2)); } async function getDevices(info = false) { try { const devices = await getRequest('/device'); if (devices && info) { devices.forEach(device => { console.log(`Device name: ${device.name}, deviceId: ${device.deviceId}`); }); } return devices; } catch (error) { console.log(error); return []; } } async function getDevice(deviceId) { try { const device = await getRequest(`/device/${deviceId}`); return device; } catch (error) { console.log(error); return {}; } } async function getConfiguration(deviceId) { try { const configuration = await getRequest(`/device/${deviceId}/configuration`); return configuration; } catch (error) { console.log(error); return {}; } } async function setConfiguration(deviceId, configuration) { try { const result = await patchRequest(`/device/${deviceId}/configuration`, configuration); return result; } catch (error) { console.log(error); return {}; } } async function getDeviceInfo(deviceId) { const device = await getDevice(deviceId); setState(dp_devicedata, JSON.stringify(device, null, 2), true); setState(dp_doortimeopen, device.configuration.door.openTime, true); setState(dp_doortimeclose, device.configuration.door.closeTime, true); } async function doAction(deviceId, actionName) { const devices = await getDevices(); const device = devices.find(device => device.deviceId === deviceId); if (device) { const action = device.actions.find(action => action.actionName === actionName); if (action) { await postRequest(action.url); await getDeviceInfo(outdoorDeviceId); } } } async function lightOn(deviceId) { await doAction(deviceId, 'on'); } async function lightOff(deviceId) { await doAction(deviceId, 'off'); } async function doorOpen(deviceId) { await doAction(deviceId, 'open'); } async function doorClose(deviceId) { await doAction(deviceId, 'close'); } async function doorStop(deviceId) { await doAction(deviceId, 'stop'); } async function setDoorTimeClose(deviceId, time) { const configuration = getConfiguration(deviceId); const newConfiguration = { ...configuration, door: { ...configuration.door, closeTime: time } }; await setConfiguration(deviceId, newConfiguration); await getDeviceInfo(outdoorDeviceId); } async function setDoorTimeOpen(deviceId, time) { const configuration = getConfiguration(deviceId); const newConfiguration = { ...configuration, door: { ...configuration.door, openTime: time } }; await setConfiguration(deviceId, newConfiguration); await getDeviceInfo(outdoorDeviceId); } function omletAPIClient(token) { return axios.create({ baseURL: BASE_URL, headers: { 'Authorization': `Bearer ${token}`, 'Content-Type': 'application/json', }, }); } function isValidTime24h(value) { return /^(?:[01]\d|2[0-3]):[0-5]\d$/.test(value); } async function getRequest(url) { try { const data = await omlet.get(url); console.debug(`get request: ${url},status: ${data.status}`); return data.data; } catch (e) { console.log(e); } } async function postRequest(url) { try { const data = await omlet.post(url); console.debug(`post request: ${url},status: ${data.status}`); return data.data; } catch (e) { console.log(e); } } async function patchRequest(url, data) { try { const result = await omlet.patch(url, data); console.debug(`patch request: ${url},status: ${result.status}`); return result.data; } catch (e) { console.log(e); } } function watchTimeState(id, label) { on({ id: id, change: 'ne', ack: false }, async (obj) => { const newVal = String(obj.state.val || '').trim(); const oldVal = obj.oldState && obj.oldState.val != null ? String(obj.oldState.val) : ''; if (isValidTime24h(newVal)) { log(`${label}: gültige Zeit gesetzt -> ${newVal}`, 'debug'); if (id === dp_doortimeopen) { await setDoorTimeOpen(outdoorDeviceId, newVal); } if (id === dp_doortimeclose) { await setDoorTimeClose(outdoorDeviceId, newVal); } return; } log(`${label}: ungültige Zeit "${newVal}" - setze auf "${oldVal}" zurück`, 'warn'); // ungültige Eingabe zurücksetzen setState(id, oldVal, true); }); } async function main() { await connect(); await getDeviceInfo(outdoorDeviceId); on({ id: dp_door, change: 'ne', ack: false }, async (evt) => { //log(evt); if (evt.state.val) { await doorOpen(outdoorDeviceId); } else { await doorClose(outdoorDeviceId); } }); on({ id: dp_light, change: 'ne', ack: false }, async (evt) => { //log(evt); if (evt.state.val) { await lightOn(outdoorDeviceId); } else { await lightOff(outdoorDeviceId); } }); on({ id: dp_doorstop, change: 'any', ack: false }, async (/* evt */) => { //log(evt); doorStop(outdoorDeviceId); setState(dp_doorstop, false, true); }); watchTimeState(dp_doortimeopen, 'Öffnungszeit'); watchTimeState(dp_doortimeclose, 'Schließzeit'); // await lightOn(outdoorDeviceId); // await lightOff(outdoorDeviceId); } main(); für astro hat der iobroker ja bereits ereignisse eingebaut, wenn die dann aufgerufen werden musst du dann einfach nur die Funktionen doorOpen und doorClose mit der deviceId (die in der Variable outdoorDeviceId steht) aufrufen Sind die Funktionen soweit verständlich? Brauchst du mehr Detaildokumentation für spätere Anpassungen?
  • Test Adapter Zendure Solarflow

    Tester
    2k
    0 Stimmen
    2k Beiträge
    953k Aufrufe
    F
    @nograx sagte in Test Adapter Zendure Solarflow: Ich arbeite an einem Update um das zenSDK zu unterstützen, damit gibt es dann eine "legale" lokale Kommunikation zwischen dem Gerät und ioB. TOP!! Ich freue mich, dass Du da dran bleibst. Aber bei mir kommen zumindest einige Daten vom SF800 Plus an im Adapter, aber unter eigener anderen Hardware ID wie gedacht. Hier mal ein kleiner Auszug meiner DP´s. Kommunikation kann sein, das die etwas langsam ist. [image: 1773091117724-dp-s-resized.png]
  • Ecowitt Shelly Wetterstation WS 90

    ioBroker Allgemein
    14
    0 Stimmen
    14 Beiträge
    128 Aufrufe
    FabioF
    @da_Woody sagte in Ecowitt Shelly Wetterstation WS 90: > bleibt einfach friedlich ohne streit... ... wir streiten uns nicht @homoran und ich sind quasi Nachbarn. ;-) Herzliche Grüße Fabio
  • Backitup - NAS ?

    ioBroker Allgemein
    22
    5
    0 Stimmen
    22 Beiträge
    129 Aufrufe
    O
    @Humidor Wenn du in der Konsole deines iobroker-Containers unter /opt/backitup den Befehl "touch test.txt" eingibst, wird dann eine Datei erstellt?
  • Grohe - Sense / Guard /Blue - Adapter

    Tester
    30
    1 Stimmen
    30 Beiträge
    246 Aufrufe
    JackDanielJ
    Ja, aber erst am Wochenende
  • zwave - Beta ioBroker.zwavews

    Tester
    129
    5
    6 Stimmen
    129 Beiträge
    3k Aufrufe
    jolicJ
    @kopterframe Beispiel: Gehe zu Objekte (Baumansicht) -> Navigiere zu: alias.0 -> Klicke auf: + → Neues Objekt hinzufügen (alias.0.Neues Gerät): Erstelle ein Verzeichnis unter alias.0 -> Typ: Verzeichnis (folder) -> Name: Z-Wave Dann gehst du in deinem zwavews-Objekt auf den gewünschten DP und kannst dort über das Kontextmenü einen Alias erstellen. Nach dem Erstellen wird unter dem DP ein Link zum Alias angezeigt - und umgekehrt erscheint beim Alias ebenfalls ein Link zurück zum ursprünglichen Datenpunkt. [image: 1773084527200-bildschirmfoto_alias.png]
  • Reverse Proxy und ioBroker

    ioBroker Allgemein proxy iobroker reverse proxy
    8
    0 Stimmen
    8 Beiträge
    98 Aufrufe
    OliverIOO
    @Dr.-Bakterius sagte in Reverse Proxy und ioBroker: Es muss doch möglich sein ioBroker auch hinter einem reverse Proxy korrekt zu verwenden. Oder weshalb gibt es die Einstellungsseite? Und wenn man den ioBroker so einrichten kann, dass er über SSL erreichbar ist, sollten dann die Adapter das nicht mit berücksichtigen und deren Weboberfläche auch entsprechend erreichbar sein? da sollte sich dann lieber mal einer der core entwickler dazu äussern.
  • vis-2-widgets-collection

    Tester
    373
    6
    8 Stimmen
    373 Beiträge
    80k Aufrufe
    carsten04C
    @tsero Die CollectionWidgets sind immer so gebaut, dass du auch die anderen vorhandenen Einstellungen im vis-2 Editor nutzen kannst, also: [image: 1773079120868-d8a8aa31-1bb9-495b-85ef-cd7a79600cfa-image.png] Es gilt immer das Grundprinzip: speziellere Einstellungen überschreiben allgemeinere Einstellungen. Schau dir auch mal das GitHub-Wiki an, da ist schon vieles erklärt. Dein gewünschtes Tabellenaussehen kannst Du dann auch fast wie gewünscht abbilden.
  • [gelöst] I2C Adapter heute noch verwendbar?

    ioBroker Allgemein
    21
    0 Stimmen
    21 Beiträge
    219 Aufrufe
    jvfleJ
    Problem gelöst. Der I2C-Adapter funktioniert nicht mit meinem MCP23017. Die Diskussion ging auch in die völlig falsche Richtung. Die Lösung: https://github.com/benzino77/tasmocompiler/pkgs/container/tasmocompiler.
  • ABRP API

    JavaScript
    13
    0 Stimmen
    13 Beiträge
    1k Aufrufe
    C
    so läuft bei jetzt auch bei mir wer es als js haben will: /*************************************************************** * VW → ABRP Telemetry Script * für ioBroker Javascript Adapter * * Funktionen: * 1. Sendet Fahrzeugdaten alle 5 Minuten an ABRP * 2. Sendet sofort wenn sich der SOC ändert * * Gesendete Daten: * - SOC (Batteriestand) * - GPS Position * - Odometer * - Batteriekapazität * - Timestamp * * API: * https://api.iternio.com/1/tlm/send ***************************************************************/ const apiKey = "API-KEY-von-iternio.com"; const token = "Token-aus-der-APP"; const vin = "VIN-des-Autos"; /*********************** * Datenpunkte ***********************/ const dp_soc = "vw-connect.0." + vin + ".status.charging.status.battery.stateOfChargeInPercent"; const dp_odometer = "vw-connect.0." + vin + ".mqtt.events.charging-completed.data.odometer"; const dp_lat = "vw-connect.0." + vin + ".status.position.parkingPosition.gpsCoordinates.latitude"; const dp_lon = "vw-connect.0." + vin + ".status.position.parkingPosition.gpsCoordinates.longitude"; /*********************** * Funktion zum Senden ***********************/ function sendToABRP(trigger) { const soc = getState(dp_soc).val; const odometer = getState(dp_odometer).val; const lat = getState(dp_lat).val; const lon = getState(dp_lon).val; // Prüfen ob wichtige Daten vorhanden sind if (soc === null || lat === null || lon === null) { log("ABRP: Daten fehlen → kein Versand", "warn"); return; } const utc = Math.round(Date.now() / 1000); const tlm = { utc: utc, soc: soc, capacity: 85, odometer: odometer, lat: lat, lon: lon }; const url = "https://api.iternio.com/1/tlm/send?api_key=" + apiKey + "&token=" + token + "&tlm=" + encodeURIComponent(JSON.stringify(tlm)); httpGet(url, { timeout: 2000 }, function (err, response) { if (err) { log("ABRP Fehler: " + err, "error"); } else { log("ABRP gesendet (" + trigger + "): " + JSON.stringify(tlm), "info"); } }); } /*********************** * 1️⃣ Alle 5 Minuten senden ***********************/ schedule("*/5 * * * *", function () { sendToABRP("Timer"); }); /*********************** * 2️⃣ Senden wenn SOC sich ändert ***********************/ on({ id: dp_soc, change: "ne" }, function (obj) { log("SOC Änderung erkannt: " + obj.state.val + "%", "info"); sendToABRP("SOC Änderung"); });
  • VIS2 Inventwo HTML tags in Tabelle

    Visualisierung
    1
    2
    0 Stimmen
    1 Beiträge
    27 Aufrufe
    Niemand hat geantwortet
  • Hilfe bei Blockly-Erstellung benötigt

    Blockly
    7
    0 Stimmen
    7 Beiträge
    61 Aufrufe
    paul53P
    @Lottemann sagte: ein + als nächstes rein Addition und Multiplikation sind der 2. Mathe-Block von oben. Schritte: [image: 1773072613287-blockly_temp.jpg]
  • Test Adapter google-sharedlocations2

    Tester
    35
    4 Stimmen
    35 Beiträge
    745 Aufrufe
    GaspodeG
    @Garfonso Super, dass du dich um den Adapter kümmerst. Edit: Nach dem 3. Versuch hat es jetzt einfach so funktioniert. keine Ahnung, warum es zunächst den Fehler gab. Jetzt läuft die Sache erst mal. Ich beobachte. Vielen Dank! Ich hab jetzt mal getestet (unter Windows) und bekomme allerdings folgende Fehlermeldung: 2026-03-09 15:24:40.580 - info: google-sharedlocations2.0 (6680) starting. Version 0.3.3 (non-npm: Garfonso/ioBroker.google-sharedlocations2#861d3ca3b6b823f42e232d261e612220ab634de9) in C:/ioBroker/lonwolf/node_modules/iobroker.google-sharedlocations2, node: v22.21.0, js-controller: 7.0.7 2026-03-09 15:24:40.623 - debug: google-sharedlocations2.0 (6680) Loaded 0 cookies from state. 2026-03-09 15:24:40.624 - debug: google-sharedlocations2.0 (6680) No cookie found in states, trying to log in to get new one. 2026-03-09 15:24:40.625 - debug: google-sharedlocations2.0 (6680) Trying to refresh cookie by loading Google Maps with existing cookie in Browser. 2026-03-09 15:24:40.625 - debug: google-sharedlocations2.0 (6680) Starting browser. 2026-03-09 15:24:43.037 - debug: google-sharedlocations2.0 (6680) browser started, opening new page. 2026-03-09 15:24:45.277 - debug: google-sharedlocations2.0 (6680) Loading Google login page to refresh cookie. 2026-03-09 15:24:50.482 - debug: google-sharedlocations2.0 (6680) Waiting for page to load, currently waiting fixed 5 seconds, because network never gets idle for maps 2026-03-09 15:24:56.034 - info: google-sharedlocations2.0 (6680) Trying to login to Google to get new cookies. 2026-03-09 15:24:56.034 - debug: google-sharedlocations2.0 (6680) Starting browser. 2026-03-09 15:25:00.589 - debug: google-sharedlocations2.0 (6680) browser started, opening new page. 2026-03-09 15:25:01.197 - debug: google-sharedlocations2.0 (6680) going to google login page. 2026-03-09 15:25:05.681 - debug: google-sharedlocations2.0 (6680) waiting for login / maps page to load (fixed 3 seconds timeout) 2026-03-09 15:25:08.689 - debug: google-sharedlocations2.0 (6680) filling in username. 2026-03-09 15:25:09.774 - debug: google-sharedlocations2.0 (6680) clicking user next button. 2026-03-09 15:25:10.140 - debug: google-sharedlocations2.0 (6680) waiting for network idle before filling password 2026-03-09 15:25:14.094 - debug: google-sharedlocations2.0 (6680) filling in password. 2026-03-09 15:25:44.104 - error: google-sharedlocations2.0 (6680) Error in puppeteer: Timed out after waiting 30000ms 2026-03-09 15:25:44.104 - error: google-sharedlocations2.0 (6680) The step puppeteer failed was: filling in password. Eine Idee, woran das liegen könnte?

368

Online

32.7k

Benutzer

82.5k

Themen

1.3m

Beiträge