Skip to content
  • Home
  • Aktuell
  • Tags
  • 0 Ungelesen 0
  • Kategorien
  • Unreplied
  • Beliebt
  • GitHub
  • Docu
  • Hilfe
Skins
  • Light
  • Brite
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • 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. Skripten / Logik
  4. Problem mit JS und Zigbee-Lampen und -gruppen

NEWS

  • Jahresrückblick 2025 – unser neuer Blogbeitrag ist online! ✨
    BluefoxB
    Bluefox
    17
    1
    3.5k

  • Neuer Blogbeitrag: Monatsrückblick - Dezember 2025 🎄
    BluefoxB
    Bluefox
    13
    1
    1.1k

  • Weihnachtsangebot 2025! 🎄
    BluefoxB
    Bluefox
    25
    1
    2.5k

Problem mit JS und Zigbee-Lampen und -gruppen

Geplant Angeheftet Gesperrt Verschoben Skripten / Logik
javascript
1 Beiträge 1 Kommentatoren 227 Aufrufe 1 Watching
  • Ä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.
  • StrathColeS Offline
    StrathColeS Offline
    StrathCole
    schrieb am zuletzt editiert von
    #1

    Guten Morgen,

    ich stehe im Moment vor einem Problem mit der Steuerung meiner Lampen via JavaScript und dem Zigbee-Adapter.

    Zur Situation:
    Ich habe einige Lampen und ein paar Schalter via Zigbee eingebunden. Dazu habe ich die Lampen (nicht die Gruppen) via iot auch für Alexa verfügbar gemacht. Innerhalb von Alexa habe ich diese dann zusätzlich gruppiert.
    Ich kann die Gruppen aus ioBroker nicht an Alexa geben, weil ich in Alexa noch Geräte in den Gruppen habe, die nicht via ioBroker laufen.

    Zum Problem:
    Wenn ich die Lampen(-gruppen) via Schalter steuere, funktioniert das. Ich lausche auf die "click" States der verschiedenen Schalter und setze dann die brightness oder den power state der Zigbee-Gruppen, zum Beispiel etwa so:

    on(['zigbee.0.ccccc.left_click','zigbee.0.ccccc.right_click'], function(obj) {
        let grp = 'zigbee.0.group_6';
        if(obj.id.endsWith('.right_click')) {
            grp = 'zigbee.0.group_7';
        }
        if(obj.state.val) {
            let cur = getState(grp + '.brightness').val;
            if(cur && cur > 0) {
                setState(grp + '.brightness', 0);
                setState(grp + '.state', false);
            } else {
                    setState(grp + '.brightness', 100);
                    setState(grp + '.state', true);
            }
        }
    });
    

    Nun stellt sich folgendes Problem:
    Wenn ich die Lampen zwischenzeitlich via Alexa ausschalte oder die Helligkeit ändere, dann wird dieser Wert ja nur bei den einzelnen Lampen gesetzt, nicht bei der Gruppe. Drücke ich also den Schalter das nächste Mal, erkennt er nicht den richtigen Status. Bei ein/aus kriege ich es noch gebacken, bei der Helligkeit wird es schon schwieriger.

    Ich habe nun versucht, einfach zusätzlich auf den Lampenstatus zu horchen und die entsprechenden Gruppen zu aktualisieren (jetzt wirds konfus ;-) ):

    on(/^zigbee\.0\..*\.(brightness|state)$/, function(obj) {
        if(obj.state.ack) {
            return;
        }
        //log(obj.id + ': ' + JSON.stringify(obj));
        let match = obj.id.match(/^(zigbee\.0\..*)\.(brightness|state)/);
        if(!match) {
            return;
        }
    
        let deviceId = match[1];
        let attr = match[2];
    
        //log('Dev ' + deviceId + ' attr ' + attr + ' changed from ' + obj.oldState.val + ' to ' + obj.state.val);
    
        if(attr === 'brightness') {
            if(obj.oldState.val > 0 && obj.state.val == 0) {
                setState(deviceId + '.state', false);
            } else if(obj.oldState.val == 0 && obj.state.val > 0) {
                setState(deviceId + '.state', true);
            }
        } else {
            if(obj.oldState.val === false && obj.state.val === true) {
                let stat = getState(deviceId + '.brightness').val;
                if(stat === 0) {
                    setState(deviceId + '.brightness', 100);
                }
            } else if(obj.oldState.val === true && obj.state.val === false) {
                setState(deviceId + '.brightness', 0);
            }
        }
    
        if(obj.id.indexOf('zigbee.0.group_') === 0) {
            $('*.groups').each(function(stateid) {
                if(stateid.indexOf('zigbee.0.') !== 0) {
                    return this;
                } else if(stateid.indexOf('zigbee.0.info.') === 0) {
                    return this;
                }
    
                let grp = getState(stateid).val;
                if(!grp) {
                    return this;
                }
                grp = JSON.parse(grp);
                if(!grp) {
                    return this;
                }
                let memberId = stateid.substr(0, -7);
                log(JSON.stringify(grp));
                if(grp.indexOf(deviceId.replace(/^zigbee\.0\.group_/, '')) !== -1) {
                    log('Device ' + memberId + ' (' + stateid + ') is part of group ' + deviceId + ', setting ' + attr + ' to ' + JSON.stringify(obj.state.val));
                    setState(memberId + '.' + attr, obj.state.val, true);
                }
            });
        } else if(existsState(deviceId + '.groups')) {
            let grp = getState(deviceId + '.groups').val;
            grp = JSON.parse(grp);
            for(let i = 0; i < grp.length; i++) {
                log('Device ' + deviceId + ' is part of group ' + grp[i] + ', setting ' + attr + ' to ' + JSON.stringify(obj.state.val));
                setState('zigbee.0.group_' + grp[i] + '.' + attr, obj.state.val, true);
            }
        }
    
    });
    

    Das funktioniert aber nur so semigut. Vielleicht hat noch jemand eine Idee, wie ich das Problem besser angehen kann.
    Dazu kommt ja noch, dass ich ebenso folgende Konstellation habe:

    8 Lampen
    4 davon in Gruppe 1
    4 davon in Gruppe 2
    alle 8 in Gruppe 3

    Gruppe 1 und 2 sind via Alexa verfügbar und dort wiederum in einer eigenen Gruppe (ich nenne sie mal Gruppe 4) zusammengefasst. Also hilft mein obiges Skript nicht, denn:
    Alexa, schalte Gruppe 4 aus.
    -> Gruppe 1 und 2 kriegen den Befehl ausschalten via ioBroker
    -> Mein Listener greift und setzt die 4 Lampen in den jeweiligen Gruppen auf den richtigen Status
    -> Da ich aber mit ack = true setzen muss, kann der Listener nun Gruppe 3 nicht mehr anpassen, die aber vom Lichtschalter gesteuert wird. Somit hat der Lichtschalter beim Drücken die falsche Info über Gruppe 3.

    Oje, das war jetzt hoffentlich nicht zu verwirrend.

    Liebe Grüße
    Marius

    SolarWatt-Anlage mit 9,6 kWp – KOSTAL Plenticore Plus 10 – BYD B-Box HV 8,96 – Viessmann Vitocal 333g – Zehnder ComfoD 350 (Comfoair 350) mit RS232-Ethernet-Konverter

    1 Antwort Letzte Antwort
    0
    Antworten
    • In einem neuen Thema antworten
    Anmelden zum Antworten
    • Älteste zuerst
    • Neuste zuerst
    • Meiste Stimmen


    Support us

    ioBroker
    Community Adapters
    Donate

    324

    Online

    32.7k

    Benutzer

    82.4k

    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