FRITZ!Box-Anrufliste in Home Assistant nutzen

Schon ziemlich nice! Ne Tabelle wäre halt deluxe - vielleicht schaue ich mir das nochmals an :thinking:

Hallo,

danke für die tolle Erklärung.

Wie baue ich die Automation so um, das die Anzeige nur bei bestimmten eigenen Rufnummern (to: 08154711 und 08154712) auslöst und etwas in den Helfer schreibt?

Zur Zeit schreibt en bei jeder Nummer, aber ich möchte das etwas nach “Nutzer” trennen.

Viele Grüße Sebastian

Hi Sebastian,

probier mal als neue Condition (bislang gibt es ja keine) in der Automation folgenden Code:

conditions:
  - condition: template
    value_template: >-
      {{ state_attr('sensor.fritz_box_5590_fiber_anrufmonitor_telefonbuch', 'with') in ['08154711', '08154712'] }}

VG Olli

Hallo Olli,

ich probiere es mal aus.

VG Sebastian

@fini Wie kann man den Timestamp und die Grafik einprogrammieren? Ist das dann immernoch ein Text-Helfer? Könntest Du bitte die Automation posten?

Und: Bei mir kommen beim Gespräch immer zwei Einträge: einen fürs “Klingeln” und einen zweiten, wenn ich ans Telefon gehe….

:telephone_receiver: Home Assistant – Telefonbuch‑/Anrufmonitor‑Automation

Diese Automation protokolliert eingehende, ausgehende, verpasste und angenommene Anrufe der FRITZ!Box in Home Assistant. Sie nutzt den fritzbox_callmonitor ‑Sensor und schreibt alle Informationen in Input‑Text‑Felder, die anschließend in Dashboards oder History‑Listen angezeigt werden können.

:puzzle_piece: Voraussetzungen

  1. FRITZ!Box Callmonitor Integration

Die Integration muss aktiviert sein. Es wird der Sensor benötigt:

sensor.anrufmonitor_telefonbuch

Dieser liefert u. a.:

  • from
  • from_name
  • to
  • to_name
  • with
  • with_name
  • Status: ringing , dialing , talking , idle

:memo: Benötigte Helper (Input‑Text)

Unter Einstellungen → Geräte & Dienste → Helfer anlegen:

  1. Eingehende/ausgehende Nummer

input_text.anruf_nummer

  1. Anschluss (z. B. Festnetz, DECT‑Mobilteil)

input_text.anruf_anschluss

  1. Anrufliste (HTML‑fähig)

input_text.anrufliste

:gear: Vollständige Automation (komplett, funktionsfähig)

Diese Automation muss in der automations.yaml stehen:

- id: telefonbuch
  alias: Telefonbuch
  mode: parallel

  trigger:
    - platform: state
      entity_id: sensor.anrufmonitor_telefonbuch
      to: ringing
      id: eingehend_start

    - platform: state
      entity_id: sensor.anrufmonitor_telefonbuch
      to: dialing
      id: ausgehend_start

    - platform: state
      entity_id: sensor.anrufmonitor_telefonbuch
      from: ringing
      to: idle
      id: verpasst

    - platform: state
      entity_id: sensor.anrufmonitor_telefonbuch
      from: dialing
      to: idle
      id: ausgehend_nicht_erfolgreich

    - platform: state
      entity_id: sensor.anrufmonitor_telefonbuch
      from: dialing
      to: talking
      id: ausgehend_gespräch

    - platform: state
      entity_id: sensor.anrufmonitor_telefonbuch
      from: ringing
      to: talking
      id: eingehend_gespräch

    - platform: state
      entity_id: sensor.anrufmonitor_telefonbuch
      to: idle
      id: reset

  action:
    - choose:

        # Eingehender Anruf beginnt → Name aus from_name
        - conditions:
            - condition: trigger
              id: eingehend_start
          sequence:
            - variables:
                nummer: "{{ state_attr('sensor.anrufmonitor_telefonbuch','from') }}"
                name: "{{ state_attr('sensor.anrufmonitor_telefonbuch','from_name') }}"
                nummer_name: >
                  {% if name %}{{ nummer }} ({{ name }}){% else %}{{ nummer }}{% endif %}
            - service: input_text.set_value
              target: { entity_id: input_text.anruf_nummer }
              data: { value: "{{ nummer_name }}" }
            - service: input_text.set_value
              target: { entity_id: input_text.anruf_anschluss }
              data: { value: "{{ state_attr('sensor.anrufmonitor_telefonbuch','to') }}" }

        # Ausgehender Anruf beginnt → Name aus to_name, Nummer ohne #
        - conditions:
            - condition: trigger
              id: ausgehend_start
          sequence:
            - variables:
                rohnr: "{{ state_attr('sensor.anrufmonitor_telefonbuch','to') }}"
                nummer: "{{ rohnr.rstrip('#') }}"
                name: "{{ state_attr('sensor.anrufmonitor_telefonbuch','to_name') }}"
                nummer_name: >
                  {% if name %}{{ nummer }} ({{ name }}){% else %}{{ nummer }}{% endif %}
            - service: input_text.set_value
              target: { entity_id: input_text.anruf_nummer }
              data: { value: "{{ nummer_name }}" }
            - service: input_text.set_value
              target: { entity_id: input_text.anruf_anschluss }
              data: { value: "{{ state_attr('sensor.anrufmonitor_telefonbuch','from') }}" }

        # Verpasster Anruf → gespeicherter Name
        - conditions:
            - condition: trigger
              id: verpasst
          sequence:
            - variables:
                nummer_name: "{{ states('input_text.anruf_nummer') }}"
                to_raw: "{{ states('input_text.anruf_anschluss') }}"
            - service: input_text.set_value
              target: { entity_id: input_text.anrufliste }
              data:
                value: >
                  <font color="#ff1744"><ha-icon icon="mdi:phone-missed"></ha-icon></font>
                  {{ now().strftime('%d.%m.%Y %H:%M') }} Verpasster Anruf<br>
                  von {{ nummer_name }} an {{ to_raw }}

        # Ausgehend NICHT erfolgreich → dialing → idle ohne talking
        - conditions:
            - condition: trigger
              id: ausgehend_nicht_erfolgreich
            - condition: template
              value_template: "{{ states('input_text.anruf_nummer') != '' }}"
          sequence:
            - variables:
                nummer_name: "{{ states('input_text.anruf_nummer') }}"
                from_raw: "{{ states('input_text.anruf_anschluss') }}"
            - service: input_text.set_value
              target: { entity_id: input_text.anrufliste }
              data:
                value: >
                  <font color="#ffa000"><ha-icon icon="mdi:phone-cancel"></ha-icon></font>
                  {{ now().strftime('%d.%m.%Y %H:%M') }} Ausgehend NICHT erfolgreich<br>
                  von {{ from_raw }} an {{ nummer_name }}

        # Eingehendes Gespräch → DU hebst ab / AB hebt ab
        - conditions:
            - condition: trigger
              id: eingehend_gespräch
          sequence:
            - variables:
                nummer: "{{ state_attr('sensor.anrufmonitor_telefonbuch','with') }}"
                name: "{{ state_attr('sensor.anrufmonitor_telefonbuch','with_name') }}"
                nummer_name: >
                  {% if name %}{{ nummer }} ({{ name }}){% else %}{{ nummer }}{% endif %}
                to_raw: "{{ states('input_text.anruf_anschluss') }}"
                klingel_dauer: >
                  {{ (as_timestamp(now()) - as_timestamp(trigger.from_state.last_changed)) | int }}
            - choose:
                # DU hebst ab (< 15 Sekunden)
                - conditions: "{{ klingel_dauer < 15 }}"
                  sequence:
                    - service: input_text.set_value
                      target: { entity_id: input_text.anrufliste }
                      data:
                        value: >
                          <font color="#00c853"><ha-icon icon="mdi:phone-incoming"></ha-icon></font>
                          {{ now().strftime('%d.%m.%Y %H:%M') }} Gespräch (du hast abgehoben)<br>
                          von {{ nummer_name }} an {{ to_raw }}
                # AB hebt ab (>= 15 Sekunden)
                - conditions: "{{ klingel_dauer >= 15 }}"
                  sequence:
                    - service: input_text.set_value
                      target: { entity_id: input_text.anrufliste }
                      data:
                        value: >
                          <font color="#ff1744"><ha-icon icon="mdi:phone-missed"></ha-icon></font>
                          {{ now().strftime('%d.%m.%Y %H:%M') }} AB hat angenommen<br>
                          von {{ nummer_name }} an {{ to_raw }}

        # Ausgehendes Gespräch → Nummer ohne #
        - conditions:
            - condition: trigger
              id: ausgehend_gespräch
          sequence:
            - variables:
                rohnr: "{{ state_attr('sensor.anrufmonitor_telefonbuch','with') }}"
                nummer: "{{ rohnr.rstrip('#') }}"
                name: "{{ state_attr('sensor.anrufmonitor_telefonbuch','with_name') }}"
                nummer_name: >
                  {% if name %}{{ nummer }} ({{ name }}){% else %}{{ nummer }}{% endif %}
                from_raw: "{{ states('input_text.anruf_anschluss') }}"
            - service: input_text.set_value
              target: { entity_id: input_text.anrufliste }
              data:
                value: >
                  <font color="#00c853"><ha-icon icon="mdi:phone-outgoing"></ha-icon></font>
                  {{ now().strftime('%d.%m.%Y %H:%M') }} Ausgehendes Gespräch<br>
                  von {{ from_raw }} an {{ nummer_name }}

        # Reset
        - conditions:
            - condition: trigger
              id: reset
          sequence:
            - service: input_text.set_value
              target: { entity_id: input_text.anruf_nummer }
              data: { value: "" }
            - service: input_text.set_value
              target: { entity_id: input_text.anruf_anschluss }
              data: { value: "" }

