[PYTHON] Frappez l'API de Nature Remo pour enregistrer la température ambiante avec Azure Functions et CosmosDB

Il existe une télécommande intelligente appelée Nature Remo. Je l'utilise depuis l'année dernière car je peux faire fonctionner des appareils électroménagers depuis mon application pour smartphone ou Google Home. Ce Remo est chargé de capteurs qui vous permettent d'obtenir la température, l'humidité, l'éclairement et les mouvements humains à partir de l'API (Remo mini est la température uniquement). Cette fois, j'aimerais utiliser Saas d'Azure pour terminer le processus en accédant à cette API et en collectant des données uniquement dans le cloud.

Pourquoi je voulais le terminer sur le cloud

Je pensais qu'il serait plus facile de le construire en utilisant une tarte à la râpe, mais parfois mon réseau domestique était coupé, alors j'ai pensé à le vérifier de l'extérieur et je l'ai fait dans le cloud.

Quoi utiliser

Préparation préalable

Puisque Functions est utilisé cette fois en Python, vous ne pouvez pas modifier le code sur le portail. Déployez de VVScode vers Azure. Par conséquent, préparez VScode et les extensions suivantes.

Extension VScode

Azure Functions Core Tool https://docs.microsoft.com/ja-jp/azure/azure-functions/functions-run-local?tabs=windows%2Ccsharp%2Cbash

Connectez-vous à Azure avec VScode

Après avoir installé l'extension ci-dessus, appuyez sur F1 sur VScode et appuyez sur Azure: connectez-vous. Vous pouvez vous connecter à Azure avec VScode en vous connectant sur le navigateur ouvert.

Préparer les ressources Azure

CosmosDB Créez un CosmosDB. Cela peut être fait à partir du portail ou déployé à partir de VScode. Lors de la création avec VScode

  1. Appuyez sur F1 sur VScode et sélectionnez CosmosDB: Créer un compte ...
  2. Entrez un nom pour le nom du compte. (Unique au monde)
  3. Sélectionnez Core (SQL) comme API pour CosomosDB.
  4. Laissez Apply Free Tier Discount s'appliquer.
  5. Répondez aux autres questions à tour de rôle.

https://docs.microsoft.com/ja-jp/azure/azure-functions/functions-integrate-store-unstructured-data-cosmosdb?tabs=javascript

CosmosDB a une plage libre et vous pouvez utiliser gratuitement 400RU / s et 5 Go de stockage, comme décrit dans la FAQ ci-dessous. https://azure.microsoft.com/pricing/details/cosmos-db/

Functions

Les fonctions seront construites à partir de VScode car il sera construit en Python cette fois.

  1. Appuyez sur F1 dans VScode.
  2. Recherchez Functions et effectuez Azure Functions: Create New Project.
  3. Sélectionnez un répertoire à développer localement
  4. Sélectionnez Python et sélectionnez le fichier exécutable du corps principal Python installé localement.
  5. Sélectionnez Déclencheur. Cette fois, nous le ferons avec TimerTrigger.
  6. Entrez un nom pour la fonction.
  7. Entrez la fréquence d'exécution de TimerTrigger à l'aide de l'expression CRON. La valeur par défaut `` 0 * / 5 * * * * '' s'exécute toutes les 5 minutes.

Vous disposez maintenant d'un modèle de projet et de fonction localement.

Création de fonction

Tout d'abord, assurez-vous que vous pouvez accéder à l'API de Remo en Python normalement. J'ai utilisé le code Python dans l'article suivant. Obtenez un jeton d'accès et assurez-vous de pouvoir accéder à l'API localement. Comme indiqué dans cet article, veillez à ne pas divulguer votre clé API. Vous pouvez faire fonctionner librement des appareils ménagers par d'autres via API. https://qiita.com/sohsatoh/items/b710ab3fa05e77ab2b0a

Le résultat sera le json suivant. Puisque Remo mini est utilisé, seule la température est sortie dans l'élément te dans `` `` new_event.

