[PYTHON] Raspberry Pi "Honwaka Benachrichtigungslampe" Teil 3

Hilfe bei der Überwachung mit Raspberry Pi

In dieser Serie werden wir eine Benachrichtigungslampe mit Raspberry Pi erstellen. Blue.GIF

Dieses Mal, das dritte Mal, ist der Hauptteil, der die gesamte "Benachrichtigungslampe" steuert. Diese Serie ist jetzt abgeschlossen.

SystemDiagram2.png

Abu vorstellen

Alert Buster (kurz Abu) ist dafür verantwortlich, OpsGenie-Alarminformationen über den Detektor zu erfassen, den Status des überwachten Objekts zu identifizieren und die LED-Anzeige einzustellen. Es ist auch Abu's Aufgabe, das Glockenspiel nur einmal zu läuten, wenn ein neuer Alarm auftritt.

Nur ein Status kann die "Benachrichtigungslampe" für den Alarmstatus anzeigen, der möglicherweise mehrmals gleichzeitig vorhanden ist. Priorisieren Sie daher die Zustände, um den Zustand mit der höchsten Priorität anzuzeigen.

Beziehung zwischen dem von Abu gehandhabten Staat und dem Display

Abu behandelt die folgenden 6 Typen. Es gibt zwei Ebenen: "Fehler" und "Warnung". "Fehler" bedeutet, dass etwas in Eile behoben werden muss, und "Warnung" bedeutet etwas, das nicht in Eile ist, aber bestätigt werden muss. Es gibt zwei Zustände, unabhängig davon, ob sie erkannt wurden oder nicht.

"Unbekannt" wird verwendet, wenn der Status unbekannt ist, z. B. unmittelbar nach dem Start oder aufgrund eines Netzwerkproblems. Legen Sie die Farbe fest, die jedem Status und dem Blinkzyklus zugewiesen werden soll. Verwenden Sie für die Farbnamen wie "Magenta" die im vorherigen Artikel unter Led.COLORS definierten.

Priorität Alarmtyp Kognitiver Status Zustandswert Farbe Flackernder Zyklus Memo
1 Unbekannt - 1 Magenta 0 (kein Blinken)
2 Error Unerkannt 2 Red 0.5 Sekunden
3 Warnung Unerkannt 4 Yellow 2 Sekunden
4 Error Anerkannt 8 Green 2 Sekunden
5 Warnung Anerkannt 16 Green 6 Sekunden
6 Neuer Fehler - 32 - - Für Glockenspiele
7 Neue Warnung - 64 - - Für Glockenspiele
8 normal - 0 Blue 8 Sekunden

Abu behandelt diese Zustände als einen einzelnen ganzzahligen Wert "Zustandswert". Weisen Sie für "Statuswert" jeden Bitwert der Binärzahl zu, damit die Bitberechnung einfach ist. "Normal" bedeutet, dass alle Bits 0 sind, daher gibt es keine Bitzuordnung.

Intern wird die logische Summe von 7 Bits einschließlich der Glockenspielsteuerungsflags in der obigen Tabelle als ein Zustandswert verwendet. Wenn beispielsweise ein neuer Fehler vorliegt, der noch nicht erkannt wurde (bevor das Glockenspiel ertönt), lautet der Statuswert 0x22.

Der Statuswert wird durch einen einzelnen ganzzahligen Wert dargestellt, der für jedes Bit eine Bedeutung hat. Sie können jedoch den Set-Typ von Python verwenden, wobei der Schwerpunkt auf der Lesbarkeit liegt.

Glockenspiel

Wie man klingelt

Wenn ein neuer Fehler oder eine neue Warnung gefunden wird, ertönt das Glockenspiel nur einmal, um das Erkennen zu erleichtern. Das Glockenspiel spielt die vorbereitete Audiodatei ab, indem es an den Befehl aplay übergeben wird.

python


$ aplay --quiet /usr/share/sounds/alsa/Rear_Center.wav

Schließen Sie vorab einen Lautsprecher an die Kopfhörerbuchse oder den USB-Anschluss des Hauptgeräts an und stellen Sie ihn so ein, dass Ton zu hören ist. Referenz: https://www.google.co.jp/search?q=raspberrypi+aplay

Schallquelle

Die Glockenspiel-Tonquelle kann ein beliebiges Format sein, das von aplay unterstützt wird. In Abu habe ich Folgendes von freesound.org verwendet. Wenn Sie sich als Benutzer registrieren, können Sie es herunterladen. Überprüfen Sie daher die Lizenz und verwenden Sie sie.

Abu Verhalten

Abu arbeitet wie folgt.