LG Fini

So sieht bei mir die Darstellung aus…

Krass Cool,

Danke. Wie bekomme ich in der Homefeed-Karte noch das Text-Helper Icon vor den Einträgen weg?

show_icon: false

type: custom:home-feed-card
card_id: main_feed
show_empty: false
state_color: false
history_days_back: 5
entities:
  - entity: input_text.anrufliste
    name: Fritz Box Anrufliste
    icon: none
    max_history: 10
    include_history: true
    content_template: "{{state}}"
card_mod:
  style: |
    ha-card {
      opacity: 0.7;
      background: var(--ha-card-background, var(--ha-surface-color)) !important;
      box-shadow: none !important;
      border-radius: 0 !important;
      border: none !important;
      padding: 0 !important;
      margin: 0 !important;
    }

Hallo fini,

Ich habe das Script verstanden und es läuft alles tip-top.

jetzt habe ich noch eine letzte Frage.

Ich möchte verschiedene Anruflisten benutzen, je nach dem, welche Rufnummer angerufen wurde.

Ich habe die Idee, das ich es nach den Start-sequenzen einbaue (für jede der 4 folgenden Sequenzen), und zwar möchte ich prüfen, ob die Rufnummer “08154711” oder “08154712” in der “input_text.anruf_anschluss” steht. Wenn ich scripting richtig verstehe ( https://www.home-assistant.io/docs/scripts/#test-a-condition ), dann macht er die sequenz nur weiter, wenn es “true” ist.

Ich glaube es so zu machen:

- conditions:
          - condition: trigger
            id: verpasst
        sequence:
          - variables:
              nummer_name: "{{ states('input_text.anruf_nummer') }}"
              to_raw: "{{ states('input_text.anruf_anschluss') }}"
 # nur für die folgenden Rufnummern ausführen       
          - conditions:
              - condition: template
                value_template: >-
                {{ state_attr({{to_raw}}) in  ['081547111', '08154712'] }}
 # sonst hier script-stop             
          - target:
              entity_id: input_text.anrufliste_1
            data:
              value: >
                <font color="#ff1744"><ha-icon
                icon="mdi:phone-missed"></ha-icon></font> {{
                now().strftime('%d.%m.%Y %H:%M') }} Verpasster Anruf<br> von {{
                nummer_name }} an {{ to_raw }}
            action: input_text.set_value


Aber ist das wirklich eine condition? Oder wie überprüfe ich den Inhalt von ‚input_text.anruf_anschluss‘?

Viele Grüße

Sebastian

vielen Dank für diesen Gedankengang :+1:t2:

bisher habe ich mich NUR über einen Anruf informieren lassen! Daran eine Automatisierung auszulösen, habe ich nicht gedacht… und vielleicht kann ich die Zielrufnummer auch mit z.B. # und dann mit einer Zahl(en) erweitern und so verschiedene Automatisierungen auszulösen :grinning_face: