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. Visualisierung
  4. Grafana true/false anzeigen

NEWS

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

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

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

Grafana true/false anzeigen

Geplant Angeheftet Gesperrt Verschoben Visualisierung
vistemplate
13 Beiträge 4 Kommentatoren 7.5k Aufrufe 4 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.
  • SegwayS Segway

    Hallo,
    ich stehe grad auf dem Schlauch.
    Im Netz habe ich genau dieses Beispiel gefunden, was mir zeigt das es geht.

    Ich möchte einen Wert in Grafana anzeigen lassen, welches mir true / false liefert.
    Benutzen tue ich das Widget in Grafana STAT.
    Ebenso habe ich das value mapping gemacht aber ich bekomme ewig NO DATA.
    Was mache ich falsch ?

    f230c58c-8c43-4ff7-9130-6861b41ce3af-grafik.png ![Bild Text](Bild Link)

    da_WoodyD Online
    da_WoodyD Online
    da_Woody
    schrieb am zuletzt editiert von
    #2

    @Segway https://grafana.com/docs/grafana/latest/panels/visualizations/stat-panel/

    gruß vom Woody
    HAPPINESS is not a DESTINATION, it's a WAY of LIFE!

    1 Antwort Letzte Antwort
    0
    • SegwayS Segway

      Hallo,
      ich stehe grad auf dem Schlauch.
      Im Netz habe ich genau dieses Beispiel gefunden, was mir zeigt das es geht.

      Ich möchte einen Wert in Grafana anzeigen lassen, welches mir true / false liefert.
      Benutzen tue ich das Widget in Grafana STAT.
      Ebenso habe ich das value mapping gemacht aber ich bekomme ewig NO DATA.
      Was mache ich falsch ?

      f230c58c-8c43-4ff7-9130-6861b41ce3af-grafik.png ![Bild Text](Bild Link)

      crunchipC Abwesend
      crunchipC Abwesend
      crunchip
      Forum Testing Most Active
      schrieb am zuletzt editiert von crunchip
      #3

      @Segway sagte in Grafana true/false anzeigen:

      Ebenso habe ich das value mapping gemacht

      was gibt dein DP im Ursprung aus?
      (true/false) geht nicht, musst den DP umwandeln in (1/0), dann in Influx speichern als "Number"
      als Beispiel
      539197ce-46aa-470d-8de3-39864beaef44-image.png
      3465f5d5-0811-4434-804f-0948d768c041-image.png

      umgestiegen von Proxmox auf Unraid

      SegwayS 1 Antwort Letzte Antwort
      0
      • crunchipC crunchip

        @Segway sagte in Grafana true/false anzeigen:

        Ebenso habe ich das value mapping gemacht

        was gibt dein DP im Ursprung aus?
        (true/false) geht nicht, musst den DP umwandeln in (1/0), dann in Influx speichern als "Number"
        als Beispiel
        539197ce-46aa-470d-8de3-39864beaef44-image.png
        3465f5d5-0811-4434-804f-0948d768c041-image.png

        SegwayS Offline
        SegwayS Offline
        Segway
        schrieb am zuletzt editiert von
        #4

        @crunchip
        Ne nicht wirklich jetzt oder ?
        Hier der Wert
        97fdbabc-963f-444b-b14a-1e45df5bb831-grafik.png

        Muss ich jetzt zB über ein Blockly diese Werte in 0 und 1 umwandeln ? Oder geht das auch eleganter ?

        Gruß Dirk
        Intel Proxmox Cluster (3x NUC) mit Debian & Proxmox / IoB als VM unter Debian / 60+ Adapter installiert

        crunchipC 1 Antwort Letzte Antwort
        0
        • SegwayS Segway

          @crunchip
          Ne nicht wirklich jetzt oder ?
          Hier der Wert
          97fdbabc-963f-444b-b14a-1e45df5bb831-grafik.png

          Muss ich jetzt zB über ein Blockly diese Werte in 0 und 1 umwandeln ? Oder geht das auch eleganter ?

          crunchipC Abwesend
          crunchipC Abwesend
          crunchip
          Forum Testing Most Active
          schrieb am zuletzt editiert von
          #5

          @Segway du kannst nen 2ten DP anlegen(blockly) oder einfach nen alias anlegen

          umgestiegen von Proxmox auf Unraid

          SegwayS 1 Antwort Letzte Antwort
          0
          • crunchipC crunchip

            @Segway du kannst nen 2ten DP anlegen(blockly) oder einfach nen alias anlegen

            SegwayS Offline
            SegwayS Offline
            Segway
            schrieb am zuletzt editiert von
            #6

            @crunchip sagte in Grafana true/false anzeigen:

            @Segway du kannst nen 2ten DP anlegen(blockly) oder einfach nen alias anlegen

            Jo Blockly kriege ich ja irgendwie hin.
            Was meinst du mit ALIAS anlegen ? Habe ich noch nie gemacht - hört sich irgendwie einfacherer an als 1000 Blocklys zu machen :-)

            Gruß Dirk
            Intel Proxmox Cluster (3x NUC) mit Debian & Proxmox / IoB als VM unter Debian / 60+ Adapter installiert

            da_WoodyD crunchipC 2 Antworten Letzte Antwort
            0
            • SegwayS Segway

              @crunchip sagte in Grafana true/false anzeigen:

              @Segway du kannst nen 2ten DP anlegen(blockly) oder einfach nen alias anlegen

              Jo Blockly kriege ich ja irgendwie hin.
              Was meinst du mit ALIAS anlegen ? Habe ich noch nie gemacht - hört sich irgendwie einfacherer an als 1000 Blocklys zu machen :-)

              da_WoodyD Online
              da_WoodyD Online
              da_Woody
              schrieb am zuletzt editiert von da_Woody
              #7

              @Segway Alias anlegen
              hat den vorteil, bei gerätewechsel nur die id ändern und alles fuzt wieder.

              gruß vom Woody
              HAPPINESS is not a DESTINATION, it's a WAY of LIFE!

              1 Antwort Letzte Antwort
              0
              • SegwayS Segway

                @crunchip sagte in Grafana true/false anzeigen:

                @Segway du kannst nen 2ten DP anlegen(blockly) oder einfach nen alias anlegen

                Jo Blockly kriege ich ja irgendwie hin.
                Was meinst du mit ALIAS anlegen ? Habe ich noch nie gemacht - hört sich irgendwie einfacherer an als 1000 Blocklys zu machen :-)

                crunchipC Abwesend
                crunchipC Abwesend
                crunchip
                Forum Testing Most Active
                schrieb am zuletzt editiert von crunchip
                #8

                @Segway Verwende ich eigentlich auch nicht, hab mittels Adapter "Geräte" einen Alias angelegt, für meinen Wasserverbrauch, beötige ich um die Kosten für Abwasser zu berechnen.
                Du kannst das aber auch manuell anlegen oder das Script verwenden, was hier im Forum zu finden ist, gibt mehrere Möglichkeiten
                hier als script musst nur deinen Datenpunkte angeben

                // Original-Datenpunkt
                const idOrigin = 'mqtt.0.switch.status'; 
                // Optional: Status-Datenpunkt, wenn Kommando und Status getrennt.
                // Bei Nicht-Verwendung Leerstring '' zuweisen
                const idRead = '';
                 
                // Alias-Datenpunkt
                const idAlias = 'Pool.Pumpe.Schalter';
                 
                var typeAlias, read, write, nameAlias, role, desc, min, max, unit, states, custom, raum, gewerk;
                 
                // Folgende kommentieren, wenn keine Änderung der Eigenschaft erforderlich
                nameAlias = 'Poolpumpe Ein';
                desc = 'per Script erstellt';
                // typeAlias = 'boolean'; // oder 'number'
                // read = "val < 0 ? -val : 0"; // Erkennung "Aus" --> false erfolgt automatisch  
                // write = "val ? String(1) : String(0)";
                // role = 'value';
                // min = 0; // nur Zahlen
                // max = 100; // nur Zahlen
                // unit = '%'; // nur für Zahlen
                // states = {0: 'Aus', 1: 'Auto', 2: 'Ein'}; // Zahlen (Multistate) oder Logikwert (z.B. Aus/Ein)
                // custom = []; // verhindert doppelte Ausführung von history, ...
                // raum = 'EG_Flur'; // Groß-/Kleinschreibung in der ID beachten !
                // gewerk = 'Licht'; // Groß-/Kleinschreibung in der ID beachten !
                 
                // Ab hier nichts ändern !!
                function createAlias(idDst, idSrc, idRd) {
                   if(existsState(idDst)) log(idDst + ' schon vorhanden !', 'warn');
                   else {
                      var obj = {};
                      obj.type = 'state';
                      obj.common = getObject(idSrc).common;
                      obj.common.alias = {};
                      if(idRd) {
                          obj.common.alias.id = {};
                          obj.common.alias.id.read = idRd;
                          obj.common.alias.id.write = idSrc;
                          obj.common.read = true;
                      } else obj.common.alias.id = idSrc;
                      if(typeAlias) obj.common.type = typeAlias;
                      if(obj.common.read !== false && read) obj.common.alias.read = read;
                      if(obj.common.write !== false && write) obj.common.alias.write = write;
                      if(nameAlias) obj.common.name = nameAlias;
                      if(role) obj.common.role = role;
                      if(desc) obj.common.desc = desc;
                      if(obj.common.type == 'number') {
                         if(min !== undefined) obj.common.min = min;
                         if(max !== undefined) obj.common.max = max;
                         if(unit) obj.common.unit = unit;
                      } else {
                         if(obj.common.min !== undefined) delete obj.common.min;
                         if(obj.common.max !== undefined) delete obj.common.max;
                         if(obj.common.unit) delete obj.common.unit;
                      }
                      if(states) obj.common.states = states;
                      if(custom && obj.common.custom) obj.common.custom = custom;
                      obj.native = {};
                      setObject(idDst, obj, function() {
                         if(idRd) setState(idRd, getState(idRd).val, true);
                         else setState(idSrc, getState(idSrc).val, true); 
                      });
                      if(raum && existsObject('enum.rooms.' + raum)) {
                         let obj = getObject('enum.rooms.' + raum)
                         obj.common.members.push(idDst);
                         setObject('enum.rooms.' + raum, obj);
                      }
                      if(gewerk && existsObject('enum.functions.' + gewerk)) {
                         let obj = getObject('enum.functions.' + gewerk)
                         obj.common.members.push(idDst);
                         setObject('enum.functions.' + gewerk, obj);
                      }
                   } 
                }
                 
                createAlias('alias.0.' + idAlias, idOrigin, idRead);
                
                

                umgestiegen von Proxmox auf Unraid

                SegwayS 2 Antworten Letzte Antwort
                0
                • crunchipC crunchip

                  @Segway Verwende ich eigentlich auch nicht, hab mittels Adapter "Geräte" einen Alias angelegt, für meinen Wasserverbrauch, beötige ich um die Kosten für Abwasser zu berechnen.
                  Du kannst das aber auch manuell anlegen oder das Script verwenden, was hier im Forum zu finden ist, gibt mehrere Möglichkeiten
                  hier als script musst nur deinen Datenpunkte angeben

                  // Original-Datenpunkt
                  const idOrigin = 'mqtt.0.switch.status'; 
                  // Optional: Status-Datenpunkt, wenn Kommando und Status getrennt.
                  // Bei Nicht-Verwendung Leerstring '' zuweisen
                  const idRead = '';
                   
                  // Alias-Datenpunkt
                  const idAlias = 'Pool.Pumpe.Schalter';
                   
                  var typeAlias, read, write, nameAlias, role, desc, min, max, unit, states, custom, raum, gewerk;
                   
                  // Folgende kommentieren, wenn keine Änderung der Eigenschaft erforderlich
                  nameAlias = 'Poolpumpe Ein';
                  desc = 'per Script erstellt';
                  // typeAlias = 'boolean'; // oder 'number'
                  // read = "val < 0 ? -val : 0"; // Erkennung "Aus" --> false erfolgt automatisch  
                  // write = "val ? String(1) : String(0)";
                  // role = 'value';
                  // min = 0; // nur Zahlen
                  // max = 100; // nur Zahlen
                  // unit = '%'; // nur für Zahlen
                  // states = {0: 'Aus', 1: 'Auto', 2: 'Ein'}; // Zahlen (Multistate) oder Logikwert (z.B. Aus/Ein)
                  // custom = []; // verhindert doppelte Ausführung von history, ...
                  // raum = 'EG_Flur'; // Groß-/Kleinschreibung in der ID beachten !
                  // gewerk = 'Licht'; // Groß-/Kleinschreibung in der ID beachten !
                   
                  // Ab hier nichts ändern !!
                  function createAlias(idDst, idSrc, idRd) {
                     if(existsState(idDst)) log(idDst + ' schon vorhanden !', 'warn');
                     else {
                        var obj = {};
                        obj.type = 'state';
                        obj.common = getObject(idSrc).common;
                        obj.common.alias = {};
                        if(idRd) {
                            obj.common.alias.id = {};
                            obj.common.alias.id.read = idRd;
                            obj.common.alias.id.write = idSrc;
                            obj.common.read = true;
                        } else obj.common.alias.id = idSrc;
                        if(typeAlias) obj.common.type = typeAlias;
                        if(obj.common.read !== false && read) obj.common.alias.read = read;
                        if(obj.common.write !== false && write) obj.common.alias.write = write;
                        if(nameAlias) obj.common.name = nameAlias;
                        if(role) obj.common.role = role;
                        if(desc) obj.common.desc = desc;
                        if(obj.common.type == 'number') {
                           if(min !== undefined) obj.common.min = min;
                           if(max !== undefined) obj.common.max = max;
                           if(unit) obj.common.unit = unit;
                        } else {
                           if(obj.common.min !== undefined) delete obj.common.min;
                           if(obj.common.max !== undefined) delete obj.common.max;
                           if(obj.common.unit) delete obj.common.unit;
                        }
                        if(states) obj.common.states = states;
                        if(custom && obj.common.custom) obj.common.custom = custom;
                        obj.native = {};
                        setObject(idDst, obj, function() {
                           if(idRd) setState(idRd, getState(idRd).val, true);
                           else setState(idSrc, getState(idSrc).val, true); 
                        });
                        if(raum && existsObject('enum.rooms.' + raum)) {
                           let obj = getObject('enum.rooms.' + raum)
                           obj.common.members.push(idDst);
                           setObject('enum.rooms.' + raum, obj);
                        }
                        if(gewerk && existsObject('enum.functions.' + gewerk)) {
                           let obj = getObject('enum.functions.' + gewerk)
                           obj.common.members.push(idDst);
                           setObject('enum.functions.' + gewerk, obj);
                        }
                     } 
                  }
                   
                  createAlias('alias.0.' + idAlias, idOrigin, idRead);
                  
                  
                  SegwayS Offline
                  SegwayS Offline
                  Segway
                  schrieb am zuletzt editiert von
                  #9

                  @crunchip

                  Ach so du meinst das alias.0 --> damit habe ich mich noch nicht beschäftigt. Kommt noch.

                  Dann ist es das Beste ich mach ein Blockly. Ich schau mal nach dem Skript hier im Forum - Danke schonmal !

                  Wusste echt nicht dass es NUR mit 0 und 1 klappt.

                  Gruß Dirk
                  Intel Proxmox Cluster (3x NUC) mit Debian & Proxmox / IoB als VM unter Debian / 60+ Adapter installiert

                  crunchipC 1 Antwort Letzte Antwort
                  0
                  • crunchipC crunchip

                    @Segway Verwende ich eigentlich auch nicht, hab mittels Adapter "Geräte" einen Alias angelegt, für meinen Wasserverbrauch, beötige ich um die Kosten für Abwasser zu berechnen.
                    Du kannst das aber auch manuell anlegen oder das Script verwenden, was hier im Forum zu finden ist, gibt mehrere Möglichkeiten
                    hier als script musst nur deinen Datenpunkte angeben

                    // Original-Datenpunkt
                    const idOrigin = 'mqtt.0.switch.status'; 
                    // Optional: Status-Datenpunkt, wenn Kommando und Status getrennt.
                    // Bei Nicht-Verwendung Leerstring '' zuweisen
                    const idRead = '';
                     
                    // Alias-Datenpunkt
                    const idAlias = 'Pool.Pumpe.Schalter';
                     
                    var typeAlias, read, write, nameAlias, role, desc, min, max, unit, states, custom, raum, gewerk;
                     
                    // Folgende kommentieren, wenn keine Änderung der Eigenschaft erforderlich
                    nameAlias = 'Poolpumpe Ein';
                    desc = 'per Script erstellt';
                    // typeAlias = 'boolean'; // oder 'number'
                    // read = "val < 0 ? -val : 0"; // Erkennung "Aus" --> false erfolgt automatisch  
                    // write = "val ? String(1) : String(0)";
                    // role = 'value';
                    // min = 0; // nur Zahlen
                    // max = 100; // nur Zahlen
                    // unit = '%'; // nur für Zahlen
                    // states = {0: 'Aus', 1: 'Auto', 2: 'Ein'}; // Zahlen (Multistate) oder Logikwert (z.B. Aus/Ein)
                    // custom = []; // verhindert doppelte Ausführung von history, ...
                    // raum = 'EG_Flur'; // Groß-/Kleinschreibung in der ID beachten !
                    // gewerk = 'Licht'; // Groß-/Kleinschreibung in der ID beachten !
                     
                    // Ab hier nichts ändern !!
                    function createAlias(idDst, idSrc, idRd) {
                       if(existsState(idDst)) log(idDst + ' schon vorhanden !', 'warn');
                       else {
                          var obj = {};
                          obj.type = 'state';
                          obj.common = getObject(idSrc).common;
                          obj.common.alias = {};
                          if(idRd) {
                              obj.common.alias.id = {};
                              obj.common.alias.id.read = idRd;
                              obj.common.alias.id.write = idSrc;
                              obj.common.read = true;
                          } else obj.common.alias.id = idSrc;
                          if(typeAlias) obj.common.type = typeAlias;
                          if(obj.common.read !== false && read) obj.common.alias.read = read;
                          if(obj.common.write !== false && write) obj.common.alias.write = write;
                          if(nameAlias) obj.common.name = nameAlias;
                          if(role) obj.common.role = role;
                          if(desc) obj.common.desc = desc;
                          if(obj.common.type == 'number') {
                             if(min !== undefined) obj.common.min = min;
                             if(max !== undefined) obj.common.max = max;
                             if(unit) obj.common.unit = unit;
                          } else {
                             if(obj.common.min !== undefined) delete obj.common.min;
                             if(obj.common.max !== undefined) delete obj.common.max;
                             if(obj.common.unit) delete obj.common.unit;
                          }
                          if(states) obj.common.states = states;
                          if(custom && obj.common.custom) obj.common.custom = custom;
                          obj.native = {};
                          setObject(idDst, obj, function() {
                             if(idRd) setState(idRd, getState(idRd).val, true);
                             else setState(idSrc, getState(idSrc).val, true); 
                          });
                          if(raum && existsObject('enum.rooms.' + raum)) {
                             let obj = getObject('enum.rooms.' + raum)
                             obj.common.members.push(idDst);
                             setObject('enum.rooms.' + raum, obj);
                          }
                          if(gewerk && existsObject('enum.functions.' + gewerk)) {
                             let obj = getObject('enum.functions.' + gewerk)
                             obj.common.members.push(idDst);
                             setObject('enum.functions.' + gewerk, obj);
                          }
                       } 
                    }
                     
                    createAlias('alias.0.' + idAlias, idOrigin, idRead);
                    
                    
                    SegwayS Offline
                    SegwayS Offline
                    Segway
                    schrieb am zuletzt editiert von
                    #10

                    @crunchip

                    Mh, das Skript erzeugt einen Fehler:

                    You are assigning a boolean to the state "linux-control.0.VM_Influx.info.is_online" which expects a string. Please fix your code to use a string or change the state type to boolean. This warnin

                    Gruß Dirk
                    Intel Proxmox Cluster (3x NUC) mit Debian & Proxmox / IoB als VM unter Debian / 60+ Adapter installiert

                    1 Antwort Letzte Antwort
                    0
                    • SegwayS Segway

                      @crunchip

                      Ach so du meinst das alias.0 --> damit habe ich mich noch nicht beschäftigt. Kommt noch.

                      Dann ist es das Beste ich mach ein Blockly. Ich schau mal nach dem Skript hier im Forum - Danke schonmal !

                      Wusste echt nicht dass es NUR mit 0 und 1 klappt.

                      crunchipC Abwesend
                      crunchipC Abwesend
                      crunchip
                      Forum Testing Most Active
                      schrieb am zuletzt editiert von
                      #11

                      @Segway wie gesagt, habt das selbst noch nicht gemacht, denke du musst das auskommentierte noch anpassen
                      type Alias 'number'
                      states = {false: '0', true: '1'}
                      wenn nicht, im Link von @da_Woody nachlesen/fragen

                      umgestiegen von Proxmox auf Unraid

                      C 1 Antwort Letzte Antwort
                      0
                      • crunchipC crunchip

                        @Segway wie gesagt, habt das selbst noch nicht gemacht, denke du musst das auskommentierte noch anpassen
                        type Alias 'number'
                        states = {false: '0', true: '1'}
                        wenn nicht, im Link von @da_Woody nachlesen/fragen

                        C Offline
                        C Offline
                        Chrisidonner
                        schrieb am zuletzt editiert von
                        #12

                        @crunchip
                        Verstehe ich es richtig ?
                        Man kann einen ganz normalen Schalter nicht aufzeigen ob an oder aus ? Bzw nur mit diesem Umweg den Schalter nicht auf True/false sondern 1/0 zu setzen ? Geht das nicht irgendwie in grafana ?

                        crunchipC 1 Antwort Letzte Antwort
                        0
                        • C Chrisidonner

                          @crunchip
                          Verstehe ich es richtig ?
                          Man kann einen ganz normalen Schalter nicht aufzeigen ob an oder aus ? Bzw nur mit diesem Umweg den Schalter nicht auf True/false sondern 1/0 zu setzen ? Geht das nicht irgendwie in grafana ?

                          crunchipC Abwesend
                          crunchipC Abwesend
                          crunchip
                          Forum Testing Most Active
                          schrieb am zuletzt editiert von
                          #13

                          @Chrisidonner sichtbar machen in Grafana ist schon möglich, ein true/false kannst dir schon anzeigen lassen, jedoch bei der Farbe spätestens scheitert es, denn wie willst du Thresholds einstellen, da wird eine Zahl erwartet.

                          umgestiegen von Proxmox auf Unraid

                          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

                          668

                          Online

                          32.5k

                          Benutzer

                          81.6k

                          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