Ajout pluie 1h

Avez vous regardé si cette info est présente dans l’api openweather map ? Parce que si non ça va être compliqué.

@Menama @Vortex

Oui elle est présente.

A mon humble niveau, je m’étais créé un virtuel et un bloc code dans un scénario pour rapatrier ces infos:
Virtuel avec 12 commandes info numeriques:
image

image

$script = 'rainpython.py';        //Nom du fichier python
$chemin = '/var/www/html/python'; // Dossier à utiliser

//https://www.meteo-paris.com/ile-de-france/suivi-des-pluies.html pour les niveaux de pluie Bruine<1mm/h Moderee<2.5mm/h Normale>2.5mm/h
if (0){ //metre à 1 la 1er fois, une fois que le fichier existe et n'est plus modifier mettre a 0
// Script python
$python = <<<'EOD'
#! /usr/bin/env python3
import requests
import json

APIKEY="Mettre la clef API OpenWeather"
latitude="49.1858"
longitude="-0.3591"
url="https://api.openweathermap.org/data/2.5/onecall?lat="+latitude+"&lon="+longitude+"&exclude=daily,current,hourly,alerts&units=metric&appid="+APIKEY
result = json.loads(requests.get(url).text)

pluie1h_full=[]
pluie1h=[]
for data in result['minutely']:
    pluie1h_full.append(data['precipitation'])

for i in range (12):
    pluie1h.append(round(max(pluie1h_full[i*5:i*5+5]),2))

print(result['timezone_offset'])
print(pluie1h)


#fin du script python3
EOD;
mkdir($chemin); // creation du dossier
file_put_contents($chemin.'/'.$script, $python); // Ecriture du fichier
}

$reponse = shell_exec('python3 '.$chemin.'/'.$script);  // execution du script 
$reponse = str_replace("[","",$reponse);
$reponse = str_replace("]","",$reponse);
$scenario->setLog($reponse);
$data=explode ("\n",$reponse); // separation ligne Time zone et pluie
$scenario->setLog('Pluie 1h : '.$data[0]); // recuperation des paramètres de retour du script
$pluie=explode (",",$data[1]); //separation de pluie par tranche de 5min
$scenario->setLog('Pluie 1h : '.$pluie[1]); // recuperation des paramètres de retour du script

// Creer un virtuel avec 12 commandes numérique 
cmd::byString('#[Environnement][Pluie1h_OW][1]#')->event($pluie[0]);
cmd::byString('#[Environnement][Pluie1h_OW][2]#')->event($pluie[1]);
cmd::byString('#[Environnement][Pluie1h_OW][3]#')->event($pluie[2]);
cmd::byString('#[Environnement][Pluie1h_OW][4]#')->event($pluie[3]);
cmd::byString('#[Environnement][Pluie1h_OW][5]#')->event($pluie[4]);
cmd::byString('#[Environnement][Pluie1h_OW][6]#')->event($pluie[5]);
cmd::byString('#[Environnement][Pluie1h_OW][7]#')->event($pluie[6]);
cmd::byString('#[Environnement][Pluie1h_OW][8]#')->event($pluie[7]);
cmd::byString('#[Environnement][Pluie1h_OW][9]#')->event($pluie[8]);
cmd::byString('#[Environnement][Pluie1h_OW][10]#')->event($pluie[9]);
cmd::byString('#[Environnement][Pluie1h_OW][11]#')->event($pluie[10]);
cmd::byString('#[Environnement][Pluie1h_OW][12]#')->event($pluie[11]);

Faudrait créer un Foreach pour les 12 dernieres lignes mais je ne suis pas à l’aise avec les parametres jeedom

Je pensais que OpenWeather était plus précis sur la pluie 1h que météo france mais finalement c’est équivalent. J’ai donc abandonné OW.

1 « J'aime »

Bonjour,

Oui l’info de pluie dans l’heure par minute est présente dans l’API OpenweatherMap et plus exactement dans One Call API qui n’est pas utilisée par le plugin officiel weather. One Call API: weather data for any geographical coordinate - OpenWeatherMap

A gauche en exploitant One Call API d’OpenweatherMap. A droite le plugin MeteoFrance. Il pleut en ce moment! OWM 1/MF 0

1 « J'aime »

Bonjour Jpty,
ça m’interesserait fortement de refaire ce que tu as fait pour openweathermap, et surtout la partie basse avec les précipitations.
Tu saurais me partager qq infos sur comment faire ça ? J’ai deja d’operationnel l’api coté openweathermap, c’est l’integration jeedom que je cherche.

