Inhaltsverzeichnis

Zeitsynchronisation Mit DCF-77 Empfänger

Die Zeit kann über einen DCF-77 Empfänger von der Atomuhr aus Meinberg bei Frankfurt geholt werden.

Der Empfänger selbst kann entweder fertig gekauft oder mit Elektronikteilen von Conrad selbst gebaut werden.
Mein Gebauter Empfänger hat zwei LEDs. Die rote zeigt an dass die Stromversorgung, über USB, da ist.
Die Grüne LED blinkt im Sekundentakt wenn ein Signal der Atomuhr vorhanden ist.

Conrad Stückliste

PC-Funkuhrmodul Teileliste mit Conrad-Artikelnr.

Anzahl Beschreibung Artikel-Nr Preis/Stck Preis ges.
1 DCF77-Modul von Conrad-Elektronik 641138 10,21 10,21
1 RS-232 Buchse, Sub-D 9-polig 742082-62 0,52 0,52
1 passende Haube dazu 716028-62 1,25 1,25
1 IC MAX232 152295-62 1,47 1,47
2 Dioden 1N4148 162280-62 0,04 0,08
1 Z-Diode 5,1 Volt 160276-62 0,3 0,3
1 LEDs Low Current (2mA) rot 146005-62 0,19 0,19
1 LEDs Low Current (2mA) grün 146030-62 0,19 0,19
1 Widerstand 1 kΩ 405256-62 0,09 0,09
2 Widerstände 4,7 kΩ 405337-62 0,09 0,18
5 Kondensatoren Tantal (Elkos gehen auch) 10 μF / 35V 472484-62 0,18 0,9
1 Elektrolytkondensator 100 μF / 35V 472514-62 0,21 0,21
1 Folienkondensator 100nF 459977-62 0,45 0,45
1 Lochrasterplatine 528404-62 0,63 0,63
1 Gehäuse 520521-62 2,71 2,71
Gesamt Preise 18,53 19,38

Schaltung

Dazugehörige Schaltung:

dcf-77_max232.png

Software

Unter Linux kann mit dem NTP Daemon die Zeit des Funkuhrmoduls empfangen und konvertiert werden.

NTP

Folgende Softwarepakete müssen installiert werden:

apt-get install ntp ntpdate refclock

In der /etc/ntp.conf dann noch die folgenden Zeilen anpassen:

# /etc/ntp.conf, configuration for ntpd; see ntp.conf(5) for help
 
driftfile /var/lib/ntp/ntp.drift
logfile /var/log/ntp.log
 
# Enable this if you want statistics to be logged.
statsdir /var/log/ntpstats/
 
statistics loopstats peerstats clockstats
filegen loopstats file loopstats type day enable
filegen peerstats file peerstats type day enable
filegen clockstats file clockstats type day enable
 
 
# You do need to talk to an NTP server or two (or three).
#server ntp.ubuntu.com
server 127.127.8.0 mode 5 prefer
server 127.127.1.0
fudge 127.127.1.0 stratum 10
 
# Access control configuration; see /usr/share/doc/ntp-doc/html/accopt.html for
# details.  The web page <http://support.ntp.org/bin/view/Support/AccessRestrictions>
# might also be helpful.
#
# Note that "restrict" applies to both servers and clients, so a configuration
# that might be intended to block requests from certain clients could also end
# up blocking replies from your own upstream servers.
 
# By default, exchange time with everybody, but don't allow configuration.
restrict -4 default kod notrap nomodify nopeer noquery
restrict -6 default kod notrap nomodify nopeer noquery
 
# Local users may interrogate the ntp server more closely.
restrict 127.0.0.1
restrict ::1
# Clients from this (example!) subnet have unlimited access, but only if
# cryptographically authenticated.
#restrict 192.168.123.0 mask 255.255.255.0 notrust
 
 
# If you want to provide time to your local subnet, change the next line.
# (Again, the address is an example only.)
#broadcast 192.168.123.255
 
# If you want to listen to time broadcasts on your local subnet, de-comment the
 
# next lines.  Please do this only if you trust everybody on the network!
#disable auth
#broadcastclient

Udev Rules

Damit der Eintrag server 127.127.8.0 mode 5 prefer auch funktioniert, muss ein Link auf /dev/ttyS0 (COM-Port 1) gesetzt werden.

ln -s /dev/ttyS0 /dev/refclock-0

Dieser Link sollte auch nach einem Reboot noch da sein. Dies ist er aber nicht wenn wir nicht die UDEV-Rules bearbeiten:
Also die Datei (evtl. noch nicht vorhanden) /etc/udev/ruldes.d/75-refclock.rules öffnen und folgende Zeile einfügen:

KERNEL=="ttyS0",SYMLINK+="refclock-0",MODE="0777"

Apparmor

Zitat Wikipedia
AppArmor (Application Armor, auf deutsch etwa Programm-Schutz/Rüstung) ist eine freie Sicherheitssoftware für Linux, mit der Programmen einzeln bestimmte Rechte zugeteilt oder entzogen werden können. Es ist eine Erweiterung für Linux, die Mandatory Access Control (MAC) implementiert.

