RaspberryPi

[メモ] WebIOPiのRaspberryPi2 簡単対応 (GPIO Header 40pin)

More than 1 year has passed since last update.

Raspberry Pi Advent Calendar 2015 12月10日 tapun_nikkiさんの記事をたまたま見かけて、トライしてみました。

Raspberry Pi |【失敗記事】スマホからGPIOを制御してみたい!(WebIOPi)
http://www.tapun.net/raspi/raspberry-pi-webiopi-guide-failed


修正箇所

GPIO基本動作

軽く見たところ、修正箇所は2箇所

  • 1. RaspberryPiで実行されているかのチェック ("BCM2708"から、"BCM2709"へ変更)
WebIOPi-0.7.1/python/native/cpuinfo.c__40行目
        if (strcmp(hardware, "BCM2709") == 0)
  • 2. GPIOの処理 (ペリフェラルのベースアドレスを0x20000000から、0x3F000000へ変更)
WebIOPi-0.7.1/python/native/gpio.c__32行目
  #define BCM2708_PERI_BASE   0x3F000000

GPIO Header(/app/gpio-header)の40pin対応

  • 1. SoCのGPIOピン番号と、らずぱい基盤のピン番号のマッピング
    /proc/cpuinfoから、ボードのリビジョンを調べてるらしいが、[2]が使われてるので、こっちのみ変更。
WebIOPi-0.7.1/python/webiopi/utils/version.py
_MAPPING[2] = ["V33", "V50", 2, "V50", 3, "GND", 4, 14, "GND", 15, 17, 18, 27, "GND", 22, 23, "V33", 24, 10, "GND", 9, 25, 11, 8, "GND", 7, 0, 1, 5, "GND", 6, 12, 13, "GND", 19, 16, 26, 20, "GND", 21]
  • 2. 26 -> 40ピンのテーブル作成
WebIOPi-0.7.1/htdocs/webiopi.js__76行目と580行目
...
          this.PINS = Array(41);
...
          for (var pin=1; pin<=40; pin++) {
...

動作確認

  1. GPIO21(3番ピン)を、OUTにして、H/Lをテスタで。
    WebIOPi_RasPi2-1.png
  2. GPIO21(40番ピン)を、OUTにして、H/Lをテスタで。
    WebIOPi_RasPi2-2.png

修正をどうすすめていったか

修正手順

  1. 不具合/修正内容の確認
  2. 何が起きているか、想像する
  3. コード見る、ググる、直す(壊す?)、試す
  4. 2-3を繰りかえす。
  5. 手順の整理(と報告)

1. 不具合/修正内容の確認

  • a) らずぱい1で動いてるのに、らずぱい2だと動かない.
  • b) WebUIの GPIO Headerを26から40ピンにしたい.

2 何が起きているか、想像する

  • a) らずぱい1と2の違い?=>ハードウェアの変更あり? => OS経由じゃなくて、HWを直接たたいてる部分があるんじゃない??
  • b) htmlとか、jsとかでごにょごにょしてる... それ以上こまかいことは想像できない.. コードをみてから考える。

3 コード見る、ググる、直す(壊す?)、試す

a) らずぱい1=> らずぱい2でのHW, GPIOの対応

Raspberry Pi B+ までの Peripherals Base Address は 0x20000000 でしたが、Raspberry Pi2 B では 0x3F000000 に変更されています。

  • 2. とりあえず、20000000でgrep。