(Dans mon cas le plugin meteofrance ne fonctionne pas, et je suis de toute façon très peureux concernant les plugins type wrapper web)
Merci

Bonjour,
Tout est sur mon github: GitHub - jpty/Jeedom-plugin-OpenWeatherMap
C’est un plugin non finalisé que je n’ai pas encore publié sur le market.

2 « J'aime »

Bravo @jpty, c’est exactement ça qu’il faut sur le plugin officiel.

1 « J'aime »

Ça a déjà été évoqué ici Evolutions futures du plugin weather il y a quelque temps.
Sans suite pour moi.

Et comme pour limiter le nombre de commandes dans le plugin, j’utilise des commandes qui contiennent du json parsé pour l’affichage et que ce n’est pas recommandé, le plugin restera dans cet état sauf avis contraire de Jeedom.

Je comprends pas a quoi correspond tes 12 commandes?

Comment fait tu pour récupérer les info de pluies dans l’heure, je vois pas les données correspondante dans le call api.

EDIT: Pluie 1h = pluie 60minutes sachant qu’il y a une info toutes les minutes mais que dans mon code je les regroupe par tranche de 5minutes donc 60/5=12
Et chaque commande correspond à la hauteur d’eau horaire en mm sur cette tranche de 5minutes (et pour correspondre aux valeurs de meteo france, Bruine<1mm/h Moderee<2.5mm/h Normale>2.5mm/h)

Au passage j’ai mis à jour mon code (mais je vais tenter de tout faire en php, ça sera plus simple):

$script = 'rainpython.py';        //Nom du fichier python
$chemin = '/var/www/html/python'; // Dossier à utiliser
//https://www.meteo-paris.com/ile-de-france/suivi-des-pluies.html pour les niveaux de pluie Bruine<1mm/h Moderee<2.5mm/h Normale>2.5mm/h
if (0){ //metre à 1 la 1er fois, une fois que le fichier existe et n'est plus modifier mettre a 0
// Script python
$python = <<<'EOD'
#! /usr/bin/env python3
import requests
import json

APIKEY="Clef API open weather"
latitude="49.1858"
longitude="-0.3591"
url="https://api.openweathermap.org/data/2.5/onecall?lat="+latitude+"&lon="+longitude+"&exclude=daily,current,hourly,alerts&units=metric&appid="+APIKEY
result = json.loads(requests.get(url).text)

pluie1h_full=[]
pluie1h=[]
for data in result['minutely']:
    pluie1h_full.append(data['precipitation'])

for i in range (12):
    pluie1h.append(round(max(pluie1h_full[i*5:i*5+5]),2))

print(result['timezone_offset'])
print(pluie1h)


#fin du script python3
EOD;
mkdir($chemin); // creation du dossier
file_put_contents($chemin.'/'.$script, $python); // Ecriture du fichier
}

$reponse = shell_exec('python3 '.$chemin.'/'.$script);  // execution du script 
$reponse = str_replace("[","",$reponse);
$reponse = str_replace("]","",$reponse);
$scenario->setLog($reponse);
$data=explode ("\n",$reponse); // separation ligne Time zone et pluie
$pluie=explode (",",$data[1]); //separation de pluie par tranche de 5min

//creation d'un objet représentant l’équipement 220 [Environnement][Pluie1h_OW]
$Equipement = eqLogic::byString('#[Environnement][Pluie1h_OW]#');
$ListeCommandes = $Equipement->getCmd(); //creation de la liste des commandes
    foreach($ListeCommandes as $commandes)
    {
      $scenario->setLog('commande:'.$commandes->getName());
      $commandes->event($pluie[$commandes->getName()]); //Met la valeur pluie[x] dans chaque commande info [x]
    }
1 « J'aime »

Bonjour,

Dans l’API One Call d’openweathermap, il y a une données de pluie par minute soit 60 et pas 12
La doc:
image
Le résultat de l’interrogation:
image
La différence entre 2 dt est 60 secondes

image

Intégré dans Jeedom, ça pourrait donner:
image

1 « J'aime »

Oui tu as entierement raison. C’est pour ça que je les regroupe par 5 et que je prends le max de ce goupe
max(pluie1h_full[i*5:i*5+5])

C’est un volume. Il faudrait additionner par tranche de 5 ou pas.
Entre l’API en mm et leur site en mm/h difficile de savoir.

