Sympapaのスマートホーム日記

スマートなんとかはスマートじゃない方法でつくられている

新居のスマート化: 食洗器をIoT化する

Sympapaです。

我が新居のトイレ、風呂、洗面台、キッチンあたりの住設は基本的にコスト重視でベーシックなモノばかりですが、食洗機は奥様からの要求により奮発してミーレのフロントオープンタイプにしました。

で、食洗機といえば、たまに食洗機に入っている食器が「これ洗ってあるの?ないの?」ってなることありませんか?我が家だけかな(笑)
まぁちゃんと食器を見れば判断できるはずですが、自信が無い時に洗い終わった時間が判れば判断の助けになるはず。
IoT対応モデルであれば洗い終わった時間くらい判りそうですが、残念ながら採用したミーレのG 7104 C SCi はIoT非対応モデルです。スマートホームオタク的にはIoT対応モデルが欲しかったのですが、ミーレで60cm幅のIoT対応モデルは高すぎだったんですよね。
ですがIoT非対応のデバイスをIoT化するのはDIYスマートホーム化の醍醐味でもあります(笑)
そんなワケで、やっていきましょう。

■ミーレG 7104 C SCiという食洗機

2024年4月現在、日本で一般的なキッチンビルトイン型の食洗機は引き出し式です。新居を建てた工務店の標準は「引き出し式の深型食洗機」でした。しかし、深型とはいえ引き出し式は容量が。。。フロントオープン式であれば比べ物にならないくらい容量があります。


そんなワケで家を建てる計画中に奥様からフロントオープン式のミーレかBOSCHの食洗機を採用するよう指示が出たのです。しかしミーレとかBOSCHのはお高いんですよね。
当時、日本メーカーだとリンナイが唯一フロントオープン式を販売していてドイツ勢より安価なのでこれも検討しました。
ちなみに2023年10月に、昔フロントオープンの食洗機を販売していたパナソニックさんがフロントオープン海外勢の人気が出てきたことに嫉妬して(?)再びフロントオープン式を発売しました。定価はなかなか高価でドイツ勢より高くなるんちゃう?と思わなくもないですが、住設の定価なんて工務店を通すとあって無いようなものなので値引きが入るとドイツ勢よりは安いのかな?


基本的に日本勢はヒーターによる乾燥機能が付いているのに対してドイツ勢にはそれがないので、どちらを選ぶかの大きなポイントはその点と価格かなと思います。
機種によりますが中級グレード以上であれば、BOSCHの場合はゼオライトとかいう吸湿すると熱を発する石を利用して電気いらずで乾燥し、ミーレの場合は洗い終わると自動でドアが少し開いて空気の流れを作りお湯の余熱で乾燥するしくみです。
BOSCHはどうなのかわかりませんが、ミーレの場合は使っている感じ完全には乾かないものもある(リンスを使えば良く乾くようですが我が家では使っていない)のですが、ヒーター付きのもので乾燥機能を使うと電気代が3倍近くかかるようなので、ここが選ぶポイントじゃないかと思います。
我が家の場合、過去に余熱で乾燥するヒーター無しのホシザキ製食洗機を使っていて困っていなかったのと、引っ越す前に使っていた食洗機はヒーター付きであったにも関わらず奥様は乾燥が始まるとスイッチをOFFにしてしまう派だったので、結局、ヒーターの無いドイツ勢を選ぶことにしました。
BOSCHゼオライトによる乾燥は気になりましたが、当時BOSCH製はコロナ禍で入荷しづらい状況になっていたため、ミーレを選びました。


採用したキッチンはタカラスタンダードのオフェリア(ビルダー向けのベーシックグレード)ですが、ショールームで「施主支給でミーレの食洗機を付けたい」と申し入れたところ快く引き受けてくれ面材も用意してくれました。
キッチンのメーカーによっては断られたり、キッチンのグレードが高いものの場合のみOKだったりするようなので、施主支給で海外製食洗機を採用しようと検討されている方はメーカーのショールームで確認されることをおすすめします。


ちなみに幅45cmタイプと幅60cmタイプのどちらにするか悩んでいる方には60cmタイプをおススメします。
我が家も45cmタイプと60cmタイプで悩みましたが、使ってみて60cmタイプで大正解です。
「大きすぎる」「45cmでも十分だったのでは?」と思ったことは一度もありません。
家族の人数や洗浄する間隔にもよると思いますが、4人家族で基本1日1回洗浄の我が家の場合は割と余裕があり並べ方をあまり気にせずに食べ終わった後の食器を食洗器にガンガン放り込めるので、シンクに食器が停滞せず快適です。鍋もガンガン突っ込めるし、レンジフードの清掃時にシロッコファンやオイルフィルタなどもまとめて突っ込めるし、大きいに越したことはありません。

