[PYTHON] Visualisierte den Nutzungsstatus der Spüle im Unternehmen

Hintergrund

Ich bin der Typ, der das Mittagessen ins Büro bringt, aber es ist ein Schmerz, sich zu waschen. Der Prozess, nach Hause zu gehen und die Brotdose zu waschen, ist sehr schmerzhaft. Deshalb möchte ich es in der Spüle der Firma waschen. Es gibt jedoch einige Leute in der Firma, die genauso denken und tagsüber oder in der Spüle auf eine freie Stelle warten müssen. Dies kann ein Ärger sein, und es gab eine Geschichte, die ich möchte, dass Sie benachrichtigt werden, sobald sie verfügbar ist. Und ich denke, das ist selten üblich, aber ich habe gehört, dass ein nicht verwendeter Himbeer-PI (im Folgenden als "Himbeer-PI" bezeichnet) in der Firma eingestellt wurde und ich dachte: "Ich glaube, ich kann Sie benachrichtigen, wenn es eine Person mit diesem gibt?" Dies ist der Hintergrund.

Was zu machen

Es benachrichtigt Sie, wenn sich für einen bestimmten Zeitraum Personen in der Spüle befinden, und wenn sich für einen bestimmten Zeitraum keine Personen in der Spüle befinden, werden Sie darüber informiert, dass Sie fort sind. Verwenden Sie Slack als Benachrichtigungsziel.

Beschaffung von Sensoren

Ich brauche einen Sensor und ein Überbrückungskabel, aber ich habe alles im Marutsu Akihabara Main Store. Razz Pie selbst wird ebenfalls verkauft.

Was zuzubereiten ist (derjenige, der diesmal verwendet wurde)

Wenn Sie einen Raspeltorte nicht nackt machen wollen,

Oder ich denke, dass es auch eine selbstgemachte Version wie eine Plastikversion gibt.

Voraussetzungen

Verfahren

Schließen Sie den menschlichen Sensor an und testen Sie ihn

Folgen Sie dem Link unten, um den menschlichen Sensor und den Raspelkuchen zu verbinden und das Programm zu kopieren und auszuführen. [Raspberry Pi] Verwendung und Verwendung des selbst hergestellten menschlichen Sensors \ -CHASUKE \ .com

Wenn es ohne Probleme funktioniert, ist die Verbindung in Ordnung.

Versuche zu Slack zu werfen, wenn noch Leute da sind

Der menschliche Sensor erkennt einen Menschen und reagiert sofort, sodass er Sie benachrichtigt, wenn eine Person vorbeikommt. Also werde ich Sie benachrichtigen, wenn ich für einen bestimmten Zeitraum bleibe. Darüber hinaus wurde in vielen Fällen festgestellt, dass es keine Person gab, auch wenn es eine Person gab. Wenn also N Sekunden lang keine Person anwesend war, wird beurteilt, dass die Spüle benutzt wurde. Das ist der folgende Code.

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'        : '{Eingehende Webhook-URL}',
    'botname'    : 'Wer hat die Augen?',
    'icon'       : ':eyes',
    'start_using': 'Es sind Leute in der Spüle.',
    'finished'   : 'Es scheint, dass Sie es nicht mehr verwenden.'
}
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('Ende:Ctrl+C')
        while True:
            if GPIO.input(GPIO_PIN) == GPIO.HIGH:
                detect_cnt += 1
                #Protokoll zur Funktionsprüfung
                logger.info('detect\tdetect_cnt:{}'.format(str(detect_cnt)))
                if detect_cnt <= 2: # HACK:Eigentlich ist es einfacher einzustellen, wenn Sie auch hier angeben können
                    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('Im Prozess der Kündigung...')
    finally:
        GPIO.cleanup()
        logger.info('GPIO-Reinigung abgeschlossen')
​
if __name__ == '__main__':
    sleeptime = 10
    interval  = 3
    retry     = 10
    #Zur Parametereinstellung
    if len(sys.argv) > 4:
        sleeptime = int(sys.argv[1])
        interval  = int(sys.argv[2])
        retry     = int(sys.argv[3])
​
    main(sleeptime, interval, retry)

Anlaufen

SSH in die Raspeltorte und machen Sie Folgendes: Sie müssen pip nur zum ersten Mal installieren.