pi@rasp4 ~/dev/WebIOPi-0.7.1 $ grep 20000000 *
grep: doc: Is a directory
grep: examples: Is a directory
grep: htdocs: Is a directory
grep: java: Is a directory
grep: midori: Is a directory
grep: python: Is a directory
grep: tutorials: Is a directory
pi@rasp4 ~/dev/WebIOPi-0.7.1 $ grep 20000000 */*
grep: examples/clients: Is a directory
grep: examples/magpi-cambot: Is a directory
grep: examples/scripts: Is a directory
grep: htdocs/app: Is a directory
grep: java/client: Is a directory
grep: python/native: Is a directory
grep: python/webiopi: Is a directory
grep: tutorials/1.basis: Is a directory
grep: tutorials/2.macros: Is a directory
grep: tutorials/3.devices: Is a directory
grep: tutorials/4.serial-streaming: Is a directory
grep: tutorials/5.serial-command: Is a directory
pi@rasp4 ~/dev/WebIOPi-0.7.1 $ grep 20000000 */*/*
grep: examples/scripts/basic: Is a directory
grep: examples/scripts/blink: Is a directory
grep: examples/scripts/macros: Is a directory
grep: examples/scripts/simple: Is a directory
grep: htdocs/app/devices-monitor: Is a directory
grep: htdocs/app/gpio-header: Is a directory
grep: htdocs/app/gpio-list: Is a directory
grep: htdocs/app/serial-monitor: Is a directory
grep: java/client/src: Is a directory
python/native/gpio.c:#define BCM2708_PERI_BASE   0x20000000
grep: python/webiopi/clients: Is a directory
grep: python/webiopi/decorators: Is a directory
grep: python/webiopi/devices: Is a directory
grep: python/webiopi/protocols: Is a directory
grep: python/webiopi/server: Is a directory
grep: python/webiopi/utils: Is a directory
  • 3 python/native/gpio.c:#define BCM2708_PERI_BASE 0x20000000
    ここを 0x3F000000 に変えれば、うごくんじゃね?
    $ ./setup.sh skip-apt

    • => 結果は、、、、これだけでは動きません。むむむ
  • 4 コマンドライン起動ができるっぽいので $ sudo webiopi -d で起動して、テストしてみて、デバッグ情報を見てみる。
    WindowsのFirefoxから、http://rpi_ip_address:8000/ にアクセス、ここまでは、OK.
    で、GPIO Headerをクリックしてすすむと.. Exception?!

    global name 'GPIO' is not defined

...
2015-12-18 11:11:12 - HTTP - DEBUG - "GET /app/gpio-header HTTP/1.1" - 200 OK (Client: 10.10.1.113 <Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:43.0) Gecko/20100101 Firefox/43.0>)
2015-12-18 11:11:13 - HTTP - DEBUG - "GET /webiopi.js HTTP/1.1" - 200 OK (Client: 10.10.1.113 <Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:43.0) Gecko/20100101 Firefox/43.0>)
2015-12-18 11:11:13 - HTTP - DEBUG - "GET /jquery.js HTTP/1.1" - 200 OK (Client: 10.10.1.113 <Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:43.0) Gecko/20100101 Firefox/43.0>)
2015-12-18 11:11:13 - HTTP - DEBUG - "GET /webiopi.css HTTP/1.1" - 200 OK (Client: 10.10.1.113 <Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:43.0) Gecko/20100101 Firefox/43.0>)
2015-12-18 11:11:13 - HTTP - DEBUG - "GET /map HTTP/1.1" - 200 OK (Client: 10.10.1.113 <Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:43.0) Gecko/20100101 Firefox/43.0>)
----------------------------------------
Exception happened during processing of request from ('10.10.1.113', 50120)
Traceback (most recent call last):
  File "/usr/local/lib/python3.2/dist-packages/WebIOPi-0.7.1-py3.2-linux-armv7l.egg/webiopi/protocols/http.py", line 238, in processRequest
    result = self.server.handler.do_GET(relativePath, compact)
  File "/usr/local/lib/python3.2/dist-packages/WebIOPi-0.7.1-py3.2-linux-armv7l.egg/webiopi/protocols/rest.py", line 147, in do_GET
    return (200, self.getJSON(compact), M_JSON)
  File "/usr/local/lib/python3.2/dist-packages/WebIOPi-0.7.1-py3.2-linux-armv7l.egg/webiopi/protocols/rest.py", line 245, in getJSON
    gpios[gpio][f] = GPIO.getFunctionString(gpio)
NameError: global name 'GPIO' is not defined

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/usr/lib/python3.2/socketserver.py", line 295, in _handle_request_noblock
    self.process_request(request, client_address)
  File "/usr/lib/python3.2/socketserver.py", line 321, in process_request
    self.finish_request(request, client_address)
  File "/usr/lib/python3.2/socketserver.py", line 334, in finish_request
    self.RequestHandlerClass(request, client_address, self)
  File "/usr/lib/python3.2/socketserver.py", line 648, in __init__
    self.handle()
  File "/usr/lib/python3.2/http/server.py", line 396, in handle
    self.handle_one_request()
  File "/usr/lib/python3.2/http/server.py", line 384, in handle_one_request
    method()
  File "/usr/local/lib/python3.2/dist-packages/WebIOPi-0.7.1-py3.2-linux-armv7l.egg/webiopi/protocols/http.py", line 267, in do_GET
    self.processRequest()
  File "/usr/local/lib/python3.2/dist-packages/WebIOPi-0.7.1-py3.2-linux-armv7l.egg/webiopi/protocols/http.py", line 258, in processRequest
    except (GPIO.InvalidDirectionException, GPIO.InvalidChannelException, GPIO.SetupException) as e:
NameError: global name 'GPIO' is not defined
----------------------------------------
2015-12-18 11:11:13 - HTTP - DEBUG - "GET /version HTTP/1.1" - 200 OK (Client: 10.10.1.113 <Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:43.0) Gecko/20100101 Firefox/43.0>)
----------------------------------------
Exception happened during processing of request from ('10.10.1.113', 50122)
Traceback (most recent call last):
  File "/usr/local/lib/python3.2/dist-packages/WebIOPi-0.7.1-py3.2-linux-armv7l.egg/webiopi/protocols/http.py", line 238, in processRequest
    result = self.server.handler.do_GET(relativePath, compact)
  File "/usr/local/lib/python3.2/dist-packages/WebIOPi-0.7.1-py3.2-linux-armv7l.egg/webiopi/protocols/rest.py", line 147, in do_GET
    return (200, self.getJSON(compact), M_JSON)
  File "/usr/local/lib/python3.2/dist-packages/WebIOPi-0.7.1-py3.2-linux-armv7l.egg/webiopi/protocols/rest.py", line 245, in getJSON
    gpios[gpio][f] = GPIO.getFunctionString(gpio)
NameError: global name 'GPIO' is not defined
...
...
繰り返し
  • 5 GPIOが定義されていないとwebiopi/protocols/rest.pyがいっている. => GPIOgrep
pi@atrasp4:~/dev/WebIOPi-0.7.1$ find . | grep rest.py
./python/webiopi/decorators/rest.py
./python/webiopi/protocols/rest.py
./python/build/lib.linux-armv7l-3.2/webiopi/decorators/rest.py
./python/build/lib.linux-armv7l-3.2/webiopi/protocols/rest.py
./python/build/lib.linux-armv7l-2.7/webiopi/decorators/rest.py
./python/build/lib.linux-armv7l-2.7/webiopi/protocols/rest.py
pi@atrasp4:~/dev/WebIOPi-0.7.1$ grep -n GPIO ./python/webiopi/protocols/rest.py
24:    import _webiopi.GPIO as GPIO
164:        # Single GPIO getter
165:        elif relativePath.startswith("GPIO/"):
183:        if relativePath.startswith("GPIO/"):
238:            export = range(GPIO.GPIO_COUNT)
243:                gpios[gpio][f] = GPIO.getFunction(gpio)
245:                gpios[gpio][f] = GPIO.getFunctionString(gpio)
246:            gpios[gpio][v] = int(GPIO.input(gpio))
248:            if GPIO.getFunction(gpio) == GPIO.PWM:
249:                (pwmType, value) = GPIO.getPulse(gpio).split(':')
252:        json['GPIO'] = gpios
pi@atrasp4:~/dev/WebIOPi-0.7.1$
  • import _webiopi.GPIO as GPIO というかたちでimportしている。
    => その周辺を見てみる
  • pi@atrasp4:~/dev/WebIOPi-0.7.1$ cat -n python/webiopi/protocols/rest.py | less で、_webiopi.GPIOを検索。/_webiopi.GPIO[Enter]
    23  try:
    24      import _webiopi.GPIO as GPIO
    25  except:
    26      pass

=> importをtryして、失敗しても、スルー?ってことか? import _webiopi.GPIOが失敗する場合もある?

  • _webiopi.GPIOでgrep.
pi@atrasp4:~/dev/WebIOPi-0.7.1/python$ grep -n _webiopi.GPIO *
grep: build: Is a directory
grep: dist: Is a directory
grep: native: Is a directory
setup.py:36:      ext_modules      = [Extension('_webiopi.GPIO', ['native/bridge.c', 'native/gpio.c', 'native/cpuinfo.c'])],
grep: webiopi: Is a directory
grep: WebIOPi.egg-info: Is a directory
pi@atrasp4:~/dev/WebIOPi-0.7.1/python$ grep -n _webiopi.GPIO */*
grep: build/bdist.linux-armv7l: Is a directory
grep: build/lib.linux-armv7l-2.7: Is a directory
grep: build/lib.linux-armv7l-3.2: Is a directory
grep: build/temp.linux-armv7l-2.7: Is a directory
grep: build/temp.linux-armv7l-3.2: Is a directory
Binary file dist/WebIOPi-0.7.1-py2.7-linux-armv7l.egg matches
Binary file dist/WebIOPi-0.7.1-py3.2-linux-armv7l.egg matches
native/bridge.c:607:    "_webiopi.GPIO", /* name of module */
native/bridge.c:628:    if ((module = Py_InitModule("_webiopi.GPIO", python_methods)) == NULL)
native/bridge.c:632:    _SetupException = PyErr_NewException("_webiopi.GPIO.SetupException", NULL, NULL);
native/bridge.c:635:    _InvalidDirectionException = PyErr_NewException("_webiopi.GPIO.InvalidDirectionException", NULL, NULL);
native/bridge.c:638:    _InvalidChannelException = PyErr_NewException("_webiopi.GPIO.InvalidChannelException", NULL, NULL);
native/bridge.c:641:    _InvalidPullException = PyErr_NewException("_webiopi.GPIO.InvalidPullException", NULL, NULL);
grep: webiopi/clients: Is a directory
grep: webiopi/decorators: Is a directory
grep: webiopi/devices: Is a directory
webiopi/__init__.py:29:    import _webiopi.GPIO as GPIO
grep: webiopi/protocols: Is a directory
grep: webiopi/server: Is a directory
grep: webiopi/utils: Is a directory
pi@atrasp4:~/dev/WebIOPi-0.7.1/python$
  • native/bridge.c:607: "_webiopi.GPIO", /* name of module */
    こいつ(native/bridge.c)が、pythonCとやり取りするファイル?こいつがimport時に失敗させたりしてる? => 眺める... detect board revision というコメントが...
