Verwaltung von Haushaltsgeräten („Smart Home“) über einen Chat-Bot auf Raspberry Pi

  • Tutorial
In diesem Projekt starten wir unsere iOS-, Android- oder Webanwendung und schreiben (oder fügen ein wenig hinzu) einen Chat-Bot auf Python, der Sockets über ein Funkmodul steuert, das mit dem Raspberry Pi verbunden ist.

Auf diese Weise können wir Haushaltsgeräte verwalten und über einen gemeinsamen Chat ferngesteuert und gemeinsam mit anderen Benutzern Status von ihnen erhalten.

Interessant?

Und warum?


Die Frage "Warum wird das benötigt?" Es ist nicht immer akut für Projekte aus der "Smart Home" -Serie und für alle Arten von Internet der Dinge. Hier wird oft viel Zeit und Geld aufgewendet, um etwas zu automatisieren, das in der Praxis bequemer auf die altmodische Weise mit einem gewöhnlichen Wandschalter umzuschalten ist :-) Aber gleichzeitig macht es Ihnen viel Spaß und nützliche Erfahrung in dem Prozess und freuen uns weiter über die gute Arbeit des Mechanismus, den er gemacht hat.

Zusätzlich zu den oben genannten Freuden scheint es mir, dass die Verwaltung eines Hauses und die Kommunikation über Chat, insbesondere das XMPP-Protokoll, aus folgenden Gründen das Recht auf Leben hat:

  • Menschliche Sprache - Es ist ziemlich einfach, den Chat-Bot in menschlicher Sprache mit Ihnen zu kommunizieren, was besonders für weniger technische Familienmitglieder sehr praktisch ist. Außerdem können Sie in Zukunft die Sprachsteuerung anschließen.
  • Universeller Fernzugriff - Sie können von überall und von jedem Jabber-kompatiblen IM-Client aus eine Verbindung zum XMPP-Chat-Server herstellen. Es ist praktisch für Menschen, aber wie Sie Geräte anschließen, wird in diesem Artikel beschrieben.
  • Bequemes Management für die ganze Familie - verbinden Sie Ihre Haustiere mit einem einzigen Gruppenchat, in dem die Bots für das Haus oder die Geräte im Haus verantwortlich sind. Sie können Ihre Familienangelegenheiten besprechen, während Sie Ihr Zuhause verwalten. Jeder sieht, wer welche Befehle an die Geräte gesendet hat. Sie können ihre (Bots-) Antworten und Berichte sehen, die vorherige Geschichte anzeigen usw. Das ist bequem.
  • Ein System unabhängiger verteilter Agenten . Jedes Gerät oder jeder Satz von Sensoren, die einen Vertreter (tatsächlich einen Benutzer) im Chat haben, sind unabhängige Agenten und können mit anderen Geräten kommunizieren und von diesen oder Ihnen direkt gesteuert werden. Ein einzelner Server ist optional. Sie können Ihren Chat-Bot für jedes wichtige Gerät oder jeden wichtigen Sensor erhöhen und den Haupt-Bot mit KI-Elementen wie einem „Butler“ oder „Majordomo“ konfigurieren, die alle Geräte verwalten, und sie werden in einem Chat chatten, auf den Sie und andere Familienmitglieder zugreifen können In einer Sprache, die Sie verstehen, können Sie jederzeit verfolgen, was passiert ist, oder in den Prozess eingreifen.


Requisiten


Für dieses Mini-Projekt benötigen wir die folgenden Komponenten:

1. Raspberri P.
Ich habe ein Modell B, ich habe es nur einen Tag vor der Ankündigung der Veröffentlichung von B + bestellt, aber im Prinzip wird jedes Modell hier funktionieren. Hauptsache ist, dass die GPIO-Pins mit dem Steuermodul kompatibel sind welche du wählst. Darüber unten.
Nun, und so ist die Hauptanforderung, einen Chat-Bot auf Python zu starten.



