Weiter zum Inhalt
  • Home
  • Aktuell
  • Tags
  • 0 Ungelesen 0
  • Kategorien
  • Unreplied
  • Beliebt
  • GitHub
  • Docu
  • Hilfe
Skins
  • Hell
  • Brite
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dunkel
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Standard: (Kein Skin)
  • Kein Skin
Einklappen
ioBroker Logo

Community Forum

donate donate
  1. ioBroker Community Home
  2. Deutsch
  3. Tester
  4. Test Adapter Fiat Jeep v0.0.x

NEWS

  • Neues YouTube-Video: Visualisierung im Devices-Adapter
    BluefoxB
    Bluefox
    13
    1
    614

  • Neuer ioBroker-Blog online: Monatsrückblick März/April 2026
    BluefoxB
    Bluefox
    8
    1
    2.0k

  • Verwendung von KI bitte immer deutlich kennzeichnen
    HomoranH
    Homoran
    11
    1
    883

Test Adapter Fiat Jeep v0.0.x

Geplant Angeheftet Gesperrt Verschoben Tester
161 Beiträge 36 Kommentatoren 31.9k Aufrufe 34 Beobachtet
  • Älteste zuerst
  • Neuste zuerst
  • Meiste Stimmen
Antworten
  • In einem neuen Thema antworten
