Intégrer Speedtest CLI Officielle à Home Assistant

Si tu utilise docker, tu as Librespeed

1 « J'aime »

Voici ma card complète pour le Speedtest (je l’utilise en popup) :




Swipe-card pour faire défiler les card « Download » « Upload » « Ping » et « URL »
Et un boutton pour lancer un nouveau speedtest

Code
tap_action:
  action: fire-dom-event
  haptic: heavy
  browser_mod:
    service: browser_mod.popup
    data:
      style: |-
        --popup-header-background-color: black;
        --popup-background-color: transperant;
        --popup-border-radius: 15px;
        --popup-border-color: transparent;
        --popup-padding-x: 5px;
      size: normal
      content:
        type: custom:button-card
        show_entity_picture: false
        entity: template
        name: Speedtest
        show_icon: false
        show_name: true
        tap_action:
          action: navigate
          navigation_path: '#empty'
        styles:
          card:
            - height: 480px
            - top: 0px
            - border-radius: 10px
            - background-color: transparent
            - '--mdc-ripple-press-opacity': 0
          name:
            - z-index: 2
            - position: absolute
            - font-size: 45px
            - font-weight: lighter
            - justify-self: start
            - color: white
            - left: 25px
            - top: 20px
          icon:
            - width: 50%
          img_cell:
            - z-index: 2
          custom_fields:
            blur:
              - z-index: 1
              - top: 0%
              - left: 0%
              - width: 100%
              - height: 100%
              - border-radius: 10px
              - position: absolute
              - background-color: rgba(0, 0, 0, 0.1)
              - backdrop-filter: blur(10px)
              - '-webkit-backdrop-filter': blur(20px)
            temp:
              - z-index: 2
              - position: absolute
              - top: 25%
              - left: 5%
              - height: 100%
              - width: 90%
        custom_fields:
          blur: |
            <div></div>
          temp:
            card:
              type: vertical-stack
              cards:
                - type: custom:button-card
                  tap_action:
                    action: call-service
                    service: homeassistant.update_entity
                    service_data:
                      entity_id: sensor.speedtest_cli_data
                  color: var(--google-grey)
                  show_icon: true
                  show_label: false
                  show_name: true
                  styles:
                    icon:
                      - color: rgba(var(--color-theme),0.9)
                      - width: 20px
                    img_cell: null
                    name:
                      - font-weight: bold
                      - font-size: 16px
                      - place-self: start
                      - margin: 15px 0 0 15px
                    grid:
                      - grid-template-areas: '"i n item1" "i n item1"'
                      - grid-template-columns: 1fr 10fr 1fr
                      - grid-template-rows: auto
                    card:
                      - box-shadow: none
                      - border-radius: 20px
                      - padding_bottom: '-8px'
                      - height: 65px
                      - padding-top: 5px
                      - padding-left: 5px
                      - '--mdc-ripple-color': white
                      - '--mdc-ripple-press-opacity': 0.9
                  name: Démarrer Speedtest
                  icon: mdi:speedometer
                  custom_fields:
                    item1:
                      card:
                        type: custom:button-card
                        show_icon: true
                        show_name: false
                        show_label: false
                        styles:
                          icon:
                            - color: rgba(var(--color-theme),0.9)
                            - width: 20px
                          grid:
                            - grid-template-areas: i
                            - grid-template-columns: auto
                            - grid-template-rows: auto
                          card:
                            - box-shadow: none
                            - background: rgba(0, 0, 0, 0.0)
                            - border: none
                        icon: mdi:chevron-right
                - type: custom:swipe-card
                  start_card: 1
                  parameters:
                    effect: coverflow
                    roundLengths: true
                    speed: 650
                    spaceBetween: 20
                    threshold: 7
                    coverflowEffect:
                      rotate: 80
                      depth: 300
                      start_card: 1
                  cards:
                    - type: custom:mini-graph-card
                      entities:
                        - entity: sensor.speedtest_cli_download
                      name: Download
                      decimals: '0'
                      more_info: true
                      line_width: 2
                      hours_to_show: 24
                      points_per_hour: 2
                      show:
                        graph: line
                        extrema: true
                      color_thresholds:
                        - value: 0
                          color: '#ef1d0f'
                        - value: 2000
                          color: '#ef5a0f'
                        - value: 3000
                          color: '#f0da11'
                        - value: 4000
                          color: '#11f13a'
                        - value: 7000
                          color: '#1da4f2'
                      style: |
                        ha-card .header.flex .name.flex {
                          color: #44739e;
                          font-size: 14px;
                        }
                        .header.flex .icon {
                          --mdc-icon-size: 28px;
                        }
                        :host {
                          --card-mod-icon-color: #44739e;
                        }
                        .fill {
                          fill: white;
                          opacity: 0.2 !important;
                        }
                        ha-card {
                          box-shadow: none;
                        }
                        ha-card .states.flex::after {
                          content: "{{states('sensor.speedtest_server_name')}}";
                          white-space: pre;
                          background-color: rgba(68, 115, 158,0.4);
                          padding: 2px 2px 0px 2px;
                          border-radius: 4px;
                          font-size: 9px;
                        }
                    - type: custom:mini-graph-card
                      entities:
                        - entity: sensor.speedtest_cli_upload
                          name: Upload
                      name: Upload
                      decimals: '0'
                      more_info: true
                      line_width: 2
                      hours_to_show: 24
                      points_per_hour: 2
                      show:
                        graph: line
                        extrema: true
                      color_thresholds:
                        - value: 0
                          color: '#ef1d0f'
                        - value: 2000
                          color: '#ef5a0f'
                        - value: 3000
                          color: '#f0da11'
                        - value: 4000
                          color: '#11f13a'
                        - value: 7000
                          color: '#1da4f2'
                      style: |
                        ha-card .header.flex .name.flex {
                          color: #44739e;
                          font-size: 14px;
                        }
                        .header.flex .icon {
                          --mdc-icon-size: 28px;
                        }
                        :host {
                          --card-mod-icon-color: #44739e;
                        }
                        .fill {
                          fill: white;
                          opacity: 0.2 !important;
                        }
                        ha-card {
                          box-shadow: none;
                        }
                        ha-card .states.flex::after {
                          content: "{{states('sensor.speedtest_server_name')}}";
                          white-space: pre;
                          background-color: rgba(68, 115, 158,0.4);
                          padding: 2px 2px 0px 2px;
                          border-radius: 4px;
                          font-size: 9px;
                        }
                    - type: custom:mini-graph-card
                      entities:
                        - entity: sensor.speedtest_cli_ping
                          name: Ping
                      name: Ping
                      decimals: '0'
                      more_info: true
                      line_width: 2
                      hours_to_show: 24
                      points_per_hour: 2
                      show:
                        graph: line
                        extrema: true
                      color_thresholds:
                        - value: 0
                          color: '#ef1d0f'
                        - value: 10
                          color: '#ef5a0f'
                        - value: 15
                          color: '#f0da11'
                        - value: 20
                          color: '#11f13a'
                        - value: 25
                          color: '#1da4f2'
                      style: |
                        ha-card .header.flex .name.flex {
                          color: #44739e;
                          font-size: 14px;
                        }
                        .header.flex .icon {
                          --mdc-icon-size: 28px;
                        }
                        :host {
                          --card-mod-icon-color: #44739e;
                        }
                        .fill {
                          fill: white;
                          opacity: 0.2 !important;
                        }
                        ha-card {
                          box-shadow: none;
                        }
                        ha-card .states.flex::after {
                          content: "{{states('sensor.speedtest_server_name')}}";
                          white-space: pre;
                          background-color: rgba(68, 115, 158,0.4);
                          padding: 2px 2px 0px 2px;
                          border-radius: 4px;
                          font-size: 9px;
                        }
                    - type: vertical-stack
                      cards:
                        - type: markdown
                          content: >-
                            ![Image]({{ states('sensor.speedtest_cli_url')+
                            '.png' }})
                          card_mod:
                            style: |
                              ha-card {
                              --ha-card-background: transparent; 
                              color: rgb(255,255,255);
                              border-color: transparent;
                        - type: custom:html-card
                          name: Speedtest
                          content: >
                            <a href="[[sensor.speedtest_cli_url]]">Speedtest
                            Résultat</a>
                          card_mod:
                            style: |
                              ha-card {
                              --ha-card-background: transparent; 
                              color: rgb(255,255,255);
                              border-color: transparent;
                              margin-left: 0px;
                              margin-top: -40px;
Template
template:
  - sensor:
      - name: 'SpeedTest CLI Ping'
        unique_id: speedtest_cli_ping
        icon: mdi:speedometer
        unit_of_measurement: ms
        state_class: measurement
        state: "{{ ((states('sensor.speedtest_cli_data') | from_json).ping) }}"
      - name: 'SpeedTest CLI Download'
        unique_id: speedtest_cli_download
        icon: mdi:speedometer
        # DATA_RATE_MEGABITS_PER_SECOND: Final = "Mbit/s"
        unit_of_measurement: Mbit/s
        state_class: measurement
        state: "{{ ((states('sensor.speedtest_cli_data') | from_json).download * 8 / 1000 / 1000) | round(2) }}"
      - name: 'SpeedTest CLI Upload'
        unique_id: speedtest_cli_upload
        icon: mdi:speedometer
        unit_of_measurement: Mbit/s
        state_class: measurement
        state: "{{ ((states('sensor.speedtest_cli_data') | from_json).upload * 8 / 1000 / 1000) | round(2) }}"
      - name: Speedtest Server Name
        unique_id: speedtest_Server_Name
        state: '{{ ((states("sensor.speedtest_cli_data") | from_json).server_name) }}'
      - name: Speedtest Server Host
        unique_id: speedtest_Server_Host
        state: '{{ ((states("sensor.speedtest_cli_data") | from_json).server_host) }}'      
      - name: 'Speedtest CLI URL'
        unique_id: speedtest_url
        state: '{{ ((states("sensor.speedtest_cli_data") | from_json).url) }}'
Sensor
sensor:
  - platform: command_line
    name: "SpeedTest CLI Data"
    unique_id: speedtest_cli_data   #45446
    command: "/config/3rdparty/speedtest/speedtest -s 47318 --format=json --accept-license --accept-gdpr "
  # Every 4 hours, 60 * 60 * 4 = 14400
    scan_interval: 14401
    command_timeout: 60
    value_template: >-
      {{ 
        { 
          "ping": value_json.ping.latency, 
          "download": value_json.download.bandwidth, 
          "upload": value_json.upload.bandwidth, 
          "server_name": value_json.server.name,
          "server_host": value_json.server.host,
          "url": value_json.result.url
        }
        | to_json 
      }}

  - platform: template
    sensors:
      speedtest_temp_ping:
        unique_id: speedtest_temp_ping
        friendly_name: 'SpeedTest CLI Ping'
        icon_template: mdi:speedometer
        unit_of_measurement: ms
        value_template: "{{ (states('sensor.speedtest_cli_data') | from_json).ping | round(2) }}"
      speedtest_temp_download:
        unique_id: speedtest_temp_download
        friendly_name: 'SpeedTest CLI Download'
        icon_template: mdi:download-network-outline
        value_template: >-
          {%- set download = ((states('sensor.speedtest_cli_data') | from_json).download * 8 / 1000 / 1000) | round(2) -%}
          {% if download | float > 1000 %}
            {{ (download | int / 1000) | round(2) | replace('.',',') }} Gb/s
          {% else %}
            {{ download | replace('.',',') }} Mb/s
          {% endif %}
      speedtest_temp_upload:
        unique_id: speedtest_temp_upload
        friendly_name: 'SpeedTest CLI Upload'
        icon_template: mdi:upload-network-outline
        value_template: >-
          {%- set upload = ((states('sensor.speedtest_cli_data') | from_json).upload * 8 / 1000 / 1000) | round(2) -%}
          {% if upload | float > 1000 %}
            {{ (upload | int / 1000) | round(2) | replace('.',',') }} Gb/s
          {% else %}
            {{ upload | replace('.',',') }} Mb/s
          {% endif %}
4 « J'aime »

Merci pour le partage @Guizmos !!
Comment je peux agrandir l’image du speedtest (sur le dernier swipe) ?

En passant par card_mod, tu devrais pouvoir le faire :

                        - type: vertical-stack
                          cards:
                            - type: markdown
                              content: >-
                                ![Image]({{ states('sensor.speedtest_cli_url')+
                                '.png' }})
                              card_mod:
                                style: |
                                  ha-card {
                                  --ha-card-background: transparent; 
                                  color: rgb(255,255,255);
                                  width: 150%;
                                  border-color: transparent;

Dans cet exemple, j’ai juste rajouté la ligne « width: 150%; » par rapport au code d’origine

Merci, mais je n’arrive pas a la mettre à la même grandeur que les graph, c’est la taille du png qui pose problème?

Le png étant au format 16/9 et les cards plutôt au format 4/3, il sera difficile d’obtenir une taille similaire
Le mieux que j’ai pu faire c’est avec ces paramètres :

width: 110%;
margin-left: -17px;

Si je grossis encore le png, l’image va être coupée par la swipe-card

2 « J'aime »

Bonjour,

J’ai le même souci que toi, alors que j’ai des historiques :

Pourtant mon template a l’air bon :

template:
  - sensor:
      - name: "SpeedTest CLI Ping"
        unique_id: speedtest_cli_ping
        icon: mdi:speedometer
        unit_of_measurement: ms
        state_class: measurement
        state: "{{ ((states('sensor.speedtest_cli_data') | from_json).ping) }}"
      - name: "SpeedTest CLI Download"
        unique_id: speedtest_cli_download
        icon: mdi:speedometer
        unit_of_measurement: Mbit/s
        state_class: measurement
        state: "{{ ((states('sensor.speedtest_cli_data') | from_json).download * 8 / 1000 / 1000) | round(2) }}"
      - name: "SpeedTest CLI Upload"
        unique_id: speedtest_cli_upload
        icon: mdi:speedometer
        unit_of_measurement: Mbit/s
        state_class: measurement
        state: "{{ ((states('sensor.speedtest_cli_data') | from_json).upload * 8 / 1000 / 1000) | round(2) }}"
      - name: Speedtest Server Name
        unique_id: speedtest_Server_Name
        state: '{{ ((states("sensor.speedtest_cli_data") | from_json).server_name) }}'
      - name: Speedtest Server Host
        unique_id: speedtest_Server_Host
        state: '{{ ((states("sensor.speedtest_cli_data") | from_json).server_host) }}'
      - name: "Speedtest CLI URL"
        unique_id: speedtest_url
        state: '{{ ((states("sensor.speedtest_cli_data") | from_json).url) }}'

Quelqu’un a rencontré ce problème ?

Merci @WarC0zes pour ce travail.

Merci à tous.

Salut,

Tu pourrais donner le code de ta card ?

Si tu test avec un graph :

                      type: custom:mini-graph-card
                      entities:
                        - entity: sensor.speedtest_cli_download
                      name: Download
                      decimals: '0'
                      more_info: true
                      line_width: 2
                      hours_to_show: 96
                      points_per_hour: 2
                      show:
                        graph: line
                        extrema: true
                      color_thresholds:
                        - value: 0
                          color: '#ef1d0f'
                        - value: 2000
                          color: '#ef5a0f'
                        - value: 3000
                          color: '#f0da11'
                        - value: 4000
                          color: '#11f13a'
                        - value: 7000
                          color: '#1da4f2'
                      style: |
                        ha-card .header.flex .name.flex {
                          color: #44739e;
                          font-size: 14px;
                        }
                        .header.flex .icon {
                          --mdc-icon-size: 28px;
                        }
                        :host {
                          --card-mod-icon-color: #44739e;
                        }
                        .fill {
                          fill: white;
                          opacity: 0.2 !important;
                        }
                        ha-card {
                          box-shadow: none;
                        }
                        ha-card .states.flex::after {
                          content: "{{states('sensor.speedtest_server_name')}}";
                          white-space: pre;
                          background-color: rgba(68, 115, 158,0.4);
                          padding: 2px 2px 0px 2px;
                          border-radius: 4px;
                          font-size: 9px;
                        }

J’ai mis 96 heures d’affichages juste pour voir si tu as bien l’historique :wink:

Bonjour, merci pour la réponse qui m’a permis de voir que je ne visualisais pas la bonne entité :slight_smile:
ça fonctionne maintenant.

Merci encore

1 « J'aime »

Salut à tous,

Depuis quelques temps, le sensor ne fonctionnait plus.

J’ai repris la procédure et intégrer les autres infos mais rien de ne fonctionne. De plus, je n’ai pas les autres sensors qui apparaissent dans HA. Avez-vous une idée ?

image

Merci.
smilorel

Salut,

Si ça ne fonctionne plus alors il faut regarder les logs. La carte ‹ vide › dit juste qu’il y a seulement un souci

Salut @Pulpy-Luke,

Les logs me retournent seulement:

> Command failed (with return code 127): config/Config/3rdparty/speedtest/speedtest --format=json --accept-license --accept-gdpr

Je confirme tout de même avoir accepter les licenses après avoir lancé « .speedtest » via la console.

Quand je vais dans le sensor:
image

Là tu as 3 infos importantes:

  • la première qui concerne le fait que tu as/avait/aura un souci d’acceptation des licences.
  • la deuxième qui montre tu utilise l’intégration officielle dans HA
  • la troisième (en lien avec la 2ème) qui conclue que tu n’es pas exactement dans le bon sujet puisque justement l’idée ici c’est de remplacer l’intégration officielle qui marche mal par la méthode de @WarC0zes : le client officiel. Je te l’accorde le titre du sujet porte à confusion

J’ai déjà eu l’intégration officielle mais ce n’est plus le cas.

Un soucis de chemin. config/Config/3rdparty/speedtest/speedtest, dans le tuto je mets /Config/3rdparty/speedtest/. je sais pas pourquoi ta 2 fois config et speedtest.

2 « J'aime »

Bien vu! Je confirme que le speedtest_cli_data s’est mis à jour après modifications du chemin.

Par contre, j’ai l’impression que mes sensors « speedtest_cli_download » et autres présents dans mon fichier configuration.yaml ne se sont pas recrées.

Pourquoi recréer ?
montre ton code.

Ci-dessous les lignes de mon fichier configurations.yaml que j’ai recollé quand j’ai repris le tuto depuis le début aujourd’hui:

template:
  - sensor:
    - name: 'SpeedTest CLI Ping'
      unique_id: speedtest_cli_ping
      icon: mdi:speedometer
      # TIME_MILLISECONDS: Final = "ms"
      unit_of_measurement: ms
      state_class: measurement
      state: "{{ (states('sensor.speedtest_cli_data') | from_json).ping | round(2) }}"
    - name: 'SpeedTest CLI Download'
      unique_id: speedtest_cli_download
      icon: mdi:speedometer
      # DATA_RATE_MEGABITS_PER_SECOND: Final = "Mbit/s"
      unit_of_measurement: Mbit/s
      state_class: measurement
      state: "{{ ((states('sensor.speedtest_cli_data') | from_json).download * 8 / 1000 / 1000) | round(2) }}"
    - name: 'SpeedTest CLI Upload'
      unique_id: speedtest_cli_upload
      icon: mdi:speedometer
      unit_of_measurement: Mbit/s
      state_class: measurement
      state: "{{ ((states('sensor.speedtest_cli_data') | from_json).upload * 8 / 1000 / 1000) | round(2) }}"
    - name: Speedtest ISP
      unique_id: Speedtest_ISP
      state: '{{ ((states("sensor.speedtest_cli_data") | from_json).isp) }}'
    - name: Speedtest Server Name
      unique_id: Speedtest_Server_Name
      state: '{{ ((states("sensor.speedtest_cli_data") | from_json).server_name) }}'
    - name: Speedtest Server Host
      unique_id: Speedtest_Server_Host
      state: '{{ ((states("sensor.speedtest_cli_data") | from_json).server_host) }}'      
    - name: Speedtest country
      unique_id: Speedtest_country
      state: '{{ ((states("sensor.speedtest_cli_data") | from_json).country) }}'
    - name: Speedtest id
      unique_id: Speedtest_id
      state: '{{ ((states("sensor.speedtest_cli_data") | from_json).id) }}'
    - name: Speedtest location
      unique_id: Speedtest_location
      state: '{{ ((states("sensor.speedtest_cli_data") | from_json).location) }}'

Il a l’air bon, faut regarder les logs. comme ca je vois pas.

ta bien le sensor command line ?

- platform: command_line
  name: "SpeedTest CLI Data"
  unique_id: speedtest_cli_data
  # Use the path as configured on your system
  command: "/config/3rdparty/speedtest/speedtest --format=json --accept-license --accept-gdpr"
  # Every 4 hours, 60 * 60 * 4 = 14400
  scan_interval: 3600
  command_timeout: 60
  # Summarize results to stay below string limit and convert to JSON
  value_template: >-
    {{ 
      { 
        "ping": value_json.ping.latency, 
        "download": value_json.download.bandwidth, 
        "upload": value_json.upload.bandwidth, 
        "isp": value_json.isp,
        "country": value_json.server.country,
        "location": value_json.server.location,
        "id": value_json.server.id,
        "server_name": value_json.server.name,
        "server_host": value_json.server.host
      }
      | to_json 
    }}

Ce sensor est identique au miens.

Il est dans un fichier yaml spécifique, dans mon dossier sensors et mon fichier configuration.yaml fait référence à ce dossier comme pour les autres.