Startmethode

$ ./abu.py ********-****-****-****-************

********-****-****-****-************Geben Sie für den Teil den im vorherigen Artikel eingeführten opsgenie-API-Schlüssel an. Wenn Sie sich in cron registrieren, damit es beim Start des Betriebssystems automatisch gestartet wird, wird empfohlen, es beispielsweise wie folgt zu cron hinzuzufügen.

$ crontab -e
@reboot cd path-to-module-dir;./abu.py ********-****-****-****-************ >/dev/nul 2>&1

Quellcode

abu.py


#!/usr/bin/env python
#coding:utf-8


import time
import os
from opsgenie import OpsGenie
from led_deamon import LedDeamon


class Abu(object):
    DOWN = 1
    ERR_UNACKED = 2
    WARN_UNACKED = 4
    ERR_ACKED = 8
    WARN_ACKED = 16
    ERR_NEW = 32
    WARN_NEW = 64
    NORMAL = 0
    ERROR_SOUND = "./204425__jaraxe__alarm-2.wav"
    WARNING_SOUND = "./112860__paulnorthyorks__eighties-synth.wav"

    STATE_MAP = {
        DOWN: {"color": "Magenta", "interval": "0"},
        ERR_UNACKED: {"color": "Red", "interval": "0.5"},
        WARN_UNACKED: {"color": "Yellow", "interval": "4"},
        ERR_ACKED: {"color": "Green", "interval": "4"},
        WARN_ACKED: {"color": "Green", "interval": "8"},
        NORMAL: {"color": "Blue", "interval": "8"}}

    def _state2mode(self, state):
        if state == Abu.NORMAL:
            return Abu.STATE_MAP[Abu.NORMAL]
        for s in (Abu.DOWN, Abu.ERR_UNACKED, Abu.WARN_UNACKED,
                  Abu.ERR_ACKED, Abu.WARN_ACKED):
            if state & s:
                return Abu.STATE_MAP[s]
        else:
            return Abu.STATE_MAP[Abu.NORMAL]
            return None

    def __init__(self, url, api_key):
        self.opsgenie = OpsGenie(url, api_key)

    def _summarize(self, list):
        state = Abu.NORMAL
        if list is None:
            state = Abu.DOWN
        else:
            for l in list:
                if l["error"]:
                    if l["acknowledged"]:
                        state |= Abu.ERR_ACKED
                    else:
                        state |= Abu.ERR_UNACKED
                        if l["new"]:
                            state |= Abu.ERR_NEW
                else:
                    if l["acknowledged"]:
                        state |= Abu.WARN_ACKED
                    else:
                        state |= Abu.WARN_UNACKED
                        if l["new"]:
                            state |= Abu.WARN_NEW
        return state

    def start(self):
        ld = LedDeamon()
        ld.set_mode(self._state2mode(Abu.DOWN))
        ld.start()
        while True:
            alert_list = self.opsgenie.detector()
            # print alert_list
            state = self._summarize(alert_list)
            # print hex(state)
            mode = self._state2mode(state)
            if mode:
                ld.set_mode(mode)
            if state & Abu.ERR_NEW:
                os.system("aplay " + Abu.ERROR_SOUND + "&")
            else:
                if state & Abu.WARN_NEW:
                    os.system("aplay " + Abu.WARNING_SOUND + "&")
            time.sleep(60)

if __name__ == '__main__':
    import sys

    if len(sys.argv) != 2:
        print("Usage: %s 'api-key for your OpsGenie account'." % sys.argv[0])
        print("Example: %s ********-****-****-****-************." % sys.argv[0])
        print("You can get your OpsGenie account at https://www.opsgenie.com.")
        exit()
    apiKey = sys.argv[1]
    a = Abu(apiKey)
    a.start()

Zurückblicken

Python-Studenten Ich habe versucht, Raspberry Pi zu verwenden. Es gibt auch Bibliotheken, die billig, leistungsstark und einfach zu bedienendes GPIO sind, und ich fand, dass sie für diese Zwecke hervorragend geeignet sind. Es gab einige Probleme wie LED-Farbsteuerung durch PWM, asynchrone Verarbeitung, Behandlung von Statuswerten, OpsGenie-Kooperation usw., aber glücklicherweise konnten wir für jedes eine vernünftige Lösung finden und diese abschließen. Ich tat. Die diesmal erzeugte "Benachrichtigungslampe" fügt sich ohne Unbehagen in die Atmosphäre des Arbeitsplatzes ein und ist im tatsächlichen Betrieb nützlich. Wenn Sie interessiert sind, probieren Sie es bitte aus.