2. Zubehör für Ihren Pi.
WiFi-Modul, einfache USB-Tastatur und -Maus, SD-Speicherkarte mit Raspbian-Verteilung, Netzteil, optional ein Kunststoffgehäuse.
Dies ist der Standard für Himbeeren, aber weil Ich habe es zum ersten Mal gekauft, insbesondere für dieses Projekt. Ich wusste nicht, dass WLAN- und SD-Karten nicht im Standardpaket enthalten sind, und ich musste nachbestellen. Denken Sie also daran. Zum Konfigurieren benötigen Sie außerdem einen Monitor oder ein Fernsehgerät mit einem HDMI-Kabel.



3. Das Steuermodul (HF-Sender) und Steckdosen oder andere Geräte mit einem Empfänger (HF-Empfänger).
Hier muss ich sagen, dass ich einen schnellen oder faulen Weg gegangen bin und bei Energenie ein fertiges HF-Modul für Pi und einen Satz funkgesteuerter Steckdosen bestellt habe. Das Kit wird mit einem vorgefertigten HF-Sender geliefert, der an die GPIO-Pins Ihrer Himbeere angeschlossen wird. Es gibt Alternativen zu allen, die diesen Weg nicht mögen. Im Internet gibt es viele Anleitungen, wie Sie einen Code für vorhandene funkgesteuerte Geräte abrufen und über einen einfachen, billigen chinesischen HF-Sender steuern können. Alternativ können Sie die Geräte über Pi direkt über eine direkte Kabelverbindung mit GPIO sowie über WLAN und andere Kanäle steuern.

Hier ist ein Foto meines Energenie-Kits:




4. Chat-Client.
Dieses Tutorial verwendet Q-municateDies ist ein Open Source Messenger von unserer QuickBlox-Plattform, der von Github heruntergeladen und unter iOS, Android erstellt oder die Webversion auf Desktop- und anderen Plattformen ausgeführt werden kann. Der Vorteil der Verwendung von Q-municate besteht darin, dass Sie die Benutzeroberfläche selbst anpassen und Ihre eigene Anwendung erstellen können, beispielsweise nur für Ihre Familie.
Dies ist aber absolut nicht notwendig. Sie können jeden Jabber / XMPP-kompatiblen Client verwenden, z. B. Adium.

Also fangen wir an.

Installations- / Abhängigkeitsverteilungen für Raspbian


Wir melden uns bei der Himbeere an und legen die folgenden Dinge unter die Wurzel:
apt-get install python-dev
pip install sleekxmpp
pip install dnspython
pip install pyasn1 pyasn1-modules
apt-get install python-rpi.gpio

Wir brauchen eigentlich sleekxmpp, dies ist ein Basisprojekt für einen Chat-Bot, und der Rest löst Probleme mit verschiedenen Abhängigkeiten für dieses Projekt. Mit python-rpi.gpio können Sie die GPIO-Himbeer-Pins über unser Python-Skript steuern.

Wir schließen das Funksteuermodul an und überprüfen es


Wenn Sie ein anderes Modul verwenden, nicht von Energenie, müssen Sie diesen Teil selbst untersuchen.

Bei Verwendung des vorgefertigten Pi-Mote-Moduls wird alles einfach und gut in den offiziellen Anweisungen des Herstellers beschrieben: energenie4u.co.uk/res/pdfs/ENER314%20UM.pdf

Persönlich habe ich unannehmbar lange versucht, festzustellen, ob meine funkgesteuerten Steckdosen funktionieren, die Spannung an einer Himbeere zu messen, inoffizielle Skripte zu testen usw., weil Energenie-Steckdosen aus irgendeinem Grund nicht von einem Skript gesteuert werden wollten, wie vom Hersteller und beschrieben mehrere Blogs. Es kam nicht sofort dazu, das Handbuch erneut zu lesen und diesmal sorgfältig zu lesen, und dort wurde auf Englisch in Weiß gesagt, dass die Steckdosen zuerst im Trainingsmodus gestartet werden mussten. Ist logisch. Zu meiner Verteidigung kann ich nur sagen, dass das Projekt am Wochenende am frühen Morgen durchgeführt wurde, während die Familie schlief, anscheinend war Schlafmangel betroffen :-)

