Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Einsteigerfragen
    4. Szenen Adapter: einzele mit DP de-/aktivieren

    NEWS

    • Wir empfehlen: Node.js 22.x

    • Neuer Blog: Fotos und Eindrücke aus Solingen

    • ioBroker goes Matter ... Matter Adapter in Stable

    Szenen Adapter: einzele mit DP de-/aktivieren

    This topic has been deleted. Only users with topic management privileges can see it.
    • A
      australien last edited by

      Hallo zusammen,

      im Adapter bzw in den Szenen ist es manuel möglich einzelne DP aus der Szenen zu deaktiveren.
      Ist dies auch mittels script bzw DP möglich?
      7beb0f61-5036-4da5-bbfb-efdffb5ff588-grafik.png

      danke Euch

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

        @australien ist das hier nichts?
        Screenshot_20250728-172138_Firefox.jpg

        A 1 Reply Last reply Reply Quote 0
        • A
          australien @Homoran last edited by

          @homoran stimmt, hier in scenes ist nichts drinnen, leer.

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

            @australien sagte in Szenen Adapter: einzele mit DP de-/aktivieren:

            in scenes ist nichts drinnen, leer.

            richtig, bei mir auch!

            deswegen darüber nachsehen

            A 1 Reply Last reply Reply Quote 0
            • A
              australien @Homoran last edited by

              @homoran das ist mir klar, da stehen auch die Werte der einzelnen Szenen richtig drinnen und es wird auch alles richtig ausgeführt.

              Nur möchte ich nun situativ einzelne DP aus der Szene per Javascript tempurär deaktiveren bzw aktivieren.
              Im Adapter ist das ja mit den Schiebern möglich, darum die Frage.

              016ee866-fab7-45c9-969d-2bae067021ad-grafik.png

              paul53 Homoran 2 Replies Last reply Reply Quote 0
              • paul53
                paul53 @australien last edited by

                @australien sagte: einzelne DP aus der Szene per Javascript tempurär deaktiveren bzw aktivieren.

                Zeige bitte die OBJEKTDATEN deiner Szene in Code tags.

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

                  @australien sagte in Szenen Adapter: einzele mit DP de-/aktivieren:

                  da stehen auch die Werte der einzelnen Szenen richtig drinne

                  ich habe zum Test eine Szene mit Namen szene0 angelegt.
                  Ich habe unter scene.0 einen Datenpunkt scene0 der von true auf false und zurück wechselt, wenn ich fie Szene im Adaptr (de-) aktiviere

                  A 1 Reply Last reply Reply Quote 0
                  • A
                    australien @Homoran last edited by

                    @homoran
                    ich kann leider diese nicht in Code tags anzeigen lassen, darum die Bilder.

                    0de7f600-8b08-4da4-b8f3-fc8e09cb3096-grafik.png
                    8e0209eb-563d-46ac-b3bc-ff434cbafc4a-grafik.png

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

                      @australien sagte in Szenen Adapter: einzele mit DP de-/aktivieren:

                      ich kann leider diese nicht in Code tags anzeigen lassen

                      • Expertenmodus
                      • Bleistift
                      • Objektdaten
                      • -> json kopieren und in code-tags posten
                      A 1 Reply Last reply Reply Quote 0
                      • A
                        australien @Homoran last edited by australien

                        @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.

                        paul53 1 Reply Last reply Reply Quote 0
                        • paul53
                          paul53 @australien last edited by paul53

                          @australien sagte: wie kann ich aus dem DP die Objectdaten mit JS umschreiben?

                          Versuche es mal so:

                          const idScene = 'scene.0.Rollo_EG_SW';
                          const obj = getObject(idScene);
                          
                          function controlDp(id, enable) {
                              for(let member of obj.native.members) {
                                  if(member.id == id) {
                                      member.disabled = !enable;
                                      break;
                                  }    
                              }
                              setObject(idScene, obj);
                          }
                          
                          const idDp = 'alias.0.Rollo.EG.Kueche.SW.Position';
                          controlDp(idDp, true); // Aktivierung
                          
                          A 1 Reply Last reply Reply Quote 0
                          • A
                            australien @paul53 last edited by australien

                            @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!

                            paul53 1 Reply Last reply Reply Quote 0
                            • paul53
                              paul53 @australien last edited by

                              @australien
                              Anmerkung zu Zeile 29: Es ist kein JSON, sondern ein Objekt.

                              A 1 Reply Last reply Reply Quote 0
                              • A
                                australien @paul53 last edited by australien

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

                                paul53 1 Reply Last reply Reply Quote 0
                                • paul53
                                  paul53 @australien last edited by

                                  @australien sagte: das ist doch nur der Name der Variablen.

                                  Ja, aber man sollte sich nicht selbst durch schlecht gewählte Variablenbezeichner verwirren.

                                  1 Reply Last reply Reply Quote 2
                                  • A
                                    australien last edited by

                                    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);
                                        }
                                    });
                                    
                                    
                                    1 Reply Last reply Reply Quote 0
                                    • First post
                                      Last post

                                    Support us

                                    ioBroker
                                    Community Adapters
                                    Donate

                                    537
                                    Online

                                    32.0k
                                    Users

                                    80.4k
                                    Topics

                                    1.3m
                                    Posts

                                    3
                                    16
                                    189
                                    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