Damit AppArmor nun den Zugriff auf refclock-0 also auf ttyS0 nicht blockiert, obwohl in den UDEV-Rules steht MODE=„0777“, muss
dass Profil des AppArmor für den NTP-Daemon angepasst werden.
Dafür fügt man am Ende (vor der geschweiften Klammer) in die Datei /etc/apparmor.d/usr.sbin.ntpd folgendes hinzu:

/dev/ttyS0 rwl,
/dev/refclock-0 rwl,

Test

Nun kann der NTP-Daemon mit dem Befehl service ntp restart neugestartet werden.

Unter /var/log findet man den Statistikordner ntpstats und die Datei ntp.log.
Im Verzeichniss /var/lib/ntp/ findet man die Datei ntp.drift.

NTP-Stats

Im Statistikverzeichniss befinden sich die loop und peer Statistiken

NTP-Drift

Im Libverzeichniss kann man mit der Driftdatei schauen wie die lokale Zeit vom Empfängermodul abdriftet.

NTP-Log

Im Logverzeichniss sieht man in der Logdatei was der NTP-Daemon gemacht hat.

Hier eine Ausgabe:

11 May 09:24:00 ntpd[2162]: ntpd exiting on signal 15
11 May 09:24:55 ntpd[2297]: parse: convert_rawdcf: INCOMPLETE DATA - time code only has 51 bits

11 May 09:24:55 ntpd[2297]: PARSE receiver #0: interval for following error message class is at least 00:01:00
11 May 09:24:55 ntpd[2297]: PARSE receiver #0: FAILED TIMECODE: "----#----#--#-#R--M-S1--8---P---8--P-2-8------2---" (check receiver configuration / wiring)
11 May 09:25:58 ntpd[2297]: synchronized to GENERIC(0), stratum 0
11 May 09:27:03 ntpd[2297]: time reset +64.490872 s
11 May 09:27:03 ntpd[2297]: kernel time sync status change 2001
11 May 09:27:04 ntpd[2297]: parse: convert_rawdcf: INCOMPLETE DATA - time code only has 4 bits

11 May 09:27:04 ntpd[2297]: PARSE receiver #0: interval for following error message class is at least 00:01:00
11 May 09:27:04 ntpd[2297]: PARSE receiver #0: FAILED TIMECODE: "--#" (check receiver configuration / wiring)
11 May 09:28:00 ntpd[2297]: parse: convert_rawdcf: INCOMPLETE DATA - time code only has 55 bits

11 May 09:29:03 ntpd[2297]: synchronized to GENERIC(0), stratum 0

Man sieht dass in der 1. Zeile der Neustart des Daemon angezeigt wird.
Danach erhält der NTP die Signale des Empfängers.
Das INCOMPLETE DATA ist soweit ok, denn das Funkuhrmodul bracht ca. 1 Minute bis es die korrekte Zeit liefert.
Zum Schluss sieht man das die Zeit synchronisiert wurde.

Man kann mit dem Befehl date kontrollieren ob die richtige Zeit im System vorhanden ist.

timesyncd

Quelle: https://wiki.archlinux.org/title/systemd-timesyncd

Timesyncd ist ein anderer Zeitdienst-Daemon unter Linux.

Zeitserver
Der Zeitserver wird in dieser Datei Konfiguriert /etc/systemd/timesyncd.conf.

[Time]
#NTP= ntp1.domain.tld ntp2.domain.tld ...
#FallbackNTP=ntp3.domain.tld ntp4.domain.tld ...
#RootDistanceMaxSec=5
#PollIntervalMinSec=32
#PollIntervalMaxSec=2048

Gestartet wird Timesync mit dem Befehl systemctl start systemd-timesyncd.service, oder einfach einschalten per timedatectl set-ntp true

Diese Befehle zeigen die aktuellen Einstellungen und Laufzeitdaten:

timedatectl show-timesync --all
timedatectl status ntpq -p
timedatectl timesync-status

timedatectl besitzt aktuell keinen Parameter zum erzwingen der Synchronisierung der Uhrzeit.
Wenn timesyncd lange braucht um sich zu synchronisieren, kann man den NTP-Dienst deaktivieren und erneut aktivieren um dies zu beschleunigen.

timedatectl set-net false
timedatectl set-net true

Zeitzone
Die Zeitzone wird mit folgendem Befehl konfiguriert.

timedatectl set-timezone <ZEITZONE>

So listet man verfügbare Zeitzonen auf

timedatectl list-timezones

NTP Commands

ntpq -p
ntpq -c rv

LEAP

Quelle: https://www.eecis.udel.edu/~mills/ntp/html/decode.html
Folgende Leap-Codes gibt es.

Code Message Description
0 leap_none normal synchronized state
1 leap_add_sec insert second after 23:59:59 of the current day
2 leap_del_sec delete second 23:59:59 of the current day
3 leap_alarm never synchronized