Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Blackbeard

    NEWS

    • Neuer Blog: Fotos und Eindrücke aus Solingen

    • ioBroker@Smart Living Forum Solingen, 14.06. - Agenda added

    • ioBroker goes Matter ... Matter Adapter in Stable

    B
    • Profile
    • Following 0
    • Followers 0
    • Topics 2
    • Posts 25
    • Best 0
    • Groups 1

    Blackbeard

    @Blackbeard

    Starter

    0
    Reputation
    4
    Profile views
    25
    Posts
    0
    Followers
    0
    Following
    Joined Last Online

    Blackbeard Follow
    Starter

    Latest posts made by Blackbeard

    • RE: Rutenbeck TCR IP4 wie korrekt schalten

      Ich habe mir folgenden JS-Code mit Hilfe von ChatGPT erstellt:

      const dgram = require('dgram');
      const deviceIP = 'xxx.xxx.xxx.xxx'; // IP-Adresse der Zeitschaltuhr
      const port = 30303; // UDP-Port der Zeitschaltuhr
      const states = ['OUT1', 'OUT2', 'OUT3', 'OUT4']; // Zustände (ohne Temperatur)
      const warnCooldown = {}; // Warnungstimer für Statusabweichungen
      const retryAttempts = 3; // Anzahl der Wiederholungen bei Abfrageabweichungen
      const warnLimit = 2; // Anzahl maximaler Warnungen pro Abweichung
      
      // Datenpunkte im ioBroker erstellen
      states.forEach(state => {
          createState(`javascript.0.Zeitschaltuhr.${state}`, false, { name: `${state} Schalter`, type: 'boolean', def: false, read: true, write: true });
      });
      // Spezieller Datenpunkt für Temperatur
      createState(`javascript.0.Zeitschaltuhr.Temperatur`, 0, { name: 'Temperatur Status', type: 'mixed', def: 0, read: true, write: false });
      
      // Funktion, um UDP-Befehl zu senden und Antwort abzurufen
      function sendUDPCommandAndReceive(command, callback) {
          const message = Buffer.from(command);
          const client = dgram.createSocket('udp4');
      
          client.on('message', (msg, rinfo) => {
              const response = msg.toString();
      
              // Antwort analysieren und Datenpunkte aktualisieren
              if (response.startsWith('T')) {
                  const parts = response.split('=');
                  if (parts.length > 1) {
                      const value = parseFloat(parts[1].trim());
      
                      if (!isNaN(value)) {
                          const currentState = getState(`javascript.0.Zeitschaltuhr.Temperatur`).val;
                          if (value === -27) {
                              if (currentState !== 'nicht angeschlossen') {
                                  setState(`javascript.0.Zeitschaltuhr.Temperatur`, 'nicht angeschlossen', true);
                              }
                          } else {
                              if (currentState !== value) {
                                  setState(`javascript.0.Zeitschaltuhr.Temperatur`, value, true);
                              }
                          }
                      }
                  }
              } else {
                  states.forEach(state => {
                      if (response.startsWith(state)) {
                          const parts = response.split('=');
                          if (parts.length > 1) {
                              const value = parseInt(parts[1].trim(), 10);
      
                              if (value === 0 || value === 1) {
                                  const currentState = getState(`javascript.0.Zeitschaltuhr.${state}`).val;
                                  if (currentState !== (value === 1)) {
                                      setState(`javascript.0.Zeitschaltuhr.${state}`, value === 1, true);
                                  }
                              }
                          }
                      }
                  });
              }
      
              client.close();
              if (callback) callback(response);
          });
      
          client.send(message, 0, message.length, port, deviceIP, (err) => {
              if (err) {
                  console.error(`Fehler beim Senden: ${err.message}`);
                  client.close();
              }
          });
      }
      
      // Funktion zur Steuerung der Ports (ein- und ausschalten)
      function controlPort(portNumber, state) {
          if (portNumber < 1 || portNumber > 4) {
              console.error('Ungültige Portnummer. Bitte 1 bis 4 angeben.');
              return;
          }
          if (state !== 0 && state !== 1) {
              console.error('Ungültiger Zustand. Bitte 0 (aus) oder 1 (ein) angeben.');
              return;
          }
      
          const command = `OUT${portNumber} ${state}`;
          sendUDPCommandAndReceive(command, () => {
              let attempts = 0;
              let warnings = 0;
      
              function checkStatus() {
                  const queryCommand = `OUT${portNumber} ?`;
                  sendUDPCommandAndReceive(queryCommand, (response) => {
                      const parts = response.split('=');
                      if (parts.length > 1) {
                          const value = parseInt(parts[1].trim(), 10);
                          if (value === state) {
                              setState(`javascript.0.Zeitschaltuhr.OUT${portNumber}`, value === 1, true);
                          } else {
                              attempts++;
                              if (attempts < retryAttempts) {
                                  setTimeout(checkStatus, 500); // Wiederholen nach 500ms
                              } else {
                                  warnings++;
                                  if (warnings <= warnLimit) {
                                      console.warn(`Status von OUT${portNumber} stimmt nicht überein: Erwartet ${state}, erhalten ${value}`);
                                  }
                              }
                          }
                      }
                  });
              }
      
              // Erste Statusprüfung nach 1 Sekunde
              setTimeout(checkStatus, 1000);
          });
      }
      
      // Listener für Schalter in ioBroker
      states.forEach((state, index) => {
          on({ id: `javascript.0.Zeitschaltuhr.${state}`, change: 'any' }, (obj) => {
              const newState = obj.state.val ? 1 : 0;
              controlPort(index + 1, newState);
          });
      });
      
      // Funktion zur regelmäßigen Abfrage
      function queryStates() {
          states.concat('T').forEach((state) => {
              const command = `${state} ?`;
              sendUDPCommandAndReceive(command);
          });
      }
      
      // Intervall für regelmäßige Abfragen (alle 10 Sekunden)
      setInterval(queryStates, 10000);
      
      // Initialer Aufruf
      queryStates();
      
      

      Der Code ließt den aktuellen Zustand der Ports 1-4 sowie der Temperatur (Ich besitze keinen Sensor und kann die Ausgabe der Temp. nicht testen) per UDP-Protokoll und erstellt in ioBroker passende Datenpunkte. Diese können dann aus ioBroker oder VIS geschaltet werden.

      posted in Skripten / Logik
      B
      Blackbeard
    • RE: Probleme beim ioBroker-Update von docker v7 auf v8

      @thomas-braun
      Bei meinem selbst erarbeiteten Halbwissen bin ich tatsächlich zu zufrieden, wenn alle Programme das tun, was sie machen sollen. Da mache ich auch keinen Hehl daraus.
      Hast du einen Vorschlag, wie ich die Adapter professioneller hätte "reparieren" können?

      posted in Off Topic
      B
      Blackbeard
    • RE: Probleme beim ioBroker-Update von docker v7 auf v8

      @thomas-braun
      Irgendwie scheinen beim Backup oder beim Widerherstellen aus dem Backup Dateien nicht hergestellt zu werden. Oder so ähnlich. Denn wie oben geschrieben, repariert sich der "fehlerhafte" Adapter, wenn man eine weiter Instanz installiert. Vis habe ich einfach den "alten" Ordner aus meiner Sicherung in den aktuellen Ordner kopiert. Funktioniert jetzt ebenfalls.

      posted in Off Topic
      B
      Blackbeard
    • RE: Probleme beim ioBroker-Update von docker v7 auf v8

      @marc-berg
      Trotzdem nochmal herzlichen Dank für deine Mühe und Geduld.

      Die "fehlerhaften" Adapter reparieren sich selbstständig, wenn man eine weitere Instanz des fehlerhaften Adapters installiert. Anschließend kann diese wieder gelöscht werden und der erste Adapter funktioniert wieder wie gewohnt.

      posted in Off Topic
      B
      Blackbeard
    • RE: Probleme beim ioBroker-Update von docker v7 auf v8

      @marc-berg
      Update auf v8 ist gelaufen!
      Danke für die richtige Frage. Die Antwort ist: Der js-controller des v8-Containers war mittlerweile ebenfalls veraltet. So dass mein Backup mittlerweile aktueller ist als das "alte" Image. Puhhh....

      Aber war mache ich jetzt mit den nicht gestarteten Instanzen?
      178c7805-cd79-4c38-b2e2-cb55237b21cd-image.png

      40bcb4e3-9fec-4296-9db7-26d708cf8d26-image.png

      Einfach deinstallieren und wieder neu installieren? Oder kann man "drüber installieren"?

      posted in Off Topic
      B
      Blackbeard
    • RE: Probleme beim ioBroker-Update von docker v7 auf v8

      @marc-berg
      Dauert immer etwas, bis ich dazu komme, Zeit zu finden.

      Der Start des v8 Containers mit leerem Verzeichnis läuft problemlos. Nachdem ich einen neuen Admin eingerichtet habe und das Backup ins Verzeichnis kopiert habe, habe ich im Adapter die Wiederherstellung gestartet. Danach passiert nichts mehr auf dem Bildschirm.
      In Portainer sehe ich in der Console, dass der Cointainer neu startet und dann wie bei allen anderen Versuchen vorher die Verbindung zur Datenbank nicht hergestellt werden kann. Dann beginnt wieder der Neustart des Containers...

      Eben habe ich ein Downgrade auf den v6 versucht. Irgendwelche Modulfehler in Schritt 5/5. Aber zumindest nicht die fehlende Verbindung zur Datenbank in Schritt 3/5.

      Ich bin echt ratlos.

      posted in Off Topic
      B
      Blackbeard
    • RE: Probleme beim ioBroker-Update von docker v7 auf v8

      @marc-berg
      Ja. Habe ich tatsächlich verwechselt.
      Aktuell läuft 5.0.12
      Habe aber eben nochmal auf 5.0.16 aktualisiert.

      posted in Off Topic
      B
      Blackbeard
    • RE: Probleme beim ioBroker-Update von docker v7 auf v8

      @marc-berg
      Ich hatte node.js auch schon händisch upgedatet und dann versucht das neue Image zu starten. Hat aber keine Veränderung gebracht. Immer das selbe Verhalten. Aktuell läuft v16.20.2, da nach erneuten Erstellen des Containers immer wieder die Version des Images benutzt wird. Daher ließt man auch in der Beschreibung, dass eigentlich nur ein neuer Container mit aktuellem Image gestartet werden sollte und dann alles wieder schick ist. Aber aktuell eben bei mir leider nicht.

      posted in Off Topic
      B
      Blackbeard
    • RE: Probleme beim ioBroker-Update von docker v7 auf v8

      @oliverio
      Ja genau. Und an dieser Stelle finde ich keine Lösung. Was die Datenbank angeht, ist ja alles in Standardkonfiguration. Daher kann ich mir nicht vorstellen, warum die Installation keine Verbindung zu den Daten herstellen kann.
      Einzige Idee die ich noch habe, wäre eine Diskrepanz mit Benutzerrechten.
      Aber da weiß ich gerade auch nicht wo ich wie ansetzen sollte. 😕

      Daher hatte ich gehofft, dass hier im Forum jemand eine hilfreiche Idee hat oder der Image Ersteller (@andre) die Lösung parat hat.

      posted in Off Topic
      B
      Blackbeard
    • RE: Probleme beim ioBroker-Update von docker v7 auf v8

      @oliverio
      Ja. Habe keine code tags verwendet.
      Das composefile an sich funktioniert wie es soll.
      Tatsächlich stoppe ich vor jedem Update den container, mache vom Datenverzeichnis eine Kopie, starte den container wieder und führe das Update durch.

      Der container lässt sich mit leeren Datenverzeichnis auch ohne Murren mit neuer Version starten. Erst wenn ich meine Daten einfüge, dann wird eine vorhandene Installation erkannt und er baut eben keine Verbindung zur Datenbank auf. Ich hatte auch versucht, per BackitUp die Daten wieder herzustellen. Aber eben auch ohne Erfolg.

      Ich frage mich, was die Installationsroutine da in Schritt 3 macht bzw. sucht dass meine Daten (die vorhanden sind) nicht gefunden werden?

      posted in Off Topic
      B
      Blackbeard
    Community
    Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen
    The ioBroker Community 2014-2023
    logo