Weatherg : Lecture des capteurs DHT22 et BMP185 en Python

Installer les dépendances :

Pour le DHT22, cloner la bibliothèque fourni par Adafruit et installer là :

$ git clone https://github.com/adafruit/Adafruit_Python_DHT.git
$ cd Adafuit_Python_DHT && sudo python setup.py install

Pour tester l’installation et votre câblage :

sudo examples/Adafruit_DHT 22 4

Ici 22  correspond au DHT22, pour le DHT11, utiliser 11 . Le 4 correspond à la broche GPIO #4 du Raspberry PI.

Recommencer pour le BMP185, ce dernier est câblé sur les broche I2C.

$ git clone https://github.com/adafruit/Adafruit_Python_BMP.git
$ cd Adafruit_Python_BMP && sudo python setup.py install

Enfin un petit test :

sudo examples/simpletest.py
Exemple de code
# Adafruit library
import Adafruit_DHT
import Adafruit_BMP.BMP085 as BMP085

# sensor config
DHT_SENSOR = 22
PIN = 4

# Try to grab a sensor reading.  Use the read_retry method which will retry up
# to 15 times to get a sensor reading (waiting 2 seconds between each retry).
# humidity, temperature = Adafruit_DHT.read_retry(DHT_SENSOR, PIN)
#
#
# Default constructor will pick a default I2C bus.
#
# For the Raspberry Pi this means you should hook up to the only exposed I2C bus
# from the main GPIO header and the library will figure out the bus number based
# on the Pi's revision.
#
# For the Beaglebone Black the library will assume bus 1 by default, which is
# exposed with SCL = P9_19 and SDA = P9_20.
#
# Can enable debug output by uncommenting:
#import logging
#logging.basicConfig(level=logging.DEBUG)
bmp_sensor = BMP085.BMP085()

# Optionally you can override the bus number:
#sensor = BMP085.BMP085(busnum=2)

# You can also optionally change the BMP085 mode to one of BMP085_ULTRALOWPOWER,
# BMP085_STANDARD, BMP085_HIGHRES, or BMP085_ULTRAHIGHRES.  See the BMP085
# datasheet for more details on the meanings of each mode (accuracy and power
# consumption are primarily the differences).  The default mode is STANDARD.
sensor = BMP085.BMP085(mode=BMP085.BMP085_ULTRAHIGHRES)

bmp_temp = bmp_sensor.read_temperature()
bmp_pressure = bmp_sensor.read_pressure()
bmp_altitude = bmp_sensor.read_altitude()
bmp_sealevel_pressure = bmp_sensor.read_sealevel_pressure()

print 'BMP measures'
print 'Temp = {0:0.2f} *C'.format(bmp_temp)
print 'Pressure = {0:0.2f} Pa'.format(bmp_pressure)
print 'Altitude = {0:0.2f} m'.format(bmp_altitude)
print 'Sealevel Pressure = {0:0.2f} Pa'.format(bmp_sealevel_pressure)


print 'DHT ' + str(DHT_SENSOR) + ' measures'
if humidity is not None and temperature is not None:
    print 'Temp={0:0.1f}*  Humidity={1:0.1f}%'.format(temperature, humidity)
else:
    print 'Failed to get reading. Try again!'
    sys.exit(1)

Sources :

A venir

Carte de la station météo WeatherG

weatherg_card

Voici la première carte WeatherG que je viens de recevoir. Celle-ci permet les relevés de températures, pression et humidité grâce aux DHT22 et BMP180.

J’ai conçu la carte afin de pouvoir l’emboiter, avec le connecteur J1, avec d’autres cartes maison. Le connecteur J2 est utile pour alimenter l’écran du PI.

Voici mon fichier source Fritzing : a venir

Je suis passé par le FritzFab pour la réalisation. A ce sujet, je trouve la qualité de fabrication très intéressante. Les délais sont très corrects. Le prix relativement abordable. Par contre gros bémol sur les frais de port, 15€ pour une lettre d’Allemagne, dommage qu’il n’y pas d’autres options qu’UPS. J’en ai eu pour un total de 48€.

Installation et configuration de MongoDB sous Debian

MongoDB est une base de type NoSQL très en vogue. Cette dernière est orientée document, c’est à dire que vos données ne sont plus des tables relationnelles mais des documents.

