• 1
  • 2
  • 3
  • 4

Der Automatisierungs- Rechner | Teil 3 - RTC

Rate this item
(0 votes)
AndinoX1 mit DS3231 AndinoX1 mit DS3231

Ihr kennt das sicherlich auch: Man bereitet etwas akribisch vor und wenn man endlich Zeit findet es zu erledigen, sind wie von Geisterhand alle Vorbereitung\Aufzeichnungen weg; so ist es mir gerade ergangen.
Beim Einrichten meiner X1 habe ich parallel immer eine kleine Datei gepflegt, in der ich jeden Schritt dokumentiert und vor allem kommentiert habe. Sicherheitshalber hatte ich nach dieser Vorlage auch schon 2 Neuinstallation durchgeführt und nun ist alles weg – Super!

Nachdem ich mein Gemüt mit einem Kaffee beruhigt habe, ist mir auch eine kleine Erleuchtung gekommen wie es zum tragischen Verlust meiner Aufzeichnungen gekommen sein muss: Bei meiner letzten Installation wurde ich mit einem zärtlichen aber fordernden „Papaaa …..“ abrupt aus meinem Tunnel geworfen. Da meine Tochter lernfähig ist und schon weiß das ein „gleich“ bei mir alles bedeuten kann, gesellten sich zwei kleine Hände zu meiner Tastatur und dort muss es dann eben passiert sein: Strg+a, Entf, Strg+s.

Egal... Meine Tochter war glücklich und muss mich nun auf das besinnen, was in meiner Vorlage so enthalten war – Fangen wir an:

Schritt 1

Im ersten Schritt müssen wir den I2C- Bus beim Systemstart aktivieren. Hierzu ändern wir die Datei /boot/config.txt entsprechend ab.
>>		sudo nano /boot/config.txt

		dtparam=i2c_arm=on
		#dtparam=i2s=on
		#dtparam=spi=on
		dtoverlay=i2c-rtc,ds3231

Mit Strg+s, Y, Enter, verlassen wir den Editor.

Schritt 2

Darauffolgend installieren wir die i2c-tools und entfernen den fake-hwclock, der beim Herunterfahren des Systems lediglich die Zeit in einer Datei speichert und beim Starten wieder einliest.

>>		sudo -s

>>		apt-get install -y i2c-tools
>>		echo 'i2c-dev' >> /etc/modules

>>		apt-get purge -y fake-hwclock 
>>		apt-get remove fake-hwclock -y 
>>		dpkg --purge fake-hwclock

Schritt 3

Damit die Systemzeit beim erstmaligen Aktivieren des RTC’s nicht aus dem Takt gerät, löschen wir vorsichtshalber die Datei /etc/adjtime, in der alle Zeitkorrekturen eingetragen sind. Diese wird später vom System wieder neu angelegt und somit brauchen wir uns damit nicht weiter auseinanderzusetzen.

Nachfolgend bestimmen wir unsere Zeitzone über die Datei /etc/localtime, damit die UTC- Zeit vom System richtig ermittelt werden kann (OK, eigentlich läuft es genau anderes herum).

Bei Fragen rund um das Thema Zeit, finde ich im übrigen folgende Seite sehr informativ: https://linux-club.de/wiki/opensuse/Uhrzeit_Korrektur

>>		rm -f /etc/adjtime. 
>>		cp /usr/share/zoneinfo/Europe/Vienna /etc/localtime

 Schritt 4

Nachdem alles vorbereitet ist, starten wir einfachhalber das System neu und überprüfen im Anschluss ob der RTC über I2C angesprochen werden kann.

>>		reboot
>>		i2cdetect -y 1

 Der letzte Befehl sollte folgendes zu Tage fördern

     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:          -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- UU -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --

 Mit einem

>>		hwclock -w
>>		hwclock -r

setzen wir schließlich die aktuelle Systemzeit im RTC und lesen diese im Nachhinein gleich wieder aus.

Glückwunsch – Das Schwierigste wäre geschafft.

Schritt 5

Damit die RTC- Zeit nicht allzu stark von der NTP- Zeit abweicht, sollte diese wenn nötig synchronisiert werden. Hierzu verwende ich ein kleines Phython- Skript, welches in unzähligen Abwandlungen im www zu finden ist, das Verhalten aber nahezu identisch ist:

Bei bestehender NTP- Verbindung und bei einer Abweichung von x Zeiteinheiten, update die RTC- Zeit mit der der NTP- Zeit.

Diese Routine lasse ich alle 24h einmal aufrufen, was aus meiner Sicht mehr als genügen sollte.

>>		mkdir /home/openhabian/_scripts
>>		mkdir /home/openhabian/_log
>>		touch /home/openhabian/_scripts/ntp2hwclock.sh
>>		chmod +x /home/openhabian/_scripts/ntp2hwclock.sh
>>		ln -s /home/openhabian/_scripts/ntp2hwclock.sh /etc/cron.daily/ntp2hwclock

 Meine ntp2hwclock.sh sieht im Übrigen wie folgt aus:

#!/bin/bash
# Location of logfile
LOGFILE="/home/openhabian/_log/ntp2hwclock.log"
if [ ! -f $LOGFILE ]; then
  touch $LOGFILE
fi

# Set the maximum allowed difference in seconds between Hw-Clock and Sys-Clock
maxDiffSec="2"
msgNoConnection="No connection to time-server"
msgConnection="Connection to time-server"

# Check for NTP connection
if ( ntpq -p | grep -q "^*"  ); then
        echo $msgConnection
        echo "---------------------------------"
        secHwClock=$(sudo hwclock --verbose | grep "^Hw clock time" | awk '{print $(NF-3)}')
        echo "HwClock: $secHwClock sec"
        secSysClock=$(date +"%s")
        echo "SysClock: $secSysClock sec"
        echo "---------------------------------"
        secDiff=$(($secHwClock-$secSysClock))
        # Compute absolute value
        if ( echo $secDiff | grep -q "-" ); then
            secDiff=$(echo $secDiff | cut -d "-" -f 2)
        fi
        echo "Difference: $secDiff sec"
        msgDiff="HwClock difference: $secDiff sec"
        if [ "$secDiff" -gt "$maxDiffSec" ] ; then
                echo "---------------------------------"
                echo "The difference between Hw- and Sys-Clock is more than $maxDiffSec sec."
                echo "Hw-Clock will be updated"
                # Update hwclock from system clock
                sudo hwclock -w
                msgDiff="$msgDiff --> HW-Clock updated."
        fi
        if !(awk '/./{line=$0} END{print line}' $LOGFILE | grep -q "$msgConnection") || [ "$secDiff" -gt "$maxDiffSec" ]; then
                echo $(date)": "$msgConnection". "$msgDiff
        fi
else
        # No NTP connection
        echo $msgNoConnection
        if !(awk '/./{line=$0} END{print line}' $LOGFILE | grep -q "$msgNoConnection"); then
                echo $(date)": $msgNoConnection" >> $LOGFILE
        fi
fi

Schritt 6

Damit sichergestellt ist, dass bei einem Neustart auch wirklich die RTC- Zeit als Systemzeit verwendet wird, adaptieren wir ein klein wenig die Datei /etc/rc.local. Vor dem Befehl exit fügen wir eine while-Schleife eine, die solange ausgeführt wird bis die Zeit des RTC-Moduls mit der lokalen Systemzeit überschrieben worden ist.

>>		sudo nano /etc/rc.local

		while ! hwclock -s
		do
		  	echo "Failed to sync RTC to local time."
		done
   			echo "Successfully synced RTC to local time"

Schritt 7

Nach einem weiteren Neustart sollte in der Datei /var/log/boot.log nun folgender Eintrag zu finden sein "Successfully synced RTC to local time"

Anmerkung

Ich hoffe mir sind keine Fehler unterlaufen, wenn doch, lasst es mich wissen.

Last modified on Donnerstag, 30 September 2021 14:20

Leave a comment

Make sure you enter all the required information, indicated by an asterisk (*). HTML code is not allowed.

Built with HTML5 and CSS3
Copyright © 2018 www.project51.at