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. Node-Red
  5. Offene Fenster in node-red

NEWS

  • UPDATE 31.10.: Amazon Alexa - ioBroker Skill läuft aus ?
    apollon77A
    apollon77
    48
    3
    8.7k

  • Monatsrückblick – September 2025
    BluefoxB
    Bluefox
    13
    1
    2.2k

  • Neues Video "KI im Smart Home" - ioBroker plus n8n
    BluefoxB
    Bluefox
    16
    1
    3.2k

Offene Fenster in node-red

Geplant Angeheftet Gesperrt Verschoben Node-Red
5 Beiträge 2 Kommentatoren 1.7k 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.
  • R Offline
    R Offline
    rewenode
    schrieb am zuletzt editiert von
    #1

    Hallo und schönen Sonntag,

    ich Werkel zwar schon eine Weile mit node-red, aber in Kombination mit iobroker noch nicht sehr lange.

    Ich will mal zum Einstieg einen flow erstellen, der ausgibt, ob noch irgendwo ein Fenster offen ist.

    Ja, die nativen Lösungen mit Javascript kenne ich, wollte aber mal sehen ob/wie man das in node.red machen kann. Ich hab das mal für 2 Fenster getestet, was ganz gut geht:

    ! ````
    [
    {
    "id": "76e5f2ca.ba9304",
    "type": "inject",
    "z": "36db0a59.9d010e",
    "name": "Object of HM Object.STATES",
    "topic": "",
    "payload": "{"hm-rpc.0.LEQ0187373.1.STATE":"","hm-rpc.0.NEQ1681523.1.STATE":""}",
    "payloadType": "json",
    "repeat": "",
    "crontab": "",
    "once": false,
    "onceDelay": 0.1,
    "x": 160,
    "y": 1100,
    "wires": [
    [
    "75d48239.60494c"
    ]
    ]
    },
    {
    "id": "75d48239.60494c",
    "type": "split",
    "z": "36db0a59.9d010e",
    "name": "",
    "splt": "\n",
    "spltType": "str",
    "arraySplt": 1,
    "arraySpltType": "len",
    "stream": false,
    "addname": "topic",
    "x": 230,
    "y": 1160,
    "wires": [
    [
    "74f007e1.835348"
    ]
    ]
    },
    {
    "id": "74f007e1.835348",
    "type": "ioBroker get",
    "z": "36db0a59.9d010e",
    "name": "",
    "topic": "",
    "attrname": "payload",
    "payloadType": "object",
    "x": 210,
    "y": 1240,
    "wires": [
    [
    "a4cdfce0.9f025"
    ]
    ]
    },
    {
    "id": "a4cdfce0.9f025",
    "type": "join",
    "z": "36db0a59.9d010e",
    "name": "if all false then true",
    "mode": "reduce",
    "build": "object",
    "property": "payload",
    "propertyType": "msg",
    "key": "topic",
    "joiner": "\n",
    "joinerType": "str",
    "accumulate": false,
    "timeout": "",
    "count": "2",
    "reduceRight": false,
    "reduceExp": "($A or payload.val)",
    "reduceInit": "false",
    "reduceInitType": "bool",
    "reduceFixup": "",
    "x": 210,
    "y": 1320,
    "wires": [
    [
    "bbcda8f4.974f18"
    ]
    ]
    },
    {
    "id": "bbcda8f4.974f18",
    "type": "debug",
    "z": "36db0a59.9d010e",
    "name": "",
    "active": true,
    "tosidebar": true,
    "console": false,
    "tostatus": false,
    "complete": "true",
    "x": 470,
    "y": 1320,
    "wires": []
    }
    ]

    
    Nun will ich das Ganze so erweitern, dass eine Liste der offenen Fenster ausgegeben wird.
    
    Dazu wäre es aber ganz gut, wenn ich in Node.red irgendwie an die Namen der Fenster können könnte. Ich wollte sie nicht alle einzeln eingeben.
    
    Weiss jemand, wie ich in node.red an die Namen kommen könnte?
    1 Antwort Letzte Antwort
    0
    • M Offline
      M Offline
      MagicSven
      schrieb am zuletzt editiert von
      #2

      daran wäre ich auch interessiert.

      R 1 Antwort Letzte Antwort
      0
      • M MagicSven

        daran wäre ich auch interessiert.

        R Offline
        R Offline
        rewenode
        schrieb am zuletzt editiert von
        #3

        @MagicSven Ist zwar schon 2 Jahre her und inzwischen hab ich das in JS gelöst, ich weis jetzt allerdings trotzdem wie es geht;-)
        Dazu kannst du das ioB-get-node nehmen.
        Hab da mal als Beispiel ein HM-Fenster von mir. Als Namen hatte ich da
        "Fenster Vorratsraum" vergeben, während das Teil im original "Vorratsraum Fenster" heisst. (siehe Bild)

        Fragst du im ion-get mit der ID des Actors ab, bekommst du im Common der Ausgabe den Namen des Actors.
        Fragst du mit der ID des State ab, bekommst du im Common den Namen des States. Siehe Bild

        2020-03-23_14-47-29.png

        Du musst also jeweils mit 2 Abfragen arbeiten
        Einmal mit der State-Id für den Status und einmal mit der Actor-ID für den Namen.

        1 Antwort Letzte Antwort
        0
        • M Offline
          M Offline
          MagicSven
          schrieb am zuletzt editiert von
          #4

          cool - vielen Dank. Der Ansatz ist gut.

          Wie hast du das in JS gelöst? Das habe ich auch versucht aber bei mir ist folgender Fehler den ich nicht weg bekomme.

          Wird ein Fenster geöffnet, steht in einem Textfeld "Fenster Bad"
          wird ein zweites Fenster geöffnet, steht "Fenster Bad; Fenster Küche"
          wird jetzt ein Fenster geschlossen, dann steht: " "
          obwohl ja noch eins offen sein sollte.

          Daher würde mich das in JS natürlich sehr interessieren

          R 1 Antwort Letzte Antwort
          0
          • M MagicSven

            cool - vielen Dank. Der Ansatz ist gut.

            Wie hast du das in JS gelöst? Das habe ich auch versucht aber bei mir ist folgender Fehler den ich nicht weg bekomme.

            Wird ein Fenster geöffnet, steht in einem Textfeld "Fenster Bad"
            wird ein zweites Fenster geöffnet, steht "Fenster Bad; Fenster Küche"
            wird jetzt ein Fenster geschlossen, dann steht: " "
            obwohl ja noch eins offen sein sollte.

            Daher würde mich das in JS natürlich sehr interessieren

            R Offline
            R Offline
            rewenode
            schrieb am zuletzt editiert von
            #5

            @MagicSven sagte in Offene Fenster in node-red:

            Wird ein Fenster geöffnet, steht in einem Textfeld "Fenster Bad"
            wird ein zweites Fenster geöffnet, steht "Fenster Bad; Fenster Küche"
            wird jetzt ein Fenster geschlossen, dann steht: " "

            Das hat eigentlich nichts mit NR oder JS zu tun. Ich frage halt nur zu einer bestimmten Zeit ab und reagiere nicht automatisch auf den Zustand. Wenn das bei dir so sein soll, musst du immer wenn sich der Zustand eines Fensters ändert, den String komplett neu aufbauen.
            Was mein JS-Script anbetrifft so wirst du es nicht ohne Weiteres verwenden können.
            Ich arbeite inzwischen für alle Tür-/Fensteraktoren mit alias.0-States. Das hat den Vorteil, dass in gleicher Weise sowohl HM- als auch meine Zigbee-Aktoren bearbeitet werden können. Und einen Aktor austauschen ist auch kein Problem mehr.

            Das Skript sieht dann so aus:

            //R. W.     17.11.2018 
            //          04.12.2018 - cacheSelector[] 
            //          13.12.2019 - Umstellung auf alias.0
            
            const resultType = "open"; // all, open, close
            
            // array of states
            // $() ist a object function in iob JS API
            var cacheSelector = [$('state[id=alias.0.Verschluss.*]')];
            
            function countOpenwindows() {
                let windows = []; // array of windows-objects
                let speakVolume = '50';
                let speakText = '';
            
                for (const cSelector of cacheSelector) {
                    
                    // $(selector).each(function(id, i) {});  each dp in cSelector
                    cSelector.each(function (id) {
            
                        let w = {};
                        let deviceId = id.substr(0, id.lastIndexOf("."));
                        w.id = id; //state _id
            
                        // Name is Part from id in alias.0 states
                        // "alias.0.Verschluss.Fenster_Gäste_WC.opened"
                        // "alias.0.Verschluss.Garage.Zwischentür_vorn.Schloss.opened"
                        let name = id.replace(/alias.0.Verschluss./, "").replace(/.opened/, "");
                        w.Name = name;
                        w.val = getState(id).val;
            
                        switch (resultType) {
                            case 'open':
                                if (w.val === true) { windows.push(w); }
                                break;
                            case 'close':
                                if (w.val === false) { windows.push(w); }
                                break;
                            default: //all
                                if (w.val === true || w.val === false) { windows.push(w); }
                                break;
                        }
                    });  // end each dp in cSelector
                };  // end for each cacheSelector
            
            
                // if no result 
                if (windows.length < 1) {
                    windows.push({
                        "Name": 'keine',
                        "id": '',
                        "val": null
                    });
                }
            
                // prepare speak text
                windows.forEach((w) => {
                    //replace all special characters with underscore
                    w.Name = w.Name.replace(/:|,|#|;|-|[ ]/g, '_');
            
                    //join Name to speakText and 
                    //calculate speak block length and set delimiter
                    speakText = speakText + w.Name + ((w.Name.length < 100) ? "," : ";");
            
                    log(w.id + ' ' + w.Name + ' ' + w.val);
                });
            
                speakText = speakVolume + ';offene Fenster oder Türen,' + speakText;
            
                log('speakText: ' + speakText);
            
                //alexa speak
                setTimeout(function () {
                    setState("alexa2.0.Echo-Devices." + getState('alexa2.0.History.serialNumber').val + ".Commands.speak", speakText);
                }, 2000);
            }
            
            on({ id: 'javascript.0.Alexa-trigger.vOpenWindows', change: "any" }, function (obj) {
                countOpenwindows();
            });
            

            Das Skript ist mehr mit der heissen Nadel und war mal ne Vorlage um alle offenen oder geschlossenen Fenster auszulesen. Tut es aber. Und wie das meist mit Improvisationen ist...

            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

            847

            Online

            32.4k

            Benutzer

            81.5k

            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