Raspberry Pi: Web Socket

setup.jpg

Ein neues Tutorial mit dem Pi! Diesmal geht’s um Web-Sockets, nur besser erklärt als beim älteren Post, der mit dem ESP8266 zu tun hatte.

Um was geht’s? Sehr oft findet man Software, die man über den Webbrowser bedient, wie etwa Octoprint, metis oder Eiger (um auch einen kommerziell genutzten Kandidaten zu nennen). Hier zeige ich, wie man das ganze mit Web-Sockets, Java Script und Python realisieren kann.

Zudem gibt’s auch eine Anbindung an die Hardware des Raspberry, um nicht nur im virtuellen Raum zu bleiben.

Mehr dazu findet ihr auf deloarts.com.

Advertisements

Raspberry Pi: Telegram Bot

conversation.jpg

Der letzte Blogeintrag ist bereits ein paar Wochen her. Warum? Zur Zeit arbeite ich an zwei sehr großen Projekten, die ich, sobald ich sie abgeschlossen habe, hier vorstellen werde. Das eine Projekt hat wieder mit einer Kamera zu tun (nein, diesmal keine Tropfenfotografie). Das andere, welches ich gemeinsam mit ralph mache, hat wieder mit dem ESP-Controller zu tun. Stay tuned.

So viel sei gesagt, hier folgt ein Lückenfüller. Es kommt nichts sonderlich neues, aber wem fad ist, der darf gerne bleiben. Der Titel verrät es schon, es geht um den Raspberry Pi und um Telegram. Das Vorhaben ist, dass man Statusnachrichten vom Pi direkt aufs Smartphone bekommt. Ich finde das immer recht praktisch, weil ich dann nicht erst meinen PC starten muss um dann via Terminal mit dem Pi kommunizieren zu können.

Interessiert? Hier geht’s los!

16×2 I2C-Display on Raspberry Pi

Wer einen kleinen Display am Raspberry benötigt, der ist hier richtig! Mit wenig Aufwand und ein paar wenigen Bauteilen kann man einen I2C-Display am Raspberry Pi nutzen.

Das Raspberry vorbereiten

Als erstes muss alles aktuell sein, weshalb man im Terminal den Befehl

sudo apt-get update

eingeben muss. Um auf dem Raspberry Pi auch wirklich den I2C-Bus nutzen zu können, muss man diesen zuerst aktivieren. Der erste Schritt ist es im Terminal den Befehl

sudo raspi-config

einzugeben. Daraufhin erscheint die Setup-Utility, in welcher man den Menüpunkt 8 Advanced Options auswählen muss.

001

Im nächsten Fenster muss man A7 I2C auswählen, und alle kommenden Fenster mit Yes oder OK bestätigen. Mit Finish kehrt man zurück zum Terminal.

002

Im zweiten Schritt muss das Module File um zwei Einträge erweitert werden. Dies wird erledigt, indem man zunächst

sudo nano /etc/modules

ausführt und dann am Schluss der Datei die beiden Einträge

i2c-bcm2708
i2c-dev

hinzufügt. Mit STRG+X, Yes und Enter speichert man die Datei und schließt sie.

003

Um den I2C-Bus mit Python nutzen zu können benötigt man python-smbus und die i2c-tools. Beides hohlt man sich durch den Terminal-command

sudo apt-get install -y python-smbus i2c-tools

Danach muss man das Raspberry neu starten, sodass der I2C-Bus wirksam wird. Dies kann über die grafische Oberfläche oder im Terminal geschehen:

sudo reboot

Der Aufbau

Die paar wenigen Bauteile sind:

  • Raspberry Pi 2
  • 16×2 I2C-Display
  • Logic Level Shifter

Der Logic-Level-Shifter wird benötigt, da das Raspberry mit dem logischen Level von 3.3V arbeitet, die meisten Displays jedoch mit 5V arbeiten. Solche Level Shifter gibt es bereits um unter einen Euro auf eBay zu haben. Bei diesem Preis lohnt sich das selbst machen nur noch aus Interesse daran.

Level_Shifter

Die Verdrahtung ist wie im Bild unten ersichtlich nach der folgenden Tabelle durchgeführt.

  • Level Shifter – Raspberry Pi
    • GND – GND (Pin 6)
    • HV – 5V (Pin 2)
    • LV – 3V3 (Pin 1)
    • LV1 – SDA (Pin 3)
    • LV2 – SCL (Pin 5)
  • Level Shifter – I2C Display
    • GND – GND
    • HV – Vcc
    • HV1 – SDA
    • HV2 – SCL

Untitled Sketch_Steckplatine

Der fertige Setup sieht dann in etwa so aus:

Setup

Das Display ist ein normales HD44780-Display, welches einen I2C-Rucksack bekommen hat. Diese „Rucksäcke“ gibt es einzeln, oder bereits mit dem Display verlötet.

Display

Der Code

Das Programm befindet sich auf GitHub und kann auch direkt von dort auf das Raspberry geladen werden.

Die beiden Python-files (16x2_I2C_Display.py & lcd.py) müssen in das selbe Verzeichnis auf dem Raspberry kopiert werden, da das erste File das zweite aufruft.

16x2_I2C_Display.py

Dieses Programm zeigt die IP-Addresse des Pi auf dem Display an. Dabei importiert es die Funktionen der Datei lcd.py.

Im Main ist die Herangehensweise gezeigt. Man muss den Display zuerst initialisieren, danach kann man ihm Text zum „Drucken“ schicken oder aber auch die Hintergrundbeleuchtung an- oder abschalten.

lcd.initialize()
lcd.printString("TEXT", lcd.LINE_1)
lcd.noBacklight()
lcd.Backlight()

lcd.py

Hier passiert das Wichtige – die Kommunikation mit dem Display. Diese funktioniert ähnlich wie mit einem Arduino (siehe hier). Deshalb lassen sich die Befehle des Displays auch genauso bequem senden. In der sendByte()-Funktion lässt sich erkennen, dass ich immer wieder BACKLIGHT mitsende. Das muss so sein, weil der Display ansonsten die Hintergrundbeleuchtung abdreht, und so seinen Sinn & Zweck verliert.

Über den smbus (hier als i2c deklariert) werden die nötigen Daten gesendet. Dabei wird immer die Addresse, gefolgt von den Daten gesendet. In der sendByte()-Funktion werden diese als Abfolge der Datenblöcke (Typ, Daten, Beleuchtung) gesendet. Hier wird das Delay benötigt, da der Display die Daten ansonsten nicht korrekt erhält.

Das lcd.py kann man nun (genau so wie es ist) für andere Projekte nutzen. Einfach in das jeweilige Python script mit import lcd einfügen. Allerdings muss es sich im selben Verzeichnis befinden.

Anmerkung: Man kann auch einen 20×4 Display verwenden, dazu muss man im lcd.py File einfach nur die Zeile 15 verändern (16 -> 20) und Line_3, Line_4 nutzen im printString-Befehl nutzen.

Nachbereitung

Ich möchte die IP-Adresse für 15 Sekunden anzeigen lassen, sobald der Raspberry hochgefahren ist. Hierfür muss man das Script nach dem Start ausführen lassen.

Zuerst habe ich beide Dateien in das Verzeichnis /home/pi/Autostart/ verschoben und die Datei 16x2_I2C_Display.py umbenannt in showIP.py.

Danach muss man das Terminal öffnen und folgenden Befehl eingeben:

sudo nano /etc/rc.local

Anschließend muss man den Pfad und die zu öffnende Datei angeben, in meinem Fall ist dies

/bin/sleep 15 && cd /home/pi/Autostart/ && sudo python showIP.py &
exit 0

sleep 15 bewirkt, dass das Script erst 15 Sekunden nach dem Hochfahren ausgeführt wird. Nach einigem Testen hat sich gezeigt, dass das Pi etwa 15 braucht, um eine IP Adresse abzurufen. & am Ende der Zeile bedeutet, dass das Script im Hintergrund ausgeführt wird. Das exit 0 am Ende wird von rc.local benötigt, es beendet das Script. Wenn ihr also noch andere Scripts beim Systemstart ausführen wollt, stellt sicher, dass exit 0 auch wirklich in der letzten Zeile steht.

004

Mit STRG+O speichert man das File, und mit STRG+X schließt man es. Beim nächsten Neustart sollte man dann ein ähnliches Bild wie das folgende sehen können.

IP.jpg

Bei Fragen ist ein Kommentar immer erwünscht!

 

