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. Mit on() auf Sensoren in einem Gewerk triggern

NEWS

  • Jahresrückblick 2025 – unser neuer Blogbeitrag ist online! ✨
    BluefoxB
    Bluefox
    17
    1
    2.1k

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

  • Weihnachtsangebot 2025! 🎄
    BluefoxB
    Bluefox
    25
    1
    2.2k

Mit on() auf Sensoren in einem Gewerk triggern

Geplant Angeheftet Gesperrt Verschoben Skripten / Logik
17 Beiträge 5 Kommentatoren 2.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.
  • P Offline
    P Offline
    pix
    schrieb am zuletzt editiert von
    #2

    Hallo,

    mach es, wie im http://forum.iobroker.com/viewtopic.php?f=21&t=473.

    Alle STATE Datenpunkte im Gewerk Alarmanlage:

    var cacheSelectorState  = $('channel[state.id=*.STATE](functions="Alarmanlage")');
    
    cacheSelectorState.on(function(obj) {    // bei Zustandänderung *. STATE im Gewerk Alarmanlage
        // machWas(obj);
    })
    
    

    Gruß,

    Pix

    ioBroker auf Ubuntu in Proxmox (früher Mac mini (bis OS X 10.12.6 Sierra), VIS via iOS; angeschlossen: Homematic CCU2, Homepilot 1, ConBee II, einige Wemos, Sonos, Unifi CK+Protect, Homekit, Homebridge; KEIN blockly! Github-Profil

    1 Antwort Letzte Antwort
    0
    • paul53P Offline
      paul53P Offline
      paul53
      schrieb am zuletzt editiert von
      #3

      @rascal:

      ich habe Sensoren in einem Gewerk "Alarmanlage".

      ich weis, dass das Gewerk in enum.Names[0] steht. `
      Hast Du es mal versucht mit

      $('channel(Names=Alarmanlage)').on(function(dp) {
      	...
      });
      

      Bitte verzichtet auf Chat-Nachrichten, denn die Handhabung ist grauenhaft !
      Produktiv: RPi 2 mit S.USV, HM-MOD-RPI und SLC-USB-Stick mit root fs

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

        @rascal:

        Hallo,

        ich habe Sensoren in einem Gewerk "Alarmanlage".

        ich weis, dass das Gewerk in enum.Names[0] steht.

        Wie setzte ich das jetzt in dem on() Befehl um?

        on({id: /\.enumNames[0]$/, val: "Alarmanlage"}, ... 
        

        funktioniert nicht :(

        Ich würde mich über einen kleinen Schups in die richtige Richtung freuen, danke `
        Wenn es unbedingt RegEx sein muss, dann so:

        on({id: new RegExp("\\." + enumNames[0] + "$"), val: "Alarmanlage"}, ... 
        

        Ansonsten sollte mit selector $ schon gehen.

        1 Antwort Letzte Antwort
        0
        • R Offline
          R Offline
          rascal
          schrieb am zuletzt editiert von
          #5

          danke für die Antworten, ich brings aber nicht hin :(

          Ganzes Script - soll mal eine Alarmanlage werden, zum Testen habe ich aber einen Dimmer (Stehlampe) und eine Variable (…Alarmanlage_test) genommen:

          function alarm(dp)
          {
              var name = dp.enumNames[0];
              log("-----------------------TEST Alarmanlage, ausgelöster Sensor: "+ name, "info");
          
              //setState("sayit.1.tts.text"/*Text to speech*/, name);
              //log(JSON.stringify(dp), "info");
          }
          
          on({id: "javascript.1.Alarmanlage_test"/*Alarmanlage_test*/, change: "any"}, function(dp) {alarm(dp)});
          on({id: "hm-rpc.0.KEQ0904416.1.LEVEL"/*Licht_DBR_Stehlampe.LEVEL*/, val: 25}, function(dp) {alarm(dp)});
          $('channel(Names=Innenbeleuchtung)').on(function(dp) {alarm(dp)});
          on({id: new RegExp("\\." + enumNames[0] + "$"), val: "Innenbeleuchtung"}, function(dp) {alarm(dp)});
          

          bei:

          on({id: new RegExp("\\." + enumNames[0] + "$"), val: "Innenbeleuchtung"}, function(dp) {alarm(dp)});
          

          schreibt er mir:````
          14:58:39.849 [error] javascript.0 script.js.Surveillance.Test_Alarmanlage: ReferenceError: enumNames is not defined at script.js.Surveillance.Test_Alarmanlage:13:28

          
          bei:
          

          $('channel(Names=Innenbeleuchtung)').on(function(dp) {alarm(dp)});

          macht er gar nichts.
          
          bei:
          

          on({id: "hm-rpc.0.KEQ0904416.1.LEVEL"/Licht_DBR_Stehlampe.LEVEL/, val: 25}, function(dp) {alarm(dp)});

          gibt er mir "Innenbeleuchtung" im Log aus.
          1 Antwort Letzte Antwort
          0
          • BluefoxB Offline
            BluefoxB Offline
            Bluefox
            schrieb am zuletzt editiert von
            #6

            @rascal:

            danke für die Antworten, ich brings aber nicht hin :(

            Ganzes Script - soll mal eine Alarmanlage werden, zum Testen habe ich aber einen Dimmer (Stehlampe) und eine Variable (…Alarmanlage_test) genommen:

            function alarm(dp)
            {
                var name = dp.enumNames[0];
                log("-----------------------TEST Alarmanlage, ausgelöster Sensor: "+ name, "info");
                
                //setState("sayit.1.tts.text"/*Text to speech*/, name);
                //log(JSON.stringify(dp), "info");
            }
            
            on({id: "javascript.1.Alarmanlage_test"/*Alarmanlage_test*/, change: "any"}, function(dp) {alarm(dp)});
            on({id: "hm-rpc.0.KEQ0904416.1.LEVEL"/*Licht_DBR_Stehlampe.LEVEL*/, val: 25}, function(dp) {alarm(dp)});
            $('channel(Names=Innenbeleuchtung)').on(function(dp) {alarm(dp)});
            on({id: new RegExp("\\." + enumNames[0] + "$"), val: "Innenbeleuchtung"}, function(dp) {alarm(dp)});
            

            bei:

            on({id: new RegExp("\\." + enumNames[0] + "$"), val: "Innenbeleuchtung"}, function(dp) {alarm(dp)});
            

            schreibt er mir:````
            14:58:39.849 [error] javascript.0 script.js.Surveillance.Test_Alarmanlage: ReferenceError: enumNames is not defined at script.js.Surveillance.Test_Alarmanlage:13:28

            
            bei:
            

            $('channel(Names=Innenbeleuchtung)').on(function(dp) {alarm(dp)});

            macht er gar nichts.
            
            bei:
            

            on({id: "hm-rpc.0.KEQ0904416.1.LEVEL"/Licht_DBR_Stehlampe.LEVEL/, val: 25}, function(dp) {alarm(dp)});

            gibt er mir "Innenbeleuchtung" im Log aus. `  
            
            $('channel(functions=Innenbeleuchtung)[state.id=*.STATE]').on(function (event) {
                var _obj = getObject(event.id, 'functions');
                log(_obj.enumNames[0]);
            });
            
            1 Antwort Letzte Antwort
            0
            • R Offline
              R Offline
              rascal
              schrieb am zuletzt editiert von
              #7

              danke, mit dem kann ich arbeiten :D

              1 Antwort Letzte Antwort
              0
              • R Offline
                R Offline
                rascal
                schrieb am zuletzt editiert von
                #8

                Hey,

                noch eine Frage dazu:

                $('channel(functions=Innenbeleuchtung)[state.id=*.STATE]').on(function (event) {
                    var _obj = getObject(event.id, 'functions');
                    log(_obj.enumNames[0]);
                });
                

                kann man da auch 2 Gewerke abfragen? wie "Innenbeleuchtung" && " Aussenbeleuchtung"?

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

                  @rascal:

                  Hey,

                  noch eine Frage dazu:

                  $('channel(functions=Innenbeleuchtung)[state.id=*.STATE]').on(function (event) {
                      var _obj = getObject(event.id, 'functions');
                      log(_obj.enumNames[0]);
                  });
                  

                  kann man da auch 2 Gewerke abfragen? wie "Innenbeleuchtung" && " Aussenbeleuchtung"? `

                  $('channel(functions=Innenbeleuchtung)(functions=Aussenbeleuchtung)[state.id=*.STATE]').on(function (event) {
                      var _obj = getObject(event.id, 'functions');
                      log(_obj.enumNames[0]);
                  });
                  
                  1 Antwort Letzte Antwort
                  0
                  • R Offline
                    R Offline
                    rascal
                    schrieb am zuletzt editiert von
                    #10

                    du bist der Beste!

                    1 Antwort Letzte Antwort
                    0
                    • R Offline
                      R Offline
                      rascal
                      schrieb am zuletzt editiert von
                      #11

                      Hey again,

                      funktioniert soweit alles super, aber ich habe noch eine Frage :)

                      kann man dabei auch eine "change: gt" einbauen?

                      $('channel(functions=Innenbeleuchtung)(functions=Aussenbeleuchtung)[state.id=*.STATE]').on(function (event) {
                          var _obj = getObject(event.id, 'functions');
                          log(_obj.enumNames[0]);
                      });
                      
                      1 Antwort Letzte Antwort
                      0
                      • paul53P Offline
                        paul53P Offline
                        paul53
                        schrieb am zuletzt editiert von
                        #12

                        @rascal:

                        kann man dabei auch eine "change: gt" einbauen? `
                        Vielleicht so:

                        $('channel(functions=Innenbeleuchtung)(functions=Aussenbeleuchtung)[state.id=*.STATE]').on(function (event) {
                        	if(event.state.val > event.oldState.val) {
                        		var _obj = getObject(event.id, 'functions');
                        		log(_obj.enumNames[0]);
                        	}
                        });
                        

                        Bitte verzichtet auf Chat-Nachrichten, denn die Handhabung ist grauenhaft !
                        Produktiv: RPi 2 mit S.USV, HM-MOD-RPI und SLC-USB-Stick mit root fs

                        1 Antwort Letzte Antwort
                        0
                        • R Offline
                          R Offline
                          rascal
                          schrieb am zuletzt editiert von
                          #13

                          Hallo,

                          habe ein neues Problemchen mit meinem Skript.

                          Ich habe ein Schließerkontaktinterface. Auf dem hängen das Einfahrtstor und die Eingangstüre mittels Reedkontakt + ein optischer Regensensor.

                          Das Tor und die Türe habe ich in den Gewerken Alarmanlagensensor_aussen + Verschluß

                          Den Regensensor habe ich nur im Gewerk Wetter.

                          Nun triggere ich mit dem Script auf das Gewerk Alarmanlagensensor_aussen, was auch super funktioniert… allerdings triggert er dabei auch auf den Regensensor... warum? (ich habe es im Moment so abgefangen, dass er in die if-Schleife nur reingeht, wenn es nicht der Regensensor ist... was natürlich etwas unschön gelöst ist :(

                          Noch zu erwähnen wäre, dass in der Aufzählung im iobroker der Regensensor unter Alarmanlage_aussen gar nicht aufscheint, die beiden Anderen aber schon.

                          Script:

                          $('channel(functions=Alarmanlagensensor_aussen)[state.id=*.STATE]').on(function (event) {
                          
                              var _obj = getObject(event.id, 'functions');
                              log("---------------------------------------------------"+ event.channelName, "info");
                              //log(JSON.stringify(event), "info");
                          
                              var Alarmanlagenstatus = getState("hm-rega.0.2111"/*Sicherheitsstufe*/);
                              if((Alarmanlagenstatus.val > 0) && (event.channelName != "Regensensor zu/leer=trocken"))
                              {
                                  setState(sayit_vol, 100);
                                  setState(sayit_txt, "Der "+ event.channelName +" hat Bewegung festgestellt.");
                                  setState("telegram.0.communicate.response"/*Send text through telegram*/, "Der "+ event.channelName +" hat Bewegung festgestellt.");
                              }
                          

                          421_unbenannt.jpg
                          421_unbenannt2.jpg

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

                            @rascal:

                            Hallo,

                            habe ein neues Problemchen mit meinem Skript.

                            Ich habe ein Schließerkontaktinterface. Auf dem hängen das Einfahrtstor und die Eingangstüre mittels Reedkontakt + ein optischer Regensensor.

                            Das Tor und die Türe habe ich in den Gewerken Alarmanlagensensor_aussen + Verschluß

                            Den Regensensor habe ich nur im Gewerk Wetter.

                            Nun triggere ich mit dem Script auf das Gewerk Alarmanlagensensor_aussen, was auch super funktioniert… allerdings triggert er dabei auch auf den Regensensor... warum? (ich habe es im Moment so abgefangen, dass er in die if-Schleife nur reingeht, wenn es nicht der Regensensor ist... was natürlich etwas unschön gelöst ist :(

                            Noch zu erwähnen wäre, dass in der Aufzählung im iobroker der Regensensor unter Alarmanlage_aussen gar nicht aufscheint, die beiden Anderen aber schon.

                            Script:

                            $('channel(functions=Alarmanlagensensor_aussen)[state.id=*.STATE]').on(function (event) {
                            
                                var _obj = getObject(event.id, 'functions');
                                log("---------------------------------------------------"+ event.channelName, "info");
                                //log(JSON.stringify(event), "info");
                                
                                var Alarmanlagenstatus = getState("hm-rega.0.2111"/*Sicherheitsstufe*/);
                                if((Alarmanlagenstatus.val > 0) && (event.channelName != "Regensensor zu/leer=trocken"))
                                {
                                    setState(sayit_vol, 100);
                                    setState(sayit_txt, "Der "+ event.channelName +" hat Bewegung festgestellt.");
                                    setState("telegram.0.communicate.response"/*Send text through telegram*/, "Der "+ event.channelName +" hat Bewegung festgestellt.");
                                }
                            ```` `  
                            

                            Was kommt bei dir:

                            $('channel(functions=Alarmanlagensensor_aussen)[state.id=*.STATE]').each(function (id) {
                            	console.log(id);
                            });
                            
                            
                            1 Antwort Letzte Antwort
                            0
                            • BluefoxB Offline
                              BluefoxB Offline
                              Bluefox
                              schrieb am zuletzt editiert von
                              #15

                              @Bluefox:

                              @rascal:

                              Hallo,

                              habe ein neues Problemchen mit meinem Skript.

                              Ich habe ein Schließerkontaktinterface. Auf dem hängen das Einfahrtstor und die Eingangstüre mittels Reedkontakt + ein optischer Regensensor.

                              Das Tor und die Türe habe ich in den Gewerken Alarmanlagensensor_aussen + Verschluß

                              Den Regensensor habe ich nur im Gewerk Wetter.

                              Nun triggere ich mit dem Script auf das Gewerk Alarmanlagensensor_aussen, was auch super funktioniert… allerdings triggert er dabei auch auf den Regensensor... warum? (ich habe es im Moment so abgefangen, dass er in die if-Schleife nur reingeht, wenn es nicht der Regensensor ist... was natürlich etwas unschön gelöst ist :(

                              Noch zu erwähnen wäre, dass in der Aufzählung im iobroker der Regensensor unter Alarmanlage_aussen gar nicht aufscheint, die beiden Anderen aber schon.

                              Script:

                              $('channel(functions=Alarmanlagensensor_aussen)[state.id=*.STATE]').on(function (event) {
                              
                                  var _obj = getObject(event.id, 'functions');
                                  log("---------------------------------------------------"+ event.channelName, "info");
                                  //log(JSON.stringify(event), "info");
                                  
                                  var Alarmanlagenstatus = getState("hm-rega.0.2111"/*Sicherheitsstufe*/);
                                  if((Alarmanlagenstatus.val > 0) && (event.channelName != "Regensensor zu/leer=trocken"))
                                  {
                                      setState(sayit_vol, 100);
                                      setState(sayit_txt, "Der "+ event.channelName +" hat Bewegung festgestellt.");
                                      setState("telegram.0.communicate.response"/*Send text through telegram*/, "Der "+ event.channelName +" hat Bewegung festgestellt.");
                                  }
                              ```` `  
                              

                              Was kommt bei dir:

                              $('channel(functions=Alarmanlagensensor_aussen)[state.id=*.STATE]').each(function (id) {
                              	console.log(id);
                              });
                              
                              ```` `  
                              

                              Man muss darauf achten, dass 'channel(functions=Alarmanlagensensor_aussen)[state.id=*.STATE]

                              nur alle states mit Namen ".STATE" sucht. Um andere States, z.b. Bewegungsmelder aufzulisten, muss man die auch mitnehmen.

                              channel(functions=Alarmanlagensensor_aussen)[state.id=.STATE][state.id=.MOTION]

                              1 Antwort Letzte Antwort
                              0
                              • S Offline
                                S Offline
                                Solear
                                schrieb am zuletzt editiert von
                                #16

                                edit: Kommando zurück, ein Neustart der VM hat geholfen. Funktioniert jetzt.

                                @paul53:

                                @rascal:

                                kann man dabei auch eine "change: gt" einbauen? `
                                Vielleicht so:

                                $('channel(functions=Innenbeleuchtung)(functions=Aussenbeleuchtung)[state.id=*.STATE]').on(function (event) {
                                	if(event.state.val > event.oldState.val) {
                                		var _obj = getObject(event.id, 'functions');
                                		log(_obj.enumNames[0]);
                                	}
                                });
                                ```` `  
                                

                                Ich möchte meine "Alarmanlage" auch scripten.

                                Er soll alle Änderungen im Gewerk "Alarm" registrieren.

                                Das habe ich genauso so als Tetsskript erstmal zum vortasten, bevor ich es um Anwesenheitsprüfung ergänze:

                                $('channel(functions=Alarm)[state.id=*.STATE]').on(function (event) {
                                   if(event.state.val > event.oldState.val) {
                                      var _obj = getObject(event.id, 'functions');
                                      log(_obj.enumNames[0]);
                                      sendTo("pushover", {message: 'ALARM: Fenster wurden geöffnet', priority: 1});
                                   }
                                });
                                

                                Das functions ist ja gleichzusetzen mit den Gewerken aus der CCU2. Eigentlich sollte im Log irgendetwas erscheinen, wenn ich ein Fenster öffne. Das Testfenster (HM Fenstersensor) ist dem Gewerk "Alarm" zugeordnet und gibt einen STATE aus. In iobroker im Reiter "Aufzählungen" erscheint auch unter enum.functions der Punkt Alarm und der Fenstersensor ist dort angezeigt.

                                Das Log bleibt aber leer und ich bekomme keine Pushovernachricht (die Pushoverfunktion funktioniert definitiv).

                                Habe ich jetzt irgend etwas vergessen oder einen Denkfehler?

                                edit: Kommando zurück, ein Neustart der VM hat geholfen. Funktioniert jetzt.

                                iobroker als LXC unter Proxmox

                                1 Antwort Letzte Antwort
                                0
                                • S Offline
                                  S Offline
                                  Solear
                                  schrieb am zuletzt editiert von
                                  #17

                                  So,

                                  jetzt habe ich mir auch ein kleines Alarmscript (irgendeine Fensteröffnung = Pushovermeldung) gebastelt, welches die Besonderheit hat, dass es die beiden Kellerfenstersensoren nicht meldet, sofern diese beiden Fenster vom Entfeuchtungsscript automatisch geöffnet/geschlossen worden sind.

                                  Außerdem sendet es nur eine Meldung, wenn die Personenanzahl weniger als 1 ist (also niemand zuhause ist). Das habe ich über den Geofence Adapter gelöst.

                                  Es scheint so zu klappen alles, vielleicht nicht elegant, aber ich kann denn Code nachvollziehen.

                                  // Forum: http://forum.iobroker.net/viewtopic.php?f=21&t=2473
                                  // Horcht an allen Gewerken (functions) unter "Alarm" und sendet bei Statusänderung
                                  // Schließt die beiden Kellerfenster vom Alarm aus, sofern das Lüftungsscript die Öffnung/Schließung angestoßen hat:
                                  // wenn Jalousieaktorstatus (= Aktor für die Fenstermotoren) auf WORKING steht, dann werden die Kellerfenster ausgeschlossen!
                                  
                                  // IDs deklarieren
                                  var jemandzuhauseid = "geofency.0.atHomeCount"/*atHomeCount*/;
                                  var kellerscriptsiid = "hm-rpc.0.MEQ03xxxxx.1.WORKING"/*Fensteröffner Keller Sicherungsraum:1.WORKING*/;        // liest den Jalousieaktor aus, WORKING = in Arbeit
                                  var kellerscriptwaid = "hm-rpc.0.MEQ05xxxxx.1.WORKING"/*Fensteröffner Keller Waschraum:1.WORKING*/;
                                  
                                  $('channel(functions=Alarm)[state.id=*.STATE]').on(function (event) {                                           // An "Alarm"-Gewerke nach Statusänderungen prüfen 
                                  
                                      var _obj = getObject(event.id, 'functions');
                                      log("---------------------------------------------------"+ event.channelName, "info");
                                  
                                      var jemandzuhause = getState(jemandzuhauseid).val;                                                          // IDs auslesen 
                                      var kellerscriptsi = getState(kellerscriptsiid).val;
                                      var kellerscriptwa = getState(kellerscriptwaid).val;
                                  
                                      if((event.channelName !== 'Fenstersensor Keller Sicherungsraum' && kellerscriptsi !== true) ||              // Ausschluss Kellerfenster bei automatischer Öffnung/Schließung
                                          (event.channelName !== 'Fenstersensor Keller Waschraum' && kellerscriptwa !== true)) 
                                              {
                                                  if (jemandzuhause < 1)                                                                           // Prüft ob jemand Zuhause ist
                                                  {                                                                               
                                                      sendTo("pushover", {message: 'ALARM: ' + event.channelName + ' hat angeschlagen!', priority: 1});       // wenn nein, Alarmnachricht
                                                      //setState(sayit_vol, 100);
                                                      //setState(sayit_txt, "Der "+ event.channelName +" hat angeschlagen.");
                                                  }
                                              }
                                  }); 
                                  
                                  

                                  iobroker als LXC unter Proxmox

                                  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

                                  751

                                  Online

                                  32.6k

                                  Benutzer

                                  82.2k

                                  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