Installation

J’ai directement installé la version disponible dans les paquets de Debian (v2.4.10).

Mais vous pouvez installer la dernière version en suivant ce lien.

apt-get update 
apt-get install mongodb 
service mongod start

Configuration

Ici la configuration peut changer avec votre version. Je détaillerai la configuration YAML plus tard.

Important

Changed in version 2.6: MongoDB 2.6 introduces a YAML-based configuration file format. The 2.4 configuration file format remains for backward compatibility.

# mongodb.conf
# Version <= 2.4.x


# Where to store the data.
dbpath=/var/lib/mongodb

#where to log
logpath=/var/log/mongodb/mongodb.log

logappend=true

#bind_ip = 127.0.0.1
bind_ip = 0.0.0.0
#port = 27017

# Enable journaling, http://www.mongodb.org/display/DOCS/Journaling
journal=true

# Enables periodic logging of CPU utilization and I/O wait
#cpu = true

# Turn on/off security.  Off is currently the default
#noauth = true
auth = true

# Verbose logging output.
#verbose = true

# Inspect all client data for validity on receipt (useful for
# developing drivers)
#objcheck = true

# Enable db quota management
#quota = true

# Set oplogging level where n is
#   0=off (default)
#   1=W
#   2=R
#   3=both
#   7=W+some reads
#oplog = 0

# Diagnostic/debugging option
#nocursors = true

# Ignore query hints
#nohints = true

# Disable the HTTP interface (Defaults to localhost:27018).
#nohttpinterface = true

# Turns off server-side scripting.  This will result in greatly limited
# functionality
#noscripting = true

# Turns off table scans.  Any query that would do a table scan fails.
#notablescan = true

# Disable data file preallocation.
#noprealloc = true

# Specify .ns file size for new databases.
# nssize = <size>

# Accout token for Mongo monitoring server.
#mms-token = <token>

# Server name for Mongo monitoring server.
#mms-name = <server-name>

# Ping interval for Mongo monitoring server.
#mms-interval = <seconds>

# Replication Options

# in replicated mongo databases, specify here whether this is a slave or master
#slave = true
#source = master.example.com
# Slave only: specify a single database to replicate
#only = master.example.com
# or
#master = true
#source = slave.example.com

# Address of a server to pair with.
#pairwith = <server:port>
# Address of arbiter server.
#arbiter = <server:port>
# Automatically resync if slave data is stale
#autoresync
# Custom size for replication operation log.
#oplogSize = <MB>
# Size limit for in-memory storage of op ids.
#opIdMem = <bytes>

# SSL options
# Enable SSL on normal ports
#sslOnNormalPorts = true
# SSL Key file and password
#sslPEMKeyFile = /etc/ssl/mongodb.pem
#sslPEMKeyPassword = pass

bind_ip – L’adresse IP d’écoute. Par défaut 127.0.0.1  ce qui signifie que l’on ne peut se connecter que localement. Pour autoriser toutes les connexions, choisir 0.0.0.0 .

port – Le port d’écoute de mongod 27017  par défaut.

quiet – Indique à mongod de ne logger que les erreurs critiques.

logpath – Chemin vers le fichier de log ou mongod va écrire son journal.

logappend – A positionner à true pour indiquer à mongod de ne pas rincer le fichier log à chaque démarrage.

journal – A positionner à true pour être sur que mongod garantisse la consistance des données qu’il stocke.

auth – Authentification, voir le chapitre suivant sur la sécurité.

Sécurité

EN cours

Installation et quelques tricks autour de Docker sur Debian

Installation

En fonction des plateformes il existe plusieurs méthodes, j’ai choisi celle conseillée par la documentation.

Installer les dépendances :

apt-get install apt-transport-https ca-certificates

Ajouter la clé GPG

apt-key adv --keyserver hkp://p80.pool.sks-keyservers.net:80 --recv-keys 58118E89F3A912897C070ADBF76221572C52609D

Ajouter le dépot en fonction de votre configuration dans le fichier /etc/apt/sources.list.d/docker.list

Pour Jessie : deb https://apt.dockerproject.org/repo debian-jessie main

Pour les autres distributions, se fier à la documentation.

Enfin installer les paquets…

apt-get update
apt-get install docker-engine

