[gelöst] EAuto MgMotor MG4 SAIC mit MQTT

Begonnen von andi11, 09 Juni 2023, 16:55:40

Vorheriges Thema - Nächstes Thema

clumsy

Hallo Rudolf

Danke für die prompte Antwort, aber ich bekomms nicht hin, ich finde auch nicht wo der Fehler ist.. Im Log zeigts mir den ganzen Payload an aber im Reading kommt immer nur:
2025-10-30 12:17:28   batteryHeatingSchedule {
Alles nach der ersten '{' fehlt..

Ich hab auch schon versucht im Perl Modul die Newlines ('\R's) raus zu filtern, aber es passiert das selbe... bin echt ratlos...

Und wenn ichs durch ein json2nameValue jage, bekomme ich den Fehler, dass er kein closing } findet...

rudolfkoenig

ZitatIch hab auch schon versucht im Perl Modul die Newlines ('\R's) raus zu filtern, aber es passiert das selbe...
\r ist Carriage-Returrn, und kommt in der Zeile nicht vor, wie man es in deiner Logzeile sieht (da gibts nur Newline \n):
MQTT2_FHEM_Client: dispatch autocreate=simple\000fhem_second\000saic/<username>/vehicles/<VIN>/drivetrain/batteryHeatingSchedule\000{\n  "mode": "off",\n  "startTime": "00:00"\n}
Damit deine readingsList Zeile funktioniert muss das devicetopic Attribut auf saic/<username>/vehicles/<VIN> gesetzt sein.
Das hat bei mir ohne Weiteres auch funktioniert.
Die Version mit json2nameValue erzeugt zwei Events, die ohne nur ein Event:
fhem> info timer
fhem> 2025-10-31 15:42:59 MQTT2_SERVER m2s nrclients: 1
2025-10-31 15:42:59 MQTT2_DEVICE test batteryHeatingSchedule: {
  "mode": "off",
  "startTime": "00:00"
}
Womoeglich kommt deine Auswertefunktion damit nicht zurecht.

clumsy

Also ich meine "\R" (gross geschrieben) ist ein Makro welches alle \n, \r oder kombinationen davon rausfiltert (wenn ich die Doku richtig verstanden habe)... Das scheint gem. Log auch zu funktionieren.

Ja, das attribut devicetopic ist genau so gesetzt.

Ich lese ja auch dutzende von Werten aus, welche alle funktionieren, ausser eben die die mehrzeilig sind, ausser abrp, da kommt das JSON einzeilig und funktioniert auch.. (der Vollständigkeithalber meine device config noch im Anhang)...

Welche Auswertefunktion? Ich setze ja nur das Reading?!

Schonmal Danke für Deine Hilfe und Zeit...

Gruss aus der CH, STefan

define MQTT2_saic_mg_cyberster MQTT2_DEVICE mg_cyberster
setuuid MQTT2_saic_mg_cyberster 68f24ece-f33f-654d-c4ef-6e3708b230b0ef72
attr MQTT2_saic_mg_cyberster userattr st_deviceHealth st_deviceHealth_map structexclude zigbee zigbee_map
attr MQTT2_saic_mg_cyberster DbLogExclude state,STATE
attr MQTT2_saic_mg_cyberster IODev MQTT2_FHEM_Client
attr MQTT2_saic_mg_cyberster alias MG Cyberster
attr MQTT2_saic_mg_cyberster autocreate 1
attr MQTT2_saic_mg_cyberster devStateIcon .*[0-9.]*C::noFhemwebLink .*[0-9]+km.*::noFhemwebLink .*[0-9]+Min::noFhemwebLink \
  .*UNPLUGGED.*:car_in@00FF00:noFhemwebLink .*CHARGING.*:car_in@FFFF00:noFhemwebLink .*Stopped.*:car_stopped@FF0000:noFhemwebLink \
  .*CHARGE_DONE.*:car_in@0000FF:noFhemwebLink disabled:car_in@AAAAAA:noFhemwebLink \
  ^[0-2]%$:measure_battery_0_blink@FF0000:noFhemwebLink ^[3-9]%$:measure_battery_0@FF0000:noFhemwebLink ^[1-2].%$:measure_battery_25@FB5909:noFhemwebLink \
  ^[3-5].%$:measure_battery_50@FFFF00:noFhemwebLink ^[6-8].%$:measure_battery_75@42BC0A:noFhemwebLink ^([9].|100)%$:measure_battery_100@00FF00:noFhemwebLink \
  offline:message_attention@FF0000 .*href.*::noFhemwebLink .*:unknown@0000FF:noFhemwebLink
