Zum Inhalt

stsobj

Objektklassen für die Stellwerksim Pluginschnittstelle

Dieses Modul deklariert das Datenmodell des Pluginklienten (stsplugin-Modul). Die Gliederung entspricht weitgehend der Struktur der xml-Daten von der Schnittstelle. Für jedes Tag gibt es eine Klasse mit den Tag-Attributen. Die Tag- und Attributnamen sind ähnlich wie im xml-Protokoll, es gibt aber Abweichungen. Die Daten werden in Python-Typen übersetzt. Einige der Klassen haben noch zusätzliche Attribute, die vom Klienten ausgefüllt werden.

Alle Objekte werden leer konstruiert und über die update-Methode mit Daten gefüllt. Die update-Methoden erwarten geparste xml-Daten in einem untangle.Element-Objekt.

Classes:

Functions:

AnlagenInfo

AnlagenInfo()

Anlageninformationen.

Diese Klasse entspricht dem xml-Tag "anlageninfo".

Methods:

  • update

    Attribute vom xml-Dokument übernehmen.

Source code in stskit/plugin/stsobj.py
def __init__(self):
    super().__init__()
    self.aid: int = 0
    self.name: str = ""
    self.build: int = 0
    self.region: str = ""
    self.online: bool = False

update

update(item: Mapping) -> AnlagenInfo

Attribute vom xml-Dokument übernehmen.

Parameters:

  • item

    (Mapping) –

    Dictionary mit den Attributen aus dem xml-Tag.

Returns:

Source code in stskit/plugin/stsobj.py
def update(self, item: Mapping) -> AnlagenInfo:
    """
    Attribute vom xml-Dokument übernehmen.

    Args:
        item: Dictionary mit den Attributen aus dem xml-Tag.

    Returns:
        AnlagenInfo-Objekt
    """
    self.aid = int(item['aid'])
    self.name = str(item['name']).strip()
    self.build = int(item['simbuild'])
    self.region = item['region']
    self.online = str(item['online']).lower() == 'true'
    return self

BahnsteigInfo

BahnsteigInfo()

Bahnsteiginformationen.

Diese Klasse entspricht dem xml-Tag "bahnsteiginfo" mit Ergänzungen.

Im Dictionary zuege, führt der PluginClient die Züge, die den Bahnsteig in ihrem Fahrplan haben (disponiertes Gleis).

Die Namen der Nachbarbahnsteige werden in nachbar_namen gespeichert. Der PluglinClient löst die Namen in Objekte auf und speichert sie in nachbarn.

Methods:

  • update

    Attribute vom xml-Dokument übernehmen.

Source code in stskit/plugin/stsobj.py
def __init__(self):
    super().__init__()
    self.name: str = ""
    self.haltepunkt: bool = False
    self.nachbarn_namen: list[str] = []
    self.nachbarn: weakref.WeakValueDictionary[str, BahnsteigInfo] = weakref.WeakValueDictionary()
    self.zuege: weakref.WeakValueDictionary[int, ZugDetails] = weakref.WeakValueDictionary()

update

update(item: Element) -> BahnsteigInfo

Attribute vom xml-Dokument übernehmen.

Die Namen der Nachbarbahnsteige werden in nachbarn_namen gespeichert. Die nachbarn und zuege Attribute sind möglicherweise veraltet.

Parameters:

  • item

    (Element) –

    Dictionary mit den Attributen aus dem xml-Tag.

Returns:

Source code in stskit/plugin/stsobj.py
def update(self, item: untangle.Element) -> BahnsteigInfo:
    """
    Attribute vom xml-Dokument übernehmen.

    Die Namen der Nachbarbahnsteige werden in `nachbarn_namen` gespeichert.
    Die `nachbarn` und `zuege` Attribute sind möglicherweise veraltet.

    Args:
        item: Dictionary mit den Attributen aus dem xml-Tag.

    Returns:
        Self
    """

    self.name = str(item['name']).strip()
    self.haltepunkt = str(item['haltepunkt']).lower() == 'true'
    try:
        self.nachbarn_namen = sorted([str(n['name']).strip() for n in item.n])
    except AttributeError:
        self.nachbarn_namen = []

    return self

Ereignis

Ereignis()

              flowchart TD
              stskit.plugin.stsobj.Ereignis[Ereignis]
              stskit.plugin.stsobj.ZugDetails[ZugDetails]

                              stskit.plugin.stsobj.ZugDetails --> stskit.plugin.stsobj.Ereignis
                


              click stskit.plugin.stsobj.Ereignis href "" "stskit.plugin.stsobj.Ereignis"
              click stskit.plugin.stsobj.ZugDetails href "" "stskit.plugin.stsobj.ZugDetails"
            

Ereignis der Pluginschnittstelle

Ein Ereignis-Tag von der Pluginschnittstelle sieht z.B. so aus:

<ereignis zid='1' art='einfahrt' name='RE 10' verspaetung='+2' gleis='1' plangleis='1'
von='A-Stadt' nach='B-Hausen' sichtbar='true' amgleis='true' />

Der Tag enthält dieselben Daten wie ein Zugdetails-Tag und zusätzlich die Art des Ereignisses. Die Zeit wird vom PluginClient gesetzt.

Zusätzlich zu den von der Pluginschnittstelle gemeldeten Ereignissen (in Ereignis.arten), erzeugt der PluginClient ein Ereignis 'ersatz', wenn ein Zug durch Ersatz (Nummernwechsel) unsichtbar wird. Der Zugdetailsinhalt entspricht in diesem Fall dem letzten Ankunftsereignis, wobei sichtbar = False.

Methods:

  • __eq__

    Gleichheit zweier Ereignisse

  • __hash__

    hash-Funktion basierend auf Gleichheitsklasse.

  • find_fahrplan

    Index und Fahrplanzeile nach Gleis und/oder Zeit suchen

  • find_fahrplan_index

    Fahrplanzeilenindex nach Gleis und/oder Zeit suchen

  • find_fahrplanzeile

    Fahrplanzeile nach Gleis und/oder Zeit suchen.

  • graph

    Fahrplan im networkx directed Graph Format

  • route

    Route (Reihe von Stationen) des Zuges als Generator

  • update

    Attributwerte vom xml-Dokument übernehmen.

Attributes:

Source code in stskit/plugin/stsobj.py
def __init__(self):
    super().__init__()
    self.art: str = ""
    self.zeit: datetime.datetime = datetime.datetime.fromordinal(1)

gattung property

gattung: str | None

Zuggattung aus dem Zugnamen.

Die Zuggattung ist der alphabetische Präfix aus dem Zugnamen, z.b "ICE". Für eine spätere Version ist geplant, die Gattung anhand der Region und Zugnummer zu bestimmen, wo der präfix fehlt.

Returns:

  • str | None

    Zuggattung. None, wenn keine Gattung bestimmt werden kann.

