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. JavaScript
  5. Javascript Problem mit Event in Klasse

NEWS

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

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

  • Weihnachtsangebot 2025! 🎄
    BluefoxB
    Bluefox
    25
    1
    2.2k

Javascript Problem mit Event in Klasse

Geplant Angeheftet Gesperrt Verschoben JavaScript
javascript
4 Beiträge 3 Kommentatoren 115 Aufrufe 2 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.
  • E Offline
    E Offline
    Eppertshäuser
    schrieb am zuletzt editiert von Eppertshäuser
    #1

    Hallo liebe Community

    da ich als C# Entwickler leider noch nicht so die Erfahrung mit Javascript habe, stehe ich leider vor folgendem Problem:

    Bei uns im haus werden die Leuchten alle über den Conbee II gesteuert. Daher möchte ich in Javascript eine Klasse anlegen, welche für die Steuerung der Leuchtengruppen (z.B. Wohnzimmer, Esszimmer, usw..) zustandig ist. Als Methoden besitz diese Klasse z.B. .SwitchOn(), .SwitchOff(), DimmDown(), usw... Per String wird der Ordnername der Datenpunkte übergeben, sodass je nach Konfiguration in der jeweiligen Instanz die Datenpunkte der Leuchtengruppe gesteuert werden.
    So weit so gut. Sie wie hier als Besipiel:

    var wcLightControl = new AutomaticLightGroupControl('deconz.0.Groups.18');
    wcLightControl.AutoMode(false);
    wcLightControl.AutoOff(3000);
    on({id: 'deconz.0.Sensors.6.buttonevent.1.press', change: 'any'}, wcLightControl.SwitchOn );
    on({id: 'deconz.0.Sensors.6.buttonevent.4.press', change: 'any'}, wcLightControl.SwitchOff );
    

    Klappt soweit auch erst mal ganz gut.

    Wenn das Event des Tasters

    on({id: 'deconz.0.Sensors.6.buttonevent.1.press', change: 'any'}, wcLightControl.SwitchOn );
    

    kommt, wird die Methode

    // Switch on the lightgroup
    SwitchOn()
    {
        log("Switch lights ON");
    
        this.Test();
    }
    

    in der instanz Aufgerufen. Das klappt auch noch.
    Wenn nun aber die Methode "this.Test" aufgerufen wird, erscheint folgende Fehlermeldung

    Logeintrag.png

    mit dem Hinweis, die Methode Test ist keine Funktion.
    In this.Test steht aktuell nur:

    Test()
        {
            log("Test aufgerufen!");
        }
    

    Jemand eine Idee? :confused:

    Viele Grüße!

    mickymM AlCalzoneA 2 Antworten Letzte Antwort
    0
    • E Eppertshäuser

      Hallo liebe Community

      da ich als C# Entwickler leider noch nicht so die Erfahrung mit Javascript habe, stehe ich leider vor folgendem Problem:

      Bei uns im haus werden die Leuchten alle über den Conbee II gesteuert. Daher möchte ich in Javascript eine Klasse anlegen, welche für die Steuerung der Leuchtengruppen (z.B. Wohnzimmer, Esszimmer, usw..) zustandig ist. Als Methoden besitz diese Klasse z.B. .SwitchOn(), .SwitchOff(), DimmDown(), usw... Per String wird der Ordnername der Datenpunkte übergeben, sodass je nach Konfiguration in der jeweiligen Instanz die Datenpunkte der Leuchtengruppe gesteuert werden.
      So weit so gut. Sie wie hier als Besipiel:

      var wcLightControl = new AutomaticLightGroupControl('deconz.0.Groups.18');
      wcLightControl.AutoMode(false);
      wcLightControl.AutoOff(3000);
      on({id: 'deconz.0.Sensors.6.buttonevent.1.press', change: 'any'}, wcLightControl.SwitchOn );
      on({id: 'deconz.0.Sensors.6.buttonevent.4.press', change: 'any'}, wcLightControl.SwitchOff );
      

      Klappt soweit auch erst mal ganz gut.

      Wenn das Event des Tasters

      on({id: 'deconz.0.Sensors.6.buttonevent.1.press', change: 'any'}, wcLightControl.SwitchOn );
      

      kommt, wird die Methode

      // Switch on the lightgroup
      SwitchOn()
      {
          log("Switch lights ON");
      
          this.Test();
      }
      

      in der instanz Aufgerufen. Das klappt auch noch.
      Wenn nun aber die Methode "this.Test" aufgerufen wird, erscheint folgende Fehlermeldung

      Logeintrag.png

      mit dem Hinweis, die Methode Test ist keine Funktion.
      In this.Test steht aktuell nur:

      Test()
          {
              log("Test aufgerufen!");
          }
      

      Jemand eine Idee? :confused:

      Viele Grüße!

      mickymM Online
      mickymM Online
      mickym
      Most Active
      schrieb am zuletzt editiert von
      #2

      @eppertshäuser Ich denke, dass Du mit dieser on (on(pattern, callbackOrId, value) ) ja kein Objekt übergibst, auch wenn die Funktion in der Instanz Deines Objektes sich befindet, auf das Du mit this referenzierst, sondern diese Callback Funktion wird ja von dem Eventhandler on(... aufgerufen. Dem Eventhandler ist es aber egal, ob er eine Callbackfunktion innerhalb eines Objektes oder eine globale Funktion aufruft - er übergibt dieser Funktion das entsprechende iobroker-Objekt und kein JS-Objekt.

      Aber ggf. kann Dir @paul53 Dir das besser erläutern. So ist jedenfalls nach meinem Verständnis.

      Jeder Flow bzw. jedes Script, das ich hier poste implementiert jeder auf eigene Gefahr. Flows und Scripts können Fehler aufweisen und weder der Seitenbetreiber noch ich persönlich können hierfür haftbar gemacht werden. Das gleiche gilt für Empfehlungen aller Art.

      1 Antwort Letzte Antwort
      0
      • E Eppertshäuser

        Hallo liebe Community

        da ich als C# Entwickler leider noch nicht so die Erfahrung mit Javascript habe, stehe ich leider vor folgendem Problem:

        Bei uns im haus werden die Leuchten alle über den Conbee II gesteuert. Daher möchte ich in Javascript eine Klasse anlegen, welche für die Steuerung der Leuchtengruppen (z.B. Wohnzimmer, Esszimmer, usw..) zustandig ist. Als Methoden besitz diese Klasse z.B. .SwitchOn(), .SwitchOff(), DimmDown(), usw... Per String wird der Ordnername der Datenpunkte übergeben, sodass je nach Konfiguration in der jeweiligen Instanz die Datenpunkte der Leuchtengruppe gesteuert werden.
        So weit so gut. Sie wie hier als Besipiel:

        var wcLightControl = new AutomaticLightGroupControl('deconz.0.Groups.18');
        wcLightControl.AutoMode(false);
        wcLightControl.AutoOff(3000);
        on({id: 'deconz.0.Sensors.6.buttonevent.1.press', change: 'any'}, wcLightControl.SwitchOn );
        on({id: 'deconz.0.Sensors.6.buttonevent.4.press', change: 'any'}, wcLightControl.SwitchOff );
        

        Klappt soweit auch erst mal ganz gut.

        Wenn das Event des Tasters

        on({id: 'deconz.0.Sensors.6.buttonevent.1.press', change: 'any'}, wcLightControl.SwitchOn );
        

        kommt, wird die Methode

        // Switch on the lightgroup
        SwitchOn()
        {
            log("Switch lights ON");
        
            this.Test();
        }
        

        in der instanz Aufgerufen. Das klappt auch noch.
        Wenn nun aber die Methode "this.Test" aufgerufen wird, erscheint folgende Fehlermeldung

        Logeintrag.png

        mit dem Hinweis, die Methode Test ist keine Funktion.
        In this.Test steht aktuell nur:

        Test()
            {
                log("Test aufgerufen!");
            }
        

        Jemand eine Idee? :confused:

        Viele Grüße!

        AlCalzoneA Offline
        AlCalzoneA Offline
        AlCalzone
        Developer
        schrieb am zuletzt editiert von AlCalzone
        #3

        @eppertshäuser Am besten liest du dir das mal durch:
        https://developer.mozilla.org/de/docs/Web/JavaScript/Reference/Operators/this
        bzw.
        https://developer.mozilla.org/de/docs/Web/JavaScript/Reference/Functions/Arrow_functions

        Die Übergabe der Instanzfunktion hier:

        on({id: 'deconz.0.Sensors.6.buttonevent.1.press', change: 'any'}, wcLightControl.SwitchOn );
        

        sorgt dafür, dass die Funktion außerhalb des Kontext der Instanz aufgerufen wird. this verweist dann nicht auf die Klasseninstanz. Entweder musst du die Funktion vorm Übergeben an die Instanz binden:

        on({id: 'deconz.0.Sensors.6.buttonevent.1.press', change: 'any'}, wcLightControl.SwitchOn.bind(wcLightControl) );
        

        oder Pfeilfunktionen nutzen, um dieses Verhalten zu vermeiden:

        on({id: 'deconz.0.Sensors.6.buttonevent.1.press', change: 'any'}, (...args) => wcLightControl.SwitchOn(...args) );
        

        Statt ...args kannst du die Parameter auch explizit auflisten.

        Warum `sudo` böse ist: https://forum.iobroker.net/post/17109

        E 1 Antwort Letzte Antwort
        0
        • AlCalzoneA AlCalzone

          @eppertshäuser Am besten liest du dir das mal durch:
          https://developer.mozilla.org/de/docs/Web/JavaScript/Reference/Operators/this
          bzw.
          https://developer.mozilla.org/de/docs/Web/JavaScript/Reference/Functions/Arrow_functions

          Die Übergabe der Instanzfunktion hier:

          on({id: 'deconz.0.Sensors.6.buttonevent.1.press', change: 'any'}, wcLightControl.SwitchOn );
          

          sorgt dafür, dass die Funktion außerhalb des Kontext der Instanz aufgerufen wird. this verweist dann nicht auf die Klasseninstanz. Entweder musst du die Funktion vorm Übergeben an die Instanz binden:

          on({id: 'deconz.0.Sensors.6.buttonevent.1.press', change: 'any'}, wcLightControl.SwitchOn.bind(wcLightControl) );
          

          oder Pfeilfunktionen nutzen, um dieses Verhalten zu vermeiden:

          on({id: 'deconz.0.Sensors.6.buttonevent.1.press', change: 'any'}, (...args) => wcLightControl.SwitchOn(...args) );
          

          Statt ...args kannst du die Parameter auch explizit auflisten.

          E Offline
          E Offline
          Eppertshäuser
          schrieb am zuletzt editiert von
          #4

          @alcalzone Danke für den Tip. Damit klappt es nun! :+1: :blush:

          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

          449

          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