DSLR & Telegram

Der Titel mag vielleicht etwas verwirren, doch ich meine tatsächlich: Eine Kamera mit einem Messenger steuern.

Für alle, die Telegram nicht kennen, es ist das Pendant zum weitaus bekannteren Whatsapp. Auf die Vorzüge von Telegram will ich hier nicht eingehen, hierfür haben sich schon andere Blogger die Mühe gemacht -> siehe hier.

Noch eine Sache, bevor wir beginnen! Was in den folgenden Zeilen steht ist eine reine Spielerei. Eine Kamera mit einen Messenger steuern ist nicht gerade praktikabel, als netter Zeitvertreib jedoch sicherlich angebracht.

Get Telegram

Zu Beginn benötigt man natürlich Telegram. Neben der App am Smartphone verweise ich auch auf die PC/Mac-Version. Es ist überaus praktisch, dem Bot über den PC aufzusetzen, als über das Handy.

Danach gibt man in das Suchen-Feld den Namen BotFather ein. Dies ist der Manager aller Bots auf Telegram. Bei ihm sucht man um einen neuen Bot an.

Search_Botfather

Nachdem ihr den BotFather mit /start aufgerufen habt, erstellt ihr einen neuen Bot nach dem gleichen Schema wie im Bild unten gezeigt.

Talk_To_BotFather.PNG

Ist der Vorgang abgeschlossen, so erhält man einen eindeutigen Token. Dieser ist später im Programm wichtig!

Get Components

Euer Bot ist nun bereit. Doch um ihm zum Leben zu erwecken benötigt es einen Körper. In diesem Fall das Raspberry Pi 2 Model B (mit aktiver Internetverbindung).

Raspberry Pi.jpg

Im Grunde ist das auch alles was man benötigt. Ich arbeite jedoch nicht direkt am Raspberry, sondern via Terminal mit PuTTY. Die Daten schicke ich dem Pi per FileZilla.

Pre-Code

Bevor man das Programm, welches sich wie immer auf GitHub befindet starten kann, benötigt man ein paar Zusätze.

Telepot

Telepot erlaubt es mit dem Telegram-Bot via Python zu kommunizieren. Es ist denkbar einfach, Telepot auf sein Raspberry zu hohlen. Man muss lediglich folgende Commands in die Kommandozeile eingeben:

$ sudo apt-get install python-pip
$ sudo pip install telepot
$ sudo pip install telepot --upgrade  # UPGRADE

gPhoto2

gPhoto2 sorgt für die Kommunikation zwischen Raspberry und angeschlossener Kamera. Hier werden beinahe alle am Markt verfügbaren Kameras unterstützt (Eine Liste gibt es hier) . Man hohlt es sich wiederum durch den Befehl:

$ wget https://raw.githubusercontent.com/gonzalo/gphoto2-updater/master/gphoto2-updater.sh && chmod +x gphoto2-updater.sh && sudo ./gphoto2-updater.sh

Nun zum Test. Einfach die Kamera via USB an das Raspberry anschließen und sich diese dann im Terminal anzeigen lassen.

Dazu öffnet man zuerst den Terminal am Raspberry und tippt folgenden Befehl ein:

sudo --gphoto2 --auto-detect

Auto_Detect.PNG

Hat dies funktioniert, so kann man zum nächsten Schritt weiter gehen.

Der Code

Wie bereits erwähnt befindet sich das Programm auf GitHub und wurde mit Python 2 programmiert.

Token & User ID

Nun kommt der Token, welchen ihr vom BotFather bekommen habt, ins Spiel. Im Bereich des Beginns des Programms findet man die Zeilen

Bot_Name = "CameraBot"
Bot_Token = "INSERT TOKEN HERE"

Der Botname ist jener Name, welcher in den Nachrichten angezeigt wird, sofern ihr ihn mit Hilfe des BotFathers geändert habt (/setname). Der Token ist die eindeutige Kennung für den Bot.

Nun könnt ihr das Programm starten. Dazu muss man wieder über das Terminal den Startbefehl geben, oder man nutzt die auf Raspbean vorinstallierte Python 2 IDLE. Nutzt man das Terminal, und befindet man sich mit diesem im richtigen Verzeichnis, so muss startet man das Programm mit dem folgenden Befehl:

