Hydrologiesche Daten von Schweizer Gewässern

Hallo Gemeinde

Da ich gerne bei uns in der Schweiz in den Flüssen Schwimmen gehe interressiert mich dann vorab mal die Temperatur.
Da die Daten abrufen jedesmal eine Klickerei ist habe ich ein kleines Script gemacht das für mich die Temperatur an meinem Wohnort aus dem Web ausliest und im WebFront ausgibt.
Das Bundesamt stellt dafür eine xml Datei zum Download zur Verfügung.
Die Links sind im Script hinterlegt damit auch die richtige Messstation abgefragt werden kann.

Kommentare sind im Script. Zum Code selber ist zu sagen, das ich nicht der wahre Programierer bin. Einiges ist zusammenkopiert.
Aber es funktioniert bei mir einwandfrei. Darum nicht zu tief reinschauen.

Einfach ein neues Script in der gewünschten Kategorie anlegen und untenstehenden Code reinkopieren.
Dann ausführen.

Grüsse aus der Schweiz
Tschewie

<?
//Infos von Stationsnumern
//http://www.hydrodaten.admin.ch/de/index.html?lang=de
// Variablen Namen können nachträglich geändert werden
// Script dann regelmässig aufrufen

// Typ Daten Typ
// 10 = Abflussmenge
// 02 = m.ue.M
// 03 = Temperatur
// StrNr Messstation Nummer
// Die Nummer ist ersichtlich wenn auf der Karte die Messstation angeklickt wird.
// Die Nummer ist im Titel hinter dem Namen in Klammern ()

$MessStationNummer = "2018"; //Reuss-Mellingen
$messdatenTyp = "03";
$fp = simplexml_load_file( 'http://www.hydrodaten.admin.ch/lhg/SMS.xml' ); // Absoluter Pfad
$dummyName = "Hydrowatch_";

//******************************************
// Normalerweise ab hier nichts mehr machen
//******************************************

//Dummy Modul anlegen als Heimat der Messdaten im Selben Pfad wie das Script
$parentobject = IPS_GetObject($_IPS['SELF']);
$parentID = $parentobject['ParentID'];
    if (IPS_GetObject($parentID)['ObjectType'] !== 1)
    {
        $parentID = IPS_CreateInstance("{485D0419-BE97-4548-AA9C-C083EB82E61E}");
        IPS_SetParent($parentID, $parentobject['ParentID']);
        IPS_SetParent($_IPS['SELF'], $parentID);
        IPS_SetHidden($_IPS['SELF'], true);
        IPS_SetName  ($parentID, $dummyName.$MessStationNummer);
    }
    
// xml verarbeitung
foreach ($fp->children() as $node) {
        $arr = $node->attributes();   // returns an array
            if($arr["Typ"]==$messdatenTyp && $arr["StrNr"]==$MessStationNummer){
                foreach($node->children() as $values){
               $arrType = $values->attributes();
               //Variable anlegen
                    if($values->getName()== "Name")
                    {
                       $var_ident ="HydroMessStationName".$parentID;
                       $var_id = CreateVariableByName($parentID, "Messstation", 3, $var_ident, "~String", 10);
                  setValueString($var_id,"$values");
                    }
               if($values->getName()== "Datum")
                    {
                       $var_ident ="HydroMessDatum".$parentID;
                       $var_id = CreateVariableByName($parentID, "Messdatum", 3, $var_ident, "~String", 20);
                  setValueString($var_id,"$values");
                    }
               if($values->getName()== "Zeit")
                    {
                       $var_ident ="HydroMessZeit".$parentID;
                       $var_id = CreateVariableByName($parentID, "Messzeit", 3, $var_ident, "~String", 30);
                  setValueString($var_id,"$values");
                    }
                    if($values->getName()== "Wert" && $arrType == "")
                    {
                       $var_ident ="HydroMessWertTemperaturAktuell".$parentID;
                  $profilName = GetProfilName($messdatenTyp);
                        $var_id = CreateVariableByName($parentID, "Messwert Aktuell", 2, $var_ident, $profilName, 40);
                  setValueFloat($var_id,(Double)$values);
                    }
                    if($values->getName()== "Wert" && $arrType == "m24")
                    {
                       $var_ident ="HydroMessWertTemperaturMittel".$parentID;
                  $profilName = GetProfilName($messdatenTyp);
                        $var_id = CreateVariableByName($parentID, "Mittelwert 24h ", 2, $var_ident, $profilName, 50);
                  setValueFloat($var_id,(Double)$values);
                    }

                }
            }
}
//Variablenprofil wenn nicht breits vorhanden neu anlegen
function GetProfilName($messdatenTyp)
{
   if($messdatenTyp == "03"){
        $profilName = "~Temperature";
    }else if($messdatenTyp == "10"){
        // qubik per Sek.
        $profilName = "~Gas";
        if( IPS_VariableProfileExists("Durchfluss.p.sek")){
           $profilName = "Durchfluss.p.sek";
        }
        else{
         IPS_CreateVariableProfile("Durchfluss.p.sek", 2);
         IPS_SetVariableProfileText ("Durchfluss.p.sek", "", " m³/s" );
         IPS_SetVariableProfileDigits("Durchfluss.p.sek", 2);
            $profilName = "Durchfluss.p.sek";
        }
        
    }else if($messdatenTyp == "02"){
        // m.ue.M.
        if( IPS_VariableProfileExists("meter.ue.Meer")){
           $profilName = "meter.ue.Meer";
        }
        else{
         IPS_CreateVariableProfile("meter.ue.Meer", 2);
         IPS_SetVariableProfileText ( "meter.ue.Meer", "", " m.ue.M" );
         IPS_SetVariableProfileDigits("meter.ue.Meer", 2);
            $profilName = "meter.ue.Meer";
        }
        
    }
    else{
       $profilName = "";
    }

    return $profilName;
}

// VAriablen bei nicht vorhandensein neu anlegen
// sogleich Position inerhalb des Dummymoduls bestimmen
// Geguttenbergt by paresy
function CreateVariableByName($id, $name, $type, $ident, $profile = "", $position)
{
    $vid = @IPS_GetObjectIDByIdent ($ident, $id);
    if($vid === false)
    {
        $vid = IPS_CreateVariable($type);
        IPS_SetParent($vid, $id);
        IPS_SetName($vid, $name);
        IPS_SetIdent($vid, $ident);
        IPS_SetInfo($vid, "");
        IPS_SetPosition($vid, $position);
        if($profile !== "")
        {
            IPS_SetVariableCustomProfile($vid, $profile);
        }
    }
    return $vid;
}
?>

Hallo Tschewie, danke für das Script, ist ja eine hochinteressante Seite für unsere Hochwasser geprägte Region.

Hoi Jürg

Bei dir am Thunersee würde ich 2093 nehmen. Dann richte einen Alarm ein wenn ein gewisser Wert bei m.ue.M überschritten wird. Dann weisst du wann das Wasser am See unten auf die Strasse läuft.

gruess
tschewie

Und Du gehst wirklich noch los, wenn Du die Temperaturen vorab siehst :wink:

sicher 19 C ist dann allerdings auch untere Grenze.
Aber die Flüsse sind cool.
Man kommt ohne viel zu machen noch vorwärts. :smiley:

tschewie