Page 1 sur 1

[PHP] WeatherHub / Mobile Alerts

Publié : 02 mai 2019, 20:11
par gaeldelsart
Bonjour à tous,

Voici un script PHP pour récupérer les mesures des sondes WeatherHub , via les serveurs de TFA, et les inscrire dans les capteurs virtuels de Domoticz. Le script n'est surement pas parfait, je n'ai pas beaucoup de connaissance, mais il fonctionne. J'utilise PHP 7.2.

Script PHP :

Code : Tout sélectionner

<?php
#Création du Dummy WeatherHub dans le menu Matériel de Domoticz 
#Création des capteurs virtuels : Temp ; Temp/Hum ; Pluie ; Interrupteur (inondation)
#Notez les IDX à inscrire en bas du programme

#WeatherHub
#Lecture de la page avec les mesures

$WHurl="https://measurements.mobile-alerts.eu/Home/SensorsOverview?phoneid=numéro-identification"; 
$WHfp = fopen($WHurl,"r"); //lecture du fichier 
if ($WHfp){ 
        while (!feof($WHfp)) { 
                $WHpage .= fgets($WHfp, 4096); // lecture du contenu de la ligne 
        } 
} 

#Etat Domoticz - Inondation chauffe-eau
#Lecture de la page du capteur virtuel interrupteur

$Dom206url="http://192.168.1.xx:8080/json.htm?type=devices&rid=206"; 
$Dom206fp = fopen($Dom206url,"r"); //lecture du fichier 
if ($Dom206fp){ 
        while (!feof($Dom206fp)) { 
                $Dom206page .= fgets($Dom206fp, 4096); // lecture du contenu de la ligne 
        } 
} 

#Capteur Abri de jardin (température)

$ADJt=explode("numéro-du-capteur",$WHpage); 
$ADJt=explode("<h4>",$ADJt[2]);
$ADJt=explode("</h4>",$ADJt[2]);
$ADJt=explode(" C",$ADJt[0]);

#Capteur Chauffe-eau (température/humidité/inondation)

$ChEt=explode("numéro-du-capteur",$WHpage); 
$ChEt=explode("<h4>",$ChEt[2]);
$ChEt=explode("</h4>",$ChEt[2]);
$ChEt=explode(" C",$ChEt[0]);

$ChEh=explode("numéro-du-capteur",$WHpage); 
$ChEh=explode("<h4>",$ChEh[2]);
$ChEh=explode("</h4>",$ChEh[3]);
$ChEh=explode("%",$ChEh[0]);

$ChEi=explode("numéro-du-capteur",$WHpage); 
$ChEi=explode("<h4>",$ChEi[2]);
$ChEi=explode("</h4>",$ChEi[4]);
if ($ChEi[0]=="Aride"){$ChEi="Off";}
if ($ChEi[0]=="Humide"){$ChEi="On";}
$IDX206=explode("Status",$Dom206page);
$IDX206=explode('"',$IDX206[1]);

#Capteur Compteur d'eau (température/humidité/température externe)
#Cpt = compteur / E = eau / t ou h = température ou humidité / E = externe

$CptEt=explode("numéro-du-capteur",$WHpage); 
$CptEt=explode("<h4>",$CptEt[2]);
$CptEt=explode("</h4>",$CptEt[2]);
$CptEt=explode(" C",$CptEt[0]);

$CptEh=explode("numéro-du-capteur",$WHpage); 
$CptEh=explode("<h4>",$CptEh[2]);
$CptEh=explode("</h4>",$CptEh[4]);
$CptEh=explode("%",$CptEh[0]);

$CptEtE=explode("numéro-du-capteur",$WHpage); 
$CptEtE=explode("<h4>",$CptEtE[2]);
$CptEtE=explode("</h4>",$CptEtE[3]);
$CptEtE=explode(" C",$CptEtE[0]);

#Capteur Garage (température/humidité)

$GarT=explode("numéro-du-capteur",$WHpage); 
$GarT=explode("<h4>",$GarT[2]);
$GarT=explode("</h4>",$GarT[2]);
$GarT=explode(" C",$GarT[0]);

$GarH=explode("numéro-du-capteur",$WHpage); 
$GarH=explode("<h4>",$GarH[2]);
$GarH=explode("</h4>",$GarH[3]);
$GarH=explode("%",$GarH[0]);

#Capteur Bureau / Chambre petite / Chambre grande / Sejour (KlimaHome)
#Sonde interne / Capteur 1 / Capteur 2 / Capteur 3

