Welcome to telecotele.com » 丁寧な暮らし

丁寧なす暮らし

もう売っていないQNAP TS-231PというNASと、もう売っていないNetatmo Weather Stationと、もう売っていないNEC Multiwriter 5600Cを使う日記です。

tags: nas

NetatmoのデータをGrafanaで見る

以前からNetatmo Weather Stationという製品を用いてGrafanaで気象データを確認できるようにしていました。 これはNetatmoが提供するAPIから定期的にデータを取得しInfluxDBに投入して……としていたわけですが、そのAPIは(結構前に)変更されています。

それに追従せず放置していましたが、この度ちゃんと最新の仕様に合わせて復活させました(次図)。

Grafanaの画面 Grafanaの画面

気温と相対湿度から絶対湿度(容積絶対湿度)も計算し表示しています。 Netatmoのアプリだとこの辺は出てこないため自前でやる必要がありました。

以下からはこの取り組みに関連したメモを残します。

Netatmo API

Netatmo APIの認証方式が以前と変わっていました。 以前はClientの情報とNetatmoのユーザ情報 (ID, Password) を送信すれば使わせてくれましたが、いまでは後者は使えずOAuth 2.0での対応を求められます。

データを取ってきてInfluxDBに投げ込むだけの、自分ひとりだけが使うアプリでもやらないといけない……? と思ったら、開発者だけが使いたい場合はNetatmo connectのアプリ詳細画面からアクセスに必要なトークンを発行できるようです(次図)。

Token generator(Netatmo connect内) Token generator(Netatmo connect内)

本来は開発用途のような気がしますが、 たとえばlnetatmoのようなライブラリを使う場合、 こうして得られたトークンを~/.netatmo.credentialsに書けば済みます。

Netatmo屋外モジュールの電池について

Netatmoの屋外モジュールは単4電池2本で動きます。 ただ、この電池は消耗が結構激しいです。

なにか改善できないか?もしかしたら温度じゃない?ということで、リチウム乾電池(リチウムイオン電池ではなく)を使ってみることにしました。 これまで一般的なアルカリ乾電池を使ってみましたが、温度が5℃~45℃の範囲でないと性能が発揮できなくなるようです。 屋外設置ということを考えると、この範囲に収まらない可能性があります。

一方、リチウム乾電池の動作範囲温度は-40℃~60℃です。 地域にもよりますが、屋外設置でもこの範囲なら収まるでしょう。 リチウム乾電池は初期電圧が1.8Vと若干高めですが、Netatmoの屋外モジュールに入れてもいまのところ普通に使えていました。

なお、リチウム乾電池で有名なのはエナジャイザー社の製品のようです。 ただ、Panasonicが販売している若干安いリチウム乾電池がこれのOEM?らしくこちらを使っています。 若干安いとはいえ1本250円~300円程度と結構します。

と、ここまで書いて乾電池より充電池のエネループプロあたりの方が良い気がしてきました。 1本600円程度しますが、動作範囲は-20℃~50℃とこれもまぁ大丈夫であろうということで……エネループの電圧で本当に動くかは心配ですが、もしリチウム乾電池に不満があれば検討します。

QNAP Container Stationについて

前述のGrafanaやInfluxDB、Netatmo APIを叩いてInfluxDBに投げ込む部分はQNAP TS-231PというNASで動いています。 このNASにはContainer Stationという機能が存在します。 これはDocker Composeをラップして複雑にしたような機能で、Web UIからDocker Composeで使われる形式のYAMLを書くとコンテナが作成されます。

今回は、下記のような感じのYAMLを書きました。

version: '3'

networks:
  qnet-dhcp:
    driver: qnet
    driver_opts:
      iface: "eth0"
    ipam:
      driver: qnet
      options:
        iface: "eth0"

services:
  influxdb:
    image: influxdb:1.8.10
    ports:
      - 8086:8086
    volumes:
      - /share/xxx/influxdb:/var/lib/influxdb
    networks:
      - qnet-dhcp

  grafana:
    image: grafana/grafana:10.3.1
    ports:
      - 3000:3000
    volumes:
      - /share/xxx/grafana:/var/lib/grafana
      - /share/xxx/xxx/grafana/grafana/grafana.ini:/etc/grafana/grafana.ini
    mac_address: xx:xx:xx:xx:xx:xx
    networks:
      - qnet-dhcp

  netatmo:
    image: lrks/netatmo:20240205-1818
    volumes:
      - /share/xxx/netatmo/credentials:/root/.netatmo.credentials
    environment:
      - INFLUXDB_HOST=influxdb
      - INFLUXDB_DBNAME=netatmo20240205
    networks:
      - qnet-dhcp

