chakokuのブログ(rev4)

テック・コミック・DTM・・・ごくまれにチャリ

Lambdaを使って、Nature社のWebAPIからスマートメータの電力値を取得してIoT CoreにPublishする

Nature Remo WebAPIからスマートメータの計測値を取ってきて、AWS IoT CoreにPublishするLambda用ソース

import json
import urllib.request
import boto3

URL = "https://api.nature.global/1/appliances"
TOKEN = "R6mxxxxxxxxxxxxxxxxxxxxxxkis"
TOPIC = "topic_1"

def AWSIoT_publish(topic, message):
    client = boto3.client('iot-data')
    try:
        client.publish(
            topic = topic,
            payload = message,
            qos = 0
        )
        status = "OK"
    except Exception as e:
        print(e)
        status = "Error"
    return status

def lambda_handler(event, context):
    # TODO implement
    req = urllib.request.Request(URL)
    req.add_header('Authorization', 'Bearer ' + TOKEN )
    smartmeter_instantaneous = None
    with urllib.request.urlopen(req) as response:
        if response.status == 200:
            appliances = json.loads(response.read().decode())
            for property in appliances[0]["smart_meter"]["echonetlite_properties"]:
                if property['epc'] == 231:
                    smartmeter_instantaneous = property
                    AWSIoT_publish(TOPIC, json.dumps(smartmeter_instantaneous))
                    break
        else:
            print(f"Error in connect:{response.status}")
    return {
        'statusCode': 200,
        'body': json.dumps(smartmeter_instantaneous)
    }

1分周期で実行できるようにCloudWatchのEvent Bridgeを使って1分周期の呼び出しを行う

ESP32ではAWSIoTにSubscribeしてサーボを動かし電力値をメータで表示する(以下は試作のメータ・・・)。瞬時値が500W(4/24 16:45時点)であることを示している。電子レンジ等を使うと1000Wまで上がる。