Skip to content
  • Home
  • Aktuell
  • Tags
  • 0 Ungelesen 0
  • Kategorien
  • Unreplied
  • Beliebt
  • GitHub
  • Docu
  • Hilfe
Skins
  • Light
  • Brite
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Standard: (Kein Skin)
  • Kein Skin
Einklappen
ioBroker Logo

Community Forum

donate donate
  1. ioBroker Community Home
  2. Deutsch
  3. Skripten / Logik
  4. Skript für Bluetooth-Heizkörperthermostat unter IoBroker

NEWS

  • Jahresrückblick 2025 – unser neuer Blogbeitrag ist online! ✨
    BluefoxB
    Bluefox
    14
    1
    306

  • Neuer Blogbeitrag: Monatsrückblick - Dezember 2025 🎄
    BluefoxB
    Bluefox
    13
    1
    600

  • Weihnachtsangebot 2025! 🎄
    BluefoxB
    Bluefox
    25
    1
    1.8k

Skript für Bluetooth-Heizkörperthermostat unter IoBroker

Geplant Angeheftet Gesperrt Verschoben Skripten / Logik
21 Beiträge 10 Kommentatoren 4.0k Aufrufe 3 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.
  • G Offline
    G Offline
    gato
    schrieb am zuletzt editiert von
    #10

    Was ich zwischenzeitlich herausgefunden habe, ist dass es definitiv am Pfad bzw. an dem spez. Befehl liegt.

    Meine Gegenprobe mit dem Befehl: wall "test" funktionierte mit dem gleichen Blockly Aufbau.

    Weis jemand von euch wie ich den Pfad "./eQ-3-radiator-thermostat/eq3.exp <macadresse>temp 20.0" anpassen muss, damit er mit iobroker kompatibel ist?</macadresse>

    1 Antwort Letzte Antwort
    0
    • K Offline
      K Offline
      kr4mb3
      schrieb am zuletzt editiert von kr4mb3
      #11

      @DennisK:

      Weis jemand von euch wie ich den Pfad "./eQ-3-radiator-thermostat/eq3.exp <macadresse>temp 20.0" anpassen muss, damit er mit iobroker kompatibel ist?</macadresse> `

      Ich habe mich die Tage auch mal mit dem Thermostat beschäftigt und mir basierend auf dem Code von Heckie75 ein Skript in ioBroker geschrieben, dass mir auch ein paar Datenpunkte erstellt. Sicherlich nicht der schönste Code, aber es funktioniert. Ich habe den Pfad zur eq3.exp-Datei absolut angegeben, damit ich den Code verwenden kann:

      /*
       script needs Heckie75/eQ-3-radiator-thermostat package.
       see https://github.com/Heckie75/eQ-3-radiator-thermostat
       thermostat must be paired via bluetooth 
       exec command must be enabled in javascript adapter
      */
      
      //Absolute Path to eQ-3-radiator-thermostat package and MAC of paired eQ3 thermostat
      var eQ3 = "/home/pi/eQ-3-radiator-thermostat/eq3.exp";
      var mac = "00:1A:22:0C:08:3E";
      
      //new iobroker states
      createState('eQ3.control.boostOn', false, {type: "boolean", role: "button"});
      createState('eQ3.control.boostOff', false, {type: "boolean", role: "button"});
      createState('eQ3.control.boostSwitch', false, {type: "boolean", role: "switch"});
      createState('eQ3.control.getStatus', false, {type: "boolean", role: "button"});
      createState('eQ3.control.setMode', false, {max: 1, min: 0, states: {0:"auto",1:"manual"}});
      createState('eQ3.control.setTemp');
      createState('eQ3.control.setOffset');
      createState('eQ3.control.command');
      
      createState('eQ3.status.Temperature');
      createState('eQ3.status.Valve');
      createState('eQ3.status.Mode');
      createState('eQ3.status.VacationMode');
      createState('eQ3.status.LowBattery');
      createState('eQ3.status.OpenWindow');
      createState('eQ3.status.Boost');
      createState('eQ3.status.Locked');
      createState('eQ3.status.OffsetTemp');
      
      createState('eQ3.device.MAC');
      createState('eQ3.device.Name');
      createState('eQ3.device.Vendor');
      
      createState('eQ3.timer.timerJSON');
      
      //Exec-Befehl
      var eQ3exec = eQ3 + ' ' + mac + ' ';
      
      //Status
      on({id: 'javascript.0.eQ3.control.getStatus', val: true}, function (obj) {
          exec(eQ3exec + "status", function(err, stdout, stderr) {
               eQ3status(stdout);
           });
      });
      
      //Boost On
      on({id: 'javascript.0.eQ3.control.boostOn', val: true}, function (obj) {
           exec(eQ3exec + "boost", function(err, stdout, stderr) {
               eQ3status(stdout);
           });
      });
      
      //Boost Off
      on({id: 'javascript.0.eQ3.control.boostOff', val: true}, function (obj) {
           exec(eQ3exec + "boost off", function(err, stdout, stderr) {
               eQ3status(stdout);
           });    
      });
      
      //Boost Switch
      on({id: 'javascript.0.eQ3.control.boostSwitch', change: "any"}, function (obj) {
          var value = obj.state.val;
          log (value);
          if (value === true) {
              exec(eQ3exec + "boost", function(err, stdout, stderr) {
                  eQ3status(stdout);
                  log ("Boost an");
              });
          }else if (value === false){
              exec(eQ3exec + "boost off", function(err, stdout, stderr) {
                  eQ3status(stdout);
                  log ("Boost aus");
              });
          }
      });
      
      //Set Temperature
      on({id: 'javascript.0.eQ3.control.setTemp', change: "any"}, function (obj) {
           var value = obj.state.val;
           exec(eQ3exec + "temp " + value, function(err, stdout, stderr) {
               eQ3status(stdout);
           });
      });
      
      //Set Offset
      on({id: 'javascript.0.eQ3.control.setOffset', change: "any"}, function (obj) {
          var value = obj.state.val;
          exec(eQ3exec + "offset " + value, function(err, stdout, stderr) {
               eQ3status(stdout);
           });
      });
      
      //Set Mode
      on({id: 'javascript.0.eQ3.control.setMode', change: "any"}, function (obj) {
           var value = obj.state.val;
           if (value === 0) {
              exec(eQ3exec + "auto", function(err, stdout, stderr) {
               eQ3status(stdout);
           });
           } else if (value === 1){
                exec(eQ3exec + "manual", function(err, stdout, stderr) {
               eQ3status(stdout);
           });
           }
      });
      
      //Custom Command
      on({id: 'javascript.0.eQ3.control.command', change: "any"}, function (obj) {
        var value = obj.state.val;
        exec(eQ3exec + value, function(err, stdout, stderr) {
               eQ3status(stdout);
           });
      });
      
      
      
      //Thermostat Status
      function eQ3status(stdout) {
          eQ3json();
          
              stdout = stdout.split("\n");
              stdout.forEach(element => {
          
                  switch(element.split(":")[0]){
                      /*
                      case "Temperature":
                          setState('eQ3.status.Temperature', element.split(":")[1].trim());
                          break;
                      case "Valve":
                          setState('eQ3.status.Valve', element.split(":")[1].trim());
                          break;
                      */
                      case "Mode":
                          setState('eQ3.status.Mode', element.split(":")[1].trim());
                          break;
                      case "Vacation mode":
                          setState('eQ3.status.VacationMode', element.split(":")[1].trim());
                          break;
                      case "Offset temperature":
                          setState('eQ3.status.OffsetTemp', element.split(":")[1].trim());
                          break;
                      case "Device name":
                          setState('eQ3.device.Name', element.split(":")[1].trim());
                          break;
                      case "Device vendor":
                          setState('eQ3.device.Vendor', element.split(":")[1].trim());
                          break;
                      case "":
                          break;
                  }
              });
      }
      
      
      //Thermostat Status JSON
      function eQ3json(){
          exec(eQ3exec + "json", function(err, stdout, stderr) {
              obj = JSON.parse(stdout);
              
              //Status
              setState('eQ3.status.LowBattery', obj.mode["low battery"]);
              setState('eQ3.status.OpenWindow', obj.mode["open window"]);
              setState('eQ3.status.Boost', obj.mode.boost);
              setState('eQ3.status.Locked', obj.mode.locked);
              setState('eQ3.status.Valve', obj.valve);
              setState('eQ3.status.Temperature', obj.temperature);
              
              //Device
              setState('eQ3.device.MAC', obj.mac);
              
              //Timer
              setState('eQ3.timer.timerJSON', JSON.stringify(obj.timers));
          });
      }
      
      schedule('*/2 * * * *', function (obj) {
          exec(eQ3exec + "status", function(err, stdout, stderr) {
               eQ3status(stdout);
          });
      });
      

      Noch habe ich nicht alle Funktionen des Skripts von Heckie75 umgesetzt, aber mehr brauch ich aktuell nicht. Die Basissteuerung und die Abfrage des Status (alle 2 Minuten) reicht mir bisher. Vielleicht hilft dir oder anderen das ja als Vorlage.

      Greetz

      kr4mb3

      1 Antwort Letzte Antwort
      0
      • MatzebhvM Offline
        MatzebhvM Offline
        Matzebhv
        schrieb am zuletzt editiert von
        #12

        @DennisK:

        Was ich zwischenzeitlich herausgefunden habe, ist dass es definitiv am Pfad bzw. an dem spez. Befehl liegt.

        Meine Gegenprobe mit dem Befehl: wall "test" funktionierte mit dem gleichen Blockly Aufbau.

        Weis jemand von euch wie ich den Pfad "./eQ-3-radiator-thermostat/eq3.exp <macadresse>temp 20.0" anpassen muss, damit er mit iobroker kompatibel ist?</macadresse> `

        Laut deinem Screenshot liegt das Script im Homedir von root.

        "/root/eQ-3-radiator-thermostat/eq3.exp <macadresse>temp 20.0"

        Gruß

        Matze</macadresse>

        1 Antwort Letzte Antwort
        0
        • O Offline
          O Offline
          oemer9119
          schrieb am zuletzt editiert von
          #13

          @kr4mb3:

          @DennisK:

          Weis jemand von euch wie ich den Pfad "./eQ-3-radiator-thermostat/eq3.exp <macadresse>temp 20.0" anpassen muss, damit er mit iobroker kompatibel ist?</macadresse> `

          Ich habe mich die Tage auch mal mit dem Thermostat beschäftigt und mir basierend auf dem Code von Heckie75 ein Skript in ioBroker geschrieben, dass mir auch ein paar Datenpunkte erstellt. Sicherlich nicht der schönste Code, aber es funktioniert. Ich habe den Pfad zur eq3.exp-Datei absolut angegeben, damit ich den Code verwenden kann:

          ! ````
          /*
          script needs Heckie75/eQ-3-radiator-thermostat package.
          see https://github.com/Heckie75/eQ-3-radiator-thermostat
          thermostat must be paired via bluetooth
          exec command must be enabled in javascript adapter
          */
          ! //Absolute Path to eQ-3-radiator-thermostat package and MAC of paired eQ3 thermostat
          var eQ3 = "/home/pi/eQ-3-radiator-thermostat/eq3.exp";
          var mac = "00:00:00:00:00:00";
          ! //new iobroker states
          createState('eQ3.control.boostOn', false, {type: "boolean", role: "button"});
          createState('eQ3.control.boostOff', false, {type: "boolean", role: "button"});
          createState('eQ3.control.getStatus', false, {type: "boolean", role: "button"});
          createState('eQ3.control.setMode', false, {max: 1, min: 0, states: {0:"auto",1:"manual"}});
          createState('eQ3.control.setTemp');
          createState('eQ3.control.setOffset');
          createState('eQ3.control.command');
          ! createState('eQ3.status.Temperature');
          createState('eQ3.status.Valve');
          createState('eQ3.status.Mode');
          createState('eQ3.status.VacationMode');
          createState('eQ3.status.LowBattery');
          createState('eQ3.status.OpenWindow');
          createState('eQ3.status.Boost');
          createState('eQ3.status.Locked');
          createState('eQ3.status.OffsetTemp');
          ! createState('eQ3.device.MAC');
          createState('eQ3.device.Name');
          createState('eQ3.device.Vendor');
          ! createState('eQ3.timer.timerJSON');
          ! //Exec-Befehl
          var eQ3exec = eQ3 + ' ' + mac + ' ';
          ! //Status
          on({id: 'javascript.0.eQ3.control.getStatus', val: true}, function (obj) {
          exec(eQ3exec + "status", function(err, stdout, stderr) {
          eQ3status(stdout);
          });
          });
          ! //Boost On
          on({id: 'javascript.0.eQ3.control.boostOn', val: true}, function (obj) {
          exec(eQ3exec + "boost", function(err, stdout, stderr) {
          eQ3status(stdout);
          });
          });
          ! //Boost Off
          on({id: 'javascript.0.eQ3.control.boostOff', val: true}, function (obj) {
          exec(eQ3exec + "boost off", function(err, stdout, stderr) {
          eQ3status(stdout);
          });
          });
          ! //Set Temperature
          on({id: 'javascript.0.eQ3.control.setTemp', change: "any"}, function (obj) {
          var value = obj.state.val;
          exec(eQ3exec + "temp " + value, function(err, stdout, stderr) {
          eQ3status(stdout);
          });
          });
          ! //Set Offset
          on({id: 'javascript.0.eQ3.control.setOffset', change: "any"}, function (obj) {
          var value = obj.state.val;
          exec(eQ3exec + "offset " + value, function(err, stdout, stderr) {
          eQ3status(stdout);
          });
          });
          ! //Set Mode
          on({id: 'javascript.0.eQ3.control.setMode', change: "any"}, function (obj) {
          var value = obj.state.val;
          if (value === 0) {
          exec(eQ3exec + "auto", function(err, stdout, stderr) {
          eQ3status(stdout);
          });
          } else if (value === 1){
          exec(eQ3exec + "manual", function(err, stdout, stderr) {
          eQ3status(stdout);
          });
          }
          });
          ! //Custom Command
          on({id: 'javascript.0.eQ3.control.command', change: "any"}, function (obj) {
          var value = obj.state.val;
          exec(eQ3exec + value, function(err, stdout, stderr) {
          eQ3status(stdout);
          });
          });
          ! //Thermostat Status
          function eQ3status(stdout) {
          eQ3json();

              stdout = stdout.split("\n");
              stdout.forEach(element => {
          
                  switch(element.split(":")[0]){
                      case "Temperature":
                          setState('eQ3.status.Temperature', element.split(":")[1]);
                          break;
                      case "Valve":
                          setState('eQ3.status.Valve', element.split(":")[1]);
                          break;
                      case "Mode":
                          setState('eQ3.status.Mode', element.split(":")[1]);
                          break;
                      case "Vacation mode":
                          setState('eQ3.status.VacationMode', element.split(":")[1]);
                          break;
                      case "Offset temperature":
                          setState('eQ3.status.OffsetTemp', element.split(":")[1]);
                          break;
                      case "Device name":
                          setState('eQ3.device.Name', element.split(":")[1]);
                          break;
                      case "Device vendor":
                          setState('eQ3.device.Vendor', element.split(":")[1]);
                          break;
                      case "":
                          break;
                  }
              });
          

          }

          ! //Thermostat Status JSON
          function eQ3json(){
          exec(eQ3exec + "json", function(err, stdout, stderr) {
          obj = JSON.parse(stdout);

              //Status
              setState('eQ3.status.LowBattery', obj.mode["low battery"]);
              setState('eQ3.status.OpenWindow', obj.mode["open window"]);
              setState('eQ3.status.Boost', obj.mode.boost);
              setState('eQ3.status.Locked', obj.mode.locked);
              
              //Device
              setState('eQ3.device.MAC', obj.mac);
              
              //Timer
              setState('eQ3.timer.timerJSON', JSON.stringify(obj.timers));
          });
          

          }

          ! schedule('*/5 * * * *', function (obj) {
          exec(eQ3exec + "status", function(err, stdout, stderr) {
          eQ3status(stdout);
          });
          });
          ! ````

          Noch habe ich nicht alle Funktionen des Skripts von Heckie75 umgesetzt, aber mehr brauch ich aktuell nicht. Die Basissteuerung und die Abfrage des Status (alle 5 Minuten) reicht mir bisher. Vielleicht hilft dir oder anderen das ja als Vorlage.

          Greetz

          kr4mb3 `

          Hallo,

          Kann jemand vielleicht kurz erklären wie der das eingebunden hat mit dem code? Evtl für vis oder den cloud Adapter

          1 Antwort Letzte Antwort
          0
          • K Offline
            K Offline
            kr4mb3
            schrieb am zuletzt editiert von
            #14

            @oemer9119:

            Hallo,

            Kann jemand vielleicht kurz erklären wie der das eingebunden hat mit dem code? Evtl für vis oder den cloud Adapter `

            Ich habe mir noch einen weiteren State erstellt, der den Boost Modus aktiviert bzw. deaktiviert:

            createState('eQ3.control.boostSwitch', false, {type: "boolean", role: "switch"});
            

            Diese State habe ich dann im Cloud Adapter hinzugefügt, so kann ich per Alexa-Spracheingabe spontan den Boost Modus aktivieren, wenn es mir zu kalt ist. Den Temperaturwert per Cloud-Adapter zu erhöhen wäre auch sehr praktisch, ich habe es allerdings noch nicht hinbekommen, bestimmte absolute Werte zu übergeben, sondern bloß Prozentwerte…

            In VIS solltest du eigentlich alle States aus dem Skript als Button oder als anderes Objekt einfügen können. Zum Beispiel mit dem hqWidget "Inner Temperature". Dort kann man die Zieltemperatur und den aktuellen Ventilstatus anzeigen. Und wenn du einen Sensor dafür hast, auch die aktuelle Temperatur. Und ein paar Stati aus dem Skript kann man auch als Signalbilder nutzen, zB ob der Boostmodus an ist, die Batterie leer ist oder das Fenster offen ist.

            Greetz kr4mb3
            3592_01_widget.png
            3592_02_signalbilder.png

            1 Antwort Letzte Antwort
            0
            • O Offline
              O Offline
              oemer9119
              schrieb am zuletzt editiert von
              #15

              Hallo bekommst du werte zurück wenn du getstatus ausführst.

              Ich bekomme immer ein Fehler.

              Wenn der Code Läuft kriege ich nicht mal antwort über Putty, aber die Befehle werden trotzdem umgesetzt.

              > Caught by controller[0]: at script.js.Heizung2:143:51

              Oder Auch was mit Zeile 140.

              1 Antwort Letzte Antwort
              0
              • K Offline
                K Offline
                kr4mb3
                schrieb am zuletzt editiert von
                #16

                Hi oemer9119,

                ja ich bekomme Werte zurück, wenn ich getStatus ausführe. Das passiert in meinem Skript ja in zwei Teilen. Zuerst werden Werte wie Batteriestatus oder Boost über die Funktion "eQ3json" abgerufen, danach der aktuelle Modus, die Temperatur, die Ventil-Stellung und der Name sowie Hersteller des Thermostats über die Funktion "eQ3status". Über Putty sieht der Befehl "status" bei mir zB so aus wie im Anhang.

                Die Zeile 143 im Skript teilt zB die Zeile "Device Name" am Doppelpunkt, um nur den Namen selbst zu bekommen. Trim entfernt dann noch die ganzen Leerzeichen zwischen Doppelpunkt und dem Namen. Hat dein Thermostat evtl keinen Namen?!

                Und Zeile 140 ermittelt die Offset Temperatur. Die Zeile im Rückgabewert tritt aber nur auf, wenn man auch den Offset-Wert verändert. Das sollte aber eigentlich keine Fehler aufwerfen. Hast du denn dein Thermostat auch erfolgreich mit dem ioBroker Host per Bluetooth gekoppelt?
                3592_2019-01-02_22_38_55-window.png
                3592_2019-01-02_22_53_50-window.png

                1 Antwort Letzte Antwort
                0
                • X Offline
                  X Offline
                  xatrix
                  schrieb am zuletzt editiert von
                  #17

                  @kr4mb3 said in Skript für Bluetooth-Heizkörperthermostat unter IoBroker:

                  ``

                  Hallo,

                  kannst du bitte das Script neu einbetten? Die Formatierung stimmt nicht mehr.

                  Danke

                  K 1 Antwort Letzte Antwort
                  0
                  • X xatrix

                    @kr4mb3 said in Skript für Bluetooth-Heizkörperthermostat unter IoBroker:

                    ``

                    Hallo,

                    kannst du bitte das Script neu einbetten? Die Formatierung stimmt nicht mehr.

                    Danke

                    K Offline
                    K Offline
                    kr4mb3
                    schrieb am zuletzt editiert von
                    #18

                    @xatrix Ist erledigt, ich hab mein aktuelles Skript in meinem Beitrag oben editiert.

                    pat 0P A 2 Antworten Letzte Antwort
                    0
                    • P Offline
                      P Offline
                      parabelflug1
                      schrieb am zuletzt editiert von
                      #19

                      Moin,
                      ich häng meine Frage mal dran: Hab eq3.exp auch problemlos am laufen - hab heute aber Xiaomi Bluetooth Thermometer bekommen, sodass ich nun auch den BLE-Adapter installiert habe. Leider scheint sich beides zu beißen - der Javascript Adapter kackt mir mehrmals in der Stunde ab. Er prüft ja alle 30s auf neue Daten von den Thermostaten - vermutlich beißt sich's da.
                      Wie macht ihr das?

                      1 Antwort Letzte Antwort
                      0
                      • K kr4mb3

                        @xatrix Ist erledigt, ich hab mein aktuelles Skript in meinem Beitrag oben editiert.

                        pat 0P Offline
                        pat 0P Offline
                        pat 0
                        schrieb am zuletzt editiert von pat 0
                        #20

                        @kr4mb3

                        Hi kr4mb3, ich versuche gerade dein eq3 Skript im ioBroker einzubinden. Erstmal vielen Dank, dass du dir die Mühe gemacht hast und dein Skript zur Verfügung stellst. Ich habe deinen Code als Java Script importiert, MAC und Pfad geändert und gestartet. Das eQ3 Objekt und seine Eigenschaften tauchen dann auch in der Objektansicht auf, aktualisieren sich aber nicht.
                        Auf Befehle reagiert das Thermostat leider auch nicht.

                        Wenn ich die Heckie Befehle manuell ausführe, läuft es.

                        Folgende Fehlermeldungen bekomme ich:
                        25c10166-13d2-4431-9022-ac7083f68f6d-image.png

                        Ist das Problem bekannt?

                        Schonmal vielen Dank!

                        1 Antwort Letzte Antwort
                        0
                        • K kr4mb3

                          @xatrix Ist erledigt, ich hab mein aktuelles Skript in meinem Beitrag oben editiert.

                          A Offline
                          A Offline
                          Android
                          schrieb am zuletzt editiert von Android
                          #21

                          @kr4mb3
                          Hallo Freunde,

                          vielen Dank für den Skript.
                          Funktioniert ganz gut.

                          Meine Frage: hat ihn jemand weiter verbessert?
                          ToDo:

                          • Mehrere Thermostate gleichzeitig
                          • Sicherheit

                          Zum Punkt "Sicherheit":
                          Es ist ja jedem klar, dass die Thermostate nicht durch Verschlüsselung geschützt sind. Wünschenswert wäre eine Funktion im Skript, die eine Fremdeinwirkung erkennt und gegensteuert. Umsetzbar wäre dies z.B. durch das Speichern des Status und regelmäßigen Vergleich der Strings. Hat da jemand eine Idee?

                          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

                          961

                          Online

                          32.5k

                          Benutzer

                          81.9k

                          Themen

                          1.3m

                          Beiträge
                          Community
                          Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen | Einwilligungseinstellungen
                          ioBroker Community 2014-2025
                          logo
                          • Anmelden

                          • Du hast noch kein Konto? Registrieren

                          • Anmelden oder registrieren, um zu suchen
                          • Erster Beitrag
                            Letzter Beitrag
                          0
                          • Home
                          • Aktuell
                          • Tags
                          • Ungelesen 0
                          • Kategorien
                          • Unreplied
                          • Beliebt
                          • GitHub
                          • Docu
                          • Hilfe