Skip to content
  • 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
  1. ioBroker Community Home
  2. Deutsch
  3. Skripten / Logik
  4. Sonoff RF Bridge Tasmota und Portisch 433mhz

NEWS

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

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

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

Sonoff RF Bridge Tasmota und Portisch 433mhz

Geplant Angeheftet Gesperrt Verschoben Skripten / Logik
javascriptscenesmonitoring
44 Beiträge 23 Kommentatoren 9.8k Aufrufe 22 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.
  • P Offline
    P Offline
    pangaea
    schrieb am zuletzt editiert von
    #9

    rf-bridge.jpg Hallo,
    auch nochmal besten Dank für das Script 🙂 Finde ich absolut genial 🙂
    Auch das, wenn man doch mal die Standardfernbedienung benutzt, über den Counter eine Rückmeldung auf den Leuchtenstatus registrieren kann.
    Vor der geflashten Sonoff Bridge hatte ich nur 433Mhz Module am Raspi, war damit aber nicht wirklich zufrieden da man nur wenige Geräte einlesen konnte.

    Allerdings habe ich (dadurch das es mit diesem Script jetzt auch funktioniert) ein Problem mit einer Leuchte, bei der die einzelnen Tasten der Fernbedienung mehrfach belegt sind. ON/OFF z.B. ... Nach Auswertung der Console in der Bridge habe ich festgestellt, dass der Code teilweise 5-6 Sekunden lang gesendet wird. Das ist gut für die Zuverlässigkeit, in diesem Fall allerdings von Nachteil da die Leuchte dann meistens 2 mal schaltet, quasi An und gleich wieder Aus oder umgekehrt.
    Daher die Frage an den Ersteller, ob man die Sendedauer bzw. die Wiederholungen irgendwo im Script zuverlässig einstellen kann?
    Leider kenne ich mich mit Javascript nicht gut aus und da es für mich leichter ist, arbeite ich mich momentan eher in die Möglichkeiten von Blockly ein.
    Ich habe nur vorhin noch festgestellt, dass man durch das neustarten des o.g. Scripts die Wiederholungen auf 3 bis 6 mal reduzieren kann. Ist aber leider immer noch grenzwertig viel.

    Aber jetzt erstmal frohe Weihnachten

    D 1 Antwort Letzte Antwort
    0
    • sissiwupS sissiwup

      Hallo, ich habe hier ein kleines Skript geschrieben um die Sonoff Bridge komfortabel zu nutzen. Die Einrichtung ist oft beschrieben. Ich habe es mir einfach gemacht und die Bridge mit Tasmota 8.1 und Portisch fertig gekauft (für ca. 12 Euro).

      Nachdem die Bridge in euren Netz ist, installiert den sonoff adapter und verbindet die Bridget mit den Adapter. Das sollte dann so aussehen:

      Bildschirmfoto 2020-11-06 um 23.13.04.png

      Wenn die Punkte RfRaw und RFRaw_Data noch nicht da sind, dann in der Konsole von Tasmota rfraw 177 eingeben und mit einer Fernbedienung eine Taste drücken.

      Im Skript müßt ihr mindestens den Pfad zu RfRaw angeben.
      Wenn der Datenpunkt bei euch also sonoff.123.myBridge.RfRaw heißt, dann
      sonoff.123.myBridge. (mit Punkt)

      //Version 0.9 15.11.2020
      let bridgename="javascript.0.bridge.";  //speicherort der Variablen
      let sonoff="sonoff.0.Tasmota_21.";  // wo ist RfRaw und RfRaw_Data
      
      createState(bridgename+"learn",false,{type: "boolean", role: "button"});
      createState(bridgename+"counter",1000,{type: "number", role: "state"});
      createState(bridgename+"learning","off",{type: "string", role: "state"});
      createState(bridgename+"lastcode","?",{type: "string", role: "state"});
      createState(bridgename+"lastdate","?",{type: "string", role: "state"});
      createState(bridgename+"lastname","?",{type: "string", role: "state"});
      
      var counter=getState(bridgename+"counter").val;
      
      setState(bridgename+'learn',false);
      setState(bridgename+'learning',"off");
      setState(sonoff+'RfRaw',"177");
      
      on(bridgename+'learn',function(obj) {
          if (obj.state.val) {
              if (getState(bridgename+'learning').val=="off") {
                  setState(sonoff+'RfRaw',"177");
                  setState(bridgename+'learning',"on");
              } else {
                  setState(bridgename+'learning',"off");
              }
          }
          setState(bridgename+'learn',false);
      })
      
      on(sonoff+'RfReceived_Data',function(obj){
              console.log(obj.state.val);
              setState(sonoff+'RfRaw',"177");
      
      })
      
      function attachListener() {
          setTimeout(function() { 
              $('state[id='+bridgename+'code.*.send]').on(function (id, i) {
                  buttonPress(id);
              });
              $('state[id='+bridgename+'code.*.name]').on(function (obj, i) {
                  nameChanged(obj);
              });
          ;}, 2000);
          setTimeout(function() { 
              $('state[id='+bridgename+'code.*.send]').on(function (id, i) {
                  buttonPress(id);
              });
              $('state[id='+bridgename+'code.*.name]').on(function (obj, i) {
                  nameChanged(obj);
              });
          ;}, 10000);
      }
      
      function nameChanged(obj) {
          if (obj.state.val==obj.oldState.val) {
              console.log("ALT=NEU");
              return;
          }
          var oldnam=obj.id.substr(0,obj.id.length-4);
          var nam=obj.state.val;
          var newnam=bridgename+"code."+nam+".";
          console.log(newnam);
          console.log(oldnam);
          console.log(getState(oldnam+"org"));
          createStates(newnam,nam,getState(oldnam+"org").val,getState(oldnam+"count").val,getState(oldnam+"transform").val);
          setTimeout(function() {
              deleteState(oldnam+"send");
              deleteState(oldnam+"name");
              deleteState(oldnam+"recieved");
              deleteState(oldnam+"org");
              deleteState(oldnam+"count");
              deleteState(oldnam+"transform");
              attachListener();
          },1000);
      }
      
      $('state[id='+bridgename+'code.*.name]').on(function (obj, i) {
          nameChanged(obj);
      });
      
      function buttonPress(obj) {
          if (obj.state.val==true) {
              console.log("Pressed: " + obj.id);
              setState(obj.id,false);
              var nam=obj.id.substr(0,obj.id.length-4);
              var code=getState(nam+"transform").val;
           //   console.log(code);
              setState(sonoff+'RfRaw',"177");
              setState(sonoff+'RfRaw',code);
              setState(sonoff+'RfRaw',"177");
          }
      
      }
      
      var SelectorButtons = $('state[id='+bridgename+'code.*.send]');
      SelectorButtons.each(function (id, i) {
              setState(id,false);
      });
      
      var SelectorRecieved = $('state[id='+bridgename+'code.*.org]');
      SelectorRecieved.each(function (id, i) {
              console.log("Bekannte Codes:" + getState(id).val);
      });
      
      function createStates(prefix,name,org,count,newcode) {
          // console.log("New:" + prefix + "-" +name);
              createState(prefix+"send",false,{type: "boolean", role: "button"});
              createState(prefix+"name",name,{type: "string", role: "info"});
              createState(prefix+"recieved", formatDate(new Date(), "JJJJ.MM.TT SS:mm:ss"),{type: "string", role: "state"});
              createState(prefix+"org",org,{type: "string", role: "state"});
              createState(prefix+"count",count,{type: "number", role: "state"});
              createState(prefix+"transform",newcode,{type: "string", role: "state"});
      }
      
      on(sonoff+'RfRaw_Data',function(obj){
          var code=obj.state.val;
          setState(bridgename+"lastcode",code);
          setState(bridgename+"lastdate",formatDate(new Date(), "JJJJ.MM.TT SS:mm:ss"))
          if (code=="AAA055") return;
          if (code.length<12) return;
          var elems=code.split(" ");
      
          $('state[id='+bridgename+'code.*.org]').each(function (id, i) {
              var akt=getState(id).val
              if (akt!=null) {
                  akt=akt.split(" ");
                  if (elems[elems.length-2]==akt[akt.length-2]) {
                      var nam=id.substr(0,id.length-3);
                      setState(nam+"count",getState(nam+"count").val+1);
                      setState(nam+"recieved", formatDate(new Date(), "JJJJ.MM.TT SS:mm:ss"));
                      var lastname=nam.substr(0,nam.length-1).split(".");
                      setState(bridgename+"lastname",lastname[lastname.length-1]);
                      //  return false;
                  }
              }
          });
      
          if (getState(bridgename+'learning').val=="on") {
      //        console.log("Neu  : " + code);
              $('state[id='+bridgename+'code.*.org]').each(function (id, i) {
                  var akt=getState(id).val;
                  if (akt!=null) {
                      akt=akt.split(" ");
                      if (elems[elems.length-2]==akt[akt.length-2]) {
                          console.log("Code bekannt:" + id);
                          code="";
                          return false;
                      }
                  }
              });
              if (code=="") return;
              console.log("Schreib:" + code);
             // return;
              counter=counter+1;
              setState(bridgename+'counter',counter);
      
              var name=bridgename+"code."+String(counter)+".";
              var laenge=2;
              var newcode="";
              for (let i=3;i<elems.length;i++) {
                  newcode=newcode+" "+elems[i];
                  laenge=laenge+elems[i].length;
              }
              laenge=laenge/2;
              var newcode=elems[0]+" B0 "+laenge.toString(16)+" "+elems[2]+" 08"+newcode;
              createStates(name,"unbekannt",obj.state.val,1,newcode);
              attachListener();
          } 
          
      
      })
      
      attachListener();
      schedule("*/20 * * * *", function () {
          setState(sonoff+'RfRaw',"177");
      });
      
      
      
      

      Nach dem Start seht ihr folgende Punkte:
      Bildschirmfoto 2020-11-06 um 23.18.28.png
      (code ist bei euch noch leer, also nich sichtbar).

      Wenn ihr auf learn drückt, dann startet ihr den Lernmodus:
      Bildschirmfoto 2020-11-06 um 23.20.49.png

      nochmal auf learn, oder Skipt neu starten, geht wieder in den normalen Modus.

      Bildschirmfoto 2020-11-06 um 23.21.37.png

      Oben seht ihr, dass ich 2 Tasten angelernt habe.

      • count=wie oft wurde die Fernbedienung gedrückt.
      • name=Name der Taste
      • org=Aufgezeichneter Code
      • recieved=wann das letzte mal empfangen
      • send=Code über sonoff Bridge senden
      • transform=für Portisch umgerechnete code (falls das mit euren nicht geht, hier den von der Website umgerechneten eintragen)

      Wenn man sich nicht sicher ist, welche Taste welche war, einfach im "Nicht-Lernmodus" Taste drücken. Dann wird count und recieved upgedatet.

      Um die Codes einfacher in Skripten etc. verwenden zu können, kann man in name die Bezeichnung des codes eingeben (keine Leerzeichen, Sonderzeichen etc).

      Dann benennt er den Zweig entsprechend um:

      Bildschirmfoto 2020-11-06 um 23.29.16.png
      (habe mich doch für deutsch entschieden FB_1_an)
      Bildschirmfoto 2020-11-06 um 23.31.47.png

      Solle bei vielen Anlernvorgängen das umbenennen haken, einfach das Skript neu starten.

      Viel Spaß damit, wie man sicher sieht ist JS nicht meine erste Programmiersprache, aber es läuft...

      H Online
      H Online
      helfi9999
      schrieb am zuletzt editiert von helfi9999
      #10

      @sissiwup
      Hallo erstmal super was du da gemacht hast habe gestern schon mal im Forum gefragt ob man es hinbekommt die Sonoff RF Bridge auszulesen wenn man die Fernbedienung benutzt, da konnte mir keiner helfen. Und dann bin ich über deinen Beitrag gestolpert.

      Hat mir direkt geholfen.

      Schöne Feiertage noch

      Intel NUC mit Iobroker

      1 Antwort Letzte Antwort
      0
      • sissiwupS sissiwup

        @sissiwup
        Ab und an überholt sich der code selber, wenn das Anlegen bzw. Löschen zu lange dauert. Dann funktioniert der "send" Knopf nicht. Dann das Skript neu starten.
        -> Korrigiert in Version 0.9 (oben angepasst)

        R Offline
        R Offline
        rmohrs
        schrieb am zuletzt editiert von
        #11

        @sissiwup
        Vielen Dank für das tolle Script,
        ich habe jetzt schon mehrere Stunden mit der RF Bridge rumgeschlagen.

        Einfach toll wie einfach es funktionieren kann.

        A 1 Antwort Letzte Antwort
        0
        • R rmohrs

          @sissiwup
          Vielen Dank für das tolle Script,
          ich habe jetzt schon mehrere Stunden mit der RF Bridge rumgeschlagen.

          Einfach toll wie einfach es funktionieren kann.

          A Offline
          A Offline
          Andy200877
          schrieb am zuletzt editiert von Andy200877
          #12

          Tolles Script !!
          Ich bin totaler Anfänger und habe heute meine erste Portisch Bridge bekommen.
          Ich konnte mit deinem Script tatsächlich alle meine Tasten unter Iobroker "anlernen" und entsprechend benennen.

          Die Tasten funktionieren auch soweit.
          Ich habe nur eine FB mit einer Ein/Aus Taste.
          Im "Lernmodus" des scriptes wird immer der gleiche code bei der taste empfangen.
          Jedoch kann ich über iobroker nur ausschalten...

          https://github.com/Andy200877/intex_poollampe

          P 1 Antwort Letzte Antwort
          0
          • A Andy200877

            Tolles Script !!
            Ich bin totaler Anfänger und habe heute meine erste Portisch Bridge bekommen.
            Ich konnte mit deinem Script tatsächlich alle meine Tasten unter Iobroker "anlernen" und entsprechend benennen.

            Die Tasten funktionieren auch soweit.
            Ich habe nur eine FB mit einer Ein/Aus Taste.
            Im "Lernmodus" des scriptes wird immer der gleiche code bei der taste empfangen.
            Jedoch kann ich über iobroker nur ausschalten...

            P Offline
            P Offline
            pangaea
            schrieb am zuletzt editiert von pangaea
            #13

            @Andy200877 das ist eventuell das gleiche Problem wie bei mir. Ich habe ebenfalls bei meiner weiter oben beschriebenen FB nur eine Taste bei der natürlich auch immer der gleiche Code abgesetzt wird. Das script sendet den Code immer mehrfach. Ich habe mir hier beholfen in dem ich den umgewandelten "B0" RAW-Code (der mit "B1" funktioniert nicht) über ein URL-Request einzeln sende.

            z.B. exakt so:
            http://192.168.178.44/cm?cmnd=Backlog RfRaw AA B0 21 03 08 0366 00DC 1D2E 28181818190818181818181819081909081819090909090909 55

            Vielleicht hilft dir das weiter

            1 Antwort Letzte Antwort
            0
            • sissiwupS sissiwup

              Hallo, ich habe hier ein kleines Skript geschrieben um die Sonoff Bridge komfortabel zu nutzen. Die Einrichtung ist oft beschrieben. Ich habe es mir einfach gemacht und die Bridge mit Tasmota 8.1 und Portisch fertig gekauft (für ca. 12 Euro).

              Nachdem die Bridge in euren Netz ist, installiert den sonoff adapter und verbindet die Bridget mit den Adapter. Das sollte dann so aussehen:

              Bildschirmfoto 2020-11-06 um 23.13.04.png

              Wenn die Punkte RfRaw und RFRaw_Data noch nicht da sind, dann in der Konsole von Tasmota rfraw 177 eingeben und mit einer Fernbedienung eine Taste drücken.

              Im Skript müßt ihr mindestens den Pfad zu RfRaw angeben.
              Wenn der Datenpunkt bei euch also sonoff.123.myBridge.RfRaw heißt, dann
              sonoff.123.myBridge. (mit Punkt)

              //Version 0.9 15.11.2020
              let bridgename="javascript.0.bridge.";  //speicherort der Variablen
              let sonoff="sonoff.0.Tasmota_21.";  // wo ist RfRaw und RfRaw_Data
              
              createState(bridgename+"learn",false,{type: "boolean", role: "button"});
              createState(bridgename+"counter",1000,{type: "number", role: "state"});
              createState(bridgename+"learning","off",{type: "string", role: "state"});
              createState(bridgename+"lastcode","?",{type: "string", role: "state"});
              createState(bridgename+"lastdate","?",{type: "string", role: "state"});
              createState(bridgename+"lastname","?",{type: "string", role: "state"});
              
              var counter=getState(bridgename+"counter").val;
              
              setState(bridgename+'learn',false);
              setState(bridgename+'learning',"off");
              setState(sonoff+'RfRaw',"177");
              
              on(bridgename+'learn',function(obj) {
                  if (obj.state.val) {
                      if (getState(bridgename+'learning').val=="off") {
                          setState(sonoff+'RfRaw',"177");
                          setState(bridgename+'learning',"on");
                      } else {
                          setState(bridgename+'learning',"off");
                      }
                  }
                  setState(bridgename+'learn',false);
              })
              
              on(sonoff+'RfReceived_Data',function(obj){
                      console.log(obj.state.val);
                      setState(sonoff+'RfRaw',"177");
              
              })
              
              function attachListener() {
                  setTimeout(function() { 
                      $('state[id='+bridgename+'code.*.send]').on(function (id, i) {
                          buttonPress(id);
                      });
                      $('state[id='+bridgename+'code.*.name]').on(function (obj, i) {
                          nameChanged(obj);
                      });
                  ;}, 2000);
                  setTimeout(function() { 
                      $('state[id='+bridgename+'code.*.send]').on(function (id, i) {
                          buttonPress(id);
                      });
                      $('state[id='+bridgename+'code.*.name]').on(function (obj, i) {
                          nameChanged(obj);
                      });
                  ;}, 10000);
              }
              
              function nameChanged(obj) {
                  if (obj.state.val==obj.oldState.val) {
                      console.log("ALT=NEU");
                      return;
                  }
                  var oldnam=obj.id.substr(0,obj.id.length-4);
                  var nam=obj.state.val;
                  var newnam=bridgename+"code."+nam+".";
                  console.log(newnam);
                  console.log(oldnam);
                  console.log(getState(oldnam+"org"));
                  createStates(newnam,nam,getState(oldnam+"org").val,getState(oldnam+"count").val,getState(oldnam+"transform").val);
                  setTimeout(function() {
                      deleteState(oldnam+"send");
                      deleteState(oldnam+"name");
                      deleteState(oldnam+"recieved");
                      deleteState(oldnam+"org");
                      deleteState(oldnam+"count");
                      deleteState(oldnam+"transform");
                      attachListener();
                  },1000);
              }
              
              $('state[id='+bridgename+'code.*.name]').on(function (obj, i) {
                  nameChanged(obj);
              });
              
              function buttonPress(obj) {
                  if (obj.state.val==true) {
                      console.log("Pressed: " + obj.id);
                      setState(obj.id,false);
                      var nam=obj.id.substr(0,obj.id.length-4);
                      var code=getState(nam+"transform").val;
                   //   console.log(code);
                      setState(sonoff+'RfRaw',"177");
                      setState(sonoff+'RfRaw',code);
                      setState(sonoff+'RfRaw',"177");
                  }
              
              }
              
              var SelectorButtons = $('state[id='+bridgename+'code.*.send]');
              SelectorButtons.each(function (id, i) {
                      setState(id,false);
              });
              
              var SelectorRecieved = $('state[id='+bridgename+'code.*.org]');
              SelectorRecieved.each(function (id, i) {
                      console.log("Bekannte Codes:" + getState(id).val);
              });
              
              function createStates(prefix,name,org,count,newcode) {
                  // console.log("New:" + prefix + "-" +name);
                      createState(prefix+"send",false,{type: "boolean", role: "button"});
                      createState(prefix+"name",name,{type: "string", role: "info"});
                      createState(prefix+"recieved", formatDate(new Date(), "JJJJ.MM.TT SS:mm:ss"),{type: "string", role: "state"});
                      createState(prefix+"org",org,{type: "string", role: "state"});
                      createState(prefix+"count",count,{type: "number", role: "state"});
                      createState(prefix+"transform",newcode,{type: "string", role: "state"});
              }
              
              on(sonoff+'RfRaw_Data',function(obj){
                  var code=obj.state.val;
                  setState(bridgename+"lastcode",code);
                  setState(bridgename+"lastdate",formatDate(new Date(), "JJJJ.MM.TT SS:mm:ss"))
                  if (code=="AAA055") return;
                  if (code.length<12) return;
                  var elems=code.split(" ");
              
                  $('state[id='+bridgename+'code.*.org]').each(function (id, i) {
                      var akt=getState(id).val
                      if (akt!=null) {
                          akt=akt.split(" ");
                          if (elems[elems.length-2]==akt[akt.length-2]) {
                              var nam=id.substr(0,id.length-3);
                              setState(nam+"count",getState(nam+"count").val+1);
                              setState(nam+"recieved", formatDate(new Date(), "JJJJ.MM.TT SS:mm:ss"));
                              var lastname=nam.substr(0,nam.length-1).split(".");
                              setState(bridgename+"lastname",lastname[lastname.length-1]);
                              //  return false;
                          }
                      }
                  });
              
                  if (getState(bridgename+'learning').val=="on") {
              //        console.log("Neu  : " + code);
                      $('state[id='+bridgename+'code.*.org]').each(function (id, i) {
                          var akt=getState(id).val;
                          if (akt!=null) {
                              akt=akt.split(" ");
                              if (elems[elems.length-2]==akt[akt.length-2]) {
                                  console.log("Code bekannt:" + id);
                                  code="";
                                  return false;
                              }
                          }
                      });
                      if (code=="") return;
                      console.log("Schreib:" + code);
                     // return;
                      counter=counter+1;
                      setState(bridgename+'counter',counter);
              
                      var name=bridgename+"code."+String(counter)+".";
                      var laenge=2;
                      var newcode="";
                      for (let i=3;i<elems.length;i++) {
                          newcode=newcode+" "+elems[i];
                          laenge=laenge+elems[i].length;
                      }
                      laenge=laenge/2;
                      var newcode=elems[0]+" B0 "+laenge.toString(16)+" "+elems[2]+" 08"+newcode;
                      createStates(name,"unbekannt",obj.state.val,1,newcode);
                      attachListener();
                  } 
                  
              
              })
              
              attachListener();
              schedule("*/20 * * * *", function () {
                  setState(sonoff+'RfRaw',"177");
              });
              
              
              
              

              Nach dem Start seht ihr folgende Punkte:
              Bildschirmfoto 2020-11-06 um 23.18.28.png
              (code ist bei euch noch leer, also nich sichtbar).

              Wenn ihr auf learn drückt, dann startet ihr den Lernmodus:
              Bildschirmfoto 2020-11-06 um 23.20.49.png

              nochmal auf learn, oder Skipt neu starten, geht wieder in den normalen Modus.

              Bildschirmfoto 2020-11-06 um 23.21.37.png

              Oben seht ihr, dass ich 2 Tasten angelernt habe.

              • count=wie oft wurde die Fernbedienung gedrückt.
              • name=Name der Taste
              • org=Aufgezeichneter Code
              • recieved=wann das letzte mal empfangen
              • send=Code über sonoff Bridge senden
              • transform=für Portisch umgerechnete code (falls das mit euren nicht geht, hier den von der Website umgerechneten eintragen)

              Wenn man sich nicht sicher ist, welche Taste welche war, einfach im "Nicht-Lernmodus" Taste drücken. Dann wird count und recieved upgedatet.

              Um die Codes einfacher in Skripten etc. verwenden zu können, kann man in name die Bezeichnung des codes eingeben (keine Leerzeichen, Sonderzeichen etc).

              Dann benennt er den Zweig entsprechend um:

              Bildschirmfoto 2020-11-06 um 23.29.16.png
              (habe mich doch für deutsch entschieden FB_1_an)
              Bildschirmfoto 2020-11-06 um 23.31.47.png

              Solle bei vielen Anlernvorgängen das umbenennen haken, einfach das Skript neu starten.

              Viel Spaß damit, wie man sicher sieht ist JS nicht meine erste Programmiersprache, aber es läuft...

              K Offline
              K Offline
              kingcoma
              schrieb am zuletzt editiert von
              #14

              @sissiwup

              Hi,

              vielen Dank für dein Script.
              Leider habe ich zu wenig, eigentlich überhaupt keine Erfahrung bzgl. der Programmierung.
              Daher kan ich auch nichts mit folgendem Fehler anfangen:

              3f0c6c2d-6dbd-4f84-990c-27eb69386d95-grafik.png

              Kannst du bitte weiterhelfen?!

              Vielen Dank

              P sissiwupS 2 Antworten Letzte Antwort
              0
              • K kingcoma

                @sissiwup

                Hi,

                vielen Dank für dein Script.
                Leider habe ich zu wenig, eigentlich überhaupt keine Erfahrung bzgl. der Programmierung.
                Daher kan ich auch nichts mit folgendem Fehler anfangen:

                3f0c6c2d-6dbd-4f84-990c-27eb69386d95-grafik.png

                Kannst du bitte weiterhelfen?!

                Vielen Dank

                P Offline
                P Offline
                pangaea
                schrieb am zuletzt editiert von
                #15

                @kingcoma Zeile 3 im Script zu RFRawData hast du wirklich korrekt eingeben?

                1 Antwort Letzte Antwort
                0
                • K kingcoma

                  @sissiwup

                  Hi,

                  vielen Dank für dein Script.
                  Leider habe ich zu wenig, eigentlich überhaupt keine Erfahrung bzgl. der Programmierung.
                  Daher kan ich auch nichts mit folgendem Fehler anfangen:

                  3f0c6c2d-6dbd-4f84-990c-27eb69386d95-grafik.png

                  Kannst du bitte weiterhelfen?!

                  Vielen Dank

                  sissiwupS Offline
                  sissiwupS Offline
                  sissiwup
                  schrieb am zuletzt editiert von
                  #16

                  @kingcoma
                  Hallo,

                  Zeig mal den Teil wo deine Bridge im ioBroker steht und Zeile 3. Da muss am Ende ein Punkt sein!

                  MfG

                  Sissi

                  –-----------------------------------------

                  1 CCU3 1 CCU2-Gateway 1 LanGateway 1 Pi-Gateway 1 I7 für ioBroker/MySQL


                  1 Antwort Letzte Antwort
                  0
                  • David G.D Online
                    David G.D Online
                    David G.
                    schrieb am zuletzt editiert von
                    #17

                    Hey,

                    ich habe mal eine ganz doofe Frage und hoffe mich nicht zu blamieren.

                    Kenne nur Schalter und Taster die mit true/false arbeiten.

                    Einen Befehl senden über den "send" Button.
                    Worauf reagiere ich um einen empfangenen Befehl in einen Script zu verarbeiten?

                    Auf eine Änderung von "recieved"?

                    P. S.:
                    @sissiwup
                    Wo hast du die Bridge so günstig geflasht bekommen?

                    Zeigt eure Lovelace-Visualisierung klick
                    (Auch ideal um sich Anregungen zu holen)

                    Meine Tabellen für eure Visualisierung klick

                    sissiwupS 1 Antwort Letzte Antwort
                    0
                    • David G.D David G.

                      Hey,

                      ich habe mal eine ganz doofe Frage und hoffe mich nicht zu blamieren.

                      Kenne nur Schalter und Taster die mit true/false arbeiten.

                      Einen Befehl senden über den "send" Button.
                      Worauf reagiere ich um einen empfangenen Befehl in einen Script zu verarbeiten?

                      Auf eine Änderung von "recieved"?

                      P. S.:
                      @sissiwup
                      Wo hast du die Bridge so günstig geflasht bekommen?

                      sissiwupS Offline
                      sissiwupS Offline
                      sissiwup
                      schrieb am zuletzt editiert von
                      #18

                      @david-g
                      Hallo,

                      ja, du kannst auf received oder auf count reagieren.

                      Bridge: ebay-kleinanzeigen

                      MfG

                      Sissi

                      –-----------------------------------------

                      1 CCU3 1 CCU2-Gateway 1 LanGateway 1 Pi-Gateway 1 I7 für ioBroker/MySQL


                      RaspiUserR 1 Antwort Letzte Antwort
                      0
                      • sissiwupS sissiwup

                        @david-g
                        Hallo,

                        ja, du kannst auf received oder auf count reagieren.

                        Bridge: ebay-kleinanzeigen

                        RaspiUserR Offline
                        RaspiUserR Offline
                        RaspiUser
                        schrieb am zuletzt editiert von RaspiUser
                        #19

                        @sissiwup

                        Hallo,
                        zuerst ein "dickes Danke" für deine sehr gute & detailierte Anleitung, aber ...
                        ... bei mir klappt es nicht wirklich:
                        Ich habe die SONOFF-Bridge mit Tasmota 9.3.1 und der Portisch Firmware geflasht.
                        Neben dem MQTT Adapter habe ich den SONOFF Adapter eingerichtet (Port 1884 (MQTT 1883), mit User & Passwort, sonst alles wie vorgegeben). Die Instanzen sind grün. Im Skript habe ich den Name geändert.
                        Ich drücke die Tasten einer Steckdosen- und einer Markisen-Fernbedienung. Die Bridge reagiert immer mit der roten LED und die Konsole läuft voll mit Codes. Im ioBroker kommt aber nix an.
                        Hier ein paar Screenshots:

                        java.JPG

                        sonoff.JPG

                        skript.JPG

                        raw.JPG

                        Und die sehen ja nun etwas anders als deine ...
                        Ich finde den Fehler nicht und hoffe, dass Du mit den Infos eine Diagnose stellen kannst.

                        Danke für deine Unterstützung.

                        EDIT:
                        Noch eine Beobachtung ...

                        • Wenn ich in den RfRAW 177 Modus schalte werden die Codes der Fernbedienung angezeigt
                        • Wenn ich dann mit RfKey1 2 anlernen möchte werden keine Codes mehr angzeigt
                        • Die Bridge piept nach einigen Sekunde "1x lang" ohne Hinweise dass das Lernen nicht funktioniert hat
                          raw1.JPG

                        Ich bin verwirrt ...

                        RaspiUserR 1 Antwort Letzte Antwort
                        0
                        • RaspiUserR RaspiUser

                          @sissiwup

                          Hallo,
                          zuerst ein "dickes Danke" für deine sehr gute & detailierte Anleitung, aber ...
                          ... bei mir klappt es nicht wirklich:
                          Ich habe die SONOFF-Bridge mit Tasmota 9.3.1 und der Portisch Firmware geflasht.
                          Neben dem MQTT Adapter habe ich den SONOFF Adapter eingerichtet (Port 1884 (MQTT 1883), mit User & Passwort, sonst alles wie vorgegeben). Die Instanzen sind grün. Im Skript habe ich den Name geändert.
                          Ich drücke die Tasten einer Steckdosen- und einer Markisen-Fernbedienung. Die Bridge reagiert immer mit der roten LED und die Konsole läuft voll mit Codes. Im ioBroker kommt aber nix an.
                          Hier ein paar Screenshots:

                          java.JPG

                          sonoff.JPG

                          skript.JPG

                          raw.JPG

                          Und die sehen ja nun etwas anders als deine ...
                          Ich finde den Fehler nicht und hoffe, dass Du mit den Infos eine Diagnose stellen kannst.

                          Danke für deine Unterstützung.

                          EDIT:
                          Noch eine Beobachtung ...

                          • Wenn ich in den RfRAW 177 Modus schalte werden die Codes der Fernbedienung angezeigt
                          • Wenn ich dann mit RfKey1 2 anlernen möchte werden keine Codes mehr angzeigt
                          • Die Bridge piept nach einigen Sekunde "1x lang" ohne Hinweise dass das Lernen nicht funktioniert hat
                            raw1.JPG

                          Ich bin verwirrt ...

                          RaspiUserR Offline
                          RaspiUserR Offline
                          RaspiUser
                          schrieb am zuletzt editiert von
                          #20

                          Im letzten Beitrag waren zuviele Fehler auf einmal. Ich bin jetzt ein Stück weitergekommen ... Die Bridge habe ich frisch geflasht und eingestellt und nun sieht der Screenshot besser aus / die Verbindung zum ioBroker klappt:
                          Objekte.JPG

                          Dann zum nächsten Problem ... 😉
                          Unter "bridge RESULT.RfRaw Data" kommt z.B. auch etwas an. Anlernen klappt aber garnicht, weder direkt auf der Sonoff WebUI noch im Script. Hier sieht es immer so aus, egal was ich tue:
                          java.JPG
                          Wenn ich das Skript starte kommen diese Hinweise:
                          script.JPG

                          Jetzt hoffe ich auf zahlreiche Lösungsvorschläge ... 😕

                          sissiwupS 1 Antwort Letzte Antwort
                          0
                          • RaspiUserR RaspiUser

                            Im letzten Beitrag waren zuviele Fehler auf einmal. Ich bin jetzt ein Stück weitergekommen ... Die Bridge habe ich frisch geflasht und eingestellt und nun sieht der Screenshot besser aus / die Verbindung zum ioBroker klappt:
                            Objekte.JPG

                            Dann zum nächsten Problem ... 😉
                            Unter "bridge RESULT.RfRaw Data" kommt z.B. auch etwas an. Anlernen klappt aber garnicht, weder direkt auf der Sonoff WebUI noch im Script. Hier sieht es immer so aus, egal was ich tue:
                            java.JPG
                            Wenn ich das Skript starte kommen diese Hinweise:
                            script.JPG

                            Jetzt hoffe ich auf zahlreiche Lösungsvorschläge ... 😕

                            sissiwupS Offline
                            sissiwupS Offline
                            sissiwup
                            schrieb am zuletzt editiert von
                            #21

                            @raspiuser
                            Hi,

                            zeig mal die ersten Zeilen deines Scripts. Wie hast du die Namen der Variablen angpaßt?

                            MfG

                            Sissi

                            –-----------------------------------------

                            1 CCU3 1 CCU2-Gateway 1 LanGateway 1 Pi-Gateway 1 I7 für ioBroker/MySQL


                            RaspiUserR 1 Antwort Letzte Antwort
                            0
                            • sissiwupS sissiwup

                              @raspiuser
                              Hi,

                              zeig mal die ersten Zeilen deines Scripts. Wie hast du die Namen der Variablen angpaßt?

                              RaspiUserR Offline
                              RaspiUserR Offline
                              RaspiUser
                              schrieb am zuletzt editiert von
                              #22

                              @sissiwup said in Sonoff RF Bridge Tasmota und Portisch 433mhz:

                              Wie hast du die Namen der Variablen angpaßt?

                              ... ich habe die so kopiert wie Du es im ersten Beitrag gezeigt hast, also 1:1 übernommen.

                              Zwischenzeitlich bin (relativ gesehen) etwas weiter bzw. das Problem hat sich verlagert ...

                              Die Codes der Markise habe ich mit "RfRaw 166" super einfach ausgelesen, diese im Browser zu senden klappt prima (ebenso in der TASMOTA Konsole).

                              Nur in SONOFF MQTT sehe ich nix zum steuern. Das "Data" Objekt wird nur sporadisch aktualisiert.

                              3e296eaf-9781-427f-a707-bdaf44075982-grafik.png
                              Mein "neues" Problem ist hier näher beschrieben.

                              Vielleicht hast Du einen Hinweis, wie man in dem SONOFF Adapter ein Objekt zum steuern der Codes anlegt ... ist jetzt also eigentlich kein Problem mit deinem Projekt ...

                              sissiwupS 1 Antwort Letzte Antwort
                              0
                              • RaspiUserR RaspiUser

                                @sissiwup said in Sonoff RF Bridge Tasmota und Portisch 433mhz:

                                Wie hast du die Namen der Variablen angpaßt?

                                ... ich habe die so kopiert wie Du es im ersten Beitrag gezeigt hast, also 1:1 übernommen.

                                Zwischenzeitlich bin (relativ gesehen) etwas weiter bzw. das Problem hat sich verlagert ...

                                Die Codes der Markise habe ich mit "RfRaw 166" super einfach ausgelesen, diese im Browser zu senden klappt prima (ebenso in der TASMOTA Konsole).

                                Nur in SONOFF MQTT sehe ich nix zum steuern. Das "Data" Objekt wird nur sporadisch aktualisiert.

                                3e296eaf-9781-427f-a707-bdaf44075982-grafik.png
                                Mein "neues" Problem ist hier näher beschrieben.

                                Vielleicht hast Du einen Hinweis, wie man in dem SONOFF Adapter ein Objekt zum steuern der Codes anlegt ... ist jetzt also eigentlich kein Problem mit deinem Projekt ...

                                sissiwupS Offline
                                sissiwupS Offline
                                sissiwup
                                schrieb am zuletzt editiert von
                                #23

                                @raspiuser
                                Hi,

                                das Data nicht kommt, wird daran liegen, dass die Bridge nicht im korrekten Modus ist.
                                Hast du mal probiert einfach deinen Code in "transform" zu kopieren und dann auf den Knopf zu drücken?
                                Vlt. mußt du im Script dann noch deine RF166 für bestimmte Knöpfe hinterlegen.

                                MfG

                                Sissi

                                –-----------------------------------------

                                1 CCU3 1 CCU2-Gateway 1 LanGateway 1 Pi-Gateway 1 I7 für ioBroker/MySQL


                                1 Antwort Letzte Antwort
                                0
                                • RaspiUserR Offline
                                  RaspiUserR Offline
                                  RaspiUser
                                  schrieb am zuletzt editiert von
                                  #24

                                  @sissiwup said in Sonoff RF Bridge Tasmota und Portisch 433mhz:

                                  nicht im korrekten Modus

                                  Hallo sissiwup,

                                  im ioBroker-Adapter bzw. im Tasmota-MQTT sind die Einstellungen überschaubar ...
                                  SONOFF_EInst.JPG
                                  Tasmota.JPG

                                  @sissiwup said in Sonoff RF Bridge Tasmota und Portisch 433mhz:

                                  "transform"

                                  ... dieses Objekt finde ich bei mir nirgends !? Und ich benutze ja kein Script mehr.

                                  SONO.JPG

                                  Danke für deine Zeit. und Hinweise.

                                  Murat AslanM 1 Antwort Letzte Antwort
                                  0
                                  • RaspiUserR RaspiUser

                                    @sissiwup said in Sonoff RF Bridge Tasmota und Portisch 433mhz:

                                    nicht im korrekten Modus

                                    Hallo sissiwup,

                                    im ioBroker-Adapter bzw. im Tasmota-MQTT sind die Einstellungen überschaubar ...
                                    SONOFF_EInst.JPG
                                    Tasmota.JPG

                                    @sissiwup said in Sonoff RF Bridge Tasmota und Portisch 433mhz:

                                    "transform"

                                    ... dieses Objekt finde ich bei mir nirgends !? Und ich benutze ja kein Script mehr.

                                    SONO.JPG

                                    Danke für deine Zeit. und Hinweise.

                                    Murat AslanM Offline
                                    Murat AslanM Offline
                                    Murat Aslan
                                    schrieb am zuletzt editiert von
                                    #25

                                    @raspiuser
                                    Vielen Dank erstmal für Freigabe des Skripts
                                    diese haken am (objektbaum erstellen) hat mich 3 tage gekostet 😠 bei mir war es auch gesetzt.
                                    Also es liegt an dem haken, einfach rausnehmen und im objekte dein bridge löschen, instans
                                    sonoff neu starten und glücklich sein.

                                    1 Antwort Letzte Antwort
                                    0
                                    • sissiwupS sissiwup

                                      Hallo, ich habe hier ein kleines Skript geschrieben um die Sonoff Bridge komfortabel zu nutzen. Die Einrichtung ist oft beschrieben. Ich habe es mir einfach gemacht und die Bridge mit Tasmota 8.1 und Portisch fertig gekauft (für ca. 12 Euro).

                                      Nachdem die Bridge in euren Netz ist, installiert den sonoff adapter und verbindet die Bridget mit den Adapter. Das sollte dann so aussehen:

                                      Bildschirmfoto 2020-11-06 um 23.13.04.png

                                      Wenn die Punkte RfRaw und RFRaw_Data noch nicht da sind, dann in der Konsole von Tasmota rfraw 177 eingeben und mit einer Fernbedienung eine Taste drücken.

                                      Im Skript müßt ihr mindestens den Pfad zu RfRaw angeben.
                                      Wenn der Datenpunkt bei euch also sonoff.123.myBridge.RfRaw heißt, dann
                                      sonoff.123.myBridge. (mit Punkt)

                                      //Version 0.9 15.11.2020
                                      let bridgename="javascript.0.bridge.";  //speicherort der Variablen
                                      let sonoff="sonoff.0.Tasmota_21.";  // wo ist RfRaw und RfRaw_Data
                                      
                                      createState(bridgename+"learn",false,{type: "boolean", role: "button"});
                                      createState(bridgename+"counter",1000,{type: "number", role: "state"});
                                      createState(bridgename+"learning","off",{type: "string", role: "state"});
                                      createState(bridgename+"lastcode","?",{type: "string", role: "state"});
                                      createState(bridgename+"lastdate","?",{type: "string", role: "state"});
                                      createState(bridgename+"lastname","?",{type: "string", role: "state"});
                                      
                                      var counter=getState(bridgename+"counter").val;
                                      
                                      setState(bridgename+'learn',false);
                                      setState(bridgename+'learning',"off");
                                      setState(sonoff+'RfRaw',"177");
                                      
                                      on(bridgename+'learn',function(obj) {
                                          if (obj.state.val) {
                                              if (getState(bridgename+'learning').val=="off") {
                                                  setState(sonoff+'RfRaw',"177");
                                                  setState(bridgename+'learning',"on");
                                              } else {
                                                  setState(bridgename+'learning',"off");
                                              }
                                          }
                                          setState(bridgename+'learn',false);
                                      })
                                      
                                      on(sonoff+'RfReceived_Data',function(obj){
                                              console.log(obj.state.val);
                                              setState(sonoff+'RfRaw',"177");
                                      
                                      })
                                      
                                      function attachListener() {
                                          setTimeout(function() { 
                                              $('state[id='+bridgename+'code.*.send]').on(function (id, i) {
                                                  buttonPress(id);
                                              });
                                              $('state[id='+bridgename+'code.*.name]').on(function (obj, i) {
                                                  nameChanged(obj);
                                              });
                                          ;}, 2000);
                                          setTimeout(function() { 
                                              $('state[id='+bridgename+'code.*.send]').on(function (id, i) {
                                                  buttonPress(id);
                                              });
                                              $('state[id='+bridgename+'code.*.name]').on(function (obj, i) {
                                                  nameChanged(obj);
                                              });
                                          ;}, 10000);
                                      }
                                      
                                      function nameChanged(obj) {
                                          if (obj.state.val==obj.oldState.val) {
                                              console.log("ALT=NEU");
                                              return;
                                          }
                                          var oldnam=obj.id.substr(0,obj.id.length-4);
                                          var nam=obj.state.val;
                                          var newnam=bridgename+"code."+nam+".";
                                          console.log(newnam);
                                          console.log(oldnam);
                                          console.log(getState(oldnam+"org"));
                                          createStates(newnam,nam,getState(oldnam+"org").val,getState(oldnam+"count").val,getState(oldnam+"transform").val);
                                          setTimeout(function() {
                                              deleteState(oldnam+"send");
                                              deleteState(oldnam+"name");
                                              deleteState(oldnam+"recieved");
                                              deleteState(oldnam+"org");
                                              deleteState(oldnam+"count");
                                              deleteState(oldnam+"transform");
                                              attachListener();
                                          },1000);
                                      }
                                      
                                      $('state[id='+bridgename+'code.*.name]').on(function (obj, i) {
                                          nameChanged(obj);
                                      });
                                      
                                      function buttonPress(obj) {
                                          if (obj.state.val==true) {
                                              console.log("Pressed: " + obj.id);
                                              setState(obj.id,false);
                                              var nam=obj.id.substr(0,obj.id.length-4);
                                              var code=getState(nam+"transform").val;
                                           //   console.log(code);
                                              setState(sonoff+'RfRaw',"177");
                                              setState(sonoff+'RfRaw',code);
                                              setState(sonoff+'RfRaw',"177");
                                          }
                                      
                                      }
                                      
                                      var SelectorButtons = $('state[id='+bridgename+'code.*.send]');
                                      SelectorButtons.each(function (id, i) {
                                              setState(id,false);
                                      });
                                      
                                      var SelectorRecieved = $('state[id='+bridgename+'code.*.org]');
                                      SelectorRecieved.each(function (id, i) {
                                              console.log("Bekannte Codes:" + getState(id).val);
                                      });
                                      
                                      function createStates(prefix,name,org,count,newcode) {
                                          // console.log("New:" + prefix + "-" +name);
                                              createState(prefix+"send",false,{type: "boolean", role: "button"});
                                              createState(prefix+"name",name,{type: "string", role: "info"});
                                              createState(prefix+"recieved", formatDate(new Date(), "JJJJ.MM.TT SS:mm:ss"),{type: "string", role: "state"});
                                              createState(prefix+"org",org,{type: "string", role: "state"});
                                              createState(prefix+"count",count,{type: "number", role: "state"});
                                              createState(prefix+"transform",newcode,{type: "string", role: "state"});
                                      }
                                      
                                      on(sonoff+'RfRaw_Data',function(obj){
                                          var code=obj.state.val;
                                          setState(bridgename+"lastcode",code);
                                          setState(bridgename+"lastdate",formatDate(new Date(), "JJJJ.MM.TT SS:mm:ss"))
                                          if (code=="AAA055") return;
                                          if (code.length<12) return;
                                          var elems=code.split(" ");
                                      
                                          $('state[id='+bridgename+'code.*.org]').each(function (id, i) {
                                              var akt=getState(id).val
                                              if (akt!=null) {
                                                  akt=akt.split(" ");
                                                  if (elems[elems.length-2]==akt[akt.length-2]) {
                                                      var nam=id.substr(0,id.length-3);
                                                      setState(nam+"count",getState(nam+"count").val+1);
                                                      setState(nam+"recieved", formatDate(new Date(), "JJJJ.MM.TT SS:mm:ss"));
                                                      var lastname=nam.substr(0,nam.length-1).split(".");
                                                      setState(bridgename+"lastname",lastname[lastname.length-1]);
                                                      //  return false;
                                                  }
                                              }
                                          });
                                      
                                          if (getState(bridgename+'learning').val=="on") {
                                      //        console.log("Neu  : " + code);
                                              $('state[id='+bridgename+'code.*.org]').each(function (id, i) {
                                                  var akt=getState(id).val;
                                                  if (akt!=null) {
                                                      akt=akt.split(" ");
                                                      if (elems[elems.length-2]==akt[akt.length-2]) {
                                                          console.log("Code bekannt:" + id);
                                                          code="";
                                                          return false;
                                                      }
                                                  }
                                              });
                                              if (code=="") return;
                                              console.log("Schreib:" + code);
                                             // return;
                                              counter=counter+1;
                                              setState(bridgename+'counter',counter);
                                      
                                              var name=bridgename+"code."+String(counter)+".";
                                              var laenge=2;
                                              var newcode="";
                                              for (let i=3;i<elems.length;i++) {
                                                  newcode=newcode+" "+elems[i];
                                                  laenge=laenge+elems[i].length;
                                              }
                                              laenge=laenge/2;
                                              var newcode=elems[0]+" B0 "+laenge.toString(16)+" "+elems[2]+" 08"+newcode;
                                              createStates(name,"unbekannt",obj.state.val,1,newcode);
                                              attachListener();
                                          } 
                                          
                                      
                                      })
                                      
                                      attachListener();
                                      schedule("*/20 * * * *", function () {
                                          setState(sonoff+'RfRaw',"177");
                                      });
                                      
                                      
                                      
                                      

                                      Nach dem Start seht ihr folgende Punkte:
                                      Bildschirmfoto 2020-11-06 um 23.18.28.png
                                      (code ist bei euch noch leer, also nich sichtbar).

                                      Wenn ihr auf learn drückt, dann startet ihr den Lernmodus:
                                      Bildschirmfoto 2020-11-06 um 23.20.49.png

                                      nochmal auf learn, oder Skipt neu starten, geht wieder in den normalen Modus.

                                      Bildschirmfoto 2020-11-06 um 23.21.37.png

                                      Oben seht ihr, dass ich 2 Tasten angelernt habe.

                                      • count=wie oft wurde die Fernbedienung gedrückt.
                                      • name=Name der Taste
                                      • org=Aufgezeichneter Code
                                      • recieved=wann das letzte mal empfangen
                                      • send=Code über sonoff Bridge senden
                                      • transform=für Portisch umgerechnete code (falls das mit euren nicht geht, hier den von der Website umgerechneten eintragen)

                                      Wenn man sich nicht sicher ist, welche Taste welche war, einfach im "Nicht-Lernmodus" Taste drücken. Dann wird count und recieved upgedatet.

                                      Um die Codes einfacher in Skripten etc. verwenden zu können, kann man in name die Bezeichnung des codes eingeben (keine Leerzeichen, Sonderzeichen etc).

                                      Dann benennt er den Zweig entsprechend um:

                                      Bildschirmfoto 2020-11-06 um 23.29.16.png
                                      (habe mich doch für deutsch entschieden FB_1_an)
                                      Bildschirmfoto 2020-11-06 um 23.31.47.png

                                      Solle bei vielen Anlernvorgängen das umbenennen haken, einfach das Skript neu starten.

                                      Viel Spaß damit, wie man sicher sieht ist JS nicht meine erste Programmiersprache, aber es läuft...

                                      M Offline
                                      M Offline
                                      Mike Hellracer
                                      schrieb am zuletzt editiert von Mike Hellracer
                                      #26

                                      @sissiwup
                                      Hi,
                                      sorry, aber ich habe auf dem Schlauch gestanden. jetzt funktioniert alles wie gewünscht. Ein Frage habe ich noch. Kann ich mit deinem Script so viele Schalter wie ich will anllegen?

                                      1 Antwort Letzte Antwort
                                      0
                                      • sissiwupS sissiwup

                                        Hallo, ich habe hier ein kleines Skript geschrieben um die Sonoff Bridge komfortabel zu nutzen. Die Einrichtung ist oft beschrieben. Ich habe es mir einfach gemacht und die Bridge mit Tasmota 8.1 und Portisch fertig gekauft (für ca. 12 Euro).

                                        Nachdem die Bridge in euren Netz ist, installiert den sonoff adapter und verbindet die Bridget mit den Adapter. Das sollte dann so aussehen:

                                        Bildschirmfoto 2020-11-06 um 23.13.04.png

                                        Wenn die Punkte RfRaw und RFRaw_Data noch nicht da sind, dann in der Konsole von Tasmota rfraw 177 eingeben und mit einer Fernbedienung eine Taste drücken.

                                        Im Skript müßt ihr mindestens den Pfad zu RfRaw angeben.
                                        Wenn der Datenpunkt bei euch also sonoff.123.myBridge.RfRaw heißt, dann
                                        sonoff.123.myBridge. (mit Punkt)

                                        //Version 0.9 15.11.2020
                                        let bridgename="javascript.0.bridge.";  //speicherort der Variablen
                                        let sonoff="sonoff.0.Tasmota_21.";  // wo ist RfRaw und RfRaw_Data
                                        
                                        createState(bridgename+"learn",false,{type: "boolean", role: "button"});
                                        createState(bridgename+"counter",1000,{type: "number", role: "state"});
                                        createState(bridgename+"learning","off",{type: "string", role: "state"});
                                        createState(bridgename+"lastcode","?",{type: "string", role: "state"});
                                        createState(bridgename+"lastdate","?",{type: "string", role: "state"});
                                        createState(bridgename+"lastname","?",{type: "string", role: "state"});
                                        
                                        var counter=getState(bridgename+"counter").val;
                                        
                                        setState(bridgename+'learn',false);
                                        setState(bridgename+'learning',"off");
                                        setState(sonoff+'RfRaw',"177");
                                        
                                        on(bridgename+'learn',function(obj) {
                                            if (obj.state.val) {
                                                if (getState(bridgename+'learning').val=="off") {
                                                    setState(sonoff+'RfRaw',"177");
                                                    setState(bridgename+'learning',"on");
                                                } else {
                                                    setState(bridgename+'learning',"off");
                                                }
                                            }
                                            setState(bridgename+'learn',false);
                                        })
                                        
                                        on(sonoff+'RfReceived_Data',function(obj){
                                                console.log(obj.state.val);
                                                setState(sonoff+'RfRaw',"177");
                                        
                                        })
                                        
                                        function attachListener() {
                                            setTimeout(function() { 
                                                $('state[id='+bridgename+'code.*.send]').on(function (id, i) {
                                                    buttonPress(id);
                                                });
                                                $('state[id='+bridgename+'code.*.name]').on(function (obj, i) {
                                                    nameChanged(obj);
                                                });
                                            ;}, 2000);
                                            setTimeout(function() { 
                                                $('state[id='+bridgename+'code.*.send]').on(function (id, i) {
                                                    buttonPress(id);
                                                });
                                                $('state[id='+bridgename+'code.*.name]').on(function (obj, i) {
                                                    nameChanged(obj);
                                                });
                                            ;}, 10000);
                                        }
                                        
                                        function nameChanged(obj) {
                                            if (obj.state.val==obj.oldState.val) {
                                                console.log("ALT=NEU");
                                                return;
                                            }
                                            var oldnam=obj.id.substr(0,obj.id.length-4);
                                            var nam=obj.state.val;
                                            var newnam=bridgename+"code."+nam+".";
                                            console.log(newnam);
                                            console.log(oldnam);
                                            console.log(getState(oldnam+"org"));
                                            createStates(newnam,nam,getState(oldnam+"org").val,getState(oldnam+"count").val,getState(oldnam+"transform").val);
                                            setTimeout(function() {
                                                deleteState(oldnam+"send");
                                                deleteState(oldnam+"name");
                                                deleteState(oldnam+"recieved");
                                                deleteState(oldnam+"org");
                                                deleteState(oldnam+"count");
                                                deleteState(oldnam+"transform");
                                                attachListener();
                                            },1000);
                                        }
                                        
                                        $('state[id='+bridgename+'code.*.name]').on(function (obj, i) {
                                            nameChanged(obj);
                                        });
                                        
                                        function buttonPress(obj) {
                                            if (obj.state.val==true) {
                                                console.log("Pressed: " + obj.id);
                                                setState(obj.id,false);
                                                var nam=obj.id.substr(0,obj.id.length-4);
                                                var code=getState(nam+"transform").val;
                                             //   console.log(code);
                                                setState(sonoff+'RfRaw',"177");
                                                setState(sonoff+'RfRaw',code);
                                                setState(sonoff+'RfRaw',"177");
                                            }
                                        
                                        }
                                        
                                        var SelectorButtons = $('state[id='+bridgename+'code.*.send]');
                                        SelectorButtons.each(function (id, i) {
                                                setState(id,false);
                                        });
                                        
                                        var SelectorRecieved = $('state[id='+bridgename+'code.*.org]');
                                        SelectorRecieved.each(function (id, i) {
                                                console.log("Bekannte Codes:" + getState(id).val);
                                        });
                                        
                                        function createStates(prefix,name,org,count,newcode) {
                                            // console.log("New:" + prefix + "-" +name);
                                                createState(prefix+"send",false,{type: "boolean", role: "button"});
                                                createState(prefix+"name",name,{type: "string", role: "info"});
                                                createState(prefix+"recieved", formatDate(new Date(), "JJJJ.MM.TT SS:mm:ss"),{type: "string", role: "state"});
                                                createState(prefix+"org",org,{type: "string", role: "state"});
                                                createState(prefix+"count",count,{type: "number", role: "state"});
                                                createState(prefix+"transform",newcode,{type: "string", role: "state"});
                                        }
                                        
                                        on(sonoff+'RfRaw_Data',function(obj){
                                            var code=obj.state.val;
                                            setState(bridgename+"lastcode",code);
                                            setState(bridgename+"lastdate",formatDate(new Date(), "JJJJ.MM.TT SS:mm:ss"))
                                            if (code=="AAA055") return;
                                            if (code.length<12) return;
                                            var elems=code.split(" ");
                                        
                                            $('state[id='+bridgename+'code.*.org]').each(function (id, i) {
                                                var akt=getState(id).val
                                                if (akt!=null) {
                                                    akt=akt.split(" ");
                                                    if (elems[elems.length-2]==akt[akt.length-2]) {
                                                        var nam=id.substr(0,id.length-3);
                                                        setState(nam+"count",getState(nam+"count").val+1);
                                                        setState(nam+"recieved", formatDate(new Date(), "JJJJ.MM.TT SS:mm:ss"));
                                                        var lastname=nam.substr(0,nam.length-1).split(".");
                                                        setState(bridgename+"lastname",lastname[lastname.length-1]);
                                                        //  return false;
                                                    }
                                                }
                                            });
                                        
                                            if (getState(bridgename+'learning').val=="on") {
                                        //        console.log("Neu  : " + code);
                                                $('state[id='+bridgename+'code.*.org]').each(function (id, i) {
                                                    var akt=getState(id).val;
                                                    if (akt!=null) {
                                                        akt=akt.split(" ");
                                                        if (elems[elems.length-2]==akt[akt.length-2]) {
                                                            console.log("Code bekannt:" + id);
                                                            code="";
                                                            return false;
                                                        }
                                                    }
                                                });
                                                if (code=="") return;
                                                console.log("Schreib:" + code);
                                               // return;
                                                counter=counter+1;
                                                setState(bridgename+'counter',counter);
                                        
                                                var name=bridgename+"code."+String(counter)+".";
                                                var laenge=2;
                                                var newcode="";
                                                for (let i=3;i<elems.length;i++) {
                                                    newcode=newcode+" "+elems[i];
                                                    laenge=laenge+elems[i].length;
                                                }
                                                laenge=laenge/2;
                                                var newcode=elems[0]+" B0 "+laenge.toString(16)+" "+elems[2]+" 08"+newcode;
                                                createStates(name,"unbekannt",obj.state.val,1,newcode);
                                                attachListener();
                                            } 
                                            
                                        
                                        })
                                        
                                        attachListener();
                                        schedule("*/20 * * * *", function () {
                                            setState(sonoff+'RfRaw',"177");
                                        });
                                        
                                        
                                        
                                        

                                        Nach dem Start seht ihr folgende Punkte:
                                        Bildschirmfoto 2020-11-06 um 23.18.28.png
                                        (code ist bei euch noch leer, also nich sichtbar).

                                        Wenn ihr auf learn drückt, dann startet ihr den Lernmodus:
                                        Bildschirmfoto 2020-11-06 um 23.20.49.png

                                        nochmal auf learn, oder Skipt neu starten, geht wieder in den normalen Modus.

                                        Bildschirmfoto 2020-11-06 um 23.21.37.png

                                        Oben seht ihr, dass ich 2 Tasten angelernt habe.

                                        • count=wie oft wurde die Fernbedienung gedrückt.
                                        • name=Name der Taste
                                        • org=Aufgezeichneter Code
                                        • recieved=wann das letzte mal empfangen
                                        • send=Code über sonoff Bridge senden
                                        • transform=für Portisch umgerechnete code (falls das mit euren nicht geht, hier den von der Website umgerechneten eintragen)

                                        Wenn man sich nicht sicher ist, welche Taste welche war, einfach im "Nicht-Lernmodus" Taste drücken. Dann wird count und recieved upgedatet.

                                        Um die Codes einfacher in Skripten etc. verwenden zu können, kann man in name die Bezeichnung des codes eingeben (keine Leerzeichen, Sonderzeichen etc).

                                        Dann benennt er den Zweig entsprechend um:

                                        Bildschirmfoto 2020-11-06 um 23.29.16.png
                                        (habe mich doch für deutsch entschieden FB_1_an)
                                        Bildschirmfoto 2020-11-06 um 23.31.47.png

                                        Solle bei vielen Anlernvorgängen das umbenennen haken, einfach das Skript neu starten.

                                        Viel Spaß damit, wie man sicher sieht ist JS nicht meine erste Programmiersprache, aber es läuft...

                                        K Offline
                                        K Offline
                                        kleinfritzchen
                                        schrieb am zuletzt editiert von
                                        #27

                                        @sissiwup Hallo, der Script ist gut aber in der Form für mich nicht so ganz passend. Ich möchte gern Fenster oder Tür Sensoren auslesen. Das funktioniert auch mit rfraw 177 soweit, jjedoch bekomme ich als Ergebnis einen Datenstring der selten gleich ist.
                                        Bildschirmfoto zu 2021-11-23 11-06-41.png
                                        Die markierten Teile des Datenstrings sind gleich aber halt nicht der gesamte String. Die gelben Werte sind für das schliesen des Kontaktes und die Werte unmittelbar darunter für das öffnen. Es passiert allepaar mal betätigen das der Code auch mal vollständig gleich ist aber das ist leider nicht immer so. Nur der hier ausgewählte Bereich ist passend und würde für eine Auswertung taugen. Kann mir mal jemand helfen den Script um zu schreiben damit das funktioniert ? Ich hab leider noch keine Ahnung von JScript.
                                        MfG Fritz

                                        S 1 Antwort Letzte Antwort
                                        0
                                        • sissiwupS sissiwup

                                          Hallo, ich habe hier ein kleines Skript geschrieben um die Sonoff Bridge komfortabel zu nutzen. Die Einrichtung ist oft beschrieben. Ich habe es mir einfach gemacht und die Bridge mit Tasmota 8.1 und Portisch fertig gekauft (für ca. 12 Euro).

                                          Nachdem die Bridge in euren Netz ist, installiert den sonoff adapter und verbindet die Bridget mit den Adapter. Das sollte dann so aussehen:

                                          Bildschirmfoto 2020-11-06 um 23.13.04.png

                                          Wenn die Punkte RfRaw und RFRaw_Data noch nicht da sind, dann in der Konsole von Tasmota rfraw 177 eingeben und mit einer Fernbedienung eine Taste drücken.

                                          Im Skript müßt ihr mindestens den Pfad zu RfRaw angeben.
                                          Wenn der Datenpunkt bei euch also sonoff.123.myBridge.RfRaw heißt, dann
                                          sonoff.123.myBridge. (mit Punkt)

                                          //Version 0.9 15.11.2020
                                          let bridgename="javascript.0.bridge.";  //speicherort der Variablen
                                          let sonoff="sonoff.0.Tasmota_21.";  // wo ist RfRaw und RfRaw_Data
                                          
                                          createState(bridgename+"learn",false,{type: "boolean", role: "button"});
                                          createState(bridgename+"counter",1000,{type: "number", role: "state"});
                                          createState(bridgename+"learning","off",{type: "string", role: "state"});
                                          createState(bridgename+"lastcode","?",{type: "string", role: "state"});
                                          createState(bridgename+"lastdate","?",{type: "string", role: "state"});
                                          createState(bridgename+"lastname","?",{type: "string", role: "state"});
                                          
                                          var counter=getState(bridgename+"counter").val;
                                          
                                          setState(bridgename+'learn',false);
                                          setState(bridgename+'learning',"off");
                                          setState(sonoff+'RfRaw',"177");
                                          
                                          on(bridgename+'learn',function(obj) {
                                              if (obj.state.val) {
                                                  if (getState(bridgename+'learning').val=="off") {
                                                      setState(sonoff+'RfRaw',"177");
                                                      setState(bridgename+'learning',"on");
                                                  } else {
                                                      setState(bridgename+'learning',"off");
                                                  }
                                              }
                                              setState(bridgename+'learn',false);
                                          })
                                          
                                          on(sonoff+'RfReceived_Data',function(obj){
                                                  console.log(obj.state.val);
                                                  setState(sonoff+'RfRaw',"177");
                                          
                                          })
                                          
                                          function attachListener() {
                                              setTimeout(function() { 
                                                  $('state[id='+bridgename+'code.*.send]').on(function (id, i) {
                                                      buttonPress(id);
                                                  });
                                                  $('state[id='+bridgename+'code.*.name]').on(function (obj, i) {
                                                      nameChanged(obj);
                                                  });
                                              ;}, 2000);
                                              setTimeout(function() { 
                                                  $('state[id='+bridgename+'code.*.send]').on(function (id, i) {
                                                      buttonPress(id);
                                                  });
                                                  $('state[id='+bridgename+'code.*.name]').on(function (obj, i) {
                                                      nameChanged(obj);
                                                  });
                                              ;}, 10000);
                                          }
                                          
                                          function nameChanged(obj) {
                                              if (obj.state.val==obj.oldState.val) {
                                                  console.log("ALT=NEU");
                                                  return;
                                              }
                                              var oldnam=obj.id.substr(0,obj.id.length-4);
                                              var nam=obj.state.val;
                                              var newnam=bridgename+"code."+nam+".";
                                              console.log(newnam);
                                              console.log(oldnam);
                                              console.log(getState(oldnam+"org"));
                                              createStates(newnam,nam,getState(oldnam+"org").val,getState(oldnam+"count").val,getState(oldnam+"transform").val);
                                              setTimeout(function() {
                                                  deleteState(oldnam+"send");
                                                  deleteState(oldnam+"name");
                                                  deleteState(oldnam+"recieved");
                                                  deleteState(oldnam+"org");
                                                  deleteState(oldnam+"count");
                                                  deleteState(oldnam+"transform");
                                                  attachListener();
                                              },1000);
                                          }
                                          
                                          $('state[id='+bridgename+'code.*.name]').on(function (obj, i) {
                                              nameChanged(obj);
                                          });
                                          
                                          function buttonPress(obj) {
                                              if (obj.state.val==true) {
                                                  console.log("Pressed: " + obj.id);
                                                  setState(obj.id,false);
                                                  var nam=obj.id.substr(0,obj.id.length-4);
                                                  var code=getState(nam+"transform").val;
                                               //   console.log(code);
                                                  setState(sonoff+'RfRaw',"177");
                                                  setState(sonoff+'RfRaw',code);
                                                  setState(sonoff+'RfRaw',"177");
                                              }
                                          
                                          }
                                          
                                          var SelectorButtons = $('state[id='+bridgename+'code.*.send]');
                                          SelectorButtons.each(function (id, i) {
                                                  setState(id,false);
                                          });
                                          
                                          var SelectorRecieved = $('state[id='+bridgename+'code.*.org]');
                                          SelectorRecieved.each(function (id, i) {
                                                  console.log("Bekannte Codes:" + getState(id).val);
                                          });
                                          
                                          function createStates(prefix,name,org,count,newcode) {
                                              // console.log("New:" + prefix + "-" +name);
                                                  createState(prefix+"send",false,{type: "boolean", role: "button"});
                                                  createState(prefix+"name",name,{type: "string", role: "info"});
                                                  createState(prefix+"recieved", formatDate(new Date(), "JJJJ.MM.TT SS:mm:ss"),{type: "string", role: "state"});
                                                  createState(prefix+"org",org,{type: "string", role: "state"});
                                                  createState(prefix+"count",count,{type: "number", role: "state"});
                                                  createState(prefix+"transform",newcode,{type: "string", role: "state"});
                                          }
                                          
                                          on(sonoff+'RfRaw_Data',function(obj){
                                              var code=obj.state.val;
                                              setState(bridgename+"lastcode",code);
                                              setState(bridgename+"lastdate",formatDate(new Date(), "JJJJ.MM.TT SS:mm:ss"))
                                              if (code=="AAA055") return;
                                              if (code.length<12) return;
                                              var elems=code.split(" ");
                                          
                                              $('state[id='+bridgename+'code.*.org]').each(function (id, i) {
                                                  var akt=getState(id).val
                                                  if (akt!=null) {
                                                      akt=akt.split(" ");
                                                      if (elems[elems.length-2]==akt[akt.length-2]) {
                                                          var nam=id.substr(0,id.length-3);
                                                          setState(nam+"count",getState(nam+"count").val+1);
                                                          setState(nam+"recieved", formatDate(new Date(), "JJJJ.MM.TT SS:mm:ss"));
                                                          var lastname=nam.substr(0,nam.length-1).split(".");
                                                          setState(bridgename+"lastname",lastname[lastname.length-1]);
                                                          //  return false;
                                                      }
                                                  }
                                              });
                                          
                                              if (getState(bridgename+'learning').val=="on") {
                                          //        console.log("Neu  : " + code);
                                                  $('state[id='+bridgename+'code.*.org]').each(function (id, i) {
                                                      var akt=getState(id).val;
                                                      if (akt!=null) {
                                                          akt=akt.split(" ");
                                                          if (elems[elems.length-2]==akt[akt.length-2]) {
                                                              console.log("Code bekannt:" + id);
                                                              code="";
                                                              return false;
                                                          }
                                                      }
                                                  });
                                                  if (code=="") return;
                                                  console.log("Schreib:" + code);
                                                 // return;
                                                  counter=counter+1;
                                                  setState(bridgename+'counter',counter);
                                          
                                                  var name=bridgename+"code."+String(counter)+".";
                                                  var laenge=2;
                                                  var newcode="";
                                                  for (let i=3;i<elems.length;i++) {
                                                      newcode=newcode+" "+elems[i];
                                                      laenge=laenge+elems[i].length;
                                                  }
                                                  laenge=laenge/2;
                                                  var newcode=elems[0]+" B0 "+laenge.toString(16)+" "+elems[2]+" 08"+newcode;
                                                  createStates(name,"unbekannt",obj.state.val,1,newcode);
                                                  attachListener();
                                              } 
                                              
                                          
                                          })
                                          
                                          attachListener();
                                          schedule("*/20 * * * *", function () {
                                              setState(sonoff+'RfRaw',"177");
                                          });
                                          
                                          
                                          
                                          

                                          Nach dem Start seht ihr folgende Punkte:
                                          Bildschirmfoto 2020-11-06 um 23.18.28.png
                                          (code ist bei euch noch leer, also nich sichtbar).

                                          Wenn ihr auf learn drückt, dann startet ihr den Lernmodus:
                                          Bildschirmfoto 2020-11-06 um 23.20.49.png

                                          nochmal auf learn, oder Skipt neu starten, geht wieder in den normalen Modus.

                                          Bildschirmfoto 2020-11-06 um 23.21.37.png

                                          Oben seht ihr, dass ich 2 Tasten angelernt habe.

                                          • count=wie oft wurde die Fernbedienung gedrückt.
                                          • name=Name der Taste
                                          • org=Aufgezeichneter Code
                                          • recieved=wann das letzte mal empfangen
                                          • send=Code über sonoff Bridge senden
                                          • transform=für Portisch umgerechnete code (falls das mit euren nicht geht, hier den von der Website umgerechneten eintragen)

                                          Wenn man sich nicht sicher ist, welche Taste welche war, einfach im "Nicht-Lernmodus" Taste drücken. Dann wird count und recieved upgedatet.

                                          Um die Codes einfacher in Skripten etc. verwenden zu können, kann man in name die Bezeichnung des codes eingeben (keine Leerzeichen, Sonderzeichen etc).

                                          Dann benennt er den Zweig entsprechend um:

                                          Bildschirmfoto 2020-11-06 um 23.29.16.png
                                          (habe mich doch für deutsch entschieden FB_1_an)
                                          Bildschirmfoto 2020-11-06 um 23.31.47.png

                                          Solle bei vielen Anlernvorgängen das umbenennen haken, einfach das Skript neu starten.

                                          Viel Spaß damit, wie man sicher sieht ist JS nicht meine erste Programmiersprache, aber es läuft...

                                          M Offline
                                          M Offline
                                          Mike Hellracer
                                          schrieb am zuletzt editiert von Mike Hellracer
                                          #28

                                          @sissiwup
                                          Hi,
                                          ich habe noch ein kleines Problem...
                                          Über ein Gruppe versuche ich 6 Intertechno Steckdosen zu schalten.
                                          Aber es wird jede 3te nicht ausgelöst.
                                          Wenn ich die Reihenfolge ändere isind es zwar andere, aber es ist wieder jede 3te.
                                          Einzeln funktioniert das wunderbar.
                                          Auch wenn ich 3 Gruppen a 2 Stück mache funktioniert es problemlos.
                                          Ich habe nun den Verdacht, dass das Script beim Senden ein wenig zu schnell ist.
                                          Könnte man hier ein Delay für das Abarbeiten der Befehle einbauen?
                                          Oder gibt es dass schon und ich muss es nur ein wenig erhöhen.
                                          Dann wäre ich froh, wenn mir einer sagen kann welchen Wert ich anpassen muss.

                                          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

                                          762

                                          Online

                                          32.4k

                                          Benutzer

                                          81.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
                                          • Aktuell
                                          • Tags
                                          • Ungelesen 0
                                          • Kategorien
                                          • Unreplied
                                          • Beliebt
                                          • GitHub
                                          • Docu
                                          • Hilfe