-- How to use OMRON UPS on OpenBSD/NetBSD --
OpenBSDマシンに、USB接続のオムロン製UPSを接続して、自動シャットダウンできるように設定する方法のメモです。 NetBSDでもUPSと通信できることは確認しましたので、同様に設定できると思います。
- OpenBSD/amd64 6.3
- NetBSD/i386 6.1.2 on VMware Player
- OMRON UPS BY35S
(更新:OpenBSD/amd64 6.7 & NUT-2.7.4でも動作確認済みです)
以下、OpenBSD/NetBSDマシンをBSDホスト、OMRON UPS BY35SをBY35Sと記載します。
UPSの出力コンセントにBSDホストの電源プラグを接続するだけで、瞬間の停電には対応できますが、自動シャットダウンを行うには、別途制御ソフトが必要です。 今回はLinuxでオムロン製UPSとの接続実績があるNetwork UPS Tools(NUT) http://www.networkupstools.org/ を使いました。
NUTを使うためには、BY35Sがugen(4)として認識される必要があります。
BY35S以外のオムロン製UPSを使う場合は、パッチを見ながら同様の設定を追加してください。
USB機器のProductID, VendorIDは、usbdevs -dvで見ることができます。 BY35Sは、VendorID=0x0590, ProductID=0x0080でしたので、パッチはその値で作成しています。
(注)BY35Sについてのパッチは2013/10/30にソースツリーへcommitされています。
カーネルソースを入手して、このパッチ https://gist.github.com/7164609
Index: sys/dev/usb/usb_quirks.c
===================================================================
RCS file: /cvs/src/sys/dev/usb/usb_quirks.c,v
retrieving revision 1.66
diff -u -r1.66 usb_quirks.c
--- sys/dev/usb/usb_quirks.c 31 Jan 2012 21:13:32 -0000 1.66
+++ sys/dev/usb/usb_quirks.c 26 Oct 2013 00:24:10 -0000
@@ -156,6 +156,7 @@
{ USB_VENDOR_MUSTEK2, USB_PRODUCT_MUSTEK2_PM800, ANY, { UQ_BAD_HID }},
{ USB_VENDOR_OMRON, USB_PRODUCT_OMRON_BX35F, ANY, { UQ_BAD_HID }},
{ USB_VENDOR_OMRON, USB_PRODUCT_OMRON_BX50F, ANY, { UQ_BAD_HID }},
+ { USB_VENDOR_OMRON, USB_PRODUCT_OMRON_BY35S, ANY, { UQ_BAD_HID }},
{ USB_VENDOR_TENX, USB_PRODUCT_TENX_MISSILE, ANY, { UQ_BAD_HID }},
{ USB_VENDOR_TERRATEC, USB_PRODUCT_TERRATEC_AUREON, ANY, { UQ_BAD_HID }},
{ USB_VENDOR_TI, USB_PRODUCT_TI_MSP430, ANY, { UQ_BAD_HID }},
Index: sys/dev/usb/usbdevs
===================================================================
RCS file: /cvs/src/sys/dev/usb/usbdevs,v
retrieving revision 1.596
diff -u -r1.596 usbdevs
--- sys/dev/usb/usbdevs 28 Jan 2013 12:01:22 -0000 1.596
+++ sys/dev/usb/usbdevs 26 Oct 2013 00:29:20 -0000
@@ -3055,6 +3055,7 @@
/* OMRON products */
product OMRON BX50F 0x0057 BX50F UPS
product OMRON BX35F 0x0058 BX35F UPS
+product OMRON BY35S 0x0080 BY35S UPS
/* OnSpec Electronic, Inc. */
product ONSPEC MD2 0x0103 disk
を適用し、src/sys/dev/usbディレクトリでmakeしてヘッダを更新します。 その後、カーネルを再構築し、そのカーネルで再起動します。
カーネルソースを入手して、このパッチ https://gist.github.com/7164611
Index: dev/usb/usb_quirks.c
===================================================================
RCS file: /cvsroot/src/sys/dev/usb/usb_quirks.c,v
retrieving revision 1.74
diff -u -r1.74 usb_quirks.c
--- dev/usb/usb_quirks.c 11 Feb 2012 05:27:23 -0000 1.74
+++ dev/usb/usb_quirks.c 23 Oct 2013 11:48:57 -0000
@@ -61,6 +61,7 @@
{ USB_VENDOR_MGE, USB_PRODUCT_MGE_UPS2, ANY, { UQ_HID_IGNORE }},
{ USB_VENDOR_MICROCHIP, USB_PRODUCT_MICROCHIP_PICKIT1,
ANY, { UQ_HID_IGNORE }},
+ { USB_VENDOR_OMRON, USB_PRODUCT_OMRON_BY35S, ANY, { UQ_HID_IGNORE }},
{ USB_VENDOR_TRIPPLITE2, USB_PRODUCT_TRIPPLITE2_UPS,
ANY, { UQ_HID_IGNORE }},
{ USB_VENDOR_MISC, USB_PRODUCT_MISC_WISPY_24X, ANY, { UQ_HID_IGNORE }},
Index: dev/usb/usbdevs
===================================================================
RCS file: /cvsroot/src/sys/dev/usb/usbdevs,v
retrieving revision 1.607.2.7
diff -u -r1.607.2.7 usbdevs
--- dev/usb/usbdevs 13 Feb 2013 01:36:17 -0000 1.607.2.7
+++ dev/usb/usbdevs 23 Oct 2013 11:48:58 -0000
@@ -191,6 +191,7 @@
vendor RATOC 0x0584 RATOC Systems
vendor ZYXEL 0x0586 ZyXEL Communication
vendor ALCOR 0x058f Alcor Micro
+vendor OMRON 0x0590 OMRON Corporation
vendor IOMEGA 0x059b Iomega
vendor ATREND 0x059c A-Trend Technology
vendor AID 0x059d Advanced Input Devices
@@ -2155,6 +2156,9 @@
product OMNIVISION OV511PLUS 0xa511 OV511+ Camera
product OMNIVISION2 PSEYE 0x2000 Sony PLAYSTATION(R) Eye
+/* OMRON products */
+product OMRON BY35S 0x0080 BY35S UPS
+
/* OnSpec Electronic, Inc. */
product ONSPEC MD2 0x0103 disk
product ONSPEC MDCFEB 0xa000 MDCFE-B USB CF Reader
を適用し、src/sys/dev/usbディレクトリで
make -f Makefile.usbdevs
してヘッダを更新します。 その後、カーネルを再構築し、そのカーネルで再起動します。
BY35SのUSBポートと、BSDホストをUSBケーブルで接続し、
ugen0 at uhub1 port 4 "OMRON BY35S" rev 1.10/1.08 addr 3
のように、ugen(4)デバイスとして認識されることを確認します。
LinuxではNUTに付属のblazer_usbドライバで通信できるのですが、OpenBSD/NetBSDではBY35Sからのデータを1回で読み込めないようでしたので、2回に分けて読み込むquick hackで対応しています。
OpenBSD portsの仕組みを使い、ports/sysutils/nutに追加パッチをあててコンパイルします。
具体的には、以下のパッチ https://gist.github.com/ao-kenji/11542fd9659339a0b5f491c4bfb7d118 を、ファイル名 patch-drivers_blazer_usb_c として /usr/ports/sysutils/nut/patches に置き、
# cd /usr/ports/sysutils/nut/patches
# make install
とします。
ports/sysutils/ups-nut-usbをpkgsrcの仕組みを使って「ソースから」コンパイルします。 その後、NUTのソースにこのパッチ https://gist.github.com/ao-kenji/11542fd9659339a0b5f491c4bfb7d118 をあてて、再度make && make installしてください。 ※ NUT 2.7.2用のパッチですが、2.7.3や2.7.4でもそのまま適用できます。
設定ファイルは、/etc/nut 以下にあります。
設定ファイルは、/usr/pkg/etc/nut 以下にあります。
ups.confを以下のように設定します。
[by35s]
driver = blazer_usb
port = auto
desc = "OMRON BY35S"
vendorid = 0590
productid = 0080
subdriver = ippon
なお、参考にしたWebページにも記載されているように、今回の設定ではNUT側で充電率が分かりません。
default.battery.voltage.high = xx.x
default.battery.voltage.low = yy.y
を追加すると、
upsc by35s battery.charge
で推定充電率が分かるようになります。私は、
default.battery.voltage.high = 13.6
default.battery.voltage.low = 11.0
としておきました。
なお、充電率を推定する上記の設定がなくても、BY35S自身はlow batteryを検出しますし、それを受けたNUTはシャットダウン動作に入ります。
NUTの各プログラムは、ユーザ_ups, グループ_upsで動きます。
NUTの各プログラムは、ユーザnut, グループnutで動きます。
NUTで必要なデバイス/dev/usb?および/dev/ugen?.??を、上記のユーザで読み書きできるよう、適切にパーミッションを設定します (dmesgやusbdev -dvで確認します)。
グループに読み書きのパーミッションをつけるのが良いと思います。
# /usr/local/bin/blazer_usb -DDDD -a by35s
# sudo /usr/pkg/bin/blazer_usb -DDDD -a by35s
上記の結果、
Network UPS Tools - Megatec/Q1 protocol USB driver 0.09 (2.6.5)
0.000000 debug level is '4'
0.147968 Checking device (10DE/0000) (000/001)
0.148313 - VendorID: 10de
0.148321 - ProductID: 0000
:
0.156130 Checking device (0590/0080) (001/003)
0.173950 - VendorID: 0590
0.174060 - ProductID: 0080
0.174067 - Manufacturer: OMRON
0.174073 - Product: BY35S
0.174079 - Serial Number: unknown
0.174084 - Bus: 001
0.174090 Trying to match device
0.174106 Device matches
0.177058 Trying megatec protocol...
0.180963 send: Q1
1.239577 read:(103.6 102.2 103.9 024 59.9 13.6 40.1 00101000
1.239793 Status read in 1 tries
1.239801 Supported UPS detected with megatec protocol
:
16.591937 send: Q1
17.648567 read:(104.0 102.2 104.1 027 60.0 13.6 40.1 00101000
18.601813 send: Q1
19.658444 read:(104.0 102.2 104.0 027 60.0 13.6 40.1 00101000
^C
と、'Q1'に対してこのような出力が得られていたらOKです。(Ctrl-Cで止めてください)
途中、対応していないプロトコルに対してエラーが出ますが、気にしないでください:-)
/usr/local/share/doc/pkg-readmes/nut-2.7.2p1を参考に、/etc/rc.conf.localに記述を追加します。
pkg_scripts="upsd upsmon"
upsd=""
upsmon=""
/usr/pkg/share/examples/rc.d/{ups,upsd,upsdriver,upsmon}を参考に設定をします。 /etc/rc.confの記述例
upsd=YES
upsdriver=YES
upsdriver_type="blazer_usb"
upsdriver_flags="-a by35s"
upsmon=YES
再起動して自動的にupsd,upsmonが起動することを確認します。
-
sunnyoneの開発日誌 - OMRON BY50SをUbuntu 11.04で使用する http://sunnyone41.blogspot.jp/2011/05/omron-by50subuntu-1104.html
-
sunnyoneの開発日誌 - OMRON BY50SをUbuntu 11.04で使用する(2) - チューニング http://sunnyone41.blogspot.jp/2011/05/omron-by50subuntu-11042.html
Kenji Aoyama / 青山 健治
ABSOLUTELY NO WARRANTY
2013/07 NUT-2.6.5ベースで初版作成
2014/11 OpenBSD 5.6 & NUT-2.7.2ベースに更新
2015/10 OpenBSD 5.8 & NUT-2.7.3で動作確認
2016/04 OpenBSD 5.9 & NUT-2.7.3で動作確認
2017/11 OpenBSD 6.2 & NUT-2.7.4で動作確認
2018/08 OpenBSD 6.3 & NUT-2.7.4で動作確認
2019/05 OpenBSD 6.5 & NUT-2.7.4で動作確認
2019/10 OpenBSD 6.6 & NUT-2.7.4で動作確認
2020/05 OpenBSD 6.7 & NUT-2.7.4で動作確認