La température est automatiquement mesurée à l'aide de Raspberry Pi 3 et automatiquement téléchargée sur le serveur (Docker python3 + bouteille + MySQL) pour visualisation!

introduction

Je m'appelle Ryosuke Kamei et je suis consultant en informatique basé sur l'idée du "doux IT"! Mon travail principal va du processus en amont d'analyse et de définition des exigences à la gestion du développement, mais je développe un système Web en privé! Présentation des programmes de biens et services créés avec «Raspberry Pi 3» (communément appelé «Raspberry Pi»), qui a pour philosophie de «fournir des PC bon marché pouvant être programmés pour l'éducation» dans le cadre d'activités informatiques conviviales!

Cette fois, je vais vous présenter un exemple d'utilisation de Docker qui a postulé pour Razpai Contest 2016! Ceci est un échantillon qui mesure automatiquement la température toutes les minutes, l'enregistre dans la base de données (MySQL) sur Docker, et vous permet de parcourir la température avec un navigateur!

Le fichier est posté sur Github, donc si vous êtes intéressé, veuillez l'utiliser!

table des matières

  1. Objet
  2. Préparation
  3. Construction de l'environnement
  4. Contrôle de fonctionnement
  5. À la fin

1. Objet

1-1. Proposition de création d'un serveur Web à l'aide de Docker

Pour ceux qui aiment la tarte aux râpes "Je suis doué pour le travail électronique, mais je ne sais pas quand il sera publié en ligne ..." Je pense qu'il y a beaucoup de gens qui disent cela.

Il est possible de construire un serveur Web sur Raspai, mais installer un serveur d'application, un serveur de base de données, etc. est gênant, ennuyeux, et même si j'essaye, cela ne fonctionne pas ... La construction du serveur Web est-elle considérée comme un seuil élevé?

Afin de rendre la création d'un serveur Web aussi simple que possible pour quiconque, nous allons présenter un exemple de création d'un serveur Web avec moins d'effort en utilisant la technologie de conteneur Docker!

1-2. Défis lors de la construction d'un serveur à Raspeye

Comme le système d'exploitation de Raspai est un système d'exploitation basé sur Linux «Raspbian», vous pouvez installer Apache sur le serveur Web et MySQL sur le serveur de base de données, mais il existe également les problèmes suivants.

  1. Je ne sais pas ce qui a causé le problème.
  2. Installation et configuration compliquées du serveur Web et de la base de données
  3. Il est difficile de refaire les paramètres du serveur Web et du serveur de base de données.

ラズパイ上にウェブサーバを構築する際の課題

  1. Je ne sais pas ce qui a causé le problème. Lors d'un travail électronique, il est difficile d'isoler le problème lorsqu'un problème survient car le système tel que l'acquisition de température et le mécanisme tel que le serveur Web sont construits sur la même machine.

  2. Installation et configuration compliquées du serveur Web et de la base de données Vous pouvez installer le serveur Web Apache et le serveur de base de données MySQL, mais l'installation et la configuration prennent du temps. Je suis sûr que certains d'entre vous en ont fait l'expérience, mais si vous ne prenez pas de notes correctement, vous ne connaissez peut-être pas les paramètres corrects ou vous êtes peut-être en état de travailler.

  3. Il est difficile de refaire les paramètres du serveur Web et du serveur de base de données. Si vous souhaitez reconfigurer votre serveur Web ou votre base de données, vous devrez vous demander quoi faire si cela ne fonctionne pas pour modifier votre environnement existant.

1 à 3. Résolu avec Docker!

  1. Je ne sais pas ce qui a causé le problème. Docker utilise une technologie appelée conteneurs. Lancez un "OS virtuel" sur le gâteau de la râpe. Les rôles sont clairement répartis entre le conteneur d'application et le conteneur de base de données, et le système d'exploitation de l'unité principale Raspeye est spécialisé dans la communication avec du matériel tel que les capteurs de température, les capteurs d'humidité et les capteurs d'éclairement. Lorsqu'un problème survient, il sera plus facile d'isoler le problème lors de la recherche de la cause!

  2. Installation et configuration compliquées du serveur Web et de la base de données Avec Docker, vous pouvez utiliser gratuitement des fichiers image avec des paramètres difficiles, à partir d'une installation de middleware gênante! Les fichiers image vont des fichiers officiels aux fichiers finement personnalisés, et peuvent être utilisés en combinaison pour assembler un modèle en plastique!

  3. Il est difficile de refaire les paramètres du serveur Web et du serveur de base de données. Docker vous permet de combiner les installations et les paramètres dans un seul fichier. Si vous faites une erreur dans les paramètres, expérimentez dans un autre environnement basé sur ce fichier. Même si cela ne fonctionne pas, il est possible de jeter le contenu et d'appeler à nouveau le fichier de configuration bien fait. Docker peut être parallélisé (créer le même environnement à tout moment, n'importe où) en utilisant des fichiers image, de sorte que le portage peut être effectué en douceur!

