Raspberry Pi Archives - Technik - Blogbasis.net https://technik.blogbasis.net/tag/raspberry-pi Die Basis des freien Wissens – Technik Fri, 13 May 2016 19:09:20 +0000 de hourly 1 https://wordpress.org/?v=6.8.1 RaspberryPi + DS18B20 = ThermometerPi https://technik.blogbasis.net/raspberrypi-ds18b20-thermometerpi-13-05-2016 https://technik.blogbasis.net/raspberrypi-ds18b20-thermometerpi-13-05-2016#respond Fri, 13 May 2016 18:34:21 +0000 http://technik.blogbasis.net/?p=1393 Ich bin vor einigen Wochen über einen Blogpost gestoßen, in dem erklärt wurde, wie man aus einem RaspberryPi und einem Wärmesensor (DS18B20) sich ein eigenes Thermometer bauen kann. Dieser Idee bin ich nachgegangen und möchte in diesem Blogpost beschreiben, welche Tweaks dabei nötig waren.

Irgendwo auf Twitter oder einem anderen Medium habe ich ein Link zu dem Blogpost „[Tutorial] DS18S20 Temperatur Sensor an einem Raspberry Pi“ gefunden. Das hat mich so sehr fasziniert, dass ich das nachbauen wollte.

Dazu bestellte ich mir auf Amazon zunächst 10 solcher Sensoren mit entsprechend langem Kabel und Abdichtung: 10 x DS18B20 Digitale Temperaturfühler für ~15€. Dazu kamen noch ein paar 4.7k Ohm Widerstände. Nach ein paar Tagen war alles in meinem Briefkasten. Angeblich kann man sich von Maximintegrated ein kostenloses Sample zuschicken lassen. Allerdings kam bei mir bisher nichts an, vielleicht auch einfach Pech oder ein Fehler auf meiner Seite.

Aufbau

Für die Verkabelung des Sensors mit dem RaspberryPi bin ich den Schritten in dem oben genannten Blogpost gefolgt. Für mehr Informationen möchte ich dorthin verweisen.

Quelle: https://kopfkino.irosaurus.com/tutorial-ds18s20-temperatur-sensor-an-einem-raspberry-pi/

Quelle: https://kopfkino.irosaurus.com/tutorial-ds18s20-temperatur-sensor-an-einem-raspberry-pi/

Wichtig ist scheinbar nur, dass man den GPIO-Pin 4 nutzt. Ich habe es selbst nicht mit anderen GPIO-Pins probiert. Wenn es bei euch mit anderen klappt, bitte einen kurzen Kommentar hinterlassen.

Konfiguration

Ich habe auf meinem RaspberryPi Archlinux mit einem halbwegs aktuellen Kernel am Laufen. Das führte dazu, dass die weiteren Schritte in dem oben genannten Blogpost nicht funktionierten. Nachdem ich ein wenig recherchiert habe, kam ich zu einer klein wenig modifizierten Lösung.

Zunächst muss man in die /boot/config.txt folgende Zeile anhängen:

dtoverlay=w1-gpio,gpiopin=4,pullup=on

Danach muss man noch Kernelmodule laden. Dies erledigt man am Besten direkt beim Booten, in dem man folgendes in die Datei /etc/modules einträgt:

w1-gpio pullup=1
w1_therm

Nach einem Neustart sollte der Sensor unter  „/sys/bus/w1/devices/<sensor-id>“ verfügbar sein. Mit folgendem Einzeiler kriegt man die aktuelle Temperatur heraus:

$> cat /sys/bus/w1/devices/28-041621eb50ff/w1_slave | grep -oP "t=(\d+)" | sed -e "s/t=//g"
21687

Automatisierung & Webseite

Ich wollte mir eine kleine grafische Ansicht über den Temperaturverlauf bauen. Dazu entschied ich mich, die Daten von zwei Sensoren (1x Indoor, 1x Outdoor) alle 30 Sekunden auszulesen und in eine SQLite3-Datenbank zu schreiben.

Dazu habe ich zwei Scripte unter „/opt/thermo/“ zu liegen. Das Erste kümmert sich nur um das Auslesen der Daten und heißt „data.sh“:

#!/bin/bash

outdoor=$(cat /sys/bus/w1/devices/28-041621eb50ff/w1_slave | grep -oP "t=(\d+)" | sed -e "s/t=//g")
indoor=$(cat /sys/bus/w1/devices/28-041621fadbff/w1_slave | grep -oP "t=(\d+)" | sed -e "s/t=//g")
seconds=$(TZ=Europe/Berlin date +"%s")

echo "$seconds,$indoor,$outdoor"

