Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. ioBroker Allgemein
    4. Homematic HCU

    NEWS

    • Wir empfehlen: Node.js 22.x

    • Neuer Blog: Fotos und Eindrücke aus Solingen

    • ioBroker goes Matter ... Matter Adapter in Stable

    Homematic HCU

    This topic has been deleted. Only users with topic management privileges can see it.
    • L
      lichtraum @jamalau last edited by lichtraum

      Das von @jamalau beschriebene Problem tritt bei mir auch auf. Allerdings kann ich es nicht auf eine bestimmte Zeit eingrenzen. Es passiert meistens einmal am Tag - aber zu unterschiedlichsten Zeiten. Manchmal läuft der Adapter auch ohne Probleme zwei / drei Tage durch.

      Ich hatte schon überlegt, ein Issue auf Github zu erstellen, aber im Debug Log finde ich einfach keinen Eintrag dazu. Die Log-Einträge verstummen einfach mit Eintreten des Problems.

      Mein Workaround ist ein Skript, welches auf das letzte Update prüft und den Adapter neu startet, falls das Update zu lange her ist. Vielleicht hilft es jemanden:

      /* ------------- CONFIG ------------- */
      const TIME_TREASHOLD = 10 * 60 * 1000; // 10 minutes in ms - wie lange muss das letzte Lebenszeichen her sein
      const ATTEMPTS_TIME = 60 * 60 * 1000; // 60 minutes in ms - wie lange muss der letzte neustart her sein, damit es nicht als neuer Versuch gewertet wird
      const ATTEMPTS_TREASHOLD = 3;  // Anzahl maximaler Neustartversuche
      
      const WATCHING_INSTANCE = 'hmip.0';  // Instanz die überwacht werden soll
      
      /* ------------- SKRIPT ------------- */
      class HomematicWatcher {
          constructor() {
              this.states = [];
              this.latestUpdate = new Date('1990-01-01');
              this.lastRestart = new Date('1990-01-01');
              this.attempts = 0;
          }
      
          collectStates() {
              $(`${WATCHING_INSTANCE}.*`).each((id) => { 
                  if(existsState(id)) {
                      this.states.push(id);
                  }
              });
          }
      
          determineLastestUpdate() {
              for (let i = 0; i < this.states.length; i++) {
                  const lastUpdate = getState(this.states[i]).ts;
                  if (lastUpdate !== undefined) {
                      const lastUpdate_ts = new Date(lastUpdate);
                      if (lastUpdate_ts > this.latestUpdate) {
                          this.latestUpdate = lastUpdate_ts;
                      }
                  }
              }
          }
      
          checkForRestart() {
              if (new Date().getTime() - this.latestUpdate.getTime() > TIME_TREASHOLD) {            
                  // Instanz neu starten
                  this.restartInstance();
              } 
          }
         
          getInstanceState() {
              var obj_instance = getObject(`system.adapter.${WATCHING_INSTANCE}`);
              return obj_instance.common.enabled;
          }
         
          setInstanceState(val) {
              extendObject(`system.adapter.${WATCHING_INSTANCE}`, {common: {enabled: val}});
              console.warn(`HmIP Instanz ${WATCHING_INSTANCE} wurde ${val ? 'gestartet' : 'gestoppt'}`);  
          }
      
          restartInstance() {
              // Nur neu starten, wenn Instanz bereits läuft 
              if(this.getInstanceState() != false) {
              
                      // Anzahl der Neustartversuche zählen, wenn letzter Neustart weniger als ATTEMPTS_TIME her ist
                  if (new Date().getTime() - this.lastRestart.getTime() < ATTEMPTS_TIME) {      
                      this.attempts++;
                  } else {
                      this.attempts = 0;
                  }
      
                  try {
                      // Nur neu starten, wenn Anzahl der erlaubten Versuche noch nicht überschritten wurde
                      if (this.attempts <= ATTEMPTS_TREASHOLD) {                    
                          
                          // Instanz stoppen        
                          this.lastRestart = new Date();
                          this.setInstanceState(false);    
      
                          // Instanz starten
                          setTimeout(() => {                
                              this.lastRestart = new Date();
                              this.setInstanceState(true);  
                          }, 3000);          
                      } else {
                          console.error(`Instanz ${WATCHING_INSTANCE} wurde bereits ${this.attempts} mal neugestartet. Abbruch.`);
                      }
                  }
                  catch (e) {
                      console.error(`Fehler beim Neustart der Instanz ${WATCHING_INSTANCE}: ${e}`)
                  }
              }
          }
      }
      
      // Ausführen bei Skriptstart
      const watcher = new HomematicWatcher()
      watcher.collectStates();
      watcher.determineLastestUpdate();
      watcher.checkForRestart();
      
      // Schedule alle zwei Minuten
      schedule('*/2 * * * *', () => {
          watcher.determineLastestUpdate();
          watcher.checkForRestart();
      });
      
      J 1 Reply Last reply Reply Quote 0
      • J
        jamalau @lichtraum last edited by jamalau

        @lichtraum Hallo, erstmal danke für das Script, nur bin ich ein wenig unbeholfen, außerhalb von Blockly.
        Kannst du kurz erklären, wie ich das einbinde?
        Einfach, genauso wie ein Blocklyscript, ein JavaScript anlegen, deinen Code einfügen, und starten?

        L 1 Reply Last reply Reply Quote 0
        • L
          lichtraum @jamalau last edited by

          @jamalau tatsächlich ist es so einfach:
          JavaScript anlegen, den Code einfügen und starten.

          Nur wenn du mehrere Homematic IP Instanzen hast, müsstest du noch die Variable WATCHING_INSTANCE anpassen.

          Viele Grüße

          J 1 Reply Last reply Reply Quote 0
          • J
            jamalau @lichtraum last edited by

            @lichtraum Irgendetwas klappt bei mir nicht, hänge mal nen Screenshot an!
            Wenn ich die Instanz manuell neu starte, geht es sofort, was kann das für eine Ursache haben?
            Screenshot_20250615_162758_Edge.jpg

            Homoran 1 Reply Last reply Reply Quote 0
            • Homoran
              Homoran Global Moderator Administrators @jamalau last edited by Homoran

              @jamalau sagte in Homematic HCU:

              hänge mal nen Screenshot an!

              bitte nicht!
              Screenshot_20250615-163327_Firefox.jpg
              logs als Text in code-tags posten, dann kann man sie auch lesen, daraus zitieren, usw.

              edit:
              zeig mal die Einstellungen der Instanz

              J 1 Reply Last reply Reply Quote 0
              • J
                jamalau @Homoran last edited by

                @homoran werde ich machen, habe die JS Instanz jetzt geändert und den Haken bei Enable command setObjekt gesetzt, ich hoffe dass das die Ursache war.
                Screenshot_20250615_164922_Edge.jpg

                Homoran 1 Reply Last reply Reply Quote 0
                • Homoran
                  Homoran Global Moderator Administrators @jamalau last edited by

                  @jamalau sagte in Homematic HCU:

                  den Haken bei Enable command setObjekt gesetzt, ich hoffe dass das die Ursache war.

                  jepp!

                  müssen das 3K Screenshots sein?
                  ich kenne kein Handy, dass das im Portraitmodus darstellen kann.

                  J 1 Reply Last reply Reply Quote 0
                  • J
                    jamalau @Homoran last edited by

                    @homoran sorry hab ihn mit nem Tablet S10ultrra gemacht, werde mich bessern.

                    1 Reply Last reply Reply Quote 0
                    • J
                      jamalau last edited by jamalau

                      Hallo, habe seit einigen Tagen ein merkwürdiges Problem mit der HCU. Ich nutze das Restartscript seit einiger Zeit ohne Probleme, nun ist es so das jeden Morgen die HCU so oft neu gestartet wurde, das der Restart vom Script geblockt werden sollte.
                      Somit kommt keine Verbinung zustande, versuche ich nun eine manuellen Neustart, kommt immer im Protokoll "Token not yet createt".
                      Schaue ich dann in die Instanz sind dann wirklich alle erzeugten Token leer, trage ich die händisch (weil bequemer) wieder ein, verbindet sich die HCU wieder, bis zum nächsten Tag, dann geht alles von vorne los. (Bei einem, durch den Anmeldeprozess erzeugte Token, ist es genauso)
                      Es wurde nichts am System geändert, welches Monate problemlos funktionierte.
                      Wenn ich Tagsüber die Instanz händisch neu starte, funktioniert das problemlos, egal wie oft, was ist da passiert?

                      L 1 Reply Last reply Reply Quote 0
                      • L
                        lichtraum last edited by

                        Tatsächlich habe ich selbiges Problem. Das hat sich aber nach ein paar Tagen von alleine gelöst und ich hatte jetzt einige Wochen Ruhe. Auch das Restart-Skript musste nicht mehr aktiv werden.

                        Seit heute - ebenfalls ohne Änderungen - tritt das Problem leider wieder auf. Der hmip Adapter hat keine neuen Daten und der automatische Restart leert die Adapter Token-Daten.
                        An der Stelle bin ich nun auch überfragt...

                        1 Reply Last reply Reply Quote 0
                        • L
                          lichtraum @jamalau last edited by

                          @jamalau tausche mal die Funktion setInstanceState() gegen folgenden Code aus:

                          setInstanceState(val) {         
                              extendObject(`system.adapter.${WATCHING_INSTANCE}`, {common: {enabled: val}});
                              console.log(`HmIP Instanz ${WATCHING_INSTANCE} wurde ${val ? 'gestartet' : 'gestoppt'}`);  
                          }
                          

                          Ich bin guter Dinge, dass extendObject das Problem verhindert. Damit wird der Status nämlich integriert und das Objekt nicht überschrieben. Den Code in meinen obigen Beitrag habe ich bereits angepasst.

                          1 Reply Last reply Reply Quote 0
                          • First post
                            Last post

                          Support us

                          ioBroker
                          Community Adapters
                          Donate
                          FAQ Cloud / IOT
                          HowTo: Node.js-Update
                          HowTo: Backup/Restore
                          Downloads
                          BLOG

                          566
                          Online

                          32.0k
                          Users

                          80.4k
                          Topics

                          1.3m
                          Posts

                          15
                          55
                          6504
                          Loading More Posts
                          • Oldest to Newest
                          • Newest to Oldest
                          • Most Votes
                          Reply
                          • Reply as topic
                          Log in to reply
                          Community
                          Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen
                          The ioBroker Community 2014-2023
                          logo