Niedrig-/Hochpraezision der Montierung + IP eingetragen

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) <noreply@anthropic.com>
This commit is contained in:
2026-07-18 23:07:22 +02:00
parent 4cb8ea32d5
commit d8a9953b73
5 changed files with 73 additions and 18 deletions
+21
View File
@@ -127,6 +127,27 @@ diese Zelle überschreibt.
`CHARS_PER_LINE` aufgefüllt werden, sonst bricht das Füll-Leerzeichen um und `CHARS_PER_LINE` aufgefüllt werden, sonst bricht das Füll-Leerzeichen um und
beschädigt die andere Zeile. 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 ## Helligkeitsregelung
Portiert aus dem alten MSP430-Programm (`DoDimmen_V`, Werte aus `main.h`). Ein Portiert aus dem alten MSP430-Programm (`DoDimmen_V`, Werte aus `main.h`). Ein
+8 -1
View File
@@ -52,10 +52,17 @@ DEGREE_FALLBACK = "d" # Ersatz, falls DEGREE_CHARSET = None
# -- Montierung (Phase 2) ------------------------------------------------- # -- Montierung (Phase 2) -------------------------------------------------
# 10Micron GM4000 HPS II: LX200-Protokoll ueber TCP. Die IP der Montierung # 10Micron GM4000 HPS II: LX200-Protokoll ueber TCP. Die IP der Montierung
# eintragen, sobald sie erreichbar ist; Port 3490 ist die Vorgabe von 10Micron. # 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_PORT = 3490
MOUNT_TIMEOUT = 3.0 # Sekunden fuer Verbindung/Antwort MOUNT_TIMEOUT = 3.0 # Sekunden fuer Verbindung/Antwort
POLL_INTERVAL = 1.0 # Sekunden zwischen zwei Koordinatenabfragen 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. # Anzeige, wenn die Montierung (noch) nicht erreichbar ist.
NOLINK_LINES = ("KEIN LINK", "MONTIERUNG") NOLINK_LINES = ("KEIN LINK", "MONTIERUNG")
+22 -5
View File
@@ -75,7 +75,15 @@ def _fit(candidates, width):
return candidates[-1][: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 width = config.CHARS_PER_LINE if width is None else width
h, m, s = parse_ra(value) h, m, s = parse_ra(value)
return _fit([ return _fit([
@@ -85,14 +93,23 @@ def format_ra(value, width=None):
], width) ], 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 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) sign, d, m, s = parse_dec(value)
deg = config.DEGREE_MARKER deg = config.DEGREE_MARKER
return _fit([ 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), # 10: mit Bogensekundenzeichen
"%s%02d%s%02d'%02d" % (sign, d, deg, m, s), # 9: Gradzeichen, ohne " am Ende "%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:%02d:%02d" % (sign, d, m, s), # 9: Doppelpunkte
"%s%02d%s%02d'" % (sign, d, deg, m), # 7: ohne Bogensekunden "%s%02d%s%02d'" % (sign, d, deg, m), # 7: ohne Bogensekunden
"%s%02d:%02d" % (sign, d, m), # 6 "%s%02d:%02d" % (sign, d, m), # 6
], width) ]
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)
+2 -2
View File
@@ -80,8 +80,8 @@ class TestClientGegenMock(unittest.TestCase):
def test_get_coordinates_und_formatierung(self): def test_get_coordinates_und_formatierung(self):
ra_raw, dec_raw = self.client.get_coordinates() ra_raw, dec_raw = self.client.get_coordinates()
self.assertEqual(coords.format_ra(ra_raw), "18h36m56s") self.assertEqual(coords.format_ra(ra_raw, high_precision=True), "18h36m56s")
self.assertEqual(coords.format_dec(dec_raw), "+38°47'01") # 9 Zeichen, ohne " am Ende self.assertEqual(coords.format_dec(dec_raw, high_precision=True), "+38°47'01")
def test_produktname(self): def test_produktname(self):
self.assertEqual(self.client.query(lx200.GET_PRODUCT), mount_mock.PRODUCT) self.assertEqual(self.client.query(lx200.GET_PRODUCT), mount_mock.PRODUCT)
+16 -6
View File
@@ -126,12 +126,22 @@ class TestKoordinaten(unittest.TestCase):
with self.assertRaises(ValueError): with self.assertRaises(ValueError):
coords.parse_dec("+91:00:00") coords.parse_dec("+91:00:00")
def test_formatierung_passt_sich_der_breite_an(self): def test_formatierung_hochpraezision(self):
self.assertEqual(coords.format_ra("12h34m56s", width=9), "12h34m56s") hp = dict(high_precision=True)
self.assertEqual(coords.format_ra("12h34m56s", width=8), "12:34:56") self.assertEqual(coords.format_ra("12h34m56s", width=9, **hp), "12h34m56s")
self.assertEqual(coords.format_dec("+45d12m30s", width=10), "+45°12'30\"") self.assertEqual(coords.format_ra("12h34m56s", width=8, **hp), "12:34:56")
self.assertEqual(coords.format_dec("+45d12m30s", width=9), "+45°12'30") # 9: Grad, ohne " self.assertEqual(coords.format_dec("+45d12m30s", width=10, **hp), "+45°12'30\"")
self.assertEqual(coords.format_dec("+45d12m30s", width=7), "+45°12'") # 7: ohne Bogensekunden 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): class TestDisplay(unittest.TestCase):