Die IDs müssen natürlich entsprechend angepasst werden.

Das zweite Script „insertdata.sh“ ruft „data.sh“ auf und schreibt die Daten in eine SQLite3-Datenbank.

#!/bin/bash
olddir=$(pwd)
cd /opt/thermo/
sqlite3 thermo.sqlite3 "insert into temperatures VALUES ($(./data.sh));"
cd "$olddir"

Da Archlinux mit Systemd kommt, können wir dessen Timer nutzen, um die Aufgabe alle 30 Sekunden abzufeuern. Dazu legen wir zunächst den Service unter „/etc/systemd/system/thermo.service“ an:

[Unit]
Description=Thermometer data collector

[Service]
Type=oneshot
ExecStart=/bin/bash /opt/thermo/insertdata.sh

Der Timer „/etc/systemd/system/thermo.timer“ führt diesen Service dann periodisch aus:

[Unit]
Description=Thermo data collector timer

[Timer]
Persistent=true
OnUnitActiveSec=30s
OnBootSec=30s

[Install]
WantedBy=timers.target

Diesen muss man mit einem kurzem Kommando aktivieren:

sudo systemctl enable thermo.timer

Zuletzt fehlte nur noch eine kleine Webseite, die die Daten aus der SQLite-Datenbank ausliest und anzeigt. Dazu habe ich einfach Apache + PHP installiert und folgende „index.php“ im DocumentRoot abgelegt.

thermo-website

<html>
<head>
<!-- Latest compiled and minified CSS -->
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css" integrity="sha384-1q8mTJOASx8j1Au+a5WDVnPi2lkFfwwEAa8hDDdjZlpLegxhjVME1fgjWPGmkzs7" crossorigin="anonymous">

<!-- Optional theme -->
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap-theme.min.css" integrity="sha384-fLW2N01lMqjakBkx3l/M9EahuwpSfeNvV63J5ezn3uZzapT0u7EYsXMjQV+0En5r" crossorigin="anonymous">

<!-- Latest compiled and minified JavaScript -->
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/js/bootstrap.min.js" integrity="sha384-0mSbJDEHialfmuBBQP6A4Qrprq5OVfW37PRR3j5ELqxss1yVqOtnepnHVP9aJ7xS" crossorigin="anonymous"></script>

<script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.0.0/Chart.js"></script>
</head>
<body class="container">
<?php
$db = new SQLite3('/opt/thermo/thermo.sqlite3');
$beginOfDay = strtotime("midnight", time());

$current = $db->query('SELECT * FROM temperatures order by timestamp desc limit 1');
$row = $current->fetchArray();

$currentDate = date("H:i:s - d.m.Y", $row['timestamp']);
$currentIndoor = round($row['indoor']/1000,3);
$currentOutdoor = round($row['outdoor']/1000,3);

$minmax = $db->query("SELECT MIN(indoor) as minIndoor, MIN(outdoor) as minOutdoor, MAX(indoor) as maxIndoor, MAX(outdoor) as maxOutdoor FROM temperatures where timestamp >= $beginOfDay order by timestamp desc");
$row = $minmax->fetchArray();

$minIndoor = round($row['minIndoor']/1000,3);
$maxIndoor = round($row['maxIndoor']/1000,3);
$minOutdoor = round($row['minOutdoor']/1000,3);
$maxOutdoor = round($row['maxOutdoor']/1000,3);

echo "<h1>Last measurement: $currentDate</h1>";
echo "<table class='table'><tr><th>Location</th><th>Current °C</th><th>Todays Min °C</th><th>Todays Max °C</th></tr>";
echo "<tr><td>Indoor</td><td>$currentIndoor</td><td>$minIndoor</td><td>$maxIndoor</td>";
echo "<tr><td>Outdoor</td><td>$currentOutdoor</td><td>$minOutdoor</td><td>$maxOutdoor</td>";
echo "</table>";

?>
<canvas id="myChart" width="300" height="100"></canvas>

<?php
$minmax = $db->query("SELECT * FROM temperatures where timestamp >= $beginOfDay order by timestamp asc");
$labels = array();
$indoor = array();
$outdoor = array();
$diff = array();
while($row = $minmax->fetchArray()) {
    $labels[] = date("H:i:s", $row['timestamp']);
    $indoor[] = round($row['indoor']/1000,3);
    $outdoor[] = round($row['outdoor']/1000,3);
    $diff[] = abs(round((abs($row['indoor']) - abs($row['outdoor']))/1000,3));
}
?>

<script>
var data = {
    labels: <?php echo json_encode($labels); ?>,
    datasets: [
        {
            label: "Indoor",
            fill: false,
            lineTension: 0.1,
            backgroundColor: "rgb(209,12,8)",
            borderColor: "rgb(209,12,8)",
            borderCapStyle: 'butt',
            borderDash: [],
            borderDashOffset: 0.0,
            borderJoinStyle: 'miter',
            pointBorderColor: "rgb(209,12,8)",
            pointBackgroundColor: "#fff",
            pointBorderWidth: 1,
            pointHoverRadius: 5,
            pointHoverBackgroundColor: "rgb(209,12,8)",
            pointHoverBorderColor: "rgba(220,220,220,1)",
            pointHoverBorderWidth: 2,
            pointRadius: 1,
            pointHitRadius: 10,
            data: <?php echo json_encode($indoor);?>,
        },
        {
            label: "Outdoor",
            fill: false,
            lineTension: 0.1,
            backgroundColor: "rgb(8,209,8)",
            borderColor: "rgb(8,209,8)",
            borderCapStyle: 'butt',
            borderDash: [],
            borderDashOffset: 0.0,
            borderJoinStyle: 'miter',
            pointBorderColor: "rgb(8,209,8)",
            pointBackgroundColor: "#fff",
            pointBorderWidth: 1,
            pointHoverRadius: 5,
            pointHoverBackgroundColor: "rgb(8,209,8)",
            pointHoverBorderColor: "rgba(220,220,220,1)",
            pointHoverBorderWidth: 2,
            pointRadius: 1,
            pointHitRadius: 10,
            data: <?php echo json_encode($outdoor);?>,
        },
        {
            label: "Difference",
            fill: false,
            lineTension: 0.1,
            backgroundColor: "rgba(75,192,192)",
            borderColor: "rgba(75,192,192)",
            borderCapStyle: 'butt',
            borderDash: [],
            borderDashOffset: 0.0,
            borderJoinStyle: 'miter',
            pointBorderColor: "rgba(75,192,192)",
            pointBackgroundColor: "#fff",
            pointBorderWidth: 1,
            pointHoverRadius: 5,
            pointHoverBackgroundColor: "rgba(75,192,192)",
            pointHoverBorderColor: "rgba(220,220,220,1)",
            pointHoverBorderWidth: 2,
            pointRadius: 1,
            pointHitRadius: 10,
            data: <?php echo json_encode($diff);?>,
        }
    ]
};

var ctx = document.getElementById("myChart");
var myLineChart = new Chart(ctx, {
    type: 'line',
    data: data,
});
</script>
</body>
</html>

~ Sebastian

]]>
https://technik.blogbasis.net/raspberrypi-ds18b20-thermometerpi-13-05-2016/feed 0
Mit der INWX-API eigenen DynDNS einrichten https://technik.blogbasis.net/mit-der-inwx-api-eigenen-dyndns-einrichten-07-07-2013 https://technik.blogbasis.net/mit-der-inwx-api-eigenen-dyndns-einrichten-07-07-2013#respond Sun, 07 Jul 2013 21:59:11 +0000 http://technik.blogbasis.net/?p=782 Ich habe schon eine ganze Weile mit dem Gedanken gespielt, meinen Raspberry Pi per DynDNS ans Neuland ;) anzuschließen. Da die IP Adressen bei mir zu Hause dynamisch vergeben werden, musste ein DynDNS her. Dank der API meines Registrars INWX.de ist das kein Problem.

Voraussetzungen

Für das Script benötigt man keine Voraussetzungen, welche ein Linuxsystem nicht schon erfüllen würde.

  • curl
  • sed

Ansonsten benötigt ihr nur eure Logindaten, und die ID des zu ändernden DNS Eintrages Die ID findet ihr ganz einfach heraus, wenn ihr euch den Quelltext des gewünschten Eintrages anschaut:

INWX DNS ID herausfinden

INWX DNS ID herausfinden

Einrichtung

Die Einrichtung des Bashscripts ist sehr einfach, da ich den Quelltext über GitHub zur Verfügung stelle.

Wir erstellen also zunächst ein neues Verzeichnis im Home-Ordner und laden den Source herunter:

mkdir ~/dyndns && cd ~/dyndns
git clone https://github.com/gehaxelt/Bash-INWX-DynDNS.git .

Danach tragt ihr eure Daten in die „dnsupdate.sh“ ein.

Das Script prüft, ob die zuletzt geprüfte IP-Adresse in der „old.ip“ Datei der aktuellen IP entspricht. Ist dies nicht der Fall, so wird über die INWX-API ein Request abgesetzt, der den entsprechenden Eintrag erneuert.

Damit dieser Vorgang automatisiert alle 5 Minuten ausgeführt wird, müssen wir einen Cronjob erstellen.

