LoginSignup
1
0

More than 5 years have passed since last update.

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

Last updated at Posted at 2018-12-26

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

リクガメのおウチの温度/湿度をモニターして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側

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

26.png

27.png

28.png

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

ソース

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

今後の予定

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

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

  machine.deepsleep(60000*5)
1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0