Also trainieren wir. Führen Sie das Skript gemäß den Anweisungen aus

sudo python ENER002.py 

Stecken Sie die Steckdosen in die Steckdosen. Wenn die Lichter nicht blinken, wechseln Sie in den Lernmodus, indem Sie den Netzschalter 5 Sekunden lang drücken. Die Lichter blinkten, drücken Sie die Eingabetaste auf der Tastatur, um ein Signal vom Skript zu geben, und sehen Sie, wie das Licht schnell blinkt. Dies bedeutet, dass das Training erfolgreich war. Wiederholen Sie dies mit den anderen Steckdosen. Ein Pi-Mote-Modul kann 4 verschiedene Codes bedienen, d.h. Sie können 4 verschiedene Sätze von Energenie-Steckdosen steuern, während sich niemand die Mühe macht, denselben Code für mehrere Steckdosen gleichzeitig zu verwenden.

Erhöhen Sie den Chat-Server


Wir benötigen einen XMPP / Jabber-kompatiblen Chat-Server mit der Möglichkeit, einen MUC (Gruppenchat oder Chatroom) darin zu erstellen, um unseren Chat-Bot und menschliche Benutzer dort zu verbinden.

Grundsätzlich können Sie auf Pi Ihren Chat-Server erhöhen. Hier wird beispielsweise unter http://box.matto.nl/raspberryjabberd.html beschrieben, wie Sie ejabberd auf einem Raspberri Pi installieren.

In diesem Artikel folgen wir erneut dem Pfad des geringsten Widerstands und verwenden den vorgefertigten kostenlosen Chat-Server von QuickBlox . Sie müssen nur ein Konto erstellen, um Ihren eigenen Chat-Server und ein Webadministrationsfenster darauf zu übertragen.

Die folgenden Schritte beschreiben die Registrierung und gleichzeitig das Erstellen eines Benutzers für unseren Chat-Bot und den MUC-Chatroom.

1. Registrieren Sie sich unter http://quickblox.com/signup/oder melden Sie sich über GitHub / Google

2 an. Erstellen Sie eine Anwendung im Admin-Bereich.


3. Erstellen Sie einen Benutzer für unseren Chat-Bot (Benutzer -> Neuen Benutzer


hinzufügen ). 4. Erstellen Sie einen MUC-Chatraum (Chat -> Neuer Dialog).


Alles, Ihr eigener XMPP-Chat-Server ist bereit, Bürger und Bots 24 Stunden am Tag ohne zu empfangen Mittagspause.

Wir schreiben und konfigurieren den Chat-Bot


Wir haben bereits die SleekXMPP-Bibliothek installiert, die den XMPP-Chat-Python-Chat-Bot implementiert.
Die Projektwebsite enthält ein gutes Beispiel für einen MUC-Chat-Bot: http://sleekxmpp.com/getting_started/muc.html.
Die Quelle finden Sie hier: https://github.com/fritzy/SleekXMPP/blob/develop/examples/muc. py

Als nächstes müssen wir dies nehmen und modifizieren, um es unseren Bedürfnissen anzupassen.
Wenn Sie Energenie auch für verwaltete Outlets und QuickBlox für den Chat-Server verwenden, können Sie mein vorgefertigtes Skript hier herunterladen: https://github.com/QuickBlox/sample-powerbot-python-rpi .
Sie müssen nur die Anmeldeinformationen am Anfang des Skripts ändern und dort Ihre Anwendungs- und Benutzerschlüssel (von dem, was wir oben erstellt haben) registrieren.

Im Folgenden werden wir näher auf die vorgenommenen Änderungen eingehen, aber kurz darauf, was getan wurde (ich entschuldige mich im Voraus für die Ebene des Python-Codes - ich war lange Zeit kein Programmierer und insbesondere kein Python - ich bin dankbar für Verbesserungen und Pull-Anfragen):

1. Auto-Join von hinzugefügt eine Einladung zu anderen Chatrooms.

