banban525 / echonetlite2mqtt

ECHONET Lite to MQTT bridge.
MIT License
48 stars 7 forks source link

エアコンの温度変更で困ったことがあります。 #6

Closed grandevice closed 1 year ago

grandevice commented 1 year ago

Homebridge MQTT-Thingを通じてAppleHomekit上で温度のみ変更する際はログの通り[ECHONETLite] prop changedとなり正常に反映されるのですが

Homebridge Log [16:14:53] [エアコン] Publishing MQTT: echonetlite2mqtt/elapi/v2/devices/fe00000/properties/targetTemperature/set = 20 [16:14:54] [エアコン] Received MQTT: echonetlite2mqtt/elapi/v2/devices/fe00000/properties/targetTemperature = 20 [16:14:54] [エアコン] Received MQTT: echonetlite2mqtt/elapi/v2/devices/fe00000/properties/targetTemperature = 20

Echonetlite2mqtt Log 16:14:54 | [ECHONETLite] prop changed: エアコン targetTemperature 20 16:14:53 | [MQTT] prop changed: エアコン targetTemperature 20

Homekitのオートメーションで温度を変更する際にはoperationStatus operationMode targetTemperatureの3つがpublishされる仕様のようで、targetTemperatureがReceiveされず温度変更が反映されません。Homebridge MQTT-Thingの設定をいろいろといじっては見たもののこれと言って挙動が変化するものはありませんでした。何か対策があればよろしくお願いいたします。

Homebridge Log [16:13:28] [エアコン] Publishing MQTT: echonetlite2mqtt/elapi/v2/devices/fe00000/properties/operationStatus/set = true [16:13:28] [エアコン] Publishing MQTT: echonetlite2mqtt/elapi/v2/devices/fe00000/properties/operationMode/set = heating [16:13:28] [エアコン] Publishing MQTT: echonetlite2mqtt/elapi/v2/devices/fe00000/properties/targetTemperature/set = 20 [16:13:30] [エアコン] Received MQTT: echonetlite2mqtt/elapi/v2/devices/fe00000/properties/operationMode = heating

Echonetlite2mqtt Log 16:13:28 | [MQTT] prop changed: エアコン targetTemperature 20 16:13:28 | [MQTT] prop changed: エアコン operationMode heating 16:13:28 | [MQTT] prop changed: エアコン operationStatus true

環境はPanasonic CF-TC7B + CF-TA9です。なお、アダプターのないダイキンエアコンでも同様でした。少し違いところがあるとすればダイキンのほうはたまにRecieveされる点でです。よろしくお願いいたします。

banban525 commented 1 year ago

@grandevice さん

報告ありがとうございます。 Homebridge は使ってないので、この挙動は初めて知りました。 おそらくですが、3つのプロパティがほぼ同時に更新されることが要因のようですね。

考えられる可能性は、以下あたりでしょうか。

残念ながら、どれも現状では対応できていません。 Homebridge は無いのですが、ダイキンのエアコンはあるので、連続してコマンドを送った場合の挙動を調べてみます。 少なくとも(1)と(2)に関しては、コマンド送信後に次のコマンド送信まで待つような仕組みを導入すれば、実現できると考えています。

grandevice commented 1 year ago

@banban525さん コメントありがとうございます。 いろいろいじりすぎて何が効いてるのかわからなくなっていますが、Homebridge MQTT-Thingの RetainとOptimise Publishingを、enableにしても期待した動作が得られていませんでしたがLogを見るとKeepaliveがdefaultで0かと思っていたら10secとなっていました。(設定で0と表示されていたので気づきませんでした。 )0に設定すると上記2つが動作しているのかoperationStatus:trueとoperation Mode:heatingが通知されなくなり変更されたtargetTemperature:のみ通知されるようになりました。提示していただいた根本的問題は解決されていないとは思いますが回避はできたように感じます。たまたまtargetTemperatureを最初に受け取ってるだけかもしれませんが、最後の人が外出したらエアコンの温度を下げる、帰宅したら上げるという動作は完了するようになりました。今のところメディアコンバータ、アダプタ経由のエオリアとwifiアダプタ内蔵のダイキンエアコンともに動作しています。なおmosquittoのconfigもこの間に多少の書き換えを行ったので時間のある時に設定を詰めてみる予定です。

banban525 commented 1 year ago

