Ottenere terremoti INGV su tema Belchertown
Assicurarsi che Weewx non sia in esecuzione:
sudo systemctl stop weewx
Oppure:
sudo /etc/init.d/weewx stop
Modificare il file /bin/user/belchertown.py; sostituire il seguente blocco:
# ==============================================================================
# Earthquake Data
# ==============================================================================
# Only process if Earthquake data is enabled
if self.generator.skin_dict["Extras"]["earthquake_enabled"] == "1":
earthquake_file = html_root + "/json/earthquake.json"
earthquake_stale_timer = self.generator.skin_dict["Extras"][
"earthquake_stale"
]
latitude = self.generator.config_dict["Station"]["latitude"]
longitude = self.generator.config_dict["Station"]["longitude"]
distance_unit = self.generator.converter.group_unit_dict["group_distance"]
eq_distance_label = self.generator.skin_dict["Units"]["Labels"].get(
distance_unit, ""
)
eq_distance_round = self.generator.skin_dict["Units"]["StringFormats"].get(
distance_unit, "%.1f"
)
earthquake_maxradiuskm = self.generator.skin_dict["Extras"][
"earthquake_maxradiuskm"
]
# Sample URL from Belchertown Weather:
# http://earthquake.usgs.gov/fdsnws/event/1/query?limit=1&lat=42.223&lon=-72.374&maxradiuskm=1000&format=geojson&nodata=204&minmag=2
if self.generator.skin_dict["Extras"]["earthquake_server"] == "USGS":
earthquake_url = (
"http://earthquake.usgs.gov/fdsnws/event/1/query?limit=1&lat=%s&lon=%s&maxradiuskm=%s&format=geojson&nodata=204&minmag=2"
% (latitude, longitude, earthquake_maxradiuskm)
)
elif self.generator.skin_dict["Extras"]["earthquake_server"] == "GeoNet":
earthquake_url = (
"https://api.geonet.org.nz/quake?MMI=%s"
% self.generator.skin_dict["Extras"]["geonet_mmi"]
)
elif self.generator.skin_dict["Extras"]["earthquake_server"] == "ReNaSS":
# Calculate min/max latitude and min/max longitude from radius and station location. https://stackoverflow.com/a/23118314
lat = float(latitude)
long = float(longitude)
radiusInKm = int(earthquake_maxradiuskm)
kmInLongitudeDegree = 111.320 * cos( lat / 180.0 * pi)
deltaLat = radiusInKm / 111.1
deltaLong = radiusInKm / kmInLongitudeDegree
minLat = lat - deltaLat
maxLat = lat + deltaLat
minLong = long - deltaLong
maxLong = long + deltaLong
earthquake_url = (
"https://api.franceseisme.fr/fdsnws/event/1/query?eventtype=earthquake&minmagnitude=2&minlatitude=%.2f&minlongitude=%.2f&maxlatitude=%.2f&maxlongitude=%.2f&format=json&limit=1&orderby=time"
% (minLat, minLong, maxLat, maxLong)
)
earthquake_is_stale = False
# Determine if the file exists and get it's modified time
if os.path.isfile(earthquake_file):
if (int(time.time()) - int(os.path.getmtime(earthquake_file))) > int(
earthquake_stale_timer
):
earthquake_is_stale = True
else:
# File doesn't exist, download a new copy
earthquake_is_stale = True
# File is stale, download a new copy
if earthquake_is_stale:
# Download new earthquake data
try:
if sys.version_info[0] >= 3:
from urllib.request import Request, urlopen
else:
# Python 2
from urllib2 import Request, urlopen
user_agent = "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_4; en-US) AppleWebKit/534.3 (KHTML, like Gecko) Chrome/6.0.472.63 Safari/534.3"
headers = {"User-Agent": user_agent}
req = Request(earthquake_url, None, headers)
response = urlopen(req)
page = response.read()
response.close()
if weewx.debug:
logdbg(
"Downloading earthquake data using urllib2 was successful"
)
except Exception as forecast_error:
if weewx.debug:
logdbg(
"Error downloading earthquake data with urllib2, reverting to curl and subprocess. "
"Full error: %s" % forecast_error
)
# Nested try - only execute if the urllib2 method fails
try:
import subprocess
command = 'curl -L --silent "%s"' % earthquake_url
p = subprocess.Popen(
command,
shell=True,
stdout=subprocess.PIPE,
stderr=subprocess.STDOUT,
)
page = p.communicate()[0]
if weewx.debug:
logdbg(
"Downloading earthquake data with curl was successful."
)
except Exception as error:
raise Warning(
"Error downloading earthquake data using urllib2 and subprocess curl. "
"Your software may need to be updated, or the URL is incorrect. "
"You are trying to use URL: %s, and the error is: %s"
% (earthquake_url, error)
)
# Save earthquake data to file. w+ creates the file if it
# doesn't exist, and truncates the file and re-writes it
# everytime
try:
with open(earthquake_file, "wb+") as file:
try:
# Python 2/3
file.write(page.encode("utf-8"))
except:
# Catch errors caused by ASCII characters in Python2
file.write(page)
if weewx.debug:
logdbg("Earthquake data saved to %s" % earthquake_file)
except IOError as e:
raise Warning(
"Error writing earthquake data to %s. Reason: %s"
% (earthquake_file, e)
)
# Process the earthquake file
with open(earthquake_file, "r") as read_file:
try:
eqdata = json.load(read_file)
except:
eqdata = ""
try:
if self.generator.skin_dict["Extras"]["earthquake_server"] == "USGS":
eqtime = eqdata["features"][0]["properties"]["time"] / 1000
equrl = eqdata["features"][0]["properties"]["url"]
if distance_unit == "km":
eqplace = eqdata["features"][0]["properties"]["place"]
else: # assume miles
try:
eqmatched = match(
"(?P<distance>[0-9]*\.?[0-9]+) km(?P<rest>.*)$",
eqdata["features"][0]["properties"]["place"],
)
eqdist_km = eqmatched.group("distance")
eqdist_miles = round(float(eqdist_km) / 1.609, 1)
eqplace = (
str(eqdist_miles) + " miles" + eqmatched.group("rest")
)
except:
eqplace = eqdata["features"][0]["properties"]["place"]
eqmag = locale.format(
"%g", float(eqdata["features"][0]["properties"]["mag"])
)
elif (
self.generator.skin_dict["Extras"]["earthquake_server"] == "ReNaSS"
):
eqtime = eqdata["features"][0]["properties"]["time"]
# convert time to UNIX format
eqtime = datetime.datetime.strptime(eqtime, "%Y-%m-%dT%H:%M:%S.%fZ")
eqtime = int(
(eqtime - datetime.datetime(1970, 1, 1)).total_seconds()
)
if match("fr_.*", system_locale):
equrl = eqdata["features"][0]["properties"]["url"]["fr"]
eqplace = eqdata["features"][0]["properties"]["description"]["fr"]
else:
equrl = eqdata["features"][0]["properties"]["url"]["en"]
eqplace = eqdata["features"][0]["properties"]["description"]["en"]
eqmag = format(
eqdata["features"][0]["properties"]["mag"], ".1f"
)
elif (
self.generator.skin_dict["Extras"]["earthquake_server"] == "GeoNet"
):
eqtime = eqdata["features"][0]["properties"]["time"]
# convert time to UNIX format
eqtime = datetime.datetime.strptime(eqtime, "%Y-%m-%dT%H:%M:%S.%fZ")
eqtime = int(
(eqtime - datetime.datetime(1970, 1, 1)).total_seconds()
)
equrl = (
"https://www.geonet.org.nz/earthquake/"
+ eqdata["features"][0]["properties"]["publicID"]
)
eqplace = eqdata["features"][0]["properties"]["locality"]
eqmag = locale.format(
"%g",
float(
round(eqdata["features"][0]["properties"]["magnitude"], 1)
),
)
eqlat = str(
round(eqdata["features"][0]["geometry"]["coordinates"][1], 4)
)
eqlon = str(
round(eqdata["features"][0]["geometry"]["coordinates"][0], 4)
)
eqdistance_bearing = self.get_gps_distance(
(float(latitude), float(longitude)),
(float(eqlat), float(eqlon)),
distance_unit,
)
eqdistance = locale.format(
"%g", float(eq_distance_round % eqdistance_bearing[0])
)
eqbearing = eqdistance_bearing[1]
eqbearing_raw = eqdistance_bearing[2]
except:
# No earthquake data
eqtime = label_dict["earthquake_no_data"]
equrl = ""
eqplace = ""
eqmag = ""
eqlat = ""
eqlon = ""
eqdistance = ""
eqbearing = ""
eqbearing_raw = ""
else:
eqtime = ""
equrl = ""
eqplace = ""
eqmag = ""
eqlat = ""
eqlon = ""
eqdistance = ""
eqbearing = ""
eqbearing_raw = ""
eq_distance_label = ""
Con questo:
# ==============================================================================
# Earthquake Data
# ==============================================================================
# Only process if Earthquake data is enabled
if self.generator.skin_dict["Extras"]["earthquake_enabled"] == "1":
earthquake_file = html_root + "/json/earthquake.json"
earthquake_stale_timer = self.generator.skin_dict["Extras"][
"earthquake_stale"
]
latitude = self.generator.config_dict["Station"]["latitude"]
longitude = self.generator.config_dict["Station"]["longitude"]
distance_unit = self.generator.converter.group_unit_dict["group_distance"]
eq_distance_label = self.generator.skin_dict["Units"]["Labels"].get(
distance_unit, ""
)
eq_distance_round = self.generator.skin_dict["Units"]["StringFormats"].get(
distance_unit, "%.1f"
)
earthquake_maxradiuskm = self.generator.skin_dict["Extras"][
"earthquake_maxradiuskm"
]
# Sample URL from Belchertown Weather:
# http://earthquake.usgs.gov/fdsnws/event/1/query?limit=1&lat=42.223&lon=-72.374&maxradiuskm=1000&format=geojson&nodata=204&minmag=2
if self.generator.skin_dict["Extras"]["earthquake_server"] == "USGS":
earthquake_url = (
"http://earthquake.usgs.gov/fdsnws/event/1/query?limit=1&lat=%s&lon=%s&maxradiuskm=%s&format=geojson&nodata=204&minmag=2"
% (latitude, longitude, earthquake_maxradiuskm)
)
elif self.generator.skin_dict["Extras"]["earthquake_server"] == "INGV":
earthquake_url = (
"https://webservices.ingv.it/fdsnws/event/1/query?starttime=2020-01-01&lat=%s&lon=%s&maxradiuskm=%s&minmag=1.5&orderby=time&limit=1&format=geojson"
% (latitude, longitude, earthquake_maxradiuskm)
)
elif self.generator.skin_dict["Extras"]["earthquake_server"] == "GeoNet":
earthquake_url = (
"https://api.geonet.org.nz/quake?MMI=%s"
% self.generator.skin_dict["Extras"]["geonet_mmi"]
)
elif self.generator.skin_dict["Extras"]["earthquake_server"] == "ReNaSS":
# Calculate min/max latitude and min/max longitude from radius and station location. https://stackoverflow.com/a/23118314
lat = float(latitude)
long = float(longitude)
radiusInKm = int(earthquake_maxradiuskm)
kmInLongitudeDegree = 111.320 * cos( lat / 180.0 * pi)
deltaLat = radiusInKm / 111.1
deltaLong = radiusInKm / kmInLongitudeDegree
minLat = lat - deltaLat
maxLat = lat + deltaLat
minLong = long - deltaLong
maxLong = long + deltaLong
earthquake_url = (
"https://api.franceseisme.fr/fdsnws/event/1/query?eventtype=earthquake&minmagnitude=2&minlatitude=%.2f&minlongitude=%.2f&maxlatitude=%.2f&maxlongitude=%.2f&format=json&limit=1&orderby=time"
% (minLat, minLong, maxLat, maxLong)
)
earthquake_is_stale = False
# Determine if the file exists and get it's modified time
if os.path.isfile(earthquake_file):
if (int(time.time()) - int(os.path.getmtime(earthquake_file))) > int(
earthquake_stale_timer
):
earthquake_is_stale = True
else:
# File doesn't exist, download a new copy
earthquake_is_stale = True
# File is stale, download a new copy
if earthquake_is_stale:
# Download new earthquake data
try:
if sys.version_info[0] >= 3:
from urllib.request import Request, urlopen
else:
# Python 2
from urllib2 import Request, urlopen
user_agent = "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_4; en-US) AppleWebKit/534.3 (KHTML, like Gecko) Chrome/6.0.472.63 Safari/534.3"
headers = {"User-Agent": user_agent}
req = Request(earthquake_url, None, headers)
response = urlopen(req)
page = response.read()
response.close()
if weewx.debug:
logdbg(
"Downloading earthquake data using urllib2 was successful"
)
except Exception as forecast_error:
if weewx.debug:
logdbg(
"Error downloading earthquake data with urllib2, reverting to curl and subprocess. "
"Full error: %s" % forecast_error
)
# Nested try - only execute if the urllib2 method fails
try:
import subprocess
command = 'curl -L --silent "%s"' % earthquake_url
p = subprocess.Popen(
command,
shell=True,
stdout=subprocess.PIPE,
stderr=subprocess.STDOUT,
)
page = p.communicate()[0]
if weewx.debug:
logdbg(
"Downloading earthquake data with curl was successful."
)
except Exception as error:
raise Warning(
"Error downloading earthquake data using urllib2 and subprocess curl. "
"Your software may need to be updated, or the URL is incorrect. "
"You are trying to use URL: %s, and the error is: %s"
% (earthquake_url, error)
)
# Save earthquake data to file. w+ creates the file if it
# doesn't exist, and truncates the file and re-writes it
# everytime
try:
with open(earthquake_file, "wb+") as file:
try:
# Python 2/3
file.write(page.encode("utf-8"))
except:
# Catch errors caused by ASCII characters in Python2
file.write(page)
if weewx.debug:
logdbg("Earthquake data saved to %s" % earthquake_file)
except IOError as e:
raise Warning(
"Error writing earthquake data to %s. Reason: %s"
% (earthquake_file, e)
)
# Process the earthquake file
with open(earthquake_file, "r") as read_file:
try:
eqdata = json.load(read_file)
except:
eqdata = ""
try:
if self.generator.skin_dict["Extras"]["earthquake_server"] == "USGS":
eqtime = eqdata["features"][0]["properties"]["time"] / 1000
equrl = eqdata["features"][0]["properties"]["url"]
if distance_unit == "km":
eqplace = eqdata["features"][0]["properties"]["place"]
else: # assume miles
try:
eqmatched = match(
"(?P<distance>[0-9]*\.?[0-9]+) km(?P<rest>.*)$",
eqdata["features"][0]["properties"]["place"],
)
eqdist_km = eqmatched.group("distance")
eqdist_miles = round(float(eqdist_km) / 1.609, 1)
eqplace = (
str(eqdist_miles) + " miles" + eqmatched.group("rest")
)
except:
eqplace = eqdata["features"][0]["properties"]["place"]
eqmag = locale.format(
"%g", float(eqdata["features"][0]["properties"]["mag"])
)
elif (
self.generator.skin_dict["Extras"]["earthquake_server"] == "INGV"
):
eqtime = eqdata["features"][0]["properties"]["time"]
# convert time to UNIX format
eqtime = datetime.datetime.strptime(eqtime, "%Y-%m-%dT%H:%M:%S.%f")
eqtime = int(
(eqtime - datetime.datetime(1970, 1, 1)).total_seconds()
)
equrl = (
"https://terremoti.ingv.it/event/"
+ str(eqdata["features"][0]["properties"]["eventId"])
)
eqplace = eqdata["features"][0]["properties"]["place"]
eqmag = locale.format(
"%g", float(eqdata["features"][0]["properties"]["mag"])
)
elif (
self.generator.skin_dict["Extras"]["earthquake_server"] == "ReNaSS"
):
eqtime = eqdata["features"][0]["properties"]["time"]
# convert time to UNIX format
eqtime = datetime.datetime.strptime(eqtime, "%Y-%m-%dT%H:%M:%S.%fZ")
eqtime = int(
(eqtime - datetime.datetime(1970, 1, 1)).total_seconds()
)
if match("fr_.*", system_locale):
equrl = eqdata["features"][0]["properties"]["url"]["fr"]
eqplace = eqdata["features"][0]["properties"]["description"]["fr"]
else:
equrl = eqdata["features"][0]["properties"]["url"]["en"]
eqplace = eqdata["features"][0]["properties"]["description"]["en"]
eqmag = format(
eqdata["features"][0]["properties"]["mag"], ".1f"
)
elif (
self.generator.skin_dict["Extras"]["earthquake_server"] == "GeoNet"
):
eqtime = eqdata["features"][0]["properties"]["time"]
# convert time to UNIX format
eqtime = datetime.datetime.strptime(eqtime, "%Y-%m-%dT%H:%M:%S.%fZ")
eqtime = int(
(eqtime - datetime.datetime(1970, 1, 1)).total_seconds()
)
equrl = (
"https://www.geonet.org.nz/earthquake/"
+ eqdata["features"][0]["properties"]["publicID"]
)
eqplace = eqdata["features"][0]["properties"]["locality"]
eqmag = locale.format(
"%g",
float(
round(eqdata["features"][0]["properties"]["magnitude"], 1)
),
)
eqlat = str(
round(eqdata["features"][0]["geometry"]["coordinates"][1], 4)
)
eqlon = str(
round(eqdata["features"][0]["geometry"]["coordinates"][0], 4)
)
eqdistance_bearing = self.get_gps_distance(
(float(latitude), float(longitude)),
(float(eqlat), float(eqlon)),
distance_unit,
)
eqdistance = locale.format(
"%g", float(eq_distance_round % eqdistance_bearing[0])
)
eqbearing = eqdistance_bearing[1]
eqbearing_raw = eqdistance_bearing[2]
except:
# No earthquake data
eqtime = label_dict["earthquake_no_data"]
equrl = ""
eqplace = ""
eqmag = ""
eqlat = ""
eqlon = ""
eqdistance = ""
eqbearing = ""
eqbearing_raw = ""
else:
eqtime = ""
equrl = ""
eqplace = ""
eqmag = ""
eqlat = ""
eqlon = ""
eqdistance = ""
eqbearing = ""
eqbearing_raw = ""
eq_distance_label = ""
Per impostazione predefinita, il sistema scaricherà l'ultimo terremoto occorso, in ordine di tempo, con magnitudo maggiore o uguale a 1.5 sulla scala Richter; se si desidera modificare il limite minimo, cambiare questo valore nella query:
&minmag=1.5
con quello desiderato.
È ora possibile impostare il nuovo provider: aprire il file (...)/skins/Belchertown/skin.conf e modificare le seguenti stringhe come indicato:
# Earthquake defaults
earthquake_enabled = 1
earthquake_maxradiuskm = 1000
earthquake_stale = 3600
earthquake_server = INGV
In questo caso il sistema scaricherà ogni ora l'ultimo evento nel raggio di 1000 km dal punto segnato nel file weewx.conf nella sezione relativa all'impostazione della latitudine/longitudine; è sempre possibile modificare i valori earthquake_maxradiuskm e earthquake_stale come desiderato.
• Per visualizzare la magnitudo (dell'ultimo terremoto):
$earthquake_magnitude
• Per visualizzare la data e l'ora (dell'ultimo terremoto):
$current(timestamp=$earthquake_time, max_delta=60).dateTime.format("%d/%m/%Y - %H:%M")
• Per visualizzare la località (dell'ultimo terremoto):
$earthquake_place
• Per visualizzare la distanza (dal punto dell'ultimo terremoto):
$earthquake_distance_away
• Per visualizzare la direzione (dal punto dell'ultimo terremoto):
$earthquake_bearing