Wetterwarnung als Sprachausgabe in Python

weatherman

Stammuser
Hallo liebe Programmierer,
ich bin es mal wieder Weatherman aus der Eifel.
Wenn Ihr mir nochmalig eure Hilfe zu Verfügung stellen könntet und zwar:

Ich möchte gerne, wenn für den Kreis Euskirchen eine Wetterwarnung vorliegt diese als Wave - File ausgeben lassen.

Also ich möchte per Batchfile ein Script anstossen welches folgende Seite im Internetbesucht:

http://www.warnmodul.wettergefahren.de/php/warnings.php?id=EUS

Wenn jetzt eine oder mehrere Warnungen vorliegen, soll das Script diese Daten in ein Textfile packen und anschließend daraus ein Wavefile erzeugen welches dann über Funk bei mir ausgesendet wird.

Mit Balabolka kann man es so machen werde ich auch nutzen dafür wenn ich die reinen Wetterwarnungen in einem Textfile vorliegen habe.

Alternativ könnte mann auch diesen Link zum Auslesen nehmen.
https://wettwarn.de/txt/EUS.html

Mich interessiert nur der Teil des Textes der in der Warnmakierung(hier gelb) steht.
Phyton ist installiert und auf meinem Server vorhanden.

Also zur Verdeutlichung: Über den Sheduler in Windows lege ich mir eine Stapelverarbeitungsdatei an die z.B. Warn.bat heißt.
Diese soll dann das Phytonscript dazu bwewegn eine von den beiden Links zu besuchen um die Warnungen im Textfile zu speichern.
Im Anschluß soll daraus ein Wav-file entstehen welches ich dann über Amateurfunk Echolink ausstrahle.

CDW hat mir sowas schon einmal programmiert für eine Stauabfrage, jetzt ist es eben ein Wetterwarnungsabfrage mit Soundausgabe.

Achso wenn keine Warnung aktiv ist, sollte das Script so programmiert sein, das es dieses auch ausgibt mit dem Inhalt:

z.B. keine Warnung für Euskirchen
LG Weatherman
 
Zuletzt bearbeitet:

Tsjuder

Stammuser
CDW hat mir sowas schon einmal programmiert für eine Stauabfrage, jetzt ist es eben ein Wetterwarnungsabfrage mit Soundausgabe.

Bevor ich jetzt selber mein Gehirn anstrenge :wink: :
Was hast du denn genau für die Stauabfrage? Das liest sich jetzt so, als ob du das genauso schon für eine Stauabfrage hast, d.h. mit Soundausgabe usw. Mit anderen Worten, könntest du doch 90% des Codes übernehmen, tauscht die Links aus, parsed dir da die Wetterwarnung raus und der ganze Soundausgabe-Krempel bleibt wie gehabt...oder?
 

weatherman

Stammuser
Bevor ich jetzt selber mein Gehirn anstrenge :wink: :
Was hast du denn genau für die Stauabfrage? Das liest sich jetzt so, als ob du das genauso schon für eine Stauabfrage hast, d.h. mit Soundausgabe usw. Mit anderen Worten, könntest du doch 90% des Codes übernehmen, tauscht die Links aus, parsed dir da die Wetterwarnung raus und der ganze Soundausgabe-Krempel bleibt wie gehabt...oder?




Ja das ist richtig, habe ich auch schon versucht, es kommt aber leider nicht das was ich haben will, sondern nur Zur Zeit liegen keine Warnungen vor, auch wenn welche vorliegen. Ich stelle das script heute abend mal hier ein dann kannste mal probieren, danke für deine Antwort. LG Steff
 

weatherman

Stammuser
pynrwwarn.py

#! /usr/bin/env python
# -*- coding: utf-8 -*-
MAIN_URL = "https://wettwarn.de/txt/EUS.html"

OUTPUT = "warn.txt"
ERRORS = "errors.txt" # Fehlerausgabe in errors.txt
TIMEOUT = 60 # hoechstens 60 Sekunden auf die Daten warten