Pour permettre à un utilisateur autre que root de contrôler Docker

# Add the docker group if it doesn't already exist.
$ sudo groupadd docker

# Add the connected user "${USER}" to the docker group.
# Change the user name to match your preferred user.
# You may have to logout and log back in again for
# this to take effect.
$ sudo gpasswd -a ${USER} docker

# Restart the Docker daemon.
$ sudo service docker restart

Configuration

Modifier les serveurs DNS

$ vi /etc/default/docker.io
 
# Use DOCKER_OPTS to modify the daemon startup options.
DOCKER_OPTS="-dns 208.67.220.220 -dns 208.67.220.222"

Installation de Docker Compose

Télécharger la version depuis GitHub

curl -L https://github.com/docker/compose/releases/download/1.6.2/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose

Et donner les droits d’éxécution :

chmod +x /usr/local/bin/docker-compose

Ajouter l’auto-completion pour le bash

curl -L https://raw.githubusercontent.com/docker/compose/$(docker-compose version --short)/contrib/completion/bash/docker-compose > /etc/bash_completion.d/docker-compose

Commandes

Lister les images disponibles

docker images -a

Stopper un conteneur détaché (docker run -d nom_conteneur)

docker stop nom_conteneur

Lister les conteneurs

docker container ls

 

 

Suite à venir

Sources

Installation

Nicolargo

https://docs.docker.com/engine/reference/run/

Let’s Encrypt et nginx

Afin de sécuriser mes différents sites j’utilisais un certificat standard non certifié. Puis est venu Let’s Encrypt qui permet d’avoir un certification toujours à jour et valide.

Installation

J’ai choisi une installation depuis GitHub :

git clone https://github.com/letsencrypt/letsencrypt /opt/letsencrypt –depth=1

Pour mettre à jour l’outil un git pull est suffisant.

Configuration

J’ai utilisé un fichier de configuration pour lister mes domaines.

# We use a 4096 bit RSA key instead of 2048
rsa-key-size = 4096

email = your@email.com
domains = domain.fr, sub.domain.fr

authenticator = webroot

# This is the webroot directory of your domain in which
# letsencrypt will write a hash in /.well-known/acme-challenge directory.
webroot-path = /var/www/html

Ajouter la configuration pour vos sites Nginx

server { 
    # .well-known doit resté accessible
    location ~ /\.well-known/acme-challenge {
          root /var/www/html/;
          try_files $uri /$1;
          allow all;;
    }

    # On interdit l'accès au dotfiles
    location ~ /\. { deny all; access_log off; log_not_found off; }
}

Génération des clés

/opt/letsencrypt/letsencrypt-auto certonly --config /usr/local/etc/le-domaine-webroot.ini

Ajout du block serveur sécurisé dans vos sites Nginx

server {

    # spdy pour Nginx < 1.9.5
    listen 443 ssl spdy;
    listen [::]:443 ssl spdy;
    spdy_headers_comp 9;

    # http2 pour Nginx >= 1.9.5
    #listen 443 ssl http2;
    #listen [::]:443 ssl http2;

    server_name mondomaine.fr;
    root /var/www/mondomaine.fr;
    index index.html index.htm;
    error_log /var/log/nginx/mondomaine.fr.log notice;
    access_log off;

    ####    Locations
    # On cache les fichiers statiques
    location ~* \.(html|css|js|png|jpg|jpeg|gif|ico|svg|eot|woff|ttf)$ { expires max; }
    # On interdit les dotfiles
    location ~ /\. { deny all; }


    #### SSL
    ssl on;
    ssl_certificate /etc/letsencrypt/live/mondomaine.fr/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/mondomaine.fr/privkey.pem;

    ssl_stapling on;
    ssl_stapling_verify on;
    ssl_trusted_certificate /etc/letsencrypt/live/mondomaine.fr/fullchain.pem;
    # Google DNS, Open DNS, Dyn DNS
    resolver 8.8.8.8 8.8.4.4 208.67.222.222 208.67.220.220 216.146.35.35 216.146.36.36 valid=300s;
    resolver_timeout 3s;



    ####    Session Tickets
    # Session Cache doit avoir la même valeur sur tous les blocs "server".
    ssl_session_cache shared:SSL:100m;
    ssl_session_timeout 24h;
    ssl_session_tickets on;
    # [ATTENTION] il faudra générer le ticket de session.
    ssl_session_ticket_key /etc/nginx/ssl/ticket.key;

    # [ATTENTION] Les paramètres Diffie-Helman doivent être générés
    ssl_dhparam /etc/nginx/ssl/dhparam4.pem;



    ####    ECDH Curve
    ssl_ecdh_curve secp384r1;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_prefer_server_ciphers on;
    ssl_ciphers 'ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!3DES:!MD5:!PSK';

}

