Modul für Steuerung einer Go-ECharger Wallbox [= go-e oder go-echarger]

Begonnen von LR66, 16 April 2020, 19:50:12

Vorheriges Thema - Nächstes Thema

PeterJH

Danke für die schnelle Antwort, werde ich mir mal genauer ansehen.

xerion

Zitat von: PeterJH am 07 Januar 2022, 11:21:11
Ich habe begonnen, eine PV-Überschussregelung zu bauen um meinen Seat Leon PHEV zu laden.
Optimal wäre es, den aktuellen Ladezustand des Auto-Akkus zu bekommen, möglichst ohne über das Seat Portal gehen zu müssen.
Ziel ist es das Laden bei 80% SoC zu stoppen um den Akku zu schonen.

Gibt es hierzu eine Kommunikation zwischen Auto und go-e Box bzw. einen (indirekten) Indikator?
Über den Go-E bekommst du keinen SoC das ist bei den AC Ladern (noch) nicht möglich. Die Abfrage über das Seat Portal würde auch nicht auf Dauer empfehlen wäre aber technisch möglich. Aber falls du es doch möchtest, könntest du das mit diesem Projekt nutzen: https://github.com/dominikkarall/fhempy. Da habe ich es für SEAT/CUPRA bereitgestellt. Ich meine aber, dass das SEAT CONNECT nur im ersten Jahr umsonst ist und danach Kostenpflichtig wird, so ist es zumindest bei meinem Cupra PHEV.
Wenn du etwas pfiffig bist könntest du dir die Daten auch per OBD Schnittstelle ziehen. Als Beispiel könnte man evNotify nutzen.

PS: Die weConnect-MQTT geht leider nicht mit SEAT, da die noch eine alte API Schnittstelle nutzen.
Ich würde mich  freuen, wenn du meinen Einladungscode für Tibber, der Stromanbieter, der dir hilft, deinen Stromverbrauch zu verstehen und zu reduzieren, nutzt: https://invite.tibber.com/5fc08jbs. So bekommen wir beide 50 Euro und 100 % Ökostrom / https://geld-fuer-eauto.de/ref/334561880

PeMue

So, meine Wallbox ist gestern montiert worden. Jetzt schaue ich mal, dass ich das Modul und im weiteren PV Überschussladung zum Laufen bekomme.

Gruß Peter
RPi3Bv1.2 rpiaddon 1.66 6.0 1xHM-CC-RT-DN 1.4 1xHM-TC-IT-WM 1.1 2xHB-UW-Sen-THPL-O 0.15 1x-I 0.14OTAU  1xCUNO2 1.67 2xEM1000WZ 2xUniroll 1xASH2200 3xHMS100T(F) 1xRFXtrx 90 1xWT440H 3xTFA30.3150 5xFA21
RPi1Bv2 LCDCSM 1.63 5.8 2xMAX HKT 1xMAX RT V200KW1 Heizung Wasser

thomas1971

#288
Ich hole mir den State of Charge SoC von unserem VW eUP mit einem WLAN fähigen OBD2 Adapter raus (CarTrend Mini OBD). Kostet fast gar nichts und ist nicht abhängig von irgendwelchen Android Händis, WallBoxen etc, nur WLAN.


Aufruf aus fhem / :

#eUP OBD abfragen als Python3 aufrufen,
# als separaten Thread weil socket laenger blockieren kann
sub eUpOBDbyELM327()
{
  #neue Daten abrufen, Kommunikation mit fhem erfolgt ueber MQTT
  my $thr = threads->create(\&eUpOBDbyELM327_Thread);
  $thr->detach();
}

sub eUpOBDbyELM327_Thread()
{
   my $Process = (`python3 /home/thomas/projects/eUpOBDbyELM327.py`);
}



Zur Abwechslung mal ein Python, eUpOBDbyELM327.py:


import socket
import datetime
import time
import sys
import os
import binascii
import platform
import subprocess

#MQTT Client https://www.eclipse.org/paho/index.php?page=clients/python/index.php
#install on host mit sudo damit alle user inkl. fhem das modul verwenden koennen: pip install paho-mqtt
#import paho.mqtt.client as mqtt
import paho.mqtt.publish as publish
   
#Verbindet eUp ueber den ELM327 und dessen WiFi_OBD2 per MQTT mit fhem
# Ziel: eUP Ladestand (SoC) auslesen und fhem bereitstellen.

ELM_PROMPT = '>'
host = '192.168.0.10'       #IP Adresse des ELM327 Servers, needs to be in quote
port = 35000

