In dieser Serie werden wir eine Benachrichtigungslampe mit Raspberry Pi erstellen.
Dieses Mal, das dritte Mal, ist der Hauptteil, der die gesamte "Benachrichtigungslampe" steuert. Diese Serie ist jetzt abgeschlossen.
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.
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.
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
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.
Warning Ich entschied mich für einen bescheidenen Klang, solange ich ihn bemerken konnte. 112860__paulnorthyorks__eighties-synth.wav http://www.freesound.org/people/paulnorthyorks/sounds/112860/
Error Ich habe einen Sound gewählt, der sich angespannt anfühlt. Der folgende Ton wird verarbeitet, um eine Klangquelle zu erstellen und zu verwenden, die sich dreimal wiederholt. 204425__jaraxe__alarmx3.wav http://www.freesound.org/people/JarAxe/sounds/204425/ Ich habe Audacity für die Verarbeitung verwendet.
Abu arbeitet wie folgt.
$ ./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
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()
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