Diese Serie endet mit diesem Artikel, aber ich werde ihn erneut veröffentlichen, wenn ich die nächste Idee habe.

Recommended Posts

Raspberry Pi "Honwaka Benachrichtigungslampe" Teil 2
Raspberry Pi "Honwaka Benachrichtigungslampe" Teil 1
Raspberry Pi "Honwaka Benachrichtigungslampe" Teil 3
Matrixmultiplikation auf Raspberry Pi GPU (Teil 2)
Pigpio auf Himbeer-Pi
Cython auf Raspberry Pi
Pyenv auf Raspberry Pi eingeführt
Verwenden Sie NeoPixel mit Himbeerkuchen
Installieren Sie OpenCV4 auf Raspberry Pi 3
Installieren Sie TensorFlow 1.15.0 auf Raspberry Pi
Testen der Kommunikation mit Raspberry Pi
Himbeer pi 1 Modell b, knotenroter Teil 17
MQTT auf Raspberry Pi und Mac
Himbeer Pi 4 Centos7 auf Docker installieren
Installieren Sie ghoto2 auf Raspberry Pi (Hinweis)
Versuchen Sie es mit ArUco mit Raspberry Pi
OpenCV-Installationsverfahren auf Raspberry Pi
Ein- / Ausschalten von Raspberry Pi mit Arduino
Erkennen Sie den Schalterstatus mit Raspberry Pi 3
Installieren Sie OpenMedia Vault 5 auf Raspberry Pi 4
L Chika mit Himbeer-Pi C #
Erstellen Sie wxPython unter Ubuntu 20.04 auf Himbeer-Pi 4
Telefonische Benachrichtigung, wenn eine Bewegung der Überwachungskamera auf dem Raspberry Pi erkannt wird
Erkennen Sie "Helligkeit" mit Python auf Raspberry Pi 3!
Aktivieren Sie die serielle UART + -Kommunikation mit Raspberry Pi
Beschleunigen Sie Deep Learning mit der Rasperry Pi 4-CPU
Stellen Sie den Swap Space unter Ubuntu auf Raspberry Pi ein
Normal programmieren mit Node-RED-Programmierung mit Raspberry Pi 3
Verwenden Sie den Grove-Sensor mit Raspberry Pi
Installieren Sie das 64-Bit-Betriebssystem (Bate) auf Raspberry Pi
Installieren Sie Docker-Compose unter 64-Bit-Raspberry-Pi-Betriebssystem
Lassen Sie einen Servomotor mit Python auf Raspberry Pi 3 laufen
Arbeiten mit Sensoren in Mathematica auf Raspberry Pi
Erstellen Sie eine OpenCV-Python-Umgebung auf Raspberry Pi B +
Ermitteln Sie die Temperatur mit Python auf Raspberry Pi 3!
So installieren Sie NumPy auf Raspeye
Arbeiten mit GPS in Python für Raspberry Pi 3
Machen Sie ein Thermometer mit Raspberry Pi und machen Sie es im Browser Teil 3 sichtbar
Easy Raspberry Pi GUI App Entwicklung Anfänger Teil 1
Warum DetectMultiScale () auf Raspberry Pi B + langsam ist
Erkennen Sie Schiebeschalter mit Python auf Raspberry Pi 3!
Erstellen Sie eine Django-Umgebung auf Raspai (MySQL)
Versuchen Sie, QR-Code mit Raspberry Pi zu verwenden
Erkennen Sie Magnetschalter mit Python auf Raspberry Pi 3!
Genießen Sie die elektronische Arbeit mit GPIO von Raspberry Pi
Schalten Sie Ihren PC mit Himbeer-Pi ein / aus
Easy Raspberry Pi GUI App Entwicklung Anfänger Teil 2
Grove - Temperatur- und Feuchtigkeitssensor (DHT11) mit Raspberry Pi
Stellen Sie DHT11 mit Raspeye + Python zur Verfügung (Hinweis)
Cross-Compilierung für Raspberry Pi Zero unter Ubuntu gestartet
Lassen Sie den Summer mit Python auf Raspberry Pi 3 erklingen!
Erstellen Sie ein Besuchermeldungssystem mit Raspberry Pi
Zeigen Sie die CPU-Temperatur alle 5 Sekunden auf dem Raspberry Pi 4 an
Einführung von Ceph mit Kubernetes auf Raspberry Pi 4B (ARM64)
Stellen Sie mit Python auf Raspberry Pi eine Verbindung zu MySQL her
Erstellen Sie eine Python-Entwicklungsumgebung auf Raspberry Pi
Erstellen Sie eine Arch Linux-Umgebung auf Raspai