@ -0,0 +1,79 @@ | |||
Terrarium | |||
========= | |||
Application web qui met en graphiques les mesures de température | |||
et d'hygrométrie ainsi que la vidéo surveillance d'un terrarium | |||
munie d'un Raspberry PI. | |||
Le Raspberry PI utilisé est le modèle 4 avec 2Go de RAM muni de | |||
Raspbian Lite. La vidéo s'appuie sur la caméra fisheyes à vision | |||
nocturne et le logiciel Motion combiné au frontend MotionEye. | |||
Le capteur est un AM2302 et mesure la température et l'hygrométrie. | |||
[Lire l'article de blog dédié à ce projet](https://www.deblan.io/post/580/monitoring-d-un-terrarium) | |||
 | |||
Installation | |||
------------ | |||
### Récupération du projet et installation des dépendances | |||
Développé et testé avec PHP 7.4, [composer](https://getcomposer.org/) et [npm](https://www.npmjs.com/) requis. | |||
``` | |||
git clone https://gitnet.fr/deblan/terrarium-web.git | |||
cd terrarium-web | |||
composer install | |||
npm install | |||
``` | |||
### Configuration | |||
Éditer le fichier `.env` et renseigner [`DATABASE_URL`](https://symfony.com/doc/4.4/configuration.html#configuring-environment-variables-in-env-files). Indiquer également l'adresse web de la caméra (via motion). | |||
``` | |||
php bin/console doctrine:migrations:diff | |||
php bin/console doctrine:migrations:execute --up XXXXXXXXXXXXX | |||
``` | |||
Exemples d'appels à l'API avec [httpie](https://httpie.org/) | |||
------------------------------------------------------------ | |||
Ajouter une mesure de température :et une mesure d'hygrométrie : | |||
``` | |||
http POST 'https://application/api/temperature/create' date='2020/04/04 18:40:02' value=30.200000762939453 | |||
``` | |||
Ajouter une mesure d'hygrométrie : | |||
``` | |||
http POST 'https://application/api/hygrometry/create' date='2020/04/04 18:40:02' value=25.799999237060547 | |||
``` | |||
Videos | |||
------ | |||
Les vidéos générées par Motion doivent être copiées dans `public/motion/snapshots`. | |||
Voici le script qui réalise la copie depuis le serveur de l'application web : | |||
``` | |||
#!/bin/sh | |||
SNAPSHOTS_DIRECTORY="$HOME/web/motion/snapshots/" | |||
rsync -avz --exclude lastsnap.jpg pi@terrarium:/var/lib/motioneye/Camera1/ "$SNAPSHOTS_DIRECTORY" | |||
for PARENT in "$SNAPSHOTS_DIRECTORY"*; do | |||
for MOVIE in "$PARENT"/*.mp4; do | |||
THUMB="$(echo "$MOVIE" | sed 's/.mp4/.jpg/')" | |||
if [ ! -f "$THUMB" ]; then | |||
ffmpeg -i "$MOVIE" -vcodec mjpeg -vframes 1 -an -f rawvideo -s 300x168 -ss 1 "$THUMB" | |||
fi | |||
done | |||
done | |||
``` |
@ -0,0 +1,62 @@ | |||
{ | |||
"requires": true, | |||
"lockfileVersion": 1, | |||
"dependencies": { | |||
"bootstrap": { | |||
"version": "4.4.1", | |||
"resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-4.4.1.tgz", | |||
"integrity": "sha512-tbx5cHubwE6e2ZG7nqM3g/FZ5PQEDMWmMGNrCUBVRPHXTJaH7CBDdsLeu3eCh3B1tzAxTnAbtmrzvWEvT2NNEA==" | |||
}, | |||
"chart.js": { | |||
"version": "2.9.3", | |||
"resolved": "https://registry.npmjs.org/chart.js/-/chart.js-2.9.3.tgz", | |||
"integrity": "sha512-+2jlOobSk52c1VU6fzkh3UwqHMdSlgH1xFv9FKMqHiNCpXsGPQa/+81AFa+i3jZ253Mq9aAycPwDjnn1XbRNNw==", | |||
"requires": { | |||
"chartjs-color": "^2.1.0", | |||
"moment": "^2.10.2" | |||
} | |||
}, | |||
"chartjs-color": { | |||
"version": "2.4.1", | |||
"resolved": "https://registry.npmjs.org/chartjs-color/-/chartjs-color-2.4.1.tgz", | |||
"integrity": "sha512-haqOg1+Yebys/Ts/9bLo/BqUcONQOdr/hoEr2LLTRl6C5LXctUdHxsCYfvQVg5JIxITrfCNUDr4ntqmQk9+/0w==", | |||
"requires": { | |||
"chartjs-color-string": "^0.6.0", | |||
"color-convert": "^1.9.3" | |||
} | |||
}, | |||
"chartjs-color-string": { | |||
"version": "0.6.0", | |||
"resolved": "https://registry.npmjs.org/chartjs-color-string/-/chartjs-color-string-0.6.0.tgz", | |||
"integrity": "sha512-TIB5OKn1hPJvO7JcteW4WY/63v6KwEdt6udfnDE9iCAZgy+V4SrbSxoIbTw/xkUIapjEI4ExGtD0+6D3KyFd7A==", | |||
"requires": { | |||
"color-name": "^1.0.0" | |||
} | |||
}, | |||
"color-convert": { | |||
"version": "1.9.3", | |||
"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", | |||
"integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", | |||
"requires": { | |||
"color-name": "1.1.3" | |||
}, | |||
"dependencies": { | |||
"color-name": { | |||
"version": "1.1.3", | |||
"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", | |||
"integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" | |||
} | |||
} | |||
}, | |||
"color-name": { | |||
"version": "1.1.4", | |||
"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", | |||
"integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" | |||
}, | |||
"moment": { | |||
"version": "2.24.0", | |||
"resolved": "https://registry.npmjs.org/moment/-/moment-2.24.0.tgz", | |||
"integrity": "sha512-bV7f+6l2QigeBBZSM/6yTNq4P2fNpSWj/0e7jQcy87A8e7o2nAfP/34/2ky5Vw4B9S446EtIhodAzkFCcR4dQg==" | |||
} | |||
} | |||
} |
@ -1,6 +1,6 @@ | |||
{ | |||
"dependencies": { | |||
"bulma": "^0.8.0", | |||
"bootstrap": "^4.4.1", | |||
"chart.js": "^2.9.3" | |||
} | |||
} |