PARTAGE prévisions nombres d'heures de soleil sur 7 jours Script Python3

Tu a un petit icon a droite ? pour t’aider a faire le réglage.
tu choisi récurent
heure
puis la minute dans l’heure …


Genre comme ceci c bon

Donc à partir de 8h du mat ça actualise toute les heures c ça ?

C’est presque ca …
la c’est toutes les heures a la 8ieme minute.

0h08 1h08 2h08 …23h08

1 « J'aime »

Merci @olive ,

Top ce tuto/partage! ça donne plein d’idée, signe que c’est un bon!

du coup, sur ta base, je vais récupérer tout plein d’infos, j’empaquette dans un json que je traite dans un widget
(ex direction et force du vent : {« vitesse »: " 63", « direction »: « NE »} => image )

Ma question est :

Plutôt que d’avoir x commandes, comment est ce que je peux exécuter le script python, faire mes petites boucles sur mes intérêts, et aller valoriser les infos d’un virtuel avec?

En gros comment passer d’un script python/BeautifulSoup vers plusieurs info widget!?

D’accord merci bcp pour l’aide

Ce que tu veut faire est possible mais ne s’inscrit pas ici dans le cadre de ce tuto.
Voici néanmoins les pistes :
Comme tu le dit dans le script récupérer toutes les infos dont tu a besoin
puis utiliser coté jeedom un virtuel
coté script utiliser urequests get pour envoyer par adresse http les valeurs a ce ou ces virtuels.
tu a un exemple dans la partie 3 ici :

urequests.get("http://IPJEEDOM/core/api/jeeApi.php?plugin=virtual&apikey=APIJEEDOM&type=virtual&id=IDDUVIRTUEL&value=VALEURAENVOYER").text

Merci Olive,
Je sentais la brise venir des urlrequest sur le virtuel!

Une autre méthode serait de faire tes courses dans le script et de renvoyer
toutes les données en une fois dans un champ autre genre des données séparées par des virgules mais te resterait sous jeedom a les décortiquées (spliter) …
peut’ être plus simple depuis un scénario …

Yes, merci Olive !

Mes tests m’ont amené à un bloc code dans un scénario, je print un json à partir d’une liste python, puis php->virtuel
J’ai utiliser des .strip() dans le python pour ne pas risquer de serrer trop le focus sur le texte et peut être perdre un jour des infos.

en guise d’exercice
image

en une seule requête vers meteoBlue (vit vent, dir vent, ensoleillement, pluie, temp max/min et indice de confiance)
=> ca fait un virtuel à 56 infos!

J’arrête de polluer ton tuto/partage!

les codes à toute fins utiles

le python

#! /usr/bin/env python3
import requests
from sys import argv
import json
from bs4 import BeautifulSoup

res = requests.get(argv[1])
soupe=BeautifulSoup(res.content, "html.parser")

datas={}

for i in range(7):
	subData={}
	subData['vitesse']=int(soupe.find_all(class_ = "wind")[i].text[33:36].strip())
	subData['direction']=soupe.find_all(class_="wind")[i].span['class'][2].strip()
	subData['soleil']=int(soupe.find_all(class_ = "tab_sun")[i].text[62:64].strip())
	subData['pluie']=soupe.find_all(class_ = "tab_precip")[i].text[1:22].strip()
	subData['max_temp']=soupe.find_all(class_ = "tab_temp_max")[i].text[1:55].strip()
	subData['min_temp']=soupe.find_all(class_ = "tab_temp_min")[i].text[1:55].strip()
	subData['predictability']= soupe.find_all(class_ = "meter_outer")[i].div["class"][2].strip()
    
	datas[i]=subData


print(json.dumps(datas))

le code scenario


$scenario->setLog('---------------------------------- démarrage Test Python');
$fileURL = "/var/www/html/script/customs_scripts/soupe_meteo";

$meteoURL="https://www.meteoblue.com/fr/meteo/semaine/avignon_france_3035681"

$command = escapeshellcmd($fileURL." ".$meteoURL);
$output = shell_exec($command);

$dataJson=json_decode($output,true);

for ($i = 0; $i < 7; $i++) {
  	cmd::byString('#[test][Test Meteo Blue][wind_dir'.$i.']#')->event($dataJson[$i]['direction']);
  	cmd::byString('#[test][Test Meteo Blue][wind_vit'.$i.']#')->event($dataJson[$i]['vitesse']);
  	cmd::byString('#[test][Test Meteo Blue][wind_'.$i.']#')->event(json_encode(array('direction'=>$dataJson[$i]['direction'], 'vitesse'=>$dataJson[$i]['vitesse'])));
  	cmd::byString('#[test][Test Meteo Blue][sun_'.$i.']#')->event($dataJson[$i]['soleil']);
  	cmd::byString('#[test][Test Meteo Blue][rain_'.$i.']#')->event($dataJson[$i]['pluie']);
  	cmd::byString('#[test][Test Meteo Blue][max_temp_'.$i.']#')->event($dataJson[$i]['max_temp']);
  	cmd::byString('#[test][Test Meteo Blue][min_temp_'.$i.']#')->event($dataJson[$i]['min_temp']);
  	cmd::byString('#[test][Test Meteo Blue][pred_'.$i.']#')->event(intval(substr($dataJson[$i]['predictability'],-1)));
  
  
  	
}
4 « J'aime »

Superbe tout ca !
Merci pour le partage

Bravo le plus difficile est pas de recuperer les données mais de les présentées dans de beau widgets :slight_smile:

1 « J'aime »

Cela fonctionne après la mise à jour de mon système c’est parfait

1 « J'aime »

Du coup j’ai commencé à jouer un peu avec maintenant que j’ai tout comme il faut.
J’ai d’abord suivi pas à pas pour les heures de soleil : Top cela fonctionne super bien et j’ai pris peur car mes panneaux solaires ne vont pas me chauffer la piscine cette semaine :rofl:

ensuite j’ai fait un soupe2 pour jouer avec le vent et cela remonte bien mais j’ai juste un problème sur l’orientation du vent en plus de l’affichage interne du widget compass qui sera le problème suivant pour que je puisse voir le texte comme il faut.
A partir de J+4 je n’ai plus les mêmes orientations !

Je ne dois pas faire comme il faut, ne connaissant pas trop le python.

Mon soupe 2 ressemble à ça :

#! /usr/bin/env python3
import requests
from sys import argv
from bs4 import BeautifulSoup
res = requests.get(argv[2])
soupe2=BeautifulSoup(res.content, "html.parser")
print(int(soupe2.find_all(class_ = "wind")[int(argv[1])].text[33:36]))

Alors attention le script tel qu’il est ne récupère qu’une info a la fois …

Pour le vent il faut ce méfier lorsqu’il y a des rafales c’est une tranche qui est indiquée
genre 50-70 ce qui peut fausser l’info.

pour ce qui est des direction elle ne sont pas en valeurs °

N NE NO E SE SO O .... etc 

et n’apparaissent pas dans la partie text mais dans la classe …

c’est donc la qu’il faudra chercher l’information (autre) et pas numérique

regarde l’exemple qu’a fait @Bben

subData['direction']=soupe.find_all(class_="wind")[i].span['class'][2].strip()

Tu a pratiquement déjà la, la solution

Salut @jerome6994

La tu récupère la vitesse du vent, et les 2 images sont cohérentes

Il faut chopper la direction dans la classe de la balise span dans la div de class wind.

A propos de .split() et .strip()
Ces 2 commandes peuvent vous faciliter la récupération de données.

Résumé et reprise du contexte sous python3

au prompt python copiez ces lignes avant de tester la suite

import requests
from bs4 import BeautifulSoup
res = requests.get("https://www.meteoblue.com/fr/meteo/semaine/paris_france_2988507")
soupe=BeautifulSoup(res.content, "html.parser")

Rappelez-vous pour récupérer la vitesse du vent dans la partie text

>>> soupe.find_all(class_="wind")[0].text
'\n\n                                35 km/h  

on ajoutait text[33:36] pour aller chercher la valeur a une position …

Voici 2 autres méthode :
split() nous renvoie une liste des éléments

>>> soupe.find_all(class_="wind")[0].text.split()
['35', 'km/h']

il nous suffit de récuperer soit le 1er élément

>>> soupe.find_all(class_="wind")[0].text.split()[0]
'35'

ou le 2ieme

>>> soupe.find_all(class_="wind")[0].text.split()[1]
'km/h'

Passons a strip() (c’est pratiquement l’inverse )

>>> soupe.find_all(class_="wind")[0].text.strip()
'35 km/h'

La on récupère les 2 infos en 1 seule

Attention toute fois au type de votre virtuel binaire/numérique/autre qui doit correspondre au type d’information que vous récuperez …

Voilà je vous laisse faire bon usage et améliorer vos script

Bien je suis sur mon téléphone mais j’ai le cerveau qui a bien chauffé quand même :stuck_out_tongue_winking_eye:

Je comprends un peu quand on explique comme ça en introduisant les éléments et je vais tenter de faire un petit quelque chose quand même.

Merci de vos indications

Tout le tutoriel ici n’est qu’une invitation a apprendre Python
et le scramping est un bon appât :wink:

Oui lais il y a trop de choses bien à faire je vais faire l’over dose :face_vomiting:

Création d’objet avec mon fils
Apprentissage code pour widget
Apprentissage python
Etc…

C’est top mais il va falloir se calmer Jérôme sinon le cerveau va griller :rofl::rofl::rofl:

Bonjour

Mise à jour ce jout du plingin script qui fait génére maintenant une erreur (qui n’existait pas)
Avez vous tous la même chose ?

Erreur sur /var/www/html/core/php/…/…/plugins/script/core/ressources/Soleil1 0 Météo Chennevières-sur-Marne - meteoblue 2>&1 valeur retournée : 127. Détails : sh: 1: /var/www/html/core/php/…/…/plugins/script/core/ressources/Soleil1: not found