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

il ne faut d’espace entre python____et 3.7

Essai voir si tu aurait pas un utilisateur jeedom ?
tu trouve jeedom / xxxxxxxxx
tout en bas de la page le xxxxxx serait le mot de passe
menu reglage/system/configuration onglet _OS>DB

J’ai trouvé ce que tu demandes

ben essai de faire su jeedom au cas ou

Capture8

joker plus d’idées … un reboot au cas ou …

La nuit porte conseil. Merci de ton aide
Boboss

prochainne install fait la en debian10 buster la lib est dedans et le python3.7 aussi
et ne casse pas root avant d’avoir un remplaçant superuser…

Salut @Bben,

Pourrais-tu expliquer un peu plus ton widget ? Je suis extrêmement intéressé.

J’en profite aussi pour remercier @olive pour son tuto qui est excellent.

Salut Anthony,

Un truc en particulier?

Qques infos complémentaires & fichiers

le script récupère les infos dans la page, les mets dans une « liste » et les passent dans un jsonlike au bloc code dans un scénario. Le php récupère le json et le transforme en array exploitable.
je n’utilise pas le plugin script comme le montre Olive ici.
Je traite avec une boucle pour me faciliter la vie => les noms des infos doivent être normalisées.

les codes qui ont un poil changés
#! /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['datetime']=soupe.find_all(class_ = "tab_day_long")[i].time["datetime"]
	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
    
subData={}
subData['titre']=soupe.find_all(class_ = "main-heading")[0].text.strip()
subData['region']=soupe.find_all(class_ = "admin")[0].text.strip()
subData['pays']=soupe.find_all(class_ = "country")[0].text.strip()
subData['coord']=soupe.find_all(class_ = "coords")[0].text.strip()
datas[7]=subData

$scenario->setLog('---------------------------------- démarrage Test Python');
$fileURL = "/var/www/html/script/customs_scripts/soupe_meteo";
$meteoURL="https://www.meteoblue.com/fr/meteo/semaine/wavrin_france_2967411";
#$meteoURL="https://www.meteoblue.com/fr/meteo/semaine/avignon_france_3035681";
#$meteoURL="https://www.meteoblue.com/fr/meteo/semaine/princeton_%C3%89tats-unis_5102922";

#$fileURL = "/var/www/html/plugins/script/core/ressources/soupe_vent";

$scenario->setLog('url file :'.$fileURL." ".$meteoURL);
$scenario->setLog('test file :'.file_exists ($fileURL));

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

$scenario->setLog("sortie : ".$output);

$dataJson=json_decode($output,true);
$scenario->setLog("json : ".$dataJson);
#cmd::byString('#[test][test_Visu WInd][wind]#')->event(json_encode(array('direction'=>$dataJson[0]['direction'], 'vitesse'=>$dataJson[0]['vitesse'])));

for ($i = 0; $i < 7; $i++) {
 	$scenario->setLog($i." | direction : ".$dataJson[$i]['direction']);
    $scenario->setLog($i." | vitesse : ".$dataJson[$i]['vitesse']);
  	$scenario->setLog($i." | soleil : ".$dataJson[$i]['soleil']);
  	$scenario->setLog($i." | pluie : ".$dataJson[$i]['pluie']);
  	$scenario->setLog($i." | max temp : ".$dataJson[$i]['max_temp']);
  	$scenario->setLog($i." | min temp : ".$dataJson[$i]['min_temp']);
  	$scenario->setLog($i." | predict : ".$dataJson[$i]['predictability']."  |  ".substr($dataJson[$i]['predictability'],-1));
  	$scenario->setLog($i." | datetime : ".$dataJson[$i]['datetime']);
  	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)));
  	cmd::byString('#[test][Test Meteo Blue][dt_'.$i.']#')->event($dataJson[$i]['datetime']);
  
  
  	
}

cmd::byString('#[test][Test Meteo Blue][titre]#')->event($dataJson[7]['titre']);
cmd::byString('#[test][Test Meteo Blue][region]#')->event($dataJson[7]['region']);
cmd::byString('#[test][Test Meteo Blue][pays]#')->event($dataJson[7]['pays']);
cmd::byString('#[test][Test Meteo Blue][coord]#')->event($dataJson[7]['coord']);

J’ai rajouté 2/3 trucs pour récup la localisation + les jours associés
image

le widget vent prend un json avec la vitesse+direction, stocké dans le virtuel (une adaptation de ce script de Steve Melcher)
celui de la pluie est une modif du widget rain du core, qui traite la string avec l’écart.

Puis mise en forme de tableau 7 colonnes 9 lignes de mémoire (peut être le plus chiant dans l’affaire!)

les fichiers que j’utilises : Meteo blue.7z.txt (2,4 Ko)

Je suis à la recherche d’idées graphico-css pour l’ensoleillement et l’indice de confiance et les températures. Pour ces dernières, j’aimerai bien une case de couleur en fonction de la température « de saison », un peu comme le code couleur des cartes météos. Mais faut trouver cette info…

Je suis preneur de toute idée et/ou partage!

Merci beaucoup je vais regarder ça ce weekend. Pour tes questions, si tu veux on peut essayer de regarder ça ensemble. J’ai la saison et autres infos, ce qui nous permettrait de récupérer et analyser la température afin de lui incorporer la bonne couleur car je suis du même avis sur le bas de ton design. On peut continuer en MP si tu veux, et comme ça moins polluer le sujet. On reviendra dessus à la fin. Après si tu veux je suis sur le Discord Domotech

Salut, Super tuto, mais je ne comprend pas trop se que signifie text[33:36]

Merci a toi

ben dans le texte récuperer prendre du caractère 33 à 36

si tu regarde bien tu peut changer cette ligne en

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

je comprend, mais j’arrive toujours pas à saisir le nb de caractère…

Capture d’écran 2020-05-24 à 12.02.26

je suis dans la class wind, mais comment compter ? à partir d’ou ?

Ce que tu vois n’est pas la réalité fait le par étapes dans une console

Python 3.7.3 (default, Dec 20 2019, 18:57:59) 
[GCC 8.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> 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")
>>> soupe.find_all(class_="wind")[0].text
'\n\n                                20 km/h                        '
>>> soupe.find_all(class_="wind")[0].text[33:36]
' 20'
>>> 


il y a des caracteres parasite …

'\n\n                                20 km/h                        '

maintenant essai :

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

Je comprend merci, je vai tester ca

Bonjour #olive

Jai un peu de temps alors j’essaie de prendre quelques cours de pyton :wink: avec tes tuto

Dans ton tutoriel 1er post on donne « soupe » comme nom pour le code

Mais dans ton message 63 on met quoi en nom ?

Je suis novice sur ce sujet alors j’ai besoin d’un peu plus de détail

Merci a toi

Peut importe c’est arbitraire tu met ce que bon te semble …
soupe2
si tu veut, c’est juste un nom de fichier

1 « J'aime »

@olive

OK je ne comprenais pas car je voyais le texte du fichier soupe se pointé dans le code

J’ai testé, it’s good ! Merci mon ami.

Continu tes tuto stp !! IIs sont top et nous font tous avancer.

JM

1 « J'aime »