Génération des clefs utilisées pour les sessions et le Diffie-Helman

mkdir -p /etc/nginx/ssl &&
openssl rand 48 -out /etc/nginx/ssl/ticket.key &&
openssl dhparam -out /etc/nginx/ssl/dhparam4.pem 4096

Ajouter la ligne suivante dans votre crontab -e

30 3 * * 0 /opt/letsencrypt/letsencrypt-auto renew >> /var/log/letsencrypt/renewal.log

 

Sources

Grafikart

 

Matomo encountered an error: Uncaught Error: Class "Piwik\Plugins\CustomVariables\CustomVariables" not found in /var/www/piwik/core/Tracker/TrackerCodeGenerator.php:98 Stack trace: #0 /var/www/piwik/plugins/SitesManager/API.php(159): Piwik\Tracker\TrackerCodeGenerator->generate() #1 [internal function]: Piwik\Plugins\SitesManager\API->getJavascriptTag() #2 /var/www/piwik/core/API/Proxy.php(255): call_user_func_array() #3 /var/www/piwik/core/Context.php(28): Piwik\API\Proxy->Piwik\API\{closure}() #4 /var/www/piwik/core/API/Proxy.php(158): Piwik\Context::executeWithQueryParameters() #5 /var/www/piwik/core/API/Request.php(272): Piwik\API\Proxy->call() #6 /var/www/thegtricks/wp-content/plugins/wp-piwik/classes/WP_Piwik/Request/Php.php(46): Piwik\API\Request->process() #7 /var/www/thegtricks/wp-content/plugins/wp-piwik/classes/WP_Piwik/Request/Php.php(18): WP_Piwik\Request\Php->call() #8 /var/www/thegtricks/wp-content/plugins/wp-piwik/classes/WP_Piwik/Request.php(63): WP_Piwik\Request\Php->request() #9 /var/www/thegtricks/wp-content/plugins/wp-piwik/classes/WP_Piwik.php(1038): WP_Piwik\Request->perform() #10 /var/www/thegtricks/wp-content/plugins/wp-piwik/classes/WP_Piwik.php(1205): WP_Piwik->request() #11 /var/www/thegtricks/wp-content/plugins/wp-piwik/classes/WP_Piwik/TrackingCode.php(16): WP_Piwik->updateTrackingCode() #12 /var/www/thegtricks/wp-content/plugins/wp-piwik/classes/WP_Piwik.php(296): WP_Piwik\TrackingCode->__construct() #13 /var/www/thegtricks/wp-includes/class-wp-hook.php(324): WP_Piwik->addJavascriptCode() #14 /var/www/thegtricks/wp-includes/class-wp-hook.php(348): WP_Hook->apply_filters() #15 /var/www/thegtricks/wp-includes/plugin.php(517): WP_Hook->do_action() #16 /var/www/thegtricks/wp-includes/general-template.php(3066): do_action() #17 /var/www/thegtricks/wp-content/themes/twentyfifteen-child/footer.php(45): wp_footer() #18 /var/www/thegtricks/wp-includes/template.php(810): require_once('...') #19 /var/www/thegtricks/wp-includes/template.php(745): load_template() #20 /var/www/thegtricks/wp-includes/general-template.php(92): locate_template() #21 /var/www/thegtricks/wp-content/themes/twentyfifteen/archive.php(68): get_footer() #22 /var/www/thegtricks/wp-includes/template-loader.php(106): include('...') #23 /var/www/thegtricks/wp-blog-header.php(19): require_once('...') #24 /var/www/thegtricks/index.php(17): require('...') #25 {main} thrown (which lead to: Session must be started before any output has been sent to the browser; output started in /var/www/thegtricks/wp-includes/class-wp-styles.php/290)