<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Raspberry Pi on zefanjas.de - Open Source &amp; Education</title>
    <link>https://zefanjas.de/tags/raspberry-pi/</link>
    <description>Recent content in Raspberry Pi on zefanjas.de - Open Source &amp; Education</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>de-DE</language>
    <lastBuildDate>Wed, 03 Apr 2019 03:43:03 +0000</lastBuildDate><atom:link href="https://zefanjas.de/tags/raspberry-pi/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Open Source Digital Signage für Schulen</title>
      <link>https://zefanjas.de/open-source-digital-signage/</link>
      <pubDate>Wed, 03 Apr 2019 03:43:03 +0000</pubDate>
      
      <guid>https://zefanjas.de/open-source-digital-signage/</guid>
      <description>&lt;p&gt;Digital Signage oder „Digitale Beschilderung“ bietet auch für Schulen neue Möglichkeiten. Was früher mit Aushängen an sogenannten „schwarzen Brettern“ oder Informationstafeln gelöst wurde, wird zunehmend von Monitoren übernommen. Egal ob Hinweise zu kommenden Veranstaltungen, Vertretungspläne, Raumbeschilderung oder sonstige wichtige Informationen – vieles lässt sich flexibler auf Monitoren darstellen. Aktualisierungen kann man von zentraler Stelle aus vornehmen bzw. auch automatisieren (z.B. beim Vertretungsplan). Welche Open Source Digital Signage Lösungen gibt es? Was könnten Anforderungen sein, die man als Schule hat? Ich möchte heute einige Lösungen auflisten, die in späteren Artikeln noch einmal genauer beleuchtet werden sollen.&lt;/p&gt;
&lt;h2 id=&#34;was-sollte-ein-digital-signage-system-können&#34;&gt;Was sollte ein Digital Signage System können?&lt;/h2&gt;
&lt;p&gt;Die Anforderungen werden sicher von Schule zu Schule verschieden sein, aber es gibt doch ein paar wesentliche Eigenschaften, die von einer Open Source Digital Signage Lösung erfüllt sein sollten:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;einfach zu benutzen (z.B. Editor zum Erstellen von Folien / Slides)&lt;/li&gt;
&lt;li&gt;einfache und schnelle Darstellung von Bilder, Videos und anderen Dokumenten&lt;/li&gt;
&lt;li&gt;zentrale Verwaltung mehrerer Monitore (am besten mit verschiedenen Gruppen / Kanälen, um verschiedene Informationen auf verschiedenen Monitoren anzeigen zu können)&lt;/li&gt;
&lt;li&gt;Möglichkeiten zur Automatisierung / Zeitplan&lt;/li&gt;
&lt;li&gt;möglichst kostenfrei (Lizenzen oder monatliche Gebühren)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;welche-open-source-digital-signage-lösungen-gibt-es&#34;&gt;Welche Open Source Digital Signage Lösungen gibt es?&lt;/h2&gt;
&lt;p&gt;Wenn man sich nach Open Source Digital Signage Lösungen umschaut, wird man schnell fündig. Allerdings sind viele von den sogenannten „Open Source“ Lösungen eher Freemium – Lösungen bzw. nur teilweise Open Source. Ich habe keine dieser Lösungen bisher selbst im Einsatz gehabt. In den kommenden Monaten werde ich mir aber einige dieser Lösungen anschauen, da wir als Schule noch auf der Suche nach einem passenden Digital Signage System sind.&lt;/p&gt;
&lt;h3 id=&#34;screenly-ose&#34;&gt;Screenly OSE&lt;/h3&gt;
&lt;p&gt;Wenn auf Github nach &lt;a href=&#34;https://github.com/topics/digital-signage&#34;&gt;Digital Signage&lt;/a&gt; schaut, ist &lt;a href=&#34;https://www.screenly.io/ose/&#34;&gt;Screenly OSE&lt;/a&gt; mit Abstand das populärste System. Screenly OSE ist für den Raspberry Pi konzipiert. Es bietet grundlegende Features, allerdings muss beim Einsatz mehrerer Geräte, jeder Raspberry Pi einzeln verwaltet werden. Die Unterschiede zur Bezahlversion &lt;a href=&#34;https://www.screenly.io/screenly-ose-vs-pro/&#34;&gt;sind hier aufgelistet&lt;/a&gt;.auch&lt;/p&gt;
&lt;h3 id=&#34;xibo&#34;&gt;Xibo&lt;/h3&gt;
&lt;p&gt;Direkt hinter Screenly OSE folgt &lt;a href=&#34;https://xibo.org.uk/&#34;&gt;Xibo&lt;/a&gt;, wenn man nach der Anzahl der Sterne auf Github geht. Xibo gibt es schon eine ganze Weile. Im Gegensatz zu Screenly gibt es keine Pro vs. Open Source Version, sondern alle Features sind für alle verfügbar. Xibo besteht aus einem CMS, welches man auch in einem Docker-Container installieren kann und den zugehörigen Player, die auf den Anzeigegeräten selbst installiert werden. Der Player für Windows ist kostenfrei und Open Source, für alle anderen Player müssen Lizenzgebühren bezahlt werden. Es gibt den Xibo Player für Windows, Android und webOS. Ein Player für Linux ist wohl geplant, aber noch nicht verfügbar.&lt;/p&gt;
&lt;h3 id=&#34;concerto&#34;&gt;Concerto&lt;/h3&gt;
&lt;p&gt;Ebenfalls schon länger am Markt ist &lt;a href=&#34;http://www.concerto-signage.org/&#34;&gt;Concerto&lt;/a&gt;. Concerto bietet viele Features und kann selbst gehostet werden. Technisch basiert es auf Ruby. Wenn man sich in dem Projekt auf Github etwas umschaut, scheint die Entwicklung etwas zu stocken. Dem Webinterface sieht man sein Alter auch schon etwas an. Insgesamt aber eine 100% Open Source Lösung.&lt;/p&gt;
&lt;h3 id=&#34;libresignage&#34;&gt;LibreSignage&lt;/h3&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/eerotal/LibreSignage/&#34;&gt;LibreSignage&lt;/a&gt; ist noch recht neue Open Source Lösung und zu 100%, Browser basiert. Es braucht also keine speziellen „Player“, sondern kann über den Browser benutzt werden. Grundlegende Features und auch Mehrbenutzerbetrieb sind vorhanden.&lt;/p&gt;
&lt;h3 id=&#34;foyer&#34;&gt;Foyer&lt;/h3&gt;
&lt;p&gt;&lt;a href=&#34;https://foyer.tv/&#34;&gt;Foyer&lt;/a&gt; ist ein WordPress-Plugin. Man kann damit verschiedene Seiten erstellen, Kanäle und verschiedene Displays diesen Kanälen zuweisen. Es ist wie LibreSignage Browser basiert und braucht deshalb keinen besonderen Player.&lt;/p&gt;
&lt;h3 id=&#34;tabulainfo&#34;&gt;tabula.info&lt;/h3&gt;
&lt;p&gt;&lt;a href=&#34;http://tabula.info&#34;&gt;Tabula.info&lt;/a&gt; ist die einzige Lösung, die ich gefunden habe, die speziell für Schulen entwickelt wurde. Es bietet viele nette Features, die in man in einer Schule braucht und ist auf die Anzeige von Vertretungsplänen, HTML-Seiten und zusätzlichen Infos spezialisiert.&lt;/p&gt;
&lt;h2 id=&#34;weitere-lösungen&#34;&gt;Weitere Lösungen&lt;/h2&gt;
&lt;h3 id=&#34;infobeamer&#34;&gt;Infobeamer&lt;/h3&gt;
&lt;p&gt;&lt;a href=&#34;http://infobeamer.com/&#34;&gt;Infobeamer&lt;/a&gt; ist nur für den privaten, nicht öffentlichen Gebrauch kostenfrei. Sonst ist wohl eine der leistungsstärksten und flexibelsten Lösungen. Die Hardware eines Raspberry Pi’s wird maximal ausgenutzt (z.B. Hardwarebeschleunigung – ein Nachteil, den alle Browser basierten Lösungen haben).&lt;/p&gt;
&lt;h3 id=&#34;display-monkey&#34;&gt;Display Monkey&lt;/h3&gt;
&lt;p&gt;&lt;a href=&#34;http://www.displaymonkey.org/dm/&#34;&gt;Display Monkey&lt;/a&gt; ist ebenfalls eine Open Source Lösung, die allerdings einen Windows Server voraussetzt. Die einzelnen Displays brauchen nur einen Browser.&lt;/p&gt;
&lt;h3 id=&#34;pisignage&#34;&gt;piSignage&lt;/h3&gt;
&lt;p&gt;Eine weitere Lösung für Digital Signage ist &lt;a href=&#34;https://pisignage.com/&#34;&gt;piSignage&lt;/a&gt;. Der Server ist OpenSource und kann auch selbst gehostet werden. Für die einzelnen Displays / Players müssen aber Lizenzen gekauft werden (einmalig). Wie der Name vermuten lässt, verwendet piSignage Raspberry Pi’s als Player. Der Code dafür ist nicht Open Source.&lt;/p&gt;
&lt;h2 id=&#34;fazit&#34;&gt;Fazit&lt;/h2&gt;
&lt;p&gt;Auf den ersten Blick gibt es scheinbar viele Open Source Lösungen. Welche kennst du noch, die hier fehlen? Mit welchem Systemen hast du gute Erfahrungen gemacht? Der Praxistest wird zeigen, welche Lösung für unsere Situation am besten geeignet ist.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Wie man ein mobiles Feinstaubmessgerät bauen kann</title>
      <link>https://zefanjas.de/wie-man-ein-mobiles-feinstaubmessgeraet-bauen-kann/</link>
      <pubDate>Sat, 09 Mar 2019 09:45:29 +0000</pubDate>
      
      <guid>https://zefanjas.de/wie-man-ein-mobiles-feinstaubmessgeraet-bauen-kann/</guid>
      <description>&lt;p&gt;Vor ca. einem Jahr habe ich beschrieben, wie man mit einem &lt;a href=&#34;https://zefanjas.de/wie-man-feinstaub-mit-einem-raspberry-pi-messen-kann/&#34;&gt;Raspberry Pi und einem Feinstaubsensor&lt;/a&gt; die Luftqualität messen kann. Das Setup setzen wir so seit einigen Jahren bei uns in der Schule bzw. auch privat ein. Einen Nachteil hat dieses Projekt allerdings: es ist nicht mobil, sondern abhängig von einem WLAN-Netz bzw. einer Netzwerkverbindung. Wenn der Raspberry Pi und das Smartphone / ein Rechner nicht im gleichen Netz sind, kann man nicht auf die Messdaten zugreifen. Deshalb haben wir vor einiger Zeit den Raspberry Pi um einen kleinen Bildschirm ergänzt, sodass man die Werte direkt am Gerät ablesen kann. Wie man diesen Bildschirm für unser mobiles Feinstaubmessgerät einrichtet und welche zusätzlichen Konfigurationen notwendig sind, möchte ich in diesem Artikel kurz vorstellen.&lt;/p&gt;