Mach es nur beim ersten mal

$ pip3 install requests

Ab dem nächsten Mal ist dies alles, was Sie brauchen

$ nohup python3 sink_observer.py &

Da es "nohup" und "&" ist, funktioniert es auch dann weiter, wenn die SSH-Verbindung getrennt wird. Wenn Sie beenden möchten, können Sie die Prozessnummer mit ps aux | grep sink_observer.py nachschlagen und mit kill {process number} beenden.

Wiederverwendung einer Schachtel Raspeltorte

Ich dachte, es sei nackt, also verarbeitete ich die Plastikbox, die den Raspeltorte enthielt. Ich zeichnete eine geeignete Markierung an der Stelle, an der das GPIO- / USB- / Netzteil- / LAN-Kabel geführt wurde, bohrte ein Loch mit einem Schraubstock und schnitt dann die Kante mit einem Designmesser ab. Die Schachtel, die ich dieses Mal verarbeitete, bestand aus Kunststoff auf Polypropylenbasis und brach, als ich sie seitlich trug. Daher war es wichtig, ein Loch mit einem Schraubstock zu machen. Machen Sie danach an einer geeigneten Stelle im Gehäuse ein Loch, führen Sie einen Draht durch und befestigen Sie den menschlichen Sensor. Fertig. Es stellte sich heraus, dass es so etwas war. Das Notizpapier steht im Vordergrund, da der menschliche Sensor einen Betrachtungswinkel von 100 ° hat, der das Sichtfeld einschränkt, um Fehlalarme zu vermeiden (eine vollständige Notfallmaßnahme). IMG_5364.JPG

Nachtrag (23.01.2019)

Ich habe folgendes gemacht, weil es ein falsches Positiv zu schlecht macht. 2DA5332C-AF54-4545-B96F-2FC82EF70528.jpeg

Infolgedessen sank die Falsch-Positiv-Rate stark.

Über falsch positive Ergebnisse

Es ist nur eine Hypothese. Aus der Schlussfolgerung geht hervor, dass der Sensor auf sichtbares Licht reagiert hat. Der spezifische Inhalt von False Positives

Es war das. Das Merkmal des Sensors ist ein Infrarotsensor, der ein Holzkohleelement verwendet. Das Kohleelement selbst kann in einer groben Interpretation Infrarotstrahlen und Licht (sichtbares Licht) erfassen. Die Theorie besagt, dass der menschliche Körper Infrarotstrahlen aussendet, sodass er als menschlicher Sensor verwendet werden kann. Es erfasst jedoch nicht nur Infrarotstrahlen, sondern reagiert auch auf ** sichtbares Licht, dh das Licht, das wir sehen **. Raspeye und Wi-Fi-Dongle emittierten deutlich sichtbares Licht. Wenn Sie dies erkennen, würde dies zu einem falsch positiven Ergebnis führen. Die vorgenommenen Verbesserungen wurden mit dem Ziel vorgenommen, den Sensor von dem vom Raspeltorte und vom Wi-Fi-Dongle emittierten Licht fernzuhalten und den Betrachtungswinkel des Sensors von 100 ° zu begrenzen, um ihm Richtwirkung zu verleihen. ist. Ich habe eine großformatige mit Plastikbrettern und Plastikstäbchen gemacht, aber wenn ich das gleiche kann, denke ich, ist es nicht notwendig, es so weit zu machen. Dies eliminiert Fehlalarme, die durch mehrere Personen verursacht werden, die vor dem Waschbecken vorbeikommen, und Fehlalarme, die durch das Erkennen von Raspeltorten- / Wi-Fi-Dongle-Licht in der Nacht verursacht werden. Danach scheint die Falsch-Positiv-Rate weniger als 1% zu betragen.

Zusammenfassung

~~ Es wird fälschlicherweise erkannt. Es gibt ein Waschbecken an einem belebten Ort, also kann man nicht anders ... Es funktioniert jedoch ordnungsgemäß. Wenn Sie also einen Algorithmus entwickeln oder die Parameter anpassen, befindet er sich auf einem praktischen Niveau. Jetzt müssen Sie nicht mehr warten, bis es fließt, oder zu Ihrem Platz zurückkehren, weil Sie es benutzen ... Ich hoffe!

Recommended Posts