########################################################
########################################################

from HTMLParser import HTMLParser
from urllib2 import urlopen

import logging

LOG_FORMAT = "%(asctime)s %(levelname)s: %(filename)s : %(message)s"
DATE_FORMAT = "%d.%m.%Y %H:%M:%S"
logging.basicConfig(filename=ERRORS, format=LOG_FORMAT, datefmt=DATE_FORMAT)

class SimpleHTMLParser(HTMLParser):
def __init__(self):
HTMLParser.__init__(self)
self.parse = False
self.data = []

def handle_entityref(self, name):
if self.parse and name == 'deg': # HTML-Codierung fuer °
self.data.append(' °')

def handle_starttag(self, tag, attrs):
if tag == 'strong':
self.parse = True

def handle_endtag(self, tag):
if tag == 'strong':
self.parse = False

def handle_data(self, data):
if self.parse:
self.data.append(data)

def main():
try:
url = MAIN_URL
parser = SimpleHTMLParser()
parser.feed(urlopen(url, timeout = TIMEOUT).read())
data = "\n".join([line for line in parser.data if line != ' '])
data = data.replace("\r\n",'')
data.decode('iso8859_15').encode('utf-8')
if not data.replace("\n",""):
data = "Zur Zeit liegen keine akuten Warnungen vor, einen schoenen Tag wuenscht Stefan Corsten."

with open(OUTPUT, 'wb') as output:
output.write(data)
except Exception as ex:
logging.critical(str(ex))

main()
 

weatherman

Stammuser
Hier das Original Staupy

#! /usr/bin/env python
# -*- coding: utf-8 -*-
MAIN_URL =
"http://www.radionrw.de/verkehr/vknrw.htm"
OUTPUT =
"nrwverkehr.txt"
ERRORS = "errors.txt"
# Fehlerausgabe in errors.txt
TIMEOUT = 60
# hoechstens 60 Sekunden auf die Daten warten
########################################################
########################################################
from HTMLParser import HTMLParser
from urllib2 import urlopen
import logging
LOG_FORMAT
=
"%(asctime)s %(levelname)s: %(filename)s : %(message)s"
DATE_FORMAT =
"%d.%m.%Y %H:%M:%S"
logging.basicConfig(filename=ERRORS, format=LOG_FORMAT, datefmt=DATE_FORMAT
)
class
SimpleHTMLParser(HTMLParser
):
def __init__(self
):
HTMLParser.__init__(self
)
self.parse =
False
self
.data
= []
def handle_entityref(self, name
):
if
self.parse and name == 'deg':
# HTML-Codierung fuer °
self.data.append(' °'
)
def handle_starttag(self, tag, attrs
):
if
tag == 'strong'
:
self.parse =
True
def handle_endtag
(self, tag
):
if
tag == 'strong'
:
self.parse =
False

def handle_data
(self, data
):
if
self.parse
:
self.data.append(data
)
def main
():
try:
url =
MAIN_URL
parser
= SimpleHTMLParser
()
parser.feed(urlopen(url, timeout = TIMEOUT).read
())
data = "\n".join([line for line in parser.data if line != ' '
])
data = data.replace("\r\n",''
)
data.decode('iso8859_15').encode('utf-8'
)

with open(OUTPUT, 'wb') as output
:
output.write(data
)
except Exception as ex
:
logging.critical(str(ex
))
main()
 

Tsjuder

Stammuser
Hi weatherman,
ich habe mir das mal kurz angeguckt. Jetzt frage ich mal doof: Kannst du programmieren :D ?

Das Problem ist eigentlich recht simpel, denn der HTMLParser sucht nach einem Tag Namens "strong". Im Wesentlichen musst du wohl den kompletten "body" parsen.

Ich habe jetzt einfach mal auf die schnelle das Skript abgeändert:
Code:
#! /usr/bin/env python
# -*- coding: utf-8 -*-
#MAIN_URL = "https://wettwarn.de/txt/SLF.html"
MAIN_URL = "https://wettwarn.de/txt/EUS.html"

