Wetterwarnungen Österreich mit Geosphere Daten

hallo erstmal ein gutes neues Jahr
Die Wetterwarnungen wurden mir gestern wunderbar angezeigt jetzt sind aber keine mehr aber die Warnung verschwindet nicht mehr mach ich was falsch?

<?php
$location_id=22642; //ID der Locationinstanz
$html_id=53246; //HTML-Box Variable
$warnungvorhanden_id=58858; //Variable ob Warnungen (Orange, Rot) vorhanden sind
$crc_id=57853; //CRC Variable um eine Änderung in den Warnungen festzustellen
//$smtp_id=27953; //ID der SMTP Instanz für den Mailversand
//$adressen=array("adresse1@gmail.com","adresse2@outlook.at"); //Liste der Empfänger
$warnunganzeige_id=31083;
//$adressen=array("adresse3@gmail.com");
$immersenden=true;
//$immersenden=false;

$text="";
$html="";
SetValue($warnungvorhanden_id,false);
$lat=json_decode(json_decode(IPS_GetConfiguration($location_id),true)["Location"],true)["latitude"];
$long=json_decode(json_decode(IPS_GetConfiguration($location_id),true)["Location"],true)["longitude"];
$crcalt=getvalue($crc_id);


$url="https://warnungen.zamg.at/wsapp/api/getWarningsForCoords?lon=".number_format($long,4,".",".")."&lat=".number_format($lat,4,".",".")."&lang=de";
$warnungen_json=file_get_contents($url);
$crc_warnungen=crc32($warnungen_json);
$warnungen=json_decode($warnungen_json,true);
$heute_beginn=mktime(0,0,0,date("m",time()),date("d",time()),date("Y",time()));
$heute_ende=mktime(23,59,0,date("m",time()),date("d",time()),date("Y",time()));
$morgen_beginn=$heute_beginn+(3600*24);
$morgen_ende=$heute_ende+(3600*24);
$meldungen=0;
$warnstufenum=0;
$html=$html."<html><head><link rel=\"stylesheet\" href=\"../skins/WwXSkin/webfront.css\"></head>";
$html=$html."<table class=\"wwx\" border=\"1\" style=\"width:100%;border-spacing: 0px;\">";
foreach ($warnungen["properties"]["warnings"] as $warnung)
{
/*
	echo date("d.m.Y G:i:s",$warnung["properties"]["rawinfo"]["start"]).PHP_EOL;
	echo date("d.m.Y G:i:s",$warnung["properties"]["rawinfo"]["end"]).PHP_EOL;
	echo date("d.m.Y G:i:s",$heute_beginn).PHP_EOL;
	echo date("d.m.Y G:i:s",$heute_ende).PHP_EOL;
	echo date("d.m.Y G:i:s",$morgen_beginn).PHP_EOL;
	echo date("d.m.Y G:i:s",$morgen_ende).PHP_EOL;
	echo ($warnung["properties"]["rawinfo"]["start"]>=$heute_beginn and $warnung["properties"]["rawinfo"]["end"]<=$heute_ende).PHP_EOL;
	echo ($warnung["properties"]["rawinfo"]["start"]>=$morgen_beginn and $warnung["properties"]["rawinfo"]["end"]<=$morgen_ende).PHP_EOL;

	if (($warnung["properties"]["rawinfo"]["start"]>=$heute_beginn and $warnung["properties"]["rawinfo"]["end"]<=$heute_ende) or 
	    ($warnung["properties"]["rawinfo"]["start"]>=$morgen_beginn and $warnung["properties"]["rawinfo"]["end"]<=$morgen_ende))
*/
	if (true)
	{
		$meldungen++;
		$html=$html."<tr>";
		$text="";
		switch ($warnung["properties"]["warntypid"])
		{
			case 1: $warntyp="Sturm";break;
			case 2: $warntyp="Regen";break;
			case 3: $warntyp="Schnee";break;
			case 4: $warntyp="Glatteis";break;
			case 5: $warntyp="Unwetter";break;
			case 6: $warntyp="Hitze";break;
			case 7: $warntyp="Kälte";break;
		}
		switch ($warnung["properties"]["warnstufeid"])
		{
			case 1:$warnstufe="Gelb";$color="yellow"; break;
			case 2:$warnstufe="Orange";$color="orange"; break;
			case 3:$warnstufe="Rot";$color="red"; break;
		}
		$warnstufenum=max($warnstufenum,$warnung["properties"]["warnstufeid"]);
		$text=$text."Warnung: ".$warntyp." - Stufe: ".$warnstufe.PHP_EOL;
		$text=$text.$warnung["properties"]["begin"]." - ".$warnung["properties"]["end"].PHP_EOL;
		$text=$text.$warnung["properties"]["text"].PHP_EOL;
		$text=$text."Auswirkungen".PHP_EOL.$warnung["properties"]["auswirkungen"].PHP_EOL.PHP_EOL;
		$text=$text."Empfehlungen".PHP_EOL.$warnung["properties"]["empfehlungen"].PHP_EOL.PHP_EOL;
		$text=$text.$warnung["properties"]["meteotext"].PHP_EOL;
		$text=$text."https://a33048f121722d0a8a8f12051779cfe9.ipmagic.de/#19358".PHP_EOL;
		if ($warnstufe == "Orange" or $warnstufe == "Rot")
		{
			if (($crc_warnungen != $crcalt or $immersenden) and ($warnung["properties"]["warntypid"]==1 or $warnung["properties"]["warntypid"]==2 or $warnung["properties"]["warntypid"]==4 or $warnung["properties"]["warntypid"]==5))
			{
				foreach ($adressen as $adresse) SMTP_SendMailEx($smtp_id,$adresse,"Wetterwarnung - ".$warntyp." - Warnstufe: ".$warnstufe,$text);
			}
			SetValue($warnungvorhanden_id,true);
		}
		$html=$html.
		"<td style='padding:0px;background-color:".$color."; '>&nbsp;&nbsp;</td>";
		$html=$html.
		"<td style='padding:5px;'><center>".$warntyp."</center></td>";
		$html=$html.
		"<td style='padding:5px;'><center>".$warnung["properties"]["begin"]."<br>".$warnung["properties"]["end"]."</center></td>";
		$html=$html.
		"<td style='padding:5px;'><center>".$warnung["properties"]["text"]."</center></td>";
		$html=$html.
		"<td style='padding:0px;'><ul>".str_replace("*","<li>",str_replace("\n","<br>",$warnung["properties"]["auswirkungen"]))."</ul></td>";
		$html=$html.
		"<td style='padding:0px;'><ul>".str_replace("*","<li>",str_replace("\n","<br>",$warnung["properties"]["empfehlungen"]))."</ul></td>";
		$html=$html.
		"<td style='padding:5px;'><center>".$warnung["properties"]["meteotext"]."</center></td>";
		$html=$html."</tr>";
	}
}
switch ($warnstufenum)
{
	case 1:setvalue($warnunganzeige_id,1); break;
	case 2:setvalue($warnunganzeige_id,2); break;
	case 3:setvalue($warnunganzeige_id,3); break;
	default:setvalue($warnunganzeige_id,0);
}
if($meldungen == 0)
{
		$html=$html.
	"<tr><td style='padding:0px;background-color:green;width:20px;'>&nbsp;</td><td colspan=7 style='padding:5px;'><center>Keine Warnungen vorhanden!</center></td></tr>";

}
setvalue($crc_id,$crc_warnungen);
$html=$html."<tr><td colspan=7><center><a target=_blank href='https://warnungen.zamg.at/wsapp/de/alle/gesamterzeitraum/'>Wetterwarnungen</a></center></tr></td>";
$html=$html."</table>";
setvalue($html_id,$html);


