Navigation

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

    NEWS

    • Amazon Alexa - ioBroker Skill läuft aus ?

    • Monatsrückblick – September 2025

    • Neues Video "KI im Smart Home" - ioBroker plus n8n

    M
    • Profile
    • Following 4
    • Followers 1
    • Topics 93
    • Posts 784
    • Best 13
    • Groups 2

    mguenther

    @mguenther

    15
    Reputation
    167
    Profile views
    784
    Posts
    1
    Followers
    4
    Following
    Joined Last Online
    Location Königslutter

    mguenther Follow
    Pro Starter

    Best posts made by mguenther

    • RE: Admin v5 jetzt im STABLE!

      @all, die an der Weiterentwicklung mitgewirkt haben - auch wenn viele oder besser ein paar wenige momentan auf "euch" draufhauen und alles als schlecht bezeichnen - ich finds mega und komme viel besser und mit einem deutlich besserem Überblich auf alles zurück. Danke für die Weiterentwicklung. Musste ich mal loswerden...

      posted in ioBroker Allgemein
      M
      mguenther
    • RE: IOBroker installation auf Raspberry Zero bricht ab.

      @thomas-braun
      Feedback von mir - auch ich habe auf einen RP ZeroW iobroker mit den neusten node.js und npm durch den von dir angegeben Weg installiert - danke

      posted in Error/Bug
      M
      mguenther
    • RE: [Major Update] UniFi Adapter v0.5.0

      @braindead
      funktioniert... ich glaube, ich hatte nen Fehler im Passwort...

      posted in Entwicklung
      M
      mguenther
    • RE: Grafana unter Docker installieren und Einrichten

      @oliverio
      portainer nutze ich auch - ich habe unter grafana folgendes Terminal und komme dann eben nicht in/an die ini-Datei:

      826382de-6762-4505-940f-ebcdf553b3a8-grafik.png

      d5fd1fcc-819e-47f9-8b3c-20302884ab0f-grafik.png

      posted in ioBroker Allgemein
      M
      mguenther
    • RE: iBeacon oder Alternative für WLAN gesucht

      @dieter_p
      ja, das wollte er gestern nicht 🙂
      Beim Speichern kam bei NO DATA immer ne Fehlermeldung. Andere Dinge konnte ich einstellen. Ich teste weiter...

      EDIT - hat genau so heute funktioniert. Die APP ist aber etwas "instabil". Geht aber mit Geduld 🙂

      posted in Hardware
      M
      mguenther
    • RE: VIS-Editor - mehr als 3 Signalbilder benutzen möglich?

      bedeutet, es wird unter Objekte z.B. unter VIS.0 dann ein Datenpunkt angelegt, bei dem der Inhalt für die VIS hinterlegt wird? Ich bastle gerade an meiner ersten VIS und stehe genau vor diesem Problem...

      danke

      posted in Visualisierung
      M
      mguenther
    • RE: Unifi Adapter, zusätzliche Angaben

      gibt es eigentlich noch Jemanden, der sich aktuell um den Adapter kümmert? Ich weiß, dass Jens Maus einiges gemacht hatte, habe aber irgendwie das Gefühl, dass sich momentan niemand darum kümmert.

      Ich überlege gerade noch auf eine Anpassung des Adapters zu warten. Alternativ muss ich etwas meine VIS und mein Skript anpassen.

      @liv-in-sky
      So sieht übrigens der aktuelle Zwischenstand aus:
      99d4d339-c17a-4a11-9ef2-51b819f303f6-grafik.png

      posted in ioBroker Allgemein
      M
      mguenther
    • RE: Gelöst: VIS Probleme wenn Internetverbindung fehlt

      @Wildbill
      ah, verstanden - wer lesen kann, ist klar im Vorteil...

      posted in Visualisierung
      M
      mguenther
    • RE: Unifi Adapter, zusätzliche Angaben

      @nashra
      klar, aber momentan bastle ich noch. Die zugehörigen Skripte gibts dann auch...

      posted in ioBroker Allgemein
      M
      mguenther
    • RE: Farbiger Verlaufsbalken

      @manfredh-1
      naja - ich glaube eher, das musst du anders lösen. Ich würde 2 widgets übereinander legen. Im ersten widget kannst du ja einen gradientn erstellen, aber unabhängig vom Prozentwert, den du nachher darstellen willst. Wenn nun die Prozentzahl abnimmt, würde ich immer mehr ein zweites image widget drüberlegen, so dass der Hintergrund immer mehr transparent verdeckt wird.
      Ich habe sowas noch nicht umgesetzt, aber das wäre mein Ansatz

      Vielleicht hilft dir ja mein Gedankengang dazu...

      Gruß,
      Marcus

      posted in Visualisierung
      M
      mguenther

    Latest posts made by mguenther

    • RE: [erledigt]Skript zum Einsammeln von Batteriestatus von ...

      hier mein Skript - chatgpt hat mit draufgeschaut - ich schließe hier.

      // ===== Einstellungen =====
      const OUT = "0_userdata.0.vis.BatterieListeDebug"; // Datenpunkt für VIS
      const THRESH_LOW = 30;
      const THRESH_MED = 60;
      const MAX_HEIGHT = 660;
      const WIDTH = 405; // Gesamtbreite
      const STALE_HOURS = 168; // >7 Tage ohne Meldung = "nicht aktiv"
      
      // === Helfer ===
      function colorByVal(v) {
        if (!isFinite(v)) return "#9e9e9e";
        if (v < THRESH_LOW) return "#e53935";   // rot
        if (v < THRESH_MED) return "#fdd835";   // gelb
        return "#43a047";                       // grün
      }
      
      function devRoot(id) {
        const p = id.split(".");
        return [p[0], p[1], p[2]].join(".");
      }
      
      function niceNameFromRoot(rootId) {
        const obj = getObject(rootId);
        return obj?.common?.name || rootId;
      }
      
      function voltageToPercent(v) {
        if (!isFinite(v)) return null;
        const min = 2.0, max = 3.0;
        let pct = ((v - min) / (max - min)) * 100;
        return Math.max(0, Math.min(100, Math.round(pct)));
      }
      
      // Liefert den letzten Änderungszeitpunkt aller States eines Geräts
      function lastSeenDevice(root) {
        let last = 0;
        $('' + root + '.*').each(id => {
          const st = getState(id);
          if (st && st.lc && st.lc > last) last = st.lc;
        });
        return last;
      }
      
      // === Rendering ===
      function render() {
        const map = {};
      
        // Zigbee: echte %
        $('zigbee.0.*.battery').each(id => {
          const root = devRoot(id);
          const name = niceNameFromRoot(root);
          const raw = getState(id)?.val;
          const val = isFinite(raw) ? Math.max(0, Math.min(100, Math.round(Number(raw)))) : null;
          if (val !== null) map[root] = { type: "percent", name, val, sys: "Zigbee" };
        });
      
        // HmIP: Operating Voltage -> %
        $('hm-rpc.0.*.OPERATING_VOLTAGE').each(id => {
          const root = devRoot(id);
          const name = niceNameFromRoot(root);
          const val = voltageToPercent(getState(id)?.val);
          if (val !== null) map[root] = { type: "percent", name, val, sys: "HmIP" };
        });
      
        // Homematic: LOWBAT
        $('hm-rpc.0.*.LOWBAT').each(id => {
          const root = devRoot(id);
          const name = niceNameFromRoot(root);
          const lowbat = !!(getState(id)?.val);
          const unreach = !!(getState(root + ".0.UNREACH")?.val);
      
          const last = lastSeenDevice(root);
          const ageH = (Date.now() - last) / (1000 * 60 * 60);
      
          if (unreach) {
            map[root] = { type: "unreach", name, sys: "HM" };
          } else if (ageH > STALE_HOURS) {
            map[root] = { type: "stale", name, sys: "HM" };
          } else {
            map[root] = { type: "lowbat", name, lowbat, sys: "HM" };
          }
        });
      
        // Homematic: LOW_BAT
        $('hm-rpc.0.*.LOW_BAT').each(id => {
          const root = devRoot(id);
          const name = niceNameFromRoot(root);
          const lowbat = !!(getState(id)?.val);
          const unreach = !!(getState(root + ".0.UNREACH")?.val);
      
          const last = lastSeenDevice(root);
          const ageH = (Date.now() - last) / (1000 * 60 * 60);
      
          if (unreach) {
            map[root] = { type: "unreach", name, sys: "HmIP" };
          } else if (ageH > STALE_HOURS) {
            map[root] = { type: "stale", name, sys: "HmIP" };
          } else {
            map[root] = { type: "lowbat", name, lowbat, sys: "HmIP" };
          }
        });
      
        // Liste bauen
        let list = Object.values(map);
      
        // Sortierung (angepasst)
        list.sort((a, b) => {
          function weight(it) {
            if (it.type === "unreach") return 0;                                   // HM keine Meldung
            if (it.type === "percent" && it.sys === "Zigbee" && it.val === 0) return 1; // Zigbee 0%
            if (it.type === "stale") return 2;                                     // HM nicht aktiv
            if (it.type === "percent" && it.sys === "Zigbee" && it.val < THRESH_LOW) return 3; // Zigbee rot
            if (it.type === "lowbat" && it.lowbat === true) return 4;              // HM low
            if (it.type === "percent" && it.sys === "Zigbee" && it.val < THRESH_MED) return 5; // Zigbee gelb
            if (it.type === "percent" && it.sys === "Zigbee" && it.val >= THRESH_MED) return 6; // Zigbee grün
            if (it.type === "lowbat" && it.lowbat === false) return 7;             // HM grün
            return 99;
          }
      
          const wa = weight(a), wb = weight(b);
          if (wa !== wb) return wa - wb;
      
          // Falls gleiche Kategorie: nach Wert sortieren
          if (a.type === "percent" && b.type === "percent") {
            if (a.val == null) return 1;
            if (b.val == null) return -1;
            return a.val - b.val;
          }
          return 0;
        });
      
        // Zeilen bauen
        const rows = list.map(it => {
          if (it.type === "percent") {
            return `
              <tr style="border-bottom:1px solid #444;">
                <td style="width:55px; color:#f5f5f5;">${it.sys}</td>
                <td style="width:120px; color:#f5f5f5; font-size:12px; overflow:hidden; text-overflow:ellipsis; white-space:nowrap;" title="${it.name}">${it.name}</td>
                <td style="width:55px; text-align:right; color:#f5f5f5;">${it.val == null ? "-" : it.val + " %"}</td>
                <td style="width:175px;">
                  <div style="width:100%; height:10px; border-radius:5px; background:#333; overflow:hidden;">
                    <div style="height:100%; width:${it.val ?? 0}%; background:${colorByVal(it.val)};"></div>
                  </div>
                </td>
              </tr>`;
          }
          if (it.type === "lowbat") {
            const ok = it.lowbat === false;
            const color = ok ? "#43a047" : "#e53935";
            const text  = ok ? "OK" : "LOW";
            return `
              <tr style="border-bottom:1px solid #444;">
                <td style="width:55px; color:#f5f5f5;">${it.sys}</td>
                <td style="width:120px; color:#f5f5f5; font-size:12px; overflow:hidden; text-overflow:ellipsis; white-space:nowrap;" title="${it.name}">${it.name}</td>
                <td style="width:55px; text-align:right; color:#f5f5f5;">–</td>
                <td style="width:175px; color:${color}; font-weight:bold;">${text}</td>
              </tr>`;
          }
          if (it.type === "unreach") {
            return `
              <tr style="border-bottom:1px solid #444;">
                <td style="width:55px; color:#f5f5f5;">${it.sys}</td>
                <td style="width:120px; color:#f5f5f5; font-size:12px; overflow:hidden; text-overflow:ellipsis; white-space:nowrap;" title="${it.name}">${it.name}</td>
                <td style="width:55px; text-align:right; color:#f5f5f5;">–</td>
                <td style="width:175px; color:#ff9800; font-weight:bold;">KEINE MELDUNG</td>
              </tr>`;
          }
          if (it.type === "stale") {
            return `
              <tr style="border-bottom:1px solid #444;">
                <td style="width:55px; color:#f5f5f5;">${it.sys}</td>
                <td style="width:120px; color:#f5f5f5; font-size:12px; overflow:hidden; text-overflow:ellipsis; white-space:nowrap;" title="${it.name}">${it.name}</td>
                <td style="width:55px; text-align:right; color:#f5f5f5;">–</td>
                <td style="width:175px; color:#ff5722; font-weight:bold;">NICHT AKTIV</td>
              </tr>`;
          }
        }).join("");
      
        // HTML mit sticky Header
        const html = `
          <div style="font-family: system-ui, Segoe UI, Roboto, Arial; font-size:13px;
                      width:${WIDTH}px; max-height:${MAX_HEIGHT}px; overflow-y:auto;
                      padding:0; background:transparent;">
            <table style="width:${WIDTH}px; border-collapse:collapse; background:transparent;">
              <thead style="background:#212121;">
                <tr style="border-bottom:1px solid #666;">
                  <th style="width:55px; text-align:left; color:#f5f5f5; position:sticky; top:0; background:#212121;">Typ</th>
                  <th style="width:120px; text-align:left; color:#f5f5f5; position:sticky; top:0; background:#212121;">Gerät</th>
                  <th style="width:55px; text-align:right; color:#f5f5f5; position:sticky; top:0; background:#212121;">Batterie</th>
                  <th style="width:175px; text-align:left; color:#f5f5f5; position:sticky; top:0; background:#212121;">Status</th>
                </tr>
              </thead>
              <tbody>${rows}</tbody>
            </table>
          </div>`;
      
        setState(OUT, html, true);
      }
      
      // === Setup ===
      createState(OUT, "", { type: "string", role: "html", read: true, write: false }, () => {
        render();
      
        $('zigbee.0.*.battery').each(id => on({ id, change: "ne" }, render));
        $('hm-rpc.0.*.OPERATING_VOLTAGE').each(id => on({ id, change: "ne" }, render));
        $('hm-rpc.0.*.LOWBAT').each(id => on({ id, change: "ne" }, render));
        $('hm-rpc.0.*.LOW_BAT').each(id => on({ id, change: "ne" }, render));
        $('hm-rpc.0.*.UNREACH').each(id => on({ id, change: "ne" }, render));
      
        // Refresh alle 12 Stunden
        schedule("0 */12 * * *", render);
      });
      
      

      6b5592ae-b6ff-4685-8d3d-b1c59447e64e-grafik.png

      Tabelle ist html und lässt sich scrollen in meiner VIS

      posted in JavaScript
      M
      mguenther
    • RE: [erledigt]Skript zum Einsammeln von Batteriestatus von ...

      @paul53
      aber Paul, dein Ansatz mit const ids = $('zigbee.0.*.battery').toArray(); hat geholfen. ich bastle weiter und poste dann hier das Ergebnis.

      danke

      posted in JavaScript
      M
      mguenther
    • RE: [erledigt]Skript zum Einsammeln von Batteriestatus von ...

      @paul53
      dann habe ich noch nicht verstanden, was du mit "Namen" meinst. Anbei der Log-Auszug:

      javascript.0
      	2025-09-30 14:33:24.904	info	script.js.System.TEST2Batterie: registered 0 subscriptions, 1 schedule, 0 messages, 0 logs and 0 file subscriptions
      javascript.0
      	2025-09-30 14:33:24.903	info	script.js.System.TEST2Batterie: Taster_Sonnenrollo: 16
      javascript.0
      	2025-09-30 14:33:24.903	info	script.js.System.TEST2Batterie: Zimmer1_Fernsehtaster_Paulina: 60
      javascript.0
      	2025-09-30 14:33:24.902	info	script.js.System.TEST2Batterie: Zimmer1_Fernsehtaster_Marcus: 60
      javascript.0
      	2025-09-30 14:33:24.902	info	script.js.System.TEST2Batterie: Garagenwand_Heizung: 83
      javascript.0
      	2025-09-30 14:33:24.901	info	script.js.System.TEST2Batterie: Garagenwand_Tor_Sued: 70
      javascript.0
      	2025-09-30 14:33:24.901	info	script.js.System.TEST2Batterie: Garagenwand_Raum_Sued: 100
      javascript.0
      	2025-09-30 14:33:24.900	info	script.js.System.TEST2Batterie: Garagenwand_Briefkasten: 0
      javascript.0
      	2025-09-30 14:33:24.899	info	script.js.System.TEST2Batterie: Tuerklingel: 0
      javascript.0
      	2025-09-30 14:33:24.897	info	script.js.System.TEST2Batterie: Technikraum: 0
      javascript.0
      	2025-09-30 14:33:24.897	info	script.js.System.TEST2Batterie: Garage: 100
      javascript.0
      	2025-09-30 14:33:24.896	info	script.js.System.TEST2Batterie: Server: 37
      javascript.0
      	2025-09-30 14:33:24.896	info	script.js.System.TEST2Batterie: Arbeitszimmer: 0
      javascript.0
      	2025-09-30 14:33:24.893	info	script.js.System.TEST2Batterie: Bad_klein: 97
      javascript.0
      	2025-09-30 14:33:24.893	info	script.js.System.TEST2Batterie: Bad_klein: 0
      javascript.0
      	2025-09-30 14:33:24.892	info	script.js.System.TEST2Batterie: WC: 83
      javascript.0
      	2025-09-30 14:33:24.891	info	script.js.System.TEST2Batterie: Garderobe: 57
      javascript.0
      	2025-09-30 14:33:24.891	info	script.js.System.TEST2Batterie: Bad_gross: 23
      javascript.0
      	2025-09-30 14:33:24.890	info	script.js.System.TEST2Batterie: Aussen: 43
      javascript.0
      	2025-09-30 14:33:24.890	info	script.js.System.TEST2Batterie: Zimmer3: 30
      javascript.0
      	2025-09-30 14:33:24.889	info	script.js.System.TEST2Batterie: EG: 17
      javascript.0
      	2025-09-30 14:33:24.889	info	script.js.System.TEST2Batterie: Zimmer2: 43
      javascript.0
      	2025-09-30 14:33:24.889	info	script.js.System.TEST2Batterie: Bad_gross: 3
      javascript.0
      	2025-09-30 14:33:24.888	info	script.js.System.TEST2Batterie: Zimmer1: 0
      javascript.0
      	2025-09-30 14:33:24.888	info	script.js.System.TEST2Batterie: Zimmer3: 100
      javascript.0
      	2025-09-30 14:33:24.888	info	script.js.System.TEST2Batterie: Zimmer2: 100
      javascript.0
      	2025-09-30 14:33:24.887	info	script.js.System.TEST2Batterie: Zimmer1_rechts: 90
      javascript.0
      	2025-09-30 14:33:24.887	info	script.js.System.TEST2Batterie: Zimmer1_links: 100
      javascript.0
      	2025-09-30 14:33:24.802	info	Start JavaScript script.js.System.TEST2Batterie (Javascript/js)
      
      posted in JavaScript
      M
      mguenther
    • RE: [erledigt]Skript zum Einsammeln von Batteriestatus von ...

      @homoran
      hi homoran,
      nein, nicht zu allen. ich habe so etwas:

      4173b22d-2136-40cf-8753-f1fffe12dff9-grafik.png

      unter Sensordaten finde ich auch für einige Zigbeegeräte den "Batteriestatus"

      posted in JavaScript
      M
      mguenther
    • RE: [erledigt]Skript zum Einsammeln von Batteriestatus von ...

      @paul53
      ja, aber dann habe ich nicht alle zigbee geräte. ich wollte je eigentlich gerne alle zigbee geräte auswerten.

      posted in JavaScript
      M
      mguenther
    • RE: [erledigt]Skript zum Einsammeln von Batteriestatus von ...

      @paul53
      nicht das ich wüsste - die Geräte werden in Zigbee gepaired und bekommen diese Object ID Zuweisung. Ich wollte es mir einfach machen und quasi nen Platzhalter verwenden. Klappt aber irgendwie nicht

      posted in JavaScript
      M
      mguenther
    • RE: [erledigt]Skript zum Einsammeln von Batteriestatus von ...

      @paul53
      nicht zu allen.
      Zu denen ich bis jetzt etwas gemacht habe, ja - da gibts auch nen Alias. die Objekte unter den Objekt-IDs haben den Datenpunkt "battery"

      zigbee.0.00158d000237039e.battery
      
      posted in JavaScript
      M
      mguenther
    • RE: [erledigt]Skript zum Einsammeln von Batteriestatus von ...

      @paul53
      d9e3f3b5-59aa-4b94-8ddb-290fde857954-grafik.png

      mal als Screenshot

      posted in JavaScript
      M
      mguenther
    • RE: [erledigt]Skript zum Einsammeln von Batteriestatus von ...

      @paul53 gibts eben nicht, Paul - das ist ja mein Problem. Ich dachte irgendwie, dass man die Geräte ID irgendwie mit einem Platzhalter "*" ersetzen kann. Die Objekte unter der Objekt ID sind dann wieder identisch

      posted in JavaScript
      M
      mguenther
    • [erledigt]Skript zum Einsammeln von Batteriestatus von ...

      Hallo Zusammen,
      ich habe mehrere Zigbee Geräte am laufen, fast alle sind Batterie betrieben. Gibt es irgendwie eine Möglichkeit, eine Liste zu erzeugen, die mir z.b. für alle Zigbee eine json datei erzeugt und dort das Zigbee-Gerät und dann den Batterie Status hineinschreibt?

      Was meine ich? Die Zigbee Geräte sind alle mit einer Nummer aufgelistet - siehe Screenshot
      31b98a74-6c21-4dd8-86c5-5c9005507a6a-grafik.png

      Ich bekomme es nicht hin. Jemand eine Idee für einen Ansatz?

      danke
      Marcus

      posted in JavaScript
      M
      mguenther
    Community
    Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen
    The ioBroker Community 2014-2023
    logo