1-4. Défis lors de l'utilisation de Docker avec Raspeye

Docker a aussi ses défis. Les serveurs typiques ont l'architecture x86_64, et la plupart des images Docker Hub sont également des images d'architecture x86_64. Il existe peu d'images de l'architecture armv7l de Raspberry Pi, et il y a encore peu d'informations sur Raspberry Pi + Docker.

Dans ce numéro, nous présenterons un exemple d'utilisation de Docker sur Raspberry basé sur cette situation!

1-5. Cet exemple

Observation en point fixe de la température, enregistrement dans la base de données et navigation sur le serveur web!

① Acquérir avec un capteur de température numérique sur le corps principal du Raspai

ラズパイで温度取得

(2) La température acquise est enregistrée dans la base de données à partir du programme via l'API.

システム構成図

③ Le navigateur Web peut afficher la température enregistrée dans la base de données.

ブラウザ表示

Ceux-ci sont sur mon Github et peuvent être construits avec des étapes relativement simples. C'est l'un des avantages de Docker.

La construction de l'environnement sera expliquée dans "3. Construire l'environnement"!

2. Préparation

Si vous n'avez pas installé Docker et Git, veuillez consulter l'article ci-dessous. Installer Docker et Git sur RaspberryPi3

3. Construction de l'environnement

Utilisez immédiatement Docker pour créer des conteneurs d'application, des conteneurs de base de données et des conteneurs de données!

Voir l'article ci-dessous pour plus de détails! Créez un environnement Python + bouteille + MySQL avec Docker sur RaspberryPi3![Construction facile]

Il existe également une version vidéo! Mouvement

3-1. Procédure de construction

Cloner avec git et télécharger le fichier


$ git clone [email protected]:RyosukeKamei/rpi-python-bottle.git

Déplacer vers le dossier cloné


$ cd rpi-python-bottle

docker-Créer et démarrer un conteneur de données et un conteneur de base de données avec compose


$ docker-compose up -d

Vérifiez l'image


$ docker images

Vérifiez le conteneur


$ docker ps -a

Connectez-vous au conteneur de base de données


$ docker exec -it rpi-python-bottle-db bash

Entrez un exemple de table et de données


# mysql -u bottle -pbottle measurement < /docker-entrypoint-initdb.d/create_table.sql

Déconnexion du conteneur de base de données


# (Contrl + p, Control + q)

Créer un conteneur d'application


$ docker build -t hypriot/rpi-python .

Démarrez le conteneur d'applications et connectez-vous


$ docker run --name rpi-python-bottle-app -it hypriot/rpi-python bash

Démarrez le serveur


# /usr/local/bin/python3 /home/bottle/server.py

Lorsque vous l'ouvrez dans un navigateur, il s'affichera comme suit. ブラウザで確認

3-2. Structure des dossiers

Lorsque vous clonez git, la structure des dossiers sera la suivante!

フォルダ構成

3-3. /app/server.py

Données de température enregistrées dans la base de données et API pour l'enregistrement des données.

@route('/list') Obtenez les données de température avec l'instruction SQL SELECT et affichez-les dans une liste.

@route('/input_temperature') Reçoit les données de température, génère et enregistre une instruction SQL INSERT. Exemple de format: http://172.17.0.4:8080/input_temperature?server_id=1&temperature=29&user_id=1

server_id: ID du serveur (valeur fixe dans l'exemple, compte tenu de l'évolutivité future) temperature: température acquise par le capteur de température user_id: ID utilisateur (valeur fixe dans l'exemple, compte tenu de l'évolutivité future)

Les détails sont donnés dans les commentaires commençant par #.

/app/server.py


#bibliothèque de bouteilles
from bottle import route, run, request

#Le pilote MySQL est mysql.connector
import mysql.connector

#Supplément
#En fait, si vous mettez un modèle, le HTML sera beau.
#Cette zone sera plus tard ...