Anmelden zum Antworten
Dieses Thema wurde gelöscht. Nur Nutzer mit entsprechenden Rechten können es sehen.
  • M MikeRow

    @sigma415 500e iOS App Version 1.97.9 unter EreignisplanIMG_4234.png

    sigma415S Offline
    sigma415S Offline
    sigma415
    schrieb am zuletzt editiert von sigma415
    #144

    @mikerow Danke für deine prompte Antwort.
    Leider fehlt bei uns da die Einstellmöglichkeit für (Lade-) "Geschwindigkeit". Kommt auch nichts unter "Plan bearbeiten".

    Wann wurde dein 500e gebaut ? (Unserer ist aus der allerersten Serie, Zulassung in 12/2020)

    Und welche Abos hast Du bei Fiat ?
    Wir haben: MyCar, MyNavigation und MyRemote.
    Und bei MyRemote heißt es jetzt (neuerdings ?) sogar: "Einstellung des Ladepegels"

    Allerdings war es beim (teuren) Renewal des MyCar-Abos nach 3 Jahren schon ein mittleres Drama, bis endlich nur mal wieder der SoC angezeigt wurde. :(

    IMG_2345.PNG

    2025-01-18_14h51_22.png

    1 Antwort Letzte Antwort
    0
    • T Offline
      T Offline
      topsurfer
      schrieb am zuletzt editiert von
      #145

      Hallo,
      habe auch den Adapter installiert, funktioniert mit dem Jeep Avenger auch prinzipiell, danke!

      Wie auch in der App wird der aktuelle Ladezustand etc. nur sporadisch aktualisiert, in der App hilft ja oft ein setzen eines Zeitplans, damit der Akkustand aktualisiert wird. Ist ja ein leidiges und bekanntes Problem ...

      Hier hab ich was vom setzen von Deep Refresh gelesen, der ist / war bei mir schon auf true gesetzt (wenn ich das richtig deute).

      Ist es möglich über Blockly oder js das gleiche zu initiieren, was der Trick über Zeitplan-speichern bewirkt: Dass die Daten also (z.B. alle 5 Minuten) wirklich aktualisiert werden?

      T ioBroker23I 2 Antworten Letzte Antwort
      0
      • T topsurfer

        Hallo,
        habe auch den Adapter installiert, funktioniert mit dem Jeep Avenger auch prinzipiell, danke!

        Wie auch in der App wird der aktuelle Ladezustand etc. nur sporadisch aktualisiert, in der App hilft ja oft ein setzen eines Zeitplans, damit der Akkustand aktualisiert wird. Ist ja ein leidiges und bekanntes Problem ...

        Hier hab ich was vom setzen von Deep Refresh gelesen, der ist / war bei mir schon auf true gesetzt (wenn ich das richtig deute).

        Ist es möglich über Blockly oder js das gleiche zu initiieren, was der Trick über Zeitplan-speichern bewirkt: Dass die Daten also (z.B. alle 5 Minuten) wirklich aktualisiert werden?

        T Offline
        T Offline
        topsurfer
        schrieb am zuletzt editiert von
        #146

        Hallo,
        zwar gab es auf meine letzte Frage noch keinen Hinweis, aber jetzt hab ich auch noch eine andere Frage ;-)

        Es gibt ja die DP "Timestamp", mit Inhalten wie:
        1741962253572 (von heute)

        Wie kann ich hieraus normales Datum und Uhreit berechnen, ist wohl kein Unix-Date Format

        Thx!

        ioBroker23I 1 Antwort Letzte Antwort
        0
        • T topsurfer

          Hallo,
          zwar gab es auf meine letzte Frage noch keinen Hinweis, aber jetzt hab ich auch noch eine andere Frage ;-)

          Es gibt ja die DP "Timestamp", mit Inhalten wie:
          1741962253572 (von heute)

          Wie kann ich hieraus normales Datum und Uhreit berechnen, ist wohl kein Unix-Date Format

          Thx!

          ioBroker23I Offline
          ioBroker23I Offline
          ioBroker23
          schrieb am zuletzt editiert von
          #147

          @topsurfer

          so geht es hier !!

          Bildschirmfoto 2025-03-17 um 15.19.09.jpg

          1 Antwort Letzte Antwort
          1
          • T topsurfer

            Hallo,
            habe auch den Adapter installiert, funktioniert mit dem Jeep Avenger auch prinzipiell, danke!

            Wie auch in der App wird der aktuelle Ladezustand etc. nur sporadisch aktualisiert, in der App hilft ja oft ein setzen eines Zeitplans, damit der Akkustand aktualisiert wird. Ist ja ein leidiges und bekanntes Problem ...

            Hier hab ich was vom setzen von Deep Refresh gelesen, der ist / war bei mir schon auf true gesetzt (wenn ich das richtig deute).

            Ist es möglich über Blockly oder js das gleiche zu initiieren, was der Trick über Zeitplan-speichern bewirkt: Dass die Daten also (z.B. alle 5 Minuten) wirklich aktualisiert werden?

            ioBroker23I Offline
            ioBroker23I Offline
            ioBroker23
            schrieb am zuletzt editiert von ioBroker23
            #148

            Hier hab ich was vom setzen von Deep Refresh gelesen, der ist / war bei mir schon auf true gesetzt (wenn ich das richtig deute).

            Ist es möglich über Blockly oder js das gleiche zu initiieren, was der Trick über Zeitplan-speichern bewirkt: Dass die Daten also (z.B. alle 5 Minuten) wirklich aktualisiert werden?

            Bildschirmfoto 2025-03-17 um 15.43.56.jpg

            das setze ich automatisch zurück wenn der wert auf wahr gesetzt wird

            und dann noch das alle 5 min wenn der verbrauch der WB über 400 watt ist

            Bildschirmfoto 2025-03-17 um 15.46.06.jpg

            1 Antwort Letzte Antwort
            0
            • T Offline
              T Offline
              topsurfer
              schrieb am zuletzt editiert von topsurfer
              #149

              ... checking again ...

              T 1 Antwort Letzte Antwort
              0
              • T topsurfer

                ... checking again ...

                T Offline
                T Offline
                topsurfer
                schrieb am zuletzt editiert von topsurfer
                #150

                Doch eine Frage ...
                Den Status vom DP, den du setzt, befindet sich wo genau im Fiat.Baum?
                Ist es einer von diesen?
                2025-03-18_170043.png

                Und Verständnisfrage:
                Im oberen der zwei Scripte prüfst du, ob der DeepRefreshChargingState sich auf "wahr" geändert hat, dann setzt du diesen auf wieder: "false.
                Im unteren Script, check alle 5 Minuten ob die Walllbox > 400W zieht; wenn ja: Setze DeepRefreshChargingState auf "wahr"

                Wie genau wird da dem Fiat-Service "mitgeteilt", wieder aktuelle Statusinfos zu senden?

                J 1 Antwort Letzte Antwort
                0
                • T topsurfer

                  Doch eine Frage ...
                  Den Status vom DP, den du setzt, befindet sich wo genau im Fiat.Baum?
                  Ist es einer von diesen?
                  2025-03-18_170043.png

                  Und Verständnisfrage:
                  Im oberen der zwei Scripte prüfst du, ob der DeepRefreshChargingState sich auf "wahr" geändert hat, dann setzt du diesen auf wieder: "false.
                  Im unteren Script, check alle 5 Minuten ob die Walllbox > 400W zieht; wenn ja: Setze DeepRefreshChargingState auf "wahr"

                  Wie genau wird da dem Fiat-Service "mitgeteilt", wieder aktuelle Statusinfos zu senden?

                  J Offline
                  J Offline
                  jbartels
                  schrieb am zuletzt editiert von
                  #151

                  @topsurfer

                  hier fiat.0.ZACxxxx.remote.DEEPREFRESH

                  also deine fahrgestellnr und den rest

                  T 1 Antwort Letzte Antwort
                  0
                  • J jbartels

                    @topsurfer

                    hier fiat.0.ZACxxxx.remote.DEEPREFRESH

                    also deine fahrgestellnr und den rest

                    T Offline
                    T Offline
                    topsurfer
                    schrieb am zuletzt editiert von
                    #152

                    @jbartels
                    OK, den Wert hab ich gefunden,
                    und wenn ich diesen in iob auf "true" setze, wird der Fiat Server (?) angetriggert, die Statusinformationen neu zu lesen und diese aktuellen Infos dann in der App (und dann in iob) darzustellen?
                    Und den Deeprefresh-Wert muss ich dann nach wie viel Minuten (oder Sekunden?) wieder auf "false" stellen?

                    (In der App und in iob unter "location" werden mir jetzt z.B. noch die Koordinaten angezeigt, wo das Auto vor 23 Stunden war - Gleiches zum Ladezustand - alte Werte. Das möchte ich gerne etwas aktueller "haben". Sollte dies der Deeprefresh machen ?)
                    :-(

                    J 1 Antwort Letzte Antwort
                    0
                    • T topsurfer

                      @jbartels
                      OK, den Wert hab ich gefunden,
                      und wenn ich diesen in iob auf "true" setze, wird der Fiat Server (?) angetriggert, die Statusinformationen neu zu lesen und diese aktuellen Infos dann in der App (und dann in iob) darzustellen?
                      Und den Deeprefresh-Wert muss ich dann nach wie viel Minuten (oder Sekunden?) wieder auf "false" stellen?

                      (In der App und in iob unter "location" werden mir jetzt z.B. noch die Koordinaten angezeigt, wo das Auto vor 23 Stunden war - Gleiches zum Ladezustand - alte Werte. Das möchte ich gerne etwas aktueller "haben". Sollte dies der Deeprefresh machen ?)
                      :-(

                      J Offline
                      J Offline
                      jbartels
                      schrieb am zuletzt editiert von jbartels
                      #153

                      @topsurfer

                      wenn ich den DEEPREFRESH setze kommt in der app die meldung z.b. ladestatus wurde aktualisiert.

                      standort ist so eine sache die wohl ehr zufällig mal geändert wird.

                      du must bedenken das es etwas dauert bis die daten vom sco kommen.

                      bei mir steht das der adapter alle 5 min daten bei fiat abholt. also kann es 5 min dauern bis die neuen daten da sind. dann noch bedenken das ist handynetz (vermutlich o2 can not do) je nachdem wo das auto steht ist da evt keine empfang und es tut sich nix :-( kannst ja auch test die lampen blinken zu lassen um zu sehen ob das auto anfragen annimmt und wie lange es dauert bis der befehl abgearbeitet wird.

                      setze den status nach 5 sec zurück wenn sich der wert ändert. das betrifft auch anforderungen z.b. vom EVCC beim laden

                      ich hoffe das hilft dir etwas

                      T 1 Antwort Letzte Antwort
                      0
                      • J jbartels

                        @topsurfer

                        wenn ich den DEEPREFRESH setze kommt in der app die meldung z.b. ladestatus wurde aktualisiert.

                        standort ist so eine sache die wohl ehr zufällig mal geändert wird.

                        du must bedenken das es etwas dauert bis die daten vom sco kommen.

                        bei mir steht das der adapter alle 5 min daten bei fiat abholt. also kann es 5 min dauern bis die neuen daten da sind. dann noch bedenken das ist handynetz (vermutlich o2 can not do) je nachdem wo das auto steht ist da evt keine empfang und es tut sich nix :-( kannst ja auch test die lampen blinken zu lassen um zu sehen ob das auto anfragen annimmt und wie lange es dauert bis der befehl abgearbeitet wird.

                        setze den status nach 5 sec zurück wenn sich der wert ändert. das betrifft auch anforderungen z.b. vom EVCC beim laden

                        ich hoffe das hilft dir etwas

                        T Offline
                        T Offline
                        topsurfer
                        schrieb am zuletzt editiert von
                        #154

                        Hi und danke für deine Erläuterungen!

                        @jbartels said in Test Adapter Fiat Jeep v0.0.x:

                        bei mir steht das der adapter alle 5 min daten bei fiat abholt

                        Kurze frage,wo "steht" das bei dir? In einem DP oder in deinem Script?

                        T 1 Antwort Letzte Antwort
                        1
                        • T topsurfer

                          Hi und danke für deine Erläuterungen!

                          @jbartels said in Test Adapter Fiat Jeep v0.0.x:

                          bei mir steht das der adapter alle 5 min daten bei fiat abholt

                          Kurze frage,wo "steht" das bei dir? In einem DP oder in deinem Script?

                          T Offline
                          T Offline
                          topsurfer
                          schrieb am zuletzt editiert von
                          #155

                          So,
                          das Script (Deeprefresh alle 10 Minuten für 10 Sekunden) läuft jetzt seit 12 Stunden, aber wenn ich die DP vom Jeep Adapter anschaue, welche Timestamps enthalten, sehe ich keine aktuellen Zeitstempel,
                          die sind zwischen 12 Stunden und knapp 2 Tage alt :-(

                          (In der App wird mir ein immer noch ein Standort von vor 2 Tagen angezeigt - was soll das (@Jeep, und dafür zahlt man Geld ...))

                          Gibt es einen Timestamp, der sich beim DeepRefresh aktuallisert (bzw. aktuallisieren sollte) um zu sehen, ob der "Impuls" bei den Fiat Servern ankam und dort zumindest registriert wurde?

                          2025-04-17_110611.png

                          1 Antwort Letzte Antwort
                          0
                          • J Offline
                            J Offline
                            jbartels
                            schrieb am zuletzt editiert von jbartels
                            #156

                            @topsurfer said in Test Adapter Fiat Jeep v0.0.x:

                            @jbartels
                            OK, den Wert hab ich gefunden,
                            und wenn ich diesen in iob auf "true" setze, wird der Fiat Server (?) angetriggert, die Statusinformationen neu zu lesen und diese aktuellen Infos dann in der App (und dann in iob) darzustellen?
                            Und den Deeprefresh-Wert muss ich dann nach wie viel Minuten (oder Sekunden?) wieder auf "false" stellen?

                            das Deeprefresh wird immer beim setzen ausgeführt
                            um zu sehen was sich ändert habe ich das zurücksetzen auf unwahr wieder rausgeschmissen und setze beim änderungen abwechselnd wahr und unwahr.
                            klappt das denn jetzt bei dir?
                            kommt die meldung in der app?
                            benachrichtung in der app muss dazu aber an sein.

                            wenn der standort in der app nicht passt passt der auch bei der ioBroker abfrage nicht.

                            wenn du standort aktuell haben möchtest ist ein apple airtag im auto die erste wahl :-) da kannst du dann bei freunde sehen wo der jeep ist ;-)

                            zur zeit

                            Bildschirmfoto 2025-04-27 um 19.12.59.jpg

                            setzt das in ein lesbares format

                            1 Antwort Letzte Antwort
                            0
                            • MarcooFM Offline
                              MarcooFM Offline
                              MarcooF
                              schrieb am zuletzt editiert von
                              #157

                              Hallo zusammen und vielen Dank für diesen Adapter!

                              Ich habe damit keinerlei Probleme und nutze ihn Hauptsächlich um Informationen über Mqtt zu NodeRed zu schicken.

                              Ich habe nun auch in der Fiat App die Möglichkeit die Ladestufe einzustellen.
                              Das klappt auch wenn der Ladevorgang läuft.

                              Ich sehe den Punkt, kann aber den "Wert" über einen http request nicht ändern.
                              Würde ich sehr gerne machen, um meine PV Überschussladung schon bei 2000 W starten zu können.
                              Was ca. Ladestufe 1 entspricht. Und dann dynamisch hochziehen bis Ladestufe 5 je nach Überschuss….
                              Vielleicht hat da jemand von euch schon eine Lösung.
                              Gruß Marco

                              chargePower.png

                              1 Antwort Letzte Antwort
                              0
                              • A Offline
                                A Offline
                                alw
                                schrieb am zuletzt editiert von alw
                                #158

                                gelöscht, war Nonsense

                                1 Antwort Letzte Antwort
                                0
                                • JB1985J Offline
                                  JB1985J Offline
                                  JB1985
                                  schrieb am zuletzt editiert von JB1985
                                  #159

                                  Hallo zusammen,

                                  ich habe auch den Adapter installiert und es funktioniert!

                                  Kann man den Batterieladestand auch sehen, wenn man in der App diese nicht sieht, weil man das entsprechende Abo nicht hat? Ich habe nur das Abo "My Remote Renewal" gebucht und dachte da würde man auch den Status der Batterie sehen, aber nein, dafür ist dann ein anderes Abo nötig.

                                  Gibt es eine Möglichkeit den Status des Akkus über iobroker zu sehen?

                                  *** Edit

                                  Scheint doch alles möglich zu sein. Hab die Daten vom Akku.

                                  1 Antwort Letzte Antwort
                                  0
                                  • HomoranH Homoran verschob dieses Thema von Tester am
                                  • HomoranH Homoran verschob dieses Thema von ...nicht in offiziellem Repo am
                                  • A alw

                                    Zielladung mit Fiat 500e, auch unterwegs ohne Zugriff auf die Wallbox
                                    Eine verbesserte Version des Skripts ist zum Importieren angehängt. ZFAxxxx muss durch eure eigene vin (=FIN) ersetzt werden. Abfrageintervall des Fiat Adapters ist 15 min.
                                    Das IOBroker Blockly Skript erkennt plug-in, checkt während des Ladens alle 10 min den Ladestand, lädt auf 80 %, und stoppt den Ladevorgang dann automatisch im Fahrzeug.
                                    Wenn ihr z.B. die Ladezeit auf Nachtstrom von 0:00 - 08:00 begrenzen wollt, einfach Chargeperiod_start auf 00:00 lassen und Chargeperiod_end auf 08:00 ändern.
                                    Damit man das Skript auch von unterwegs de-aktivieren kann, fragt es ab ob Ladeprogramm 3 aktiv ist und macht dann gar nichts. Also zum de-aktivieren einfach Ladeprogramm 3 aktiv setzen, im Auto oder mit der App.
                                    Die Ladeautomatik wird auch inaktiv, wenn man per Gummiknopf im Ladeport oder per "Sofort laden" in der App den Scheduler überstimmt, dann lädt er auf 100 %.
                                    Ladeprogramm 1 wird vom Skript gesetzt / überschrieben. Programm 2 (Default Klima) kann man eigentlich unabhängig benutzen, wird aber derzeit überschrieben. Muss ich noch ändern...
                                    Charge_to_target3.xml IObroker_script2.jpg

                                    themuckT Offline
                                    themuckT Offline
                                    themuck
                                    schrieb am zuletzt editiert von themuck
                                    #160

                                    @alw

                                    erstmal danke für die Arbeit, ich hab den Adapter von Blockly zu JS angepasst. Die Zeiten kommen im Auto an, aber der Ladevorgang bricht nicht ab. Es wird munter weiter geladen :/. Es steht dann bei den Ladeplänen unten... nächste Ausführung, Die, 0:00-0:05.

                                    Es werden ja eigentlich nur die Zeiten geändert oder muss ich im Auto nach was umstellen? Eigentlich schreibt dein Blockly doch nur die Zeiten neu?

                                    Überschrieben wird es durch den Gummiknopf und Sofort laden in der App oder?

                                    Grüße Malte

                                    Edit: kann es sein das die Zeit Programme nur abgearbeitet werden wenn das Auto Abgeschlossen ist?

                                    1 Antwort Letzte Antwort
                                    0
                                    • themuckT Offline
                                      themuckT Offline
                                      themuck
                                      schrieb am zuletzt editiert von
                                      #161

                                      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
                                      
                                      1 Antwort Letzte Antwort
                                      0

                                      Hey! Du scheinst an dieser Unterhaltung interessiert zu sein, hast aber noch kein Konto.

                                      Hast du es satt, bei jedem Besuch durch die gleichen Beiträge zu scrollen? Wenn du dich für ein Konto anmeldest, kommst du immer genau dorthin zurück, wo du zuvor warst, und kannst dich über neue Antworten benachrichtigen lassen (entweder per E-Mail oder Push-Benachrichtigung). Du kannst auch Lesezeichen speichern und Beiträge positiv bewerten, um anderen Community-Mitgliedern deine Wertschätzung zu zeigen.

                                      Mit deinem Input könnte dieser Beitrag noch besser werden 💗

                                      Registrieren Anmelden
                                      Antworten
                                      • In einem neuen Thema antworten
                                      Anmelden zum Antworten
                                      • Älteste zuerst
                                      • Neuste zuerst
                                      • Meiste Stimmen


                                      Support us

                                      ioBroker
                                      Community Adapters
                                      Donate

                                      415

                                      Online

                                      32.9k

                                      Benutzer

                                      83.0k

                                      Themen

                                      1.3m

                                      Beiträge
                                      Community
                                      Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen | Einwilligungseinstellungen
                                      ioBroker Community 2014-2025
                                      logo
                                      • Anmelden

                                      • Du hast noch kein Konto? Registrieren

                                      • Anmelden oder registrieren, um zu suchen
                                      • Erster Beitrag
                                        Letzter Beitrag
                                      0
                                      • Home
                                      • Aktuell
                                      • Tags
                                      • Ungelesen 0
                                      • Kategorien
                                      • Unreplied
                                      • Beliebt
                                      • GitHub
                                      • Docu
                                      • Hilfe