grafanaは名前のとおりGrafanaのWeb UI、 influxdbはこれも名前のとおりInfluxDB、 netatmo(NAS上でdocker build済みのimageを使う)は定期的にNetatmo APIを叩いてInfluxDBに投げ込むプログラムが動いています。

このアプリ内で通信したいとき、例えばgrafanainfluxdbにアクセスする際やnetatmoinfluxdbにデータを投げ込むときなどは、名前解決があるので各コンテナのIPアドレスは意識する必要はありません。 ただ、GrafanaのWeb UIは外部からアクセスしたく、静的にIPアドレスを振りたいです。 Container Stationで静的なIPアドレスを振るのは苦労し、コンテナ内でAvahiを使うのもちょっと…… 最終的には「コンテナには静的なMACアドレスを振る」「IPアドレスはDHCPで振る」「外部のDHCPサーバで特定のMACアドレスに対応したIPアドレスを静的に決める」ことで対応しました。

プリントサーバーの用意

次の話です。 NEC Multiwriter 5600Cというプリンタを使っています。 このプリンタのインターフェースはUSBのみであり、ネットワークから印刷できるような機能はありません。

昔のQNAPファームウェアではこうしたUSBプリンタを接続しネットワーク上で共有できるような機能が備わっていましたが、最新バージョンでは機能自体が削除されています。

そこで、これと同等の機能を実現すべくContainer Station上でCUPSサーバを立てます。

まず、次に示すDockerfileを用意しました。

FROM ubuntu:22.04

RUN apt update && apt install -y cups
COPY cupsd.conf    /etc/cups/cupsd.conf
COPY printers.conf /etc/cups/printers.conf

# DEBUG
#RUN useradd -r -G lpadmin -M admin && echo admin:password | chpasswd

CMD ["/usr/sbin/cupsd", "-f"]

初期状態だとcupsd.confprinters.confは当然無いため、事前に

  1. (後述のdocker-compose.yamlで初回設定用コンテナを起動)
  2. CUPSの管理者用Web UIにアクセス(デバッグ用にuseraddしているadmin:passwordで入る)
  3. プリンタを手動で追加 → printers.confを保存
  4. 必要に応じてCUPS自体の設定も済ませる → cupsd.confを保存

という手順を踏んでいます。 なお、プリンタのドライバについてはRawRaw Queueを選びました。 クライアント (Windows/Mac) 側にのみNEC Multiwriter 5600Cのドライバを導入する構成としたためです。 (当初CUPS側にもドライバが必要と思い込み回り道しました。NEC Multiwriter 5600CのLinux向けドライバは無くOEM元のXerox Phaser 6000のドライバを使おうとする、しかしARM用のドライバが無い!使っているNASのCPUはARM!最終的にRaspberry Pi Forumsの情報をもとにInternet ArchiveからDell C1760NW用のドライバを導入すればテスト印刷も出来ることを確認しましたが、この辺でRaw Queueを使うだけで良かったことに気づきました)

imageの準備が済んだら、次に示すdocker-compose.yamlでコンテナを起動します。

version: '3'

networks:
  qnet-dhcp:
    driver: qnet
    driver_opts:
      iface: "eth0"
    ipam:
      driver: qnet
      options:
        iface: "eth0"

services:
  cups:
    image: lrks/cups:20240206-1838
    ports:
      - 631:631 
    volumes:
      - type: bind
        source: /dev/bus/usb
        target: /dev/bus/usb
    device_cgroup_rules:
      - 'a *:* mrw'
    mac_address: xx:xx:xx:xx:xx:xx
    networks:
      - qnet-dhcp

ここでも静的なIPアドレスを振るための設定を行っています。

また、device_cgroup_rulesの設定と、/dev/bus/usbをbind mountしています。 これはコンテナ内からUSBデバイスを扱うためのものですが、特に後者で(一般的なvolumeではなく)bind mountとしたのはUSBホットプラグに対応するためです。 volumeを使った場合はこのコンテナを起動する前に必ずUSBデバイスを接続する必要があります。 一方、bind mountだとその必要はなくコンテナ起動中にUSBデバイスを抜き差しするなども自由です。 (参考: Docker How to set up USB hotplug for a USB device | Technical Feeder

これでコンテナが起動したら、クライアント側でCUPSサーバのアドレスを指定してプリンタの追加を行えば良いです。 おわり。