Forum: Mikrocontroller und Digitale Elektronik Systemzeit auf Raspi update


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Detlef _. (detlef_a)


Lesenswert?

Hallo,

die Systemzeit auf meinem Raspi läuft recht schnell weg, so 
2min/Halbjahr. Der Raspi hängt an einer Fritzbox, die die richtige Zeit 
natürlich kennt. Ich muss also die Zeit auf dem Raspi mal ab und zu neu 
stellen. timedatectl ist mir ein wenig bekannt, damit scheints aber 
nicht zu gehen.
Ich bin in Python unterwegs, vllt. kann man von dort direkt ntp 
anzapfen, ansonsten nehme ich auch gern das Linux Kommando.

THX
Cheers
Detlef

von Harry L. (mysth)


Lesenswert?

sudo apt install ntp ntpdate

Und das hier lesen und verstehen:
https://www.grund-wissen.de/linux/server/ntp.html

von Bauform B. (bauformb)


Lesenswert?

Normalerweise installiert man den ntpd (ist im Paket ntpsec). Ohne 
stabiles Internet macht der aber keinen Spaß. Mit "rdate -anv 
pool.ntp.org" als root kann man die Systemzeit korrigieren, z.B. einmal 
am Tag. Der Aufruf funktioniert auf der Kommandozeile oder per cronjob 
oder auch mit Python. Für Python gibt es auch das Paket python-3-ntp.

Das -a bei rdate steht für adjust. Die Systemuhr wird dann nicht einfach 
verstellt, sondern rdate sagt dem Kernel um wie viel die Uhr falsch 
geht. Der Kernel lässt die dann um 0.05% schneller oder langsamer laufen 
bis die Zeit wieder stimmt. Wichtig ist, dass es keine Zeitsprünge gibt, 
vor allem nicht in die Vergangenheit.

von Sebastian R. (sebastian_r569)


Lesenswert?

Bei der Gelegenheit dann auch noch eine RTC nachrüsten, die kann man 
dann auch dem Linux beibringen und es kümmert sich selber darum, die 
interne Uhr mit NTP synchron zu halten

von Mario M. (thelonging)


Lesenswert?

Detlef _. schrieb:
> die Systemzeit auf meinem Raspi läuft recht schnell weg

Was für eine OS-Version hast Du installiert? Auf einem aktuellen 
Raspberry Pi OS (Debian 12) ist doch timedatectl aktiv, was die Zeit 
über ntp korrigiert.

von Harald K. (kirnbichler)


Lesenswert?

Bauform B. schrieb:
> Normalerweise installiert man den ntpd (ist im Paket ntpsec). Ohne
> stabiles Internet macht der aber keinen Spaß.

Ein lokaler NTP-Server ist vorhanden, den kann man verwenden: Die 
eingangs erwähnte Fritzbox. Die verliert ihre Zeit nur bei Stromausfall.

von Christian B. (casandro)


Lesenswert?

Also bei ntpd, openntpd und vermutlich auch chrony, dürfte der 
Gangfehler der Uhr automatisch ausgeglichen werden. Dafür muss sich der 
Raspberry PI regelmäßig synchronisieren. Das geht auch vernünftig gut 
direkt über das Internet. Wenn man ein paar Euro zur Verfügung hat, kann 
man auch einen GPS-Empfänger verwenden und PPS mit einem entsprechenden 
GPIO-Pin verbinden, so dass man das als PPS-Eingangsgerät verwenden 
kann. (keinesfalls versuchen die Sekunde per UART zu lesen!)

Von den billigen Hüllkurven DCF77-Empfängern würde ich abraten, die sind 
weniger genau als wenn man sich die Zeit aus dem Internet holt.

von Axel G. (axelg) Benutzerseite


Lesenswert?

Wenn bei dir ein debian 12 (bookworm) läuft, solltest du den systemd 
Dienst verwenden.

systemctl status systemd-timesyncd.service

Falls nicht vorhanden
apt-get install systemd-timesyncd

Für die Konfiguration schaust du in:
/etc/systemd/timesyncd.conf

von Bauform B. (bauformb)


Lesenswert?

Christian B. schrieb:
> keinesfalls versuchen die Sekunde per UART zu lesen!

Weil? Es könnte ja funktionieren? Alles eine Frage der Filter, und das 
kann der originale ntpd ziemlich gut. Zum Vergleich Internet und 
ublox-6, auf dem Schreibtisch, per USB-UART:
1
     remote           refid    st t when poll reach  delay  offset jitter
2
=========================================================================
3
+212.18.3.19     212.18.1.106   2 u  187  256  377   4.695  -1.912  0.814
4
-90.187.112.137  237.17.204.95  2 u   29  256  377  21.408  -3.048  2.863
5
-144.91.116.85   79.133.44.146  2 u  141  256  377  13.571  -3.284  6.628
6
+78.47.56.71     17.253.14.253  2 u   82  256  377   7.497  -2.126  0.470
7
 192.9.200.43    (loop)         3 u   20   64  377   0.187  -1.426  0.233
8
*127.127.20.0    .GPS0.         1 l   38   64  377   0.000  -0.012  0.547

Axel G. schrieb:
> systemctl status systemd-timesyncd.service
> Falls nicht vorhanden

Freuen ;) Und ntpsec installieren.

von Motopick (motopick)


Lesenswert?

Christian B. schrieb:

> ... Wenn man ein paar Euro zur Verfügung hat, kann
> man auch einen GPS-Empfänger verwenden und PPS mit einem entsprechenden
> GPIO-Pin verbinden, so dass man das als PPS-Eingangsgerät verwenden
> kann. (keinesfalls versuchen die Sekunde per UART zu lesen!)

Man sollte vor der Verwendung des PPS-Ausgangs zumindest einmal
die Plausibilitaet des Signals pruefen. Ich habe hier ein GPS-Modul,
dessen PPS-Ausgang mit Werten bis zu 100 µs jittert. :)
Das UART Telegramm wurd bei dem wohl auch nicht besser sein.

> Von den billigen Hüllkurven DCF77-Empfängern würde ich abraten, die sind
> weniger genau als wenn man sich die Zeit aus dem Internet holt.

Es gibt auch bessere, die ueber einen laengeren Zeitraum per
Korrelation zu einer genaueren Schaetzung kommen. In Zeiten von
G.P.S. lohnt sich der Aufwand aber nicht mehr wirklich.

Jeder kann sich heute fuer wenige Euro einen
> ublox
ins Haus holen. Ein Platz am, oder noch besser vor dem Fenster,
sollte man ihm aber schon goennen.

von Rainer W. (rawi)


Lesenswert?

Motopick schrieb:
> Ich habe hier ein GPS-Modul,
> dessen PPS-Ausgang mit Werten bis zu 100 µs jittert. :)

Der 1PPS Ausgang liefert, wie der Name schon sagt, nur einen Puls pro 
Sekunde und dessen Jitter sollte unter 100 Nanosekunden liegen.

Was meinst du mit "Werten"?

Motopick schrieb:
> Das UART Telegramm wurd bei dem wohl auch nicht besser sein.

Der Zeitpunkt zu dem das UART Telegramm kommt (welches), ist 
"irgendwann". Für Synchronisation im Sub-Sekundenbereich ist das 
ungeeignet, i.e. nicht spezififiert.
100us entspricht bei üblichen 9600Bd etwa der Bitdauer der seriellen 
Übertragung.

: Bearbeitet durch User
von Axel G. (axelg) Benutzerseite


Lesenswert?

Bauform B. schrieb:
> Axel G. schrieb:
>> systemctl status systemd-timesyncd.service
>> Falls nicht vorhanden
>
> Freuen ;) Und ntpsec installieren.