attr MQTT2_saic_mg_cyberster devicetopic saic/<username>/vehicles/<VIN>
attr MQTT2_saic_mg_cyberster event-min-interval .*:300
attr MQTT2_saic_mg_cyberster event-on-change-reading .*
attr MQTT2_saic_mg_cyberster fp_UG_neu 657,909,5,MQTT2_saic_mg_cyberster,
attr MQTT2_saic_mg_cyberster group Auto
attr MQTT2_saic_mg_cyberster icon car_in
attr MQTT2_saic_mg_cyberster oldreadings powerUsageSinceLastCharge
attr MQTT2_saic_mg_cyberster periodicCmd inActiveDefault:720
attr MQTT2_saic_mg_cyberster readingList $DEVICETOPIC/available:.* { { availability=>json2nameValue($EVENT)->{state} } }\
  $DEVICETOPIC/bms/chargeStatus:.* chargeStatus\
  $DEVICETOPIC/ccu/offboardChargerPlugStatus:.* offboardChargerPlugStatus\
  $DEVICETOPIC/ccu/onboardChargerPlugStatus:.* onboardChargerPlugStatus\
  $DEVICETOPIC/climate/exteriorTemperature:.* exteriorTemperature\
  $DEVICETOPIC/climate/heatedSeatsFrontLeftLevel:.* heatedSeatsFrontLeftLevel\
  $DEVICETOPIC/climate/heatedSeatsFrontRightLevel:.* heatedSeatsFrontRightLevel\
  $DEVICETOPIC/climate/interiorTemperature:.* interiorTemperature\
  $DEVICETOPIC/climate/rearWindowDefrosterHeating:.* rearWindowDefrosterHeating\
  $DEVICETOPIC/climate/remoteClimateState:.* remoteClimateState\
  $DEVICETOPIC/climate/remoteTemperature:.* remoteTemperature\
  $DEVICETOPIC/doors/bonnet:.* bonnet\
  $DEVICETOPIC/doors/boot:.* boot\
  $DEVICETOPIC/doors/driver:.* driver\
  $DEVICETOPIC/doors/locked:.* locked\
  $DEVICETOPIC/doors/passenger:.* passenger\
  $DEVICETOPIC/doors/rearLeft:.* rearLeft\
  $DEVICETOPIC/doors/rearRight:.* rearRight\
  $DEVICETOPIC/drivetrain/auxiliaryBatteryVoltage:.* auxiliaryBatteryVoltage\
  $DEVICETOPIC/drivetrain/batteryHeating:.* batteryHeating\
  $DEVICETOPIC/drivetrain/batteryHeatingSchedule:.* { json2nameValue($EVENT,'batteryHeatingSchedule_') }\
  $DEVICETOPIC/drivetrain/batteryHeatingStopReason:.* batteryHeatingStopReason\
  $DEVICETOPIC/drivetrain/chargeCurrentLimit:.* chargeCurrentLimit\
  $DEVICETOPIC/drivetrain/chargerConnected:.* chargerConnected\
  $DEVICETOPIC/drivetrain/chargingCableLock:.* chargingCableLock\
  $DEVICETOPIC/drivetrain/charging:.* charging\
  $DEVICETOPIC/drivetrain/charging/lastEnd:.* lastEnd\
  $DEVICETOPIC/drivetrain/chargingSchedule:.* { json2nameValue($EVENT,'chargingSchedule_') }\
  $DEVICETOPIC/drivetrain/chargingStopReason:.* chargingStopReason\
  $DEVICETOPIC/drivetrain/chargingType:.* chargingType\
  $DEVICETOPIC/drivetrain/current:.* current\
  $DEVICETOPIC/drivetrain/currentJourney:.* { json2nameValue($EVENT,'currentJourney_') }\
  $DEVICETOPIC/drivetrain/fossilFuel/percentage:.* percentage\
  $DEVICETOPIC/drivetrain/fossilFuel/range:.* range\
  $DEVICETOPIC/drivetrain/hvBatteryActive:.* hvBatteryActive\
  $DEVICETOPIC/drivetrain/hybrid_electrical_range:.* hybrid_electrical_range\
  $DEVICETOPIC/drivetrain/lastChargeEndingPower:.* lastChargeEndingPower\
  $DEVICETOPIC/drivetrain/mileage:.* mileage\
  $DEVICETOPIC/drivetrain/mileageOfTheDay:.* mileageOfTheDay\
  $DEVICETOPIC/drivetrain/mileageSinceLastCharge:.* mileageSinceLastCharge\
  $DEVICETOPIC/drivetrain/power:.* power\
  $DEVICETOPIC/drivetrain/powerUsageOfDay:.* powerUsageOfDay\
  $DEVICETOPIC/drivetrain/powerUsageSinceLastCharge:.* powerUsageSinceLastCharge\
  $DEVICETOPIC/drivetrain/range:.* range\
  $DEVICETOPIC/drivetrain/remainingChargingTime:.* remainingChargingTime\
  $DEVICETOPIC/drivetrain/running:.* running\
  $DEVICETOPIC/drivetrain/soc_kwh:.* soc_kwh\
  $DEVICETOPIC/drivetrain/soc:.* soc\
  $DEVICETOPIC/drivetrain/socTarget:.* socTarget\
  $DEVICETOPIC/drivetrain/totalBatteryCapacity:.* totalBatteryCapacity\
  $DEVICETOPIC/drivetrain/voltage:.* voltage\
  $DEVICETOPIC/info/brand:.* brand\
  $DEVICETOPIC/info/color:.* color\
  $DEVICETOPIC/info/configuration/AC:.* AC\
  $DEVICETOPIC/info/configuration/Airbag:.* Airbag\
  $DEVICETOPIC/info/configuration/AirbagS:.* AirbagS\
  $DEVICETOPIC/info/configuration/Battery:.* Battery\
  $DEVICETOPIC/info/configuration/BATTERY:.* BATTERY\
  $DEVICETOPIC/info/configuration/BHI:.* BHI\
  $DEVICETOPIC/info/configuration/BONNUT:.* BONNUT\
  $DEVICETOPIC/info/configuration/BOOT:.* BOOT\
  $DEVICETOPIC/info/configuration/BTKEY:.* BTKEY\
  $DEVICETOPIC/info/configuration/BType:.* BType\
  $DEVICETOPIC/info/configuration/DOOR:.* DOOR\
  $DEVICETOPIC/info/configuration/ENERGY:.* ENERGY\
  $DEVICETOPIC/info/configuration/ENGINE:.* ENGINE\
  $DEVICETOPIC/info/configuration/EPS:.* EPS\
  $DEVICETOPIC/info/configuration/EV:.* EV\
  $DEVICETOPIC/info/configuration/EXTEMP:.* EXTEMP\
  $DEVICETOPIC/info/configuration/FAirbag:.* FAirbag\
  $DEVICETOPIC/info/configuration/HeatedSeat:.* HeatedSeat\
  $DEVICETOPIC/info/configuration/INTEMP:.* INTEMP\
  $DEVICETOPIC/info/configuration/J17:.* J17\
  $DEVICETOPIC/info/configuration/KEYPOS:.* KEYPOS\
  $DEVICETOPIC/info/configuration/LRD:.* LRD\
  $DEVICETOPIC/info/configuration/Q00:.* Q00\
  $DEVICETOPIC/info/configuration/Q01:.* Q01\
  $DEVICETOPIC/info/configuration/Q09:.* Q09\
  $DEVICETOPIC/info/configuration/Remote.control:.* Remote_control\
  $DEVICETOPIC/info/configuration/ROV:.* ROV\
  $DEVICETOPIC/info/configuration/S35:.* S35\
  $DEVICETOPIC/info/configuration/S61:.* S61\
  $DEVICETOPIC/info/configuration/SA64:.* SA64\
  $DEVICETOPIC/info/configuration/SBH:.* SBH\
  $DEVICETOPIC/info/configuration/SL:.* SL\
  $DEVICETOPIC/info/configuration/Sunroof:.* Sunroof\
  $DEVICETOPIC/info/configuration/T11:.* T11\
  $DEVICETOPIC/info/configuration/Tire:.* Tire\
  $DEVICETOPIC/info/configuration/WINDOW:.* WINDOW\
  $DEVICETOPIC/info/lastMessage/content:.* messageContent\
  $DEVICETOPIC/info/lastMessage/messageId:.* _messageId\
  $DEVICETOPIC/info/lastMessage/messageTime:.* messageTime\
  $DEVICETOPIC/info/lastMessage/messageType:.* messageType\
  $DEVICETOPIC/info/lastMessage/sender:.* messageSender\
  $DEVICETOPIC/info/lastMessage/status:.* messageStatus\
  $DEVICETOPIC/info/lastMessage/title:.* messageTitle\
  $DEVICETOPIC/info/lastMessage/vin:.* messageVin\
  $DEVICETOPIC/info/model:.* model\
  $DEVICETOPIC/info/series:.* series\
  $DEVICETOPIC/info/year:.* year\
  $DEVICETOPIC/_internal/abrp:.* { json2nameValue($EVENT,'abrp_') }\
  $DEVICETOPIC/_internal/configuration/raw:.* raw\
  $DEVICETOPIC/lights/dippedBeam:.* dippedBeam\
  $DEVICETOPIC/lights/mainBeam:.* mainBeam\
  $DEVICETOPIC/lights/side:.* side\
  $DEVICETOPIC/location/elevation:.* elevation\
  $DEVICETOPIC/location/heading:.* heading\
  $DEVICETOPIC/location/latitude:.* latitude\
  $DEVICETOPIC/location/longitude:.* longitude\
  $DEVICETOPIC/location/position:.* { json2nameValue($EVENT,'position_') }\
  $DEVICETOPIC/location/speed:.* speed\
  $DEVICETOPIC/obc/current:.* current\
  $DEVICETOPIC/obc/powerSinglePhase:.* powerSinglePhase\
  $DEVICETOPIC/obc/powerThreePhase:.* powerThreePhase\
  $DEVICETOPIC/obc/voltage:.* voltage\
  $DEVICETOPIC/refresh/lastActivity:.* lastActivity\
  $DEVICETOPIC/refresh/lastChargeState:.* lastChargeState\
  $DEVICETOPIC/refresh/lastError:.* lastError\
  $DEVICETOPIC/refresh/lastVehicleState:.* lastVehicleState\
  $DEVICETOPIC/refresh/mode:.* mode\
  $DEVICETOPIC/refresh/period/active:.* active\
  $DEVICETOPIC/refresh/period/afterShutdown:.* afterShutdown\
  $DEVICETOPIC/refresh/period/error:.* error\
  $DEVICETOPIC/refresh/period/inActiveGrace:.* inActiveGrace\
  $DEVICETOPIC/refresh/period/inActive:.* inActive\
  $DEVICETOPIC/tyres/frontLeftPressure:.* frontLeftPressure\
  $DEVICETOPIC/tyres/frontRightPressure:.* frontRightPressure\
  $DEVICETOPIC/tyres/rearLeftPressure:.* rearLeftPressure\
  $DEVICETOPIC/tyres/rearRightPressure:.* rearRightPressure\
  $DEVICETOPIC/windows/driver:.* driver\
  $DEVICETOPIC/windows/passenger:.* passenger\
  $DEVICETOPIC/windows/rearLeft:.* rearLeft\
  $DEVICETOPIC/windows/rearRight:.* rearRight\
  $DEVICETOPIC/windows/sunRoof:.* sunRoof
attr MQTT2_saic_mg_cyberster room Garage
attr MQTT2_saic_mg_cyberster setList socTarget:knob,min:40,max:100,width:40,height:40,step:10,lineCap:round,angleOffset:200,angleArc:320,cursor:false,thickness:.2,fgColor:#FFFF00,bgColor:#00FF00,inputColor:#FFFF00,readOnly:false,dataUnit:% $DEVICETOPIC/drivetrain/socTarget/set $EVTPART1\
  remoteTemperature:selectnumbers,15,1,30,0,lin $DEVICETOPIC/climate/remoteTemperature/set $EVTPART1\
  remoteClimateState:on,off,front,blowingonly $DEVICETOPIC/climate/remoteClimateState/set $EVTPART1\
  heatedSeatsFrontLeftLevel:selectnumbers,0,1,3,0,lin $DEVICETOPIC/climate/heatedSeatsFrontLeftLevel/set $EVTPART1\
  heatedSeatsFrontRightLevel:selectnumbers,0,1,3,0,lin $DEVICETOPIC/climate/heatedSeatsFrontRightLevel/set $EVTPART1\
  rearWindowDefrosterHeating:on,off $DEVICETOPIC/climate/rearWindowDefrosterHeating/set $EVTPART1\
  charging:True,False $DEVICETOPIC/drivetrain/charging/set $EVTPART1\
  batteryHeating:True,False $DEVICETOPIC/drivetrain/batteryHeating/set $EVTPART1\
  chargeCurrentLimit:6A,8A,16A,Max $DEVICETOPIC/drivetrain/chargeCurrentLimit/set $EVTPART1\
  findMyCar:activate,lights_only,horn_only,stop $DEVICETOPIC/location/findMyCar/set $EVTPART1\
  mode:periodic,off,force $DEVICETOPIC/refresh/mode/set $EVTPART1\
  active:selectnumbers,10,10,900,0,lin $DEVICETOPIC/refresh/period/active/set $EVTPART1\
  inActive:selectnumbers,3600,3600,86400,0,lin $DEVICETOPIC/refresh/period/inActive/set $EVTPART1\
  inActiveDefault:noarg $DEVICETOPIC/refresh/period/inActive/set 7200\
  afterShutdown:selectnumbers,60,60,3600,0,lin $DEVICETOPIC/refresh/period/afterShutdown/set $EVTPART1\
  inActiveGrace:selectnumbers,60,60,3600,0,lin $DEVICETOPIC/refresh/period/inActiveGrace/set $EVTPART1\
  soc:knob,min:0,max:100,width:40,height:40,step:1,lineCap:round,angleOffset:200,angleArc:320,cursor:false,thickness:.2,fgColor:#FFFF00,bgColor:#00FF00,inputColor:#FFFF00,readOnly:true,dataUnit:% {}