gruß Stefan

Guten Morgen
Deine $warnunganzeige_id ist ein String bei dir. Bei mir eine Integer Variable. Eventuell liegt es daran? Bei mir funktioniert das so, wie es soll. Oder es passt dein Profil für deine String Variable nicht. Was ist denn der echte Wert deiner Variable „Warnstufe/31083“?

Warnstufe/31083 ist bei mir der wert 1

Wenn du nach
$warnstufenum=max($warnstufenum,$warnung[„properties“][„warnstufeid“]);
ein
echo $warnstufenum.PHP_EOL;
einbaust und das Skript laufen lässt, was kommt dabei heraus?

1
was ja nicht sein sollte

Ja stimmt. Wobei er gar nicht in die foreach-Schleife reingehen sollte, wenn keine Warnungen vorhanden sind.
Mach mal vor
foreach ($warnungen[„properties“][„warnings“] as $warnung)
ein
var_dump($warnungen[„properties“][„warnings“]);
rein. Bei mir (keine Warnungen) kommt
array(0) { }
heraus.
Das echo kannst wieder löschen.
Hast du deinen Standort in der Location Instanz richtig hinterlegt?

bei mir kommt das

Die Hochkomma stimmen nicht

var_dump($warnungen["properties"]["warnings"]);

jetzt kommt das:

array(1) {
  [0]=>
  array(2) {
    ["type"]=>
    string(7) "Warning"
    ["properties"]=>
    array(14) {
      ["warnid"]=>
      int(5)
      ["chgid"]=>
      int(0)
      ["verlaufid"]=>
      int(0)
      ["warntypid"]=>
      int(5)
      ["begin"]=>
      string(16) "01.01.2024 00:00"
      ["end"]=>
      string(16) "01.01.2024 01:00"
      ["create"]=>
      string(28) "2023-12-31 23:19:06.73319+00"
      ["text"]=>
      string(32) "Es ist mit Gewittern zu rechnen."
      ["auswirkungen"]=>
      NULL
      ["empfehlungen"]=>
      NULL
      ["meteotext"]=>
      NULL
      ["updategrund"]=>
      NULL
      ["warnstufeid"]=>
      int(1)
      ["rawinfo"]=>
      array(4) {
        ["wtype"]=>
        int(5)
        ["wlevel"]=>
        int(1)
        ["start"]=>
        string(10) "1704063600"
        ["end"]=>
        string(10) "1704067200"
      }
    }
  }
}

Ok :slight_smile:
Kenn mich aus. Die Warnung ist schon abgelaufen. Schau auf das „begin“ und „end“. Das war eine warnung von 00:00 bis 01:00 Uhr. Die haben sie noch nicht rausgenommen. Auf der Karte wird nichts angezeigt.
Man könnte glaube ich, bei der URL noch ein Datum/Uhrzeit mitgeben. Das hab ich mir gespart. Oder man könnte im Skript eine entsprechende Prüfung einbauen. Hatte ich mal, aber Warnungen die über mehrere Tage gemacht werden, können da nicht so einfach ermittelt werden.
Im Grunde stimmt das Skript. Es macht es formal richtig. In der HTML Tabelle solltest es sehen, dass es eine Warnung aus der Vergangenheit ist. Entweder sie löschen diese heute noch, oder dann morgen.

Ahhh ok danke für die Mühe kenne mich jetzt aus.
Danke

2 „Gefällt mir“

Vielen Dank, hab das bei mir auch gerade umgesetzt, hat super funktioniert!

Ich hätte eine Frage zu der Location ID.
Diese habe ich mir via Google Maps rausgesucht (Längengrad, Breitengrad).
Diese beiden Werte habe ich dann der Variable String zugefügt.

Beim Ausführen des Skriptes (Zeile 16) bekomm ich eine Fehlermeldung das nichts gefunden wird???

Danke.

Unter Kern Instanzen Location verwenden dann geht es.
Gruß Stefan

Du kannst natürlich auch diese Variablen

$lat=json_decode(json_decode(IPS_GetConfiguration($location_id),true)["Location"],true)["latitude"];
$long=json_decode(json_decode(IPS_GetConfiguration($location_id),true)["Location"],true)["longitude"];

mit deinen eigenen Werten befüllen. Allerdings musst du für das Komma einen Punkt verwenden. MIt vier Nachkommastellen.

Vielen Dank, der Tipp mit der „Kern Instanz“-Location hat funktioniert.
Dort habe ich bereits meinen Ort hinterlegt.

Die Ortsabfrage funktioniert nun, jedoch macht die HTML Box (String Variable) Probleme. Dort bekomm ich nichts angezeigt?

Auch habe ich eine Integer Variable erstellt für die Warnfarben inkl. dem entsprechenden Profil für die Warnfarben (0 ist Keine, 1 ist Niedrig, usw…)

Der Punkt in deinem Script:
$warnunganzeige_id=16978; ist ja für mich hinfällig oder? da ich diesen nicht weiterleite?

Das wäre die ID deiner Integer Variable für die Anzeige

Wenn keine Warnungen vorhanden sind, ist die Tabelle bis auf den Rahmen, Text (keine Warnungen) und dem Link leer.

Vielen Dank :slight_smile: Dann warte ich mal bis ein Ereignis im Mühlviertl eintritt…

Wie oft Rufst du die Daten per API ab?

Stündlich …

1 „Gefällt mir“

Hallo zusammen,
ich hätte noch eine Frage was die HTML Box betrifft.
Wie schaff ich es, das bei einer Warnung das ganze Bild angezeigt wird?
Leider kann ich nicht nach rechts scrollen?