Laderegel erstellen für E-Auto

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

Antworten
mike69
Beiträge: 64
Registriert: 17. Nov 2020 22:38
Answers: 0

Laderegel erstellen für E-Auto

Beitrag von mike69 »

Hallo an alle.

Seit Sommer diesen Jahres steht ein BMW I3 auf dem Hof. Dieser soll in Abhängigkeit der Restkapazität morgens um 2 Uhr nachgeladen werden, bis 60% erreicht sind.

Das Binding mybmw: https://www.openhab.org/addons/bindings/mybmw/ ist installiert, konfiguriert und holt sich die Infos von BMW.


things:

Code: Alles auswählen

Bridge mybmw:account:i3   "BMW Account" [userName="user@mail.net",password="xxxx",region="ROW"] {
       Thing bev i3       "BMW i3 120h" [ vin="WxxxPxxxxxxKxxxxx",refreshInterval=5,vehicleBrand="BMW"]
}

hier die dazugehörigen items:

Code: Alles auswählen

Number:Dimensionless	i3BatterySoc		"Battery Charge  [%.0f %%]"	{channel="mybmw:bev:i3:i3:range#soc"}
Number			i3Battery		"Battery Charge in %"		{channel="mybmw:bev:i3:i3:range#soc"}   //  Extra angelegt für den reinen Wert 
String			i3PlugConnection	"Plug [%s]"			{channel="mybmw:bev:i3:i3:status#plug-connection" }
String			i3ChargingStatus	"[%s]"				{channel="mybmw:bev:i3:i3:status#charge" } 

Mit einer kleinen rule wird der I3 abgefragt:

Code: Alles auswählen

rule "Test On"

when
  Time cron " 0 0/1 * 1/1 * ? * "
then
       logInfo( "Wallbox", "Batt Level: {}", i3BatterySoc.state )
       logInfo( "Wallbox", "      Plug: {}", i3PlugConnection.state )
       logInfo( "Wallbox", "    Status: {}", i3ChargingStatus.state )
end
Das Ergebniss im Log:

Code: Alles auswählen

2022-10-11 20:11:00.249 [INFO ] [rg.openhab.core.model.script.Wallbox] - Batt Level: 61 %
2022-10-11 20:11:00.251 [INFO ] [rg.openhab.core.model.script.Wallbox] -       Plug: Connected
2022-10-11 20:11:00.253 [INFO ] [rg.openhab.core.model.script.Wallbox] -     Status: Not Charging
Der I3 hat aktuell 61% Restkapazität, Wallbox ist angeschlossen und keine Ladung am Start.

Das Ziel ist, der I3 soll bei unter 58% in der Zeit von 01:00 - 05:00 Uhr geladen werden, bis 60 % erreicht sind.