La pluie annoncée dans mon post précédent a été retardée.
image
Ca reste de la prévision. MétéoFrance dit:
image

1 « J'aime »

De mémoire oui c’est un volume mais ce n’est pas l’info qui m’intéresse. Sur 5 minutes, s’il pleut 1+1+1+1+1mm, c’est pas pareil que 5+0+0+0+0mm. Dans un cas je pars à l’école en vélo, dans le second j’attends un petit peu.

2 « J'aime »

et toi @jpty comment tu as récupéré ces infos via un script aussi ?

1 « J'aime »

C’est mon plugin owm
Mais je ne trouve pas le temps de le terminer.

Tu pourrais pas me dire comment faire les petites barres bleues ? (ou le bout de code qui permet de les faire)

1 « J'aime »

C’est du highcharts column

1 « J'aime »

Je mets à jour ce fil avec ce que j’ai fait:

Creation d’un vitruel avec 60 info numeriques nommée OneMinute_0 à OneMinute_59

Facultatif dans le même virtuelle: 12 info numérique nommée 5Minute_0 à 5Minute_11:

Dans data/customTemplates Dashboard, creation des fichiers:
cmd.info.numeric.Pluie1h_OW_5Minute.html et cmd.info.numeric.Pluie1h_OW_1Minute.html
image

cmd.info.numeric.Pluie1h_OW_1Minute.html:

<div style="min-width:1px;width:1px;margin-left: 1.5px;margin-right: 1.5px" class="cmd cmd-widget vgauge #history#" data-type="info" data-subtype="numeric"data-template="vertical" data-cmd_id="#id#" data-cmd_uid="#uid#" data-version="#version#" data-eqLogic_id="#eqLogic_id#">
  <div class="title #hide_name#">
    <div class="cmdName">#name_display#</div>
  </div>
  <div class="content-sm" data-cmd_id="#id#">
    <div class="vgauge-chart">
        <div class="vgauge-bckg">
          <style>
    		[data-cmd_id="#id#"] .vgauge-bckg {
              width: 3px;
            background: rgb(50, 50, 50);}
          </style>
          <div class="vgauge-value">    
            <style>
    		  [data-cmd_id="#id#"] .vgauge-value {
                margin-left: 0px;
                background: rgb(0, 155, 255);
                width: 3px;}
     		</style>
        </div>
      </div>
    </div>
  </div>

  <div class="cmdStats #hide_history#">
    <span title='{{Min}}' class='tooltips'>#minHistoryValue#</span>|<span title='{{Moyenne}}' class='tooltips'>#averageHistoryValue#</span>|<span title='{{Max}}' class='tooltips'>#maxHistoryValue#</span> <i class="#tendance#"></i>
  </div>
  <template>
    <div>color : rgb(0,155,255) ({{couleur de l'indicateur de valeur}})</div>
    <div>maxscale : 4 ({{echelle max}})</div>
  </template>
  <script>
    jeedom.cmd.update['#id#'] = function(_options) {
      var position = _options.display_value
      var minValue = 0
      var maxValue = 4
      
      if ($.issetWidgetOptParam('#maxscale#', 'maxscale')) {
      maxValue = '#maxscale#'
    }
      
      if (position > maxValue) position = maxValue
      if (position < minValue) position = minValue

      var height = ((position - minValue) * 100) / (maxValue - minValue)
      height = Math.round(parseFloat(height) * 10) / 10

      var cmd = $('.cmd[data-cmd_id=#id#]')
      cmd.attr('title','{{Date de valeur}} : '+_options.valueDate+'<br/>{{Date de collecte}} : '+_options.collectDate)
      cmd.find('.vgauge-value').height(height+'%')
      cmd.find('.state strong').first().text(_options.display_value)
    }

    jeedom.cmd.update['#id#']({display_value:'#state#',valueDate:'#valueDate#',collectDate:'#collectDate#'});

    if ($.issetWidgetOptParam('#color#', 'color')) {
      $('.cmd[data-cmd_id=#id#] .vgauge-value').css('background', '#color#')
    }
  </script>
</div>

cmd.info.numeric.Pluie1h_OW_5Minute.html:

<div style="min-width:1px;width:1px;" class="cmd cmd-widget vgauge #history#" data-type="info" data-subtype="numeric"data-template="vertical" data-cmd_id="#id#" data-cmd_uid="#uid#" data-version="#version#" data-eqLogic_id="#eqLogic_id#">
  <div class="title #hide_name#">
    <div class="cmdName">#name_display#</div>
  </div>
  <div class="content-sm" data-cmd_id="#id#">
    <div class="vgauge-chart">
      <div class="vgauge-bckg">
        <style>
    		[data-cmd_id="#id#"] .vgauge-bckg {
              width: 5px;
              background: rgb(50, 50, 50);}
         </style>
        <div class="vgauge-value">    
            <style>
    		[data-cmd_id="#id#"] .vgauge-value {
              margin-left: 0px;
              background: rgb(0, 155, 255);
              width: 5px;
    		}
  			</style>
        </div>
      </div>
    </div>
  </div>

  <!--<div class="value" data-cmd_id="#id#">
    <div class="state"><strong>#state#</strong> <strong>#unite#</strong></div>
  </div>-->
  <div class="cmdStats #hide_history#">
    <span title='{{Min}}' class='tooltips'>#minHistoryValue#</span>|<span title='{{Moyenne}}' class='tooltips'>#averageHistoryValue#</span>|<span title='{{Max}}' class='tooltips'>#maxHistoryValue#</span> <i class="#tendance#"></i>
  </div>
  <template>
    <div>color : rgb(0,155,255) ({{couleur de l'indicateur de valeur}})</div>
    <div>maxscale : 4 ({{echelle max}})</div>
  </template>
  <script>
    jeedom.cmd.update['#id#'] = function(_options) {
      var position = _options.display_value
      //var minValue = ('#minValue#' == '') ? 0 : parseInt('#minValue#')
      //var maxValue = ('#maxValue#' == '') ? 100 : parseInt('#maxValue#')
      var minValue = 0
      var maxValue = 4
      
      if ($.issetWidgetOptParam('#maxscale#', 'maxscale')) {
      maxValue = '#maxscale#'
    }
      
      if (position > maxValue) position = maxValue
      if (position < minValue) position = minValue

      var height = ((position - minValue) * 100) / (maxValue - minValue)
      height = Math.round(parseFloat(height) * 10) / 10

      var cmd = $('.cmd[data-cmd_id=#id#]')
      cmd.attr('title','{{Date de valeur}} : '+_options.valueDate+'<br/>{{Date de collecte}} : '+_options.collectDate)
      cmd.find('.vgauge-value').height(height+'%')
      cmd.find('.state strong').first().text(_options.display_value)
    }

    jeedom.cmd.update['#id#']({display_value:'#state#',valueDate:'#valueDate#',collectDate:'#collectDate#'});

    if ($.issetWidgetOptParam('#color#', 'color')) {
      $('.cmd[data-cmd_id=#id#] .vgauge-value').css('background', '#color#')
    }
  </script>
</div>

Configuration de chaque info du virtuel avec le widget idoine (à faire pour les 60 info one_minutes et les 12 info 5_minutes):

Creation d’un scénario bloc code:
Declencheur


Code (confirguer APIKEY et les coordonées GPS):

$scenario->setLog("Start");
$Equipement = eqLogic::byLogicalId('Pluie1h_OW', 'virtual');
if (!is_object($Equipement)) {
  $scenario->setLog("  * eqlogic exist pas");
  $Equipement = new virtual();
  $Equipement->setName("Pluie1h_OW");
  $Equipement->setLogicalId('Pluie1h_OW');
  $Equipement->setEqType_name('virtual');
  //id of parent jeedom object
  $Equipement->setObject_id(3); // Objet parent = environnement
  $Equipement->setIsEnable(1);
  $Equipement->setIsVisible(1);
  $Equipement->save();
}

$vId=$Equipement->getId();
$scenario->setLog("  * id : $vId");

$visibility_1m=1;

for ($i = 0; $i < 60; $i++){
  $virtuelCmd=$Equipement->getCmd(null,'OneMinute_'.$i);
  if (!is_object($virtuelCmd)) {    
      $virtuelCmd = new virtualCmd();
      $virtuelCmd->setName('OneMinute_'.$i);
      $virtuelCmd->setOrder($i+2);
      $virtuelCmd->setEqLogic_id($vId);
      $virtuelCmd->setLogicalId('OneMinute_'.$i);
      $virtuelCmd->setType('info');
      $virtuelCmd->setSubType('numeric');
      $virtuelCmd->setTemplate('dashboard', 'customtemp::Pluie1h_OW_OneMinute');
      $virtuelCmd->setDisplay('showNameOndashboard', 0);
      $Equipement->checkAndUpdateCmd('OneMinute_'.$i, 0);
    }
  $virtuelCmd->setTemplate('dashboard', 'customtemp::Pluie1h_OW_OneMinute');
  $virtuelCmd->setisVisible($visibility_1m);
  $virtuelCmd->save();
}

for ($i = 0; $i < 12; $i++){
  $virtuelCmd=$Equipement->getCmd(null,'5Minute_'.$i);
  if (!is_object($virtuelCmd)) {    
      $virtuelCmd = new virtualCmd();
      $virtuelCmd->setName('5Minute_'.$i);
      $virtuelCmd->setOrder($i+62);
      $virtuelCmd->setEqLogic_id($vId);
      $virtuelCmd->setLogicalId('5Minute_'.$i);
      $virtuelCmd->setType('info');
      $virtuelCmd->setSubType('numeric');
      $virtuelCmd->setTemplate('dashboard', 'customtemp::Pluie1h_OW_5Minute');
      $virtuelCmd->setDisplay('showNameOndashboard', 0);
	  
      $Equipement->checkAndUpdateCmd('5Minute_'.$i, 0);
    }
  $visibility_5m=($visibility_1m == 0 ? 1 :0);
  $virtuelCmd->setisVisible($visibility_5m);
  $virtuelCmd->save();
}

//Update des valeurs

$APIKEY="x2x2x2x2x2x2"; // A creer directement dans openweather
$latitude="47.7345";
$longitude="1.23456";
$url="https://api.openweathermap.org/data/2.5/onecall?lat=".$latitude."&lon=".$longitude."&exclude=daily,current,hourly,alerts&units=metric&appid=".$APIKEY;
  
$request_http = new com_http($url);
$ret = $request_http->exec();

$ret = json_decode($ret, true);

foreach($ret['minutely'] as $level) $pluie1h_full[] = round($level['precipitation'],2);

//$pluie1h_full=[4.044,0.7438,0.6832,0.6226,0.562,0.5226,0.4832,0.4438,0.4044,0.365,0.3394,0.3138,0.2882,0.2626,0.237,0.2162,0.1954,0.1746,0.1538,0.133,0.1194,0.1058,0,0,0,0,0,0,0,0,4.044,0,4.044,0.7438,0.6832,0.6226,0.562,0.5226,0.4832,0.4438,0.4044,0.365,0.3394,0.3138,0.2882,0.2626,0.237,0.2162,0.1954,0.1746,0.1538,0.133,0.1194,0.1058,0,0,0,0,0,0,0];

for ($i = 0; $i < 12; $i++) $pluie1h_5min[]=round(max(array_slice($pluie1h_full,$i*5,5)),2);  //60 infos pluie par heure (1 par minute) regroupées par 5 minutes

//$Equipement = eqLogic::byString($Virtual);
$ListeCommandes = $Equipement->getCmd(); //creation de la liste des commandes
foreach($ListeCommandes as $commandes) {
  if (is_numeric($commandes->getName())){
    $commandes->event($pluie1h_5min[$commandes->getName()]); //Met la valeur pluie[x] dans chaque commande info [x]
  }
}

//$Equipement = eqLogic::byString('#[Environnement][Pluie1h_OW]#');
$ListeCommandes = $Equipement->getCmd(); //creation de la liste des commandes
$var1m=$var5m=0;
foreach($ListeCommandes as $commandes) {
  
  if ($commandes->getLogicalId()=='OneMinute_'.$var1m){
    $commandes->event($pluie1h_full[$var1m]); //Met la valeur pluie[x] dans chaque commande info [x]
    $var1m++;
  }
  if ($commandes->getLogicalId()=='5Minute_'.$var5m){
    $commandes->event($pluie1h_5min[$var5m]); //Met la valeur pluie[x] dans chaque commande info [x]
    $var5m++;
  }
}

/*$liste=implode(',',$pluie1h_full);
$scenario->setLog($liste);
$liste=implode(',',$pluie1h_5min);
$scenario->setLog($liste);*/


Pour à la fin obtenir ça (1 barre par minute mais possibilité d’afficher les info vituel toutes les 5 minutes)

image

2 « J'aime »

Trop bien cet affichage ! J’essaie de faire un équivalent sur jeedomconnect avec des composants jauge mais je galère à les positionner :frowning: