Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. Node-Red
    5. Offene Fenster in node-red

    NEWS

    • ioBroker@Smart Living Forum Solingen, 14.06. - Agenda added

    • ioBroker goes Matter ... Matter Adapter in Stable

    • Monatsrückblick - April 2025

    Offene Fenster in node-red

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

      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 Reply Last reply Reply Quote 0
      • M
        MagicSven last edited by

        daran wäre ich auch interessiert.

        R 1 Reply Last reply Reply Quote 0
        • R
          rewenode @MagicSven last edited by

          @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 Reply Last reply Reply Quote 0
          • M
            MagicSven last edited by

            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 Reply Last reply Reply Quote 0
            • R
              rewenode @MagicSven last edited by

              @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 Reply Last reply Reply Quote 0
              • First post
                Last post

              Support us

              ioBroker
              Community Adapters
              Donate

              814
              Online

              31.7k
              Users

              79.7k
              Topics

              1.3m
              Posts

              2
              5
              1592
              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