crontab -e

Fügt dort die folgende Zeile ein:

*/5 * * * * cd /home/$USER/dyndns && bash dnsupdate.s

Nach dem Abspeichern ist schon alles eingerichtet und funktionsfähig.

Optional

Solltet ihr mit diesem Script einen PC bzw. einen Raspberry Pi ans Internet anschließen, müsst ihr ggf. noch Port-Weiterleitungen im Router einstellen. Wenn ihr den SSH-Server nach außen öffnet, dann solltet ihr am Besten auf PubKey Authentication umsteigen und den Login per Passwort deaktivieren.

Wenn ihr herausfinden möchtet, welche bzw. wie viele IPs  bei einem Loginversuch gescheitert sind, könnt ihr die folgende zwei Befehle ausprobieren:

cat /var/log/auth.log | grep "Connection closed" | grep -oP "\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}" | sort -u
cat /var/log/auth.log | grep "Connection closed" | grep -oP "\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}" | sort -u | wc -l

Fazit

Einen eigenen DynDNS zu betreiben ist mit dem richtigen Registrar und der richtigen API nicht sehr schwierig ;)

~ Sebastian

]]>
https://technik.blogbasis.net/mit-der-inwx-api-eigenen-dyndns-einrichten-07-07-2013/feed 0
Raspberry Pi: Moon-Buggy Kommandozeilenspiel https://technik.blogbasis.net/raspberry-pi-moon-buggy-kommandozeilenspiel-12-04-2013 https://technik.blogbasis.net/raspberry-pi-moon-buggy-kommandozeilenspiel-12-04-2013#respond Fri, 12 Apr 2013 21:56:53 +0000 http://technik.blogbasis.net/?p=431 Als ich mich mit meinem Studium anfing, wurde ich von einem Kommilitonen auf das Spiel namens „Moon-Buggy“ hingewiesen. Es handelt sich dabei um ein kleines Kommandozeilenspiel, welches selbst auf dem Raspberry Pi läuft.

Bei Moon-Buggy geht es darum, einen Kinderwagen über verschieden große Löcher springen zu lassen, sowie kleine Monster zu besiegen. Insgesamt also ein kleines Spiel für die Vorlesung Zwischendurch :)

Installation von Moon-Buggy

Moon-Buggy lässt sich einfach kompilieren. Dazu brauchen wir nicht mehr, als die folgenden Tools:

  • cd
  • mkdir
  • wget
  • tar
  • configure
  • make

Diese sollten auf den meisten Linux-Distributionen bzw. dem Raspian bereits vorhanden sein. Zur Installation erstellen wir uns im Homeverzeichnis erstmal einen neuen Ordner namens „moonbuggy“:

cd ~
mkdir moonbuggy
cd moonbuggy

Darin laden wir den Quelltext der Stable-Version herunter und entpacken das Tar-Archiv:

wget http://m.seehuhn.de/programs/moon-buggy-1.0.tar.gz
tar xfv moon-buggy-1.0.tar.gz 
cd moon-buggy-1.0/

Zuletzt müssen wir es konfigurieren, und danach zweimal make aufrufen. Das Ganze dauert insgesamt vielleicht maximal 5 Minuten:

./configure
make
sudo make install

Nachdem wir fertig sind, können wir Moon-Buggy über den gleichnamigen Befehl starten:

moon-buggy

Kleine Vorschau

Ich habe mal ein kurzes Video aufgenommen, in dem ich das Spiel zeige (Achtung: Langweilig)

http://www.youtube.com/watch?v=it4rTOcDLxQ

~ Sebastian

]]>
https://technik.blogbasis.net/raspberry-pi-moon-buggy-kommandozeilenspiel-12-04-2013/feed 0
Raspberry Pi im Rechenzentrum betreiben https://technik.blogbasis.net/raspberry-pi-im-rechenzentrum-betreiben-08-04-2013 https://technik.blogbasis.net/raspberry-pi-im-rechenzentrum-betreiben-08-04-2013#respond Mon, 08 Apr 2013 11:59:48 +0000 http://technik.blogbasis.net/?p=401 Ich wurde gestern auf eine Seite aufmerksam gemacht, auf welcher einem angeboten wird, seinen Raspberry Pi in ein niederländisches Rechenzentrum einzuschicken. Der Service ist nahezu kostenlos.

Möchte man seinen Raspberry Pi als Webserver, FTPserver, DNSserver, Mailserver betreiben, und diesen von außen zugänglich machen, so muss man ggf. entsprechende Einstellungen am Router vornehmen. Zudem muss man selbst für die Erreichbarkeit sorgen, und die Stromkosten selbst bezahlen. Der größte Flaschenhals wird der Uplink des eigenen DSL-Anschlusses sein, welcher oft nicht sehr hoch ist und der Downloadgeschwindigkeit der Besucher entspricht.