ist_rangierfahrt property

ist_rangierfahrt: bool

Rangierfahrt anzeigen.

Als Rangierfahrten gelten Züge, die den Zusatz Lok, Ersatzlok oder RF im Namen tragen.

Returns:

  • bool

    True, wenn der Zug eine Rangierfahrt darstellt.

nummer property

nummer: int

Zugnummer aus dem Zugnamen.

Die Nummer ist der hinterste rein numerische Teil des Zugnamens, z.b. 8376 in "S8 8376 RF" Diese hat nichts mit der Zug-ID zu tun.

Beispiele von Zugnummern: - "536": 536 - "ICE 624": 624 - "S8 8376 RF": 8376 - "S 8449 S12": 8449

Returns:

  • int

    Zugnummer. 0, falls der Name keine Ziffer enthält.

__eq__

__eq__(other: Ereignis) -> bool

Gleichheit zweier Ereignisse

Ereignisse werden als gleich erachtet, wenn art, zid und gleis gleich sind. Dies kann dazu benutzt werden, wiederholte Ereignismeldungen zu filtern. (Die Pluginschnittstelle schickt gewisse ereignismeldungen wie rothalt und abfahrt wiederholt.)

Source code in stskit/plugin/stsobj.py
def __eq__(self, other: Ereignis) -> bool:
    """
    Gleichheit zweier Ereignisse

    Ereignisse werden als gleich erachtet, wenn art, zid und gleis gleich sind.
    Dies kann dazu benutzt werden, wiederholte Ereignismeldungen zu filtern.
    (Die Pluginschnittstelle schickt gewisse ereignismeldungen wie rothalt und abfahrt wiederholt.)
    """
    return self.art == other.art and self.zid == other.zid and self.gleis == other.gleis

__hash__

__hash__() -> int

hash-Funktion basierend auf Gleichheitsklasse.

Ereignisse werden als gleich erachtet, wenn art, zid und gleis gleich sind. Für solchermassen "gleiche" Ereignisse generiert diese Funktion den gleichen hash-Wert. Dies kann dazu benutzt werden, wiederholte Ereignismeldungen zu filtern. (Die Pluginschnittstelle schickt gewisse ereignismeldungen wie rothalt und abfahrt wiederholt.)

Source code in stskit/plugin/stsobj.py
def __hash__(self) -> int:
    """
    hash-Funktion basierend auf Gleichheitsklasse.

    Ereignisse werden als gleich erachtet, wenn art, zid und gleis gleich sind.
    Für solchermassen "gleiche" Ereignisse generiert diese Funktion den gleichen hash-Wert.
    Dies kann dazu benutzt werden, wiederholte Ereignismeldungen zu filtern.
    (Die Pluginschnittstelle schickt gewisse ereignismeldungen wie rothalt und abfahrt wiederholt.)
    """
    return hash((self.art, self.zid, self.gleis))

find_fahrplan

find_fahrplan(gleis: str | None = None, plan: str | None = None, zeit: time | None = None) -> tuple[int | None, FahrplanZeile | None]

Index und Fahrplanzeile nach Gleis und/oder Zeit suchen

Alle angegebenen Kriterien müssen zutreffen. Die Zeit muss grösser oder gleich der Ankunftszeit (wenn bekannt) und kleiner oder gleich der Abfahrtszeit (wenn bekannt) sein. Wenn eine der Zeiten nicht bekannt ist, wird das entsprechende Kriterium als erfüllt gewertet.

Parameters:

  • gleis

    (str | None, default: None ) –

    Gleiskriterium (Gross-/Kleinschreibung egal)

  • plan

    (str | None, default: None ) –

    Plangleiskriterium (Gross-/Kleinschreibung egal)

  • zeit

    (time | None, default: None ) –

    Zeitkriterium, wahr, wenn der Wert zwischen Ankunft und Abfahrt des Eintrags liegt

Returns:

  • int | None

    Listenindex im Fahrplan und FahrplanZeile-Objekt.

  • FahrplanZeile | None

    Beide Resultate sind None, wenn kein passender Eintrag gefunden wurde.

Source code in stskit/plugin/stsobj.py
def find_fahrplan(self,
                  gleis: str | None = None,
                  plan: str | None = None,
                  zeit: datetime.time | None = None,
                  ) -> tuple[int | None, FahrplanZeile | None]:
    """
    Index und Fahrplanzeile nach Gleis und/oder Zeit suchen

    Alle angegebenen Kriterien müssen zutreffen.
    Die Zeit muss grösser oder gleich der Ankunftszeit (wenn bekannt)
    und kleiner oder gleich der Abfahrtszeit (wenn bekannt) sein.
    Wenn eine der Zeiten nicht bekannt ist, wird das entsprechende Kriterium als erfüllt gewertet.

    Args:
        gleis: Gleiskriterium (Gross-/Kleinschreibung egal)
        plan: Plangleiskriterium (Gross-/Kleinschreibung egal)
        zeit: Zeitkriterium, wahr, wenn der Wert zwischen Ankunft und Abfahrt des Eintrags liegt

    Returns:
        Listenindex im Fahrplan und FahrplanZeile-Objekt.
        Beide Resultate sind None, wenn kein passender Eintrag gefunden wurde.
    """

    gleis = gleis.casefold() if gleis else None
    plan = plan.casefold() if plan else None

    for index, zeile in enumerate(self.fahrplan):
        if gleis and gleis != zeile.gleis.casefold():
            continue
        if plan and plan != zeile.plan.casefold():
            continue
        if zeit and zeile.an and zeit < zeile.an:
            continue
        if zeit and zeile.ab and zeit > zeile.ab:
            continue
        return index, zeile

    return None, None

find_fahrplan_index

find_fahrplan_index(gleis: str | None = None, plan: str | None = None, zeit: time | None = None) -> int | None

Fahrplanzeilenindex nach Gleis und/oder Zeit suchen

Alle angegebenen Kriterien müssen zutreffen. Die Zeit muss grösser oder gleich der Ankunftszeit (wenn bekannt) und kleiner oder gleich der Abfahrtszeit (wenn bekannt) sein. Wenn eine der Zeiten nicht bekannt ist, wird das entsprechende Kriterium als erfüllt gewertet.

Diese Methode ist ein Wrapper von find_fahrplan, der nur den Index zurückgibt.

Parameters:

  • gleis

    (str | None, default: None ) –

    Gleiskriterium (Gross-/Kleinschreibung egal)

  • plan

    (str | None, default: None ) –

    Plangleiskriterium (Gross-/Kleinschreibung egal)

  • zeit

    (time | None, default: None ) –

    Zeitkriterium, wahr, wenn der Wert zwischen Ankunft und Abfahrt des Eintrags liegt

Returns:

  • int | None

    Listenindex in Fahrplan oder None.

  • int | None

    Vorsicht, 0 ist ein gültiges Resultat!

Source code in stskit/plugin/stsobj.py
def find_fahrplan_index(self,
                        gleis: str | None = None,
                        plan: str | None = None,
                        zeit: datetime.time | None = None,
                        ) -> int | None:
    """
    Fahrplanzeilenindex nach Gleis und/oder Zeit suchen

    Alle angegebenen Kriterien müssen zutreffen.
    Die Zeit muss grösser oder gleich der Ankunftszeit (wenn bekannt)
    und kleiner oder gleich der Abfahrtszeit (wenn bekannt) sein.
    Wenn eine der Zeiten nicht bekannt ist, wird das entsprechende Kriterium als erfüllt gewertet.

    Diese Methode ist ein Wrapper von find_fahrplan, der nur den Index zurückgibt.

    Args:
        gleis: Gleiskriterium (Gross-/Kleinschreibung egal)
        plan: Plangleiskriterium (Gross-/Kleinschreibung egal)
        zeit: Zeitkriterium, wahr, wenn der Wert zwischen Ankunft und Abfahrt des Eintrags liegt

    Returns:
        Listenindex in Fahrplan oder None.
        Vorsicht, 0 ist ein gültiges Resultat!
    """

    index, _ = self.find_fahrplan(gleis=gleis, plan=plan, zeit=zeit)
    return index

find_fahrplanzeile

find_fahrplanzeile(gleis: str | None = None, plan: str | None = None, zeit: time | None = None) -> FahrplanZeile | None

Fahrplanzeile nach Gleis und/oder Zeit suchen.

Alle angegebenen Kriterien müssen zutreffen. Die Zeit muss grösser oder gleich der Ankunftszeit (wenn bekannt) und kleiner oder gleich der Abfahrtszeit (wenn bekannt) sein. Wenn eine der Zeiten nicht bekannt ist, wird das entsprechende Kriterium als erfüllt gewertet.

Diese Methode ist ein Wrapper von find_fahrplan, der nur das Fahrplanobjekt zurückgibt.

Parameters:

  • gleis

    (str | None, default: None ) –

    Gleiskriterium (Gross-/Kleinschreibung egal)

  • plan

    (str | None, default: None ) –

    Plangleiskriterium (Gross-/Kleinschreibung egal)

  • zeit

    (time | None, default: None ) –

    Zeitkriterium, wahr, wenn der Wert zwischen Ankunft und Abfahrt des Eintrags liegt

Returns:

Source code in stskit/plugin/stsobj.py
def find_fahrplanzeile(self,
                       gleis: str | None = None,
                       plan: str | None = None,
                       zeit: datetime.time | None = None,
                       ) -> FahrplanZeile | None:
    """
    Fahrplanzeile nach Gleis und/oder Zeit suchen.

    Alle angegebenen Kriterien müssen zutreffen.
    Die Zeit muss grösser oder gleich der Ankunftszeit (wenn bekannt)
    und kleiner oder gleich der Abfahrtszeit (wenn bekannt) sein.
    Wenn eine der Zeiten nicht bekannt ist, wird das entsprechende Kriterium als erfüllt gewertet.

    Diese Methode ist ein Wrapper von find_fahrplan, der nur das Fahrplanobjekt zurückgibt.

    Args:
        gleis: Gleiskriterium (Gross-/Kleinschreibung egal)
        plan: Plangleiskriterium (Gross-/Kleinschreibung egal)
        zeit: Zeitkriterium, wahr, wenn der Wert zwischen Ankunft und Abfahrt des Eintrags liegt

    Returns:
        FahrplanZeile-Objekt oder None.
    """

    _, zeile = self.find_fahrplan(gleis=gleis, plan=plan, zeit=zeit)
    return zeile

graph

graph() -> DiGraph

Fahrplan im networkx directed Graph Format

Die Knoten sind Anschluss- oder Gleisnamen und haben folgende Attribute: - typ: 'anschluss' oder 'gleis' - an: Ankunftszeit als datetime.time (kann fehlen) - ab: Ankunftszeit als datetime.time (kann fehlen) - aufenthalt: Aufenthaltszeit in sekunden (kann fehlen)

Die Kanten haben folgende Attribute: - fahrzeit: Planmässige Fahrzeit in sekunden (kann fehlen)

Returns:

  • DiGraph

    networkx-Graph

Source code in stskit/plugin/stsobj.py
def graph(self) -> nx.DiGraph:
    """
    Fahrplan im networkx directed Graph Format

    Die Knoten sind Anschluss- oder Gleisnamen und haben folgende Attribute:
    - typ: 'anschluss' oder 'gleis'
    - an: Ankunftszeit als datetime.time (kann fehlen)
    - ab: Ankunftszeit als datetime.time (kann fehlen)
    - aufenthalt: Aufenthaltszeit in sekunden (kann fehlen)

    Die Kanten haben folgende Attribute:
    - fahrzeit: Planmässige Fahrzeit in sekunden (kann fehlen)

    Returns:
        networkx-Graph
    """
    graph = nx.DiGraph()

    start = self.von
    startzeit = np.nan
    if start:
        graph.add_node(start, typ='anschluss')

    for zeile in self.fahrplan:
        ziel = zeile.gleis
        try:
            ankunftszeit = time_to_seconds(zeile.an)
        except AttributeError:
            ankunftszeit = np.nan
        try:
            abfahrtszeit = time_to_seconds(zeile.ab)
        except AttributeError:
            abfahrtszeit = np.nan

        if ziel:
            aufenthalt = abfahrtszeit - ankunftszeit if not zeile.durchfahrt() else 0
            graph.add_node(ziel, typ='gleis')
            if zeile.an:
                graph.nodes[ziel]['an'] = zeile.an
            if zeile.ab:
                graph.nodes[ziel]['ab'] = zeile.ab
            if not np.isnan(aufenthalt):
                graph.nodes[ziel]['aufenthalt'] = aufenthalt

            if start:
                fahrzeit = ankunftszeit - startzeit
                graph.add_edge(start, ziel)
                if not np.isnan(fahrzeit):
                    graph.edges[start][ziel]['fahrzeit'] = fahrzeit

        start = ziel
        startzeit = abfahrtszeit

    ziel = self.nach
    if ziel:
        graph.add_node(ziel, typ='anschluss')
        if start:
            graph.add_edge(start, ziel)

    return graph

route

route(plan: bool = False) -> Iterable[str]

Route (Reihe von Stationen) des Zuges als Generator

Die Route ist eine Liste von Stationen (Gleisen, inkl. Ein- und Ausfahrt) in der Reihenfolge des Fahrplans. Ein- und Ausfahrten können bei Ersatzzügen o.ä. fehlen. Durchfahrtsgleise sind auch enthalten.

Parameters:

  • plan

    (bool, default: False ) –

    Plangleise statt effektive Gleise melden

Returns:

Source code in stskit/plugin/stsobj.py
def route(self, plan: bool = False) -> Iterable[str]:
    """
    Route (Reihe von Stationen) des Zuges als Generator

    Die Route ist eine Liste von Stationen (Gleisen, inkl. Ein- und Ausfahrt) in der Reihenfolge des Fahrplans.
    Ein- und Ausfahrten können bei Ersatzzügen o.ä. fehlen.
    Durchfahrtsgleise sind auch enthalten.

    Args:
        plan: Plangleise statt effektive Gleise melden

    Returns:
        Generator von Gleisnamen.
    """
    if self.von:
        yield self.von.replace("Gleis ", "")
    for fpz in self.fahrplan:
        if plan:
            yield fpz.plan.replace("Gleis ", "")
        else:
            yield fpz.gleis.replace("Gleis ", "")
    if self.nach:
        yield self.nach.replace("Gleis ", "")

update

Attributwerte vom xml-Dokument übernehmen.

Parameters:

  • ereignis

    (Mapping) –

    Mapping mit den Attributen aus dem xml-Tag.

Source code in stskit/plugin/stsobj.py
def update(self, ereignis: Mapping) -> Ereignis:
    """
    Attributwerte vom xml-Dokument übernehmen.

    Args:
        ereignis: Mapping mit den Attributen aus dem xml-Tag.
    """
    super().update(ereignis)
    self.art = str(ereignis['art'])

    return self

FahrplanZeile

FahrplanZeile(zug: ZugDetails)

Fahrplanzeile

Flags
  • A: Vorzeitige Abfahrt möglich
  • Bn: Themenflag
  • D: Durchfahrt
  • E(zid): Nummernwechsel
  • F(zid): Flügeln
  • K(zid): Kuppeln
  • L: Lokumlauf
  • P: Anfangsaufstellungsplatz
  • R: Richtungsänderung
  • W[enr][enr]: Lokwechsel

Methods:

Attributes:

  • fid (FahrplanZeileID) –

    Fahrplanziel-Identifikation

Source code in stskit/plugin/stsobj.py
def __init__(self, zug: ZugDetails):
    super().__init__()

    # übergeordnetes zug-objekt
    self.zug: ZugDetails = zug

    # diese attribut wird beim ersten property-aufruf erzeugt
    self._fid: FahrplanZeileID | None = None

    # die folgenden attribute werden von der plugin-schnittstelle geliefert
    self.gleis: str = ""
    self.plan: str = ""
    self.an: datetime.time | None = None
    self.ab: datetime.time | None = None
    self.flags: str = ""
    self.hinweistext: str = ""

    # Die nächsten drei Attribute werden vom PluginClient anhand der Flags aufgelöst.
    # Lokal speichern wir Weak References.
    # Daher nur via die entsprechenden öffentlichen Properties zugreifen!
    self._ersatzzug: weakref.ReferenceType[ZugDetails] | None = None
    self._fluegelzug: weakref.ReferenceType[ZugDetails] | None = None
    self._kuppelzug: weakref.ReferenceType[ZugDetails] | None = None

fid property

fid: FahrplanZeileID

Fahrplanziel-Identifikation

Die Identifikation besteht aus den eindeutigen Attributen Zug-ID, Zeit in Minuten und Plangleis. Die ID wird beim ersten Gebrauch aus den genannten Attributen generiert und bleibt danach konstant. Das Property sollte daher nicht verwendet werden, bevor die Attribute ausgefüllt sind.

Die Attribute an, ab und plan alleine sind (auch für einen Zug) nicht eindeutig: an oder ab können None sein, das Gleis kann mehrmals angefahren werden. an kann sich beim Nummernwechsel ändern.

Returns:

  • FahrplanZeileID

    Dreiertupel (zid, zeit, plan). zeit ist entweder die Ankunfts- oder Abfahrtszeit in Minuten.

__eq__

__eq__(other: FahrplanZeile) -> bool

Gleichheit von zwei Fahrplanzeilen feststellen.

Gleichheit bedeutet: gleicher Zug und gleiches Plangleis. Jedes plangleis kommt im sts-Fahrplan nur einmal vor.

Parameters:

  • other

    (FahrplanZeile) –

    zu vergleichendes FahrplanZeile-Objekt

Returns:

  • bool

    True, wenn Zug und Plangleis übereinstimmen, sonst False

Source code in stskit/plugin/stsobj.py
def __eq__(self, other: FahrplanZeile) -> bool:
    """
    Gleichheit von zwei Fahrplanzeilen feststellen.

    Gleichheit bedeutet: gleicher Zug und gleiches Plangleis.
    Jedes plangleis kommt im sts-Fahrplan nur einmal vor.

    Args:
        other: zu vergleichendes FahrplanZeile-Objekt

    Returns:
        True, wenn Zug und Plangleis übereinstimmen, sonst False
    """
    return self.zug.zid == other.zug.zid and self.plan == other.plan

__hash__

__hash__() -> int

Zugziel-Hash

Der Hash basiert auf der fid.

Returns:

  • int

    Hash-Wert

Source code in stskit/plugin/stsobj.py
def __hash__(self) -> int:
    """
    Zugziel-Hash

    Der Hash basiert auf der fid.

    Returns:
        Hash-Wert
    """

    return hash(self.fid)

durchfahrt

durchfahrt() -> bool

Durchfahrt-Flag

Source code in stskit/plugin/stsobj.py
def durchfahrt(self) -> bool:
    """
    Durchfahrt-Flag
    """
    return 'D' in self.flags

ersatz_zid

ersatz_zid() -> int | None

zid aus dem Ersatz-Flag

Source code in stskit/plugin/stsobj.py
def ersatz_zid(self) -> int | None:
    """
    zid aus dem Ersatz-Flag
    """
    mo = re.search(r"E[0-9]?\(([0-9]+)\)", self.flags)
    if mo:
        return int(mo.group(1))
    else:
        return None

fluegel_zid

fluegel_zid() -> int | None

zid aus dem Fluegeln-Flag

Source code in stskit/plugin/stsobj.py
def fluegel_zid(self) -> int | None:
    """
    zid aus dem Fluegeln-Flag
    """
    mo = re.search(r"F[0-9]?\(([0-9]+)\)", self.flags)
    if mo:
        return int(mo.group(1))
    else:
        return None

kuppel_zid

kuppel_zid() -> int | None

zid aus dem Kuppel-Flag

Source code in stskit/plugin/stsobj.py
def kuppel_zid(self) -> int | None:
    """
    zid aus dem Kuppel-Flag
    """
    mo = re.search(r"K[0-9]?\(([0-9]+)\)", self.flags)
    if mo:
        return int(mo.group(1))
    else:
        return None

lokumlauf

lokumlauf() -> bool

Lokumlauf-Flag

Source code in stskit/plugin/stsobj.py
def lokumlauf(self) -> bool:
    """
    Lokumlauf-Flag
    """
    return 'L' in self.flags

lokwechsel

lokwechsel() -> tuple[int, int] | None

Lokwechsel-Flag

Returns:

  • tuple[int, int] | None

    Elementnummern der Ein- und Ausfahrgleise oder None.

  • tuple[int, int] | None

    Die Gleise können in einer beliebigen Reihenfolge auftreten.

  • tuple[int, int] | None

    Einfahrt/Ausfahrt kann aus dem Elementtyp bestimmt werden.

Source code in stskit/plugin/stsobj.py
def lokwechsel(self) -> tuple[int, int] | None:
    """
    Lokwechsel-Flag

    Returns:
        Elementnummern der Ein- und Ausfahrgleise oder None.
        Die Gleise können in einer beliebigen Reihenfolge auftreten.
        Einfahrt/Ausfahrt kann aus dem Elementtyp bestimmt werden.
    """
    mo = re.search(r"W\[([0-9]+)]\[([0-9]+)]", self.flags)
    if mo:
        return int(mo.group(1)), int(mo.group(2))
    else:
        return None

richtungswechsel

richtungswechsel() -> bool

Richtungswechsel-Flag

Source code in stskit/plugin/stsobj.py
def richtungswechsel(self) -> bool:
    """
    Richtungswechsel-Flag
    """
    return 'R' in self.flags

update

Daten von untangle-Element oder anderer FahrplanZeile übernehmen.

Es werden nur die Attribute übernommen, die von der Pluginschnittstelle geliefert werden.

Parameters:

  • item

    (Mapping) –

    eines von folgenden Objekten:

    • untangle.Element mit dem gleis-Tag von der Simulatorschnittstelle,
    • ein anderes FahrplanZeile-Objekt,
    • Dictionary mit Werten, die den Attributen dieser Klasse entsprechen.
Source code in stskit/plugin/stsobj.py
def update(self, item: Mapping) -> FahrplanZeile:
    """
    Daten von untangle-Element oder anderer FahrplanZeile übernehmen.

    Es werden nur die Attribute übernommen, die von der Pluginschnittstelle geliefert werden.

    Args:
        item: eines von folgenden Objekten:

            - untangle.Element mit dem gleis-Tag von der Simulatorschnittstelle,
            - ein anderes FahrplanZeile-Objekt,
            - Dictionary mit Werten, die den Attributen dieser Klasse entsprechen.
    """

    if isinstance(item, self.__class__):
        item = item.__dict__

    if isinstance(item, untangle.Element):
        self.gleis = str(item['name']).strip()
    else:
        self.gleis = str(item['gleis']).strip()

    self.plan = str(item['plan']).strip()

    try:
        if item['an'] is None or isinstance(item['an'], datetime.time):
            self.an = item['an']
        else:
            self.an = datetime.time.fromisoformat(item['an'])
    except (TypeError, ValueError):
        self.an = None

    try:
        if item['an'] is None or isinstance(item['ab'], datetime.time):
            self.ab = item['ab']
        else:
            self.ab = datetime.time.fromisoformat(item['ab'])
    except (TypeError, ValueError):
        self.ab = None

    self.flags = str(item['flags']).strip()
    self.hinweistext = str(item['hinweistext'])

    return self

vorzeitige_abfahrt

vorzeitige_abfahrt() -> bool

Vorzeitige-Abfahrt-Flag

Source code in stskit/plugin/stsobj.py
def vorzeitige_abfahrt(self) -> bool:
    """
    Vorzeitige-Abfahrt-Flag
    """
    return 'A' in self.flags

Knoten

Knoten()

Gleisbildelement ("Knoten").

Diese Klasse entspricht dem xml-Tag "shape". Verbindungen aus "connector"-Tags werden im Attribut nachbarn gespeichert.

Bahnsteige haben nur einen Namen. Alle anderen Tags haben eine enr-Nummer und einen Namen. Die enr ist fortlaufend über alle Elemente beginnend bei 1. Die enr hat nichts mit Signal- oder Weichennummern gemeinsam. Die enr wird, wo vorhanden, im connector-Tag verwendet. Bei Bahnsteigen wird der Name angegeben. Anschlüsse können den gleichen Namen wie ein Bahnsteig haben, da sie per enr identifiziert werden.

Da wir alle Elemente im gleichen Dictionary speichern wollen, deklariert diese klasse noch einen 'key', der den Knoten eindeutig identifiziert. Der key ist, wo deklariert, gleich der enr-Nummer und sonst gleich dem Namen.

Der Elementtyp wird numerisch gespeichert. Er kann mittels der Dicts TYP_NAME und TYP_NUMMER übersetzt werden.

In der Liste 'zuege', führt der Klient die Züge, die über das Gleiselement fahren (nur bei Einfahrten, Ausfahrten und Bahnsteigen).

Methods:

  • update

    Attributwerte vom xml-Dokument übernehmen.

Source code in stskit/plugin/stsobj.py
def __init__(self):
    super().__init__()
    self.key: int | str | None = None
    self.enr: int | None = None
    self.name: str | None = None
    self.typ: int = 0
    self.nachbarn: weakref.WeakValueDictionary[int | str, Knoten] = weakref.WeakValueDictionary()
    self.zuege: weakref.WeakValueDictionary[int, ZugDetails] = weakref.WeakValueDictionary()

update

update(shape: Mapping) -> Knoten

Attributwerte vom xml-Dokument übernehmen.

Parameters:

  • shape

    (Mapping) –

    Mapping mit den Attributen aus dem xml-Tag.

Returns:

Source code in stskit/plugin/stsobj.py
def update(self, shape: Mapping) -> Knoten:
    """
    Attributwerte vom xml-Dokument übernehmen.

    Args:
        shape: Mapping mit den Attributen aus dem xml-Tag.

    Returns:
        self
    """

    try:
        self.enr = int(shape['enr'])
    except TypeError:
        self.enr = None
    try:
        self.name = str(shape['name']).strip()
    except TypeError:
        self.name = None
    try:
        self.typ = int(shape['type'])
    except TypeError:
        self.typ = 0
    if self.enr is not None:
        self.key = self.enr
    else:
        self.key = self.name
    return self

ZugDetails

ZugDetails()

Zugdetails.

Die Attribute entsprechen dem zugdetails-Tag der Pluginschnittstelle.

Methods:

  • __str__

    Einfach lesbare Beschreibung

  • find_fahrplan

    Index und Fahrplanzeile nach Gleis und/oder Zeit suchen

  • find_fahrplan_index

    Fahrplanzeilenindex nach Gleis und/oder Zeit suchen

  • find_fahrplanzeile

    Fahrplanzeile nach Gleis und/oder Zeit suchen.

  • graph

    Fahrplan im networkx directed Graph Format

  • route

    Route (Reihe von Stationen) des Zuges als Generator

  • update

    Attributwerte vom xml-Dokument übernehmen.

Attributes:

Source code in stskit/plugin/stsobj.py
def __init__(self):
    super().__init__()
    self.zid: int = 0
    self.name: str = ""
    self.von: str = ""
    self.nach: str = ""
    self.verspaetung: int = 0
    self.sichtbar: bool = False
    self.gleis: str = ""
    self.plangleis: str = ""
    self.amgleis: bool = False
    self.hinweistext: str = ""
    self.usertext: str = ""
    self.usertextsender: str = ""
    self.fahrplan: list[FahrplanZeile] = []
    # index des aktuellen ziels. wird vom PluginClient aktualisiert
    self.ziel_index: int | None = None
    # zids aller zuege, in deren flags dieser zug vorkommt. wird vom PluginClient aktualisiert
    self.stamm_zids: set[int] = set()

gattung property

gattung: str | None

Zuggattung aus dem Zugnamen.

Die Zuggattung ist der alphabetische Präfix aus dem Zugnamen, z.b "ICE". Für eine spätere Version ist geplant, die Gattung anhand der Region und Zugnummer zu bestimmen, wo der präfix fehlt.

Returns:

  • str | None

    Zuggattung. None, wenn keine Gattung bestimmt werden kann.

ist_rangierfahrt property

ist_rangierfahrt: bool

Rangierfahrt anzeigen.

Als Rangierfahrten gelten Züge, die den Zusatz Lok, Ersatzlok oder RF im Namen tragen.

Returns:

  • bool

    True, wenn der Zug eine Rangierfahrt darstellt.

nummer property

nummer: int

Zugnummer aus dem Zugnamen.

Die Nummer ist der hinterste rein numerische Teil des Zugnamens, z.b. 8376 in "S8 8376 RF" Diese hat nichts mit der Zug-ID zu tun.

Beispiele von Zugnummern: - "536": 536 - "ICE 624": 624 - "S8 8376 RF": 8376 - "S 8449 S12": 8449

Returns:

  • int

    Zugnummer. 0, falls der Name keine Ziffer enthält.

__str__

__str__() -> str

Einfach lesbare Beschreibung

Zeigt den Zugnamen, von/nach, das nächste Gleis, die Verspätung und Unsichtbarkeit an.

Returns:

  • str

    Beschreibung als String.

Source code in stskit/plugin/stsobj.py
def __str__(self) -> str:
    """
    Einfach lesbare Beschreibung

    Zeigt den Zugnamen, von/nach, das nächste Gleis, die Verspätung und Unsichtbarkeit an.

    Returns:
        Beschreibung als String.
    """
    if self.gleis:
        gleis = self.gleis
        if self.gleis != self.plangleis:
            gleis = gleis + '/' + self.plangleis + '/'
        if self.amgleis:
            gleis = '[' + gleis + ']'
    else:
        gleis = ''

    sichtbar = "" if self.sichtbar else " (unsichtbar)"

    return f"{self.name}: {self.von} - {gleis} - {self.nach} ({self.verspaetung:+}){sichtbar}"

find_fahrplan

find_fahrplan(gleis: str | None = None, plan: str | None = None, zeit: time | None = None) -> tuple[int | None, FahrplanZeile | None]

Index und Fahrplanzeile nach Gleis und/oder Zeit suchen

Alle angegebenen Kriterien müssen zutreffen. Die Zeit muss grösser oder gleich der Ankunftszeit (wenn bekannt) und kleiner oder gleich der Abfahrtszeit (wenn bekannt) sein. Wenn eine der Zeiten nicht bekannt ist, wird das entsprechende Kriterium als erfüllt gewertet.

Parameters:

  • gleis

    (str | None, default: None ) –

    Gleiskriterium (Gross-/Kleinschreibung egal)

  • plan

    (str | None, default: None ) –

    Plangleiskriterium (Gross-/Kleinschreibung egal)

  • zeit

    (time | None, default: None ) –

    Zeitkriterium, wahr, wenn der Wert zwischen Ankunft und Abfahrt des Eintrags liegt

Returns:

  • int | None

    Listenindex im Fahrplan und FahrplanZeile-Objekt.

  • FahrplanZeile | None

    Beide Resultate sind None, wenn kein passender Eintrag gefunden wurde.

Source code in stskit/plugin/stsobj.py
def find_fahrplan(self,
                  gleis: str | None = None,
                  plan: str | None = None,
                  zeit: datetime.time | None = None,
                  ) -> tuple[int | None, FahrplanZeile | None]:
    """
    Index und Fahrplanzeile nach Gleis und/oder Zeit suchen

    Alle angegebenen Kriterien müssen zutreffen.
    Die Zeit muss grösser oder gleich der Ankunftszeit (wenn bekannt)
    und kleiner oder gleich der Abfahrtszeit (wenn bekannt) sein.
    Wenn eine der Zeiten nicht bekannt ist, wird das entsprechende Kriterium als erfüllt gewertet.

    Args:
        gleis: Gleiskriterium (Gross-/Kleinschreibung egal)
        plan: Plangleiskriterium (Gross-/Kleinschreibung egal)
        zeit: Zeitkriterium, wahr, wenn der Wert zwischen Ankunft und Abfahrt des Eintrags liegt

    Returns:
        Listenindex im Fahrplan und FahrplanZeile-Objekt.
        Beide Resultate sind None, wenn kein passender Eintrag gefunden wurde.
    """

    gleis = gleis.casefold() if gleis else None
    plan = plan.casefold() if plan else None

    for index, zeile in enumerate(self.fahrplan):
        if gleis and gleis != zeile.gleis.casefold():
            continue
        if plan and plan != zeile.plan.casefold():
            continue
        if zeit and zeile.an and zeit < zeile.an:
            continue
        if zeit and zeile.ab and zeit > zeile.ab:
            continue
        return index, zeile

    return None, None

find_fahrplan_index

find_fahrplan_index(gleis: str | None = None, plan: str | None = None, zeit: time | None = None) -> int | None

Fahrplanzeilenindex nach Gleis und/oder Zeit suchen

Alle angegebenen Kriterien müssen zutreffen. Die Zeit muss grösser oder gleich der Ankunftszeit (wenn bekannt) und kleiner oder gleich der Abfahrtszeit (wenn bekannt) sein. Wenn eine der Zeiten nicht bekannt ist, wird das entsprechende Kriterium als erfüllt gewertet.

Diese Methode ist ein Wrapper von find_fahrplan, der nur den Index zurückgibt.

Parameters:

  • gleis

    (str | None, default: None ) –

    Gleiskriterium (Gross-/Kleinschreibung egal)

  • plan

    (str | None, default: None ) –

    Plangleiskriterium (Gross-/Kleinschreibung egal)

  • zeit

    (time | None, default: None ) –

    Zeitkriterium, wahr, wenn der Wert zwischen Ankunft und Abfahrt des Eintrags liegt