OUTPUT = "warn.txt"
ERRORS = "errors.txt" # Fehlerausgabe in errors.txt
TIMEOUT = 60 # hoechstens 60 Sekunden auf die Daten warten

################################################## ######
################################################## ######

from HTMLParser import HTMLParser
from urllib2 import urlopen

import logging

LOG_FORMAT = "%(asctime)s %(levelname)s: %(filename)s : %(message)s"
DATE_FORMAT = "%d.%m.%Y %H:%M:%S"
logging.basicConfig(filename=ERRORS, format=LOG_FORMAT, datefmt=DATE_FORMAT)

class SimpleHTMLParser(HTMLParser):
	def __init__(self):
		HTMLParser.__init__(self)
		self.parse = False
		self.data = []

	def handle_entityref(self, name):
		if self.parse and name == 'deg': # HTML-Codierung fuer ° 
			self.data.append(' °') 

	def handle_starttag(self, tag, attrs):
		if tag == 'body':
			self.parse = True

	def handle_endtag(self, tag):
		if tag == 'body':
			self.parse = False

	def handle_data(self, data):
		if self.parse:
			self.data.append(data)

def main():
	try:
		url = MAIN_URL
		parser = SimpleHTMLParser()
		parser.feed(urlopen(url, timeout = TIMEOUT).read())
		data = "\n".join([line for line in parser.data if line != ' '])
		data = data.replace("\r\n",'')
		data.decode('iso8859_15').encode('utf-8')			
		if "Keine Warnungen für" in data:
			data = "Zur Zeit liegen keine akuten Warnungen vor, einen schoenen Tag wuenscht Stefan Corsten."

		with open(OUTPUT, 'wb') as output:
				output.write(data)
	except Exception as ex:
		logging.critical(str(ex))

main()

Für Euskirchen ist die Ausgabe dann:
Code:
Zur Zeit liegen keine akuten Warnungen vor, einen schoenen Tag wuenscht Stefan Corsten.

Für Saalfeld-Rudolstadt dann:
Code:
WettWarn Warnübersicht SLF
Wetterwarnungen für DWD Warnregion: Saalfeld-Rudolstadt
2 Warnungen für Saalfeld-Rudolstadt


Amtliche WARNUNG vor NEBEL
für Kreis Saalfeld-Rudolstadt, Lagen über 800 Meter
gültig von:          Mittwoch, 09.12.2015 04:46 Uhr
voraussichtlich bis: Mittwoch, 09.12.2015 10:00 Uhr
ausgegeben vom Deutschen Wetterdienst
am:                  Mittwoch, 09.12.2015 04:46 Uhr
Es tritt Nebel mit Sichtweiten unter 150 Metern auf.




Amtliche WARNUNG vor NEBEL
für Kreis Saalfeld-Rudolstadt
gültig von:          Dienstag, 08.12.2015 21:15 Uhr
voraussichtlich bis: Mittwoch, 09.12.2015 10:00 Uhr
ausgegeben vom Deutschen Wetterdienst
am:                  Dienstag, 08.12.2015 21:09 Uhr
Es tritt Nebel mit Sichtweiten unter 150 Metern auf.




Quelle: Deutscher Wetterdienst
Bereitgestellt von 
WettWarn
DWD Wetterwarnungen Mobil
SMS, Telegram, RSS Feed und Kurzlink und Warnübersicht
Erstellt: 09.12.2015 08:50 Uhr

Ich habe einfach nur ein Gebiet gesucht wofür es zur Zeit eine Warnung gibt :D.

Die Ausgabe lässt sich auch noch ein wenig umgestalten. Je nachdem wie du das willst.
 

weatherman

Stammuser
Ausgabe des letzten Scripts

WettWarn Warnübersicht EUS
Wetterwarnungen für DWD Warnregion: Euskirchen
2 Warnungen für Euskirchen