Das Angebot für ein neues Zuhause

PCExtreme startet ein Projekt, was einem erlaubt, seinen Raspberry Pi in deren Rechenzentrum einzuschicken, und es dort zu betreiben. Man bewirbt eine 100 Mbit Anbindung, sowie fair-use Traffic in Höhe von 500GB/Monat. Inklusive Stromversorgung und Platz im Rechenzentrum kostet das einem 0€ für mindestens 12 Monate. Ich sehe da folgende Vor- und Nachteile:

Vorteile:

  • Schnelle Internetanbindung (100Mbit)
  • Ausreichend Traffic (500GB)
  • Keine Stromkosten (3-5 Watt/h)
  • Inklusive IPv4 bzw. IPv6 Adresse (statisch)
  • Max 4cm langer USB Stick zur Speichererweiterung

Nachteile:

  • Kein physischer Zugriff auf den Raspberry Pi
  • Reinstall des Betriebssystems kostet 20€
  • Rückversand kostet 7,5€ – 30€
  • Plastikgehäuse wird vorausgesetzt.
  • Nur Modell B, da Ethernet-Buchse vorausgesetzt.
  • Kein „Rumexperimentieren“, da hohe Reinstallkosten

Das Projekt verspricht, den Raspberry Pi für mindestens 12 Monate für die genannten Leistungen zu betreiben. Was danach passiert, wird nicht genannt.

Den Raspberry Pi einschicken

Auf der Internetseite werden einige Voraussetzungen genannt, welche man erfüllen muss, bevor man seinen Raspberry Pi einschicken sollte:

  • Modell B, da ein Ethernetanschluss gefordert ist. (Modell A besitzt keinen)
  • Plastikgehäuse für den Raspberry Pi
  • Konfiguration einer statischen IP Adresse (Wird nach Bestellung genannt)
  • SD Karte mit bootfähigem Betriebssystem

Erfüllt man diese Voraussetzungen, dann sollte man seinen Raspberry Pi ohne Problem einschicken können. Den Versand in die Niederlanden muss man selbst bezahlen. Bei der DHL sollte so ein Päckchen ~8,9€ kosten. Dies sollte bei den genannten Leistungen aber kein K.O-Kriterium darstellen :)

Einen Raspberry Pi direkt kaufen

Das Unternehmen bietet die Möglichkeit an, einen Raspberry Pi direkt zu kaufen, welcher dann vor Ort eingerichtet und online gebracht wird. Man braucht sich dann um nichts mehr kümmern. Dabei werden zwei verschiedene Angebote vorgestellt:

Angebot 1:

  • Raspberry Pi Modell B (512 MB RAM)
  • SD-Karte: Samsung 8 GB Klasse 6
  • Preis: 52,50€

Angebot 2:

  • Raspberry Pi Modell B (512 MB RAM)
  • Samsung 16 GB Klasse 10
  • Preis: 62,50€

Die Angebote unterscheiden sich nur in der SD Karte. Die Lieferzeiten werden mit ungefähr 14 Tagen angegeben, sodass man sich ein wenig nach seinem Kauf gedulden muss. Schaut man sich mal nach den Preisen um, dann ist das Angebot fair:

  • Raspberry Pi: 27,00€
  • Gehäuse: 5,50€
  • Summe: 31,50€

Rechnet man darauf noch die Kosten für einen Reinstall des Betriebssystems, dann landet man bei den genannten Preisen. 

Fazit

Für denjenigen, der seinen Raspberry Pi als Webserver o.ä. nutzen möchte, und auf eine schnelle Internetanbindung angewiesen ist, die man Zuhause nicht hat, kann dieses Angebot sehr interessant sein. 500 GB Traffic bei einer 100 Mbit-Anbindung inklusive Stromkosten für keinen einzigen Cent ist meiner Meinung ein wirklich gutes Angebot. Schade ist nur, dass einem damit der Spaß am Basteln (GPIO/Softwaremäßig) genommen wird, denn falls was schief geht, sind 20€ für eine Neuinstallation des Betriebssystems nicht sehr günstig.

~Sebastian

Quellen:

Projektseite: http://raspberrycolocation.com/
DHL: http://www.dhl.de/de/paket/pakete-versenden/weltweit-versenden/laenderseiten/niederlande.html

]]>
https://technik.blogbasis.net/raspberry-pi-im-rechenzentrum-betreiben-08-04-2013/feed 0