配色:                          文字サイズ: 

wi-sunで消費電力取得 2/4

wi-sunを使って家の消費電力取得した時のログです。
2017年4月頃の内容になります。現在は、仕様が変わっているかもしれません。
ご参考までに。

前回のブログはこちら

さて、余ったUDG-1-WSNEをLinuxが動いているPCへ挿してみます。

[xxx@zeus log]# tail -f  messages
Sep 12 01:09:59 localhost kernel: usb 4-1: USB disconnect, device number
2
Sep 12 01:10:01 localhost kernel: usb 4-1: new full speed USB device number 5 using uhci_hcd
Sep 12 01:10:01 localhost kernel: usb 4-1: New USB device found, idVendor=0409, idProduct=04c7
Sep 12 01:10:01 localhost kernel: usb 4-1: New USB device strings: Mfr=1, Product=2, SerialNumber=0
Sep 12 01:10:01 localhost kernel: usb 4-1: Product: USB-UART LP
Sep 12 01:10:01 localhost kernel: usb 4-1: Manufacturer: Cypress Semiconductor
Sep 12 01:10:01 localhost kernel: usb 4-1: configuration #1 chosen from 1 choice
Sep 12 01:10:01 localhost kernel: cdc_acm 4-1:1.0: This device cannot do calls on its own. It is not a modem.
Sep 12 01:10:01 localhost kernel: cdc_acm 4-1:1.0: ttyACM0: USB ACM device

[xxx@zeus log]# lsusb
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 002 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 003 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 004 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 005 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 003 Device 002: ID 0d8c:013c C-Media Electronics, Inc. CM108 Audio Controller
Bus 004 Device 005: ID 0409:04c7 NEC Corp.
Bus 004 Device 004: ID 22ea:001e
Bus 005 Device 114: ID 0c45:7401 Microdia TEMPer Temperature Sensor

[xxx@zeus log]# lsusb -D /dev/bus/usb/004/005
Device: ID 0409:04c7 NEC Corp.
Device Descriptor:
  bLength                18
  bDescriptorType         1
  bcdUSB               2.00
  bDeviceClass            0 (Defined at Interface level)
  bDeviceSubClass         0
  bDeviceProtocol         0
  bMaxPacketSize0         8
  idVendor           0x0409 NEC Corp.
  idProduct          0x04c7
  bcdDevice            0.00
  iManufacturer           1 Cypress Semiconductor
  iProduct                2 USB-UART LP
  iSerial                 0
  bNumConfigurations      1
  Configuration Descriptor:
    bLength                 9
    bDescriptorType         2
    wTotalLength           75
    bNumInterfaces          2
    bConfigurationValue     1
    iConfiguration          0
    bmAttributes         0xa0
      (Bus Powered)
      Remote Wakeup
    MaxPower              250mA
    Interface Association:
      bLength                 8
      bDescriptorType        11
      bFirstInterface         0
      bInterfaceCount         2
      bFunctionClass          2 Communications
      bFunctionSubClass       2 Abstract (modem)
      bFunctionProtocol       1 AT-commands (v.25ter)
      iFunction               0
    Interface Descriptor:
      bLength                 9
      bDescriptorType         4
      bInterfaceNumber        0
      bAlternateSetting       0
      bNumEndpoints           1
      bInterfaceClass         2 Communications
      bInterfaceSubClass      2 Abstract (modem)
      bInterfaceProtocol      1 AT-commands (v.25ter)
      iInterface              0
      CDC Header:
        bcdCDC               1.10
      CDC ACM:
        bmCapabilities       0x02
          line coding and serial state
      CDC Union:
        bMasterInterface        0
        bSlaveInterface         1
      CDC Call Management:
        bmCapabilities       0x00
        bDataInterface          1
      Endpoint Descriptor:
        bLength                 7
        bDescriptorType         5
        bEndpointAddress     0x83  EP 3 IN
        bmAttributes            3
          Transfer Type            Interrupt
          Synch Type               None
          Usage Type               Data
        wMaxPacketSize     0x0040  1x 64 bytes
        bInterval              10
    Interface Descriptor:
      bLength                 9
      bDescriptorType         4
      bInterfaceNumber        1
      bAlternateSetting       0
      bNumEndpoints           2
      bInterfaceClass        10 CDC Data
      bInterfaceSubClass      0 Unused
      bInterfaceProtocol      0
      iInterface              0
      Endpoint Descriptor:
        bLength                 7
        bDescriptorType         5
        bEndpointAddress     0x01  EP 1 OUT
        bmAttributes            2
          Transfer Type            Bulk
          Synch Type               None
          Usage Type               Data
        wMaxPacketSize     0x0040  1x 64 bytes
        bInterval               0
      Endpoint Descriptor:
        bLength                 7
        bDescriptorType         5
        bEndpointAddress     0x82  EP 2 IN
        bmAttributes            2
          Transfer Type            Bulk
          Synch Type               None
          Usage Type               Data
        wMaxPacketSize     0x0040  1x 64 bytes
        bInterval               0
