Problème exécution script Python

Bonjour,

J’essai de lancer un script python, mais j’ai une erreur sans explication claire que voici

Logger: homeassistant.setup
Source: setup.py:221
First occurred: 00:22:36 (1 occurrences)
Last logged: 00:22:36

Setup failed for 'python_scripts': Integration not found.

En cherchant sur le forum, j’ai vu ce test mais sans succès vu qu’il y a une erreur

Le fichier avec le script est bien dans le dossier \config\python_scripts
Voici mon Configuration.yaml


# Loads default set of integrations. Do not remove.
homeassistant:
  packages: !include_dir_named packages/
default_config:

# Load frontend themes from the themes folder
frontend:
  themes: !include_dir_merge_named themes

automation: !include automations.yaml
script: !include scripts.yaml
scene: !include scenes.yaml
#command_line: !include command_line.yaml

python_scripts:

Et voici le Script en question qui est issu d’ici

#!/usr/bin/python

import requests
import requests.exceptions
import json
import time
from paho.mqtt import client as mqtt_client

LOGIN_URL       = "http://xxxxxxxxxxxxxxx/login"
DATA_URL1       = "http://xxxxxxxxxxxxxxxxx/battery-status"
DATA_URL2       = "http://xxxxxxxxxxxxxxxx/imeon-status"
DATA_URL3       = "http://xxxxxxxxxxxxxxx/data-lithium"
EMAIL           = "xxxxxx" # default Imeon login
PASSWORD        = "xxxxxxxx"  # default Imeon pass
broker          = 'xxxxxxxxx'
port            = xxxxxxx
sensor_topic    = "homeassistant/Imeon/sensor" # or wherever else you want to send it, will work oob with the provided home assitant config
status_topic    = "homeassistant/Imeon/status" # or wherever else you want to send it, will work oob with the provided home assitant config
client_id       = "xxxxxxxxxx"
username        = "xxxxxxxxxx"
password        = "xxxxxxxxxxx"
debug           = False # True will display the output on your tty
payload         = {}

def connect_mqtt():
    def on_connect(client, userdata, flags, rc):
      if debug:
        if rc == 0:
            print("Connected to MQTT Broker!")
        else:
            print("Failed to connect, return code %d\n", rc)
    client = mqtt_client.Client(client_id)
    client.username_pw_set(username, password)
    client.on_connect = on_connect
    client.connect(broker, port)
    return client


def publish(client, msg, topic):
  while True:
    try:
      result = client.publish(topic, msg, qos=0, retain=False)
      status = result[0]
      if debug:
        if status == 0:
           print(f"Sent `{msg}` to topic `{topic}`")
        else:
           print(f"Failed to send message to topic {topic}")

    except Exception as err:
      print("Waiting 5 seconds to reconnect to MQTT server... (" + str(err)+")")
      time.sleep(5)
      continue
    break


def poll_imeon_data():
  global payload
  session = requests.Session()

  try:
      resp    = session.post(LOGIN_URL, data={"email" : EMAIL , "passwd": PASSWORD}, timeout=2)
      data1   = session.get(DATA_URL1, timeout=2)
      data2   = session.get(DATA_URL2, timeout=2)
      data3   = session.get(DATA_URL3, timeout=2)

      resp.raise_for_status()
      data1.raise_for_status()
      data2.raise_for_status()
      data3.raise_for_status()

      values1 = data1.json()
      values2 = data2.json()
      values3 = data3.json()

      payload["Timestamp"]           = str(time.ctime())
      payload["Battery_status"]      = str(values1['bat_status'])
      #payload["Battery_state"]      = str(values2['state_battery']['message'])
      payload["Battery_activity"]    = str(values2['state_battery']['class'])
      payload["Battery_current"]     = str(values3['battery-current'])
      payload["Battery_tension"]     = str(values3['battery-tension'])
      payload["Battery_temperature"] = str(values3['tmp-bat'])
      payload["Battery_charge"]      = str(values3['bms-soc'])
      payload["Battery_error"]       = str(values3['error'])
      payload["Battery_warning"]     = str(values3['warning'])

      A = str(values2['state_grid']['message'])
      B = str(values2['state_meter']['message'])
      C = str(values2['state_pv']['message'])

      payload["Grid_state"]          = A.rstrip(A[-1])
      payload["Meter_state"]         = B.rstrip(A[-1])
      payload["PV_state"]            = C.rstrip(A[-1])

      payload["Meter_status"]        = str(values2['state_meter']['class'])
      payload["Inverter_state"]      = str(values2['state_inverter']['message'])
      payload["State_timeline"]      = str(values2['state_timeline']['detail'])
      payload["Error_history"]       = str(values1['error_history'][0])

      if debug:
        for x in payload:
          print(x, " : ", payload[x])

  except Exception as err:
      print("Imeon is eating glue again... (" + str(err)+")")
      #time.sleep(10)
      #continue
      raise SystemExit
    #break

def run():
    global payload
    
    client = connect_mqtt()
    client.loop_start()
    client.will_set(status_topic, payload="offline", qos=0, retain=False)
    poll_imeon_data()
    publish(client, "online", status_topic)
    publish(client, json.dumps(payload), sensor_topic)
    client.loop_stop()

if __name__ == '__main__':
    run()

Je vous remercie par avance pour la future aide apporter

Salut @Yoyouri

De mémoire dans configuration.yaml c’est sans le « s » :

python_script:

[EDIT] depuis la doc

image

Salut
Merci pour cette réponse, je test en direct

Alors je n’es plus l’erreur par contre je n’ai aucune données qui remonte dans l’Outils de développement Etat

De plus je n’ai pas trouver où mettre le crontab indiqué dans le lien

Then just run this python script with a crontab like : */5 * * * * /usr/bin/python /usr/local/python/imeon-stats.py >/dev/null 2>&1 (provided as an exemple in the repo as well)

Merci par avance

Déjà, si tu vas dans les outils de dev, onglet « services » tu sais lancer le script sans erreur :

image

Parce qu’à vrai dire j’ai un doute sur le fait que le gars le fasse tourner directement sur HA.

Voilà ce que j’ai

image

image

A première vu j’ai un problème de Librairie

Peut-être !
J’ai lu sur la doc du Script celà
It is not possible to use Python imports with this integration. If you want to do more advanced scripts, you can take a look at [AppDaemon](https://appdaemon.readthedocs.io/en/latest/) or [pyscript](https://github.com/custom-components/pyscript)
J’ai installé Appdeamon, mais ensuite je n’ai pas compris comment l’utiliser

Effectivement j’avais oublié ce détail :confused:

Par contre, tous les modules importés dans ce script sont bien présents de base dans HA.

Je t’envoie en mp un truc à tenter :wink:

Ok merci d’avance

Et au besoin ça peut attendre demain

Je te conseille d’aller plutôt par la voie Pyscript si tu veux exécuter des scripts Python depuis HA directement :wink: Cela marche bien mieux et plus facile à débugger aussi !

Salut

Je viens d’essayer, ça semble plus parlant mais j’ai cette erreur dans les logs


Logger: aiohttp.server
Source: /usr/local/lib/python3.12/site-packages/aiohttp/web_protocol.py:421
First occurred: 11:18:58 (2 occurrences)
Last logged: 11:52:08

Error handling request
Traceback (most recent call last):
  File "/usr/local/lib/python3.12/site-packages/aiohttp/web_protocol.py", line 350, in data_received
    messages, upgraded, tail = self._request_parser.feed_data(data)
                               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "aiohttp/_http_parser.pyx", line 557, in aiohttp._http_parser.HttpParser.feed_data
aiohttp.http_exceptions.BadStatusLine: 400, message:
  Invalid method encountered:

    b'\x16\x03\x01'
      ^

Cela ressemble à une erreur de parsing ou de syntaxe dans ton script :confused:

Ok mais comment la résoudre !!
Déjà que j’ai du mal avec le code YAML alors avec du python je ne vois pas comment le résoudre moi-même

Ca ressemble à un problème d’encodage des caractères. Il faut identifier sur quelle ligne l’erreur se situe.

Est-ce que ça pourrait être du fait que je n’ai pas mis de crontab comme indiqué sur le lien Github ?

Non pas du tout, cela n’a rien à voir avec la crontab.

J’aurai tendance à dire que cela se passe ici :

      resp    = session.post(LOGIN_URL, data={"email" : EMAIL , "passwd": PASSWORD}, timeout=2)
      data1   = session.get(DATA_URL1, timeout=2)
      data2   = session.get(DATA_URL2, timeout=2)
      data3   = session.get(DATA_URL3, timeout=2)

Tu peux activer le debug en indiquant :

debug           = True

au lieu de

debug           = False

Je viens de le faire et j’ai redémarré HA
Mais ayant des avertissements je ne vois pas dans la liste l’exécution du script

Comment faut-il faire pour le lancer manuellement ?

After starting Home Assistant, use the Service tab in the Developer Tools page to call the service pyscript.hello_world with parameters

https://hacs-pyscript.readthedocs.io/en/stable/tutorial.html#writing-your-first-script

Il faut remplacer « hello_world » par le nom de ton script.

Voici l’erreur que j’ai


Logger: aiohttp.server
Source: /usr/local/lib/python3.12/site-packages/aiohttp/web_protocol.py:421
First occurred: 14:35:05 (3 occurrences)
Last logged: 14:54:13

Error handling request
Traceback (most recent call last):
  File "/usr/local/lib/python3.12/site-packages/aiohttp/web_protocol.py", line 350, in data_received
    messages, upgraded, tail = self._request_parser.feed_data(data)
                               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "aiohttp/_http_parser.pyx", line 557, in aiohttp._http_parser.HttpParser.feed_data
aiohttp.http_exceptions.BadStatusLine: 400, message:
  Invalid method encountered:

    b'\x16\x03\x01'
      ^

Mais pas plus d’info qu’avant à moins qu’il y ai une façon particulière pour accéder aux debugs !!

Il faudrait exécuter et tester le script en dehors de HA maison bon il faut mettre en place la stack pour ça.

Ok, mais faut faire comment ?

Désolé, je vais passer mon tour. Je ne vais pas avoir le temps.