virtualdj / pun_sensor

Prezzi PUN del mese - Home Assistant Integration
MIT License
79 stars 13 forks source link

Refactor to Interfaces and Enums #45

Open moddroid94 opened 2 months ago

moddroid94 commented 2 months ago

Reasoning:

Vista la discussione riguardante il calcolo del prezzo totale della bolletta, i possibili cambi riguardo i prezzi e l'attuale mancanza di un metodo per impostare un tipo di contratto (il prezzo della fascia corrente e' sempre basato sul multifascia, mentre dovrebbe essere basato sul tipo di contratto (mono/bi/multi) Ho quindi migrato parte del programma a una struttura OOP implementando Interfacce per poter definire le strutture di dati e rendere il check e la modifica delle stesse piu' semplice e intuitivo. questo aiuta anche nell'auto-complete in IDE e aggiunge un livello di typesafety per le funzioni da chiamare.

Una lista dei cambiamenti piu' rilevanti:

RELEASE:

Ho aggiunto una Github Action che Bumpa e crea una versione nelle release per ogni push/PR sul master, purtroppo per ora non sono riuscito a trovare un modo per fargli bumpare anche la versione in manifest.json, quindi abbiamo un mismatch tra le due, ma non comporta reali problemi in quanto HACS prende il numero nelle release di github. Inoltre cosi' facendo e' possibile distribuire versioni beta in pre-release.

E' consigliato utilizzare un branch e fare un PR invece che pushare sul main direttamente, in questo modo e' possibile modificare il tipo di release (major, minor, ecc) dalla PR label, e ci permette di avere pre-release in beta durante il testing

Per maggiori info sull'azione o su i parametri che si possono modificare attraverso il commit message vedere: https://github.com/marketplace/actions/tag-release-on-push-action

Altre modifiche non fuzionali:

Changes description:

Files:

Coordinator:

Interfaces:

Sensor:

Enum

Utils:

virtualdj commented 1 month ago

pero' c'e' anche il fattore che la maggior parte delle integrazioni fanno l'update all'ora di default (la mia anche), quindi nelle stats del sito si vedranno ste 200 o cosa request nell'arco di 2 secondi

Bene allora nuova feature: all'aggiunta in HA (fase di onboarding dell'integrazione) sceglie un'ora random tra l'1 e le 5 per il default. Così se nessuno sceglie saranno diverse.

Oppure variamo i minuti...

moddroid94 commented 1 month ago

pero' c'e' anche il fattore che la maggior parte delle integrazioni fanno l'update all'ora di default (la mia anche), quindi nelle stats del sito si vedranno ste 200 o cosa request nell'arco di 2 secondi

Bene allora nuova feature: all'aggiunta in HA (fase di onboarding dell'integrazione) sceglie un'ora random tra l'1 e le 5 per il default. Così se nessuno sceglie saranno diverse.

Oppure variamo i minuti...

Ahahaha si una delle due, forse la seconda? Non so, bisogna vedere, in settimana ci do un occhiata, ma comunque è abbastanza semplice

g1za commented 1 month ago

inoltre ho trovato un wrapper per il recupero dei dati dal sito, che potrebbe essere molto utile per prendere spunto sull'auth o sul come rendere piu' 'modulare' questa integrazione, e' in python ed e' seguito da un italiano, sadly l'ultimo update e' dell'anno scorso, ovviamente anche questo fa' capo al sito vecchio, pero invece di usare il tuo metodo implementa quelle che sembrano effettivamente delle API e gia' recupera i dati dei prezzi zonali (non c'e scritto ma dal codice si vede) la repo: https://github.com/darcato/mercati-energetici

(Ogni tanto vi leggo per vedere come vanno le cose e se ci sono novità :D ) Se interessa qui si mostra come alcuni di noi scaricano i dati zonali usando il component multiscrape (facendo però riferimento sempre al vecchio sito).

Magari fornisce spunti, magari no; nel caso ignoratemi ;) Ciao e grazie per il lavoro che state facendo!

moddroid94 commented 1 month ago

Bene allora nuova feature: all'aggiunta in HA (fase di onboarding dell'integrazione) sceglie un'ora random tra l'1 e le 5 per il default. Così se nessuno sceglie saranno diverse.

Oppure variamo i minuti...

Ho optato per aggiungere semplicemente un numero random di minuti direttamente dalla configurazione 👌

virtualdj commented 1 month ago

Adesso la pre-release di questa si è trasformata in 0.9.1 (mi pare fosse 0.9.0 prima, no?) perché ho fatto il merge del #50. Fammi sapere se "rompe" la versione che HACS scarica sul tuo Pi.

Teoricamente dovrebbe dirti che c'è una nuova versione (da 0.9.0 pre-release a 0.9.1 pre-release) anche se il codice dentro è lo stesso. Dovresti accorgertene perché non hai le modifiche dell'AwesomeVersion in __init__.py su quella che scaricherà, perlomeno finché non farai un rebase con quelle.

P.S.: La branch si chiama v2.0.0 ma mi sa che non potrà ottenere questa versione visto che non sono riuscito a trovare il modo di portare la 0.8 a 1.0 😢

moddroid94 commented 1 month ago

Adesso la pre-release di questa si è trasformata in 0.9.1 (mi pare fosse 0.9.0 prima, no?) perché ho fatto il merge del #50. Fammi sapere se "rompe" la versione che HACS scarica sul tuo Pi.

Teoricamente dovrebbe dirti che c'è una nuova versione (da 0.9.0 pre-release a 0.9.1 pre-release) anche se il codice dentro è lo stesso. Dovresti accorgertene perché non hai le modifiche dell'AwesomeVersion in __init__.py su quella che scaricherà, perlomeno finché non farai un rebase con quelle.

P.S.: La branch si chiama v2.0.0 ma mi sa che non potrà ottenere questa versione visto che non sono riuscito a trovare il modo di portare la 0.8 a 1.0 😢

Allora, in HACS non mi da nessun update, ma perche' ero gia alla 0.9.1-prerelease, questa PR ancora non ha una release, e l'update che hai pushato te e' sulla 0.9 quindi non me lo conta come update, per provare questa dovremmo prima fare il merge con il branch e poi fare la release da quel branch manualmente, perche' le action fanno il check solo del master quindi se facciamo il merge nel v2.0.0 non crea la release in automatico.

non ho testato la 0.9.0 perche' dovrei fare un downgrade, magari stasera provo a scaricarla, per questa PR direi che a questo punto inserisco i change che hai fatto te sul master e se convieni che e' pronta per il testing possiamo fare il merge :)

virtualdj commented 1 month ago

non ho testato la 0.9.0 perche' dovrei fare un downgrade

Ah non serve, mi bastava solo che non facesse casino con la tua pre-release.

perche' ero gia alla 0.9.1-prerelease

Sicuro? Non era la 0.9.0-prerelease? In questo momento non mi ricordo, per questo volevo controllassi sulla tua istanza.

per questa PR direi che a questo punto inserisco i change che hai fatto te sul master

Sicuramente.

se convieni che e' pronta per il testing possiamo fare il merge

Per questo dammi ancora una settimana, perché ho dovuto fare altro e non ho avuto tempo di esaminarla (ma se funziona... direi che non ci saranno problemi). Più che altro volevo vedere se mi funzionava il lint ma ho avuto parecchie rogne con quei cavolo di devcontainer (ancora non sono riuscito a capire come configurarli correttamente, nonostante i tuoi messaggi qui sopra) e pochissimo tempo a disposizione, tanto che la 0.9.0 l'ho fatta "col vecchio sistema" e senza validazione.

moddroid94 commented 1 month ago

non ho testato la 0.9.0 perche' dovrei fare un downgrade

Ah non serve, mi bastava solo che non facesse casino con la tua pre-release.

perche' ero gia alla 0.9.1-prerelease

Sicuro? Non era la 0.9.0-prerelease? In questo momento non mi ricordo, per questo volevo controllassi sulla tua istanza.

Ah ok perfetto, no no non mi da' problemi, in realta' forse avrebbe avuto senso fare la 0.9.2? cosi' chi era in pre-release tipo me riceve comunque l'update? pero' dipende, perche' se la 0.9.2 comprende i change nella 0.9.1 avrebbe senso, altrimenti no.

Poi vabe appunto sto giro credo sia stato piu' un attimo di confusione che altro 🤣

