Neue Integration: Erdbeben-Monitor

Soweit ich bisher gesehen habe, hat sich bei meiner Installation mit dem Update nichts sichtlich geändert und es treten auch keine Fehler auf.

Danke für die Rückmeldung - “es treten auch keine Fehler auf“ höre ich natürlich am liebsten!

Ich habe gestern die Version v1.7.0 in HACS online gestellt, mit folgenden Veränderungen:

  • Verbesserung der Art und Weise, wie “Peilungen” (also die Kompass-Richtung zum Ereignis) behandelt werden. Dazu wurden zwei neue Attribute eingeführt, bearing_deg_geo und bearing_text_geo, die die geodätisch korrekte Peilung in Grad und als Text anzeigen. In früheren Versionen waren diese Werte in den Attributen bearing_deg und bearing_text gespeichert. JETZT enthalten die Attribute bearing_deg und bearing_text intuitive besser verständliche Werte, die die Peilung (in Grad und als Text) in einer Karten-korrekten Weise angeben. Für lokale Erdbeben spielt das keine Rolle. Der Unterschied wird erst dann wichtig, wenn Ereignisse über etwa 1/10 des Erdumfangs entfernt sind. Dann weicht die geodätisch korrekte Peilung (das ist die Richtung des kürzesten Weges zum Ereignis) signifikant von der als natürlich empfundenen Peilung ab. Zum Beispiel führt die kürzeste Entfernung von Europa in die Südsee über den Arktis, die Peilung wird also zB als Nord-Nord-Ost angegeben, obwohl die Südsee natürlich süd-östlich von Europa liegt. Man kennt das ja von Transatlantikflügen von Europa an die US-Ostküste - diese verlaufen auf kürzestem Weg, der Flugweg erscheint auf einer (flachen) Karte aber als Kurve, die zuerst in Richtung Island/Grönland zeigt. Die Peilung ändert sich wegen der Kugelgestalt der Erde bei einem solchen Flugweg also ständig. Ab Version v1.7.0 gibt das Attribut relative_location jetzt die geodätisch korrekte Peilung an, wenn das Ereignis unter 4000 km entfernt stattfindet, bzw die intuitivere karten-korrekte Peilung bei Ereignissen über 4000 km. Die Grosskreis-Peilung des kürzesten Weges wird jetzt immer in den Attributen bearing_deg_geo und bearing_text_geo angegeben (für die Nerds, denen das wichtig ist), die karten-korrekten Peilungen in bearing_deg und bearing_text. Für normale Benutzer ändert sich “sichtbar” nichts, ausser daß die Peilungen in in bearing_deg und bearing_text jetzt bei weit entfernten Erdbeben mehr Sinn ergeben.
  • der Wortwahl des status Attributes wurde von “cleared“ auf “clear” verändert, um die Behandlung des Sensor-Status konsistenter zu machen. “Clear” ist der Sensor jetzt sowohl nach der Ersteinrichtung (also bevor das erste Erdbeben aufgezeichnet wurde), als auch nach dem automatischen Klären des Sensors nach der eingestellten Sensor-Lebensdauer.
  • das README.md wurde entsprechend angepasst und verbessert
  • kleinere Verbesserungen im Code

Wie immer bin ich für Rückmeldungen, Bugreports und Verbesserungsvorschläge dankbar!

1 „Gefällt mir“

Ne, läuft bei mir glaube ich echt gut. Muss wohl nur nochmal die Einstellungen durchgehen. Theoretisch hätte ja das Beben vom 08.05. auch auf der Karte von “Ioannina” auftauchen sollen!?

Muss ich mal die Kilometerangaben prüfen, die ich da hinterlegt habe.

Es freut mich wenn’s bei dir auch funktioniert :slight_smile:

Ja, mit meinen Einstellungen habe ich seit Anfang Mai folgende Erdbeben in meinen “Ioannina”-Sensor (aus dem HA-Recorder ausgelesen):

Zeitpunkt Mag Tiefe (km) Nächste Stadt Land Distanz (km) Richtung
2026-05-11 01:35:14 M2.5 8.6 km Kozáni Greece 93.6 km ENE
2026-05-09 08:10:40 M2.8 6.1 km Ioánnina Greece 38.5 km WNW
2026-05-02 21:13:10 M2.9 11.1 km Agrínio Greece 84.6 km SSE

Die Einstellungen des Sensors sind folgendermassen:

Breitengrad des Referenzpunkts*: 39.67
Längengrad des Referenzpunkts*: 20.86
Radius um den Referenzpunkt (km): 125
Minimale lokale Magnitude: 2.5
Minimale Magnitude für globale Erdbeben*: 10

Wie bekommst Du das mit der Karte hin?

Mach eine Map-Karte, zB mit

type: map
entities:
  - entity: zone.home
    label_mode: icon
    focus: false
  - entity: sensor.letztes_erdbeben
    label_mode: attribute
    attribute: magnitude
default_zoom: 8
auto_fit: true
theme_mode: auto

wobei du bei sensor.xxx den Namen deiner Entität verwendest, wenn du sie anders benannt hast.

1 „Gefällt mir“

type: map
entities:
  - sensor.athen
  - sensor.ioannina
  - sensor.kleidonia
hours_to_show: 0
default_zoom: 6
theme_mode: auto
grid_options:
  columns: full
  rows: 6

Und das Dashboard (da bastel ich noch… Die Anzeige aktiv/abgeklungen usw. läuft nicht rund)

 - title: Erdbebenmonitor
    path: erdbeben
    subview: true
    type: sections
    max_columns: 2
    sections:
      - type: grid
        column_span: 2
        cards:
          - type: heading
            heading: Erdbebenmonitor — Griechenland
            heading_style: title
            icon: mdi:earthquake
          - type: heading
            heading: EMSC Live-Feed · 50 km Radius · Mag ≥ 2.5 lokal / 6.0 global
            heading_style: subtitle
      - type: grid
        column_span: 1
        cards:
          - type: heading
            heading: Epizentren — Letzte Ereignisse
            heading_style: title
            icon: mdi:map-marker-radius
          - type: map
            entities:
              - sensor.athen
              - sensor.ioannina
              - sensor.kleidonia
            hours_to_show: 0
            default_zoom: 6
            theme_mode: auto
            grid_options:
              columns: full
              rows: 6
      - type: grid
        column_span: 1
        cards:
          - square: false
            type: grid
            columns: 2
            cards:
              - type: vertical-stack
                cards:
                  - type: heading
                    heading: Globales Großereignis
                    heading_style: title
                    icon: mdi:earth
                  - type: markdown
                    content: >-
                      {%- set s = 'sensor.athen' -%}

                      {%- macro a(k, u='') -%}{{ (state_attr(s,k) ~ u) if
                      state_attr(s,k) not in [None,'none',''] else '–' }}{%-
                      endmacro -%}

                      {%- set status = state_attr(s, 'status') -%}

                      {% if state_attr(s, 'within_radius') == False %}

                      ### M {{ states(s) }} {{ a('magtype') }}


                      | | |

                      |:---|:---|

                      | **Status** | {{ '🔴 Aktiv' if status == 'active' else '✅
                      Abgeklungen' }} |

                      | **Region** | {{ a('region') }} |

                      | **Land** | {{ a('country') }} |

                      | **Nächste Stadt** | {{ a('nearest_city') }} |

                      | **Tiefe** | {{ a('depth',' km') }} |

                      | **Koordinaten** | {{ a('latitude') }}° N, {{
                      a('longitude') }}° E |

                      | **Zeitpunkt** | {{ a('time') }} |

                      | **Aktualisiert** | {{ a('lastupdate') }} |

                      {% else %}

                      *Kein aktives globales Ereignis — alle regionalen Monitore
                      zeigen lokale Daten.*

                      {% endif %}
                    grid_options:
                      columns: 9
                      rows: 1
              - type: vertical-stack
                cards:
                  - type: heading
                    heading: Athen
                    heading_style: title
                    icon: mdi:city
                  - type: markdown
                    content: >-
                      {%- set s = 'sensor.athen' -%}

                      {%- macro a(k, u='') -%}{{ (state_attr(s,k) ~ u) if
                      state_attr(s,k) not in [None,'none',''] else '–' }}{%-
                      endmacro -%}

                      {%- set status = state_attr(s, 'status') -%}

                      {% if states(s) in ['unknown','unavailable','none'] %}

                      {% if status == 'cleared' %}

                      *✅ Letztes Ereignis abgeklungen — kein aktives lokales
                      Ereignis.*

                      {% else %}

                      *Warte auf erstes Ereignis...*

                      {% endif %}

                      {% elif state_attr(s, 'within_radius') == False %}

                      *Kein lokales Ereignis — letztes gespeichertes war global
                      (M {{ states(s) }}, {{ a('region') }}).*

                      {% else %}

                      ### M {{ states(s) }} {{ a('magtype') }} ⚠️


                      | | |

                      |:---|:---|

                      | **Status** | {{ '🔴 Aktiv' if status == 'active' else '✅
                      Abgeklungen' }} |

                      | **Region** | {{ a('region') }} |

                      | **Land** | {{ a('country') }} |

                      | **Nächste Stadt** | {{ a('nearest_city') }} |

                      | **Tiefe** | {{ a('depth',' km') }} |

                      | **Entfernung** | {{ a('relative_location') }} |

                      | **Zeitpunkt** | {{ a('time') }} |

                      | **Aktualisiert** | {{ a('lastupdate') }} |

                      {% endif %}
                    grid_options:
                      columns: 9
                      rows: 1
                    card_mod:
                      style: >-
                        ha-card { min-height: 260px; height: auto; overflow:
                        visible; }
              - type: vertical-stack
                cards:
                  - type: heading
                    heading: Ioannina
                    heading_style: title
                    icon: mdi:city
                  - type: markdown
                    content: >-
                      {%- set s = 'sensor.ioannina' -%}

                      {%- macro a(k, u='') -%}{{ (state_attr(s,k) ~ u) if
                      state_attr(s,k) not in [None,'none',''] else '–' }}{%-
                      endmacro -%}

                      {%- set status = state_attr(s, 'status') -%}

                      {% if states(s) in ['unknown','unavailable','none'] %}

                      {% if status == 'cleared' %}

                      *✅ Letztes Ereignis abgeklungen — kein aktives lokales
                      Ereignis.*

                      {% else %}

                      *Warte auf erstes Ereignis...*

                      {% endif %}

                      {% elif state_attr(s, 'within_radius') == False %}

                      *Kein lokales Ereignis — letztes gespeichertes war global
                      (M {{ states(s) }}, {{ a('region') }}).*

                      {% else %}

                      ### M {{ states(s) }} {{ a('magtype') }} ⚠️


                      | | |

                      |:---|:---|

                      | **Status** | {{ '🔴 Aktiv' if status == 'active' else '✅
                      Abgeklungen' }} |

                      | **Region** | {{ a('region') }} |

                      | **Land** | {{ a('country') }} |

                      | **Nächste Stadt** | {{ a('nearest_city') }} |

                      | **Tiefe** | {{ a('depth',' km') }} |

                      | **Entfernung** | {{ a('relative_location') }} |

                      | **Zeitpunkt** | {{ a('time') }} |

                      | **Aktualisiert** | {{ a('lastupdate') }} |

                      {% endif %}
                    grid_options:
                      columns: 9
                      rows: 1
                    card_mod:
                      style: >-
                        ha-card { min-height: 260px; height: auto; overflow:
                        visible; }
              - type: vertical-stack
                cards:
                  - type: heading
                    heading: Kleidonia / Konitsa
                    heading_style: title
                    icon: mdi:mountain
                  - type: markdown
                    content: >-
                      {%- set s = 'sensor.kleidonia' -%}

                      {%- macro a(k, u='') -%}{{ (state_attr(s,k) ~ u) if
                      state_attr(s,k) not in [None,'none',''] else '–' }}{%-
                      endmacro -%}

                      {%- set status = state_attr(s, 'status') -%}

                      {% if states(s) in ['unknown','unavailable','none'] %}

                      {% if status == 'cleared' %}

                      *✅ Letztes Ereignis abgeklungen — kein aktives lokales
                      Ereignis.*

                      {% else %}

                      *Warte auf erstes Ereignis...*

                      {% endif %}

                      {% elif state_attr(s, 'within_radius') == False %}

                      *Kein lokales Ereignis — letztes gespeichertes war global
                      (M {{ states(s) }}, {{ a('region') }}).*

                      {% else %}

                      ### M {{ states(s) }} {{ a('magtype') }} ⚠️


                      | | |

                      |:---|:---|

                      | **Status** | {{ '🔴 Aktiv' if status == 'active' else '✅
                      Abgeklungen' }} |

                      | **Region** | {{ a('region') }} |

                      | **Land** | {{ a('country') }} |

                      | **Nächste Stadt** | {{ a('nearest_city') }} |

                      | **Tiefe** | {{ a('depth',' km') }} |

                      | **Entfernung** | {{ a('relative_location') }} |

                      | **Zeitpunkt** | {{ a('time') }} |

                      | **Aktualisiert** | {{ a('lastupdate') }} |

                      {% endif %}
                    grid_options:
                      columns: 9
                      rows: 1
                    card_mod:
                      style: >-
                        ha-card { min-height: 260px; height: auto; overflow:
                        visible; }
    background:
      opacity: 33
      alignment: center
      size: cover
      repeat: no-repeat
      attachment: fixed
      image:
        media_content_id: media-source://image_upload/34fe82ca0b4a85b3681e84c9d8098759
        media_content_type: image/jpeg
        metadata:
          title: texture-1893783_1280.jpg
          thumbnail: /api/image/serve/34fe82ca0b4a85b3681e84c9d8098759/256x256
          media_class: image
          children_media_class: null
          navigateIds:
            - {}
            - media_content_type: app
              media_content_id: media-source://image_upload
1 „Gefällt mir“

Version v1.7.5 ist raus. Das hat sich verändert:

  • Die Datenbasis für die Bestimmung des Epizentrum-Landes wurde verändert - es benutzt jetzt eine optimierte Version der “Marine Regions EEZ/land-union data”
    von https://www.marineregions.org/ um auch Meeresregionen korrekt zu erfassen, die legal zu Ländern gehören. Die vorherige Version hatte diese Epizentren als “offshore” bezeichnet, auch wenn sie in nationalen Gewässern lagen

  • kleine Verbesserungen im Code

  • verbessertes, erweitertes README.md

Für die nächste Version plane ich, die zugrunde liegende Logik noch weiter zu verbessern und ein neues Attribut einzuführen, das anzeigt ob ein Erdbeben auf Land oder im Meer war. Zusätzlich gibt diese Unterscheidung noch die Möglichkeit, grob das Potential für einen Tsunami abzuschätzen.

1 „Gefällt mir“

gleich noch eine kleine Verbesserung hinterher, in Version v1.7.6:

  • neues Attribut “offshore” hinzugefügt (nutzt Natural Earth Land-Polygone, von https://www.naturalearthdata.com/), das anzeigt ob das Epizentrum auf Land (offshore = false) oder im Meer (offshore = true) liegt

  • neues Attribut “tsunami_potential” hinzugefügt, das auf Grund der Magnitude, Tiefe und offshore-Status das Potential für einen Tsunami abschätzt (nur bei offshore-Erdbeben)

  • erweitertes README.md um die beiden neuen Attribute zu erklären

Ein Update auf v1.8.0 ist raus, mit zwei neuen Attributen zur Tektonik - die nächstliegende Plattengrenze (`nearest_tectonic_boundary`) und die Entfernung davon (`tectonic_boundary_distance_km`). Die Details sind ausführlich im Readme beschrieben.

Das verwendete Tektonik-Datenset ist von GitHub - fraxen/tectonicplates · GitHub mit einigen Optimierungen meinerseits.

Rückmeldungen, Fragen, Bugreports und Anregungen nehme ich wie immer sehr gern entgegen!

1 „Gefällt mir“

Jetzt ist nur die Frage warum der Monitor nie ein Update meldet :man_shrugging:

Aber als Feedback…Sackstark das Teil :flexed_biceps:


Hab jetzt mal die Daten auf realistisch gesetzt, 3 Beben am Tag brauch ich dann auch nicht :smiley:

Bei mir kam die Meldung in HA unter Updates, wie bei jeder anderer HACS-Integration aus.

Bei mir ist es das einzigste aus dem HACS was eben keine Meldung bringt :man_shrugging:

das scheint leider ein generelles Problem mit HACS zu sein - die Dokumentation von HACS sagt zwar, daß HACS “regelmässig” nach Updates sucht, aber ich habe auch für andere Integrationen gelesen daß sie erst verzögert angezeigt werden (zum Beispiel erst nach dem nächsten HA-Boot).

Was (für mich) immer geht ist ein manueller Check nach Updates: in HACS unter “Heruntergeladen” die Integration suchen, dann ganz rechts auf das “drei-Punkte”-Menü klicken und dort “Informationen aktualisieren” wählen.

1 „Gefällt mir“