evcc-io / evcc

Sonne tanken ☀️🚘
https://evcc.io
MIT License
3.58k stars 661 forks source link

Verhindern dass das Fahrzeug immer wieder aufgeweckt wird solange kein Ladevorgang stattfindet #7098

Closed MarkusGH closed 1 year ago

MarkusGH commented 1 year ago

Darf ich, weil es hier vielleicht gerade passt, noch einen anderen Gedanken anbringen? Oder sagt mir wo sonst.

Wenn der Wagen voll wird, könnte man nicht auch dann die ganzen Aktivitäten einstellen, also soc poll, Leistung, Phasenwechsel? (Ich schätze dass auch dann mein Wagen einschläft, soc mode charging aber ja aktiv bleibt, und der nächste soc poll wieder zum Fehler führt)

Originally posted by @maf-soft in https://github.com/evcc-io/evcc/issues/7032#issuecomment-1483158291

Ich möchte das Anliegen stark unterstützen!

Habe bei meinem Porsche PHEV massive Probleme mit dem 12V System (bis hin zu kaputten 12V Batterien). Eine mögliche Erklärung wäre (neben einem Versagen sämtlicher Sicherheitsmechanismen, die das 12V System vor Tiefentladung schützen), dass das Fahrzeug durch das ständige Pollen (bei mir alle 20 Minuten) nicht einschläft und so die 12V Batterie leert.

VolkerK62 commented 1 year ago

Wenn nicht geladen wird und dein Fahrzeug wird alle 20 Minuten gepollt, dann liegt der Fehler in deiner Konfiguration. Per default wird nur beim Laden gepollt.

MarkusGH commented 1 year ago

Würde mich freuen:

network:
  # schema is the HTTP schema
  # setting to `https` does not enable https, it only changes the way URLs are generated
  schema: http
  # host is the hostname or IP address
  # if the host name contains a `.local` suffix, the name will be announced on MDNS
  # docker: MDNS announcements don't work. host must be set to the docker host's name.
  host: localhost
  # port is the listening port for UI and api
  # evcc will listen on all available interfaces
  port: 7070

interval: 3s # control cycle interval

log: info
levels: 
  porsche: trace 
  lp-1: debug
  lp-2: debug
  openwb: trace

mqtt:
  broker: XXX:1883
  topic: evcc

tariffs:
  currency: EUR # (default EUR)
  grid:
    type: fixed
    price: 0.4063 # [currency]/kWh
  feedin:
    type: fixed
    price: 0.0816 # [currency]/kWh

meters:
- name: grid1
  type: movingaverage
  decay: 1 # 0.5
  meter:
    type: custom
    power:
      source: mqtt
      topic: mbmd/solaredge1-1-1/Power 
      scale: -1  # Die Leistung wird in Watt erwartet. Falls z.b. kW geliefert wird, kann dies hier mit dem Wert 1000 angepasst werden
      timeout: 30s  # Akzeptiere keine Daten die älter als dieser Wert ist
    energy: 
      source: mqtt
      topic: mbmd/solaredge1-1-1/Import 
      timeout: 30s  # Akzeptiere keine Daten die älter als dieser Wert ist
    currents:
      - source: mqtt
        topic: mbmd/solaredge1-1-1/Current/L1 
        timeout: 30s  # Akzeptiere keine Daten die älter als dieser Wert ist
      - source: mqtt
        topic: mbmd/solaredge1-1-1/Current/L2 
        timeout: 30s  # Akzeptiere keine Daten die älter als dieser Wert ist
      - source: mqtt
        topic: mbmd/solaredge1-1-1/Current/L3 
        timeout: 30s  # Akzeptiere keine Daten die älter als dieser Wert ist
- name: pv1
  type: custom
  power:
    source: mqtt
    topic: mbmd/solaredge1-1/Power 
    timeout: 30s  # Akzeptiere keine Daten die älter als dieser Wert ist
  energy: 
    source: mqtt
    topic: mbmd/solaredge1-1/Export 
    timeout: 30s  # Akzeptiere keine Daten die älter als dieser Wert ist
  currents:
    - source: mqtt
      topic: mbmd/solaredge1-1/Current/L1 
      timeout: 30s  # Akzeptiere keine Daten die älter als dieser Wert ist
    - source: mqtt
      topic: mbmd/solaredge1-1/Current/L2 
      timeout: 30s  # Akzeptiere keine Daten die älter als dieser Wert ist
    - source: mqtt
      topic: mbmd/solaredge1-1/Current/L3 
      timeout: 30s  # Akzeptiere keine Daten die älter als dieser Wert ist

chargers:
- name: openwb1
  type: openwb
  phases1p3p: true
  broker: XXX # openWB IP
  id: 1                      # loadpoint ID
- name: openwb2
  type: openwb
  phases1p3p: true
  broker: XXX # openWB IP
  id: 2                      # loadpoint ID

vehicles:
- name: ev1
  type: template
  template: porsche
  title: XXX  # Wird in der Benutzeroberfläche angezeigt
  user: XXX  # Benutzername um auf das Gerät zuzugreifen
  password: XXX  # Passwort des Benutzerkontos
  vin: XXX# Erforderlich, wenn mehrere Fahrzeuge des Herstellers vorhanden sind
  capacity: 17.9  # Akku-Kapazität in kWh
  phases: 2
  minCurrent: 6
  maxCurrent: 16
  cache: 20m

loadpoints:
- title: Carport
  charger: openwb2
  resetOnDisconnect: true
  mode: pv
  soc:
    poll:
      mode: charging
      interval: 60m
    estimate: true
  phases: 0
  mincurrent: 6
  maxcurrent: 32
  enable:
    threshold: -600
    delay: 1m
  disable:
    threshold: 800
    delay: 3m
  guardduration: 5m
- title: Straße
  charger: openwb1
  resetOnDisconnect: true
  mode: pv
  soc:
    poll:
      mode: charging
      interval: 60m
    estimate: true
  phases: 0
  mincurrent: 6
  maxcurrent: 32
  enable:
    threshold: -600
    delay: 1m
  disable:
    threshold: 800
    delay: 3m

site:
  title: H73
  meters:
    grid: grid1
    pvs:
    - pv1
  residualPower: -150 
#  maxCurrent: 63

influx:
  url: http://localhost:8086
  database: evcc

LOG (ab 7:00 war das Auto unterwegs):

cat /var/log/syslog | grep "GET https://api.ppa.porsche.com" Mar 28 00:06:48 : [porsche] TRACE 2023/03/28 00:06:48 GET https://api.ppa.porsche.com/app/connect/v1/vehicles/***?mf=BATTERY_LEVEL&mf=BATTERY_CHARGING_STATE&mf=CLIMATIZER_STATE&mf=E_RANGE&mf=HEATING_STATE&mf=MILEAGE Mar 28 00:26:54 : [porsche] TRACE 2023/03/28 00:26:54 GET https://api.ppa.porsche.com/app/connect/v1/vehicles/***?mf=BATTERY_LEVEL&mf=BATTERY_CHARGING_STATE&mf=CLIMATIZER_STATE&mf=E_RANGE&mf=HEATING_STATE&mf=MILEAGE Mar 28 00:47:02 : [porsche] TRACE 2023/03/28 00:47:02 GET https://api.ppa.porsche.com/app/connect/v1/vehicles/***?mf=BATTERY_LEVEL&mf=BATTERY_CHARGING_STATE&mf=CLIMATIZER_STATE&mf=E_RANGE&mf=HEATING_STATE&mf=MILEAGE Mar 28 01:07:06 : [porsche] TRACE 2023/03/28 01:07:06 GET https://api.ppa.porsche.com/app/connect/v1/vehicles/***?mf=BATTERY_LEVEL&mf=BATTERY_CHARGING_STATE&mf=CLIMATIZER_STATE&mf=E_RANGE&mf=HEATING_STATE&mf=MILEAGE Mar 28 01:27:12 : [porsche] TRACE 2023/03/28 01:27:12 GET https://api.ppa.porsche.com/app/connect/v1/vehicles/***?mf=BATTERY_LEVEL&mf=BATTERY_CHARGING_STATE&mf=CLIMATIZER_STATE&mf=E_RANGE&mf=HEATING_STATE&mf=MILEAGE Mar 28 01:47:18 : [porsche] TRACE 2023/03/28 01:47:18 GET https://api.ppa.porsche.com/app/connect/v1/vehicles/***?mf=BATTERY_LEVEL&mf=BATTERY_CHARGING_STATE&mf=CLIMATIZER_STATE&mf=E_RANGE&mf=HEATING_STATE&mf=MILEAGE Mar 28 02:07:24 : [porsche] TRACE 2023/03/28 02:07:24 GET https://api.ppa.porsche.com/app/connect/v1/vehicles/***?mf=BATTERY_LEVEL&mf=BATTERY_CHARGING_STATE&mf=CLIMATIZER_STATE&mf=E_RANGE&mf=HEATING_STATE&mf=MILEAGE Mar 28 02:27:30 : [porsche] TRACE 2023/03/28 02:27:30 GET https://api.ppa.porsche.com/app/connect/v1/vehicles/***?mf=BATTERY_LEVEL&mf=BATTERY_CHARGING_STATE&mf=CLIMATIZER_STATE&mf=E_RANGE&mf=HEATING_STATE&mf=MILEAGE Mar 28 02:47:38 : [porsche] TRACE 2023/03/28 02:47:38 GET https://api.ppa.porsche.com/app/connect/v1/vehicles/***?mf=BATTERY_LEVEL&mf=BATTERY_CHARGING_STATE&mf=CLIMATIZER_STATE&mf=E_RANGE&mf=HEATING_STATE&mf=MILEAGE Mar 28 03:07:42 : [porsche] TRACE 2023/03/28 03:07:42 GET https://api.ppa.porsche.com/app/connect/v1/vehicles/***?mf=BATTERY_LEVEL&mf=BATTERY_CHARGING_STATE&mf=CLIMATIZER_STATE&mf=E_RANGE&mf=HEATING_STATE&mf=MILEAGE Mar 28 03:27:48 : [porsche] TRACE 2023/03/28 03:27:48 GET https://api.ppa.porsche.com/app/connect/v1/vehicles/***?mf=BATTERY_LEVEL&mf=BATTERY_CHARGING_STATE&mf=CLIMATIZER_STATE&mf=E_RANGE&mf=HEATING_STATE&mf=MILEAGE Mar 28 03:47:54 : [porsche] TRACE 2023/03/28 03:47:54 GET https://api.ppa.porsche.com/app/connect/v1/vehicles/***?mf=BATTERY_LEVEL&mf=BATTERY_CHARGING_STATE&mf=CLIMATIZER_STATE&mf=E_RANGE&mf=HEATING_STATE&mf=MILEAGE Mar 28 04:08:00 : [porsche] TRACE 2023/03/28 04:08:00 GET https://api.ppa.porsche.com/app/connect/v1/vehicles/***?mf=BATTERY_LEVEL&mf=BATTERY_CHARGING_STATE&mf=CLIMATIZER_STATE&mf=E_RANGE&mf=HEATING_STATE&mf=MILEAGE Mar 28 04:28:06 : [porsche] TRACE 2023/03/28 04:28:06 GET https://api.ppa.porsche.com/app/connect/v1/vehicles/***?mf=BATTERY_LEVEL&mf=BATTERY_CHARGING_STATE&mf=CLIMATIZER_STATE&mf=E_RANGE&mf=HEATING_STATE&mf=MILEAGE Mar 28 04:48:14 : [porsche] TRACE 2023/03/28 04:48:14 GET https://api.ppa.porsche.com/app/connect/v1/vehicles/***?mf=BATTERY_LEVEL&mf=BATTERY_CHARGING_STATE&mf=CLIMATIZER_STATE&mf=E_RANGE&mf=HEATING_STATE&mf=MILEAGE Mar 28 05:08:18 : [porsche] TRACE 2023/03/28 05:08:18 GET https://api.ppa.porsche.com/app/connect/v1/vehicles/***?mf=BATTERY_LEVEL&mf=BATTERY_CHARGING_STATE&mf=CLIMATIZER_STATE&mf=E_RANGE&mf=HEATING_STATE&mf=MILEAGE Mar 28 05:28:24 : [porsche] TRACE 2023/03/28 05:28:24 GET https://api.ppa.porsche.com/app/connect/v1/vehicles/***?mf=BATTERY_LEVEL&mf=BATTERY_CHARGING_STATE&mf=CLIMATIZER_STATE&mf=E_RANGE&mf=HEATING_STATE&mf=MILEAGE Mar 28 05:48:30 : [porsche] TRACE 2023/03/28 05:48:30 GET https://api.ppa.porsche.com/app/connect/v1/vehicles/***?mf=BATTERY_LEVEL&mf=BATTERY_CHARGING_STATE&mf=CLIMATIZER_STATE&mf=E_RANGE&mf=HEATING_STATE&mf=MILEAGE Mar 28 06:08:36 : [porsche] TRACE 2023/03/28 06:08:36 GET https://api.ppa.porsche.com/app/connect/v1/vehicles/***?mf=BATTERY_LEVEL&mf=BATTERY_CHARGING_STATE&mf=CLIMATIZER_STATE&mf=E_RANGE&mf=HEATING_STATE&mf=MILEAGE Mar 28 06:28:42 : [porsche] TRACE 2023/03/28 06:28:42 GET https://api.ppa.porsche.com/app/connect/v1/vehicles/***?mf=BATTERY_LEVEL&mf=BATTERY_CHARGING_STATE&mf=CLIMATIZER_STATE&mf=E_RANGE&mf=HEATING_STATE&mf=MILEAGE Mar 28 06:48:50 : [porsche] TRACE 2023/03/28 06:48:50 GET https://api.ppa.porsche.com/app/connect/v1/vehicles/***?mf=BATTERY_LEVEL&mf=BATTERY_CHARGING_STATE&mf=CLIMATIZER_STATE&mf=E_RANGE&mf=HEATING_STATE&mf=MILEAGE

VolkerK62 commented 1 year ago

Nimm doch mal beim Loadpoint dieses ganze soc.poll raus und auch beim vehicle das cache: 20m.

VolkerK62 commented 1 year ago

... und interval: 3s ist auch ziemlich heftig.

MarkusGH commented 1 year ago

Um Diskussionen aus dem Weg zu gehen habe ich das alles auskommentiert und den Dienst neu gestartet.. Jetzt erfolgen die API Abfragen wie zu erwarten war alle 15 Minuten. Und nun?

StefanSchoof commented 1 year ago

Ich denke, die Anfragen werden noch gemacht, damit der Climater Status festgestellt werden kann und die Ladung bei aktiven Climater frei gegeben wird.

MarkusGH commented 1 year ago

Das Problem liegt in climateActive - im PV und MinPV mode wird climateActive permanent gepollt. Und das führt dann zu den Abfragen. 1) Gibt es im Porsche API keine Funktion um abzufragen, ob das Fahrzeug gerade schläft? 2) Warum wird der Climater State nicht über die Kommunikation mit der Ladestation geprüft? Klimatisierungsanforderung wird doch (eigentlich) vom Fahrzeug signalisiert?

premultiply commented 1 year ago

Das wird nicht signalisiert. Status D war die obligatorische Raumbelüftungsanforderung beim Laden von Fahrzeugen mit Bleiakkus zur Vermeidung von hochexplosiven Knallgasansammlungen. Hat mit Vorklimatisierung nichts zu tun und würde zudem eine vorherige Ladefreigabe seitens des Ladepunkte erfordern.

MarkusGH commented 1 year ago

OK - ich ziehe meine Frage 2 zurück. Aber so wie das jetzt implementiert ist verursacht es potenziell massive Probleme - was tun?

premultiply commented 1 year ago

/cc @andig

andig commented 1 year ago

Habe bei meinem Porsche PHEV massive Probleme mit dem 12V System (bis hin zu kaputten 12V Batterien). Eine mögliche Erklärung wäre (neben einem Versagen sämtlicher Sicherheitsmechanismen, die das 12V System vor Tiefentladung schützen), dass das Fahrzeug durch das ständige Pollen (bei mir alle 20 Minuten) nicht einschläft und so die 12V Batterie leert.

Das Problem ist im Log ersichtlich: Abfrage der Vorklimatisierung. Ich hatte schonmal vorgeschlagen, die Funktion auszubauen, ist aber auf massiven Widerstand gestossen: https://github.com/evcc-io/evcc/discussions/1365. Weitere Probleme mit fehlerhaften APIs in https://github.com/evcc-io/evcc/issues/7062. Wir können die Diskussion gerne wieder auf machen. Die Funktion macht in Summe mehr Probleme als dass sie hilft.

Alternativ: Configoption um das Feature extra einzuschalten. Das würde ich aber nur ungern machen.

maf-soft commented 1 year ago

Gibt es denn Nutzer, bei denen es funktioniert? Ließe sich das Problem zukünftig beheben, wenn die Prioritäten sich ändern? Ganz rauswerfen würde ich dann schade finden. Wenn es momentan mehr schadet als nützt, ist default=aus doch ok?

pauxus commented 1 year ago

Oder eben die SoC Schwelle (#6588), dann geht beides, und vermutlich ist es auch nicht mehr Aufwand. Wenn SoC über Schwelle, dann braucht die API auch garnicht abzufragen. Ist die Schwelle bei 0 ist die Klimatisierungsregelung damit deaktiviert, bei 100 ist das aktuelle Verhalten. Und dazwischen für diejenigen, die mehr "tunen" wollen (Wenn das Auto bei 80% ist, keine Sonne da ist, ich morgen aber nur geschätzt 40% verbrauche und übermorgen ein "Stromtag" ist, kann ich auch locker aus der Batterie Klimatisieren, also Stelle ich die Klimatisierungsschwelle auf 60%.

premultiply commented 1 year ago

Das funktioniert so eher nicht, da dann z. B. "rückwirkende" Änderungen via Fahrzeug-API und Fehlberechnungen des Estimators auf Grund von whatever nicht mehr berücksichtigt und korrigiert würden.

Ich denke die Kopplung an den Abfragemodus ist ein guter Kompromiss. Wer das auf "charging" stehen hat bekommt keine Abfragen (und Vorklima-Freischaltung) in anderen Zuständen. Wer mehr will muss halt auf "connected" oder "always" stellen und das Intervall ggf. noch indiviuell anpassen.

andig commented 1 year ago

Habt ihr Euch das so wie im PR vorgestellt? Der wesentliche Punkt ist hier: https://github.com/evcc-io/evcc/pull/7151/files#diff-327717b3100908ca99e06df09e2e631ed2925f9a995d5e7ef3dcd0a036af6948R318. Im Kern: Klimaabfrage bei verbundenem Fahrzeug nur wenn poll.mode: connected/always.

Der restliche Diff ist egtl. nur so groß weil ein paar Funktionen ihren Platz geändert haben um den Loadpoint etwas auszudünnen.

MarkusGH commented 1 year ago

Wie geschrieben fände ich es besser eine Einstellung am Fahrzeug hinzuzufügen, aber der PR hilft mir auch.

In Zeile 322 sind m.E. die Klammern falsch:

case (lp.Soc.Poll.Mode == pollConnected || lp.Soc.Poll.Mode == pollAlways) && lp.connected():

Richtig wäre:

case lp.Soc.Poll.Mode == pollAlways || (lp.Soc.Poll.Mode == pollConnected && lp.connected()):

Wobei das schöner wäre:

    case lp.Soc.Poll.Mode == pollConnected && lp.connected():
        return true;
    case lp.Soc.Poll.Mode == pollAlways:
        return true;

Sonst kann man ja gleich ein if statement verwenden :-)

andig commented 1 year ago

In Zeile 322 sind m.E. die Klammern falsch:

Ne, das is so gemeint. Klimaabfrage bei "always" kann ich mir ja sparen wenn kein Auto eingesteckt ist.

Wie geschrieben fände ich es besser eine Einstellung am Fahrzeug hinzuzufügen,

Isso, wäre aber eine größere Änderung. Erstmal nix Schnelles.

MarkusGH commented 1 year ago

Stimmt. Dann passt das natürlich.