Weiter zum Inhalt
  • Home
  • Aktuell
  • Tags
  • 0 Ungelesen 0
  • Kategorien
  • Unreplied
  • Beliebt
  • GitHub
  • Docu
  • Hilfe
Skins
  • Hell
  • Brite
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dunkel
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

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

Community Forum

donate donate
  1. ioBroker Community Home
  2. Русский
  3. ioBroker
  4. Скрипты
  5. ioBroker скрипты
  6. Проблема со скриптом

NEWS

  • Neuer ioBroker-Blog online: Monatsrückblick März/April 2026
    BluefoxB
    Bluefox
    8
    1
    1.7k

  • Verwendung von KI bitte immer deutlich kennzeichnen
    HomoranH
    Homoran
    10
    1
    712

  • Monatsrückblick Januar/Februar 2026 ist online!
    BluefoxB
    Bluefox
    18
    1
    1.2k

Проблема со скриптом

Geplant Angeheftet Gesperrt Verschoben ioBroker скрипты
11 Beiträge 3 Kommentatoren 3.2k Aufrufe
  • Ä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.
  • D Offline
    D Offline
    dimon
    schrieb am zuletzt editiert von
    #1

    Имеется приборчик PZEM-004t - китайский измеритель напряжения, тока, мощности и суммарного потребления. Подключен к iobroker через esp8266 с прошивкой wifi-iot по mqtt. Показания исправно приходят в iobroker. Появилось желание сделать расчет суточного потребления и его стоимости.

    Написал скрипт:

    var T1 = 3; //Стоимость тарифа Т1
    var difference = 0; //Разница между старым и новым значением
    createState('energy_count.Day', 0, {name: 'Day energy count', type: 'number', read: true, write: true, unit:'kWh'});
    createState('energy_count.DayCost', 0, {name: 'Day energy cost', type: 'number', read: true, write: true, unit:'руб'});
    createState('energy_count.costT1', T1, {name: 'Cost T1 per kWh', read: true, write: true, unit: 'руб/kWh'});
    
    on({id: "mqtt.0.ESP00163EB3.pmwh", change: "gt"}, function (obj) {
         if (obj.newState.val >= obj.oldState.val) {
            difference = (obj.newState.val - obj.oldState.val)/1000;
            var mD = Math.round (parseFloat (getState("javascript.0.energy_count.Day").val + difference)*1000)/1000;
            var mDC = Math.round (parseFloat (getState("javascript.0.energy_count.DayCost").val + (difference * T1))*1000)/1000;
            setState('javascript.0.energy_count.Day', mD, true);
            setState('javascript.0.energy_count.DayCost', mDC, true);
    
         }
    });
    
    schedule("0 0 0 * * *", function () {       //Каждый день в 00:00:00 обнуляем дневные показания
        setState('javascript.0.energy_count.Day', 0, true);
        setState('javascript.0.energy_count.DayCost', 0, true);
    });
    
    

    Сначала скрипт считает все нормально, значения плюсуются исправно, но в какой-то момент начинает складывать не понятные мне значения:

    ![](</s><URL url=)http://pics.4minipc.ru/images/2017/03/30/2.png" />![](</s><URL url=)http://pics.4minipc.ru/images/2017/03/30/1.png" />

    Причем исходные данные от PZEM идут как положено.

    Есть идеи?~~~~

    1 Antwort Letzte Antwort
    0
    • I Offline
      I Offline
      instalator
      schrieb am zuletzt editiert von
      #2

      @dimon:

      Сначала скрипт считает все нормально, значения плюсуются исправно, но в какой-то момент начинает складывать не понятные мне значения:

      Причем исходные данные от PZEM идут как положено.

      Есть идеи? `
      Я бы первым делом сделал так:

      ! ````
      var T1 = 3; //Стоимость тарифа Т1
      var difference = 0; //Разница между старым и новым значением
      createState('energy_count.Day', 0, {name: 'Day energy count', type: 'number', read: true, write: true, unit:'kWh'});
      createState('energy_count.DayCost', 0, {name: 'Day energy cost', type: 'number', read: true, write: true, unit:'руб'});
      createState('energy_count.costT1', T1, {name: 'Cost T1 per kWh', read: true, write: true, unit: 'руб/kWh'});
      ! on({id: "mqtt.0.ESP00163EB3.pmwh", change: "gt"}, function (obj) {
      log('obj.newState.val = '+ obj.newState.val);
      log('obj.oldState.val = '+ obj.oldState.val);
      if (obj.newState.val >= obj.oldState.val) {
      difference = parseFloat((parseFloat(obj.newState.val) - parseFloat(obj.oldState.val))/1000);
      log('difference = '+ difference);
      var mD = Math.round ((parseFloat (getState("javascript.0.energy_count.Day").val) + difference)*1000)/1000;
      var mDC = Math.round ((parseFloat (getState("javascript.0.energy_count.DayCost")).val + (difference * T1))*1000)/1000;
      log('mD = '+ mD);
      log('mDC = '+ mDC);
      setState('javascript.0.energy_count.Day', mD, true);
      setState('javascript.0.energy_count.DayCost', mDC, true);

       }
      

      });

      ! schedule("0 0 0 * * *", function () { //Каждый день в 00:00:00 обнуляем дневные показания
      setState('javascript.0.energy_count.Day', 0, true);
      setState('javascript.0.energy_count.DayCost', 0, true);
      });

      Высокий уровень Децибел вреден для здоровья!

      http://blog.instalator.ru/

      1 Antwort Letzte Antwort
      0
      • D Offline
        D Offline
        dimon
        schrieb am zuletzt editiert von
        #3

        Сделал по рекоммендации. Несколько часов нормальной работы и опять…

        Вот что нарыл в логе:

        Последнее нормальное значение:

        2017-03-31 11:30:13.025 - [32minfo[39m: javascript.0 script.js.common.energy-cost: obj.newState.val = 7837

        2017-03-31 11:30:13.026 - [32minfo[39m: javascript.0 script.js.common.energy-cost: obj.oldState.val = 7836

        2017-03-31 11:30:13.027 - [32minfo[39m: javascript.0 script.js.common.energy-cost: difference = 0.001

        2017-03-31 11:30:13.029 - [32minfo[39m: javascript.0 script.js.common.energy-cost: mD = 0.081

        2017-03-31 11:30:13.029 - [32minfo[39m: javascript.0 script.js.common.energy-cost: mDC = 0.243

        Следующее, уже не правильное:

        2017-03-31 11:30:23.000 - [32minfo[39m: javascript.0 script.js.common.energy-cost: obj.newState.val = 7837

        2017-03-31 11:30:23.001 - [32minfo[39m: javascript.0 script.js.common.energy-cost: obj.oldState.val = 0

        2017-03-31 11:30:23.002 - [32minfo[39m: javascript.0 script.js.common.energy-cost: difference = 7.837

        2017-03-31 11:30:23.003 - [32minfo[39m: javascript.0 script.js.common.energy-cost: mD = 7.918

        2017-03-31 11:30:23.004 - [32minfo[39m: javascript.0 script.js.common.energy-cost: mDC = 23.754

        Прошло еще немного времени:

        2017-03-31 11:38:38.110 - [32minfo[39m: javascript.0 script.js.common.energy-cost: obj.newState.val = 7841

        2017-03-31 11:38:38.111 - [32minfo[39m: javascript.0 script.js.common.energy-cost: obj.oldState.val = 7840

        2017-03-31 11:38:38.112 - [32minfo[39m: javascript.0 script.js.common.energy-cost: difference = 0.001

        2017-03-31 11:38:38.114 - [32minfo[39m: javascript.0 script.js.common.energy-cost: mD = 172.526

        2017-03-31 11:38:38.115 - [32minfo[39m: javascript.0 script.js.common.energy-cost: mDC = 517.578

        Куда то временами пропадает obj.oldState.val.

        Как быть?

        1 Antwort Letzte Antwort
        0
        • D Offline
          D Offline
          dimon
          schrieb am zuletzt editiert von
          #4

          Сделал проверку на "0".

          Скрипт не производит арифметику, если obj.oldState.val = 0. Теперь считает нормально. Но отсюда получаем новый глюк:

          15:06:08.297 [info] javascript.0 script.js.common.energy-cost: obj.newState.val = 7937

          15:06:08.298 [info] javascript.0 script.js.common.energy-cost: obj.oldState.val = 0

          15:06:28.269 [info] javascript.0 script.js.common.energy-cost: obj.newState.val = 7938

          15:06:28.270 [info] javascript.0 script.js.common.energy-cost: obj.oldState.val = 0

          15:06:48.298 [info] javascript.0 script.js.common.energy-cost: obj.newState.val = 7938

          15:06:48.300 [info] javascript.0 script.js.common.energy-cost: obj.oldState.val = 0

          15:07:03.191 [info] javascript.0 script.js.common.energy-cost: obj.newState.val = 7938

          15:07:03.192 [info] javascript.0 script.js.common.energy-cost: obj.oldState.val = 0

          15:07:08.324 [info] javascript.0 script.js.common.energy-cost: obj.newState.val = 7939

          15:07:08.327 [info] javascript.0 script.js.common.energy-cost: obj.oldState.val = 7938

          15:07:08.327 [info] javascript.0 script.js.common.energy-cost: difference = 0.001

          15:07:08.327 [info] javascript.0 script.js.common.energy-cost: mD = 0.007

          15:07:08.327 [info] javascript.0 script.js.common.energy-cost: mDC = 0.021

          он пропускает значения, т.к. obj.oldState.val для 7939 это 7938, а последний раз он отработал по 7937.

          1 Antwort Letzte Antwort
          0
          • BluefoxB Offline
            BluefoxB Offline
            Bluefox
            schrieb am zuletzt editiert von
            #5

            @dimon:

            Сделал проверку на "0".

            Скрипт не производит арифметику, если obj.oldState.val = 0. Теперь считает нормально. Но отсюда получаем новый глюк:

            15:06:08.297 [info] javascript.0 script.js.common.energy-cost: obj.newState.val = 7937

            15:06:08.298 [info] javascript.0 script.js.common.energy-cost: obj.oldState.val = 0

            15:06:28.269 [info] javascript.0 script.js.common.energy-cost: obj.newState.val = 7938

            15:06:28.270 [info] javascript.0 script.js.common.energy-cost: obj.oldState.val = 0

            15:06:48.298 [info] javascript.0 script.js.common.energy-cost: obj.newState.val = 7938

            15:06:48.300 [info] javascript.0 script.js.common.energy-cost: obj.oldState.val = 0

            15:07:03.191 [info] javascript.0 script.js.common.energy-cost: obj.newState.val = 7938

            15:07:03.192 [info] javascript.0 script.js.common.energy-cost: obj.oldState.val = 0

            15:07:08.324 [info] javascript.0 script.js.common.energy-cost: obj.newState.val = 7939

            15:07:08.327 [info] javascript.0 script.js.common.energy-cost: obj.oldState.val = 7938

            15:07:08.327 [info] javascript.0 script.js.common.energy-cost: difference = 0.001

            15:07:08.327 [info] javascript.0 script.js.common.energy-cost: mD = 0.007

            15:07:08.327 [info] javascript.0 script.js.common.energy-cost: mDC = 0.021

            он пропускает значения, т.к. obj.oldState.val для 7939 это 7938, а последний раз он отработал по 7937. `
            OldVal не сохраняется при перезгрузке. IoBroker перезапустил - 0 получил.

            1 Antwort Letzte Antwort
            0
            • BluefoxB Offline
              BluefoxB Offline
              Bluefox
              schrieb am zuletzt editiert von
              #6

              Это делается по другому. При старте скрипта запоминаешь значение в локальной переменной и её потом используешь.

              Хотя все равно не понятно. Почему 0. :?

              1 Antwort Letzte Antwort
              0
              • BluefoxB Offline
                BluefoxB Offline
                Bluefox
                schrieb am zuletzt editiert von
                #7

                Наверное у тебя приходят нули по mqtt но ты их не печатает, т.к. смотришь, чтоб новое значение было больше.

                Поставь проверку на ноль и печатай лог

                1 Antwort Letzte Antwort
                0
                • D Offline
                  D Offline
                  dimon
                  schrieb am zuletzt editiert von
                  #8

                  @Bluefox:

                  Наверное у тебя приходят нули по mqtt но ты их не печатает, т.к. смотришь, чтоб новое значение было больше.

                  Поставь проверку на ноль и печатай лог `

                  Так лог ведь печатается:

                  ! 15:06:08.297 [info] javascript.0 script.js.common.energy-cost: obj.newState.val = 7937 15:06:08.298 [info] javascript.0 script.js.common.energy-cost: obj.oldState.val = 0 15:06:28.269 [info] javascript.0 script.js.common.energy-cost: obj.newState.val = 7938 15:06:28.270 [info] javascript.0 script.js.common.energy-cost: obj.oldState.val = 0 15:06:48.298 [info] javascript.0 script.js.common.energy-cost: obj.newState.val = 7938 15:06:48.300 [info] javascript.0 script.js.common.energy-cost: obj.oldState.val = 0 15:07:03.191 [info] javascript.0 script.js.common.energy-cost: obj.newState.val = 7938 15:07:03.192 [info] javascript.0 script.js.common.energy-cost: obj.oldState.val = 0 15:07:08.324 [info] javascript.0 script.js.common.energy-cost: obj.newState.val = 7939 15:07:08.327 [info] javascript.0 script.js.common.energy-cost: obj.oldState.val = 7938 15:07:08.327 [info] javascript.0 script.js.common.energy-cost: difference = 0.001 15:07:08.327 [info] javascript.0 script.js.common.energy-cost: mD = 0.007 15:07:08.327 [info] javascript.0 script.js.common.energy-cost: mDC = 0.021 !

                  А вот и весь код. Что куда добавить?

                  ! ````
                  var T1 = 3; //Стоимость тарифа Т1
                  var difference = 0; //Разница между старым и новым значением
                  createState('energy_count.Day', 0, {name: 'Day energy count', type: 'number', read: true, write: true, unit:'kWh'});
                  createState('energy_count.DayCost', 0, {name: 'Day energy cost', type: 'number', read: true, write: true, unit:'руб'});
                  createState('energy_count.costT1', T1, {name: 'Cost T1 per kWh', read: true, write: true, unit: 'руб/kWh'});
                  ! on({id: "mqtt.0.ESP00163EB3.pmwh", change: "gt"}, function (obj) {
                  log('obj.newState.val = '+ obj.newState.val);
                  log('obj.oldState.val = '+ obj.oldState.val);
                  if (obj.newState.val > obj.oldState.val && obj.oldState.val > 0) {
                  difference = parseFloat((parseFloat(obj.newState.val) - parseFloat(obj.oldState.val))/1000);
                  log('difference = '+ difference);
                  var mD = Math.round ((parseFloat (getState("javascript.0.energy_count.Day").val) + difference)*1000)/1000;
                  var mDC = Math.round ((parseFloat (getState("javascript.0.energy_count.DayCost")).val + (difference * T1))*1000)/1000;
                  log('mD = '+ mD);
                  log('mDC = '+ mDC);
                  setState('javascript.0.energy_count.Day', mD, true);
                  setState('javascript.0.energy_count.DayCost', mDC, true);

                   }
                  

                  });

                  ! schedule("0 0 0 * * *", function () { //Каждый день в 00:00:00 обнуляем дневные показания
                  setState('javascript.0.energy_count.Day', 0, true);
                  setState('javascript.0.energy_count.DayCost', 0, true);
                  });

                  1 Antwort Letzte Antwort
                  0
                  • BluefoxB Offline
                    BluefoxB Offline
                    Bluefox
                    schrieb am zuletzt editiert von
                    #9

                    ! ````
                    var T1 = 3; //Стоимость тарифа Т1
                    var difference = 0; //Разница между старым и новым значением
                    createState('energy_count.Day', 0, {name: 'Day energy count', type: 'number', read: true, write: true, unit:'kWh'});
                    createState('energy_count.DayCost', 0, {name: 'Day energy cost', type: 'number', read: true, write: true, unit:'руб'});
                    createState('energy_count.costT1', T1, {name: 'Cost T1 per kWh', read: true, write: true, unit: 'руб/kWh'});
                    ! on({id: "mqtt.0.ESP00163EB3.pmwh", change: "any"}, function (obj) {
                    log('obj.newState.val = '+ obj.newState.val);
                    log('obj.oldState.val = '+ obj.oldState.val);
                    if (obj.newState.val > obj.oldState.val && obj.oldState.val > 0) {
                    difference = parseFloat((parseFloat(obj.newState.val) - parseFloat(obj.oldState.val))/1000);
                    log('difference = '+ difference);
                    var mD = Math.round ((parseFloat (getState("javascript.0.energy_count.Day").val) + difference)*1000)/1000;
                    var mDC = Math.round ((parseFloat (getState("javascript.0.energy_count.DayCost")).val + (difference * T1))*1000)/1000;
                    log('mD = '+ mD);
                    log('mDC = '+ mDC);
                    setState('javascript.0.energy_count.Day', mD, true);
                    setState('javascript.0.energy_count.DayCost', mDC, true);

                     }
                    

                    });

                    ! schedule("0 0 0 * * *", function () { //Каждый день в 00:00:00 обнуляем дневные показания
                    setState('javascript.0.energy_count.Day', 0, true);
                    setState('javascript.0.energy_count.DayCost', 0, true);
                    });

                    Обрати внимание на "change: "any""
                    1 Antwort Letzte Antwort
                    0
                    • D Offline
                      D Offline
                      dimon
                      schrieb am zuletzt editiert von
                      #10

                      @Bluefox:

                      ! ````
                      var T1 = 3; //Стоимость тарифа Т1
                      var difference = 0; //Разница между старым и новым значением
                      createState('energy_count.Day', 0, {name: 'Day energy count', type: 'number', read: true, write: true, unit:'kWh'});
                      createState('energy_count.DayCost', 0, {name: 'Day energy cost', type: 'number', read: true, write: true, unit:'руб'});
                      createState('energy_count.costT1', T1, {name: 'Cost T1 per kWh', read: true, write: true, unit: 'руб/kWh'});
                      ! on({id: "mqtt.0.ESP00163EB3.pmwh", change: "any"}, function (obj) {
                      log('obj.newState.val = '+ obj.newState.val);
                      log('obj.oldState.val = '+ obj.oldState.val);
                      if (obj.newState.val > obj.oldState.val && obj.oldState.val > 0) {
                      difference = parseFloat((parseFloat(obj.newState.val) - parseFloat(obj.oldState.val))/1000);
                      log('difference = '+ difference);
                      var mD = Math.round ((parseFloat (getState("javascript.0.energy_count.Day").val) + difference)*1000)/1000;
                      var mDC = Math.round ((parseFloat (getState("javascript.0.energy_count.DayCost")).val + (difference * T1))*1000)/1000;
                      log('mD = '+ mD);
                      log('mDC = '+ mDC);
                      setState('javascript.0.energy_count.Day', mD, true);
                      setState('javascript.0.energy_count.DayCost', mDC, true);

                       }
                      

                      });

                      ! schedule("0 0 0 * * *", function () { //Каждый день в 00:00:00 обнуляем дневные показания
                      setState('javascript.0.energy_count.Day', 0, true);
                      setState('javascript.0.energy_count.DayCost', 0, true);
                      });

                      Обрати внимание на "change: "any"" `  
                      

                      Сделал проще - включил сохранение истории для mqtt.0.ESP00163EB3.pmwh.

                      Вот что она показала:

                      ! ![](</s><URL url=)<link_text text="http://pics.4minipc.ru/images/2017/03/3 ... -59-43.png">http://pics.4minipc.ru/images/2017/03/31/2017-03-31_22-59-43.png</link_text>" />
                      !
                      ![](</s><URL url=)<link_text text="http://pics.4minipc.ru/images/2017/03/3 ... -12-22.png">http://pics.4minipc.ru/images/2017/03/31/2017-03-31_23-12-22.png</link_text>" />~~~~ ~~~~Была у меня мысль, что косячить может mqtt, но я никогда не замечал изменения значений. Судя по истории ноль появляется на несколько секунд. Выходит все мороки со скриптом напрасны, он и в начальной версии работал правильно.

                      Буду дальше искать варианты выполнить "хотелку".

                      Спасибо!~~~~

                      1 Antwort Letzte Antwort
                      0
                      • D Offline
                        D Offline
                        dimon
                        schrieb am zuletzt editiert von
                        #11

                        В общем проблему решил так:

                        ! ````
                        var T1 = 3; //Стоимость тарифа Т1
                        var difference = 0; //Разница между старым и новым значением
                        createState('energy_count.Day', 0, {name: 'Day energy count', type: 'number', read: true, write: true, unit:'kWh'});
                        createState('energy_count.DayCost', 0, {name: 'Day energy cost', type: 'number', read: true, write: true, unit:'руб'});
                        createState('energy_count.costT1', T1, {name: 'Cost T1 per kWh', read: true, write: true, unit: 'руб/kWh'});
                        createState('energy_count.pmwh', 0, {name: 'pmwh без глюка', read: true, write: true, unit: 'kWh'});
                        ! on({id: "javascript.0.energy_count.pmwh", change: "any"}, function (obj) {
                        if (obj.newState.val > obj.oldState.val && obj.oldState.val > 0) {
                        setState('javascript.0.energy_count.pmwh', obj.newState.val, true);
                        }
                        });
                        ! on({id: "mqtt.0.ESP00163EB3.pmwh", change: "gt"}, function (obj) {
                                log('obj.newState.val = '+ obj.newState.val);
                                log('obj.oldState.val = '+ obj.oldState.val);
                             if (obj.newState.val > obj.oldState.val && obj.oldState.val > 0) {
                                difference = parseFloat((parseFloat(obj.newState.val) - parseFloat(obj.oldState.val))/1000);
                                log('difference = '+ difference);
                                var mD = Math.round ((parseFloat (getState("javascript.0.energy_count.Day").val) + difference)*1000)/1000;
                                var mDC = Math.round ((parseFloat (getState("javascript.0.energy_count.DayCost")).val + (difference * T1))*1000)/1000;
                                log('mD = '+ mD);
                                log('mDC = '+ mDC);
                                setState('javascript.0.energy_count.Day', mD, true);
                                setState('javascript.0.energy_count.DayCost', mDC, true);

                        }
                        });

                        ! schedule("0 0 0 * * *", function () {       //Каждый день в 00:00:00 обнуляем дневные показания
                            setState('javascript.0.energy_count.Day', 0, true);
                            setState('javascript.0.energy_count.DayCost', 0, true);
                        });

                        
                        Теперь работает стабильно и без пропусков.
                        
                        На очереди сохранение значения при перезагрузке.
                        1 Antwort Letzte Antwort
                        0

                        Hey! Du scheinst an dieser Unterhaltung interessiert zu sein, hast aber noch kein Konto.

                        Hast du es satt, bei jedem Besuch durch die gleichen Beiträge zu scrollen? Wenn du dich für ein Konto anmeldest, kommst du immer genau dorthin zurück, wo du zuvor warst, und kannst dich über neue Antworten benachrichtigen lassen (entweder per E-Mail oder Push-Benachrichtigung). Du kannst auch Lesezeichen speichern und Beiträge positiv bewerten, um anderen Community-Mitgliedern deine Wertschätzung zu zeigen.

                        Mit deinem Input könnte dieser Beitrag noch besser werden 💗

                        Registrieren Anmelden
                        Antworten
                        • In einem neuen Thema antworten
                        Anmelden zum Antworten
                        • Älteste zuerst
                        • Neuste zuerst
                        • Meiste Stimmen


                        Support us

                        ioBroker
                        Community Adapters
                        Donate

                        465

                        Online

                        32.9k

                        Benutzer

                        83.0k

                        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