Steuerung einer Tinkerforge WARP Wallbox

Begonnen von chris_kmn, 04 November 2021, 12:04:13

Vorheriges Thema - Nächstes Thema

chris_kmn

Hm, das mit dem unplug-notify ist mir noch nicht aufgefallen. Muss nochmal testen.

Das er nach NFC Freigabe sofort loslegt, könnte am vorhandenen PV Überschuss liegen. Wenn kein Überschuss da ist sollte er aber nicht starten (wenn ,,nurPV" aktiv), sondern nur nach Knopfdruck - also Sofortladen.

inject_tag und inject_tag start machen fast das gleiche. Mit dem ersten toggelst du quasi start/stop und mit _start startest du nur, keinen stop.

Wenn du das kit dem knopf koppeln willst, dann würde ich einen virtuellen Tag für ,,nurPV" machen und einen für ,,Sofortladen"

smoudo

Ich habe jetzt mal das unplug notify umgebaut
defmod nty_Vehiclestate_uplg notify WARP2_CP:vehicle_state:.* IF ([WARP2_CP:vehicle_state] = 0) (set dSofortLaden off)
attr nty_Vehiclestate_uplg group Wallbox
attr nty_Vehiclestate_uplg room Outdoor

setstate nty_Vehiclestate_uplg 2022-08-15 20:25:17
setstate nty_Vehiclestate_uplg 2022-08-15 19:05:22 state active
setstate nty_Vehiclestate_uplg 2022-08-15 20:25:17 triggeredByDev WARP2_CP
setstate nty_Vehiclestate_uplg 2022-08-15 20:25:17 triggeredByEvent vehicle_state: 2


Plus beim Wallboxdevice habe ich vehicle_state noch zu event-on-change-reading hinzugefügt.

Jetzt triggert das notify ABER der sofortladen knopf geht trotzdem nicht auf off   :o

Irgendwo ist da noch ein error drin!

Viele Grüße

Matze

chris_kmn

#47
Vielleicht ist es so einfacher ? Ich hab das glaube ich zu kompliziert gemacht.

defmod nty_Vehiclestate_uplg notify WARP2_CP:vehicle_state:0 set dSofortLaden off

Das mit dem event_on_change war sicher noch ein problem. Daran habe ich nicht gedacht.


Ich teste das morgen bei mir mal

smoudo

Ich teste morgen bei mir auch mal mit den 2 phasen. ich habe jetzt den multiplikator mal auf 23 gesetzt. Bei uns liegen eigentlich sauber 230V pro Phase an.
Allerdings verstehe ich die Formel noch nicht so richtig. Verbessere mich bitte wenn ich falsch liege.
$maxcurr = int((500 + $ChargePower)/($PwrFaktor*23))*100;      

Chargepower= Leistung in W = 1380W bei 6A
PwrFaktor= aktive Phasen =1

((500+1380)/(1*23))*100
(1880/23)*100
=8173

Ist das jetzt der current wert oder sind das die W?
Bei current währen das dann 8,17A bei 500W mehr.
korrekt?



chris_kmn

Ich glaube ich habe den Multiplikator damals anhand von Messungen berechnet, da es hier ja um eine zweiphasige Wechselstromleistung geht.

Zur Formel:

500= um 500 Watt die Ladeleistung erhöhen
500 + chargepower= die 500 Watt werden auf die anliegende (gemessene) Ladeleistung addiert

maxcurr = Ladestrom = Ladeleistung / Spannung = (500+chargepower) / (Anzahl Phasen * 230 V)
=> Der Wert hat Dimension Ampere, die Wallbox braucht aber Milliampere. Darum *1000

Und aus den oben stehenden 1000 und unten stehenden 230 habe ich 100 und 23 gemacht um mit dem Integer auf 100er Milliampereschritte zu runden, also 0,1 Ampere-Schritte.

Deine Berechnung sollte korrekt sein. Aber checke tatsächlich mal die Phasenströme beim Laden und die Leistungswerte am Zähler. Dann siehst du, ob die 23(0) passen.

smoudo

Ich hab das vorhin nochmal gecheckt. Bei uns liegen im Mittel bei 16A Ladestrom sogar 239,8V an.
Echt viel wie ich finde. Die Phasen liegen aber auch nur 0,3V auseinander. Morgen mal schauen wieviel das bei Sonne noch hoch geht.

smoudo

Heute morgen konnte ich das ganze gut testen.
Mit 2 Phasen aktiv geht die automatik nicht an. Mit 1 Phase startet der Ladevorgang.
Unter nurpv habe ich das gleiche Spiel An/Aus wie die ganze Zeit. Das ging soweit das ich nach einiger Zeit das Auto neu anstecken musste, weil es keine Ladung mehr zugelassen hat.

Unter Minpv läuft das ganze sauber. Startet bei 6A und war kurzzeitig mal auf 11A oben.
Das sieht gut aus!

Das notify stellt immer noch nicht zurück auf off. Hab jetzt mal das Tag umgestellt auf inject_tag
Leider ohne Erfolg.

Viele Grüße

Matze

chris_kmn

Ok, dann schaue ich mir das heute auch nochmal an.

Wenn es bei minPV klappt, dann kann es eigentlich nur an den Grenzwerten und der Berechnung der Leistung liegen.

Ich überlege, ob man nicht gleich alle Werte aus dem Zähler der WB holt, dann sollte die Berechnung auch passen. Oder ich lasse das mit dem Abgleich zur Leistung des Wechselrichters und regele einfach nur auf den Strom.

Schick mir bitte trotzdem mal deinen myutils code.

chris_kmn

Und nochmal eine blöde Frage. Speist dein Wechselrichter 3-phasig ein oder nur einphasig ?

smoudo

#-------------------------------------------------------------------------------
# Überschussladen PV zu Wallbox
#-------------------------------------------------------------------------------
# Ladestrom berechnen  kontinuierlich
sub myChargeCurrent() {
my $overpow = 0; # Leistungsüberschuss ("-" = Überschuss)
### PV-Wechselrichter + Battterie (RCT-Power):
my $BatteryPower = ReadingsNum("Primo","PowerFlow_Site_P_Akku",0); # Leistung Batterie ("-" = laden)
my $GridPower = ReadingsNum("Primo","PowerFlow_Site_P_Grid",0); # Leistung Netz ("-" = einspeisen)
### Wallbox:
my $maxcurr = ReadingsNum("WARP2_CP","MaxCurrent",0); # Maximaler Ladestrom Wallbox
my $ChargePower = ReadingsNum("WARP2_CP","power",0); # Ladestrom
my $VehicleState = ReadingsNum("WARP2_CP","charger_state",0); # Fahrzeugstatus
my $PwrFaktor = ReadingsNum("WARP2_CP","PwrFaktor",2); # Faktor Anzahl aktive Phasen
### FHEM Devices zur Steuerung:
my $FixStrom = ReadingsNum("WB_pmode","current",0); # Ladestrom Vorgabe
my $WB_pmode = ReadingsVal("WB_pmode","state",0); # Sollwert PV-Lademodus

if ($PwrFaktor == 0) {$PwrFaktor = 1}; # Anzahl aktive Phasen (gelesen von WB-Stromzähler). Hier 2 als Default (fahrzeugspezifisch)

$overpow = $GridPower + $BatteryPower; # Leistungsüberschuss ("-" = Überschuss)

if ($VehicleState == 1 ){ # Fahrzeug ist angeschlossen
if (ReadingsNum("WARP2_CP","autostart",1) == 1) { # Autostart ?
fhem("set WARP2_CP auto_start_charging 0"); # manuelles Starten
}
if (ReadingsVal("dSofortLaden","state",0) eq "on") { # Sofortladen gesetzt ?
if ($maxcurr != $FixStrom ) {
fhem("set WARP2_CP current $FixStrom");
}
fhem("set WARP2_CP tagstart");
fhem("set WARP2_CP start_charging");
return; # bei Sofortladen Routine verlassen
}
elsif ($WB_pmode eq "minPV" ) { # minPV Laden: Ladevorgang sofort starten mit min Ladestrom
$maxcurr = 6000;
fhem("set WARP2_CP current $maxcurr");
fhem("set WARP2_CP tagstart");
fhem("set WARP2_CP start_charging");
}
elsif ($WB_pmode eq "nurPV") { # nurPV Laden: Ladevorgang bei Überschuss starten
if ($overpow <= -(1500*$PwrFaktor)) { # Laden starten bei PV Überschuss  (1A ca. 230 Watt)
$maxcurr = 6000;
fhem("set WARP2_CP current $maxcurr");
fhem("set WARP2_CP tagstart");
fhem("set WARP2_CP start_charging");
}
}
elsif ($WB_pmode eq "BattPV") { # BattPV Laden: Ladevorgang bei Überschuss starten
if ($GridPower <= 20 && $BatteryPower <= 5300) { # Laden starten bei Leistungsüberschuss
$maxcurr = 6000;
fhem("set WARP2_CP current $maxcurr");
fhem("set WARP2_CP tagstart");
fhem("set WARP2_CP start_charging");
}
}
elsif ($WB_pmode eq "fix") { # fix Laden: Ladevorgang mit festem Strom laden
if ($maxcurr != $FixStrom ) {
fhem("set WARP2_CP current $FixStrom");
}
fhem("set WARP2_CP tagstart");
fhem("set WARP2_CP start_charging");
}
return;
}

if ($VehicleState == 3)  { # Fahrzeug lädt

if (ReadingsVal("dSofortLaden","state",0) eq "on") { # Sofortladen gesetzt ?
if ($maxcurr != $FixStrom ) {
fhem("set WARP2_CP current $FixStrom");
}
return; # bei Sofortladen Routine verlassen
}
elsif ($WB_pmode eq "minPV" || $WB_pmode eq "nurPV") { # minPV Laden:
if ($overpow <= -400) { # bei Überschuss Strom anheben
$maxcurr = int((200 + $ChargePower)/($PwrFaktor*23.8))*100; # Berechnung Ladestrom [mAmp] (2-phasig)
}
elsif ($overpow > 0 ) { # Strom absenken bei Strommangel
$maxcurr = int(($ChargePower-$overpow-100)/($PwrFaktor*23.8))*100; # Berechnung Ladestrom [mAmp] (2-phasig)
}
else {
return;
}
if ($maxcurr < 6000) {
$maxcurr = 6000;
if ($WB_pmode eq "nurPV" ) {
fhem("set WARP2_CP auto_start_charging 0"); # manuelles Starten
fhem("set WARP2_CP tagstart");
fhem("set WARP2_CP stop_charging"); # Laden unterbrechen bei nurPV !
}
}
if ($maxcurr > 16000) {$maxcurr = 16000};
fhem("set WARP2_CP current $maxcurr");
}
elsif ($WB_pmode eq "BattPV") {
if ($GridPower <= 20 && $BatteryPower <= 7000) { # keine Stromentnahme aus Netz und Batt-Leistung kleiner 7kW ?
$maxcurr = int((250 + $ChargePower)/($PwrFaktor*23.8))*100; # Strom anheben
if ($maxcurr > 16000) {$maxcurr = 16000};
}
if ($GridPower > 100 ) { # Strom aus Netz ?
$maxcurr = int(($ChargePower-$overpow-250)/($PwrFaktor*23.8))*100; # Ladestrom reduzieren
}
if ($maxcurr < 6000) { # Laden unterbrechen wenn zu wenig Leistung
$maxcurr = 6000;
fhem("set WARP2_CP auto_start_charging 0"); # manuelles Starten
fhem("set WARP2_CP tagstart");
fhem("set WARP2_CP stop_charging"); # Laden unterbrechen bei nurPV !
}
fhem("set WARP2_CP current $maxcurr");
}
elsif ($WB_pmode eq "fix") { # fix Strom laden
if ($maxcurr != $FixStrom) {
fhem("set WARP2_CP current $FixStrom");
}
}
}
} #End Sub


das mit dem faktor 23.8 scheint wohl nicht ganz zu passen. da kommt weniger W raus. wenn ich den U R I rechne komme ich nur auf eine Spannung von 220 V
Ich habe das ganze heute auch schon mit faktor 22 gerechnet. Da passen wide W Werte besser. Das ergebnis mit An/aus ist das gleiche.
Bei minpv regelt er sauber bis ans Limit der Einspeisung ran. Meist relativ genau bis -300 und auch zurück. Sprich die Werte an sich können nicht so verkehrt sein. Irgendetwas triggert das teil auf off.
Mein Wechselrichter ist 1 Phasig. Sollte aber keine Relevanz haben das reading kommt sauber mit - bei Einspeisung an und Positiv bei Zukauf.

Das tagstart ist bei mir jetzt der inject_tag und nicht mehr der inject_tag_start

Viele Grüße

Matze

chris_kmn

Hi Matze,

erstmal das Notify. Da bei der Wallbox das vehicle_starte aus einem json extrahiert wird, ist dort noch ein Leerzeichen zu berücksichtigen. Also sieht der Trigger so aus:

defmod nty_Vehiclestate_uplg notify WARP2_CP:vehicle_state:.0 set dSofortLaden off

Der Punkt vor der 0 hatte gefehlt :( Habs bei mir gerade getestet und jetzt geht das ,,sofortladen" aus nach abstecken.




chris_kmn

#56
so und nun nochmal zu deinem Code:

Punkt 1:

Mach bitte mal aus der Zeile:

my $PwrFaktor = ReadingsNum("WARP2_CP","PwrFaktor",2); # Faktor Anzahl aktive Phasen

Folgende:
my $PwrFaktor = ReadingsNum("WARP2_CP","PwrFaktor",0); # Faktor Anzahl aktive Phasen

Punkt 2:

Die Funktion "tagstart" solltest du nur beim initialen Starten und finalen Stoppen des Ladevorgangs (also so als würdest du das mit dem NFC an der Wallbox starten oder abbrechen) benutzen. D.h. in der myutils nur in der Abfrage unter "vehicle_state ==1" nutzen. Nicht beim unterbrechen (also quasi pausieren) während eines Ladevorganges bei "vehicle_state==3".

Das könnte schon das Problem sein. Damit würde nämlich der vehicle state wieder in 1 gehen und dann startet die Prozedur von vorne. Ist jetzt nur eine Vermutung, aber nimm mal tagstart raus im zweiten Teil. Es reicht das stop_charging/start_charging.

Und zu deiner Änderung mit  inject_tag_start zu inject_tag:

Du weißt, dass du damit toggelst ? Sollte also jemand manuell mit dem NFC-Tag starten, dann würdest du mit  inject_tag wieder stoppen. Willst du das wirklich ? Damit ist dann der gesamte Ladevorgang gestoppt. Wenn FHEM ihn wieder startet wird damit in der Wallbox auch ein erneuter Vorgang angelegt. Ich sehe aktuell keinen Grund, warum FHEM den kompletten Ladevorgang stoppen sollte, außer man tut es bewußt. Dafür könnte man dann aber den Befehl  inject_tag_stop verwenden.
Ebenfalls könntest du, wenn Ladung per inject_tag gestoppt ist, keine Vorkonditionierung per Hausnetz starten. Ich lasse den Ladevorgang so lange aktiv, bis ich das Auto wieder abstöpsele.

smoudo

Danke für Dein Feedback!

Punkt 1 habe ich geändert, werde ich testen.
Punkt 2 hast du natürlich recht. Das war wohl der Versuch, viel hilft viel. - leider ohne Erfolg  ;)

Das mit dem Toggle könnte in der Tat komisch werden! Ist denn Fahrzeug abziehen gleich zu setzen mit inject_tag_stop ?
In dem Fall bräuchte man stop nicht.

Im Prinzip müsste man jetzt noch unterscheiden ob ein virtueller Tag eingesetzt wird bei sofortladen oder ob der Taster sofortladen auslöst in verbindung mit einem richtigen nfc. Dann sollten alle Vorgänge abgebildet sein oder?


chris_kmn

Fahrzeug abziehen kommt dem inject_tag_stop gleich. Was in der Wallbox damit gemacht wird, weiß ich nicht. Aber beim Abziehen wird der Ladevorgang genau so abgebrochen wie bei Stop durch inject_tag_stop. Ich denke auch man benötigt die Funktion nicht wirklich. Außer man möchte aus irgend einem Grund den ganzen Ladevorgang beenden. Z.B zu einer bestimmten Uhrzeit zu der es keinen Solarstrom mehr gibt und man zeitgesteuert auf Sofortladen schalten möchte. Dann könnte man das Profil zum Überschussladen beenden und auf das Profil Sofortladen wechseln. Also tag_inject_stop mit virtuellem Tag solar und tag_inject_start mit anderem virtuellen Tag Netzladen.

Deine letzte Frage verstehe ich nicht so ganz. Ich hatte verstanden, dass du beim PV Laden den virtuellen Tag nutzt, und beim Sofortladen kann man sowohl einen (anderen) virtuellen Tag nutzen als auch die ID eines realen Tags.

smoudo

#59
so ich bin der Sache mit den Abbrüchen nochmal nachgegangen. Es hängt am 10 sec interval der Wallbox. Anscheinend hat der script zu spät den charger_state 3 bekommen und ist in der 1er Schleife hängen geblieben?! Erst als ich den Code zu minPV umgeshrieben habe wurde es reproduzierbar. Verrückt!

Mit dem Tag teste ich noch was aus im wallbox device. Da hab ich eine Idee zu.

- Das notify zum sofortladen auf off bei Kabelzug funktioniert jetzt einwandfrei!

Edit: Nach mehreren Testdurchläufen wieder abbrüche. Ich habe jetzt die 2 Phasen Geschichte komplett rausgelöscht + den Faktor auf 21.5 runter genommen. Anscheinend war die box zu nah an der unteren Grenze. bis jetzt läuft es  ;D