Homegear Request Speed

Hey,

ich habe ein kleines Problem mit MQTT Topics welche zu schnell ‘gleichzeitig’ bei Homegear ankommen.

In meinem pimatic-homegear-mqtt plugin werden durch eine Regel 3 Topics direkt nacheinander published. Damit scheint Homegear nicht klar zu kommen. Ist diese Problem bekommt?

Ich hatte zuvor die Kommunikation ueber Websockets implementiert und dort das gleiche Verhalten feststellen koennen.

Ich hatte mir erhofft dieses Problem mit MQTT uber dessen Message Broker in den Griff zu bekommen.

Koennen die eingehenden Requests/Topics nicht asynchron bearbeitet werden?

Viele Gruesse

Also mir ist nichts dergleichen bekannt. Wenn ich z.B. alle meine Max!-Thermostate per mqtt schalte, sind das 11 gleichzeitige Messages und dabei sehe ich noch nicht mal Last auf meinem Pi.

Kannst du vielleicht etwas besser beschreiben, wie das Problem zu Stande kommt? Welche Software-Versionen setzt du ein?

Ich habe Homegear version 0.7.15-1580 im Einsatz auf einem OrangePi Zero (Armbian) der sich laut htop langweilt.

Dort laeuft auch der Mosquitto MQTT Broker: mosquitto version 1.3.4 (build date 2017-05-29 05:49:56+0000)

Jetzt habe ich in meinem pimatic eine Regel welche 3 SET_TEMPERATURE abschickt.

17:30:21.176 [pimatic-homegear-mqtt] Request homegear/1234-5678-9abc/set/5/4/SET_TEMPERATURE sent
17:30:21.178 [pimatic-homegear-mqtt] Request homegear/1234-5678-9abc/set/7/4/SET_TEMPERATURE sent
17:30:23.177 [pimatic-homegear-mqtt] Request homegear/1234-5678-9abc/set/6/4/SET_TEMPERATURE sent
17:30:30.322 [pimatic-homegear-mqtt] 7 0 { STICKY_UNREACH: true, UNREACH: true }
17:30:30.677 [pimatic-homegear-mqtt] 7 0 { UNREACH: false }
17:30:31.176 [pimatic-homegear-mqtt] Error for homegear/1234-5678-9abc/jsonobj/5/4: Timeout has occurred
17:30:31.178 [pimatic-homegear-mqtt] Error for homegear/1234-5678-9abc/jsonobj/7/4: Timeout has occurred
17:30:31.180 [pimatic] rule thermostat-temperatur error executing an action: homegear/1234-5678-9abc/jsonobj/5/4
17:30:31.180 [pimatic]>Timeout has occurred
17:30:31.181 [pimatic] Error on evaluation of rule condition of rule thermostat-temperatur: undefined
17:30:31.181 [pimatic] homegear/1234-5678-9abc/jsonobj/5/4
17:30:31.181 [pimatic]>Timeout has occurred
17:30:31.182 [pimatic] rule thermostat-temperatur error executing an action: homegear/1234-5678-9abc/jsonobj/7/4
17:30:31.182 [pimatic]>Timeout has occurred
17:30:32.237 [pimatic-homegear-mqtt] 6 0 { STICKY_UNREACH: true, UNREACH: true }
17:30:32.747 [pimatic-homegear-mqtt] 5 0 { RSSI_DEVICE: -60 }
17:30:32.769 [pimatic-homegear-mqtt] 5 0 { LOWBAT: false }
17:30:32.789 [pimatic-homegear-mqtt] 5 4 { BOOST_STATE: 0,
17:30:32.789 [pimatic-homegear-mqtt]>  CONTROL_MODE: 1,
17:30:32.789 [pimatic-homegear-mqtt]>  FAULT_REPORTING: 0,
17:30:32.789 [pimatic-homegear-mqtt]>  PARTY_START_TIME: 0,
17:30:32.789 [pimatic-homegear-mqtt]>  SET_TEMPERATURE: 15 }
17:30:33.177 [pimatic-homegear-mqtt] Error for homegear/1234-5678-9abc/jsonobj/6/4: Timeout has occurred
17:30:33.179 [pimatic] rule thermostat-temperatur error executing an action: homegear/1234-5678-9abc/jsonobj/6/4
17:30:33.179 [pimatic]>Timeout has occurred

Da pimatic mit coffeescript geschrieben ist hier die publish function, das @receiver subject (rxjs) auf eine response topic filtert bis der timeout (hier 10 sec) abgelaufen ist

publish: (id, group, property, value) =>

  reqTopic = "homegear/#{@mqttId}/set/#{id}/#{group}/#{property}"
  resTopic = "homegear/#{@mqttId}/jsonobj/#{id}/#{group}"

  return new Promise((resolve, reject) =>

    @receiver.filter((event) =>
      return event.topic == resTopic
    ).timeout(@timeout * 1000).first().subscribe((event) =>
      env.logger.debug("Response for #{resTopic} received")
      resolve(event.message[property])
    , (error) =>
      env.logger.error("Error for #{resTopic}: #{error.message}")
      reject("#{resTopic}\n#{error.message}")
    , () =>
      env.logger.debug("Request for #{reqTopic} completed")
    )

    @mqttClient.publish(reqTopic, value.toString(), null, (error) =>
      if error
        reject(error.message)
        env.logger.error("MQTT error for #{reqTopic}")
      else
        env.logger.debug("Request #{reqTopic} sent")
    )

  )

Ich weis nicht ob ich irgendwo falsche Annahmen mache bzw. MQTT falsch verstehe. Einfache Schalter publish topics funktioniert wie erwartet. Auch einzelne SET_TEMPERATURE publishes funktionieren.

Hmm,

vielleicht kann @sathya was dazu sagen?

Ich habe jetzt ein delay eingebaut damit zwischen den einzelnen topics mindestens 1000ms sind. Jetzt funktioniert das ganze. (schoen ist was anderes)

publish: (id, group, property, value) =>

  reqTopic = "homegear/#{@mqttId}/set/#{id}/#{group}/#{property}"
  resTopic = "homegear/#{@mqttId}/jsonobj/#{id}/#{group}"

  delay = 0
  diff = new Date() - lastRequest

  if (diff < @requestDelay)
    delay = @requestDelay - diff

  lastRequest = new Date()
  lastRequest.setMilliseconds(lastRequest.getMilliseconds() + delay)

  env.logger.debug("Request Delay #{delay}ms")

  return new Promise((resolve, reject) =>

    setTimeout( =>

      @mqttClient.publish(reqTopic, value.toString(), null, (error) =>
        if error
          reject(error.message)
          env.logger.error("MQTT error for #{reqTopic}")
        else
          env.logger.debug("Request #{reqTopic} sent")
      )

      @receiver.filter((event) =>
        return event.topic == resTopic
      ).timeout(@requestTimeout * 1000).first().subscribe((event) =>
        env.logger.debug("Response for #{resTopic} received")
        resolve(event.message[property])
      , (error) =>
        env.logger.error("Error for #{resTopic}: #{error.message}")
        reject("#{resTopic}\n#{error.message}")
      , () =>
        env.logger.debug("=> #{reqTopic} completed")
      )

    , delay)

  )

Nein, das Problem ist mir nicht bekannt.

Koennen die eingehenden Requests/Topics nicht asynchron bearbeitet werden?

Doch. Werden sie auch.

Ich habe jetzt ein delay eingebaut damit zwischen den einzelnen topics mindestens 1000ms sind. Jetzt funktioniert das ganze. (schoen ist was anderes)

Das sollte nicht notwendig sein. Kannst du mir einen Logausschnitt auf Debuglevel 5 posten, welches den Problemzeitraum zeigt? Darin sollten alle eingehenden Pakete roh geloggt werden.

Viele Grüße

Sathya

Nachtrag: Zeigt Mosquitto denn alle Pakete an?
Nachtrag 2: Die Pakete wurden bisher gar nicht geloggt, d. h. installier dir vorher das nächste Nightly (Version 0.8.0-2171 oder neuer).