WebIOPi-0.7.1/python/native/bridge.c
   689          // detect board revision and set up accordingly
   690          revision = get_rpi_revision();
   691          if (revision == -1)
   692          {
   693                  PyErr_SetString(_SetupException, "This module can only b
e run on a Raspberry Pi!");
   694  #if PY_MAJOR_VERSION > 2
   695                  return NULL;
   696  #else
   697                  return;
   698  #endif
   699          }
   700
   701          _board_revision = Py_BuildValue("i", revision);
   702          PyModule_AddObject(module, "BOARD_REVISION", _board_revision);

=> get_rpi_revision()というので、らずぱいから実行されているか、チェックしている! そのあと、BOARD_REVISIONもセットしている(?)

  • get_rpi_revisionをgrep.
pi@atrasp4 ~/dev/WebIOPi-0.7.1/python/native $ grep get_rpi_revision *
bridge.c:       revision = get_rpi_revision();
cpuinfo.c:int get_rpi_revision(void)
cpuinfo.h:int get_rpi_revision(void);
pi@atrasp4 ~/dev/WebIOPi-0.7.1/python/native $
  • cpuinfo.c をながめると、 /proc/cpuinfoを開いて、Hardware :なんちゃらのとこで、BCM2708という文字列と比較している。
pi@atrasp4 ~/dev/WebIOPi-0.7.1/python/native $ cat /proc/cpuinfo | grep Hardware
Hardware        : BCM2709

=> らずぱい2では、 BCM2709とでる。.. ここを書き換える。

  • 修正して、セットアップsudo ./setup.sh skip-apt、実行 sudo webiopi -dで、ブラウザからアクセス。
    => うごいたっぽい。

b) WebUIの GPIO Headerを26から40ピンにしたい.

  • 1 ブラウザ(Firefox)で、開いて、htmlのソース見る.
WebIOPi-0.7.1/htdocs/app/gpio-header/index.html
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <meta name="viewport" content = "width = 420, user-scalable = no" />
        <title>WebIOPi | GPIO Header</title>
        <script type="text/javascript" src="/webiopi.js"></script>
        <script type="text/javascript">
        webiopi().ready(function() {
                webiopi().RPiHeader().createTable("content");
                w().refreshGPIO(true);
        });
        </script>
</head>
<body>
<div id="content" align="center"></div>
</body>
</html>

=> src="/webiopi.js"が、本体っぽい..

  • webiopi().RPiHeader().createTable("content");
    => createTableってので、<div id="content"...>のとこに、26ピンの図を作ってる?

  • webiopi.jsをみてみる. pi@atrasp4 ~/dev/WebIOPi-0.7.1/htdocs $ cat -n webiopi.js | lessで、/を押して、createTable[Enter]

WebIOPi-0.7.1/htdocs/webiopi.js
   577  RPiHeader.prototype.createTable = function (containerId) {
   578          var table = $("<table>");
   579          table.attr("id", "RPiHeader")
   580          for (var pin=1; pin<=26; pin++) {
   581                  var line =      $('<tr>');
   582                  line.append(this.getFunctionCell(pin))
   583                  line.append(this.getDescriptionCell(pin, "right"))
   584                  line.append(this.getPinCell(pin));
   585
   586                  pin++;
   587                  line.append(this.getPinCell(pin));
   588                  line.append(this.getDescriptionCell(pin, "left"))
   589                  line.append(this.getFunctionCell(pin))
   590
   591                  table.append(line);
   592          }
         ...

=> なんかそれっぽ処理。
- 2640へ変更して、http://rpi_ip_addr:8000/app/gpio-headerへ。

=> なんもうつらなくなった。。

  • 2 (Firefoxなので)FireBugで、見てみる。 [F12]をおして、FireBugをひらいて、gpio-headerへアクセス。 => なんかエラーでてる WebIOPi_RasPi2-3.png
  • http://rpi_ip_addr:8000/mapへアクセス後、
TypeError: w(...).PINS[pin] is undefined

if (w().PINS[pin].type.value == w().TYPE.GPIO.value) {

というエラー。PINSをgrep

WebIOPi-0.7.1/htdocs/webiopi.js
    75          this.GPIO = Array(54);
    76          this.PINS = Array(27);

=> 27 = 26pin+1??なら、40pin+1 => 41だろ?!

  • ここを直しても、同じエラー。 => xxx:8000/map でかえってくるのが、26個分のピンのマップしかない?ここを対応させよう。
  • とりあえず、grepしてみるか...
pi@atrasp4 ~/dev/WebIOPi-0.7.1 $ grep '"V33", "V50", 2, "V50", 3' */*/*/*
grep: java/client/src/com: Is a directory
grep: java/client/src/org: Is a directory
grep: python/build/lib.linux-armv7l-2.7/webiopi: Is a directory
grep: python/build/lib.linux-armv7l-2.7/_webiopi: Is a directory
grep: python/build/lib.linux-armv7l-3.2/webiopi: Is a directory
grep: python/build/lib.linux-armv7l-3.2/_webiopi: Is a directory
grep: python/build/temp.linux-armv7l-2.7/native: Is a directory
grep: python/build/temp.linux-armv7l-3.2/native: Is a directory
grep: python/webiopi/devices/analog: Is a directory
grep: python/webiopi/devices/digital: Is a directory
grep: python/webiopi/devices/sensor: Is a directory
grep: python/webiopi/devices/shield: Is a directory
python/webiopi/utils/version.py:_MAPPING[2] = ["V33", "V50", 2, "V50", 3, "GND", 4, 14, "GND", 15, 17, 18, 27, "GND", 22, 23, "V33", 24, 10, "GND", 9, 25, 11, 8, "GND", 7]
  • python/webiopi/utils/version.py:_MAPPING[2] = ["V33", "V50", 2, "V50", 3, "GND", 4, 14, "GND", 15, 17, 18, 27, "GND", 22, 23, "V33", 24, 10, "GND", 9, 25, 11, 8, "GND", 7]
    => ググって、40pin用のマップをてきとうに作成...
    _MAPPING[2] = ["V33", "V50", 2, "V50", 3, "GND", 4, 14, "GND", 15, 17, 18, 27, "GND", 22, 23, "V33", 24, 10, "GND", 9, 25, 11, 8, "GND", 7, 0, 1, 5, "GND", 6, 12, 13, "GND", 19, 16, 26, 20, "GND", 21]

=> うごいたっぽい..


その他

  • 1. $ ./setup.sh skip-apt とすると、apt-get updateが実行されない。(ちょいちょい変更して試す場合など)
  • 2. http://raspberrypi.local:8000/map
["V33", "V50", 2, "V50", 3, "GND", 4, 14, "GND", 15, 17, 18, 27, "GND", 22, 23, "V33", 24, 10, "GND", 9, 25, 11, 8, "GND", 7, 0, 1, 5, "GND", 6, 12, 13, "GND", 19, 16, 26, 20, "GND", 21]
  • 3. http://raspberrypi.local:8000/GPIO/*
{"0": {"function": "IN", "value": 1}, "1": {"function": "IN", "value": 1}, "2": {"function": "IN", "value": 1}, "3": {"function": "IN", "value": 1}, "4": {"function": "IN", "value": 1}, "5": {"function": "IN", "value": 1}, "6": {"function": "IN", "value": 1}, "7": {"function": "IN", "value": 1}, "8": {"function": "IN", "value": 0}, "9": {"function": "IN", "value": 0}, "10": {"function": "IN", "value": 0}, "11": {"function": "IN", "value": 0}, "12": {"function": "IN", "value": 0}, "13": {"function": "IN", "value": 0}, "14": {"function": "ALT0", "value": 0}, "15": {"function": "ALT0", "value": 1}, "16": {"function": "IN", "value": 0}, "17": {"function": "IN", "value": 0}, "18": {"function": "IN", "value": 0}, "19": {"function": "IN", "value": 0}, "20": {"function": "IN", "value": 0}, "21": {"function": "OUT", "value": 1}, "22": {"function": "IN", "value": 0}, "23": {"function": "IN", "value": 0}, "24": {"function": "IN", "value": 0}, "25": {"function": "IN", "value": 0}, "26": {"function": "IN", "value": 0}, "27": {"function": "OUT", "value": 0}, "28": {"function": "IN", "value": 1}, "29": {"function": "IN", "value": 1}, "30": {"function": "IN", "value": 0}, "31": {"function": "OUT", "value": 1}, "32": {"function": "OUT", "value": 0}, "33": {"function": "IN", "value": 0}, "34": {"function": "IN", "value": 1}, "35": {"function": "IN", "value": 1}, "36": {"function": "IN", "value": 1}, "37": {"function": "IN", "value": 0}, "38": {"function": "OUT", "value": 0}, "39": {"function": "IN", "value": 0}, "40": {"function": "ALT0", "value": 0}, "41": {"function": "OUT", "value": 0}, "42": {"function": "IN", "value": 1}, "43": {"function": "IN", "value": 1}, "44": {"function": "ALT0", "value": 1}, "45": {"function": "ALT0", "value": 0}, "46": {"function": "IN", "value": 1}, "47": {"function": "OUT", "value": 0}, "48": {"function": "ALT0", "value": 0}, "49": {"function": "ALT0", "value": 1}, "50": {"function": "ALT0", "value": 1}, "51": {"function": "ALT0", "value": 1}, "52": {"function": "ALT0", "value": 1}, "53": {"function": "ALT0", "value": 1}}
  • 4. $ sudo webiopi -dで、デバッグ情報がみれる。
$ sudo webiopi -d
2015-12-dd hh:mm:39 - WebIOPi - INFO - Starting WebIOPi/0.7.1/Python3.2
2015-12-dd hh:mm:39 - WebIOPi - DEBUG - Mapping GPIO.digitalCount to REST GET /GPIO/count
2015-12-dd hh:mm:39 - WebIOPi - DEBUG - Mapping GPIO.digitalRead to REST GET /GPIO/%(channel)d/value
2015-12-dd hh:mm:39 - WebIOPi - DEBUG - Mapping GPIO.digitalWrite to REST POST /GPIO/%(channel)d/value/%(value)d
2015-12-dd hh:mm:39 - WebIOPi - DEBUG - Mapping GPIO.getFunctionString to REST GET /GPIO/%(channel)d/function
2015-12-dd hh:mm:39 - WebIOPi - DEBUG - Mapping GPIO.getPulse to REST GET /GPIO/%(channel)d/pulse
2015-12-dd hh:mm:39 - WebIOPi - DEBUG - Mapping GPIO.outputSequence to REST POST /GPIO/%(channel)d/sequence/%(args)s
2015-12-dd hh:mm:39 - WebIOPi - DEBUG - Mapping GPIO.portRead to REST GET /GPIO/*/integer
2015-12-dd hh:mm:39 - WebIOPi - DEBUG - Mapping GPIO.portWrite to REST POST /GPIO/*/integer/%(value)d
2015-12-dd hh:mm:39 - WebIOPi - DEBUG - Mapping GPIO.pulse to REST POST /GPIO/%(channel)d/pulse/
2015-12-dd hh:mm:39 - WebIOPi - DEBUG - Mapping GPIO.pulseAngle to REST POST /GPIO/%(channel)d/pulseAngle/%(value)f
2015-12-dd hh:mm:39 - WebIOPi - DEBUG - Mapping GPIO.pulseRatio to REST POST /GPIO/%(channel)d/pulseRatio/%(value)f
2015-12-dd hh:mm:39 - WebIOPi - DEBUG - Mapping GPIO.setFunctionString to REST POST /GPIO/%(channel)d/function/%(value)s
2015-12-dd hh:mm:39 - WebIOPi - DEBUG - Mapping GPIO.wildcard to REST GET /GPIO/*
2015-12-dd hh:mm:39 - WebIOPi - INFO - GPIO - Native mapped to REST API /GPIO
2015-12-dd hh:mm:39 - WebIOPi - WARNING - Access unprotected
2015-12-dd hh:mm:39 - WebIOPi - INFO - HTTP Server binded on http://10.10.1.93:8000/
2015-12-dd hh:mm:39 - WebIOPi - INFO - CoAP Server binded on coap://10.10.1.93:5683/
2015-12-dd hh:mm:39 - WebIOPi - INFO - CoAP Server binded on coap://224.0.1.123:5683/ (MULTICAST)
2015-12-dd hh:mm:40 - HTTP - DEBUG - "GET /* HTTP/1.1" - 200 OK (Client: 10.10.1.113 <Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:42.0) Gecko/20100101 Firefox/42.0>)
2015-12-dd hh:mm:40 - HTTP - DEBUG - "GET /* HTTP/1.1" - 200 OK (Client: 10.10.1.113 <Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:42.0) Gecko/20100101 Firefox/42.0>)
2015-12-dd hh:mm:40 - HTTP - DEBUG - "GET /* HTTP/1.1" - 200 OK (Client: 10.10.1.113 <Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:42.0) Gecko/20100101 Firefox/42.0>)
2015-12-dd hh:mm:41 - HTTP - DEBUG - "GET /* HTTP/1.1" - 200 OK (Client: 10.10.1.113 <Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:42.0) Gecko/20100101 Firefox/42.0>)
2015-12-dd hh:mm:42 - HTTP - DEBUG - "GET /* HTTP/1.1" - 200 OK (Client: 10.10.1.113 <Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:42.0) Gecko/20100101 Firefox/42.0>)
^C2015-12-dd hh:mm:42 - WebIOPi - INFO - Stopping...
2015-12-dd hh:mm:42 - WebIOPi - DEBUG - Closing device GPIO - GPIO
2015-12-dd hh:mm:42 - WebIOPi - INFO - CoAP Server stopped
2015-12-dd hh:mm:42 - WebIOPi - INFO - HTTP Server stopped