Skip to content

Commit

Permalink
Add support for all existing restrictions
Browse files Browse the repository at this point in the history
We download the list of all restrictions from all cities in France.
A test is added to ensure we support all restrictions
  • Loading branch information
sebcaps authored and kamaradclimber committed Aug 26, 2023
1 parent e8348ad commit 543f0fa
Show file tree
Hide file tree
Showing 11 changed files with 1,855 additions and 15 deletions.
25 changes: 25 additions & 0 deletions .github/workflows/test.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
name: Python package

on:
push:
branches:
- master
- main
pull_request:

jobs:
execute-test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Set up Python
uses: actions/setup-python@v4
with:
python-version: '3.x'
- name: Install dependencies
run: |
python -m pip install --upgrade pip
pip install -r requirements_tests.txt
- name: Execute test
run: |
python -m unittest custom_components/vigieau/tests/test_regexp.py
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -8,3 +8,4 @@ custom_components/vigieau/__pycache__/
deps/
home-assistant.log*
home-assistant_v2.db
*.pyc
24 changes: 19 additions & 5 deletions custom_components/vigieau/api.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,9 +25,21 @@ def __init__(
self._timeout = timeout
self._session = session or aiohttp.ClientSession()

async def get_insee_list(self):
"""Get all insee codes"""
session = aiohttp.ClientSession()
resp = await session.get(GEOAPI_GOUV_URL)

if resp.status != 200:
raise InseeApiError(
f"Unable to list all INSEE codes. API status was {resp.status}"
)

return await resp.json()

async def get_data(self, zipcode) -> dict:
"""Get INSEE code for a given zip code"""
url = f"{GEOAPI_GOUV_URL}codePostal={zipcode}&fields=code,centre&format=json&geometry=centre"
url = f"{GEOAPI_GOUV_URL}&codePostal={zipcode}&format=json&geometry=centre"

resp = await self._session.get(url)
if resp.status != 200:
Expand Down Expand Up @@ -95,15 +107,17 @@ def __init__(
self._session = session or aiohttp.ClientSession()

async def get_data(
self, lat: float, long: float, insee_code: str, profil: str
self, lat: Optional[float], long: Optional[float], insee_code: str, profil: str
) -> dict:
url = f"{VIGIEAU_API_URL}/reglementation?lat={lat}&lon={long}&commune={insee_code}&profil={profil}"
url = f"{VIGIEAU_API_URL}/reglementation?commune={insee_code}&profil={profil}"
if lat is not None and long is not None:
url += f"&lat={lat}&lon={long}"
_LOGGER.debug(f"Requesting restrictions from {url}")
resp = await self._session.get(url)
if (
resp.status == 404
and "message" in resp.json()
and re.match("Aucune zone.+en vigueur", resp.json()["message"])
and "message" in await resp.json()
and re.match("Aucune zone.+en vigueur", (await resp.json())["message"])
):
_LOGGER.debug(f"Vigieau replied with no restriction, faking data")
data = {"usages": [], "niveauAlerte": "vigilance"}
Expand Down
108 changes: 98 additions & 10 deletions custom_components/vigieau/const.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
DOMAIN = "vigieau"

VIGIEAU_API_URL = "https://api.vigieau.beta.gouv.fr"
GEOAPI_GOUV_URL = "https://geo.api.gouv.fr/communes?"
GEOAPI_GOUV_URL = "https://geo.api.gouv.fr/communes?&fields=code,nom,centre"
ADDRESS_API_URL = "https://api-adresse.data.gouv.fr"
CONF_LOCATION_MODE = "location_mode"
HA_COORD = 0
Expand Down Expand Up @@ -47,23 +47,33 @@ class VigieEauSensorEntityDescription(
category="fountains",
key="fountains",
matchers=[
"alimentation des fontaines publiques et privées",
"Alimentation des fontaines", # Alimentation des fontaines/lavoirs sans arrêt technique possible
"alimentation des fontaines.+",
"douches .+ plages.+",
"fontaines",
"jeux d'eau",
],
),
VigieEauSensorEntityDescription(
name="Arrosage des jardins potagers",
icon="mdi:watering-can",
category="potagers",
key="potagers",
matchers=["Arrosage des jardins potagers", "Arrosage des potagers"],
matchers=[
"Arrosage des .*potagers",
"arrosage.+arbres.+",
"arrosage.+plant.+",
],
),
VigieEauSensorEntityDescription(
name="Arrosage voirie et trottoirs",
icon="mdi:road",
category="roads",
key="roads",
matchers=["trottoirs", "voiries"],
matchers=[
"trottoirs",
"voiries|voieries",
"Arrosage de surfaces de .+ générant de la poussière",
],
),
VigieEauSensorEntityDescription(
name="Arrosage des pelouses",
Expand All @@ -76,6 +86,13 @@ class VigieEauSensorEntityDescription(
"massifs fleuris",
"Arrosage des espaces verts",
"Arrosage des jeunes plantations d'arbres",
"surface.+sportives.+",
"arrosage.+massif.+",
"Nettoyage / arrosage des sites de manifestations temporaires sportives et culturelles",
"Dispositifs de récupération des eaux de pluie",
"Arrosage, arbustes et arbres",
"Arrosage des jardinières et suspensions",
"Arrosage des espaces arborés",
],
),
VigieEauSensorEntityDescription(
Expand All @@ -88,21 +105,38 @@ class VigieEauSensorEntityDescription(
"lavage.+professionnels.+portique",
"lavage.+professionnels.+haute pression",
"lavage.+(station|véhicules)",
"lavage.+professionnel.+",
"Nettoyage des véhicules et bateaux",
"Nettoyage des véhicules, des bateaux Y compris par dispositifs mobiles",
],
),
VigieEauSensorEntityDescription(
name="Lavage des engins nautiques",
icon="mdi:sail-boat",
category="nautical_vehicules",
key="nautical_vehicules",
matchers=["lavage.+engins nautiques.+professionnels", "Nettoyage.+embarcation"],
matchers=[
"Activités nautiques : cas général",
"lavage.+engins nautiques.+professionnels",
"Nettoyage.+embarcation",
"lavage.+bateau.+",
"nettoyage.+bateau.+",
"engins nautiques",
"Lavage des embarcations, motorisées ou non, par tout moyen branché sur le réseau public",
"Lavage de véhicule disposant d’un système équipé d’un recyclage de l’eau",
],
),
VigieEauSensorEntityDescription(
name="Lavage des toitures",
name="Lavage des toitures, façades",
icon="mdi:home-roof",
category="roof_clean",
key="roof_clean",
matchers=["toitures"],
matchers=[
"toitures",
"façades",
"nettoyage.+bâtiments.+",
"nettoyage.+terrasse.+",
],
),
VigieEauSensorEntityDescription(
name="Vidange et remplissage des piscines",
Expand All @@ -114,6 +148,10 @@ class VigieEauSensorEntityDescription(
"vidange.+piscines",
"piscines privées", # Piscines privées et bains à remous de plus de 1m3
"piscines non collectives", # Remplissage et vidange de piscines non collectives (de plus de 1 m3)
"baignades.+",
"Remise à niveau des piscines à usage privé",
"Remplissage des jeux d'eau",
"Remplissage des piscine privées",
],
),
VigieEauSensorEntityDescription(
Expand All @@ -125,6 +163,10 @@ class VigieEauSensorEntityDescription(
"remplissage.+plan.* d.eau",
"vidange.+plan.* d.eau",
"Alimentation de plan d'eau", # Alimentation de plan d'eau en dérivation de cours d'eau à usage domestique
"alimentation.+plan.* d.eau",
"alimentation.+bassin.+",
"lestage pour stabilité",
"Alimentation d’étangs",
],
),
VigieEauSensorEntityDescription(
Expand All @@ -137,14 +179,32 @@ class VigieEauSensorEntityDescription(
"travaux.+cours d.eau",
"manoeuvre.+vannes", # Manoeuvre de vannes des seuils et barrages
"Gestion des ouvrages", # FIXME: we should probably match with the category as well
"travaux.+rivière",
"rabattement.+nappe.+",
"faucardage.+",
"Faucardement",
"manoeuvre.+d.ouvrage.+",
"rejet direct d’eaux polluées",
"orpaillage",
"Manœuvres des vannes d.installations hydrauliques",
"Manœuvres d’ouvrages hydrauliques",
"Tout usage domestique non sanitaire de l’eau",
"Réalisation d'un seuil provisoire",
"Rejets directs en cours d’eau",
"Pratiques ou activités dans le lit pouvant avoir un impact sur les milieux aquatiques",
"Perturbations physiques du lit des cours d’eau",
"Entretien de cours d'eau",
],
),
VigieEauSensorEntityDescription(
name="Navigation fluviale",
icon="mdi:ferry",
category="river_movement",
key="river_movement",
matchers=["Navigation fluviale"],
matchers=[
"Navigation fluviale",
"Pratique du canyoning sur matériaux alluvionnaires",
],
),
VigieEauSensorEntityDescription(
name="Arrosage des golfs",
Expand All @@ -158,6 +218,34 @@ class VigieEauSensorEntityDescription(
icon="mdi:water-pump",
category="canals",
key="canals",
matchers=["Prélèvement en canaux", "Prélèvements dans le milieu naturel.+"],
matchers=[
"Prélèvement en canaux",
"Prélèvements dans le milieu naturel.+",
"prélèvements.+cours d.eau.+",
"prélèvement.+hydraulique.+",
"alimentation.+canaux.+",
"Prélèvements domestiques directs dans les milieux hydrauliques, hors usage professionnel identifié",
"Prélèvement d’eau domestique en milieu",
"Prélèvement d’eau domestique dans un canal existant",
"Prélèvements énergétiques",
"Prélèvement.* en cours d'eau",
"Prélèvements destinés au fonctionnement des milieux naturels",
"Prélèvement sur le site des Marais de Sacy",
"Tout nouveau prélèvement",
"Nouvelles demandes de prélèvement d'eau et création de forages",
"Création de prélèvements",
],
),
VigieEauSensorEntityDescription(
name="Restriction spécifique",
category="misc",
key="misc",
matchers=[
"Remplissage tonne de chasse",
"Activités cynégétiques",
"Structures gonflables/tubulaires privées à usage collectif > 1m3 nécessitant 1 vidange quotidienne",
"Abreuvement et hygiène des animaux",
"Abreuvement des animaux",
],
),
)
Empty file.
Loading

0 comments on commit 543f0fa

Please sign in to comment.