#korrekte python version sicherstellen (python3)
if not sys.version_info.major == 3 and sys.version_info.minor >= 6:
    print("Python 3.6 or higher is required.")
    print("You are using Python {}.{}.".format(sys.version_info.major, sys.version_info.minor))
    sys.exit(1)
print("Python Version: " + platform.python_version())
print('Tool File Name: ' + os.path.abspath(__file__))
print('last change: ' + time.ctime(os.path.getctime(__file__)))

#pruefen ob WLAN auf chili eingeschaltet ist
output_str = str(subprocess.run(["ip", "link", "show", "wlx001a13bec331"], capture_output=True))
#print (output_str)
index = output_str.find("state UP")
if(index > 0):
    print ("WLAN connected")
else:
    print ("WLAN not connected")
    sys.exit(1)

#WiFi_OBD2 Device anpingen um Verbindung zu kontrollieren
output_str = str(subprocess.run(["ping", host, "-c", "1"], capture_output=True))
#print (output_str)
index = output_str.find("0% Paketverlust")
if(index > 0):
    print ("ping ok")
else:
    print ("IP "+host+" nicht erreichbar")
    sys.exit(1)


#Verbindung auf ELM327 in eUP aufbauen
s = socket.socket()
s.settimeout(10)   #Set the default timeout in seconds (float)
try:
    s.connect((host, port))         #wartet bis Timeout, wenn nicht verbunden werden kann
except Exception as msg:
    s.close()
    print ('Socket not connected')
    print (msg)
    sys.exit(1)



#------FUNCTIONS--------------------------------------------------------------------
def byte_to_binary(n):
    return ''.join(str((n & (1 << i)) and 1) for i in reversed(range(8)))

def hex_to_binary(h):
    return ''.join(byte_to_binary(ord(b)) for b in binascii.unhexlify(h))

def send_cmd(cmd):
    print (cmd+": ", end = '')
    data=''
    cmd += "\r" # terminate
    s.send(cmd.encode())
    i=0
    while True:
        data=data+s.recv(64).decode()
        i=i+1
        if (data.endswith(ELM_PROMPT) or len(data)>128 or i>10):
            break
    # remove the prompt character
    data = data[:-1]
    # splits into lines while removing empty lines and trailing spaces
    data = data.replace('\r','')
    data = data [len(cmd)-1:]
    return data

def get_uds(SID, ReqDataParam):
    #zB. UDS Service 22 "22028C" --> SID=22, ReqDataParam=028C
    # Antwort enthält nur die Daten (ohne 62028C)
    # aus 62 02 8C AA BB wird AABB
    responce=send_cmd(SID + ReqDataParam)
    if('NO DAT' in responce or 'ERR' in responce):
        print("Error in: %s %s responce %s"% (SID, ReqDataParam, responce))
        return ''
    else:
        responceSID=int(SID, base=16)+64            #UDS responce SID ist 0x40 higher, add 0x40=64
        responceSID=format(responceSID, 'X')        #oder hex()
        responce=responce.replace(' ','')           #alle Leerzeichen weg
        if(responce.find(responceSID)==0):
            responce=responce.replace(responceSID,'',1) #nur erster gefundene Wert ersetzen
        else: return ''
        if(responce.find(ReqDataParam)==0):
            responce=responce.replace(ReqDataParam,'',1)
        else: return ''
        return responce


"""INIT ELM327 DONGLE-------------------------------------"""

print (send_cmd("AT Z"))    # reset to default settings to be sure what the base setting are
#print (send_cmd("AT I"))    # Print the version ID, unnoetig nach reset
print (send_cmd("AT SP6"))  # Set protokoll to 6 - ISO 15765-4 CAN (11 bit ID, 500 kbaud)
print (send_cmd("AT BI"))   # Bypass the initialization sequence to make sure it stays at protokoll 6
#print (send_cmd("AT CAF0")) # Turns off CAN automatic formating so that PCI bytes are not inserted in the messages, or expected in the response
print (send_cmd("AT L0"))   # Linefeeds off
print (send_cmd("AT DP"))   # xxxxxxxxx
#print (send_cmd("AT ST16")) # reduced timeout to 1, orig.16
#print (send_cmd("AT H1"))   #show headers --> 7ED, Debug Only
#print (send_cmd("ATSH17FC007B"))  #Sets header to 17 FC 00 7B  -> 0x17FC007B, funktioniert nicht

success=True
mqttMsgs =[]                       #Message list for mqtt.publish

result = (send_cmd('AT RV'))       #12VSpannung
print(result)
result=result.replace(' ','')
result=result.replace('V','')
mqttMsgs.append(("eUp/OBDELM327/Voltage", result, 0, False))

#Ladung muss eingeschaltet sein damit das BMS laeuft
#SoC, Ladezustand, A/2.55, Prozent
result = get_uds('22','028C')
if(len(result)==2):
    result = int(result, base=16) / 2.55
    result = "{:.1f}".format(result)
    print ("SOC: "+result)
    mqttMsgs.append(("eUp/HVBMS/SoC", result, 0, False))
else:
    success=False


#HV Battery voltage, Spannung der Hochvolt-Batterie, (A*256+B)/4, Volt
result = get_uds('22','1E3B')
if(len(result)==4):
    result = int(result, base=16) / 4
    result = "{:.1f}".format(result)
    print ("HV Battery voltage: "+result)
    mqttMsgs.append(("eUp/HVBMS/HVbattVoltage", result, 0, False))
else:
    success=False


#HV Battery cell number with highest voltage, 2 Byte Zellspannung, 2 Byte Cell Nummer
result = get_uds('22','1E33')
if(len(result)==8):
   voltage = "{:.2f}".format( int(result[0:4], base=16) / 4096 )
   cellNumber = int(result[4:8], base=16)
   cellNumber = "{:d}".format(cellNumber)     
   print ("HV Battery cell number "+cellNumber+" with highest voltage: "+voltage)
   mqttMsgs.append(("eUp/HVBMS/CellVoltageHighest", voltage, 0, False))
   mqttMsgs.append(("eUp/HVBMS/CellVoltageHighestNr", cellNumber, 0, False))
else:
   success=False

#HV Battery cell number with lowest voltage, 2 Byte Zellspannung, 2 Byte Cell Nummer
result = get_uds('22','1E34')
if(len(result)==8):
   voltage = "{:.2f}".format( int(result[0:4], base=16) / 4096 )
   cellNumber = int(result[4:8], base=16)
   cellNumber = "{:d}".format(cellNumber)     
   print ("HV Battery cell number "+cellNumber+" with lowest voltage: "+voltage)
   mqttMsgs.append(("eUp/HVBMS/CellVoltageLowest", voltage, 0, False))
   mqttMsgs.append(("eUp/HVBMS/CellVoltageLowestNr", cellNumber, 0, False))
else:
   success=False


#HV Battery HV Battery max temp and temp point, 2 Byte Temperatur, 2 Byte Cell Nummer
result = get_uds('22','1E0E')
if(len(result)==8):
   temperature = "{:.2f}".format( int(result[0:4], base=16) / 64 )
   cellNumber = int(result[4:8], base=16)
   cellNumber = "{:d}".format(cellNumber)     
   print ("HV Battery max Temp "+cellNumber+" with highest temperature: "+temperature+" °C")
   mqttMsgs.append(("eUp/HVBMS/ModulTemperatureHighest", temperature, 0, False))
   mqttMsgs.append(("eUp/HVBMS/ModulTemperatureHighestNr", cellNumber, 0, False))
else:
   success=False
   
#HV Battery HV Battery min temp and temp point, 2 Byte Temperatur, 2 Byte Cell Nummer
result = get_uds('22','1E0F')
if(len(result)==8):
   temperature = "{:.2f}".format( int(result[0:4], base=16) / 64 )
   cellNumber = int(result[4:8], base=16)
   cellNumber = "{:d}".format(cellNumber)     
   print ("HV Battery min Temp "+cellNumber+" with lowest temperature: "+temperature+" °C")
   mqttMsgs.append(("eUp/HVBMS/ModulTemperatureLowest", temperature, 0, False))
   mqttMsgs.append(("eUp/HVBMS/ModulTemperatureLowestNr", cellNumber, 0, False))
else:
   success=False



#send by MQTT to fhem
#{'topic':"<topic>", 'payload':"<payload>", 'qos':<qos>, 'retain':<retain>}
#qos: At most once (0), At least once (1), Exactly once (2).
#retain: Retained messages help newly-subscribed clients get a status update immediately after they subscribe to a topic.
# auf False, da sonst ei fhem neustart die alten SoC-Werte verwendet werden und nicht die Ladezeitabhaengigen seither
if(success):
    print("send MQTT message")
    #tuple, then it must be of the form: ("<topic>", "<payload>", qos, retain)
    publish.multiple(mqttMsgs, hostname="localhost", port=1883, client_id="", keepalive=60,
                     will=None, auth=None, tls=None, transport="tcp")
else:
    print("Errors found, no MQTT message send")




karpate

Hallo zusammen,
für PV-Überschuss sollte 'set amp_current' oder 'set amp_current_eeprom' verwendet werden. Ich tippe auf erstes. Eine kurze Bestätigung wäre nett.
Danke und Gruss
# Pi3 (BBB;FB7390)
# TCM310, CUL V4, HM-CFG-LAN,JeeLink,Tradfri,ESP32-Cam@MQTT: Wasseruhr

blueberry63

Hallo,

ich habe jetzt nicht den kompletten Thread gelesen und möge es mir nachsehen, falls es schon jemand geschrieben hat: für das Laden mit PV-Überschuss habe ich neben FHEM einen Raspi mit "OpenWB" laufen. Hier haben sie schon jahrelange Erfahrung mit der Steuerung von Wallboxen (auch natürlich die eigene HW) und es gibt viele Module für die SoC-Abfrage (man muss das Rad ja nicht immer nochmal erfinden).

Gruß
Blueberry63
FHEM auf BBB mit Wheezy: 1x CUL_HM_HM_SCI_3_FM, 1x INSTAR CAM3010, 1x HM-LC-SW1-PL2, 1x HM-LC-Bl1PBU-FM, 1x HM-Sen-MDIR-O, Viessmann Heizung, Gaszähler via GPIO, Klingel via HM-LC-Bl1PBU-FM an FBox, Mailcheck, AVR, XBMC, NanoCUL 433+668 an Raspi per Ethernet, Funksteckdosen (Pollin, IT), Automower

Albatros_

Zitat von: karpate am 02 März 2022, 06:59:01
Hallo zusammen,
für PV-Überschuss sollte 'set amp_current' oder 'set amp_current_eeprom' verwendet werden. Ich tippe auf erstes. Eine kurze Bestätigung wäre nett.
Danke und Gruss

Du solltest ,,set_current" verwenden. Ohne den Eeprom zusatz. Sonst wird der Wert jedesmal in das Eeprom gespeichert. Dieses ist aber nur begrenzt beschreibbar und funktioniert dann nicht mehr zuverlässig.

karpate

# Pi3 (BBB;FB7390)
# TCM310, CUL V4, HM-CFG-LAN,JeeLink,Tradfri,ESP32-Cam@MQTT: Wasseruhr

Chris_XXX

Zitat von: blueberry63 am 03 März 2022, 11:33:43
Hallo,

ich habe jetzt nicht den kompletten Thread gelesen und möge es mir nachsehen, falls es schon jemand geschrieben hat: für das Laden mit PV-Überschuss habe ich neben FHEM einen Raspi mit "OpenWB" laufen. Hier haben sie schon jahrelange Erfahrung mit der Steuerung von Wallboxen (auch natürlich die eigene HW) und es gibt viele Module für die SoC-Abfrage (man muss das Rad ja nicht immer nochmal erfinden).

Gruß
Blueberry63

Wenn du "nur" das Auto laden willst ist das ok. Wenn du aber mehr "Sachen" steuern willst brauchst du wohl eine andere Lösung. Ich steure z.B. meine Wärmepumpe, Poolpumpe und auch andere Verbraucher abhängig vom PV Ertrag. Weiß nicht ob das "OpenWB" auch kann.

VG
Chris

BOFH

Wie ist denn der Status zum Phasen umschalten via Modul?
Wird das noch eingebaut?

Issue/Request via git?
RasPi 4
ZWave.me ZME_UZB (Fibaro Auge Gen.2)/ HM-USB2 (Thermostat | Hutschienen Relais | 1-/2fach Schalter) / Enigma2 / PhilipsTV / Philips HUE (GO|Bulb|Stripe (plus)) / Somfy IO Rollos / BOSCH HSG636XS6 / SONOS (P1, P3, P5 2.Gen, SUB, Bar)

Sany

@thomas1971

Moin,
ZitatIch hole mir den State of Charge SoC von unserem VW eUP mit einem WLAN fähigen OBD2 Adapter raus (CarTrend Mini OBD). Kostet fast gar nichts und ist nicht abhängig von irgendwelchen Android Händis, WallBoxen etc, nur WLAN.

wie greiftst Du auf den zu?
Steckt der immer im Auto?


Gruß

Sany
fhem auf Zotac ZBox nano als LXC auf Proxmox, weitere LXC mit ZigBee2MQTT, MariaDB und Grafana. Homematic, FS20, mySensors, MQTT2, Tasmota, Shelly, Z-Wave  ....

isy

Hallo zusammen,
ich habe heute meine WB Version CM-03 bekommen und bin am Testen.

Anbindung per MQTT läuft. Allerdings erfolgt das Update 1* pro Sekunde, dass brauche ich aktuell nicht. Also MQTT erstmal in der App deaktiviert.

Die Einbindung über das FHEM Modul macht leider Probleme, siehe FM "JSON error" in den Readings :
Internals:
   DEF        192.168.178.98
   FUUID      623af6b5-f33f-27cb-3b16-7a945a3aa5b385a9
   HOST       192.168.178.98
   INTERVAL   60
   NAME       myGoE
   NOTIFYDEV  global
   NR         1135
   NTFY_ORDER 50-myGoE
   STATE      state
KW_charging_measured kW
   TYPE       GoECharger
   USED_API_KEYS al2 ust al1 rn9 ecd ec8 afi cid wst cdi loe uby car lon rne tds lch mck mcp nmo ec1 rc6 lof amt lot wke tme lbr rcr rn1 r1x mcs dwo aho rc5 rn8 mcu rc7 dto pha rc4 rca ec9 dws sse tof wak fwv tmp lom ec4 mcc eca rc9 ec5 wen rbc tma ec7 al5 al3 upd adi err al4 stp azo ecr rn6 cfi sch rnm txi rbt eto lop nrg ec6 rc1 amp cbl ast loa ama version sdp mce log alw cch rc8 rn5 wss rn7 rn4 rna rcd lse
   VERSION    0.2.2
   ActionQueue:
   OLDREADINGS:
   READINGS:
     2022-03-23 12:31:15   Http_state      JSON error
     2022-03-23 12:31:15   JSON Error      malformed JSON string, neither tag, array, object, number, string or atom, at character offset 0 (before "This URI does not ex...") at ./FHEM/46_GoECharger.pm line 791.

   hmccu:
Attributes:
   devStateIcon disabled.*:ev_car_charger@darkgrey not_allowed.*:ev_car_charger@white ready_no_car.*:ev_car_charger@blue charging.*:ev_car_charger@darkorange waiting_for_car.*:ev_car_charger@pink finished.*:ev_car_charger@lime error.*:ev_car_charger@red
   event-on-change-reading .*
   event-on-update-reading state
   eventMap   /allow_charging 1:on/ /allow_charging 0:off/
   interval   60
   kW_measured_corr_value 1.00
   room       Energie
   stateFormat state
KW_charging_measured kW
   used_api_keys all
   webCmd     on:off

In der App ist die "lokale HTTP API v2" aktiviert.

Fehlt noch irgendwas?


Vielen Dank,
Helmut

Ein Weg wird erst zu einem Weg, wenn man ihn geht

isy

Vielen  Dank für das Modul!

OK, ich habe jetzt die API V1 aktiviert, damit kommen die Daten. Ich glaube es macht Sinn, alle Einstellungs-Notwendigkeiten ins Git oder in den 1. Beitrag hier im Thread aufzunehmen.

1. Wunsch: Wäre es möglich das Modul auf die V2 anzupassen?
2. Wunsch: Da es noch einige Zeit dauert, bis mein E-Auto kommt, habe ich die Go-E Box vom Netz getrennt. Dadurch wird jede Minute eine FM GoECharger (ga_myGoE) - RequestERROR: 192.168.178.98: Keine Route zum Zielrechner (113) ins Log geschrieben.
Schön (in diesem Test-Zusammenhang) wäre es, wenn man die Wallbox über ein "set enable oder set disable", ähnlich wie beim DOIF Modul, temporär deaktivieren könnte.


VG Helmut
Ein Weg wird erst zu einem Weg, wenn man ihn geht

isy

Ich habe jetzt die WB auf verbose 0 gesetzt. Es gibt dadurch keine Log-Einträge mehr.
Das Pollen geht  jedoch weiter, daher habe ich das Att interval auch hoch gesetzt.
Das ist erstmal ein guter Workaround, denke ich.
Bessere Ideen sind willkommen!
Ein Weg wird erst zu einem Weg, wenn man ihn geht

BOFH

attr ga_myGoE disable 1
Ist im Modul doch möglich. Ob man dafür extra ein setter braucht?

Eine Anbindung an v2 für Zukunft wäre nice. +1.
Und oder schon mal die Phasenumschaltung die auch in v1 gehen sollte ?!
RasPi 4
ZWave.me ZME_UZB (Fibaro Auge Gen.2)/ HM-USB2 (Thermostat | Hutschienen Relais | 1-/2fach Schalter) / Enigma2 / PhilipsTV / Philips HUE (GO|Bulb|Stripe (plus)) / Somfy IO Rollos / BOSCH HSG636XS6 / SONOS (P1, P3, P5 2.Gen, SUB, Bar)