Und hier das rule, wo es schon am Anfang klemmt. :(

Code: Alles auswählen

rule " Charging Start"

when

  Time cron " 10 0/1 * 1/1 * ? * "

then

    if   (i3PlugConnection.state != Connected)
      return;

    if (i3Battery.state > 60 )    
      return; 
    
    if (now.getHour > 0 || now.getHour < 6) {
       sendHttpPutRequest( "http://10.0.60.10/cnf?cmd=override_device&dev_id=E1&flags=c&value=1" )       
       logInfo( "Wallbox", "    Status: {}", i3ChargingStatus.state )
   }

end

OH schimpft über die " if (i3PlugConnection.state != Connected)", hier der Log:

Code: Alles auswählen

2022-10-11 20:30:10.233 [ERROR] [internal.handler.ScriptActionHandler] - Script execution of rule with UID 'test-1' failed: The name 'Connected' cannot be resolved to an item or type; line 8, column 31, length 9 in test
Jetzt die Frage, wie erfährt die rule, ob der Stecker steckt oder nicht?
openHAB 4.2.0 auf Debian 12 als VM unter Proxmox

Benutzeravatar
udo1toni
Beiträge: 15248
Registriert: 11. Apr 2018 18:05
Answers: 242
Wohnort: Darmstadt

Re: Laderegel erstellen für E-Auto

Beitrag von udo1toni »

i3PlugConnection ist ja ein String Item. Ein String muss in Anführungszeichen stehen. Ein String ist etwas anderes als ein State. Es gibt in openHAB keinen Status Connected - mal ganz abgesehen davon, dass alle Status in openHAB ausschließlich in Großbuchstaben geschrieben werden, also z.B. ON, OFF, OPEN, CLOSED.
Deine Rule müsste also eher so aussehen:

Code: Alles auswählen

rule " Charging Start"
when
    Time cron "10 * * * * ?"
then
    if(i3PlugConnection.state.toString != "Connected")
        return;

    if(i3Battery.state > 60)
        return; 

    if (now.getHour < 1 || now.getHour > 5)
        return;

    sendHttpPutRequest("http://10.0.60.10/cnf?cmd=override_device&dev_id=E1&flags=c&value=1")
   logInfo("Wallbox", "Status: {}", i3ChargingStatus.state)
end

Allerdings wäre es wesentlich sinnvoller, gleich beim Trigger der Rule einzuschränken:

Code: Alles auswählen

    Time cron "10 * 1-5 * * ?"
triggert die Rule einmal pro Minute (zur 10. Sekunde) zwischen 01:00:10 und 05:59:10, einschließlich.

Ich denke auch nicht, dass Du den i3 minütlich daran erinnern musst, zu laden (momentan prüft die Rule nicht, ob der Ladevorgang bereits gestartet wurde).

Irgendwie erscheint es mir auch sinnvoller, den Startzeitpunkt für den Ladevorgang abhängig vom Ladestand zu machen.

Ich lade bisher ausschließlich über die Haushaltssteckdose, einfach, weil ich eh nur ca. 70 km/Tag fahre und die ca. 10 kWh locker in fünf Stunden mit den 10 A rein bekomme. Aber abgesehen davon, dass ich den Ladevorgang "zur Abfahrtszeit" konfigurieren kann (leider nur drei Zeiten, was für mich als Schichtdienstler bei Weitem nicht ausreicht, heißt also ständig umkonfigurieren), so dass der Akku "pünktlich" zum gewählten Zeitpunkt den gewünschten Ladestand (hier die empfohlenen 80%) erreicht hat, wäre es ja kein Hexenwerk, auszurechnen, wie lange das Laden pro Prozent dauert.

Ich nehme mal an, es geht vor allem um die Nutzung eines günstigen Tarifs? Weil, PV kommt um die Uhrzeit eher nicht infrage...
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

mike69
Beiträge: 64
Registriert: 17. Nov 2020 22:38
Answers: 0

Re: Laderegel erstellen für E-Auto

Beitrag von mike69 »

Nabend Udo.

Danke erst mal.
Ich denke auch nicht, dass Du den i3 minütlich daran erinnern musst, zu laden (momentan prüft die Rule nicht, ob der Ladevorgang bereits gestartet wurde).
War auch nur für Testzwecke gedacht, Lt. things wird eh alle 5 Minuten aktualisiert, mir würde 15 Minuten reichen.
Laden eh nur 1phasig, ist besser mit dem Überschussladen zu händeln.

Zudem, mit "i3ChargingStatus" ist der Ladezustand angezeigt. Mit einem

Code: Alles auswählen

    if(i3ChargingStatus.state.toString = "Charging")
        return;
vor dem sendHttpPutRequest sollte das abfedern, oder?
udo1toni hat geschrieben: 11. Okt 2022 22:59
Allerdings wäre es wesentlich sinnvoller, gleich beim Trigger der Rule einzuschränken:

Code: Alles auswählen

    Time cron "10 * 1-5 * * ?"
triggert die Rule einmal pro Minute (zur 10. Sekunde) zwischen 01:00:10 und 05:59:10, einschließlich.
Von bis geht auch? :)
War mir nicht bewusst. Wieder was gelernt, das erspart ein bissl Code. :)
udo1toni hat geschrieben: 11. Okt 2022 22:59 Ich nehme mal an, es geht vor allem um die Nutzung eines günstigen Tarifs? Weil, PV kommt um die Uhrzeit eher nicht infrage...
Nein. Einmal zur Arbeit und zurück sind ca. 8 - 10 % für Uns beide, haben ziemlich die gleiche Strecke. Möchte einfach eine Grundladung haben von x% haben bevor es losgeht, und falls die Sonne scheint, darf es auch voll werden. Wir sind beide Schichtler, um 5:00 Uhr geht es los, deswegen laden bis 5 Uhr.
Überschussladung macht die Wallbox (cFos Power Brain), macht sie sogar ganz gut, soll sie es auch weiter tun. :)
Leider Kommuniziert die WB (noch) nicht mit BMW Connected Drive. deswegen sollte es in OH ausgelagert werden.


Kann ich den Ladestop eigentlich als weitere "if" Abfrage dahinter setzen? Ungefähr so:

Code: Alles auswählen

    if (i3Battery.state < 60 )    
      return; 

    sendHttpPutRequest( "http://10.0.60.10/cnf?cmd=..." ) 
       

Edit:
Sehe gerade, das funzt nicht so. Hier meine geistigen Ergüsse;

Code: Alles auswählen

rule " Charging I3"

when
    Time cron "0 0/15 1-5 * * ?"

then

    if(i3PlugConnection.state.toString != "Connected")
        return;

    if(i3ChargingStatus.state.toString = "Charging")
        return;

    if (i3Battery.state > 58 )
      return; 

       sendHttpPutRequest( "http://10.0.60.10/cnf?cmd=..." )       

end


rule "Stop Charging I3"

when
    Time cron "5 0/15 1-5 * * ?"

then

    if(i3ChargingStatus.state.toString != "Charging") 
        return;

    if (i3Battery.state < 60 )    
      return;

       sendHttpPutRequest( "http://10.0.60.10/cnf?cmd=... )       

end
openHAB 4.2.0 auf Debian 12 als VM unter Proxmox

Benutzeravatar
udo1toni
Beiträge: 15248
Registriert: 11. Apr 2018 18:05
Answers: 242
Wohnort: Darmstadt

Re: Laderegel erstellen für E-Auto

Beitrag von udo1toni »

Ja, aber Du musst aufpassen.

= -> Zuweisung eines Wertes, also z.B. a = 4 -> a wird der Wert 4 zugewiesen.
== -> Prüft auf Gleichheit, also z.B. a == 4 -> wahr, falls a gleich 4 ist.
!= -> Prüft auf Ungleichheit, das Gegenteil von == (das ! ist einzeln auch das NOT in der Bool'schen Algebra)
< Prüft auf kleiner als
> prüft auf größer als
<= prüft auf kleiner oder gleich
>= prüft auf größer oder gleich

Man kann sich vereinfacht merken, wenn es in einem Vergleich zweier Werte um Gleichheit geht, stehen da immer zwei Zeichen, also ==, !=, <= oder >=.

Und weil das auch immer wieder auftaucht und nicht ganz unwichtig ist: es gibt auch noch die Prüfung ===, hier geht es um Identität. Dabei wird der Zeiger verglichen, welcher auf die konkrete Speicherzelle zeigt, in der der eigentliche Wert gespeichert ist. === taucht in openHAB ausschließlich im Zusammenhang mit der Prüfung auf null auf (und Nochmal Achtung, null != NULL != Null != "NULL"). null beschreibt den Zustand einer nicht initialisierten Variable. Dabei wird der Zeiger auf eine ganz bestimmte Speicherzelle gesetzt. Damit ist die Variable identisch mit null (weil sie auf die gleiche, nein, sogar die selbe Speicherzelle verweist).
Wenn du also in einer Rule dies hier findest:

Code: Alles auswählen

if(meineVariable === null)
oder auch das Gegenteil:

Code: Alles auswählen

if(meineVariable !== null)
dann ist das kein Tippfehler, bedeutet aber auch nicht, dass Du an anderer Stelle ebenfalls drei Gleichheitszeichen verwenden dürftest...
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

mike69
Beiträge: 64
Registriert: 17. Nov 2020 22:38
Answers: 0

Re: Laderegel erstellen für E-Auto

Beitrag von mike69 »

Muss an der rule noch was korrigiert werden?
Habe explizit "!= "Charging"" genommen, weil ein "Not Charging", wo ich nicht weis, wie ich ein "Not Charging" da reinkriege in die rule, wg. Leerzeichen.

Oder was meinst Du?
openHAB 4.2.0 auf Debian 12 als VM unter Proxmox

mike69
Beiträge: 64
Registriert: 17. Nov 2020 22:38
Answers: 0

Re: Laderegel erstellen für E-Auto

Beitrag von mike69 »

Moinsen.

so, hier die aktuelle rule:

Code: Alles auswählen

rule " Charging I3"
when    
    Time cron "0 0/15 1-5 * * ?"
then
    if (i3PlugConnection.state.toString != "Connected")
        return; )

    if (i3Battery.state >= 50 )    
      return; )

    sendHttpPutRequest( "http://10.0.60.10/cnf?cmd=override_device&dev_id=E1&flags=E&value=1" )       
end


rule "Stop Charging I3"
when
    Time cron "5 0/15 1-5 * * ?"
then
    if (i3ChargingStatus.state.toString != "Charging")
        return;

    if (i3Battery.state <= 55 )    
      return;

    sendHttpPutRequest( "http://10.0.60.10/cnf?cmd=override_device&dev_id=E1&flags=e&value=1" )       
end
Wie sieht das aus, eine Mail mit der aktuellen Ladung wenn es anfängt zu laden?
Mit einem einfachen

Code: Alles auswählen

mailActions.sendMail("user@example.com", "I3 wird geladen", " i3Battery.state ")
wird es wohl nicht klappen.

Kannn irgendwie die Istkapazität von X% per Mail versendet werden?

Edit:
Hab was gefunden von 2018: viewtopic.php?t=689
openHAB 4.2.0 auf Debian 12 als VM unter Proxmox

mike69
Beiträge: 64
Registriert: 17. Nov 2020 22:38
Answers: 0

Re: Laderegel erstellen für E-Auto

Beitrag von mike69 »

Nabend.

Mit der alten Regel werde ich nicht so ganz warm und habe mir was anderes einfallen lassen.
Bei Anschluß an die Wallbox wird die Kapazität ermittelt und bei Bedarf geladen bis 55%

Code: Alles auswählen

rule " Charging"
when
   Item i3PlugConnection changed to "Connected"					# Erfassen, ob die WB angeschlossen ist
then
    if (i3Battery.state > 50 )							# Stop bei Restkapazität über 50% 
      return;
    sendHttpPutRequest( "http://10.0.60.10/cnf?cmd=laden_start" )		# Laderegeln werden deaktiviert.  Hier lädt er stumpf voll
end

rule "Stop Charging I3"
when
    Item i3Battery received update						# Ladestandsänderung erfassen
then
    if (i3PlugConnection.state.toString != "Connected")				# Stop bei nicht angeschlossener WB
      return;
    if (i3Battery.state < 54 )							# Stop bei nicht erreichten Ladestand  
      return;
    sendHttpPutRequest( "http://10.0.60.10/cnf?cmd=laden_stop" )		 # Laderegel wird aktiviert und  wartet auf Überschussladung
end
So brauch der Wagen nicht erst wegnickern und wird mitten in der Nacht geweckt.

Ist die Regel so brauchbar?

Bin mir mit dem

Code: Alles auswählen

Item i3Battery received update
nicht ganz sicher.

Edit:
Scheint zu funzen, die bessere Hälfe ist mit dem I3 unterwegs und bei jeder Ladestandsänderung gibt es ne Mail. :)

Musste ein

Code: Alles auswählen

if (i3PlugConnection.state.toString != "Connected")
   return;
   
dazupacken.
openHAB 4.2.0 auf Debian 12 als VM unter Proxmox

Antworten