Skip to content

Instantly share code, notes, and snippets.

@ao-kenji
Last active May 23, 2020 23:59
Show Gist options
  • Save ao-kenji/7164184 to your computer and use it in GitHub Desktop.
Save ao-kenji/7164184 to your computer and use it in GitHub Desktop.
How to use OMRON UPS on OpenBSD/NetBSD - USB接続のオムロン製UPSをOpenBSD/NetBSDで使うためのメモ。

オムロン製UPSをOpenBSD/NetBSDで使うためのメモ

-- How to use OMRON UPS on OpenBSD/NetBSD --

0.概要

OpenBSDマシンに、USB接続のオムロン製UPSを接続して、自動シャットダウンできるように設定する方法のメモです。 NetBSDでもUPSと通信できることは確認しましたので、同様に設定できると思います。

1. 検証に使用した機材

  • 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と記載します。

2. 設定

UPSの出力コンセントにBSDホストの電源プラグを接続するだけで、瞬間の停電には対応できますが、自動シャットダウンを行うには、別途制御ソフトが必要です。 今回はLinuxでオムロン製UPSとの接続実績があるNetwork UPS Tools(NUT) http://www.networkupstools.org/ を使いました。

2.1 カーネルの再構築

NUTを使うためには、BY35Sがugen(4)として認識される必要があります。

BY35S以外のオムロン製UPSを使う場合は、パッチを見ながら同様の設定を追加してください。

USB機器のProductID, VendorIDは、usbdevs -dvで見ることができます。 BY35Sは、VendorID=0x0590, ProductID=0x0080でしたので、パッチはその値で作成しています。

OpenBSD

(注)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してヘッダを更新します。 その後、カーネルを再構築し、そのカーネルで再起動します。

NetBSD

カーネルソースを入手して、このパッチ 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

してヘッダを更新します。 その後、カーネルを再構築し、そのカーネルで再起動します。

2.2 接続の確認

BY35SのUSBポートと、BSDホストをUSBケーブルで接続し、

ugen0 at uhub1 port 4 "OMRON BY35S" rev 1.10/1.08 addr 3

のように、ugen(4)デバイスとして認識されることを確認します。

2.3 NUTのインストール

LinuxではNUTに付属のblazer_usbドライバで通信できるのですが、OpenBSD/NetBSDではBY35Sからのデータを1回で読み込めないようでしたので、2回に分けて読み込むquick hackで対応しています。

OpenBSD

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

とします。

NetBSD

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でもそのまま適用できます。

2.4 NUTの設定

OpenBSD

設定ファイルは、/etc/nut 以下にあります。

NetBSD

設定ファイルは、/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はシャットダウン動作に入ります。

2.5 デバイスのパーミッション

OpenBSD

NUTの各プログラムは、ユーザ_ups, グループ_upsで動きます。

NetBSD

NUTの各プログラムは、ユーザnut, グループnutで動きます。

共通

NUTで必要なデバイス/dev/usb?および/dev/ugen?.??を、上記のユーザで読み書きできるよう、適切にパーミッションを設定します (dmesgやusbdev -dvで確認します)。

グループに読み書きのパーミッションをつけるのが良いと思います。

2.6 通信テスト

OpenBSD

# /usr/local/bin/blazer_usb -DDDD -a by35s

NetBSD

# 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で止めてください)

途中、対応していないプロトコルに対してエラーが出ますが、気にしないでください:-)

3. 起動

OpenBSD

/usr/local/share/doc/pkg-readmes/nut-2.7.2p1を参考に、/etc/rc.conf.localに記述を追加します。

pkg_scripts="upsd upsmon"
upsd=""
upsmon=""

NetBSD

/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が起動することを確認します。

4. 参考

5. 作者

Kenji Aoyama / 青山 健治

ABSOLUTELY NO WARRANTY

6. 履歴

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で動作確認

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment