(last edit: 2019-10-10) - BAUSTELLE .. wird aber bald fertig …
Neuerdings läuft das Ding unter Raspbian-10, aber ohne systemd.
Warum? Siehe https://ihatesystemd.com/
Ziel des Projektes ist ein schlankes System ohne Grafik, zugänglich über ssh -
- über die eth-Schnittstelle (Wartung, Debugging) oder WLAN (der RPi soll als access point arbeiten).
Es genügt dafür eine 2GB-SDcard (Raspbian9) bzw. für Raspbian 10 „mindestens“ eine 8GB-Karte.
Je schneller und je verläßlicher, je besser.
Der Zweck?
Ein standalone-Gerät mitten im Wald, ohne Internet-Anbindung, mit einem Handy-Browser abfragbar.
Ein Lowcost-Datenlogger, dessen Hardwarekomponenten möglichst über Jahre hinaus verfügbar sein sollen.
Und eine RTC brauchen wir auch noch, da im Wald kein ntp-Server erreichbar ist
Minimalistisches SDcard-Image hier downloaden: http://www.raspberrypi.org/downloads/raspbian/
Die SHA256-sum vom image.zip sicherheitshalber vor Dekomprimieren checken!
Dekomprimieren per commandline (mc versagt bei sehr großen Files)root@host:~# wget https://downloads.raspberrypi.org/raspbian_lite_latest
Image auf eine möglichst schnelle SDcard übertragenroot@host:~# unzip 2018-11-13-raspbian-stretch-lite.zip
Sofort den Netzwerk-Zugang vorbereiten (Default-IP ist 192.168.1.1)root@host:~# dd bs=4M if=2018-11-13-raspbian-stretch-lite.img of=/dev/sdc status=progress conv=fsync
root@host:~# mount /dev/sdc1 /mnt root@host:~# cd /mnt root@host:~# touch ssh root@host:~# umount /mnt
ACHTUNG! 2G-SD-Karten sind evtl. leicht verschieden groß, der Versuch, ein zu großes Image per dd zu kopieren, endet mit einem korrupten Filesystem!root@host:~# losetup -P /dev/loop0 2018-11-13-raspbian-stretch-lite.img root@host:~# fdisk -l /dev/loop0 Disk /dev/loop0: 1,8 GiB, 1866465280 bytes, 3645440 sectors Units: sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disklabel type: dos Disk identifier: 0x7ee80803 Device Boot Start End Sectors Size Id Type /dev/loop0p1 8192 98045 89854 43,9M c W95 FAT32 (LBA) /dev/loop0p2 98304 3645439 3547136 1,7G 83 Linux
/dev/loop0p1 bzw. /dev/loop0p2 können einfach auf /mnt eingebunden werden.
root@host:~# dd bs=4M if=/dev/sdb of=mypi.img status=progress conv=fsync
Die kurze UUID kann nur beim Neuformatieren vergeben werden, ist aber hier ziemlich egal.root@host:~# fatlabel /dev/sdc1 "BOOT"
root@host:~# blkid /dev/sdc1 /dev/sdc1: LABEL="BOOT" UUID="9304-D9FD" TYPE="vfat" PARTUUID="a6924f9f-01"
root@host:~# e2label /dev/sdc2 "MYOWNPI"
Sonst gibt es Schwierigkeiten, mehrere SD-Karten abwechselnd auf einem Host-PC zu mounten und zu editieren.
Das Tool „uuid“ generiert eine Random-Zahl im passenden Format.root@host:~# tune2fs /dev/sdc2 -U `uuid`
(Beim ersten Booten bläst sich die Root-Partition auf den maximal verfügbaren Platz der SDcard auf!)
ACHTUNG! Nicht alle SD-Karten sind genau gleich groß, etwas zu große Images auf kleinere Karten zurückzuspielen macht später Ärger. Es spricht aber nichts dagegen, fixe Größen für Boot- und Rootpartition einzuführen. Eine dritte Daten-Partition am Ende kann dann den restlichen Platz auf der SD-Karte ausfüllen.
Beispiel - das ist ein selbstgebasteltes Debian 10/SysV-Lite-Image (Update-Stand 2019-10-09)
# fdisk -l 'buster-lite-sysv-all(pi2)-8G-20191009_2.img'
.. blabla .. Device Boot Start End Sectors Size Id Type buster-lite-sysv-all(pi2)-8G-20191009_2.img1 8192 532480 524289 256M c W95 FAT32 (LBA) buster-lite-sysv-all(pi2)-8G-20191009_2.img2 540672 4734975 4194304 2G 83 Linux buster-lite-sysv-all(pi2)-8G-20191009_2.img3 4734976 15278079 10543104 5G 83 Linux
Dieses Image läßt sich 1:1 auf größere SD-Karten dd-en.
Dann muß man nur die Partition 3 löschen und ab dem alten Startsektor (hier: 4734976) bis zum physikalischen Ende der SD-Karte neu anlegen. Unmounten, mit mkfs.ext4 neu formatieren, fertig!
Für das alltägliche Backup genügt es, die Root-Partition (p2), die genau 2GiB (4194304 Sektoren a 512 bytes) groß ist, zu sichern. Auf der FAT-Partition ändert sich aber im Zuge von Kernelupdates auch etwas!
Erster login - z.B. von einem Laptop mit zurechtgebogener eth-Schnittstelle.
Default-User: pi (pwd: raspberry - sofort das User-Passwort ändern!)root@host:~# ifconfig eth0 192.168.1.2
root werden mit …root@host:~# ssh 192.168.1.1 -l pi
… und auch hier ein Root-Passwort definieren.pi@raspberrypi:~# sudo su
root@raspberrypi:~# apt-get update
Die wlan0-Schnittstelle wird erst später gebraucht. Über die kann später der Webserver per Handy angebrowst werden. Geduld bitte, mehr dazu siehe weiter unten.
ACHTUNG, NEU! Nicht mehr /etc/config/network, sondern /etc/dhcpcd.conf editieren - untenstehendes anhängen!
(vorher Backup machen auf *.ORIG!)
.... # ~~~~ from here: added by koarrl ~~~~ interface eth0 static ip_address=172.16.1.13/24 static domain_name_servers=192.168.1.1 8.8.8.8
Dazu passend am Host-Rechner (eth-IP: 172.16.1.3) das IP-Forwarding einrichten (vorerst per commandline)
root@host:~# ifconfig eth0 172.16.1.3 root@host:~# iptables -t nat -A POSTROUTING -o wlan0 -j MASQUERADE root@host:~# iptables -A FORWARD -i eth0 -j ACCEPT root@host:~# echo 1 > /proc/sys/net/ipv4/ip_forward
NEU: dgl. für Debian Buster … Erst einmal der Ethernet-Schnittstelle mit GUI-Bordmitteln ihre statische IP zuweisen. Dann:
root@host:~# iptables -t nat -A POSTROUTING -o wlp1s0 -j MASQUERADE root@host:~# iptables -A FORWARD -i enp3s0 -j ACCEPT
und in /etc/sysctl.conf diese Zeile einkommentieren!
.... #net.ipv4.ip_forward=1
Den Pi wieder rebooten. Das Einsteigen geht ab jetzt so:
Wenn der ssh-Zugang vom Host verweigert wird:root@host:~# ssh 172.16.1.13 -l pi
Nun dem Pi einen Internet-Zugang über den Host-Rechner ermöglichen:user@host:~$ rm ~/ssh/.known_hosts
root@raspberrypi:~# route add default gw 172.16.1.3
Anm.: Das Paket „ntp“ ist bereits installiert, womit der ntp-Daemon immer für eine richtige Uhrzeit sorgt.root@raspberrypi:~# apt-get update root@raspberrypi:~# apt-get install dselect mc minicom chkconfig
GANZ WICHTIG: dselect in Profi-Modus versetzen
root@raspberrypi:~# echo expert >> /etc/dpkg/dselect.cfg
minicom mit FTDI-Modul testen:
Handshake → none und local echo → yes setzen –> Zeichen erscheinen doppelt, wenn TX-Rx-Jumper gestecktroot@raspberrypi:~# minicom -c on -D /dev/ttyS0
raspi-config starten:
Einstellungen ändern:root@raspberrypi:~# raspi-config
Hostname: mypi default locale: de_AT.UTF8 timezone Europe/Vienna
… und wieder rebooten! …
Was hängt eigentlich beim Pi2 am USB-Bus?
148F:5370 Ralink Technology, Corp. RT5370 Wireless Adapter 0424:ec00 SMSC9512/9514 Fast Ethernet Adapter 0424:9514 SMC9514 USB Hub 1d6b:0002 Linux Foundation 2.0 root hub
Anzeige aktiver Startskripte:
Ein Multi-Tool, mit dem SysV-Startscripte vom neuen ach so tollen systemd (würg!) angenommen werden - siehe manpage:root@raspberrypi:~# service --status-all
Alle Startscripte neu anwerfen:root@raspberrypi:~# chkconfig
my_startscript anwerfen:root@raspberrypi:~# systemctl daemon-reload
my_startscript dauerhaft (über reboot) installieren:root@raspberrypi:~# systemctl start my_startscript
root@raspberrypi:~# systemctl enable my_startscript
Hier verstecken sich beim RPi2 die LEDs:
/sys/class/leds/led0 (grün)
/sys/class/leds/led1 (rot)
z.B. „grün ein“:
z.B. „rot aus“:root@raspberrypi:~# echo default-on > /sys/class/leds/led0/trigger
root@raspberrypi:~# echo none > /sys/class/leds/led1/trigger
Siehe: http://abyz.me.uk/rpi/pigpio/download.html - Unbedingt holen und builden!
Am besten die C-Library verwenden, dann ist kein Daemon vonnöten.
Wunderschön gemachte Doku dazu: http://abyz.me.uk/rpi/pigpio/cif.html
pi@raspberrypi:~ $ wget abyz.me.uk/rpi/pigpio/pigpio.tar pi@raspberrypi:~ $ tar xf pigpio.tar pi@raspberrypi:~ $ cd PIGPIO pi@raspberrypi:~/PIGPIO $ make pi@raspberrypi:~/PIGPIO $ sudo make install
Das ist für Debugging und Editieren mit den Bordmitteln des Host-PC sehr nützlich. Paket holen …
root@raspberrypi:~# apt-get install nfs-kernel-server
… und /etc/exports editieren:
/home/pi 172.16.1.3(rw,sync,no_subtree_check)
… und schließlich:
root@raspberrypi:~# service nfs-kernel-server reload
Es empfiehlt sich hier nicht der Ansatz über eine Zeile in /etc/fstab, weil dann der Pi beim Ausschalten, sofern sein nfs-Export noch am Entwickler-PC gemountet ist, jenen zum laaaaaangen Warten verdammt.
Besser: die etwas undurchschaubare autofs-Methode. Auf RPi-Seite muß dazu der nfs-Kernel-Server installiert sein und /etc/exports wie oben beschrieben aussehen.
Auf der Host-Seite (Entwickler-PC) braucht man autofs. Dafür (1) /etc/auto.master editieren:
... /var/autofs/nfs /etc/auto.nfs --timeout=100 ...
Das bedeutet, daß später, nach Neustart des autofs-Dienstes am Hostrechner, ein Ordner /var/autofs/nfs angelegt wird.
Und dann noch (2) /etc/auto.nfs editieren bzw. neu anlegen:
Nun den autofs-Dienst mit „service autofs restart“ neu starten. Damit wird ein Ordner /var/autofs/nfs/pi angelegt.
pi -fstype=nfs,rw,soft,intr 172.16.1.13:/home/pi
# umount -fl /var/autofs/nfs
Vor einem neuerlichen autofs-Zugriff auf dieses nfs-share muß dann folgendes geschehen:
# service autofs restart
Dank gebührt den Schreibern von https://wiki.archlinux.org/index.php/Autofs .
Paket installieren:
root@raspberrypi:~# apt-get install lighttpd
Dieser Server läuft defaultmäßig mit user:gruppe www-data:www-data.
Für einen Pi empfiehlt es sich, die „server root“ auf eine RAMdisk unter /var/www zu legen.
/etc/fstab sieht also etwa so aus:
proc /proc proc defaults 0 0 PARTUUID=0634f60c-01 /boot vfat defaults 0 2 PARTUUID=0634f60c-02 / ext4 defaults,noatime 0 1 PARTUUID=0634f60c-03 /DATA ext4 defaults,noatime 0 1 none /var/www tmpfs uid=root,gid=www-data,size=2M 0 0
Folgende Konfigurationen gehören (eventuell) geändert:
1. - in /etc/lighttpd/lighttpd.conf
server.document-root = "/var/www" server.port = 8080 static-file.exclude-extensions = ( ".php", ".pl", ".fcgi", ".cgi" )
2. - in /etc/lighttpd/conf-available/10-cgi.conf:
alias.url += ( "/cgi-bin/" => "/var/www/cgi-bin/" )
3. - Symlink anlegen in /etc/lighttpd/conf-enabled auf /etc/lighttpd/conf-available/10-cgi.conf !
Und nun? Das Server-Root-Verzeichnis mit anzeigbaren Test-Files befüllen (index.html, cgi-bin/helloCGI, …)
Damit werden statische HTML-Seiten und beliebige cgi-scripts geliefert
Der Webserver wird ab jetzt nach jedem Reboot gemäß /etc/init.d/lighttpd gestartet.
Unnötige Pakete und Dienste können nun nach Geschmack deinstalliert werden (so vorhanden) …
root@raspberrypi:~# echo -n performance | tee /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
Beim RPi2 braucht man einen WLAN-Stick, der RPi3 hat die Hardware schon onboard.
Proprietäre Firmware sollte schon vorinstalliert sein.
https://www.raspberrypi.org/documentation/configuration/wireless/wireless-cli.md
https://wiki.debianforum.de/WLAN-Access-Point_mit_hostapd_und_USB-Stick
https://www.elektronik-kompendium.de/sites/raspberry-pi/2002171.htm
Zeige angesteckten USB-WLAN-Stick an:
Zeige Fähigkeiten des Sticks:root@raspberrypi:~# iwconfig
root@raspberrypi:~# iw list
Siehe: https://www.raspberrypi.org/documentation/configuration/wireless/access-point.md
Paket installieren und dann den Dienst gleich einmal stoppen.
Am besten das Configfile /etc/hostapd/hostapd.conf neu anlegen.root@raspberrypi:~# apt-get install hostapd root@raspberrypi:~# systemctl stop hostapd
# edited by koarrl (ultimate) # DONTUSE Tab chars and comments behind non-empty lines! interface=wlan0 ssid=rpi-wlan hw_mode=g channel=4 wmm_enabled=0 macaddr_acl=0 auth_algs=1 ignore_broadcast_ssid=0 wpa=2 wpa_passphrase=abcdefghi wpa_key_mgmt=WPA-PSK wpa_pairwise=TKIP rsn_pairwise=CCMP
Und dann im File /etc/default/hostapd den Verweis auf das eben erstellte Configfile anlegen,
dafür die Zeile mit DAEMON_CONF=… einkommentieren, also
.... DAEMON_CONF="/etc/hostapd/hostapd.conf" ....
Nun den den Dienst wieder starten bzw. für die Zukunft dauerhaft enablen.
root@raspberrypi:~# systemctl enable hostapd
Anmerkung: Wird ein USB-WLAN-Stick ab- und wieder angesteckt, lebt er erst wieder nach folgenden Aktionen:
root@raspberrypi:~# /etc/init.d/hostapd restart [ ok ] Stopping advanced IEEE 802.11 management: hostapd. [ ok ] Starting advanced IEEE 802.11 management: hostapd. root@raspberrypi:~# /etc/init.d/dhcpcd restart sending signal TERM to pid 2246 waiting for pid 2246 to exit DUID 00:01:00:01:24:9e:78:0f:b8:27:eb:8a:98:9b eth0: IAID eb:8a:98:9b eth0: adding address fe80::ca7a:83ab:3e68:ed1c ipv6_addaddr1: Operation not supported wlan0: IAID 00:66:94:c2 wlan0: adding address fe80::44c6:6f2d:1292:4c13 ipv6_addaddr1: Operation not supported wlan0: using static address 10.0.0.1/24 wlan0: adding route to 10.0.0.0/24 forked to background, child pid 3985 root@raspberrypi:~#
ggfs Paket installieren und dann den Dienst gleich einmal stoppen. Originales Configfile sichern.
root@raspberrypi:~# apt-get install dhcpcd root@raspberrypi:~# systemctl stop dhcpcd root@raspberrypi:~# mv /etc/dhcpcd.conf /etc/dhcpcd.conf.ORIG
File /etc/dhcpcd.conf editieren.
Dazu am Ende Folgendes anfügen:
Neues, minimalistisches File /etc/dnsmasq.conf anlegen.
.... # ~~~~ from here: added by koarrl ~~~~ interface eth0 static ip_address=172.16.1.13/24 static domain_name_servers=192.168.1.1 8.8.8.8 interface wlan0 static ip_address=192.168.4.1/24 nohook wpa-supplicant
interface=wlan0 no-dhcp-interface=eth0 dhcp-range=interface:wlan0,192.168.4.2,192.168.4.3,infinite
Nun den den Dienst wieder starten bzw. für die Zukunft dauerhaft enablen.
root@raspberrypi:~# systemctl enable dnsmasq
Nun (bzw. auch nach jedem weiteren reboot) sollte ein WLAN mit der oben definierten SSID sichtbar sein, und nach Einklinken in dieses WLAN und Zuweisung einer IP-Adresse per DHCP sollte man über die oben definierte IP-Adresse die von thttpd präsentierte Webseite sehen können.
Der Pi hat leider keine RTC. Sofern er offline läuft und Daten loggen soll, wäre also ein DS1994 fein.
Hardwaremäßig sind für den Onewire-Bus nur 3 Drähte anzuschließen:
Und dazu ein 2K7-Pullup-Widerstand zwischen Onewire-Bus und +3,3V.
Nun muß zunächst einmal der Kerneltreiber für den Onewire-Bus aktiviert werden - einfach durch Anhängen dieser Zeilen an /boot/config.txt …
.... # Uncomment this for Dallas-Maxim OneWireBus dtoverlay=w1-gpio,gpiopin=4
.. und rebooten. Alles findet sich dann unter /sys/bus/w1/devices/~unique_num~
Wer es eilig hat, bestellt ein Chinesenmodul mit Li-Batterie und einem DS3232.
Diese RTC wird über I2C angebunden und sollte out of the box laufen und den date-Befehl unterstützen.
(wird nach Lieferung fortgesetzt …)
Der Dallas-Baustein kann dadurch als Baumstruktur unter einem Mountpoint abgebildet werden.
Installieren:
Hardware:
In /sys/bus/w1/devices erscheinen nun zwei Ordner - für den Busmaster und den DS1994 (Typcode-unique number), z.B. also:
root@Pi:/sys/bus/w1/devices# ls -l insgesamt 0 lrwxrwxrwx 1 root root 0 Apr 18 19:28 04-0000005d660f -> ../../../devices/w1_bus_master1/04-0000005d660f lrwxrwxrwx 1 root root 0 Apr 18 19:25 w1_bus_master1 -> ../../../devices/w1_bus_master1
Mountpoint definieren:
# mkdir /media/owfs
Editieren von /etc/owfs.conf - der Nettoinhalt:
! server: server = localhost:4304 mountpoint = /media/owfs allow_other server: w1 = all server: port = localhost:4304
Auch /etc/fuse.conf muß editiert werden:
... # This is needed for owfs! user_allow_conf
Nun (nach reboot) der Mountvorgang für (alle bzw. hier - nur der DS1994) Devices:
Mittels Aufruf von /usr/bin/owfs, die Parameter werden aus obenerwähntem configfile übernommen.
# owfs
Wir sehen jetzt eine Baumstruktur unter dem Mountpoint, Datum und Uhrzeit finden sich darin.
# cd /media/owfs/04.0F665D000000 # cat date Sat Mar 14 16:40:40 1953 # cat date Sat Mar 14 16:40:44 1953
Ähem. Die Uhr läuft, gehört aber eingestellt. Jetzt wird es trickreich.
Defaultmäßig ist die Uhr nicht schreibbar. Entgegen der Doku unter http://owfs.org/index.php?page=ds1994 wird der Schreibschutz aufgehoben durch:
# echo 1 > /media/owfs/04.0F665D000000/readonly/clock
Nun kann die Uhr mit einem gleichformatigen Datestring beschrieben werden, oder noch einfacher - auf die Systemzeit gesetzt mit einem Leerstring!
# echo > /media/owfs/04.0F665D000000/date
Nun die Uhr besser wieder schreibschützen:
# echo 0 > /media/owfs/04.0F665D000000/readonly/clock
Kontrolle: RPi shutdown, ausschalten, Dallas-Uhr ab-/an-stecken, einschalten, rebooten, und …
# owfs # cat /media/owfs/04.0F665D000000/date Thu Apr 18 21:51:36 2019
Funktioniert, hurra! Zeitzone und Sommerzeit: später mal, weiterer Forschungsbedarf!
owfs muß hier bereits gestartet sein und der Dallas-TIC DS1994 gemountet.
Tipp: Systemuhr im Epoch-Format (Sekunden seit 1.1.1970, 0:00:00) ausgeben
# date +%s
Irgendeinen DS1994 mit der Systemuhr synchronisieren:
# echo 1 > /media/owfs/04.????????????/readonly/clock # echo > /media/owfs/04.????????????/date # echo 0 > /media/owfs/04.????????????/readonly/clock
Die Systemuhr mit (irgendeiner) TIC-Zeit synchronisieren:
Das ist die Funktion, die beim Startup statt dem script „fake-hwclock“ ausgeführt werden sollte.
–> stattdessen wird ein modifiziertes script „TIC-hwclock“ eingeführt.
# date -s @`cat /media/owfs/04.????????????/udate`
ACHTUNG! Defekte oder nicht vorhandene TICs können beim Zugriff keine Rückmeldung liefern.
Es gibt aber ein Timeout (wo definiert?)
Nur zum Testen - TIC-Zeit auf 1.4.2019, 02:00 CEST setzen:
# echo 1 > /media/owfs/04.????????????/readonly/clock; echo "1554076800" > /media/owfs/04.????????????/udate; echo 0 > /media/owfs/04.????????????/readonly/clock
TIC-Zeit abfragen:
# cat /media/owfs/04.????????????/date
ACHTUNG! der LSB-Header ist noch zweifelhaft. Funktion sonst OK.
Abgesehen davon, daß der owfs-Baum world-writable ist … für dieses RPi-Projekt ist das egal.
#!/bin/sh ### BEGIN INIT INFO # Provides: TIC-hwclock # Required-Start: # Required-Stop: umountroot # Should-Stop: # X-Start-Before: checkroot # Default-Start: S # Default-Stop: 0 1 6 # Short-Description: Restore / save the current clock from file or Dallas TIC DS1994 (if available) # Description: ### END INIT INFO set -e # Include core init functions if needed . /lib/lsb/init-functions PARAM=/etc/default/fake-hwclock if [ -f $PARAM ]; then . "$PARAM" fi # start owfs & mount TIC here if not already done [ -z "`ls /media/owfs`" ] && /usr/bin/owfs # determine if exactly one Dallas TIC is connected (owfs must already be running and TIC must be mounted) HWCLOCK=FAKE # default: fake clock needed if [ -d /media/owfs/04.???????????? ]; then # are there any TICs? NUMOFTICS=`ls -1 /media/owfs | grep 04. | wc -l` # yes, so count them, expect one if [ $NUMOFTICS -eq 1 ]; then APRIL_1_2019=1554076800 # a running TIC must have passed this past point in time SEC1=`cat /media/owfs/04.????????????/udate` # what's the time now? sleep 2 SEC2=`cat /media/owfs/04.????????????/udate` # what's the time now, a bit later? [ $((SEC2-SEC1)) != 0 ] && [ $SEC1 -gt $APRIL_1_2019 ] && HWCLOCK=TIC # Yippie, we have a running TIC! fi fi echo "*** "$HWCLOCK" ***" case "${1:-}" in stop|reload|restart|force-reload) if [ "$HWCLOCK" = "TIC" ]; then echo "Stopping TIC-hwclock: nothing to do!" else echo "Stopping fake-hwclock: saving system time to file " fake-hwclock save fi ;; start) if [ "$HWCLOCK" = "TIC" ]; then echo "Starting TIC-hwclock: sync system time with TIC" date -s @`cat /media/owfs/04.????????????/udate` else echo "Starting fake hwclock: loading last known system time from file." fake-hwclock load $FORCE fi ;; *) echo "Usage: ${0:-} {start|stop|status|restart|reload|force-reload}" >&2 exit 1 ;; esac
Dieses script ersetzt das Startscript „fake-hwclock“.
Dafür muß man folgendes tun:
# systemctl disable fake-hwclock # systemctl enable TIC-hwclock
Unnötiges weg:
# systemctl disable owftpd # systemctl disable owhttpd
Es gibt obskure Probleme mit dem LSB-Kommentarheader bei der Installation des Initscripts „TIC-hwclock“.
Lesen und verstehen: https://wiki.debian.org/LSBInitScripts/
Besser wäre es vielleicht, das uralte und bewährte Initscript „hwclock.sh“ zu modifizieren …
Damit kann man alte DS1994 funktionsprüfen.
Leider hängt sich manchmal beim Umstecken etwas auf, dann hilft nur noch reboot.
#!/bin/bash # **************************************************************************** # # tictest: a tool for old Dallas DS1994 checking # # by koarrl 2019-07-12 (Raspbian 10) # # can deal with duplicate entries in owfs tree (tekes the first one) # # **************************************************************************** usage() { echo "usage: `basename $0` { r | s | t }" echo " r .. read time & date from TIC" echo " s .. write system time to TIC & start it, report success or failure" echo " t .. halt TIC internal clock (save battery)" } waittic() { NOWTIC=`ls -1 /media/owfs | grep 04. | head -1` if [ -z "$NOWTIC" ]; then echo -n "Insert TIC please " while ((1)); do sleep 0.5 NOWTIC=`ls -1 /media/owfs | grep 04. | head -1` [ -n "$NOWTIC" ] && { echo; break; } echo -n "." done fi echo "TIC found: "$NOWTIC } getstate() { SEC1=`cat $TICMOUNT/$NOWTIC/udate` sleep 1.1 SEC2=`cat $TICMOUNT/$NOWTIC/udate` if [ $((SEC2-SEC1)) != 0 ]; then STATE=running else STATE=stopped fi } # **** MAIN ****************************************************************** TICMOUNT="/media/owfs" [ -z $1 ] && { usage; exit; } [ -d $TICMOUNT ] || { echo "owfs needed, but not found! Sorry."; exit; } [ -n `ls -1 $TICMOUNT | grep 04. | head -1` ] && waittic case "$1" in r) echo "Reading time from TIC ..." getstate echo "TIC ...... "`cat $TICMOUNT/$NOWTIC/date`" ($STATE)" echo "System ... "`date` ;; s) echo "Setting time and starting TIC ..." echo 1 > $TICMOUNT/$NOWTIC/readonly/clock echo > $TICMOUNT/$NOWTIC/date echo 0 > $TICMOUNT/$NOWTIC/readonly/clock echo 1 > $TICMOUNT/$NOWTIC/running getstate echo "TIC ...... "`cat $TICMOUNT/$NOWTIC/date`" ($STATE)" echo "System ... "`date` ;; t) echo "Stopping TIC ..." echo 0 > $TICMOUNT/$NOWTIC/running ;; *) ;; esac
Damit kann man DS1820 und 18B20 funktionsprüfen.
#!/bin/sh # **************************************************************************** # # thermo # # just a test for DS1820 | DS18B20 onewire thermometers # # V0.01 by koarrl, 2019-09-19 # # **************************************************************************** show_data() { cd $MYTHERM echo " address = "`cat address` echo " latesttemp = "`cat latesttemp` echo "temperature = "`cat temperature` echo " temphigh = "`cat temphigh` echo " templow = "`cat templow` } THERMOUNT="/media/owfs" # this is the owfs mountpoint # determine if DS1820 is connected, take the first one if multiple do exist if [ -d $THERMOUNT/10.???????????? ]; then MYTHERM=`ls -d $THERMOUNT/10.* | head -n1` echo "-- DS1820 --" show_data fi # determine if DS18B20 is connected, take the first one if multiple do exist if [ -d $THERMOUNT/28.???????????? ]; then MYTHERM=`ls -d $THERMOUNT/28.* | head -n1` echo "-- DS18B20 --" show_data fi if [ -z "$MYTHERM" ]; then echo "Sorry, neither a DS1820 nor a DS18B20 found!" fi
Es hat sich gezeigt, daß mehrere Thermometer einzeln an mehrere Portpins angeschlossen werden können.
Sie scheinen dann extra und über ihre unique number identifizierbar im owfs-Baum auf.
Allerdings muß dann /boot/config.txt entsprechend editiert werden (z.B.):
dtoverlay=w1-gpio,gpiopin=4 dtoverlay=w1-gpio,gpiopin=5