Returns:

  • int | None

    Listenindex in Fahrplan oder None.

  • int | None

    Vorsicht, 0 ist ein gültiges Resultat!

Source code in stskit/plugin/stsobj.py
def find_fahrplan_index(self,
                        gleis: str | None = None,
                        plan: str | None = None,
                        zeit: datetime.time | None = None,
                        ) -> int | None:
    """
    Fahrplanzeilenindex nach Gleis und/oder Zeit suchen

    Alle angegebenen Kriterien müssen zutreffen.
    Die Zeit muss grösser oder gleich der Ankunftszeit (wenn bekannt)
    und kleiner oder gleich der Abfahrtszeit (wenn bekannt) sein.
    Wenn eine der Zeiten nicht bekannt ist, wird das entsprechende Kriterium als erfüllt gewertet.

    Diese Methode ist ein Wrapper von find_fahrplan, der nur den Index zurückgibt.

    Args:
        gleis: Gleiskriterium (Gross-/Kleinschreibung egal)
        plan: Plangleiskriterium (Gross-/Kleinschreibung egal)
        zeit: Zeitkriterium, wahr, wenn der Wert zwischen Ankunft und Abfahrt des Eintrags liegt

    Returns:
        Listenindex in Fahrplan oder None.
        Vorsicht, 0 ist ein gültiges Resultat!
    """

    index, _ = self.find_fahrplan(gleis=gleis, plan=plan, zeit=zeit)
    return index

find_fahrplanzeile

find_fahrplanzeile(gleis: str | None = None, plan: str | None = None, zeit: time | None = None) -> FahrplanZeile | None

Fahrplanzeile nach Gleis und/oder Zeit suchen.

Alle angegebenen Kriterien müssen zutreffen. Die Zeit muss grösser oder gleich der Ankunftszeit (wenn bekannt) und kleiner oder gleich der Abfahrtszeit (wenn bekannt) sein. Wenn eine der Zeiten nicht bekannt ist, wird das entsprechende Kriterium als erfüllt gewertet.

Diese Methode ist ein Wrapper von find_fahrplan, der nur das Fahrplanobjekt zurückgibt.

Parameters:

  • gleis

    (str | None, default: None ) –

    Gleiskriterium (Gross-/Kleinschreibung egal)

  • plan

    (str | None, default: None ) –

    Plangleiskriterium (Gross-/Kleinschreibung egal)

  • zeit

    (time | None, default: None ) –

    Zeitkriterium, wahr, wenn der Wert zwischen Ankunft und Abfahrt des Eintrags liegt

Returns:

Source code in stskit/plugin/stsobj.py
def find_fahrplanzeile(self,
                       gleis: str | None = None,
                       plan: str | None = None,
                       zeit: datetime.time | None = None,
                       ) -> FahrplanZeile | None:
    """
    Fahrplanzeile nach Gleis und/oder Zeit suchen.

    Alle angegebenen Kriterien müssen zutreffen.
    Die Zeit muss grösser oder gleich der Ankunftszeit (wenn bekannt)
    und kleiner oder gleich der Abfahrtszeit (wenn bekannt) sein.
    Wenn eine der Zeiten nicht bekannt ist, wird das entsprechende Kriterium als erfüllt gewertet.

    Diese Methode ist ein Wrapper von find_fahrplan, der nur das Fahrplanobjekt zurückgibt.

    Args:
        gleis: Gleiskriterium (Gross-/Kleinschreibung egal)
        plan: Plangleiskriterium (Gross-/Kleinschreibung egal)
        zeit: Zeitkriterium, wahr, wenn der Wert zwischen Ankunft und Abfahrt des Eintrags liegt

    Returns:
        FahrplanZeile-Objekt oder None.
    """

    _, zeile = self.find_fahrplan(gleis=gleis, plan=plan, zeit=zeit)
    return zeile

graph

graph() -> DiGraph

Fahrplan im networkx directed Graph Format

Die Knoten sind Anschluss- oder Gleisnamen und haben folgende Attribute: - typ: 'anschluss' oder 'gleis' - an: Ankunftszeit als datetime.time (kann fehlen) - ab: Ankunftszeit als datetime.time (kann fehlen) - aufenthalt: Aufenthaltszeit in sekunden (kann fehlen)

Die Kanten haben folgende Attribute: - fahrzeit: Planmässige Fahrzeit in sekunden (kann fehlen)

Returns:

  • DiGraph

    networkx-Graph

Source code in stskit/plugin/stsobj.py
def graph(self) -> nx.DiGraph:
    """
    Fahrplan im networkx directed Graph Format

    Die Knoten sind Anschluss- oder Gleisnamen und haben folgende Attribute:
    - typ: 'anschluss' oder 'gleis'
    - an: Ankunftszeit als datetime.time (kann fehlen)
    - ab: Ankunftszeit als datetime.time (kann fehlen)
    - aufenthalt: Aufenthaltszeit in sekunden (kann fehlen)

    Die Kanten haben folgende Attribute:
    - fahrzeit: Planmässige Fahrzeit in sekunden (kann fehlen)

    Returns:
        networkx-Graph
    """
    graph = nx.DiGraph()

    start = self.von
    startzeit = np.nan
    if start:
        graph.add_node(start, typ='anschluss')

    for zeile in self.fahrplan:
        ziel = zeile.gleis
        try:
            ankunftszeit = time_to_seconds(zeile.an)
        except AttributeError:
            ankunftszeit = np.nan
        try:
            abfahrtszeit = time_to_seconds(zeile.ab)
        except AttributeError:
            abfahrtszeit = np.nan

        if ziel:
            aufenthalt = abfahrtszeit - ankunftszeit if not zeile.durchfahrt() else 0
            graph.add_node(ziel, typ='gleis')
            if zeile.an:
                graph.nodes[ziel]['an'] = zeile.an
            if zeile.ab:
                graph.nodes[ziel]['ab'] = zeile.ab
            if not np.isnan(aufenthalt):
                graph.nodes[ziel]['aufenthalt'] = aufenthalt

            if start:
                fahrzeit = ankunftszeit - startzeit
                graph.add_edge(start, ziel)
                if not np.isnan(fahrzeit):
                    graph.edges[start][ziel]['fahrzeit'] = fahrzeit

        start = ziel
        startzeit = abfahrtszeit

    ziel = self.nach
    if ziel:
        graph.add_node(ziel, typ='anschluss')
        if start:
            graph.add_edge(start, ziel)

    return graph

route

route(plan: bool = False) -> Iterable[str]

Route (Reihe von Stationen) des Zuges als Generator

Die Route ist eine Liste von Stationen (Gleisen, inkl. Ein- und Ausfahrt) in der Reihenfolge des Fahrplans. Ein- und Ausfahrten können bei Ersatzzügen o.ä. fehlen. Durchfahrtsgleise sind auch enthalten.

Parameters:

  • plan

    (bool, default: False ) –

    Plangleise statt effektive Gleise melden

Returns:

Source code in stskit/plugin/stsobj.py
def route(self, plan: bool = False) -> Iterable[str]:
    """
    Route (Reihe von Stationen) des Zuges als Generator

    Die Route ist eine Liste von Stationen (Gleisen, inkl. Ein- und Ausfahrt) in der Reihenfolge des Fahrplans.
    Ein- und Ausfahrten können bei Ersatzzügen o.ä. fehlen.
    Durchfahrtsgleise sind auch enthalten.

    Args:
        plan: Plangleise statt effektive Gleise melden

    Returns:
        Generator von Gleisnamen.
    """
    if self.von:
        yield self.von.replace("Gleis ", "")
    for fpz in self.fahrplan:
        if plan:
            yield fpz.plan.replace("Gleis ", "")
        else:
            yield fpz.gleis.replace("Gleis ", "")
    if self.nach:
        yield self.nach.replace("Gleis ", "")

update

Attributwerte vom xml-Dokument übernehmen.

Der Fahrplan wird von dieser Methode nicht berührt.

Parameters:

  • zugdetails

    (Mapping) –

    Mapping mit den Attributen aus dem xml-Tag.

Returns:

Source code in stskit/plugin/stsobj.py
def update(self, zugdetails: Mapping) -> ZugDetails:
    """
    Attributwerte vom xml-Dokument übernehmen.

    Der Fahrplan wird von dieser Methode nicht berührt.

    Args:
        zugdetails: Mapping mit den Attributen aus dem xml-Tag.

    Returns:
        self
    """
    self.zid = int(zugdetails['zid'])
    self.name = str(zugdetails['name']).strip()
    try:
        self.verspaetung = int(zugdetails['verspaetung'])
    except TypeError:
        pass
    self.gleis = str(zugdetails['gleis']).strip() or self.gleis
    self.plangleis = str(zugdetails['plangleis']).strip() or self.plangleis
    self.von = str(zugdetails['von']).strip()
    self.nach = str(zugdetails['nach']).strip()
    self.sichtbar = str(zugdetails['sichtbar']).lower() == 'true'
    self.amgleis = str(zugdetails['amgleis']).lower() == 'true'
    self.usertext = str(zugdetails['usertext'])
    self.usertextsender = str(zugdetails['usertextsender'])
    self.hinweistext = str(zugdetails['hinweistext'])
    return self

format_minutes

format_minutes(minutes: int | float) -> str

Minuten in Stunden:Minuten formatieren.

Parameters:

  • minutes

    (int | float) –

    Zeit in Minuten

Returns:

  • str

    Formatierte Zeit

Source code in stskit/plugin/stsobj.py
def format_minutes(minutes: int | float) -> str:
    """
    Minuten in Stunden:Minuten formatieren.

    Params:
        minutes: Zeit in Minuten

    Returns:
        Formatierte Zeit
    """
    minutes = round(minutes)
    h = minutes // 60
    m = minutes % 60
    return f"{h:02d}:{m:02d}"

format_verspaetung

format_verspaetung(verspaetung: int | float | None) -> str

Verspätung formatieren.

Source code in stskit/plugin/stsobj.py
def format_verspaetung(verspaetung: int | float | None) -> str:
    """
    Verspätung formatieren.
    """
    if verspaetung is not None:
        if abs(verspaetung) >= 0.5:
            return f"{int(verspaetung):+}"
        else:
            return "0"
    else:
        return ""

minutes_to_time

minutes_to_time(minutes: float) -> time

Minuten seit Mitternacht in Uhrzeit umrechnen.

Parameters:

  • minutes

    (float) –

    Minuten seit Mitternacht. Dezimalstellen geben Sekunden an.

Returns:

  • time

    Zeit als datetime.time auf ganze Sekunden gerundet.

Source code in stskit/plugin/stsobj.py
def minutes_to_time(minutes: float) -> datetime.time:
    """
    Minuten seit Mitternacht in Uhrzeit umrechnen.

    Args:
        minutes: Minuten seit Mitternacht. Dezimalstellen geben Sekunden an.

    Returns:
        Zeit als `datetime.time` auf ganze Sekunden gerundet.
    """
    return seconds_to_time(minutes * 60)

seconds_to_time

seconds_to_time(seconds: float) -> time

Sekunden seit Mitternacht in Uhrzeit umrechnen.

Parameters:

  • seconds

    (float) –

    Sekunden seit Mitternacht. Dezimalstellen werden auf ganze Sekunden gerundet.

Returns:

  • time

    Zeit als datetime.time auf ganze Sekunden gerundet.

Source code in stskit/plugin/stsobj.py
def seconds_to_time(seconds: float) -> datetime.time:
    """
    Sekunden seit Mitternacht in Uhrzeit umrechnen.

    Args:
        seconds: Sekunden seit Mitternacht. Dezimalstellen werden auf ganze Sekunden gerundet.

    Returns:
        Zeit als `datetime.time` auf ganze Sekunden gerundet.
    """
    s = round(seconds)
    m = s // 60
    s = s % 60
    h = m // 60
    m = m % 60
    return datetime.time(hour=h, minute=m, second=s)

time_to_minutes

time_to_minutes(dt: datetime | time | timedelta) -> int

Uhrzeit in Minuten seit Mitternacht umrechnen.

Parameters:

Returns:

  • int

    Minuten, ganzzahlig

Raises:

Source code in stskit/plugin/stsobj.py
def time_to_minutes(dt: datetime.datetime | datetime.time | datetime.timedelta) -> int:
    """
    Uhrzeit in Minuten seit Mitternacht umrechnen.

    Args:
        dt: Das Datum wird ignoriert.

    Returns:
        Minuten, ganzzahlig

    Raises:
        AttributeError: Typ nicht kompatibel oder None.
    """
    try:
        # datetime, time
        return dt.hour * 60 + dt.minute + round(dt.second / 60)
    except AttributeError:
        # timedelta
        return round(dt.seconds / 60)

time_to_seconds

time_to_seconds(dt: datetime | time | timedelta) -> int

Uhrzeit in Sekunden seit Mitternacht umrechnen.

Parameters:

Returns:

  • int

    Sekunden, ganzzahlig

Raises:

Source code in stskit/plugin/stsobj.py
def time_to_seconds(dt: datetime.datetime | datetime.time | datetime.timedelta) -> int:
    """
    Uhrzeit in Sekunden seit Mitternacht umrechnen.

    Args:
        dt: Das Datum wird ignoriert.

    Returns:
        Sekunden, ganzzahlig

    Raises:
        AttributeError: Typ nicht kompatibel oder None.
    """
    try:
        # datetime, time
        return dt.hour * 3600 + dt.minute * 60 + dt.second
    except AttributeError:
        # timedelta
        return dt.seconds