■どうやって稼働状況を取得するか

さて、このIoT非対応の食洗機の稼働状況をどうやって取得するか?


基本的に非IoTデバイスの動作を検出するには「物理的な動きをタクトスイッチやマグネットセンサーでキャッチする」or「ステータスのインジケーターなどを光や電気的にキャッチする」or「消費電力をキャッチする」になるかと思います。


最初は、洗い終わると自動でドアが少し開くので、これをドア開閉センサーで検出して「洗い終わった」と判断する方法を検討しました。
しかし、人がドアを開けた時に「洗い終わった」となってしまうのを避けるには、ドア開閉センサーの位置を微妙な位置に取り付ける必要が出てきそうです。キッチンの外側にセンサーを付ける必要があり後付け感満載になりそうなので、この方法はとりあえず却下。


次に考えたのは消費電力の検出です。消費電力の検出方法として手っ取り早いのは消費電力測定機能付きのスマートプラグですが、ミーレG 7104 C SCi は電圧200Vで定格消費電力2000W(実消費電力は1000W未満らしいです)なので、中華なスマートプラグなどで消費電力を取得するのはさすがに恐ろしいです。
ここはセンサーに直接電流を流さずに消費電力を取得したいので、CTクランプセンサーを使うことにしました。電気工事やさんが使うクランプメーターと同じで配線をクランプ部分に通せば電流がわかるという優れモノです。


キッチンのシンク下を覗いた結果、食洗機用の200Vコンセントと自動水栓用の100Vコンセントが手の届く場所に設置されていました。
幸い100Vの電源があるので普通のUSB電源が使えるためESP32の電源が取れます。
ググるとESP32+CTクランプセンサーを使って消費電力を取得している例は色々出てくるし、ESP HomeにもCTクランプセンサーのセットアップが用意されているのでこれを使用することにしました。
200Vのコンセントに延長ケーブルをかませて、そこにCTクランプセンサーを設置することにします。
ESP Homeが何なのかについてはこちらの記事に書いています。

■用意したもの

1)ESP32
akizukidenshi.com
2)CTクランプセンサーSCT013 30A
en.yhdc.com
3)10kΩ抵抗×2
4)10μFコンデンザー
5)3.5mmステレオジャック
6)Panasonic 15A・20A兼用露出アースターミナル付接地コンセント WKS294
7)ホーム接地20Aコーナーキャップ WF5324
8)VVFケーブル 2C×2.0mm×1m

■回路を作る

とりあえず(というか今もそのままですが)ブレッドボード上で下図の回路を作りました。
正直、ググって出てきた事例を見よう見マネでやっているだけなので、抵抗とコンデンサーを使って何をやっているのかはほとんど解っていません(汗)
SCT013の出力は3.5mmプラグです。切断して直結しても良いのでは?と思いましたが、ググった事例では大半が3.5mmプラグをそのまま使用しているので3.5mmジャックを使って接続することにしました。


SCT013を使ってESP32で電流を取得する事例はなかなか「これが正解」という情報がありませんが、このあたりのページを参考にしています。
simplyexplained.com

■設置する

CTクランプに通すのは1極だけですが、食洗機のケーブルを割るのは気が引けます。
なので200Vの短い延長ケーブルをPanasonic WKS294+WF5324を使用して作製し、そこにCTクランプセンサーを設置しました。

■ESP HOMEの設定

ESP HomeにはCTクランプセンサーのセットアップが用意されているので、基本的にはコピペするだけです。
問題はキャリブレーションです。食洗機を動かしても実電流がわからないので、本当は電気工事屋さんが使うような校正されたクランプメーターで測定しながらキャリブレーションして合わせこむのが良いのでしょうがソレを持っていません。
全く同じESP32+SCT013 30Aの組み合わせの事例があればそれを参考にすれば良さそうですが、ググっても良さゲな情報がみつかりませんでした。


まぁ今回の場合は消費電力の絶対値が知りたいわけではないので、相対的にみて稼働状況を判別できれば問題ありません。
とりあえず、食洗機の洗浄中に定格の10A付近を示すよう設定していますが、実際の電流がどうなのかはわかりません。
ESP Homeの設定は以下のとおりで、"calibrate_linear"の"0.310 -> 10.0A"の数値を変えることでキャリブレーションできます。

sensor:
- platform: ct_clamp
  sensor: adc_sensor
  name: "Measured Current"
  id: current
  sample_duration: 600ms
  update_interval: 3000ms
  filters:
    - calibrate_linear:
        - 0.000 -> 0
        - 0.310 -> 10.0A

