Navigation

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

    NEWS

    • Wir empfehlen: Node.js 22.x

    • Neuer Blog: Fotos und Eindrücke aus Solingen

    • ioBroker goes Matter ... Matter Adapter in Stable

    A
    • Profile
    • Following 0
    • Followers 0
    • Topics 29
    • Posts 278
    • Best 11
    • Groups 2

    australien

    @australien

    Starter

    11
    Reputation
    21
    Profile views
    278
    Posts
    0
    Followers
    0
    Following
    Joined Last Online

    australien Follow
    Pro Starter

    Best posts made by australien

    • RE: SONOFF NSPanel mit Lovelace UI

      @armilar Super! Danke, jetzt läuft alles ohne Meldung.

      posted in Hardware
      A
      australien
    • RE: [gelöst] Werte aus Website auslesen

      @homoran
      wusste ich nicht, mach ich das nächste mal.
      Ich lerne ja gerne was dazu.

      posted in Einsteigerfragen
      A
      australien
    • RE: Test Adapter enigma2 v1.2.x

      @glasfaser
      DANKE!!!!

      das war der Fehler, gebe nun http://username:password@enigma2.0.enigma2.CHANNEL_PICON}
      und alles ist ok!

      posted in Tester
      A
      australien
    • RE: SONOFF NSPanel mit Lovelace UI

      @tt-tom
      Das klingt nach einem Plan, zeitlich kein Stress!
      Die Richtung als Unterschrift ist auch gut.

      posted in Hardware
      A
      australien
    • RE: [gelöst] Docker (VM) Container mit ioB (LXC) restart

      @oliverio hab es als Kommentar hinzugefügt

      posted in Einsteigerfragen
      A
      australien
    • RE: Test Adapter schoolfree v1.0.x

      @simatec Hallo, hattest du schon mal Zeit?
      Ist ja jetzt schon eine Weile her 😉

      posted in Tester
      A
      australien
    • RE: SONOFF NSPanel mit Lovelace UI

      @tt-tom
      Aber der Gedankt lief in die richtige Richung.
      Ich habe nun im Fahrplan_to_NSPanel den alias Pfad so geändert, wurde aus dem Panel Script copiert.

       // Pfad unter alias.0       Automatisch wird "FahrplanAnzeiger.HaltestelleX.AbfahrtX" durch das Script erzeugt
      // const DP_Alias: string = 'alias.0';        
      const DP_Alias: string = 'alias.0.' + DP_NSPanel.substring(13, DP_NSPanel.length);
      

      jetzt passt es. Ja, der Fahrplan ist die Startpage. Und keine Fehlermeldungen mehr!

      Danke!!

      posted in Hardware
      A
      australien
    • RE: Fehlermeldung in admin.0

      @mcm1957 danke, hab es gefunden.
      Im Forum hatte ich nichts gesehen.

      könnte man also den threat wieder löschen?

      posted in Error/Bug
      A
      australien
    • RE: javascript Adapter RAM wächst und CPU last 100%

      @meister-mopper musste noch editieren, dass meintest du nehme ich an.

      posted in ioBroker Allgemein
      A
      australien
    • RE: SONOFF NSPanel mit Lovelace UI

      @tt-tom verstanden, hat funktioniert

      posted in Hardware
      A
      australien

    Latest posts made by australien

    • RE: [gelöst] Docker (VM) Container mit ioB (LXC) restart

      @oliverio hab es als Kommentar hinzugefügt

      posted in Einsteigerfragen
      A
      australien
    • RE: [gelöst] Docker (VM) Container mit ioB (LXC) restart

      @oliverio bei mir steht tatsächlich 3

      60:9000/#!/3/docker/containers
      
      posted in Einsteigerfragen
      A
      australien
    • RE: [gelöst] Docker (VM) Container mit ioB (LXC) restart

      @oliverio habe das jetzt so gelöst.
      Wenn der Container nicht läuft, wird er restarted.

      Danke nocheinmal für deine Hilfe!

      const http = require('http');
      
      // Konfiguration
      const PORTAINER_HOST = '10.68.xx.yy';
      const PORTAINER_PORT = 9000;
      const PORTAINER_USERNAME = 'admin';
      const PORTAINER_PASSWORD = 'passwort';
      const PORTAINER_ENDPOINT_ID = '3';      // standard sollte 1 sein, ersichtlich in der url yy:9000/#!/3/docker/containers
      const PORTAINER_CONTAINER_ID = 'fbb9d130592c7edb96a4a71dc067721c1989bb3a27df';
      const PORTAINER_RESTART_TIMEOUT = '10';
      const INTERVAL_MINUTES = 10;
      
      const DEBUG = false; // <-- true = loggt alles, false = keine Logs
      
      function debugLog(...args) {
          if (DEBUG) console.log(...args);
      }
      
      function httpRequest(path, method, headers, body, callback) {
          const options = {
              hostname: PORTAINER_HOST,
              port: PORTAINER_PORT,
              path,
              method,
              headers,
          };
      
          const req = http.request(options, (res) => {
              let data = '';
              res.on('data', chunk => data += chunk);
              res.on('end', () => callback(null, { statusCode: res.statusCode, body: data }));
          });
      
          req.on('error', err => callback(err));
          if (body) req.write(body);
          req.end();
      }
      
      function loginAndGetJWT(cb) {
          const body = JSON.stringify({ Username: PORTAINER_USERNAME, Password: PORTAINER_PASSWORD });
          httpRequest('/api/auth', 'POST', {
              'Content-Type': 'application/json',
              'Content-Length': Buffer.byteLength(body),
          }, body, (err, res) => {
              if (err) return cb(err);
              if (res.statusCode !== 200) return cb(new Error('Login fehlgeschlagen: ' + res.body));
              let data;
              try { data = JSON.parse(res.body); } catch (e) { return cb(e); }
              if (!data.jwt) return cb(new Error('Kein JWT im Response.'));
              debugLog('✅ Login erfolgreich, JWT erhalten.');
              cb(null, data.jwt);
          });
      }
      
      function restartContainer(jwt, cb) {
          const path = `/api/endpoints/${PORTAINER_ENDPOINT_ID}/docker/containers/${PORTAINER_CONTAINER_ID}/restart?t=${PORTAINER_RESTART_TIMEOUT}`;
          httpRequest(path, 'POST', { Authorization: 'Bearer ' + jwt }, null, (err, res) => {
              if (err) return cb(err);
              if (res.statusCode !== 204) return cb(new Error('Restart fehlgeschlagen: ' + res.body));
              debugLog(`✅ Container ${PORTAINER_CONTAINER_ID} neu gestartet.`);
              cb(null);
          });
      }
      
      function checkAndRestartContainer(jwt) {
          const path = `/api/endpoints/${PORTAINER_ENDPOINT_ID}/docker/containers/${PORTAINER_CONTAINER_ID}/json`;
          debugLog('Requesting:', path);
      
          httpRequest(path, 'GET', { Authorization: 'Bearer ' + jwt }, null, (err, res) => {
              if (err) return debugLog('Status Fehler:', err.message);
      
              let data;
              try { data = JSON.parse(res.body); } 
              catch (e) { return debugLog('Parsing Fehler:', e.message); }
      
              if (!data.State || data.State.Running !== true) {
                  debugLog('Container läuft nicht. Starte neu...');
                  restartContainer(jwt, (err2) => {
                      if (err2) return debugLog('Restart Fehler:', err2.message);
                  });
              } else {
                  debugLog(`✅ Container ${PORTAINER_CONTAINER_ID} läuft normal.`);
              }
          });
      }
      
      // Ablauf alle 10 Minuten
      loginAndGetJWT((err, jwt) => {
          if (err) return console.error('Login Fehler:', err.message);
      
          // Sofort prüfen
          checkAndRestartContainer(jwt);
      
          // Intervall setzen
          setInterval(() => checkAndRestartContainer(jwt), INTERVAL_MINUTES * 60 * 1000);
      });
      
      
      posted in Einsteigerfragen
      A
      australien
    • RE: [gelöst] Docker (VM) Container mit ioB (LXC) restart

      @oliverio Danke, jetzt hab ich es hin bekommen, obwohl es erst funktioniert hat, als ich als EndpointId 3 eingegeben hatte.

      Jetzt noch eine andere Frage dazu, gibt es einen Möglichkeit den Status (running) des containers abzufragen?

      posted in Einsteigerfragen
      A
      australien
    • RE: [gelöst] Docker (VM) Container mit ioB (LXC) restart

      @oliverio danke für Deine Hilfe!

      Ich habe mich nun auch etwas mit KI und dem Thema beschäftigt.
      Leider kann ich meine EndpointID nirgends wo finden und wollte dies mit folgendem finden lassen:

      const https = require('https');
      
      // Konfiguration
      const PORTAINER_HOST = '10.68.xx.yy';
      const PORTAINER_PORT = 9443;
      const API_TOKEN = 'XxXxXxXx'; // Hier deinen gültigen Token eintragen
      const ENDPOINT_ID = 1;
      const CONTAINER_ID = 'Cont_ID';
      
      // Funktion, um Container neu zu starten
      function restartContainer() {
          const options = {
              hostname: PORTAINER_HOST,
              port: PORTAINER_PORT,
              path: `/api/endpoints/${ENDPOINT_ID}/docker/containers/${CONTAINER_ID}/restart`,
              method: 'POST',
              headers: {
                  "Authorization": `Bearer ${API_TOKEN}`,
                  "Content-Type": "application/json"
              },
              rejectUnauthorized: false // Self-signed Zertifikat akzeptieren
          };
      
          const req = https.request(options, (res) => {
              let data = '';
              res.on('data', chunk => data += chunk);
              res.on('end', () => {
                  if (res.statusCode >= 200 && res.statusCode < 300) {
                      console.log(`✅ Container "${CONTAINER_ID}" wurde erfolgreich neu gestartet.`);
                  } else {
                      console.error(`❌ Fehler beim Neustart: ${res.statusCode} - ${data}`);
                  }
              });
          });
      
          req.on('error', (err) => {
              console.error(`⚠️ Netzwerkfehler: ${err}`);
          });
      
          req.end();
      }
      
      // Direkt beim Start ausführen (optional)
      restartContainer();
      
      

      jetzt kann ich Tokens erstellen, aber diese werden sofort immer als falsch identifiziert.
      ich gehe folgenden Weg:
      User - my account - access token

      meine Portainer Vers: Community Edition 2.33.0.LTS

      posted in Einsteigerfragen
      A
      australien
    • RE: [gelöst] Docker (VM) Container mit ioB (LXC) restart

      @oliverio jetzt habe ich mir das angeschaut, leider sehe ich nur einen großen Bahnhof.
      Wie kann ich das in ioB umsetzten?
      Genauer gesagt, ein Container in portainer.io schmiert hinundwieder ab, dieser soll dann neu gestartet werden. Ersichtlich ist das insovern, das eingewisser DP keinen gültigen Wert liefert.

      posted in Einsteigerfragen
      A
      australien
    • RE: Szenen Adapter: einzele mit DP de-/aktivieren

      hier ist meine aktuelle Version für mehrere Rollos und verschiedenen Scenen.
      Gerne mal drüberschauen 😉

      Danke für Eure Hilfe, wie immer großartig!!!

      // Konfiguration für mehrere Rollos
      const rollos = [
          {
              name: "EG Küche SW",
              blockDP: "0_userdata.0.RolloStatus.Automatik.EG.Kueche.SW",
              blockMQTT: [
                  "alias.0.Rollo.EG.Kueche.SuedWest.CLOSE",
                  "alias.0.Rollo.EG.Kueche.SuedWest.STOP",
                  "alias.0.Rollo.EG.Kueche.SuedWest.OPEN"
              ],
              idScene: 'scene.0.Rollo_EG_SW',
              idSceneMember: 'alias.0.Rollo.EG.Kueche.SW.Position'
          },
          {
              name: "EG Wohnzimmer Ost",
              blockDP: "0_userdata.0.RolloStatus.Automatik.EG.WZ.Fenster_SE",
              blockMQTT: [
                  "alias.0.Rollo.EG.WZ.Fenster SE.CLOSE",
                  "alias.0.Rollo.EG.WZ.Fenster SE.STOP",
                  "alias.0.Rollo.EG.WZ.Fenster SE.OPEN"
              ],
              idScene: 'scene.0.Rollo_EG_E',
              idSceneMember: 'alias.0.Rollo.EG.WZ.Fenster SE.Position'
          },
          // ...weitere Rollos hier hinzufügen
      ];
      
      // Initialisierung für alle Rollos bei Skriptstart
      (async function initAll() {
          for (const rollo of rollos) {
              // Automatikstatus auf aktiv setzen
              setState(rollo.blockDP, true);
              log(`[Init] Automatikstatus zurückgesetzt: ${rollo.blockDP} für ${rollo.name}`, 'info');
      
              // Szenenmitglied aktivieren
              await controlDp(rollo.idSceneMember, true, rollo.idScene);
              log(`[Init] Szenenmitglied ${rollo.idSceneMember} für ${rollo.name} aktiviert`, 'info');
          }
      })();
      
      // Funktion: Automatik blockieren, wenn manuell gefahren wird
      function setBlock(rollo) {
          const currentStatus = getState(rollo.blockDP).val;
      
          // Wenn bereits gesperrt, keine weitere Aktion
          if (currentStatus === false) {
              log(`[Sperre] Automatik für ${rollo.name} ist bereits gesperrt, keine weiteren Aktionen.`, 'info');
              return;
          }
      
          // Automatik sperren
          log(`[Sperre] Manuelle Bedienung für ${rollo.name} erkannt – Automatik wird gesperrt.`, 'warn');
          setState(rollo.blockDP, false);
          log(`[Sperre] ${rollo.blockDP} = false (gesperrt)`, 'info');
          log(`Automatik für ${rollo.name} gesperrt bis morgen.`, 'info');
      }
      
      // Funktion: Szene-Mitglied aktivieren oder deaktivieren
      async function controlDp(id, enable, sceneId) {
          log(`[Szene] Lese Szene: ${sceneId}`, 'debug');
          const sceneObj = await getObjectAsync(sceneId);
      
          if (!sceneObj || !sceneObj.native || !Array.isArray(sceneObj.native.members)) {
              log(`[Fehler] Szene ${sceneId} ist ungültig oder hat keine Mitglieder.`, 'error');
              return;
          }
      
          let found = false;
          for (let member of sceneObj.native.members) {
              log(`[Szene] Prüfe Mitglied: ${member.id}`, 'debug');
              if (member.id === id) {
                  member.disabled = !enable;
                  found = true;
                  log(`[Szene] → ${id} wurde ${enable ? 'aktiviert' : 'deaktiviert'}.`, 'info');
                  break;
              }
          }
      
          if (!found) {
              log(`[Warnung] Mitglied ${id} nicht in Szene ${sceneId} gefunden.`, 'warn');
          }
      
          await setObjectAsync(sceneId, sceneObj);
          log(`[Szene] Szene ${sceneId} wurde aktualisiert.`, 'debug');
      }
      
      // MQTT-Trigger für alle Rollos einrichten (ack: false beachten!)
      for (const rollo of rollos) {
          on({ id: rollo.blockMQTT, ack: false }, async (obj) => {
              log(`[Trigger] MQTT-Befehl empfangen: ${obj.id} = ${obj.state.val} für ${rollo.name}`, 'debug');
      
              // Manuelle Bedienung erkannt → Automatik sperren
              setBlock(rollo);
              await controlDp(rollo.idSceneMember, false, rollo.idScene);
          });
      }
      
      // Beispiel-Funktion: Automatik pro Rollo (kann erweitert werden)
      function automatikFunktion(rollo) {
          const status = getState(rollo.blockDP).val;
          log(`[Automatik] Statusprüfung für ${rollo.name}: ${rollo.blockDP} = ${status}`, 'debug');
      
          if (status === false) {
              log(`Automatik für ${rollo.name} ist gesperrt, kein automatisches Fahren.`, 'warn');
              return;
          }
      
          // Hier steht die Automatik-Logik pro Rollo
          log(`Automatik aktiv: ${rollo.name} fährt automatisch.`, 'info');
      }
      
      // Zeitgesteuerte Rücksetzung der Sperre täglich um 03:00 Uhr
      schedule("0 3 * * *", async () => {
          log("[Reset] Starte tägliche Rücksetzung der Automatik-Sperre um 03:00 Uhr", 'info');
      
          for (const rollo of rollos) {
              setState(rollo.blockDP, true);
              log(`[Reset] Sperrstatus zurückgesetzt: ${rollo.blockDP} für ${rollo.name}`, 'info');
              await controlDp(rollo.idSceneMember, true, rollo.idScene);
          }
      });
      
      
      posted in Einsteigerfragen
      A
      australien
    • RE: Szenen Adapter: einzele mit DP de-/aktivieren

      @paul53 ok, wie soll ich das ändern? das ist doch nur der Name der Variablen.

      posted in Einsteigerfragen
      A
      australien
    • RE: Szenen Adapter: einzele mit DP de-/aktivieren

      @paul53 das hatte funktioniert.
      nun hab ich das ganze eingebaut und mit log versehen. Seitdem reagiert mein on nicht mehr?! obwohl die Timestamps bei den DP sich ändern wenn geschaltet wird.

      // Datenpunkt zum Speichern des Automatik-Sperrstatus
      const blockDP = "0_userdata.0.RolloStatus.Automatik.EG.Kueche.SW";
      
      // MQTT-Schaltflächen zur manuellen Bedienung (manuell = Sperre setzen)
      const blockMQTT = [
          "alias.0.Rollo.EG.Kueche.SuedWest.CLOSE",
          "alias.0.Rollo.EG.Kueche.SuedWest.STOP",
          "alias.0.Rollo.EG.Kueche.SuedWest.OPEN"
      ];
      
      // Initial: Automatik ist erlaubt
      setState(blockDP, true); 
      log(`[Init] Automatikstatus gesetzt: ${blockDP} = true`, 'info');
      
      // Funktion: Automatik blockieren, wenn manuell gefahren wird
      function setBlock() {
          log(`[Sperre] Manuelle Bedienung erkannt – Automatik wird gesperrt.`, 'warn');
          setState(blockDP, false);
          log(`[Sperre] ${blockDP} = false (gesperrt)`, 'info');
          log("Automatik für Rollo EG Küche gesperrt bis morgen.", 'info');
      }
      
      // Szene-Datenpunkt
      const idScene = 'scene.0.Rollo_EG_SW';
      
      // Funktion: Szene-Mitglied aktivieren oder deaktivieren
      async function controlDp(id, enable) {
          log(`[Szene] Lese Szene: ${idScene}`, 'debug');
          const jsonScene = await getObjectAsync(idScene);
      
          if (!jsonScene || !jsonScene.native || !Array.isArray(jsonScene.native.members)) {
              log(`[Fehler] Szene ${idScene} ist ungültig oder hat keine Mitglieder.`, 'error');
              return;
          }
      
          let found = false;
          for (let member of jsonScene.native.members) {
              log(`[Szene] Prüfe Mitglied: ${member.id}`, 'debug');
              if (member.id === id) {
                  member.disabled = !enable;
                  found = true;
                  log(`[Szene] → ${id} wurde ${enable ? 'aktiviert' : 'deaktiviert'}.`, 'info');
                  break;
              }
          }
      
          if (!found) {
              log(`[Warnung] Mitglied ${id} nicht in Szene ${idScene} gefunden.`, 'warn');
          }
      
          await setObjectAsync(idScene, jsonScene);
          log(`[Szene] Szene ${idScene} wurde aktualisiert.`, 'debug');
      }
      
      // Trigger: Wenn einer der MQTT-Schalter betätigt wird
      on({id: blockMQTT, change: "any"}, obj => {
      //on({ id: blockMQTT, change: "any" }, async (obj) => {
          log(`[Trigger] MQTT-Befehl empfangen: ${obj.id} = ${obj.state.val}`, 'debug');
      
          // Nur bei manuellem Drücken (false) reagieren
          if (obj.state.val === false) {
              log(`[Trigger] Manuelle Aktion erkannt – Sperre wird gesetzt.`, 'info');
              setBlock();
      
              const idDp = 'alias.0.Rollo.EG.Kueche.SW.Position';
      
              // Szenenmitglied deaktivieren
              controlDp(idDp, false);
              //await controlDp(idDp, false);
          } else {
              log(`[Trigger] Ignoriert: Wert ist true oder irrelevant.`, 'debug');
          }
      });
      
      // Beispiel-Funktion: Automatik ausführen, nur wenn nicht blockiert
      function automatikFunktion() {
          const status = getState(blockDP).val;
          log(`[Automatik] Statusprüfung: ${blockDP} = ${status}`, 'debug');
      
          if (status === false) {
              log("Automatik für Rollo EG Küche ist gesperrt, kein automatisches Fahren.", 'warn');
              return;
          }
      
          // Hier würde der Automatik-Code stehen
          log("Automatik aktiv: Rollo fährt automatisch.", 'info');
      }
      
      // Zeitgesteuerte Rücksetzung der Sperre täglich um 03:00 Uhr
      schedule("0 3 * * *", async () => {
          log("[Reset] Starte tägliche Rücksetzung der Automatik-Sperre um 03:00 Uhr", 'info');
          
          // Sperre aufheben
          setState(blockDP, true);
          log(`[Reset] Sperrstatus zurückgesetzt: ${blockDP} = true`, 'info');
      
          // Szenenmitglied wieder aktivieren
          const idDp = 'alias.0.Rollo.EG.Kueche.SW.Position';
          await controlDp(idDp, true);
      });
      
      

      das ganze soll später ja für jedes Rollo bzw Szene anwendbar werden.

      edit: habe den JS neu gestartet und es passt alles. Werde mich an die verallgemeinerung für alle Rollos machen. Danke erstmal!

      posted in Einsteigerfragen
      A
      australien
    • RE: Szenen Adapter: einzele mit DP de-/aktivieren

      @homoran
      jetzt hab ich es.

      {
        "common": {
          "name": "Rollo EG SW",
          "type": "mixed",
          "role": "scene.state",
          "desc": "Rollo EG südwesten",
          "enabled": true,
          "read": true,
          "write": true,
          "def": false,
          "engine": "system.adapter.scenes.0"
        },
        "native": {
          "onTrue": {
            "trigger": {},
            "cron": null,
            "astro": null
          },
          "onFalse": {
            "enabled": false,
            "trigger": {},
            "cron": null,
            "astro": null
          },
          "easy": true,
          "burstInterval": 1000,
          "virtualGroup": true,
          "members": [
            {
              "id": "alias.0.Rollo.EG.WZ.Fenster SW.Position",
              "setIfTrue": null,
              "setIfFalse": null,
              "stopAllDelays": true,
              "desc": null,
              "disabled": false,
              "delay": 0
            },
            {
              "id": "alias.0.Rollo.EG.Kueche.SW.Position",
              "setIfTrue": null,
              "setIfFalse": null,
              "stopAllDelays": true,
              "desc": null,
              "disabled": false,
              "delay": 0
            }
          ]
        },
        "type": "state",
        "_id": "scene.0.Rollo_EG_SW",
        "from": "system.adapter.admin.0",
        "user": "system.user.admin",
        "ts": 1753719859965,
        "acl": {
          "object": 1636,
          "state": 1636,
          "owner": "system.user.admin",
          "ownerGroup": "system.group.administrator"
        }
      }
      

      und schon auch gefunden. Nur wie kann ich aus dem DP die Objectdaten mit JS umschreiben? wenn ich nur ein bestimmtes dissabel auf true oder false stellen will.

      posted in Einsteigerfragen
      A
      australien
    Community
    Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen
    The ioBroker Community 2014-2023
    logo