python DSLR_Telegram.py

Die Admin-ID

Momentan existiert kein Admin-User! Wie ihr vielleicht im Programm bemerkt habt, ist als Admin-ID eine Reihe Nullen eingetragen. Um die ID eures Telegram-Accounts herauszufinden, müsst ihr den Bot auf Telegram mit eurem Handy oder dem PC starten.

Dies erreicht man, indem man nach ihm im Suchen-Feld sucht. Gebt dazu den Namen des Bots ein. Achtet auf das @ vor dem Namen. Achtung! Der Name des Bots ist nicht jener, den ihr vielleicht mit /rename erzeugt habt, sondern der, den ihr ganz am Anfang gewählt habt!

Habt ihr den Bot gestartet, so wird die Meldung „Access denied.“ erscheinen. zusätzlich seht ihr im Terminal am Raspberry, dass ein Zugriff passiert ist. Darin findet ihr neben euren Namen auch eure ID. Brecht nun das Script ab und fügt die ID in das Programm in der Zeile

Admin_Users = [00000000] # INSERT USER ID !

ein. Startet das Script neu. Nun seht ihr, dass euch der Bot eine Startnachricht gesendet hat.

Nutzer Hinzufügen

Wollt ihr einen Nutzer hinzufügen, so muss dieser dem Bot das Keyword /start schreiben. Daraufhin schickt die ID des Nutzers an den Admin-User – euch.

Schickt nun dem Bot auf Telegram folgende Nachricht: /addUser ID Vorname Nachname

Achtet auf die Leerzeichen und lasst nichts aus. Wenn der Nachname unbekannt ist, oder wenn ihr eine Gruppe hinzufügt, schreibt (unknown) oder (group) statt dem Nachnamen. Der Bot ist nicht auf Eingabefehler abgesichert. Eine falsche Eingabe könnte zum Programmabsturz führen.

Ja, in der Hinsicht war ich Faul.

Kameraliste abrufen

Die Kameraliste bekommt ihr, indem ihr /getCam dem Bot mitteilt.

Get_Cam.PNG

Einstellungen abrufen und setzen

Mit diesem Script könnt ihr drei Einstellungen anpassen. ISO, Blende und Belichtungszeit. Wie die Syntax genau lautet seht ihr im Programm, oder indem ihr dem Bot die Nachricht /info schreibt.

Den ISO-Wert kann man mit /getISO abrufen. (Da ich die Werte in ein Dictionary schreibe und ich mir nicht die Mühe des Sortierens machen wollte, sieht die Liste etwas ungeschickt aus)

Get_ISO.PNG

Und mit /setISO Zahl könnt ihr den ISO-Wert setzen. Hier wieder auf das Leerzeichen achten!

Set_ISO.PNG

So geht man auch mit den beiden anderen Werten um.

  • /getAV und /setAV Zahl für die Blende
  • /getTV und /setTV Zahl für die Belichtungsdauer

Kamera auslösen

Zum Schluss will man natürlich noch ein Bild gesendet bekommen. Dies erreicht man über /pic

Pic.PNG

Noch eine kleine Anmerkung: Ich musste die Bildqualität weit nach unten setzen, da die Datei ansonsten zu lange zum senden dauert. Niemand will 10 Minuten auf ein Bild warten.

Resümee

Mit Telegram ein Bild gesendet zu bekommen ist nun nicht gerade das Neueste. Doch ich dachte mir, als mein erstes Raspberry-Script wollte ich 2 Fliegen auf einmal erwischen.

Telegram-Bots sind eine tolle Idee, um sich den Alltag zu erleichtern, etwa ein Erinnerungs-System für Gruppen. So kann niemand einen Termin vergessen.

Dann ist da noch die Möglichkeit, eine Kamera einfach via Python zu bedienen. Dies kommt mir bei Kamera-Projekten sehr gelegen, sei es beim Fotografieren von Wassertropfen oder beim Erstellen von Time-Lapse-Aufnahmen.

Vielleicht habe ich ja den einen oder anderen auf den Geschmack gebracht, und es entstehen mehr und mehr spannende Projekte!

Für nicht-Python User ist es vielleicht schwer, dem Programm zu folgen, wer dazu Fragen hat: Ein Kommentar ist immer erwünscht!

.