#L'adresse IP de l'hôte est$ docker inspect {Nom du conteneur de base de données}Découvrez dans
#Les utilisateurs, mots de passe et bases de données MySQL sont docker-compose.Ce qui a été défini avec yml
# user     : MYSQL_USER
# password : MYSQL_PASSWORD
# database : MYSQL_DATABASE
connector = mysql.connector.connect (
            user     = 'bottle',
            password = 'bottle',
            host     = '172.17.0.3',
            database = 'measurement'
)


			
@route('/list')
def list():
    #Afficher la température
    cursor = connector.cursor()
    cursor.execute("select `id`, `temperature`, `careted_at` from temperatures")

    disp  = "<table>"
    #entête
    disp += "<tr><th>ID</th><th>Température</th><th>Date d'inscription</th></tr>"
    
    #Partie de liste
    for row in cursor.fetchall():
        disp += "<tr><td>" + str(row[0]) + "</td><td>" + str(row[1]) + "</td><td>" + str(row[2]) + "</td></tr>"
    
    disp += "</table>"
    
    cursor.close

    return "Obtenu de DB"+disp

@route('/input_temperature')
def input_temperature():
    #Entrer la température
    cursor = connector.cursor()
    cursor.execute("INSERT INTO `temperatures` (`server_id`, `temperature`, `careted_at`, `careted_user`, `updated_at`, `updated_user`) VALUES (" + request.query.server_id + ", " + request.query.temperature + ", NOW(), " + request.query.user_id + ", NOW(), " + request.query.user_id + ")")

    #commettre
    connector.commit();

    cursor.close

    return "OK"
    

#Fermer le connecteur
connector.close

#Démarrage du serveur
run(host='0.0.0.0', port=8080, debug=True, reloader=True)

3-4. digital_temperature_sensor_for_api.py Chaque minute, la température est obtenue à partir du capteur de température via I2C et l'API d'enregistrement des données est accessible.

Exemple de valeur d'API http://172.17.0.4:8080/input_temperature?server_id=1&temperature=29&user_id=1

digital_temperature_sensor_for_api.py


#Préparation
# $ sudo apt-get install libi2c-dev 
# $ sudo sh -c 'echo "options i2c_bcm2708 combined=1" >> /etc/modprobe.d/i2c.conf'

#Bibliothèque qui contrôle GPIO
import wiringpi

#Bibliothèque de minuterie
import time

#Appelez les bibliothèques nécessaires pour lire à partir du périphérique I2C
import os
import struct

#Accès URL
import urllib.request

#Créer une instance d'I2C
wiringpi.wiringPiSetup()
i2c = wiringpi.I2C()

#Paramètres I2C
#Spécifiez l'adresse I2C de l'appareil à communiquer
temperture_dev = i2c.setup(0x48)

#Obtenez des données 16 bits pour la température
#Autres Défini pour enregistrer 0x03
i2c.writeReg8(temperture_dev, 0x03, 0x80)

while True:
    #Lire 2 octets de capteur de température
    temperture_data = struct.unpack('2B', os.read(temperture_dev, 2))

    #La valeur est divisée en 2 octets, alors combinez-les en un seul.
    temperture = ( ( temperture_data[0] << 8 ) + temperture_data[1] )

    #Convertir les nombres en valeurs négatives
    if ( temperture_data[0] >= 0x80 ):
        temperture = temperture - 65536

    #Calculez la température en divisant la valeur acquise par 128
    temperture = temperture / 128

    #Affichage de la température
    print ( "Température" , temperture , "C" )
    
    response = urllib.request.urlopen('http://172.17.0.4:8080/input_temperature?server_id=1&temperature=' + str(temperture) + '&user_id=1')
    data = response.read()
    
    print ( "Réponse du serveur: ", data )

    #Chaque minute
    time.sleep(60)

3-5. /docker/mysql/my.cnf Ceci est un fichier japonais pour MySQL. Puisqu'il est défini dynamiquement, je vais omettre une explication approfondie.

/docker/mysql/my.cnf


[mysqld]
innodb_strict_mode
innodb_file_format = Barracuda
innodb_file_per_table
innodb_large_prefix = 1
character-set-server=utf8mb4
skip-character-set-client-handshake
max_allowed_packet = 32m
skip-networking = 0

[client]
default-character-set=utf8mb4

3-6. docker-compose.yml Gérez de manière centralisée les conteneurs de base de données et les conteneurs de données.

Voir l'article ci-dessous pour plus de détails! Construisez un environnement Python + bouteille + MySQL avec Docker sur RaspberryPi3![Construction facile]

3-7. Dockerfile Il s'agit du fichier de configuration du conteneur d'application.

Voir l'article ci-dessous pour plus de détails! Construisez un environnement Python + bouteille + MySQL avec Docker sur RaspberryPi3![Construction facile]

