Ankündigung

Einklappen
Keine Ankündigung bisher.

Anbindung an KNX mit eibPort

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

    Anbindung an KNX mit eibPort

    Guten Morgen,

    ich begehe grade meine ersten Schritte mit obenHab2. Mein Ziel ist es, Amazons Echo und Dot mit Hilfe von openHab an den KNX Bus zu bringen.
    Schritt ist dafür ist, dass ich in der Lage bin mit obenHab Telegramme auf den Bus zu senden. Genau dort scheitere ich grade.

    OpenHab2 habe ich auf einem Windows Rechner installiert. Läuft. Dann habe ich das KNX-Binding installiert.
    Als nächstes habe ich folgende Dateien manuell angelegt:
    knx.items unter conf\items:
    Switch test "test" { knx="1/1/30" }

    knx.sitemap unter conf\sitemaps:
    sitemap knx label="KNX"
    {
    Switch item=test
    }

    Die Datei knx.cfg habe ich unter conf\Services bearbeitet:
    ip=192.168.178.200
    ignorelocalevents=true
    localIp=192.168.178.132

    Über den Browser http://localhost:8080/basicui/app aufgerufen bekomme ich die sitemap mit meinem ersten Schalter. Am Bus kommt aber nichts an. Daher vermute ich, dass etwas an der Konfiguration noch nicht stimmt.

    192.168.178.200 ist die IP-Adresse des eibPorts, die .132 gehört zu dem Rechner auf dem openHab2 läuft.
    Ist die knx.cfg so richtig konfiguriert, fehlt was oder muss ich was ändern?
    Kann ich mir irgendwo ein Log ansehen, dass mir ggf. Hinweise gibt?

    Vielen Dank für die Unterstützung!

    #2
    Guten Morgen,

    Konfiguration sieht gut aus. Ich würde als nächstes mal das Log-Level erhöhen und die Logs anschauen. Da sieht man dann eigentlich schon recht schnell, was der Fehler ist.
    Siehe: http://docs.openhab.org/administration/logging.html

    Gruß Michel

    Kommentar


      #3
      Guten Morgen,

      ja wäre meine erste Frage gewesen (Log) - in der Doku findest Du alles zu WIN-Installation.

      Log files > C:\openHAB2\userdata\logs
      In jedem Fall sind in der knx.cfg folgende Parameter wichtig;
      ip (= gateway IP)
      ignorelocalevents=true
      localIp (= multicast IP [vom Device, wo OH installiert ist])

      type (=TUNNEL oder ROUTER)

      Kommentar


        #4
        Ich weiß nicht, ob das noch gilt, aber bei mir war es so, dass man bei einer TUNNEL-Verbindung auf einem Windows-PC die localIp nicht setzen durfte! Umgekehrt funktionierte es auf einem Linux-PC nicht ohne diese Information. Das galt unter OH1, allerdings ist das knx-Binding ja noch ein OH1-Binding, so dass das eventuell immer noch gültig ist.
        Nun hast Du den Wert schon gesetzt, jetzt wirst Du ihn nicht so ohne weiteres los (nein, löschen in der knx.cfg reicht nicht!). Am besten gehst Du folgende Schritte:
        1. knx.cfg entsprechend ändern (also localIp auskommentieren)
        2. knx.cfg entweder verschieben oder durch Ändern der Dateiendung "unscharf" machen.
        3. in der karaf Konsole anmelden. Da es eine ssh-Konsole ist, geht das z.B. mit putty, mittels
        Code:
        ip -> localhost
        port -> 8101
        username (zu finden unter Connection - Data - Auto-login username) -> openhab
        Beim Verbindungsaufbau sollte ein Passwort abgefragt werden, das ist dann habopen

        4. den Befehl config:delete org.openhab.knx absetzen (evtl. heißt es auch knx1, tippe knx und drücke die Tab-Taste, damit openHAB Dir alle in Frage kommenden Ergänzungen anbietet)
        5. die knx.cfg wiederherstellen, also wieder nach .\services\ verschieben oder auf den korrekten Namen ändern.

        In der Konsole kann man mittels log:display sehr gut sehen, ob openHAB die neue Konfiguration gefunden hat.
        Mittels config:list "(service.pid=org.openhab.knx)" (oder knx1, siehe oben) kannst Du sogar überprüfen, was openHAB eingelesen hat.

        Kommentar


          #5
          Zunächst Danke für den Input.
          Wenn ich in die Logs schauen sehe ich folgendes:
          Code:
          Jul 18, 2017 9:06:34 PM org.apache.karaf.main.lock.SimpleFileLock lock
          INFORMATION: Trying to lock C:\openHAB2\userdata\tmp\lock
          Jul 18, 2017 9:06:34 PM org.apache.karaf.main.lock.SimpleFileLock lock
          INFORMATION: Lock acquired
          Jul 18, 2017 9:06:34 PM org.apache.karaf.main.Main$KarafLockCallback lockAquired
          INFORMATION: Lock acquired. Setting startlevel to 100
          2017-07-18 21:06:36.557 [INFO ] [thome.core.internal.I18nProviderImpl] - Locale set to de_DE, Location set to null
          2017-07-18 21:06:39.371 [WARN ] [el.core.internal.ModelRepositoryImpl] - Configuration model 'knx.items' has errors, therefore ignoring it: [1,1]: missing EOF at 'ï'
          
          2017-07-18 21:06:40.674 [INFO ] [el.core.internal.ModelRepositoryImpl] - Loading model 'knx.sitemap'
          2017-07-18 21:06:42.252 [INFO ] [.dashboard.internal.DashboardService] - Started dashboard at http://192.168.178.132:8080
          2017-07-18 21:06:42.339 [INFO ] [.dashboard.internal.DashboardService] - Started dashboard at https://192.168.178.132:8443
          2017-07-18 21:06:42.423 [INFO ] [basic.internal.servlet.WebAppServlet] - Started Basic UI at /basicui/app
          2017-07-18 21:06:42.454 [INFO ] [arthome.ui.paper.internal.PaperUIApp] - Started Paper UI at /paperui
          2017-07-18 21:06:42.470 [INFO ] [panel.internal.HABPanelDashboardTile] - Started HABPanel at /habpanel
          2017-07-18 21:06:42.582 [ERROR] [nx.internal.connection.KNXConnection] - Error connecting to KNX bus: wrong KNX address syntax with 4 levels: 127.0.0.1
          2017-07-18 21:06:42.582 [WARN ] [nx.internal.connection.KNXConnection] - Initial connection to KNX bus failed!
          2017-07-18 21:06:42.778 [INFO ] [ulation.internal.HueEmulationServlet] - Started Hue Emulation service at /api
          2017-07-18 21:07:12.576 [ERROR] [ui.internal.items.ItemUIRegistryImpl] - Cannot retrieve item 'test' for widget org.eclipse.smarthome.model.sitemap.Switch
          2017-07-18 21:07:12.576 [ERROR] [ui.internal.items.ItemUIRegistryImpl] - Cannot retrieve item 'test' for widget org.eclipse.smarthome.model.sitemap.Switch
          2017-07-18 21:07:12.576 [ERROR] [ui.internal.items.ItemUIRegistryImpl] - Cannot retrieve item for widget org.eclipse.smarthome.model.sitemap.Switch
          2017-07-18 21:07:43.114 [ERROR] [ui.internal.items.ItemUIRegistryImpl] - Cannot retrieve item 'test' for widget org.eclipse.smarthome.model.sitemap.Switch
          2017-07-18 21:07:43.114 [ERROR] [ui.internal.items.ItemUIRegistryImpl] - Cannot retrieve item 'test' for widget org.eclipse.smarthome.model.sitemap.Switch
          2017-07-18 21:07:43.114 [ERROR] [ui.internal.items.ItemUIRegistryImpl] - Cannot retrieve item for widget org.eclipse.smarthome.model.sitemap.Switch
          Die knx.cfg sieht momentan so aus:
          Code:
          ip=192.168.178.200
          ignorelocalevents=true
          localip=192.168.178.132
          type=TUNNEL
          Wobei ich sowohl mit als auch ohne die lokale IP getestet habe. Das hat keinen Unterschied gemacht.
          Ich habe auch die Methode von Udo1toni durchgeführt.
          Code:
          21:18:29.890 [INFO ] [nx.internal.connection.KNXConnection] - KNXBinding configuration is not present. Please check your configuration file or if not needed remove the KNX addon.
          21:18:41.193 [ERROR] [ui.internal.items.ItemUIRegistryImpl] - Cannot retrieve item 'test' for widget org.eclipse.smarthome.model.sitemap.Switch
          21:18:41.193 [ERROR] [ui.internal.items.ItemUIRegistryImpl] - Cannot retrieve item 'test' for widget org.eclipse.smarthome.model.sitemap.Switch
          21:18:41.193 [ERROR] [ui.internal.items.ItemUIRegistryImpl] - Cannot retrieve item for widget org.eclipse.smarthome.model.sitemap.Switch
          21:18:55.811 [ERROR] [nx.internal.connection.KNXConnection] - No IP address or serial port could be found in configuration!
          21:18:55.811 [WARN ] [nx.internal.connection.KNXConnection] - Initial connection to KNX bus failed!
          Code:
          openhab> config:list "(service.pid=org.openhab.knx)"
          ----------------------------------------------------------------
          Pid:            org.openhab.knx
          BundleLocation: mvn:org.openhab.binding/org.openhab.binding.knx/1.10.0
          Properties:
             ignorelocalevents = true
             service.pid = org.openhab.knx
             type = TUNNEL
             ip = 192.168.178.200

          Muss am eibPort ggf. irgendwas besonderes konfiguriert werden?
          Ich nutze den eibPort auch für die ETS als IP Schnittstelle. Daher muss es grundsätzlich funktionieren.

          Kommentar


            #6
            Wobei es localIp heißt, nicht localip (so hast Du es oben angegeben). openHAB ist pingelig, was Groß/Kleinscheibung betrifft.

            Weiterhin wird wohl die Datei knx.items nicht eingelesen, weil dort Fehler vorliegen, das sollte aber keinen Einfluss auf die Verbindung an sich haben, die ja offensichtlich nicht zustande kommt.

            Kommentar


              #7
              Guten Morgen,

              ich habe weiter mit den Settings getestet, leider ohne Erfolg. Dann habe ich nun ROUTING mit der Multicats-Adresse ausprobiert und es hat im ersten Anlauf funktioniert.
              Code:
              INFORMATION: Lock acquired. Setting startlevel to 100
              2017-07-19 06:27:32.430 [INFO ] [thome.core.internal.I18nProviderImpl] - Locale set to de_DE, Location set to null
              2017-07-19 06:27:35.089 [WARN ] [el.core.internal.ModelRepositoryImpl] - Configuration model 'knx.items' has errors, therefore ignoring it: [1,1]: missing EOF at '流
              2017-07-19 06:27:36.418 [INFO ] [el.core.internal.ModelRepositoryImpl] - Loading model 'knx.sitemap'
              2017-07-19 06:27:38.344 [INFO ] [.dashboard.internal.DashboardService] - Started dashboard at http://192.168.178.132:8080
              2017-07-19 06:27:38.697 [INFO ] [.dashboard.internal.DashboardService] - Started dashboard at https://192.168.178.132:8443
              2017-07-19 06:27:38.791 [INFO ] [basic.internal.servlet.WebAppServlet] - Started Basic UI at /basicui/app
              2017-07-19 06:27:38.810 [INFO ] [arthome.ui.paper.internal.PaperUIApp] - Started Paper UI at /paperui
              2017-07-19 06:27:38.824 [INFO ] [panel.internal.HABPanelDashboardTile] - Started HABPanel at /habpanel
              2017-07-19 06:27:39.061 [INFO ] [nx.internal.connection.KNXConnection] - Established connection to KNX bus on 239.192.168.27:3671 in mode ROUTER.
              2017-07-19 06:27:39.933 [INFO ] [ulation.internal.HueEmulationServlet] - Started Hue Emulation service at /api
              2017-07-19 06:28:34.000 [WARN ] [basic.internal.render.SwitchRenderer] - Cannot determine item type of 'test'
              org.eclipse.smarthome.core.items.ItemNotFoundException: Item 'test' could not be found in the item registry
              Jetzt könnte ich allerdings noch einen Tipp gebrauchen, was an meiner Datei knx.items falsch ist.

              Das Log füllt sich mit diesen Einträgen:
              Code:
              2017-07-19 06:34:14.874 [ERROR] [ui.internal.items.ItemUIRegistryImpl] - Cannot retrieve item 'test' for widget org.eclipse.smarthome.model.sitemap.Switch
              2017-07-19 06:34:14.874 [ERROR] [ui.internal.items.ItemUIRegistryImpl] - Cannot retrieve item 'test' for widget org.eclipse.smarthome.model.sitemap.Switch
              2017-07-19 06:34:14.874 [ERROR] [ui.internal.items.ItemUIRegistryImpl] - Cannot retrieve item for widget org.eclipse.smarthome.model.sitemap.Switch
              2017-07-19 06:34:45.800 [ERROR] [ui.internal.items.ItemUIRegistryImpl] - Cannot retrieve item 'test' for widget org.eclipse.smarthome.model.sitemap.Switch
              2017-07-19 06:34:45.800 [ERROR] [ui.internal.items.ItemUIRegistryImpl] - Cannot retrieve item 'test' for widget org.eclipse.smarthome.model.sitemap.Switch
              2017-07-19 06:34:45.801 [ERROR] [ui.internal.items.ItemUIRegistryImpl] - Cannot retrieve item for widget org.eclipse.smarthome.model.sitemap.Switch
              knx.items:
              Code:
              Switch test "test" { knx="1/1/30" }
              Bearbeitet mit Notepad++. Die Kodierung steht auf UTF8. Die Busadresse gehört zu einem Schaltaktor-Kanal der ein List ein/aus schaltet.

              Kommentar


                #8
                Hi,
                wenn du in der knx.cfg
                type=TUNNEL angegeben hast, musst du im eibPort noch den "Tunnelmodus" aktivieren.

                Ich habe die Version 2.1 --> Dort den Systemmodus öffnen und unter "erweitert" ganz unten Tunnel aktivieren.
                Oben bei den Reitern gibt es zwei (irgendwie KNX/IP...) dort die oberen zwei Häkchen aktivieren.

                Habe die Systemseite nur vor meinem geistigen Auge daher kann ich es nicht genau beschreiben... kann aber gerne nochmal schauen

                Kommentar


                  #9
                  Zitat von KREUZUNDKWER Beitrag anzeigen
                  knx.items:
                  Code:
                  Switch test "test" { knx="1/1/30" }
                  Bearbeitet mit Notepad++. Die Kodierung steht auf UTF8. Die Busadresse gehört zu einem Schaltaktor-Kanal der ein List ein/aus schaltet.
                  Mein erster Tipp wäre, dass (wie bei Windows üblich) die Zeile mit >CR><LF> abgeschlossen ist.
                  Versuche doch bitte mal den Smarthome Designer, um die Konfigurationsdateien zu barbeiten. Wenn Du die Dateien schon mit einem anderen Editor unter Windows erstellt hast, bietet es sich an, die Datei neu anzulegen und den Dateiinhalt Zeile für Zeile zu kopieren (ohne Zeilenumbruch)

                  Kommentar


                    #10
                    Zitat von udo1toni Beitrag anzeigen
                    Versuche doch bitte mal den Smarthome Designer, um die Konfigurationsdateien zu barbeiten.
                    Das war eine sehr gute Idee. Damit konnte der Fehler beseitigt werden. Im Log sieht nun alles sauber aus.
                    Wenn ich nun meinen Switch bediene sehe ich auch die entsprechenden Evenets die den Status toggeln.
                    Code:
                    2017-07-19 20:46:07.872 [ItemCommandEvent          ] - Item 'test' received command ON
                    2017-07-19 20:46:07.872 [ItemStateChangedEvent     ] - test changed from OFF to ON
                    2017-07-19 20:46:12.304 [ItemCommandEvent          ] - Item 'test' received command OFF
                    2017-07-19 20:46:12.304 [ItemStateChangedEvent     ] - test changed from ON to OFF
                    Leider kommt auf dem Bus nichts an. Der Gruppenmonitor der ETS zeigt keine Telegramme.
                    Hast du noch einen Tipp, woran das liegen könnte oder wo ich nach Hinweisen suchen kann?

                    Kommentar


                      #11
                      Wie sieht denn die aktuelle Konfiguration aus? knx.cfg - oder aus karaf-Konsole heraus config:list "(service.pid=org.openhab.knx)" absetzen, das wäre sogar noch besser, und natürlich knx.items.

                      Du kannst das Log für knx hochdrehen, indem Du in der Karaf Konsole log:set DEBUG org.openhab.binding.knx eingibst. Fortan kommen viel mehr Informationen, was knx so macht. mit dem gleichen Kommando (nur INFO statt DEBUG) bekommst Du es auch wieder weniger gesprächig.
                      Mit log:tail bekommst Du ein fortlaufendes log, ungemein praktisch bei der Fehlersuche, da muss man nicht erst umständlich in Dateien nach hinten scrollen...

                      Kommentar


                        #12
                        Guten Abend,

                        meine aktuelle knx.cfg sieht nun so aus:
                        Code:
                        openhab> config:list "(service.pid=org.openhab.knx)"
                        ----------------------------------------------------------------
                        Pid:            org.openhab.knx
                        BundleLocation: mvn:org.openhab.binding/org.openhab.binding.knx/1.10.0
                        Properties:
                           ignorelocalevents = true
                           service.pid = org.openhab.knx
                           type = ROUTER
                           ip = 239.192.168.27
                        Es kommen im Log keine Fehler, dass irgendwelche Dateien nicht eingelesen werden können.

                        Meine knx.item (im Smart Home Designer erstellt) sieht so aus:
                        Code:
                        Switch test "test" { knx="1/1/30" }
                        Meine knx.sitemap (im Smart Home Designer erstellt) sieht so aus:
                        Code:
                        sitemap knx label="KNX"
                        {
                         Switch item=test
                        }
                        Wenn ich nun unter http://localhost:8080/basicui/app meinen Schalter betätige passiert was im Log, aber nicht im Gruppenmonitor.
                        Code:
                        21:01:15.670 [INFO ] [smarthome.event.ItemCommandEvent    ] - Item 'test' received command ON
                        21:01:15.679 [DEBUG] [.binding.knx.internal.bus.KNXBinding] - Wrote value 'ON' to datapoint 'command DP 1/1/30 test, DPT main 0 id 1.001, low pri              ority'
                        21:01:15.679 [INFO ] [marthome.event.ItemStateChangedEvent] - test changed from NULL to ON
                        21:01:15.679 [DEBUG] [.binding.knx.internal.bus.KNXBinding] - Wrote value 'ON' to datapoint 'command DP 1/1/30 test, DPT main 0 id 1.001, low pri              ority'
                        21:02:28.125 [INFO ] [smarthome.event.ItemCommandEvent    ] - Item 'test' received command OFF
                        21:02:28.125 [INFO ] [marthome.event.ItemStateChangedEvent] - test changed from ON to OFF
                        21:02:28.125 [DEBUG] [.binding.knx.internal.bus.KNXBinding] - Wrote value 'OFF' to datapoint 'command DP 1/1/30 test, DPT main 0 id 1.001, low priority'
                        21:02:28.125 [DEBUG] [.binding.knx.internal.bus.KNXBinding] - Wrote value 'OFF' to datapoint 'command DP 1/1/30 test, DPT main 0 id 1.001, low priority'
                        21:02:31.265 [INFO ] [smarthome.event.ItemCommandEvent    ] - Item 'test' received command ON
                        21:02:31.265 [DEBUG] [.binding.knx.internal.bus.KNXBinding] - Wrote value 'ON' to datapoint 'command DP 1/1/30 test, DPT main 0 id 1.001, low priority'
                        21:02:31.265 [DEBUG] [.binding.knx.internal.bus.KNXBinding] - Wrote value 'ON' to datapoint 'command DP 1/1/30 test, DPT main 0 id 1.001, low priority'
                        21:02:31.265 [INFO ] [marthome.event.ItemStateChangedEvent] - test changed from OFF to ON
                        Mit Tunneling habe ich die Verbindung bisher noch nicht hinbekommen. Ich dachte, es könnte auch ggf. daran liegen.

                        Hier nun auch nochmal die Konfiguration vom eibPort. Vielleicht ist ja auch hier was schief und ich sehe es nicht.

                        eibport allgemein.PNG
                        eibport erweitert.PNGeibport tunnerling.png

                        Kommentar


                          #13
                          Ich glaube, ich bin wieder einen Schritt weiter.
                          Mein knx.cfg sieht nun so aus:
                          Code:
                          ip=239.192.168.27
                          ignorelocalevents=true
                          type=ROUTER
                          busaddr=1.1.203
                          Danach erhalte ich in der karaf-Konsole die gesamten Telegramme vom BUS angezeigt. Auch im Gruppenmonitor der ETS kommen nun die Telegramme von openHab an. Allerdings werden diese grau hinterlegt und nicht verarbeitet.
                          Als Quelle steht dort die in der knx.cfg angegebenen Bus-Adresse.

                          Ich bin nun mal hingegangen, und habe über die Cubevision vom Eibport das Licht betätigt, dass ich auch über openhab versuche zu schalten.
                          DAs Telegramm kommt im Gruppenmonitor parallel zu einem Telegramm von openhab. Aus der Cubevision kommt es mit der Quelle 1.1.0 und von openhab mit der Quelle 1.1.203. Beide Telegramme sind grau hinterlegt. Unterscheiden tun sich beide Diagramme noch in der Rout. Die ist bei dem Telegramm von der Cubevision 5 und bei dem von openhab 6.

                          Sagt das jemandem was?

                          Kommentar


                            #14
                            Ich kenne mich leider mit Routing nicht aus, ich nutze bisher nur ein einfaches Tunnel-Device. Was mich erstmal wundert, sind IP und Port.

                            Für knx Multicast ist 224.0.23.12 als IP reserviert. Natürlich kann man die frei wählen, da sollte man aber schon gute Gründe haben.

                            Der Port sollte eigentlich 3671 sein. Wenn Du den änderst, musst Du ihn in openHAB2 natürlich auch konfigurieren.

                            Außerdem bin ich mir ziemlich sicher, dass man localIp setzen muss, wenn man Multicast verwendet, weil der Rechner ja den Stream abonnieren muss.

                            Streng genommen geht es um die Schnittstelle, über die Multicast abgewickelt wird, aber die kann man über die IP ja ermitteln.

                            Und schließlich denke ich, musst Du zwei Haken setzen bei KNXnet/IP Routing zu EIB -> Aktivieren und ebenso in der Gegenrichtung.

                            Kommentar


                              #15
                              Guten Morgen,

                              also, ich habe meine knx.cfg nochmal angepasst:
                              Code:
                              ip=224.0.23.12
                              ignorelocalevents=true
                              type=ROUTER
                              localIP=192.168.178.132
                              Seit dem funktioniert das schalten der Lampe! Erfolg!
                              Doppelte Telegramme gibt es allerdings immer noch auf dem Bus.

                              Dann habe ich nach Netzrecherche meine knx.items nochmal angepasst:
                              Code:
                              Switch test "test" { knx="1/1/30+<1/4/30" }
                              Seit dem sind auch die doppelten Telegramme weg. Weiterer Erfolg!

                              Allerdings habe ich das TUNNELING immer noch nicht hinbekommen. Trotz Recherche, ausprobieren etc. . Hätte gerne verstanden warum das nicht funktioniert, aber eine Lösung über Multicast ist ja da.
                              Voraussetzung beim eibPort damit Multicast funktioniert ist, dass die Adresse der BCU auf 0 endet.

                              Und schließlich denke ich, musst Du zwei Haken setzen bei KNXnet/IP Routing zu EIB -> Aktivieren und ebenso in der Gegenrichtung.
                              Die beiden Haken habe ich auch noch gesetzt.

                              Schönheitsfehler ist nun noch, dass die Telegramme von openHab laut Gruppenmonitor von einer unbekannten Quelle (0.0.0) kommen.
                              Also habe ich knx.cfg wieder angepasst und den Eintag
                              Code:
                              busaddr=1.1.4
                              ergänzt.
                              In der ETS habe ich dann einen Dummy mit dieser Gruppenadresse hinzugefügt.
                              Openhab neu gestartet.
                              Nun kommen die Telegramme im Gruppenmonitor von dieser Quelle und die sind nicht mehr unbekannt, aber die Lampe schaltet auch nicht mehr.
                              Also Eintrag wieder komplett raus.
                              Telegramme kommen nun mit der Quelle 0.0.0, sind unbekannt aber alles funktioniert.

                              Noch steige ich da nicht ganz durch, aber es wird :-)
                              Zuletzt geändert von KREUZUNDKWER; 21.07.2017, 07:57.

                              Kommentar

                              Lädt...
                              X