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

  • Standard: (Kein Skin)
  • Kein Skin
Einklappen
ioBroker Logo
  1. ioBroker Community Home
  2. Deutsch
  3. Skripten / Logik
  4. [gelöst] Skript Funktion wiederverwendbar machen

NEWS

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

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

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

[gelöst] Skript Funktion wiederverwendbar machen

Geplant Angeheftet Gesperrt Verschoben Skripten / Logik
14 Beiträge 5 Kommentatoren 962 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.
  • I Offline
    I Offline
    init5
    schrieb am zuletzt editiert von init5
    #1

    Guten Abend, ich wende mich mal wieder mit einer Problemstellung an euch.

    Ausgangssituation:
    Da ich gerne mal vergesse ein beim morgentlichen Lüften die Fenster auch wieder zu schließen (was bei Minusgraden eher schlecht ist) habe ich ein Skript geschrieben, dass mich nach 15 Minuten daran erinnert. Nun habe ich mein Zigbee-Netz ausgebaut und alle Fenster mit Kontakten versehen.

    Problem 1:
    Ich würde gern das eine funktionierende Skript auf alle Fenster anwenden. Allerdings habe ich keine Ahnung wie. Die Idee wäre es, mehrere Trigger zu verwenden, oder den Teil innerhalb des Triggers in eine Funktion auszulagern. Aber meine bisherigen Tests waren erfolglos, da sich die Trigger gegenseitig gestört haben.

    Problem 2:
    Wenn das denn funktionieren würde, wäre das folgende Problem die Benachrichtigung. Bisher ist das betroffene Fenster ja fest hinterlegt. Ich müsste im Skript irgend wie auf den Trigger kommen. Dieser Datenpunkt heißt leider bei jedem Kontakt "opened". Ich müsste irgendwie auf den Name des Übergeordneten Datenpunkts kommen.

    Ich scheitere leider bisher daran. Ich hoffe für euch ist das ein Klacks. Vielen Dank schonmal für eure Zeit.

    ntfc_Window.png

    paul53P 1 Antwort Letzte Antwort
    0
    • I init5

      Guten Abend, ich wende mich mal wieder mit einer Problemstellung an euch.

      Ausgangssituation:
      Da ich gerne mal vergesse ein beim morgentlichen Lüften die Fenster auch wieder zu schließen (was bei Minusgraden eher schlecht ist) habe ich ein Skript geschrieben, dass mich nach 15 Minuten daran erinnert. Nun habe ich mein Zigbee-Netz ausgebaut und alle Fenster mit Kontakten versehen.

      Problem 1:
      Ich würde gern das eine funktionierende Skript auf alle Fenster anwenden. Allerdings habe ich keine Ahnung wie. Die Idee wäre es, mehrere Trigger zu verwenden, oder den Teil innerhalb des Triggers in eine Funktion auszulagern. Aber meine bisherigen Tests waren erfolglos, da sich die Trigger gegenseitig gestört haben.

      Problem 2:
      Wenn das denn funktionieren würde, wäre das folgende Problem die Benachrichtigung. Bisher ist das betroffene Fenster ja fest hinterlegt. Ich müsste im Skript irgend wie auf den Trigger kommen. Dieser Datenpunkt heißt leider bei jedem Kontakt "opened". Ich müsste irgendwie auf den Name des Übergeordneten Datenpunkts kommen.

      Ich scheitere leider bisher daran. Ich hoffe für euch ist das ein Klacks. Vielen Dank schonmal für eure Zeit.

      ntfc_Window.png

      paul53P Offline
      paul53P Offline
      paul53
      schrieb am zuletzt editiert von paul53
      #2

      @init5 sagte: mich nach 15 Minuten daran erinnert.

      Das Problem ist weniger eine gemeinsame Funktion, als vielmehr, dass für jedes Fenster ein zugehöriger Timer benötigt wird, der die Erinnerung 15 Minuten nach Öffnen sendet.

      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

      I 1 Antwort Letzte Antwort
      1
      • paul53P paul53

        @init5 sagte: mich nach 15 Minuten daran erinnert.

        Das Problem ist weniger eine gemeinsame Funktion, als vielmehr, dass für jedes Fenster ein zugehöriger Timer benötigt wird, der die Erinnerung 15 Minuten nach Öffnen sendet.

        I Offline
        I Offline
        init5
        schrieb am zuletzt editiert von
        #3

        @paul53 Ich habe selbst keinen wirklichen Plan, wie das funktionieren kann, aber es erscheint mit nicht richtig, für jedes Fenster ein eigenes Skript zu bauen, wenn doch die Logik dahinter immer die gleiche ist.

        htreckslerH paul53P 2 Antworten Letzte Antwort
        0
        • I init5

          @paul53 Ich habe selbst keinen wirklichen Plan, wie das funktionieren kann, aber es erscheint mit nicht richtig, für jedes Fenster ein eigenes Skript zu bauen, wenn doch die Logik dahinter immer die gleiche ist.

          htreckslerH Offline
          htreckslerH Offline
          htrecksler
          Forum Testing
          schrieb am zuletzt editiert von
          #4

          @init5 Du kannst das Ganze sicher in ein Script packen und das macht wahrscheinlich auch Sinn, aber innerhalb des Scriptes benötigst du in jedem Fall pro Fenster einen Timer.
          Der Timer ist zu sehen wie eine Stoppuhr. Wird ein Fenster geöffnet, wird die Stoppuhr gedrückt. Wenn dann das 2. Fenster geöffnet wird brauchst du eine weitere Stoppuhr(Timer)

          Gruss Hermann

          ioBroker auf Proxmox (Debian) auf IntelNuc als Produktivsystem

          GarganoG 1 Antwort Letzte Antwort
          1
          • htreckslerH htrecksler

            @init5 Du kannst das Ganze sicher in ein Script packen und das macht wahrscheinlich auch Sinn, aber innerhalb des Scriptes benötigst du in jedem Fall pro Fenster einen Timer.
            Der Timer ist zu sehen wie eine Stoppuhr. Wird ein Fenster geöffnet, wird die Stoppuhr gedrückt. Wenn dann das 2. Fenster geöffnet wird brauchst du eine weitere Stoppuhr(Timer)

            GarganoG Offline
            GarganoG Offline
            Gargano
            schrieb am zuletzt editiert von
            #5

            @htrecksler So ein Script findest Du von Pittini
            hier

            htreckslerH 1 Antwort Letzte Antwort
            1
            • GarganoG Gargano

              @htrecksler So ein Script findest Du von Pittini
              hier

              htreckslerH Offline
              htreckslerH Offline
              htrecksler
              Forum Testing
              schrieb am zuletzt editiert von
              #6

              @gargano ich such das gar nicht, aber @init5

              Gruss Hermann

              ioBroker auf Proxmox (Debian) auf IntelNuc als Produktivsystem

              1 Antwort Letzte Antwort
              1
              • I init5

                @paul53 Ich habe selbst keinen wirklichen Plan, wie das funktionieren kann, aber es erscheint mit nicht richtig, für jedes Fenster ein eigenes Skript zu bauen, wenn doch die Logik dahinter immer die gleiche ist.

                paul53P Offline
                paul53P Offline
                paul53
                schrieb am zuletzt editiert von
                #7

                @init5 sagte: nicht richtig, für jedes Fenster ein eigenes Skript zu bauen,

                Das ist nicht nötig, denn man kann alle Trigger in ein Skript packen. Beispiel für zwei Fenster:

                Bild_2021-02-27_095325.png

                @init5 sagte in Skript Funktion wiederverwendbar machen:

                Ich müsste irgendwie auf den Name des Übergeordneten Datenpunkts kommen.

                Dafür benötigt man eine Javascript-Funktion. Inhalt der Funktion sendParentName(id):

                id = id.substring(0, id.lastIndexOf('.'));
                if(existsObject(id)) sendTo("telegram", "send", {text: getObject(id).common.name + ' schließen'});
                

                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

                I 2 Antworten Letzte Antwort
                1
                • paul53P paul53

                  @init5 sagte: nicht richtig, für jedes Fenster ein eigenes Skript zu bauen,

                  Das ist nicht nötig, denn man kann alle Trigger in ein Skript packen. Beispiel für zwei Fenster:

                  Bild_2021-02-27_095325.png

                  @init5 sagte in Skript Funktion wiederverwendbar machen:

                  Ich müsste irgendwie auf den Name des Übergeordneten Datenpunkts kommen.

                  Dafür benötigt man eine Javascript-Funktion. Inhalt der Funktion sendParentName(id):

                  id = id.substring(0, id.lastIndexOf('.'));
                  if(existsObject(id)) sendTo("telegram", "send", {text: getObject(id).common.name + ' schließen'});
                  
                  I Offline
                  I Offline
                  init5
                  schrieb am zuletzt editiert von
                  #8

                  Super, vielen Dank für die Lösungsansätze! Ich werde mich in der kommenden Nacht mal daran versuchen.

                  1 Antwort Letzte Antwort
                  0
                  • paul53P paul53

                    @init5 sagte: nicht richtig, für jedes Fenster ein eigenes Skript zu bauen,

                    Das ist nicht nötig, denn man kann alle Trigger in ein Skript packen. Beispiel für zwei Fenster:

                    Bild_2021-02-27_095325.png

                    @init5 sagte in Skript Funktion wiederverwendbar machen:

                    Ich müsste irgendwie auf den Name des Übergeordneten Datenpunkts kommen.

                    Dafür benötigt man eine Javascript-Funktion. Inhalt der Funktion sendParentName(id):

                    id = id.substring(0, id.lastIndexOf('.'));
                    if(existsObject(id)) sendTo("telegram", "send", {text: getObject(id).common.name + ' schließen'});
                    
                    I Offline
                    I Offline
                    init5
                    schrieb am zuletzt editiert von init5
                    #9

                    @paul53 Hallo, ich habe die Funktion getestet und sie funktioniert super! Nun würde ich den wiederverwendbaren Teil aber gern noch vergrößern. Und zwar wäre es toll, wenn die ganze Schleife um die Benachrichtigung in eine Funktion ausgelagert werden könnte. Wenn ich die Aussagen von dir und @htrecksler richtig verstehe, dann scheitert es daran, dass die Schleife ja immer den selben Namen hat. D.h. bei mehreren Fenstern wird das verhalten der Schleifen gestört. Kann man denn den Namen der Schleifen dynamisch zuordnen? Sinnvoll wäre auch hier zum Beispiel der Name der übergeordneten ID. Oder müssen diese immer zu Beginn des Skripts definiert werden?

                    paul53P 1 Antwort Letzte Antwort
                    0
                    • I init5

                      @paul53 Hallo, ich habe die Funktion getestet und sie funktioniert super! Nun würde ich den wiederverwendbaren Teil aber gern noch vergrößern. Und zwar wäre es toll, wenn die ganze Schleife um die Benachrichtigung in eine Funktion ausgelagert werden könnte. Wenn ich die Aussagen von dir und @htrecksler richtig verstehe, dann scheitert es daran, dass die Schleife ja immer den selben Namen hat. D.h. bei mehreren Fenstern wird das verhalten der Schleifen gestört. Kann man denn den Namen der Schleifen dynamisch zuordnen? Sinnvoll wäre auch hier zum Beispiel der Name der übergeordneten ID. Oder müssen diese immer zu Beginn des Skripts definiert werden?

                      paul53P Offline
                      paul53P Offline
                      paul53
                      schrieb am zuletzt editiert von
                      #10

                      @init5 sagte: wenn die ganze Schleife um die Benachrichtigung in eine Funktion ausgelagert werden könnte.

                      Das ist eine Funktion.

                      @init5 sagte in Skript Funktion wiederverwendbar machen:

                      D.h. bei mehreren Fenstern wird das verhalten der Schleifen gestört.

                      Wenn jedes Fenster den eigenen Timer erhält, wird nichts gestört.

                      @init5 sagte in Skript Funktion wiederverwendbar machen:

                      Kann man denn den Namen der Schleifen dynamisch zuordnen? Sinnvoll wäre auch hier zum Beispiel der Name der übergeordneten ID. Oder müssen diese immer zu Beginn des Skripts definiert werden?

                      Ich verstehe nur Bahnhof.

                      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

                      I 1 Antwort Letzte Antwort
                      1
                      • paul53P paul53

                        @init5 sagte: wenn die ganze Schleife um die Benachrichtigung in eine Funktion ausgelagert werden könnte.

                        Das ist eine Funktion.

                        @init5 sagte in Skript Funktion wiederverwendbar machen:

                        D.h. bei mehreren Fenstern wird das verhalten der Schleifen gestört.

                        Wenn jedes Fenster den eigenen Timer erhält, wird nichts gestört.

                        @init5 sagte in Skript Funktion wiederverwendbar machen:

                        Kann man denn den Namen der Schleifen dynamisch zuordnen? Sinnvoll wäre auch hier zum Beispiel der Name der übergeordneten ID. Oder müssen diese immer zu Beginn des Skripts definiert werden?

                        Ich verstehe nur Bahnhof.

                        I Offline
                        I Offline
                        init5
                        schrieb am zuletzt editiert von
                        #11

                        @paul53 Sorry, ich habe mich falsch ausgedrückt. Statt Schleife meinte ich den Timeout. In deinem Beispiel hast du einen Trigger inkl. Timeout pro Fensterkontakt. Das funktioniert wie gesagt auch super.
                        Nun war die Idee, ob man das theoretisch noch weiter verkleinern könnte, und zwar mit nur einem Trigger auf mehrere Objekt IDs. Dann die Objekt ID des Kontakts, der den Trigger ausgelöst hat an eine ausgelagerte Funktion übergeben.
                        Diese Funktion ermittelt dann, wie in deinem Beispiel den Name der Parent-ID, benennt den Timeout danach und führt ihn aus (mitsamt der Benachrichtigung)

                        Wäre sowas möglich, oder können Variablen (in dem Fall der Timeout) keine dynamischen Namen bekommen, die erst zur Laufzeit des Skripts generiert werden?

                        paul53P 1 Antwort Letzte Antwort
                        0
                        • I init5

                          @paul53 Sorry, ich habe mich falsch ausgedrückt. Statt Schleife meinte ich den Timeout. In deinem Beispiel hast du einen Trigger inkl. Timeout pro Fensterkontakt. Das funktioniert wie gesagt auch super.
                          Nun war die Idee, ob man das theoretisch noch weiter verkleinern könnte, und zwar mit nur einem Trigger auf mehrere Objekt IDs. Dann die Objekt ID des Kontakts, der den Trigger ausgelöst hat an eine ausgelagerte Funktion übergeben.
                          Diese Funktion ermittelt dann, wie in deinem Beispiel den Name der Parent-ID, benennt den Timeout danach und führt ihn aus (mitsamt der Benachrichtigung)

                          Wäre sowas möglich, oder können Variablen (in dem Fall der Timeout) keine dynamischen Namen bekommen, die erst zur Laufzeit des Skripts generiert werden?

                          paul53P Offline
                          paul53P Offline
                          paul53
                          schrieb am zuletzt editiert von paul53
                          #12

                          @init5 sagte: können Variablen (in dem Fall der Timeout) keine dynamischen Namen bekommen, die erst zur Laufzeit des Skripts generiert werden?

                          Nein, das können sie nicht. Man könnte zwar mit einem "Array of timer" arbeiten, aber das würde das Blockly sehr kompliziert machen.

                          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

                          I 1 Antwort Letzte Antwort
                          1
                          • paul53P paul53

                            @init5 sagte: können Variablen (in dem Fall der Timeout) keine dynamischen Namen bekommen, die erst zur Laufzeit des Skripts generiert werden?

                            Nein, das können sie nicht. Man könnte zwar mit einem "Array of timer" arbeiten, aber das würde das Blockly sehr kompliziert machen.

                            I Offline
                            I Offline
                            init5
                            schrieb am zuletzt editiert von init5
                            #13

                            Ich habe es hinbekommen. Für den Fall, dass es mal irgendwann nochmal jemanden interessiert, hier noch das Ergebnis.
                            Man kann den Namen der timeouts nicht dynamisch benennen, aber das muss man nicht gar nicht. Entweder war ich bisher blind, oder die Pause-Funktion ist neu dazu gekommen. Ich habe es jetzt so gelöst:

                            1. Ein Trigger auf mehrere Fensterkontakte
                            2. Innerhalb des Triggers eine Abfrage, ob das Fenster gerade geöffnet wurde
                            3. Falls ja, Start der ausgelagerten Funktion "Benachrichtigung" mit Übergabe des aktuellen Triggers ("Fenster")
                              3.1 Pause für 10 Minuten
                              3.2 Prüfung ob Fenster noch immer offen ist
                              3.3 Falls ja, ermitteln des "friendly name" der übergeordneten Object ID und Benachrichtigung

                            @paul53 dein Script habe ich minimal geändert und die Benachrichtigung entfernt, sodass jetzt es jetzt ausschließlich für die Namensfindung dient.

                            id = id.substring(0, id.lastIndexOf('.'));
                            x = getObject(id).common.name;
                            return x;
                            

                            3811cdeb-1462-46fb-aa58-099ff0f6eab7-image.png

                            Danke nochmals für eure Hilfe und Ideen!

                            PackElendP 1 Antwort Letzte Antwort
                            0
                            • I init5

                              Ich habe es hinbekommen. Für den Fall, dass es mal irgendwann nochmal jemanden interessiert, hier noch das Ergebnis.
                              Man kann den Namen der timeouts nicht dynamisch benennen, aber das muss man nicht gar nicht. Entweder war ich bisher blind, oder die Pause-Funktion ist neu dazu gekommen. Ich habe es jetzt so gelöst:

                              1. Ein Trigger auf mehrere Fensterkontakte
                              2. Innerhalb des Triggers eine Abfrage, ob das Fenster gerade geöffnet wurde
                              3. Falls ja, Start der ausgelagerten Funktion "Benachrichtigung" mit Übergabe des aktuellen Triggers ("Fenster")
                                3.1 Pause für 10 Minuten
                                3.2 Prüfung ob Fenster noch immer offen ist
                                3.3 Falls ja, ermitteln des "friendly name" der übergeordneten Object ID und Benachrichtigung

                              @paul53 dein Script habe ich minimal geändert und die Benachrichtigung entfernt, sodass jetzt es jetzt ausschließlich für die Namensfindung dient.

                              id = id.substring(0, id.lastIndexOf('.'));
                              x = getObject(id).common.name;
                              return x;
                              

                              3811cdeb-1462-46fb-aa58-099ff0f6eab7-image.png

                              Danke nochmals für eure Hilfe und Ideen!

                              PackElendP Offline
                              PackElendP Offline
                              PackElend
                              schrieb am zuletzt editiert von
                              #14

                              @init5 ich stehe vor einer ähnlichen Herausforderung.
                              Ich habe 9 Jalousien zum ansteuern, das Skript ist immer das gleiche.

                              Wenn ich es richtig verstehe, können Skripte nicht instanziert werden, sprich wenn der Timer läuft aber das Skript von einem anderen Trigger (bei dir Fenster auf), startet der Timer von neuem?

                              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

                              665

                              Online

                              32.4k

                              Benutzer

                              81.4k

                              Themen

                              1.3m

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

                              • Du hast noch kein Konto? Registrieren

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