Device Status:     0x0000
  (Bus Powered)

特に別途ドライバの追加の必要もなく、認識しているようです。

データを取得するスクリプトは、こちらのサイトのbp35a1.pyを参考にさせていただきました。
コードはこちらのサイトを参照してください。

159行目にファイルへのログ書き出しを追加してあります。

f = open('/tmp/power_tmp.txt', 'w')
f.write("{0}".format(intPower))
f.close()

ファイル名を、wi-sun.py 変え、supervisorを使ってデーモン化しました。

自動起動、プロセスが死んだら再起動、ログの出力を指定しています。

[xxx@zeus wi-sun]# vi /etc/supervisord.conf
[program:wi-sun]
command=/usr/bin/python /xxx/script/wi-sun/wi-sun.py            ; the program (relative uses PATH, can take args)
autostart=true              ; start at supervisord start (default: true)
autorestart=true            ; retstart at unexpected quit (default: true)
startsecs=10                ; number of secs prog must stay running (def. 10)
startretries=3              ; max # of serial start failures (default 3)
logfile=/var/log/wi-sun.log    ; child log path, use NONE for none; default AUTO
logfile_maxbytes=1MB        ; max # logfile bytes b4 rotation (default 50MB)

しばらく運用していましたが、非常に不安定です。
2,3日経つとなぜかプロセスが死んでいます。再起動を試みたログもありますが、失敗しています。

Traceback (most recent call last):
  File "/xxx/script/wi-sun/wi-sun.py", line 126, in <module>
    line = ser.readline()         
  File "/usr/local/lib/python2.7/site-packages/serial/serialposix.py", line 501, in read
    'device reports readiness to read but returned no data '
serial.serialutil.SerialException: device reports readiness to read but returned no data (device disconnected or multiple access on port?)

スマートメータとのキーの更新に失敗などいろいろ情報がありますが、
私環境では、はっきりとした原因は特定できませんでした。

こういったときは デバイスの再起動です。
PCを再起動すると他のサービスの影響するので、ここは少しスマートにUSBポートを再起動です。

チェックはアナログな方法、現在の消費電力が1分前、2分前と同じであれば止まっていると判断してドングルが刺さっているUSBポートを再起動です。

[xxx@zeus wi-sun]# vi p_check.sh
#!/bin/bash

current=`cat /tmp/power_tmp.txt`
before=`cat /tmp/power_tmp_p.txt`
bbefore=`cat /tmp/power_tmp_pp.txt`

echo $current
echo $before
echo $bbefore

if [ $current = $before ] && [ $current = $bbefore ]; then
        echo -n "4-1" > /sys/bus/usb/drivers/usb/unbind
        sleep 1s
        echo -n "4-1" > /sys/bus/usb/drivers/usb/bind
        sleep 1s
        /xxx/script/wi-sun/wi-sun.py &
        DATE=`date '+%Y-%m-%d %H:%M:%S'`
        echo "$DATE restart " >> /xxx/script/wi-sun/log.txt
else
        cat /tmp/power_tmp_p.txt > /tmp/power_tmp_pp.txt
        cat /tmp/power_tmp.txt > /tmp/power_tmp_p.txt
fi

一分おきに実行

[xxx@zeus wi-sun]# crontab -l
#min hour day month day command
*/1 * * * * /xxx/script/wi-sun/p_check.sh

ログから、ほぼ毎日強制再起動されているのが分かりますが、

[xxx@zeus wi-sun]# tail -f  log.txt
2018-09-12 15:19:03 restart
2018-09-12 22:13:04 restart
2018-09-13 03:31:03 restart
2018-09-13 03:32:03 restart
2018-09-13 03:33:03 restart
2018-09-13 03:34:03 restart
2018-09-13 11:06:04 restart
2018-09-13 12:42:03 restart
2018-09-13 12:43:03 restart
2018-09-14 01:54:03 restart

グラフに影響もなさそうですので、このまま進めます。

次回は、Muninでグラフ作成です。