2. Behobene Kompatibilität mit QuickBlox und Q-municate (Kleinigkeiten wie das Format des Chatroom-Namens usw.)

3. Das eigentliche Parsen von Befehlen zur Steuerung von Geräten wurde hinzugefügt - in unserem Fall ist es "Lampe an", "Lampe aus", "alles an" "Und" alles aus "- und Aufrufen der Funktionen switch_on / switch_off über die Python des energenie-Moduls, das bereits Befehle über GPIO an die Funksenderkarte ausgibt.
Wer direkt mit GPIO arbeitet, schaut auf energenie.py, wie GPIO funktioniert.

Treten Sie automatisch anderen Chatrooms bei

Eine optionale Funktion, die ich persönlich jedoch nicht hatte, zum Beispiel, wenn dieser Bot-Butler im Messenger Ihrer Freunde hängt und Sie neue Chats erstellen und ihn dort einladen können. Ohne dies wird es funktionieren, aber dann wird der Bot an den Chat gebunden, in dem Sie ihn gestartet haben.

So implementieren Sie Auto-Attachment - Parsim-Stationen für eingehende XML-Nachrichten, weil Wir werden definitiv eine Nachricht erhalten, dass ein solcher MUC-Chat erstellt wurde, wenn dieser Benutzer dort eingeladen wurde.

In unserem Fall verwenden wir die QuickBlox-Plattform und eine bestimmte Q-municate-Anwendung. Darin sieht die Einladung zu einem neuen Gruppenchat ungefähr so ​​aus:
RECV: Taras Filatov created new chat<_id>53b78c0c535c12798d0050551234040,1258466,126535021404538064Yanus Poluektovich, Sergey  Fedunets7232_53b78c0c535c12798d005055@muc.chat.quickblox.com1


Wir verfolgen den Ausdruck "Neuer Chat erstellt" in XMPP-Stationen. Wenn er auftritt, analysieren Sie von dort aus xmpp_room_jid. Dies ist die ID des neu erstellten Raums.
Als Nächstes starten wir den Prozess mit demselben Skript.
Beachten Sie, dass Sie das Skript ausführbar machen müssen, damit dies funktioniert:

chmod +x powerbot.py

Der Implementierungscode ist unten dargestellt:

        if msg['mucnick'] != self.nick and "Create new chat" in msg['body']:
            from bs4 import BeautifulSoup
            y = BeautifulSoup(str(msg))
            roomToJoin = y.xmpp_room_jid.string
            print ("Got an invite to join room")
            botId = subprocess.Popen([selfPath + " -d -j " + qbChatLogin + " -r " + str(roomToJoin) + " -n " + qbChatNick + " -p " + qbUserPass], shell=True)
            print "spawned new bot ID="
            print botId
            self.send_message(mto=msg['from'].bare,
                          mbody="Thank you for your kind invitation, joining your new room now!",
                          mtype='groupchat')


Grüße + Anweisungen

Wir bestimmen das Codewort, in diesem Fall "Powerbot", und geben eine Begrüßung und einen Hinweis zur Verwendung / Kommunikation mit unserem Bot zurück.
Die Prüfung "if msg ['from']! = Self.nick" ist erforderlich, damit der Bot nicht auf Nachrichten von sich selbst reagiert.

        #
        # Reply to help request (any message containing "powerbot" in it)
        #
        if msg['mucnick'] != self.nick and "powerbot" in msg['body']:
            reply_test_message = self.make_message(mto=msg['from'].bare,
                      mbody="Powerbot is greeting you, %s! Usage: [powerbot] lamp [on|off] to control socket 1, [powerbot] all [on:off] to control all sockets. Example: 'lamp on' switched socket 1 on." % msg['mucnick'],
                      mtype='groupchat')
            self.copy_dialog_id(msg, reply_test_message)
            reply_test_message.send()
            print "Sent help text: " + str(reply_test_message)


Schalten Sie die Lampe und andere Geräte ein / aus

Wir verfolgen den Befehl „Lampe an“ (wenn der Befehl empfangen wird, schalten Sie den Socket switch_on (lampSocket) ein und berichten über die Implementierung.

        #
        # Handle "lamp on" command
        #
        if msg['mucnick'] != self.nick and "lamp on" in msg['body']:
            switch_on(lampSocket)
            confirmation_message = self.make_message(mto=msg['from'].bare,
                                                   mbody="Lamp has been switched on, %s." % msg['mucnick'],
                                                   mtype='groupchat')
            self.copy_dialog_id(msg, confirmation_message)
            confirmation_message.send()
            print "Lamp switched on, sent confirmation: " + str(confirmation_message)

Ähnlich implementierte "Lampe aus", "alle ein" und "alle aus" (letztere sind für das Ein- und Ausschalten aller gesteuerten Steckdosen verantwortlich).

Wir starten einen Chat-Bot

Ab Bash on Malink führen wir einen einfachen Befehl aus:

sudo python powerbot.py -d -r <адрес начальной MUC комнаты>

Für den Zugriff auf das GPIO wird Sudo benötigt. Wenn Sie QuickBlox verwendet haben, kopieren Sie einfach die JID-Adresse aus dem Chat-Dialogfeld als MUC-Adresse des Raums.

Infolgedessen werden die Protokolle zur Authentifizierung und zum Austausch des XMPP-Status mit dem Server auf dem Bildschirm angezeigt:



Der Bot ist bereit und wartet im Chatroom auf Ihre Anweisungen.

Übrigens haben Sie vielleicht bemerkt, dass die Antwortfunktionen auf Befehle gleichzeitig in dupliziert werden
def message(self, msg):

und
def muc_message(self, msg):

Der erste Block verarbeitet private Nachrichten 1: 1 und der zweite Block Nachrichten.
Das heißt, Sie können den Bot in einem privaten Chat verwalten, obwohl dies meiner Meinung nach weniger interessant ist.

Wir sammeln den Chat-Client für iOS (Optionen: Android, Web)


Wie ich oben geschrieben habe, können Sie mit dem Bot über jeden Jabber / XMPP-kompatiblen Chat-Client kommunizieren.
Wir suchen nicht nach einfachen Wegen, also erstellen wir unsere Anwendung - einen Client für die Verwaltung des Bots und gleichzeitig für die Kommunikation mit Familie und Freunden.
Unser eigener Messenger mit einem Bot und Gruppen-Chats :-)

Wie Sie sehen werden, folgen wir hier auch einem schnellen und faulen Weg und nehmen ein fertiges Open-Source-Projekt unserer eigenen Entwicklung,
das Q-municate heißt.

1. Ziehen Sie das Projekt für die entsprechende Plattform von gita:
iOS: bitbucket.org/quickblox/qmunicate-ios
Android: github.com/QuickBlox/q-municate-android
Web: github.com/QuickBlox/q-municate-web

2. Öffnen Sie in der IDE.

3. Wir korrigieren die Anmeldeinformationen - wir ändern die Standardkonstanten mit den Anwendungsschlüsseln in diejenigen, die aus dem QuickBlox-Administrationsbereich kopiert wurden. Unter iOS ändert sich dies in AppDelegate.m, in Android in Consts.java.


4. Kompilieren Sie, bauen Sie auf dem Gerät auf.
Nach Belieben passen wir die Benutzeroberfläche an und mehr, hier ist ein ausführlicheres Handbuch .

5. GEWINN !!!

Demonstration


Screenshots:


Ich habe mein Q-municate stolz "Q-Power" genannt,


wir finden den Bot im Freundes- oder Gruppenchat,


kommunizieren mit dem Bot


Videolampensteuerung per Chat:



Vielen Dank für Ihre Aufmerksamkeit, ich hoffe, es wird nützlich sein, und noch besser, wenn dieser „Proof of Concept“ jemanden dazu ermutigt, die Idee bis zum Ende umzusetzen, und die Mikrowelle plötzlich mit dem Toaster spricht und die Frau allen durch Ihr Zuhause eine Stimme gibt, Siri :-)

Erfolg!

Jetzt auch beliebt: