Probleme pour mettre a jour un sensor avec un fichier txt

Bonjour,

Mon problème

J’ai un texte qui se trouve dans fichier txt sur mon système. Lisible et accessible. Je voudrais lire et le diffuser sur un media_player.
Mais quand j’essaie il reviens toujours en unknow.
J’ai essayé avec une command-line mais quoi que je fasse c’est toujours le même résultat.
J’ai tenter avec un sensor file mais c’est pareil.
Mon fichier text est bon et ne bouge pas mais je n’arrive pas à utiliser ce text dans un sensor.

Merci de votre aide

Ma configuration


[center]## System Information

version core-2024.11.2
installation_type Home Assistant OS
dev false
hassio true
docker true
user root
virtualenv false
python_version 3.12.4
os_name Linux
os_version 6.6.54-haos
arch x86_64
timezone Europe/Paris
config_dir /config
Home Assistant Community Store
GitHub API ok
GitHub Content ok
GitHub Web ok
HACS Data ok
GitHub API Calls Remaining 5000
Installed Version 2.0.1
Stage running
Available Repositories 1529
Downloaded Repositories 16
Home Assistant Cloud
logged_in true
subscription_expiration 1 janvier 2018 à 01:00
relayer_connected false
relayer_region null
remote_enabled false
remote_connected false
alexa_enabled false
google_enabled true
cloud_ice_servers_enabled true
remote_server null
certificate_status null
instance_id 92090fedbdf34cf3ba818e941e84de55
can_reach_cert_server ok
can_reach_cloud_auth ok
can_reach_cloud ok
Home Assistant Supervisor
host_os Home Assistant OS 13.2
update_channel stable
supervisor_version supervisor-2024.11.2
agent_version 1.6.0
docker_version 27.2.0
disk_total 234.0 GB
disk_used 23.7 GB
healthy true
supported true
host_connectivity true
supervisor_connectivity true
ntp_synchronized true
virtualization
board generic-x86-64
supervisor_api ok
version_api ok
installed_addons Music Assistant Server (2.3.3), Mosquitto broker (6.4.1), VLC (0.3.0), Studio Code Server (5.17.3), Zigbee2MQTT (1.41.0-1), Silicon Labs Multiprotocol (2.4.5), Matter Server (6.6.0), eWeLink Smart Home (1.4.3), Spotify Connect (0.13.0), ESPHome Device Compiler (2024.11.0), FlareSolverr (3.3.21), Home Assistant Google Drive Backup (0.112.1), Nginx Proxy Manager (1.0.1), ESPresense Companion (1.0.14), Home-Assistant-Matter-Hub (3.0.0-alpha.36), Assist Microphone (1.2.0), openWakeWord (1.10.0), Piper (1.5.2), Whisper (2.2.0), Samba share (12.3.2), MQTT Explorer (browser-1.0.1), Terminal & SSH (9.15.0)
Dashboards
dashboards 4
resources 11
views 16
mode storage
Recorder
oldest_recorder_run 11 novembre 2024 à 15:16
current_recorder_run 21 novembre 2024 à 14:20
estimated_db_size 742.14 MiB
database_engine sqlite
database_version 3.45.3
[/center] ___

Bonjour,
Partage tes essais pour voir comment tu fais.
pourquoi ne pas mettre ce texte directement dans le script / automatisation / input_text?
Bob

qu’est ce que tu veux voir ?

Je n’ai pas utiliser le input_text car il est limité à 255 caractères.

  - platform: file
    name: "Reponse"
    file_path: /config/response.txt

J’ai aussi essayé la command-line:

  - platform: command_line
    name: "Message"
    command: "cat /config/response.txt" # Lit le contenu du fichier
    scan_interval: 60 # Vérifie toutes les 60 secondes
    value_template: "{{ value | default('Aucun message disponible.') }}"

Bonsoir @Knmss
Tu écris

Tu veux dire que son emplacement ne bouge pas ou son contenu ?
Je vais faire un petit test command_line de mon côté :wink:

Bob

Son contenu change.
Justement c’est un contenu généré par chatgpt tous les jours.
La réponse est généré avec un script python.
Juste je n’arrive pas à diffuser cette réponse sur mes lecteurs.
La diffusion fonctionne. Quand je regarde l’état du capteur, il est en état unknow (inconnu je suppose) et c’est ce qu’il dit.
Avant je n’arrivais à récupérer la réponse dans un capteur avec une « rest_command ».
J’ai finit par faire un script python qui met le message dans un fichier text.
Mon problème c’est je n’arrive pas à toujours pas récuperer ce message pour le diffuser.