attr MQTT2_saic_mg_cyberster stateFormat { if (AttrVal("$name", "disable", 0) ne 0) { "disabled" } else { '<a href="http://maps.google.com/maps/?q='. ReadingsVal($name, "latitude", 0) . "," . ReadingsVal($name, "longitude", 0) . '"target="_blank">' . "\n<br>" . ReadingsVal("$name", "chargeStatus", "")."\n</a><br>".round(ReadingsVal("$name", "range", 0),0)."km\n<br>".round(ReadingsVal("$name", "exteriorTemperature", 0),0)."°C/".round(ReadingsVal("$name", "interiorTemperature", 0),0)."°C\n<br>".(ReadingsVal("$name", "charging", "False") eq "False"? ReadingsVal("$name", "averageConsumption",0):round(-ReadingsVal("$name", "power", 0)/(ReadingsVal("$name", "powerUsageSinceLastCharge", 20)>0?ReadingsVal("$name", "powerUsageSinceLastCharge", 20):20)*100,0))."km/h"}}
attr MQTT2_saic_mg_cyberster userReadings averageConsumption:soc.* {return -1*round(ReadingsVal($name,"soc",0)*ReadingsVal($name,"totalBatteryCapacity",74.4)/ReadingsVal($name,"range",1),1)}, \
  googleMaps:(lati|longi)tude.* {return('<html><a href="http://maps.google.com/maps/?q='. ReadingsVal($name, "latitude", 0) . "," . ReadingsVal($name, "longitude", 0) . '"target="_blank">Google Maps</a></html>')}, \
  geoURI:(lati|longi)tude.* {return('<html><a href="geo:<'. ReadingsVal($name, "latitude", 0) . ">,<" . ReadingsVal($name, "longitude", 0) . ">?q=<" . ReadingsVal($name, "latitude", 0) . ">,<" . ReadingsVal($name, "longitude", 0) . '">GEO URI</a></html>')}
attr MQTT2_saic_mg_cyberster verbose 3
attr MQTT2_saic_mg_cyberster webCmd soc:socTarget
attr MQTT2_saic_mg_cyberster widgetOverride soc:knob,min:0,max:100,width:40,height:40,step:1,lineCap:round,angleOffset:200,angleArc:320,cursor:false,thickness:.2,fgColor:#FFFF00,bgColor:#FF0000,inputColor:#FFFF00,readOnly:true,dataUnit:%


rudolfkoenig

Ich habe die komplette Definition uebernommen, devicereading angepasst, und das obige mosquitto_pub mit angepassten topic abgeschickt.
Ich sehe kein Problem, die Detailseite im Anhang.

clumsy

#19
Hallo Rudi

Erstmal vielen Dank nochmals dass Du Dich so bemühst... Ich bin echt ratlos...

Ich kann mir einzig noch vorstellen, dass ein "undruckbares" Zeichen noch dazwischen ist, da mir aufgefallen ist, dass zwischen der { und dem ersten Zeichen 2 Leerschläge sind. Der Hexdump zeigt folgendes:
000000 7b 0a 20 20 22 6d 6f 64 65 22 3a 20 22 6f 66 66  >{.  "mode": "off<
000010 22 2c 0a 20 20 22 73 74 61 72 74 54 69 6d 65 22  >",.  "startTime"<
000020 3a 20 22 30 30 3a 30 30 22 0a 7d 0a              >: "00:00".}.<
00002c

Nur fällt mir auch hier nichts auf...

Ich sehe dass es bei dir klappt, aber nicht wieso's bei mir nicht geht...

Der zusätzliche Debug den ich ins Modul Zeile 187 eingebaut hab
Log3 $dev, 4, "MQTT2_DEVICE_Parse_2: $dev $topic => $code : $value";

zeigt mir:
MQTT2_DEVICE_Parse_2: MQTT2_saic_mg_cyberster saic/<username>/vehicles/<VIN>/drivetrain/batteryHeatingSchedule => { json2nameValue($EVENT,'batteryHeatingSchedule_') } : {  "mode": "off",  "startTime": "00:00"}

Was aus meiner Sicht OK ist und trotzdem bringt json2nameValue ein "Missing }" (PS: das ist die Version ohne Newlines)..

Sind die Leerschläge ein Problem? Oder was überseh ich? Gibt es Einstellungen im MQTT2_Device die das Parsen ändern?

Nachtrag: wenn ich selbst mit mosquitto_pub die payload sende, funktionierts... wenn die payload vom saic-gateway kommt, gibts ein fehler?!

EDIT2: Von Zeit zu Zeit erhalte ich ein Fehler wenn ich mit mosquitto_pub die payload sende:
MQTT2_DEVICE MQTT2_saic_mg_cyberster batteryHeatingSchedule_startTime: 00:00
MQTT2_DEVICE MQTT2_saic_mg_cyberster batteryHeatingSchedule_mode: off
MQTT2_DEVICE MQTT2_saic_mg_cyberster json2nameValueErrorText: json2nameValue: no closing } found
MQTT2_DEVICE MQTT2_saic_mg_cyberster json2nameValueInput: {

rudolfkoenig

ZitatSind die Leerschläge ein Problem? Oder was überseh ich? Gibt es Einstellungen im MQTT2_Device die das Parsen ändern?
Eigentlich sollte die json2nameValue Funktion die Readings json2nameValueErrorText und json2nameValueInput fuellen, wenn es mit dem Parsen nicht weiterkommt.
Bei dir gibts aber keine Fehler, es wird stattdessen ein (nicht bestelltes) Reading mit dem Namen batteryHeatingSchedule gefuellt.
Als ob ein anderes Regel gelten wuerde.

Kannst Du bitte das verbose Attribut fuer MQTT2_saic_mg_cyberster auf 4 setzen, und beim Empfang der Nachricht im Log nach MQTT2_DEVICE_Parse suchen?

clumsy

Ich hatts auf MQTT2_DEVICE_Parse_2 umbenannt, da ich die payload ($value) noch dazu genommen hatte (s.oben).

Verbose 5 Log:
2025.10.31 20:04:35 4: MQTT2_DEVICE_Parse_2: MQTT2_saic_mg_cyberster saic/<username>/vehicles/<VIN>/drivetrain/batteryHeatingSchedule => { json2nameValue($EVENT,'batteryHeatingSchedule_') } : {
  "mode": "off",
  "startTime": "00:00"
}

Sieht m.E. gut aus..

clumsy

Wild guess: wenn ich die message nach ablauf der event-min-interval Zeit sende, kommt der Fehler.. (zumindest wenn die auf 600 ist)...