ESP32からmqttしてin the dynamodb する。


このあたりの記事の続きとなります。

リクガメのおウチの温度/湿度をモニターしてawsに投げるのを1000円くらいでやる(予定)
温度/湿度をモニターしてaws IOTを介して…

とりえあず、温度や湿度をaws iotにmqttする所まではやってます。

mqtt

あらためてmqtt。
送信をpublish、受信をsubscribeとざっくり考えていいんだろうか。
その送信側をesp32+micropythonにて実装しました。で、受信側がまだできてない。
試しに拾ってsnsに投げるのはやってみて無事出来てたけど。
今回は特定のTOPIC(kamekusa/DHT22)に投げたメッセージをin the dynamodbする。

dynamodbにsubscribe

まんまコレかな。
DynamoDB ルールの作成

なお、これはやっておきたい。
DynamoDB の TTL (Time To Live) 機能を使って古いレコードを自動的に削除

古いデータいらんですしね。
まず投げるjson決めときましょう。
idはUUID的なの入れたいけどuuidのライブラリが標準でなさそうだしユニークになるtimeをそのまま入れておきます。ハッシュキーがidでソートキーがexpire。expireはtime+48時間にしておいてTTLの制御に使います。

{
  "id": "id1545826432",
  "expire": 1545826432,
  "d1": "22.2",
  "d2": "33.3"
}

現在時刻の取得

しかし、、microPythonで現在時刻どうとるねん。
ためしにmachine.RTC().datetime()実行してみたらこうなるし。。

>>> print (machine.RTC().datetime())
(2000, 1, 1, 5, 0, 8, 16, 409726)

時刻合わせがわからんし、なんか時刻の起点も2000/1/1になってるし。
なんか余計な仕事っぽくて嫌やですけど、そういうの作ってくれてる方もおられますし、ntpから時間を取る処理を入れておきます。

micropython on ESP32 でNTPサーバから時刻取得

ありがたく使わせいただきます。
で、無事取れたけどなんかちょっと値が違う気も。。まあいっか後でoffset分調整しよう。

>>> print("localtime=%s" % ntptime.time())
localtime=599141370

publish側修正

def mqttpub(tem,hum)をこうしました。

test.py
def mqttpub(tem,hum):
  a=usocket.getaddrinfo(mqtt_endpoint,8883)
  addr = a[0][-1][0]
  time = ntptime.time()
  msg = {
          "id": "id{}".format(time),
          "expire": time + 48 * 60 * 60,
          "d1": "{}".format(tem),
          "d2": "{}".format(hum)
        }
  msg = json.dumps(msg)
  client = MQTTClient(client_id="ESP2866DHT22", server=addr, port=8883, keepalive=5000, ssl=True, ssl_params={ "key":key, "cert":cert, "server_side":False })
  client.connect()
  print(str(client))

  loop = 10
  while loop > 1:
    print (".")
    try:
      res = client.publish(topic=mqtt_topic, msg=msg, qos=0)
      print('Sending: ' + msg)
      print(str(res))
      loop = 0
    except Exception as e:
      print('Could not establish MQTT connection')
      print (str(e))
      time.sleep(1)
      loop -= 1

DynamoDB側とaws iot側

このへんは直感でイケると思うのでスクショだけで失礼します。

お。データ入ってきた。
(timeってなってるとこはこのあとexpireに変えました)

ソース

sleepのやつはちょっと宿題です

今後の予定

  • フロントからJSで値拾って表示
  • フロントからmqttをpublish -> esp32でサーボ動かして給餌

2018/12/28追記
あまり深く考えずにこれだけでdeepsleepはできました。

  machine.deepsleep(60000*5)