Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Refactor to Interfaces and Enums #45

Merged
merged 51 commits into from
Oct 26, 2024
Merged

Conversation

moddroid94
Copy link
Collaborator

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:

  • il Coordinator ora e' un modulo a parte (coordinator.py) come suggerito nelle docs di HA.
  • le funzioni helper sono state spostate in utils.py
  • Created Interface per PunData e PunValues e Fasce
  • Creati Enum per fasce
  • Semplificato Retry timer in caso di errore di connessione
  • aggiunto caso in cui lo ZIP non e' valido ma la connessione e' avvenuta con successo ( da gestire come si vuole, per ora rimanda a domani)
  • aggiunti 'type: ignore' per i falsi positivi, La codebase ora non dovrebbe dare errori o warning nell'IDE

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:

  • il codice segue ora lo style format usato nella codebase di HA
  • ordinati import seguendole specifiche di HA
  • correzioni minori nella forma di alcune funzioni, parametri

Changes description:

  • PunData holds the list of values for every pun band (retrieved from xml)
  • Fascia Enumerates the bands Universally in the code
  • PunValues holds the dict of current values for the sensors, this way they are bonded to the enum definition and we can get type checking errors

Files:

Coordinator:

  • replaced old for loop with dynamic one using the enum value to set and get pun values, simplified the check and setup of F23
  • Removed number of values per pun as a separate dictionary, using len() when needed

Interfaces:

  • New file, created Enum and Interfaces nedeed

Sensor:

  • replace old static creation with a dynamic loop based on Enum Fascia, this way we can add Bands without having to edit all the various reference
  • Replaced definition of self.tipo with self.fascia using

Enum

  • Simplified handle_coordinator_update using enum

Utils:

  • Updated definitions and type return to Enum Fascia
  • Updated return type of exctract_xml to match PunData type
  • simplified append match statement with dynamic match

@virtualdj
Copy link
Owner

Intanto grazie! Rispondo ad un po' di punti.

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.

Mi devi lasciare un po' di tempo per studiare le modifiche prima di approvare tutto in un colpo, perché non sono poche... E devo anche capire se riesco a interpretarle corretamente essendo nuovo di Python.

Semplificato Retry timer in caso di errore di connessione

Questo vorrei lo lasciassi com'era - se non ti scoccia - perché anch'io all'inizio volevo farlo a cicli di "n" minuti senza rompermi più di tanto. Poi però mi sono reso conto che la pagina interrogata spesso si pianta per più tempo.
Quindi quel meccanismo l'avevo studiato per fare in modo che il tempo di attesa fosse breve all'inizio, per problemi ad esempio transitori di connessione e via via più lungo per riuscire a tirare fuori comunque un valore senza aspettare il giorno successivo.

Mi pareva logica la sequenza fatta: 10, 60, 120 e 180 minuti per poi desistere per la giornata.

aggiunto caso in cui lo ZIP non e' valido ma la connessione e' avvenuta con successo ( da gestire come si vuole, per ora rimanda a domani)