- platform: adc
  pin: GPIO32
  id: adc_sensor
  attenuation: 11db
  update_interval: 3000ms

■電流値によって食洗機の稼働ステータスを変更するオートメーション

さて、電流値が取得できるようになったので、その値によって食洗機の稼働状態を判断してステータスを変更するオートメーションを組みます。

洗浄中は大体10Aですが、乾燥中は0.2~0.3Aといったところです。しかし停止中も0.2A前後になってます。
最初は「OFF」「洗浄中」「乾燥中」の3つを切り替える想定でしたが、「乾燥中」の時と「OFF」の時の消費電力にほとんど差が無いのでこの区別をするのは諦めて「運転中」「OFF」の二択とし、0.25A以下が10秒間続くと「OFF」、0.4A以上が10秒間続くと「運転中」となるようにしました。
あらかじめinput_select.miele_status_selectは作成しておきました。

alias: Miele_status_change
description: ""
trigger:
  - platform: numeric_state
    entity_id:
      - sensor.esp32_a_miele_measured_current
    for:
      hours: 0
      minutes: 0
      seconds: 10
    below: 0.25
    id: current below 0_25
  - platform: numeric_state
    entity_id:
      - sensor.esp32_a_miele_measured_current
    for:
      hours: 0
      minutes: 0
      seconds: 10
    id: current above 0_4
    above: 0.4
  - platform: state
    entity_id:
      - sensor.esp32_a_miele_measured_current
    to: unknown
    for:
      hours: 0
      minutes: 0
      seconds: 10
    id: current unknown
condition: []
action:
  - choose:
      - conditions:
          - condition: trigger
            id:
              - current above 0_4
          - condition: or
            conditions:
              - condition: state
                entity_id: input_select.miele_status_select
                state: "OFF"
        sequence:
          - service: input_select.select_option
            target:
              entity_id: input_select.miele_status_select
            data:
              option: 運転中
      - conditions:
          - condition: trigger
            id:
              - current below 0_25
          - condition: state
            entity_id: input_select.miele_status_select
            state: 運転中
        sequence:
          - service: input_select.select_option
            target:
              entity_id: input_select.miele_status_select
            data:
              option: "OFF"
      - conditions:
          - condition: trigger
            id:
              - current unknown
          - condition: state
            entity_id: input_select.miele_status_select
            state: 運転中
        sequence:
          - service: input_select.select_option
            target:
              entity_id: input_select.miele_status_select
            data:
              option: "OFF"
mode: single


次に食洗機のステータスがOFFになったら日時を取得するオートメーションを作成します。
input_datetime.miele_last_finished_date_timeはあらかじめ作成しておきました。

alias: mile_last_finish_time_set
description: ""
trigger:
  - platform: state
    entity_id:
      - input_select.miele_status_select
    to: "OFF"
    from: 運転中
condition: []
action:
  - service: input_datetime.set_datetime
    target:
      entity_id: input_datetime.miele_last_finished_date_time
    data:
      timestamp: "{{ now().timestamp() }}"
mode: single

ダッシュボードに表示させる

LDKのニッチに設置してあるタブレットにHome Assistantのダッシュボードを表示しているので、ここに食洗機のステータスとOFFになった日時を表示させます。
運転中は「運転中」と表示させます。

ダッシュボードのカードの設定は以下のとおりです。(mashroom cardを使用してます)

type: custom:mushroom-template-card
primary: 食洗機
secondary: |-
  {% set state = states('input_select.miele_status_select') %} 
  {% if is_state('input_select.miele_status_select', 'OFF') %}
    {{states(entity)}} {{states('input_datetime.miele_last_finished_date_time').split('-')[1]}}/{{states('input_datetime.miele_last_finished_date_time').split('-')[2][:2]}} {{states('input_datetime.miele_last_finished_date_time').split(' ')[1][:-3]}} 完了
  {% else %}
    {{states(entity)}}
  {% endif %}
icon: mdi:dishwasher
entity: input_select.miele_status_select
tap_action:
  action: more-info
icon_color: |-
  {% if is_state('input_select.miele_status_select', '運転中') %}
    orange
  {% else %}
  {% endif %}

まとめ

今回はIoT非対応の食洗機の稼働状態を取得し、洗浄が終わった時間をHome Assistantのダッシュボードに表示するようにしてみました。
CTクランプセンサーを使って電流を取得するのはキャリブレーションに難があるもののセンサー自体に電流を流さなくても良いので、特に定格の大きい機器には安全性の面で使いやすいかなと思いました。いつかキャリブレーションをちゃんとできるようにして、冷蔵庫とか洗濯乾燥機なんかの消費電力を測定できるようにしたいですねぇ。
それでは。