From d8a9953b73b1ac11562365d28f618a64de137a7c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Reinhard=20X=2E=20F=C3=BCrst?= Date: Sat, 18 Jul 2026 23:07:22 +0200 Subject: [PATCH] Niedrig-/Hochpraezision der Montierung + IP eingetragen MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Die GM4000 laeuft in Niedrigpraezision (keine Sekunden): RA HH:MM.T, DEC sDD°MM. Anzeige daran angepasst: - config.HIGH_PRECISION (Vorgabe False) steuert die DEC-Darstellung: False -> ohne Sekunden (-00°55'), True -> mit Sekunden (+38°47'01) - RA immer mit Sekunden (11h36m54s); bei Niedrigpraezision aus den Zehntel-Minuten abgeleitet (6-Sekunden-Schritte), kein Dezimalpunkt (der wirkt in der Sperrschrift zu luftig) - coords.format_ra/format_dec nehmen high_precision= - MOUNT_HOST auf die echte IP (192.168.1.115) Hinweis: Das 'ß' in der Konsole ist nur der Rohwert (Grad-Byte 0xDF); auf der Anzeige erscheint korrekt der Gradring. Co-Authored-By: Claude Opus 4.8 (1M context) --- README.md | 21 +++++++++++++++++++++ config.py | 9 ++++++++- coords.py | 35 ++++++++++++++++++++++++++--------- test_lx200.py | 4 ++-- test_migra.py | 22 ++++++++++++++++------ 5 files changed, 73 insertions(+), 18 deletions(-) diff --git a/README.md b/README.md index 72eac56..08ad200 100644 --- a/README.md +++ b/README.md @@ -127,6 +127,27 @@ diese Zelle überschreibt. `CHARS_PER_LINE` aufgefüllt werden, sonst bricht das Füll-Leerzeichen um und beschädigt die andere Zeile. +## Präzision (Low / High) + +Die GM4000 läuft standardmäßig in **Niedrigpräzision** und sendet keine Sekunden: +RA als `HH:MM.T` (Zehntel-Minuten), DEC als `sDD°MM` (ganze Bogenminuten). Das +Gradzeichen kommt als Byte `0xDF` — auf der Anzeige korrekt als Gradring dargestellt; +in der Terminal-Konsole erscheint der **Rohwert** dieses Bytes als `ß` (rein kosmetisch). + +`config.HIGH_PRECISION` steuert die DEC-Darstellung: +- `False` (Vorgabe): DEC ohne Sekunden (`-00°55'`). +- `True`: DEC mit Sekunden (`+38°47'01`) — erst sinnvoll, wenn die Montierung per + `:U#` auf Hochpräzision gestellt ist (schreibendes Kommando, hier bewusst nicht + automatisch gesendet). + +Die **RA** wird immer mit Sekunden gezeigt (`11h36m54s`); bei Niedrigpräzision +kommen die Sekunden aus den Zehntel-Minuten und springen daher in 6-Sekunden-Schritten +(kein Dezimalpunkt — der wirkt in der Sperrschrift zu luftig). + +`coords.format_ra`/`format_dec` nehmen `high_precision=` als Parameter (Vorgabe aus +`config`). Die Montierungs-Rohwerte werden im `coords`-Parser unverändert korrekt +zerlegt (Trennzeichen `:`, `*`, `0xDF`, `'` sind alle egal). + ## Helligkeitsregelung Portiert aus dem alten MSP430-Programm (`DoDimmen_V`, Werte aus `main.h`). Ein diff --git a/config.py b/config.py index c1f783a..0af0f45 100644 --- a/config.py +++ b/config.py @@ -52,10 +52,17 @@ DEGREE_FALLBACK = "d" # Ersatz, falls DEGREE_CHARSET = None # -- Montierung (Phase 2) ------------------------------------------------- # 10Micron GM4000 HPS II: LX200-Protokoll ueber TCP. Die IP der Montierung # eintragen, sobald sie erreichbar ist; Port 3490 ist die Vorgabe von 10Micron. -MOUNT_HOST = "192.168.0.50" # PLATZHALTER -- echte IP der Montierung eintragen +MOUNT_HOST = "192.168.1.115" # PLATZHALTER -- echte IP der Montierung eintragen MOUNT_PORT = 3490 MOUNT_TIMEOUT = 3.0 # Sekunden fuer Verbindung/Antwort POLL_INTERVAL = 1.0 # Sekunden zwischen zwei Koordinatenabfragen +# Koordinaten-Praezision der Montierung. +# False = Niedrigpraezision (10Micron-Standard): RA als HH:MM.T (Zehntel-Minuten), +# DEC als sDD MM (ganze Bogenminuten) -- die Montierung sendet keine Sekunden. +# Die Anzeige zeigt entsprechend RA mit Zehntel-Minute und DEC ohne Sekunden. +# True = Hochpraezision (Montierung mit ":U#" umgestellt): RA/DEC mit Sekunden. +HIGH_PRECISION = False + # Anzeige, wenn die Montierung (noch) nicht erreichbar ist. NOLINK_LINES = ("KEIN LINK", "MONTIERUNG") diff --git a/coords.py b/coords.py index 8f52ae3..5d7da00 100644 --- a/coords.py +++ b/coords.py @@ -75,7 +75,15 @@ def _fit(candidates, width): return candidates[-1][:width] -def format_ra(value, width=None): +def format_ra(value, width=None, high_precision=None): + """Rektaszension formatieren, immer mit Sekunden (HHhMMmSSs). + + Bei Niedrigpraezision liefert die Montierung nur Zehntel-Minuten; die + Sekunden kommen dann in 6-Sekunden-Schritten. Das Format ist dasselbe wie + bei Hochpraezision -- der Unterschied steckt allein in der Aufloesung der + Rohdaten, nicht in der Darstellung. high_precision wird daher fuer RA nicht + ausgewertet (nur bei DEC relevant, siehe format_dec). + """ width = config.CHARS_PER_LINE if width is None else width h, m, s = parse_ra(value) return _fit([ @@ -85,14 +93,23 @@ def format_ra(value, width=None): ], width) -def format_dec(value, width=None): +def format_dec(value, width=None, high_precision=None): width = config.CHARS_PER_LINE if width is None else width + high = config.HIGH_PRECISION if high_precision is None else high_precision sign, d, m, s = parse_dec(value) deg = config.DEGREE_MARKER - return _fit([ - "%s%02d%s%02d'%02d\"" % (sign, d, deg, m, s), # 10: mit Bogensekundenzeichen - "%s%02d%s%02d'%02d" % (sign, d, deg, m, s), # 9: Gradzeichen, ohne " am Ende - "%s%02d:%02d:%02d" % (sign, d, m, s), # 9: Doppelpunkte, kein Gradzeichen - "%s%02d%s%02d'" % (sign, d, deg, m), # 7: ohne Bogensekunden - "%s%02d:%02d" % (sign, d, m), # 6 - ], width) + if high: + candidates = [ + "%s%02d%s%02d'%02d\"" % (sign, d, deg, m, s), # 10: mit Bogensekundenzeichen + "%s%02d%s%02d'%02d" % (sign, d, deg, m, s), # 9: Gradzeichen, ohne " am Ende + "%s%02d:%02d:%02d" % (sign, d, m, s), # 9: Doppelpunkte + "%s%02d%s%02d'" % (sign, d, deg, m), # 7: ohne Bogensekunden + "%s%02d:%02d" % (sign, d, m), # 6 + ] + else: + # Niedrigpraezision: ohne Sekunden (die Montierung liefert nur sDD MM). + candidates = [ + "%s%02d%s%02d'" % (sign, d, deg, m), # 7: -00°55' + "%s%02d:%02d" % (sign, d, m), # 6: -00:55 + ] + return _fit(candidates, width) diff --git a/test_lx200.py b/test_lx200.py index 01887e7..c3d7652 100644 --- a/test_lx200.py +++ b/test_lx200.py @@ -80,8 +80,8 @@ class TestClientGegenMock(unittest.TestCase): def test_get_coordinates_und_formatierung(self): ra_raw, dec_raw = self.client.get_coordinates() - self.assertEqual(coords.format_ra(ra_raw), "18h36m56s") - self.assertEqual(coords.format_dec(dec_raw), "+38°47'01") # 9 Zeichen, ohne " am Ende + self.assertEqual(coords.format_ra(ra_raw, high_precision=True), "18h36m56s") + self.assertEqual(coords.format_dec(dec_raw, high_precision=True), "+38°47'01") def test_produktname(self): self.assertEqual(self.client.query(lx200.GET_PRODUCT), mount_mock.PRODUCT) diff --git a/test_migra.py b/test_migra.py index 7444219..a1ed52a 100644 --- a/test_migra.py +++ b/test_migra.py @@ -126,12 +126,22 @@ class TestKoordinaten(unittest.TestCase): with self.assertRaises(ValueError): coords.parse_dec("+91:00:00") - def test_formatierung_passt_sich_der_breite_an(self): - self.assertEqual(coords.format_ra("12h34m56s", width=9), "12h34m56s") - self.assertEqual(coords.format_ra("12h34m56s", width=8), "12:34:56") - self.assertEqual(coords.format_dec("+45d12m30s", width=10), "+45°12'30\"") - self.assertEqual(coords.format_dec("+45d12m30s", width=9), "+45°12'30") # 9: Grad, ohne " - self.assertEqual(coords.format_dec("+45d12m30s", width=7), "+45°12'") # 7: ohne Bogensekunden + def test_formatierung_hochpraezision(self): + hp = dict(high_precision=True) + self.assertEqual(coords.format_ra("12h34m56s", width=9, **hp), "12h34m56s") + self.assertEqual(coords.format_ra("12h34m56s", width=8, **hp), "12:34:56") + self.assertEqual(coords.format_dec("+45d12m30s", width=10, **hp), "+45°12'30\"") + self.assertEqual(coords.format_dec("+45d12m30s", width=9, **hp), "+45°12'30") + self.assertEqual(coords.format_dec("+45d12m30s", width=7, **hp), "+45°12'") + + def test_formatierung_niedrigpraezision(self): + lp = dict(high_precision=False) + # RA: Zehntel-Minute (0.9 min) kommt als Sekunden (54 s) heraus + self.assertEqual(coords.format_ra("11:36.9", width=9, **lp), "11h36m54s") + self.assertEqual(coords.format_ra("11:36.9", width=6, **lp), "11h36m") + # DEC: ohne Sekunden + self.assertEqual(coords.format_dec("-00°55", width=9, **lp), "-00°55'") + self.assertEqual(coords.format_dec("-00°55", width=6, **lp), "-00:55") class TestDisplay(unittest.TestCase):