Utile. Userei lo stesso meccanismo di cui sopra, quindi ZIP non valido (che può avvenire credo anche se ne scarica mezzo, quindi un errore sostanzialmente di connessione) deve fare il retry come già fa ora (senza però un'eccezione distinta, proprio per quel motivo che mezzo file comunque è un errore per me).

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

Ecco questa cosa volevo farla da tempo e la sto testando in locale (anche se per capire bene se funziona la devo buttare per forza qua). Se mi dai il tempo di implementare quella che ho trovato, vorrei usassimo quella. Aggiorna pure il manifest.json e anziché elencare i commit nelle release mette solo le PR.

E' consigliato utilizzare un branch e fare un PR invece che pushare sul main direttamente

Hai ragione e infatti la GitHub Action che volevo usare "obbliga" a fare questo proprio perché crea la release automaticamente una volta che si fa la PR nella master.
Tieni conto che finora non l'ho fatto perché era un progetto personale, neppure conoscevo le Actions, insomma un qualcosa per me che ho voluto pubblicare ma senza aspettarmi chissà che cosa di riscontro. Non immaginavo fosse così desiderata questa cosa dei prezzi PUN!

il codice segue ora lo style format usato nella codebase di HA ordinati import seguendole specifiche di HA, correzioni minori nella forma di alcune funzioni, parametri

Qui mi dovrai dare una mano, perché non me ne intendo molto.

Dammi solo il tempo di preparare la Action mettendo i tag anche nelle versioni precedenti (vediamo se riesco a fare casino) e magari se puoi sistemare quelle due cosette qui sopra ti ringrazio.

P.S.: Ah, direi poi di usare l'italiano anche per le modifiche e i commenti, visto che questo progetto per sua natura è italiano e non ha senso esportarlo in altre nazioni (che se ne fanno del nostro PUN? 😄).

P.P.S.: Sono riuscito a capire come fare quanto avevo scritto QUI e pare sia possibile!

@virtualdj virtualdj self-assigned this May 16, 2024
@moddroid94
Copy link
Collaborator Author

Ciao, allora, tranquillo per le changes, prenditi il tempo che ti serve e se hai dubbi chiedimi pure, ho fatto la draft apposta!

Questo vorrei lo lasciassi com'era - se non ti scoccia - perché anch'io all'inizio volevo farlo a cicli di "n" minuti senza rompermi più di tanto. Poi però mi sono reso conto che la pagina interrogata spesso si pianta per più tempo.
Quindi quel meccanismo l'avevo studiato per fare in modo che il tempo di attesa fosse breve all'inizio, per problemi ad esempio transitori di connessione e via via più lungo per riuscire a tirare fuori comunque un valore senza aspettare il giorno successivo.

Mi pareva logica la sequenza fatta: 10, 60, 120 e 180 minuti per poi desistere per la giornata.

in teoria posso modificare il timer per farlo combaciare con i vecchi tempi, non sapevo del fatto che il sito desse problemi cosi importanti, magari quello nuovo sara' meglio, comunque nel caso preferissi proprio la vecchia forma lo rispristino no problem.

Utile. Userei lo stesso meccanismo di cui sopra, quindi ZIP non valido (che può avvenire credo anche se ne scarica mezzo, quindi un errore sostanzialmente di connessione) deve fare il retry come già fa ora (senza però un'eccezione distinta, proprio per quel motivo che mezzo file comunque è un errore per me).

Per il fattore ZIP si alla fine non cambia molto, li ho divisi piu' che altro per avere un errore concreto nel momento in cui l'API ritornasse qualche errore di auth o cose simili, in modo da avere un avviso piu' preciso, effettivamente uno zip non valido non e' molto diverso da un errore generico, implemento la change e metto la logica normale anche in questo caso.

Ecco questa cosa volevo farla da tempo e la sto testando in locale (anche se per capire bene se funziona la devo buttare per forza qua). Se mi dai il tempo di implementare quella che ho trovato, vorrei usassimo quella. Aggiorna pure il manifest.json e anziché elencare i commit nelle release mette solo le PR.

per le actions assolutamente, tolgo la mia, se vuoi fare un branch e fare una draft se mi metti come collaboratore magari posso darti una mano :)

ps. ho aggiunto un badge nel readme per pescare l'ultima versione ;)

per il format style usando vscode e ereditando l'env di HA ha gia' linter ecc settati, nel caso ti posso spiegare come impostarlo 👍

Per l'italiano si perdonami ho iniziato in italiano poi mi sono perso, e' l'abitudine, cerco di mantenere l'italiano 😅

Si avevo cercato qualcosa e avevo mezzo provato ad aggiungere la selezione del sensore di energia dalla config ma ho pensato che gia' questo era un cambiamento abbastanza grande, meglio farlo per step 😁

Non immaginavo fosse così desiderata questa cosa dei prezzi PUN!

In realta' e' tanto che uso l'integrazione e come avevo gia' detto mi ero fatto sensori ecc per calcolare le cose e volevo gia' provare a contribuire da un po', ma non avevo molto tempo per mettermi abbastanza da capire bene come funzionasse, adesso che mi sto iniziando a liberare un po' ti aiuto volentieri :)

@virtualdj
Copy link
Owner

Ciao, allora, tranquillo per le changes, prenditi il tempo che ti serve e se hai dubbi chiedimi pure, ho fatto la draft apposta!

Ottimo!

in teoria posso modificare il timer per farlo combaciare con i vecchi tempi, non sapevo del fatto che il sito desse problemi cosi importanti

Facendo i test avevo visto questa cosa, non gli piace ricevere troppe richieste quando non va. Delle volte succede anche nelle ore serali, trovo nel log il fatto che ha mancato il primo download e poi anche il secondo; per questo avere i tempi più "larghi" di solito aiuta ad avere un prezzo aggiornato al giorno.

magari quello nuovo sara' meglio

Lo spero, dopotutto era difficile fare peggio 😄

Per il fattore ZIP si alla fine non cambia molto, li ho divisi piu' che altro per avere un errore concreto nel momento in cui l'API ritornasse qualche errore di auth o cose simili, in modo da avere un avviso piu' preciso

Direi di mantere questa divisione, l'importante è che riprovi a tirare giù tutto poi, con la stessa logica di retry di prima.

per le actions assolutamente, tolgo la mia, se vuoi fare un branch e fare una draft se mi metti come collaboratore magari posso darti una mano :)

Intendi fare una branch e mettere lì i file di configurazione dell'Action di GitHub?

ps. ho aggiunto un badge nel readme per pescare l'ultima versione ;)

👍

per il format style usando vscode e ereditando l'env di HA ha gia' linter ecc settati, nel caso ti posso spiegare come impostarlo 👍

Fai te che per scrivere/testare l'ambiente usavo VSCode dentro una VM Ubuntu messa su velocemente solo per fare quello. Però non sono mai riuscito a sfruttare il linter, forse perché non ho scaricato tutta la build di HA Core, io volevo solo fare l'integrazione e quindi quello che consigliano loro:

python3 -m script.scaffold integration

non mi funzionava perché non avevo appunto tutto il pacchetto. E le modifiche le ho sempre fatte lì perché ho visto che si riesce a saltare di versione più velocemente che con Docker (che invece uso in produzione, sul QNAP).

Per l'italiano si perdonami ho iniziato in italiano poi mi sono perso, e' l'abitudine, cerco di mantenere l'italiano 😅

Anch'io negli altri progetti 😃 (commento sempre in inglese anche nei miei file personali) ma qui visto che possiamo teniamo 🇮🇹 .

Si avevo cercato qualcosa e avevo mezzo provato ad aggiungere la selezione del sensore di energia dalla config ma ho pensato che gia' questo era un cambiamento abbastanza grande, meglio farlo per step 😁

Assolutamente, questo per la versione 2 o 3. Al momento sistemiamo quello che c'è, anche perché a parte il "core" di calcolo la parte noiosa è fare la Config UI, non volevo renderla troppo difficile. Ma vedremo in futuro.

ma non avevo molto tempo per mettermi abbastanza da capire bene come funzionasse, adesso che mi sto iniziando a liberare un po' ti aiuto volentieri :)

Grazie, il tempo è sempre la risorsa più scarsa in assoluto anche perché io ho la tendenza ad aprire molti progetti e a chiuderne nessuno, ecco perché questo è così scarno. Almeno funziona 👍 e come dice il mio capo quello che non c'è non si rompe!
Certo però come ho scritto nel README gli sviluppatori di HA fanno di tutto per rompere quello che funziona e devo ammettere che un po' mi dà fastidio (ma sono sicuro che s'era capito...).

@moddroid94
Copy link
Collaborator Author

per questo avere i tempi più "larghi" di solito aiuta ad avere un prezzo aggiornato al giorno.

Va benissimo allora allungo i tempi come prima no prob.

Direi di mantere questa divisione, l'importante è che riprovi a tirare giù tutto poi, con la stessa logica di retry di prima.

Top, correggo!

Intendi fare una branch e mettere lì i file di configurazione dell'Action di GitHub?

Si volendo si altrimenti in teoria puoi pushare le tue modifiche direttamente in questa draft, dovrei averti dato permesso di modifica, pero' dipende come' a livello di codice, se e' solo l'action puoi caricarla qua almeno mergiamo tutto insieme, l'unica cosa crea prima l'ultimo tag che hai effettivamente settato a mano, cosi' l'action riprende da quella versione, possiamo anche fargli fare una pre-release per questo merge, cosi' testiamo se fa' tutto bene e possiamo farla testare a chi vuole con il canale beta, se tutto va' bene possiamo poi fare la stable che arriva a tutti.

Per i calcoli si la roba dell'UI va' pensata bene perche' sono un sacco di valori e se dobbiamo farlo bene bisogna stare attenti a validazione, possibili edge cases o tutte le possibili entita' che potrebbero gestire i valori di consumo, magari qualcuno ha il consumo totale giornaliero, alcuni solo l'attuale o chissa che altro

Comunque si ultimamente hanno fatto un bel po' di changes, pero' alla fine non posso avercela troppo, stanno facendo un lavoro del cristo e HA e' diventato veramente lo state of the art per quanto riguarda la smart home, il fatto che facciamo parte del consorzio che gestisce Matter e' clamoroso per una no-profit FOSS (considerato che anche Apple ne fa' parte) ahahahah

Fai te che per scrivere/testare l'ambiente usavo VSCode dentro una VM Ubuntu

ti capisco ahahahaha avevo iniziato cosi' la prima volta, e non ci stavo capendo nulla, poi ho realizzato che ci dev'essere un ambiente apposta ( i dev dovranno fare development quindi devono usare un env perforza ahahaha)

Se hai usato docker non dovrebbe essere difficile, con Windows hai necessariamente bisogno del WSL2 installato e attivo, docker configurato per usare il wsl (dovrebbe chiederlo in automatico quando lo installi, o nelle impostazioni puoi attivarlo) e ovviamente git

fai il fork di core, e da
https://developers.home-assistant.io/docs/development_environment#developing-with-visual-studio-code--devcontainer

inserisci il link del tuo fork nel field apposta e fai apri

Ti apre automaticamente VSCode e con Docker crea la folder di hassio core su un container che puoi usare attraverso VSCode Remote, teoricamente da' l'avviso in automatico del fatto che hai creato un remote e ti chiede di connettersi.

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)

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, 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!

Comunque ci mancherebbe, mi sembra il minimo che possa fare per contribuire ad un progetto che comunque uso ed e' molto piu' comodo di 1000 alternative Closed source, non avendo i milioni (neanche le centinaia ngl) da poter donare almeno aiuto in qualche modo 🤣🤣
Poi appunto, avendo maturato un po' di esperienza nella programmazione e vedendo la possibilita' di poter aiutare con un progretto che uso ho colto l'occasione, le nuove feature sono fighe e non sono nemmeno realmente complesse quindi let's go! 😁💪

@moddroid94
Copy link
Collaborator Author

Ah mi sono scordato di scrivere nel PR che abbiamo anche droppato bs4 come dependency, visto che usiamo l'API non dobbiamo piu' fare scraping 👌

@virtualdj
Copy link
Owner

se e' solo l'action puoi caricarla qua almeno mergiamo tutto insieme

Prova a dare un'occhiata, ho creato una branch feat-github-actions qui con le modifiche che vorrei applicare e ti ho impostato come collaboratore (ho fatto giusto?).
Quella action l'ho vista qui e mi piaceva molto.

Poi chiaro che magari qui non è che facciamo chissà quante PR, però alla fine il changelog è meglio scriverlo a mano.

l'unica cosa crea prima l'ultimo tag che hai effettivamente settato a mano, cosi' l'action riprende da quella versione

I tag in realtà li avevo sempre fatti (se controlli ci sono), solo che non facevo le release. Mi piacerebbe - non so se sia possibile - preparare le draft release anche dei tag precedenti, così da averle come storico. Solo che non so come si fa!

possiamo anche fargli fare una pre-release per questo merge, cosi' testiamo se fa' tutto bene e possiamo farla testare a chi vuole con il canale beta, se tutto va' bene possiamo poi fare la stable che arriva a tutti

Questo non ho (ancora) capito come si fa...

pero' alla fine non posso avercela troppo, stanno facendo un lavoro del cristo e HA e' diventato veramente lo state of the art per quanto riguarda la smart home

Vero vero, non intendevo gettare fango... però sarà perché non sono del mestiere io ma la documentazione non è proprio chiarissima. Sembra Google con Android, dove per capirci qualcosa devi guardare il sorgente!

Se hai usato docker non dovrebbe essere difficile, con Windows hai necessariamente bisogno del WSL2 installato e attivo

Ecco, non volevo usare WSL2 in Windows (e uso Docker solo nel QNAP per far girare HA).

@moddroid94
Copy link
Collaborator Author

hmmm, beh in teoria VSCode usa docker, quindi anche se lo hai sul Qnap dovrebbe farti spinnare un container nuovo di development usando Remote via SSH, pero' non ricordo bene come si fa', cerco e magari ti linko qualcosa 👌

ma la documentazione non è proprio chiarissima.

nono, e' proprio atroce per il development ahahah la parte User e' super documentata (piu' o meno) ma quella dev e' tragica.

Questo non ho (ancora) capito come si fa.

in teoria basta segnare la release come pre-release e impostare il tag con beta ed esce nel canale beta.

Si i tag avevo visto ma pensavo fossero indietro rispetto all'attuale sorry 😅

Quella action l'ho vista qui e mi piaceva molto.

precisa, il comando python era la parte che sapevo che si poteva fare ma non avevo ancora capito ahahahah
per i commenti in realta' si ha piu' senso scriverli 👌

Comunque mi hai invitato come collaboratore su tutta la repo, era quello che intendevi fare?
Io dicevo che potevi anche fare un push direttamente in questa PR con i change che almeno non dovevi darmi accesso a tutto.
Per me non e' un problema eh, anzi mi fa' solo piacere, pero' magari volevi mettermi come collaboratore solo al branch (che non credo si possa fare) 😅

@virtualdj
Copy link
Owner

virtualdj commented May 18, 2024

hmmm, beh in teoria VSCode usa docker, quindi anche se lo hai sul Qnap dovrebbe farti spinnare un container nuovo di development usando Remote via SSH, pero' non ricordo bene come si fa', cerco e magari ti linko qualcosa 👌

Mm questo non mi quadra, perché nel QNAP ho solo HA Core, non tutto il sistema di sviluppo con VSCode.
Vista la bassa potenza non vorrei usarlo anche per sviluppare, ma neppure usare WSL2 su Windows quindi cercavo alternative. Tocca tenere la VM, mi sa.

in teoria basta segnare la release come pre-release e impostare il tag con beta ed esce nel canale beta.

Ah, figo! Mai provato finora.

Si i tag avevo visto ma pensavo fossero indietro rispetto all'attuale sorry 😅

Mancavano solo gli ultimi due (che ho aggiunto) dei quali m'ero scordato 🤦‍♂️

Comunque mi hai invitato come collaboratore su tutta la repo, era quello che intendevi fare?

Ecco in realtà no, però non ho capito come aggiungere un collaboratore ad una singola branch... Come dici, mi sa che non si può fare (almeno con la versione gratuita di Github).

Però ho bloccato la master richiedendo una review obbligatoria, non so se questa cosa funzioni, stiamo andando un po' troppo sul difficile per le mie conoscenze / ricerche su Google 😥

Io non vedo permessi, c'è un tutto o niente. Tecnicamente cosa puoi fare, qualsiasi cosa? Suggerimenti?

Io dicevo che potevi anche fare un push direttamente in questa PR con i change che almeno non dovevi darmi accesso a tutto.

Ah, non avevo inteso; avevo provato a mettere in pratica il primo commento dove suggerivi di aggiungerti come collaboratore, solo che appunto non ho trovato il modo di farlo ad una branch, non vedo proprio l'opzione 🤷🏻‍♂️

@moddroid94
Copy link
Collaborator Author

Tocca tenere la VM, mi sa

beh tecnicamente puoi fare tutto sulla VM , non ci pensavo ma per tanto cosi' installi docker sulla VM e fai la stessa roba😅

si scusami non volevo aggiungere complessita', poi github ha i suoi quirk con release ecc,
sisi ho visto che le PR necessitano della review, hai fatto benissimo, io tanto non faro' PR senza prima aver fatto una draft come questa in modo da poterne discutere.

tecnicamente ho i permessi per pushare e fare branch e credo anche chiudere gli issue?
non sono sicuro, per lavoro ho solo pushato o fatto PR nelle repo non mie 😅

comunque in caso ci volessimo sentire un po' meglio, per eventualmente discutere di qualche change ti lascio la mia mail principale, su questa ho meet, google chat, ecc (quella di github e' vecchia non ho linkato i servizi aggiuntivi)
[email protected]

README.md Outdated Show resolved Hide resolved
@virtualdj
Copy link
Owner

tecnicamente ho i permessi per pushare e fare branch e credo anche chiudere gli issue?

Secondo me sì.

non sono sicuro, per lavoro ho solo pushato o fatto PR nelle repo non mie 😅

Figurati se lo so io 😆, ci faremo esperienza!

@moddroid94
Copy link
Collaborator Author

Ok allora, ho tenuto la logica del timer ma ho messo i tempi come prima e incluso il caso dello zip o qualsiasi altro errore nella connesione. piu' qualche roba qua e la'

C'era altro da sistemare? te hai avuto modo di darci un occhiata?
(per i commenti in inglese faccio un commit unica alla fine perche' ho seriamente problemi a switchare tra le due lingue mentre scrivo 😅 me ne rendo conto dopo le commit quando lo rileggo, piuttosto faccio un round in cui sistemo tutto, ci metto di meno 😂)

Per le action ho trovato gia' un edge case in cui bisogna stare attenti, se abbiamo un mismatch tra tag e release l'action fa' lo zip della repo allo stato dell'ultimo tag senza una release, non ne crea uno nuovo.

Se per esempio abbiamo un tag 2.0.1 ma non ce' una release corrispondente, quando mergiamo una PR invece di creare il tag 2.0.2 e fare la release di quello, fa' la release del 2.0.1 e non include i change della PR, pero' li' include nel changelog!

Quindi gia' per fare il merge di questo PR bisogna creare prima una release ufficiale, tipo 0.9.1, cosi' HACS inizia a seguire il versioning, e se facciamo una pre-release non esce se non selezioni beta.

Ma soprattuto l'action quando fa' la draft release e crea il tag, ne crea uno nuovo, invece di farti la release per l'ultimo tag senza release, che sarebbe l'ultimo che hai creato visto che non abbiamo release.

E' un po' convoluto, spero sia chiaro 😂

@virtualdj
Copy link
Owner

virtualdj commented May 20, 2024

C'era altro da sistemare? te hai avuto modo di darci un occhiata?

Non ho ancora avuto tempo nel dettaglio, l'avevo guardato all'inizio prima che facessi la PR.

E' un po' convoluto, spero sia chiaro

Non sono sicurissimo di aver capito, però se invece è così i tag tecnicamente non lo crea il fatto di aver messo la label major/minor/patch? Quindi noi non definiamo nella PR la versione vera, ma diciamo solamente se è una major o minor.
Quindi significa che non dovrebbe capitare quel problema, salvo per i tag già fatti finora... per i quali quindi dovremo creare le release a mano (vabbè lo farò non credo sia una cosa così complessa).

Dopodiché tutte le PR che verranno dopo saranno "automatiche".

Direi di procedere così, se sei d'accordo, in quest'ordine:

  • Fare le release a mano di una versione in sync con il master, creando lo ZIP manualmente
  • Se mi dai l'OK, fare il push della Nuove azioni GitHub #46 così come sta
  • Sistemare Stato "non caricato" dopo aggiornamento #44 e fare una minor release così vediamo se funziona
  • Ripulire tutte le tue commit così che riesca a leggerle più velocemente 😄 (intendo perché ci sono anche revert e cose che mi fanno incasinare la testa di sera 🤣) nella Refactor to Interfaces and Enums #45 e fare un major in beta con quella, così che chi vuole può testarla

@moddroid94
Copy link
Collaborator Author

moddroid94 commented May 20, 2024

Non ho ancora avuto tempo nel dettaglio, l'avevo guardato all'inizio prima che facessi la PR.

Tranqui era giusto per sapere :)

Non sono sicurissimo di aver capito, però se invece è così i tag tecnicamente non lo crea il fatto di aver messo la label major/minor/patch? Quindi noi non definiamo nella PR la versione vera, ma diciamo solamente se è una major o minor.
Quindi significa che non dovrebbe capitare quel problema, salvo per i tag già fatti finora... per i quali quindi dovremo creare le release a mano (vabbè lo farò non credo sia una cosa così complessa)

Piu' o meno, non ho provato tutte le variabili, ma basta sapere che l'ultimo tag deve avere una release associata, altrimenti non sembra crearne uno nuovo (nel mio caso la differenza di tag era la stessa della label, il tag 2.0.1 esisteva gia' ma la release no, esisteva pero' la release e il tag della 2.0.0, ho fatto il merge con la label patch e invece di fare il tag e la release della 2.0.2, ha fatto la release della 2.0.1 e basta)

Per le vecchie release in realta' basta fare solo l'ultima allineata con il master, in modo che dal momento in cui fai il merge delle action inizia a creare update

Modifico la task list nel tuo commento cosi ne abbiamo una sola effettiva

Edit: Il fix per #44 hai gia' un idea? basta fare un try except sull'import e utilizzare il vecchio metodo?

Per la questione delle commit come si fa'? non ho mai fatto uno squash o un prune, tu? 🤣

@virtualdj
Copy link
Owner

Per le vecchie release in realta' basta fare solo l'ultima allineata con il master, in modo che dal momento in cui fai il merge delle action inizia a creare update

Però le volevo creare lo stesso, a mo' di storico delle funzionalità implementate.

Modifico la task list nel tuo commento cosi ne abbiamo una sola effettiva

Vedi che hai i grossi poteri! 🤣

Edit: Il fix per #44 hai gia' un idea? basta fare un try except sull'import e utilizzare il vecchio metodo?

Pensavo una di queste due, però al momento non ho avuto tempo di buttarmi su le due versioni (pre e post) per vedere come si comportano:

  • if SetupPhases is not None:
  • (AwesomeVersion(HA_VERSION) >= AwesomeVersion("2024.4.0"))

Nel caso fosse vero, esegue le istruzioni come sono ora, altrimenti le vecchie (per Holidays immagino si possa semplicemente ignorare visto che in precedenza non dava errori).

Per la questione delle commit come si fa'? non ho mai fatto uno squash o un prune, tu? 🤣

L'avevo fatto solo in locale, praticamente ti esce un editor dove riordini le commit e puoi decidere quali raggruppare (ovviamente tu sai/ti ricordi cosa contiene ciascuna). Immagino che poi sparando su GitHub brucierà le varie commit ma non credo sia un problema. Da provare!

@moddroid94
Copy link
Collaborator Author

ah ok, provo da vscode o da gh desktop allora, thanks 👌

Pensavo una di queste due, però al momento non ho avuto tempo di buttarmi su le due versioni (pre e post) per vedere come si comportano

hmm devo provare a vedere se posso spinnare una vecchia versione con i devcontainer, non sono sicuro.

Vedi che hai i grossi poteri! 🤣

ahahahah si lo stavo copiando e ho visto che me lo faceva riordinare, a sto punto mi son detto lo scrivo li 😅

Però le volevo creare lo stesso, a mo' di storico delle funzionalità implementate.

Volendo si puo' fare uguale, pero' penso che sia meglio fare prima l'ultima release e settarla come latest, in modo che facciamo passare hacs alle release e tag, poi fare le vecchie stando attenti a deflaggare il setta come latest, cosi' evitiamo che magari nel momento in cui si crea per esempio la v0.4 anche chi e' sul main riceve un update che e' effettivamente un downgrade 😂

@virtualdj
Copy link
Owner

hmm devo provare a vedere se posso spinnare una vecchia versione con i devcontainer, non sono sicuro.

Con il metodo che usavo nella VM Ubuntu si può, ed è quello descritto nella documentazione che però non è il devcontainer.

Però le volevo creare lo stesso, a mo' di storico delle funzionalità implementate.

Volendo si puo' fare uguale, pero' penso che sia meglio fare prima l'ultima release e settarla come latest, in modo che facciamo passare hacs alle release e tag

Bene, approvato 👍

poi fare le vecchie stando attenti a deflaggare il setta come latest, cosi' evitiamo che magari nel momento in cui si crea per esempio la v0.4 anche chi e' sul main riceve un update che e' effettivamente un downgrade 😂

Ottimo 👌

@virtualdj
Copy link
Owner

virtualdj commented May 21, 2024

Stasera vedo se riesco intanto a fare il merge della PR #46 e impostare la release, completando le prime due spunte.

@moddroid94
Copy link
Collaborator Author

Le release sono perfette, ho aggiornato ora e da' anche tutta la lista di vecchie versioni, e abbiamo anche il toggle per le versioni beta o per fare il downgrade 🎉
Untitled

ho fatto un paio di tentativi di squash oggi pomeriggio, credo di essere pronto per farlo sul master ora 😂

semplificazione dei blocchi condizionali
spostata logica per trovare la data del prossimo cambio fascia in get_next_date, snellendo la funzione get_fascia
added vscode env to gitignore

add logger for future use

change in return types to match expect type or fn type return

ordering and cleanup of imports
Imports are already pruned for new code, so there are missing import in this file!
@@ -205,12 +204,9 @@ async def update_fascia(self, now=None):
)

_LOGGER.info(
"Nuova fascia corrente: F%s (prossima: F%s)",
"Nuova fascia corrente: F%s (prossima: F%s) \nProssimo cambio fascia: %s",
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Insisto con il non creare una riga aggiuntiva (\n), ma invece:

"Nuova fascia corrente: F%s (prossima: F%s alle %s)",

visto che è solo una data/ora in più e si riferisce già alla fascia.

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ah okok sorry non avevo capito 😅

@virtualdj
Copy link
Owner

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
Copy link
Collaborator Author

moddroid94 commented Jun 15, 2024

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
Copy link
Owner

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
Copy link
Collaborator Author

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
Copy link
Owner

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
Copy link
Collaborator Author

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


# Crea i sensori (legati al coordinator)
# Crea i sensori dei valori del pun(legati al coordinator)
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Spazio prima della parentesi mancante, nel commento.

case Fascia.F23:
self.entity_id = ENTITY_ID_FORMAT.format("pun_fascia_f23")
case _:
self.entity_id = "none"
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

"none" dovrebbe essere in realtà None, come sotto.

return None
if self.fascia:
return f"PUN fascia {self.fascia.value}"
return "None"
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Idem: "None" diventa None (eventualmente modificando la dichiarazione del tipo di funzione con | None?)

@@ -232,35 +233,39 @@ def options(self) -> list[str] | None:
@property
def native_value(self) -> str | None:
"""Restituisce la fascia corrente come stato"""
return decode_fascia(self.coordinator.fascia_corrente)
if not self.coordinator.fascia_corrente:
return "None"
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Idem: "None" in None

@moddroid94
Copy link
Collaborator Author

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
Copy link
Owner

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! 😄

@g1za
Copy link
Contributor

g1za commented Aug 4, 2024

FYI ho trovato questo portale a livello europeo che pare raccogliere i dati relativi energia.
Pare avere anche un sistema di API (anche se i link al manuale contenuti nel menu Help non funzionano - ho provato a mandare un messaggio e vediamo se mi rispondono).
A sensazione però pare interessante.
Qui un esempio dei prezzi zonali, penso che a cercare un po' di trovi anche il PUN.
https://newtransparency.entsoe.eu/market/prices/dayAhead/PT60M?appState=%7B%22sa%22%3A%5B%22BZN%7C10Y1001A1001A73I%22%5D%2C%22st%22%3A%22BZN%22%2C%22mm%22%3Atrue%2C%22ma%22%3Afalse%2C%22sp%22%3A%22HALF%22%2C%22dt%22%3A%22TABLE%22%2C%22df%22%3A%5B%222024-08-04%22%2C%222024-08-04%22%5D%7D

EDIT:
Ho però trovato qualcosa sulle API su quello che parrebbe essere il vecchio sito (oppure il sito attuale, mentre quello sopra è semplicemente quello per una visualizzazione più moderna):
https://transparency.entsoe.eu/content/static_content/Static%20content/web%20api/Guide.html

E questi i dati dall' "altro" sito:
https://transparency.entsoe.eu/transmission-domain/r2/dayAheadPrices/show?name=&defaultValue=false&viewType=TABLE&areaType=BZN&atch=false&dateTime.dateTime=04.08.2024+00:00|CET|DAY&biddingZone.values=CTY|10YIT-GRTN-----B!BZN|10Y1001A1001A73I&resolution.values=PT60M&dateTime.timezone=CET_CEST&dateTime.timezone_input=CET+(UTC+1)+/+CEST+(UTC+2)

Qui pare essere indicato come richiedere accesso alla piattaforma REST:
https://transparency.entsoe.eu/content/static_content/download?path=/Static%20content/API-Token-Management.pdf

@g1za
Copy link
Contributor

g1za commented Aug 5, 2024

Se interessa mi hanno risposto da ENTSO-E con una serie di informazioni per l’ascesso ai dati:


You can export data from Transparency Platform using the following channels:
Website exports in XLSX, CSV & XML formats - link to Transparency Platform website
SFTP in CSV format - please check SFTP guide for more information (can be used for bulk export of multiple areas/borders)
REST API in XML format - please check REST API Guide for more information (can be used bulk export for 1 area/border for a longer period)
Subscriptions in XML format - please check Subscription Guide for more information

In order to use REST API, SFTP, Subscriptions, or export functionality of the GUI you need to be a registered user.
Please check our Introduction guide in case you have questions related to registration in Transparency Platform.

Please note that some of the data is not freely available. Please refer to the Terms & Conditions and the list of data which can be freely re-used.

Could you please confirm if you have other questions?

Kind regards,

@virtualdj
Copy link
Owner

@g1za Ammetto che ieri ho avuto veramente poco tempo, ma io non ho trovato in quel sito il valore del PUN. Sicuro che ci sia?

@g1za
Copy link
Contributor

g1za commented Aug 5, 2024

No, non ho la certezza. Ho dato un’occhiata veloce pure io ma non l’ho trovato. Però ho visto in alcuni report che l’ente ne parla. Mi parrebbe strano visto che ci sono tutti gli altri e da quello che ho capito i dati arrivano da Terna. Posso sempre provare a mandare un messaggio all’assistenza e vedere se mi rispondono.

@g1za
Copy link
Contributor

g1za commented Aug 6, 2024

Sfortunatamente non pubblicano i PUN :(
Peccato davvero

@virtualdj virtualdj merged commit 526a154 into virtualdj:v2.0.0 Oct 26, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
maintenance Applies to changes in actions or dependencies major New major version
Projects
None yet
Development

Successfully merging this pull request may close these issues.

4 participants