[PYTHON] Visualisation de l'état d'utilisation de l'évier dans l'entreprise

Contexte

Je suis le genre de personne qui apporte le déjeuner au bureau, mais c'est pénible à laver. Le processus de rentrer à la maison et de laver la boîte à lunch est très douloureux. Par conséquent, je veux le laver dans l'évier de l'entreprise. Cependant, il y a pas mal de personnes dans l'entreprise qui pensent de la même manière, et elles doivent attendre une vacance dans la journée ou dans l'évier. Cela peut être un problème, et il y avait une histoire dont j'aimerais que vous soyez averti lorsqu'elle sera disponible. Et je pense que c'est rarement courant, mais j'ai entendu dire qu'un Raspberry PI inutilisé (ci-après dénommé Raspberry PI) a été déposé dans l'entreprise et j'ai pensé: "S'il y a une personne avec ça, je pense que je peux vous en informer?" Tel est le contexte.

Quoi faire

Il vous avertit lorsqu'il y a des personnes dans l'évier pendant un certain temps et lorsqu'il n'y a personne pendant un certain temps, il vous informe que vous êtes parti. Utilisez Slack comme destination de notification.

Achat de capteurs

J'ai besoin d'un capteur et d'un fil de liaison, mais j'ai tout dans Marutsu Akihabara Main Store. Le corps de la tarte Razz est également vendu.

Que préparer (celui utilisé cette fois)

Si vous ne voulez pas mettre une tarte à la râpe nue,

Ou je pense qu'il existe aussi une version self-made telle qu'une version en plastique.

Conditions préalables

procédure

Connectez et testez le capteur humain

Suivez le lien ci-dessous pour connecter le capteur humain et la tarte à la râpe et copier et exécuter le programme. [Raspberry Pi] Comment utiliser et utiliser le capteur humain self-made \ -CHASUKE \ .com

Si cela fonctionne sans aucun problème, la connexion est OK.

Essayez de jeter à Slack si les gens sont toujours là

Le capteur humain détecte un humain et réagit immédiatement, de sorte qu'il vous avertit lorsqu'une personne passe. Donc, je vous informerai lorsque je resterai pour une certaine période de temps. De plus, il y a eu de nombreux cas où il a été détecté qu'il n'y avait personne même s'il y avait une personne, donc s'il n'y a personne pendant N secondes, il est jugé que l'évier a été utilisé. C'est le code suivant.

sink_observer.py


from datetime import datetime
import RPi.GPIO as GPIO
import json
import logging
import requests
import sys
import time
​
GPIO_PIN = 18
SLACK_SETTINGS = {
    'url'        : '{URL du Webhook entrant}',
    'botname'    : 'qui sont les yeux',
    'icon'       : ':eyes',
    'start_using': 'Il y a des gens dans l'évier.',
    'finished'   : 'Il semble que vous ayez fini de l'utiliser.'
}
is_using = False
​
formatter = '%(levelname)s \t%(asctime)s\t%(message)s'
logging.basicConfig(filename='sink_observer.log', level=logging.INFO, format=formatter)
​
logger = logging.getLogger(__name__)
logger.setLevel(logging.INFO)
​
def push_to_slack(status):
    datas = {
        'username'   : SLACK_SETTINGS['botname'],
        'icon_emoji' : SLACK_SETTINGS['icon'],
        'text'       : SLACK_SETTINGS[status],
        'contentType': 'application/json'
    }
    payload = json.dumps(datas)
    requests.post(SLACK_SETTINGS['url'], payload)
​
def start_using():
    global is_using
​
    if is_using:
        return
    is_using = True
    push_to_slack('start_using')
    logger.info('start_using')
​
def finished():
    global is_using
​
    if not is_using:
        return
    is_using = False
    push_to_slack('finished')
    logger.info('finished')
​
def main(sleeptime, interval, retry):
    GPIO.setmode(GPIO.BCM)
    GPIO.setup(GPIO_PIN, GPIO.IN)