&lt;h2 id=&#34;bildschirm-für-den-raspberry-pi-einrichten&#34;&gt;Bildschirm für den Raspberry Pi einrichten&lt;/h2&gt;
&lt;p&gt;Auf Amazon oder AliExpress gibt es verschiedene Displays für den Raspberry Pi. Diese reichen von ePaper-Screens bis hin zu LCDs mit Touchfunktion. Wir haben uns für einen 3,5″ LCD mit Touch entschieden, welcher eine Auflösung von 320×480 Pixel hat (&lt;a href=&#34;https://de.aliexpress.com/item/3-5-LCD-TFT-Touch-Screen-Display-with-Stylus-for-Raspberry-Pi-2-Pi-3-Acrylic/32685321852.html&#34;&gt;Modell MPI3501&lt;/a&gt;). Man kann diesen Bildschirm einfach auf die GPIO Pins stecken. Dazu kostet er gerade mal 10-15€. Schön ist auch, dass er mit 3,5″ genauso groß wie ein Raspberry Pi ist.&lt;/p&gt;
&lt;p&gt;Wenn man den Bildschirm aufsteckt und den Raspberry Pi startet, bleibt der Bildschirm weiß. Man muss zuerst noch die &lt;a href=&#34;https://github.com/goodtft/LCD-show&#34;&gt;passenden Treiber für das Display installieren&lt;/a&gt;. Dazu meldet man sich per SSH an und führt folgende Befehle aus:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;$ rm -rf LCD-show
$ git clone https://github.com/goodtft/LCD-show.git
$ chmod -R 755 LCD-show
$ cd LCD-show/
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Je nach Bildschirmmodell muss man nun den passenden Befehl ausführen um die Treiber zu installieren. In unserem Fall (für das Modell MPI3501):&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;$ sudo ./LCD35-show
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Dieser Befehl installiert die entsprechenden Treiber und startet den Raspberry Pi anschließend neu.&lt;/p&gt;
&lt;h2 id=&#34;pixel-desktop-installieren-und-autostart-einrichten&#34;&gt;Pixel-Desktop installieren und Autostart einrichten&lt;/h2&gt;
&lt;p&gt;Damit wir die Website mit den Messwerten direkt beim Start auf dem Bildschirm angezeigt bekommen sind noch einige Schritte notwendig. Zuerst muss man die Pixel-Desktopumgebung installieren (falls man bisher Raspian Lite verwendet hat) mit&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;$ sudo apt install raspberrypi-ui-mods
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Dann fehlt noch der Chromium-Browser, um die Website anzuzeigen:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;$ sudo apt install chromium-browser
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Standardmäßig ist der Autologin für das Benutzer „pi“ nicht eingerichtet. Dies ist aber notwendig, damit die Messwerte direkt nach dem Start angezeigt werden können, ansonsten begrüßt einen nur der Anmeldebildschirm. Den Autologin kann man über das &lt;em&gt;raspi-config&lt;/em&gt; Programm einrichten:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;sudo raspi-config
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Im Menü wählt man dann &lt;strong&gt;3 Boot Options&lt;/strong&gt; → &lt;strong&gt;B1 Desktop / CLI&lt;/strong&gt; → &lt;strong&gt;B4 Desktop Autologin&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Zu guter Letzt fehlt noch die Einrichtung des Autostarts, damit Chromium nach dem Booten automatisch mit der AQI-Seite gestartet wird. Dazu legt man den Ordner &lt;em&gt;&lt;strong&gt;/home/pi/.config/lxsession/LXDE-pi/&lt;/strong&gt;&lt;/em&gt; an:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;$  mkdir -p /home/pi/config/lxsession/LXDE-pi/
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Anschließend erstellt man in diesem Ordner die Datei &lt;em&gt;&lt;strong&gt;autostart&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;$ nano /home/pi/.config/lxsession/LXDE-pi/autostart
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;und fügt diesen Inhalt ein:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;#@unclutter
@xset s off
@xset -dpms
@xset s noblank

# Chromium im Vollbild beim Start öffnen
@chromium-browser --incognito --kiosk http://localhost
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Möchte man noch den Mauszeiger ausblenden, muss man noch das Paket _unclutter installieren _und am Anfang der &lt;em&gt;&lt;strong&gt;autostart&lt;/strong&gt;&lt;/em&gt; das Kommentarzeichen entfernen:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;$ sudo apt install unclutter
&lt;/code&gt;&lt;/pre&gt;&lt;img loading=&#34;lazy&#34; decoding=&#34;async&#34; class=&#34;aligncenter size-full wp-image-2889&#34; src=&#34;https://zefanjas.de/wp-content/uploads/2019/03/IMG_20190309_163035.geaendert.jpg&#34; alt=&#34;mobiler Feinstaubsensor&#34; width=&#34;1024&#34; height=&#34;768&#34; srcset=&#34;https://zefanjas.de/wp-content/uploads/2019/03/IMG_20190309_163035.geaendert.jpg 1024w, https://zefanjas.de/wp-content/uploads/2019/03/IMG_20190309_163035.geaendert-300x225.jpg 300w, https://zefanjas.de/wp-content/uploads/2019/03/IMG_20190309_163035.geaendert-768x576.jpg 768w, https://zefanjas.de/wp-content/uploads/2019/03/IMG_20190309_163035.geaendert-360x270.jpg 360w&#34; sizes=&#34;(max-width: 1024px) 100vw, 1024px&#34; /&gt; 
&lt;p&gt;Da ich im letzten Jahr ein paar kleine Änderungen am Code vorgenommen habe, empfiehlt es sich das Skript und die Dateien der AQI-Website neu herunterzuladen (wie das geht, steht im &lt;a href=&#34;https://zefanjas.de/wie-man-feinstaub-mit-einem-raspberry-pi-messen-kann/&#34;&gt;Originalartikel&lt;/a&gt;).&lt;/p&gt;
&lt;h2 id=&#34;fazit&#34;&gt;Fazit&lt;/h2&gt;
&lt;p&gt;Durch das Display hat man nun ein mobiles Feinstaubmessgerät. Wir setzen sie an unserer Schule ein um z.B. die Qualität der Luft in den Klassenzimmern zu überprüfen oder um Vergleichsmessungen durchzuführen. Mit diesem Setup ist man nicht mehr auf eine Netzwerkverbindung oder WLAN angewiesen, sondern kann die kleine Messstation überall einsetzen – mit einer Powerbank sogar noch unabhängig vom Stromnetz.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Wie man Feinstaub mit einem Raspberry Pi messen kann [Update]</title>
      <link>https://zefanjas.de/wie-man-feinstaub-mit-einem-raspberry-pi-messen-kann/</link>
      <pubDate>Tue, 27 Feb 2018 12:20:56 +0000</pubDate>
      
      <guid>https://zefanjas.de/wie-man-feinstaub-mit-einem-raspberry-pi-messen-kann/</guid>
      <description>&lt;p&gt;Wir messen an unserer Schule regelmäßig den Feinstaubgehalt in der Luft. Besonders zwischen Februar und Mai sind die Werte hier in Süd-Ost Asien sehr hoch, da es in dieser Zeit kaum regnet, es sehr trocken und heiß ist und viele Wiesen und Felder abgebrannt werden. Das alles wirkt sich negativ auf die Qualität der Luft aus. Heute möchte ich zeigen, wie man den Feinstaub mit einem Raspberry Pi messen kann. Doch vorher möchte ich kurz auf die Frage eingehen: Was ist Feinstaub überhaupt und was wollen wir messen?&lt;/p&gt;
&lt;h3 id=&#34;was-ist-feinstaub&#34;&gt;Was ist Feinstaub?&lt;/h3&gt;
&lt;p&gt;Ganz grob kann man sagen, dass es sich bei Feinstaub um sehr kleine Partikel / Teilchen in der Luft handelt. Man unterscheidet dabei zwischen PM10 und PM2.5 (Particulate Matter, auch F&lt;span class=&#34;tag_trans&#34;&gt;eststoffteilchen&lt;/span&gt;). Bei PM10 handelt es sich dabei um alle Partikel in der Luft, die kleiner als 10µm sind, bei PM2.5 entsprechend alle Teilchen, die kleiner als 2.5µm sind. Je kleiner die Teilchen, also v.a. alles kleiner als 2.5µm, desto gefährlicher sind sie für die Gesundheit, da sie bis in die Lungenbläschen eindringen können.&lt;/p&gt;
&lt;p&gt;Die [WHO][1] empfiehlt z.B. folgende Grenzwerte:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Jahresmittel PM&lt;sub&gt;10&lt;/sub&gt; 20 µg/m³&lt;/li&gt;
&lt;li&gt;Jahresmittel PM&lt;sub&gt;2,5&lt;/sub&gt; 10 µg/m³&lt;/li&gt;
&lt;li&gt;Tagesmittel PM&lt;sub&gt;10&lt;/sub&gt; 50 µg/m³ ohne zulässige Tage, an denen eine Überschreitung möglich ist.&lt;/li&gt;
&lt;li&gt;Tagesmittel PM&lt;sub&gt;2,5&lt;/sub&gt; 25 µg/m³ ohne zulässige Tage, an denen eine Überschreitung möglich ist.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Diese Werte liegen unter den in den meisten Ländern festgelegten Grenzen. In EU ist ein Jahresmittel für PM&lt;sub&gt;10&lt;/sub&gt; von 40 µg/m³ zulässig.&lt;/p&gt;
&lt;h3 id=&#34;was-ist-der-air-quality-index-aqi&#34;&gt;Was ist der Air Quality Index (AQI)?&lt;/h3&gt;
&lt;p&gt;Ausgehend von dem Feinstaubgehalt in der Luft kann man den Air Quality Index berechnen. Er gibt an, wie „gut“ oder „schlecht“ die Luft gerade ist. Leider gibt es hier keinen einheitlichen Standard, da verschiedene Länder diesen jeweils anders berechnen oder andere Skalen haben. Der Wikipedia-Artikel zum Air Quality Index liefert dafür einen gute Übersicht. An unserer Schule richten wir uns nach der Einteilung wie sie von der EPA ([United States Environmental Protection Agency][2]) festgelegt wurde.&lt;/p&gt;
&lt;img loading=&#34;lazy&#34; decoding=&#34;async&#34; class=&#34;aligncenter size-full wp-image-2485&#34; src=&#34;https://zefanjas.de/wp-content/uploads/2018/02/Auswahl_195.png&#34; alt=&#34;AQI&#34; width=&#34;487&#34; height=&#34;244&#34; srcset=&#34;https://zefanjas.de/wp-content/uploads/2018/02/Auswahl_195.png 487w, https://zefanjas.de/wp-content/uploads/2018/02/Auswahl_195-300x150.png 300w&#34; sizes=&#34;(max-width: 487px) 100vw, 487px&#34; /&gt; 
&lt;p&gt;Soweit ein kurzer Abriss zum Thema Feinstaub und AQI.&lt;/p&gt;
&lt;h3 id=&#34;was-brauchen-wir-für-die-feinstaubmessung&#34;&gt;Was brauchen wir für die Feinstaubmessung?&lt;/h3&gt;
&lt;p&gt;Eigentlich braucht es nur zwei Dinge:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;einen Raspberry Pi (jedes Modell geht, am besten ein Modell mit WLAN)&lt;/li&gt;
&lt;li&gt;Feinstaubsensor SDS011&lt;/li&gt;
&lt;/ul&gt;
&lt;img loading=&#34;lazy&#34; decoding=&#34;async&#34; class=&#34;aligncenter size-full wp-image-2490&#34; src=&#34;https://zefanjas.de/wp-content/uploads/2018/02/46906ab3-a0be-468c-babd-44ed80328876.jpg&#34; alt=&#34;SDS011&#34; width=&#34;600&#34; height=&#34;600&#34; srcset=&#34;https://zefanjas.de/wp-content/uploads/2018/02/46906ab3-a0be-468c-babd-44ed80328876.jpg 600w, https://zefanjas.de/wp-content/uploads/2018/02/46906ab3-a0be-468c-babd-44ed80328876-150x150.jpg 150w, https://zefanjas.de/wp-content/uploads/2018/02/46906ab3-a0be-468c-babd-44ed80328876-300x300.jpg 300w, https://zefanjas.de/wp-content/uploads/2018/02/46906ab3-a0be-468c-babd-44ed80328876-270x270.jpg 270w&#34; sizes=&#34;(max-width: 600px) 100vw, 600px&#34; /&gt; 
&lt;p&gt;Das war es schon 🙂 Wer sich für einen Raspberry Pi Zero W entscheidet, benötigt noch ein Adapterkabel auf einen Standard-USB Anschluss, da der Zero nur Micro-USB hat. Den Sensor bekommt man am besten bei Aliexpress. Dort kostet er um die 17-20$. Der Sensor hat eine USB-Adapter für die serielle Schnittstelle mit dabei.&lt;/p&gt;
&lt;h3 id=&#34;installation&#34;&gt;Installation&lt;/h3&gt;
&lt;p&gt;Für unseren Raspberry Pi laden wir uns das entsprechende Raspbian Lite Image herunter und schreiben es auf die Micro-SD Karte. Dokumentiert ist das z.B. [hier][3]. Auf die Einrichtung der WLAN-Verbindung gehe ich an dieser Stelle nicht ein. Dazu gibt es viele Tutorials im Netz.&lt;/p&gt;
&lt;p&gt;Wer nach dem Booten gleich SSH aktiviert haben möchte, muss in der boot-Partition einen leere Datei mit dem Namen &lt;code&gt;ssh&lt;/code&gt; anlegen. Die IP des Raspberry Pis bekommt man am besten über den eigenen Router / DHCP Server heraus. Danach kann man sich per SSH anmelden (Standardpasswort ist &lt;em&gt;raspberry&lt;/em&gt;):&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;$ ssh pi@192.168.1.5
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;del&gt;Für unseren Sensor verwenden wir eine &lt;a href=&#34;https://gitlab.com/frankrich/sds011_particle_sensor&#34;&gt;kleines Python-Modul&lt;/a&gt;, was uns einiges an Arbeit abnimmt.&lt;/del&gt; Dazu müssen wir noch einige Pakete installieren &lt;del&gt;und das Repository auf den Pi klonen&lt;/del&gt;.&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;$ sudo apt install python-serial python-enum lighttpd
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;del&gt;Alle benötigten Pakete sollten jetzt installiert sein und das Modul für unseren Sensor befindet sich in &lt;em&gt;&lt;strong&gt;/home/pi/sds011&lt;/strong&gt;&lt;/em&gt;. Unter &lt;em&gt;&lt;strong&gt;/home/pi/sds011/Code/text.py&lt;/strong&gt;&lt;/em&gt; gibt es ein Testprogramm, mit dem man den Sensor testen kann.&lt;/del&gt; Bevor wir das Programm aufrufen können, müssen wir noch wissen, an welchem seriellen Port der USB-Adapter steckt. dmesg hilft uns weiter:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;$ dmesg
[ 5.559802] usbcore: registered new interface driver usbserial
[ 5.559930] usbcore: registered new interface driver usbserial_generic
[ 5.560049] usbserial: USB Serial support registered for generic
[ 5.569938] usbcore: registered new interface driver ch341
[ 5.570079] usbserial: USB Serial support registered for ch341-uart
[ 5.570217] ch341 1-1.4:1.0: ch341-uart converter detected
[ 5.575686] usb 1-1.4: ch341-uart converter now attached to ttyUSB0
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;In der letzten Zeile steht unsere Schnittstelle: &lt;em&gt;ttyUSB0&lt;/em&gt;. Wir brauchen jetzt noch zwei Dinge: einmal ein kleines Python-Skript, welches die Daten ausliest und in eine JSON-Datei speichert und dann werden wir eine kleine HTML-Seite basteln, die diese Daten ausliest und darstellt.&lt;/p&gt;
&lt;h3 id=&#34;daten-auf-dem-raspberry-pi-auslesen-update&#34;&gt;Daten auf dem Raspberry Pi auslesen [Update]&lt;/h3&gt;
&lt;p&gt;Wir erstellen zuerst eine Instanz des Sensors und lesen dann alle 5 Minuten für 30 Sekunden den Sensor aus. Diese Werte können natürlich angepasst werden. Zwischen den Messintervallen versetzen wir den Sensor in einen Schlafmodus, um die Lebensdauer zu erhöhen (Lebensdauer beträgt laut Hersteller ca. 8000 Stunden).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;[Update, 27.02.2018]&lt;/strong&gt; Ich habe festgestellt, das meine Python3 Version des Skripts die serielle Schnittstellen nicht ansprechen konnte, z.B. nach einem Reboot. Erst nach mehrmaligem Starten des Skripts konnten dann die Daten gelesen werden. Woran das liegt, habe ich leider nicht herausgefunden, aber mit Python2.7 funktioniert es ohne Probleme. Deshalb hier eine neue Version des Skripts, welche auf Python2.7 basiert.&lt;/p&gt;
&lt;p&gt;Im Homeverzeichnis legen wir eine Datei mit dem Namen aqi.py an und kopieren den folgenden Inhalt hinein:&lt;/p&gt;
&lt;pre class=&#34;height-set:true lang:python decode:true&#34;&gt;#!/usr/bin/python
# coding=utf-8
# &#34;DATASHEET&#34;: http://cl.ly/ekot
# https://gist.github.com/kadamski/92653913a53baf9dd1a8
from __future__ import print_function
import serial, struct, sys, time, json

DEBUG = 0
CMD_MODE = 2
CMD_QUERY_DATA = 4
CMD_DEVICE_ID = 5
CMD_SLEEP = 6
CMD_FIRMWARE = 7
CMD_WORKING_PERIOD = 8
MODE_ACTIVE = 0
MODE_QUERY = 1

ser = serial.Serial()
ser.port = &#34;/dev/ttyUSB0&#34;
ser.baudrate = 9600

ser.open()
ser.flushInput()

byte, data = 0, &#34;&#34;

def dump(d, prefix=&#39;&#39;):
    print(prefix + &#39; &#39;.join(x.encode(&#39;hex&#39;) for x in d))

def construct_command(cmd, data=[]):
    assert len(data) &amp;lt;= 12
    data += [0,]*(12-len(data))
    checksum = (sum(data)+cmd-2)%256
    ret = &#34;\xaa\xb4&#34; + chr(cmd)
    ret += &#39;&#39;.join(chr(x) for x in data)
    ret += &#34;\xff\xff&#34; + chr(checksum) + &#34;\xab&#34;

    if DEBUG:
        dump(ret, &#39;&amp;gt; &#39;)
    return ret

def process_data(d):
    r = struct.unpack(&#39;&amp;lt;HHxxBB&#39;, d[2:])
    pm25 = r[0]/10.0
    pm10 = r[1]/10.0
    checksum = sum(ord(v) for v in d[2:8])%256
    return [pm25, pm10]
    #print(&#34;PM 2.5: {} μg/m^3  PM 10: {} μg/m^3 CRC={}&#34;.format(pm25, pm10, &#34;OK&#34; if (checksum==r[2] and r[3]==0xab) else &#34;NOK&#34;))

def process_version(d):
    r = struct.unpack(&#39;&amp;lt;BBBHBB&#39;, d[3:])
    checksum = sum(ord(v) for v in d[2:8])%256
    print(&#34;Y: {}, M: {}, D: {}, ID: {}, CRC={}&#34;.format(r[0], r[1], r[2], hex(r[3]), &#34;OK&#34; if (checksum==r[4] and r[5]==0xab) else &#34;NOK&#34;))

def read_response():
    byte = 0
    while byte != &#34;\xaa&#34;:
        byte = ser.read(size=1)

    d = ser.read(size=9)

    if DEBUG:
        dump(d, &#39;&amp;lt; &#39;)
    return byte + d

def cmd_set_mode(mode=MODE_QUERY):
    ser.write(construct_command(CMD_MODE, [0x1, mode]))
    read_response()

def cmd_query_data():
    ser.write(construct_command(CMD_QUERY_DATA))
    d = read_response()
    values = []
    if d[1] == &#34;\xc0&#34;:
        values = process_data(d)
    return values

def cmd_set_sleep(sleep=1):
    mode = 0 if sleep else 1
    ser.write(construct_command(CMD_SLEEP, [0x1, mode]))
    read_response()

def cmd_set_working_period(period):
    ser.write(construct_command(CMD_WORKING_PERIOD, [0x1, period]))
    read_response()

def cmd_firmware_ver():
    ser.write(construct_command(CMD_FIRMWARE))
    d = read_response()
    process_version(d)

def cmd_set_id(id):
    id_h = (id&amp;gt;&amp;gt;8) % 256
    id_l = id % 256
    ser.write(construct_command(CMD_DEVICE_ID, [0]*10+[id_l, id_h]))
    read_response()

if __name__ == &#34;__main__&#34;:
    while True:
        cmd_set_sleep(0)
        cmd_set_mode(1);
        for t in range(15):
            values = cmd_query_data();
            if values is not None:
                print(&#34;PM2.5: &#34;, values[0], &#34;, PM10: &#34;, values[1])
                time.sleep(2)

        # open stored data
        with open(&#39;/var/www/html/aqi.json&#39;) as json_data:
            data = json.load(json_data)

        # check if length is more than 100 and delete first element
        if len(data) &amp;gt; 100:
            data.pop(0)

        # append new values
        data.append({&#39;pm25&#39;: values[0], &#39;pm10&#39;: values[1], &#39;time&#39;: time.strftime(&#34;%d.%m.%Y %H:%M:%S&#34;)})

        # save it
        with open(&#39;/var/www/html/aqi.json&#39;, &#39;w&#39;) as outfile:
            json.dump(data, outfile)

        print(&#34;Going to sleep for 5min...&#34;)
        cmd_set_mode(0);
        cmd_set_sleep()
        time.sleep(300)
```

Schneller geht es mit:

```
$ wget -O /home/pi/aqi.py https://raw.githubusercontent.com/zefanja/aqi/master/python/aqi.py
```

Damit das Skript fehlerfrei durchläuft sind noch zwei kleine Dinge nötig:

```
$ sudo chown pi:pi /var/www/html/
$ echo [] &amp;gt; /var/www/html/aqi.json

```

Nun kann man das Skript starten:

```
$ chmod +x aqi.py
$ ./aqi.py
PM2.5: 55.3 , PM10: 47.5
PM2.5: 55.5 , PM10: 47.7
PM2.5: 55.7 , PM10: 47.8
PM2.5: 53.9 , PM10: 47.6
PM2.5: 53.6 , PM10: 47.4
PM2.5: 54.2 , PM10: 47.3
...
```

### Skript automatisch starten lassen [Update]

Damit wir nicht jedes mal das Skript von Hand starten müssen, können wir es mit einem Cronjob z.B. bei jedem Neustart des Raspberry Pis mit starten lassen. Dazu öffnen wir die crontab-Datei

```
$ crontab -e
```

und ergänzen am Ende die nachfolgende Zeile:

```
@reboot cd /home/pi/ &amp;&amp; ./aqi.py
```

Nun startet unser Skript automatisch bei jedem Neustart mit.

### HTML-Seite für Anzeige der Messwerte und AQI

Weiter oben haben wir bereits einen leichtgewichtigen Webserver `lighttpd` installiert. Unsere HTML-, Javascript- und CSS-Datei müssen wir also im Verzeichnis _**/var/www/html/**_ speichern, damit wir von einen anderem Computer / Smartphone auf die Daten zugreifen können. Mit den nächsten drei Befehlen laden wir die entsprechenden Dateien einfach herunter:

```
$ wget -O /var/www/html/index.html https://raw.githubusercontent.com/zefanja/aqi/master/html/index.html
$ wget -O /var/www/html/aqi.js https://raw.githubusercontent.com/zefanja/aqi/master/html/aqi.js
$ wget -O /var/www/html/style.css https://raw.githubusercontent.com/zefanja/aqi/master/html/style.css
```

Die Hauptarbeit findet in der Javascript-Datei statt, die unsere JSON-Datei öffnet, den letzten Wert nimmt und anhand dieses Wertes den AQI berechnet. Dann werden noch die Hintergrundfarben anhand der Skala der EPA angepasst.

Nun man die Adresse des Raspberry Pis einfach im Browser aufrufen und die aktuellen Feinstaubwerte betrachten, z.B. _http://192.168.1.5_:

&lt;img loading=&#34;lazy&#34; decoding=&#34;async&#34; class=&#34;aligncenter size-full wp-image-2487&#34; src=&#34;https://zefanjas.de/wp-content/uploads/2018/02/Auswahl_196.png&#34; alt=&#34;AQI Website&#34; width=&#34;576&#34; height=&#34;342&#34; srcset=&#34;https://zefanjas.de/wp-content/uploads/2018/02/Auswahl_196.png 576w, https://zefanjas.de/wp-content/uploads/2018/02/Auswahl_196-300x178.png 300w, https://zefanjas.de/wp-content/uploads/2018/02/Auswahl_196-455x270.png 455w&#34; sizes=&#34;(max-width: 576px) 100vw, 576px&#34; /&gt; 

Die Seite ist sehr einfach gestaltet und kann noch erweitert werden, z.B. um eine Grafik, die den Verlauf der letzten Stunden anzeigt usw. Pull Requests sind willkommen 🙂 Der komplette [Quellcode befindet sich auf Github][4].

### Fazit

Für relativ wenig Geld können wir jetzt den Feinstaub mit einem Raspberry Pi messen. Ob draußen fest installiert oder als mobiles Messgerät &amp;#8211; Einsatzmöglichkeiten gibt es viele. An unserer Schule haben wir beides im Einsatz. Einerseits einen Sensor der Tag und Nacht die Werte im Freien misst und einen mobilen Sensor, mit dem wir die Effektivität unserer Luftfilter in den Klassenzimmern überprüfen.

So sieht das ganze bei uns in der Schule aus:

&lt;img loading=&#34;lazy&#34; decoding=&#34;async&#34; class=&#34;aligncenter size-full wp-image-2497&#34; src=&#34;https://zefanjas.de/wp-content/uploads/2018/02/Auswahl_202.png&#34; alt=&#34;AQI Sensor&#34; width=&#34;327&#34; height=&#34;490&#34; srcset=&#34;https://zefanjas.de/wp-content/uploads/2018/02/Auswahl_202.png 327w, https://zefanjas.de/wp-content/uploads/2018/02/Auswahl_202-200x300.png 200w, https://zefanjas.de/wp-content/uploads/2018/02/Auswahl_202-180x270.png 180w&#34; sizes=&#34;(max-width: 327px) 100vw, 327px&#34; /&gt; 

Unter &lt;http://luftdaten.info&gt; gibt es noch eine andere Möglichkeit einen ähnlichen Sensor zu bauen. Da bekommt man die Software bereits fertig geliefert und das Messgerät ist noch mal kompakter, da kein Raspberry Pi verwendet wird. Tolles Projekt!

Ein Feinstaubsensor ist ein Projekt, was sich auch gut mit Schülern im Informatikunterricht oder einer Arbeitsgemeinschaft umsetzen lässt!

&lt;p style=&#34;text-align: center;&#34;&gt;
  &lt;strong&gt;Wofür setzt du einen &lt;a href=&#34;https://zefanjas.de/server-bei-stromausfall-herunterfahren-ups-nut-co/&#34;&gt;Raspberry Pi&lt;/a&gt; ein?&lt;/strong&gt;
&lt;/p&gt;

 [1]: https://de.wikipedia.org/wiki/Feinstaub#WHO
 [2]: https://en.wikipedia.org/wiki/United_States_Environmental_Protection_Agency &#34;United States Environmental Protection Agency&#34;
 [3]: https://www.raspberrypi.org/documentation/installation/installing-images/README.md
 [4]: https://github.com/zefanja/aqi</description>
    </item>
    
    <item>
      <title>Kann man einen Computerraum für weniger als 1500€ einrichten? Ja!</title>
      <link>https://zefanjas.de/kann-man-einen-computerraum-fuer-weniger-als-1500e-einrichten-ja/</link>
      <pubDate>Thu, 11 Jan 2018 07:49:33 +0000</pubDate>
      
      <guid>https://zefanjas.de/kann-man-einen-computerraum-fuer-weniger-als-1500e-einrichten-ja/</guid>
      <description>&lt;h3 id=&#34;ausgangssituation&#34;&gt;Ausgangssituation&lt;/h3&gt;
&lt;p&gt;Einen &lt;a href=&#34;https://zefanjas.de/open-source-in-der-schul-it-teil-1/&#34;&gt;Computerraum einzurichten&lt;/a&gt;, kann schnell sehr teuer werden. Computer, Monitore, Tastaturen, Kabel, Switche, usw. müssen gekauft werden, um später einen zuverlässigen Computerraum zu haben, der gern genutzt wird. Gerade kleine Schulen und Vereine, welche nur über kleine Budgets verfügen, sind in dieser Hinsicht kaum oder nur schlecht ausgestattet. Auch in Entwicklungsländern und weniger wohlhabenden Teilen der Welt (es ist der größere Teil!) teilen sich statistisch gesehen oft mehrere hundert Schüler einen einzigen Computer – wenn überhaupt. Deshalb möchte ich heute eine Idee vorstellen, wie man einen kompletten Computerraum für verhältnismäßig wenig Geld einrichten kann.&lt;/p&gt;
&lt;h3 id=&#34;anforderungen-an-den-computerraum&#34;&gt;Anforderungen an den Computerraum&lt;/h3&gt;
&lt;p&gt;Damit ein Computerraum auch von allen genutzt wird, müssen die technischen Hürden sehr gering sein. Auf der anderen Seite, muss sich das System an sich einfach verwalten lassen, ohne das man dafür mehrere Stunden / Woche aufwenden muss.&lt;/p&gt;
&lt;p&gt;Aus meiner Sicht sollten folgende (minimale) Anforderungen erfüllt sein:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;einfach zu benutzen&lt;/li&gt;
&lt;li&gt;schnell einen Soll-Zustand herstellen können&lt;/li&gt;
&lt;li&gt;kurze Startzeiten&lt;/li&gt;
&lt;li&gt;verlässliche Infrastruktur&lt;/li&gt;
&lt;li&gt;keine Viren etc.&lt;/li&gt;
&lt;li&gt;wartungsarm&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;zutaten&#34;&gt;Zutaten&lt;/h3&gt;
&lt;h4 id=&#34;hardware&#34;&gt;Hardware&lt;/h4&gt;
&lt;p&gt;Damit wir das gesteckte Ziel von maximal 1500€ erreichen, müssen wir v.a. bei der Hardware „sparen“. Für die meisten Dinge, die Schüler heutzutage in einem Computerraum erledigen, brauchen sie i.d.R. nur einen Browser und evtl. ein Officepaket. Dafür braucht man keine aktuelle leistungsstarke Hardware. Ein Raspberry Pi oder gebrauchte Computer sind da völlig ausreichend.&lt;/p&gt;
&lt;p&gt;Wir brauchen:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;einen Server: das kann ein 3-7 Jahre alter Rechner sein mit einer größeren Platte (ca. 15-20GB pro Rechner) – z.B. von &lt;a href=&#34;https://www.afbshop.de/&#34;&gt;AfB&lt;/a&gt;, ca. 150€&lt;/li&gt;
&lt;li&gt;Router (falls nicht schon vorhanden): ca. 20-50€&lt;/li&gt;
&lt;li&gt;Switch gebraucht (Gigabit): ca. 50€&lt;/li&gt;
&lt;li&gt;Raspberry Pi 3 (Starterkit): 50€&lt;/li&gt;
&lt;li&gt;Bildschirm (meist schon vorhanden), sonst ca. 30-50€&lt;/li&gt;
&lt;li&gt;Steckdosenleisten, Netzwerkkabel: ca. 100€&lt;/li&gt;
&lt;li&gt;Tastatur+Maus: 15-20€&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Wenn wir nicht mehr als 1500€ ausgeben wollen, reicht unser Budget für 12 Raspberry Pis. Falls z.B. Bildschirme schon vorhanden sind / gespendet werden, können wir natürlich entsprechend mehr Rechner kaufen.&lt;/p&gt;
&lt;h4 id=&#34;software&#34;&gt;Software&lt;/h4&gt;
&lt;p&gt;Gerade für den Raspberry Pi gibt es verschiedene Projekte, die uns die Verwaltung der Rechner sehr leicht machen und auch sehr wartungsarm sind. Schon seit einiger Zeit gibt es das &lt;a href=&#34;http://pinet.org.uk/&#34;&gt;PiNet Projekt&lt;/a&gt;, welches speziell für Schulen entwickelt wurde. Es bietet eine zentrale Benutzer- und Speicherverwaltung, d.h. die Kids können sich an jedem Rechner anmelden und können von dort auf ihre Daten zugreifen.&lt;/p&gt;
&lt;p&gt;Letzte Woche hat die Raspberry Pi Foundation ein ganz ähnliches Projekt veröffentlicht: &lt;a href=&#34;https://www.raspberrypi.org/blog/piserver/&#34;&gt;PiServer&lt;/a&gt;. Es hat ebenfalls den Fokus auf Schulen, aber nicht nur. Auch hier lassen sich Benutzer und Speicher zentral verwalten. Die Raspberry Pis starten hier auch über das Netzwerk und benötigen keine SD-Karte.&lt;/p&gt;
&lt;p&gt;Alternativ kann man auch einen Raspberry Pi so einrichten, wie man es möchte und dieses Image dann auf die anderen Rechner verteilen. Ein zentraler Samba-Server dient zum Speichern der Arbeitsergebnisse. &lt;a href=&#34;http://skolnet.de/raspberry-pi-netzwerk-in-der-grundschule/&#34;&gt;Marek hat so eine Lösung&lt;/a&gt; in seiner Schule umgesetzt (sogar für weniger als 1500€!).&lt;/p&gt;
&lt;h3 id=&#34;vor--und-nachteile&#34;&gt;Vor- und Nachteile&lt;/h3&gt;
&lt;p&gt;Wie bei jedem Projekt gibt es auch hier Vor- und Nachteile. Oben hatten wir unsere minimalen Voraussetzungen aufgeschrieben. Dazu kommen sicher noch weitere v.a. wenn es an die Auswahl der Software geht. Lernsoftware setzt meist Windows voraus. Vielleicht soll eine andere (rechenintensive) Software verwendet werden für die die Raspberry Pis zu leistungsschwach sind.&lt;/p&gt;
&lt;p&gt;Vorteile sind auf jeden Fall:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;sehr preisgünstig&lt;/li&gt;
&lt;li&gt;stromsparend&lt;/li&gt;
&lt;li&gt;platzsparend und leise&lt;/li&gt;
&lt;li&gt;wartungsarm&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Nachteile könnten sein:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://zefanjas.de/schule-und-open-source/&#34;&gt;Windows Lernsoftware läuft nicht&lt;/a&gt; (da PiNet und PiServer auf Linux setzen)&lt;/li&gt;
&lt;li&gt;ungewohntes System für die meisten Kollegen. Der Mensch ist ein Gewohnheitstier – was man nicht kennt, lehnen viele leider erstmal ab. Hier ist sicher Überzeugungsarbeit gefragt und es ist gut, wenn man z.B. eine Einführung oder Fortbildung in das neue System anbietet um Berührungsängste zu nehmen.&lt;/li&gt;
&lt;li&gt;Raspberry Pi sind evtl. nicht leistungsstark genug für rechenintensive Anwendungen&lt;/li&gt;
&lt;li&gt;Netzwerkschnittstelle des Rapsberry Pi ist nicht sehr schnell (das ändert sich hoffentlich in einer zukünftigen Version)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;fazit&#34;&gt;Fazit&lt;/h3&gt;
&lt;p&gt;Gerade für Grundschulen, Bibliotheken oder andere (kleine) Vereine, welche Computerarbeitsplätze anbieten wollen, könnte eine Lösung mit Raspberry Pis eine Lösung sein. Für verhältnismäßig wenig Geld kann man ein verlässliches und wartungsarmes System einrichten. Wenn mehr Geld zur Verfügung steht, kann man mit leistungsstärkeren (durchaus gebrauchten) Rechnern auf &lt;a href=&#34;https://zefanjas.de/tag/linuxmuster/&#34;&gt;linuxmuster.net&lt;/a&gt; setzen. Mit dieser Lösung hat man noch mehr Möglichkeiten und kann viele Rechner (Ubuntu / Windows) mit relativ wenig Aufwand verwalten.&lt;/p&gt;
&lt;p style=&#34;text-align: center;&#34;&gt;
  &lt;strong&gt;Setzt du einen Raspberry Pi in der Schule oder im Verein ein? Welche Erfahrungen hast du damit gemacht?&lt;/strong&gt;
&lt;/p&gt;
&lt;p&gt;(&lt;a href=&#34;https://en.wikipedia.org/wiki/File:Tanzanian_Students_at_Mekomariro_Secondary_School.jpg&#34;&gt;Beitragsbild&lt;/a&gt; &lt;a href=&#34;https://creativecommons.org/licenses/by-sa/4.0/&#34;&gt;&lt;span class=&#34;cc-license-identifier&#34;&gt;CC BY-SA 4.0 &lt;/span&gt;&lt;/a&gt;by DGately)&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Server bei Stromausfall herunterfahren – UPS, NUT &amp; Co</title>
      <link>https://zefanjas.de/server-bei-stromausfall-herunterfahren-ups-nut-co/</link>
      <pubDate>Mon, 27 Nov 2017 22:29:51 +0000</pubDate>
      
      <guid>https://zefanjas.de/server-bei-stromausfall-herunterfahren-ups-nut-co/</guid>
      <description>&lt;p&gt;An unserer Schule gibt es immer wieder Stromausfälle. Manchmal dauern sie nur wenige Sekunden, manchmal aber auch mehrere Stunden. Damit unsere IT-Infrakstruktur nicht darunter leidet, haben wir für unsere Server und Netzwerkgeräte eine [UPS/USV][1] installiert. Diese helfen kürzere Stromausfälle (bis zu 1 Stunde) oder Stromschwankungen zu überbrücken. Für alle längeren Ausfälle fahren wir unsere Server automatisch herunter, wenn die UPS ein kritisches Batterielevel erreicht. Dafür nutzen wir NUT ([Network UPS Tools][2]).&lt;/p&gt;
&lt;p&gt;Unser Setup besteht aus folgenden Komponenten:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Raspberry Pi als UPS-Server bzw. Master&lt;/li&gt;
&lt;li&gt;Liebert GXT4 UPS&lt;/li&gt;
&lt;li&gt;Server als Clients bzw. Slaves&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;ups--usv-in-nut-auf-dem-raspberry-pi-einrichten&#34;&gt;UPS / USV in NUT auf dem Raspberry Pi einrichten&lt;/h3&gt;
&lt;p&gt;Für den Raspberry Pi verwenden wir das Standard [Raspian Stretch Lite Image][3]. Zu beachten ist, dass &lt;strong&gt;SSH&lt;/strong&gt; seit 2016 standardmäßig &lt;strong&gt;nicht mehr aktiviert&lt;/strong&gt; ist. Die verschiedenen Möglichkeiten, wie man &lt;strong&gt;SSH wieder aktiveren&lt;/strong&gt; kann, sind [hier dokumentiert][4]. Nachdem SSH nun wieder aktiviert ist, kann man sich nun auf dem Raspberry Pi einloggen (die IP des Raspberry Pi kann man z.B. mit &lt;span class=&#34;lang:default decode:true crayon-inline &#34;&gt;avahi-browse -ar&lt;/span&gt;  von einem Rechner im gleichen Netzwerk herausfinden oder man schließt einen Monitor und Tastatur an). Die IP brauchen wir später noch, deshalb ist es sinnvoll dem Raspberry Pi [eine statische IP][5] zu geben.&lt;/p&gt;
&lt;p&gt;Als nächstes installieren wir den NUT-Server mit&lt;/p&gt;
&lt;pre class=&#34;&#34;&gt;sudo apt-get install nut-client nut-server usbutils
```

Falls die UPS / USV per USB angeschlossen ist (wie in unserem Fall), kann man mit &lt;span class=&#34;lang:sh decode:true crayon-inline &#34;&gt;lsusb&lt;/span&gt; überprüfen, ob sie auch erkannt wurde. So sieht die Ausgabe auf dem Raspberry Pi aus:

&lt;pre class=&#34;lang:sh decode:true&#34;&gt;$ lsusb
Bus 001 Device 004: ID 10af:0000 Liebert Corp. UPS
Bus 001 Device 003: ID 0424:ec00 Standard Microsystems Corp. SMSC9512/9514 Fast Ethernet Adapter
Bus 001 Device 002: ID 0424:9514 Standard Microsystems Corp. 
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
```

In der ersten Zeile sieht man, dass unsere Liebert UPS erkannt wurde.

Nun müssen wir unsere UPS / USV in der Datei _**/etc/nut/ups.conf**_ konfigurieren. Für unsere UPS sieht der Eintrag folgendermaßen aus:

&lt;pre class=&#34;&#34;&gt;[gxt4]
     driver = usbhid-ups
     port = auto
     productid = 0000
     desc = &#34;Emerson Liebert GXT 4&#34;
```

Auf der [Website der Network UPS Tools][6] findet man eine Liste mit allen unterstützen UPS /USV und mit welcher Treiber am besten funktioniert.

Als nächstes wollen wir testen, ob die Einstellungen korrekt sind der UPS Daemon mit der UPS kommunizieren kann. Dazu starten wir **upsd** mit &lt;span class=&#34;lang:default decode:true crayon-inline &#34;&gt;sudo upsdrvctl start&lt;/span&gt; . Eine erfolgreiche Ausgabe sollte ungefähr so aussehen:

&lt;pre class=&#34;lang:sh decode:true &#34;&gt;Network UPS Tools - UPS driver controller 2.7.2
Network UPS Tools - Generic HID driver 0.38 (2.7.2)
USB communication driver 0.32
Using subdriver: Belkin HID 0.16
```

NUT enthält einen kleines Programm, mit dem man die Kommunikation mit der UPS /USV testen kann. Es heißt **upsc** und gibt alle lesbaren Parameter der UPS / USV aus.

&lt;pre class=&#34;lang:sh decode:true &#34;&gt;$ upsc gxt4
Init SSL without certificate database
&lt;strong&gt;battery.charge: 100&lt;/strong&gt;
battery.charge.low: 20
battery.charge.warning: 0
battery.type: PbAc
battery.voltage: 0.0
battery.voltage.nominal: 0.0
device.mfr: Emerson Network Power
device.model: Liebert GXT4
device.serial: 1607000060AFC23
device.type: ups
driver.name: usbhid-ups
driver.parameter.pollfreq: 30
driver.parameter.pollinterval: 2
driver.parameter.port: auto
driver.parameter.productid: 0000
driver.version: 2.7.2
driver.version.data: Belkin HID 0.16
driver.version.internal: 0.38
ups.mfr: Emerson Network Power
ups.model: Liebert GXT4
ups.productid: 0000
ups.serial: 1607000060AFC23
&lt;strong&gt;ups.status: OL CHRG&lt;/strong&gt;
ups.vendorid: 10af
```

Nun ist unsere UPS /USV erfolgreich eingerichtet. Als nächsten richten wir den NUT Server, den UPS Monitor **upsmon** und noch zwei Benutzer für den Master und die Slaves ein.

### NUT Server konfigurieren

In der _**/etc/nut/nut.conf**_ legen wir fest, dass der Raspberry Pi unser Master ist:

&lt;pre class=&#34;&#34;&gt;MODE=netserver
```

Auf dem NUT-Server läuft der UPS Daemon (**upsd**). Er ist für die (physikalische) Verbindung zur UPS verantwortlich. Die einzelnen Clients/Slaves greifen mit Hilfe des **upsmon** auf den Status der UPS zu. So können mehrere Clients immer über den Zustand der UPS informiert sein und gegebenenfalls das Herunterfahren auslösen, wenn die UPS den Status &amp;#8222;On Low Battery&amp;#8220; liefert.

Damit unser NUT Server aus dem Netz erreichbar ist, müssen noch folgende Zeilen in der _**/etc/nut/upsd.conf**_ hinzugefügt werden (IP bitte anpassen):

&lt;pre class=&#34;&#34;&gt;LISTEN 127.0.0.1
LISTEN 192.168.1.2 #IP des Raspberry Pis
```

Als nächstes legen wir die Benutzer fest mit der sich ein Client beim Master anmelden kann (in der Datei _**/etc/nut/upsd.user**_):

```
[upsmaster]
    password = geheim
    upsmon master

[upsremote]
        password  = geheim
        upsmon slave
```

Damit **upsmon** die UPS auch überwacht, müssen wir nun noch eine letzten Eintrag in der Datei **/etc/nut/upsmon.conf** hinzufügen:

```
MONITOR gxt4@localhost 1 upsmaster geheim master
```

Damit man weiß, ob alle Dienste richtig laufen, kann man den Status des Servers als auch den lokalen Clients auf dem Raspberry Pi (denn der soll ja auch heruntergefahren werden, wenn kein Strom mehr da ist) mit folgendem Befehlen überprüfen:

```
$ sudo systemctl status nut-server
$ sudo systemctl status nut-client
```

Nun ist unser Master fertig eingerichtet und die Clients bzw. Slaves können jetzt konfiguriert werden.

### Clients / Slaves einrichten (z.B. Server, andere Computer)

Zuerst müssen auf einem Client die notwendigen Pakete installiert werden:

```
sudo apt-get install nut-client
```

Diesmal müssen wir nur zwei Dateien editieren. In der _**/etc/nut/nut.conf**_ legen wir den Modus fest:

```
MODE=netclient
```

Danach müssen wir wieder **upsmon** sagen, welche UPS er überwachen soll (in _**/etc/nut/upsmon.conf**_):

```
MONITOR gxt4@192.168.1.2 upsremote geheim slave
```

Die IP und das Passwort müssen natürlich noch angepasst werden. Bitte auch das **slave** am Ende beachten! Zuletzt noch den entsprechenden Service neu starten und überprüfen, ob alles läuft:

&lt;pre class=&#34;&#34;&gt;$ sudo systemctl restart nut-client
$ sudo systemctl status nut-client
```

Glückwunsch! Nun sollte alles eingerichtet sein, aber wie kann man testen, dass es wirklich funktioniert?

### Herunterfahren testen

Der folgende Befehl löst das Signal zum Herunterfahren aus (wie es auch im Falle eines Stromausfalls sein würde):

```
$ sudo upsmon -c fsd
```

### UPS mit Check_MK überwachen [Update]

#### Check_MK Agent einrichten

Nachdem die UPS jetzt fertig eingerichtet ist, wäre es natürlich toll, wenn wir sie auch im Monitoring überwachen können. Wir nutzen dafür Check\_MK. Clients können in Check\_MK mit dem Check_MK Agenten oder per SNMP überwacht werden. Der Agent ist in den Standard-Paketquellen von Debian und Ubuntu enthalten, weshalb wir ihn einfach mit diesem Befehl auf dem Raspberry Pi installieren können:

```
$ sudo apt-get install check-mk-agent xinetd
```

Standardmäßig ist der Check_MK Agent nicht aktiviert, sodass wir ihn noch in der Datei _**/etc/xinetd.d/check_mk**_ noch aktivieren müssen. Am Ende der Datei muss &lt;span class=&#34;lang:default decode:true crayon-inline &#34;&gt;disable = yes&lt;/span&gt;  in &lt;span class=&#34;lang:default decode:true crayon-inline &#34;&gt;disable = no&lt;/span&gt;  geändert werden. Wenn man möchte, kann man auch noch den Zugriff einschränken, indem man mit &lt;span class=&#34;lang:default decode:true crayon-inline &#34;&gt;only_from = IP-des-Check-MK-Severs&lt;/span&gt;  die Server-IPs einträgt, die die Erlaubnis haben die Daten des Check_MK Agenten abzufragen.

Als nächstes muss xinetd neu gestartet werden. Mit dem zweiten Befehl überprüfen wir, ob der Check_MK Agent richtig konfiguriert ist und läuft (IP anpassen!).

```
$ sudo service xinetd restart
$ telnet 192.168.1.2 6556
```

#### NUT Plugins

Bisher weiß der Check_MK Agent noch nichts von unserer UPS und liest die entsprechenden Daten auch nicht aus. Mit folgendem kleinen Skript können wir die Ausgabe von upsc dem Agenten mitteilen:

```
#!/bin/sh

if which upsc &amp;gt; /dev/null 2&amp;gt;&amp;1 ; then
    echo &#39;&amp;lt;&amp;lt;&amp;lt;nut&amp;gt;&amp;gt;&amp;gt;&#39;
    for ups in $(upsc -l)
    do
        upsc $ups| sed &#34;s,^,$ups ,&#34;
    done
fi
```

Diese kleine Plugin speichern wir unter _**/usr/lib/check\_mk\_agent/plugins/nut**_. Auf dem Raspberry Pi sind wird nun fertig. Es fehlen jetzt noch die Anpassungen auf dem Check_MK Server.

Auf dem Server brauchen wir ein weiteres Skript, welches die Daten des Check_MK Agenten ausliest. Dieses Skript ist umfangreicher, deshalb [verlinke ich es hier][7]. Es muss unter _**/opt/omd/versions/default/share/check_mk/checks/nut**_ gespeichert werden. Das Original-Plugin kann man hier finden: &lt;https://github.com/minodudd/check_mk-plugins&gt;. Ich habe es minimal angepasst für unsere UPS angepasst.

Wenn man nun den Raspberry Pi als neuen Host in Check_MK hizufügt, werden die Services für die UPS / USV mit angezeigt.&lt;figure id=&#34;attachment_2160&#34; aria-describedby=&#34;caption-attachment-2160&#34; style=&#34;width: 827px&#34; class=&#34;wp-caption aligncenter&#34;&gt;

&lt;img loading=&#34;lazy&#34; decoding=&#34;async&#34; class=&#34;size-full wp-image-2160&#34; src=&#34;https://zefanjas.de/wp-content/uploads/2017/11/Auswahl_123.png&#34; alt=&#34;NUT Services&#34; width=&#34;827&#34; height=&#34;123&#34; srcset=&#34;https://zefanjas.de/wp-content/uploads/2017/11/Auswahl_123.png 827w, https://zefanjas.de/wp-content/uploads/2017/11/Auswahl_123-300x45.png 300w, https://zefanjas.de/wp-content/uploads/2017/11/Auswahl_123-768x114.png 768w, https://zefanjas.de/wp-content/uploads/2017/11/Auswahl_123-604x90.png 604w&#34; sizes=&#34;(max-width: 827px) 100vw, 827px&#34; /&gt; &lt;figcaption id=&#34;caption-attachment-2160&#34; class=&#34;wp-caption-text&#34;&gt;NUT Services&lt;/figcaption&gt;&lt;/figure&gt; 

### Fazit

NUT ist ein [weiteres tolles Open Source Projekt][8], mit dem sehr flexible Anpassungen möglich sind. In [dieser PDF][9] sind noch viele weitere (komplexe) Anwendungsszenarien enthalten. Während ich diesen Artikel schreibe, haben wir wieder einen Stromausfall und alle unsere Server sind zuverlässig heruntergefahren worden!

&amp;nbsp;

 [1]: https://de.wikipedia.org/wiki/Unterbrechungsfreie_Stromversorgung
 [2]: http://networkupstools.org/
 [3]: https://www.raspberrypi.org/downloads/raspbian/
 [4]: https://www.raspberrypi.org/documentation/remote-access/ssh/
 [5]: http://www.imakeyouintelligent.com/raspberry-raspbian-stretch-static-ip/
 [6]: http://networkupstools.org/stable-hcl.html
 [7]: https://gist.github.com/zefanja/585a96988656f24c507e573042564d8e#file-nut-plugin-server
 [8]: https://zefanjas.de/2017/11/18/5-grossartige-open-source-programme-die-wir-in-unserer-schule-einsetzen/
 [9]: http://rogerprice.org/NUT/ConfigExamples.A5.pdf</description>
    </item>
    
    <item>
      <title>Build a Robot #2 – Fernsteuerung mit dem Smartphone</title>
      <link>https://zefanjas.de/build-a-robot-2-fernsteuerung-mit-dem-smartphone/</link>
      <pubDate>Fri, 20 Dec 2013 13:28:39 +0000</pubDate>
      
      <guid>https://zefanjas.de/build-a-robot-2-fernsteuerung-mit-dem-smartphone/</guid>
      <description>&lt;p&gt;Heute soll es uns um die Steuerung des kleinen Roboters mit einem Smartphone/Tablet gehen. Dabei soll die Fernsteuerung möglichst plattform-unabhängig sein. Aus diesem Grund habe ich mich für eine einfache Website entschieden, welche die Daten des [Gyroskop][1] ausliest und entsprechende Befehle an den Roboter schickt.&lt;/p&gt;
&lt;h3 id=&#34;die-serverseite&#34;&gt;Die Serverseite&lt;/h3&gt;
&lt;p&gt;Ich habe in den letzten Jahren viel mit Javascript programmiert und aus diesem Grund habe ich mich für eine [nodejs][2] basierte Lösung entschieden. Javascript ist für die Steuerung von GPIOs eigentlich nicht wirklich geeignet (single threading, Latenzen, …), aber für das An- und Ausschalten von Motoren passt es ganz gut.&lt;/p&gt;
&lt;p&gt;Zuerst sollte man also nodejs auf dem Raspberry Pi installieren. Da die Version in den Repositories nicht gerade aktuell ist, kann man sich manuell ein compiliertes Paket direkt bei nodejs downloaden. Die Installation ist in [diesem Artikel][3] ganz gut beschrieben.&lt;/p&gt;
&lt;p style=&#34;text-align: left;&#34;&gt;
  Bei Github findet man verschiedene Pakete für die Ansteuerung der GPIOs. Ich habe mich für &lt;a href=&#34;https://github.com/brnt/node-rpio&#34;&gt;node-rpio&lt;/a&gt; entschieden, da die API der Python-API entspricht, die wir im letzten Beitrag verwendet haben. Weiterhin ist die API synchron, was in unserem Fall sinnvoll ist, da wir sonst mit vielen vielen Callbacks zu tun hätten 😉 Um node-rpio zu nutzen, muss es noch compiliert werden. Dazu gibt man einfach den Befehle
&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;npm install -g node-gyp
node-gyp rebuild
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;ein, nachdem man das Github-Repo geklont hat. Nun ist alles fertig, um die Motoren über nodejs zu steuern. Da die API gleich ist, können wir im Prinzip den Quelltext aus dem letzten Beitrag nehmen und nur ein klein wenig anpassen:&lt;/p&gt;
&lt;pre class=&#34;brush:js&#34;&gt;var gpio = require(&#34;./node-rpio/lib/rpio&#34;);

//Setup GPIO Pins
gpio.setmode(gpio.BOARD);
gpio.setup(13, gpio.OUT);
gpio.setup(15, gpio.OUT);
gpio.setup(16, gpio.OUT);
gpio.setup(18, gpio.OUT);

gpio.output(13, 1);
gpio.output(15, 0);
gpio.output(16, 1);
gpio.output(18, 0);

process.on(&#39;SIGINT&#39;, function() {
    console.log(&#34;\nGracefully shutting down from SIGINT (Ctrl+C)&#34;);
    //Cleanup
    gpio.cleanup();
    process.exit();
});
```

Der letzte Teil dient dazu, dass man mit Ctrl+C das Skript abbrechen kann, denn sonst würden die Motoren ständig weiterdrehen.

Ok, jetzt können wir zwar die Motoren ansteuern, aber nur direkt am Raspberry Pi. Die Verbindung zum Smartphone fehlt noch. [Socket.io][4] ist ein großartiges Projekt, welches eine direkte Verbindung über webSockets zwischen Server und Client ermöglicht. Man kann Daten sehr einfach hin- und herschicken und eigene Ereignisse definieren, auf die dann der Server bzw. Client reagieren kann. Was wir brauchen ist nun eine HTML-Datei, welche den Gyroskop ausliest und die entsprechenden Befehle an den nodejs Server sendet, welche dieser dann verarbeitet:

&lt;noscript&gt;
  ```
&lt;code class=&#34;language-html html&#34;&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
    &amp;lt;head&amp;gt;
        &amp;lt;meta charset=&#34;UTF-8&#34;&amp;gt;
        &amp;lt;title&amp;gt;Robot Project&amp;lt;/title&amp;gt;
	    &amp;lt;script src=&#34;https://zefanjas.de/socket.io/socket.io.js&#34;&amp;gt;&amp;lt;/script&amp;gt;
	    &amp;lt;script&amp;gt;
                //Damit lesen wir den Gyroskopen aus
        	window.addEventListener(&#34;deviceorientation&#34;, handleOrientation, true);

        	function handleOrientation(inEvent) {
     	            var socket = io.connect(&amp;#039;http://192.168.1.15&amp;#039;);
	            if (inEvent.beta &amp;lt; 0 &amp;&amp; inEvent.gamma &amp;gt; -15 &amp;&amp; inEvent.gamma &amp;lt; 15)
    	                socket.emit(&amp;#039;forwards&amp;#039;);
	            else if (inEvent.beta &amp;gt;= 0 &amp;&amp; inEvent.beta &amp;lt;= 60  &amp;&amp; inEvent.gamma &amp;gt; -15 &amp;&amp; inEvent.gamma &amp;lt; 15)
       	                socket.emit(&amp;#039;stop&amp;#039;);
	            else if (inEvent.beta &amp;gt; 60  &amp;&amp; inEvent.gamma &amp;gt; -15 &amp;&amp; inEvent.gamma &amp;lt; 15)
    	                socket.emit(&amp;#039;backwards&amp;#039;);
                    else if (inEvent.gamma &amp;lt; -15)
                        socket.emit(&amp;#039;turnLeft&amp;#039;);
                    else if (inEvent.gamma &amp;gt; 15)
                        socket.emit(&amp;#039;turnRight&amp;#039;);
                    
                    //Optionale Ausgabe der Werte des Gyroskopen
		    document.getElementById(&#34;alpha&#34;).innerHTML = inEvent.alpha;
		    document.getElementById(&#34;beta&#34;).innerHTML = inEvent.beta;
		    document.getElementById(&#34;gamma&#34;).innerHTML = inEvent.gamma;
		    return true;
        	}
        &amp;lt;/script&amp;gt;
    &amp;lt;/head&amp;gt;
    &amp;lt;body&amp;gt;
        &amp;lt;h1&amp;gt;Robot Project&amp;lt;/h1&amp;gt;
        &amp;lt;p id=&#34;alpha&#34;&amp;gt;&amp;lt;/p&amp;gt;
        &amp;lt;p id=&#34;beta&#34;&amp;gt;&amp;lt;/p&amp;gt;
        &amp;lt;p id=&#34;gamma&#34;&amp;gt;&amp;lt;/p&amp;gt;
    &amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/code&gt;
```

```
&lt;code class=&#34;language-javascript javascript&#34;&gt;var gpio = require(&#34;./node-rpio/lib/rpio&#34;);
var app = require(&amp;#039;http&amp;#039;).createServer(handler)
  , io = require(&amp;#039;socket.io&amp;#039;).listen(app)
  , fs = require(&amp;#039;fs&amp;#039;)

app.listen(80);

function handler (req, res) {
  fs.readFile(__dirname + &amp;#039;/index.html&amp;#039;,
  function (err, data) {
    if (err) {
      res.writeHead(500);
      return res.end(&amp;#039;Error loading index.html&amp;#039;);
    }

    res.writeHead(200);
    res.end(data);
  });
}

io.sockets.on(&amp;#039;connection&amp;#039;, function (socket) {
    socket.on(&amp;#039;forwards&amp;#039;, function () {
        forwards();
    });
    socket.on(&amp;#039;backwards&amp;#039;, function () {
        backwards();
    });
    socket.on(&amp;#039;stop&amp;#039;, function () {
        stop();
    });
    socket.on(&amp;#039;turnRight&amp;#039;, function () {
        turnRight();
    });
    socket.on(&amp;#039;turnLeft&amp;#039;, function () {
        turnLeft();
    });
});

//Setup GPIO Pins
gpio.setmode(gpio.BOARD);
gpio.setup(13, gpio.OUT);
gpio.setup(15, gpio.OUT);
gpio.setup(16, gpio.OUT);
gpio.setup(18, gpio.OUT);

function forwards() {
    gpio.output(13, 1);
    gpio.output(15, 0);
    gpio.output(16, 1);
    gpio.output(18, 0);
}

function backwards() {
    gpio.output(13, 0);
    gpio.output(15, 1);
    gpio.output(16, 0);
    gpio.output(18, 1);
}

function turnRight() {
    gpio.output(13, 0);
    gpio.output(15, 0);
    gpio.output(16, 1);
    gpio.output(18, 0);
}

function turnLeft() {
    gpio.output(13, 1);
    gpio.output(15, 0);
    gpio.output(16, 0);
    gpio.output(18, 0);
}

function stop() {
    gpio.output(13, 0);
    gpio.output(15, 0);
    gpio.output(16, 0);
    gpio.output(18, 0);
}

process.on(&amp;#039;SIGINT&amp;#039;, function() {
    console.log(&#34;\nGracefully shutting down from SIGINT (Ctrl+C)&#34;);
    //Cleanup
    gpio.cleanup();
    process.exit();
});

&lt;/code&gt;
```
&lt;/noscript&gt;

Als nächstes wird der nodejs Server mit

```
sudo node robot.js
```

gestartet. Nun muss man nur noch die Adresse: _http://IP-des-Raspberry-Pi_ aufrufen und schon kann man den Roboter mit einem Smartphone oder Tablet steuern.

### Stromversorgung und Wlan

Es gibt nur noch ein Problem. Der Rapsberry Pi hängt bisher noch an zwei Kabeln: dem Netzwerkkabel und dem USB-Kabel für die Stromversorgung. Für beiden gibt es Lösungen. Das Netzwerkkabel habe ich durch einen Wlan-USB Dongle ersetzt. Wie man diesen einrichtet und welchen man kaufen sollte, findet man in [diesem Artikel][5].

Das verbleibende USB-Kabel habe ich einfach durch ein mobiles USB-Ladegerät ersetzt, welches man für wenig Geld zu kaufen bekommt. Diese liefern die benötigen 5V. Man sollte darauf achten, dass sie neben den 5V auch mindestens 1A liefern, ansonsten wird der Raspberry Pi nicht starten.

Und so sieht das ganze jetzt aus 😉

[&lt;img loading=&#34;lazy&#34; decoding=&#34;async&#34; class=&#34;aligncenter size-medium wp-image-1926&#34; alt=&#34;mobile Stromversorgung und WLAN-Dongle&#34; src=&#34;http://zefanjas.de/wp-content/uploads/2013/12/IMG_0815.geaendert-300x225.jpg&#34; width=&#34;300&#34; height=&#34;225&#34; srcset=&#34;https://zefanjas.de/wp-content/uploads/2013/12/IMG_0815.geaendert-300x225.jpg 300w, https://zefanjas.de/wp-content/uploads/2013/12/IMG_0815.geaendert.jpg 1024w&#34; sizes=&#34;(max-width: 300px) 100vw, 300px&#34; /&gt;][6] [&lt;img loading=&#34;lazy&#34; decoding=&#34;async&#34; class=&#34;aligncenter size-medium wp-image-1927&#34; alt=&#34;mobile Stromversorgung und WLAN-Dongle&#34; src=&#34;http://zefanjas.de/wp-content/uploads/2013/12/IMG_0817.geaendert-300x225.jpg&#34; width=&#34;300&#34; height=&#34;225&#34; srcset=&#34;https://zefanjas.de/wp-content/uploads/2013/12/IMG_0817.geaendert-300x225.jpg 300w, https://zefanjas.de/wp-content/uploads/2013/12/IMG_0817.geaendert.jpg 1024w&#34; sizes=&#34;(max-width: 300px) 100vw, 300px&#34; /&gt;][7]Ich werde in den nächsten Tagen noch ein ein Video machen&amp;#8230;

Wie geht es jetzt weiter? Die Steuerung muss noch verbessert werden. Gerade das Lenken ist noch ungenau und das Fahren somit etwas schwierig. Ein weiteres Ziel ist, mit Hilfe eines Ultraschall-Sensors dem Roboter das autonome Fahren beizubringen.

Bisherige Artikel

  * [Build a Robot #0][8]
  * [Build a Robot #1][9]

&amp;nbsp;

 [1]: http://www.google.com/url?sa=t&amp;rct=j&amp;q=&amp;esrc=s&amp;source=web&amp;cd=1&amp;cad=rja&amp;ved=0CCoQFjAA&amp;url=http%3A%2F%2Fde.wikipedia.org%2Fwiki%2FKreiselinstrument&amp;ei=_Ta0Uvj5FomQrQfdsICoAg&amp;usg=AFQjCNEHAKMqVWmSUSBdCNu9kxia2kbt6w&amp;sig2=KMKcBikD9QcDjF387qaMQg&amp;bvm=bv.58187178,d.bmk
 [2]: http://nodejs.org/
 [3]: http://thefloppydisk.wordpress.com/2013/03/08/server-side-javascript-on-a-raspberry-pi-how-to-install-node-js/
 [4]: http://socket.io
 [5]: http://www.howtogeek.com/167425/how-to-setup-wi-fi-on-your-raspberry-pi-via-the-command-line/
 [6]: http://zefanjas.de/wp-content/uploads/2013/12/IMG_0815.geaendert.jpg
 [7]: http://zefanjas.de/wp-content/uploads/2013/12/IMG_0817.geaendert.jpg
 [8]: http://zefanjas.de/2013/12/18/build-a-robot-0-ziele-und-material/
 [9]: http://zefanjas.de/2013/12/18/build-a-robot-1-motoren-ansteuern/</description>
    </item>
    
  </channel>
</rss>