J’ai fait quelques tests en me basant un peu sur ce sujet qui date un peu mais pas mieux.

Sinon ce cas pour diffuser des messages longs sur un media_player fonctionne bien:

Mais ce n’est pas ta question :wink:
Bob

J’ai tenté la methode mais pas plus de resultat quand je fais ça, j’ai l’impression qu’il ne se crée pas correctement. J’arrive pas à le voir ds les etats.
J’ai l’impression d’avoir un problème dans la syntaxe de mon fichier config mais il me dit que tout est ok.

Je commence à me demander si j’ai pas un soucis plus profond car quelque soit les manipulations que je fais, je ne vois pas les sensor que je suis censé créer.
Et je vois encore un input_select que j’avais essayé avant. Je les vois toujours alors que je les ai tous retiré de mon fichier config.

J’ai trouvé la solution.
Il faut enregistrer la réponse dans les attributs et pas dans l’état car l’état est limité pas les attributs.
Maintenant ça fonctionne nickel.

import requests
import datetime

# Configuration de Home Assistant
API_URL = 'http://192.168.1.20:8123/api/'  # Remplacez par l'URL de votre instance Home Assistant
TOKEN = 'xxxXXxxxxx' #Remplacez par API Home assistant
OPENAI_API_KEY = 'sk-proj-XxXXXxxXX'  #Remplacer par votre API OpenAI

def generate_response(prompt):
    url = 'https://api.openai.com/v1/chat/completions'
    headers = {
        'Authorization': f'Bearer {OPENAI_API_KEY}',
        'Content-Type': 'application/json'
    }
    data = {
        'model': 'gpt-3.5-turbo',
        'messages': [
            {'role': 'system', 'content': "Vous êtes un assistant avancé de ma maison connectée, spécialisé dans l'interaction avec les enfants. Vous avez une personnalité joyeuse et engageante, capable de rendre les informations amusantes et captivantes pour mes deux jeunes enfants, âgés de 5 ans et 9 ans."},
            {'role': 'user', 'content': prompt}
        ]
    }
    response = requests.post(url, headers=headers, json=data)
    return response.json()

def get_home_assistant_data(sensor_url):
    response = requests.get(sensor_url, headers={'Authorization': f'Bearer {TOKEN}'})
    return response.json()

def update_home_assistant_sensor(entity_id, response):
    url = f'{API_URL}states/{entity_id}'
    headers = {
        'Authorization': f'Bearer {TOKEN}',
        'Content-Type': 'application/json'
    }
    data = {
        'state': 'ok',  # Optionnel : vous pouvez définir un état significatif ici
        'attributes': {
            'last_response': response  # Enregistre la réponse dans les attributs
        }
    }
    response = requests.post(url, headers=headers, json=data)
    return response.json()

def main():
    # URL pour obtenir l'état des capteurs
    weather_sensor_url = f'{API_URL}states/weather.villeneuve_la_garenne'
    anniversary_sensor_url = f'{API_URL}states/calendar.anniversaires'
    naely_sensor_url = f'{API_URL}states/calendar.naely'
    naely_2_sensor_url = f'{API_URL}states/calendar.naely_2'
    tao_sensor_url = f'{API_URL}states/calendar.tao'
    tao_2_sensor_url = f'{API_URL}states/calendar.tao_2'

    # Obtenir les données de la météo
    weather_data = get_home_assistant_data(weather_sensor_url)
    print("Données Météo:", weather_data)  # Afficher les données de la météo

    # Obtenir les informations sur les anniversaires et les capteurs de Naely et Tao
    anniversary_data = get_home_assistant_data(anniversary_sensor_url)
    print("Données Anniversaire:", anniversary_data)  # Afficher les données d'anniversaire

    naely_data = get_home_assistant_data(naely_sensor_url)
    print("Données Naely:", naely_data)  # Afficher les données de Naely

    naely_2_data = get_home_assistant_data(naely_2_sensor_url)
    print("Données Naely 2:", naely_2_data)  # Afficher les données de Naely 2

    tao_data = get_home_assistant_data(tao_sensor_url)
    print("Données Tao:", tao_data)  # Afficher les données de Tao

    tao_2_data = get_home_assistant_data(tao_2_sensor_url)
    print("Données Tao 2:", tao_2_data)  # Afficher les données de Tao 2

    # Récupérer la date du jour
    today_date = datetime.datetime.now().strftime("%Y-%m-%d")

    weather_attributes = weather_data['attributes'] if 'attributes' in weather_data else {}

    # Construire le prompt
    prompt = (
        "Votre tâche est de décrire la météo du jour de manière ludique et de donner des conseils pour bien s'habiller en fonction de la météo, "
        "leur donner la date du jour complète en utilisant des analogies et des histoires qui plairont à mes enfants qui se préparent pour l'école. "
        "Voici les détails que vous devez prendre en compte : la date du jour, conditions météorologiques, la température, le vent. "
        "Vous leur direz le programme de la journée. Un décompte avant les prochaines vacances peut leur faire plaisir."
        "Vous pouvez leur raconter une anecdote educative."
        f"Aujourd'hui, nous sommes le {today_date}. "
    )

    # Récupérer les informations d'anniversaire
    if 'attributes' in anniversary_data:
        anniversary_message = anniversary_data['attributes'].get('message', 'Aucun message d\'anniversaire prévu.')
        anniversary_start_time = anniversary_data['attributes'].get('start_time', 'Pas de temps défini.')
        anniversary_end_time = anniversary_data['attributes'].get('end_time', 'Pas de temps défini.')
        prompt += f"Anniversaire: {anniversary_message}, Commence à {anniversary_start_time}, Fin à {anniversary_end_time}\n"

    # Ajoutez les informations pour Naely
    if 'attributes' in naely_data:
        naely_message = naely_data['attributes'].get('message', 'Aucun message prévu.')
        naely_start_time = naely_data['attributes'].get('start_time', 'Pas de temps défini.')
        naely_end_time = naely_data['attributes'].get('end_time', 'Pas de temps défini.')
        prompt += f"Activité Naely: {naely_message}, Commence à {naely_start_time}, Fin à {naely_end_time}\n"

    # Ajoutez les informations pour Naely 2
    if 'attributes' in naely_2_data:
        naely_2_message = naely_2_data['attributes'].get('message', 'Aucun message prévu.')
        naely_2_start_time = naely_2_data['attributes'].get('start_time', 'Pas de temps défini.')
        naely_2_end_time = naely_2_data['attributes'].get('end_time', 'Pas de temps défini.')
        prompt += f"Activité Naely 2: {naely_2_message}, Commence à {naely_2_start_time}, Fin à {naely_2_end_time}\n"

    # Ajoutez les informations pour Tao
    if 'attributes' in tao_data:
        tao_message = tao_data['attributes'].get('message', 'Aucun message prévu.')
        tao_start_time = tao_data['attributes'].get('start_time', 'Pas de temps défini.')
        tao_end_time = tao_data['attributes'].get('end_time', 'Pas de temps défini.')
        prompt += f"Activité Tao: {tao_message}, Commence à {tao_start_time}, Fin à {tao_end_time}\n"

    # Ajoutez les informations pour Tao 2
    if 'attributes' in tao_2_data:
        tao_2_message = tao_2_data['attributes'].get('message', 'Aucun message prévu.')
        tao_2_start_time = tao_2_data['attributes'].get('start_time', 'Pas de temps défini.')
        tao_2_end_time = tao_2_data['attributes'].get('end_time', 'Pas de temps défini.')
        prompt += f"Activité Tao 2: {tao_2_message}, Commence à {tao_2_start_time}, Fin à {tao_2_end_time}\n"

    # Afficher le prompt final avant d'envoyer à ChatGPT
    print("Prompt envoyé à ChatGPT :")
    print(prompt)

    # Ajouter l'instruction pour générer une réponse
    response = generate_response(prompt)

    if 'choices' in response and len(response['choices']) > 0:
        chatgpt_response = response['choices'][0]['message']['content']
        
        # Mettre à jour le sensor dans Home Assistant avec la réponse de ChatGPT
        update_home_assistant_sensor('sensor.chatgpt_response', chatgpt_response)

        # Afficher la réponse de ChatGPT
        print("Réponse de ChatGPT :", chatgpt_response)
    else:
        print("Erreur dans la réponse :", response)

if __name__ == '__main__':
    main()

Avec ce script, il prend en compte les calendriers des activités de mes enfants, la météo et donne des conseils vestimentaires. en fonction de la météo.