​
    detect_cnt = 0
    no_detect_cnt = 0
    try:
        logger.info('Fin:Ctrl+C')
        while True:
            if GPIO.input(GPIO_PIN) == GPIO.HIGH:
                detect_cnt += 1
                #Journal pour contrôle de fonctionnement
                logger.info('detect\tdetect_cnt:{}'.format(str(detect_cnt)))
                if detect_cnt <= 2: # HACK:En fait, il est plus facile de régler si vous pouvez également spécifier ici
                    time.sleep(interval)
                    continue
                detect_cnt = 0
                no_detect_cnt = 0
                start_using()
                time.sleep(sleeptime)
            else:
                no_detect_cnt += 1
                logger.info('no detect\tdetect_cnt:{}'.format(str(detect_cnt)))
                if no_detect_cnt <= retry:
                    time.sleep(interval)
                    continue
                detect_cnt = 0
                no_detect_cnt = 0
                finished()
                time.sleep(interval)
    except KeyboardInterrupt:
        logger.info('En cours de résiliation...')
    finally:
        GPIO.cleanup()
        logger.info('Nettoyage GPIO terminé')
​
if __name__ == '__main__':
    sleeptime = 10
    interval  = 3
    retry     = 10
    #Pour le réglage des paramètres
    if len(sys.argv) > 4:
        sleeptime = int(sys.argv[1])
        interval  = int(sys.argv[2])
        retry     = int(sys.argv[3])
​
    main(sleeptime, interval, retry)

Commencez

SSH dans la tarte aux râpes et procédez comme suit: Il vous suffit d'installer pip pour la première fois.

Ne fais que la première fois

$ pip3 install requests

À partir de la prochaine fois, c'est tout ce dont vous avez besoin

$ nohup python3 sink_observer.py &

Puisqu'il s'agit de «nohup» et de «&», il continuera à fonctionner même si la connexion SSH est déconnectée. Si vous voulez quitter, vous pouvez rechercher le numéro de processus avec ps aux | grep sink_observer.py et quitter avec kill {numéro de processus}.

Réutiliser une boîte de tarte aux râpes

