Websocket Username/Password

Hallo ,

ich wuerde gerne ein pimatic plugin fuer homegear realisieren. Es gibt schon eines, damit ist aber nur ein Thermostat ueber xml rpc implementiert.

Dazu habe ich jetzt noch (weit weniger aufwaendig) einen PowerSwitch hinzugefuegt.

Gerne wuerde ich das aber ueber websockets loesen.
Habe mir dazu https://github.com/Homegear/HomegearWS angesehen und eingebunden.

Jetzt bekomme ich aber immer einen auth Fehler.

Error: Authentication failed.
homegear-ws-0.0.1.js:90 Error: Client disconnected.

Wo kann ich einen user definieren den ich dann bei connect angeben muss?
Ich finde dazu leider keinen eintrag in der main.conf

Viele Gruesse

Hi @pheinrich,

dafür musst du dir einen Benutzer anlegen, damit solltest du dann authentifizieren können: https://www.homegear.eu/index.php/Create_or_Delete_Users_Using_Homegear’s_Command_Line_Interface
(ungetestet)

so long,
p

Ja du hast recht! Vielen Dank.

Ich hatte in der rpcserver.conf geschaut und den Auth Type gefunden (auf none gesetzt zum testen) … jetzt mit einem user funktioniert auch das auth.

Ich verstehe aber irgendwie nicht warum es ein “server” und ein “client” protokoll gibt.
Die WS Verbindung ist doch bidirektional. Also was bedeutet hier “server” und “client”?

Da habe ich leider keine Erfahrungen zu.

@sathya müsste da was zu sagen.

Weil ich verstehe nicht warum in HomematicWS Beispiel 2 Websockets geoeffnet werden.

Ich habe hier ein kleines Coffee Script Beispiel. Auch wenn zum Beispiel 2 protokolle definiert sein sollten (also ‘server’ und ‘client’) muesste man den Socket so oeffnen koennen.

  @wsClient = new WebSocketClient();
  @wsId = "PimaticApp-e7eb9482-f8d7-150d-cd5d-52a793b4e6a3"

  @wsClient.on('connectFailed', (error) =>
    env.logger.error "failed to connect to homegear ws! ", error
  )

  @wsClient.on('connect', (connection) =>
    env.logger.debug "homegear ws connected."

    connection.on('error', (error) =>
      env.logger.error "homegear ws error! ", error
    )

    connection.on('close', () =>
      env.logger.debug "homegear ws closed."
    )

    connection.on('message', (message) =>
      env.logger.debug "homegear ws received: ", message
    )

    @subscribe = JSON.stringify({method:"subscribePeers", params:[@wsId, []]})
    env.logger.debug "homegear ws ", @subscribe

    connection.send(@subscribe)

  )

  @wsClient.connect('ws://localhost:2001/' + @wsId, ['server', 'client'])

Ich bekomme bei subscribePeers aber immer die Meldung

Event server is unknown.

Hallo @pheinrich,

Das liegt vor allem daran, dass in Homegear der RPC-Server und -Client getrennt sind. Auch kommen sich die beiden Server so nicht in die Quere. Es gibt eine ganze Reihe an Gründen, warum es so implementiert ist, auf die ich jetzt aus Zeitgründen nicht näher eingehe. Kurz gesagt: Die Implementierung führt so wie jetzt ist zu weniger Problemen.

Schau mal, was das Homegearlog dazu sagt. Zunächst einmal fällt auf, dass du dich nicht authentifizierst. Hast du die Authentifizierung in der Homegear-Konfiguration abgeschaltet? Da du vermutlich im Backend kein PHP verwendest, ändere mal die “rpcservers.conf” und setze “webSocketAuthType” für den verwendeten RPC-Server auf “basic”. Dies sollte nur in Verbindung mit SSL-Verschlüsselung gemacht werden. Zum Testen kannst du “webSocketAuthType” auch auf “none” stellen.

Viele Grüße

Sathya

Hier ein funktionierendes Beispiel, wenn “webSocketAuthType” auf “none” steht:

@wsId = "PimaticApp-e7eb9482-f8d7-150d-cd5d-52a793b4e6a3"
@wsClient = new WebSocket('ws://192.168.0.103:2001/' + @wsId, 'server')
@wsServer = new WebSocket('ws://192.168.0.103:2001/' + @wsId, 'client')

@clientConnected = false
@serverConnected = false

@onopen = () =>
  if @clientConnected and @serverConnected
    @subscribe = JSON.stringify({method:"subscribePeers", params:[@wsId, [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]]})
    console.log "homegear ws " + @subscribe

    @wsClient.send(@subscribe)

    @listDevices = JSON.stringify({method:"listDevices", params:[@wsId]})
    console.log "homegear ws " + @listDevices

    @wsClient.send(@listDevices)

@wsClient.onerror = (error) =>
  console.log "failed to connect to homegear ws: " + error

@wsClient.onopen = () =>
  console.log "homegear ws connected."
  @clientConnected = true
  @onopen()

@wsClient.onclose = () =>
  console.log "homegear ws closed."
  @clientConnected = false

@wsClient.onmessage = (message) =>
  console.log "Client received: " + JSON.stringify(message.data)


@wsServer.onerror = (error) =>
  console.log "failed to connect to homegear ws: " + error

@wsServer.onopen = () =>
  console.log "homegear ws connected."
  @serverConnected = true
  @onopen()

@wsServer.onclose = () =>
  console.log "homegear ws closed."
  @serverConnected = false

@wsServer.onmessage = (message) =>
    console.log "Server received: " + JSON.stringify(message.data)

Viele Grüße

Sathya