@grandevice さん

現状、回避できたとのことで、よかったです。 ただ、プロパティを同時に変更すると危なそうなのは確かなので、 その挙動だけは確認して、可能なら対策を入れておこうと思います。

なお、もしかすると再現しないかもしれませんが、その場合は対処無しで本件はCloseさせていただきます。

grandevice commented 1 year ago

@banban525さん

帰宅時も無事に動作しているようです。Panasonic CF-TC7B + CF-TA9 + Eoliaの時にReceivedが2回出るのがよくわかりませんが以下の通り Eoliaは20→22℃ Daikinは18→20℃へ変更されました。以前はHomikit 上で変更できている様に表示されますが実際には変更されていませんでした。なお、EoliaとDaikinの動作に5秒の遅延を入れています。

Echonetlite2MQTT [18:54:41] [Eolia] Publishing MQTT: echonetlite2mqtt/elapi/v2/devices/fe00000/properties/targetTemperature/set = 22 [18:54:42] [Eolia] Received MQTT: echonetlite2mqtt/elapi/v2/devices/fe00000/properties/targetTemperature = 22 [18:54:43] [Eolia] Received MQTT: echonetlite2mqtt/elapi/v2/devices/fe00000/properties/targetTemperature = 22 [18:54:46] [Daikin] Publishing MQTT: echonetlite2mqtt/elapi/v2/devices/fe00000/properties/targetTemperature/set = 20 [18:54:46] [Daikin] Received MQTT: echonetlite2mqtt/elapi/v2/devices/fe00000/properties/targetTemperature = 20

Homebridge 18:54:46 | [ECHONETLite] prop changed: Daikin targetTemperature 20 18:54:46 | [MQTT] prop changed: Daikin targetTemperature 20 18:54:42 | [ECHONETLite] prop changed: Eolia targetTemperature 22 18:54:41 | [MQTT] prop changed: Eolia targetTemperature 22

mosquitto.confで変更したのは以下の通りです。 max_topic_alias 65535 max_inflight_messages 0 max_queued_messages 0 queue_qos0_messages true

banban525 commented 1 year ago

@grandevice さん

連続して変更コマンドを送った場合に、正常に反映されない問題が再現できました。 ダイキンのエアコン AN-22YRS-W で確認しています。

2つまでなら反映されるようですが、3つになると最後のプロパティ変更が反映されません。 (なお10回1回くらいは3つとも反映されます) 以前挙げた仮設の中では(1)に該当すると思います。

(1) ECHONETLite2MQTTからコマンドをエアコンに一度に送っているため、エアコンがコマンドを受信できていない

なお、連続していくつまで受信できるかは、受信側のデバイスの実装次第またはタイミング次第と思われます。 想像ですが、ダイキンのエアコンは受信バッファが2つなのかもしれません。

いずれにしても、ECHONETLite2MQTTが連続してコマンドを送っていることが問題で、 コマンドを送った後はデバイス側の受信を確認して次のコマンドを送るようにしないといけないようです。 ただ、修正は割と大変そうなので、修正には少々お時間をいただくと思います。

grandevice commented 1 year ago

@banban525さん

反応が遅くて申し訳ありません。 その通りのレスポンスでした。

operationStatus,operationMode, targetTemperatureの順で受け取った場合 ダイキンはtagetTemperatureが受け取れませんでした。パナソニック+メディアコンバータはoperationMode, targetTemperatureが受け取れませんでした。

なのでoperationStatus,operationMode, targetTemperatureをあらかじめpublishしておきMqttThingのoptimize publishingにて変更したいtargetTemperatureのみ受け取るといったことで対処しています。

全く急いでおりませんのでお手隙の時にでも修正をお願いできたらと思います。

本当に風呂沸かしと玄関ドアのコントロールができているだけで大満足です。

banban525 commented 1 year ago

@grandevice

ずいぶん前の課題ですが、対応しましたので連絡します。

本当は、コマンド送信廻りを根本的に見直すつもりでしたが、 v2.2.0 でコマンドの同時送信が必要になったので 間に合わせの対応を行いました。

この問題も、解決しているようでした。

Dockerを使っているなら、 v2.2.0以降のタグか、latestタグ、materタグを使ってください。 node.jsで実行しているなら、最新のmasterブランチをcloneしてください。

このIssueはCloseさせてもらいます。