Je pensais que c'était nu, alors j'ai traité la boîte en plastique qui contenait la tarte aux râpes. J'ai dessiné un marqueur de manière appropriée à l'endroit où le câble GPIO / USB / alimentation / LAN était passé, j'ai fait un trou avec un étau à goupille, puis j'ai coupé le bord avec un couteau design. La boîte que j'ai traitée cette fois-ci était en plastique polypropylène, et elle se cassait lorsque je la portais sur le côté, il était donc important de faire un trou avec un étau à goupille. Après cela, faites un trou à un endroit approprié dans le boîtier, passez un fil et fixez le capteur humain, et vous avez terminé. Il s'est avéré être quelque chose comme ça. Le papier à lettres est au premier plan car le capteur humain a un angle de vision de 100 °, ce qui limite le champ de vision pour éviter les faux positifs (une mesure d'urgence complète). IMG_5364.JPG

Postscript (23/01/2019)

J'ai fait ce qui suit car cela fait trop mal un faux positif. 2DA5332C-AF54-4545-B96F-2FC82EF70528.jpeg

En conséquence, le taux de faux positifs a fortement chuté.

À propos des faux positifs

C'est juste une hypothèse. La conclusion est que le capteur réagissait à la lumière visible. Le contenu spécifique des faux positifs

C'était ça. La caractéristique du capteur est un capteur infrarouge qui utilise un élément à charbon. L'élément charbon lui-même, dans une interprétation approximative, peut détecter les rayons infrarouges et la lumière (lumière visible). La théorie est que le corps humain émet des rayons infrarouges, il peut donc être utilisé comme capteur humain. Cependant, il ne détecte pas seulement les rayons infrarouges, mais réagit également à la ** lumière visible, c'est-à-dire à la lumière que nous voyons **. Raspeye et le dongle Wi-Fi émettaient clairement de la lumière visible, donc la détection de cela entraînerait un faux positif. Les améliorations apportées ont été apportées dans le but d'éloigner le capteur de la lumière émise par la tarte à la râpe et de la lumière émise par le dongle Wi-Fi, et de limiter l'angle de vision à 100 ° du capteur pour lui donner une directivité. est. J'en ai fait un à grande échelle avec des planches en plastique et des bâtons en plastique, mais si je peux faire de même, je pense qu'il n'est pas nécessaire de le faire jusqu'à présent. Cela élimine les faux positifs causés par plusieurs personnes passant devant l'évier et les faux positifs causés par la détection de la lumière du dongle Wi-Fi / Rasp Pie la nuit. Après cela, le taux de faux positifs semble être inférieur à 1%.

Résumé

~~ Il sera faussement détecté. C'est inévitable car il y a un lavabo dans un endroit très fréquenté ... Cependant, il fonctionne correctement, donc si vous concevez un algorithme ou ajustez les paramètres, ce sera à un niveau pratique. Vous n'avez plus à attendre qu'il coule ou à retourner à votre place parce que vous l'utilisez ... j'espère!

Recommended Posts

Visualisation de l'état d'utilisation de l'évier dans l'entreprise
Analyser l'état d'utilisation de l'application de confirmation de contact (COCOA) publiée dans "Image" / Tesseract
[Blender] Connaître l'état de sélection des objets cachés sur l'outliner
L'histoire de la participation à AtCoder
L'histoire du "trou" dans le fichier
Visualisez l'état de la réponse du recensement national 2020
J'ai vérifié l'état d'utilisation du parking à partir d'images satellite.
Utilisation de TensorFlow dans l'environnement de développement intégré Cloud 9 - Principes d'utilisation -
[Comprendre en 3 minutes] Le début de Linux
L'histoire d'une erreur dans PyOCR
Implémenter une partie du processus en C ++
Gratter l'historique d'utilisation du cycle communautaire
Le résultat de l'installation de python sur Anaconda
L'utilisation de TensorBoard a légèrement changé
Principes de base pour exécuter NoxPlayer en Python
Afficher le statut de l'infection COVID 19 au Japon avec Splunk (version GitHub)
Utilisation d'opérateurs non logiques de ou en python
À la recherche du FizzBuzz le plus rapide en Python
Statut de chaque système de traitement Python en 2020
Sortie du nombre de cœurs de processeur en Python
Signification de {numéro de version} dans le package mysql rpm
[Python] Trier la liste de pathlib.Path dans l'ordre naturel
Changer la taille de police de la légende dans df.plot
Récupérer l'appelant d'une fonction en Python
Faites correspondre la distribution de chaque groupe en Python
Copiez la liste en Python
Trouvez le nombre de jours dans un mois
Lire la sortie du sous-processus, ouvrir en temps réel
Découvrez la fraction de la valeur saisie en python
L'histoire de la recherche du n optimal dans N poing
Correction des arguments de la fonction utilisée dans map
Trouvez la solution de l'équation d'ordre n avec python
L'histoire de la lecture des données HSPICE en Python
[Note] À propos du rôle du trait de soulignement "_" en Python
Résolution d'équations de mouvement en Python (odeint)
Sortie sous la forme d'un tableau python
L'histoire de l'affichage des fichiers multimédias dans Django
Rechercher par la valeur de l'instance dans la liste
Rendre la progression de dd visible sur la barre de progression
Organisez l'utilisation super basique des Autotools et de pkg-config
Vérifiez l'état des données à l'aide de pandas_profiling
Extrayez l'erreur de code d'état de la série 400500 du journal d'accès Apache en spécifiant la plage de temps
Scraping de l'historique d'utilisation du cycle de la communauté Version PhantomJS
Découvrez la bonne efficacité de calcul de la vectorisation en Python
Spécifier le modèle d'éclairage du matériau SCN dans Pythonista
Utilisé depuis l'introduction de Node.js dans l'environnement WSL
Comment obtenir le nombre de chiffres en Python
À la recherche du meilleur stéréogramme à points aléatoires (RDS).
L'histoire de la création de l'environnement Linux le plus rapide au monde
Comptez le nombre de paramètres dans le modèle d'apprentissage en profondeur
○○ Résolution de problèmes dans le département de mathématiques avec optimisation
Omettre les graduations du graphique après la virgule décimale dans matplotlib
Python - Explication et résumé de l'utilisation des 24 meilleurs packages
[python] Récupère la liste des classes définies dans le module
Prenez note de la liste des utilisations de base de Pandas
À propos des tests dans la mise en œuvre de modèles d'apprentissage automatique
L'histoire de FileNotFound en Python open () mode = 'w'