Wenn man gerne bastelt, ja.
Debian Standard ist seit bookworm der systemd Dienst.

Benötigt man über die systemd Statusausgabe hinaus noch mehr 
Informationen:
1
root@v7:~# timedatectl timesync-status
2
       Server: 2a01:4f8:200:1307::10 (2.debian.pool.ntp.org)
3
Poll interval: 17min 4s (min: 32s; max 34min 8s)
4
         Leap: normal
5
      Version: 4
6
      Stratum: 2
7
    Reference: E8E39FE7
8
    Precision: 4us (-18)
9
Root distance: 4.196ms (max: 5s)
10
       Offset: +8.308ms
11
        Delay: 2.762ms
12
       Jitter: 3.236ms
13
 Packet count: 6
14
    Frequency: +26,717ppm

von Peter N. (mikronix)


Lesenswert?

Wenn du die aktuelle Zeit aus der FritzBox holen möchtest, schau mal ob 
dieses bash-script funktioniert:

https://github.com/jhubig/FritzBoxShell

Falls ja, kannst die sie so auslesen (zB Änderung in der Funktion 
Deviceinfo):
1
location="/upnp/control/time"
2
uri="urn:dslforum-org:service:Time:1"
3
action='GetInfo'
4
readout | awk -F "[T+]" '/NewCurrentLocalTime/{print $3}'
und setzen mit: hwclock

von Bauform B. (bauformb)


Lesenswert?

Peter N. schrieb:
> https://github.com/jhubig/FritzBoxShell

Was es nicht alles gibt, vielen Dank für den Link!

Aber rein für die Uhrzeit scheint es mir ein wenig übertrieben, 
verglichen mit "/sbin/rdate -pnv 192.168.178.1". Ja, "FRITZ!Box als 
Zeitserver im Heimnetz bereitstellen" muss angekreuzt sein (Heimnetz -> 
Netzwerk -> Netzwerkeinstellungen).

von Mario M. (thelonging)


Lesenswert?

Peter N. schrieb:
> dieses bash-script

Uff. Dann lieber, wie es der TO wollte, in Python:

https://www.mattcrampton.com/blog/query_an_ntp_server_from_python/

von Stephan S. (uxdx)


Lesenswert?

sMario M. schrieb:
> https://www.mattcrampton.com/blog/query_an_ntp_server_from_python/

Na da würde ich in Python lieber ntplib verwenden
1
sudo apt install python3-ntplib

edit: habe ich gerade auf meinem Rechner gefunden (stammt nicht von mir)
1
#!/bin/python3
2
3
import ntplib
4
from datetime import datetime, timezone
5
c = ntplib.NTPClient()
6
# Provide the respective ntp server ip in below function
7
response = c.request('de.pool.ntp.org', version=3)
8
response.offset
9
print (datetime.fromtimestamp(response.tx_time, timezone.utc))

: Bearbeitet durch User
von Peter N. (mikronix)


Lesenswert?

Bauform B. schrieb:
> Aber rein für die Uhrzeit scheint es mir ein wenig übertrieben...
Naja, ich habe die Aussage:

„Der Raspi hängt an einer Fritzbox, die die richtige Zeit natürlich 
kennt”

so verstanden, dass die Zeit aus der FritzBox geholt werden soll, also 
händische Aktualisierung per hwclock und nicht als Zeitserver oder mit 
ntp (macht die FB selber).

Gut, nur für die Uhrzeit ists ein wenig übertrieben, das script bietet 
aber soviel mehr...

Anrufliste, FB Reboot, akt. IP, Wlan Ein/Aus...

von Bauform B. (bauformb)


Lesenswert?

Peter N. schrieb:
> Gut, nur für die Uhrzeit ists ein wenig übertrieben, das script bietet
> aber soviel mehr...
>
> Anrufliste, FB Reboot, akt. IP, Wlan Ein/Aus...

Dafür gibt es auch ein großes Lob!

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.