Intégrer Speedtest CLI Officielle à Home Assistant

Ok, mais alors, comment on peut définir les champs dans le template ?

    value_template: >-
      {{ 
        { 
          "ping": value_json.ping.latency, 
          "download": value_json.download.bandwidth, 
          "upload": value_json.upload.bandwidth, 
          "isp": value_json.isp.????,
          "server_name": value_json.server_name.????
        }
        | to_json 
      }}

Il faut lancer la commande ./speedtest --format=json --accept-license --accept-gdpr et regarder ce que ça sort.

Ça devrait être quelque chose comme ça:

value_template: >-
      {{ 
        { 
          "ping": value_json.ping.latency, 
          "download": value_json.download.bandwidth, 
          "upload": value_json.upload.bandwidth, 
          "isp": value_json.isp,
          "server_name": value_json.server.host
        }
        | to_json 
      }}

Tu peux remplacer .host par .name en fonction de ce que tu préfères.

Super, un tout grand merci :slight_smile:
j’ai vu qu’on pouvait aussi y intégrer d’autre information :
- location
- country
- url
- packetLoss

Bonjour,
j’étais intéresser aussi pour avoir le nom du serveur et la location. J’ai mis de coté , mais tu lance le sujet et ca serais sympa de partager comment tu as fait. Je pourrais le rajouter au tutoriel.

- platform: command_line
    name: "SpeedTest CLI Data"
    unique_id: speedtest_cli_data
    command: "/config/3rdparty/speedtest/speedtest --format=json --accept-license --accept-gdpr"
    #Toutes les 4 heures, 60 * 60 * 4 = 14400  3600 = 1 heure
    scan_interval: 3600
    command_timeout: 60
    value_template: >-
      {{ 
        { 
          "ping": value_json.ping.latency, 
          "download": value_json.download.bandwidth, 
          "upload": value_json.upload.bandwidth, 
          "isp": value_json.isp,
          "server_name": value_json.server.name
        }
        | to_json 
      }}

sensor complet :

##Speedtest
  - platform: command_line
    name: "SpeedTest CLI Data"
    unique_id: speedtest_cli_data
  # Use the path as configured on your system
    command: "config/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 
      }}

Et ensuite le template :

##Speedtest
# SpeedTest.net CLI
# https://www.speedtest.net/apps/cli
# Command_line sensor is in sensors.yaml
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) }}'      

Merci à la communauté et bon projet à tous :wink:

3 « J'aime »

@monaxe

Si tu souhaites aéré la mise en page

  - platform: template
    sensors:
      speedtest_download:
        friendly_name: "SpeedTest Download"
        icon_template: mdi:gauge
        unit_of_measurement: 'Mbit/s'
        value_template: "{{ ((states('sensor.speedtest_data') | from_json).download * 8 / 1000 / 1000) | round(2) }}"    
 
  - platform: template
    sensors:
      speedtest_upload:
        friendly_name: "SpeedTest Upload"
        icon_template: mdi:gauge
        unit_of_measurement: 'Mbit/s'
        value_template: "{{ ((states('sensor.speedtest_data') | from_json).upload * 8 / 1000 / 1000) | round(2) }}"     

  - platform: template
    sensors:
      speedtest_ping:
        friendly_name: "SpeedTest Ping"
        icon_template: mdi:gauge
        unit_of_measurement: 'ms'
        value_template: "{{ (states('sensor.speedtest_data') | from_json).ping | round(2) }}"
        
  - platform: template
    sensors:
      speedtest_server:
        friendly_name: "SpeedTest Server"
        icon_template: mdi:gauge
        value_template: "{{ ((states('sensor.speedtest_data') | from_json).server_name) }}"
        
  - platform: template
    sensors:
      speedtest_isp:
        friendly_name: "SpeedTest ISP"
        value_template: "{{ ((states('sensor.speedtest_data') | from_json).isp) }}"
1 « J'aime »

Merci @monaxe @ClassicRed, je mettrais le tuto a jours dès que j’ai 5 min.

bonsoir,
j’ai mis a jour le tuto et tester tout ca. C’est top :slight_smile:

du coup j’ai rajouter les infos du serveur sur mon graph (mini-graph-card + card-mod)
serveur

je vous partage le code:

  - type: custom:mini-graph-card
    decimals: 0
    hour24: true
    height: 79
    hours_to_show: 24
    points_per_hour: 2
    line_width: 2
    entities:
      - entity: sensor.speedtest_cli_ping
        name: Ping
    show:
      fill: true
      graph: line
      icon: true
      name: true
      state: true
      labels: false
      extrema: false
      average: false
      icon_adaptive_color: true
    align_icon: right
    align_state: left
    font_size: 70
    animate: true
    color_thresholds:
      - value: 34
        color: '#336600'
      - value: 36
        color: '#f39c12'
      - value: 38
        color: '#d35400'
      - value: 40
        color: '#c0392b'
    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: 1 !important;
      }
      ha-card {
        box-shadow: none;
      }
      ha-card .states.flex::after {
        content: "Serveur: {{states('sensor.speedtest_location')}} - {{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: 14px;
      }
2 « J'aime »

@WarC0zes

re

petit souci de chevauchement voir cadre blanc

Capture d’écran 2022-11-10 023840

supprime margin-top:

      ha-card {
        margin-top: -18px !important;  # supprime c'est ligne

j’ai edit mon message et j’ai suprimer c’est ligne.

1 « J'aime »

@WarC0zes merci

C’est good :+1:
Capture d’écran 2022-11-10 030641

1 « J'aime »

Merci @WarC0zes

N’arrivant pas a avoir les infos via l’intégration freebox, cette solution me convient tout autant.

Merci à toi pour le partage!

1 « J'aime »

Bonjour à tous et merci pour ce super travail.
Question: est-il possible de définir un serveur de test par défaut ?
En effet tous les serveurs ne se valent pas (surtout avec une grosse connexion fibre)
Je n’ai rien vu qui faisait référence à cette possibilité

Merci d’avance

Salut @Guizmos

Tu peux lister les serveurs les plus proches avec (à adapter selon l’installation) :

speedtest -L

Et dans la commande speedtest tu ajoutes l’id du serveur (exemple avec la commande fournie par @WarC0zes et l’ID 45446) :

/config/3rdparty/speedtest/speedtest -s 45446 --format=json --accept-license --accept-gdpr
2 « J'aime »

Super merci, ça fonctionne parfaitement

speedtest

:slight_smile:

Est-il possible de lancer le test manuellement via un script (ou autre)?

Script au sens « HA » ou au sens script plus large ?

Je voudrais pouvoir lancer un speedtest via un bouton depuis HA

Si tu as suivi le tuto de WarC0zes, un bouton de ce genre devrait foncionner :

show_name: true
show_icon: true
type: button
tap_action:
  action: call-service
  service: homeassistant.update_entity
  data: {}
  target:
    entity_id: sensor.speedtest_cli_data
icon: mdi:router-network
name: Update Speedtest
1 « J'aime »

Au top merci beaucoup :relaxed: