diff --git a/meter/lgess.go b/meter/lgess.go index 66161c5bc..e1981c221 100644 --- a/meter/lgess.go +++ b/meter/lgess.go @@ -57,7 +57,7 @@ func NewLgEssFromConfig(other map[string]interface{}) (api.Meter, error) { URI, Usage, Password string Cache time.Duration }{ - Cache: 2 * time.Second, + Cache: time.Second, } if err := util.DecodeOther(other, &cc); err != nil { diff --git a/meter/template_test.go b/meter/template_test.go index 8d1cd48c1..d2bf5781e 100644 --- a/meter/template_test.go +++ b/meter/template_test.go @@ -16,14 +16,15 @@ var acceptable = []string{ "missing password", // Powerwall "connect: no route to host", "connect: connection refused", - "i/o timeout", "connect: network is unreachable", - "no ping response for 192.0.2.2", // SMA - "network is unreachable", + "i/o timeout", + "'sma': missing uri or serial", // SMA + "'fritzdect': missing ain", // FritzDect "[1ESY1161052714 1ESY1161229249 1EMH0008842285 1ESY1161978584 1EMH0004864048 1ESY1161979033 7ELS8135823805]", // Discovergy "can only have either uri or device", // modbus "(Client.Timeout exceeded while awaiting headers)", // http - "cannot create meter 'discovergy': unexpected status: 401", // Discovergy Proxy + "unexpected status: 401", // Discovergy + "unexpected status: 503", // Discovergy "login failed: Put \"https://192.0.2.2/v1/login\": context deadline exceeded", // LG ESS } diff --git a/templates/definition/defaults.yaml b/templates/definition/defaults.yaml index cc63c6e5a..07fbbfbaf 100644 --- a/templates/definition/defaults.yaml +++ b/templates/definition/defaults.yaml @@ -130,8 +130,8 @@ params: de: Zeitüberschreitung en: Timeout help: - de: Akzeptiere keine Daten die älter als dieser Wert ist - en: Don't accept values older than this value in seconds + de: Akzeptiere keine Daten die älter als dieser Wert sind + en: Don't accept values older than this value example: 30s valuetype: duration - name: mode @@ -288,7 +288,7 @@ presets: {{define "vehicle-language"}} language: {{ .language }} {{end}} - + vehiclecloud: params: - name: cloud diff --git a/templates/definition/meter/solaredge-hybrid.yaml b/templates/definition/meter/solaredge-hybrid.yaml index 77b444237..f8a6a4d3b 100644 --- a/templates/definition/meter/solaredge-hybrid.yaml +++ b/templates/definition/meter/solaredge-hybrid.yaml @@ -17,11 +17,10 @@ params: example: 192.0.2.2 - name: port default: 502 - help: + help: en: Port 502 (SetApp) or 1502 (LCD) de: Port 502 (SetApp) oder 1502 (LCD) - name: timeout - default: 3s render: | type: custom power: diff --git a/templates/definition/meter/solaredge-inverter.yaml b/templates/definition/meter/solaredge-inverter.yaml index d25f381d2..41d3873d9 100644 --- a/templates/definition/meter/solaredge-inverter.yaml +++ b/templates/definition/meter/solaredge-inverter.yaml @@ -14,7 +14,6 @@ params: id: 1 port: 1502 - name: timeout - default: 3s render: | type: custom power: diff --git a/templates/docs/charger/tinkerforge-warp-pro_0.yaml b/templates/docs/charger/tinkerforge-warp-pro_0.yaml index 0aac1fe0f..906df4375 100644 --- a/templates/docs/charger/tinkerforge-warp-pro_0.yaml +++ b/templates/docs/charger/tinkerforge-warp-pro_0.yaml @@ -11,4 +11,4 @@ render: host: 192.0.2.2 # Die IP Adresse oder der Hostname des MQTT Brokers port: 1883 # Der Port des MQTT Brokers # Optional topic: warp # Optional - timeout: 30s # Akzeptiere keine Daten die älter als dieser Wert ist # Optional \ No newline at end of file + timeout: 30s # Akzeptiere keine Daten die älter als dieser Wert sind # Optional \ No newline at end of file diff --git a/templates/docs/charger/tinkerforge-warp_0.yaml b/templates/docs/charger/tinkerforge-warp_0.yaml index 908a114ae..392e297d4 100644 --- a/templates/docs/charger/tinkerforge-warp_0.yaml +++ b/templates/docs/charger/tinkerforge-warp_0.yaml @@ -11,4 +11,4 @@ render: host: 192.0.2.2 # Die IP Adresse oder der Hostname des MQTT Brokers port: 1883 # Der Port des MQTT Brokers # Optional topic: warp # Optional - timeout: 30s # Akzeptiere keine Daten die älter als dieser Wert ist # Optional \ No newline at end of file + timeout: 30s # Akzeptiere keine Daten die älter als dieser Wert sind # Optional \ No newline at end of file diff --git a/templates/docs/meter/mqtt-meter_0.yaml b/templates/docs/meter/mqtt-meter_0.yaml index d8e7ed1d0..ada90c38c 100644 --- a/templates/docs/meter/mqtt-meter_0.yaml +++ b/templates/docs/meter/mqtt-meter_0.yaml @@ -17,7 +17,7 @@ render: currentp1: # Optional currentp2: # Optional currentp3: # Optional - timeout: 30s # Akzeptiere keine Daten die älter als dieser Wert ist # Optional + timeout: 30s # Akzeptiere keine Daten die älter als dieser Wert sind # Optional - usage: pv default: | type: template @@ -31,7 +31,7 @@ render: currentp1: # Optional currentp2: # Optional currentp3: # Optional - timeout: 30s # Akzeptiere keine Daten die älter als dieser Wert ist # Optional + timeout: 30s # Akzeptiere keine Daten die älter als dieser Wert sind # Optional - usage: charge default: | type: template @@ -45,7 +45,7 @@ render: currentp1: # Optional currentp2: # Optional currentp3: # Optional - timeout: 30s # Akzeptiere keine Daten die älter als dieser Wert ist # Optional + timeout: 30s # Akzeptiere keine Daten die älter als dieser Wert sind # Optional - usage: battery default: | type: template @@ -59,4 +59,4 @@ render: currentp1: # Optional currentp2: # Optional currentp3: # Optional - timeout: 30s # Akzeptiere keine Daten die älter als dieser Wert ist # Optional \ No newline at end of file + timeout: 30s # Akzeptiere keine Daten die älter als dieser Wert sind # Optional \ No newline at end of file diff --git a/templates/docs/meter/solaredge-hybrid_0.yaml b/templates/docs/meter/solaredge-hybrid_0.yaml index 4a14c3e46..ccded370d 100644 --- a/templates/docs/meter/solaredge-hybrid_0.yaml +++ b/templates/docs/meter/solaredge-hybrid_0.yaml @@ -12,7 +12,7 @@ render: usage: grid host: 192.0.2.2 # IP-Adresse oder Hostname port: 502 # Port 502 (SetApp) oder 1502 (LCD) # Optional - timeout: 3s # Akzeptiere keine Daten die älter als dieser Wert ist # Optional + timeout: 30s # Akzeptiere keine Daten die älter als dieser Wert sind # Optional - usage: pv default: | type: template @@ -20,7 +20,7 @@ render: usage: pv host: 192.0.2.2 # IP-Adresse oder Hostname port: 502 # Port 502 (SetApp) oder 1502 (LCD) # Optional - timeout: 3s # Akzeptiere keine Daten die älter als dieser Wert ist # Optional + timeout: 30s # Akzeptiere keine Daten die älter als dieser Wert sind # Optional - usage: battery default: | type: template @@ -28,4 +28,4 @@ render: usage: battery host: 192.0.2.2 # IP-Adresse oder Hostname port: 502 # Port 502 (SetApp) oder 1502 (LCD) # Optional - timeout: 3s # Akzeptiere keine Daten die älter als dieser Wert ist # Optional \ No newline at end of file + timeout: 30s # Akzeptiere keine Daten die älter als dieser Wert sind # Optional \ No newline at end of file diff --git a/templates/docs/meter/solaredge-inverter_0.yaml b/templates/docs/meter/solaredge-inverter_0.yaml index 4827c39b2..3046e5cce 100644 --- a/templates/docs/meter/solaredge-inverter_0.yaml +++ b/templates/docs/meter/solaredge-inverter_0.yaml @@ -13,7 +13,7 @@ render: # TCPIP uri: 192.0.2.2:1502 # IP-Adresse oder Hostname: Port # Modbus End - timeout: 3s # Akzeptiere keine Daten die älter als dieser Wert ist # Optional + timeout: 30s # Akzeptiere keine Daten die älter als dieser Wert sind # Optional - usage: pv default: | type: template @@ -24,4 +24,4 @@ render: # TCPIP uri: 192.0.2.2:1502 # IP-Adresse oder Hostname: Port # Modbus End - timeout: 3s # Akzeptiere keine Daten die älter als dieser Wert ist # Optional \ No newline at end of file + timeout: 30s # Akzeptiere keine Daten die älter als dieser Wert sind # Optional \ No newline at end of file diff --git a/util/request/helper.go b/util/request/helper.go index 4506de4cb..41f4f112d 100644 --- a/util/request/helper.go +++ b/util/request/helper.go @@ -6,6 +6,7 @@ import ( "time" "github.com/evcc-io/evcc/util" + "github.com/evcc-io/evcc/util/transport" ) // Timeout is the default request timeout used by the Helper @@ -21,7 +22,7 @@ func NewHelper(log *util.Logger) *Helper { r := &Helper{ Client: &http.Client{ Timeout: Timeout, - Transport: NewTripper(log, http.DefaultTransport), + Transport: NewTripper(log, transport.Default()), }, } diff --git a/util/templates/render.go b/util/templates/render.go index 5aa96f599..4fce2cd41 100644 --- a/util/templates/render.go +++ b/util/templates/render.go @@ -4,6 +4,7 @@ import ( "os" "testing" + "github.com/jinzhu/copier" "gopkg.in/yaml.v3" ) @@ -21,9 +22,16 @@ func RenderTest(t *testing.T, tmpl Template, values map[string]interface{}, cb f // instantiate all usage variants for _, u := range tmpl.Usages() { t.Run(u, func(t *testing.T) { - values[ParamUsage] = u + // t.Parallel() - b, _, err := tmpl.RenderResult(TemplateRenderModeInstance, values) + // create a copy of the map for parallel execution + usageValues := make(map[string]interface{}, len(values)+1) + if err := copier.Copy(&usageValues, values); err != nil { + panic(err) + } + usageValues[ParamUsage] = u + + b, _, err := tmpl.RenderResult(TemplateRenderModeInstance, usageValues) if err != nil { t.Errorf("usage: %s, result: %v", u, err) } @@ -35,7 +43,7 @@ func RenderTest(t *testing.T, tmpl Template, values map[string]interface{}, cb f // actually run the instance if not on CI if os.Getenv("CI") == "" { - cb(values) + cb(usageValues) } }) } diff --git a/util/templates/template_types.go b/util/templates/template_types.go index 49a04f42b..4e55d9814 100644 --- a/util/templates/template_types.go +++ b/util/templates/template_types.go @@ -203,8 +203,6 @@ func (p *Param) DefaultValue(renderMode string) interface{} { default: if p.Test != "" { return p.Test - } else if p.Example != "" && renderMode == TemplateRenderModeUnitTest { - return p.Example } else if p.Example != "" && p.Default == "" && renderMode == TemplateRenderModeDocs { return p.Example } else { diff --git a/util/transport/default.go b/util/transport/default.go index 4e9ed1867..e382d0aae 100644 --- a/util/transport/default.go +++ b/util/transport/default.go @@ -2,16 +2,25 @@ package transport import ( "crypto/tls" + "net" "net/http" + "time" ) -// Default returns http.DefaultTransport as http.Transport instead of http.RoundTripper +// Default returns an http.DefaultTransport as http.Transport with reduced dial timeout func Default() *http.Transport { - t, ok := http.DefaultTransport.(*http.Transport) - if !ok { - panic("http.DefaultTransport is not an http.Transport") + return &http.Transport{ + Proxy: http.ProxyFromEnvironment, + DialContext: (&net.Dialer{ + Timeout: 5 * time.Second, // reduced from 30s + KeepAlive: 30 * time.Second, + }).DialContext, + ForceAttemptHTTP2: true, + MaxIdleConns: 100, + IdleConnTimeout: 90 * time.Second, + TLSHandshakeTimeout: 10 * time.Second, + ExpectContinueTimeout: 1 * time.Second, } - return t } // InsecureTransport is an http.Transport with TLSClientConfig.InsecureSkipVerify enabled