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
    Thomas MosandlT
    v0.5.4 ist live — der Schwerpunkt liegt diesmal komplett auf der Login-UX nach euren Rückmeldungen aus diesem Thread. Plus drei kleine Quality-Fixes, die mir beim Live-Test aufgefallen sind. Login-UX-Overhaul Bosch-Login-Button direkt in den Instanz-Einstellungen. Die OAuth-URL wird jetzt zusätzlich als Datenpunkt bosch-smart-home-camera.0.info.login_url veröffentlicht und als klickbarer Link in der Admin-UI gerendert. Über den neuen Button „Bosch-Login im Browser öffnen" öffnet sich der OAuth-Flow direkt in einem neuen Tab. Kein Heraussuchen einer 300-Zeichen-URL aus dem Log-Inspektor mehr. Kein Terminate-Loop mehr beim Warten auf Login. Wenn eine alte redirect_url oder ein abgelaufenes PKCE-Paar den Token-Tausch killen, bleibt der Adapter jetzt im awaiting_login-Modus am Leben statt sich jedes Mal selbst zu beenden. Das „sieht kaputt aus"-Verhalten ist damit weg. Neuer „Login zurücksetzen"-Button mit Bestätigungs-Dialog: löscht Tokens, PKCE-Paar, gepastete URL und login_url in einem Klick und startet den Adapter neu für einen frischen OAuth-Cycle. Praktisch, wenn man sich verheddert hat oder das Bosch-Konto wechseln will. Bessere Diagnose-Datenpunkte info.connection_status (Text): logged_out | awaiting_login | connected | auth_error — viel klarer für Blockly- und VIS-Logik als der reine Boolean info.connection. info.last_login_at (ISO-Zeitstempel): wann der letzte erfolgreiche Token-Mint war. Hilft einzuschätzen, wie nah das Refresh-Token an den 30 Tagen offline_access-Lebensdauer dran ist. Quality-Fixes Privacy-Modus killt online nicht mehr. Eine Indoor-Kamera in dauerhaftem Privacy-Modus driftete bisher nach drei Startup-Snapshot-Retries auf online=false, obwohl die Kamera ja erreichbar war — der Snapshot-Endpoint antwortet im Privacy-Modus halt nicht. Das wird jetzt als User-Status erkannt, nicht als Connectivity-Fehler. last_motion_at ist jetzt valides ISO 8601. Bosch liefert Zeitstempel im Java-ZonedDateTime-Format mit anhängendem [Europe/Berlin]. JavaScript-new Date() kann das nicht parsen, Blockly-Vergleiche scheiterten. Der Adapter strippt das Suffix jetzt. Wer mit dem alten String gearbeitet hat: numerische Vergleiche über new Date(...).getTime() funktionieren ab v0.5.4 zuverlässig. Snapshot-Keep-Alive-Doku ehrlich. v0.5.3 hatte „nach dem ersten Snap ~200 ms" versprochen — gemessen sind es 2–5 s typisch, gelegentlich 10–15 s, weil der Snapshot-Endpoint der Kamera selbst dominiert. Die Session-Wiederverwendung spart ~0,5–1 s (den PUT /connection-Roundtrip). README ist auf den realistischen Wert korrigiert. Installation npm: iobroker.bosch-smart-home-camera@0.5.4 GitHub: https://github.com/mosandlt/ioBroker.bosch-smart-home-camera/releases/tag/v0.5.4 Aufnahme ins offizielle Repository Pull-Request ist offen: https://github.com/ioBroker/ioBroker.repositories/pull/5983 — repochecker ist FINAL: OK. Sobald der Review durch ist, taucht der Adapter regulär im Admin-„Adapter"-Tab auf und das rote Icon (mittlere Spalte) verschwindet. Feedback bitte weiterhin hierher — gerade die Login-Pfade waren bisher nur theoretisch durchgetestet, da würde ich gerne wissen, ob die neuen Buttons in echten Umgebungen anders zicken als in meiner Test-Sandbox.
  • 5 Stimmen
    3k Beiträge
    2m Aufrufe
    arteckA
    @Holger-Etzel beispiel anhand Zigbee adapter https://github.com/ioBroker/ioBroker.zigbee/wiki/GIT-install du musst diese URL nehmen https://github.com/TA2k/ioBroker.vw-connect
  • Test Adapter pirate-weather 0.7.x

    Verschoben
    124
    4 Stimmen
    124 Beiträge
    15k Aufrufe
    T
    @ticaki sagte: Du sprichst von ts ich von lc Nicht der Zeitpunkt der letzten Aktualisierung sondern der Zeitpunkt der letzten Änderung Finale Frage ;-) Läßt sich das auch ohne extra Script direkt im Widget lösen? Hab den Datenpunkt der letzten Änderung und einen DP der zuletzt "geschriebenen" Regenmenge (0 seit dem es aufgehört hat zu regnen). Kann man das über "rechnen" im Widget bei der "Objekt Identifikation" erledigen Also: act. Zeit - lc rechnen und check ob Regenmenege 0 ist? Oder benötigt das doch zwingend extra Blockly (weil zu viele DP und Check gemacht werden muss? (ich will nicht nur vor dem Start checken ob der Mäher losfahren soll sondern es soll eine "Ampel" im Dashboard angezeigt werden die immer den aktuellen Status zeigt (hier: Ob es die letzten 3h trocken war))
  • Test/Support für Adapter rssfeed und vis-2-widgets-rssfeed

    Verschoben adapter atom feed iobroker.rssfeed rdf rss vis widget
    696
    8 Stimmen
    696 Beiträge
    191k Aufrufe
    OliverIOO
    Für diejenigen, die selber Templates erstellen oder vorhandene anpassen, wurde die Dokumentation um zwei wichtige hinweise erweitert. https://github.com/oweitman/ioBroker.rssfeed#very-important-note-for-use-in-vis--vis-2
  • zwave - Beta ioBroker.zwavews

    Verschoben
    218
    5
    6 Stimmen
    218 Beiträge
    11k Aufrufe
    arteckA
    @jolic admin 7.8.24 adapter version 0.2.0
  • 4 Stimmen
    1k Beiträge
    593k Aufrufe
    metaxaM
    @Lucky_ESA sagte: Dann bitte den Inhalt von homeconnect.0.auth.session durch das ersetzen: {} Adapter neu starten und den Link (error Meldung) im Browser eingeben. Dort dann einloggen (PW + Username) und dann den Button Approve klicken. Gruß//Lucky Danke! Funktioniert wieder! mxa
  • [Adapter] Weatherflow_UDP

    Verschoben weatherflow adapter udp
    29
    0 Stimmen
    29 Beiträge
    4k Aufrufe
    C
    OK. https://github.com/woessmich/ioBroker.weatherflow_udp/issues/119 .
  • Test Adapter Fronius 2.0.x

    Verschoben
    182
    4 Stimmen
    182 Beiträge
    38k Aufrufe
    NegaleinN
    @mickemup sagte: Dort ist auf dem Dashboard auch nirgends die Temperatur zu sehen. Mit der Technican-Anmeldung kann man die 4 vorhandenen Temperaturen unter "Erweitert" im Webinterface sehen. [image: 1778526178757-c198f25d-37cb-4c57-9669-0975e5d7200c-image.jpeg]
  • Test Adapter Bosch ebik connect / flow

    Verschoben
    180
    4
    0 Stimmen
    180 Beiträge
    44k Aufrufe
    M
    Moin, habe die Tage von Bosch eine Nachricht erhalten. Darin wurde um die neue Bosch-EBike-Live-Data Api geworben. https://www.bosch-ebike.com/de/business/live-data-interface Ist das wirklich etwas neues? Garmin Edge nutzt diese API schon. Leider erfahre ich aus dem Netz nichts darüber, ob Privatleute diese API auch nutzen können. Wer weiß etwas genaueres?
  • Test Adapter e3oncan - Viessmann E3 Serie einbinden

    Verschoben
    125
    6
    2 Stimmen
    125 Beiträge
    13k Aufrufe
    jrbwhJ
    @damichi85 Im Beta-Repo ist jetzt die Version 1.0.1 verfügbar. Kleiner Bugfix. Und mit Klick auf das Badge "xxx scheduled" kann man nun nach genau diesen DIDs filtern.
  • [Adapter] Test Plex 2.0.x

    3
    0 Stimmen
    3 Beiträge
    104 Aufrufe
    T
    Latest release angestoßen, sollte in den nächsten 12h verfügbar sein
  • Test Adapter shelly - ALPHA Versionen

    Verschoben mcm1957 shelly
    209
    4 Stimmen
    209 Beiträge
    30k Aufrufe
    mcm1957M
    Ab 11.0.0-alpha.15 steht nun zur Verfügung. Der brandneue Shelly Dimmer 0/1-10V PM Gen4 (shelly0110dimG4) ist dort konfiguriert.
  • Test Adapter sigenergy v1.9.x GitHub/Latest

    4
    0 Stimmen
    4 Beiträge
    119 Aufrufe
    B
    Hallo, ich habe den Adapter nun ausführlich getestet und bin sehr zufrieden: Er funktioniert zuverlässig, die Werte wirken plausibel und liefern viele nützliche Informationen – vielen Dank für deine tolle Arbeit! Mir ist aufgefallen, dass derzeit nur Momentanwerte angezeigt werden, Totalsummen fehlen. Ich vermute, dass dies am Modbus oder an den von Sigenergy bereitgestellten Daten liegt. Ein wiederkehrendes Problem habe ich allerdings: Alle paar Wochen hängt sich der Adapter auf und muss neu gestartet werden. Ich vermute, dass der Socket-Port geschlossen wird und der Adapter nicht überprüft, ob der Port noch geöffnet ist. Ich nutze die Version 1.9.8, und der Log wird mit folgender Meldung geflutet: Inverter register read error at 3xxxx: Port not Open. Vielen Dank nochmals für deine Arbeit und die großartige Unterstützung! Viele Grüße
  • Test Adapter script-restore v0.0.12

    1
    2 Stimmen
    1 Beiträge
    79 Aufrufe
    Niemand hat geantwortet
  • Adapter Hyundai (Bluelink) oder KIA (UVO)

    Verschoben
    2k
    5 Stimmen
    2k Beiträge
    992k Aufrufe
    Wolfgang GaryW
    Hat bei mir auch funktioniert! Großes Dankeschön!
  • Test Adapter nextcloud-monitoring v2.1.x GitHub/Latest

    Verschoben
    24
    1 Stimmen
    24 Beiträge
    881 Aufrufe
    H5N1H
    Neue Version 2.1.0. Widget kann nun direkt im Admin aktiviert/Deaktiviert werden. Einstellbare Schriftgröße. Hell/Dunkel Modus. Adapter erstellt bei aktivierten Widget, das dann unter dem Server Standort liegt, ein htmlWidget Datenpunkt, dieser kann in VIS/VIS2 in einem HTML Widget eingefügt werden. Changelog: Einstellbares Widget im Admin hinzugefügt. Abhängigkeiten Aktualisiert Adapter erfordert nun Node.js >= 22. To-Do Danke an alle fürs Testen.
  • Tester gesucht: Zigbee 3.4.2

    62
    2
    4 Stimmen
    62 Beiträge
    989 Aufrufe
    S
    @asgothian meine Änderung hast du per Chat: [image: 1778277899429-51ecf96b-0e62-4176-8947-4ad4fda59d30-image.jpeg]
  • Test Adapter smartloadmanager v0.0.x latest Repo

    Verschoben
    87
    5 Stimmen
    87 Beiträge
    9k Aufrufe
    rtwlR
    Hat sich erledigt - hab mir ein Blockly gebaut. Leider ist der Adapter (noch) nicht übersichtlich und intuitiv bedienbar. Sollte sich das mal ändern, werde ich hier nochmal einen Versuch starten.
  • Test Widget json template

    Verschoben adapter json widget rssfeed vis widget
    51
    2 Stimmen
    51 Beiträge
    7k Aufrufe
    OliverIOO
    Die Dokumentation wurde mit dem use case simple gauge erweitert [image: 1778106656604-73769cf8-623a-4e17-9909-4eb3822e6582-image.jpeg] https://github.com/oweitman/ioBroker.vis-jsontemplate/blob/main/documentation/usecase-simplegauge.md der im Rahmend des threads https://forum.iobroker.net/topic/84481/ich-frag-jetzt-einfach-mal-suche-slider-oder-gauge/12?_=1778106594527 entstanden ist
  • 5 Stimmen
    2k Beiträge
    934k Aufrufe
    hardwarefehlerH
    0.8.2, Ist der Bezugswert einer Überschreibung allein die Datenquelle aus den Basic-Einstellungen oder sollte die Addition/Subtraktion aus der erweiterten Einstellung mit einbezogen werden? [image: 1778089465223-ueberschreibung-from-2026-05-06-18-59-34.png] In meinem Beispiel färbe ich oben Datenpunkte ohne Subtraktion, z.B. DP.A.1, auf der rechten Seite mit einer Subtraktion, z.B. DP.A.1 – DP.B.1, trotzdem folgt die Überschreibung nur dem DP.A.1, sonst müßten die 73 W braun sein. { "<=0": { "fill": "#00FF00" }, ">0": { "fill": "#b37b1b" }, ">999": { "fill": "#FF0000" } } Ist das so intendiert oder gibt es innhalb des Adapters eine Lösung (also ohne die Differenz außerhalb zu berechnen)?
  • Test Adapter Fiat Jeep v0.0.x

    Verschoben
    161
    2
    1 Stimmen
    161 Beiträge
    31k Aufrufe
    themuckT
    Hier mein Script das Ladeplan 2/3 ausliest aber so wieder mit zurück gibt. Wenn das Auto abgeschlossen ist hats geklappt :D. Bei meinen Versuchen lag der Schlüssel immer im Auto. Dann zogen die Pläne irgendwie nicht. /** * ============================================================ * Fiat 500e – Zielladungs-Script für ioBroker JavaScript * ============================================================ * Autor: basierend auf Blockly-Script von alw (ioBroker Forum) * Version: 2.2.0 * * Funktion: * - Erkennt automatisch wenn das Ladekabel eingesteckt wird * - Lädt das Auto bis zum konfigurierbaren Ladeziel (default 80%) * - Stoppt das Laden automatisch wenn das Ziel erreicht ist * - Ladeplan 3 (schedules03) dient als Fernschalter (via Fiat App) * - Debug-Ausgabe via ioBroker-Log * - Robuste Fehlerbehandlung und Timeout-Schutz * * Voraussetzungen: * - ioBroker JavaScript-Adapter * - Fiat-Adapter installiert und konfiguriert * * Konfiguration: * - VIN anpassen (ZFAXXX...) * - adapterInstance anpassen falls der Fiat-Adapter nicht als "fiat.0" läuft * - Datenpunkt für Ladeziel wird automatisch erstellt * ============================================================ */ // ============================================================ // IIFE – kapselt alle Variablen damit es keine Konflikte // mit anderen ioBroker-Scripts im globalen Scope gibt // ============================================================ (function () { // ============================================================ // KONFIGURATION – hier anpassen // ============================================================ const CONFIG = { // Fahrzeug-Identifikationsnummer (VIN / FIN) vin: 'ZFAXXX...', // Instanz des Fiat-Adapters (z.B. 'fiat.0', 'fiat.1', 'meinAdapter.0') adapterInstance: 'fiat.0', // ioBroker Datenpunkt-Pfad für das Ladeziel (wird automatisch erstellt) // Wert kann in ioBroker-Admin oder VIS geändert werden chargeTargetDP: 'javascript.0.fiat.chargeTarget', // Standard-Ladeziel in Prozent (wird beim ersten Start gesetzt) chargeTargetDefault: 80, // Ladeplan-Zeiten: Laden aktiv (fast ganzer Tag) chargeStart: '00:00', chargeEnd: '23:55', // Ladeplan-Zeiten: Laden blockiert (5-Minuten-Fenster das nie kommt) noChargeStart: '00:00', noChargeEnd: '00:05', // Wie oft (in Minuten) der Ladestand während des Ladens abgefragt wird pollIntervalMinutes: 10, // Maximale Ladezeit in Stunden bevor das Script abbricht (Schutz vor Endlos-Schleife) maxChargeHours: 48, // ioBroker Datenpunkt für Debug-Nachrichten (wird automatisch angelegt) debugDP: 'javascript.0.fiat.debug', // Erstinitialisierung: einmalig auf TRUE setzen (Kabel muss draußen sein!) // Script sendet dann den No-Charge-Plan ans Auto und setzt den Wert selbst zurück. initializedDP: 'javascript.0.fiat.initialized', }; // ============================================================ // INTERNE VARIABLEN – nicht ändern // ============================================================ let pollInterval = null; // Referenz auf den aktiven Poll-Timer let chargeStartTime = null; // Zeitstempel wann das Laden begann (für Timeout) let isCharging = false; // Interner Status ob wir gerade steuern // Abgeleitete ioBroker Datenpfade aus Adapter-Instanz und VIN const _base = `${CONFIG.adapterInstance}.${CONFIG.vin}`; const DP = { plugInStatus: `${_base}.status.evInfo.battery.plugInStatus`, stateOfCharge: `${_base}.status.evInfo.battery.stateOfCharge`, schedules03enable: `${_base}.status.evInfo.schedules03.enableScheduleType`, s01_startTime: `${_base}.status.evInfo.schedules01.startTime`, s01_endTime: `${_base}.status.evInfo.schedules01.endTime`, deepRefresh: `${_base}.remote.DEEPREFRESH`, cpplus: `${_base}.remote.CPPLUS`, }; // ============================================================ // MODUL: Logging // Schreibt ins ioBroker-Log UND in den Datenpunkt javascript.0.fiat.debug // ============================================================ function log(level, message) { const timestamp = new Date().toISOString(); const fullMessage = `[Fiat500e] ${message}`; if (level === 'error') { console.error(fullMessage); } else if (level === 'warn') { console.warn(fullMessage); } else { console.log(fullMessage); } setState(CONFIG.debugDP, JSON.stringify({ timestamp: timestamp, level: level, message: message, vin: CONFIG.vin, }), true); } // ============================================================ // MODUL: Ladeziel lesen // Liest den konfigurierbaren Ladeziel-Datenpunkt // ============================================================ function getChargeTarget() { const val = getState(CONFIG.chargeTargetDP).val; // Plausibilitäts-Check: muss zwischen 20 und 100 liegen if (typeof val === 'number' && val >= 20 && val <= 100) { return val; } log('warn', `Ungültiges Ladeziel (${val}), nutze Default: ${CONFIG.chargeTargetDefault}%`); return CONFIG.chargeTargetDefault; } // ============================================================ // MODUL: Einzelnen Schedule aus Datenpunkten lesen // Liest alle Felder eines Plans einzeln aus ioBroker und // gibt ein fertiges Objekt zurück – unverändert wie im Auto // ============================================================ function readSchedule(nr) { const base = `${CONFIG.adapterInstance}.${CONFIG.vin}.status.evInfo.schedules0${nr}`; return { cabinPriority: getState(`${base}.cabinPriority`).val || false, chargeToFull: getState(`${base}.chargeToFull`).val || false, enableScheduleType: getState(`${base}.enableScheduleType`).val || false, endTime: getState(`${base}.endTime`).val || '00:00', repeatSchedule: getState(`${base}.repeatSchedule`).val || false, scheduleType: getState(`${base}.scheduleType`).val || 'CHARGE', scheduledDays: { friday: getState(`${base}.scheduledDays.friday`).val || false, monday: getState(`${base}.scheduledDays.monday`).val || false, saturday: getState(`${base}.scheduledDays.saturday`).val || false, sunday: getState(`${base}.scheduledDays.sunday`).val || false, thursday: getState(`${base}.scheduledDays.thursday`).val || false, tuesday: getState(`${base}.scheduledDays.tuesday`).val || false, wednesday: getState(`${base}.scheduledDays.wednesday`).val || false, }, startTime: getState(`${base}.startTime`).val || '00:00', }; } // ============================================================ // MODUL: Ladeplan setzen // - Plan 1: wird hardcoded gesetzt (nur Zeiten dynamisch) // - Plan 2 & 3: live vom Auto gelesen und unverändert zurückgeschickt // - Alles als JSON-String an CPPLUS senden // ============================================================ function setChargeSchedule(startTime, endTime, callback) { log('info', `Setze Ladeplan: ${startTime} – ${endTime}`); // Plan 1: Ladeplan – nur Zeiten und Tage werden gesetzt const plan1 = { cabinPriority: false, chargeToFull: false, enableScheduleType: true, endTime: endTime, repeatSchedule: true, scheduleType: 'CHARGE', scheduledDays: { friday: true, monday: true, saturday: true, sunday: true, thursday: true, tuesday: true, wednesday: true, }, startTime: startTime, }; // Plan 2 & 3: unverändert vom Auto lesen const plan2 = readSchedule(2); const plan3 = readSchedule(3); log('info', `Plan 2 gelesen: ${plan2.scheduleType} ${plan2.startTime}–${plan2.endTime}`); log('info', `Plan 3 gelesen: ${plan3.scheduleType} ${plan3.startTime}–${plan3.endTime}`); // Alle 3 Pläne als JSON-String an CPPLUS senden setState(DP.cpplus, JSON.stringify([plan1, plan2, plan3]), false, (err) => { if (err) { log('error', `Fehler beim Setzen des Ladeplans: ${err}`); if (typeof callback === 'function') callback(err); return; } log('info', `Ladeplan gesendet: ${startTime} – ${endTime}`); if (typeof callback === 'function') callback(null); }); } // ============================================================ // MODUL: Deep Refresh // Fordert aktuelle Fahrzeugdaten vom Fiat-Server an // ============================================================ function triggerDeepRefresh(callback) { log('info', 'Starte Deep Refresh...'); setState(DP.deepRefresh, true, false, (err) => { if (err) { log('error', `Deep Refresh fehlgeschlagen: ${err}`); if (typeof callback === 'function') callback(err); return; } // 30 Sekunden warten bis die Daten vom Auto angekommen sind setTimeout(() => { log('info', 'Deep Refresh abgeschlossen'); if (typeof callback === 'function') callback(null); }, 30000); }); } // ============================================================ // MODUL: Lade-Polling stoppen // Räumt den aktiven Poll-Timer auf // ============================================================ function stopPolling() { if (pollInterval !== null) { clearInterval(pollInterval); pollInterval = null; log('info', 'Lade-Polling gestoppt'); } isCharging = false; } // ============================================================ // MODUL: Laden beenden // Setzt den "No Charge" Plan und stoppt das Polling // ============================================================ function stopCharging(reason) { log('info', `Lade-Stopp: ${reason}`); stopPolling(); setChargeSchedule(CONFIG.noChargeStart, CONFIG.noChargeEnd, (err) => { if (!err) { log('info', 'Auto wurde auf "Nicht laden" gesetzt – bereit für nächsten Zyklus'); } }); } // ============================================================ // MODUL: Lade-Polling starten // Prüft alle X Minuten den Ladestand und stoppt bei Zielerreichung // ============================================================ function startPolling() { if (isCharging) { log('warn', 'Polling läuft bereits – kein Doppelstart'); return; } isCharging = true; chargeStartTime = Date.now(); const maxChargeMs = CONFIG.maxChargeHours * 60 * 60 * 1000; log('info', `Lade-Polling gestartet (alle ${CONFIG.pollIntervalMinutes} min, max ${CONFIG.maxChargeHours}h)`); pollInterval = setInterval(() => { // Timeout-Schutz: Nach maxChargeHours abbrechen if (Date.now() - chargeStartTime > maxChargeMs) { log('warn', `Timeout nach ${CONFIG.maxChargeHours}h – Laden wird gestoppt`); stopCharging('Timeout erreicht'); return; } // Kabel noch drin? const plugged = getState(DP.plugInStatus).val; if (!plugged) { log('info', 'Kabel wurde gezogen – Polling wird gestoppt'); stopPolling(); return; } // Notaus aktiv (schedules03)? const emergencyStop = getState(DP.schedules03enable).val; if (emergencyStop) { log('info', 'Notaus aktiv (schedules03=true) – Polling wird gestoppt'); stopPolling(); return; } // Deep Refresh um aktuellen Ladestand zu bekommen triggerDeepRefresh(() => { const soc = getState(DP.stateOfCharge).val; const target = getChargeTarget(); log('info', `Ladestand: ${soc}% / Ziel: ${target}%`); if (soc >= target) { stopCharging(`Ladeziel ${target}% erreicht (aktuell ${soc}%)`); } }); }, CONFIG.pollIntervalMinutes * 60 * 1000); } // ============================================================ // MODUL: Kabelstatus geändert – Hauptlogik // ============================================================ function onPlugStatusChange(obj) { const plugged = obj.state.val; const soc = getState(DP.stateOfCharge).val; const target = getChargeTarget(); const emergency = getState(DP.schedules03enable).val; log('info', `Kabelstatus geändert: ${plugged ? 'Eingesteckt' : 'Gezogen'} | SOC: ${soc}% | Ziel: ${target}%`); // Kabel gezogen → aufräumen if (!plugged) { log('info', 'Kabel gezogen – Script wartet auf nächstes Einstecken'); stopPolling(); // Ladeplan für nächstes Mal vorbereiten (Charge-Zeiten wiederherstellen) if (!emergency) { setChargeSchedule(CONFIG.chargeStart, CONFIG.chargeEnd, () => { log('info', 'Ladeplan für nächsten Zyklus vorbereitet'); }); } return; } // Kabel eingesteckt → prüfen ob wir steuern sollen if (emergency) { log('info', 'Notaus aktiv (schedules03=true) – Script ist deaktiviert'); return; } if (soc >= target) { log('info', `Ladestand ${soc}% bereits >= Ziel ${target}% – kein Laden nötig`); stopCharging('Bereits am Ziel beim Einstecken'); return; } // Laden starten log('info', `Starte Zielladung auf ${target}% (aktuell ${soc}%)`); // Erst Deep Refresh für genauen Startladestand triggerDeepRefresh(() => { const socFresh = getState(DP.stateOfCharge).val; log('info', `Ladestand nach Refresh: ${socFresh}%`); if (socFresh >= target) { log('info', 'Bereits am Ziel nach Refresh – kein Laden nötig'); stopCharging('Bereits am Ziel nach Deep Refresh'); return; } // Ladeplan aktivieren setChargeSchedule(CONFIG.chargeStart, CONFIG.chargeEnd, (err) => { if (err) { log('error', 'Ladeplan konnte nicht gesetzt werden – abbruch'); return; } // Polling starten startPolling(); }); }); } // ============================================================ // INITIALISIERUNG // Wird einmal beim Script-Start ausgeführt // ============================================================ function init() { log('info', '=== Fiat 500e Zielladungs-Script gestartet ==='); log('info', `VIN: ${CONFIG.vin}`); // Ladeziel-Datenpunkt erstellen falls er noch nicht existiert createState(CONFIG.chargeTargetDP, CONFIG.chargeTargetDefault, { name: 'Fiat 500e Ladeziel (%)', type: 'number', unit: '%', min: 20, max: 100, role: 'value', desc: 'Ladeziel für die automatische Zielladung (20-100%)', }, () => { log('info', `Ladeziel-Datenpunkt bereit: ${CONFIG.chargeTargetDP}`); }); // Debug-Datenpunkt erstellen falls er noch nicht existiert createState(CONFIG.debugDP, '', { name: 'Fiat 500e Debug', type: 'string', role: 'value', desc: 'Letzter Debug-Log-Eintrag als JSON (timestamp, level, message)', }, () => { log('info', `Debug-Datenpunkt bereit: ${CONFIG.debugDP}`); }); // Initialisierungs-Datenpunkt erstellen // Auf TRUE setzen (Kabel draußen!) um einmalig den No-Charge-Plan ans Auto zu senden createState(CONFIG.initializedDP, false, { name: 'Fiat 500e Initialisierung auslösen', type: 'boolean', role: 'button', desc: 'Einmalig TRUE setzen (Kabel muss draußen sein!) – Script sendet No-Charge-Plan und setzt Wert zurück', }, () => { log('info', `Initialisierungs-Datenpunkt bereit: ${CONFIG.initializedDP}`); // Auf Änderung horchen – wenn auf TRUE gesetzt wird No-Charge-Plan gesendet on({ id: CONFIG.initializedDP, val: true }, () => { const plugged = getState(DP.plugInStatus).val; if (plugged) { log('warn', 'Initialisierung abgebrochen – Kabel ist noch eingesteckt! Bitte zuerst Kabel ziehen.'); setState(CONFIG.initializedDP, false, true); return; } log('info', 'Initialisierung: sende No-Charge-Plan ans Auto...'); setChargeSchedule(CONFIG.noChargeStart, CONFIG.noChargeEnd, (err) => { if (!err) { log('info', 'Initialisierung abgeschlossen – No-Charge-Plan gesetzt. Kabel kann jetzt eingesteckt werden.'); } setState(CONFIG.initializedDP, false, true); }); }); }); // Aktuellen Status beim Start prüfen // (falls Script neu gestartet wurde während Kabel schon steckt) const plugged = getState(DP.plugInStatus).val; const soc = getState(DP.stateOfCharge).val; const emergency = getState(DP.schedules03enable).val; log('info', `Startstatus: Kabel=${plugged}, SOC=${soc}%, Notaus=${emergency}`); if (plugged && !emergency) { const target = getChargeTarget(); if (soc < target) { log('info', 'Kabel steckt bereits beim Start – starte Zielladung'); onPlugStatusChange({ state: { val: true } }); } else { log('info', 'Kabel steckt, aber Ziel bereits erreicht – kein Laden nötig'); } } // Auf Kabelstatus-Änderungen horchen on({ id: DP.plugInStatus, change: 'ne' }, onPlugStatusChange); log('info', `Warte auf Kabeländerungen an: ${DP.plugInStatus}`); log('info', '=== Initialisierung abgeschlossen ==='); } // ============================================================ // START // ============================================================ init(); })(); // Ende IIFE

587

Online

32.9k

Benutzer

83.0k

Themen

1.3m

Beiträge