Skip to content

Commit

Permalink
Merge pull request #20 from saniho/integrationofstormglass
Browse files Browse the repository at this point in the history
  • Loading branch information
saniho authored Dec 16, 2022
2 parents b76e4b4 + 878b4dc commit 2510d23
Show file tree
Hide file tree
Showing 16 changed files with 405 additions and 106 deletions.
8 changes: 8 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ un code pour le port, et ces coordonnées GPS
latitude: 46.7711
longitude: -2.05306
scan_interval: 120
stormio_key: kdjsqhdksqhjk
```
Pour information, ce sensor est compatible avec la card
Expand All @@ -20,6 +21,13 @@ vous permetant d'obtenir ainsi ce genre de résultat :
Releases Notes :
v 1.1.0
cette nouvelle car necessite de s'inscrire sur le site de stormio( inscription gratuite )
https://stormglass.io/
v 1.0.1.1
ajout de nouvelles informations, vitesse du vent, temperature de l'eau, de l'air
Expand Down
204 changes: 153 additions & 51 deletions custom_components/apiMareeInfo/apiMareeInfo.py
Original file line number Diff line number Diff line change
Expand Up @@ -39,93 +39,190 @@ def getlisteport(self, nomport):
print(x["id"], x["nom"], x["lat"], x["lon"])
return retour

class MeteoMarine:
def __init__(self, lat, lng):

class ApiMareeInfo:
def __init__(self):
self._donnees = {}
self._nomDuPort = None
self._dateCourante = None
self._lat = None
self._lng = None
self._url = \
"http://webservices.meteoconsult.fr/meteoconsultmarine/androidtab/115/fr/v20/previsionsSpot.php?lat=%s&lon=%s" % (
lat, lng)
""" autre url possible
self._url = \
# "http://webservices.meteoconsult.fr/meteoconsultmarine/android/100/fr/v20/previsionsSpot.php?lat=%s&lon=%s" % (
# lat, lng)
#print(self._url)
"""
pass

def getjson(self, url):
def getdata(self):
response = None
try:
import json
session = requests.Session()
response = session.post(url, timeout=30)
response = session.post(self._url, timeout=30)
response.raise_for_status()
return response.json()
except requests.exceptions.Timeout as error:
response = {"error": "UNKERROR_001"}
return response
except requests.exceptions.HTTPError as error:
return response.json()
pass
class stormIO:
def __init__(self, lat, lng, storm_key):
import requests
self._lat = lat
self._lng = lng
self._storm_key = storm_key

def getdata(self):
import datetime
now = datetime.datetime.now()
nowJ2 = now + datetime.timedelta(days=2)
self._deb = now.strftime("%Y-%m-%d %H:%M:%S+00:00")
self._fin = nowJ2.strftime("%Y-%m-%d %H:%M:%S+00:00")
# self._deb = "2022-12-14 03:40:44+00:00"
# self._fin = "2022-12-20 16:40:44+00:00"
response = requests.get(
'https://api.stormglass.io/v2/tide/extremes/point',
params={
'lat': self._lat,
'lng': self._lng,
'start': self._deb, 'end': self._fin, # Convert to UTC timestam
},
headers={
'Authorization': self._storm_key
}
)
# Do something with response data.
json_data = response.json()
return json_data
class ApiMareeInfo:
def __init__(self):
self._donnees = {}
self._nomDuPort = None
self._dateCourante = None
self._lat = None
self._lng = None
self._message = ""
self._error = False
self._errorMessage = ""
pass

def getjson(self, origine, info={}):
if ( origine == "MeteoMarine"):
mm = MeteoMarine( self._lat, self._lng)
return mm.getdata()
elif ( origine == "stormio"):
mm = stormIO( self._lat, self._lng, info["stormkey"])
return mm.getdata()

def setport(self, lat, lng):
self._lat = lat
self._lng = lng
self._url = \
"http://webservices.meteoconsult.fr/meteoconsultmarine/androidtab/115/fr/v20/previsionsSpot.php?lat=%s&lon=%s" % (
lat, lng)
""" autre url possible
self._url = \
# "http://webservices.meteoconsult.fr/meteoconsultmarine/android/100/fr/v20/previsionsSpot.php?lat=%s&lon=%s" % (
# lat, lng)
#print(self._url)
"""

def getinformationport(self, jsondata=None, outfile=None):
def getinformationport(self, jsondata=None, outfile=None, origine="MeteoMarine", info={}):
if (jsondata is None):
jsondata = self.getjson(self._url)
jsondata = self.getjson(origine, info)

if outfile is not None:
with open(outfile, 'w') as outfilev:
json.dump(jsondata, outfilev)
self._nomDuPort = jsondata["contenu"]["marees"][0]['lieu']
self._dateCourante = jsondata["contenu"]["marees"][0]['datetime']
if ( origine == "MeteoMarine" ):
self._nomDuPort = jsondata["contenu"]["marees"][0]['lieu']
self._dateCourante = jsondata["contenu"]["marees"][0]['datetime']
elif( origine == "stormio"):
if ( "station" in jsondata["meta"]):
self._nomDuPort = jsondata["meta"]["station"]['name']
self._errorMessage = ""
self._error = False
else:
self._nomDuPort = ""
self._errorMessage = jsondata["errors"]["key"]
self._error = True
self._dateCourante = datetime.datetime.now()
else:
raise "Data Origin unknow"
self._httptimerequest = datetime.datetime.now()

a = {}
myMarees = {}
j = 0
for maree in jsondata["contenu"]["marees"][:6]:
i = 0
for ele in maree["etales"]:
dicoPrevis = {}
if ( origine == "MeteoMarine") and ( not self._error):
j = 0
for maree in jsondata["contenu"]["marees"][:6]:
i = 0
for ele in maree["etales"]:
dateComplete = datetime.datetime.fromisoformat(ele["datetime"])
detailMaree = {"coeff": ele.get("coef", ""), "hauteur": ele["hauteur"],
"horaire": dateComplete.strftime("%H:%M"),
"etat": ele["type_etale"], "nieme": i, "jour": j, "date": ele["datetime"],
"dateComplete": dateComplete.replace(tzinfo=None)}
clef = "horaire_%s_%s" % (j, i)
myMarees[clef] = detailMaree
# print(clef, detailMaree)
i += 1
j += 1
self._donnees = myMarees

for ele in jsondata["contenu"]["previs"]["detail"]:
dateComplete = datetime.datetime.fromisoformat(ele["datetime"])
detailMaree = {"coeff": ele.get("coef", ""), "hauteur": ele["hauteur"],
detailPrevis = {"forcevnds": ele.get("forcevnds", ""), "rafvnds": ele.get("rafvnds", ""),
"dirvdegres": ele.get("dirvdegres", ""),
"dateComplete": dateComplete.replace(tzinfo=None),
"nuagecouverture": ele.get("nuagecouverture", ""),
"precipitation": ele.get("precipitation", ""),
"teau": ele.get("teau", ""),
"t": ele.get("t", ""),
"risqueorage": ele.get("risqueorage", ""),
"dirhouledegres": ele.get("dirhouledegres", ""),
"hauteurhoule": ele.get("hauteurhoule", ""),
"periodehoule": ele.get("periodehoule", ""),
"hauteurmerv": ele.get("hauteurmerv", ""),
"periodemerv": ele.get("periodemerv", ""),
"hauteurvague": ele.get("hauteurvague", "")

}
clef = dateComplete
dicoPrevis[clef] = detailPrevis
elif( origine == "stormio") and ( not self._error):
j = 0
dateCompletePrevious = self._dateCourante
for maree in jsondata["data"][:6]:
i = 0
dateComplete = datetime.datetime.fromisoformat(maree["time"])
detailMaree = {"coeff": maree.get("coef", ""), "hauteur": maree.get("height", ""),
"horaire": dateComplete.strftime("%H:%M"),
"etat": ele["type_etale"], "nieme": i, "jour": j, "date": ele["datetime"],
"etat": maree["type"], "nieme": i, "jour": j, "date": maree["time"],
"dateComplete": dateComplete.replace(tzinfo=None)}
clef = "horaire_%s_%s" % (j, i)
myMarees[clef] = detailMaree
# print(clef, detailMaree)
i += 1
j += 1
self._donnees = myMarees
if ( dateComplete != dateCompletePrevious):
j += 1
dateCompletePrevious = dateComplete
self._donnees = myMarees

dicoPrevis = {}
for ele in jsondata["contenu"]["previs"]["detail"]:
dateComplete = datetime.datetime.fromisoformat(ele["datetime"])
detailPrevis = {"forcevnds": ele.get("forcevnds", ""), "rafvnds": ele.get("rafvnds", ""),
"dirvdegres": ele.get("dirvdegres", ""),
"dateComplete": dateComplete.replace(tzinfo=None),
"nuagecouverture": ele.get("nuagecouverture", ""),
"precipitation": ele.get("precipitation", ""),
"teau": ele.get("teau", ""),
"t": ele.get("t", ""),
"risqueorage": ele.get("risqueorage", ""),
"dirhouledegres": ele.get("dirhouledegres", ""),
"hauteurhoule": ele.get("hauteurhoule", ""),
"periodehoule": ele.get("periodehoule", ""),
"hauteurmerv": ele.get("hauteurmerv", ""),
"periodemerv": ele.get("periodemerv", ""),
"hauteurvague": ele.get("hauteurvague", "")

}
clef = dateComplete
dicoPrevis[clef] = detailPrevis
# for ele in jsondata["contenu"]["previs"]["detail"]:
# dateComplete = datetime.datetime.fromisoformat(ele["datetime"])
# detailPrevis = {"forcevnds": ele.get("forcevnds", ""), "rafvnds": ele.get("rafvnds", ""),
# "dirvdegres": ele.get("dirvdegres", ""),
# "dateComplete": dateComplete.replace(tzinfo=None),
# "nuagecouverture": ele.get("nuagecouverture", ""),
# "precipitation": ele.get("precipitation", ""),
# "teau": ele.get("teau", ""),
# "t": ele.get("t", ""),
# "risqueorage": ele.get("risqueorage", ""),
# "dirhouledegres": ele.get("dirhouledegres", ""),
# "hauteurhoule": ele.get("hauteurhoule", ""),
# "periodehoule": ele.get("periodehoule", ""),
# "hauteurmerv": ele.get("hauteurmerv", ""),
# "periodemerv": ele.get("periodemerv", ""),
# "hauteurvague": ele.get("hauteurvague", "")
#
# }
# clef = dateComplete
# dicoPrevis[clef] = detailPrevis
self._donneesPrevis = dicoPrevis

def getnomduport(self):
Expand All @@ -149,6 +246,11 @@ def getinfo(self):
def getprevis(self):
return self._donneesPrevis

def getError(self):
return self._error
def getErrorMessage(self):
return self._errorMessage

def getNextPluie(self):
dateCourante = datetime.datetime.now()
for x in self._donneesPrevis.keys():
Expand Down
2 changes: 1 addition & 1 deletion custom_components/apiMareeInfo/const.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,6 @@
# delai pour l'update http, toutes les 3 heures
CONF_SCAN_INTERVAL_HTTP = datetime.timedelta(seconds=60 * 60 * 3)

__VERSION__ = "1.0.3"
__VERSION__ = "1.1.0"

__name__ = "apiMareeInfo"
17 changes: 10 additions & 7 deletions custom_components/apiMareeInfo/sensor.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@
ATTR_ATTRIBUTION,
CONF_SCAN_INTERVAL,
)

CONF_STORM_KEY = "stormio_key"
from homeassistant.helpers.entity import Entity
from homeassistant.util import Throttle

Expand All @@ -28,27 +28,29 @@
_LOGGER = logging.getLogger(__name__)
DOMAIN = "saniho"
ICON = "mdi:package-variant-closed"
SCAN_INTERVAL = timedelta(seconds=1800)
SCAN_INTERVAL_http = timedelta(seconds=1800)
SCAN_INTERVAL = timedelta(seconds=60*60*3)
SCAN_INTERVAL_http = timedelta(seconds=60*60*3)
CONF_SCAN_INTERVAL_HTTP = SCAN_INTERVAL_http
PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend(
{
vol.Required(CONF_CODE): cv.string,
vol.Required(CONF_LATITUDE): cv.string,
vol.Required(CONF_LONGITUDE): cv.string,
vol.Optional(CONF_STORM_KEY): cv.string,
}
)

from . import apiMareeInfo, sensorApiMaree


class myMareeInfo:
def __init__(self, idDuPort, lat, lng, _update_interval):
def __init__(self, idDuPort, lat, lng, stormkey, _update_interval):
self._lastSynchro = None
self._update_interval = _update_interval
self._idDuPort = idDuPort
self._lat = lat
self._lng = lng
self._stormkey = stormkey
self._myMaree = apiMareeInfo.ApiMareeInfo()
pass

Expand All @@ -59,7 +61,7 @@ def update(self, ):
((self._lastSynchro + self._update_interval) < courant):
_LOGGER.warning("-update possible- on lance")
self._myMaree.setport(self._lat, self._lng)
self._myMaree.getinformationport()
self._myMaree.getinformationport( origine="stormio", info={"stormkey":self._stormkey})
self._lastSynchro = datetime.datetime.now()

def getIdPort(self):
Expand All @@ -81,14 +83,15 @@ def setup_platform(hass, config, add_entities, discovery_info=None):
idDuPort = config.get(CONF_CODE)
lat = config.get(CONF_LATITUDE)
lng = config.get(CONF_LONGITUDE)
stormkey = config.get( CONF_STORM_KEY )
session = []
except:
_LOGGER.exception("Could not run my apiMaree Extension miss argument ?")
return False
myPort = myMareeInfo(idDuPort, lat, lng, update_interval_http)
myPort = myMareeInfo(idDuPort, lat, lng, stormkey, update_interval_http)
myPort.update()
add_entities([infoMareeSensor(session, name, update_interval, myPort)], True)
add_entities([infoMareePluieSensor(session, name, update_interval, myPort)], True)
# add_entities([infoMareePluieSensor(session, name, update_interval, myPort)], True)


class infoMareeSensor(Entity):
Expand Down
Loading

0 comments on commit 2510d23

Please sign in to comment.