Amtliche WARNUNG vor FROST
für Kreis Euskirchen
gültig von: Mittwoch, 09.12.2015 22:00 Uhr
voraussichtlich bis: Donnerstag, 10.12.2015 09:00 Uhr
ausgegeben vom Deutschen Wetterdienst
am: Mittwoch, 09.12.2015 13:52 Uhr
Es tritt leichter oder mäßiger Frost auf.




Amtliche WARNUNG vor GLÄTTE
für Kreis Euskirchen
gültig von: Mittwoch, 09.12.2015 22:00 Uhr
voraussichtlich bis: Donnerstag, 10.12.2015 09:00 Uhr
ausgegeben vom Deutschen Wetterdienst
am: Mittwoch, 09.12.2015 13:52 Uhr
Es tritt verbreitet Glätte auf.




Quelle: Deutscher Wetterdienst
Bereitgestellt von
WettWarn
DWD Wetterwarnungen Mobil
SMS, Telegram, RSS Feed und Kurzlink und Warnübersicht
Erstellt: 09.12.2015 17:10 Uhr



Die warn.wav schicke ich dir mal per mail wenn du mir die Mailadresse zukommen lässt. Schön wäre es wenn wirklich nur die reine Warnung herauskommt also ich meinte jetzt:

Wenn wie jetzt gerade 2 Warnungen vorliegen dann sollte nur fogendes in der warn.txt stehen der Rest kann ausgeklammert werden:

Amtliche WARNUNG vor FROST
Amtliche WARNUNG vor GLÄTTE

das hat den Vorteil die warn.wav ist sehr klein und nicht 2,6 mb groß.
Wenn du die Wavedatei mal anhörst wirst du merken da sind noch Zeichen vorhanden die balabolka nicht versteht wie z.B.Leerzeichen.

Bedeutet wenn du die warn.txt mit dem win editor aufmachst erscheint eine Zeile nacheinander weg und Balabolka liest alle Zeichen als völligen Quatsch, höre es dir mal an, wie kann ich dir denn die warn.wav zukommen lassen, er nimmt hier keine wavs, oder muss ich das ding zippen??

Ich bekomme es leider nicht auf 997 kb herunter gezippt, um es hier versenden zu können:

Höre es dir hier bitte an:
http://eichenwetter.homelinux.net/linuxhd/Stau/warn.wav
 
Zuletzt bearbeitet:

Tsjuder

Stammuser
Hallo weatherman,
zwei Sachen.

1. Das Skript ist unten nochmal so, dass es nur die Schrift innerhalb der h2-Tags parsed. Dann sieht es aktuell so aus:
Code:
2 Warnungen für Euskirchen
Amtliche WARNUNG vor FROST
Amtliche WARNUNG vor GLÄTTE
Wenn sich der Aufbau der Seite ändert, muss aber natürlich auch das Skript geändert werden.

2. Das Problem in der WAV-Datei sind eher die ganzen Umlaute ä,ö,ü. Die werden mit der falschen Kodierung gelesen, wobei dann aus "ä" sowas wie "A ein Viertel" gelesen wird. Auf welchem Betriebssystem läuft das Ganze? Ich habe es jetzt einfach mal auf die Windows-Kodierung umgestellt. Vielleicht hilft das?

Code:
#! /usr/bin/env python
# -*- coding: utf-8 -*-
#MAIN_URL = "https://wettwarn.de/txt/SLF.html"
MAIN_URL = "https://wettwarn.de/txt/EUS.html"

OUTPUT = "warn.txt"
ERRORS = "errors.txt" # Fehlerausgabe in errors.txt
TIMEOUT = 60 # hoechstens 60 Sekunden auf die Daten warten

################################################## ######
################################################## ######

from HTMLParser import HTMLParser
from urllib2 import urlopen

import logging
import codecs

LOG_FORMAT = "%(asctime)s %(levelname)s: %(filename)s : %(message)s"
DATE_FORMAT = "%d.%m.%Y %H:%M:%S"
logging.basicConfig(filename=ERRORS, format=LOG_FORMAT, datefmt=DATE_FORMAT)

class SimpleHTMLParser(HTMLParser):
	def __init__(self):
		HTMLParser.__init__(self)
		self.parse = False
		self.data = []

	def handle_entityref(self, name):
		if self.parse and name == 'deg': # HTML-Codierung fuer ° 
			self.data.append(' °') 

	def handle_starttag(self, tag, attrs):
		if tag == 'h2':
			self.parse = True

	def handle_endtag(self, tag):
		if tag == 'h2':
			self.parse = False

	def handle_data(self, data):
		if self.parse:
			self.data.append(data)

def main():
	try:
		url = MAIN_URL
		parser = SimpleHTMLParser()
		parser.feed(urlopen(url, timeout = TIMEOUT).read())
		data = "\n".join([line for line in parser.data if line != ' '])
		data = data.replace("\r\n",'')			
		if "Keine Warnungen für" in data:
			data = "Zur Zeit liegen keine akuten Warnungen vor, einen schoenen Tag wuenscht Stefan Corsten."

		with codecs.open(OUTPUT, 'w', "cp1252") as output:
				output.write(data.decode('utf-8'))
	except Exception as ex:
		logging.critical(str(ex))

main()
 

weatherman

Stammuser
Warn.wav

Hallo weatherman,
zwei Sachen.

1. Das Skript ist unten nochmal so, dass es nur die Schrift innerhalb der h2-Tags parsed. Dann sieht es aktuell so aus:
Code:
2 Warnungen für Euskirchen
Amtliche WARNUNG vor FROST
Amtliche WARNUNG vor GLÄTTE
Wenn sich der Aufbau der Seite ändert, muss aber natürlich auch das Skript geändert werden.

2. Das Problem in der WAV-Datei sind eher die ganzen Umlaute ä,ö,ü. Die werden mit der falschen Kodierung gelesen, wobei dann aus "ä" sowas wie "A ein Viertel" gelesen wird. Auf welchem Betriebssystem läuft das Ganze? Ich habe es jetzt einfach mal auf die Windows-Kodierung umgestellt. Vielleicht hilft das?

Code:
#! /usr/bin/env python
# -*- coding: utf-8 -*-
#MAIN_URL = "https://wettwarn.de/txt/SLF.html"
MAIN_URL = "https://wettwarn.de/txt/EUS.html"
 
OUTPUT = "warn.txt"
ERRORS = "errors.txt" # Fehlerausgabe in errors.txt
TIMEOUT = 60 # hoechstens 60 Sekunden auf die Daten warten
 
################################################## ######
################################################## ######
 
from HTMLParser import HTMLParser
from urllib2 import urlopen
 
import logging
import codecs
 
LOG_FORMAT = "%(asctime)s %(levelname)s: %(filename)s : %(message)s"
DATE_FORMAT = "%d.%m.%Y %H:%M:%S"
logging.basicConfig(filename=ERRORS, format=LOG_FORMAT, datefmt=DATE_FORMAT)
 
class SimpleHTMLParser(HTMLParser):
    def __init__(self):
        HTMLParser.__init__(self)
        self.parse = False
        self.data = []
 
    def handle_entityref(self, name):
        if self.parse and name == 'deg': # HTML-Codierung fuer ° 
            self.data.append(' °') 
 
    def handle_starttag(self, tag, attrs):
        if tag == 'h2':
            self.parse = True
 
    def handle_endtag(self, tag):
        if tag == 'h2':
            self.parse = False
 
    def handle_data(self, data):
        if self.parse:
            self.data.append(data)
 
def main():
    try:
        url = MAIN_URL
        parser = SimpleHTMLParser()
        parser.feed(urlopen(url, timeout = TIMEOUT).read())
        data = "\n".join([line for line in parser.data if line != ' '])
        data = data.replace("\r\n",'')            
        if "Keine Warnungen für" in data:
            data = "Zur Zeit liegen keine akuten Warnungen vor, einen schoenen Tag wuenscht Stefan Corsten."
 
        with codecs.open(OUTPUT, 'w', "cp1252") as output:
                output.write(data.decode('utf-8'))
    except Exception as ex:
        logging.critical(str(ex))
 
main()




Ja das könnte sein, es läuft auf Widows XP noch und bleibt auch so.
Ich werde heute abend wieder testen und nachberichten.
LG Stefan
 

weatherman

Stammuser
Warn.wav und warn.txt

Ja das könnte sein, es läuft auf Widows XP noch und bleibt auch so.
Ich werde heute abend wieder testen und nachberichten.
LG Stefan


Ich habe es mal ausprobiert, die Textausgabe ist fast ok, es müsste nur nach dem Satz " 1 Warnung für EuskirchenAmtliche Warnung vor Frost hinter Euskirchen ein Trennzeichen eingesetzt sein, da er es sonst zu schnell hintereinander durch liest.
Das Problem hatten wir damals auch bei den Wetterdaten vom Flughafen daher sende ich dir nochmal das script vom Köln Bonner Flughafen dann hörst du und siehst du evtl woran es liegen kann.

[PHP! /usr/bin/env python
# -*- coding: utf-8 -*-
MAIN_URL="http://eichenwetter.homelinux.net/linuxhd/wx.php?icao="
WEBPAGE_ENCODING = "ISO_8859-1"
OUTPUT_ENCODING = "Windows-1252" # "Windows-1252" "utf-8" "cp850"

STATIONS = {
# Stadtname auf der Seite : Name der Ausgabedatei
# ein ',' (Komma), falls weitere Staedte folgen
"eddk": "koelnbonn.txt",
"eddl": "duesseldorf.txt",
"etnn": "noervenich.txt",
"eddf": "frankfurt.txt",
"edfh": "hahn.txt",
"edln": "moenchengladbach.txt"
}
ERRORS = "errors.txt" # Fehlerausgabe in errors.txt
TIMEOUT = 60 # hoechstens 60 Sekunden auf die Daten warten
########################################################
########################################################
from HTMLParser import HTMLParser
from urllib2 import urlopen
import logging
LOG_FORMAT = "%(asctime)s %(levelname)s: %(filename)s : %(message)s"
DATE_FORMAT = "%d.%m.%Y %H:%M:%S"
logging.basicConfig(filename=ERRORS, format=LOG_FORMAT, datefmt=DATE_FORMAT)
class SimpleHTMLParser(HTMLParser):
def __init__(self):
HTMLParser.__init__(self)
self.parse = False
self.parsed = False
self.data = []
def handle_comment(self, comment):
if not self.parsed and "PHP" in comment:
self.parse = True
def handle_entityref(self, name):
if self.parse and name == 'deg': # HTML-Codierung fuer °
self.data.append(unichr(0xB0).encode(WEBPAGE_ENCODING))
elif self.parse and name=='nbsp':
self.data.append(' ')

def handle_starttag(self, tag, attrs):
if not self.parsed and tag == 'p':
self.parse = True
def handle_endtag(self, tag):
if tag == 'p':
self.parse = False
self.parsed = True

def handle_data(self, data):
if self.parse:
self.data.append(data)
def main():
for station, filename in STATIONS.items():
try:
url = MAIN_URL + station
parser = SimpleHTMLParser()
parser.feed(urlopen(url, timeout = TIMEOUT).read())
with open(filename, 'wb') as output:
out_data = "".join(parser.data)
output.write(out_data.decode(WEBPAGE_ENCODING).encode(OUTPUT_ENCODING))
except Exception as ex:
logging.critical(str(ex))
main()
][/PHP]


Die Sprachausgabe vom Flughafen Köln hörst du hier:

http://eichenwetter.homelinux.net/linuxhd/Airport/eddk.wav

Wetterwarnung neu hörst du hier:
http://eichenwetter.homelinux.net/linuxhd/Stau/warnhinz.wav
 
Zuletzt bearbeitet:
Oben