Skip to content

Commit

Permalink
Pun: fix logging and error handling
Browse files Browse the repository at this point in the history
  • Loading branch information
andig committed Nov 12, 2024
1 parent 6c9ae85 commit 552cdcf
Showing 1 changed file with 20 additions and 32 deletions.
52 changes: 20 additions & 32 deletions tariff/pun.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@ import (
"encoding/xml"
"fmt"
"io"
"net/http"
"net/http/cookiejar"
"net/url"
"slices"
Expand All @@ -16,6 +15,7 @@ import (
"github.com/cenkalti/backoff/v4"
"github.com/evcc-io/evcc/api"
"github.com/evcc-io/evcc/util"
"github.com/evcc-io/evcc/util/request"
"golang.org/x/net/html"
)

Expand Down Expand Up @@ -124,28 +124,21 @@ func (t *Pun) Type() api.TariffType {
}

func (t *Pun) getData(day time.Time) (api.Rates, error) {
// Initial URL
urlString := "https://www.mercatoelettrico.org/It/WebServerDataStore/MGP_Prezzi/" + day.Format("20060102") + "MGPPrezzi.xml"

// Cookie Jar zur Speicherung von Cookies zwischen den Requests
jar, _ := cookiejar.New(nil)
client := &http.Client{
Jar: jar,
}
client := request.NewClient(t.log)
client.Jar, _ = cookiejar.New(nil)

// Erster Request
resp, err := client.Get(urlString)
uri := "https://www.mercatoelettrico.org/It/WebServerDataStore/MGP_Prezzi/" + day.Format("20060102") + "MGPPrezzi.xml"
resp, err := client.Get(uri)
if err != nil {
fmt.Println("Error fetching URL:", err)
return nil, err
}
defer resp.Body.Close()

body, _ := io.ReadAll(resp.Body)
formData, err := parseFormFields(body)
formData, err := parseFormFields(resp.Body)
if err != nil {
fmt.Println("Error parsing form fields:", err)
return nil, err
return nil, fmt.Errorf("form fields: %w", err)
}

redirectURL := resp.Request.URL.String()
Expand All @@ -164,39 +157,34 @@ func (t *Pun) getData(day time.Time) (api.Rates, error) {
defer resp.Body.Close()

// Erneuter Request auf die ursprüngliche URL
resp, err = client.Get(urlString)
resp, err = client.Get(uri)
if err != nil {
fmt.Println("Error fetching URL after form submission:", err)
return nil, err
}
defer resp.Body.Close()

// Verarbeitung der erhaltenen Daten
body, _ = io.ReadAll(resp.Body)
xmlData := []byte(string(body)) // Ersetzen Sie [Ihr XML-Datenstring hier] mit Ihrem XML-String

var dataSet NewDataSet
err = xml.Unmarshal(xmlData, &dataSet)
if err != nil {
fmt.Println("Error unmarshalling XML: ", err)
if err := xml.NewDecoder(resp.Body).Decode(&dataSet); err != nil {
return nil, err
}

data := make(api.Rates, 0, len(dataSet.Prezzi))

for _, p := range dataSet.Prezzi {
date, err := time.Parse("20060102", p.Data)
if err != nil {
fmt.Println("Error parsing date: ", err)
return nil, fmt.Errorf("parse date: %w", err)
}

hour, err := strconv.Atoi(p.Ora)
if err != nil {
fmt.Println("Error parsing hour: ", err)
return nil, fmt.Errorf("parse hour: %w", err)
}

location, err := time.LoadLocation("Europe/Rome")
if err != nil {
fmt.Println("Error loading location: ", err)
return nil, fmt.Errorf("load location: %w", err)
}

start := time.Date(date.Year(), date.Month(), date.Day(), hour-1, 0, 0, 0, location)
Expand All @@ -205,7 +193,7 @@ func (t *Pun) getData(day time.Time) (api.Rates, error) {
priceStr := strings.Replace(p.PUN, ",", ".", -1) // Ersetzen Sie Komma durch Punkt
price, err := strconv.ParseFloat(priceStr, 64)
if err != nil {
fmt.Println("Error parsing price: ", err)
return nil, fmt.Errorf("parse price: %w", err)
}

ar := api.Rate{
Expand All @@ -220,11 +208,11 @@ func (t *Pun) getData(day time.Time) (api.Rates, error) {
return data, nil
}

func parseFormFields(body []byte) (url.Values, error) {
formData := url.Values{}
doc, err := html.Parse(strings.NewReader(string(body)))
func parseFormFields(body io.Reader) (url.Values, error) {
data := url.Values{}
doc, err := html.Parse(body)
if err != nil {
return formData, err
return data, err
}
var f func(*html.Node)
f = func(n *html.Node) {
Expand All @@ -242,13 +230,13 @@ func parseFormFields(body []byte) (url.Values, error) {
}
}
if inputType == "hidden" && inputName != "" {
formData.Set(inputName, inputValue)
data.Set(inputName, inputValue)
}
}
for c := n.FirstChild; c != nil; c = c.NextSibling {
f(c)
}
}
f(doc)
return formData, nil
return data, nil
}

0 comments on commit 552cdcf

Please sign in to comment.