Aufgrund des Vorschlags von nancilla habe ich mein Script etwas angepasst und ein Grundgerüst für das wetterpool.de Netzwerk geschaffen.
Das Script kann um wesentliche Punkte wie Trends, Durchschnittswerte usw. ergänzt werden. Diese fehlen im 1. Wurf…
<?
// Zugangs-/Accountinformationen zur API von wetterpool.de
$wpuser = 'ID';
$wppass = 'PASSWORT';
$wphost = 'www.wetterpool.de';
$wpport = '80';
$wptimeout = '30';
$wpurl = '/import/wswin_directpost.php';
// Eigene Werte aufbereiten:
$tempmaxmin = maxmin_val("TMAXMIN", GetValue(57080));
// 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))); // 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
";
$request.= "Host: ". $wphost ."
";
$request.= "Connection: Close
";
// 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!
$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 ."
";
// Daten senden.
if ( apirequest($wphost, $wpport, $wptimeout, $wpurl, $wpdata) )
{
IPS_LogMessage("WETTERPOOL.DE", "Meldung erfolgreich!");
}
?>
Viel Spaß damit… Ergänzungen erwünscht!
Erste IP-Symcon wetterpool.de Station: http://www.wetterpool.de/station-19785.htm
Update:
- 2 neue Funktion um MIN/MAX/Durchschnittswerte zu errechnen (siehe Code).