Translate

2019年11月28日木曜日

node環境でaws-iot-device-sdk-jsを使っていたら、Emitted 'error' event on DeviceClient instanceと出て落ちる件

node環境でaws-iot-device-sdk-jsをつかったexpressアプリを作って起動したら、

(env) foo@bar:~/tar $ node server.js
Node.js is listening to PORT:3000
connect
events.js:187
      throw er; // Unhandled 'error' event
      ^

Error: premature close
    at onclosenexttick (/home/pi/projects/donkey_agent_telemetry/node_modules/end-of-stream/index.js:54:86)
    at processTicksAndRejections (internal/process/task_queues.js:75:11)
Emitted 'error' event on DeviceClient instance at:
    at MqttClient. (/home/pi/projects/donkey_agent_telemetry/node_modules/aws-iot-device-sdk/device/index.js:772:15)
    at MqttClient.emit (events.js:215:7)
    at TLSSocket.f (/home/pi/projects/donkey_agent_telemetry/node_modules/once/once.js:25:25)
    at onclosenexttick (/home/pi/projects/donkey_agent_telemetry/node_modules/end-of-stream/index.js:54:73)
    at processTicksAndRejections (internal/process/task_queues.js:75:11)
(env) foo@bar:~/tar $


..というエラーがでた..

'error' イベントがemitされたらしいので

device.on('error', function() {
  console.log('error');
})

を使って例外を無視させようとしたけど、
同じエラーが発生..

どうもほかのイベントすべてを
うけとってやらないとエラーでnodeが落ちるらしい。

device.on('reconnect', function() {
  console.log('reconnect');
})

device.on('close', function() {
  console.log('close');
})

device.on('offline', function() {
  console.log('offline');
})

全部のイベントをうけとるようにしたら、
落ちなくなった...

それだけ。

2019年11月26日火曜日

一般ユーザで実行したら "/dev/uinput" cannot be opened for writing と出る件



    from evdev import uinput, UInput
    from evdev import ecodes as e

Raspberry Pi上で上記のようにevdevパッケージを使ったPythonプログラムを実行しようとしたら、

env) foo@bar:~/tar $ python hogehoge.py
"/dev/uinput" cannot be opened for writing
Have you tried running as root? sudo hogehoge.py
env) foo@bar:~/tar $

というエラーが出た。

virutalenv 上でevdevをインストールしたからかも..
とおもって
virtualenv環境ではなくじかにevdevをインストールして、
sudoをつけて実行すると..うごいた..

でも、このプログラムを一般ユーザでうごかしたい..

ということで調べたら、
以下の方法で動いた。

sudo vi /etc/udev/rules.d/40-uinput.rules

してファイルを新規作成し、

SUBSYSTEM=="misc", KERNEL=="uinput", MODE="0660", GROUP="uinput"

と入力し保存。

つぎに、

sudo vi /etc/modules-load.d/uinput.conf

してファイルを新規作成し、

uinput

と入力し保存。

そして

sudo groupadd uinput
sudo usermod -aG uinput <実行ユーザ名>


して実行ユーザを新規作成したuinputグループに参加させる。

そして

sudo reboot

すればよい。


最近のLinux(raspbeianだけど..)は
ルール関係が複雑で、
入社当時のBSDなんかだと安直に

chmod a+rw /dev/uinput

とかしてたけど、
最近のLinux(raspbeianだけど..)は
ルール関係が複雑なので
こんなことしてもリブートしたらすぐに戻っちゃうだろうから..
(やったことないので、ほんとにそうなるかは、わからないけどね)

2019年11月14日木曜日

I2C 通信の smbus ベースのコードをpigpioに移植中にi2c_read_i2c_block_dataではまる

Python で MPU9250 を使おうとして、
以下のリポジトリを発見。

https://github.com/FaBoPlatform/FaBo9AXIS-MPU9250-Python

ただ、既存コードを pigpio ベースで行っているので、
Apache-2.0ライセンスでもあることから、
コードを書き換えてみようとためしてみた。

pigpioのi2c関連の関数は、
pigpio.pi()で取得したオブジェクトに
smbus とほとんど同じ名前で同じ機能があるので
ほいほいと書き換えていった..

引数のアドレスをpigpioハンドラにすれば
ほとんど変更いらずだわ..

..と、思っていたのだけど..

smbusの

read_i2c_block_data(addr, cmd)

の戻り値が

long[]

になっているのに対し、

pigpio の

i2c_read_i2c_block_data(handle, reg, count)

の戻り値は

Tupple

1要素目が0以上が正常読み込みしたことをあらわし、
負値の場合はエラーコードになる。

そして2要素目が取得した値なのだけど..
これがbytearrayになってる..


..めんどくさー



おきをつけあれ。


ちなみに..私は以下のラップ関数で逃げました。

ご参考まで。

def read_i2c_block_data(pi, handler, reg, count):
    """
    SMBusのread_i2c_block_dataと戻り値を合わせるための関数。
    引数:
        handler     pigpio I2C ハンドラ
        reg         デバイスレジスタ
        count       読み込むバイト数
    戻り値:
        int[]       read_i2c_block_dataの戻り値はlong[]だがpython3
                    なのでint[]
    例外:
        ConnectionError エラーの場合
    """
    if pi is None:
        try:
            import pigpio
        except:
            raise
        pi = pigpio.pi()
    (b, d) = pi.i2c_read_i2c_block_data(handler, reg, count)
    if b >= 0:
        data = []
        for i in range(count):
            value = int(d[i])
            data.append(value)
        return data
    else:
        raise ConnectionError('Error:{} in i2c_read_i2c_block_data'.format(
            str(b)))


誤りがあれば、コメント欄にご指摘ください。

ClaudeをOpenAI O1のように思考させるDifyサンプルを試す

 Difyの「探索」タブにはさまざまなサンプルが載っており、その1つに「Thinking Claude (OpenAI O1 Alternative)」というものがある。   このサンプルがどういうものか、未だに自分でも解けない以下の問題をためしに聞いてみることにした。 『人類の...