現在KUROBOX/PROでDHCPサーバー等を動作させているため、KUROBOX/PROは常時電源が入っている。
暑いのでUSB扇風機を接続して放熱させている。
USBライト(LEDの発光は1W)が安く手に入るので常夜灯を点けようかともくろんでいるが、KUROBOX/PROのUSBポートの給電能力が心配なので、セルフパワーのUSB HUBを使ってみようと思った。
そこでエレコムのU2H-SW4SWHという「パソコンから各ポートの接続をON/OFFできる」USB HUBを入手した。
付属のソフトはWindows用のためKUROBOX/PROには使えない。
”U2H-SW4 制御ソフト”で検索し”節電USB・HUB(U2H-SW4)の制御ソフト |iteclubのブログ”に行ってみたら、WindowsとLinuxの制御ソフトが公開されていました。
ありがたく使わせてもらいます。
Windows版の方は動作しましたがLinux版の方はコンパイラが悪いのかうまく動作しませんでした。
いろいろと調べてみたら送受信データの先頭に1バイト足さないと動作しないようです。
とりあえず0x00を足してたらうまく動作した。(ソースの差分は本記事の下の方に載せます)
LinkStationではカーネル(?)が対応していない様なので動作しません。(誰か動かしてください)
制御ソフトでU2H-SW4SWHの1ポートの状態をoffに変更して、他のPCなどに接続すると1ポートの状態はoffのままでしたので、U2H-SW4SWH内のコントローラのフラッシュメモリに各ポートの状態を記憶するようです。
U2H-SW4Sと制御ソフトでかなり面白い事ができそうですね。
当面のお遊びは下記の事をやるでしょう。(やらないかも)
1.USB扇風機の電源制御(ON/OFF)を行う。(LinkStationではLinkStationのUSBポートの電源ON/OFF)
2.時間が来たらUSBライトを点灯または消灯する。(防犯対策の常夜灯かな)
3.サーバのバックアップ時にUSB HDDを組み込み、バックアップ完了後USB HDDを取り外す。(USB HDDを使う時だけUSB接続する)

制御ソフトの差分
diff moto/sw4ctrl.c sw4ctrl.c
28,29c28,29
< int nOutputBytes      = 8;
< int nInputBytes               = 8;
---
> int nOutputBytes      = 9;
> int nInputBytes               = 9;
78c78
<       unsigned char tmp[8];
---
>       unsigned char tmp[9];
91,93c91,94
<       tmp[0]  = 0x03;
<       tmp[1]  = 0x5D;
<       tmp[2]  = 0x00;
---
>       tmp[0]  = 0x00;
>       tmp[1]  = 0x03;
>       tmp[2]  = 0x5D;
>       tmp[3]  = 0x00;
96,99c97,100
<       case 0: tmp[3]  = 5;    break;
<       case 1: tmp[3]  = 2;    break;
<       case 2: tmp[3]  = 3;    break;
<       case 3: tmp[3]  = 4;    break;
---
>       case 0: tmp[4]  = 5;    break;
>       case 1: tmp[4]  = 2;    break;
>       case 2: tmp[4]  = 3;    break;
>       case 3: tmp[4]  = 4;    break;
103c104
<                       tmp[4]  = 0x01;
---
>                       tmp[5]  = 0x01;
107c108
<                       tmp[4]  = 0x00;
---
>                       tmp[5]  = 0x00;
109d109
<       tmp[5]  = 0x00;
111a112
>       tmp[8]  = 0x00;
113,114c114,115
<       ret = write(fd, tmp, 8);
<     if(ret != 8){
---
>       ret = write(fd, tmp, 9);
>     if(ret != 9){
132,133c133,134
<       unsigned char tmp[8];
<       unsigned char tmp2[8];
---
>       unsigned char tmp[9];
>       unsigned char tmp2[9];
148,151c149,152
<       tmp[0]  = 0x03;
<       tmp[1]  = 0x5D;
<       tmp[2]  = 0x02;
<       tmp[3]  = 0x00;
---
>       tmp[0]  = 0x00;
>       tmp[1]  = 0x03;
>       tmp[2]  = 0x5D;
>       tmp[3]  = 0x02;
155,157c156,159
<       tmp[7]  = 0x00;
<       ret = write(fd, tmp, 8);
<     if(ret != 8){
---
>       tmp[7]  = 0x00;
>       tmp[8]  = 0x00;
>       ret = write(fd, tmp, 9);
>     if(ret != 9){
175,176c177,178
<       ret = read(fd, tmp2, 8);
<     if(ret != 8){
---
>       ret = read(fd, tmp2, 9);
>     if(ret != 9){
181c183
<       if((tmp2[2] & 0xC3) != 0x03)
---
>       if((tmp2[3] & 0xC3) != 0x03)
183c185
<               fprintf(stderr,"ERROR: read() data fail. 0x%02X 0x%02X 0x%02X 0x%02X 0x%02X 0x%02X 0x%02X 0x%02X \n",
---
>               fprintf(stderr,"ERROR: read() data fail. 0x%02X 0x%02X 0x%02X 0x%02X 0x%02X 0x%02X 0x%02X 0x%02X 0x%02X \n",
191c193,194
<                       tmp2[7] & 0xFF);
---
>                       tmp2[7] & 0xFF,
>                       tmp2[8] & 0xFF);
196,199c199,202
<       if(tmp2[2] & 0x20){     res     |= 0x01;        }
<       if(tmp2[2] & 0x10){     res     |= 0x08;        }
<       if(tmp2[2] & 0x08){     res     |= 0x04;        }
<       if(tmp2[2] & 0x04){     res     |= 0x02;        }
---
>       if(tmp2[3] & 0x20){     res     |= 0x01;        }
>       if(tmp2[3] & 0x10){     res     |= 0x08;        }
>       if(tmp2[3] & 0x08){     res     |= 0x04;        }
>       if(tmp2[3] & 0x04){     res     |= 0x02;        }

私が個人的に調べたものであり、正確ではありません、私は保障しませんし責任も負いません、また動作保障もしません、ここにはメモとして残しているだけです。
このメモを見て何かやり装置が壊れたり不具合が発生しても、私は一切関知しません、あくまでも自己責任でやってください。