[
    {
        "name": "Remomini",
        "id": <your remo id>,
        "created_at": "2019-07-21T13:01:54Z",
        "updated_at": "2020-04-29T05:18:05Z",
        "mac_address": <your remo mac address>,
        "serial_number": <your remo serial number>,
        "firmware_version": "Remo-mini/1.0.92-g86d241a",
        "temperature_offset": 0,
        "humidity_offset": 0,
        "users": [
            {
                "id": <your id>,
                "nickname": <your nickname>,
                "superuser": true
            }
        ],
        "newest_events": {
            "te": {
                "val": 23,
                "created_at": "2020-04-30T05:10:10Z"
            }
        }
    }
]

created_atDate et heure auxquelles remo a été réglé,updated_atDate et heure de la mise à jour de remo(Sera-t-il mis à jour automatiquement?)Il semble que.

Cette fois, je veux savoir plus récent_événement '', donc j'enverrai le contenu et l'heure à laquelle j'ai frappé l'API à CosmosDB. Ce created_at``` est différent du moment où vous accédez à l'API, car plus récent_événements` '' semble être mis à jour lorsque la valeur du capteur change.

Je vais mettre ce code dans le code du modèle de Timrigger

__init__.py
import datetime
import logging
import json
import requests
import azure.functions as func


def main(mytimer: func.TimerRequest, doc: func.Out[func.Document]) -> func.HttpResponse:
    utc_timestamp = datetime.datetime.utcnow().replace(
        tzinfo=datetime.timezone.utc).isoformat()

    if mytimer.past_due:
        logging.info('The timer is past due!')

    apikey= "<your remo API key>"
    # get JSON
    headers = {
        'accept' : 'application/json',
        'Authorization' : 'Bearer ' + apikey ,
    }
    response = requests.get('https://api.nature.global/1/devices', headers= headers, verify=False)
    rjson = response.json()
    res_json = rjson[0]["newest_events"]["te"]
    res_json["request_time"]= utc_timestamp
    res_json = json.dumps(res_json,indent=2)
    logging.info('Python timer trigger function ran at %s', utc_timestamp)
    doc.set(func.Document.from_json(res_json))

mytimer: func.TimerRequest est azur.Minuterie du module de fonctions


 , `` `` Doc: func.Out [func.Document] `` `` signifie la sortie de azure.functions.

 Vous pouvez générer une sortie en définissant une valeur dans la variable `` `` doc '' que vous venez de définir. Décrivez que la variable `` doc '' est la valeur à envoyer à CosmosDB dans `` function.json``` générée lors de la création de la fonction.

## Paramètres de l'application de fonction

 1. Appuyez sur F1 pour afficher le terminal de commande, tapez binding et sélectionnez Azure Functions: Add binding. (Vous pouvez également cliquer avec le bouton droit sur la fonction locale que vous venez de créer à partir du logo Azure dans la barre latérale.)
 2. Sélectionnez la fonction que vous venez de créer.
 3. Cette fois, il s'agit d'une sortie, alors sélectionnez-la.
 4. Sélectionnez Azure Cosmos DB.
 5. Entrez le nom de la variable à utiliser dans la fonction. Cette fois, disons `` doc ''.
 6. Entrez le nom de la base de données dans CosmosDB. Cette fois, disons `` à la maison ''.
 7. Entrez le nom de la collection dans la base de données. Cette fois, réglez-le sur `` température ''.
 8. Définissez `` true``` pour savoir s'il faut créer le DB s'il n'existe pas.
 9. Vous serez interrogé sur les paramètres de l'environnement local, alors créez-le avec `` `` Créer un nouveau paramètre d'application locale '' ``.
 10. Lorsqu'on vous demande le compte de base de données, sélectionnez le `` `` home '' 'que vous avez créé.
 11. La clé de partition est facultative, alors allons-y.

 ! Le nom de la base de données doit être globalement unique, utilisez donc n'importe quel nom

 Cela ajoutera ce qui suit à function.json:

{
  "type": "cosmosDB",
  "direction": "out",
  "name": "doc",
  "databaseName": "home",
  "collectionName": "temperature",
  "createIfNotExists": "true",
  "connectionStringSetting": "cielohome_DOCUMENTDB"
}

 Vous avez maintenant défini la sortie. La connectionString CosmosDB est répertoriée dans `` local.settings.json '' dans le même répertoire.

"cielohome_DOCUMENTDB": "AccountEndpoint=https://hogehoge.documents.azure.com:443/;AccountKey=fugafuga;"


## Tester localement

 Obtenez les modules dont vous avez besoin pour tester localement. Cette fois, les modules requis sont ```azure-functions```, `` requests```, alors décrivez-les dans requirements.txt dans le même répertoire.

azure-functions requests

 Obtenez ceci avec `` `` pip install requirements.txt```.

 Vous pouvez déboguer en appuyant sur la touche F5.

## Déployer vers des fonctions

 1. Ouvrez le terminal de commande avec la touche F1, recherchez deploy et sélectionnez ```Azure Functions: deploy to function app .... `` `.
 2. Sélectionnez `` Créer une nouvelle application de fonction dans Azure (avancé) ''
 3. Entrez un nom de ressource. (Nom unique au monde)
 4. Sélectionnez Python 3.7.
 5. Sélectionnez Co-consommation. Il est payant à l'utilisation. Functions a également un cadre gratuit, donc fondamentalement, vous ne serez pas facturé si c'est environ une fois toutes les 5 minutes.
 6. Sélectionnez un groupe de ressources. Utilisez le même groupe de ressources que CosmosDB. Différents sont très bien. Notez que les applications Python ne fonctionneront que si le groupe de ressources est construit sur Linux.
 7. Sélectionnez un compte de stockage.
 8. Sélectionnez Application insights. C'est Saas qui voit le journal.

 Le déploiement est maintenant terminé.

## Vérifiez les données avec CosmosDB

 Après avoir déployé la fonction, jetons un œil aux données.
 Cliquez sur le logo Azure sur VScode pour vérifier Cosmos DB dans la barre latérale. Lorsque vous ouvrez la base de données, elle est documentée dans `` température ''.

"val": 24.2, "created_at": "2020-05-02T13:49:12Z", "request_time": "2020-05-02T14:00:00.007771+00:00"

 C'est tout ce qu'on peut en dire.

## Résumé

 Vous pouvez désormais stocker vos données dans Azure à l'aide de Functions et CosmosDB. La prochaine fois, j'aimerais visualiser ces données.

## référence
https://docs.microsoft.com/ja-jp/azure/azure-functions/functions-integrate-store-unstructured-data-cosmosdb?tabs=javascript
https://docs.microsoft.com/ja-jp/azure/azure-functions/
https://docs.microsoft.com/ja-jp/azure/azure-functions/functions-reference-python
 <a target = "_ blank" href = "https://www.amazon.co.jp/gp/product/B07CWNLHJ8/ref=as_li_tl?ie=UTF8&camp=247&creative=1211&creativeASIN=B07CWNLHJ8&linkCode=as2&tag=shou3 > Nature Smart Remote Control Nature Remo mini Home Appliance Control Amazon Alexa / Google Home / Siri Compatible GPS Linked Temperature Sensor Remo-2W1 </a> <img src = "// ir-jp.amazon-adsystem.com/e/ir?t = shirou463-22 & l = am2 & o = 9 & a = B07CWNLHJ8 "width =" 1 "height =" 1 "border =" 0 "alt =" "style =" border: none! Important; margin: 0px! Important; "/>

## prime
 Il existe un logiciel appelé PowerBI Desktop de Microsoft, donc quand j'ai essayé de le visualiser facilement, cela ressemblait à ceci. C'est facile car il est facile de se lier à Azure.

 ![キャプチャ1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/550841/c28f406c-18d8-5d29-2a2e-4d354b1bb394.png)



Recommended Posts

Frappez l'API de Nature Remo pour enregistrer la température ambiante avec Azure Functions et CosmosDB
Accéder à Azure Cosmos DB avec Spring Boot
Utiliser Python et MeCab avec Azure Functions
Essayez d'extraire le document Azure document DB avec pydocumentdb
Enregistrez la température et l'humidité avec systemd sur Raspberry Pi
Essayez le fonctionnement de la base de données avec Python et visualisez avec d3