$BurT=explode("numéro-du-capteur",$WHpage); 
$BurT=explode("<h4>",$BurT[2]);
$BurT=explode("</h4>",$BurT[2]);
$BurT=explode(" C",$BurT[0]);

$BurH=explode("numéro-du-capteur",$WHpage); 
$BurH=explode("<h4>",$BurH[2]);
$BurH=explode("</h4>",$BurH[3]);
$BurH=explode("%",$BurH[0]);

$ChpT=explode("numéro-du-capteur",$WHpage); 
$ChpT=explode("<h4>",$ChpT[2]);
$ChpT=explode("</h4>",$ChpT[4]);
$ChpT=explode(" C",$ChpT[0]);

$ChpH=explode("numéro-du-capteur",$WHpage); 
$ChpH=explode("<h4>",$ChpH[2]);
$ChpH=explode("</h4>",$ChpH[5]);
$ChpH=explode("%",$ChpH[0]);

$ChgT=explode("numéro-du-capteur",$WHpage); 
$ChgT=explode("<h4>",$ChgT[2]);
$ChgT=explode("</h4>",$ChgT[6]);
$ChgT=explode(" C",$ChgT[0]);

$ChgH=explode("numéro-du-capteur",$WHpage); 
$ChgH=explode("<h4>",$ChgH[2]);
$ChgH=explode("</h4>",$ChgH[7]);
$ChgH=explode("%",$ChgH[0]);

$SejT=explode("numéro-du-capteur",$WHpage); 
$SejT=explode("<h4>",$SejT[2]);
$SejT=explode("</h4>",$SejT[8]);
$SejT=explode(" C",$SejT[0]);

$SejH=explode("numéro-du-capteur",$WHpage); 
$SejH=explode("<h4>",$SejH[2]);
$SejH=explode("</h4>",$SejH[9]);
$SejH=explode("%",$SejH[0]);

#Capteur pluviomètre

$Pluie=explode("numéro-du-capteur",$WHpage); 
$Pluie=explode("<h4>",$Pluie[2]);
$Pluie=explode("</h4>",$Pluie[2]);
$Pluie=explode(" mm",$Pluie[0]);

#ENREGISTREMENT WeatherHub
#Inscription des valeurs dans un fichier, et mise à jour des capteurs dans Domoticz

    { 
    $nomfic="WeatherHub.txt";
    $ftpfile=fopen("$nomfic","w");
    $val = 
	
	$ADJt[0]."\n"."\n".
	$ChEt[0]."\n".$ChEh[0]."\n".$ChEi."\n"."\n".
	$CptEt[0]."\n".$CptEh[0]."\n".$CptEtE[0]."\n"."\n".
	$GarT[0]."\n".$GarH[0]."\n"."\n".
	$BurT[0]."\n".$BurH[0]."\n".$ChpT[0]."\n".$ChpH[0]."\n".$ChgT[0]."\n".$ChgH[0]."\n".$SejT[0]."\n".$SejH[0]."\n"."\n".
	$Pluie[0]."\n"."\n".
	"\n";
		
	fputs($ftpfile,$val);
    fclose($ftpfile);
	}
	{
	file_get_contents('http://192.168.1.xx:8080/json.htm?type=command&param=udevice&idx=204&nvalue=0&svalue='.$ADJt[0]);
	file_get_contents('http://192.168.1.xx:8080/json.htm?type=command&param=udevice&idx=205&nvalue=0&svalue='.$ChEt[0].';'.$ChEh[0].';0');
	file_get_contents('http://192.168.1.xx:8080/json.htm?type=command&param=udevice&idx=207&nvalue=0&svalue='.$CptEt[0].';'.$CptEh[0].';0');
	file_get_contents('http://192.168.1.xx:8080/json.htm?type=command&param=udevice&idx=210&nvalue=0&svalue='.$CptEtE[0]);
	file_get_contents('http://192.168.1.xx:8080/json.htm?type=command&param=udevice&idx=211&nvalue=0&svalue='.$GarT[0].';'.$GarH[0].';0');
	file_get_contents('http://192.168.1.xx:8080/json.htm?type=command&param=udevice&idx=213&nvalue=0&svalue='.$BurT[0].';'.$BurH[0].';0');	
	file_get_contents('http://192.168.1.xx:8080/json.htm?type=command&param=udevice&idx=214&nvalue=0&svalue='.$ChpT[0].';'.$ChpH[0].';0');
	file_get_contents('http://192.168.1.xx:8080/json.htm?type=command&param=udevice&idx=215&nvalue=0&svalue='.$ChgT[0].';'.$ChgH[0].';0');
	file_get_contents('http://192.168.1.xx:8080/json.htm?type=command&param=udevice&idx=216&nvalue=0&svalue='.$SejT[0].';'.$SejH[0].';0');
	file_get_contents('http://192.168.1.xx:8080/json.htm?type=command&param=udevice&idx=217&nvalue=0&svalue=0;'.$Pluie[0]);
	}
	if ($ChEi != $IDX206[2]) {file_get_contents('http://192.168.1.xx:8080/json.htm?type=command&param=switchlight&idx=206&switchcmd='.$ChEi);}

?>
J’exécute le script PHP via le planificateur du NAS Synology. Il est possible d'utiliser un serveur Cron également, si Domoticz est accessible à l'extérieur du réseau local, en utilisant une adresse DDNS.

Voici les réglages du NAS Synology :

Code : Tout sélectionner

Synology - Planificateur de taches

Tache : WeatherHub
Utilisateur : root
Execution : Quotidienne
Première heure : 00
Fréquence : 5 minutes
Dernière heure : 23h55

Script : /usr/bin/php -f /volume1/Volume_1/PHP/WeatherHub.php

# volume1 = nom de la partition
# Volume_1 = nom du dossier partagé
# PHP = dossier choisi pour le stockage du script
Bon amusement.

Re: WeatherHub / Mobile Alerts

Publié : 05 mai 2019, 16:55
par gaeldelsart
Bonjour,

Petite précision : La pluie indiquée est en cumul sur 24h, comme sur la page principale des mesures sur Mobile Alerts.
Pour avoir la pluie cumulée sur la journée, il faut :

- ajouter ce code dans le script PHP :

Code : Tout sélectionner

#WeatherHub Pluie

$WH_P_url="https://measurements.mobile-alerts.eu/Home/MeasurementDetails?deviceid=numéro-du-capteur-de-pluie&vendorid=identification&appbundle=eu.mobile_alerts.weatherhub"; 
$WH_P_fp = fopen($WH_P_url,"r"); //lecture du fichier 
if ($WH_P_fp){ 
        while (!feof($WH_P_fp)) { 
                $WH_P_page .= fgets($WH_P_fp, 4096); // lecture du contenu de la ligne 
        } 
} 
Inscrivez le numéro du capteur, ainsi que le code vendeur, que vous trouverez sur la page du capteur sur la page Mobile Alerts.

Ajoutez ce code :

Code : Tout sélectionner

#Capteur pluviomètre

$PluieT=explode("measurement",$WH_P_page); 
$PluieT=explode("</td>",$PluieT[2]);
$PluieT=explode(">",$PluieT[0]);
$PluieT=explode(" mm",$PluieT[1]);
Remplacez ce code :

Code : Tout sélectionner

file_get_contents('http://192.168.1.xx:8080/json.htm?type=command&param=udevice&idx=217&nvalue=0&svalue=0;'.$Pluie[0]);
Par ce code :

Code : Tout sélectionner

file_get_contents('http://192.168.1.xx:8080/json.htm?type=command&param=updateuservariable&idx=6&vname=WH_Pluie_Inst&vtype=1&vvalue='.$PluieT[0]);
Modifiez sur le code ci-dessus l'IDX de la variable à créer.

Créez les variables dans Domoticz, type Décimal :
WH_Pluie_Inst
WH_Pluie_TX
WH_Pluie_00
WH_Pluie_05
WH_Pluie_10
WH_Pluie_15
jusqu'à _55

Puis ajoutez ce script LUA Time : WH - Pluie

Code : Tout sélectionner

-- script WH - Pluie.lua

commandArray = {}

-------------------
-- Fonction time --
-------------------

local time = os.date("*t")

------------------- --------------------
-- Fonction arrondir à deux décimales --
------------------- --------------------
-- Le chiffre"x" (dec or x) correspond au nombre de décimales à prendre en compte dans le resultat

   function arrondir(num, dec)
      if num == 0 then
      return 0
         else
            local mult = 10^(dec or 2)
            return math.floor(num * mult + 0.5) / mult
       end
   end

------------------------------
-- Traitement des variables --
------------------------------

if (time.min == 0) then
    if (uservariables["WH_Pluie_Inst"] > uservariables["WH_Pluie_00"])
    then 
        WH_Pluie_00 = arrondir(tostring(uservariables["WH_Pluie_Inst"] - uservariables["WH_Pluie_00"]),2)
        commandArray['Variable:WH_Pluie_TX']= tostring(WH_Pluie_00)
        commandArray['Variable:WH_Pluie_00']= tostring(uservariables["WH_Pluie_Inst"])
    elseif (uservariables["WH_Pluie_TX"] > 0 )
    then
        commandArray['Variable:WH_Pluie_TX']= tostring(0)
    end
end

if (time.min == 5) then
    if (uservariables["WH_Pluie_Inst"] > uservariables["WH_Pluie_05"])
    then 
        WH_Pluie_05 = arrondir(tostring(uservariables["WH_Pluie_Inst"] - uservariables["WH_Pluie_05"]),2)
        commandArray['Variable:WH_Pluie_TX']= tostring(WH_Pluie_05)
        commandArray['Variable:WH_Pluie_05']= tostring(uservariables["WH_Pluie_Inst"])
    elseif (uservariables["WH_Pluie_TX"] > 0 )
    then
        commandArray['Variable:WH_Pluie_TX']= tostring(0)
    end
end

if (time.min == 10) then
    if (uservariables["WH_Pluie_Inst"] > uservariables["WH_Pluie_10"])
    then 
        WH_Pluie_10 = arrondir(tostring(uservariables["WH_Pluie_Inst"] - uservariables["WH_Pluie_10"]),2)
        commandArray['Variable:WH_Pluie_TX']= tostring(WH_Pluie_10)
        commandArray['Variable:WH_Pluie_10']= tostring(uservariables["WH_Pluie_Inst"])
    elseif (uservariables["WH_Pluie_TX"] > 0 )
    then
        commandArray['Variable:WH_Pluie_TX']= tostring(0)
    end
end

if (time.min == 15) then
    if (uservariables["WH_Pluie_Inst"] > uservariables["WH_Pluie_15"])
    then 
        WH_Pluie_15 = arrondir(tostring(uservariables["WH_Pluie_Inst"] - uservariables["WH_Pluie_15"]),2)
        commandArray['Variable:WH_Pluie_TX']= tostring(WH_Pluie_15)
        commandArray['Variable:WH_Pluie_15']= tostring(uservariables["WH_Pluie_Inst"])
    elseif (uservariables["WH_Pluie_TX"] > 0 )
    then
        commandArray['Variable:WH_Pluie_TX']= tostring(0)
    end
end

if (time.min == 20) then
    if (uservariables["WH_Pluie_Inst"] > uservariables["WH_Pluie_20"])
    then 
        WH_Pluie_20 = arrondir(tostring(uservariables["WH_Pluie_Inst"] - uservariables["WH_Pluie_20"]),2)
        commandArray['Variable:WH_Pluie_TX']= tostring(WH_Pluie_20)
        commandArray['Variable:WH_Pluie_20']= tostring(uservariables["WH_Pluie_Inst"])
    elseif (uservariables["WH_Pluie_TX"] > 0 )
    then
        commandArray['Variable:WH_Pluie_TX']= tostring(0)
    end
end

if (time.min == 25) then
    if (uservariables["WH_Pluie_Inst"] > uservariables["WH_Pluie_25"])
    then 
        WH_Pluie_25 = arrondir(tostring(uservariables["WH_Pluie_Inst"] - uservariables["WH_Pluie_25"]),2)
        commandArray['Variable:WH_Pluie_TX']= tostring(WH_Pluie_25)
        commandArray['Variable:WH_Pluie_25']= tostring(uservariables["WH_Pluie_Inst"])
    elseif (uservariables["WH_Pluie_TX"] > 0 )
    then
        commandArray['Variable:WH_Pluie_TX']= tostring(0)
    end
end

if (time.min == 30) then
    if (uservariables["WH_Pluie_Inst"] > uservariables["WH_Pluie_30"])
    then 
        WH_Pluie_30 = arrondir(tostring(uservariables["WH_Pluie_Inst"] - uservariables["WH_Pluie_30"]),2)
        commandArray['Variable:WH_Pluie_TX']= tostring(WH_Pluie_30)
        commandArray['Variable:WH_Pluie_30']= tostring(uservariables["WH_Pluie_Inst"])
    elseif (uservariables["WH_Pluie_TX"] > 0 )
    then
        commandArray['Variable:WH_Pluie_TX']= tostring(0)
    end
end

if (time.min == 35) then
    if (uservariables["WH_Pluie_Inst"] > uservariables["WH_Pluie_35"])
    then 
        WH_Pluie_35 = arrondir(tostring(uservariables["WH_Pluie_Inst"] - uservariables["WH_Pluie_35"]),2)
        commandArray['Variable:WH_Pluie_TX']= tostring(WH_Pluie_35)
        commandArray['Variable:WH_Pluie_35']= tostring(uservariables["WH_Pluie_Inst"])
    elseif (uservariables["WH_Pluie_TX"] > 0 )
    then
        commandArray['Variable:WH_Pluie_TX']= tostring(0)
    end
end

if (time.min == 40) then
    if (uservariables["WH_Pluie_Inst"] > uservariables["WH_Pluie_40"])
    then 
        WH_Pluie_40 = arrondir(tostring(uservariables["WH_Pluie_Inst"] - uservariables["WH_Pluie_40"]),2)
        commandArray['Variable:WH_Pluie_TX']= tostring(WH_Pluie_40)
        commandArray['Variable:WH_Pluie_40']= tostring(uservariables["WH_Pluie_Inst"])
    elseif (uservariables["WH_Pluie_TX"] > 0 )
    then
        commandArray['Variable:WH_Pluie_TX']= tostring(0)
    end
end

if (time.min == 45) then
    if (uservariables["WH_Pluie_Inst"] > uservariables["WH_Pluie_45"])
    then 
        WH_Pluie_45 = arrondir(tostring(uservariables["WH_Pluie_Inst"] - uservariables["WH_Pluie_45"]),2)
        commandArray['Variable:WH_Pluie_TX']= tostring(WH_Pluie_45)
        commandArray['Variable:WH_Pluie_45']= tostring(uservariables["WH_Pluie_Inst"])
    elseif (uservariables["WH_Pluie_TX"] > 0 )
    then
        commandArray['Variable:WH_Pluie_TX']= tostring(0)
    end
end

if (time.min == 50) then
    if (uservariables["WH_Pluie_Inst"] > uservariables["WH_Pluie_50"])
    then 
        WH_Pluie_50 = arrondir(tostring(uservariables["WH_Pluie_Inst"] - uservariables["WH_Pluie_50"]),2)
        commandArray['Variable:WH_Pluie_TX']= tostring(WH_Pluie_50)
        commandArray['Variable:WH_Pluie_50']= tostring(uservariables["WH_Pluie_Inst"])
    elseif (uservariables["WH_Pluie_TX"] > 0 )
    then
        commandArray['Variable:WH_Pluie_TX']= tostring(0)
    end
end

if (time.min == 55) then
    if (uservariables["WH_Pluie_Inst"] > uservariables["WH_Pluie_55"])
    then 
        WH_Pluie_55 = arrondir(tostring(uservariables["WH_Pluie_Inst"] - uservariables["WH_Pluie_55"]),2)
        commandArray['Variable:WH_Pluie_TX']= tostring(WH_Pluie_55)
        commandArray['Variable:WH_Pluie_55']= tostring(uservariables["WH_Pluie_Inst"])
    elseif (uservariables["WH_Pluie_TX"] > 0 )
    then
        commandArray['Variable:WH_Pluie_TX']= tostring(0)
    end
end

WH_Pluie_TX100 = tostring(uservariables["WH_Pluie_TX"] * 100)
commandArray['UpdateDevice'] ='217|0|'..WH_Pluie_TX100..';'..uservariables["WH_Pluie_Inst"]..''

return commandArray
Modifiez le numéro IDX 217 sur l'avant dernière ligne, en fonction du numéro du capteur de pluie virtuel.

Re: WeatherHub / Mobile Alerts

Publié : 01 juin 2020, 09:47
par gaeldelsart
Bonjour,

J'ai apporté une modification sur ce code.
En effet, il y a parfois des problèmes d'accès au serveur mobile-alerts, ce qui génère des mesures à zéro. Egalement, j'ai remarqué que la température n'était plus indiquée avec un chiffre après la virgule, car Domoticz à besoin d'un point à la place.

Voici les modifications :

A placer juste avant #ENREGISTREMENT WeatherHub

Code : Tout sélectionner

#Remplacement virgule par un point
$ADJt[0] = str_replace(",", ".", $ADJt[0]);
...à completer pour chaque valeur de température
Ajoutez avant file_get_contents :

Code : Tout sélectionner

if ($ADJt[0] != ""){file_get_contents(...
...à completer pour chaque capteur virtuel de température et humidité.
Après la modification, si le serveur n'est pas joignable, les capteurs virtuels ne seront plus mis à jour. Si cela dure plus d'une heure, le capteur sera en rouge.