Navigation

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

    NEWS

    • Neuer Blog: Fotos und Eindrücke aus Solingen

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

    • ioBroker goes Matter ... Matter Adapter in Stable

    L
    • Profile
    • Following 0
    • Followers 0
    • Topics 0
    • Posts 8
    • Best 0
    • Groups 1

    loehrj1

    @loehrj1

    0
    Reputation
    9
    Profile views
    8
    Posts
    0
    Followers
    0
    Following
    Joined Last Online

    loehrj1 Follow
    Starter

    Latest posts made by loehrj1

    • RE: Adapter für VELUX KLF-200 Interface

      Hallo Paulkern,

      so sollte es klappen:

      
      else if (Num == Sz)
           {
               Rollos[0] = SzSudLinks
               Rollos[1] = SzSudRechts
               Rollos[2] = SzOstLinks
               Rollos[3] = SzOstRechts
               Count = 4
      

      Du musst die Arrayelemente mit den Indizes ab 0 bis Count-1 mit den gewünschten Node Indizes (SzSudlinks, SzSudRechts,...) belegen
      Gruß
      jürgen

      posted in Tester
      L
      loehrj1
    • RE: Adapter für VELUX KLF-200 Interface

      @Singular75
      Hallo Singular75,
      gern geschehen. Übergebe während der Rollofahrt den Wert 0xD200 für Val an function Rollo(...) und das Rollo sollte an der aktuellen Position stehen bleiben.....
      Viele Grüße
      Jürgen

      posted in Tester
      L
      loehrj1
    • RE: Adapter für VELUX KLF-200 Interface

      Hallo Alex,

      ich steuere aktuell 5 Solarroladen (Az..., Sz, Wz...) über dieses Script in Verbindung mit der KLF-200 API.
      Die Ansteuerung der einzelnen Rolladen erfolgt über die Logitech Harmony und über Apple Homekit.

      Eine kurze Beschreibung der verwendeten Funktionen:

      function ConnectKlf()
      Aufbau der Vebindung zum KLF200

      function Rollo( Num, Val)
      Ansteuerung der Rolladen. Num ist NodeId des zu steuernden Rollos. Num entspricht einem Wert zwischen 0 und 0xc700, 0xD200 entspricht dem Wert für Stop

      function GetState()
      Holt den Öffnungswert aller 5 Rolladen. Verwende ich zyklisch als Idle-Telegramm zur Aufrechterhaltung der Verbindung

      function Status(data)
      Callbackfunktion zur Auswertung der Öffnungswerte der Rolladen aus data.parameterData[0].parameter (Highbyte) und data.parameterData[0].parameterValue (Lowbyte)

      function JobFinished(data)
      Callback fuer Ende der Befehlsausfuehrung

      onStop(function skriptStop () {....
      Beenden des scripts mit Verbindungsabbau und Aufräumen

      schedule('/1 * * * ', function () {...
      Lebenszeichentelegramm und Statusabfrage jede Minute

      *schedule('5 23 * * ', function () {....
      Reboot des KLF200 einmal am Tag

      Viele Grüße
      Jürgen

      Hier das Script:

      'use strict' ; 
      // Netzwerk
      const Ip       = '192.168.178.5'
      const Passwort = '0123456789' // WLAN Passwort
       
      // nodeIDs der einzelnen Rollos
      const AzWest = 0 // nodeId Arbeitzimmer Fenster Westseite
      const AzOst  = 1 // nodeId Arbeitzimmer Fenster Ostseite
      const SzSued = 2 // nodeId Schlafzimmer Fenster Suedseite
      const WzSued = 3 // nodeId Wohnzimmer Fenster Suedseite
      const WzNord = 4 // nodeId Wohnzimmer Fenster Nordseite
      
      const MaxNodeIdx = 5;  // 5 Rollos..
      
      const Z = ["AzWest","AzOst","Sz","WzSued","WzNord"] // Name fuer Zuugriff azf Statevariable
       
      // Gruppen
      const All   = 5 // Alles Dachrolladen
      const Wz    = 6 // Wohnzimmer
      const Az    = 7 // Arbeitszimmer
      const Sz    = 2 // Schlafzimmer
        
      const Up    = 0      // Rollo oben
      const Down  = 0xc800 // Rollo unten
      const Stop  = 0xD200 // Stopkommando
        
      // Variable
      var velux  = require('velux-klf200-api')
      var Connected = false
      
      var SessionId = 1
      
      // Zustand der 5 Rollos holen  
       function GetState()
       {
          velux.sendCommand({ api: velux.API.GW_STATUS_REQUEST_REQ,
                          sessionID: 0,
                          indexArrayCount: 5,
                          indexArray : [AzOst, AzWest, SzSued, WzSued, WzNord],
                          statusType : 3 // Main Info
                          })  
       }
          
      
       
      // Callback fuer Positionsrueckmeldung 
      velux.on('GW_STATUS_REQUEST_NTF', Status)     
      function Status(data)
      {
          var Target     = Math.round(100 - data.targetPosition.value)
          var Current    = Math.round(100 - data.currentPosition.value) // aktuelle Position
          var Time       = data.remainingTime // Restlaufzeit
          var Index      = data.index         // Node index
          var StatusType = data.statusType    // Status Typ "Main Info" = 3 erwartet
      
          //  console.log(JSON.stringify(data))
          console.log(Z[data.index] + ',Ziel:' +Target + ' Aktuell:' + data.currentPosition.value + ' Restlaufzeit:' + Time)
      
          if ( (StatusType == 3) && 
               (Time == 0) && 
               (Index >= 0) && 
               (Index < MaxNodeIdx))
          {
              var IdStr    = "javascript.0.Var.DG.Dach.Soll." + Z[data.index] 
              var IdStrIst = "javascript.0.Var.DG.Dach.Ist."  + Z[data.index] 
              setState(IdStr,    Current)
              setState(IdStrIst, Current)
          }
      }
        
      // Callback Ende Job
      velux.on('GW_SESSION_FINISHED_NTF',JobFinished)
      function JobFinished(data){
          if ( SessionId == data.sessionID )  // Ende letztes Kommando
          {
              console.log("EndCmd (" + SessionId+')')
              GetState()    // bei Befehlsende Position der fenster abfragen
          }
      }
        
      // Verbindung aufbauen
      function ConnectKlf() { 
          if (! Connected)
          {
              Connected = true;
              velux.connect( Ip, {} )
              .then(()=>{
                  velux.login( Passwort ).then(()=>{
                  sendMsg("KLF: Connected")
                  console.log("Klf connected!")
                  Connected = true
                  GetState();
                  })
              })
              .catch((err)=>{
                  console.log(err)
                  Connected = false
                  velux.end()
              })
          }
      } 
         
      // Rollos ansteuern
      var Rollos = [0,1,2,3,4]
      var Count  = 5 
      function Rollo( Num, Val) {
          if ( Connected )
          {
              if (Num == All)
              {
                  Rollos[0] = WzSued
                  Rollos[1] = WzNord
                  Rollos[2] = AzOst
                  Rollos[3] = AzWest
                  Rollos[4] = SzSued
                  Count = 5
              }
              else if (Num == Wz)
              {
                  Rollos[0] = WzSued
                  Rollos[1] = WzNord
                  Count = 2
              }
              else if (Num == Az)
              {
                  Rollos[0] = AzOst
                  Rollos[1] = AzWest
                  Count = 2
              }
              else
              {
                  Rollos[0] = Num
                  Count = 1
              }
              return velux.sendCommand({ api: velux.API.GW_COMMAND_SEND_REQ,
                  sessionID : ++SessionId,
                  commandOriginator: 1,
                  priorityLevel:     2,
                  parameterActive:   1,
                  functionalParameterMP:  {rawValue : Val}, 
                  indexArrayCount: Count,
                  indexArray : [Rollos[0], Rollos[1], Rollos[2], Rollos[3], Rollos[4]] ,
                  priorityLevelLock: false,
                  })
              .then((data)=>{
                      console.log("StartCmd (" + data.sessionID+')')
              })
              .catch((err)=>{
                  console.log(err)
          })
          }
      } 
      
      // Restart einmal pro Tag um 22 Uhr 
      schedule('5 20 * * *', function () {
          velux.sendCommand({ api: velux.API.GW_REBOOT_REQ})
          Connected = false
      });
      
      // zyklisches Senden Idle Telegramm und Rolladenstatus holen 
      schedule('*/1 * * * *', function () {
          velux.sendCommand({ api: velux.API.GW_GET_STATE_REQ})
          .then((data)=>{
              Connected = true
              GetState()       // Rolladenpostionen holen
          })
          .catch((err)=>{
              Connected = false
              sendMsg("KLF: Connection lost")
              console.log("Connection lost...")       
              ConnectKlf() 
          })
      }); 
        
      // Verbinden zu klf200
      ConnectKlf()
      
       
      // Verbindung abbauen und aufraeumen bei Stop
      onStop(function skriptStop () {
          Connected = false
          console.log("Disconnect")
          velux.off('GW_STATUS_REQUEST_NTF',  Status)
          velux.off('GW_SESSION_FINISHED_NTF',JobFinished)
          velux.end()
      });
       
       
      
      
      
      //*******************************************************************************
      //    Befehle aus Homekit
      //*******************************************************************************
      on({id: 'javascript.0.Var.DG.Dach.Alle', change: 'ne' }, function (obj) {
          var State = Down - Down / 100 * obj.state.val
          Rollo(All, State)
      });
      on({id: 'javascript.0.Var.DG.Dach.Soll.WzSued', change: 'ne'}, function (obj) {
          var State = Down - Down / 100 * obj.state.val
          Rollo(WzSued, State)
      });
      on({id: 'javascript.0.Var.DG.Dach.Soll.WzNord', change: 'ne' }, function (obj) {
          var State = Down - Down / 100 * obj.state.val
          Rollo(WzNord, State)
      });
      on({id: 'javascript.0.Var.DG.Dach.Soll.AzOst', change: 'ne' }, function (obj) {
          var State = Down - Down / 100 * obj.state.val
          Rollo(AzOst, State)
      });  
      on({id: 'javascript.0.Var.DG.Dach.Soll.AzWest', change: 'ne' }, function (obj) {
          var State = Down - Down / 100 * obj.state.val
          Rollo(AzWest, State)
      });
      on({id: 'javascript.0.Var.DG.Dach.Soll.Sz', change: 'ne' }, function (obj) {
          var State = Down - Down / 100 * obj.state.val
          Rollo(Sz, State)
      });   
      
      //*******************************************************************************
      //    Mapping fuer Logitech Harmony
      //*******************************************************************************
      // Dach zu
      subscribe({id: 'fakeroku.0.Rolladen.keys.Left', val : true, ack :true}, function (obj) {
          Rollo(Wz, Down)
      });
      // Dach auf
      subscribe({id: 'fakeroku.0.Rolladen.keys.Down', val : true, ack :true}, function (obj) {
          Rollo(Wz, Up)
      });
      // Dach Stop
      subscribe({id: 'fakeroku.0.Rolladen.keys.Info', val : true, ack :true}, function (obj) {
          Rollo(Wz, Stop)
      });
      // Alles zu
      subscribe({id: 'fakeroku.0.Rolladen.keys.Home', change :'ne', ack :true}, function (obj) {
          Rollo(Wz, Down)
          setStateDelayed("hm-rpc.1.OEQ1312460.1.LEVEL", 0,  100, true)
          setStateDelayed('hm-rpc.1.KEQ0157348.1.LEVEL', 0,  100, true)
      });
      
      posted in Tester
      L
      loehrj1
    • RE: Adapter für VELUX KLF-200 Interface

      @arteck
      Danke, dein Tipp hat mich auf die richtige Spur geführt - manchmal hat man eben Tomaten auf den Augen....
      JSON.parse liefert mir allerdings einen Fehler zurück.
      Die Ausgabe console.log(typeof data) liefert mir object zurück. Ich habe hier doch bereits ein Javascript Objekt vorliegen und muss folglich nicht parsen. Richtig?

      Der Zugriff erfolgt mit einfach mit dem Punktoperator auf die jeweiligen Eigenschaften des Objektes....

      posted in Tester
      L
      loehrj1
    • RE: Adapter für VELUX KLF-200 Interface

      Hallo zusammen,

      auch bei mir läuft nun seit 3 knapp Wochen ein Javacript unter ioBroker zum Ansteuern meiner 5 Solarrolladen unter Benutzung der "VELUX-KLF200-API". Das funktioniert zwischenzeitlich auch fast fehlerfrei.
      Ich sende alle 3 Minuten mittels Cronjob einen Befehl (Idle-Telegramm) „GW_GET_STATE_REQ“ zur Aufrechterhaltung der Verbindung.
      Einmal am Tag gibt’s dann einen Reset „GW_REBOOT_REQ“ (Zurücksetzen des Interfaces) auf die Mütze…
      Das Ansteuern der Rolladen mittels „GW_COMMAND_SEND_REQ“ (einzeln bzw. eine beliebige Kombinationen) mit der gewünschten Absolutposition sowie Stopp während der Fahrt funktioniert nun auch.
      Ich würde nun gerne noch die Rückmeldungen zu den Befehlen auswerten.
      Leider erhalte ich hier generell nur eine Ausgabe der Form

      07:41:30.056 info javascript.0 script.js.Velux: [object Object]

      Zur Ansteuerung der Rolladen verwende ich Aufrufe der Form:

         return velux.sendCommand({ api: velux.API.GW_COMMAND_SEND_REQ,
              commandOriginator: 1,
              priorityLevel: 2,
              parameterActive: 1,
              functionalParameterMP:  {rawValue : Val}, 
              indexArrayCount: Count,
              indexArray : [Rollos[0], Rollos[1], Rollos[2], Rollos[3], Rollos[4]] ,
              priorityLevelLock: false,
              })
          .then((data)=>{
              console.log(data)
          })
      

      Hat hier jemand von Euch Erfahrung? Was läuft hier schief bzw. was mache ich hier falsch?

      Danke und viele Grüße
      Jürgen

      posted in Tester
      L
      loehrj1
    • RE: Nanoleaf Light Panels (Aurora) Adapter

      Hallo Daniel,

      eingespielt und läuft!! Super!

      Viele Dank und einen schönen Sonntag

      Jürgen

      posted in ioBroker Allgemein
      L
      loehrj1
    • RE: Nanoleaf Light Panels (Aurora) Adapter

      Hallo Daniel,

      danke für Deine prompte Antwort. 🙂

      Ich dachte die Canvas hätten ein Rhythm-Module bereits integriert?

      Viele Grüße

      Jürgen

      Anbei der Auszug der Auszug der URL.

      {"name":"Canvas 2844","serialNo":"xxxxxxxxxx","manufacturer":"Nanoleaf","firmwareVersion":"1.1.0","model":"NL29","discovery":{},"effects":{"effectsList":["Dark Northen Lights for TV!","Fireworks","Forest","Meteor Shower","Ocean","Paint Splatter","Pulse Pop Beats","Rain","Rhythmic Northern Lights","Sound Bar","Streaking Notes","Test","Test2","Triluminox Energy Crystal","Ultra Violet Chill","moonlight","Fifty shades","Black and White","Lavender Fields","Falling Whites"],"select":"Black and White"},"panelLayout":{"globalOrientation":{"value":0,"max":360,"min":0},"layout":{"numPanels":17,"sideLength":100,"positionData":[{"panelId":16589,"x":350,"y":100,"o":0,"shapeType":2},{"panelId":14255,"x":250,"y":150,"o":90,"shapeType":2},{"panelId":517,"x":150,"y":100,"o":0,"shapeType":2},{"panelId":33681,"x":100,"y":0,"o":270,"shapeType":2},{"panelId":7323,"x":200,"y":250,"o":270,"shapeType":2},{"panelId":4623,"x":100,"y":300,"o":180,"shapeType":2},{"panelId":16313,"x":150,"y":400,"o":0,"shapeType":2},{"panelId":64338,"x":50,"y":450,"o":180,"shapeType":2},{"panelId":64335,"x":100,"y":550,"o":0,"shapeType":2},{"panelId":42913,"x":200,"y":600,"o":90,"shapeType":2},{"panelId":44352,"x":150,"y":700,"o":270,"shapeType":2},{"panelId":26672,"x":200,"y":800,"o":90,"shapeType":2},{"panelId":3377,"x":150,"y":900,"o":270,"shapeType":2},{"panelId":12717,"x":50,"y":950,"o":90,"shapeType":2},{"panelId":30679,"x":0,"y":1050,"o":270,"shapeType":2},{"panelId":61024,"x":50,"y":1150,"o":90,"shapeType":2},{"panelId":52816,"x":200,"y":1000,"o":90,"shapeType":2}]}},"state":{"brightness":{"value":20,"max":100,"min":0},"colorMode":"effect","ct":{"value":2700,"max":6500,"min":1200},"hue":{"value":0,"max":360,"min":0},"on":{"value":false},"sat":{"value":0,"max":100,"min":0}}}

      posted in ioBroker Allgemein
      L
      loehrj1
    • RE: Nanoleaf Light Panels (Aurora) Adapter

      Hallo zusammen,

      ich habe gestern meine nanoleaf Canvas bekommen und in Betrieb genommen.

      Leider bekomme ich den nanoleaf Adapter (0.6.1) nicht zum Laufen.

      Die Anforderung des Authentifizierungs-Token klappt soweit, der Adpater bleibt jedoch im Zustand 'rot'.

      Ich erhalte folgende Fehlermeldungen:

      11627_bildschirmfoto_2019-01-12_um_08.01.33.png

      Könnte ihr mir hier bitte weiterhelfen?

      Viele Grüße und besten Dank

      Jürgen

      posted in ioBroker Allgemein
      L
      loehrj1
    Community
    Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen
    The ioBroker Community 2014-2023
    logo