Intégrer Speedtest CLI Officielle à Home Assistant

J’ai rétention normale, je vois donc jusqu’au 24 décembre


L’erreur vers le 3 à commencer ?

Réglage chez moi !

    scan_interval: 7200
    command_timeout: 60

Historique sur aujourd’hui

Je suis bête , il y a les states a long terme ajouter dans l’historique maintenant :sweat_smile:

ca pas l’air d’être la maj du core, car j’ai rien installer du 11/01. core 2024.1.1 installer le 06/01, core 2024.1.2 le 07/01 et le core 2024.1.3 le 13/01.
j’ai maj NGINX proxy SSL le 09/01. :thinking:

réglage chez moi:

    scan_interval: 3600
    command_timeout: 60

On dirait que c’est la longueur du JSON qui dépasse les 255 caractères qui fait planté !

homeassistant.exceptions.InvalidStateError: Invalid state with length 264. State max length is 255 characters.

Il faut que je modifie le retour JSON

bonjour la compagnie,

je penserai que tu as raison sur l’histoire de l’update du core sans mettre une main a couper… :rofl:

j’ai deux speedtest en docker :

  • speedtest tracker : alexjustesen/speedtest-tracker
  • speedtest2mqtt : adorobis/speedtest2mqtt (pour HA)

et je n’ai aucun soucis d’indisponibilité !!

Je le savais, on a eu une discution plus haut a ce sujet.
J’avais diminuer pour pas avoir de soucis, mais je vois pas l’erreur dans les logs.
je vais encore diminuer voir.

actuellement j’ai c’est configue:

- sensor:
    name: "SpeedTest CLI Data"
    unique_id: speedtest_cli_data
    # Use the path as configured on your system
    command: "/config/3rdparty/speedtest/speedtest -s 4036 --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
      }}

J’ai modifier pour la longueur sans le server_name et host … Je fais test sur 30 minutes ! maintenant

- sensor:
    name: "SpeedTest CLI Data"
    unique_id: speedtest_cli_data

    command: "/config/speedtest/speedtest --format=json --accept-license --accept-gdpr"
    scan_interval: 1800
    command_timeout: 60

    # # Attention à la limite de conversion JSON
    value_template: >-
      {{ 
        { 
          "ping": value_json.ping.latency,
          "download": value_json.download.bandwidth,
          "upload": value_json.upload.bandwidth,
          "isp": value_json.isp,
          "url": value_json.result.url,
          "location": value_json.server.location,
          "id": value_json.server.id
        }
        | to_json
      }}

Je précise pas le server ! dans la cde !
ICI Portugal pas trop !

j’ai mis ca:

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

on verra dans les prochaines heures.

Comme je n’avais que 9 caracteres de trop les server me suffisait à supprimer !
Je laisse tourner sur 1800 sec, on verra !

Depuis la modification a 17h pas de problème, je scruterai demain, je laisse sur 1800 sec @+

J’ai eu des trous depuis ma modification, ca pas l’air ca.
speedtest indisponible3

Edit:
j’ai modifier ma command:
avant

command: "/config/3rdparty/speedtest/speedtest -s 4036 --format=json --accept-license --accept-gdpr"

après

command: '/config/3rdparty/speedtest/speedtest --server-id=4036 --format=json'
  • --accept-license: Accept the Ookla EULA, TOS and Privacy policy. The terms only need to be accepted once.
  • --accept-gdpr: Accept the Ookla GDPR terms. The terms only need to be accepted once.

je test …

Edit 2:
ca bugger.
je suis revenu a ca:

    name: "SpeedTest CLI Data"
    unique_id: speedtest_cli_data
    # Use the path as configured on your system
    command: '/config/3rdparty/speedtest/speedtest --accept-license --accept-gdpr --server-id=4036 --format=json'
    # 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,
          "location": value_json.server.location,
          "server_name": value_json.server.name
        }
        | to_json
      }}

Salut.
Pour moi pas de bug!


