Weiter zum Inhalt

Tester

1.2k Themen 201.5k Beiträge

In dieser Kategorie werden Adapter Versionen vorgestellt die der Entwickler zum Testen Frei gibt.

NEWS

Unterkategorien


  • In dieser Kategorie werden Adapter Versionen, die noch nicht in offiziellen Repos sind, vorgestellt.

    46 2k
    46 Themen
    2k Beiträge
    I
    @Pischleuder am Ende des Skripts steht ein [/s] dieses wirft bei mir einen Fehler. Das soll doch bestimmt nicht so oder? wenn ich das raus nehme gehts. Aber es passiert nichts. es werden auch keine datenpunkte angelegt. edit: Datenpunkte werden angelegt. Bin nicht von Javascript.0 ausgegangen. aber da gibt es keine Videos
  • TESTER: Neuer Adapter Webuntis

    Verschoben
    200
    4 Stimmen
    200 Beiträge
    47k Aufrufe
    madingM
    Hi zusammen, der Adapter war mir zu unzuverlässig bzw. hatte ich ein Javascript gefunden, dass mir alles für vis in einer Tabelle aufarbeitet. Das war aber nicht immer richtig. Ich habe mit Hilfe von copilot ein Skript gebaut, das mir Screenshots des Stundenplans macht. # Create a new folder for the script mkdir webuntis-shot && cd webuntis-shot # Initialize and install dependencies npm init -y npm i playwright dotenv # Install browsers for Playwright (first time only) npx playwright install dann .env Datei erstellen # .env WEBUNTIS_USERNAME="user" WEBUNTIS_PASSWORD="xyz" HEADLESS="1" OUTPUT_DIR="/opt/iobroker" dann die Datei z.B. webuntis.js anlegen // webuntis-screenshot.js // Usage: node webuntis-screenshot.js // Optional env: WEBUNTIS_USERNAME, WEBUNTIS_PASSWORD, HEADLESS, OUTPUT_DIR, TARGET_HASH_FILE import { chromium } from 'playwright'; import fs from 'fs'; import fsp from 'fs/promises'; import path from 'path'; import 'dotenv/config'; const USERNAME = process.env.WEBUNTIS_USERNAME || 'user'; const PASSWORD = process.env.WEBUNTIS_PASSWORD || 'pass'; const HEADLESS = (process.env.HEADLESS || '1') !== '0'; const OUTPUT_DIR = process.env.OUTPUT_DIR || '/opt/iobroker/iobroker-data/files/vis.0/main/img/'; const BASE_URL = 'https://gss-realschule.webuntis.com/timetable/my-student?date='; // === NEW: read TARGET_HASH from external file === const TARGET_HASH_FILE = process.env.TARGET_HASH_FILE || path.resolve(process.cwd(), 'target-hash.txt'); async function loadTargetHash(filePath) { const exists = fs.existsSync(filePath); if (!exists) { throw new Error(`Target-hash file not found: ${filePath}`); } const ext = path.extname(filePath).toLowerCase(); if (ext === '.json') { const raw = await fsp.readFile(filePath, 'utf-8'); let data; try { data = JSON.parse(raw); } catch (e) { throw new Error(`Invalid JSON in ${filePath}: ${e.message}`); } const hash = (data.TARGET_HASH || '').trim(); if (!hash) throw new Error(`Missing "TARGET_HASH" property in ${filePath}`); validateHash(hash); return hash; } else { // treat as plain text const hash = (await fsp.readFile(filePath, 'utf-8')).trim(); validateHash(hash); return hash; } } function validateHash(hash) { if (!hash.startsWith('#/')) { throw new Error(`TARGET_HASH must start with "#/". Got: "${hash}"`); } } // Utility: ensure directory exists (try to create if not) function ensureDir(dir) { try { if (!fs.existsSync(dir)) { fs.mkdirSync(dir, { recursive: true }); } const testFile = path.join(dir, '.test_write.tmp'); fs.writeFileSync(testFile, 'ok'); fs.unlinkSync(testFile); return true; } catch (e) { console.error(`[WARN] Cannot write to ${dir}: ${e.message}`); return false; } } async function tryFill(page, selectors, value, opts = {}) { for (const sel of selectors) { try { const el = await page.$(sel); if (el) { await el.fill(value, { timeout: opts.timeout || 3000 }); return true; } } catch { /* continue */ } } return false; } async function tryClick(page, candidates, opts = {}) { for (const c of candidates) { try { if (c.selector) { await page.click(c.selector, { timeout: opts.timeout || 3000 }); return true; } if (c.text) { const el = page.getByText(c.text, { exact: false }); await el.first().click({ timeout: opts.timeout || 3000 }); return true; } } catch { /* continue */ } } return false; } async function acceptCookies(page) { const candidates = [ { text: 'Accept all' }, { text: 'Accept All' }, { text: 'Accept' }, { text: 'Alle akzeptieren' }, { text: 'Akzeptieren' }, { text: 'Einverstanden' }, { selector: 'button#onetrust-accept-btn-handler' }, { selector: 'button[aria-label*="accept"]' }, ]; await tryClick(page, candidates, { timeout: 2000 }); } async function loginIfNeeded(page, username, password) { const usernameSelectors = [ 'input[name="username"]', 'input#username', 'input[name="user"]', 'input[type="text"]', 'input[autocomplete="username"]' ]; const passwordSelectors = [ 'input[name="password"]', 'input#password', 'input[type="password"]', 'input[autocomplete="current-password"]' ]; const loginButtonCandidates = [ { text: 'Log in' }, { text: 'Login' }, { text: 'Anmelden' }, { text: 'Sign in' }, { selector: 'button[type="submit"]' } ]; let needsLogin = false; for (const sel of passwordSelectors) { const el = await page.$(sel); if (el) { needsLogin = true; break; } } if (!needsLogin) { const clicked = await tryClick(page, [{ text: 'Login' }, { text: 'Anmelden' }, { text: 'Log in' }], { timeout: 2000 }); if (clicked) { await page.waitForTimeout(1200); } for (const sel of passwordSelectors) { const el = await page.$(sel); if (el) { needsLogin = true; break; } } } if (!needsLogin) return false; const uFilled = await tryFill(page, usernameSelectors, username); const pFilled = await tryFill(page, passwordSelectors, password); if (!uFilled || !pFilled) { throw new Error('Could not locate username/password fields to perform login.'); } const clickedSubmit = await tryClick(page, loginButtonCandidates, { timeout: 3000 }); if (!clickedSubmit) { for (const sel of passwordSelectors) { const el = await page.$(sel); if (el) { await el.press('Enter'); break; } } } await page.waitForLoadState('domcontentloaded'); await page.waitForTimeout(2000); return true; } function timestamp() { const d = new Date(); const pad = (n) => String(n).padStart(2, '0'); return `${d.getFullYear()}-${pad(d.getMonth() + 1)}-${pad(d.getDate())}_${pad(d.getHours())}-${pad(d.getMinutes())}-${pad(d.getSeconds())}`; } (async () => { console.log('[INFO] Starting WebUntis screenshot task...'); const canWrite = ensureDir(OUTPUT_DIR); const outDir = canWrite ? OUTPUT_DIR : process.cwd(); if (!canWrite) { console.warn(`[WARN] Falling back to current directory: ${outDir}`); } // Load external hash let TARGET_HASH = ''; try { TARGET_HASH = await loadTargetHash(TARGET_HASH_FILE); console.log(`[INFO] Loaded TARGET_HASH from ${TARGET_HASH_FILE}: ${TARGET_HASH}`); } catch (e) { console.error('[ERROR] Failed to load TARGET_HASH:', e.message); process.exit(1); } const TARGET_URL = `${BASE_URL}${TARGET_HASH}`; const browser = await chromium.launch({ headless: HEADLESS }); const context = await browser.newContext({ viewport: { width: 1400, height: 900 } }); const page = await context.newPage(); try { console.log('[INFO] Navigating to base URL…'); await page.goto(BASE_URL, { waitUntil: 'domcontentloaded', timeout: 60000 }); await acceptCookies(page); await loginIfNeeded(page, USERNAME, PASSWORD); console.log('[INFO] Navigating to target timetable URL…'); await page.goto(TARGET_URL, { waitUntil: 'domcontentloaded', timeout: 60000 }); await page.waitForTimeout(4000); await acceptCookies(page); const filePath = path.join(outDir, `webuntis-screenshot.png`); await page.screenshot({ path: filePath, fullPage: true }); console.log(`[SUCCESS] Screenshot saved to: ${filePath}`); } catch (err) { console.error('[ERROR]', err.message); process.exitCode = 1; } finally { await context.close(); await browser.close(); } })(); eigentlich dachte ich, ich muss die URL noch wöchentlich auf die richtige Woche ändern, das macht aber ein redirect. die target-hash.txt Datei ist aber geblieben (gleicher Ordner) - steht "nichts" drin, könnte geändert werden #/ dann das Skript laufen lassen node webuntis.js Bei mir kamen noch ein paar Fehler, ich musste ein paar libraries nachinstallieren. Somit läuft es bei mir, ich muss jetzt nur noch schauen, ob ich es mit einem blockly und cron triggere oder von debian aus. [image: 1773492443224-494470b8-8e71-4663-8202-0716112cdf72-grafik.png] Damit läuft das Skript stündlich 0 * * * * /usr/bin/node /home/mading/webuntis-shot/webuntis.js >> /home/mading/webuntis-shot/cron.log 2>&1 Damit vis das Bild kennt bzw. lesen kann, ist ein Javascript notwendig, dass die Datei in vis.0 schreibt: var fs = require('fs'); const picture= fs.readFileSync('/opt/iobroker/iobroker-data/files/vis.0/main/img/webuntis-screenshot.png'); //liest linux-datei-system writeFile('vis.0','/main/img/webuntis-screenshot.png', picture, function (error) { }); //schreibt in iobroker system Blockly: <xml xmlns="https://developers.google.com/blockly/xml"> <block type="procedures_defcustomnoreturn" id="FuE%6{wZt7R{vL]0sp=:" x="-37" y="38"> <mutation statements="false"></mutation> <field name="NAME">etwas tun</field> <field name="SCRIPT">dmFyIGZzID0gcmVxdWlyZSgnZnMnKTsgDQogDQogY29uc3QgcGljdHVyZT0gZnMucmVhZEZpbGVTeW5jKCcvb3B0L2lvYnJva2VyL2lvYnJva2VyLWRhdGEvZmlsZXMvdmlzLjAvbWFpbi9pbWcvd2VidW50aXMtc2NyZWVuc2hvdC5wbmcnKTsgLy9saWVzdCBsaW51eC1kYXRlaS1zeXN0ZW0NCndyaXRlRmlsZSgndmlzLjAnLCcvbWFpbi9pbWcvd2VidW50aXMtc2NyZWVuc2hvdC5wbmcnLCBwaWN0dXJlLCBmdW5jdGlvbiAoZXJyb3IpIHsgfSk7ICAgLy9zY2hyZWlidCBpbiBpb2Jyb2tlciBzeXN0ZW0=</field> <comment pinned="false" h="80" w="160">Beschreibe diese Funktion …</comment> </block> <block type="schedule" id="9DD.a-@UNvoRp8i:Yode" x="63" y="113"> <field name="SCHEDULE">{"time":{"start":"06:00","end":"23:00","mode":"minutes","interval":61},"period":{"days":1}}</field> <statement name="STATEMENT"> <block type="procedures_callcustomnoreturn" id="esc^G_dpBegT:H7{mULt"> <mutation name="etwas tun"></mutation> </block> </statement> </block> </xml>
  • Test ViessmannAPI v2.0.0

    Verschoben
    827
    2
    5 Stimmen
    827 Beiträge
    318k Aufrufe
    M
    Sieht gut aus, funktioniert bei mir auch wieder.
  • Ultrahuman Ring Adapter

    Verschoben
    2
    0 Stimmen
    2 Beiträge
    127 Aufrufe
    T
    Danke fürs verschieben @samson71 👍🏻 ich hatte keine Rechte hier direkt einen Beitrag zu erstellen.
  • Test Adapter Solaredge 1.2.x

    Verschoben
    16
    0 Stimmen
    16 Beiträge
    430 Aufrufe
    B
    Kann jemand von euch sagen ob die beiden Werte überhaupt noch angeboten werden Noch ein update zu meinen post an dich. Ich habe das Inventar meines Wechselrichter abgefragt mit folgenden Befehl: curl -s "https://monitoringapi.solaredge.com/site/<id>/inventory?api_key=xxx" | jq { "Inventory": { "inverters": [ { "name": "Inverter 1", "manufacturer": "SolarEdge", "model": "SE8K-ER-01-DEU", "communicationMethod": "ETHERNET", "dsp1Version": "1.13.1031", "dsp2Version": "2.19.922", "cpuVersion": "3.2434.0", "connectedOptimizers": 40, "partNumber": "SE8K-ER-01-DEU", "SN": "7E19C28D-E6" } ], "batteries": [], "gateways": [], "sensors": [], "meters": [] } } Den Adapter Meters kennt er nicht in meinen Wechselrichter, somit ist klar warum da nichts kommt. Mein Wechselrichter ist Baujahr 2014, ein Fossil so zu sagen. :-)
  • Test Adapter sureflap v3.4.2

    Verschoben
    154
    2 Stimmen
    154 Beiträge
    38k Aufrufe
    Sickboy78S
    Version 3.4.0, 3.4.1 and 3.4.2 beinhalten hauptsächlich Updates der Abhängigkeiten. English: Versions 3.4.0, 3.4.1, and 3.4.2 mainly contain dependency updates.
  • Test Adapter Porsche v0.0.x

    Verschoben
    95
    4
    0 Stimmen
    95 Beiträge
    10k Aufrufe
    G
    @tombox Hallo, seit heute habe ich kein Captcha mehr! LOG: "Captcha required but could not extract image" Haben die das LogIn wieder geändert? Lässt sich ein LogIn mit Passkey verwirklichen? LG Thomas
  • Neuer Adapter hagelschutz-vkf

    Verschoben
    4
    0 Stimmen
    4 Beiträge
    221 Aufrufe
    mcm1957M
    @ChrisPrefect sagte in Neuer Adapter hagelschutz-vkf: Lustig, ich hatte schon den Prompt vorbereitet um mit Claude Code auf dem ioBroker eine Extension für diese Hagel-API programmieren zu lassen. Gut, wenn das nun jemand anders maintained :-) Merci! Wenn du planst einen Adapter mittesl AI programmieren zu lassen dann geht bitte UNBEDINGT so vor: Grundgerüst des Adapters mittels @iobroker/create-adapter anlegen DANN erst die AI die entsprechenden "Anpassungen", sprich die Funktionen erstellen lassen. Die bisherige Erfahrung zeigt, dass die AIs nicht in der Lage sind einen Adapter vollständig inclusive der entsprechenden Infrastruktur wie z.B. zwingend erforderliches Testing anzulegen. Dies führt dann bei der Aufnahme in die Repos (sofern gewünscht) zu zusätzlichem Aufwand.
  • Test Adapter ioBroker.imap latest/stable

    Verschoben
    414
    2
    4 Stimmen
    414 Beiträge
    111k Aufrufe
    L
    @maximal1981 Eine neue Mail sollte unter imap.0.xxx_de.email.email_01 und unter imap.0.xxx_de.json aktualisiert werden. Gehe nicht nach dem Timestamp da auch durch wechseln von unseen auf seen ein neuer Timestamp gesetzt wird. Gruß//Lucky
  • Adapter für VELUX KLF-200 Interface

    Verschoben
    360
    0 Stimmen
    360 Beiträge
    97k Aufrufe
    S
    Ja, und ja ;-) Hier laufen wie gesagt einige Proxmox VMs, darunter IOBroker mit >30 Adapter und eine Nextcloud Instanz... Zurück zum Thema: ich habe mal unseren Freund Claude gefragt, er war kooperativer als ChatGPT. Claude hat sich den Code vom KLF200 IOBroker-Adapter genau angeschaut und losgebastelt. Ergebnis ist eine funktionierende Bridge zwischen der KLF200 und MQTT auf Basis von node.js. Falls jemand Interesse hat kann ich das gerne zur Verfügung stellen.
  • Neuer Adapter pi-hole2 für pihole>=V6

    Verschoben
    56
    7 Stimmen
    56 Beiträge
    5k Aufrufe
    patricknitschP
    Hallo, ich nutze aktuell zwei pihole2 Instanzen, die an sich sehr gut funktionieren. Mir ist aber aufgefallen, dass bei einem Verbindungsabruch die Verbindung nicht automatisch wieder aufgebaut wird. Die erste Instanz stand dann ein paar Tage auf gelb, bis ich sie neu gestartet hatte. Gerade auch, wenn der pihole-Container ein Update durchgeführt hat, war die Verbindung weg. Ich habe dazu mal ein Issue zum Thema automatischer Wiederaufbau der Verbindung(oder zumindest Versuch) erstellt.
  • Test Adapter vbus-gw v0.3.x Latest

    Verschoben resol vbus serial-to-tcp
    6
    0 Stimmen
    6 Beiträge
    664 Aufrufe
    P
    0.3.2 (2026-03-04) - 2026H1 maintenance release (pdbjjens) Changed: node>=20, js-controller>=7.0.7 and admin>=7.7.22 required (pdbjjens) Fixed: update release-script (#149)
  • Test Adapter Remeha Home

    Verschoben
    13
    1 Stimmen
    13 Beiträge
    1k Aufrufe
    M
    Vielen dank für den Adapter. Wäre es möglich den Gasverbrauch auszulesen?
  • Test Adapter sma-em v1.3.x Latest

    Verschoben
    392
    2 Stimmen
    392 Beiträge
    130k Aufrufe
    P
    Ich habe soeben ioBroker.sma-em v1.3.1 latest zum Testen freigegeben. Es handelt sich um eine Wartungsfreigabe ohne neue Funktionen. Changelog siehe oben im ersten Eintrag dieses Threads. Wichtig: node>=20, js-controller>=7.0.7 and admin>=7.7.22 erforderlich. Aktualisieren Sie Ihren ioBroker mindestens auf diese Softwareversion, wenn Sie diesen Adapter verwenden möchten. Über Test-Feedback würde ich mich freuen.
  • Test Adapter MyVBus v0.6.x Latest

    Verschoben resol vbus
    382
    5
    0 Stimmen
    382 Beiträge
    115k Aufrufe
    P
    Ich habe soeben ioBroker.mybus v0.6.1 latest zum Testen freigegeben. Es handelt sich um eine Wartungsfreigabe ohne neue Funktionen. Bitte beachten: node>=20, js-controller>=7.0.7 and admin>=7.7.22 erforderlich Über Test-Feedback würde ich mich freuen.
  • Test Adapter ioBroker.n8n

    Verschoben
    42
    1
    7 Stimmen
    42 Beiträge
    5k Aufrufe
    OliverIOO
    Der Port alleine wird nicht reichen. Da n8n umfangreich auf webhooks basiert, muss man auch die umgebungsvariablen n8n_Host und n8n_path konfigurieren um die Node spezifischen URLs korrekt generieren zu lassen.
  • Test Adapter yahoo-stock-market Github

    Verschoben
    45
    4 Stimmen
    45 Beiträge
    8k Aufrufe
    B
    Ich fürchte, der Adapter wird nicht mehr gepflegt. Gibt es mittlerweile eigentlich eine Alternative?
  • Test Adapter mhi-wfrac v2.x.x GitHub

    Verschoben
    49
    1 Stimmen
    49 Beiträge
    5k Aufrufe
    H
    [image: ioBroker.mhi-wfrac?logo=github&label=latest&filter=v2.2.0] Update dependencies Update minimum node version Fix ioBroker issues
  • Test Dreame Home Adapter

    Verschoben
    259
    4
    2 Stimmen
    259 Beiträge
    62k Aufrufe
    G
    @tombox Hi TomBox, besten Dank nochmal für den Adapter – der hat mir bei mir echt den Durchbruch gebracht. Ich kann damit inzwischen beide Roboter (D9 Max + X40) komplett über ioBroker / VIS2 steuern. Ich habe mir dafür eine eigene VIS-Seite gebaut, mit „normalen“ Bedien-Buttons (Start/Stop/Modi etc.) und zusätzlich einer kleinen Logik für Hinweise/Warnungen: Wenn am Roboter eine Meldung ansteht (z.B. „Sensoren reinigen“ / Wartungshinweis), blende ich in der VIS ein Pop-up/Overlay ein. Das kann ich entweder kurz wegklicken und trotzdem starten, oder – je nach Meldung – bewusst bestätigen. Für den Alltag ist das super, weil man dafür nicht in die App muss. (Das dritte Bild zeigt nur einen Screen aus dem Backend ein - dies sieht im Frontend mittlerweile anders aus.) Beim X40 habe ich außerdem die Auswahl so aufgebaut, dass sich die Optionen gegenseitig logisch einschränken (also kein „unsinniger Mix“): Wenn ich z.B. „Saugen“ wähle, dann werden die rein wischbezogenen Routen/Optionen (z.B. Route 3/4) automatisch ausgegraut bzw. gar nicht erst angeboten. Gleiches Prinzip andersrum bei Wischen/Kombi, sodass man nur das auswählen kann, was in dem Modus technisch überhaupt Sinn ergibt. Nur als Rückmeldung aus der Praxis: läuft bei mir bisher stabil und ist genau das, was ich immer wollte – VIS2 als saubere, schnelle Bedienoberfläche ohne dauernd in die Dreame-App zu müssen.!! Gruß!! [image: 1772240130834-screenshot-2026-02-28-012117_1.jpg]
  • Test Adapter hoymiles-ms v0.2.x

    Verschoben hoymiles-ms mcm1957
    87
    2 Stimmen
    87 Beiträge
    5k Aufrufe
    W
    @Homoran Habs geändert, danke!
  • Test Adapter - Fox ESS Cloud

    Verschoben
    4
    3
    1 Stimmen
    4 Beiträge
    299 Aufrufe
    skvarelS
    v0.1.6 ist nun im Latest Repo [image: 1771663527447-e8d55233-d371-479b-8fbb-f04b5b39eb7f-image.png]

542

Online

32.9k

Benutzer

83.0k

Themen

1.3m

Beiträge