Dieses Script überträgt die von IP-Symcon ermittelten Wetterdaten an die Community von wetterpool.de.
<?php
// Zugangs-/Accountinformationen zur API von wetterpool.de
$wpuser = 'USERID';
$wppass = 'PASSWORT';
$wphost = 'www.wetterpool.de';
$wpport = '80';
$wptimeout = '30';
$wpurl = '/import/wswin_directpost.php';
// Eigene Werte aufbereiten:
$tempmaxmin = maxmin_val("TMAXMIN", GetValue(57080 /*[Garten\Klima\TEMPERATURE]*/));
// Variablen auf Basis der API von wetterpool.de
// http://www.wetterpool.de/tab_plugin.php
// Der String "- -" definiert, dass dieses Plugin für diesen Parameter keinen
// Wert bereitstellt (UNBEDINGT immer genau definieren welche Werte vorhanden sind!).
$tcur = preg_replace("/\./", ",", sprintf("%+.2f", GetValue(57080 /*[Garten\Klima\TEMPERATURE]*/))); // Aktuelle Temperatur, 2m Höhe, Grad Celsius, Dezimalzahl x1 = (+/-)x,yz
$tmin = preg_replace("/\./", ",", sprintf("%+.2f", $tempmaxmin[0])); // Minimaltemperatur des Tages, 2m Höhe, Grad Celsius, Dezimalzahl x1 = (+/-)x,yz
$tmax = preg_replace("/\./", ",", sprintf("%+.2f", $tempmaxmin[1])); // Maximaltemperatur des Tages, 2m Höhe, Grad Celsius, Dezimalzahl x1 = (+/-)x,yz
$t5min = "- -"; // Minimaltemperatur des Tages, 5cm Höhe, Grad Celsius, Dezimalzahl x1 = (+/-)x,yz
$tcm30 = "- -"; // Temperaturänderung letzte 30 Minuten, 2m Höhe, Grad Celsius, Dezimalzahl x1 = (+/-)x,yz
$tch1 = "- -"; // Temperaturänderung letzte 60 Minuten, 2m Höhe, Grad Celsius, Dezimalzahl x1 = (+/-)x,yz
$tdm1 = "- -"; // Temperaturabweichung des Monats vom 30-jährigen Mittel, Grad Celsius, Dezimalzahl x1 = (+/-)x,yz
$rhcur = GetValue(32760 /*[Garten\Klima\HUMIDITY]*/); // Aktuelle relative Luftfeuchte, 2m Höhe, Prozent, Ganzzahl 0<=x1<=100
$rrh1 = "- -"; // Regenmenge letzte 60 Minuten (1h), Millimeter, Dezimalzahl x1 = (+)x,yz
$rrh2 = "- -"; // Regenmenge letzte 120 Minuten (2h), Millimeter, Dezimalzahl x1 = (+)x,yz
$rrh6 = "- -"; // Regenmenge letzte 360 Minuten (6h), Millimeter, Dezimalzahl x1 = (+)x,yz
$rrh12 = "- -"; // Regenmenge letzte 720 Minuten (12h), Millimeter, Dezimalzahl x1 = (+)x,yz
$rrh24 = "- -"; // Regenmenge letzte 1440 Minuten (24h), Millimeter, Dezimalzahl x1 = (+)x,yz
$rrd1 = "- -"; // Regenmenge aktueller Tag (0 Uhr bis x Uhr), Millimeter, Dezimalzahl x1 = (+)x,yz
$rrm1 = "- -"; // Regenmenge aktueller Monat, Millimeter, Dezimalzahl x1 = (+)x,yz
$rry1 = "- -"; // Regenmenge aktuelles Jahr, Millimeter, Dezimalzahl x1 = (+)x,yz
$rrdm1 = "- -"; // Regenmengenabweichung aktueller Monat vom 30-jährigen Mittel, Prozent, Ganzzahl x1>=0
$sund1 = "- -"; // Sonnenscheindauer aktueller Tag (0 Uhr bis x Uhr), Stunde, Ganzzahl 0<=x1<=24
$sunh1 = "- -"; // Sonnenscheindauer letzte 60 Minuten, Minute, Ganzzahl 0<=x1<=60
$wcur = "- -"; // Aktuelle Windgeschwindigkeit, 10m Höhe, Kilometer pro Stunde, Dezimalzahl x1 = (+)x,yz
$wdir = "- -"; // Aktuelle Windrichtung, 10m Höhe, Grad, Dezimalzahl 0<=x1<=360
$wcura = "- -"; // 10minütiger Durchschnitt - Windgeschwindigkeit, 10m Höhe, Kilometer pro Stunde, Dezimalzahl x1 = (+)x,yz
$wdira = "- -"; // 10minütiger Durchschnitt - Windrichtung, 10m Höhe, Grad, Dezimalzahl 0<=x1<=360
$wmx = "- -"; // Maximale Windgeschwindigkeit (Böe) aktueller Tag (0 Uhr bis x Uhr), Kilometer pro Stunde, Dezimalzahl x1 = (+)x,yz
$pcur = "- -"; // Aktueller Luftdruck (mit Höhenkorrektur!), HectoPascal, Dezimalzahl x1 = (+)x,yz
$pch1 = "- -"; // Luftdruckänderung letzte 60 Minuten (1h), HectoPascal, Dezimalzahl x1 = (+/-)x,yz
$pch3 = "- -"; // Luftdruckänderung letzte 180 Minuten (3h), HectoPascal, Dezimalzahl x1 = (+/-)x,yz
$clcnb = "- -"; // Bedeckungsgrad Achtel, Ganzzahl 0<=x1<=8
$hgtnn = "2"; // Stationshöhe über Normalnull, Meter, Ganzzahl
$daoni = "- -"; // Tag oder Nacht, Wert wird als Wort geschrieben, x1 = {day,night}
$snhgt = "- -"; // Gemessene Schneehöhe, Centimeter, Ganzzahl
$snhtd = "- -"; // Datum der gemessenen Schneehöhe, Stunden/Minuten Tag/Monat/Jahr, x1 = hh:mm dd.mm.YYYY
$snl = "- -"; // Berechnete Schneefallgrenze, Meter, Ganzzahl
$lxcur = "- -"; // Aktueller Helligkeitswert, kLux, Dezimalzahl x1 = (+)x,yz
$lxmax = "- -"; // Maximaler Helligkeitswert des Tages, kLux, Dezimalzahl x1 = (+)x,yz
$time = date("H:i"); // Zeit, Stunden/Minuten, x1 = hh:mm
$date = date("d.m.Y"); // Datum, Tag/Monat/Jahr, x1 = dd.mm.YYYY
$plgnv = "1.0"; // Plugin-Version, Versionszahl x1 = x.yz
/***************************************************************************
* Übermittlung der aufbereiteten Daten an die API.
*
* Rückgabewert:
* TRUE Alle Daten wurden erfolgreich angenommen und verarbeitet.
* FALSE Es ist ein Fehler aufgetreten. Dieser wird zeitgleich IPS-Log
* geschrieben.
***************************************************************************/
function apirequest($wphost, $wpport,$wptimeout, $wpurl, $wpdata)
{
// Ausführen des GET-Requests.
$result = false;
$resultmsg = "";
$fp = fsockopen($wphost, $wpport, $errno, $errstr, $wptimeout);
if($fp)
{
$request = "GET ". $wpurl ."?data=$wpdata HTTP/1.1\r\n";
$request.= "Host: ". $wphost ."\r\n";
$request.= "Connection: Close\r\n\r\n";
// Auswerten der Antwort.
$data = "";
fwrite($fp, $request);
while (!feof($fp))
{
$data .= fgets($fp, 128);
}
fclose($fp);
// Überprüfen ob die gemeldeten Werte korrekt verarbeitet wurden.
$resultmsg = $data;
if ( preg_match("/ok/i", $data) )
$result = true;
}
if ( $result == false )
{
IPS_LogMessage("WETTERPOOL.DE", "Meldung fehlgeschlagen!\n$resultmsg");
return false;
} else
{
return true;
}
}
/***************************************************************************
* Funktion um Werte zu speichern und Durchschnittswerte zu berechnen.
* Werte werden in 24 Stunden vorgehalten.
*
* Parameter:
* $varname Name der Variablen, in der die Werte gespeichert werden.
* $val Der zu speichernde Wert
* $avg_min Anzahl der Minuten, aus den ein Durchschnitt errechnet wird.
* NULL um keinen Durchschnitt zu berechnen.
* Rückgabe:
* Durchschnittswert oder TRUE falls keine Berechnung gewünscht wurde.
***************************************************************************/
function average_val($varname, $val, $avg_min)
{
$varid = @IPS_GetVariableIDByName($varname, $GLOBALS["IPS_SELF"]);
// Falls der Wertespeicher nicht vorhanden ist, muss dieser angelegt werden.
if ( $varid == 0 )
{
$varid = IPS_CreateVariable(3);
IPS_SetName($varid, $varname);
IPS_SetParent($varid, $GLOBALS["IPS_SELF"]);
}
// Löschen von Daten die älter als 24 Stunden sind.
$value = "";
if ( GetValue($varid) != "" )
{
$hist_data = preg_split("/\|/", GetValue($varid));
foreach ( $hist_data as $item )
{
list($vtime, $vdata) = preg_split("/;/", $item);
if ( (time()-86400) > $vtime )
continue;
if ( $value != "" )
$value .= "|";
$value .= "$vtime;$vdata";
}
}
// Aktuellen Wert der Wertetabelle hinzufügen.
if ( $value != "" )
$value .= "|";
$value .= time() .";". $val;
SetValue($varid, $value);
// Den Durchschnittswert der letzten Minuten ($avg_min) berechnen.
if ( $avg_min != NULL )
{
$hist_data = preg_split("/\|/", GetValue($varid));
$result = 0;
$dcount = 0;
foreach ( $hist_data as $item )
{
list($vtime, $vdata) = preg_split("/;/", $item);
if ( time()-(180*60) > $vtime )
$continue;
$dcount++;
$result = $result+$vdata;
}
return sprintf("%+.2f", $result/$dcount);
}
return true;
}
/***************************************************************************
* Funktion um MAX und MIN Werte des Tages zu erhalten und zu speichern.
*
* Parameter:
* $varname Name der Variablen, in der die Werte gespeichert werden.
* $val Der zu speichernde Wert (falls nicht gesetzt, wird nur MIN und MAX
* zurückgegeben.
* $avg_min Anzahl der Minuten, aus den ein Durchschnitt errechnet wird.
* NULL um keinen Durchschnitt zu berechnen.
* Rückgabe:
* Array mit MIN(0) und MAX(1) Wert.
***************************************************************************/
function maxmin_val($varname, $val)
{
$result = array(0);
$varid = @IPS_GetVariableIDByName($varname, $GLOBALS["IPS_SELF"]);
// Falls der Wertespeicher nicht vorhanden ist, muss dieser angelegt werden.
if ( $varid == 0 )
{
$varid = IPS_CreateVariable(3);
IPS_SetName($varid, $varname);
IPS_SetParent($varid, $GLOBALS["IPS_SELF"]);
}
// Zurücksetzen des Wertespeichers, falls die letzten Daten von "gestern" sind.
if ( GetValue($varid) != "" )
{
list($vdate, $vmin, $vmax) = preg_split("/;/", GetValue($varid));
$date = date("Ymd");
if ( $date != $vdate )
{
if ( $val != NULL )
SetValue($varid, date("Ymd") .";". $val .";". $val);
} else
{
if ( $val != NULL )
{
// Falls der gemeldete Wert kleiner als MIN ist.
if ( $val < $vmin )
$vmin = $val;
// Falls der gemeldete Wert größer als MAX ist.
if ( $val > $vmax )
$vmax = $val;
SetValue($varid, $vdate .";". $vmin .";". $vmax);
}
$result[0] = sprintf("%+.2f", $vmin);
$result[1] = sprintf("%+.2f", $vmax);
return $result;
}
} else
{
// Wert setzen falls gefordert.
if ( $val != NULL )
SetValue($varid, date("Ymd") .";". $val .";". $val);
$result[0] = sprintf("%+.2f", $val);
$result[1] = sprintf("%+.2f", $val);
return $result;
}
return TRUE;
}
// Daten für das Senden vorbereiten und in das korrekte Format bringen.
$wpdata = "$wpuser;";
$wpdata .= md5($wppass) .";;";
$wpdata .= "(TCUR_ $tcur);";
$wpdata .= "(TMIN_ $tmin);";
$wpdata .= "(TMAX_ $tmax);";
$wpdata .= "(T5MIN $t5min);";
$wpdata .= "(TCM30 $tcm30);";
$wpdata .= "(TCH1_ $tch1);";
$wpdata .= "(TDM1_ $tdm1);";
$wpdata .= "(RHCUR $rhcur);";
$wpdata .= "(RRH1_ $rrh1);";
$wpdata .= "(RRH2_ $rrh2);";
$wpdata .= "(RRH6_ $rrh6);";
$wpdata .= "(RRH12 $rrh12);";
$wpdata .= "(RRH24 $rrh24);";
$wpdata .= "(RRD1_ $rrd1);";
$wpdata .= "(RRM1_ $rrm1);";
$wpdata .= "(RRY1_ $rry1);";
$wpdata .= "(RRDM1 $rrdm1);";
$wpdata .= "(SUND1 $sund1);";
$wpdata .= "(SUNH1 $sunh1);";
$wpdata .= "(WCUR_ $wcur);";
$wpdata .= "(WDIR_ $wdir);";
$wpdata .= "(WCURA $wcura);";
$wpdata .= "(WDIRA $wdira);";
$wpdata .= "(WMX__ $wmx);";
$wpdata .= "(PCUR_ $pcur);";
$wpdata .= "(PCH1_ $pch1);";
$wpdata .= "(PCH3_ $pch3);";
$wpdata .= "(CLCNB $clcnb);";
$wpdata .= "(HGTNN $hgtnn);";
$wpdata .= "(DAONI $daoni);";
$wpdata .= "(SNHGT $snhgt);";
$wpdata .= "(SNHTD $snhtd);";
$wpdata .= "(SNL__ $snl);";
$wpdata .= "(LXCUR $lxcur);";
$wpdata .= "(LXMAX $lxmax);";
$wpdata .= "(TIME_ $time);";
$wpdata .= "(DATE_ $date);";
$wpdata .= "(PLGNV $plgnv)";
$wpdata = urlencode($wpdata);
// DEBUG-Ausgabe des Rohdaten-String.
//echo "http://". $wphost . $wpurl . "?data=". $wpdata ."\n";
// Daten senden.
if ( apirequest($wphost, $wpport, $wptimeout, $wpurl, $wpdata) )
{
IPS_LogMessage("WETTERPOOL.DE", "Meldung erfolgreich!");
}
?>

