sudo su
apt-get update
apt-get upgrade
apt-get install mc aptitude i2c-tools
apt-get purge pi-bluetooth
aptitude purge pi-bluetooth
sudo su
raspi-config
--> Advanced Options
--> I2C aktivieren
--> Finish
# reboot
shutdown -r now && exit
Nach dem Neustart wird das I2C Kernelmodul automatisch geladen und steht zur Kommunikation mit der Echtzeituhr zur Verfügung.
Damit die benötigten I2C Treiber (Module) beim Systemstart automatisch geladen werden, müssen sie in die Konfigurationsdatei ''/etc/modules'' eingetragen werden.
Zusätzlich wird noch der Zugriff auf eine (nun vorhandene) Hardware Echtzeituhr ermöglicht (HWCLOCKACCESS=yes) und ein Gerätename (rtc0) für den späteren Zugriff auf die Uhr festgelegt.
sudo su
echo "i2c-dev" >> /etc/modules
echo "rtc-ds1307" >> /etc/modules
echo "i2c-bcm2708" >> /etc/modules
echo "HWCLOCKACCESS=yes" >> /etc/default/hwclock
echo "HCTOSYS_DEVICE=rtc0" >> /etc/default/hwclock
Im Anschluss zeigt ein erster Test, ob die Echtzeituhr am I2C-Bus des Prozessors gefunden wird und ansprechbar ist.
root@raspberrypi2:~# i2cdetect -y 1
0 1 2 3 4 5 6 7 8 9 a b c d e f
00: -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- 68 -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --
root@raspberrypi2:~#
Aah!, sehr schön. Die neue Echtzeituhr wird als I2C-Gerät mit der Adresse 0x68 erkannt.
\\
Jetzt muss noch der Kernel über das neue Gerät (ds3231) und die Adresse (0x68) informiert werden unter der es erreichbar ist. Dann kann die Echtzeituhr auch per Kommando ''hwclock'' ausgelesen und eingestellt werden.
root@raspberrypi2:~# echo ds3231 0x68 | sudo tee /sys/class/i2c-adapter/i2c-1/new_device
root@raspberrypi2:~# hwclock
Sa 29 Jan 2000 12:21:02 CET -0.526365 seconds
Super!, die (noch unprogrammierte) Hardware-Uhr ist über die soeben ermittelte I2C Adresse per ''hwclock''ansprechbar und liefert eine Zeit und ein Datum zurück.\\
Kleiner Test, ob die (System-) Uhrzeit des Raspberry Pi aktuell richtig gesetzt ist:
root@raspberrypi2:~# date
Mo 18. Jan 21:05:33 CET 2016
Ja, ist sie, dank vorinstalliertem NTP Dämon ''ntpd'' ;-)\\
Systemzeit in die Echtzeituhr schreiben (-w wie write) und anschließend wieder auslesen (-r wie read):
root@raspberrypi2:~# hwclock -w
root@raspberrypi2:~# hwclock -r
Sa 29 Jan 2000 12:26:07 CET -0.423200 seconds
Damit bei jedem Start des Raspberry Pi die Uhrzeit von der Echtzeituhr gelesen und als Systemzeit gesetzt wird, müssen folgende Zeilen in der ''/etc/rc.local'' oberhalb des ''exit 0'' hinzugefügt werden:
#!/bin/bash
sleep 5
/bin/echo ds3231 0x68 > /sys/class/i2c-adapter/i2c-1/new_device
sleep 2
/sbin/hwclock -s
sleep 2
/var/www/html/kerzeneinschalten.sh
exit 0
Mit der letzten Zeile ''./var/www/html/kerzeneinschalten.sh'' wird beim Systemstart einmalig ein Script zum initialen Einschalten der Adventskranzkerzen ausgeführt.
==== WLAN Access Point ====
Da das System im späteren Einsatz keinen (kabelgeführten) Internetanschluss besitzen wird, ein Zugriff z.B. per SSH aber trotzdem möglich sein soll (am besten natürlich drahtlos), wird ein WLAN Access Point eingerichtet. Hier mit einem USB-WLAN Adapter Typ EW-7811UN von EDIMAX.\\
Die notwendigen Softwareteile sind dann:
* ''hostapd'' - die Access Point Funktionalität an sich
* ''dnsmasq'' - DHCP Server damit der Client automatisch eine IP Adresse bekommt
* ''wireless-tools'' und ''iw'' zur Konfiguration des WLAN
* ''firmware-realtek'' - die notwendige Firmware für den USB-WLAN Adapter
sudo apt-get install hostapd dnsmasq firmware-realtek wireless-tools iw
Konfiguration der LAN- und der WLAN-Schnittstelle mit einer statischen IP Adresse und einer Subnetzmaske.
sudo su
vi /etc/network/interfaces
allow-hotplug eth0
iface wlan0 inet static
address 192.168.100.181
netmask 255.255.255.0
allow-hotplug wlan0
iface wlan0 inet static
address 192.168.0.1
netmask 255.255.255.0
Damit die Access Point Funktion auch beim Booten automatisch gestartet wird, muss sie unter ''/etc/default/hostapd'' aktiviert und der Speicherort der Konfigurationsdatei angegeben werden:
sudo su
vi /etc/default/hostapd
...
DAEMON_CONF="/etc/hostapd/hostapd.conf"
RUN_DAEMON="yes"
...
Über die Konfigurationsdatei ''/etc/hostapd/hostapd.conf'' werden dann die wesentlichen Funktionen wie z.B. der Access Point Name (SSID), die Verschlüsselung und natürlich das Password selber eingestellt. Bei WPA2 muss das Passwort mindestens 8 Zeichen lang sein, sonst verweigert ''hostapd'' den Dienst.
sudo su
cat < /etc/hostapd/hostapd.conf
# Schnittstelle
interface=wlan0
# Treiber
driver=nl80211
# WLAN-Konfiguration
ssid=
channel=5
hw_mode=g
# ESSID sichtbar
ignore_broadcast_ssid=0
# Verschlüsselung (hier: WPA2)
wpa=2
wpa_key_mgmt=WPA-PSK
rsn_pairwise=CCMP
wpa_passphrase=
auth_algs=1
# Schlüsselintervalle
wpa_group_rekey=600
wpa_ptk_rekey=600
wpa_gmk_rekey=86400
# Ländereinstellungen
country_code=DE
ieee80211d=1
# MAC-Authentifizierung (0=aus)
macaddr_acl=0
EOT
Damit jeder Client automatisch eine IP Adresse bekommt, wird in der ''/etc/dnsmasq.conf'' der DHCP Adressbereich (hier von 192.168.0.2 bs.10) und eine Gültigkeitsdauer (12h) eingestellt. Der DHCP Server soll dabei nur über die WLAN Schnittstelle IP Adressen verteilen (interface=wlan0), nicht aber über die LAN Schnittstelle (no-dhcp-interface=eth0) - da lauscht der DHCP-Client für den Fall, das der R-Pi an das heimischen Netz angeschlossen wird.
sudo su
vi /etc/dnsmasq.conf
interface=wlan0
dhcp-range=interface:wlan0,192.168.0.2,192.168.0.10,255.255.255.0,12h
no-dhcp-interface=eth0
Mit der Folgenden Zeile wird das Powermanagement des USB-WLAN Adapters deaktiviert. Macht man das nicht kann es u.U. zu Verbindungsabbrüchen kommen.
sudo echo "options 8192cu rtw_power_mgnt=0 rtw_enusbss=0" >> /etc/modprobe.d/8192cu.conf
Den DHCP-Client benötigen wir bei statischer Konfiguration der Netzwerkschnittstellen nicht, daher wird er deaktiviert:
systemctl daemon-reload
service dhcpcd stop
systemctl disable dhcpcd
nano /etc/systemd/system/rc-local.service
[Unit]
Description=/etc/rc.local Compatibility
ConditionPathExists=/etc/rc.local
[Service]
Type=forking
ExecStart=/etc/rc.local start
TimeoutSec=0
StandardOutput=tty
RemainAfterExit=yes
SysVStartPriority=99
[Install]
WantedBy=multi-user.target
systemctl enable rc-local
systemctl start rc-local.service
systemctl status rc-local.service
==== WiringPi ====
Zur Ansteuerung der GPI/O-Pins gibt es ein komfortables Tool namens ''wiringPi'', zu finden unter [[http://www.http://wiringpi.com/|www.wiringpi.com]].
sudo su
apt-get install wiringpi
===== Web-GUI und Scripte =====
Zum testen der LEDs des Adventskranzes sollen diese einzelnen per Web-Interface schaltbar sein. Zu diesem Zweck wird ein Webserver benötigt. Der Einfachheit halber habe ich mich für den allseits bekannten ''Apache2'' entschieden. Dieser bringt auch gleich ein PHP-Modul mit welches für die Ausführung diverser anderer Funktionen benötigt wird.
sudo apt-get install apache2 php5
Damit für das Schalten der LEDs auch "Schaltelemente" in Form sog. "Slider" oder auch "Schiebeschalter" zur Verfügung stehen, bediene ich mich der Java Script Funktionen aus dem [[https://jquery.com/|jQuery Framework]].
sudo su
cd /var/www/html/
wget http://code.jquery.com/jquery-1.12.4.min.js
wget http://code.jquery.com/mobile/1.4.5/jquery.mobile-1.4.5.js
wget http://dev.jtsage.com/cdn/datebox/1.4.5/jqm-datebox-1.4.5.all.js
wget http://code.jquery.com/mobile/1.4.5/jquery.mobile-1.4.5.css
==== Shell Script zum Schalten der Kerzen ====
Mit Hilfe dieses Shell Scriptes wird in Abhängigkeit des aktuellen Datums ermittelt, welche Adventskerzen eingeschaltet werden müssen.
Das Script ist dazu in folgende Teile bzw. Funktionen unterteilt:
* function debug()
Hilfsfunktion zur Ausgabe von Debug Meldungen, kann über den Parameter ''debug'' beim Start aktiviert werden. Fehlt der Parameter so werden keine Textmeldungen während der Scriptlaufzeit ausgegeben.
* function random_candles()
Damit nicht jeden Tag im Advent die selbe Kerze (LED) leuchtet wird in dieser Funktion eine zufällige Reihenfolge festgelegt. Es werden immer alle vier Kerzen zufällig verteilt und dabei nicht unterschieden, welche Adventswoche gerade ist.
* function switch_gpio ()
Hier wird der jeweilige GPI/O Pin des Prozessor respektive das daran angeschlossene Relais ein oder aus geschaltet.
* function preset_candles ()
Um einen definierten Startzustand zu erhalten werden alle GPI/Os (Relais) zu Beginn in den AUS-Zustand geschaltet.
* function get_advent_days ()
Die Berechnung der Adventssonntage erfolg in Abhängigkeit des jeweiligen Kalenderjahres jeweils beim Start des Scriptes. Berechnete Daten werden nicht abgespeichert.
* function print_advent_days ()
Hilfsfunktion zur textuellen Ausgabe der berechneten Adventssonntage.
* function switch_candles ()
In Abhängigkeit der berechneten Adventssonntage wird in dieser Funktion die jeweilige Anzahl an Kerzen geschaltet.
sudo touch /var/www/html/kerzeneinschalten.sh && chmod +x /var/www/html/kerzeneinschalten.sh
Aktuell wird das Script ''kerzeneinschalten.sh'' nur einmalig beim Systemstart ausgeführt. Läuft der Raspberry jedoch über den Tageswechsel oder sogar über den Wechsel Sa./So., muss also täglich um 00:00 Uhr geprüft werden, ob zusätzliche Lichter am Adventskranz einzuschalten sind. Folgender Eintrag in der Datei ''/etc/crontab'' erstellt einen sog. CRON-Job. Dieser startet stets um 00:00 Uhr das Script ''kerzeneinschalten.sh'' und schaltet somit die richte Anzahl LEDs ein.
sudo su
nano /etc/crontab
0 0 * * * www-data /var/www/html/kerzeneinschalten.sh
==== Die HTML-Seite ====
Der Speicherort für die Webseite sowie alle PHP-Dateien und das Kerzen-Schalt-Script /ist ''var/www/html/''. Mit Hilfe der folgenden HTML-Seite können die vier Kerzen jeweils einzeln ein und wieder aus geschaltet werden. Auch das Setzen von Datum und Uhrzeit des R-Pi ist darüber möglich.
Webseite zur Steuerung eines Adventskranzes mit vier elektrischen Kerzen.
Entwickelt von:
Christoph von Thülen
Einumerstr. 15
31135 Hildesheim
E-Mail:Christoph@von-Thuelen.de
sudo su
ln -s /usr/bin/gpio /usr/local/bin/gpio
cd /var/www/html/
chown -R root:www-data *
sudo su
cd /
echo "www-data ALL=(ALL) NOPASSWD: /bin/date" >> /etc/sudoers
echo "www-data ALL=(ALL) NOPASSWD: /bin/echo" >> /etc/sudoers
echo "www-data ALL=(ALL) NOPASSWD: /sbin/hwclock" >> /etc/sudoers
echo "www-data ALL=(ALL) NOPASSWD: /sbin/shutdown" >> /etc/sudoers
echo "www-data ALL=(ALL) NOPASSWD: /usr/bin/gpio" >> /etc/sudoers
echo "www-data ALL=(ALL) NOPASSWD: /var/www/html/kerzeneinschalten.sh" >> /etc/sudoers
==== R-Pi absichern (bei Stromausfall) ====
sudo su
apt-get remove --purge wolfram-engine triggerhappy logrotate dphys-swapfile fake-hwclock
apt-get autoremove --purge
apt-get install busybox-syslogd
dpkg --purge rsyslog
# !ACHTUNG!: Syslog ab jetzt nur noch per "logread -f" lesbar
sudo su
cat /boot/cmdline.txt
dwc_otg.lpm_enable=0 console=serial0,115200 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait
vi /boot/cmdline.txt
dwc_otg.lpm_enable=0 console=serial0,115200 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait fastboot noswap ro
sudo su
rm -rf /var/lib/dhcp/ /var/run /var/spool /var/lock /var/lib/misc/ /var/lib/ntp
ln -s /tmp /var/lib/dhcp; ln -s /tmp /var/run; ln -s /tmp /var/spool; ln -s /tmp /var/lock; ln -s /tmp /var/lib/misc; ln -s /tmp /var/lib/ntp
sudo su
rm /var/lib/systemd/random-seed
ln -s /tmp/random-seed /var/lib/systemd/random-seed
nano /lib/systemd/system/systemd-random-seed.service
# add before "ExecStart=/lib/systemd/systemd-random-seed load"
ExecStartPre=/bin/echo "" >/tmp/random-seed
# reload services:
systemctl daemon-reload
sudo su
nano /etc/ntp.conf
# change "driftfile /var/lib/ntp/ntp.drift" to "driftfile /var/tmp/ntp.drift"
sudo su
insserv -r bootlogs
insserv -r console-setup
sudo su
# change ''/etc/fstab'' from:
proc /proc proc defaults 0 0
/dev/mmcblk0p1 /boot vfat defaults 0 2
/dev/mmcblk0p2 / ext4 defaults,noatime 0 1
# to:
proc /proc proc defaults 0 0
/dev/mmcblk0p1 /boot vfat defaults,ro 0 2
/dev/mmcblk0p2 / ext4 defaults,noatime,ro 0 1
# For Debian Jessie
tmpfs /tmp tmpfs nosuid,nodev 0 0
tmpfs /var/log tmpfs nosuid,nodev 0 0
tmpfs /var/tmp tmpfs nosuid,nodev 0 0
sudo su
nano /root/.bashrc
######
add below:
######
# set variable identifying the filesystem you work in (used in the prompt below)
fs_mode=$(mount | sed -n -e "s/^.* on \/ .*(\(r[w|o]\).*/\1/p")
# alias ro/rw
alias ro='mount -o remount,ro / ; fs_mode=$(mount | sed -n -e "s/^.* on \/ .*(\(r[w|o]\).*/\1/p")'
alias rw='mount -o remount,rw / ; fs_mode=$(mount | sed -n -e "s/^.* on \/ .*(\(r[w|o]\).*/\1/p")'
# setup fancy prompt
export PS1='\[\033[01;32m\]\u@\h${fs_mode:+($fs_mode)}\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ '
# aliases for mounting boot volume
alias roboot='mount -o remount,ro /boot'
alias rwboot='mount -o remount,rw /boot'
finish() {
#echo "exec on exit"
mount -o remount,rw /
history -a
hwclock -w
mount -o remount,ro /
mount -o remount,ro /boot
}
trap finish EXIT
######
sudo su
touch /etc/bash.bash_logout
nano /etc/bash.bash_logout
# add:
mount -o remount,rw /
history -a
mount -o remount,ro /
mount -o remount,ro /boot
sudo su
nano /etc/apache2/envvars
# add below "export APACHE_LOG_DIR=/var/log/apache2$SUFFIX"
mkdir -p /var/log/apache2
===== Informationsquellen =====
==== GPI/Os ansteuern ====
* [[http://raspberrypiguide.de/howtos/raspberry-pi-gpio-how-to/|http://raspberrypiguide.de/howtos/raspberry-pi-gpio-how-to/]]
* [[http://www.tacticalcode.de/2012/12/erstes-raspberrypi-projekt-blinkende-led-in-5-schritten.html|http://www.tacticalcode.de/2012/12/erstes-raspberrypi-projekt-blinkende-led-in-5-schritten.html]]
* [[http://www.element14.com/community/servlet/JiveServlet/previewBody/73950-102-4-309126/GPIO_Pi2.png?01AD=3088KQEkrZwOCmZU3AsiTV2KJUhF8xmZNJmvdXgbwBChli9RrxAb99Q&01RI=45FA47C78F20BB4&01NA=na|http://www.element14.com/community/servlet/JiveServlet/previewBody/73950-102-4-309126/GPIO_Pi2.png?01AD=3088KQEkrZwOCmZU3AsiTV2KJUhF8xmZNJmvdXgbwBChli9RrxAb99Q&01RI=45FA47C78F20BB4&01NA=na]]
* [[http://www.elektronx.de/tutorials/schalten-der-gpio-ein-und-ausgange/|http://www.elektronx.de/tutorials/schalten-der-gpio-ein-und-ausgange/]]
* [[https://projects.drogon.net/raspberry-pi/wiringpi/download-and-install/|https://projects.drogon.net/raspberry-pi/wiringpi/download-and-install/]]
* [[http://www.raspberry-pi-geek.com/Archive/2014/07/PHP-on-Raspberry-Pi|http://www.raspberry-pi-geek.com/Archive/2014/07/PHP-on-Raspberry-Pi]] - Gut, funktioniert!
==== Webseite, PHP, Java Script und JQuery ====
* [[https://api.jquery.com/jquery.get/|https://api.jquery.com/jquery.get/]] - Wichtig!
* [[http://demos.jquerymobile.com/1.4.5/|http://demos.jquerymobile.com/1.4.5/]]
* [[http://dev.jtsage.com/DateBox/jqueryui/timebox/|http://dev.jtsage.com/DateBox/jqueryui/timebox/]]
* [[http://www.w3schools.com/|http://www.w3schools.com/]]
* [[http://www.tinkerforge.com/de/doc/Kits/WeatherStation/PHPToWebsite.html|http://www.tinkerforge.com/de/doc/Kits/WeatherStation/PHPToWebsite.html]]
* [[https://wiki.selfhtml.org/wiki/Referenz:HTML/Zeichenreferenz|https://wiki.selfhtml.org/wiki/Referenz:HTML/Zeichenreferenz]]
==== Date und Co. ====
* [[http://linuxcommando.blogspot.de/2009/11/fun-with-date-arithmetic.html|http://linuxcommando.blogspot.de/2009/11/fun-with-date-arithmetic.html]]
==== Access Point ====
* [[https://menzerath.eu/artikel/raspberry-pi-als-wlan-access-point-nutzen/|https://menzerath.eu/artikel/raspberry-pi-als-wlan-access-point-nutzen/]]
* [[http://www.tacticalcode.de/2013/02/raspberry-pi-als-accesspoint-oder-wlan-bridge.html|http://www.tacticalcode.de/2013/02/raspberry-pi-als-accesspoint-oder-wlan-bridge.html]]
* [[http://jankarres.de/2015/06/raspberry-pi-wlan-access-point-einrichten/|http://jankarres.de/2015/06/raspberry-pi-wlan-access-point-einrichten/]]
==== Absichern gegen Stromausfall ====
* [[https://hallard.me/raspberry-pi-read-only/|https://hallard.me/raspberry-pi-read-only/]]
* [[https://k3a.me/how-to-make-raspberrypi-truly-read-only-reliable-and-trouble-free/|https://k3a.me/how-to-make-raspberrypi-truly-read-only-reliable-and-trouble-free/]]
* [[http://petr.io/en/blog/2015/11/09/read-only-raspberry-pi-with-jessie/|http://petr.io/en/blog/2015/11/09/read-only-raspberry-pi-with-jessie/]]
==== alter Kram - nicht mehr verwendet! ====
#NTP Dienst abstellen und deinstallieren, alternativ ''ntpdate'' installieren um per Netzwerk/Internet die Systemzeit aktualisieren zu können.:
#root@raspberrypi2:~# update-rc.d ntp disable
#root@raspberrypi2:~# update-rc.d fake-hwclock disable
#apt-get remove fake-hwclock
#rm /etc/cron.hourly/fake-hwclock
#rm /etc/init.d/fake-hwclock
#apt-get install ntpdate
#update-rc.d hwclock.sh enable
Test:
root@raspberrypi2:~# date -s "Jan 01 2016 12:00:00"
root@raspberrypi2:~# date
root@raspberrypi2:~# hwclock -w
root@raspberrypi2:~# hwclock -r
root@raspberrypi2:~# reboot
root@raspberrypi2:~# hwclock -r
Manuelles Synchronisieren der Systemzeit:
#root@raspberrypi2:~# ntpdate ptbtime1.ptb.de