se convieni che e' pronta per il testing possiamo fare il merge

Per questo dammi ancora una settimana, perché ho dovuto fare altro e non ho avuto tempo di esaminarla (ma se funziona... direi che non ci saranno problemi). Più che altro volevo vedere se mi funzionava il lint ma ho avuto parecchie rogne con quei cavolo di devcontainer (ancora non sono riuscito a capire come configurarli correttamente, nonostante i tuoi messaggi qui sopra) e pochissimo tempo a disposizione, tanto che la 0.9.0 l'ho fatta "col vecchio sistema" e senza validazione.

Sisi va bene tranquillo! Eh si posso immaginare, il mio PC era gia' praticamente configurato perche' uso WSL, Docker, e quant'altro per lo sviluppo di altre cose, quindi magari c'e' un qualche pre-requisito che non ho menzionato perche' lo avevo installato per altro 😅

Ho 7TB tra HDD/NVMe, e circa 550 applicazioni installate, puoi comprendere la complessita' del sistema😂😂

Non so volendo se hai Discord o qualcosa del genere possiamo provare a sentirci magari riesco ad aiutarti in qualche modo 😁

virtualdj commented 1 month ago

Una volta connesso al remote puoi runnare, debuggare e editare un istanza di hassio nel container e accederci normalmente da homeassistant.local, e hai direttamente i task di development integrati su vscode. (run-safe, install deps, lint, format ecc)

Con molta fatica (ma quante dipendenze ci sono?!?!?) sono riuscito a creare il devcontainer di HA dentro VS Code, a sua volta che gira in WSL2 dentro una VM Windows (con Ubuntu ho lasciato perdere, andava sistematicamente in errore).

Una volta che sei nel remote puoi semplicemente creare una nuova cartella nella parent del core e farci un workspace dentro, apri il workspace e cloni la repo di pun, in questo modo erediti tutti i settaggi di VSCode ma con una repo pulita

Mi aiuteresti in questo? Non so se sbaglio, ma io vorrei vedere solo la mia repo nella finestra di VS Code e poi eseguirla dentro il devcontainer di HA (non mi interessa debuggare HA, solo l'integrazione) ma non trovo nessuna istruzione su come farlo: parlano o di home-assistant-core (cioè l'intero HA) o degli add-on (ma questa è un'integrazione, non un add-on).

Ho seguito i passi indicati dal link e ho il devcontainer con il mio fork di home-assistant-core, però poi ho dovuto fare il mount affinché comparisse dentro la sottocartella custom_components/pun_sensor la mia integrazione; in pratica ho aggiunto al file .devcontainer/devcontainer.json questo:

  "mounts": [
    // Custom configuration directory
    "source=${localEnv:USERPROFILE}/github_repos/ha_config,target=${containerWorkspaceFolder}/config,type=bind",
    // Custom component
    "source=${localEnv:USERPROFILE}/github_repos/pun_sensor/custom_components/pun_sensor,target=${containerWorkspaceFolder}/config/custom_components/pun_sensor,type=bind",
  ],

Dopo il rebuild del container, mi appare la sottocartella custom_components/pun_sensor sotto config:

devcontainer HA

e, se premo F1 > Tasks: Run Tasks > Run Home Assistant Core lui lancia l'istanza locale di HA dove si può aggiungere l'integrazione. Quindi tutto OK... ma:

  1. Non c'è maniera di vedere solo la mia repo pun_sensor in VS Code e al contempo lanciarlo dentro al devcontainer per il testing? Perché se clicco sull'icona Source Control vedo le modifiche al mio fork di home-assistant-core, mentre io vorrei vedere la repo dell'integrazione e basta: Source Control
  2. Notare anche che ho dovuto montare solo la sottocartella pun_sensor, quindi non vedo ad esempio il file requirements.txt. Come si installano le librerire di requisiti se non le vede?
  3. Se invece apro un'altra finestra "dedicata" modificando e salvando i file "sotto ai piedi" ovviamente di là funziona (si punta alla stessa cartella). Ma, così facendo, perdo il linting e tutte le comodità che dicevi, cioè queste:

e' comodissimo perche' ruff ha tutti i quick-fix settati e fa il lint onSave quindi non devi nemmeno starci a pensare, e hai l'autocomplete!

Altra finestra di VS Code

  1. Una volta avviato, come si arresta HA? Cliccando qui? Term

Boh, mi pare tutto molto complesso, possibile non ci sia un sistema più veloce? Volevo sfruttare questa cosa per fare l'hotfix, ma farò alla "vecchia" maniera per non perdere altro tempo. Però vorrei esaminare il codice di questa tua PR con il devcontainer, anche per impratichirmi sulle successive modifiche. Già ho poco tempo, se devo perdere ore solo per sistemare il devcontainer che è quello che dovrebbe farmi guadagnare tempo...

EDIT: Non c'è maniera di eseguire il linting "manualmente", tipo lanciando un comando che non necessiti di tutto l'ambaradam di devcontainer?

moddroid94 commented 1 month ago

Una volta connesso al remote puoi runnare, debuggare e editare un istanza di hassio nel container e accederci normalmente da homeassistant.local, e hai direttamente i task di development integrati su vscode. (run-safe, install deps, lint, format ecc)

Con molta fatica (ma quante dipendenze ci sono?!?!?) sono riuscito a creare il devcontainer di HA dentro VS Code, a sua volta che gira in WSL2 dentro una VM Windows (con Ubuntu ho lasciato perdere, andava sistematicamente in errore).

Una volta che sei nel remote puoi semplicemente creare una nuova cartella nella parent del core e farci un workspace dentro, apri il workspace e cloni la repo di pun, in questo modo erediti tutti i settaggi di VSCode ma con una repo pulita

Mi aiuteresti in questo? Non so se sbaglio, ma io vorrei vedere solo la mia repo nella finestra di VS Code e poi eseguirla dentro il devcontainer di HA (non mi interessa debuggare HA, solo l'integrazione) ma non trovo nessuna istruzione su come farlo: parlano o di home-assistant-core (cioè l'intero HA) o degli add-on (ma questa è un'integrazione, non un add-on).

Eh si, quello step non e' descritto da nessuna parte, ho dovuto studiare un po' i devcontainer per farlo andare. Fondamentalmente dal workspace di core, devi fare apri cartella, aprire la folder custom clonare la repo e con la stessa procedure aprira la folder che ha creato con il clone image

image image

questa sarebbe la struttura che ti trova dentro la cartella nel container image

il risultato dovrebbe essere che ti da' il workspace, ma da' anche il devcontainer cosi: (nel titolo in alto hai sia workspace tra parentesi, sia il devcontainer) in questo modo erediti linter ecc ma tieni vedi solo la repo image

virtualdj commented 1 month ago

Fondamentalmente dal workspace di core, devi fare apri cartella, aprire la folder custom

Eh, appunto, ma io non ho quella folder custom che dici tu. Guarda:

Manca "custom"

L'hai creata tu? Come? E tu hai modificato il file devcontainer.json del devcontainer per aggiungere i mount oppure l'hai lasciato "liscio" come scaricato?

moddroid94 commented 1 month ago

Fondamentalmente dal workspace di core, devi fare apri cartella, aprire la folder custom

Eh, appunto, ma io non ho quella folder custom che dici tu. Guarda:

L'hai creata tu? Come? E tu hai modificato il file devcontainer.json del devcontainer per aggiungere i mount oppure l'hai lasciato "liscio" come scaricato?

nono il file del devcontainer non l'ho toccato.

ah ok allora la cartella l'ho creata da vscode sicuramente, se sali di un livello ti da' tutte le cartelle di linux, entra in workspaces e da li aggiungi la cartella affianco a quella core, pensavo ci fosse di default 😅

virtualdj commented 1 month ago

da li aggiungi la cartella affianco a quella core, pensavo ci fosse di default

C'è sicuramente qualche altro passaggio che manca. Da VS Code di certo non posso farla, perché secondo me quella lì è dentor al container... ma ad un altro livello.

Se la creo sotto la root del container, come vedi, non va a finire sotto a /workspaces/:

1

... bensì dentro a /workspaces/home-assistant-core:

2

Oltretutto se la confronto con la tua, il tuo container non si chiama home-assistant-core (cioè come il fork) bensì solo core e questa cartella custom è allo stesso livello. 🤔

image

moddroid94 commented 1 month ago

Oltretutto se la confronto con la tua, il tuo container non si chiama home-assistant-core (cioè come il fork) bensì solo core e questa cartella custom è allo stesso livello.

Sisi infatti dev'essere allo stesso livello di "core", magari mi sono spiegato male io 😅 se apri la cartella workspaces poi puoi creare la cartella custom allo stesso livello di "core", poi apri la cartella custom e cloni la repo, poi apri la cartella della repo e' un po' macchinoso ma poi basta che ti salvi il workspace di vscode e quando lo apri ti apre gia' docker e avvia il container

il nome non so perche' sia diverso, magari l'ho cambiato quando ho clonato la repo 🤔

purtroppo per avviare effettivamente HA devi comunque aprire 2 finestre di VScode, una con il core e una con la repo 🥲

4. Una volta avviato, come si arresta HA? Cliccando qui?

Io di solito lo spengo da homeassistant cosi' controllo che esca senza errori prima di chiudere vscode, pero' in teoria anche chiudendo vscode dovrebbe farlo in automatico

EDIT: per creare la cartella puoi fare tasto destro in un spazio vuoto e fare crea cartella, oppure un mkdir dal terminale image

virtualdj commented 1 month ago

purtroppo per avviare effettivamente HA devi comunque aprire 2 finestre di VScode, una con il core e una con la repo

Sicuramente non sono in grado io, ma la cartella l'ho creata nel container e ho fatto Open Folder come suggerivi partendo dal container principale aperto. Ma una volta fatto questo me lo chiude! E, da chiuso, non si riesce a lanciare HA dai task perché come vedi qui sotto mancano nel container che parte da custom/pun_sensor:

Dev container

Quindi va il lint, ma neppure bene perché mancano le dipendenze.

Di peggio però c'è che se tento di aprire un'altra finestra (File > New Window) e lì caricare il devcontainer principale mi si inchioda tutto e comunque, secondo me, non carica il componente anche se riuscissi a lanciare HA. Questo perché non lo vede... come fa a sapere che esiste (non è nelle sue sottocartelle) se HA lo devi lanciare dal container principale?

Secondo me hai configurato qualcos'altro, perché oh... non riesco a farlo andare in nessun modo.

moddroid94 commented 1 month ago

Di peggio però c'è che se tento di aprire un'altra finestra (File > New Window) e lì caricare il devcontainer principale mi si inchioda tutto e comunque

Eh il metodo e' corretto pero', magari hai dedicato poca RAM all VM? potrebbe anche essere che due layer di virtualizzazione gli diano fastidio, pero' mi sembra improbabile.

Gli import devi installarli te dal terminale con pip install -r requirements.txt mentre sei nel workspace dell'integrazione

non carica il componente anche se riuscissi a lanciare HA. Questo perché non lo vede... come fa a sapere che esiste (non è nelle sue sottocartelle) se HA lo devi lanciare dal container principale?

Infatti per usarlo su HA devi o copiare i file te dentro la cartella custom components che e' dentro il core, oppure installi da HACS come faresti normalmente.

Perche' sono due ambienti divisi quello del core e quello dell'integrazione, non sono connessi, condividono solo gli stessi site-package, eseguibili di python e le impostazioni di VSCode, pero' non si vedono a vicenda, i file che hai nel core sono divisi da quelli dell'integrazione

virtualdj commented 1 month ago

magari hai dedicato poca RAM all VM?

Ho assegnato 16 GB alla VM, speravo fossero sufficienti 😄

Gli import devi installarli te dal terminale con pip install -r requirements.txt mentre sei nel workspace dell'integrazione

Ah OK, ma allora non c'è tutto l'automatismo che speravo...

Infatti per usarlo su HA devi o copiare i file te dentro la cartella custom components che e' dentro il core, oppure installi da HACS come faresti normalmente.

Allora mi son fatto un'idea sbagliata del devcontainer. Io credevo si occupasse lui di tutto, anche perché per fare il debug (es. mettere un punto di interruzione sulla routine del coordinator) se lo copi dentro manualmente non so se riesci a farlo.

Ma a questo punto, se devo installarlo dentro a mano, tanto vale fare il mount della cartella Git dell'integrazione all'interno di /custom_components del devcontainer HA. Alla fine è quello che facevo "manualmente" con la VM Ubuntu e lanciando il comando hass da terminale (così potevo eseguire qualsiasi versione di HA) che poi andava a leggere la cartella dell'integrazione che era quella sincronizzata con git. Su questo sistema mancava però il lint.

Perche' sono due ambienti divisi quello del core e quello dell'integrazione, non sono connessi, condividono solo gli stessi site-package, eseguibili di python e le impostazioni di VSCode, pero' non si vedono a vicenda, i file che hai nel core sono divisi da quelli dell'integrazione

Quindi in sostanza tu lanci sempre il devcontainer principale di HA (quello che ha i task) mentre su quello della "folder" dell'integrazione praticamente usi solo il lint... Rimane il fatto che a me questa cosa non funziona, cioè ad esempio se salvo un file non mi propone in automatico il refactor che dici... Devo studiare di più, insomma... ma che cavolo.

moddroid94 commented 4 weeks ago

Ho assegnato 16 GB alla VM, speravo fossero sufficienti 😄

In effetti 🤣 Io ne ho 32, non ho guardato il consumo di memoria ma mi sembra piu' che sufficiente a 16

Ma a questo punto, se devo installarlo dentro a mano, tanto vale fare il mount della cartella Git dell'integrazione all'interno di /custom_components del devcontainer HA.

eh ma secondo me l'utilita' sta nell'installarlo da HACS invece, cosi' hai modo di testare il processo di installazione come se fosse in prod. Per il debug no non credo che tu possa fare breakpoint e runnare il tutto, essendo caricato da HA dovrebbe essre HA ad avere un plugin per integrare con il debugger di VScode, oppure come facevi te in teoria potresti farlo, pero' devi letteralemente runnare il supervisor di HA da VScode dal terminale credo

Magari ce' un modo di fare una sorta di ibrido su linux, sto resuscitando la mia distro di Arch, appena riesco provero' a trasferire lo sviluppo li' quindi sicuro avro' modo di approfondire un attimo la cosa per bene

Quindi in sostanza tu lanci sempre il devcontainer principale di HA (quello che ha i task) mentre su quello della "folder" dell'integrazione praticamente usi solo il lint... Rimane il fatto che a me questa cosa non funziona, cioè ad esempio se salvo un file non mi propone in automatico il refactor che dici... Devo studiare di più, insomma... ma che cavolo

Si esatto, per la roba del linting, formatting ecc non capisco, eppure a me ha preso tutto in automatico, pero' appunto ho un setup con 13mila cose configurate, magari avevo gia' delle dipendenze che non sono segnate nelle istruzioni, ricordo di averci smanettato un po' ma non ricordo niente di particolare Hai provato a salvare la finestra come workspace di VSCode? magari ti aggiunge i settings del workspace quando lo salvi e la volta dopo carica tutto per bene

moddroid94 commented 4 days ago

Ciao, scusami l'assenza ma ho iniziato un nuovo lavoro e sto avendo un bel po' da' fare 😅

Se riesco per questo weekend cerco di fare tutti gli edit dei commenti 👌

in teoria non c'era rimasto altro giusto? mi sono un po' perso il filo perdonami

ps. ridendo e scherzando tra 3 mesi chiude il vecchio sito comunque 😂

virtualdj commented 4 days ago

Ciao, scusami l'assenza ma ho iniziato un nuovo lavoro e sto avendo un bel po' da' fare 😅

Ciao, nessun problema, ho avuto casini anch'io altrimenti mi sarei dato da fare... In più mi sono impuntato con questa storia dei DevContainer (infatti ho postato anche sulla community di HA se hai visto) perché vorrei proprio trovare una soluzione migliore alla doppia istanza di VS Code. Ma ancora non ho cavato un 🕷 dal buco.

Se riesco per questo weekend cerco di fare tutti gli edit dei commenti 👌 in teoria non c'era rimasto altro giusto? mi sono un po' perso il filo perdonami

Esatto, solo modifiche minori alla fine.

ps. ridendo e scherzando tra 3 mesi chiude il vecchio sito comunque 😂

Fanno sempre presto a cestinare le cose che funzionano! 😄