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