kamaradclimber / vigieau

A custom integration for home-assistant on the Vigieau dataset
Apache License 2.0
17 stars 3 forks source link

Automatisation de la vérification des matcher #44

Closed sebcaps closed 3 weeks ago

sebcaps commented 1 year ago

Plus une suggestion d'amélioration qu'un bug, mais la catégorie n'existe pas. L'idée de :

Je peux m'y atteler, mais je logue pour référence et discussion. De mon coté j'aurai besoin de pas mal de temps pour la mise en oeuvre (manque d'XP sur les tests auto en python) et ne pourrai m'y mettre avant milieu de semaine prochaine.

kamaradclimber commented 1 year ago

Bonne idée!

Il n’est pas probablement pas facile de catégoriser automatiquement les restrictions (c’est ce que fait l’intégration à base de regexp).

Cela dit, avoir un petit scrit qui récupère un maximum de réponse de l’api serait déjà très utile pour tester la couverture.

Je propose les étapes suivantes: 1) un script qui récupère automatiquement un maximum de réponse de l’api. Il fonctionne en tirant au hasard des coordonnées GPS, trouve le code insee et appelle l’api. Il fabrique une liste de toutes les restrictions et l’écrit dans un fichier 2) un test unitaire de l’intégration lit ce fichier et vérifie que toutes les restrictions sont matchées dans un sensor 3) un second script est capable de prendre en entrée le même ichier, de le faire passer dans la moulinette de l’intégration et de sortir la table de correspondance: => 4) un test de non regression prend ce fichier et compare à la réalité

Si tu n’as pas bcp d’expérience sur le testing en python, je pense que le premier script est une super étape.

kamaradclimber commented 1 year ago
#!/usr/bin/python

import pycristoforo as pyc
from .api import AddressApi, AddressApiError
import asyncio

async def main():
    for valid_point in await get_sample():
        print(valid_point)

async def get_sample(sample_size=100, country_name="France"):
    country_name = "France"
    sample_size = 100
    country = pyc.get_shape(country_name)
    points = pyc.geoloc_generation(country, sample_size, country_name)

    # returns a list of {"type": "Feature", "geometry": {"type": "Point", "coordinates": [-0.6605139134878257, 47.129260050347554]}, "properties": {"point": 100, "country": "France"}} object

    api = AddressApi()

    sample = []

    for point in points:
        lon, lat = point["geometry"]["coordinates"]
        try:
            res = await api.get_data(lat, lon)
            sample.append(res)
        except AddressApiError:
            # ignore it
            pass
    return sample

if __name__ == "__main__":
    loop = asyncio.get_event_loop()
    loop.run_until_complete(main())

peut-être un bon début pour 1. Le script est mis custom_components/vigieau/__main__.py.

J'ai également poussé un commit (e8348ad) pour faciliter la réutilisation de l'api vigieau

kamaradclimber commented 1 year ago

Pas de pression pour travailler la dessus, je pars en vacances pour quelques semaines sans ordinateur.

sebcaps commented 1 year ago

Salut @kamaradclimber, De mon coté je viens de rentrer et l'esprit reposé m'a permis d'adresser les points 1,2 et 4 (en fait j'avoue ne pas avoir compris le point 3) ;-) Ma proposition dans https://github.com/sebcaps/vigieau/tree/Add-test. Dans le détails:

----------------------------------------------------------------------```


 - une tentative pour ajouter une action auto d'execution des tests dans github, mais ne fonctionne pas correctement.

Tout cela étant dit => je te laisse jeter un oeil et integrer tout ou partie (je soumettrai une PR si tu es OK ;-) )
Bon retour 
kamaradclimber commented 1 year ago

Super merci, je regarde ça en rentrant de vacances

sebcaps commented 1 year ago

@kamaradclimber Salut, Des updates dans la même branche:

Suite à cette modif; le test est OK => toutes les restrictions passent dans un matcher, mais : des doublons à l'intérieur d'une catégorie ainsi qu'entre catégorie.

Au vu du volume, je me suis attelé à outiller pour détecter ces doublons, via le nouveau script : verify_category.py qui contient :

J'ai également ajouté un nouveau test pour executer ces 3 fonctions et assurer la non reg.

Maintenant qu'on est pas mal sur la forme, y'a plus qu'a utiliser tout cela et arriver à une liste convenable de matcher ;-)

kamaradclimber commented 1 year ago

Hello, j'ai regardé rapidement, ca me semble être la bonne direction, n'hésite pas à ouvrir une PR et je soumettrai des changements sur la branche à mon retour de vacances.

Petit tuyau pour augmenter la couverture: l'api geo permet d'obtenir les coordonnées gps d'une commune, par ex avec https://geo.api.gouv.fr/communes?codePostal=78000&format=geojson

kamaradclimber commented 1 year ago

Je suis en train d'intégrer tes changements dans la branche https://github.com/kamaradclimber/vigieau/tree/wip/all_restrictions. En gros:

sebcaps commented 1 year ago

Salut. Je viens de pousser l'état de mon travail en cours. En gros, pas mal sur les scripts de tests/détection. Mais très galère pour arriver à une version des matchers 'satisfaisante' (ie exhaustive & sans doublons). Chaque modif qui corrige un cas, en casse un autre.... Je souhaitais vraiment un truc complet :scripts/tests & mise à jour des matcher, avant de proposer une PR Bon je ne suis pas un expert en regexp non plus, j'apprends en marchant ;-)

Hope it helps

kamaradclimber commented 1 year ago

Une idée que je viens de tester pour faciliter ce travail qui doit être assez pénible: utiliser chatgpt.

Voici un prompt qui semble fonctionner: https://chat.openai.com/share/f4fe07ad-117f-4e2a-b1c5-802bf6d5dbe9

Peux-tu répartir les usages décrits dans le fichier json suivant entre les différentes catégories:
- Prélèvement en canaux
- Abreuvement des animaux
- Arrosage des golfs
- Navigation fluviales
- Travaux sur cours d'eau
- Remplissage/Vidange des plans d'eau
- Vidange et remplissage des piscines
- Lavage des toitures façades
- Lavage des engins nautiques
- Lavage des véhicules
- Arrosage des pelouses
- Arrosage voirie et trottoirs
- Arrosage des jardins potagers
- Alimentation des fontaines
chaque usage doit être réparti dans une seule catégorie.

puis on copie un bout du fichier json. Un essai rapide est assez probant

sebcaps commented 1 year ago

Effectivement ça se tente. Une fois la catégorisation (re)faite on pourra lancer chatGPT sur les regexp!

kamaradclimber commented 1 year ago

J'ai mergé https://github.com/kamaradclimber/vigieau/pull/49 qui reprend une grande partie de tes changements. Ca va permettre de mieux gérer un grand nombre de restrictions (et dans le futur d'aller plus vite pour obtenir toutes les restrictions possibles).

Il reste à intégrer la partie gestion des catégories avec laquelle j'ai un peu plus de mal, pas sûr de trouver le temps pour m'en occuper avant plusieurs semaines.

Merci déjà du travail accompli, c'est vraiment un grand pas en avant.

kamaradclimber commented 3 weeks ago

Après quasiment un an, je pense que la mise à jour (manuelle) graçe au script est suffisante. La mise à jour réalisée aujourd'hui montre que les matchers couvrent quasiment tous les formats de restrictions sans modification (seulement 3 changements mineurs à faire aujourd'hui).

je vais fermer l'issue, merci @sebcaps pour l'idée et la réalisation!