python mongodb mqtt インストールメモ

# pythonインストール
## pyenv ダウンロード
```.sh
$ git clone https://github.com/pyenv/pyenv.git ~/.pyenv
```
## .zshenvに設定を追加して再ログイン
```.sh
export PYENV_ROOT="$HOME/.pyenv"
export PATH="$PYENV_ROOT/bin:$PATH
eval "$(pyenv init -)"
```

## インストールできるpythonのバージョンチェック
```.sh
$ pyenv install -l
```

## 3.7.0をインストールするとき、ubuntu 17.04では以下のライブラリインストールが必要だった
```.sh
$ sudo apt-get install libffi-dev
$ sudo apt-get install zlib1g-dev
$ sudo apt-get install libssl-dev libbz2-dev libreadline-dev
$ sudo apt-get install sqlite3 libsqlite3-dev
```

## matplotlibを使いたい場合は次のライブラリも必要です
```.sh
$ sudo apt install tk-dev
```
## 3.7.0をインストール
```.sh
$ pyenv install 3.7.0
```

## インストールされているバージョンをリストアップ
```.sh
$ pyenv versions
```

## 3.7.0を通常使うものとして設定（以下設定の後、再ログインが必要）
```.sh
$ pyenv global 3.7.0
```

# mqtt本体インストール（起動設定は自動的に行われるようだ）
```.sh
$ sudo apt update
$ sudo apt install mosquitto mosquitto-clients
```

# mongodb本体インストールと起動設定（4.0はcmakeと同時に使えなくなるので3.6）
```.sh
$ sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 2930ADAE8CAF5059EE73BB4B58712A2291FA4AD5
$ echo "deb [ arch=amd64,arm64 ] https://repo.mongodb.org/apt/ubuntu xenial/mongodb-org/3.6 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-3.6.list
$ sudo apt update
$ sudo apt install mongodb-org
$ sudo systemctl unmask mongod
$ sudo systemctl start mongod
$ sudo systemctl enable mongod
```

# 問題対処
先に3.6.3をインストールして、4.0を入れて、cmakeがコンフリクトするので3.6.6に戻す時に

```.sh
$ sudo apt update
$ sudo apt install mongodb-org
$ sudo apt upgrade
Reading package lists... Done
Building dependency tree       
Reading state information... Done
You might want to run 'apt --fix-broken install' to correct these.
The following packages have unmet dependencies:
 mongodb-org : Depends: mongodb-org-tools but it is not installed
E: Unmet dependencies. Try 'apt --fix-broken install' with no packages (or specify a solution).
```
などとエラーが起こってしまった。これに対処するには

```.sh
$ sudo apt -o Dpkg::Options::="--force-overwrite" install mongodb-org-tools
```
とすればよかった。
# pythonモジュール
## mongodb と mqtt のpythonモジュールインストール
```.sh
$ pip install pymongo
$ pip install paho-mqtt
```

## pymongoサンプル
```.py
from pymongo import MongoClient, ASCENDING, DESCENDING
from datetime import datetime

if __name__ == '__main__':
    # mongo
    mongoclient = MongoClient('mongodb://localhost:27017/')
    db = mongoclient['sensor_database']
    collection = db['sensor_collection']
    collection.delete_many({})
    collection.create_index([('nodeid', ASCENDING)])
    collection.create_index([('date', ASCENDING)])
    data = {'nodeid':'testnode', 'temp':32.1, 'date':datetime.utcnow()}
    collection.insert_one(data)
```

## mqttサンプル（ユーザー名、パスワード指定）
```.py
import paho.mqtt.client as mqtt

host = '127.0.0.1'
port = 1883
topic = '/sensor/data'
username = 'user'
password = 'pass'

def on_connect(client, userdata, flags, respons_code):
    print('status {0}'.format(respons_code))
    client.subscribe(topic)

def on_message(client, userdata, msg):
    print(str(msg.payload))

if __name__ == '__main__':
    # mqtt
    client = mqtt.Client()
    client.on_connect = on_connect
    client.on_message = on_message
    client.username_pw_set(username, password)
    client.connect(host, port=port, keepalive=60)
    client.loop_forever()

```