J’ai mis le test tout les 30minutes, pour voir si c’était pas la dispo qui faisait bug !
mais avant je voyais bien que le JSON était trop long pour le décodage, c’est pour cela que j’ai limité sa longueur, en supprimant server, de toute façon le plus long c’est l’url !
Pas facile de voir si c’est çà, mais le cli_data donne l’info ( si remonte)
Voir le TIMEOUT pour toi !, mais il faut faire test en direct, sur Speedtest !

EDIT: Le test réalisé en moins de 40 sec ! sur serveur le plus lent !

Avec Putty , j’ai pas de problème pour faire des test de vitesse.
mais avec le command_line, toujours la même erreur de temps en temps.

2024-01-13 16:45:50.134 ERROR (SyncWorker_11) [homeassistant.components.command_line.utils] Command failed (with return code 2): /config/3rdparty/speedtest/speedtest -s 4036 --format=json --accept-license --accept-gdpr
2024-01-13 16:45:50.145 ERROR (MainThread) [homeassistant.components.template.template_entity] TemplateError('JSONDecodeError: unexpected character: line 1 column 1 (char 0)') while processing template 'Template<template=({{ (states('sensor.speedtest_cli_data') | from_json).ping | round(2) }}) renders=6>' for attribute '_attr_native_value' in entity 'sensor.speedtest_cli_ping'
2024-01-13 16:45:50.147 ERROR (MainThread) [homeassistant.components.template.template_entity] TemplateError('JSONDecodeError: unexpected character: line 1 column 1 (char 0)') while processing template 'Template<template=({{ ((states('sensor.speedtest_cli_data') | from_json).download * 8 / 1000 / 1000) | round(2) }}) renders=6>' for attribute '_attr_native_value' in entity 'sensor.speedtest_cli_download'
2024-01-13 16:45:50.152 ERROR (MainThread) [homeassistant.components.template.template_entity] TemplateError('JSONDecodeError: unexpected character: line 1 column 1 (char 0)') while processing template 'Template<template=({{ ((states('sensor.speedtest_cli_data') | from_json).upload * 8 / 1000 / 1000) | round(2) }}) renders=6>' for attribute '_attr_native_value' in entity 'sensor.speedtest_cli_upload'
2024-01-13 16:45:50.153 ERROR (MainThread) [homeassistant.components.template.template_entity] TemplateError('JSONDecodeError: unexpected character: line 1 column 1 (char 0)') while processing template 'Template<template=({{ ((states("sensor.speedtest_cli_data") | from_json).isp) }}) renders=6>' for attribute '_attr_native_value' in entity 'sensor.speedtest_isp'
2024-01-13 16:45:50.154 ERROR (MainThread) [homeassistant.components.template.template_entity] TemplateError('JSONDecodeError: unexpected character: line 1 column 1 (char 0)') while processing template 'Template<template=({{ ((states("sensor.speedtest_cli_data") | from_json).server_name) }}) renders=6>' for attribute '_attr_native_value' in entity 'sensor.speedtest_server_name'
2024-01-13 16:45:50.155 ERROR (MainThread) [homeassistant.components.template.template_entity] TemplateError('JSONDecodeError: unexpected character: line 1 column 1 (char 0)') while processing template 'Template<template=({{ ((states("sensor.speedtest_cli_data") | from_json).server_host) }}) renders=6>' for attribute '_attr_native_value' in entity 'sensor.speedtest_server_host'

je comprends pas c’est erreur JSONDecodeError: unexpected character: line 1 column 1 (char 0)

voici ma configue, command_line.yaml:

- sensor:
    name: "SpeedTest CLI Data"
    unique_id: speedtest_cli_data
    command: '/config/3rdparty/speedtest/speedtest --accept-license --accept-gdpr --server-id=4036 --format=json'
    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,
          "location": value_json.server.location,
          "server_name": value_json.server.name
        }
        | to_json
      }}

template.yaml

- 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 | round(2) }}"
    - 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 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 location
      unique_id: Speedtest_location
      state: '{{ ((states("sensor.speedtest_cli_data") | from_json).location) }}'

Si tu vois un truc d’anormal ?

Je te mets mon décodage ! je vais sur le PC

EDIT :

- 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" => /125000 [remonte en bytes /secondes] *8/1000/1000
      unit_of_measurement: Mbit/s
      state_class: measurement
      state: "{{ ((states('sensor.speedtest_cli_data') | from_json).download  / 125000) | round(3) }}"
    - 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  / 125000) | round(3) }}"
    - 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 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) }}'      
    - name: 'Speedtest CLI URL'
      unique_id: speedtest_url
      state: '{{ ((states("sensor.speedtest_cli_data") | from_json).url) }}'

Nota j’ai pas virer les décodage des server !

Un caractere qui traine ? Voir le cli_data !

Edit: un des derniers cli_data du mien

{"ping":9.951,"download":116003261,"upload":53603358,"isp":"MEO","url":"https://www.speedtest.net/result/c/d96c3966-e3ac-42b1-9864-e16b49c8e6e4","location":"Porto","id":47363}
1 « J'aime »

Je vois rien line 1 column 1

- sensor:
    name: 'SpeedTest CLI Data'
    unique_id: speedtest_cli_data
    command: '/config/3rdparty/speedtest/speedtest --accept-license --accept-gdpr --format=json'
    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,
          "location": value_json.server.location,
          "server_name": value_json.server.name
        }
        | to_json
      }}

{"ping":29.931,"download":106361711,"upload":72349750,"isp":"Orange","location":"Toulouse","server_name":"SHPV FRANCE SAS"}

Je vois que tu as un code 2 en retour ? Est-ce le cas à chaque fois ?
La doc dit le code retour doit être 0, pour être OK ?

J’ai un code erreur 2 a chaque fois que ca fonctionne pas, sinon aucune erreur et ca fonctionne.
C’est aléatoire :thinking:

j’ai viré la commande serverid , j’ai fait comme toi. Autant c’est le server que je choisi qui a un problème, je vais voir sans le choix du serveur.

command: '/config/3rdparty/speedtest/speedtest --accept-license --accept-gdpr --format=json'

Je suis en train de refaire les sensors par Template direct de l’UI, donc plus de mémoire pour l’instant!
je vais faire test sur 15 minutes pour les graph , seulement pour test

J’ai fait simple de mon coté, l’ISP, je le connais :slight_smile: , et le serveur de test, perso, je m’en fou un peu, je n’ai donc gardé que les 3 paramètres importants dans une connexion internet, et aucun pb détecté de coupure dans les graphs.

  - sensor:
      name: "SpeedTest CLI Data"
      unique_id: speedtest_cli_data
      command: "/config/3rdparty/speedtest/speedtest --format=json --accept-license --accept-gdpr"
      scan_interval: 3600
      command_timeout: 60
      value_template: >-
        {{ 
          { 
            "ping": value_json.ping.latency,
            "download": value_json.download.bandwidth,
            "upload": value_json.upload.bandwidth
          }
          | to_json
        }}

J’ai refais Template par UI, donc RAZ

✅La commande
- sensor:
    name: "SpeedTest CLI Data"
    unique_id: speedtest_cli_data

    command: "/config/speedtest/speedtest --format=json --accept-license --accept-gdpr"
    scan_interval: 600
    command_timeout: 60

    # # Attention à la limite de conversion JSON [255 caracteres]
    value_template: >-
      {{ 
        { 
          "ping": value_json.ping.latency,
          "download": value_json.download.bandwidth,
          "upload": value_json.upload.bandwidth,
          "isp": value_json.isp,
          "url": value_json.result.url,
          "location": value_json.server.location,
          "id": value_json.server.id
        }
        | to_json
      }}



image

Sans la commande --server-id=4036 ou -s 4036, ca l’air bon.
Le seul soucis, c’est que j’ai des serveurs moyen autour de chez moi et que les tests sont moyen.
2 a toulouse , 1 a andorre et 3 en espagne :rofl:
le serveur ID 4036 est a marseille et j’ai un test fullspeed et un bon ping.