Servus Zusammen.
Der Beitrag ist zwar schon 2 Monate alt, aber für die Nachwelt dokumentiere ich mal, was ich so gemacht hab
Ich habe vor ca. 2 Jahren mit Openhab angefangen und hab immer nur still mitgelesen. Nun will ich mal einen Beitrag leisten.
Ich habe die letzten Wochen meine Wallbox go-eCharger eingebunden und lade einen e-Golf mit PV-Strom.
Die Wallbox ist super, weil sie auch eine Umschaltung von 1phasig/3phasig hat und über eine API gut erreichbar ist.
Generell nutz ich dafür das Binding, hab aber noch ein paar HTTPGetReqeusts einbauen müssen, dass alle Funktionen abgedeckt werden.
Als Datensenke habe ich noch den 5-Minuten-Durchschnittsertrag der PV-Anlage.
Was mach ich damit?
Ich habe einen manuellen Modus, bei dem ich die Phasen, mit denen ich Laden kann, den Ladestrom sowie eine Begrenzung der Ladeenergie angeben kann:
manuell.png
Interessanter ist jedoch die Ladeautomatik, die je nachdem was die PV-Anlage liefert und ins Netz einspeisen würde den Ladestrom nachzieht, sodass der Golf nur mit selbst angebauter Energie geladen wird. Wenns nicht mehr reicht, schaltet er ab, wenn wieder genug Sonne da ist, wieder ein.
Wenn er voll ist gibts noch ne Push-Nachricht und die Sache passt.
Ich Track noch die Summen für Tag/Woche/Monat/Jahr, aber die Ausführung davon ist nicht so ideal.
Thing:
Code: Alles auswählen
Thing goecharger:goe:garage [ip="192.168.177.27",refreshInterval=30]
//In der App muss unter Internet -> Erweiterte Einstellungen "Aktiviere lokale HTTP APIv1" aktiviert werden
//In der App muss unter Internet -> Erweiterte Einstellungen "Aktiviere lokale HTTP APIv2" aktiviert werden
//In der App muss unter Lastmanagement "Lastmanagement aktivieren" deaktiviert werden
Items:
Code: Alles auswählen
Group gWallbox "Wallbox" <mWallbox> (gOU_garage)
Number GoEChargerMaxCurrent "Erlaubter Ladestrom [%.0fA]" <mlimitgreen> (gWallbox, gRRD4J) {channel="goecharger:goe:garage:maxCurrent"}
String GoEChargerPwmSignal "Status" <status> (gWallbox, gRRD4J) {channel="goecharger:goe:garage:pwmSignal"}
String GoEChargerError "Fehler Code" (gWallbox, gRRD4J) {channel="goecharger:goe:garage:error"}
Number GoEChargerVoltageL1 "Spannung L1 [%.0fV]" (gWallbox, gRRD4J) {channel="goecharger:goe:garage:voltageL1"}
Number GoEChargerVoltageL2 "Spannung L2 [%.0fV]" (gWallbox, gRRD4J) {channel="goecharger:goe:garage:voltageL2"}
Number GoEChargerVoltageL3 "Spannung L3 [%.0fV]" (gWallbox, gRRD4J) {channel="goecharger:goe:garage:voltageL3"}
Number GoEChargerCurrentL1 "Strom L1 [%.1fA]" <menergy> (gWallbox, gRRD4J) {channel="goecharger:goe:garage:currentL1"}
Number GoEChargerCurrentL2 "Strom L2 [%.1fA]" <menergy> (gWallbox, gRRD4J) {channel="goecharger:goe:garage:currentL2"}
Number GoEChargerCurrentL3 "Strom L3 [%.1fA]" <menergy> (gWallbox, gRRD4J) {channel="goecharger:goe:garage:currentL3"}
Number GoEChargerPowerL1 "Leistung L1 [%.0fW]" <menergy> (gWallbox, gRRD4J) // {channel="goecharger:goe:garage:powerL1"}
Number GoEChargerPowerL2 "Leistung L2 [%.0fW]" <menergy> (gWallbox, gRRD4J) // {channel="goecharger:goe:garage:powerL2"}
Number GoEChargerPowerL3 "Leistung L3 [%.0fW]" <menergy> (gWallbox, gRRD4J) // {channel="goecharger:goe:garage:powerL3"}
Number GoEChargerPower "Wallbox Leistung [%.0fW]" <menergy> (gWallbox, gRRD4J)
Number GoEChargerPhases "Verwendete Phasen [%.0f]" <mphasen> (gWallbox, gRRD4J) // calculatet, because 2ph {channel="goecharger:goe:garage:phases"}
Number GoEChargerSessionChargeEnergyLimit "Ladebegrenzung [%.0fkWh]" <mlimit> (gWallbox, gRRD4J) {channel="goecharger:goe:garage:sessionChargeEnergyLimit"}
Number GoEChargerSessionChargedEnergy "Energie geladen [%.1fkWh]" <menergy> (gWallbox, gRRD4J) {channel="goecharger:goe:garage:sessionChargedEnergy"}
Number GoEChargerTotalChargedEnergy "Energie gesamt [%.0fkWh]" <menergy> (gWallbox, gRRD4J) {channel="goecharger:goe:garage:totalChargedEnergy"}
Switch GoEChargerAllowCharging "Laden erlaubt" (gWallbox, gRRD4J) {channel="goecharger:goe:garage:allowCharging"}
Number GoEChargerCableCurrent "Max Ladestrom Kabel" (gWallbox, gRRD4J) {channel="goecharger:goe:garage:cableCurrent"}
String GoEChargerFirmware "Firmware" (gWallbox, gRRD4J) {channel="goecharger:goe:garage:firmware"}
String GoEChargerAccessConfiguration "Zugriffsverwaltung" (gWallbox, gRRD4J) {channel="goecharger:goe:garage:accessConfiguration"}
DateTime GoEChargerStartTime "Start [%1$tA, %1$td.%1$tm.%1$tY %1$tH:%1$tM]" <time> (gWallbox, gRRD4J)
DateTime GoEChargerLastStartTime "Start [%1$tA, %1$td.%1$tm.%1$tY %1$tH:%1$tM]" <time> (gWallbox, gRRD4J)
DateTime GoEChargerLastStopTime "Ende [%1$tA, %1$td.%1$tm.%1$tY %1$tH:%1$tM]" <time> (gWallbox, gRRD4J)
Number GoEChargerLastChargedEnergy "Energie [%.1fkWh]" <menergy> (gWallbox, gRRD4J)
Number GoEChargerManuellerCommand "Modus" <settings> (gWallbox, gRRD4J)
Number GoEChargerPowerSum "Wallbox Leistung [%.0fW]" <menergy> (gWallbox, gRRD4J)
Number GoEChargerChargedToday "Energie Heute [%.1fkWh]" <menergy> (gWallbox, gRRD4J)
Number GoEChargerChargedYesterday "Energie gestern [%.1fkWh]" <menergy> (gWallbox, gRRD4J)
Number GoEChargerChargedCurrentWeek "Energie diese Woche [%.1fkWh]" <menergy> (gWallbox, gRRD4J)
Number GoEChargerChargedLastWeek "Energie letzte Woche [%.1fkWh]" <menergy> (gWallbox, gRRD4J)
Number GoEChargerChargedCurrentMonth "Energie dieser Monat [%.1fkWh]" <menergy> (gWallbox, gRRD4J)
Number GoEChargerChargedLastMonth "Energie letzter Monat [%.1fkWh]" <menergy> (gWallbox, gRRD4J)
Number GoEChargerChargedCurrentYear "Energie dieses Jahr [%.1fkWh]" <menergy> (gWallbox, gRRD4J)
Number GoEChargerChargedLastYear "Energie letztes Jahr [%.1fkWh]" <menergy> (gWallbox, gRRD4J)
Rule:
Code: Alles auswählen
var IP_Wallbox = "192.168.177.27"
var Number nSumPowerAvailable = 0
var Number nSumPowerUse = 0
var Number newCurrent = 0
var Number nShutdownCount = 0
var Number nStartChargingEnergy = 0
var Number temp = 0
/* briefing
pwmSignal = "READY_NO_CAR", "CHARGING", "WAITING_FOR_CAR", "CHARGING_DONE_CAR_CONNECTED"
manuelle Befehle der API2, die nicht im Binding enthalten sind:
sendHttpGetRequest("http://" + IP_Wallbox + "/api/set?psm=2") // load with one phase
sendHttpGetRequest("http://" + IP_Wallbox + "/api/set?psm=1") // load with three phases
sendHttpGetRequest("http://" + IP_Wallbox + "/api/set?frc=2") // start charging
sendHttpGetRequest("http://" + IP_Wallbox + "/api/set?frc=1") // stop charging
*/
rule "Wallbox start charging"
/* briefing
Aktionen, wenn das Laden begonnen wird
*/
when
Item GoEChargerPwmSignal changed to "CHARGING"
then
GoEChargerStartTime.postUpdate(new DateTimeType())
nStartChargingEnergy = GoEChargerTotalChargedEnergy.state as Number
sendBroadcastNotification("laden gestartet", "mwallbox", "none") //Pushnachricht
end
rule "Wallbox stop charging"
/* briefing
Aktionen, wenn das laden beendet oder abgebrochen wird
*/
when
Item GoEChargerPwmSignal changed from "CHARGING"
then
GoEChargerLastStartTime.postUpdate(GoEChargerStartTime.state)
GoEChargerLastStopTime.postUpdate(new DateTimeType())
GoEChargerLastChargedEnergy.sendCommand(GoEChargerTotalChargedEnergy.state as Number - nStartChargingEnergy)
sendBroadcastNotification("laden unterbrochen. Es wurden " + GoEChargerLastChargedEnergy.state.toString +"kWh geladen", "mwallbox", "none") //Pushnachricht
end
rule "Wallbox start automatic"
/* briefing
Startet das automatische Laden, wenn genung Überschuss vorhanden ist
*/
when
Item outside_ou_PV_PowerGrid_FeedIn5Min received update
then
if (GoEChargerManuellerCommand.state == 3){
if ( GoEChargerPwmSignal.state != "CHARGING"){
if ((outside_ou_PV_PowerGrid_FeedIn5Min.state as Number / GoEChargerVoltageL1.state as Number) > 6)
{
if((outside_ou_PV_PowerGrid_FeedIn5Min.state as Number / GoEChargerVoltageL1.state as Number) >16){
GoEChargerMaxCurrent.sendCommand(16)
} else {
GoEChargerMaxCurrent.sendCommand(outside_ou_PV_PowerGrid_FeedIn5Min.state as Number / GoEChargerVoltageL1.state as Number)
}
sendHttpGetRequest("http://" + IP_Wallbox + "/api/set?psm=1") // load with one phase
GoEChargerAllowCharging.sendCommand(ON)
sendHttpGetRequest("http://" + IP_Wallbox + "/api/set?frc=2") // start charging
} else {
GoEChargerMaxCurrent.sendCommand(6)
GoEChargerAllowCharging.sendCommand(OFF)
}
}
if (GoEChargerPwmSignal.state == "CHARCHARGING_DONE_CAR_CONNECTEDGING") {
//auto is so voll wie ich gern wäre
}
}
GoEChargerPowerSum.sendCommand(GoEChargerPowerL1.state as Number + GoEChargerPowerL2.state as Number + GoEChargerPowerL3.state as Number)
if (GoEChargerCurrentL3.state > 0){
GoEChargerPhases.sendCommand(3)
}
else if (GoEChargerCurrentL2.state > 0){
GoEChargerPhases.sendCommand(2)
}
else if (GoEChargerCurrentL1.state > 0){
GoEChargerPhases.sendCommand(1)
} else {
}
end
rule "Wallbox charging automatic"
/* briefing
Automatikmodus
*/
when
Time cron "0 0/5 * * * ? *"
then
if (GoEChargerManuellerCommand.state == 3){
if (GoEChargerPwmSignal.state == "CHARGING") {
newCurrent = GoEChargerCurrentL1.state as Number + (outside_ou_PV_PowerGrid_FeedIn5Min.state as Number / GoEChargerVoltageL1.state as Number / GoEChargerPhases.state as Number)
if( newCurrent > 16 ){
GoEChargerMaxCurrent.sendCommand(16)
nShutdownCount = 0
}
else if( newCurrent < 6 )
{
GoEChargerMaxCurrent.sendCommand(6)
nShutdownCount = nShutdownCount + 1
} else {
GoEChargerMaxCurrent.sendCommand(newCurrent)
nShutdownCount = 0
}
if( nShutdownCount > 2 ){
GoEChargerAllowCharging.sendCommand(OFF)
}
GoEChargerSessionChargeEnergyLimit.sendCommand(0)
}
}
end
rule "Wallbox charging manuell"
/* briefing
manueller Modus:
Es muss zuerst der manuelle Modus aktiviert werden, bevor das Ladeschema gewählt wird.
*/
when
Item GoEChargerManuellerCommand changed
then
if (GoEChargerManuellerCommand.state == 0)
{
GoEChargerAllowCharging.sendCommand(OFF)
sendHttpGetRequest("http://" + IP_Wallbox + "/api/set?frc=1") // stop charging
logInfo("Wallbox", "manuelles Laden beendet")
}
if (GoEChargerManuellerCommand.state == 1)
{
sendHttpGetRequest("http://" + IP_Wallbox + "/api/set?psm=1") // load with one phase
GoEChargerAllowCharging.sendCommand(ON)
sendHttpGetRequest("http://" + IP_Wallbox + "/api/set?frc=2") // start charging
logInfo("Wallbox", "manuelles Laden mit 1ph begonnen")
}
if (GoEChargerManuellerCommand.state == 2)
{
sendHttpGetRequest("http://" + IP_Wallbox + "/api/set?psm=2") // load with three phases
GoEChargerAllowCharging.sendCommand(ON)
sendHttpGetRequest("http://" + IP_Wallbox + "/api/set?frc=2") // start charging
logInfo("Wallbox", "manuelles Laden mit 3ph begonnen")
}
end
/* ################################################################ DatenTracker ################################################################*/
rule "Wallbox energytracker"
/* briefing
Trackt den Energyverbrauch
*/
when
Time cron "0 0/5 * * * ? *"
then
val ZonedDateTime zdt = ZonedDateTime.now()
var ZonedDateTime StartOfDay = zdt.toLocalDate().atStartOfDay(zdt.getZone())
val ZonedDateTime zdw = ZonedDateTime.now.minusHours((now.getDayOfWeek.getValue-1)*24)
var ZonedDateTime StartOfWeek = zdw.toLocalDate().atStartOfDay(zdw.getZone())
val ZonedDateTime zdm = ZonedDateTime.now.minusHours((now.getDayOfMonth-1)*24)
var ZonedDateTime StartOfMonth = zdm.toLocalDate().atStartOfDay(zdm.getZone())
val ZonedDateTime zdj = ZonedDateTime.now.minusHours((now.getDayOfYear-1)*24)
var ZonedDateTime StartOfYear = zdj.toLocalDate().atStartOfDay(zdj.getZone())
GoEChargerChargedToday.sendCommand(GoEChargerTotalChargedEnergy.deltaSince(StartOfDay) as Number)
GoEChargerChargedCurrentWeek.sendCommand(GoEChargerTotalChargedEnergy.deltaSince(StartOfWeek) as Number)
GoEChargerChargedCurrentMonth.sendCommand(GoEChargerTotalChargedEnergy.deltaSince(StartOfMonth) as Number)
if (now.getYear == 2022) {
GoEChargerChargedCurrentYear.sendCommand(GoEChargerTotalChargedEnergy.state as Number)
} else {
GoEChargerChargedCurrentYear.sendCommand(GoEChargerTotalChargedEnergy.state as Number - GoEChargerTotalChargedEnergy.minimumSince(StartOfYear) as Number)
}
end
rule "Wallbox Day Tracker"
/* Briefing
Setzt den täglichen Ladewert
*/
when
Time cron "10 0 0 * * ? *"
then
var Monthhours = now.minusHours(1).getDayOfMonth *24
GoEChargerChargedYesterday.sendCommand(GoEChargerTotalChargedEnergy.deltaSince(now.minusHours(24)) as Number)
if (now.getDayOfWeek.getValue == 1) {
GoEChargerChargedLastWeek.sendCommand(GoEChargerTotalChargedEnergy.deltaSince(now.minusHours(24*7)) as Number)
}
if (now.getDayOfMonth == 1) {
GoEChargerChargedLastMonth.sendCommand(GoEChargerTotalChargedEnergy.deltaSince(now.minusHours(Monthhours)) as Number)
}
if (now.getDayOfYear == 1) {
GoEChargerChargedLastYear.sendCommand(GoEChargerTotalChargedEnergy.state as Number - GoEChargerTotalChargedEnergy.minimumSince(now.minusHours(365*24)).state as Number)
}
end
Auszug Sitemap
Code: Alles auswählen
Group item=gWallbox icon="mwallbox"
{
Frame label="manuelles Laden" icon=heating {
Switch item=GoEChargerManuellerOverride icon=energy mappings=[0="automatik", 1="manuell"]
Switch item=GoEChargerManuellerCommand icon=energy mappings=[0="Aus", 1="1-phase", 2="3-phasig"]
Setpoint item=GoEChargerMaxCurrent step=1 minValue=6 maxValue=16
Setpoint item=GoEChargerSessionChargeEnergyLimit step=1 minValue=1 maxValue=35
}
Frame label="aktueller Ladevorgang" icon=calender {
Image url="http://marvin:8080/static/Wallbox/car.png"
Text item=GoEChargerStartTime
Text item=GoEChargerPwmSignal
Text item=GoEChargerMaxCurrent
Text item=GoEChargerPhases
Text item=GoEChargerCurrentL1
Text item=GoEChargerPowerL1
Text item=GoEChargerCurrentL2
Text item=GoEChargerPowerL2
Text item=GoEChargerCurrentL3
Text item=GoEChargerPowerL3
Text item=GoEChargerSessionChargedEnergy
Text item=outside_ou_PV_PowerGrid_cor valuecolor=[>0="green", <0="red"]
}
Frame label="letzter Ladevorgang" icon=calender {
Text item=GoEChargerLastStartTime
Text item=GoEChargerLastStopTime
Text item=GoEChargerLastChargedEnergy
Chart item=GoEChargerPowerL1 icon=energy refresh=10000 period=D
}
Frame label="Historie" icon=calender {
Image url="http://marvin:8080/static/Wallbox/History.png"
Text item=GoEChargerChargedToday
Text item=GoEChargerChargedYesterday
Text item=GoEChargerChargedCurrentWeek
Text item=GoEChargerChargedLastWeek
Text item=GoEChargerChargedCurrentMonth
Text item=GoEChargerChargedLastMonth
Text item=GoEChargerChargedCurrentYear
Text item=GoEChargerChargedLastYear
Text item=GoEChargerTotalChargedEnergy
Chart item=GoEChargerTotalChargedEnergy icon=energy refresh=300000 period=M
}
}
Group item=gPV icon="mpv"
{
Frame label="Bezug" icon=mpv {
Text item=outside_ou_PV_PowerSolar
Text item=outside_ou_PV_PowerGrid_FeedOut valuecolor=[<0="red"]
Text item= outside_ou_PV_EnergyString1 label="Leistung SüdWest" icon= mgardenview
Text item= outside_ou_PV_EnergyString2 label="Leistung NordOst" icon= mstreetview
Text item= outside_ou_PV_EnergyString1Modul label="Leistung SüdWest (Modul)" icon= mgardenview
Text item= outside_ou_PV_EnergyString2Modul label="Leistung NordOst (Modul)" icon= mstreetview
}
Frame label="Verbrauch" icon=calender {
Text item=GoEChargerPowerSum icon=mwallbox
Text item=house_kg_boiler_HeatPumpPower icon=radiator
Text item=WasherPower
Text item=DryerPower
Text item=DishwasherPower icon=mdish
Text item=CoffeePower label="Kaffeemaschine Leistung" icon=mcoffee
Text item=outside_ou_PV_PowerUse label="Summe"
}
Frame label="Einspeisung" icon=calender {
Text item=outside_ou_PV_PowerGrid_FeedIn valuecolor=[>0="green"]
}
Frame label="Tag" {
Chart item=gPVGrid refresh=300000 period=d
}
Frame label="Stromkosten" icon=calender {
Chart item=Cost_Energy_Yesterday icon=energy refresh=300000 period=M
Setpoint item=Cost_Energy_BasicFees step=0.1 minValue=1 maxValue=300
Setpoint item=Cost_Energy_SelfConsumption step=0.0001 minValue=0.01 maxValue=1
Setpoint item=Cost_Energy_ElectricityPrice step=0.0001 minValue=0.01 maxValue=1
Setpoint item=Cost_Energy_Sell step=0.0001 minValue=0.01 maxValue=0.2
}
}
}
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.