3-8. /initdb.d/create_table.sql SQL pour enregistrer la définition de table et les données initiales pour la vérification de l'opération. Au moment de la construction, il est exécuté à l'aide de commandes.

sql:/initdb.d/create_table.sql


USE measurement;

CREATE TABLE `temperatures` (
  `id`           int(11) NOT NULL AUTO_INCREMENT,
  `server_id`    int(11) NOT NULL,
  `temperature`  int(11) NOT NULL,
  `careted_at`   datetime NOT NULL,
  `careted_user` int(11) NOT NULL,
  `updated_at`   datetime NOT NULL,
  `updated_user` int(11) NOT NULL,
  KEY `id` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

INSERT INTO `temperatures` 
  (`id`, `server_id`, `temperature`, `careted_at`, `careted_user`, `updated_at`, `updated_user`) 
  VALUES 
  (1, 1, 29, NOW(), 1, NOW(), 1);

3-9. README.md Il s'agit d'un fichier README généré automatiquement par Git. Cela n'a rien à voir avec l'opération. (Ce serait bien de l'écrire un peu plus attentivement ...)

3-10. /vim/python.vim Lorsque vous utilisez vim dans le conteneur d'application, il dispose de paramètres pratiques pour écrire Python. Cela crée également automatiquement l'image de l'application lors de sa création.

3-11. Schéma du circuit

デジタル温度センサで温度取得

4. Contrôle de fonctionnement

C'est enfin un contrôle de fonctionnement.

4-1. Acquérir la température avec un capteur de température numérique sur le corps principal du Raspai

Dans Raspeye, il y a un fichier appelé "digital_temperature_sensor_for_api.py" dans le dossier créé par git clone, alors démarrez-le.

Obtenez la température


$ cd {dossier cloné git}/rpi-python-bottle
$ sudo python3 digital_temperature_sensor_for_api.py

La température est obtenue comme suit (l'image a un argument, mais il est ignoré). ラズパイで温度取得

La température acquise est enregistrée dans la base de données à partir du programme via l'API.

システム構成図

4-2 Le navigateur Web affiche la température enregistrée dans la base de données.

Si vous accédez à "http://172.17.0.4:8080/list" avec le navigateur de Raspeye, vous pouvez voir l'affichage suivant!

ブラウザ表示

/vim/python.vim


setl expandtab
setl tabstop=4
setl shiftwidth=4
setl softtabstop=0
autocmd BufWritePre * :%s/\s\+$//ge
setlocal textwidth=80

5. À la fin

J'ai utilisé un capteur de température cette fois, mais si vous utilisez un capteur d'éclairement qui mesure la luminosité et un capteur d'humidité qui mesure l'humidité, vous pouvez mesurer l'éclairement et l'humidité!

Si vous avez besoin de voir la température, l'éclairement et l'humidité à partir d'un endroit éloigné, vous pouvez le faire! S'il y a autre chose qui me semble utile, j'aimerais l'appliquer!

plan du site

Configuration du Raspberry Pi 3

Installation du Raspberry Pi 3 → LAN sans fil → Entrée / sortie japonaise → opération depuis Mac

Créez un environnement Python + MySQL avec Docker sur Raspberry Pi 3!

Installer Docker sur RaspberryPi3 Créez un environnement Python + bouteille + MySQL avec Docker sur RaspberryPi3![Construction facile] Créez un environnement Python + bouteille + MySQL avec Docker sur RaspberryPi3![Essai et erreur]

Fabriquez un climatiseur intégré à un ordinateur personnel "airpi" avec Raspberry Pi 3!

Faire un climatiseur intégré PC "airpi" avec Raspberry Pi 3!

Enfin ... Créez un contrôleur radio en utilisant python sur Raspberry Pi 3!

Le moteur se déplace en appuyant sur le bouton Le moteur se déplace tout en rapprochant l'aimant Le moteur se déplace lorsque l'aimant est rapproché et s'arrête automatiquement

Jouons avec Raspberry Pi 3 et Python Record of Raspberry Lutte

Programmation avec programmation Node-RED avec Raspberry Pi 3 et programmation normale Allumez la LED avec python sur Raspberry Pi 3 (Hello World) Détecter l'état du commutateur avec Raspberry Pi 3 Exécutez un servomoteur en utilisant python sur Raspberry Pi 3 Contrôlez le moteur avec un pilote de moteur en utilisant python sur Raspberry Pi 3! Détectez l'interrupteur à glissière à l'aide de python sur Raspberry Pi 3! Détectez les commutateurs magnétiques à l'aide de python sur Raspberry Pi 3! Détectez la température en utilisant python sur Raspberry Pi 3! Raspberry Pi 3 utilise python pour faire sonner le buzzer! Détectez les signaux analogiques avec un convertisseur A / N en utilisant python sur Raspberry Pi 3! Détectez la "luminosité" en utilisant python sur Raspberry Pi 3! Détectez la "température (en utilisant le convertisseur A / N)" en utilisant python sur Raspberry Pi 3! Sortie vers "7 segments LED" en utilisant python sur Raspberry Pi 3! Utilisez python sur Raspberry Pi 3 pour éclairer la LED avec le contrôle du commutateur! Utilisez python sur Raspberry Pi 3 et allumez la LED quand il fait noir!

Règles axées sur le développement piloté par les tests

Règles de codage "Écrivons du code doux" (FuelPHP) Règles de dénomination "Membres sympathiques pour vous-même, conviviaux pour l'équipe et invisibles après 3 mois"

Développement d'applications Web avec Docker + Python

Installez Python3 et les bibliothèques associées pip, virtualenv et framework Django, bouteille, Flask sur CentOS sur Docker! Avec un Dockerfile qui résume ces derniers!

Construction d'environnement facile à développer (Docker + PHP)

Lier l'environnement PHP + Eclipse à Apache à l'aide de Docker Création d'un environnement de développement Fuel PHP à l'aide de Docker Création d'un squelette CRUD à l'aide des paramètres initiaux de l'environnement de développement FuelPHP à l'aide de Docker et de l'échafaudage Migration de la base de données FuelPHP

Recommended Posts

La température est automatiquement mesurée à l'aide de Raspberry Pi 3 et automatiquement téléchargée sur le serveur (Docker python3 + bouteille + MySQL) pour visualisation!
Envoyez la température, l'humidité, etc. mesurées par SensorTag à Ambient via Raspberry Pi 3 et tracez-les.
Enfin ... Créez un contrôleur radio en utilisant python sur Raspberry Pi 3! (Lorsque l'aimant est rapproché, le moteur se déplace et s'arrête automatiquement)
Détectez la température à l'aide de python sur Raspberry Pi 3!
Trois choses auxquelles j'étais accro lors de l'utilisation de Python et MySQL avec Docker
Utilisation du capteur de température numérique à 1 fil DS18B20 avec Raspberry Pi de Python
Utilisez le capteur de température analogique Raspberry Pi Python vers TMP36 et le convertisseur MCP3008 AD
Sonnez le buzzer en utilisant python sur Raspberry Pi 3!
Connectez-vous à MySQL avec Python sur Raspberry Pi
Installez PyCall sur Raspberry PI et essayez d'utiliser la bibliothèque GPIO pour Python de Ruby
Comment utiliser Raspeye Relay Module Python
Essayez d'utiliser le capteur de température (LM75B) avec Raspeye.
Sortie sur "LED 7 segments" en utilisant python avec Raspberry Pi 3!
Mettre à jour Raspberry Pi Python vers 3.7 ou version ultérieure avec pyenv
Utilisez python sur Raspberry Pi 3 pour détecter la "température (en utilisant un convertisseur A / N)"!
Accédez aux feuilles de calcul Google en utilisant python avec raspberry pi (pour vous-même)
Créer un environnement Python et transférer des données vers le serveur
Mesurez et comparez les températures avec Raspberry Pi et générez automatiquement des graphiques
Comment obtenir la température du thermo-hygromètre SwitchBot à l'aide de Raspberry Pi
Obtenez la météo en utilisant l'API et laissez Raspberry Pi parler!
Construire Raspberry Pi pour étudier Python et l'apprentissage automatique (version RaspberryPi4 & Buster (RaspberryPi3 est également possible))
Contrôlez le moteur avec un pilote de moteur en utilisant python sur Raspberry Pi 3!
Comment obtenir des abonnés et des abonnés de Python à l'aide de l'API Mastodon
Je veux exécuter l'interface graphique Python au démarrage de Raspberry Pi
Utilisez python sur Raspberry Pi 3 pour éclairer la LED (Hello World)
Raspberry Pi --1 --Première fois (Connectez un capteur de température pour afficher la température)
Enfin ... Créez un contrôleur radio en utilisant python sur Raspberry Pi 3! (Le moteur se déplace lorsque le bouton est enfoncé)
Lisez les données du lecteur NFC connecté à Raspberry Pi 3 avec Python et envoyez-les à openFrameworks avec OSC