Visualisierte den Nutzungsstatus der Spüle im Unternehmen
Analysieren Sie den Nutzungsstatus der Kontaktbestätigungsanwendung (COCOA), die in "Image" / Tesseract veröffentlicht ist
[Blender] Kennen Sie den Auswahlstatus von versteckten Objekten im Outliner
Die Geschichte der Teilnahme an AtCoder
Die Geschichte des "Lochs" in der Akte
Visualisieren Sie den Antwortstatus der Volkszählung 2020
Ich habe den Nutzungsstatus des Parkplatzes anhand von Satellitenbildern überprüft.
Verwenden von TensorFlow in Cloud 9 Integrierte Entwicklungsumgebung - Grundlagen der Verwendung
[Verständnis in 3 Minuten] Der Beginn von Linux
Die Geschichte eines Fehlers in PyOCR
Implementieren Sie einen Teil des Prozesses in C ++
Scraping des Nutzungsverlaufs des Community-Zyklus
Das Ergebnis der Installation von Python auf Anaconda
Die Verwendung von TensorBoard hat sich geringfügig geändert
Grundlagen zum Ausführen von NoxPlayer in Python
Zeigen Sie den Status der COVID 19-Infektion in Japan mit Splunk an (GitHub-Version).
Nicht logische Operatorverwendung von oder in Python
Auf der Suche nach dem schnellsten FizzBuzz in Python
Status jedes Python-Verarbeitungssystems im Jahr 2020
Geben Sie die Anzahl der CPU-Kerne in Python aus
Bedeutung von {Versionsnummer} im MySQL-RPM-Paket
[Python] Sortieren Sie die Liste von pathlib.Path in natürlicher Reihenfolge
Ändern Sie die Schriftgröße der Legende in df.plot
Holen Sie sich den Aufrufer einer Funktion in Python
Passen Sie die Verteilung jeder Gruppe in Python an
Kopieren Sie die Liste in Python
Finden Sie die Anzahl der Tage in einem Monat
Lesen Sie die Ausgabe von subprocess.Popen in Echtzeit
Finden Sie den Bruchteil des in Python eingegebenen Werts heraus
Die Geschichte, das optimale n in N Faust zu finden
Korrigieren Sie die Argumente der in map verwendeten Funktion
Finden Sie die Lösung der Gleichung n-ter Ordnung mit Python
Die Geschichte des Lesens von HSPICE-Daten in Python
[Hinweis] Über die Rolle des Unterstrichs "_" in Python
Lösen von Bewegungsgleichungen in Python (odeint)
Ausgabe in Form eines Python-Arrays
Die Geschichte der Anzeige von Mediendateien in Django
Suchen Sie nach dem Wert der Instanz in der Liste
Machen Sie den Fortschritt von dd in der Fortschrittsanzeige sichtbar
Organisieren Sie die grundlegende Verwendung von Autotools und pkg-config
Überprüfen Sie den Status der Daten mit pandas_profiling
Extrahieren Sie den Statuscodefehler der Serie 400.500 des Apache-Zugriffsprotokolls, indem Sie den Zeitbereich angeben
Scraping Community Cycle Nutzungsverlauf PhantomJS-Version
Erleben Sie die gute Berechnungseffizienz der Vektorisierung in Python
Geben Sie das Beleuchtungsmodell für SCN-Material in Pythonista an
Wird ab der Einführung von Node.js in der WSL-Umgebung verwendet
So ermitteln Sie die Anzahl der Stellen in Python
Auf der Suche nach dem besten zufälligen Punktstereogramm (RDS).
Die Geschichte des Aufbaus der schnellsten Linux-Umgebung der Welt
Zählen Sie die Anzahl der Parameter im Deep-Learning-Modell
○○ Probleme im Fachbereich Mathematik mit Optimierung lösen
Lassen Sie die Häkchen nach dem Dezimalpunkt in matplotlib weg
Python - Erläuterung und Zusammenfassung der Verwendung der 24 wichtigsten Pakete
[Python] Ruft die Liste der im Modul definierten Klassen ab
Notieren Sie sich die Liste der grundlegenden Verwendungszwecke von Pandas
Über das Testen bei der Implementierung von Modellen für maschinelles Lernen
Die Geschichte von FileNotFound im Python open () -Modus = 'w'