Tag zusammen,
bin gespannt, ob ich die richtige Sektion erwischt habe für das Thema. Mit geht's zwar um das Thema E-Auto Laden, aber der Hintergrund ist die Nutzung von PV-Strom. Also schon irgendwie verwand mit Solaranlagen.
Frage: Gibt's schon eine Anbindung an Hyundai Bluelink? Ich hab in der Suche und bei Google leider nix gefunden.
Was ich gefunden habe ist Bluelinky (https://github.com/Hacksore/bluelinky/). Da hat jemand die API gesnifft und ein Node.js-Tool geschrieben.
Mein Setup:
Ich habe ein PV mit Kostal-Komponenten. Die habe ich schon im FHEM hübsch drin und sehe, was ich sehen muss: Erzeugung, Gesamtverbrauch, Direktverbrauch, Netzbezug, Einspeisung.
Außerdem habe ich eine Wallbox (Heidelberg home eco). Diese kann ich über ein Homematic-Device freigeben oder blocken. Blöderweise habe ich zu spät gecheckt, dass ich nicht nur gerne Laden Start/Stop entscheiden würde, sondern auch den Ladestrom an Hand des PV-Überschusses regeln würde. Schöner Mist.
Mein Ziel: Nun zieht bei uns demnächst ein Hyundai Kona ein, den ich gerne auch im FHEM hätte. Den Ladestrom kann man über die Bluelink-APp leider nicht anpassen. Aber zumindest den SOC auslesen. Dann weiß ich zumindest wie dringend geladen werden muss.
Kann mir bitte jemand helfen? Ich hab keine Idee, wie ich das Bluelinky in FHEM nutzbar machen kann.
Danke euch im Voraus!!!
Moin,
ich stehe vor dem gleichen Problem. Mein Kona kommt im Januar und bereite gerade auch schon das PV basierte Laden vor. Ich habe meinen SENEC Speicher, den Kostal Piko in FHEM und werde mir wohl den go-e Charger besorgen. Dafür gibt es auch schon ein FHEM Modul. Um Das Problem mit dem Bluelink zu lösen habe ich gerade "evvc" in meinen Docker Container aufgesetzt. https://github.com/andig/evcc
Die Werte sende ich von FHEM über MQTT_GENERIC_BRIDGE an evcc.
Ich habe mir gerade mal das Projekt angeschaut das ist ja auch sehr cool da man dann sogar das Auto "fernsteuern" kann. Draußen ist es kalt und FHEM sagt dem Auto mach mal warm 8). Das versuche ich mal in NodeRed zu integrieren. Sieht vielversprechend aus.
Zitat von: xerion am 26 November 2020, 09:19:52
Ich habe mir gerade mal das Projekt angeschaut das ist ja auch sehr cool da man dann sogar das Auto "fernsteuern" kann. Draußen ist es kalt und FHEM sagt dem Auto mach mal warm 8). Das versuche ich mal in NodeRed zu integrieren. Sieht vielversprechend aus.
Ja, das mit dem warm machen war auch meine Idee. In nem DoIF morgens in der Woche für 7:30 bei Außentemp < 3°C oder so ;-)
Warum ich das Auto entriegeln können muss darüber, aber der Ladestrom oder die Ladegrenze nicht anpassbar ist, erschließt sich mir leider nicht.
Wenn du mich bisschen auf die Reise mitnimmst und erklärst, wie das am Ende geht, wäre ich Dir sehr dankbar. ;D
Laut App soll man zumindest die Ladegrenze einstellen können. Aber wenn du PV orientiert laden möchtest mach es ja wenig sein, das über das Auto zu steuern das sollte deine Wallbox dann übernehmen und genau das kannst du mit evcc lösen und laut dem Wiki wird deine WB auch unterstützt.
Ich denke ich werde das PV orientierte laden mit evcc lösen und die Fernsteuerung mit dem Bluelinky. Beides wird dann per MQTT an FHEM angebunden.
Sobald ich Zeit gefunden habe das in NodeRed zu testen melde ich mich wieder. Momentan habe ich ja das Auto noch nicht darum wird ein realer Test sehr schwierig.
Cool, der evcc hat sich auch den Code vom bluelinky geliehen. ;-)
Ne Anbindung an den Kostal Smart Meter bringt er mit.
Aber die Heidelberg home eco ist rotzdoof. Von alleine kann die gar nix. Nur an oder aus über einen potentialfreien Schaltkontakt.
Ansonsten hat die Heidelberg ein kleines Poti, um den Strom zu begrenzen. Da kommt man aber im Betrieb nicht ran. Hab schon überlegt nen kleinen Servo draufzusetzen oder das Poti auszulöten. Aber ist schon bisschen kribbelig, an ner neuen Box zumzulöten...
Das Schalten ansich hab ich schon über dem FHEM im Griff. Also bei >4KW Einspeisung schaltet er die Wallbox frei und bei 1kW Netzbezug wieder ab, um da mal eine kleine Hysterese zu haben. Zeitliche Puffer im DoIf bei ich noch ein, damit er nicht bei jedem Wölkchen togglet. Manuelles Überschreiben geht auch. Fehlt noch der Telegram-Dialog.
Das geht mit der 4kW-Grenze aber auch nur, wenn ich in der Box den Ladestrom auf minimal (= ~4kW) stelle. Wenn mehr Dampf vom Dach kommt, speißt er dann ein. Und wenn das Auto mal schneller laden soll ist das auch doof.
Mit dem go-e Charger haste da die bessere Wahl getroffen...👍
Kannst du nicht am besten eine eine neue WB kaufen, gerade mit der Förderung würdest du ja nichts verlieren.
Telegram kannst du auch über evcc lösen ich favorisiere aber lieber das über FHEM zu steuern.
Habe Bluelinky mehr oder weniger in NodeRed drin kann es nur nicht testen da ich keine VIN habe. Muss also auf das Auto warten, da einen Demo Zugang wie bei Siemens gibt es leider nicht.
Ja ich erhoffe mir auch viel vom go-e Charger. Gerade wenn man so Preis-/Leistung vergleicht. Habe den gerade bestellt kommt idealerweise passend zum Auto.
N'abend
Was das Auto betrifft bin ich schon einen Schritt weiter als ihr. Mein Kona steht seit dem 21.10.20 in der Garage :D
Die Wallbox von Pulsares ist auch installiert und funktioniert soweit ganz gut. Über einen selbstgeschriebenen Python Service kann ich nun die Wallbox auch per PWM ansteuern und somit 1 phasig von 5-24 A in 1A Schritten die Ladeleistung steuern. Das geht nun auch schon mehr schlecht als recht aus FHEM heraus, aber so wirklich rund wird es wohl erst wenn ich über Bluelink die notwendigen Infos vom Kona bekomme. Evcc scheint ja da eventuell ein brauchbarer Ansatz zu sein. Ich scheitere aber im Moment daran meine Wallbox richtig zu konfigurieren. Also falls ihr was zum testen bzgl. Bluelink hättet, ich hätte die Hardware hier stehen. Zumindest die meiste Zeit ;)
Zitat von: acw81 am 04 Dezember 2020, 00:53:32
N'abend
Was das Auto betrifft bin ich schon einen Schritt weiter als ihr. Mein Kona steht seit dem 21.10.20 in der Garage :D
Die Wallbox von Pulsares ist auch installiert und funktioniert soweit ganz gut. Über einen selbstgeschriebenen Python Service kann ich nun die Wallbox auch per PWM ansteuern und somit 1 phasig von 5-24 A in 1A Schritten die Ladeleistung steuern. Das geht nun auch schon mehr schlecht als recht aus FHEM heraus, aber so wirklich rund wird es wohl erst wenn ich über Bluelink die notwendigen Infos vom Kona bekomme. Evcc scheint ja da eventuell ein brauchbarer Ansatz zu sein. Ich scheitere aber im Moment daran meine Wallbox richtig zu konfigurieren. Also falls ihr was zum testen bzgl. Bluelink hättet, ich hätte die Hardware hier stehen. Zumindest die meiste Zeit ;)
Ich kann momentan nicht wirklich weiter unterstützen da mir noch Auto und Wallbox fehlen. Wenn ich Glück habe, bekomme ich beides noch dieses Jahr sonst erst im Januar.
Mit evcc bin ich nun einen Schritt weiter. Wechselrichter, EnergyMeter und Auto sind angebunden. Die Wallbox leider noch nicht so ganz. So wie es aussieht wird aber nur der SoC per evcc ausgelesen.
@xerion: hier wäre interessant was bluelinky so kann. Bin gerade dabei bluelinky unter NodeRed zum laufen zu bekommen
Zitat von: acw81 am 05 Dezember 2020, 17:50:34
Mit evcc bin ich nun einen Schritt weiter. Wechselrichter, EnergyMeter und Auto sind angebunden. Die Wallbox leider noch nicht so ganz. So wie es aussieht wird aber nur der SoC per evcc ausgelesen.
@xerion: hier wäre interessant was bluelinky so kann. Bin gerade dabei bluelinky unter NodeRed zum laufen zu bekommen
Was bluelinky genau kann weis ich leider auch nicht da ich mein Auto noch nicht da ist und ich nicht alles testen kann. So wie ich es sehe kann man zumindest die Klima und Türen fernsteuern.
Ich habe es so bei mir eingebunden. Das sind alle Möglichkeiten die bluelinky anbietet:
Wichtiger Hinweis an alle die versuchen per Bluelinky Daten von einem Hyundai abzugreifen!!!
Die Abfragen belasten die Hilfbatterie anscheinend ganz schön. Selbst wenn dies in 5 Minuten Intervallen erfolgt, kann dies dazu führen das die Hilfsbatterie soweit entladen wird das sich das Auto nicht mehr öffnen, starten oder laden lässt. Also Vorsicht beim Zugriff auf das Auto, bei mir musste der ADAC heute schon Starthilfe leisten :-\
Für evcc ist deshalb ein redesign geplant:
https://github.com/andig/evcc/issues/505
(https://github.com/andig/evcc/issues/505)
Die Abfrage über Bluelinky funktioniert nun soweit. Anbei mal das was GetStatus und GetOdometer zurückliefert ...
Zitat von: acw81 am 08 Dezember 2020, 08:07:48
Die Abfrage über Bluelinky funktioniert nun soweit. Anbei mal das was GetStatus und GetOdometer zurückliefert ...
Das sieht doch schon vielversprechend aus. Aber warum steht bei batteryCharge12v 255? Das wäre doch die Hilfsbatterie oder irre ich mich da?
Ich habe meinen Kona seit 3 Monaten und bin begeistert. Nach längeren Versuchen ist es auch gelungen, Bluelinky mit node als .js in der Konsole des Raspberry auszuführen. Die Antwort in der Raspberry-Buster-Konsole ist ähnlich wie bei acw81, sogar ausführlicher. Leider fehlt mir auch nach langem Suchen jeglicher Ansatz, wie ich dieses .js in FHEM einbinden oder direkt aus FHEM aufrufen könnte und wie die Antwort als Device mit Readings in FHEM zur weiteren Auswertung verfügbar gemacht werden könnte.
In FHEM funktioniert bereits vom Vorgängerfahrzeug her eine Einbindung der Ladesäule auf Basis des Phoenix-Moduls EM-CP-PP-ETH, das über entsprechende Vorwahl und die aktuelle Produktion der PV-Anlage die Ladung des Fahrzeugs steuert. Hier wäre die Ergänzung von Fahrzeugdaten per Bluelink(y) sinnvoll, zudem eine Erkennung des zuhause angekommenen Fahrzeuges, z.B. per Bluetooth und automatische Protokollierung der gefahrenen Strecke, des Ladestandes - auch ohne Ankopplung zur Ladesäule. Dann noch eine Anzeige der Fahrzeugposition in einer Landkarte und zwei Knöpfe für Klimatisierung (Standheizung) und Öffnen/Schließen des Fahrzeuges und der Hyundai wäre ein perfektes Gerät im Smarthome ...
Hat jemand schon seinen Kona über EVCC erfolgreich eingebunden? Irgenwie will das bei mir nicht hinhauen?
Wenn ja wie habt ihr vielleicht eure evcc.yaml?
Hast du denn Fehler im evcc Log?
Ich denke das diese Frage am besten im goeingelectric Forum aufgehoben ist, denn mit FHEM hat es ja nicht wirklich zu tun. Dort wird die bestimmt schneller einer an Antwort geben können oder halt auf der GitHub Seite von evcc.
@rossi007: Ich würde dir NodeRed empfehlen. Darüber kannst du das ganze sehr einfach aus FHEM per MQTT triggern und auch in FHEM die Ergebnisse per MQTT einlesen. Am besten NodeRed in einem Docker Container auf dem Raspberry laufen lassen.
Zitat von: michisa86888 am 26 Dezember 2020, 11:13:08
Hat jemand schon seinen Kona über EVCC erfolgreich eingebunden? Irgenwie will das bei mir nicht hinhauen?
Wenn ja wie habt ihr vielleicht eure evcc.yaml?
Ja, siehe mein Post dazu. Ich habe es seither lieber mal sein lassen. Meine Konfiguration sah wie folgt aus (ist nur ein Auszug):
# vehicle definitions
# name can be freely chosen and is used as reference when assigning vehicle to loadpoint
# for examples see https://github.com/andig/evcc-config#vehicles
vehicles:
- name: kona
type: hyundai
title: Hyundai Kona # display name for UI
capacity: 64 # kWh
user: <E-mail Adresse>
password: '<Passwort>'
cache: 30m # cache API response
# loadpoint describes the charger, charge meter and connected vehicle
loadpoints:
- title: Garage # display name for UI
charger: pulsares #charger
meters:
#charge: charge # charge meter
vehicle: kona
Okay wunderbar,
werde ich mal versuchen, muss aber leider immer noch auf meine Ladestation warten (Keba P30c).
Noch eine Frage zu Bluelinky. Ich möchte z.B. auch mit FHEM mein Auto steuern. Also morgen Heizung einschalten bzw. auch mal Alexa sagen sie soll doch bitte Heizung anmachen. Ist das auch über EVCC (Mqtt) möglich oder wie habt ihr das gelöst. Kann ich Befehle von FHEM aus ans Auto schicken oder nur "lesen"?
Über EVCC wird im Moment nur SoC ausgelesen. Ich habe das wie gesagt mit Bluelinky in NodeRed und MQTT In-/Output realisiert. Aktuell geht das die Abfrage des Status, Odometer; Location sowie das Auf- und Zuschließen des Autos. Das Starten und Stoppen, was du machen willst habe ich noch nicht implementiert da man dort noch Parameter übergeben muss. Sollte aber prinzipiell auch kein wirkliches Problem sein.
https://hacksore.github.io/bluelinky-docs/docs/api-reference
(https://hacksore.github.io/bluelinky-docs/docs/api-reference)
Hier mal noch mein aktuelles FHEM MQTT device
Internals:
CFGFN
DEVICETOPIC mqttKona
FUUID 5ffd91eb-f33f-4d64-844f-de76e572874d73a3
IODev MQTT_Broker
LASTInputDev MQTT_Broker
MQTT_Broker_MSGCNT 16
MQTT_Broker_TIME 2021-01-12 20:52:15
MSGCNT 16
NAME mqttKona
NR 72808
STATE Kilometerstand: 1860.4 km <br>
Akku: 90 % <br>
Türen veriegelt: true <br>
Reichweite: 415 km <br>
TYPE MQTT2_DEVICE
OLDREADINGS:
READINGS:
2021-01-12 14:13:32 location {"latitude":4444.771244,"longitude":66666.180953,"altitude":0,"speed":{"unit":0,"value":0},"heading":0}
2021-01-12 14:14:45 locationaltitude 1
2021-01-12 14:14:45 locationheading 155
2021-01-12 14:14:45 locationlatitude 4444.771244
2021-01-12 14:14:45 locationlongitude 66666.180953
2021-01-12 14:14:45 locationspeed_unit 0
2021-01-12 14:14:45 locationspeed_value 0
2021-01-12 17:59:59 odometer_unit 1
2021-01-12 17:59:59 odometer_value 1860.4
2021-01-12 20:52:02 state getStatus
2021-01-12 20:52:15 status_acc false
2021-01-12 20:52:15 status_airCtrlOn false
2021-01-12 20:52:15 status_airTemp_hvacTempType 1
2021-01-12 20:52:15 status_airTemp_unit 0
2021-01-12 20:52:15 status_airTemp_value 0AH
2021-01-12 20:52:15 status_battery_batSoc 75
2021-01-12 20:52:15 status_battery_batState 0
2021-01-12 20:52:15 status_defrost false
2021-01-12 20:52:15 status_doorLock true
2021-01-12 20:52:15 status_doorOpen_backLeft 0
2021-01-12 20:52:15 status_doorOpen_backRight 0
2021-01-12 20:52:15 status_doorOpen_frontLeft 0
2021-01-12 20:52:15 status_doorOpen_frontRight 0
2021-01-12 20:52:15 status_engine false
2021-01-12 20:52:15 status_evStatus_batteryCharge false
2021-01-12 20:52:15 status_evStatus_batteryPlugin 0
2021-01-12 20:52:15 status_evStatus_batteryStatus 90
2021-01-12 20:52:15 status_evStatus_drvDistance_1_rangeByFuel_evModeRange_unit 1
2021-01-12 20:52:15 status_evStatus_drvDistance_1_rangeByFuel_evModeRange_value 415
2021-01-12 20:52:15 status_evStatus_drvDistance_1_rangeByFuel_totalAvailableRange_unit 1
2021-01-12 20:52:15 status_evStatus_drvDistance_1_rangeByFuel_totalAvailableRange_value 415
2021-01-12 20:52:15 status_evStatus_drvDistance_1_type 2
2021-01-12 20:52:15 status_evStatus_remainTime2_atc_unit 1
2021-01-12 20:52:15 status_evStatus_remainTime2_atc_value 1
2021-01-12 20:52:15 status_evStatus_remainTime2_etc1_unit 1
2021-01-12 20:52:15 status_evStatus_remainTime2_etc1_value 61
2021-01-12 20:52:15 status_evStatus_remainTime2_etc2_unit 1
2021-01-12 20:52:15 status_evStatus_remainTime2_etc2_value 215
2021-01-12 20:52:15 status_evStatus_remainTime2_etc3_unit 1
2021-01-12 20:52:15 status_evStatus_remainTime2_etc3_value 65
2021-01-12 20:52:15 status_evStatus_reservChargeInfos_ect_end_day 9
2021-01-12 20:52:15 status_evStatus_reservChargeInfos_ect_end_time_time 1200
2021-01-12 20:52:15 status_evStatus_reservChargeInfos_ect_end_time_timeSection 0
2021-01-12 20:52:15 status_evStatus_reservChargeInfos_ect_start_day 9
2021-01-12 20:52:15 status_evStatus_reservChargeInfos_ect_start_time_time 1200
2021-01-12 20:52:15 status_evStatus_reservChargeInfos_ect_start_time_timeSection 0
2021-01-12 20:52:15 status_evStatus_reservChargeInfos_offpeakPowerInfo_offPeakPowerFlag 0
2021-01-12 20:52:15 status_evStatus_reservChargeInfos_offpeakPowerInfo_offPeakPowerTime1_endtime_time 1200
2021-01-12 20:52:15 status_evStatus_reservChargeInfos_offpeakPowerInfo_offPeakPowerTime1_endtime_timeSection 0
2021-01-12 20:52:15 status_evStatus_reservChargeInfos_offpeakPowerInfo_offPeakPowerTime1_starttime_time 1200
2021-01-12 20:52:15 status_evStatus_reservChargeInfos_offpeakPowerInfo_offPeakPowerTime1_starttime_timeSection 0
2021-01-12 20:52:15 status_evStatus_reservChargeInfos_reservChargeInfo_reservChargeInfoDetail_reservChargeSet false
2021-01-12 20:52:15 status_evStatus_reservChargeInfos_reservChargeInfo_reservChargeInfoDetail_reservFatcSet_airCtrl 1
2021-01-12 20:52:15 status_evStatus_reservChargeInfos_reservChargeInfo_reservChargeInfoDetail_reservFatcSet_airTemp_hvacTempType 1
2021-01-12 20:52:15 status_evStatus_reservChargeInfos_reservChargeInfo_reservChargeInfoDetail_reservFatcSet_airTemp_unit 0
2021-01-12 20:52:15 status_evStatus_reservChargeInfos_reservChargeInfo_reservChargeInfoDetail_reservFatcSet_airTemp_value 10H
2021-01-12 20:52:15 status_evStatus_reservChargeInfos_reservChargeInfo_reservChargeInfoDetail_reservFatcSet_defrost true
2021-01-12 20:52:15 status_evStatus_reservChargeInfos_reservChargeInfo_reservChargeInfoDetail_reservFatcSet_heating1 0
2021-01-12 20:52:15 status_evStatus_reservChargeInfos_reservChargeInfo_reservChargeInfoDetail_reservInfo_day_1 5
2021-01-12 20:52:15 status_evStatus_reservChargeInfos_reservChargeInfo_reservChargeInfoDetail_reservInfo_time_time 0540
2021-01-12 20:52:15 status_evStatus_reservChargeInfos_reservChargeInfo_reservChargeInfoDetail_reservInfo_time_timeSection 1
2021-01-12 20:52:15 status_evStatus_reservChargeInfos_reservFlag 0
2021-01-12 20:52:15 status_evStatus_reservChargeInfos_reserveChargeInfo2_reservChargeInfoDetail_reservChargeSet false
2021-01-12 20:52:15 status_evStatus_reservChargeInfos_reserveChargeInfo2_reservChargeInfoDetail_reservFatcSet_airCtrl 1
2021-01-12 20:52:15 status_evStatus_reservChargeInfos_reserveChargeInfo2_reservChargeInfoDetail_reservFatcSet_airTemp_hvacTempType 1
2021-01-12 20:52:15 status_evStatus_reservChargeInfos_reserveChargeInfo2_reservChargeInfoDetail_reservFatcSet_airTemp_unit 0
2021-01-12 20:52:15 status_evStatus_reservChargeInfos_reserveChargeInfo2_reservChargeInfoDetail_reservFatcSet_airTemp_value 10H
2021-01-12 20:52:15 status_evStatus_reservChargeInfos_reserveChargeInfo2_reservChargeInfoDetail_reservFatcSet_defrost true
2021-01-12 20:52:15 status_evStatus_reservChargeInfos_reserveChargeInfo2_reservChargeInfoDetail_reservFatcSet_heating1 0
2021-01-12 20:52:15 status_evStatus_reservChargeInfos_reserveChargeInfo2_reservChargeInfoDetail_reservInfo_day_1 2
2021-01-12 20:52:15 status_evStatus_reservChargeInfos_reserveChargeInfo2_reservChargeInfoDetail_reservInfo_time_time 0250
2021-01-12 20:52:15 status_evStatus_reservChargeInfos_reserveChargeInfo2_reservChargeInfoDetail_reservInfo_time_timeSection 1
2021-01-12 20:52:15 status_evStatus_reservChargeInfos_targetSOClist_1_dte_rangeByFuel_evModeRange_unit 1
2021-01-12 20:52:15 status_evStatus_reservChargeInfos_targetSOClist_1_dte_rangeByFuel_evModeRange_value 462
2021-01-12 20:52:15 status_evStatus_reservChargeInfos_targetSOClist_1_dte_rangeByFuel_totalAvailableRange_unit 1
2021-01-12 20:52:15 status_evStatus_reservChargeInfos_targetSOClist_1_dte_rangeByFuel_totalAvailableRange_value 462
2021-01-12 20:52:15 status_evStatus_reservChargeInfos_targetSOClist_1_dte_type 2
2021-01-12 20:52:15 status_evStatus_reservChargeInfos_targetSOClist_1_plugType 0
2021-01-12 20:52:15 status_evStatus_reservChargeInfos_targetSOClist_1_targetSOClevel 100
2021-01-12 20:52:15 status_evStatus_reservChargeInfos_targetSOClist_2_dte_rangeByFuel_evModeRange_unit 1
2021-01-12 20:52:15 status_evStatus_reservChargeInfos_targetSOClist_2_dte_rangeByFuel_evModeRange_value 462
2021-01-12 20:52:15 status_evStatus_reservChargeInfos_targetSOClist_2_dte_rangeByFuel_totalAvailableRange_unit 1
2021-01-12 20:52:15 status_evStatus_reservChargeInfos_targetSOClist_2_dte_rangeByFuel_totalAvailableRange_value 462
2021-01-12 20:52:15 status_evStatus_reservChargeInfos_targetSOClist_2_dte_type 2
2021-01-12 20:52:15 status_evStatus_reservChargeInfos_targetSOClist_2_plugType 1
2021-01-12 20:52:15 status_evStatus_reservChargeInfos_targetSOClist_2_targetSOClevel 100
2021-01-12 20:52:15 status_hoodOpen false
2021-01-12 20:52:15 status_ign3 true
2021-01-12 20:52:15 status_sideBackWindowHeat 0
2021-01-12 20:52:15 status_steerWheelHeat 0
2021-01-12 20:52:15 status_time 20210112205214
2021-01-12 20:52:15 status_tirePressureLamp_tirePressureLampAll 0
2021-01-12 20:52:15 status_tirePressureLamp_tirePressureLampFL 0
2021-01-12 20:52:15 status_tirePressureLamp_tirePressureLampFR 0
2021-01-12 20:52:15 status_tirePressureLamp_tirePressureLampRL 0
2021-01-12 20:52:15 status_tirePressureLamp_tirePressureLampRR 0
2021-01-12 20:52:15 status_transCond true
2021-01-12 20:52:15 status_trunkOpen false
Attributes:
IODev MQTT_Broker
readingList bluelinky/air_conditioning.* air_conditioning
bluelinky/status:.* { json2nameValue($EVENT) }
bluelinky/doors.* doors
bluelinky/location.* { json2nameValue($EVENT, 'location_') }
bluelinky/odometer:.* { json2nameValue($EVENT, 'odometer_') }
room Garage
setList getOdometer cmnd/bluelinky/get_odometer 1
getStatus cmnd/bluelinky/get_status 1
getLocation cmnd/bluelinky/get_location 1
stateFormat Kilometerstand: odometer_value km <br>
Akku: status_evStatus_batteryStatus % <br>
Türen veriegelt: status_doorLock <br>
Reichweite: status_evStatus_drvDistance_1_rangeByFuel_evModeRange_value km <br>
Zitat von: acw81 am 13 Januar 2021, 11:37:24
Über EVCC wird im Moment nur SoC ausgelesen. Ich habe das wie gesagt mit Bluelinky in NodeRed und MQTT In-/Output realisiert.
Mega!
Kannst du den Node-Red-Flow irgendwie exportieren, damit man sehen kann, was du da drin genau machst? Ich würde das auch gerne anbinden bei mir.
Bin inzwischen soweit, dass ich ein bisschen Code zumindest per node auf der Konsole am Laufen hab. Aber die FHEM-Anbindung fehlt mir.
Grüße
Micha
Okay hier der Export (ich hoffe ich habe alle persönlichen Daten entfernt). Die müssen vor dem Import wieder eingetragen werden (sind mit <xxx> ersetzt worden). Ich habe den Flow und damit die FHEM Anbindung nochmal verändert (d.h. das FHEM listing von oben passt schon nicht mehr). Die Idee das so aufzubauen habe ich von hier, da ich vorher noch nichts mit NodeRed gemacht hatte.
https://community.home-assistant.io/t/integrating-hyundai-bluelink-but-working-with-curl/181511/19
(https://community.home-assistant.io/t/integrating-hyundai-bluelink-but-working-with-curl/181511/19)
[
{
"id": "f6f2187d.f17ca8",
"type": "tab",
"label": "Flow 1",
"disabled": false,
"info": ""
},
{
"id": "57d6beca.e51cc",
"type": "bluelinky",
"username": "<Username>",
"password": "<password>",
"region": "EU",
"pin": "<pin>",
"vin": "<vin>"
},
{
"id": "36dd9767.956ae8",
"type": "mqtt-broker",
"name": "mosquitto",
"broker": "<IP>",
"port": "1883",
"clientid": "",
"usetls": false,
"compatmode": false,
"keepalive": "60",
"cleansession": true,
"birthTopic": "",
"birthQos": "0",
"birthPayload": "",
"closeTopic": "",
"closeQos": "0",
"closePayload": "",
"willTopic": "",
"willQos": "0",
"willPayload": ""
},
{
"id": "3cc11d24.ff01a2",
"type": "comment",
"z": "f6f2187d.f17ca8",
"name": "WARNING: please check you have started this container with a volume that is mounted to /data\\n otherwise any flow changes are lost when you redeploy or upgrade the container\\n (e.g. upgrade to a more recent node-red docker image).\\n If you are using named volumes you can ignore this warning.\\n Double click or see info side panel to learn how to start Node-RED in Docker to save your work",
"info": "\nTo start docker with a bind mount volume (-v option), for example:\n\n```\ndocker run -it -p 1880:1880 -v /home/user/node_red_data:/data --name mynodered nodered/node-red\n```\n\nwhere `/home/user/node_red_data` is a directory on your host machine where you want to store your flows.\n\nIf you do not do this then you can experiment and redploy flows, but if you restart or upgrade the container the flows will be disconnected and lost. \n\nThey will still exist in a hidden data volume, which can be recovered using standard docker techniques, but that is much more complex than just starting with a named volume as described above.",
"x": 350,
"y": 80,
"wires": [ ]
},
{
"id": "4ae7cfad.ef2f9",
"type": "mqtt in",
"z": "f6f2187d.f17ca8",
"name": "",
"topic": "cmnd/bluelinky/get_status",
"qos": "2",
"datatype": "auto",
"broker": "36dd9767.956ae8",
"x": 130,
"y": 280,
"wires": [ [ "7151f9b3.64a868" ] ]
},
{
"id": "80b490f1.a70b5",
"type": "mqtt in",
"z": "f6f2187d.f17ca8",
"name": "",
"topic": "cmnd/bluelinky/stop_ac",
"qos": "2",
"datatype": "auto",
"broker": "36dd9767.956ae8",
"x": 120,
"y": 1000,
"wires": [ [ "35e227cd.4f7fc8" ] ]
},
{
"id": "2722c4a8.0a071c",
"type": "mqtt in",
"z": "f6f2187d.f17ca8",
"name": "",
"topic": "cmnd/bluelinky/start_ac",
"qos": "2",
"datatype": "auto",
"broker": "36dd9767.956ae8",
"x": 120,
"y": 920,
"wires": [ [ "a2f10779.7ad2c8" ] ]
},
{
"id": "7151f9b3.64a868",
"type": "car-status",
"z": "f6f2187d.f17ca8",
"name": "Get status",
"dorefresh": true,
"parsed": false,
"bluelinky": "57d6beca.e51cc",
"x": 410,
"y": 200,
"wires": [ [ "478f506c.59b44", "8c0e1278.48eeb", "1e89420e.7d352e", "3072f27c.87c05e", "f86a0cc1.73cb7", "3a80f56c.0836fa", "b0d6fbd7.64da38", "863a07ce.085bd8", "e7b544a.406a8b8", "49d564f1.3e30ac", "b2af16e1.8e9e48" ] ]
},
{
"id": "a2f10779.7ad2c8",
"type": "start-car",
"z": "f6f2187d.f17ca8",
"name": "Start car",
"bluelinky": "57d6beca.e51cc",
"x": 400,
"y": 920,
"wires": [ [ "478f506c.59b44" ] ],
"inputLabels": [ "airTempvalue: 19.0" ],
"info": "19"
},
{
"id": "35e227cd.4f7fc8",
"type": "stop-car",
"z": "f6f2187d.f17ca8",
"name": "Stop car",
"bluelinky": "57d6beca.e51cc",
"x": 400,
"y": 1000,
"wires": [ [ "478f506c.59b44" ] ]
},
{
"id": "478f506c.59b44",
"type": "debug",
"z": "f6f2187d.f17ca8",
"name": "",
"active": true,
"tosidebar": true,
"console": false,
"tostatus": false,
"complete": "payload",
"targetType": "msg",
"statusVal": "",
"statusType": "auto",
"x": 730,
"y": 980,
"wires": [ ]
},
{
"id": "4a75fc2f.1e51e4",
"type": "unlock-car",
"z": "f6f2187d.f17ca8",
"name": "Unlock car",
"bluelinky": "57d6beca.e51cc",
"x": 410,
"y": 1080,
"wires": [ [ "478f506c.59b44", "a10b38ae.94e5d8" ] ]
},
{
"id": "2eef0961.a65396",
"type": "mqtt in",
"z": "f6f2187d.f17ca8",
"name": "",
"topic": "cmnd/bluelinky/unlock_car",
"qos": "2",
"datatype": "auto",
"broker": "36dd9767.956ae8",
"x": 130,
"y": 1080,
"wires": [ [ "4a75fc2f.1e51e4" ] ]
},
{
"id": "250acff4.b367",
"type": "mqtt in",
"z": "f6f2187d.f17ca8",
"name": "",
"topic": "cmnd/bluelinky/lock_car",
"qos": "2",
"datatype": "auto",
"broker": "36dd9767.956ae8",
"x": 120,
"y": 1160,
"wires": [ [ "19c514c7.ca8aab" ] ]
},
{
"id": "19c514c7.ca8aab",
"type": "lock-car",
"z": "f6f2187d.f17ca8",
"name": "Lock car",
"bluelinky": "57d6beca.e51cc",
"x": 400,
"y": 1160,
"wires": [ [ "478f506c.59b44", "a10b38ae.94e5d8" ] ]
},
{
"id": "cbdfadee.54f1c",
"type": "car-location",
"z": "f6f2187d.f17ca8",
"name": "Get car location",
"bluelinky": "57d6beca.e51cc",
"x": 420,
"y": 1240,
"wires": [ [ "2e394950.ce9296", "478f506c.59b44" ] ]
},
{
"id": "421c6f20.cb61f",
"type": "car-odometer",
"z": "f6f2187d.f17ca8",
"name": "Get car odometer",
"bluelinky": "57d6beca.e51cc",
"x": 450,
"y": 780,
"wires": [ [ "478f506c.59b44", "c85df5a1.7c67f8" ] ]
},
{
"id": "ae4a76ba.d1b7e8",
"type": "mqtt in",
"z": "f6f2187d.f17ca8",
"name": "",
"topic": "cmnd/bluelinky/get_odometer",
"qos": "2",
"datatype": "auto",
"broker": "36dd9767.956ae8",
"x": 160,
"y": 780,
"wires": [ [ "421c6f20.cb61f" ] ]
},
{
"id": "a10b38ae.94e5d8",
"type": "mqtt out",
"z": "f6f2187d.f17ca8",
"name": "",
"topic": "bluelinky/doors",
"qos": "",
"retain": "",
"broker": "36dd9767.956ae8",
"x": 740,
"y": 1160,
"wires": [ ]
},
{
"id": "3493be44.5a6802",
"type": "mqtt out",
"z": "f6f2187d.f17ca8",
"name": "",
"topic": "bluelinky/odometer",
"qos": "",
"retain": "",
"broker": "36dd9767.956ae8",
"x": 870,
"y": 780,
"wires": [ ]
},
{
"id": "cc998b60.1f7408",
"type": "mqtt in",
"z": "f6f2187d.f17ca8",
"name": "",
"topic": "cmnd/bluelinky/get_location",
"qos": "2",
"datatype": "auto",
"broker": "36dd9767.956ae8",
"x": 140,
"y": 1240,
"wires": [ [ "cbdfadee.54f1c" ] ]
},
{
"id": "2e394950.ce9296",
"type": "mqtt out",
"z": "f6f2187d.f17ca8",
"name": "",
"topic": "bluelinky/location",
"qos": "",
"retain": "",
"broker": "36dd9767.956ae8",
"x": 750,
"y": 1240,
"wires": [ ]
},
{
"id": "47d9808d.1454b",
"type": "inject",
"z": "f6f2187d.f17ca8",
"name": "Every 2h",
"props": [
{ "p": "payload" },
{
"p": "topic",
"vt": "str"
}
],
"repeat": "7200",
"crontab": "",
"once": false,
"onceDelay": 0.1,
"topic": "",
"payload": "",
"payloadType": "date",
"x": 100,
"y": 200,
"wires": [ [ "7151f9b3.64a868" ] ]
},
{
"id": "8c0e1278.48eeb",
"type": "change",
"z": "f6f2187d.f17ca8",
"name": "doorLock",
"rules": [
{
"t": "set",
"p": "payload",
"pt": "msg",
"to": "payload.status.doorLock",
"tot": "msg"
}
],
"action": "",
"property": "",
"from": "",
"to": "",
"reg": false,
"x": 800,
"y": 160,
"wires": [ [ "4a2701d1.43ed1" ] ]
},
{
"id": "4a2701d1.43ed1",
"type": "mqtt out",
"z": "f6f2187d.f17ca8",
"name": "",
"topic": "bluelinky/doorLock",
"qos": "",
"retain": "",
"broker": "36dd9767.956ae8",
"x": 1010,
"y": 160,
"wires": [ ]
},
{
"id": "c85df5a1.7c67f8",
"type": "change",
"z": "f6f2187d.f17ca8",
"name": "odometer",
"rules": [
{
"t": "set",
"p": "payload",
"pt": "msg",
"to": "payload.value",
"tot": "msg"
}
],
"action": "",
"property": "",
"from": "",
"to": "",
"reg": false,
"x": 680,
"y": 780,
"wires": [ [ "3493be44.5a6802" ] ]
},
{
"id": "f0bdbf6f.5a26c",
"type": "inject",
"z": "f6f2187d.f17ca8",
"name": "Every 24h",
"props": [
{ "p": "payload" },
{
"p": "topic",
"vt": "str"
}
],
"repeat": "86400",
"crontab": "",
"once": false,
"onceDelay": 0.1,
"topic": "",
"payload": "",
"payloadType": "date",
"x": 110,
"y": 720,
"wires": [ [ "421c6f20.cb61f" ] ]
},
{
"id": "1e89420e.7d352e",
"type": "change",
"z": "f6f2187d.f17ca8",
"name": "engine",
"rules": [
{
"t": "set",
"p": "payload",
"pt": "msg",
"to": "payload.status.engine",
"tot": "msg"
}
],
"action": "",
"property": "",
"from": "",
"to": "",
"reg": false,
"x": 790,
"y": 220,
"wires": [ [ "aa799088.efbc5" ] ]
},
{
"id": "aa799088.efbc5",
"type": "mqtt out",
"z": "f6f2187d.f17ca8",
"name": "",
"topic": "bluelinky/engine",
"qos": "",
"retain": "",
"broker": "36dd9767.956ae8",
"x": 1000,
"y": 220,
"wires": [ ]
},
{
"id": "3072f27c.87c05e",
"type": "change",
"z": "f6f2187d.f17ca8",
"name": "airCtrlOn",
"rules": [
{
"t": "set",
"p": "payload",
"pt": "msg",
"to": "payload.status.airCtrlOn",
"tot": "msg"
}
],
"action": "",
"property": "",
"from": "",
"to": "",
"reg": false,
"x": 800,
"y": 280,
"wires": [ [ "f5d01011.764f6" ] ]
},
{
"id": "f5d01011.764f6",
"type": "mqtt out",
"z": "f6f2187d.f17ca8",
"name": "",
"topic": "bluelinky/airCtrlOn",
"qos": "",
"retain": "",
"broker": "36dd9767.956ae8",
"x": 1010,
"y": 280,
"wires": [ ]
},
{
"id": "f86a0cc1.73cb7",
"type": "change",
"z": "f6f2187d.f17ca8",
"name": "trunkOpen",
"rules": [
{
"t": "set",
"p": "payload",
"pt": "msg",
"to": "payload.status.trunkOpen",
"tot": "msg"
}
],
"action": "",
"property": "",
"from": "",
"to": "",
"reg": false,
"x": 810,
"y": 340,
"wires": [ [ "e603126b.6a562" ] ]
},
{
"id": "e603126b.6a562",
"type": "mqtt out",
"z": "f6f2187d.f17ca8",
"name": "",
"topic": "bluelinky/airCtrlOn",
"qos": "",
"retain": "",
"broker": "36dd9767.956ae8",
"x": 1010,
"y": 340,
"wires": [ ]
},
{
"id": "3a80f56c.0836fa",
"type": "change",
"z": "f6f2187d.f17ca8",
"name": "hoodOpen",
"rules": [
{
"t": "set",
"p": "payload",
"pt": "msg",
"to": "payload.status.hoodOpen",
"tot": "msg"
}
],
"action": "",
"property": "",
"from": "",
"to": "",
"reg": false,
"x": 810,
"y": 400,
"wires": [ [ "5a7d883c.e56228" ] ]
},
{
"id": "5a7d883c.e56228",
"type": "mqtt out",
"z": "f6f2187d.f17ca8",
"name": "",
"topic": "bluelinky/hoodOpen",
"qos": "",
"retain": "",
"broker": "36dd9767.956ae8",
"x": 1020,
"y": 400,
"wires": [ ]
},
{
"id": "863a07ce.085bd8",
"type": "change",
"z": "f6f2187d.f17ca8",
"name": "batteryStatus",
"rules": [
{
"t": "set",
"p": "payload",
"pt": "msg",
"to": "payload.status.evStatus.batteryStatus",
"tot": "msg"
}
],
"action": "",
"property": "",
"from": "",
"to": "",
"reg": false,
"x": 810,
"y": 460,
"wires": [ [ "b7ab78d8.2186c8" ] ]
},
{
"id": "b7ab78d8.2186c8",
"type": "mqtt out",
"z": "f6f2187d.f17ca8",
"name": "",
"topic": "bluelinky/batteryStatus",
"qos": "",
"retain": "",
"broker": "36dd9767.956ae8",
"x": 1020,
"y": 460,
"wires": [ ]
},
{
"id": "49d564f1.3e30ac",
"type": "change",
"z": "f6f2187d.f17ca8",
"name": "defrost",
"rules": [
{
"t": "set",
"p": "payload",
"pt": "msg",
"to": "payload.status.defrost",
"tot": "msg"
}
],
"action": "",
"property": "",
"from": "",
"to": "",
"reg": false,
"x": 790,
"y": 640,
"wires": [ [ "6309573b.8b5f08" ] ]
},
{
"id": "6309573b.8b5f08",
"type": "mqtt out",
"z": "f6f2187d.f17ca8",
"name": "",
"topic": "bluelinky/defrost",
"qos": "",
"retain": "",
"broker": "36dd9767.956ae8",
"x": 1000,
"y": 640,
"wires": [ ]
},
{
"id": "e7b544a.406a8b8",
"type": "change",
"z": "f6f2187d.f17ca8",
"name": "acc",
"rules": [
{
"t": "set",
"p": "payload",
"pt": "msg",
"to": "payload.status.scc",
"tot": "msg"
}
],
"action": "",
"property": "",
"from": "",
"to": "",
"reg": false,
"x": 790,
"y": 580,
"wires": [ [ "8b622bcc.94d9d8" ] ]
},
{
"id": "8b622bcc.94d9d8",
"type": "mqtt out",
"z": "f6f2187d.f17ca8",
"name": "",
"topic": "bluelinky/acc",
"qos": "",
"retain": "",
"broker": "36dd9767.956ae8",
"x": 990,
"y": 580,
"wires": [ ]
},
{
"id": "b0d6fbd7.64da38",
"type": "change",
"z": "f6f2187d.f17ca8",
"name": "batteryCharge",
"rules": [
{
"t": "set",
"p": "payload",
"pt": "msg",
"to": "payload.status.evStatus.batteryCharge",
"tot": "msg"
}
],
"action": "",
"property": "",
"from": "",
"to": "",
"reg": false,
"x": 820,
"y": 520,
"wires": [ [ "35d69904.5e8b16" ] ]
},
{
"id": "35d69904.5e8b16",
"type": "mqtt out",
"z": "f6f2187d.f17ca8",
"name": "",
"topic": "bluelinky/batteryCharge",
"qos": "",
"retain": "",
"broker": "36dd9767.956ae8",
"x": 1030,
"y": 520,
"wires": [ ]
},
{
"id": "b2af16e1.8e9e48",
"type": "change",
"z": "f6f2187d.f17ca8",
"name": "range",
"rules": [
{
"t": "set",
"p": "payload",
"pt": "msg",
"to": "payload.status.evStatus.drvDistance[0].rangeByFuel.evModeRange.value",
"tot": "msg"
}
],
"action": "",
"property": "",
"from": "",
"to": "",
"reg": false,
"x": 790,
"y": 700,
"wires": [ [ "1e875e4.f7566a2" ] ]
},
{
"id": "1e875e4.f7566a2",
"type": "mqtt out",
"z": "f6f2187d.f17ca8",
"name": "",
"topic": "bluelinky/range",
"qos": "",
"retain": "",
"broker": "36dd9767.956ae8",
"x": 1000,
"y": 700,
"wires": [ ]
},
{
"id": "5e086d9b.4184b4",
"type": "inject",
"z": "f6f2187d.f17ca8",
"name": "",
"props": [
{ "p": "payload" },
{
"p": "topic",
"vt": "str"
}
],
"repeat": "",
"crontab": "",
"once": false,
"onceDelay": 0.1,
"topic": "",
"payload": "{\"airCtrl\": true, \"airTempvalue\": 19.0}",
"payloadType": "json",
"x": 100,
"y": 860,
"wires": [ [ "a2f10779.7ad2c8" ] ]
}
]
Leider funktioniert das Starten der AC noch nicht. Kann mir hier eventuell jemand weiterhelfen. Da müsste ich doch auch mit einem Inject die Parameter übergeben können. Hat jemand eventuell ein Beispiel für mich?
Zitat von: acw81 am 13 Januar 2021, 16:58:25
Okay hier der Export
Danke!
Ich hab parallel das hier gefunden: https://flows.nodered.org/node/node-red-contrib-bluelinky
Kennst du das?
Damit ich es richtig verstehe, bei dir ist der Flow:
1. Request vom FHEM an den MQTT
2. MQTT an Nodered
4. Verarbeitung in Nodered
5. Nodered and MQTT
6. MQTT an FHEM
Richtig?
Zitat von: acw81 am 13 Januar 2021, 16:58:25
Leider funktioniert das Starten der AC noch nicht. Kann mir hier eventuell jemand weiterhelfen. Da müsste ich doch auch mit einem Inject die Parameter übergeben können. Hat jemand eventuell ein Beispiel für mich?
Das wäre ja die Funktion start() sein. Die braucht ein Objekt im Stile von
export interface VehicleClimateOptions {
defrost: boolean;
windscreenHeating: boolean;
temperature: number;
unit: string;
}
Also wenn du ein entsprechendes JSON mitsendet beim MQTT Request, sollte das gehen.
Zitat von: mnl1234 am 13 Januar 2021, 17:18:02
Danke!
Ich hab parallel das hier gefunden: https://flows.nodered.org/node/node-red-contrib-bluelinky
Kennst du das?
Damit ich es richtig verstehe, bei dir ist der Flow:
1. Request vom FHEM an den MQTT
2. MQTT an Nodered
4. Verarbeitung in Nodered
5. Nodered and MQTT
6. MQTT an FHEM
Richtig?
Genau, Punkt 2 bis 5 sind alle in dem exportierten Flow.
Zitat von: mnl1234 am 13 Januar 2021, 17:23:19
Das wäre ja die Funktion start() sein. Die braucht ein Objekt im Stile von
export interface VehicleClimateOptions {
defrost: boolean;
windscreenHeating: boolean;
temperature: number;
unit: string;
}
Also wenn du ein entsprechendes JSON mitsendet beim MQTT Request, sollte das gehen.
In meinem Testscript gehts mit
{"defrost": false, "windscreenHeating": true, "temperature": 22.0 , "unit": "C"}
In dem nodered kommt er mit der Temp nicht klar.
Zitat von: mnl1234 am 13 Januar 2021, 17:45:43
In meinem Testscript gehts mit
{"defrost": false, "windscreenHeating": true, "temperature": 22.0 , "unit": "C"}
In dem nodered kommt er mit der Temp nicht klar.
Danke, so funktioniert es bei mir in NodeRed. Zumindest wenn ich die msg.payload in NodeRed über ein Inject setze. Aus FHEM per MQTT muss ich mal schauen.
Okay, jetzt funktioniert alles. Hier nochmal der aktualisierte Flow.
[
{
"id": "f6f2187d.f17ca8",
"type": "tab",
"label": "Flow 1",
"disabled": false,
"info": ""
},
{
"id": "3cc11d24.ff01a2",
"type": "comment",
"z": "f6f2187d.f17ca8",
"name": "WARNING: please check you have started this container with a volume that is mounted to /data\\n otherwise any flow changes are lost when you redeploy or upgrade the container\\n (e.g. upgrade to a more recent node-red docker image).\\n If you are using named volumes you can ignore this warning.\\n Double click or see info side panel to learn how to start Node-RED in Docker to save your work",
"info": "\nTo start docker with a bind mount volume (-v option), for example:\n\n```\ndocker run -it -p 1880:1880 -v /home/user/node_red_data:/data --name mynodered nodered/node-red\n```\n\nwhere `/home/user/node_red_data` is a directory on your host machine where you want to store your flows.\n\nIf you do not do this then you can experiment and redploy flows, but if you restart or upgrade the container the flows will be disconnected and lost. \n\nThey will still exist in a hidden data volume, which can be recovered using standard docker techniques, but that is much more complex than just starting with a named volume as described above.",
"x": 350,
"y": 80,
"wires": [ ]
},
{
"id": "4ae7cfad.ef2f9",
"type": "mqtt in",
"z": "f6f2187d.f17ca8",
"name": "",
"topic": "cmnd/bluelinky/get_status",
"qos": "2",
"datatype": "auto",
"broker": "36dd9767.956ae8",
"x": 130,
"y": 280,
"wires": [ [ "7151f9b3.64a868" ] ]
},
{
"id": "80b490f1.a70b5",
"type": "mqtt in",
"z": "f6f2187d.f17ca8",
"name": "",
"topic": "cmnd/bluelinky/stop_ac",
"qos": "2",
"datatype": "auto",
"broker": "36dd9767.956ae8",
"x": 120,
"y": 1000,
"wires": [ [ "35e227cd.4f7fc8" ] ]
},
{
"id": "2722c4a8.0a071c",
"type": "mqtt in",
"z": "f6f2187d.f17ca8",
"name": "",
"topic": "cmnd/bluelinky/start_ac",
"qos": "2",
"datatype": "auto",
"broker": "36dd9767.956ae8",
"x": 120,
"y": 920,
"wires": [ [ "183e42b8.b4fc8d" ] ]
},
{
"id": "7151f9b3.64a868",
"type": "car-status",
"z": "f6f2187d.f17ca8",
"name": "Get status",
"dorefresh": true,
"parsed": false,
"bluelinky": "57d6beca.e51cc",
"x": 410,
"y": 200,
"wires": [ [ "478f506c.59b44", "8c0e1278.48eeb", "1e89420e.7d352e", "3072f27c.87c05e", "f86a0cc1.73cb7", "3a80f56c.0836fa", "b0d6fbd7.64da38", "863a07ce.085bd8", "e7b544a.406a8b8", "49d564f1.3e30ac", "b2af16e1.8e9e48" ] ]
},
{
"id": "a2f10779.7ad2c8",
"type": "start-car",
"z": "f6f2187d.f17ca8",
"name": "Start car",
"bluelinky": "57d6beca.e51cc",
"x": 460,
"y": 920,
"wires": [ [ "478f506c.59b44" ] ],
"inputLabels": [ "airTempvalue: 19.0" ],
"info": "19"
},
{
"id": "35e227cd.4f7fc8",
"type": "stop-car",
"z": "f6f2187d.f17ca8",
"name": "Stop car",
"bluelinky": "57d6beca.e51cc",
"x": 460,
"y": 1000,
"wires": [ [ "478f506c.59b44" ] ]
},
{
"id": "478f506c.59b44",
"type": "debug",
"z": "f6f2187d.f17ca8",
"name": "",
"active": true,
"tosidebar": true,
"console": false,
"tostatus": false,
"complete": "payload",
"targetType": "msg",
"statusVal": "",
"statusType": "auto",
"x": 770,
"y": 920,
"wires": [ ]
},
{
"id": "4a75fc2f.1e51e4",
"type": "unlock-car",
"z": "f6f2187d.f17ca8",
"name": "Unlock car",
"bluelinky": "57d6beca.e51cc",
"x": 470,
"y": 1080,
"wires": [ [ "478f506c.59b44", "a10b38ae.94e5d8" ] ]
},
{
"id": "2eef0961.a65396",
"type": "mqtt in",
"z": "f6f2187d.f17ca8",
"name": "",
"topic": "cmnd/bluelinky/unlock_car",
"qos": "2",
"datatype": "auto",
"broker": "36dd9767.956ae8",
"x": 130,
"y": 1080,
"wires": [ [ "4a75fc2f.1e51e4" ] ]
},
{
"id": "250acff4.b367",
"type": "mqtt in",
"z": "f6f2187d.f17ca8",
"name": "",
"topic": "cmnd/bluelinky/lock_car",
"qos": "2",
"datatype": "auto",
"broker": "36dd9767.956ae8",
"x": 120,
"y": 1160,
"wires": [ [ "19c514c7.ca8aab" ] ]
},
{
"id": "19c514c7.ca8aab",
"type": "lock-car",
"z": "f6f2187d.f17ca8",
"name": "Lock car",
"bluelinky": "57d6beca.e51cc",
"x": 460,
"y": 1160,
"wires": [ [ "478f506c.59b44", "a10b38ae.94e5d8" ] ]
},
{
"id": "cbdfadee.54f1c",
"type": "car-location",
"z": "f6f2187d.f17ca8",
"name": "Get car location",
"bluelinky": "57d6beca.e51cc",
"x": 480,
"y": 1240,
"wires": [ [ "2e394950.ce9296", "478f506c.59b44" ] ]
},
{
"id": "421c6f20.cb61f",
"type": "car-odometer",
"z": "f6f2187d.f17ca8",
"name": "Get car odometer",
"bluelinky": "57d6beca.e51cc",
"x": 450,
"y": 780,
"wires": [ [ "478f506c.59b44", "c85df5a1.7c67f8" ] ]
},
{
"id": "ae4a76ba.d1b7e8",
"type": "mqtt in",
"z": "f6f2187d.f17ca8",
"name": "",
"topic": "cmnd/bluelinky/get_odometer",
"qos": "2",
"datatype": "auto",
"broker": "36dd9767.956ae8",
"x": 140,
"y": 780,
"wires": [ [ "421c6f20.cb61f" ] ]
},
{
"id": "a10b38ae.94e5d8",
"type": "mqtt out",
"z": "f6f2187d.f17ca8",
"name": "",
"topic": "bluelinky/doors",
"qos": "",
"retain": "",
"broker": "36dd9767.956ae8",
"x": 740,
"y": 1160,
"wires": [ ]
},
{
"id": "3493be44.5a6802",
"type": "mqtt out",
"z": "f6f2187d.f17ca8",
"name": "",
"topic": "bluelinky/odometer",
"qos": "",
"retain": "",
"broker": "36dd9767.956ae8",
"x": 870,
"y": 780,
"wires": [ ]
},
{
"id": "cc998b60.1f7408",
"type": "mqtt in",
"z": "f6f2187d.f17ca8",
"name": "",
"topic": "cmnd/bluelinky/get_location",
"qos": "2",
"datatype": "auto",
"broker": "36dd9767.956ae8",
"x": 140,
"y": 1240,
"wires": [ [ "cbdfadee.54f1c" ] ]
},
{
"id": "2e394950.ce9296",
"type": "mqtt out",
"z": "f6f2187d.f17ca8",
"name": "",
"topic": "bluelinky/location",
"qos": "",
"retain": "",
"broker": "36dd9767.956ae8",
"x": 750,
"y": 1240,
"wires": [ ]
},
{
"id": "47d9808d.1454b",
"type": "inject",
"z": "f6f2187d.f17ca8",
"name": "Every 12h",
"props": [
{ "p": "payload" },
{
"p": "topic",
"vt": "str"
}
],
"repeat": "43200",
"crontab": "",
"once": false,
"onceDelay": 0.1,
"topic": "",
"payload": "",
"payloadType": "date",
"x": 110,
"y": 200,
"wires": [ [ "7151f9b3.64a868" ] ]
},
{
"id": "8c0e1278.48eeb",
"type": "change",
"z": "f6f2187d.f17ca8",
"name": "doorLock",
"rules": [
{
"t": "set",
"p": "payload",
"pt": "msg",
"to": "payload.status.doorLock",
"tot": "msg"
}
],
"action": "",
"property": "",
"from": "",
"to": "",
"reg": false,
"x": 800,
"y": 160,
"wires": [ [ "4a2701d1.43ed1" ] ]
},
{
"id": "4a2701d1.43ed1",
"type": "mqtt out",
"z": "f6f2187d.f17ca8",
"name": "",
"topic": "bluelinky/doorLock",
"qos": "",
"retain": "",
"broker": "36dd9767.956ae8",
"x": 1010,
"y": 160,
"wires": [ ]
},
{
"id": "c85df5a1.7c67f8",
"type": "change",
"z": "f6f2187d.f17ca8",
"name": "odometer",
"rules": [
{
"t": "set",
"p": "payload",
"pt": "msg",
"to": "payload.value",
"tot": "msg"
}
],
"action": "",
"property": "",
"from": "",
"to": "",
"reg": false,
"x": 680,
"y": 780,
"wires": [ [ "3493be44.5a6802" ] ]
},
{
"id": "f0bdbf6f.5a26c",
"type": "inject",
"z": "f6f2187d.f17ca8",
"name": "Every 24h",
"props": [
{ "p": "payload" },
{
"p": "topic",
"vt": "str"
}
],
"repeat": "86400",
"crontab": "",
"once": false,
"onceDelay": 0.1,
"topic": "",
"payload": "",
"payloadType": "date",
"x": 110,
"y": 720,
"wires": [ [ "421c6f20.cb61f" ] ]
},
{
"id": "1e89420e.7d352e",
"type": "change",
"z": "f6f2187d.f17ca8",
"name": "engine",
"rules": [
{
"t": "set",
"p": "payload",
"pt": "msg",
"to": "payload.status.engine",
"tot": "msg"
}
],
"action": "",
"property": "",
"from": "",
"to": "",
"reg": false,
"x": 790,
"y": 220,
"wires": [ [ "aa799088.efbc5" ] ]
},
{
"id": "aa799088.efbc5",
"type": "mqtt out",
"z": "f6f2187d.f17ca8",
"name": "",
"topic": "bluelinky/engine",
"qos": "",
"retain": "",
"broker": "36dd9767.956ae8",
"x": 1000,
"y": 220,
"wires": [ ]
},
{
"id": "3072f27c.87c05e",
"type": "change",
"z": "f6f2187d.f17ca8",
"name": "airCtrlOn",
"rules": [
{
"t": "set",
"p": "payload",
"pt": "msg",
"to": "payload.status.airCtrlOn",
"tot": "msg"
}
],
"action": "",
"property": "",
"from": "",
"to": "",
"reg": false,
"x": 800,
"y": 280,
"wires": [ [ "f5d01011.764f6" ] ]
},
{
"id": "f5d01011.764f6",
"type": "mqtt out",
"z": "f6f2187d.f17ca8",
"name": "",
"topic": "bluelinky/airCtrlOn",
"qos": "",
"retain": "",
"broker": "36dd9767.956ae8",
"x": 1010,
"y": 280,
"wires": [ ]
},
{
"id": "f86a0cc1.73cb7",
"type": "change",
"z": "f6f2187d.f17ca8",
"name": "trunkOpen",
"rules": [
{
"t": "set",
"p": "payload",
"pt": "msg",
"to": "payload.status.trunkOpen",
"tot": "msg"
}
],
"action": "",
"property": "",
"from": "",
"to": "",
"reg": false,
"x": 810,
"y": 340,
"wires": [ [ "e603126b.6a562" ] ]
},
{
"id": "e603126b.6a562",
"type": "mqtt out",
"z": "f6f2187d.f17ca8",
"name": "",
"topic": "bluelinky/trunkOpen",
"qos": "",
"retain": "",
"broker": "36dd9767.956ae8",
"x": 1020,
"y": 340,
"wires": [ ]
},
{
"id": "3a80f56c.0836fa",
"type": "change",
"z": "f6f2187d.f17ca8",
"name": "hoodOpen",
"rules": [
{
"t": "set",
"p": "payload",
"pt": "msg",
"to": "payload.status.hoodOpen",
"tot": "msg"
}
],
"action": "",
"property": "",
"from": "",
"to": "",
"reg": false,
"x": 810,
"y": 400,
"wires": [ [ "5a7d883c.e56228" ] ]
},
{
"id": "5a7d883c.e56228",
"type": "mqtt out",
"z": "f6f2187d.f17ca8",
"name": "",
"topic": "bluelinky/hoodOpen",
"qos": "",
"retain": "",
"broker": "36dd9767.956ae8",
"x": 1020,
"y": 400,
"wires": [ ]
},
{
"id": "863a07ce.085bd8",
"type": "change",
"z": "f6f2187d.f17ca8",
"name": "batteryStatus",
"rules": [
{
"t": "set",
"p": "payload",
"pt": "msg",
"to": "payload.status.evStatus.batteryStatus",
"tot": "msg"
}
],
"action": "",
"property": "",
"from": "",
"to": "",
"reg": false,
"x": 810,
"y": 460,
"wires": [ [ "b7ab78d8.2186c8" ] ]
},
{
"id": "b7ab78d8.2186c8",
"type": "mqtt out",
"z": "f6f2187d.f17ca8",
"name": "",
"topic": "bluelinky/batteryStatus",
"qos": "",
"retain": "",
"broker": "36dd9767.956ae8",
"x": 1020,
"y": 460,
"wires": [ ]
},
{
"id": "49d564f1.3e30ac",
"type": "change",
"z": "f6f2187d.f17ca8",
"name": "defrost",
"rules": [
{
"t": "set",
"p": "payload",
"pt": "msg",
"to": "payload.status.defrost",
"tot": "msg"
}
],
"action": "",
"property": "",
"from": "",
"to": "",
"reg": false,
"x": 790,
"y": 640,
"wires": [ [ "6309573b.8b5f08" ] ]
},
{
"id": "6309573b.8b5f08",
"type": "mqtt out",
"z": "f6f2187d.f17ca8",
"name": "",
"topic": "bluelinky/defrost",
"qos": "",
"retain": "",
"broker": "36dd9767.956ae8",
"x": 1000,
"y": 640,
"wires": [ ]
},
{
"id": "e7b544a.406a8b8",
"type": "change",
"z": "f6f2187d.f17ca8",
"name": "acc",
"rules": [
{
"t": "set",
"p": "payload",
"pt": "msg",
"to": "payload.status.scc",
"tot": "msg"
}
],
"action": "",
"property": "",
"from": "",
"to": "",
"reg": false,
"x": 790,
"y": 580,
"wires": [ [ "8b622bcc.94d9d8" ] ]
},
{
"id": "8b622bcc.94d9d8",
"type": "mqtt out",
"z": "f6f2187d.f17ca8",
"name": "",
"topic": "bluelinky/acc",
"qos": "",
"retain": "",
"broker": "36dd9767.956ae8",
"x": 990,
"y": 580,
"wires": [ ]
},
{
"id": "b0d6fbd7.64da38",
"type": "change",
"z": "f6f2187d.f17ca8",
"name": "batteryCharge",
"rules": [
{
"t": "set",
"p": "payload",
"pt": "msg",
"to": "payload.status.evStatus.batteryCharge",
"tot": "msg"
}
],
"action": "",
"property": "",
"from": "",
"to": "",
"reg": false,
"x": 820,
"y": 520,
"wires": [ [ "35d69904.5e8b16" ] ]
},
{
"id": "35d69904.5e8b16",
"type": "mqtt out",
"z": "f6f2187d.f17ca8",
"name": "",
"topic": "bluelinky/batteryCharge",
"qos": "",
"retain": "",
"broker": "36dd9767.956ae8",
"x": 1030,
"y": 520,
"wires": [ ]
},
{
"id": "b2af16e1.8e9e48",
"type": "change",
"z": "f6f2187d.f17ca8",
"name": "range",
"rules": [
{
"t": "set",
"p": "payload",
"pt": "msg",
"to": "payload.status.evStatus.drvDistance[0].rangeByFuel.evModeRange.value",
"tot": "msg"
}
],
"action": "",
"property": "",
"from": "",
"to": "",
"reg": false,
"x": 790,
"y": 700,
"wires": [ [ "1e875e4.f7566a2" ] ]
},
{
"id": "1e875e4.f7566a2",
"type": "mqtt out",
"z": "f6f2187d.f17ca8",
"name": "",
"topic": "bluelinky/range",
"qos": "",
"retain": "",
"broker": "36dd9767.956ae8",
"x": 1000,
"y": 700,
"wires": [ ]
},
{
"id": "183e42b8.b4fc8d",
"type": "json",
"z": "f6f2187d.f17ca8",
"name": "",
"property": "payload",
"action": "",
"pretty": false,
"x": 310,
"y": 920,
"wires": [ [ "a2f10779.7ad2c8" ] ]
},
{
"id": "36dd9767.956ae8",
"type": "mqtt-broker",
"name": "mosquitto",
"broker": "<IP>",
"port": "1883",
"clientid": "",
"usetls": false,
"compatmode": false,
"keepalive": "60",
"cleansession": true,
"birthTopic": "",
"birthQos": "0",
"birthPayload": "",
"closeTopic": "",
"closeQos": "0",
"closePayload": "",
"willTopic": "",
"willQos": "0",
"willPayload": ""
},
{
"id": "57d6beca.e51cc",
"type": "bluelinky",
"username": "<Username>",
"password": "<password>",
"region": "EU",
"pin": "<pin>",
"vin": "<vin>"
}
]
So. Die Nodes von https://flows.nodered.org/node/node-red-contrib-bluelinky können jetzt auch das Laden starten und stoppen.
Zitat von: mnl1234 am 14 Januar 2021, 21:28:59
So. Die Nodes von https://flows.nodered.org/node/node-red-contrib-bluelinky können jetzt auch das Laden starten und stoppen.
Mit welchen Nodes soll das gehen?
Zitat von: xerion am 14 Januar 2021, 21:30:40
Mit welchen Nodes soll das gehen?
Mit Node-red, bluelinky und den Nodes von node-red-contrib-bluelinky.
Zitat von: mnl1234 am 14 Januar 2021, 21:57:11
Mit Node-red, bluelinky und den Nodes von node-red-contrib-bluelinky.
Das habe ich schon verstanden. Darum die Frage mit welchen Nodes?
Beispiel der Nodes siehe Screenshot.
Ach so 8)
Die Änderung wurde gerade erst eingecheckt. (https://github.com/SondreNjaastad/node-red-contrib-bluelinky)
Weiß nicht, wie lange es dauert bis das nächste Release gemacht wird. Soll wohl automatisch gehen.
Alternativ kann man ja den Code schon aus dem git holen.
Zitat von: mnl1234 am 14 Januar 2021, 22:22:23
Ach so 8)
Die Änderung wurde gerade erst eingecheckt. (https://github.com/SondreNjaastad/node-red-contrib-bluelinky)
Weiß nicht, wie lange es dauert bis das nächste Release gemacht wird. Soll wohl automatisch gehen.
Alternativ kann man ja den Code schon aus dem git holen.
Perfekt, dann kann ich das auch endlich sinvoll verwenden um komplett PV gesteuert laden zu können 8)
Die bisher bluelinky Anbindung ist bei mir bisher nämlich eher Spielerei.
Okay, ist nun auch offiziell verfügbar. Ich werde es mal einbauen ...
https://flows.nodered.org/node/node-red-contrib-bluelinky (https://flows.nodered.org/node/node-red-contrib-bluelinky)
So, habe jetzt komplett alles neu aufgesetzt. Also NodeRed Docker image mit bluelinky und dann meinen Flow importiert. Leider gibt es nun Probleme mit den Credentials und der Login geht schief :(
---------------------------------------------------------------------
Die Datei mit den Datenflowberechtigungsnachweisen wird mit einem vom System generierten Schlüssel verschlüsselt.
Wenn der vom System generierte Schlüssel aus irgendeinem Grund verloren geht, werden Ihre Berechtigungsnachweise
Die Datei kann nicht wiederhergestellt werden. Sie müssen sie löschen und erneut eingeben.
Ihre Berechtigungsnachweise.
Sie sollten Ihren eigenen Schlüssel mit Hilfe der Option 'credentialSecret' in
Ihre Einstellungsdatei. Node-RED wird dann Ihre Berechtigungsnachweise erneut verschlüsseln.
Datei mit dem ausgewählten Schlüssel beim nächsten Deployen einer Änderung verwenden.
---------------------------------------------------------------------
Kann mir eventuell jemand von euch weiterhelfen? Hab schon etwas recherchiert, aber leider das Problem noch nicht beheben können.
Zitat von: acw81 am 28 Januar 2021, 18:08:02
So, habe jetzt komplett alles neu aufgesetzt. Also NodeRed Docker image mit bluelinky und dann meinen Flow importiert. Leider gibt es nun Probleme mit den Credentials und der Login geht schief :(
---------------------------------------------------------------------
Die Datei mit den Datenflowberechtigungsnachweisen wird mit einem vom System generierten Schlüssel verschlüsselt.
Wenn der vom System generierte Schlüssel aus irgendeinem Grund verloren geht, werden Ihre Berechtigungsnachweise
Die Datei kann nicht wiederhergestellt werden. Sie müssen sie löschen und erneut eingeben.
Ihre Berechtigungsnachweise.
Sie sollten Ihren eigenen Schlüssel mit Hilfe der Option 'credentialSecret' in
Ihre Einstellungsdatei. Node-RED wird dann Ihre Berechtigungsnachweise erneut verschlüsseln.
Datei mit dem ausgewählten Schlüssel beim nächsten Deployen einer Änderung verwenden.
---------------------------------------------------------------------
Kann mir eventuell jemand von euch weiterhelfen? Hab schon etwas recherchiert, aber leider das Problem noch nicht beheben können.
Nutz du noch den Bluelink Account oder hast du schon auf Hyundai Account umgestellt?
Zitat von: xerion am 28 Januar 2021, 20:00:09
Nutz du noch den Bluelink Account oder hast du schon auf Hyundai Account umgestellt?
Klär mich mal auf. Ich habe damals bei Fahrzeugübergabe (10/20) direkt in der Bluelink App einen Account angelegt. Vermute mal das ich dann einen Bluelink Account habe. Hat sich da etwas geändert? Zugriff über die App funktioniert im Moment aber noch.
Zitat von: acw81 am 28 Januar 2021, 18:08:02
Kann mir eventuell jemand von euch weiterhelfen? Hab schon etwas recherchiert, aber leider das Problem noch nicht beheben können.
Geht mal auf den Discord-Server von den Entwicklern (hoffe, der Link ist hier erlaubt: https://discord.gg/HwnG8sY )
Die Leute da haben das Thema kürzlich schonmal diskutiert und sollten Dir am zielführendsdenn helfen können. ;-)
Zitat von: acw81 am 29 Januar 2021, 08:29:08
Klär mich mal auf. Ich habe damals bei Fahrzeugübergabe (10/20) direkt in der Bluelink App einen Account angelegt. Vermute mal das ich dann einen Bluelink Account habe. Hat sich da etwas geändert? Zugriff über die App funktioniert im Moment aber noch.
Ich hatte am Anfang auch den einfachen Bluelink Account. Nachdem ich mich aber erneut anmelden musste bekam ich eine Abfrage ob ich mit mit dem Bluelink oder Hyundai Account anmelde möchte. Ich habe darauf einen Hyundai Account erstellt und nutze diesen nun für die App. Diese Zugang schient nun auch Bluelinky zu nutzen, zumindest funktioniert es bei mir darüber.
Habe das vor längerer Zeit mal gefunden:
https://github.com/Hacksore/bluelinky/issues/89
Ich habe auch schon das starten/stoppen des Ladevorgangs über NodeRed testweise integriert. Ich finde es nicht so toll da mich die Zeit Verzögerung stört. Ich mache das alles über FHEM und EVCC. Ist für mich die praktikabelste Lösung. Bluelinky nutze ich nur für die Komfort Feature (Heizung/Klima, Statusabfragen usw.)
Zitat von: xerion am 29 Januar 2021, 09:43:20
Ich hatte am Anfang auch den einfachen Bluelink Account. Nachdem ich mich aber erneut anmelden musste bekam ich eine Abfrage ob ich mit mit dem Bluelink oder Hyundai Account anmelde möchte. Ich habe darauf einen Hyundai Account erstellt und nutze diesen nun für die App. Diese Zugang schient nun auch Bluelinky zu nutzen, zumindest funktioniert es bei mir darüber.
Habe das vor längerer Zeit mal gefunden:
https://github.com/Hacksore/bluelinky/issues/89
Ich habe auch schon das starten/stoppen des Ladevorgangs über NodeRed testweise integriert. Ich finde es nicht so toll da mich die Zeit Verzögerung stört. Ich mache das alles über FHEM und EVCC. Ist für mich die praktikabelste Lösung. Bluelinky nutze ich nur für die Komfort Feature (Heizung/Klima, Statusabfragen usw.)
Ja, das scheint es gewesen zu sein. Danke
Also ich bekomme das mit dem Bluelink einfach nicht gebacken... Über EVCC nach wie vor erfolglos (ich vermute das liegt irgendwie am Bluelink Login / Hyundai Account)
Jetzt würde ich erstmal zum Test gerne direkt über Bluelinky gehen. Hab es mal auf meinem FHEM Pi gezogen und im Ordner (node_modules/bluelinky die config.json mit meinen Login daten erstellt.
Nun muss ich doch irgendwie mit
npm run build
den Code ausführbar machen
Leider bekomme ich das nicht hin, -> Absouter Anfänger.
Könnte ihr mir da ein wenig helfen? Gerne auch per PN weil´s ja nicht direkt mit FHEM zu tun hat.
Zitat von: michisa86888 am 02 Februar 2021, 08:11:08
Also ich bekomme das mit dem Bluelink einfach nicht gebacken... Über EVCC nach wie vor erfolglos (ich vermute das liegt irgendwie am Bluelink Login / Hyundai Account)
Jetzt würde ich erstmal zum Test gerne direkt über Bluelinky gehen. Hab es mal auf meinem FHEM Pi gezogen und im Ordner (node_modules/bluelinky die config.json mit meinen Login daten erstellt.
Nun muss ich doch irgendwie mit
npm run build
den Code ausführbar machen
Leider bekomme ich das nicht hin, -> Absouter Anfänger.
Könnte ihr mir da ein wenig helfen? Gerne auch per PN weil´s ja nicht direkt mit FHEM zu tun hat.
Moin am besten NodeRed als Anfänger nutzen. Das hat eine grafische Oberfläche und man kann viel oer Drag und drop machen. Eine Beispielkonfiguration für NodeRed findest du weiter oben. Wie man NodeRed installiert ist im Netz zu finden.
Um den Fehler von EVCC zu erfahren wäre ein Log hilfreich.
Okay schaue ich mir mal an...
Wo finde ich den dass EVCC log?
Hier mal das Log von Konsole:
[lp-1 ] WARN 2021/02/02 09:11:35 poll mode '{always 1m0s}' may deplete your bat tery or lead to API misuse. USE AT YOUR OWN RISK.
[lp-1 ] WARN 2021/02/02 09:11:35 poll interval '1m0s' is lower than 1h0m0s and may deplete your battery or lead to API misuse. USE AT YOUR OWN RISK.
[lp-1 ] ERROR 2021/02/02 09:11:36 charger error: recv timeout
[lp-1 ] INFO 2021/02/02 09:11:36 loadpoint 1:
[lp-1 ] INFO 2021/02/02 09:11:36 mode: pv
[lp-1 ] INFO 2021/02/02 09:11:36 charger: power ✓ energy ✓ currents ✓ timer —
[lp-1 ] INFO 2021/02/02 09:11:36 meters: charge ✓
[lp-1 ] INFO 2021/02/02 09:11:36 charge: power ✓ energy ✓ currents ✓
[lp-1 ] INFO 2021/02/02 09:11:36 vehicles: ✓
[lp-1 ] INFO 2021/02/02 09:11:36 car 0: finish — status — climate —
[lp-1 ] ERROR 2021/02/02 09:11:45 updating charge meter: recv timeout
[lp-1 ] ERROR 2021/02/02 09:11:46 charge rater error: recv timeout
[lp-1 ] ERROR 2021/02/02 09:11:47 charger error: recv timeout
[lp-1 ] ERROR 2021/02/02 09:11:51 updating charge meter: recv timeout
Werden nur Fehler von der Ladestadion angzeigt die noch nicht angeschlossen ist...
Zitat von: michisa86888 am 02 Februar 2021, 08:45:44
Okay schaue ich mir mal an...
Wo finde ich den dass EVCC log?
Wenn du EVCC über die Shell gestartet hast bekommst du das Log direkt auf der Console angezeigt.
Zitat von: xerion am 02 Februar 2021, 09:19:25
Wenn du EVCC über die Shell gestartet hast bekommst du das Log direkt auf der Console angezeigt.
siehe Beitrag davor, hab den Editiert... Steht aber nichts von einem Fehler bezuglich des Konas drin.
Log config aktuell so:
log: error
levels:
core: debug
lp-1: debug
lp-2: debug
Zitat von: michisa86888 am 02 Februar 2021, 09:27:34
siehe Beitrag davor, hab den Editiert... Steht aber nichts von einem Fehler bezuglich des Konas drin.
Log config aktuell so:
log: error
levels:
core: debug
lp-1: debug
lp-2: debug
Wird denn die Web UI ohne Fehler angezeigt?
Zeige mal deine evcc.yaml (Wichtig User Daten löschen!)
Hier meine evcc.yaml
uri: 192.168.178.27:7070 # uri for ui
interval: 10s # control cycle interval
# log settings
log: error
levels:
core: debug
lp-1: debug
lp-2: debug
# meter definitions
# name can be freely chosen and is used as reference when assigning meters to site and loadpoints
# for examples see https://github.com/andig/evcc-config#meters
meters:
meters:
- name: grid
type: default
power: # power reading
type: mqtt # use mqtt plugin
topic: fronius/verbrauch # mqtt topic
timeout: 20s # don't use older values
- name: pv
type: default
power: # power reading
type: mqtt # use mqtt plugin
topic: fronius/leistung # mqtt topic
timeout: 20s # don't use older values
# charger definitions
# name can be freely chosen and is used as reference when assigning charger to vehicle
# for examples see https://github.com/andig/evcc-config#chargers
chargers:
- name: keba
type: keba
uri: 192.168.178.210:7090
# vehicle definitions
# name can be freely chosen and is used as reference when assigning vehicle to loadpoint
# for examples see https://github.com/andig/evcc-config#vehicles
vehicles:
- name: kona
type: hyundai
title: Hyundai Kona # display name for UI
capacity: 39 # kWh
user: testemail235@gmx.de # user
password: $userpassword # password
cache: 1m # cache API response
# site describes the EVU connection, PV and home battery
site:
title: Home Ladestation # display name for UI
meters:
grid: grid # grid meter
pv: pv # pv meter
battery: # battery meter
prioritySoC: 60 # give home battery priority up to this soc (0 to disable)
# loadpoint describes the charger, charge meter and connected vehicle
loadpoints:
- title: Garage # display name for UI
charger: keba # charger
meters: #charge: charge # charge meter
vehicle: kona
# vehicles: # use if multiple vehicles allowed to charge on this loadpoint
# - ID.3
# - e-Up
mode: pv
soc:
# polling defines usage of the vehicle APIs
# Modifying the default settings it NOT recommended. It MAY deplete your vehicle's battery
# or lead to vehicle manufacturer banning you from API use. USE AT YOUR OWN RISK.
poll:
# poll mode defines under which condition the vehicle API is called:
# charging: update vehicle ONLY when charging (this is the recommended default)
# connected: update vehicle when connected (not only charging), interval defines how often
# always: always update vehicle regardless of connection state, interval defines how often
mode: always
# poll interval defines how often the vehicle API may be polled if NOT charging
interval: 1m
min: 0 # immediately charge to 0% regardless of mode unless "off" (disabled)
target: 100 # always charge to 100%
estimate: false # set true to interpolate between api updates
levels: # target soc levels for UI
- 30
- 50
- 80
- 100
onDisconnect: # set defaults when vehicle disconnects
mode: pv # switch back to pv mode
targetSoC: 100 # charge to 100%
phases: 1 # ev phases (default 3)
enable: # pv mode enable behavior
delay: 1m # threshold must be exceeded for this long
threshold: 0 # minimum export power (W). If zero, export must exceed minimum charge power to enable
disable: # pv mode disable behavior
delay: 5m # threshold must be exceeded for this long
threshold: 200 # maximum import power (W)
guardduration: 5m # switch charger contactor not more often than this (default 10m)
mincurrent: 6 # minimum charge current (default 6A)
maxcurrent: 16 # maximum charge current (default 16A)
# mqtt message broker
mqtt:
broker: localhost:1883
topic: # root topic for publishing, set empty to disable
user:
password:
# influx database
influx:
# url: http://localhost:8086
# database: evcc
# user:
# password:
# push messages
messaging:
events:
start: # charge start event
title: Charge started
msg: Started charging in "${mode}" mode
stop: # charge stop event
title: Charge finished
msg: Finished charging ${chargedEnergy:%.1fk}kWh in ${chargeDuration}.
connect: # vehicle connect event
title: Car connected
msg: "Car connected at ${pvPower:%.1fk}kW PV"
disconnect: # vehicle connected event
title: Car disconnected
msg: Car disconnected after ${connectedDuration}
services:
# - type: pushover
# app: # app id
# recipients:
# - # list of recipient ids
# - type: telegram
# token: # bot id
# chats:
# - # list of chat ids
# - type: email
# uri: smtp://<user>:<password>@<host>:<port>/?fromAddress=<from>&toAddresses=<to>
In der WebUI werden die gleichen beiden Meldungen angezeigt wie in der Konsole
In der App muss ich weiterhin die PIN eingeben sobald ich einen Befehl ans Auto senden will...hat es vielleicht damit was zu tun?
Zitat von: michisa86888 am 02 Februar 2021, 11:52:48
Hier meine evcc.yaml
uri: 192.168.178.27:7070 # uri for ui
interval: 10s # control cycle interval
# log settings
log: error
levels:
core: debug
lp-1: debug
lp-2: debug
# meter definitions
# name can be freely chosen and is used as reference when assigning meters to site and loadpoints
# for examples see https://github.com/andig/evcc-config#meters
meters:
meters:
- name: grid
type: default
power: # power reading
type: mqtt # use mqtt plugin
topic: fronius/verbrauch # mqtt topic
timeout: 20s # don't use older values
- name: pv
type: default
power: # power reading
type: mqtt # use mqtt plugin
topic: fronius/leistung # mqtt topic
timeout: 20s # don't use older values
# charger definitions
# name can be freely chosen and is used as reference when assigning charger to vehicle
# for examples see https://github.com/andig/evcc-config#chargers
chargers:
- name: keba
type: keba
uri: 192.168.178.210:7090
# vehicle definitions
# name can be freely chosen and is used as reference when assigning vehicle to loadpoint
# for examples see https://github.com/andig/evcc-config#vehicles
vehicles:
- name: kona
type: hyundai
title: Hyundai Kona # display name for UI
capacity: 39 # kWh
user: testemail235@gmx.de # user
password: $userpassword # password
cache: 1m # cache API response
# site describes the EVU connection, PV and home battery
site:
title: Home Ladestation # display name for UI
meters:
grid: grid # grid meter
pv: pv # pv meter
battery: # battery meter
prioritySoC: 60 # give home battery priority up to this soc (0 to disable)
# loadpoint describes the charger, charge meter and connected vehicle
loadpoints:
- title: Garage # display name for UI
charger: keba # charger
meters: #charge: charge # charge meter
vehicle: kona
# vehicles: # use if multiple vehicles allowed to charge on this loadpoint
# - ID.3
# - e-Up
mode: pv
soc:
# polling defines usage of the vehicle APIs
# Modifying the default settings it NOT recommended. It MAY deplete your vehicle's battery
# or lead to vehicle manufacturer banning you from API use. USE AT YOUR OWN RISK.
poll:
# poll mode defines under which condition the vehicle API is called:
# charging: update vehicle ONLY when charging (this is the recommended default)
# connected: update vehicle when connected (not only charging), interval defines how often
# always: always update vehicle regardless of connection state, interval defines how often
mode: always
# poll interval defines how often the vehicle API may be polled if NOT charging
interval: 1m
min: 0 # immediately charge to 0% regardless of mode unless "off" (disabled)
target: 100 # always charge to 100%
estimate: false # set true to interpolate between api updates
levels: # target soc levels for UI
- 30
- 50
- 80
- 100
onDisconnect: # set defaults when vehicle disconnects
mode: pv # switch back to pv mode
targetSoC: 100 # charge to 100%
phases: 1 # ev phases (default 3)
enable: # pv mode enable behavior
delay: 1m # threshold must be exceeded for this long
threshold: 0 # minimum export power (W). If zero, export must exceed minimum charge power to enable
disable: # pv mode disable behavior
delay: 5m # threshold must be exceeded for this long
threshold: 200 # maximum import power (W)
guardduration: 5m # switch charger contactor not more often than this (default 10m)
mincurrent: 6 # minimum charge current (default 6A)
maxcurrent: 16 # maximum charge current (default 16A)
# mqtt message broker
mqtt:
broker: localhost:1883
topic: # root topic for publishing, set empty to disable
user:
password:
# influx database
influx:
# url: http://localhost:8086
# database: evcc
# user:
# password:
# push messages
messaging:
events:
start: # charge start event
title: Charge started
msg: Started charging in "${mode}" mode
stop: # charge stop event
title: Charge finished
msg: Finished charging ${chargedEnergy:%.1fk}kWh in ${chargeDuration}.
connect: # vehicle connect event
title: Car connected
msg: "Car connected at ${pvPower:%.1fk}kW PV"
disconnect: # vehicle connected event
title: Car disconnected
msg: Car disconnected after ${connectedDuration}
services:
# - type: pushover
# app: # app id
# recipients:
# - # list of recipient ids
# - type: telegram
# token: # bot id
# chats:
# - # list of chat ids
# - type: email
# uri: smtp://<user>:<password>@<host>:<port>/?fromAddress=<from>&toAddresses=<to>
In der WebUI werden die gleichen beiden Meldungen angezeigt wie in der Konsole
In der App muss ich weiterhin die PIN eingeben sobald ich einen Befehl ans Auto senden will...hat es vielleicht damit was zu tun?
Für die Abfrage von von Werten brauchst du keine PIN das geht ohne.
ZitatIn der WebUI werden die gleichen beiden Meldungen angezeigt wie in der Konsole
Welche sind das es wäre hilfreich wenn du das teilst was du siehst damit wir nicht raten müssen sonst stellst sich eine Hilfe sehr schwer da.
Die evvc.yaml kann so nicht funktionieren, da die Grundeinstellungen fehlen. Am besten nutze einen Editor der .yaml Daten unterstützt dann siehst du auch sofort welche Attribute bei dir z.b. doppelt sind und somit nicht funktionieren. Weitere Fragen zu EVCC entweder per PN oder versuchen auf github von EVCC zu erlesen.
Zitat von: michisa86888 am 02 Februar 2021, 08:45:44
Hier mal das Log von Konsole:
[lp-1 ] WARN 2021/02/02 09:11:35 poll mode '{always 1m0s}' may deplete your bat tery or lead to API misuse. USE AT YOUR OWN RISK.
[lp-1 ] WARN 2021/02/02 09:11:35 poll interval '1m0s' is lower than 1h0m0s and may deplete your battery or lead to API misuse. USE AT YOUR OWN RISK.
[lp-1 ] ERROR 2021/02/02 09:11:36 charger error: recv timeout
[lp-1 ] INFO 2021/02/02 09:11:36 loadpoint 1:
[lp-1 ] INFO 2021/02/02 09:11:36 mode: pv
[lp-1 ] INFO 2021/02/02 09:11:36 charger: power ✓ energy ✓ currents ✓ timer —
[lp-1 ] INFO 2021/02/02 09:11:36 meters: charge ✓
[lp-1 ] INFO 2021/02/02 09:11:36 charge: power ✓ energy ✓ currents ✓
[lp-1 ] INFO 2021/02/02 09:11:36 vehicles: ✓
[lp-1 ] INFO 2021/02/02 09:11:36 car 0: finish — status — climate —
[lp-1 ] ERROR 2021/02/02 09:11:45 updating charge meter: recv timeout
[lp-1 ] ERROR 2021/02/02 09:11:46 charge rater error: recv timeout
[lp-1 ] ERROR 2021/02/02 09:11:47 charger error: recv timeout
[lp-1 ] ERROR 2021/02/02 09:11:51 updating charge meter: recv timeout
Log habe ich oben mal gepostet. Diese letzten 3 Error Meldungen werden auch in der WebUI angezeigt.
Zitat von: michisa86888 am 02 Februar 2021, 15:50:12
Log habe ich oben mal gepostet. Diese letzten 3 Error Meldungen werden auch in der WebUI angezeigt.
Ja das passt auch zu der fehlerhaften evcc.yaml das sollte wie gesagt außerhalb vom FHEM Forum diskutiert werden das die Basics von EVCC sind und nichts mit FHEM zu tun hat.
Okay, da nun das Problem mit EVCC gelöst wurde, vielen Dank hier noch an @xerion bin ich nun dabei den NodeRed - Flow per MQTT an FHEM anzubinden..
Zitat von: acw81 am 13 Januar 2021, 18:50:24
Okay, jetzt funktioniert alles. Hier nochmal der aktualisierte Flow.
[
{
"id": "f6f2187d.f17ca8",
"type": "tab",
"label": "Flow 1",
"disabled": false,
"info": ""
},
{
"id": "3cc11d24.ff01a2",
"type": "comment",
"z": "f6f2187d.f17ca8",
"name": "WARNING: please check you have started this container with a volume that is mounted to /data\\n otherwise any flow changes are lost when you redeploy or upgrade the container\\n (e.g. upgrade to a more recent node-red docker image).\\n If you are using named volumes you can ignore this warning.\\n Double click or see info side panel to learn how to start Node-RED in Docker to save your work",
"info": "\nTo start docker with a bind mount volume (-v option), for example:\n\n```\ndocker run -it -p 1880:1880 -v /home/user/node_red_data:/data --name mynodered nodered/node-red\n```\n\nwhere `/home/user/node_red_data` is a directory on your host machine where you want to store your flows.\n\nIf you do not do this then you can experiment and redploy flows, but if you restart or upgrade the container the flows will be disconnected and lost. \n\nThey will still exist in a hidden data volume, which can be recovered using standard docker techniques, but that is much more complex than just starting with a named volume as described above.",
"x": 350,
"y": 80,
"wires": [ ]
},
{
"id": "4ae7cfad.ef2f9",
"type": "mqtt in",
"z": "f6f2187d.f17ca8",
"name": "",
"topic": "cmnd/bluelinky/get_status",
"qos": "2",
"datatype": "auto",
"broker": "36dd9767.956ae8",
"x": 130,
"y": 280,
"wires": [ [ "7151f9b3.64a868" ] ]
},
{
"id": "80b490f1.a70b5",
"type": "mqtt in",
"z": "f6f2187d.f17ca8",
"name": "",
"topic": "cmnd/bluelinky/stop_ac",
"qos": "2",
"datatype": "auto",
"broker": "36dd9767.956ae8",
"x": 120,
"y": 1000,
"wires": [ [ "35e227cd.4f7fc8" ] ]
},
{
"id": "2722c4a8.0a071c",
"type": "mqtt in",
"z": "f6f2187d.f17ca8",
"name": "",
"topic": "cmnd/bluelinky/start_ac",
"qos": "2",
"datatype": "auto",
"broker": "36dd9767.956ae8",
"x": 120,
"y": 920,
"wires": [ [ "183e42b8.b4fc8d" ] ]
},
{
"id": "7151f9b3.64a868",
"type": "car-status",
"z": "f6f2187d.f17ca8",
"name": "Get status",
"dorefresh": true,
"parsed": false,
"bluelinky": "57d6beca.e51cc",
"x": 410,
"y": 200,
"wires": [ [ "478f506c.59b44", "8c0e1278.48eeb", "1e89420e.7d352e", "3072f27c.87c05e", "f86a0cc1.73cb7", "3a80f56c.0836fa", "b0d6fbd7.64da38", "863a07ce.085bd8", "e7b544a.406a8b8", "49d564f1.3e30ac", "b2af16e1.8e9e48" ] ]
},
{
"id": "a2f10779.7ad2c8",
"type": "start-car",
"z": "f6f2187d.f17ca8",
"name": "Start car",
"bluelinky": "57d6beca.e51cc",
"x": 460,
"y": 920,
"wires": [ [ "478f506c.59b44" ] ],
"inputLabels": [ "airTempvalue: 19.0" ],
"info": "19"
},
{
"id": "35e227cd.4f7fc8",
"type": "stop-car",
"z": "f6f2187d.f17ca8",
"name": "Stop car",
"bluelinky": "57d6beca.e51cc",
"x": 460,
"y": 1000,
"wires": [ [ "478f506c.59b44" ] ]
},
{
"id": "478f506c.59b44",
"type": "debug",
"z": "f6f2187d.f17ca8",
"name": "",
"active": true,
"tosidebar": true,
"console": false,
"tostatus": false,
"complete": "payload",
"targetType": "msg",
"statusVal": "",
"statusType": "auto",
"x": 770,
"y": 920,
"wires": [ ]
},
{
"id": "4a75fc2f.1e51e4",
"type": "unlock-car",
"z": "f6f2187d.f17ca8",
"name": "Unlock car",
"bluelinky": "57d6beca.e51cc",
"x": 470,
"y": 1080,
"wires": [ [ "478f506c.59b44", "a10b38ae.94e5d8" ] ]
},
{
"id": "2eef0961.a65396",
"type": "mqtt in",
"z": "f6f2187d.f17ca8",
"name": "",
"topic": "cmnd/bluelinky/unlock_car",
"qos": "2",
"datatype": "auto",
"broker": "36dd9767.956ae8",
"x": 130,
"y": 1080,
"wires": [ [ "4a75fc2f.1e51e4" ] ]
},
{
"id": "250acff4.b367",
"type": "mqtt in",
"z": "f6f2187d.f17ca8",
"name": "",
"topic": "cmnd/bluelinky/lock_car",
"qos": "2",
"datatype": "auto",
"broker": "36dd9767.956ae8",
"x": 120,
"y": 1160,
"wires": [ [ "19c514c7.ca8aab" ] ]
},
{
"id": "19c514c7.ca8aab",
"type": "lock-car",
"z": "f6f2187d.f17ca8",
"name": "Lock car",
"bluelinky": "57d6beca.e51cc",
"x": 460,
"y": 1160,
"wires": [ [ "478f506c.59b44", "a10b38ae.94e5d8" ] ]
},
{
"id": "cbdfadee.54f1c",
"type": "car-location",
"z": "f6f2187d.f17ca8",
"name": "Get car location",
"bluelinky": "57d6beca.e51cc",
"x": 480,
"y": 1240,
"wires": [ [ "2e394950.ce9296", "478f506c.59b44" ] ]
},
{
"id": "421c6f20.cb61f",
"type": "car-odometer",
"z": "f6f2187d.f17ca8",
"name": "Get car odometer",
"bluelinky": "57d6beca.e51cc",
"x": 450,
"y": 780,
"wires": [ [ "478f506c.59b44", "c85df5a1.7c67f8" ] ]
},
{
"id": "ae4a76ba.d1b7e8",
"type": "mqtt in",
"z": "f6f2187d.f17ca8",
"name": "",
"topic": "cmnd/bluelinky/get_odometer",
"qos": "2",
"datatype": "auto",
"broker": "36dd9767.956ae8",
"x": 140,
"y": 780,
"wires": [ [ "421c6f20.cb61f" ] ]
},
{
"id": "a10b38ae.94e5d8",
"type": "mqtt out",
"z": "f6f2187d.f17ca8",
"name": "",
"topic": "bluelinky/doors",
"qos": "",
"retain": "",
"broker": "36dd9767.956ae8",
"x": 740,
"y": 1160,
"wires": [ ]
},
{
"id": "3493be44.5a6802",
"type": "mqtt out",
"z": "f6f2187d.f17ca8",
"name": "",
"topic": "bluelinky/odometer",
"qos": "",
"retain": "",
"broker": "36dd9767.956ae8",
"x": 870,
"y": 780,
"wires": [ ]
},
{
"id": "cc998b60.1f7408",
"type": "mqtt in",
"z": "f6f2187d.f17ca8",
"name": "",
"topic": "cmnd/bluelinky/get_location",
"qos": "2",
"datatype": "auto",
"broker": "36dd9767.956ae8",
"x": 140,
"y": 1240,
"wires": [ [ "cbdfadee.54f1c" ] ]
},
{
"id": "2e394950.ce9296",
"type": "mqtt out",
"z": "f6f2187d.f17ca8",
"name": "",
"topic": "bluelinky/location",
"qos": "",
"retain": "",
"broker": "36dd9767.956ae8",
"x": 750,
"y": 1240,
"wires": [ ]
},
{
"id": "47d9808d.1454b",
"type": "inject",
"z": "f6f2187d.f17ca8",
"name": "Every 12h",
"props": [
{ "p": "payload" },
{
"p": "topic",
"vt": "str"
}
],
"repeat": "43200",
"crontab": "",
"once": false,
"onceDelay": 0.1,
"topic": "",
"payload": "",
"payloadType": "date",
"x": 110,
"y": 200,
"wires": [ [ "7151f9b3.64a868" ] ]
},
{
"id": "8c0e1278.48eeb",
"type": "change",
"z": "f6f2187d.f17ca8",
"name": "doorLock",
"rules": [
{
"t": "set",
"p": "payload",
"pt": "msg",
"to": "payload.status.doorLock",
"tot": "msg"
}
],
"action": "",
"property": "",
"from": "",
"to": "",
"reg": false,
"x": 800,
"y": 160,
"wires": [ [ "4a2701d1.43ed1" ] ]
},
{
"id": "4a2701d1.43ed1",
"type": "mqtt out",
"z": "f6f2187d.f17ca8",
"name": "",
"topic": "bluelinky/doorLock",
"qos": "",
"retain": "",
"broker": "36dd9767.956ae8",
"x": 1010,
"y": 160,
"wires": [ ]
},
{
"id": "c85df5a1.7c67f8",
"type": "change",
"z": "f6f2187d.f17ca8",
"name": "odometer",
"rules": [
{
"t": "set",
"p": "payload",
"pt": "msg",
"to": "payload.value",
"tot": "msg"
}
],
"action": "",
"property": "",
"from": "",
"to": "",
"reg": false,
"x": 680,
"y": 780,
"wires": [ [ "3493be44.5a6802" ] ]
},
{
"id": "f0bdbf6f.5a26c",
"type": "inject",
"z": "f6f2187d.f17ca8",
"name": "Every 24h",
"props": [
{ "p": "payload" },
{
"p": "topic",
"vt": "str"
}
],
"repeat": "86400",
"crontab": "",
"once": false,
"onceDelay": 0.1,
"topic": "",
"payload": "",
"payloadType": "date",
"x": 110,
"y": 720,
"wires": [ [ "421c6f20.cb61f" ] ]
},
{
"id": "1e89420e.7d352e",
"type": "change",
"z": "f6f2187d.f17ca8",
"name": "engine",
"rules": [
{
"t": "set",
"p": "payload",
"pt": "msg",
"to": "payload.status.engine",
"tot": "msg"
}
],
"action": "",
"property": "",
"from": "",
"to": "",
"reg": false,
"x": 790,
"y": 220,
"wires": [ [ "aa799088.efbc5" ] ]
},
{
"id": "aa799088.efbc5",
"type": "mqtt out",
"z": "f6f2187d.f17ca8",
"name": "",
"topic": "bluelinky/engine",
"qos": "",
"retain": "",
"broker": "36dd9767.956ae8",
"x": 1000,
"y": 220,
"wires": [ ]
},
{
"id": "3072f27c.87c05e",
"type": "change",
"z": "f6f2187d.f17ca8",
"name": "airCtrlOn",
"rules": [
{
"t": "set",
"p": "payload",
"pt": "msg",
"to": "payload.status.airCtrlOn",
"tot": "msg"
}
],
"action": "",
"property": "",
"from": "",
"to": "",
"reg": false,
"x": 800,
"y": 280,
"wires": [ [ "f5d01011.764f6" ] ]
},
{
"id": "f5d01011.764f6",
"type": "mqtt out",
"z": "f6f2187d.f17ca8",
"name": "",
"topic": "bluelinky/airCtrlOn",
"qos": "",
"retain": "",
"broker": "36dd9767.956ae8",
"x": 1010,
"y": 280,
"wires": [ ]
},
{
"id": "f86a0cc1.73cb7",
"type": "change",
"z": "f6f2187d.f17ca8",
"name": "trunkOpen",
"rules": [
{
"t": "set",
"p": "payload",
"pt": "msg",
"to": "payload.status.trunkOpen",
"tot": "msg"
}
],
"action": "",
"property": "",
"from": "",
"to": "",
"reg": false,
"x": 810,
"y": 340,
"wires": [ [ "e603126b.6a562" ] ]
},
{
"id": "e603126b.6a562",
"type": "mqtt out",
"z": "f6f2187d.f17ca8",
"name": "",
"topic": "bluelinky/trunkOpen",
"qos": "",
"retain": "",
"broker": "36dd9767.956ae8",
"x": 1020,
"y": 340,
"wires": [ ]
},
{
"id": "3a80f56c.0836fa",
"type": "change",
"z": "f6f2187d.f17ca8",
"name": "hoodOpen",
"rules": [
{
"t": "set",
"p": "payload",
"pt": "msg",
"to": "payload.status.hoodOpen",
"tot": "msg"
}
],
"action": "",
"property": "",
"from": "",
"to": "",
"reg": false,
"x": 810,
"y": 400,
"wires": [ [ "5a7d883c.e56228" ] ]
},
{
"id": "5a7d883c.e56228",
"type": "mqtt out",
"z": "f6f2187d.f17ca8",
"name": "",
"topic": "bluelinky/hoodOpen",
"qos": "",
"retain": "",
"broker": "36dd9767.956ae8",
"x": 1020,
"y": 400,
"wires": [ ]
},
{
"id": "863a07ce.085bd8",
"type": "change",
"z": "f6f2187d.f17ca8",
"name": "batteryStatus",
"rules": [
{
"t": "set",
"p": "payload",
"pt": "msg",
"to": "payload.status.evStatus.batteryStatus",
"tot": "msg"
}
],
"action": "",
"property": "",
"from": "",
"to": "",
"reg": false,
"x": 810,
"y": 460,
"wires": [ [ "b7ab78d8.2186c8" ] ]
},
{
"id": "b7ab78d8.2186c8",
"type": "mqtt out",
"z": "f6f2187d.f17ca8",
"name": "",
"topic": "bluelinky/batteryStatus",
"qos": "",
"retain": "",
"broker": "36dd9767.956ae8",
"x": 1020,
"y": 460,
"wires": [ ]
},
{
"id": "49d564f1.3e30ac",
"type": "change",
"z": "f6f2187d.f17ca8",
"name": "defrost",
"rules": [
{
"t": "set",
"p": "payload",
"pt": "msg",
"to": "payload.status.defrost",
"tot": "msg"
}
],
"action": "",
"property": "",
"from": "",
"to": "",
"reg": false,
"x": 790,
"y": 640,
"wires": [ [ "6309573b.8b5f08" ] ]
},
{
"id": "6309573b.8b5f08",
"type": "mqtt out",
"z": "f6f2187d.f17ca8",
"name": "",
"topic": "bluelinky/defrost",
"qos": "",
"retain": "",
"broker": "36dd9767.956ae8",
"x": 1000,
"y": 640,
"wires": [ ]
},
{
"id": "e7b544a.406a8b8",
"type": "change",
"z": "f6f2187d.f17ca8",
"name": "acc",
"rules": [
{
"t": "set",
"p": "payload",
"pt": "msg",
"to": "payload.status.scc",
"tot": "msg"
}
],
"action": "",
"property": "",
"from": "",
"to": "",
"reg": false,
"x": 790,
"y": 580,
"wires": [ [ "8b622bcc.94d9d8" ] ]
},
{
"id": "8b622bcc.94d9d8",
"type": "mqtt out",
"z": "f6f2187d.f17ca8",
"name": "",
"topic": "bluelinky/acc",
"qos": "",
"retain": "",
"broker": "36dd9767.956ae8",
"x": 990,
"y": 580,
"wires": [ ]
},
{
"id": "b0d6fbd7.64da38",
"type": "change",
"z": "f6f2187d.f17ca8",
"name": "batteryCharge",
"rules": [
{
"t": "set",
"p": "payload",
"pt": "msg",
"to": "payload.status.evStatus.batteryCharge",
"tot": "msg"
}
],
"action": "",
"property": "",
"from": "",
"to": "",
"reg": false,
"x": 820,
"y": 520,
"wires": [ [ "35d69904.5e8b16" ] ]
},
{
"id": "35d69904.5e8b16",
"type": "mqtt out",
"z": "f6f2187d.f17ca8",
"name": "",
"topic": "bluelinky/batteryCharge",
"qos": "",
"retain": "",
"broker": "36dd9767.956ae8",
"x": 1030,
"y": 520,
"wires": [ ]
},
{
"id": "b2af16e1.8e9e48",
"type": "change",
"z": "f6f2187d.f17ca8",
"name": "range",
"rules": [
{
"t": "set",
"p": "payload",
"pt": "msg",
"to": "payload.status.evStatus.drvDistance[0].rangeByFuel.evModeRange.value",
"tot": "msg"
}
],
"action": "",
"property": "",
"from": "",
"to": "",
"reg": false,
"x": 790,
"y": 700,
"wires": [ [ "1e875e4.f7566a2" ] ]
},
{
"id": "1e875e4.f7566a2",
"type": "mqtt out",
"z": "f6f2187d.f17ca8",
"name": "",
"topic": "bluelinky/range",
"qos": "",
"retain": "",
"broker": "36dd9767.956ae8",
"x": 1000,
"y": 700,
"wires": [ ]
},
{
"id": "183e42b8.b4fc8d",
"type": "json",
"z": "f6f2187d.f17ca8",
"name": "",
"property": "payload",
"action": "",
"pretty": false,
"x": 310,
"y": 920,
"wires": [ [ "a2f10779.7ad2c8" ] ]
},
{
"id": "36dd9767.956ae8",
"type": "mqtt-broker",
"name": "mosquitto",
"broker": "<IP>",
"port": "1883",
"clientid": "",
"usetls": false,
"compatmode": false,
"keepalive": "60",
"cleansession": true,
"birthTopic": "",
"birthQos": "0",
"birthPayload": "",
"closeTopic": "",
"closeQos": "0",
"closePayload": "",
"willTopic": "",
"willQos": "0",
"willPayload": ""
},
{
"id": "57d6beca.e51cc",
"type": "bluelinky",
"username": "<Username>",
"password": "<password>",
"region": "EU",
"pin": "<pin>",
"vin": "<vin>"
}
]
Habe den Flow mit diesem Code konfiguriert. Die Verbindungen werden mir in NodeRed auch angezeigt. Mein FHEM MQTT2 Server müsste doch jetzt ein neues Device automatisch finden oder? Weil in FHEM taucht nichts auf
Zitat von: michisa86888 am 03 Februar 2021, 08:15:10
Okay, da nun das Problem mit EVCC gelöst wurde, vielen Dank hier noch an @xerion bin ich nun dabei den NodeRed - Flow per MQTT an FHEM anzubinden..
Habe den Flow mit diesem Code konfiguriert. Die Verbindungen werden mir in NodeRed auch angezeigt. Mein FHEM MQTT2 Server müsste doch jetzt ein neues Device automatisch finden oder? Weil in FHEM taucht nichts auf
Also ich hab mir das MQTT device selbst erstellt. Da es dafür kein Template gibt musst du sowieso das meiste selbst machen ;)
Hier mal meine Device Definition. Ist zwar nicht schön, funktioniert aber ;D. Ist aber auch noch nicht ganz fertig wie du feststellen wirst. Verbesserungen gerne hier posten.
defmod mqttKona MQTT2_DEVICE
attr mqttKona IODev MQTT_Broker
attr mqttKona event-on-change-reading .*
attr mqttKona readingList bluelinky/odometer.* odometer\
bluelinky/doorLock.* doorLock\
bluelinky/range.* range\
bluelinky/batteryStatus.* batteryStatus\
bluelinky/odometer.* odometer\
bluelinky/batteryPlugin.* batteryPlugin\
bluelinky/batteryCharge.* batteryCharge\
bluelinky/engine.* engine\
bluelinky/hoodOpen.* hoodOpen\
bluelinky/trunkOpen.* trunkOpen\
bluelinky/airCtrlOn.* airCtrlOn\
bluelinky/batSoc.* batSoc
attr mqttKona room Garage
attr mqttKona setList getOdometer cmnd/bluelinky/get_odometer 1\
getStatus cmnd/bluelinky/get_status 1\
getLocation cmnd/bluelinky/get_location 1\
startAC:slider,17,0.5,27 cmnd/bluelinky/start_ac {"defrost":true,"windscreenHeating":true,"temperature":$EVTPART1,"unit":"C"}\
stopAC cmnd/bluelinky/stop_ac\
lockCar cmnd/bluelinky/lock_car\
unlockCar cmnd/bluelinky/unlock_car\
startCharging cmnd/bluelinky/start_charging\
stopCharging cmnd/bluelinky/stop_charging
attr mqttKona stateFormat Kilometerstand: odometer km <br>\
Akku: batteryStatus % <br>\
Türen veriegelt: doorLock <br>\
Reichweite: range km <br>\
Vollgeladen in: status_evStatus_remainTime2_atc_value min <br>\
<br>\
AC: Defrost=ac_defrost Windscreen=ac_windscreen <br>\
attr mqttKona webCmd ac_defrost:ac_windscreen
Zitat von: acw81 am 03 Februar 2021, 08:27:38
Also ich hab mir das MQTT device selbst erstellt. Da es dafür kein Template gibt musst du sowieso das meiste selbst machen ;)
Hier mal meine Device Definition. Ist zwar nicht schön, funktioniert aber ;D. Ist aber auch noch nicht ganz fertig wie du feststellen wirst. Verbesserungen gerne hier posten.
Habe ich mal so versucht, allerdings bekomme ich keine Readings rein. Die Topics müssten passen und in NodeRed zeigt mir auch verbunden an.
Wie kann ich in NodeRed schauen ob überhaupt Readings generiert werden?
Ich nutze für anzeige der MQTT Topics "MQTT.fx" damit kannst du alle Nachrichten sehen und auch auf bestimmte filtern.
Ich verwende den hier, damit kannst du auch Topics setzen
https://mqtt-explorer.com/ (https://mqtt-explorer.com/)
Gibt es für die gängigen Betriebsysteme und läuft unter Windoof auch in der portable Version
BTW, hast du FHEM MQTT device deinen Broker gesetzt?
Zitat von: xerion am 03 Februar 2021, 10:37:09
Ich nutze für anzeige der MQTT Topics "MQTT.fx" damit kannst du alle Nachrichten sehen und auch auf bestimmte filtern.
Okay habe ich mal installiert und nach den Topics suchen lassen. Die topics vom NodeRed fehlen. In Node wird mir aber angezeigt verbunden. Und sobald ich meinen Broker ausschalte wird nicht verbunden angezeigt.
edit: scheint sich gelöst zu haben, von meiner openWB Installation waren noch 100erte Topics übrig... Die habe ich raus gelöscht und jetzt kommt das von NodeRed an
So, das ganze scheint noch nicht so richtig zu laufen. Ich habe den timestamp zum aktualisieren vom Fahrzeugstatus auf 2 Stunden gestellt. Jetzt bekomme ich alle 2 Stunden in FHEM ein neues MQTT Device und das "ältere" wird nicht aktualisiert. Das ganze auch nur wenn ich NodeRed im Browser geöffnet habe.
Die cmnd-Mqtt Kommandos funktionieren auch noch nicht. Ich bekomme wenn ich in FHEM die "Get"-Kommandos ausführe zwar im Debug-Fenster die aktuellen Werte - diese Werten aber nicht per Mqtt abgesetzt.
Die Kommandos zum öffnen der Türen, Klima starten funktionieren gar nicht.
Beim Slider-Start AC kommt im Debug_Fenster die Meldung:
Unexpected token \ in JSON at position 69
Zitat von: michisa86888 am 05 Februar 2021, 06:25:42
So, das ganze scheint noch nicht so richtig zu laufen. Ich habe den timestamp zum aktualisieren vom Fahrzeugstatus auf 2 Stunden gestellt. Jetzt bekomme ich alle 2 Stunden in FHEM ein neues MQTT Device und das "ältere" wird nicht aktualisiert. Das ganze auch nur wenn ich NodeRed im Browser geöffnet habe.
Die cmnd-Mqtt Kommandos funktionieren auch noch nicht. Ich bekomme wenn ich in FHEM die "Get"-Kommandos ausführe zwar im Debug-Fenster die aktuellen Werte - diese Werten aber nicht per Mqtt abgesetzt.
Die Kommandos zum öffnen der Türen, Klima starten funktionieren gar nicht.
Beim Slider-Start AC kommt im Debug_Fenster die Meldung:
Unexpected token \ in JSON at position 69
Ich denke du solltest für diese Frage ein extra Thread im Anfängerforum aufmachen. Das hat nicht wirklich mit dem Thema zu tun und sind MQTT Grundlagen. Am besten dort mal fragen.
Hallo,
anscheinend nutzt Hyundai/KIA die Gunst der Stunde und flutet den deutschen Markt; mein Kona kommt Ende der Woche, der Kia Sorento PHEV Mitte des Jahres. Tja, wenn man als großer Auto-Hersteller halt munter alles verschläft und trotzdem utopische Preise verlangt, sind andere halt schneller und pfiffiger. Wie dem auch sei bin ich wirklich mehr als interessiert an der Anbindung vom Kona. Könnte mir da ev jemand ein kleines How-To geben? Was muss ich installieren, was kann ich an Modulen testen? Mir geht es primär um die Klimaanlage, möchte die zeitgesteuert an- oder ausschalten. Außerdem, das Auto verriegeln, Frau vergisst das dauernd.
Frage am Rande: Muss sich der Kona für Heizung, wie der iOn oder Peugeot 2008, am Kabel befinden oder geht das mittlerweile auch ohne? Den Sinn habe ich wirklich noch nie verstanden. Klar, fahren ist wichtiger als Heizung, aber der Computer wird ja wohl die Heizung solange anschalten können, bis noch x kW in der Batterie sind.
Zitat von: Det20 am 22 Februar 2021, 12:55:49
Frage am Rande: Muss sich der Kona für Heizung, wie der iOn oder Peugeot 2008, am Kabel befinden oder geht das mittlerweile auch ohne? Den Sinn habe ich wirklich noch nie verstanden. Klar, fahren ist wichtiger als Heizung, aber der Computer wird ja wohl die Heizung solange anschalten können, bis noch x kW in der Batterie sind.
Tag!
Das geht auch ohne das Auto angeschlossen zu haben. Sowohl programmiert also auch spontan.
Moin zusammen,
wollte euch nur kurz informieren das momentan keine Anstrengungen bzgl. Buelinky zielführend sind. Hyundai hat heute Ihr Anmeldeverfahren umgestellt um 3rd Party Apps wie Bluelinky "auszusperren". Ich habe auch schon ein Ticket eröffnet aber das wird m.E. schwer bis gar nicht gehen.
https://github.com/Hacksore/bluelinky/issues/101#issue-813635047
Zitat von: xerion am 22 Februar 2021, 19:52:50
Moin zusammen,
wollte euch nur kurz informieren das momentan keine Anstrengungen bzgl. Buelinky zielführend sind. Hyundai hat heute Ihr Anmeldeverfahren umgestellt um 3rd Party Apps wie Bluelinky "auszusperren". Ich habe auch schon ein Ticket eröffnet aber das wird m.E. schwer bis gar nicht gehen.
https://github.com/Hacksore/bluelinky/issues/101#issue-813635047
Mal sehen. Ich lese im Discord mit und die Jungs (und Mädels?) sind schon dran. Wie erfolgreich das sein wird... Wir werden sehen.
In der Tat hat Hyundai heute Nacht die Türe ordentlich zugeknallt.
Zitat von: mnl1234 am 22 Februar 2021, 20:14:40
Mal sehen. Ich lese im Discord mit und die Jungs (und Mädels?) sind schon dran. Wie erfolgreich das sein wird... Wir werden sehen.
In der Tat hat Hyundai heute Nacht die Türe ordentlich zugeknallt.
Ich finde das einfach nur dämlich und vllt. auch einen Grund beim nächsten E-Auto kein Hyundai zu kaufen. Die Welt braucht nicht mehr verschlossene Systeme sondern eher das Gegenteil. Wer das noch nicht verstanden hat wird mit dieser Strategie irgendwann untergehen.
Kleiner Statusbericht. Wenn man seine NodeRed Umgebung auf Kuvork umbaut funktioniert es wieder :-)
https://flows.nodered.org/node/node-red-contrib-kuvork
Bin ich der einzige, der das nicht rafft?
Zitat von: Det20 am 09 März 2021, 22:02:21
Bin ich der einzige, der das nicht rafft?
Was "raffst" du denn nicht?
Ich habe keine Ahnung, was NodeRed ist. Habe einen Rapberry und veratehe leider kein Wort seit 2 Seiten
Zitat von: Det20 am 09 März 2021, 22:12:41
Ich habe keine Ahnung, was NodeRed ist. Habe einen Rapberry und veratehe leider kein Wort seit 2 Seiten
Dann wäre es am besten das du dich erstmal anhand von ein paar Tutorials weiter bildest, denn das fehlende Grundwissen wird dann im FHEM Forum schwierig zu vermitteln bzw. gehört hier m.E. nach nicht hier hin. Einfach mal googeln gibt genügend Videos genauso habe ich es auch gelernt ;-)
Zitat von: xerion am 09 März 2021, 21:29:31
Kleiner Statusbericht. Wenn man seine NodeRed Umgebung auf Kuvork umbaut funktioniert es wieder :-)
https://flows.nodered.org/node/node-red-contrib-kuvork
Ich habs mal in meine bestehende Umgebung installiert, aber der Login funktioniert nicht. Das nutzt doch den selben Node bluelinky, muss ich erst das bestehende node-red-contrib-bluelinky entfernen?
Update:
Okay, der remove von node-red-contrib-bluelinky hatte gefehlt. Also einfach
npm remove node-red-contrib-bluelinky
npm install node-red-contrib-kuvork
und der bestehende Flow sollte wieder funktionieren.
Also bei mir endet die Kuvork-Variante ebenfalls beim Login in einem Error.
Der Global Configuration Node : bluelinky hat übrigens noch ein extra Feld, in dem man die Marke des Fahrzeuges (Kia oder Hyundai) angeben kann/muß.
Dennoch erscheint bei jedem Aufruf-Knoten nach dem deploy eine rote Markierung mit dem Text "Error" - wie zuvor bei der Variante node-red-contrib-bluelinky
Ich habe als erstes die Flows exportiert und danach entfernt damit mit man Bluelinky auch komplett entfernen kann. Dann habe ich Kuvork installiert. Anschließend habe ich die gesicherten Flows wieder importiert und die bluelinky relevanten Nodes gegen die neuen ausgetauscht. Danach die Nodes mit dem Zugangsdaten verknüpft und neu deployt. Danach wurde die Verbindung problemlos hergestellt.
Hoffe das euch das etwas hilft.
Zitat von: xerion am 10 März 2021, 20:23:54
Ich habe als erstes die Flows exportiert und danach entfernt damit mit man Bluelinky auch komplett entfernen kann. Dann habe ich kurvork installiert. Anschließend habe ich die gesicherten Flows wieder importiert und die bluelinky relevanten Nodes gegen die neuen ausgetauscht. Danach die Nodes mit dem Zugangsdaten verknüpft und neu deployt. Danach wurde die Verbindung problemlos hergestellt.
Hoffe das euch das etwas hilft.
Okay, bei mir hat es glücklicherweise wie gesagt ohne Änderungen an den Flows funktioniert.
Mal eine andere Frage in die Runde. Also bei mir liefert das API von Hyundai sehr oft fehlerhafte Antworten (sowohl per Bluelinky als auch per Android App). Es sind dann mehrere Abfragen notwendig bis ich den richtigen Status bekomme. Gerade eben wurde mir anscheinend auch wieder der Akkustatus mit 0% zurückgemeldet. Habt ihr das auch? Das scheint ja ein direktes Problem bei Hyundai zu sein, oder?
Ja das habe ich. Das scheint ein Bluelink/Hyundai Problem zu sein. Das war bei mir auch der Grund warum ich in EVCC nicht mehr auf Bluelinky setze, es kam dort zu oft 0 zurück und was dann für PV optimiertes laden schlecht ist. Ich nutze das jetzt über eine OBD2 Schnittstelle.
Für die Komfortfeature nutze ich Kuvork in NodeRed ->MQTT->Fhem. Das funktioniert sehr gut.
Zitat von: michisa86888 am 05 Februar 2021, 06:25:42
...Jetzt bekomme ich alle 2 Stunden in FHEM ein neues MQTT Device und das "ältere" wird nicht aktualisiert....
Das hatte ich auch. Das liegt wohl an der Konfiguration der MQTT-Anbindung im NodeRED. Bei den Einstellungen des "mqtt-broker" gibt es den Wert "Client-ID". Da steht auch ein Hinweis "Leerer Wert für automatische Generierung" ;)
Nachdem ich dort einen Namen vergeben habe nimmt er natürlich immer den und die Verbindug ist persistent. 8)
Keine Ahnung, ob das die optimale Lösung ist, aber es funkt.
Tschau
Ednil
Hallo zusammen,
nur noch wenige Tage, und mein Sorento PHEV trudelt ein. Gibt es inzwischen eine DAU-fähige Anleitung, wie ich den mit möglichst wenig Overhead auf FHEm anbinden kann? Bin bei Docker und co nicht zu Hause, NodeJS oder vergleichbar wäre mir da lieber.
Viele Grüße
Schau mal hier https://forum.fhem.de/index.php?topic=118822.0 (https://forum.fhem.de/index.php?topic=118822.0). Bei mir lief das 7 Wochen problemlos, aber seit 3 Tagen bekomme ich Register request has failed with Error=PHONE_REGISTRATION_ERROR
Edit: Nach Aktualisierung von bluelinky klappt´s wieder. Sollte somit bei Neuinstallation kein Problem sein.
Servus zusammen,
bei mir funktioniert mal wieder der Login nicht. Soweit ich das richtig im Discord Kanal verstanden habe, müsste ich meinen Zeitstempel aktualisieren oder am besten gleich eine ganze Liste mit Zeitstempeln generieren. Hat das von euch schon jemand gemacht und kann hier kurz beschreiben was zu tun ist?
Update 06.07.21
Nach Update auf Version 0.0.25 läuft alles wieder wie geschmiert :D Die neue Abfrage "get full status" liefert nun auch alle Infos und man muss nicht drei Abfragen starten. Das beschleunigt das Ganze ungemein.
Hey wie habt ihr die Setlist für den Klimastart eingestellt? Ich habe sie so aktuell
startAC:slider,17,0.5,27 cmnd/bluelinky/start_ac {"defrost":true,"windscreenHeating":true,"temperature":$EVTPART1,"unit":"0"}\
Aber die Klimaanlage startet immer nur mit 17C° egal welchen Wert ich am Slider einstelle?
Zitat von: michisa86888 am 11 Oktober 2021, 20:27:45
Hey wie habt ihr die Setlist für den Klimastart eingestellt? Ich habe sie so aktuell
startAC:slider,17,0.5,27 cmnd/bluelinky/start_ac {"defrost":true,"windscreenHeating":true,"temperature":$EVTPART1,"unit":"0"}\
Aber die Klimaanlage startet immer nur mit 17C° egal welchen Wert ich am Slider einstelle?
Bei mir funktioniert das hier ohne Probleme:
startTemp:slider,17,1,27 /bluelink/start_car {"defrost": false,"windscreenHeating": false,"temperature": "$EVTPART1","unit": "C"}
Was ich bei dir sehe, das die Hochkommas bei $EVTPART1 fehlen. Wäre somit nicht JSON konform.
Zitat von: xerion am 16 März 2021, 11:21:15
Ja das habe ich. Das scheint ein Bluelink/Hyundai Problem zu sein. Das war bei mir auch der Grund warum ich in EVCC nicht mehr auf Bluelinky setze, es kam dort zu oft 0 zurück und was dann für PV optimiertes laden schlecht ist. Ich nutze das jetzt über eine OBD2 Schnittstelle.
Für die Komfortfeature nutze ich Kuvork in NodeRed ->MQTT->Fhem. Das funktioniert sehr gut.
Hallo zusammen,
Kuvork ist eingestellt worden und verweist wieder auf BlueLinky
Zitat
This package has been deprecated
Author message: Deprecated. Use BlueLinky 7.0.0 or higher
Was mir jedoch noch im Verständnis fehlt ist das setzen der Komfortfunktionen über MQTT. Das Kia.js Skript scheint nur zu lesen und die Werte dann als json mit MQTT ins FHEM zu senden.
Habt Ihr da mal einen Link wie es weiter geht?
VG
Christian
Zitat von: ch.eick am 28 Oktober 2021, 10:25:16
Hallo zusammen,
Kuvork ist eingestellt worden und verweist wieder auf BlueLinky
Was mir jedoch noch im Verständnis fehlt ist das setzen der Komfortfunktionen über MQTT. Das Kia.js Skript scheint nur zu lesen und die Werte dann als json mit MQTT ins FHEM zu senden.
Habt Ihr da mal einen Link wie es weiter geht?
VG
Christian
Ich nutze jetzt schon seit längeren (wieder) Bluelinky direkt in NodeRed. Dann baucht man sich auch keine Gedanken über MQTT Anbindung machen. Es gibt aber auch User die die Skripte direkt aus FHEM heraus aufrufen und dann per MQTT weiter verarbeiten, siehe https://forum.fhem.de/index.php/topic,118822.msg1180108.html#msg1180108
Zitat von: xerion am 28 Oktober 2021, 13:26:03
Ich nutze jetzt schon seit längeren (wieder) Bluelinky direkt in NodeRed. Dann baucht man sich auch keine Gedanken über MQTT Anbindung machen. Es gibt aber auch User die die Skripte direkt aus FHEM heraus aufrufen und dann per MQTT weiter verarbeiten, siehe https://forum.fhem.de/index.php/topic,118822.msg1180108.html#msg1180108
Ich habe jetzt den node-red docker Container aktiv und bluelinky installiert. Ein Kia Flow zeigt verbunden und ready, nur kommt noch nichts im MQTT2 in FHEM an.
Dort habe ich auch volgendes Device erzeugt.
Besonderen Dank schon mal an @mnl1234 für die tolle Hilfe bisher.
Wie kann ich nun im node-red die Daten sehen und was wäre eventuell noch bei der MQTT2 Definition zu korrigieren?
VG
Christian
Internals:
CFGFN
DEVICETOPIC bluelinky
FUUID 617a8641-f33f-61a8-0c9d-1b245d32117df1f8
IODev MQTT2_FHEM_Server
NAME WB_1_Kia_eNiro
NR 24272
STATE <table> <tr> <td style='text-align:right'>Status:</td> <td style='text-align:left'>unterwegs</td> </tr> <tr> <td style='text-align:right'>Akku:</td> <td style='text-align:left'> %</td> </tr> <tr> <td style='text-align:right'>Reichweite:</td> <td style='text-align:left'>450 km</td> </tr> <tr style='display:none;'> <td style='text-align:right'>Ladedauer:</td> <td style='text-align:left'> h</td> </tr> <tr> <td style='text-align:right'>Ladegrenze AC:</td> <td style='text-align:left'> %</td> </tr> <tr> <td style='text-align:right'>Kilometerstand:</td> <td style='text-align:left'>0 km</td> </tr> <tr> <td style='text-align:right'>12V Batterie:</td> <td style='text-align:left'> %</td> </tr> <tr> <td style='text-align:right'>Aktivstatus:</td> <td style='text-align:left'></td> </tr> <tr> <td style='text-align:right'>Zeit:</td> <td style='text-align:left'></td> </tr> </table>
TYPE MQTT2_DEVICE
READINGS:
2021-10-28 13:15:13 IODev MQTT2_FHEM_Server
Attributes:
DbLogExclude .*
IODev MQTT2_FHEM_Server
alias WB_1_Kia_eNiro
autocreate 1
devicetopic bluelinky
group PV Eigenverbrauch
icon car
readingList $DEVICETOPIC/status:.* { json2nameValue($EVENT) }
$DEVICETOPIC/location.* { json2nameValue($EVENT) }
$DEVICETOPIC/odometer:.* { json2nameValue($EVENT) }
$DEVICETOPIC/req_received:.* req_received
$DEVICETOPIC/req_active:.* req_active
room MQTT2_DEVICE,Strom->Photovoltaik
setList getOdometer req/$DEVICETOPIC/get_odometer get_odometer
getStatus req/$DEVICETOPIC/get_status get_status
getLocation req/$DEVICETOPIC/get_location get_location
getAll req/$DEVICETOPIC/get_all get_all
startCharge req/$DEVICETOPIC/start_charging start_charging
stopCharge req/$DEVICETOPIC/stop_charging stop_charging
stopClimate req/$DEVICETOPIC/stop_climate stop_climate
startHeating req/$DEVICETOPIC/start_climate {"defrost": true, "windscreenHeating": true, "temperature": 22.0 , "unit": "C"}
startCooling req/$DEVICETOPIC/start_climate {"defrost": false, "windscreenHeating": false, "temperature": 22.0 , "unit": "C"}
sortby 312
stateFormat {my $charge = (ReadingsVal($name,"charging","false") eq "true");; my $athome = (ReadingsVal($name,"atHomeStanding","false") eq "true");; my $chargeathome = ($charge && $athome);; my $connectedathome = ($athome && ReadingsVal($name,"connected","false") eq "true");; sprintf(" <table> <tr> <td style='text-align:right'>Status:</td> <td style='text-align:left'>%s</td> </tr> <tr> <td style='text-align:right'>Akku:</td> <td style='text-align:left'>%s %%</td> </tr> <tr> <td style='text-align:right'>Reichweite:</td> <td style='text-align:left'>%s km</td> </tr> <tr style='%s'> <td style='text-align:right'>Ladedauer:</td> <td style='text-align:left'>%s h</td> </tr> <tr> <td style='text-align:right'>Ladegrenze AC:</td> <td style='text-align:left'>%s %%</td> </tr> <tr> <td style='text-align:right'>Kilometerstand:</td> <td style='text-align:left'>%d km</td> </tr> <tr> <td style='text-align:right'>12V Batterie:</td> <td style='text-align:left'>%s %%</td> </tr> <tr> <td style='text-align:right'>Aktivstatus:</td> <td style='text-align:left'>%s</td> </tr> <tr> <td style='text-align:right'>Zeit:</td> <td style='text-align:left'>%s</td> </tr> </table> ", ($chargeathome ? "läd zu Hause" : ($connectedathome ? "angeschlossen zu Hause" : ($athome ? "zu Hause" : ($charge ? "Läd auswärts" : "unterwegs")))), ReadingsVal($name,"batSOC",""), ReadingsVal($name,"range",""), ($charge ? "" : "display:none;"), ReadingsVal($name,"time2targetSOC",""), ReadingsVal($name,"targetSOC",""), ReadingsVal($name,"odometer_value",""), ReadingsVal($name,"bat12v",""), ReadingsVal($name,"req_active",""), ReadingsTimestamp($name,"status_time","") ) }
userReadings atHomeStanding:location.* { ((abs(AttrVal("global","latitude",49.85) - ReadingsVal($NAME,"location_coord_lat",0)) <= 0.001) && (abs(AttrVal("global","longitude",8.49) - ReadingsVal($NAME,"location_coord_lon",0)) <= 0.001) && (ReadingsVal($NAME,"location_speed_value",1) == 0)) ? 'true' : 'false';; },
batSOC:status.* { ReadingsVal($NAME,"status_evStatus_batteryStatus",0);;},
connected:status.* { (ReadingsVal($NAME,"status_evStatus_batteryPlugin",0) != 0) ? 'true' : 'false';;},
charging:status.* { ReadingsVal($NAME,"status_evStatus_batteryCharge",'false');;},
targetSOC:status.* { ReadingsVal($NAME,"status_evStatus_reservChargeInfos_targetSOClist_2_targetSOClevel",0);;},
time2targetSOC:status.* { my $t = ReadingsVal($NAME,"status_evStatus_remainTime2_atc_value",1);; sprintf("%02d:%02d", $t/60%60, $t%60);},
range:status.* { ReadingsVal($NAME,"status_evStatus_drvDistance_1_rangeByFuel_totalAvailableRange_value",0);;},
bat12v:status.* { ReadingsVal($NAME,"status_battery_batSoc",0);;},
webCmd getAll:startCharge:stopCharge:startHeating:startCooling:stopClimate
Wie sieht denn deine NodeRed Konfig aus , am besten teile mal ein Screenshot.
Zitat von: xerion am 28 Oktober 2021, 13:53:13
Wie sieht denn deine NodeRed Konfig aus , am besten teile mal ein Screenshot.
Wo finde ich die :-) Das läuft seit ca 2 Stunden und so ist auch mein Lernstand.
Der rechte Zweig wäre jetzt interessant gewesen ob dort überhaupt MQTT Outs definiert sind.
Zitat von: xerion am 28 Oktober 2021, 14:15:58
Der rechte Zweig wäre jetzt interessant gewesen ob dort überhaupt MQTT Outs definiert sind.
Ich habe den Flow verkleinert und neu angehängt.
Der ist von @mnl1234 und ich habe nur meine fahrzeugdaten, sowie mein MQTT2 eingetragen.
Also sieh erstmal von hier nicht falsch aus. Ob überhaupt Daten kommen kannst du in der Debug Ausgabe sehen wenn du einen Request abgesendet hast.
siehe Screenshot.
Wenn das der Fall ist kannst du mit MQTT-Explorer(https://www.microsoft.com/de-de/p/mqtt-explorer/9pp8sfm082wd?activetab=pivot:overviewtab)
mal schauen ob überhaupt Daten bei den Topics ankommen, wenn das auch der Fall musst du dich in der readingList umschauen ob dort alles richtig gesetzt ist.
Zitat von: xerion am 28 Oktober 2021, 14:46:11
Also sieh erstmal von hier nicht falsch aus. Ob überhaupt Daten kommen kannst du in der Debug Ausgabe sehen wenn du einen Request abgesendet hast.
siehe Screenshot.
Wenn das der Fall ist kannst du mit MQTT-Explorer(https://www.microsoft.com/de-de/p/mqtt-explorer/9pp8sfm082wd?activetab=pivot:overviewtab)
mal schauen ob überhaupt Daten bei den Topics ankommen, wenn das auch der Fall musst du dich in der readingList umschauen ob dort alles richtig gesetzt ist.
Beim Debug kommt schon nichts.
Nach meiner Vorstellung läuft der Flow jetzt permanent im node-red , nachdem ich ihn "deployed" habe.
Da muss ich wohl erstmal einige tutorials suchen...
Die "node kia.js" Verbindung aus dem FHEM container liefert zumindest Daten ins MQTT, sodaß die generelle Konfiguration bei Kia und im MQTT2 ja schonmal klappen sollte.
Nein der Flow läuft nicht dauerhaft und wenn du nicht von Kia/Hyundai gesperrt werden möchtest, solltest du das auch tunlichst vermeiden. ;-)
In deinem Screenshot siehst du auf der linken Seite die MQTT IN`s das sind quasi deine Schalter via MQTT um den jeweiligen Flow zu auszuführen.
Das sind Daten die in deinem fhem Device unter setList stehen die solltest du laut deinem list per webCmd ausführen können und dann solltest du Daten bekommen.
Zitat von: xerion am 28 Oktober 2021, 15:02:29
Nein der Flow läuft nicht dauerhaft und wenn du nicht von Kia/Hyundai gesperrt werden möchtest, solltest du das auch tunlichst vermeiden. ;-)
In deinem Screenshot siehst du auf der linken Seite die MQTT IN`s das sind quasi deine Schalter via MQTT um den jeweiligen Flow zu auszuführen.
Das sind Daten die in deinem fhem Device unter setList stehen die solltest du laut deinem list per webCmd ausführen können und dann solltest du Daten bekommen.
Hmmm... naja, der Flow ansich läuft in dem Sinne schon dauerhaft. Aber die Bluelinky-Funktionen müssen eben von außen getriggert werden, damit sie auch was tun.
Das geht bei mir entweder aus dem MQTT raus oder der Login-Knoten wird stündlich getriggert.
Zitat von: ch.eick am 28 Oktober 2021, 14:52:57
Beim Debug kommt schon nichts.
Nach meiner Vorstellung läuft der Flow jetzt permanent im node-red , nachdem ich ihn "deployed" habe.
Hast du denn das "Ready" unter den Bluelinky-Knoten?
Wenn ja kannst du ja mal einen Inject-Knoten reinziehen und mit z.B. Get_Status verbinden (siehe Bild) und dann manuell triggern über das Fähnchen links von "timestamp". Danach sollte was im Debugfenster kommen.
Um das an der Stelle vielliecht noch abzuschließen und nicht in der Luft hängen zu lassen:
Es ist inzwischen gelöst. Im Grunde lief alles, so wie es sollte. :-)
Nun kommen die Trigger per MQTT vom FHEM, werden im Nodered via Bluelinky ans Auto geschickt und kommen dann via MQTT wieder zum FHEM zurück.
Zitat von: mnl1234 am 29 Oktober 2021, 08:53:52
Um das an der Stelle vielliecht noch abzuschließen und nicht in der Luft hängen zu lassen:
Es ist inzwischen gelöst. Im Grunde lief alles, so wie es sollte. :-)
Nun kommen die Trigger per MQTT vom FHEM, werden im Nodered via Bluelinky ans Auto geschickt und kommen dann via MQTT wieder zum FHEM zurück.
Ich muss jetzt nur noch weiter testen :-)
Zitat von: ch.eick am 29 Oktober 2021, 09:20:37
Ich muss jetzt nur noch weiter testen :-)
Bahalte deine 12V Batterie im Auge. Die leidet unter zu vielen Anfragen.
Und der Hyundai-Server lässt auch nur 200 Anfragen pro 24 Stunden zu. Zumindest ist das die Zahl, die ich so im Kopf habe.
Hallo zusammen,
ich habe mir mal Ideen durch den Kopf gehen lassen und finde den Ansatz mit dem node-red als Übersetzer sehr gut.
Im stateFormat von @mnl1234 ist aus dem Ergebnis ja schon eine kleine Bedienoberfläche hervorgegangen.
Da nun das triggern mit einem DOIF erfolgt und dort uiTable integriert ist könnte man das ganze noch etwas anhübschen. Dann agiert das MQTT2 Device als Schnittstelle und die Steuerung und Präsentation wird vom DOIF gemacht. Da gibt es dann Pull Down Menüs und Buttons, wie ich es bei meiner Batteriesteuerung umgesetzt habe.
Hier mal ein Screenshot als Muster.
Wenn ich mich da ran setze würde ich gerne Eure Top 10 der Automatismen haben, damit es für möglichst viele als Basis passt.
@mnl1234 hat sein DOIF bereits geliefert
@ch.eick
- ich interessiere mich für das Aufheizen am Morgen, eventuell nach Verwendungskalender
- eventuell würde ich meinen Haus Speicher noch gegen das Entladen schützen, da er im Winter
gerade so durch die Nacht reicht und ansonsten sofort leer wäre
- nach dem Muster zum Fremdladen aus dem userreading (Ortsüberprüfung) würde ich das Abfragen bei Kia
auf ein Minimum reduzieren, was die 12V Batterie wohl schonen wird.
VG
Christian
@ch.eick
könntest du evtl. deinen aktuellen NodeRedFlow hier einstellen?
Zitat von: michisa86888 am 29 Oktober 2021, 10:26:25
@ch.eick
könntest du evtl. deinen aktuellen NodeRedFlow hier einstellen?
Das würde ich gerne an @mnl1234 weiter reichen, ich bin komplett neu in dem Thema.
Zitat von: ch.eick am 29 Oktober 2021, 10:28:31
Das würde ich gerne an @mnl1234 weiter reichen, ich bin komplett neu in dem Thema.
Du kannst gerne den Flow hier posten, so wie ich ihn dir gestern geschickt habe. Komme igendwie an die Nachricht nicht mehr dran. Das war aber schon soweit anonymisiert, dass man es veröffentlichen kann.
Zitat von: mnl1234 am 29 Oktober 2021, 10:33:15
Du kannst gerne den Flow hier posten, so wie ich ihn dir gestern geschickt habe. Komme igendwie an die Nachricht nicht mehr dran. Das war aber schon soweit anonymisiert, dass man es veröffentlichen kann.
Here we are...
[
{
"id": "866c75dd.edd9a8",
"type": "tab",
"label": "Dein Flow Label z.b. Kona oder Kia e-Niro",
"disabled": false,
"info": ""
},
{
"id": "91a345fa.5757a8",
"type": "mqtt in",
"z": "866c75dd.edd9a8",
"name": "",
"topic": "req/bluelinky/get_status",
"qos": "0",
"datatype": "auto",
"broker": "bb13a99d.68b8f8",
"x": 460,
"y": 280,
"wires": [
[
"15dfb508.c6497b",
"ce62ba4f.d86548",
"3f82a275.5a0b6e",
"24d5e0b.3aafc2"
]
]
},
{
"id": "5ad085b9.05739c",
"type": "mqtt in",
"z": "866c75dd.edd9a8",
"name": "",
"topic": "req/bluelinky/start_climate",
"qos": "0",
"datatype": "auto",
"broker": "bb13a99d.68b8f8",
"x": 470,
"y": 680,
"wires": [
[
"b27d74de.38c808",
"33b1bc85.662694",
"ce62ba4f.d86548",
"24d5e0b.3aafc2"
]
]
},
{
"id": "15dfb508.c6497b",
"type": "car-status",
"z": "866c75dd.edd9a8",
"name": "Get status",
"dorefresh": true,
"parsed": false,
"bluelinky": "452a3304.58c8fc",
"x": 830,
"y": 280,
"wires": [
[
"cccc9476.d56dd8",
"226ed925.607bb6"
]
]
},
{
"id": "87abdd88.8ff4d",
"type": "car-odometer",
"z": "866c75dd.edd9a8",
"name": "Get car odometer",
"bluelinky": "452a3304.58c8fc",
"x": 850,
"y": 200,
"wires": [
[
"40d2361c.579588",
"226ed925.607bb6"
]
]
},
{
"id": "31100f9a.40008",
"type": "function",
"z": "866c75dd.edd9a8",
"name": "locationWrapper",
"func": "if(msg.payload.hasOwnProperty(\"body\")) {\n msg.payload = {\"error\":true};\n return msg;\n}\nelse {\n\n msg.payload = { \n \"location\": msg.payload,\n \"error\": false\n };\n \n return msg;\n}",
"outputs": 1,
"noerr": 0,
"initialize": "",
"finalize": "",
"x": 1460,
"y": 120,
"wires": [
[
"85a07155.a0f9f",
"262df5dc.57916a",
"f487d6d6.a4d568"
]
]
},
{
"id": "bea1d927.0f3908",
"type": "car-location",
"z": "866c75dd.edd9a8",
"name": "Get car location",
"bluelinky": "452a3304.58c8fc",
"x": 850,
"y": 120,
"wires": [
[
"31100f9a.40008",
"226ed925.607bb6"
]
]
},
{
"id": "3c949d67.0d83b2",
"type": "mqtt in",
"z": "866c75dd.edd9a8",
"name": "",
"topic": "req/bluelinky/get_location",
"qos": "0",
"datatype": "auto",
"broker": "bb13a99d.68b8f8",
"x": 470,
"y": 120,
"wires": [
[
"bea1d927.0f3908",
"ce62ba4f.d86548",
"3f82a275.5a0b6e",
"24d5e0b.3aafc2"
]
]
},
{
"id": "cccc9476.d56dd8",
"type": "function",
"z": "866c75dd.edd9a8",
"name": "analyseStatus",
"func": "if(msg.payload.hasOwnProperty(\"body\")) {\n msg.payload = {\"error\":true};\n return msg;\n}\nelse {\n let status = msg.payload;\n status.airTemp.value = 14+(parseInt(status.airTemp.value,16)/2);\n try{\n status.evStatus.reservChargeInfos.reservChargeInfo.reservChargeInfoDetail.reservFatcSet.airTemp.value = 14+(parseInt(status.evStatus.reservChargeInfos.reservChargeInfo.reservChargeInfoDetail.reservFatcSet.airTemp.value,16)/2);\n status.evStatus.reservChargeInfos.reserveChargeInfo2.reservChargeInfoDetail.reservFatcSet.airTemp.value = 14+(parseInt(status.evStatus.reservChargeInfos.reserveChargeInfo2.reservChargeInfoDetail.reservFatcSet.airTemp.value,16)/2);\n } catch(e) {}\n\n let time = status.evStatus.remainTime2.atc.value/60;\n let result = { \n \"batSOC\": status.evStatus.batteryStatus,\n \"connected\": (status.evStatus.batteryPlugin !== 0),\n \"charging\": status.evStatus.batteryCharge,\n \"targetSOC\": status.evStatus.reservChargeInfos.targetSOClist[1].targetSOClevel,\n \"time2targetSOC\": (Math.floor(time) + \":\" + (\"0\" + Math.floor((time % 1)*60)).slice(-2)), // h:mm\n \"range\": status.evStatus.drvDistance[0].rangeByFuel.totalAvailableRange.value,\n \"bat12v\": status.battery.batSoc\n };\n \n //msg.payload = result;\n msg.payload = {\n \"status\": status,\n \"error\": false\n \n };\n return msg;\n}",
"outputs": 1,
"noerr": 0,
"initialize": "",
"finalize": "",
"x": 1460,
"y": 280,
"wires": [
[
"3efceea0.c81b12",
"262df5dc.57916a",
"f487d6d6.a4d568"
]
]
},
{
"id": "85a07155.a0f9f",
"type": "mqtt out",
"z": "866c75dd.edd9a8",
"name": "",
"topic": "bluelinky/location",
"qos": "",
"retain": "",
"broker": "bb13a99d.68b8f8",
"x": 1870,
"y": 120,
"wires": []
},
{
"id": "3efceea0.c81b12",
"type": "mqtt out",
"z": "866c75dd.edd9a8",
"name": "",
"topic": "bluelinky/status",
"qos": "",
"retain": "",
"broker": "bb13a99d.68b8f8",
"x": 1860,
"y": 280,
"wires": []
},
{
"id": "327104fc.71e1bc",
"type": "mqtt out",
"z": "866c75dd.edd9a8",
"name": "",
"topic": "bluelinky/odometer",
"qos": "",
"retain": "",
"broker": "bb13a99d.68b8f8",
"x": 1870,
"y": 200,
"wires": []
},
{
"id": "844a32f4.2e029",
"type": "mqtt in",
"z": "866c75dd.edd9a8",
"name": "",
"topic": "req/bluelinky/stop_climate",
"qos": "0",
"datatype": "auto",
"broker": "bb13a99d.68b8f8",
"x": 470,
"y": 760,
"wires": [
[
"7d3ae860.d8c9a8",
"33b1bc85.662694",
"ce62ba4f.d86548",
"24d5e0b.3aafc2"
]
]
},
{
"id": "57d91e50.7e96",
"type": "mqtt in",
"z": "866c75dd.edd9a8",
"name": "",
"topic": "req/bluelinky/start_charging",
"qos": "0",
"datatype": "auto",
"broker": "bb13a99d.68b8f8",
"x": 480,
"y": 820,
"wires": [
[
"6eebc52c.ee23dc",
"33b1bc85.662694",
"ce62ba4f.d86548",
"24d5e0b.3aafc2"
]
]
},
{
"id": "6029f0a0.b73e",
"type": "mqtt in",
"z": "866c75dd.edd9a8",
"name": "",
"topic": "req/bluelinky/stop_charging",
"qos": "0",
"datatype": "auto",
"broker": "bb13a99d.68b8f8",
"x": 470,
"y": 880,
"wires": [
[
"84a1ae.74912e5",
"33b1bc85.662694",
"ce62ba4f.d86548",
"24d5e0b.3aafc2"
]
]
},
{
"id": "c5ecf76c.e753c8",
"type": "start-car",
"z": "866c75dd.edd9a8",
"name": "Start car",
"bluelinky": "452a3304.58c8fc",
"x": 1100,
"y": 680,
"wires": [
[
"811aa567.e89f98",
"f487d6d6.a4d568"
]
]
},
{
"id": "6eebc52c.ee23dc",
"type": "start-charge",
"z": "866c75dd.edd9a8",
"name": "Start Charging",
"bluelinky": "452a3304.58c8fc",
"x": 1120,
"y": 820,
"wires": [
[
"811aa567.e89f98",
"f487d6d6.a4d568"
]
]
},
{
"id": "84a1ae.74912e5",
"type": "stop-charge",
"z": "866c75dd.edd9a8",
"name": "Stop Charging",
"bluelinky": "452a3304.58c8fc",
"x": 1120,
"y": 880,
"wires": [
[
"811aa567.e89f98",
"f487d6d6.a4d568"
]
]
},
{
"id": "7d3ae860.d8c9a8",
"type": "stop-car",
"z": "866c75dd.edd9a8",
"name": "Stop car",
"bluelinky": "452a3304.58c8fc",
"x": 1100,
"y": 760,
"wires": [
[
"811aa567.e89f98",
"f487d6d6.a4d568"
]
]
},
{
"id": "b27d74de.38c808",
"type": "json",
"z": "866c75dd.edd9a8",
"name": "",
"property": "payload",
"action": "obj",
"pretty": false,
"x": 710,
"y": 680,
"wires": [
[
"c5ecf76c.e753c8",
"33b1bc85.662694"
]
]
},
{
"id": "45a6a8e6.2abfd8",
"type": "mqtt in",
"z": "866c75dd.edd9a8",
"name": "",
"topic": "req/bluelinky/get_odometer",
"qos": "0",
"datatype": "auto",
"broker": "bb13a99d.68b8f8",
"x": 470,
"y": 200,
"wires": [
[
"87abdd88.8ff4d",
"ce62ba4f.d86548",
"3f82a275.5a0b6e",
"24d5e0b.3aafc2"
]
]
},
{
"id": "33b1bc85.662694",
"type": "debug",
"z": "866c75dd.edd9a8",
"name": "",
"active": false,
"tosidebar": true,
"console": false,
"tostatus": false,
"complete": "payload",
"targetType": "msg",
"statusVal": "",
"statusType": "auto",
"x": 950,
"y": 940,
"wires": []
},
{
"id": "ce62ba4f.d86548",
"type": "mqtt out",
"z": "866c75dd.edd9a8",
"name": "",
"topic": "bluelinky/req_received",
"qos": "",
"retain": "",
"broker": "bb13a99d.68b8f8",
"x": 880,
"y": 600,
"wires": []
},
{
"id": "1babee6c.1c2982",
"type": "mqtt in",
"z": "866c75dd.edd9a8",
"name": "",
"topic": "req/bluelinky/get_all",
"qos": "0",
"datatype": "auto",
"broker": "bb13a99d.68b8f8",
"x": 450,
"y": 400,
"wires": [
[
"ce62ba4f.d86548",
"3f82a275.5a0b6e",
"24d5e0b.3aafc2",
"4375fbb9.00fb44"
]
]
},
{
"id": "262df5dc.57916a",
"type": "debug",
"z": "866c75dd.edd9a8",
"name": "",
"active": true,
"tosidebar": true,
"console": false,
"tostatus": false,
"complete": "payload",
"targetType": "msg",
"statusVal": "",
"statusType": "auto",
"x": 1810,
"y": 60,
"wires": []
},
{
"id": "811aa567.e89f98",
"type": "debug",
"z": "866c75dd.edd9a8",
"name": "",
"active": false,
"tosidebar": true,
"console": false,
"tostatus": false,
"complete": "payload",
"targetType": "msg",
"statusVal": "",
"statusType": "auto",
"x": 1450,
"y": 1040,
"wires": []
},
{
"id": "3f82a275.5a0b6e",
"type": "debug",
"z": "866c75dd.edd9a8",
"name": "",
"active": true,
"tosidebar": true,
"console": false,
"tostatus": false,
"complete": "payload",
"targetType": "msg",
"statusVal": "",
"statusType": "auto",
"x": 830,
"y": 80,
"wires": []
},
{
"id": "24d5e0b.3aafc2",
"type": "change",
"z": "866c75dd.edd9a8",
"name": "",
"rules": [
{
"t": "set",
"p": "payload",
"pt": "msg",
"to": "pending",
"tot": "str"
}
],
"action": "",
"property": "",
"from": "",
"to": "",
"reg": false,
"x": 790,
"y": 1200,
"wires": [
[
"4dd1ea4a.52f144",
"fecad185.324f8"
]
]
},
{
"id": "f487d6d6.a4d568",
"type": "change",
"z": "866c75dd.edd9a8",
"name": "",
"rules": [
{
"t": "set",
"p": "payload",
"pt": "msg",
"to": "idle",
"tot": "str"
}
],
"action": "",
"property": "",
"from": "",
"to": "",
"reg": false,
"x": 1770,
"y": 500,
"wires": [
[
"4dd1ea4a.52f144",
"fecad185.324f8"
]
]
},
{
"id": "4dd1ea4a.52f144",
"type": "mqtt out",
"z": "866c75dd.edd9a8",
"name": "",
"topic": "bluelinky/req_active",
"qos": "",
"retain": "",
"broker": "bb13a99d.68b8f8",
"x": 2290,
"y": 1200,
"wires": []
},
{
"id": "fecad185.324f8",
"type": "debug",
"z": "866c75dd.edd9a8",
"name": "",
"active": false,
"tosidebar": true,
"console": false,
"tostatus": false,
"complete": "false",
"statusVal": "",
"statusType": "auto",
"x": 2270,
"y": 1260,
"wires": []
},
{
"id": "40d2361c.579588",
"type": "function",
"z": "866c75dd.edd9a8",
"name": "odometerWrapper",
"func": "if(msg.payload.hasOwnProperty(\"body\")) {\n msg.payload = {\"error\":true};\n return msg;\n}\nelse {\n msg.payload = { \n \"odometer\": msg.payload,\n \"error\": false\n };\n\n return msg;\n}",
"outputs": 1,
"noerr": 0,
"initialize": "",
"finalize": "",
"x": 1470,
"y": 200,
"wires": [
[
"327104fc.71e1bc",
"262df5dc.57916a",
"f487d6d6.a4d568"
]
]
},
{
"id": "226ed925.607bb6",
"type": "debug",
"z": "866c75dd.edd9a8",
"name": "",
"active": true,
"tosidebar": true,
"console": false,
"tostatus": false,
"complete": "payload",
"targetType": "msg",
"statusVal": "",
"statusType": "auto",
"x": 1150,
"y": 80,
"wires": []
},
{
"id": "4375fbb9.00fb44",
"type": "car-fullstatus",
"z": "866c75dd.edd9a8",
"name": "Get full status",
"dorefresh": true,
"bluelinky": "452a3304.58c8fc",
"x": 930,
"y": 360,
"wires": [
[
"226ed925.607bb6",
"69b6c4df.ea6bcc",
"89681a97.9e24d8",
"92dc3ff4.1d6e3"
]
]
},
{
"id": "69b6c4df.ea6bcc",
"type": "function",
"z": "866c75dd.edd9a8",
"name": "locationFromFullstatus",
"func": "if(msg.payload.hasOwnProperty(\"body\")) {\n msg.payload = {\"error\":true};\n return msg;\n}\nelse {\n\n msg.payload = { \n \"location\": msg.payload.vehicleLocation,\n \"error\": false\n };\n \n return msg;\n}\n",
"outputs": 1,
"noerr": 0,
"initialize": "",
"finalize": "",
"x": 1440,
"y": 360,
"wires": [
[
"85a07155.a0f9f",
"331e5860.907808"
]
]
},
{
"id": "92dc3ff4.1d6e3",
"type": "function",
"z": "866c75dd.edd9a8",
"name": "statusFromFullstatus",
"func": "if(msg.payload.hasOwnProperty(\"body\")) {\n msg.payload = {\"error\":true};\n return msg;\n}\nelse {\n let status = msg.payload.vehicleStatus;\n try{\n status.airTemp.value = 14+(parseInt(status.airTemp.value,16)/2);\n status.evStatus.reservChargeInfos.reservChargeInfo.reservChargeInfoDetail.reservFatcSet.airTemp.value = 14+(parseInt(status.evStatus.reservChargeInfos.reservChargeInfo.reservChargeInfoDetail.reservFatcSet.airTemp.value,16)/2);\n status.evStatus.reservChargeInfos.reserveChargeInfo2.reservChargeInfoDetail.reservFatcSet.airTemp.value = 14+(parseInt(status.evStatus.reservChargeInfos.reserveChargeInfo2.reservChargeInfoDetail.reservFatcSet.airTemp.value,16)/2);\n } catch(e) {}\n\n msg.payload = { \n \"status\": status,\n \"error\": false\n };\n \n return msg;\n}\n",
"outputs": 1,
"noerr": 0,
"initialize": "",
"finalize": "",
"x": 1440,
"y": 480,
"wires": [
[
"3efceea0.c81b12",
"f487d6d6.a4d568",
"331e5860.907808"
]
]
},
{
"id": "89681a97.9e24d8",
"type": "function",
"z": "866c75dd.edd9a8",
"name": "odometerFromFullstatus",
"func": "if(msg.payload.hasOwnProperty(\"body\")) {\n msg.payload = {\"error\":true};\n return msg;\n}\nelse {\n\n msg.payload = { \n \"odometer\": msg.payload.odometer,\n \"error\": false\n };\n \n return msg;\n}\n",
"outputs": 1,
"noerr": 0,
"initialize": "",
"finalize": "",
"x": 1430,
"y": 420,
"wires": [
[
"327104fc.71e1bc",
"331e5860.907808"
]
]
},
{
"id": "331e5860.907808",
"type": "debug",
"z": "866c75dd.edd9a8",
"name": "",
"active": true,
"tosidebar": true,
"console": false,
"tostatus": false,
"complete": "payload",
"targetType": "msg",
"statusVal": "",
"statusType": "auto",
"x": 1770,
"y": 420,
"wires": []
},
{
"id": "aa4d220b.f7e19",
"type": "set-chargetargets",
"z": "866c75dd.edd9a8",
"name": "Set charge targets",
"bluelinky": "452a3304.58c8fc",
"x": 1140,
"y": 1060,
"wires": [
[
"811aa567.e89f98",
"f487d6d6.a4d568"
]
]
},
{
"id": "4c03338d.2f15ec",
"type": "login",
"z": "866c75dd.edd9a8",
"name": "Login",
"bluelinky": "452a3304.58c8fc",
"x": 1090,
"y": 1120,
"wires": [
[
"811aa567.e89f98"
]
]
},
{
"id": "28b868f5.16cb48",
"type": "inject",
"z": "866c75dd.edd9a8",
"name": "",
"props": [
{
"p": "payload"
},
{
"p": "topic",
"vt": "str"
}
],
"repeat": "43200",
"crontab": "",
"once": true,
"onceDelay": "12",
"topic": "",
"payload": "",
"payloadType": "date",
"x": 890,
"y": 1120,
"wires": [
[
"4c03338d.2f15ec"
]
]
},
{
"id": "db9ecdb5.a9683",
"type": "mqtt in",
"z": "866c75dd.edd9a8",
"name": "",
"topic": "req/bluelinky/set_chargetargets",
"qos": "0",
"datatype": "auto",
"broker": "bb13a99d.68b8f8",
"x": 490,
"y": 1060,
"wires": [
[
"aa4d220b.f7e19"
]
]
},
{
"id": "bb13a99d.68b8f8",
"type": "mqtt-broker",
"name": "mqtt_Server",
"broker": "127.0.0.1",
"port": "1883",
"clientid": "",
"usetls": false,
"compatmode": false,
"keepalive": "60",
"cleansession": true,
"birthTopic": "",
"birthQos": "0",
"birthPayload": "",
"closeTopic": "",
"closeQos": "0",
"closePayload": "",
"willTopic": "",
"willQos": "0",
"willPayload": ""
},
{
"id": "452a3304.58c8fc",
"type": "bluelinky",
"username": "deinBluelinkUser",
"password": "deinBluelinkPass",
"region": "EU",
"pin": "DeinePIN",
"vin": "DeineVIN",
"brand": "[hyundai|kia]"
}
]
Zitat von: ch.eick am 29 Oktober 2021, 10:49:25
Here we are...
Top! Danke Dir!
Kleine Erklärungen für alle "Erstimportierer":
- Ich nutze derzeit Version 0.25 vom nodered-contrib-bluelinky. Könnte also sein, dass neue Versionen auch neue oder geänderte Funktionen bieten, die hier nicht abgebildet sind.
- Der Login wird alle paar Stunden getriggert, weil Bluelinky nicht merkt, wenn die Session ausläuft. Ein Request würde dann in einen Fehler laufen. Alle anderen Blocks müssen via MQTT getriggert werden.
- Die Scripts machen ein paar Vorbereitungen und Umrechnungen, die mir die Verarbeitung in FHEM später erleichtern. Z.B. werden die Temperaturwerte direkt in °C umgerechnet.
- Außerdem habe ich ein error-Flag in den Antworten, um im FHEM zu sehen, falls ein Request mal Mist liefert
- Bei jedem Request wird ein Flag auf Pending gesetzt und per MQTT gesendet. Nach Erhalt der Antwort wird es wieder auf idle gesetzt. Dadurch sieht man im FHEM ganz gut, dass ein Request noch aktiv ist. Und es lässt sich natürlich auch für Sequenzen von Requests aus FHEM heraus nutzen.
Hier mal meine Versionen Stand 28.10.2021:
node-red 2.1.3
bluelinky 0.0.27
Das kuvork linkt direkt auf bluelinky.
Zitat von: ch.eick am 29 Oktober 2021, 10:49:25
Here we are...
[
{
"id": "866c75dd.edd9a8",
"type": "tab",
"label": "Dein Flow Label z.b. Kona oder Kia e-Niro",
"disabled": false,
"info": ""
},
{
"id": "91a345fa.5757a8",
"type": "mqtt in",
"z": "866c75dd.edd9a8",
"name": "",
"topic": "req/bluelinky/get_status",
"qos": "0",
"datatype": "auto",
"broker": "bb13a99d.68b8f8",
"x": 460,
"y": 280,
"wires": [
[
"15dfb508.c6497b",
"ce62ba4f.d86548",
"3f82a275.5a0b6e",
"24d5e0b.3aafc2"
]
]
},
{
"id": "5ad085b9.05739c",
"type": "mqtt in",
"z": "866c75dd.edd9a8",
"name": "",
"topic": "req/bluelinky/start_climate",
"qos": "0",
"datatype": "auto",
"broker": "bb13a99d.68b8f8",
"x": 470,
"y": 680,
"wires": [
[
"b27d74de.38c808",
"33b1bc85.662694",
"ce62ba4f.d86548",
"24d5e0b.3aafc2"
]
]
},
{
"id": "15dfb508.c6497b",
"type": "car-status",
"z": "866c75dd.edd9a8",
"name": "Get status",
"dorefresh": true,
"parsed": false,
"bluelinky": "452a3304.58c8fc",
"x": 830,
"y": 280,
"wires": [
[
"cccc9476.d56dd8",
"226ed925.607bb6"
]
]
},
{
"id": "87abdd88.8ff4d",
"type": "car-odometer",
"z": "866c75dd.edd9a8",
"name": "Get car odometer",
"bluelinky": "452a3304.58c8fc",
"x": 850,
"y": 200,
"wires": [
[
"40d2361c.579588",
"226ed925.607bb6"
]
]
},
{
"id": "31100f9a.40008",
"type": "function",
"z": "866c75dd.edd9a8",
"name": "locationWrapper",
"func": "if(msg.payload.hasOwnProperty(\"body\")) {\n msg.payload = {\"error\":true};\n return msg;\n}\nelse {\n\n msg.payload = { \n \"location\": msg.payload,\n \"error\": false\n };\n \n return msg;\n}",
"outputs": 1,
"noerr": 0,
"initialize": "",
"finalize": "",
"x": 1460,
"y": 120,
"wires": [
[
"85a07155.a0f9f",
"262df5dc.57916a",
"f487d6d6.a4d568"
]
]
},
{
"id": "bea1d927.0f3908",
"type": "car-location",
"z": "866c75dd.edd9a8",
"name": "Get car location",
"bluelinky": "452a3304.58c8fc",
"x": 850,
"y": 120,
"wires": [
[
"31100f9a.40008",
"226ed925.607bb6"
]
]
},
{
"id": "3c949d67.0d83b2",
"type": "mqtt in",
"z": "866c75dd.edd9a8",
"name": "",
"topic": "req/bluelinky/get_location",
"qos": "0",
"datatype": "auto",
"broker": "bb13a99d.68b8f8",
"x": 470,
"y": 120,
"wires": [
[
"bea1d927.0f3908",
"ce62ba4f.d86548",
"3f82a275.5a0b6e",
"24d5e0b.3aafc2"
]
]
},
{
"id": "cccc9476.d56dd8",
"type": "function",
"z": "866c75dd.edd9a8",
"name": "analyseStatus",
"func": "if(msg.payload.hasOwnProperty(\"body\")) {\n msg.payload = {\"error\":true};\n return msg;\n}\nelse {\n let status = msg.payload;\n status.airTemp.value = 14+(parseInt(status.airTemp.value,16)/2);\n try{\n status.evStatus.reservChargeInfos.reservChargeInfo.reservChargeInfoDetail.reservFatcSet.airTemp.value = 14+(parseInt(status.evStatus.reservChargeInfos.reservChargeInfo.reservChargeInfoDetail.reservFatcSet.airTemp.value,16)/2);\n status.evStatus.reservChargeInfos.reserveChargeInfo2.reservChargeInfoDetail.reservFatcSet.airTemp.value = 14+(parseInt(status.evStatus.reservChargeInfos.reserveChargeInfo2.reservChargeInfoDetail.reservFatcSet.airTemp.value,16)/2);\n } catch(e) {}\n\n let time = status.evStatus.remainTime2.atc.value/60;\n let result = { \n \"batSOC\": status.evStatus.batteryStatus,\n \"connected\": (status.evStatus.batteryPlugin !== 0),\n \"charging\": status.evStatus.batteryCharge,\n \"targetSOC\": status.evStatus.reservChargeInfos.targetSOClist[1].targetSOClevel,\n \"time2targetSOC\": (Math.floor(time) + \":\" + (\"0\" + Math.floor((time % 1)*60)).slice(-2)), // h:mm\n \"range\": status.evStatus.drvDistance[0].rangeByFuel.totalAvailableRange.value,\n \"bat12v\": status.battery.batSoc\n };\n \n //msg.payload = result;\n msg.payload = {\n \"status\": status,\n \"error\": false\n \n };\n return msg;\n}",
"outputs": 1,
"noerr": 0,
"initialize": "",
"finalize": "",
"x": 1460,
"y": 280,
"wires": [
[
"3efceea0.c81b12",
"262df5dc.57916a",
"f487d6d6.a4d568"
]
]
},
{
"id": "85a07155.a0f9f",
"type": "mqtt out",
"z": "866c75dd.edd9a8",
"name": "",
"topic": "bluelinky/location",
"qos": "",
"retain": "",
"broker": "bb13a99d.68b8f8",
"x": 1870,
"y": 120,
"wires": []
},
{
"id": "3efceea0.c81b12",
"type": "mqtt out",
"z": "866c75dd.edd9a8",
"name": "",
"topic": "bluelinky/status",
"qos": "",
"retain": "",
"broker": "bb13a99d.68b8f8",
"x": 1860,
"y": 280,
"wires": []
},
{
"id": "327104fc.71e1bc",
"type": "mqtt out",
"z": "866c75dd.edd9a8",
"name": "",
"topic": "bluelinky/odometer",
"qos": "",
"retain": "",
"broker": "bb13a99d.68b8f8",
"x": 1870,
"y": 200,
"wires": []
},
{
"id": "844a32f4.2e029",
"type": "mqtt in",
"z": "866c75dd.edd9a8",
"name": "",
"topic": "req/bluelinky/stop_climate",
"qos": "0",
"datatype": "auto",
"broker": "bb13a99d.68b8f8",
"x": 470,
"y": 760,
"wires": [
[
"7d3ae860.d8c9a8",
"33b1bc85.662694",
"ce62ba4f.d86548",
"24d5e0b.3aafc2"
]
]
},
{
"id": "57d91e50.7e96",
"type": "mqtt in",
"z": "866c75dd.edd9a8",
"name": "",
"topic": "req/bluelinky/start_charging",
"qos": "0",
"datatype": "auto",
"broker": "bb13a99d.68b8f8",
"x": 480,
"y": 820,
"wires": [
[
"6eebc52c.ee23dc",
"33b1bc85.662694",
"ce62ba4f.d86548",
"24d5e0b.3aafc2"
]
]
},
{
"id": "6029f0a0.b73e",
"type": "mqtt in",
"z": "866c75dd.edd9a8",
"name": "",
"topic": "req/bluelinky/stop_charging",
"qos": "0",
"datatype": "auto",
"broker": "bb13a99d.68b8f8",
"x": 470,
"y": 880,
"wires": [
[
"84a1ae.74912e5",
"33b1bc85.662694",
"ce62ba4f.d86548",
"24d5e0b.3aafc2"
]
]
},
{
"id": "c5ecf76c.e753c8",
"type": "start-car",
"z": "866c75dd.edd9a8",
"name": "Start car",
"bluelinky": "452a3304.58c8fc",
"x": 1100,
"y": 680,
"wires": [
[
"811aa567.e89f98",
"f487d6d6.a4d568"
]
]
},
{
"id": "6eebc52c.ee23dc",
"type": "start-charge",
"z": "866c75dd.edd9a8",
"name": "Start Charging",
"bluelinky": "452a3304.58c8fc",
"x": 1120,
"y": 820,
"wires": [
[
"811aa567.e89f98",
"f487d6d6.a4d568"
]
]
},
{
"id": "84a1ae.74912e5",
"type": "stop-charge",
"z": "866c75dd.edd9a8",
"name": "Stop Charging",
"bluelinky": "452a3304.58c8fc",
"x": 1120,
"y": 880,
"wires": [
[
"811aa567.e89f98",
"f487d6d6.a4d568"
]
]
},
{
"id": "7d3ae860.d8c9a8",
"type": "stop-car",
"z": "866c75dd.edd9a8",
"name": "Stop car",
"bluelinky": "452a3304.58c8fc",
"x": 1100,
"y": 760,
"wires": [
[
"811aa567.e89f98",
"f487d6d6.a4d568"
]
]
},
{
"id": "b27d74de.38c808",
"type": "json",
"z": "866c75dd.edd9a8",
"name": "",
"property": "payload",
"action": "obj",
"pretty": false,
"x": 710,
"y": 680,
"wires": [
[
"c5ecf76c.e753c8",
"33b1bc85.662694"
]
]
},
{
"id": "45a6a8e6.2abfd8",
"type": "mqtt in",
"z": "866c75dd.edd9a8",
"name": "",
"topic": "req/bluelinky/get_odometer",
"qos": "0",
"datatype": "auto",
"broker": "bb13a99d.68b8f8",
"x": 470,
"y": 200,
"wires": [
[
"87abdd88.8ff4d",
"ce62ba4f.d86548",
"3f82a275.5a0b6e",
"24d5e0b.3aafc2"
]
]
},
{
"id": "33b1bc85.662694",
"type": "debug",
"z": "866c75dd.edd9a8",
"name": "",
"active": false,
"tosidebar": true,
"console": false,
"tostatus": false,
"complete": "payload",
"targetType": "msg",
"statusVal": "",
"statusType": "auto",
"x": 950,
"y": 940,
"wires": []
},
{
"id": "ce62ba4f.d86548",
"type": "mqtt out",
"z": "866c75dd.edd9a8",
"name": "",
"topic": "bluelinky/req_received",
"qos": "",
"retain": "",
"broker": "bb13a99d.68b8f8",
"x": 880,
"y": 600,
"wires": []
},
{
"id": "1babee6c.1c2982",
"type": "mqtt in",
"z": "866c75dd.edd9a8",
"name": "",
"topic": "req/bluelinky/get_all",
"qos": "0",
"datatype": "auto",
"broker": "bb13a99d.68b8f8",
"x": 450,
"y": 400,
"wires": [
[
"ce62ba4f.d86548",
"3f82a275.5a0b6e",
"24d5e0b.3aafc2",
"4375fbb9.00fb44"
]
]
},
{
"id": "262df5dc.57916a",
"type": "debug",
"z": "866c75dd.edd9a8",
"name": "",
"active": true,
"tosidebar": true,
"console": false,
"tostatus": false,
"complete": "payload",
"targetType": "msg",
"statusVal": "",
"statusType": "auto",
"x": 1810,
"y": 60,
"wires": []
},
{
"id": "811aa567.e89f98",
"type": "debug",
"z": "866c75dd.edd9a8",
"name": "",
"active": false,
"tosidebar": true,
"console": false,
"tostatus": false,
"complete": "payload",
"targetType": "msg",
"statusVal": "",
"statusType": "auto",
"x": 1450,
"y": 1040,
"wires": []
},
{
"id": "3f82a275.5a0b6e",
"type": "debug",
"z": "866c75dd.edd9a8",
"name": "",
"active": true,
"tosidebar": true,
"console": false,
"tostatus": false,
"complete": "payload",
"targetType": "msg",
"statusVal": "",
"statusType": "auto",
"x": 830,
"y": 80,
"wires": []
},
{
"id": "24d5e0b.3aafc2",
"type": "change",
"z": "866c75dd.edd9a8",
"name": "",
"rules": [
{
"t": "set",
"p": "payload",
"pt": "msg",
"to": "pending",
"tot": "str"
}
],
"action": "",
"property": "",
"from": "",
"to": "",
"reg": false,
"x": 790,
"y": 1200,
"wires": [
[
"4dd1ea4a.52f144",
"fecad185.324f8"
]
]
},
{
"id": "f487d6d6.a4d568",
"type": "change",
"z": "866c75dd.edd9a8",
"name": "",
"rules": [
{
"t": "set",
"p": "payload",
"pt": "msg",
"to": "idle",
"tot": "str"
}
],
"action": "",
"property": "",
"from": "",
"to": "",
"reg": false,
"x": 1770,
"y": 500,
"wires": [
[
"4dd1ea4a.52f144",
"fecad185.324f8"
]
]
},
{
"id": "4dd1ea4a.52f144",
"type": "mqtt out",
"z": "866c75dd.edd9a8",
"name": "",
"topic": "bluelinky/req_active",
"qos": "",
"retain": "",
"broker": "bb13a99d.68b8f8",
"x": 2290,
"y": 1200,
"wires": []
},
{
"id": "fecad185.324f8",
"type": "debug",
"z": "866c75dd.edd9a8",
"name": "",
"active": false,
"tosidebar": true,
"console": false,
"tostatus": false,
"complete": "false",
"statusVal": "",
"statusType": "auto",
"x": 2270,
"y": 1260,
"wires": []
},
{
"id": "40d2361c.579588",
"type": "function",
"z": "866c75dd.edd9a8",
"name": "odometerWrapper",
"func": "if(msg.payload.hasOwnProperty(\"body\")) {\n msg.payload = {\"error\":true};\n return msg;\n}\nelse {\n msg.payload = { \n \"odometer\": msg.payload,\n \"error\": false\n };\n\n return msg;\n}",
"outputs": 1,
"noerr": 0,
"initialize": "",
"finalize": "",
"x": 1470,
"y": 200,
"wires": [
[
"327104fc.71e1bc",
"262df5dc.57916a",
"f487d6d6.a4d568"
]
]
},
{
"id": "226ed925.607bb6",
"type": "debug",
"z": "866c75dd.edd9a8",
"name": "",
"active": true,
"tosidebar": true,
"console": false,
"tostatus": false,
"complete": "payload",
"targetType": "msg",
"statusVal": "",
"statusType": "auto",
"x": 1150,
"y": 80,
"wires": []
},
{
"id": "4375fbb9.00fb44",
"type": "car-fullstatus",
"z": "866c75dd.edd9a8",
"name": "Get full status",
"dorefresh": true,
"bluelinky": "452a3304.58c8fc",
"x": 930,
"y": 360,
"wires": [
[
"226ed925.607bb6",
"69b6c4df.ea6bcc",
"89681a97.9e24d8",
"92dc3ff4.1d6e3"
]
]
},
{
"id": "69b6c4df.ea6bcc",
"type": "function",
"z": "866c75dd.edd9a8",
"name": "locationFromFullstatus",
"func": "if(msg.payload.hasOwnProperty(\"body\")) {\n msg.payload = {\"error\":true};\n return msg;\n}\nelse {\n\n msg.payload = { \n \"location\": msg.payload.vehicleLocation,\n \"error\": false\n };\n \n return msg;\n}\n",
"outputs": 1,
"noerr": 0,
"initialize": "",
"finalize": "",
"x": 1440,
"y": 360,
"wires": [
[
"85a07155.a0f9f",
"331e5860.907808"
]
]
},
{
"id": "92dc3ff4.1d6e3",
"type": "function",
"z": "866c75dd.edd9a8",
"name": "statusFromFullstatus",
"func": "if(msg.payload.hasOwnProperty(\"body\")) {\n msg.payload = {\"error\":true};\n return msg;\n}\nelse {\n let status = msg.payload.vehicleStatus;\n try{\n status.airTemp.value = 14+(parseInt(status.airTemp.value,16)/2);\n status.evStatus.reservChargeInfos.reservChargeInfo.reservChargeInfoDetail.reservFatcSet.airTemp.value = 14+(parseInt(status.evStatus.reservChargeInfos.reservChargeInfo.reservChargeInfoDetail.reservFatcSet.airTemp.value,16)/2);\n status.evStatus.reservChargeInfos.reserveChargeInfo2.reservChargeInfoDetail.reservFatcSet.airTemp.value = 14+(parseInt(status.evStatus.reservChargeInfos.reserveChargeInfo2.reservChargeInfoDetail.reservFatcSet.airTemp.value,16)/2);\n } catch(e) {}\n\n msg.payload = { \n \"status\": status,\n \"error\": false\n };\n \n return msg;\n}\n",
"outputs": 1,
"noerr": 0,
"initialize": "",
"finalize": "",
"x": 1440,
"y": 480,
"wires": [
[
"3efceea0.c81b12",
"f487d6d6.a4d568",
"331e5860.907808"
]
]
},
{
"id": "89681a97.9e24d8",
"type": "function",
"z": "866c75dd.edd9a8",
"name": "odometerFromFullstatus",
"func": "if(msg.payload.hasOwnProperty(\"body\")) {\n msg.payload = {\"error\":true};\n return msg;\n}\nelse {\n\n msg.payload = { \n \"odometer\": msg.payload.odometer,\n \"error\": false\n };\n \n return msg;\n}\n",
"outputs": 1,
"noerr": 0,
"initialize": "",
"finalize": "",
"x": 1430,
"y": 420,
"wires": [
[
"327104fc.71e1bc",
"331e5860.907808"
]
]
},
{
"id": "331e5860.907808",
"type": "debug",
"z": "866c75dd.edd9a8",
"name": "",
"active": true,
"tosidebar": true,
"console": false,
"tostatus": false,
"complete": "payload",
"targetType": "msg",
"statusVal": "",
"statusType": "auto",
"x": 1770,
"y": 420,
"wires": []
},
{
"id": "aa4d220b.f7e19",
"type": "set-chargetargets",
"z": "866c75dd.edd9a8",
"name": "Set charge targets",
"bluelinky": "452a3304.58c8fc",
"x": 1140,
"y": 1060,
"wires": [
[
"811aa567.e89f98",
"f487d6d6.a4d568"
]
]
},
{
"id": "4c03338d.2f15ec",
"type": "login",
"z": "866c75dd.edd9a8",
"name": "Login",
"bluelinky": "452a3304.58c8fc",
"x": 1090,
"y": 1120,
"wires": [
[
"811aa567.e89f98"
]
]
},
{
"id": "28b868f5.16cb48",
"type": "inject",
"z": "866c75dd.edd9a8",
"name": "",
"props": [
{
"p": "payload"
},
{
"p": "topic",
"vt": "str"
}
],
"repeat": "43200",
"crontab": "",
"once": true,
"onceDelay": "12",
"topic": "",
"payload": "",
"payloadType": "date",
"x": 890,
"y": 1120,
"wires": [
[
"4c03338d.2f15ec"
]
]
},
{
"id": "db9ecdb5.a9683",
"type": "mqtt in",
"z": "866c75dd.edd9a8",
"name": "",
"topic": "req/bluelinky/set_chargetargets",
"qos": "0",
"datatype": "auto",
"broker": "bb13a99d.68b8f8",
"x": 490,
"y": 1060,
"wires": [
[
"aa4d220b.f7e19"
]
]
},
{
"id": "bb13a99d.68b8f8",
"type": "mqtt-broker",
"name": "mqtt_Server",
"broker": "127.0.0.1",
"port": "1883",
"clientid": "",
"usetls": false,
"compatmode": false,
"keepalive": "60",
"cleansession": true,
"birthTopic": "",
"birthQos": "0",
"birthPayload": "",
"closeTopic": "",
"closeQos": "0",
"closePayload": "",
"willTopic": "",
"willQos": "0",
"willPayload": ""
},
{
"id": "452a3304.58c8fc",
"type": "bluelinky",
"username": "deinBluelinkUser",
"password": "deinBluelinkPass",
"region": "EU",
"pin": "DeinePIN",
"vin": "DeineVIN",
"brand": "[hyundai|kia]"
}
]
Vielleicht wäre es noch gut der Vollständigkeitshalber auch noch das Aktuelle defmod des MQTT Device von FHEM zu posten, dann könnten Neulinge das direkt für den ersten Einsatz einrichten
Zitat von: xerion am 29 Oktober 2021, 13:02:36
Vielleicht wäre es noch gut der Vollständigkeitshalber auch noch das Aktuelle defmod des MQTT Device von FHEM zu posten, dann könnten Neulinge das direkt für den ersten Einsatz einrichten
Und schon geht es weiter :-)
Das wäre mit MQTT2.
Der Ursprung ist auch von @mnl1234
defmod MQTT2_FHEM_Server MQTT2_SERVER 1883 global
attr MQTT2_FHEM_Server DbLogExclude .*
attr MQTT2_FHEM_Server alias MQTT2_FHEM_Server
attr MQTT2_FHEM_Server autocreate simple
attr MQTT2_FHEM_Server disable 0
attr MQTT2_FHEM_Server room MQTT2
attr MQTT2_FHEM_Server verbose 1
defmod WB_1_Kia_eNiro MQTT2_DEVICE
attr WB_1_Kia_eNiro DbLogExclude .*
attr WB_1_Kia_eNiro IODev MQTT2_FHEM_Server
attr WB_1_Kia_eNiro alias WB_1_Kia_eNiro
attr WB_1_Kia_eNiro autocreate 1
attr WB_1_Kia_eNiro devicetopic bluelinky
attr WB_1_Kia_eNiro group PV Eigenverbrauch
attr WB_1_Kia_eNiro icon car
attr WB_1_Kia_eNiro readingList $DEVICETOPIC/status:.* { json2nameValue($EVENT) }\
$DEVICETOPIC/location.* { json2nameValue($EVENT) }\
$DEVICETOPIC/odometer:.* { json2nameValue($EVENT) }\
$DEVICETOPIC/req_received:.* req_received\
$DEVICETOPIC/req_active:.* req_active
attr WB_1_Kia_eNiro room MQTT2_DEVICE,Strom->Photovoltaik
attr WB_1_Kia_eNiro setList getOdometer req/$DEVICETOPIC/get_odometer get_odometer\
getStatus req/$DEVICETOPIC/get_status get_status\
getLocation req/$DEVICETOPIC/get_location get_location\
getAll req/$DEVICETOPIC/get_all get_all\
startCharge req/$DEVICETOPIC/start_charging start_charging\
stopCharge req/$DEVICETOPIC/stop_charging stop_charging\
stopClimate req/$DEVICETOPIC/stop_climate stop_climate\
startHeating req/$DEVICETOPIC/start_climate {"defrost": true, "windscreenHeating": true, "temperature": 22.0 , "unit": "C"}\
startCooling req/$DEVICETOPIC/start_climate {"defrost": false, "windscreenHeating": false, "temperature": 22.0 , "unit": "C"}
attr WB_1_Kia_eNiro sortby 312
attr WB_1_Kia_eNiro stateFormat {my $charge = (ReadingsVal($name,"charging","false") eq "true");;;; my $athome = (ReadingsVal($name,"atHomeStanding","false") eq "true");;;; my $chargeathome = ($charge && $athome);;;; my $connectedathome = ($athome && ReadingsVal($name,"connected","false") eq "true");;;; sprintf(" <table> <tr> <td style='text-align:right'>Status:</td> <td style='text-align:left'>%s</td> </tr> <tr> <td style='text-align:right'>Akku:</td> <td style='text-align:left'>%s %%</td> </tr> <tr> <td style='text-align:right'>Reichweite:</td> <td style='text-align:left'>%s km</td> </tr> <tr style='%s'> <td style='text-align:right'>Ladedauer:</td> <td style='text-align:left'>%s h</td> </tr> <tr> <td style='text-align:right'>Ladegrenze AC:</td> <td style='text-align:left'>%s %%</td> </tr> <tr> <td style='text-align:right'>Kilometerstand:</td> <td style='text-align:left'>%d km</td> </tr> <tr> <td style='text-align:right'>12V Batterie:</td> <td style='text-align:left'>%s %%</td> </tr> <tr> <td style='text-align:right'>Aktivstatus:</td> <td style='text-align:left'>%s</td> </tr> <tr> <td style='text-align:right'>Zeit:</td> <td style='text-align:left'>%s</td> </tr> </table> ", ($chargeathome ? "läd zu Hause" : ($connectedathome ? "angeschlossen zu Hause" : ($athome ? "zu Hause" : ($charge ? "Läd auswärts" : "unterwegs")))), ReadingsVal($name,"batSOC",""), ReadingsVal($name,"range",""), ($charge ? "" : "display:none;;"), ReadingsVal($name,"time2targetSOC",""), ReadingsVal($name,"targetSOC",""), ReadingsVal($name,"odometer_value",""), ReadingsVal($name,"bat12v",""), ReadingsVal($name,"req_active",""), ReadingsTimestamp($name,"status_time","") ) }
attr WB_1_Kia_eNiro userReadings atHomeStanding:location.* { ((abs(AttrVal("global","latitude",49.85) - ReadingsVal($NAME,"location_coord_lat",0)) <= 0.001) && (abs(AttrVal("global","longitude",8.49) - ReadingsVal($NAME,"location_coord_lon",0)) <= 0.001) && (ReadingsVal($NAME,"location_speed_value",1) == 0)) ? 'true' : 'false';;;; },\
batSOC:status.* { ReadingsVal($NAME,"status_evStatus_batteryStatus",0);;;;},\
connected:status.* { (ReadingsVal($NAME,"status_evStatus_batteryPlugin",0) != 0) ? 'true' : 'false';;;;},\
charging:status.* { ReadingsVal($NAME,"status_evStatus_batteryCharge",'false');;;;},\
targetSOC:status.* { ReadingsVal($NAME,"status_evStatus_reservChargeInfos_targetSOClist_2_targetSOClevel",0);;;;},\
time2targetSOC:status.* { my $t = ReadingsVal($NAME,"status_evStatus_remainTime2_atc_value",1);;;; sprintf("%02d:%02d", $t/60%60, $t%60);;},\
range:status.* { ReadingsVal($NAME,"status_evStatus_drvDistance_1_rangeByFuel_totalAvailableRange_value",0);;;;},\
bat12v:status.* { ReadingsVal($NAME,"status_battery_batSoc",0);;;;},
attr WB_1_Kia_eNiro webCmd getAll:startCharge:stopCharge:startHeating:startCooling:stopClimate
setstate WB_1_Kia_eNiro <table> <tr> <td style='text-align:right'>Status:</td> <td style='text-align:left'>zu Hause</td> </tr> <tr> <td style='text-align:right'>Akku:</td> <td style='text-align:left'>88 %</td> </tr> <tr> <td style='text-align:right'>Reichweite:</td> <td style='text-align:left'>396 km</td> </tr> <tr style='display:none;;'> <td style='text-align:right'>Ladedauer:</td> <td style='text-align:left'>00:35 h</td> </tr> <tr> <td style='text-align:right'>Ladegrenze AC:</td> <td style='text-align:left'>100 %</td> </tr> <tr> <td style='text-align:right'>Kilometerstand:</td> <td style='text-align:left'>231 km</td> </tr> <tr> <td style='text-align:right'>12V Batterie:</td> <td style='text-align:left'>78 %</td> </tr> <tr> <td style='text-align:right'>Aktivstatus:</td> <td style='text-align:left'>idle</td> </tr> <tr> <td style='text-align:right'>Zeit:</td> <td style='text-align:left'>2021-10-29 12:31:03</td> </tr> </table>
Wie bereits geschrieben sammle ich jetzt Erfahrungen und möchte das dann ins Wiki stellen.
Hast Du noch schöne DOIF steuerungs Beispiele?
Zitat von: ch.eick am 29 Oktober 2021, 13:12:52
Und schon geht es weiter :-)
Das wäre mit MQTT2.
Der Ursprung ist auch von @mnl1234
defmod WB_1_Kia_eNiro MQTT2_DEVICE
attr WB_1_Kia_eNiro DbLogExclude .*
attr WB_1_Kia_eNiro IODev MQTT2_FHEM_Server
attr WB_1_Kia_eNiro alias WB_1_Kia_eNiro
attr WB_1_Kia_eNiro autocreate 1
attr WB_1_Kia_eNiro devicetopic bluelinky
attr WB_1_Kia_eNiro group PV Eigenverbrauch
attr WB_1_Kia_eNiro icon car
attr WB_1_Kia_eNiro readingList $DEVICETOPIC/status:.* { json2nameValue($EVENT) }\
$DEVICETOPIC/location.* { json2nameValue($EVENT) }\
$DEVICETOPIC/odometer:.* { json2nameValue($EVENT) }\
$DEVICETOPIC/req_received:.* req_received\
$DEVICETOPIC/req_active:.* req_active
attr WB_1_Kia_eNiro room MQTT2_DEVICE,Strom->Photovoltaik
attr WB_1_Kia_eNiro setList getOdometer req/$DEVICETOPIC/get_odometer get_odometer\
getStatus req/$DEVICETOPIC/get_status get_status\
getLocation req/$DEVICETOPIC/get_location get_location\
getAll req/$DEVICETOPIC/get_all get_all\
startCharge req/$DEVICETOPIC/start_charging start_charging\
stopCharge req/$DEVICETOPIC/stop_charging stop_charging\
stopClimate req/$DEVICETOPIC/stop_climate stop_climate\
startHeating req/$DEVICETOPIC/start_climate {"defrost": true, "windscreenHeating": true, "temperature": 22.0 , "unit": "C"}\
startCooling req/$DEVICETOPIC/start_climate {"defrost": false, "windscreenHeating": false, "temperature": 22.0 , "unit": "C"}
attr WB_1_Kia_eNiro sortby 312
attr WB_1_Kia_eNiro stateFormat {my $charge = (ReadingsVal($name,"charging","false") eq "true");;;; my $athome = (ReadingsVal($name,"atHomeStanding","false") eq "true");;;; my $chargeathome = ($charge && $athome);;;; my $connectedathome = ($athome && ReadingsVal($name,"connected","false") eq "true");;;; sprintf(" <table> <tr> <td style='text-align:right'>Status:</td> <td style='text-align:left'>%s</td> </tr> <tr> <td style='text-align:right'>Akku:</td> <td style='text-align:left'>%s %%</td> </tr> <tr> <td style='text-align:right'>Reichweite:</td> <td style='text-align:left'>%s km</td> </tr> <tr style='%s'> <td style='text-align:right'>Ladedauer:</td> <td style='text-align:left'>%s h</td> </tr> <tr> <td style='text-align:right'>Ladegrenze AC:</td> <td style='text-align:left'>%s %%</td> </tr> <tr> <td style='text-align:right'>Kilometerstand:</td> <td style='text-align:left'>%d km</td> </tr> <tr> <td style='text-align:right'>12V Batterie:</td> <td style='text-align:left'>%s %%</td> </tr> <tr> <td style='text-align:right'>Aktivstatus:</td> <td style='text-align:left'>%s</td> </tr> <tr> <td style='text-align:right'>Zeit:</td> <td style='text-align:left'>%s</td> </tr> </table> ", ($chargeathome ? "läd zu Hause" : ($connectedathome ? "angeschlossen zu Hause" : ($athome ? "zu Hause" : ($charge ? "Läd auswärts" : "unterwegs")))), ReadingsVal($name,"batSOC",""), ReadingsVal($name,"range",""), ($charge ? "" : "display:none;;"), ReadingsVal($name,"time2targetSOC",""), ReadingsVal($name,"targetSOC",""), ReadingsVal($name,"odometer_value",""), ReadingsVal($name,"bat12v",""), ReadingsVal($name,"req_active",""), ReadingsTimestamp($name,"status_time","") ) }
attr WB_1_Kia_eNiro userReadings atHomeStanding:location.* { ((abs(AttrVal("global","latitude",49.85) - ReadingsVal($NAME,"location_coord_lat",0)) <= 0.001) && (abs(AttrVal("global","longitude",8.49) - ReadingsVal($NAME,"location_coord_lon",0)) <= 0.001) && (ReadingsVal($NAME,"location_speed_value",1) == 0)) ? 'true' : 'false';;;; },\
batSOC:status.* { ReadingsVal($NAME,"status_evStatus_batteryStatus",0);;;;},\
connected:status.* { (ReadingsVal($NAME,"status_evStatus_batteryPlugin",0) != 0) ? 'true' : 'false';;;;},\
charging:status.* { ReadingsVal($NAME,"status_evStatus_batteryCharge",'false');;;;},\
targetSOC:status.* { ReadingsVal($NAME,"status_evStatus_reservChargeInfos_targetSOClist_2_targetSOClevel",0);;;;},\
time2targetSOC:status.* { my $t = ReadingsVal($NAME,"status_evStatus_remainTime2_atc_value",1);;;; sprintf("%02d:%02d", $t/60%60, $t%60);;},\
range:status.* { ReadingsVal($NAME,"status_evStatus_drvDistance_1_rangeByFuel_totalAvailableRange_value",0);;;;},\
bat12v:status.* { ReadingsVal($NAME,"status_battery_batSoc",0);;;;},
attr WB_1_Kia_eNiro webCmd getAll:startCharge:stopCharge:startHeating:startCooling:stopClimate
setstate WB_1_Kia_eNiro <table> <tr> <td style='text-align:right'>Status:</td> <td style='text-align:left'>zu Hause</td> </tr> <tr> <td style='text-align:right'>Akku:</td> <td style='text-align:left'>88 %</td> </tr> <tr> <td style='text-align:right'>Reichweite:</td> <td style='text-align:left'>396 km</td> </tr> <tr style='display:none;;'> <td style='text-align:right'>Ladedauer:</td> <td style='text-align:left'>00:35 h</td> </tr> <tr> <td style='text-align:right'>Ladegrenze AC:</td> <td style='text-align:left'>100 %</td> </tr> <tr> <td style='text-align:right'>Kilometerstand:</td> <td style='text-align:left'>231 km</td> </tr> <tr> <td style='text-align:right'>12V Batterie:</td> <td style='text-align:left'>78 %</td> </tr> <tr> <td style='text-align:right'>Aktivstatus:</td> <td style='text-align:left'>idle</td> </tr> <tr> <td style='text-align:right'>Zeit:</td> <td style='text-align:left'>2021-10-29 12:31:03</td> </tr> </table>
Wie bereits geschrieben sammle ich jetzt Erfahrungen und möchte das dann ins Wiki stellen.
Hast Du noch schöne DOIF steuerungs Beispiele?
Ich nutze Bluelinky für folgende Anwendungszwecke:
-Auslesen des Kilometerstandes beim Verbinden der Wallbox über DOIF
-Timer und Temperatur gesteuerte Klimatisierung über FUIP und DOIF
-Google Maps Position per WEBLINK
-SoC lese ich per OBD2 aus da es mir mit Bluelinky zu unstabil war, und wenn man PV Optimiert Zielladen möchte ist das mit dieser API leider zu träge.
Falls dort Interesse besteht kann ich das zur Verfügung stellen.
Zitat von: xerion am 29 Oktober 2021, 13:25:16
Ich nutze Bluelinky für folgende Anwendungszwecke:
-Auslesen des Kilometerstandes beim Verbinden der Wallbox über DOIF
-Timer und Temperatur gesteuerte Klimatisierung über FUIP und DOIF
-Google Maps Position per WEBLINK
-SoC lese ich per OBD2 aus da es mir mit Bluelinky zu unstabil war, und wenn man PV Optimiert Zielladen möchte ist das mit dieser API leider zu träge.
Falls dort Interesse besteht kann ich das zur Verfügung stellen.
Ja bitte, ich habe gerade begonnen und würde mir das auch gerne ansehen.
Das mit dem Zielladen wollte ich in der Theorie anders lösen.
- mit dem Kia Connect kann ich den Ziel Soc vorgeben
somit kümmert sich das Auto darum und stoppt einfach das Laden, wenn der SOC erreicht ist
Ich habe eine openWB , wo das auch experimentell gehen soll, wenn jedoch das Fahrzeug das machen kann, mache ich lieber im Endverbraucher.
EDIT:
Hier schon mal ein kleiner Anfang mit uiTable im DOIF für die Kia/Hunday Steuerung.
In den nächsten Zeilen/Spalten kommt dann der Status und eine eventuelle Möglichkeit diesen direkt zu ändern.
Im Screenshot sieht man bereits das erste Kommando zur Status Abfrage. Die Zeitsteuerung ist bereits im DOIF abgebildet und kann hier als Auswahl aus dem Pull Down nochmals manuell aufgerufen werden.
Wie in meinem Speicher Steuerungs Screenshot wird dann der Accu Stand auch grafisch dargestellt werden.
Für den Timer nutze ich FUIP als grafische Oberfläche siehe Screenshot, das setzt dann einfach einen Timer im "WeekdayTimer" Modul. Da ich beim Timer die Abfahrtzeit eingeben möchte nehme ich zeit und Datum als getrenntes Reading.
defmod TimerBluelink WeekdayTimer de de 12345|07:40|on
attr TimerBluelink alias TimerBluelink
attr TimerBluelink commandTemplate set $NAME $EVENT
attr TimerBluelink disable 0
attr TimerBluelink room Auto
attr TimerBluelink userReadings Date {(substr(ReadingsVal("TimerBluelink","nextUpdate",""),0,10))},\
Time {(substr(ReadingsVal("TimerBluelink","nextUpdate",""),11,8))}
Der WeekdayTimer steuert dann ein DOIF welches die Readings Date und Time asuwertet:
defmod di_WeekdaytTimerBluelink DOIF ([([TimerBluelink:Time]-[00:15:00])] and $ymd eq [TimerBluelink:Date] and [TimerBluelink:disabled] eq 0)\
(set du_bluelink on-for-timer 1200 )\
DOELSE\
attr di_WeekdaytTimerBluelink alias di_WeekdaytTimerBluelink
attr di_WeekdaytTimerBluelink event-on-change-reading .*
attr di_WeekdaytTimerBluelink room Auto
Damit ich die Temperatur per Slider einstellen kann und unterscheiden kann ob mit oder ohne defrost habe ich das noch definiert:
startTemp:slider,17,1,27 /bluelink/start_car {"defrost": false,"windscreenHeating": false,"temperature": "$EVTPART1","unit": "C"}
startTemp_with_Defrost:slider,17,1,27 /bluelink/start_car_with_Defrost {"defrost": true,"windscreenHeating": true,"temperature": "$EVTPART1","unit": "C"}
Um die GPS Position in Google Maps anzeigen zu lassen nutze ich weblink:
defmod rr_Kona_map weblink htmlCode {\
'<ul style="width: 400px;; overflow: hidden;; height: 300px;;">\
<iframe name="rr_Kona_map" src="https://www.google.com/maps/embed/v1/place?key=xxxxxxxxxxxxxxxxxxxxxxx='\
.ReadingsVal('Bluelink','latitude','')\
.','\
.ReadingsVal('Bluelink','longitude','')\
.'&zoom=13" width="480" height="480" frameborder="0" style="border:0;; margin-top: -165px;; margin-left: -135px;;">\
</iframe>\
</ul>'\
}
attr rr_Kona_map alias Current Location
attr rr_Kona_map comment Auto-created by ROOMMATE module
attr rr_Kona_map group Kona
attr rr_Kona_map room Anwesenheit,Auto
Ich meinte das man dafür einen API Key bei Google Maps erzeugen musste, finde den Beitrag aber gerade nicht wieder.
Zitat von: xerion am 29 Oktober 2021, 15:46:40
Für den Timer nutze ich FUIP als grafische Oberfläche siehe Screenshot, das setzt dann einfach einen Timer im "WeekdayTimer" Modul. Da ich beim Timer die Abfahrtzeit eingeben möchte nehme ich zeit und Datum als getrenntes Reading.
Der WeekdayTimer steuert dann ein DOIF welches die Readings Date und Time asuwertet:
Das ist auch sehr schön und man kann es ja parralel nutzen. Momentan bin ich nur an der Basis im FHEMWEB, da ja eigentlich alles automatischen laufen soll.
Zitat von: ch.eick am 29 Oktober 2021, 13:12:52
Und schon geht es weiter :-)
Das wäre mit MQTT2.
Der Ursprung ist auch von @mnl1234
defmod MQTT2_FHEM_Server MQTT2_SERVER 1883 global
attr MQTT2_FHEM_Server DbLogExclude .*
attr MQTT2_FHEM_Server alias MQTT2_FHEM_Server
attr MQTT2_FHEM_Server autocreate simple
attr MQTT2_FHEM_Server disable 0
attr MQTT2_FHEM_Server room MQTT2
attr MQTT2_FHEM_Server verbose 1
defmod WB_1_Kia_eNiro MQTT2_DEVICE
attr WB_1_Kia_eNiro DbLogExclude .*
attr WB_1_Kia_eNiro IODev MQTT2_FHEM_Server
attr WB_1_Kia_eNiro alias WB_1_Kia_eNiro
attr WB_1_Kia_eNiro autocreate 1
attr WB_1_Kia_eNiro devicetopic bluelinky
attr WB_1_Kia_eNiro group PV Eigenverbrauch
attr WB_1_Kia_eNiro icon car
attr WB_1_Kia_eNiro readingList $DEVICETOPIC/status:.* { json2nameValue($EVENT) }\
$DEVICETOPIC/location.* { json2nameValue($EVENT) }\
$DEVICETOPIC/odometer:.* { json2nameValue($EVENT) }\
$DEVICETOPIC/req_received:.* req_received\
$DEVICETOPIC/req_active:.* req_active
attr WB_1_Kia_eNiro room MQTT2_DEVICE,Strom->Photovoltaik
attr WB_1_Kia_eNiro setList getOdometer req/$DEVICETOPIC/get_odometer get_odometer\
getStatus req/$DEVICETOPIC/get_status get_status\
getLocation req/$DEVICETOPIC/get_location get_location\
getAll req/$DEVICETOPIC/get_all get_all\
startCharge req/$DEVICETOPIC/start_charging start_charging\
stopCharge req/$DEVICETOPIC/stop_charging stop_charging\
stopClimate req/$DEVICETOPIC/stop_climate stop_climate\
startHeating req/$DEVICETOPIC/start_climate {"defrost": true, "windscreenHeating": true, "temperature": 22.0 , "unit": "C"}\
startCooling req/$DEVICETOPIC/start_climate {"defrost": false, "windscreenHeating": false, "temperature": 22.0 , "unit": "C"}
attr WB_1_Kia_eNiro sortby 312
attr WB_1_Kia_eNiro stateFormat {my $charge = (ReadingsVal($name,"charging","false") eq "true");;;; my $athome = (ReadingsVal($name,"atHomeStanding","false") eq "true");;;; my $chargeathome = ($charge && $athome);;;; my $connectedathome = ($athome && ReadingsVal($name,"connected","false") eq "true");;;; sprintf(" <table> <tr> <td style='text-align:right'>Status:</td> <td style='text-align:left'>%s</td> </tr> <tr> <td style='text-align:right'>Akku:</td> <td style='text-align:left'>%s %%</td> </tr> <tr> <td style='text-align:right'>Reichweite:</td> <td style='text-align:left'>%s km</td> </tr> <tr style='%s'> <td style='text-align:right'>Ladedauer:</td> <td style='text-align:left'>%s h</td> </tr> <tr> <td style='text-align:right'>Ladegrenze AC:</td> <td style='text-align:left'>%s %%</td> </tr> <tr> <td style='text-align:right'>Kilometerstand:</td> <td style='text-align:left'>%d km</td> </tr> <tr> <td style='text-align:right'>12V Batterie:</td> <td style='text-align:left'>%s %%</td> </tr> <tr> <td style='text-align:right'>Aktivstatus:</td> <td style='text-align:left'>%s</td> </tr> <tr> <td style='text-align:right'>Zeit:</td> <td style='text-align:left'>%s</td> </tr> </table> ", ($chargeathome ? "läd zu Hause" : ($connectedathome ? "angeschlossen zu Hause" : ($athome ? "zu Hause" : ($charge ? "Läd auswärts" : "unterwegs")))), ReadingsVal($name,"batSOC",""), ReadingsVal($name,"range",""), ($charge ? "" : "display:none;;"), ReadingsVal($name,"time2targetSOC",""), ReadingsVal($name,"targetSOC",""), ReadingsVal($name,"odometer_value",""), ReadingsVal($name,"bat12v",""), ReadingsVal($name,"req_active",""), ReadingsTimestamp($name,"status_time","") ) }
attr WB_1_Kia_eNiro userReadings atHomeStanding:location.* { ((abs(AttrVal("global","latitude",49.85) - ReadingsVal($NAME,"location_coord_lat",0)) <= 0.001) && (abs(AttrVal("global","longitude",8.49) - ReadingsVal($NAME,"location_coord_lon",0)) <= 0.001) && (ReadingsVal($NAME,"location_speed_value",1) == 0)) ? 'true' : 'false';;;; },\
batSOC:status.* { ReadingsVal($NAME,"status_evStatus_batteryStatus",0);;;;},\
connected:status.* { (ReadingsVal($NAME,"status_evStatus_batteryPlugin",0) != 0) ? 'true' : 'false';;;;},\
charging:status.* { ReadingsVal($NAME,"status_evStatus_batteryCharge",'false');;;;},\
targetSOC:status.* { ReadingsVal($NAME,"status_evStatus_reservChargeInfos_targetSOClist_2_targetSOClevel",0);;;;},\
time2targetSOC:status.* { my $t = ReadingsVal($NAME,"status_evStatus_remainTime2_atc_value",1);;;; sprintf("%02d:%02d", $t/60%60, $t%60);;},\
range:status.* { ReadingsVal($NAME,"status_evStatus_drvDistance_1_rangeByFuel_totalAvailableRange_value",0);;;;},\
bat12v:status.* { ReadingsVal($NAME,"status_battery_batSoc",0);;;;},
attr WB_1_Kia_eNiro webCmd getAll:startCharge:stopCharge:startHeating:startCooling:stopClimate
setstate WB_1_Kia_eNiro <table> <tr> <td style='text-align:right'>Status:</td> <td style='text-align:left'>zu Hause</td> </tr> <tr> <td style='text-align:right'>Akku:</td> <td style='text-align:left'>88 %</td> </tr> <tr> <td style='text-align:right'>Reichweite:</td> <td style='text-align:left'>396 km</td> </tr> <tr style='display:none;;'> <td style='text-align:right'>Ladedauer:</td> <td style='text-align:left'>00:35 h</td> </tr> <tr> <td style='text-align:right'>Ladegrenze AC:</td> <td style='text-align:left'>100 %</td> </tr> <tr> <td style='text-align:right'>Kilometerstand:</td> <td style='text-align:left'>231 km</td> </tr> <tr> <td style='text-align:right'>12V Batterie:</td> <td style='text-align:left'>78 %</td> </tr> <tr> <td style='text-align:right'>Aktivstatus:</td> <td style='text-align:left'>idle</td> </tr> <tr> <td style='text-align:right'>Zeit:</td> <td style='text-align:left'>2021-10-29 12:31:03</td> </tr> </table>
Wie bereits geschrieben sammle ich jetzt Erfahrungen und möchte das dann ins Wiki stellen.
Hast Du noch schöne DOIF steuerungs Beispiele?
Vielen Dank erst einmal.
Bekomme beim einfügen der readinglist folgender Fehler
WB_1_Kia_eNiro: bad reading name {json2nameValue($EVENT) }\ (contains not A-Za-z/\d_\.- or is too long)
Zitat von: michisa86888 am 30 Oktober 2021, 09:22:09
Vielen Dank erst einmal.
Bekomme beim einfügen der readinglist folgender Fehler
WB_1_Kia_eNiro: bad reading name {json2nameValue($EVENT) }\ (contains not A-Za-z/\d_\.- or is too long)
Ich gehe davon aus dass du es nicht über Raw Definition import hast denn dort werden die "/" automatisch entfernt. Wenn du es händisch einfügst musst du es richtig formatieren.
Zitat von: xerion am 29 Oktober 2021, 13:25:16
Ich nutze Bluelinky für folgende Anwendungszwecke:
-Auslesen des Kilometerstandes beim Verbinden der Wallbox über DOIF
Okay, das wird automatisch jede Stunde aktualisiert, wenn das Fahrzeug nicht zuhause ist und alle 15 Minuten, wenn es geladen wird.
Sollte die 12V Batterie unter 40% Ladezustand haben wird diese Abfrage gestoppt, dann wird man ja eh längere zeit nicht gefahren sein.
Zitat
-Timer und Temperatur gesteuerte Klimatisierung über FUIP und DOIF
Damit ich die Temperatur per Slider einstellen kann und unterscheiden kann ob mit oder ohne defrost habe ich das noch definiert:
startTemp:slider,17,1,27 /bluelink/start_car {"defrost": false,"windscreenHeating": false,"temperature": "$EVTPART1","unit": "C"}
startTemp_with_Defrost:slider,17,1,27 /bluelink/start_car_with_Defrost {"defrost": true,"windscreenHeating": true,"temperature": "$EVTPART1","unit": "C"}
Das versuche ich dann auch ins FHEMWEG uiTable zu bringen.
Zitat
-Google Maps Position per WEBLINK
Das hast Du ja in einer readingGroup abgebildet und wäre somit unabhängig. Das stelle ich dann mal bei mir zurück.
Zitat
-SoC lese ich per OBD2 aus da es mir mit Bluelinky zu unstabil war, und wenn man PV Optimiert Zielladen möchte ist das mit dieser API leider zu träge.
Hier habe ich im openWB Forum noch etwas angefragt.
Eigentlich kann man über das Kia Connect einen Ziel SOC vorgeben, was diese Steuerung ins Auto verlagern würde. Damit muss man nicht dauernd den SOC abfragen und könnte einfach der WB sagen, sie soll nur PV-Leistung verwenden. Sobald das Auto den SOC erreicht hat würde es selber aufhören zu laden.
Bei weniger intelligenten WBs muss man sich dann nur noch mit der Ladeleistung beschäftigen, was hier nicht rein gehören würde.
Momentan platziere ich gerade die Status Informationen im uiTable
Durch @mnl1234 ist ja bereits folgende SetList bereitgestellt worden
getOdometer req/$DEVICETOPIC/get_odometer get_odometer
getStatus req/$DEVICETOPIC/get_status get_status
getLocation req/$DEVICETOPIC/get_location get_location
getAll req/$DEVICETOPIC/get_all get_all
startCharge req/$DEVICETOPIC/start_charging start_charging
stopCharge req/$DEVICETOPIC/stop_charging stop_charging
stopClimate req/$DEVICETOPIC/stop_climate stop_climate
startHeating req/$DEVICETOPIC/start_climate {"defrost": true, "windscreenHeating": true, "temperature": 22.0 , "unit": "C"}
startCooling req/$DEVICETOPIC/start_climate {"defrost": false, "windscreenHeating": false, "temperature": 22.0 , "unit": "C"}
@mnl1234 ich habe noch das problem, dass das set_chargetargets im node-red Flow noch nicht so richtig funktioniert
FHEM:
setChargeTargetSoc req/$DEVICETOPIC/set_chargetargets {"fast": 80, "slow": 50}
node-red:
Ich habe von ein json Object in den Flow eingebaut und das debugging aktiviert.
31.10.2021, 10:50:21node: 33b1bc85.662694
req/bluelinky/set_chargetargets : msg.payload : Object
{ fast: 80, slow: 50 }
31.10.2021, 10:50:34node: 811aa567.e89f98
msg.payload : undefined <<<<<<<<<<<< kannst Du mir da noch helfen?
undefined
31.10.2021, 10:50:34node: fecad185.324f8
msg.payload : string[4]
"idle"
31.10.2021, 10:58:00node: fecad185.324f8
req/bluelinky/get_all : msg.payload : string[7]
"pending"
31.10.2021, 10:58:23node: fecad185.324f8
msg.payload : string[4]
"idle"
Sollte ich generell noch etwas vergessen haben, so schickt mir bitte nochmal Eure Wünsche.
VG
Christian
EDIT: Der zweite screenshot ist nur ein Draft, aber es geht voran.
Die Batteriestände werden farbig angezeigt.
Beim zweiten Pull Down Menü kann man jetzt die Klimatisierung steuern und mit einer select Liste die Temperatur vorwählen.
Zitat von: ch.eick am 31 Oktober 2021, 11:07:46
[/code]
@mnl1234 ich habe noch das problem, dass das set_chargetargets im node-red Flow noch nicht so richtig funktioniert
FHEM:
setChargeTargetSoc req/$DEVICETOPIC/set_chargetargets {"fast": 80, "slow": 50}
node-red:
Ich habe von ein json Object in den Flow eingebaut und das debugging aktiviert.
31.10.2021, 10:50:21node: 33b1bc85.662694
req/bluelinky/set_chargetargets : msg.payload : Object
{ fast: 80, slow: 50 }
31.10.2021, 10:50:34node: 811aa567.e89f98
msg.payload : undefined <<<<<<<<<<<< kannst Du mir da noch helfen?
undefined
31.10.2021, 10:50:34node: fecad185.324f8
msg.payload : string[4]
"idle"
31.10.2021, 10:58:00node: fecad185.324f8
req/bluelinky/get_all : msg.payload : string[7]
"pending"
31.10.2021, 10:58:23node: fecad185.324f8
msg.payload : string[4]
"idle"
Es sieht so aus als ob das JSON Objekt falsch formatiert ist, so funktioniert es:
{
"fast": 100,
"slow": 80
}
Zitat von: xerion am 01 November 2021, 14:23:58
Es sieht so aus als ob das JSON Objekt falsch formatiert ist, so funktioniert es:
{
"fast": 100,
"slow": 80
}
Ja Danke, stimmt. Ich habe es jetzt auch bereits am laufen und noch einige Änderungen im node-red Flow.
Nach dem Test gebe ich bescheid.
Zitat von: xerion am 29 Oktober 2021, 15:56:47
Damit ich die Temperatur per Slider einstellen kann und unterscheiden kann ob mit oder ohne defrost habe ich das noch definiert:
startTemp:slider,17,1,27 /bluelink/start_car {"defrost": false,"windscreenHeating": false,"temperature": "$EVTPART1","unit": "C"}
startTemp_with_Defrost:slider,17,1,27 /bluelink/start_car_with_Defrost {"defrost": true,"windscreenHeating": true,"temperature": "$EVTPART1","unit": "C"}
Bei welchem Attribut hast Du das denn eingebaut?
Zitat von: ch.eick am 01 November 2021, 16:05:22
Bei welchem Attribut hast Du das denn eingebaut?
Das kommt unter setList rein.....
Hallo zusammen,
wie würde Euch dieses uiTable gefallen?
- Die ausführbaren Komandos befinden sich in den Pull Down Menüs.
- Variable Werte können aus select Listen gesetzt werden.
- Der kommunikations Status wird mit "idel" in grün oder "pending" in rot angegeben
- Der Status ist in der rechten Spalte
- In der Zeile Komfort wollte ich noch das Abschließen des Fahrzeuges abbilden und eine Warnung für den Reifendruck.
- Beim Accu fehlen noch die Ladezeiten, bis zum SOC
- Bei der Klimatisierung wäre dann noch die Lenkrad Heizung und die heizbare Heckscheibe, sowie die Zeiteinstellung für die Klimatisierung.
Habt Ihr noch Ideen, was fehlen würde, oder Vorschläge für eine andere Anordnung?
VG
Christian
Ich denke das sieht doch für den Anfang sehr gut aus. Ideen und Wünsche kommen bestimmt noch wenn man es im Einsatz hat ;-)
Update: 2022-01-12
Hallo zusammen,
ich möchte schon mal hier mein derzeitiges Ergebnis vorstellen.
Achtung, es ist noch in Bearbeitung!
Vielen Dank an alle, die bereits viel vorbereitet haben. Ich habe darauf aufgesetzt und versucht alles zu vereinen.
Voraussetzung:
node-red
einen etwas geändertem Flow, da der set Teil noch nicht ganz ausgearbeitet war.
FHEM MQTT2
einen Server Eintrag
das Kia_eNiro_connect Device, hier tendiere ich noch zu einem generischen Namen z.B. einfach nur Kia_connect
FHEM DOIF Device mit uiTable
Falls nicht vorhanden:
node-red:
Im docker-compose.yml
node-red:
image: nodered/node-red:latest
environment:
- TZ=Europe/Berlin
ports:
- 1880:1880
volumes:
- ./node-red/data:/data
Das data Verzeichnis für node-red anlegen
mkdir ./node-red
mkdir ./node-red/data
ls -l
drwxr-xr-x 3 pi pi 4096 Okt 28 11:46 node-red
node-red zum ersten mal starten, danach kann man auch portainer verwenden
docker-compose up -d
Anschließend kann man über Port 1880 das node-red aufrufen und den Import des Flow machen.
Die Persionalisierung kann man hierbei direkt im JSON File machen, oder später im node-red Flow.
Der Flow ist ein einfacher "Übersetzer" zwischen dem MQTT2 und der Kia Connect API im Internet.
[
{
"id": "866c75dd.edd9a8",
"type": "tab",
"label": "Kia Connect",
"disabled": false,
"info": ""
},
{
"id": "bb13a99d.68b8f8",
"type": "mqtt-broker",
"name": "mqtt_Server",
"broker": "<IP des mqtt-broker>",
"port": "1883",
"clientid": "",
"autoConnect": true,
"usetls": false,
"compatmode": false,
"protocolVersion": "4",
"keepalive": "60",
"cleansession": true,
"birthTopic": "",
"birthQos": "0",
"birthPayload": "",
"birthMsg": {},
"closeTopic": "",
"closeQos": "0",
"closePayload": "",
"closeMsg": {},
"willTopic": "",
"willQos": "0",
"willPayload": "",
"willMsg": {},
"sessionExpiry": ""
},
{
"id": "452a3304.58c8fc",
"type": "bluelinky",
"username": "<KiaUser>",
"password": "<KiaUserPasswort>",
"region": "EU",
"pin": "<EurePin>",
"vin": "<EureVIN>",
"brand": "[kia|hyundai>"
},
{
"id": "91a345fa.5757a8",
"type": "mqtt in",
"z": "866c75dd.edd9a8",
"name": "",
"topic": "req/bluelinky/get_status",
"qos": "0",
"datatype": "auto",
"broker": "bb13a99d.68b8f8",
"inputs": 0,
"x": 440,
"y": 280,
"wires": [
[
"15dfb508.c6497b",
"ce62ba4f.d86548",
"3f82a275.5a0b6e",
"24d5e0b.3aafc2"
]
]
},
{
"id": "5ad085b9.05739c",
"type": "mqtt in",
"z": "866c75dd.edd9a8",
"name": "",
"topic": "req/bluelinky/start_climate",
"qos": "0",
"datatype": "auto",
"broker": "bb13a99d.68b8f8",
"inputs": 0,
"x": 450,
"y": 680,
"wires": [
[
"b27d74de.38c808",
"33b1bc85.662694",
"ce62ba4f.d86548",
"24d5e0b.3aafc2"
]
]
},
{
"id": "15dfb508.c6497b",
"type": "car-status",
"z": "866c75dd.edd9a8",
"name": "Get status",
"dorefresh": true,
"parsed": false,
"bluelinky": "452a3304.58c8fc",
"x": 830,
"y": 280,
"wires": [
[
"cccc9476.d56dd8",
"226ed925.607bb6"
]
]
},
{
"id": "87abdd88.8ff4d",
"type": "car-odometer",
"z": "866c75dd.edd9a8",
"name": "Get car odometer",
"bluelinky": "452a3304.58c8fc",
"x": 850,
"y": 200,
"wires": [
[
"40d2361c.579588",
"226ed925.607bb6"
]
]
},
{
"id": "31100f9a.40008",
"type": "function",
"z": "866c75dd.edd9a8",
"name": "locationWrapper",
"func": "if(msg.payload.hasOwnProperty(\"body\")) {\n msg.payload = {\"error\":true};\n return msg;\n}\nelse {\n\n msg.payload = { \n \"location\": msg.payload,\n \"error\": false\n };\n \n return msg;\n}",
"outputs": 1,
"noerr": 0,
"initialize": "",
"finalize": "",
"x": 1350,
"y": 120,
"wires": [
[
"85a07155.a0f9f",
"262df5dc.57916a",
"f487d6d6.a4d568"
]
]
},
{
"id": "bea1d927.0f3908",
"type": "car-location",
"z": "866c75dd.edd9a8",
"name": "Get car location",
"bluelinky": "452a3304.58c8fc",
"x": 840,
"y": 120,
"wires": [
[
"31100f9a.40008",
"226ed925.607bb6"
]
]
},
{
"id": "3c949d67.0d83b2",
"type": "mqtt in",
"z": "866c75dd.edd9a8",
"name": "",
"topic": "req/bluelinky/get_location",
"qos": "0",
"datatype": "auto",
"broker": "bb13a99d.68b8f8",
"nl": false,
"rap": false,
"inputs": 0,
"x": 450,
"y": 120,
"wires": [
[
"bea1d927.0f3908",
"ce62ba4f.d86548",
"3f82a275.5a0b6e",
"24d5e0b.3aafc2"
]
]
},
{
"id": "cccc9476.d56dd8",
"type": "function",
"z": "866c75dd.edd9a8",
"name": "analyseStatus",
"func": "if(msg.payload.hasOwnProperty(\"body\")) {\n msg.payload = {\"error\":true};\n return msg;\n}\nelse {\n let status = msg.payload;\n status.airTemp.value = 14+(parseInt(status.airTemp.value,16)/2);\n try{\n status.evStatus.reservChargeInfos.reservChargeInfo.reservChargeInfoDetail.reservFatcSet.airTemp.value = 14+(parseInt(status.evStatus.reservChargeInfos.reservChargeInfo.reservChargeInfoDetail.reservFatcSet.airTemp.value,16)/2);\n status.evStatus.reservChargeInfos.reserveChargeInfo2.reservChargeInfoDetail.reservFatcSet.airTemp.value = 14+(parseInt(status.evStatus.reservChargeInfos.reserveChargeInfo2.reservChargeInfoDetail.reservFatcSet.airTemp.value,16)/2);\n } catch(e) {}\n\n let time = status.evStatus.remainTime2.atc.value/60;\n let result = { \n \"batSOC\": status.evStatus.batteryStatus,\n \"connected\": (status.evStatus.batteryPlugin !== 0),\n \"charging\": status.evStatus.batteryCharge,\n \"targetSOC\": status.evStatus.reservChargeInfos.targetSOClist[1].targetSOClevel,\n \"time2targetSOC\": (Math.floor(time) + \":\" + (\"0\" + Math.floor((time % 1)*60)).slice(-2)), // h:mm\n \"range\": status.evStatus.drvDistance[0].rangeByFuel.totalAvailableRange.value,\n \"bat12v\": status.battery.batSoc\n };\n \n //msg.payload = result;\n msg.payload = {\n \"status\": status,\n \"error\": false\n \n };\n return msg;\n}",
"outputs": 1,
"noerr": 0,
"initialize": "",
"finalize": "",
"x": 1340,
"y": 280,
"wires": [
[
"3efceea0.c81b12",
"262df5dc.57916a",
"f487d6d6.a4d568"
]
]
},
{
"id": "85a07155.a0f9f",
"type": "mqtt out",
"z": "866c75dd.edd9a8",
"name": "",
"topic": "bluelinky/location",
"qos": "",
"retain": "",
"broker": "bb13a99d.68b8f8",
"x": 1870,
"y": 120,
"wires": []
},
{
"id": "3efceea0.c81b12",
"type": "mqtt out",
"z": "866c75dd.edd9a8",
"name": "",
"topic": "bluelinky/status",
"qos": "",
"retain": "",
"broker": "bb13a99d.68b8f8",
"x": 1860,
"y": 280,
"wires": []
},
{
"id": "327104fc.71e1bc",
"type": "mqtt out",
"z": "866c75dd.edd9a8",
"name": "",
"topic": "bluelinky/odometer",
"qos": "",
"retain": "",
"broker": "bb13a99d.68b8f8",
"x": 1870,
"y": 200,
"wires": []
},
{
"id": "844a32f4.2e029",
"type": "mqtt in",
"z": "866c75dd.edd9a8",
"name": "",
"topic": "req/bluelinky/stop_climate",
"qos": "0",
"datatype": "auto",
"broker": "bb13a99d.68b8f8",
"inputs": 0,
"x": 450,
"y": 760,
"wires": [
[
"7d3ae860.d8c9a8",
"33b1bc85.662694",
"ce62ba4f.d86548",
"24d5e0b.3aafc2"
]
]
},
{
"id": "57d91e50.7e96",
"type": "mqtt in",
"z": "866c75dd.edd9a8",
"name": "",
"topic": "req/bluelinky/start_charging",
"qos": "0",
"datatype": "auto",
"broker": "bb13a99d.68b8f8",
"inputs": 0,
"x": 460,
"y": 820,
"wires": [
[
"6eebc52c.ee23dc",
"33b1bc85.662694",
"ce62ba4f.d86548",
"24d5e0b.3aafc2"
]
]
},
{
"id": "6029f0a0.b73e",
"type": "mqtt in",
"z": "866c75dd.edd9a8",
"name": "",
"topic": "req/bluelinky/stop_charging",
"qos": "0",
"datatype": "auto",
"broker": "bb13a99d.68b8f8",
"nl": false,
"rap": false,
"inputs": 0,
"x": 460,
"y": 880,
"wires": [
[
"84a1ae.74912e5",
"33b1bc85.662694",
"ce62ba4f.d86548",
"24d5e0b.3aafc2"
]
]
},
{
"id": "c5ecf76c.e753c8",
"type": "start-car",
"z": "866c75dd.edd9a8",
"name": "Start car",
"bluelinky": "452a3304.58c8fc",
"x": 1100,
"y": 680,
"wires": [
[
"811aa567.e89f98",
"f487d6d6.a4d568"
]
]
},
{
"id": "6eebc52c.ee23dc",
"type": "start-charge",
"z": "866c75dd.edd9a8",
"name": "Start Charging",
"bluelinky": "452a3304.58c8fc",
"x": 1120,
"y": 820,
"wires": [
[
"811aa567.e89f98",
"f487d6d6.a4d568"
]
]
},
{
"id": "84a1ae.74912e5",
"type": "stop-charge",
"z": "866c75dd.edd9a8",
"name": "Stop Charging",
"bluelinky": "452a3304.58c8fc",
"x": 1120,
"y": 880,
"wires": [
[
"811aa567.e89f98",
"f487d6d6.a4d568"
]
]
},
{
"id": "7d3ae860.d8c9a8",
"type": "stop-car",
"z": "866c75dd.edd9a8",
"name": "Stop car",
"bluelinky": "452a3304.58c8fc",
"x": 1100,
"y": 760,
"wires": [
[
"811aa567.e89f98",
"f487d6d6.a4d568"
]
]
},
{
"id": "b27d74de.38c808",
"type": "json",
"z": "866c75dd.edd9a8",
"name": "",
"property": "payload",
"action": "obj",
"pretty": false,
"x": 750,
"y": 680,
"wires": [
[
"c5ecf76c.e753c8",
"33b1bc85.662694"
]
]
},
{
"id": "45a6a8e6.2abfd8",
"type": "mqtt in",
"z": "866c75dd.edd9a8",
"name": "",
"topic": "req/bluelinky/get_odometer",
"qos": "0",
"datatype": "auto",
"broker": "bb13a99d.68b8f8",
"inputs": 0,
"x": 460,
"y": 200,
"wires": [
[
"87abdd88.8ff4d",
"ce62ba4f.d86548",
"3f82a275.5a0b6e",
"24d5e0b.3aafc2"
]
]
},
{
"id": "33b1bc85.662694",
"type": "debug",
"z": "866c75dd.edd9a8",
"name": "",
"active": false,
"tosidebar": true,
"console": false,
"tostatus": false,
"complete": "payload",
"targetType": "msg",
"statusVal": "",
"statusType": "auto",
"x": 930,
"y": 920,
"wires": []
},
{
"id": "ce62ba4f.d86548",
"type": "mqtt out",
"z": "866c75dd.edd9a8",
"name": "",
"topic": "bluelinky/req_received",
"qos": "",
"retain": "",
"broker": "bb13a99d.68b8f8",
"x": 860,
"y": 480,
"wires": []
},
{
"id": "1babee6c.1c2982",
"type": "mqtt in",
"z": "866c75dd.edd9a8",
"name": "",
"topic": "req/bluelinky/get_all",
"qos": "0",
"datatype": "auto",
"broker": "bb13a99d.68b8f8",
"inputs": 0,
"x": 430,
"y": 360,
"wires": [
[
"ce62ba4f.d86548",
"3f82a275.5a0b6e",
"24d5e0b.3aafc2",
"4375fbb9.00fb44"
]
]
},
{
"id": "262df5dc.57916a",
"type": "debug",
"z": "866c75dd.edd9a8",
"name": "",
"active": false,
"tosidebar": true,
"console": false,
"tostatus": false,
"complete": "payload",
"targetType": "msg",
"statusVal": "",
"statusType": "auto",
"x": 1810,
"y": 60,
"wires": []
},
{
"id": "811aa567.e89f98",
"type": "debug",
"z": "866c75dd.edd9a8",
"name": "",
"active": false,
"tosidebar": true,
"console": false,
"tostatus": false,
"complete": "payload",
"targetType": "msg",
"statusVal": "",
"statusType": "auto",
"x": 1410,
"y": 1040,
"wires": []
},
{
"id": "3f82a275.5a0b6e",
"type": "debug",
"z": "866c75dd.edd9a8",
"name": "",
"active": false,
"tosidebar": true,
"console": false,
"tostatus": false,
"complete": "payload",
"targetType": "msg",
"statusVal": "",
"statusType": "auto",
"x": 790,
"y": 80,
"wires": []
},
{
"id": "24d5e0b.3aafc2",
"type": "change",
"z": "866c75dd.edd9a8",
"name": "",
"rules": [
{
"t": "set",
"p": "payload",
"pt": "msg",
"to": "pending",
"tot": "str"
}
],
"action": "",
"property": "",
"from": "",
"to": "",
"reg": false,
"x": 810,
"y": 1140,
"wires": [
[
"4dd1ea4a.52f144",
"fecad185.324f8"
]
]
},
{
"id": "f487d6d6.a4d568",
"type": "change",
"z": "866c75dd.edd9a8",
"name": "",
"rules": [
{
"t": "set",
"p": "payload",
"pt": "msg",
"to": "idle",
"tot": "str"
}
],
"action": "",
"property": "",
"from": "",
"to": "",
"reg": false,
"x": 1810,
"y": 1040,
"wires": [
[
"4dd1ea4a.52f144",
"fecad185.324f8"
]
]
},
{
"id": "4dd1ea4a.52f144",
"type": "mqtt out",
"z": "866c75dd.edd9a8",
"name": "",
"topic": "bluelinky/req_active",
"qos": "",
"retain": "",
"broker": "bb13a99d.68b8f8",
"x": 2140,
"y": 1100,
"wires": []
},
{
"id": "fecad185.324f8",
"type": "debug",
"z": "866c75dd.edd9a8",
"name": "",
"active": false,
"tosidebar": true,
"console": false,
"tostatus": false,
"complete": "false",
"statusVal": "",
"statusType": "auto",
"x": 2110,
"y": 1160,
"wires": []
},
{
"id": "40d2361c.579588",
"type": "function",
"z": "866c75dd.edd9a8",
"name": "odometerWrapper",
"func": "if(msg.payload.hasOwnProperty(\"body\")) {\n msg.payload = {\"error\":true};\n return msg;\n}\nelse {\n msg.payload = { \n \"odometer\": msg.payload,\n \"error\": false\n };\n\n return msg;\n}",
"outputs": 1,
"noerr": 0,
"initialize": "",
"finalize": "",
"x": 1350,
"y": 200,
"wires": [
[
"327104fc.71e1bc",
"262df5dc.57916a",
"f487d6d6.a4d568"
]
]
},
{
"id": "226ed925.607bb6",
"type": "debug",
"z": "866c75dd.edd9a8",
"name": "",
"active": false,
"tosidebar": true,
"console": false,
"tostatus": false,
"complete": "payload",
"targetType": "msg",
"statusVal": "",
"statusType": "auto",
"x": 1130,
"y": 80,
"wires": []
},
{
"id": "4375fbb9.00fb44",
"type": "car-fullstatus",
"z": "866c75dd.edd9a8",
"name": "Get full status",
"dorefresh": true,
"bluelinky": "452a3304.58c8fc",
"x": 840,
"y": 360,
"wires": [
[
"226ed925.607bb6",
"69b6c4df.ea6bcc",
"89681a97.9e24d8",
"92dc3ff4.1d6e3"
]
]
},
{
"id": "69b6c4df.ea6bcc",
"type": "function",
"z": "866c75dd.edd9a8",
"name": "locationFromFullstatus",
"func": "if(msg.payload.hasOwnProperty(\"body\")) {\n msg.payload = {\"error\":true};\n return msg;\n}\nelse {\n\n msg.payload = { \n \"location\": msg.payload.vehicleLocation,\n \"error\": false\n };\n \n return msg;\n}\n",
"outputs": 1,
"noerr": 0,
"initialize": "",
"finalize": "",
"x": 1360,
"y": 360,
"wires": [
[
"85a07155.a0f9f",
"331e5860.907808"
]
]
},
{
"id": "92dc3ff4.1d6e3",
"type": "function",
"z": "866c75dd.edd9a8",
"name": "statusFromFullstatus",
"func": "if(msg.payload.hasOwnProperty(\"body\")) {\n msg.payload = {\"error\":true};\n return msg;\n}\nelse {\n let status = msg.payload.vehicleStatus;\n try{\n status.airTemp.value = 14+(parseInt(status.airTemp.value,16)/2);\n status.evStatus.reservChargeInfos.reservChargeInfo.reservChargeInfoDetail.reservFatcSet.airTemp.value = 14+(parseInt(status.evStatus.reservChargeInfos.reservChargeInfo.reservChargeInfoDetail.reservFatcSet.airTemp.value,16)/2);\n status.evStatus.reservChargeInfos.reserveChargeInfo2.reservChargeInfoDetail.reservFatcSet.airTemp.value = 14+(parseInt(status.evStatus.reservChargeInfos.reserveChargeInfo2.reservChargeInfoDetail.reservFatcSet.airTemp.value,16)/2);\n } catch(e) {}\n\n msg.payload = { \n \"status\": status,\n \"error\": false\n };\n \n return msg;\n}\n",
"outputs": 1,
"noerr": 0,
"initialize": "",
"finalize": "",
"x": 1360,
"y": 480,
"wires": [
[
"3efceea0.c81b12",
"f487d6d6.a4d568",
"331e5860.907808"
]
]
},
{
"id": "89681a97.9e24d8",
"type": "function",
"z": "866c75dd.edd9a8",
"name": "odometerFromFullstatus",
"func": "if(msg.payload.hasOwnProperty(\"body\")) {\n msg.payload = {\"error\":true};\n return msg;\n}\nelse {\n\n msg.payload = { \n \"odometer\": msg.payload.odometer,\n \"error\": false\n };\n \n return msg;\n}\n",
"outputs": 1,
"noerr": 0,
"initialize": "",
"finalize": "",
"x": 1370,
"y": 420,
"wires": [
[
"327104fc.71e1bc",
"331e5860.907808"
]
]
},
{
"id": "331e5860.907808",
"type": "debug",
"z": "866c75dd.edd9a8",
"name": "",
"active": false,
"tosidebar": true,
"console": false,
"tostatus": false,
"complete": "payload",
"targetType": "msg",
"statusVal": "",
"statusType": "auto",
"x": 1810,
"y": 360,
"wires": []
},
{
"id": "aa4d220b.f7e19",
"type": "set-chargetargets",
"z": "866c75dd.edd9a8",
"name": "Set charge targets",
"bluelinky": "452a3304.58c8fc",
"x": 1130,
"y": 960,
"wires": [
[
"811aa567.e89f98",
"f487d6d6.a4d568"
]
]
},
{
"id": "4c03338d.2f15ec",
"type": "login",
"z": "866c75dd.edd9a8",
"name": "Login",
"bluelinky": "452a3304.58c8fc",
"x": 1230,
"y": 1040,
"wires": [
[
"811aa567.e89f98"
]
]
},
{
"id": "28b868f5.16cb48",
"type": "inject",
"z": "866c75dd.edd9a8",
"name": "",
"props": [
{
"p": "payload"
},
{
"p": "topic",
"vt": "str"
}
],
"repeat": "43200",
"crontab": "",
"once": true,
"onceDelay": "12",
"topic": "",
"payloadType": "date",
"x": 1090,
"y": 1040,
"wires": [
[
"4c03338d.2f15ec"
]
]
},
{
"id": "db9ecdb5.a9683",
"type": "mqtt in",
"z": "866c75dd.edd9a8",
"name": "",
"topic": "req/bluelinky/set_chargetargets",
"qos": "0",
"datatype": "auto",
"broker": "bb13a99d.68b8f8",
"inputs": 0,
"x": 470,
"y": 960,
"wires": [
[
"7064a8d53256b646",
"ce62ba4f.d86548",
"24d5e0b.3aafc2"
]
]
},
{
"id": "44155ad70c47b0dd",
"type": "inject",
"z": "866c75dd.edd9a8",
"name": "",
"props": [
{
"p": "payload"
},
{
"p": "topic",
"vt": "str"
}
],
"repeat": "",
"crontab": "",
"once": false,
"onceDelay": 0.1,
"topic": "",
"payload": "",
"payloadType": "date",
"x": 240,
"y": 320,
"wires": [
[
"15dfb508.c6497b"
]
]
},
{
"id": "7064a8d53256b646",
"type": "json",
"z": "866c75dd.edd9a8",
"name": "",
"property": "payload",
"action": "obj",
"pretty": false,
"x": 750,
"y": 960,
"wires": [
[
"33b1bc85.662694",
"aa4d220b.f7e19"
]
]
}
]
Wenn der Flow geladen wurde und die persönlichen Anmeldeinformationen eingetragen wurden kann man das ganze bereits im node-red testen.
Dazu wurde im Flow ganz links ein Timestamp Objekt eingefügt, das dann die Status Abfrage startet.
Hier einfach auf das quadrat klicken, wodurch eine Meldung erscheint, das das ein inject ausgelöst wurde.
Wenn vorher die MQTT2 Verbindung korrekt eingerichtet wurde würde dann schon das Status Ergebnis ins FHEM übertragen werden.
Ansonsten kann man das Debugging an den msg.payload Objekten aktivieren und im debug Log sehen, wie der Ablauf ist.
MQTT2 falls nicht vorhanden
defmod MQTT2_FHEM_Server MQTT2_SERVER 1883 global
attr MQTT2_FHEM_Server DbLogExclude .*
attr MQTT2_FHEM_Server alias MQTT2_FHEM_Server
attr MQTT2_FHEM_Server autocreate simple
attr MQTT2_FHEM_Server disable 0
attr MQTT2_FHEM_Server room MQTT2
attr MQTT2_FHEM_Server verbose 1
MQTT2 Device, hier bitte im userreading noch Eure Geo Position eintragen, um das zu Hause anzuzeigen.
defmod Kia_connect MQTT2_DEVICE
attr Kia_connect DbLogExclude .*
attr Kia_connect DbLogInclude .*
attr Kia_connect IODev MQTT2_FHEM_Server
attr Kia_connect alias Kia_connect
attr Kia_connect autocreate 1
attr Kia_connect devicetopic bluelinky
attr Kia_connect group PV Eigenverbrauch-Steuerung
attr Kia_connect icon car
attr Kia_connect readingList $DEVICETOPIC/status:.* { json2nameValue($EVENT) }\
$DEVICETOPIC/location.* { json2nameValue($EVENT) }\
$DEVICETOPIC/odometer:.* { json2nameValue($EVENT) }\
$DEVICETOPIC/req_received:.* req_received\
$DEVICETOPIC/req_active:.* req_active
attr Kia_connect room MQTT2_DEVICE,Strom->Photovoltaik
attr Kia_connect setList getOdometer req/$DEVICETOPIC/get_odometer get_odometer\
getStatus req/$DEVICETOPIC/get_status get_status\
getLocation req/$DEVICETOPIC/get_location get_location\
getTripinfo req/$DEVICETOPIC/get_tripinfo\
getAll req/$DEVICETOPIC/get_all get_all\
setChargeTargetSoc req/$DEVICETOPIC/set_chargetargets\
startCharge req/$DEVICETOPIC/start_charging start_charging\
stopCharge req/$DEVICETOPIC/stop_charging stop_charging\
stopClimate req/$DEVICETOPIC/stop_climate stop_climate\
startClimate req/$DEVICETOPIC/start_climate
attr Kia_connect sortby 402
attr Kia_connect stateFormat req_active
attr Kia_connect userReadings atHomeStanding:location.* { ((abs(AttrVal("global","latitude",49.85) - ReadingsVal($NAME,"location_coord_lat",0)) <= 0.001) && (abs(AttrVal("global","longitude",8.49) - ReadingsVal($NAME,"location_coord_lon",0)) <= 0.001) && (ReadingsVal($NAME,"location_speed_value",1) == 0)) ? 'true' : 'false';;;; },\
batSOC:status.* { ReadingsVal($NAME,"status_evStatus_batteryStatus",0);;;;},\
connected:status.* { (ReadingsVal($NAME,"status_evStatus_batteryPlugin",0) != 0) ? 'true' : 'false';;;;},\
charging:status.* { ReadingsVal($NAME,"status_evStatus_batteryCharge",'false');;;;},\
targetSOC:status.* { ReadingsVal($NAME,"status_evStatus_reservChargeInfos_targetSOClist_2_targetSOClevel",0);;;;},\
time2targetSOC:status.* { my $t = ReadingsVal($NAME,"status_evStatus_remainTime2_atc_value",1);;;; sprintf("%02d:%02d", $t/60%60, $t%60);;},\
range:status.* { ReadingsVal($NAME,"status_evStatus_drvDistance_1_rangeByFuel_totalAvailableRange_value",0);;;;},\
bat12v:status.* { ReadingsVal($NAME,"status_battery_batSoc",0);;;;}
Das RAW zum DOIF kommt im nächsten Post, da ich mal wieder zuviel geschrieben habe.
VG
Christian
Update: 2022-01-12Zitat von: ch.eick am 03 November 2021, 10:31:30
Das RAW zum DOIF kommt im nächsten Post, da ich mal wieder zuviel geschrieben habe.
Und hier ist es schon
Nun dann noch das DOIF mit dem uiTable für die Status Anzeige und die Steuerung über Pull Down Menüs.
- Status Abfrage
Status jede Stunde zwischen 6 und 23 Uhr (12V min 40%)
Status beim Laden alle 15 Minuten (12V min 40%)
Anzeige des Kilometerzählers
Status des Fahrzeuges zu Hause / unterwegs und beim Laden
Fahrzeug Auf/Zu
- Klimatisierung über das Pull Down Menü
unterschiedliche Temperaturen für Heizen und Kühlen
Aktuelle Temperatur
Heizen/Klima Ein/Aus
Timer für zeitgesteuertes Klimatisieren
Klimatisierung über "Abfall" Kalender
- Komfort
Reifen Überwachung
Türen / Motorhaube / Kofferraum Überwachung
12V Batterie anzeige, wenn der Ladezustand kleiner 40% ist erfolgt keine weitere Status Abfrage
- ACCU Steuerung
Setzen des Ziel SOC beim Standard Laden
Start/Stop Laden
Accu Stand und berechnete Restkilometer
- Für openWB integratin im uiTable
Wählen des Lademodus
Vorrang EV oder Bat
Geschätzte Ladezeit
Status Ladepunkt (Plug und Laden)
Lade Status Phasen und Leistung
Da die Abfrage beim Kia Connect sehr träge ist und teilweise fast 3 Minuten dauert ist eine Verriegelung implementiert.
Nur wenn der Zustand "
idel" ist, können weitere Abfragen gestartet werden. Läuft z.B. die Status Abfrage kann man ein weiteres Kommando anstarten, es wird jedoch erst abgesetzt, wenn das vorherige Kommando fertig ist. Solange bleibt im Pull Down Menü das neue Kommando stehen.
defmod Kia_eNiro_PV DOIF ################################################################################################################\
## 1 Kia Connect Status Abfrage erfolgt mit MQTT2 ==> node-ret ==> Kia Connect\
##\
1_Status_getAll\
{if( !([$SELF:state] eq "off") ## DOIF enabled\
and [Kia_connect:req_active] eq "idle"\
and\
( ([+00:15] and ## alle 15 Minuten\
[Kia_connect:atHomeStanding] eq "true" and ## wenn das Auto zuhause ist\
[Kia_connect:charging] eq "true" or ## und es geladen wird\
[:58] and [05:00-23:00] ## ansonsten nur jede Stunde\
) and [Kia_connect:bat12v] > 40 ## aber die 12V Batterie sollte noch genügend Ladung haben\
or [$SELF:cmd_event] eq "set_cmd_1" ## Das reagiert auf den Aufruf mit "set <Device> cmd_*"\
or [$SELF:ui_command_1] eq "Status_getAll" ## Hier wird das uiTable select ausgewertet\
)\
) {\
if( [$SELF:ui_command_1] eq "Status_getAll" ) { ## Hier wurde manuell eingeschaltet\
set_Reading("ui_command_before_1",[$SELF:ui_command_1]);;\
}\
\
fhem_set("Kia_connect getAll");; ## beliebige Kommandos für diesen Block\
\
set_Reading("ui_command_1","---");; ## Hier wird das uiTable select wieder zurückgesetzt, ansonsten\
## kann das Kommando nicht sofort wiederholt werden\
}\
}\
\
2_Klima\
{if( !([$SELF:state] eq "off") ## DOIF enabled\
and [Kia_connect:req_active] eq "idle"\
and\
( [$SELF:ui_command_2] eq "stopClimate" ## Hier wird das uiTable select ausgewertet\
or [$SELF:ui_command_2] eq "startHeating"\
or [$SELF:ui_command_2] eq "startCooling"\
)\
) {\
set_Reading("ui_command_before_2",[$SELF:ui_command_2]);;\
\
if ([$SELF:ui_command_2] eq "startHeating") {\
my $airTemp_value= [Kia_connect:status_airTemp_value_target_Winter];;\
fhem_set('Kia_connect startClimate {"defrost": true, "windscreenHeating": true, "temperature": '.$airTemp_value.' , "unit": "C"}');;\
if (AttrVal("$SELF","verbose",0) >= 0)\
{Log 3, "$SELF 2_Klima : startHeating"};;\
}\
if ([$SELF:ui_command_2] eq "startCooling") {\
my $airTemp_value = [Kia_connect:status_airTemp_value_target_Summer];;\
fhem_set('Kia_connect startClimate {"defrost": false, "windscreenHeating": false, "temperature": '.$airTemp_value.' , "unit": "C"}');;\
if (AttrVal("$SELF","verbose",0) >= 0)\
{Log 3, "$SELF 2_Klima : startCooling"};;\
}\
if ([$SELF:ui_command_2] eq "stopClimate") {\
fhem_set("Kia_connect ".[$SELF:ui_command_2]);;\
if (AttrVal("$SELF","verbose",0) >= 0)\
{Log 3, "$SELF 2_Klima : stopClimate"};;\
}\
fhem_set("Abfall update");;\
\
set_Reading("ui_command_2","---");; ## Hier wird das uiTable select wieder zurückgesetzt, ansonsten\
## kann das Kommando nicht sofort wiederholt werden\
}\
}\
\
3_Laden\
{if( !([$SELF:state] eq "off") ## DOIF enabled\
and [Kia_connect:req_active] eq "idle"\
and\
( [$SELF:ui_command_3] eq "setChargeTargetSoc" ## Hier wird das uiTable select ausgewertet\
or [$SELF:ui_command_3] eq "startCharge"\
or [$SELF:ui_command_3] eq "stopCharge"\
)\
) {\
set_Reading("ui_command_before_3",[$SELF:ui_command_3]);;\
\
if ([$SELF:ui_command_3] eq "setChargeTargetSoc") {\
my $targetSOClist_1_targetSOClevel = [Kia_connect:status_evStatus_reservChargeInfos_targetSOClist_1_targetSOClevel_target];;\
my $targetSOClist_2_targetSOClevel = [Kia_connect:status_evStatus_reservChargeInfos_targetSOClist_2_targetSOClevel_target];;\
fhem_set("Kia_connect setChargeTargetSoc {\"fast\": ".$targetSOClist_1_targetSOClevel.", \"slow\": ".$targetSOClist_2_targetSOClevel."}");;\
} else {\
fhem_set("Kia_connect ".[$SELF:ui_command_3]);; ## beliebige Kommandos für diesen Block\
}\
\
set_Reading("ui_command_3","---");; ## Hier wird das uiTable select wieder zurückgesetzt, ansonsten\
## kann das Kommando nicht sofort wiederholt werden\
}\
}\
\
4_Klima_timer_heizen\
{if( !([$SELF:state] eq "off") ## DOIF enabled\
and\
(\
( [[Abfall_Abfuhr:Kiaheizen_connect_time]] ## Prüfe den Kalender Eintrag\
and [Abfall_Abfuhr:Kiaheizen_connect_date] eq $ymd ## ist es heute?\
)\
or\
( [$SELF:ui_timer_mode] eq "heizen" ## Timer zum Heizen aktiv?\
and [[$SELF:ui_timer_Start]] ## ist es soweit?\
)\
)\
) {\
\
if (AttrVal("$SELF","verbose",0) >= 0)\
{Log 3, "$SELF 4_Klima_timer : startHeating"};;\
set_Reading("ui_timer_mode","Aus");; ## Schalte die Timer Funktion ab\
set_Reading("ui_command_2","startHeating");; ## Es soll geheizt werden\
fhem_set("$SELF 2_Klima");; ## Aktiviere das Heizen\
\
}\
}\
\
5_Klima_timer_kuehlen\
{if( !([$SELF:state] eq "off") ## DOIF enabled\
and\
(\
( [[Abfall_Abfuhr:Kiakuehlen_connect_time]] ## Prüfe den Kalender Eintrag\
and [Abfall_Abfuhr:Kiakuehlen_connect_date] eq $ymd ## ist es heute?\
)\
or\
( [$SELF:ui_timer_mode] eq "kuehlen" ## Timer zum Kühler aktiv?\
and [[$SELF:ui_timer_Start]] ## ist es soweit?\
)\
)\
) {\
\
if (AttrVal("$SELF","verbose",0) >= 0)\
{Log 3, "$SELF 4_Klima_timer : startCooling"};;\
set_Reading("ui_timer_mode","Aus");; ## Schalte die Timer Funktion ab\
set_Reading("ui_command_2","startCooling");; ## Es soll gekühlt werden\
fhem_set("$SELF 2_Klima");; ## Aktiviere das Kühlen\
\
}\
}\
\
6_Auf_Zu\
{if( !([$SELF:state] eq "off") ## DOIF enabled\
and [Kia_connect:req_active] eq "idle"\
and\
( [$SELF:ui_command_2] eq "car_lock" ## Hier wird das uiTable select ausgewertet\
or [$SELF:ui_command_2] eq "car_unlock"\
)\
) {\
set_Reading("ui_command_before_2",[$SELF:ui_command_2]);;\
\
fhem_set("Kia_connect ".[$SELF:ui_command_2]);;\
if (AttrVal("$SELF","verbose",0) >= 0)\
{Log 3, "$SELF 6_Auf_Zu : ".[$SELF:ui_command_2]};;\
\
set_Reading("ui_command_2","---");; ## Hier wird das uiTable select wieder zurückgesetzt, ansonsten\
## kann das Kommando nicht sofort wiederholt werden\
}\
}\
\
7_WB_1_lp_1\
{if( !([$SELF:state] eq "off") ## DOIF enabled\
and\
( [$SELF:ui_command_4] eq "SofortLaden" ## Hier wird das uiTable select ausgewertet\
or [$SELF:ui_command_4] eq "Min+PV"\
or [$SELF:ui_command_4] eq "NurPV"\
or [$SELF:ui_command_4] eq "Stop"\
or [$SELF:ui_command_4] eq "Standby"\
or [$SELF:ui_command_4] eq "Vorrang_EV"\
or [$SELF:ui_command_4] eq "Vorrang_Bat"\
)\
) {\
set_Reading("ui_command_before_4",[$SELF:ui_command_4]);;\
\
if ([$SELF:ui_command_4] eq "Vorrang_Bat" OR [$SELF:ui_command_4] eq "Vorrang_EV") {\
if ([$SELF:ui_command_4] eq "Vorrang_EV") {\
fhem_set("WB_1 priorityModeEVBattery 1");;\
} else {\
fhem_set("WB_1 priorityModeEVBattery 0");;\
}\
if (AttrVal("$SELF","verbose",0) >= 0)\
{Log 3, "$SELF 7_WB_1_lp_1 : ".[$SELF:ui_command_4]};;\
} else {\
fhem_set("WB_1 Lademodus ".[$SELF:ui_command_4]);;\
if (AttrVal("$SELF","verbose",0) >= 0)\
{Log 3, "$SELF 7_WB_1_lp_1 : Lademodus ".[$SELF:ui_command_4]};;\
}\
\
set_Reading("ui_command_4","---");; ## Hier wird das uiTable select wieder zurückgesetzt, ansonsten\
## kann das Kommando nicht sofort wiederholt werden\
}\
}\
\
8_Speicher_sperren\
{if( !([$SELF:state] eq "off") ## DOIF enabled\
and\
( [$SELF:ui_command_4] eq "Hausspeicher_Sperren" ## Hier wird das uiTable select ausgewertet\
or [WB_1:lp_1_ChargeStat] eq "loading" and\
[WB_1:lp_1_PlugStat] eq "Plugged in"\
)\
) {\
set_Reading("ui_command_before_4",[$SELF:ui_command_4]);;\
\
if([$SELF:WR_1_Speicher_1_ExternControl_smart_laden_before] eq "---") {\
\
if([$SELF:SpeicherExternTrigger] eq "gesperrt" and\
[WR_1_API:Battery_InternControl_MinHomeConsumption] eq "30000" ) {\
set_Reading("WR_1_Speicher_1_ExternControl_smart_laden_before","aktiv");;\
if (AttrVal("$SELF","verbose",0) >= 0)\
{Log 3, "$SELF 8_Speicher_sperren : smart_laden_before aktiv"};;\
} else {\
set_Reading("WR_1_Speicher_1_ExternControl_smart_laden_before","inaktiv");;\
if (AttrVal("$SELF","verbose",0) >= 0)\
{Log 3, "$SELF 8_Speicher_sperren : smart_laden_before inaktiv"};;\
}\
\
fhem_set("WR_1_Speicher_1_ExternControl cmd_2");;\
if (AttrVal("$SELF","verbose",0) >= 0)\
{Log 3, "$SELF 8_Speicher_sperren : smart_Laden startet"};;\
}\
\
set_Reading("ui_command_4","---");; ## Hier wird das uiTable select wieder zurückgesetzt, ansonsten\
## kann das Kommando nicht sofort wiederholt werden\
}\
}\
\
9_WB_1_Zaehler_Statistiken\
{if( !([$SELF:state] eq "off") and ## DOIF enabled\
[00:01]\
) {\
fhem("setreading WB_1 lp_1_kWhCounter_init_Day ".[WB_1:lp_1_kWhCounter]);;\
fhem("setreading WB_1 lp_2_kWhCounter_init_Day ".[WB_1:lp_2_kWhCounter]);;\
\
if ($mday eq 1)\
{\
fhem("setreading WB_1 lp_1_kWhCounter_init_Month ".[WB_1:lp_1_kWhCounter]);;\
fhem("setreading WB_1 lp_2_kWhCounter_init_Month ".[WB_1:lp_2_kWhCounter]);;\
\
if ($yday eq 0)\
{\
fhem("setreading WB_1 lp_1_kWhCounter_init_Year ".[WB_1:lp_1_kWhCounter]);;\
fhem("setreading WB_1 lp_2_kWhCounter_init_Year ".[WB_1:lp_2_kWhCounter]);;\
}\
}\
}\
}
attr Kia_eNiro_PV DbLogExclude .*
attr Kia_eNiro_PV disable 0
attr Kia_eNiro_PV group PV Eigenverbrauch-Steuerung
attr Kia_eNiro_PV icon car
attr Kia_eNiro_PV room Strom->Photovoltaik
attr Kia_eNiro_PV sortby 401
attr Kia_eNiro_PV uiTable {\
package ui_Table;;\
## $TR{0} = "style='color:yellow;;text-align:left;;font-weight:bold;;font-size:18px'";; ## Reihe 0 für Überschrift\
$TABLE = "style='width:100%;;'";;\
\
$TD{0..9}{0} = "align='center' style='font-size:16px;;border-right-style:solid;;border-color:darkgreen;;border-right-width:2px;;width:26%'";;\
\
$TD{0..9}{1} = "style='border-top-style:solid;;border-bottom-style:solid;;border-right-style:solid;;border-color:darkgreen;;border-top-width:2px;;border-bottom-width:2px;;border-right-width:1px;;width:36%;;font-weight:bold;;'";;\
$TD{0..9}{2..4} = "style='border-top-style:solid;;border-bottom-style:solid;;border-right-style:solid;;border-color:darkgreen;;border-top-width:2px;;border-bottom-width:2px;;border-right-width:1px;;width:8%;;text-align:center;;'";;\
$TD{0..9}{5} = "style='border-top-style:solid;;border-bottom-style:solid;;border-right-style:solid;;border-color:darkgreen;;border-top-width:2px;;border-bottom-width:2px;;border-right-width:2px;;width:8%;;text-align:center;;'";;\
\
sub FUNC_batt {\
my($val)=@_;;\
my $ret="position:absolute;;left:".(90*$val/100)."px;;width:90px;;height:20px;;background:linear-gradient( to right,#F8F8E0 ".(90-(90*$val/100))."px,rgba(0,0,0,0) ".(90-(90*$val/100))."px);;";;\
return $ret;;\
}\
sub FUNC_Status {\
my($value, $min, $colorMin, $statusMin, $colorMiddel, $statusMiddle, $max, $colorMax, $statusMax)=@_;;\
my $ret = ($value < $min)? '<span style="color:'.$colorMin.'">'.$statusMin.'</span>' : ($value > $max)? '<span style="color:'.$colorMax.'">'.$statusMax.'</span>' : '<span style="color:'.$colorMiddel.'">'.$statusMiddle.'</span>';;\
return $ret;;\
}\
sub FUNC_Status_Laden {\
my($car)=@_;;\
my $charge = (::ReadingsVal($car,"charging","false") eq "true");;\
my $athome = (::ReadingsVal($car,"atHomeStanding","false") eq "true");;\
my $chargeathome = ($charge && $athome);;\
my $connectedathome = ($athome && ::ReadingsVal($car,"connected","false") eq "true");;\
\
my $ret = ($chargeathome ? "lädt zu Hause" : ($connectedathome ? "angeschlossen zu Hause" : ($athome ? "zu Hause" : ($charge ? "Lädt auswärts" : "unterwegs"))));;\
return $ret;;\
}\
sub FUNC_tire {\
my($car)=@_;;\
my $ret = '<span style="color:green">Reifendruck okay</span>';;\
\
if (::ReadingsVal($car,"status_tirePressureLamp_tirePressureLampAll","1") != 0) {\
my $VL = (::ReadingsVal($car,"status_tirePressureLamp_tirePressureLampFL","1") eq "0")?0:1;;\
my $HL = (::ReadingsVal($car,"status_tirePressureLamp_tirePressureLampRL","1") eq "0")?0:1;;\
my $VR = (::ReadingsVal($car,"status_tirePressureLamp_tirePressureLampFR","1") eq "0")?0:1;;\
my $HR = (::ReadingsVal($car,"status_tirePressureLamp_tirePressureLampRR","1") eq "0")?0:1;;\
$ret = '<span style="color:red">Reifen Störung<br>';;\
if ($VL == 1){$ret.=' /VL'};;\
if ($VR == 1){$ret.=' /VR'};;\
if ($HL == 1){$ret.=' /HL'};;\
if ($HR == 1){$ret.=' /HR'};;\
$ret = $ret.'</span>';;\
}\
return $ret;;\
}\
sub FUNC_door {\
my($car)=@_;;\
my $ret = '<span style="color:green">Türen okay<br></span>';;\
\
if (::ReadingsVal($car,"status_doorLock","false") ne "true") {\
my $VL = (::ReadingsVal($car,"status_doorOpen_frontLeft",1) == 0)?0:1;;\
my $HL = (::ReadingsVal($car,"status_doorOpen_backLeft",1) == 0)?0:1;;\
my $VR = (::ReadingsVal($car,"status_doorOpen_frontRight",1) == 0)?0:1;;\
my $HR = (::ReadingsVal($car,"status_doorOpen_backRight",1) == 0)?0:1;;\
$ret = '<span style="color:red">Tür offen<br>';;\
if ($VL == 1){$ret.=' /VL'};;\
if ($VR == 1){$ret.=' /VR'};;\
if ($HL == 1){$ret.=' /HL'};;\
if ($HR == 1){$ret.=' /HR'};;\
$ret = $ret.'</span>';;\
}\
if (::ReadingsVal($car,"status_trunkOpen","true") eq "true") {\
$ret.='<span style="color:red"> Kofferraum offen</span>';;\
}\
if (::ReadingsVal($car,"status_hoodOpen","true") eq "true") {\
$ret.='<span style="color:red"> Motorhaube offen</span>';;\
}\
return $ret;;\
}\
}\
\
"$SELF"|"Kommando ".::ReadingsTimestamp("Kia_connect","status_time","")."<dd>Auswahl / Kommunikation / Tacho / Info Status</dd>" | widget([$SELF:ui_command_1],"uzsuDropDown,---,Status_getAll,car_lock,car_unlock")|(([Kia_connect:req_active] eq "idle")?'<span style="color:green">idle</span>' : '<span style="color:red">'.[Kia_connect:req_active].'</span>') |::round([Kia_connect:odometer_value],0)." km"|FUNC_Status_Laden("Kia_connect")\
\
|"Accu<dd>Steuerung / Target Soc / Accu Status</dd>" |widget([$SELF:ui_command_3],"uzsuDropDown,---,setChargeTargetSoc,stopCharge,startCharge")|"Target SOC".widget([Kia_connect:status_evStatus_reservChargeInfos_targetSOClist_2_targetSOClevel_target],"selectnumbers,50,10,100,0,lin")." %"|""| FUNC_Status([Kia_connect:range],150,"red",[Kia_connect:range],"orange",[Kia_connect:range],250,"green",[Kia_connect:range])." km"."<div style='border-width:2px;;border-style:solid;;border-color:gray;;position:relative;;width:90px;;height:20px;;background:linear-gradient( to right, red 0px,yellow 30px,green 50px);;'>".STY(" ",FUNC_batt([Kia_connect:batSOC])).STY(::round([Kia_connect:batSOC],0)."%","font-size:16px;;position:absolute;;top:2px;;left:30px")."</div>"\
\
|"Komfort<dd>Timer / Klima / Reifen / Türen / Accu Status 12V</dd>" |widget([$SELF:ui_timer_mode],"uzsuDropDown,Aus,heizen,kuehlen").widget([$SELF:ui_timer_Start],"time")|\
((::ReadingsVal("Abfall_Abfuhr","Kiaheizen_days",0) != 0)?"Klimatisierung<br>".[Abfall_Abfuhr:Kiaheizen_connect_date]." ".[Abfall_Abfuhr:Kiaheizen_connect_time]:(([$SELF:ui_timer_mode] ne "Aus")?"Klimatisierung<br>".[$SELF:timer_04_c04]:""))|FUNC_tire("Kia_connect")."<br>".FUNC_door("Kia_connect")|\
"12 V<div style='border-width:2px;;border-style:solid;;border-color:gray;;position:relative;;width:90px;;height:20px;;background:linear-gradient( to right, red 0px,yellow 30px,green 50px);;'>".STY(" ",FUNC_batt([Kia_connect:bat12v])).STY(::round([Kia_connect:bat12v],0)."%","font-size:16px;;position:absolute;;top:2px;;left:30px")."</div>"\
\
|"<dd> Auswahl / Temperatur / Klima Status / Temperatur innen</dd>"| widget([$SELF:ui_command_2],"uzsuDropDown,---,stopClimate,startHeating,startCooling")|\
"Heat".widget([Kia_connect:status_airTemp_value_target_Winter],"selectnumbers,20,1,27,0,lin")."°C<br>Cool".widget([Kia_connect:status_airTemp_value_target_Sommer],"selectnumbers,16,1,25,0,lin")."°C"|(([Kia_connect:status_airCtrlOn] eq "true")?'<span style="color:red">Klima läuft</span>':'<span style="color:green">Klima aus</span>')."<br>".(([Kia_connect:status_defrost] eq "true")?'Defrost ein':'Defrost aus') |"Aktuell<br>".[Kia_connect:status_airTemp_value]."°C"\
\
|"WallBox (WB_1_lp1)<dd>Lademodus / Info Status / Ladezeit / Leistung</dd>"|[WB_1:ChargeMode]."<br>".widget([$SELF:ui_command_4],"uzsuDropDown,---,SofortLaden,Min+PV,NurPV,Stop,Standby,Vorrang_EV,Vorrang_Bat,Hausspeicher_Sperren")|[WB_1:lp_1_PlugStat]." ".[WB_1:lp_1_ChargeStat]|[WB_1:lp_1_TimeRemaining]|[WB_1:lp_1_countPhasesInUse]."P ".[WB_1:lp_1_AConfigured]."A<br>".[WB_1:lp_1_W]." W"
setstate Kia_eNiro_PV 2022-01-12 13:24:24 ui_command_1 ---
setstate Kia_eNiro_PV 2022-01-10 09:18:53 ui_command_2 ---
setstate Kia_eNiro_PV 2021-11-09 07:56:54 ui_command_3 ---
setstate Kia_eNiro_PV 2022-01-12 13:02:41 ui_command_4 ---
setstate Kia_eNiro_PV 2022-01-12 13:02:41 ui_command_before_4 ---
setstate Kia_eNiro_PV 2021-11-29 09:56:58 ui_timer_Start 10:30
setstate Kia_eNiro_PV 2021-12-02 07:00:00 ui_timer_mode Aus
VG
Christian
Hallo zusammen,
für die Zeitsteuerung zum Klimatisieren ist mir der Gedanke gekommen es mit dem "Abfall Kalender" umzusetzen.
Dort kann man ja die Leerungen pro Tonne vorwählen und bekommt diese dann schön sequentiell angezeigt.
Wenn man nun im Kalender einen Eintrag "Kia heizen" einträgt - das Datum und die Zeit sind ja impliziet - wird im "Abfall" Device eine Gruppe von readings erzeugt.
Hier die wichtigsten:
Kiaheizen_date 05.11.2021 09:15
Kiaheizen_days 1
Kiaheizen_weekday Freitag
Mein Gedanke wäre nun einfach den Schlüssel text z.B. "Kia heizen" variabel im DOIF uiTable definierbar zu machen und dann aus dem Kalender Device das Datum und die Uhrzeit als Trigger zu nutzen.
Im DOIF Device würde dann der nächte Termin für die Klimatisierung angezeigt werden und wenn dieser vorrüber ist kommt halt der nächste.
Die komplette Pflege wäre dann am Händy im Google Kalender mit allen Merkmalen, wie z.B. Wiederholungen mit unterschiedlichen Zyklen. Man kann dann natürlich auch einzelne Einträger wieder löschen oder verschieben. Wenn man das natürlich kurzfristig machen möchte wäre natürlich ein schnellerer Abfrage Rythmus erforderlich, oder z.B. vor dem Eintreffen des nächsten Termins eine Abfrage zur Überprüfung.
Zur Vermeidung von fehl Klimatisierungen könnte man im Kalender einen Alarm für 1 Stunde vorher setzen und vor dem Eintreffen des Zeitpunktes nochmals den Kalender überprüfen.
Dies wäre auch eine sehr gute Kopplung mit einem Arbeitskalender.
Wie das angezeigt werden könnte wäre im Screenshot zu sehen und ein Deaktivieren sollte natürlich auch möglich sein.
Es ließen sich natürlich jegliche anderen Funktionen mit zusätzlichen Schlüsselworten einrichten.
Über Anregungen würde ich mich sehr freuen.
Christian
Ich habe mal versucht die DEFS in einen neuem FHEM und NodeRed aufzusetzen.
Bei NodeRed fehlten die eckigen Klammern.
Das müsste eigentlich so lauten:
[
{
"id": "866c75dd.edd9a8",
"type": "tab",
"label": "Kia Connect",
"disabled": false,
"info": ""
},
{
"id": "bb13a99d.68b8f8",
"type": "mqtt-broker",
"name": "mqtt_Server",
"broker": "<IP des mqtt-broker>",
"port": "1883",
"clientid": "",
"autoConnect": true,
"usetls": false,
"compatmode": false,
"protocolVersion": "4",
"keepalive": "60",
"cleansession": true,
"birthTopic": "",
"birthQos": "0",
"birthPayload": "",
"birthMsg": {},
"closeTopic": "",
"closeQos": "0",
"closePayload": "",
"closeMsg": {},
"willTopic": "",
"willQos": "0",
"willPayload": "",
"willMsg": {},
"sessionExpiry": ""
},
{
"id": "452a3304.58c8fc",
"type": "bluelinky",
"username": "<KiaUser>",
"password": "<KiaUserPasswort>",
"region": "EU",
"pin": "<EurePin>",
"vin": "<EureVIN>",
"brand": "[kia|hyundai>"
},
{
"id": "91a345fa.5757a8",
"type": "mqtt in",
"z": "866c75dd.edd9a8",
"name": "",
"topic": "req/bluelinky/get_status",
"qos": "0",
"datatype": "auto",
"broker": "bb13a99d.68b8f8",
"inputs": 0,
"x": 440,
"y": 280,
"wires": [
[
"15dfb508.c6497b",
"ce62ba4f.d86548",
"3f82a275.5a0b6e",
"24d5e0b.3aafc2"
]
]
},
{
"id": "5ad085b9.05739c",
"type": "mqtt in",
"z": "866c75dd.edd9a8",
"name": "",
"topic": "req/bluelinky/start_climate",
"qos": "0",
"datatype": "auto",
"broker": "bb13a99d.68b8f8",
"inputs": 0,
"x": 450,
"y": 680,
"wires": [
[
"b27d74de.38c808",
"33b1bc85.662694",
"ce62ba4f.d86548",
"24d5e0b.3aafc2"
]
]
},
{
"id": "15dfb508.c6497b",
"type": "car-status",
"z": "866c75dd.edd9a8",
"name": "Get status",
"dorefresh": true,
"parsed": false,
"bluelinky": "452a3304.58c8fc",
"x": 830,
"y": 280,
"wires": [
[
"cccc9476.d56dd8",
"226ed925.607bb6"
]
]
},
{
"id": "87abdd88.8ff4d",
"type": "car-odometer",
"z": "866c75dd.edd9a8",
"name": "Get car odometer",
"bluelinky": "452a3304.58c8fc",
"x": 850,
"y": 200,
"wires": [
[
"40d2361c.579588",
"226ed925.607bb6"
]
]
},
{
"id": "31100f9a.40008",
"type": "function",
"z": "866c75dd.edd9a8",
"name": "locationWrapper",
"func": "if(msg.payload.hasOwnProperty(\"body\")) {\n msg.payload = {\"error\":true};\n return msg;\n}\nelse {\n\n msg.payload = { \n \"location\": msg.payload,\n \"error\": false\n };\n \n return msg;\n}",
"outputs": 1,
"noerr": 0,
"initialize": "",
"finalize": "",
"x": 1350,
"y": 120,
"wires": [
[
"85a07155.a0f9f",
"262df5dc.57916a",
"f487d6d6.a4d568"
]
]
},
{
"id": "bea1d927.0f3908",
"type": "car-location",
"z": "866c75dd.edd9a8",
"name": "Get car location",
"bluelinky": "452a3304.58c8fc",
"x": 840,
"y": 120,
"wires": [
[
"31100f9a.40008",
"226ed925.607bb6"
]
]
},
{
"id": "3c949d67.0d83b2",
"type": "mqtt in",
"z": "866c75dd.edd9a8",
"name": "",
"topic": "req/bluelinky/get_location",
"qos": "0",
"datatype": "auto",
"broker": "bb13a99d.68b8f8",
"nl": false,
"rap": false,
"inputs": 0,
"x": 450,
"y": 120,
"wires": [
[
"bea1d927.0f3908",
"ce62ba4f.d86548",
"3f82a275.5a0b6e",
"24d5e0b.3aafc2"
]
]
},
{
"id": "cccc9476.d56dd8",
"type": "function",
"z": "866c75dd.edd9a8",
"name": "analyseStatus",
"func": "if(msg.payload.hasOwnProperty(\"body\")) {\n msg.payload = {\"error\":true};\n return msg;\n}\nelse {\n let status = msg.payload;\n status.airTemp.value = 14+(parseInt(status.airTemp.value,16)/2);\n try{\n status.evStatus.reservChargeInfos.reservChargeInfo.reservChargeInfoDetail.reservFatcSet.airTemp.value = 14+(parseInt(status.evStatus.reservChargeInfos.reservChargeInfo.reservChargeInfoDetail.reservFatcSet.airTemp.value,16)/2);\n status.evStatus.reservChargeInfos.reserveChargeInfo2.reservChargeInfoDetail.reservFatcSet.airTemp.value = 14+(parseInt(status.evStatus.reservChargeInfos.reserveChargeInfo2.reservChargeInfoDetail.reservFatcSet.airTemp.value,16)/2);\n } catch(e) {}\n\n let time = status.evStatus.remainTime2.atc.value/60;\n let result = { \n \"batSOC\": status.evStatus.batteryStatus,\n \"connected\": (status.evStatus.batteryPlugin !== 0),\n \"charging\": status.evStatus.batteryCharge,\n \"targetSOC\": status.evStatus.reservChargeInfos.targetSOClist[1].targetSOClevel,\n \"time2targetSOC\": (Math.floor(time) + \":\" + (\"0\" + Math.floor((time % 1)*60)).slice(-2)), // h:mm\n \"range\": status.evStatus.drvDistance[0].rangeByFuel.totalAvailableRange.value,\n \"bat12v\": status.battery.batSoc\n };\n \n //msg.payload = result;\n msg.payload = {\n \"status\": status,\n \"error\": false\n \n };\n return msg;\n}",
"outputs": 1,
"noerr": 0,
"initialize": "",
"finalize": "",
"x": 1340,
"y": 280,
"wires": [
[
"3efceea0.c81b12",
"262df5dc.57916a",
"f487d6d6.a4d568"
]
]
},
{
"id": "85a07155.a0f9f",
"type": "mqtt out",
"z": "866c75dd.edd9a8",
"name": "",
"topic": "bluelinky/location",
"qos": "",
"retain": "",
"broker": "bb13a99d.68b8f8",
"x": 1870,
"y": 120,
"wires": []
},
{
"id": "3efceea0.c81b12",
"type": "mqtt out",
"z": "866c75dd.edd9a8",
"name": "",
"topic": "bluelinky/status",
"qos": "",
"retain": "",
"broker": "bb13a99d.68b8f8",
"x": 1860,
"y": 280,
"wires": []
},
{
"id": "327104fc.71e1bc",
"type": "mqtt out",
"z": "866c75dd.edd9a8",
"name": "",
"topic": "bluelinky/odometer",
"qos": "",
"retain": "",
"broker": "bb13a99d.68b8f8",
"x": 1870,
"y": 200,
"wires": []
},
{
"id": "844a32f4.2e029",
"type": "mqtt in",
"z": "866c75dd.edd9a8",
"name": "",
"topic": "req/bluelinky/stop_climate",
"qos": "0",
"datatype": "auto",
"broker": "bb13a99d.68b8f8",
"inputs": 0,
"x": 450,
"y": 760,
"wires": [
[
"7d3ae860.d8c9a8",
"33b1bc85.662694",
"ce62ba4f.d86548",
"24d5e0b.3aafc2"
]
]
},
{
"id": "57d91e50.7e96",
"type": "mqtt in",
"z": "866c75dd.edd9a8",
"name": "",
"topic": "req/bluelinky/start_charging",
"qos": "0",
"datatype": "auto",
"broker": "bb13a99d.68b8f8",
"inputs": 0,
"x": 460,
"y": 820,
"wires": [
[
"6eebc52c.ee23dc",
"33b1bc85.662694",
"ce62ba4f.d86548",
"24d5e0b.3aafc2"
]
]
},
{
"id": "6029f0a0.b73e",
"type": "mqtt in",
"z": "866c75dd.edd9a8",
"name": "",
"topic": "req/bluelinky/stop_charging",
"qos": "0",
"datatype": "auto",
"broker": "bb13a99d.68b8f8",
"nl": false,
"rap": false,
"inputs": 0,
"x": 460,
"y": 880,
"wires": [
[
"84a1ae.74912e5",
"33b1bc85.662694",
"ce62ba4f.d86548",
"24d5e0b.3aafc2"
]
]
},
{
"id": "c5ecf76c.e753c8",
"type": "start-car",
"z": "866c75dd.edd9a8",
"name": "Start car",
"bluelinky": "452a3304.58c8fc",
"x": 1100,
"y": 680,
"wires": [
[
"811aa567.e89f98",
"f487d6d6.a4d568"
]
]
},
{
"id": "6eebc52c.ee23dc",
"type": "start-charge",
"z": "866c75dd.edd9a8",
"name": "Start Charging",
"bluelinky": "452a3304.58c8fc",
"x": 1120,
"y": 820,
"wires": [
[
"811aa567.e89f98",
"f487d6d6.a4d568"
]
]
},
{
"id": "84a1ae.74912e5",
"type": "stop-charge",
"z": "866c75dd.edd9a8",
"name": "Stop Charging",
"bluelinky": "452a3304.58c8fc",
"x": 1120,
"y": 880,
"wires": [
[
"811aa567.e89f98",
"f487d6d6.a4d568"
]
]
},
{
"id": "7d3ae860.d8c9a8",
"type": "stop-car",
"z": "866c75dd.edd9a8",
"name": "Stop car",
"bluelinky": "452a3304.58c8fc",
"x": 1100,
"y": 760,
"wires": [
[
"811aa567.e89f98",
"f487d6d6.a4d568"
]
]
},
{
"id": "b27d74de.38c808",
"type": "json",
"z": "866c75dd.edd9a8",
"name": "",
"property": "payload",
"action": "obj",
"pretty": false,
"x": 750,
"y": 680,
"wires": [
[
"c5ecf76c.e753c8",
"33b1bc85.662694"
]
]
},
{
"id": "45a6a8e6.2abfd8",
"type": "mqtt in",
"z": "866c75dd.edd9a8",
"name": "",
"topic": "req/bluelinky/get_odometer",
"qos": "0",
"datatype": "auto",
"broker": "bb13a99d.68b8f8",
"inputs": 0,
"x": 460,
"y": 200,
"wires": [
[
"87abdd88.8ff4d",
"ce62ba4f.d86548",
"3f82a275.5a0b6e",
"24d5e0b.3aafc2"
]
]
},
{
"id": "33b1bc85.662694",
"type": "debug",
"z": "866c75dd.edd9a8",
"name": "",
"active": false,
"tosidebar": true,
"console": false,
"tostatus": false,
"complete": "payload",
"targetType": "msg",
"statusVal": "",
"statusType": "auto",
"x": 930,
"y": 920,
"wires": []
},
{
"id": "ce62ba4f.d86548",
"type": "mqtt out",
"z": "866c75dd.edd9a8",
"name": "",
"topic": "bluelinky/req_received",
"qos": "",
"retain": "",
"broker": "bb13a99d.68b8f8",
"x": 860,
"y": 480,
"wires": []
},
{
"id": "1babee6c.1c2982",
"type": "mqtt in",
"z": "866c75dd.edd9a8",
"name": "",
"topic": "req/bluelinky/get_all",
"qos": "0",
"datatype": "auto",
"broker": "bb13a99d.68b8f8",
"inputs": 0,
"x": 430,
"y": 360,
"wires": [
[
"ce62ba4f.d86548",
"3f82a275.5a0b6e",
"24d5e0b.3aafc2",
"4375fbb9.00fb44"
]
]
},
{
"id": "262df5dc.57916a",
"type": "debug",
"z": "866c75dd.edd9a8",
"name": "",
"active": false,
"tosidebar": true,
"console": false,
"tostatus": false,
"complete": "payload",
"targetType": "msg",
"statusVal": "",
"statusType": "auto",
"x": 1810,
"y": 60,
"wires": []
},
{
"id": "811aa567.e89f98",
"type": "debug",
"z": "866c75dd.edd9a8",
"name": "",
"active": false,
"tosidebar": true,
"console": false,
"tostatus": false,
"complete": "payload",
"targetType": "msg",
"statusVal": "",
"statusType": "auto",
"x": 1410,
"y": 1040,
"wires": []
},
{
"id": "3f82a275.5a0b6e",
"type": "debug",
"z": "866c75dd.edd9a8",
"name": "",
"active": false,
"tosidebar": true,
"console": false,
"tostatus": false,
"complete": "payload",
"targetType": "msg",
"statusVal": "",
"statusType": "auto",
"x": 790,
"y": 80,
"wires": []
},
{
"id": "24d5e0b.3aafc2",
"type": "change",
"z": "866c75dd.edd9a8",
"name": "",
"rules": [
{
"t": "set",
"p": "payload",
"pt": "msg",
"to": "pending",
"tot": "str"
}
],
"action": "",
"property": "",
"from": "",
"to": "",
"reg": false,
"x": 810,
"y": 1140,
"wires": [
[
"4dd1ea4a.52f144",
"fecad185.324f8"
]
]
},
{
"id": "f487d6d6.a4d568",
"type": "change",
"z": "866c75dd.edd9a8",
"name": "",
"rules": [
{
"t": "set",
"p": "payload",
"pt": "msg",
"to": "idle",
"tot": "str"
}
],
"action": "",
"property": "",
"from": "",
"to": "",
"reg": false,
"x": 1810,
"y": 1040,
"wires": [
[
"4dd1ea4a.52f144",
"fecad185.324f8"
]
]
},
{
"id": "4dd1ea4a.52f144",
"type": "mqtt out",
"z": "866c75dd.edd9a8",
"name": "",
"topic": "bluelinky/req_active",
"qos": "",
"retain": "",
"broker": "bb13a99d.68b8f8",
"x": 2140,
"y": 1100,
"wires": []
},
{
"id": "fecad185.324f8",
"type": "debug",
"z": "866c75dd.edd9a8",
"name": "",
"active": false,
"tosidebar": true,
"console": false,
"tostatus": false,
"complete": "false",
"statusVal": "",
"statusType": "auto",
"x": 2110,
"y": 1160,
"wires": []
},
{
"id": "40d2361c.579588",
"type": "function",
"z": "866c75dd.edd9a8",
"name": "odometerWrapper",
"func": "if(msg.payload.hasOwnProperty(\"body\")) {\n msg.payload = {\"error\":true};\n return msg;\n}\nelse {\n msg.payload = { \n \"odometer\": msg.payload,\n \"error\": false\n };\n\n return msg;\n}",
"outputs": 1,
"noerr": 0,
"initialize": "",
"finalize": "",
"x": 1350,
"y": 200,
"wires": [
[
"327104fc.71e1bc",
"262df5dc.57916a",
"f487d6d6.a4d568"
]
]
},
{
"id": "226ed925.607bb6",
"type": "debug",
"z": "866c75dd.edd9a8",
"name": "",
"active": false,
"tosidebar": true,
"console": false,
"tostatus": false,
"complete": "payload",
"targetType": "msg",
"statusVal": "",
"statusType": "auto",
"x": 1130,
"y": 80,
"wires": []
},
{
"id": "4375fbb9.00fb44",
"type": "car-fullstatus",
"z": "866c75dd.edd9a8",
"name": "Get full status",
"dorefresh": true,
"bluelinky": "452a3304.58c8fc",
"x": 840,
"y": 360,
"wires": [
[
"226ed925.607bb6",
"69b6c4df.ea6bcc",
"89681a97.9e24d8",
"92dc3ff4.1d6e3"
]
]
},
{
"id": "69b6c4df.ea6bcc",
"type": "function",
"z": "866c75dd.edd9a8",
"name": "locationFromFullstatus",
"func": "if(msg.payload.hasOwnProperty(\"body\")) {\n msg.payload = {\"error\":true};\n return msg;\n}\nelse {\n\n msg.payload = { \n \"location\": msg.payload.vehicleLocation,\n \"error\": false\n };\n \n return msg;\n}\n",
"outputs": 1,
"noerr": 0,
"initialize": "",
"finalize": "",
"x": 1360,
"y": 360,
"wires": [
[
"85a07155.a0f9f",
"331e5860.907808"
]
]
},
{
"id": "92dc3ff4.1d6e3",
"type": "function",
"z": "866c75dd.edd9a8",
"name": "statusFromFullstatus",
"func": "if(msg.payload.hasOwnProperty(\"body\")) {\n msg.payload = {\"error\":true};\n return msg;\n}\nelse {\n let status = msg.payload.vehicleStatus;\n try{\n status.airTemp.value = 14+(parseInt(status.airTemp.value,16)/2);\n status.evStatus.reservChargeInfos.reservChargeInfo.reservChargeInfoDetail.reservFatcSet.airTemp.value = 14+(parseInt(status.evStatus.reservChargeInfos.reservChargeInfo.reservChargeInfoDetail.reservFatcSet.airTemp.value,16)/2);\n status.evStatus.reservChargeInfos.reserveChargeInfo2.reservChargeInfoDetail.reservFatcSet.airTemp.value = 14+(parseInt(status.evStatus.reservChargeInfos.reserveChargeInfo2.reservChargeInfoDetail.reservFatcSet.airTemp.value,16)/2);\n } catch(e) {}\n\n msg.payload = { \n \"status\": status,\n \"error\": false\n };\n \n return msg;\n}\n",
"outputs": 1,
"noerr": 0,
"initialize": "",
"finalize": "",
"x": 1360,
"y": 480,
"wires": [
[
"3efceea0.c81b12",
"f487d6d6.a4d568",
"331e5860.907808"
]
]
},
{
"id": "89681a97.9e24d8",
"type": "function",
"z": "866c75dd.edd9a8",
"name": "odometerFromFullstatus",
"func": "if(msg.payload.hasOwnProperty(\"body\")) {\n msg.payload = {\"error\":true};\n return msg;\n}\nelse {\n\n msg.payload = { \n \"odometer\": msg.payload.odometer,\n \"error\": false\n };\n \n return msg;\n}\n",
"outputs": 1,
"noerr": 0,
"initialize": "",
"finalize": "",
"x": 1370,
"y": 420,
"wires": [
[
"327104fc.71e1bc",
"331e5860.907808"
]
]
},
{
"id": "331e5860.907808",
"type": "debug",
"z": "866c75dd.edd9a8",
"name": "",
"active": false,
"tosidebar": true,
"console": false,
"tostatus": false,
"complete": "payload",
"targetType": "msg",
"statusVal": "",
"statusType": "auto",
"x": 1810,
"y": 360,
"wires": []
},
{
"id": "aa4d220b.f7e19",
"type": "set-chargetargets",
"z": "866c75dd.edd9a8",
"name": "Set charge targets",
"bluelinky": "452a3304.58c8fc",
"x": 1130,
"y": 960,
"wires": [
[
"811aa567.e89f98",
"f487d6d6.a4d568"
]
]
},
{
"id": "4c03338d.2f15ec",
"type": "login",
"z": "866c75dd.edd9a8",
"name": "Login",
"bluelinky": "452a3304.58c8fc",
"x": 1230,
"y": 1040,
"wires": [
[
"811aa567.e89f98"
]
]
},
{
"id": "28b868f5.16cb48",
"type": "inject",
"z": "866c75dd.edd9a8",
"name": "",
"props": [
{
"p": "payload"
},
{
"p": "topic",
"vt": "str"
}
],
"repeat": "43200",
"crontab": "",
"once": true,
"onceDelay": "12",
"topic": "",
"payloadType": "date",
"x": 1090,
"y": 1040,
"wires": [
[
"4c03338d.2f15ec"
]
]
},
{
"id": "db9ecdb5.a9683",
"type": "mqtt in",
"z": "866c75dd.edd9a8",
"name": "",
"topic": "req/bluelinky/set_chargetargets",
"qos": "0",
"datatype": "auto",
"broker": "bb13a99d.68b8f8",
"inputs": 0,
"x": 470,
"y": 960,
"wires": [
[
"7064a8d53256b646",
"ce62ba4f.d86548",
"24d5e0b.3aafc2"
]
]
},
{
"id": "44155ad70c47b0dd",
"type": "inject",
"z": "866c75dd.edd9a8",
"name": "",
"props": [
{
"p": "payload"
},
{
"p": "topic",
"vt": "str"
}
],
"repeat": "",
"crontab": "",
"once": false,
"onceDelay": 0.1,
"topic": "",
"payload": "",
"payloadType": "date",
"x": 240,
"y": 320,
"wires": [
[
"15dfb508.c6497b"
]
]
},
{
"id": "7064a8d53256b646",
"type": "json",
"z": "866c75dd.edd9a8",
"name": "",
"property": "payload",
"action": "obj",
"pretty": false,
"x": 750,
"y": 960,
"wires": [
[
"33b1bc85.662694",
"aa4d220b.f7e19"
]
]
}
]
Ja so passt es jetzt. Hast du eine Idee wegen der uiTable?
Zitat von: xerion am 05 November 2021, 12:25:28
Ja so passt es jetzt. Hast du eine Idee wegen der uiTable?
Was ist mit der uiTable?
Zitat von: ch.eick am 05 November 2021, 12:48:57
Was ist mit der uiTable?
Oh sehe gerade das der Kommentar wohl beim Bearbeiten gelöscht wurde. Ich Ann die uiTable nicjt sehen muss aber dabei sagen daß ich das noch nie genutzt habe vielleicht auch Anfängerfehler.
Zitat von: xerion am 05 November 2021, 12:53:49
Oh sehe gerade das der Kommentar wohl beim Bearbeiten gelöscht wurde. Ich Ann die uiTable nicht sehen muss aber dabei sagen, dass ich das noch nie genutzt habe vielleicht auch Anfängerfehler.
Das uiTable ist im Kia_eNiro_PV DOIF als Attribut gesetzt.
Zitat von: ch.eick am 05 November 2021, 13:03:49
Das uiTable ist im Kia_eNiro_PV DOIF als Attribut gesetzt.
Nein das ist nicht gesetzt, das wird anscheinend beim RAW Input nicht mit übernommen.
EDIT: Über "Raw Definition" ging es aber nicht über "RAW FHEM-code" input. Komisch
Zitat von: xerion am 05 November 2021, 13:24:08
Nein das ist nicht gesetzt, das wird anscheinend beim RAW Input nicht mit übernommen.
EDIT: Über "Raw Definition" ging es aber nicht über "RAW FHEM-code" input. Komisch
Das ist mir gestern auch schon aufgefallen, da ich etwas geändert hatte und es einfach nicht aktiv wurde ???
EDIT: Ich bin schon beim Testen für die Klimatisierung über den Google Kalender...
Hallo zusammen,
ich habe da mal eine Frage, habt Ihr schon den Wert für den tatsächlichen Verbrauch auf 100 km irgendwo auslesen können?
Jetzt im Winter liegt der ja höher als im Wommer und ich möchte den tatsächlichen Verbrauch, der im Wagen angezeigt wird als Berechnungsgrundlage der openWB mitteilen.
VG
Christian
Ich habe hier nochmal einen Ausblick für die Zeitsteuerung.
Mit der Zeitangabe in der Komfort Zeile und der Auswahl im Pull Down darüber kann man den Termin Auschalten/Heizen/Kühlen.
Ist die Zeit größer als die aktuelle Zeit findet es noch am gleichen tag statt, ist die Zeit Kleiner, so wird der Timer für den nächsten Tag eingetragen.
Im Feld daneben wird dann das Klimatisieren mit Datum und Zeit angezeigt.
Darüber hinaus kann man auch einen Termin pro Tag im Kalender eintragen.
Das ist momentan eine Besonderheit des "Abfall" Kalenders, da jede Tonne nur einmal am Tag abgeholt wird :-) :-)
Eventuell könnte man das auch über eine andere Kalenderimplementierung einbinden, jedoch denke ich wird man nicht mehrfach am Tag diese Funktionalität verwenden.
Als nächstes arbeite ich bereits daran beim SofortLaden (openWB) das Entladen des Hausspeichers zu sperren.
Das ist sicher eine ziemlich spezielle Angelegenheit, da ja jeder einen anderen WR, Speicher oder eine anderer WB hat.
VG
Christian
Hallo zusammen,
eigentlich sollte das "stop car" die Klimatisierung beenden, jedoch bleibt dabei wohl das "defrost" aktiv.
Ist das so normal, oder eventuell ein Fehler im Bluelinky?
Beim Start wird ja dieses JSON übergeben, beim Stop habe ich das jedoch nicht gefunden.
{"defrost": true, "windscreenHeating": true, "temperature": 23 , "unit": "C"}
Nun wäre ein Gedanke vor dem Stop nochmals ein Start mit jeweils "false" zu senden und anschließend dann das Stop.
Aufgefallen ist es mir bei meinen Tests, da beim Status natürlich das defrost noch auf true steht.
Steigt man jedoch ins Auto ein ist es wirklich noch aktiv, wird jedoch dann von der Klimaautomatik anschließend runter geregelt.
VG
Christian
Hallo zusammen,
kennt jemand die Struktur für das "set - navigation" ?
Wie muss da das json aussehen? im github von bluelinky habe ich da nichts gefunden.
"Tripinfo" und "monthly report" klappt auch, da weiß ich nur nicht wie ich das json aus dem node-red zum FHEM schicken kann.
VG
Christian
EDIT: Das ist echt merkwürdig. Ich glaube die Berechnung funktioniert nur für positive Temperatur Werte :-) Laut Wikipedia ist die Umrechnungsformel auch eine ganz andere.
status_airTemp_value 22
Moin, und noch eine Frage :-)
Die Umwandlung der AirTemp bringt immer als Wert 15, was nicht so ganz stimmen kann :-)
Im node-red wird eine 02H ausgelesen und dann irgend wie mit dieser Berechnung in Grad Celsius umgerechnet.
Nach dem was ich meine zu verstehen wird das airTemp Register mit Hexadecimal 02 gelesen und dann in Integer gewandelt und durch 2 geteilt. Das Ergebnis dann + 14
Somit wäre das
(0000 0000 0000 0010) H = 2 dez
2/2 = 1
14 +1 = 15
status.airTemp.value = 14+(parseInt(status.airTemp.value,16)/2);
status.evStatus.reservChargeInfos.reservChargeInfo.reservChargeInfoDetail.reservFatcSet.airTemp.value = 14+(parseInt(status.evStatus.reservChargeInfos.reservChargeInfo.reservChargeInfoDetail.reservFatcSet.airTemp.value,16)/2);
status.evStatus.reservChargeInfos.reserveChargeInfo2.reservChargeInfoDetail.reservFatcSet.airTemp.value = 14+(parseInt(status.evStatus.reservChargeInfos.reserveChargeInfo2.reservChargeInfoDetail.reservFatcSet.airTemp.value,16)/2);
Also entweder wird das falsche Register gelesen, oder die Berechnung stimmt nicht.
Kann mir da jemand weiter helfen?
Ich würde gerne die Standheizung nur ab einer bestimmten Temperatur im Auto starten lassen.
VG
Christian
Hey zusammen
ich habe mal hier openWB mit Kia connect (https://wiki.fhem.de/wiki/OpenWB#Komplexe_Anbindung) ein Anwendungsbeispiel abgelegt.
VG
Christian
Hallo zusammen,
ich habe leider immer noch das Problem, dass die
status_airTemp_value 15
leider falsch angezeigt wird. Das scheint etwas im node-red Flow nicht richtig berechnet zu werden.
Wenn das Auto aufgeheizt ist, dann werden auch mal 21° angezeigt, ansonsten jedoch immer 15°, was jetzt im Winter eher unwarscheinlich ist.
Könnte mir da jend eventuell helfen?
VG
Christian
Hallo zusammen,
ich habe gerade mal ein Update gemacht.
Kia Connect und openWB (https://forum.fhem.de/index.php/topic,116175.msg1184265.html#msg1184265)
und hier das DOIF (https://forum.fhem.de/index.php/topic,116175.msg1184267.html#msg1184267)
Und nochmal ich :-)
Es besteht nach wie vor die nach meiner Meining fehlerhafte Temperaturanzeige
Das ist aus dem node-red Flow aus der Funktion analyseStatus()
else {
let status = msg.payload;
status.airTemp.value = 14+(parseInt(status.airTemp.value,16)/2);
try{
status.evStatus.reservChargeInfos.reservChargeInfo.reservChargeInfoDetail.reservFatcSet.airTemp.value = 14+(parseInt(status.evStatus.reservChargeInfos.reservChargeInfo.reservChargeInfoDetail.reservFatcSet.airTemp.value,16)/2);
status.evStatus.reservChargeInfos.reserveChargeInfo2.reservChargeInfoDetail.reservFatcSet.airTemp.value = 14+(parseInt(status.evStatus.reservChargeInfos.reserveChargeInfo2.reservChargeInfoDetail.reservFatcSet.airTemp.value,16)/2);
} catch(e) {}
Das WEB sagt zu Farenheit zu Celsius
Zitat
(32 °F − 32) × 5/9 = 0 °C
Aber die Formel kann ich da nicht erkennen. Könnte mir da jemand weiter helfen?
VG Christian
Hallo zusammen,
seit gestern Nacht kann sich bei mir bluelinky nicht mehr anmelden.
Register request has failed with Error=PHONE_REGISTRATION_ERROR
Retry... 1
Register request has failed with Error=PHONE_REGISTRATION_ERROR
Retry... 2
Da hatte Hyundai wohl schon mal ein Aussperren von nicht gewünschten Apps vor einem Jahr gemacht.
Habt Ihr das auch bereits bemerkt? Oder liege ich da falsch?
Eine Abfrage vom Handy funktioniert problemlos.
Gruß
Christian
Zitat von: ch.eick am 07 Februar 2022, 10:55:02
Hallo zusammen,
seit gestern Nacht kann sich bei mir bluelinky nicht mehr anmelden.
Da bist du nicht der Einzige. ;-/
Scheint ein generelles Problem mit dem Bluelink-Server oder dem Bluelinky-Zugang zu sein. Die Entwickler sind dran.
wird es da ene officielle lösüng für geben?
gruss Chrisitan
Zitat von: boxana am 07 Februar 2022, 18:17:37
wird es da ene officielle lösüng für geben?
Beim letzten mal hatten sie eine Lösung gefunden :-) Also nach dem Fix das bluelinky aktualisieren...
Hi!
Zitat von: mnl1234 am 07 Februar 2022, 11:58:11
Die Entwickler sind dran.
Gibt's da eine Issue im Github oder kann man irgendwo anders sehen, was passiert?
/Edit:
Huch, gerade geht es wieder. Hatte die PIN hin und zurück geändert aber vermutlich hat das nichts mit der Lösung zu tun. Wie schaut es bei Euch aus?
Patrick
Zitat von: PatrickR am 07 Februar 2022, 21:43:34
Hi!
Gibt's da eine Issue im Github oder kann man irgendwo anders sehen, was passiert?
/Edit:
Huch, gerade geht es wieder. Hatte die PIN hin und zurück geändert aber vermutlich hat das nichts mit der Lösung zu tun. Wie schaut es bei Euch aus?
Patrick
Was hast du wie gemacht?
Bei mir geht es weiterhin nicht.
Zitat von: ch.eick am 12 Januar 2022, 13:47:04
Und nochmal ich :-)
Es besteht nach wie vor die nach meiner Meining fehlerhafte Temperaturanzeige
Das ist aus dem node-red Flow aus der Funktion analyseStatus()
else {
let status = msg.payload;
status.airTemp.value = 14+(parseInt(status.airTemp.value,16)/2);
try{
status.evStatus.reservChargeInfos.reservChargeInfo.reservChargeInfoDetail.reservFatcSet.airTemp.value = 14+(parseInt(status.evStatus.reservChargeInfos.reservChargeInfo.reservChargeInfoDetail.reservFatcSet.airTemp.value,16)/2);
status.evStatus.reservChargeInfos.reserveChargeInfo2.reservChargeInfoDetail.reservFatcSet.airTemp.value = 14+(parseInt(status.evStatus.reservChargeInfos.reserveChargeInfo2.reservChargeInfoDetail.reservFatcSet.airTemp.value,16)/2);
} catch(e) {}
Das WEB sagt zu Farenheit zu Celsius
Aber die Formel kann ich da nicht erkennen. Könnte mir da jemand weiter helfen?
VG Christian
Da hat noch keiner geantwortet.
Das ist keine Umrechnung von Fahrenheit auf Celsius sondern hat was mit der Hyundai/Kia internen Repräsentzation des Werts zu tun.
Das ist ein Hex-Wert in 0,5°C-Schritten und einem Offset von 14.
Also wenn 02H kommt, also 0x02, sind das dezimal 2, also 15°C.
Der Wert 03H ist dann 15,5°C usw.
Zitat von: boxana am 08 Februar 2022, 09:10:35
Was hast du wie gemacht?
Bei mir geht es weiterhin nicht.
Bei mir nur sporadisch. Es scheint so zu sein, dass Bluelink was umgestellt hat und jetzt alle 15 Minuten neue Client-IDs generiert werden müssen. Das ist seit gestern Abend gefixt, aber NPN hats noch nicht angezogen.
Wäre dann Bluelinky Version 7.6.3
Zitat von: boxana am 08 Februar 2022, 09:10:35
Was hast du wie gemacht?
Bei mir geht es weiterhin nicht.
Bei mir auch noch nicht
Zitat von: ch.eick am 08 Februar 2022, 11:41:53
Bei mir auch noch nicht
Okay, der Patch scheint zu funktionieren.
Ich betreibe bluelinky in einem node-red Container und habe im Container folgendes gemacht.
npm uninstall node-red-contrib-bluelinky
npm install node-red-contrib-bluelinky
Dann einen Neustart des Containers
Ich denke das war die harte Tour und man könnte es sicher auch anders machen.
Falls jemand meine Implementierung in FHEM verwendet und dort der Zustand des Kia_connect Devices auf "pending" steht, kann man im Device einfach ein set getStatus auslösen.
Das stößt eine neue Abfrage an und setzt das req_active wieder auf den richtigen wert.
VG
Christian
Zitat von: mnl1234 am 08 Februar 2022, 10:03:38
Bei mir nur sporadisch.
Stimmt leider. Funktionierte die ersten Male gut aber nach 20 Minuten war der Spuk dann wieder vorbei.
Hi!
Zitat von: ch.eick am 08 Februar 2022, 16:17:20
Ich betreibe bluelinky in einem node-red Container und habe im Container folgendes gemacht.
npm uninstall node-red-contrib-bluelinky
npm install node-red-contrib-bluelinky
Dann einen Neustart des Containers
Ich denke das war die harte Tour und man könnte es sicher auch anders machen.
Da ich ungefähr 0 Erfahrung mit npm habe: Spricht irgendwas gegen
npm install bluelinky
Das hat bei mir bluelinky auf 7.6.4 hochgezogen.
Patrick
Hallo,
nach meinem installieren der aktuellsten Version läuft es wieder stabiel.
Zitat von: PatrickR am 08 Februar 2022, 21:46:36
Da ich ungefähr 0 Erfahrung mit npm habe: Spricht irgendwas gegen
npm install bluelinky
Das hat bei mir bluelinky auf 7.6.4 hochgezogen.
Okay, dann brauche ich ja beim nächsten mal auch nur das npm install zu machen.
Da es bei mir im node-red läuft hat das Paket einen anderen Namen.
Gruß
Christian
Hi!
Nach dem Update auf 7.6.4 bekomme ich nach einiger Zeit leider wieder Fehler, dann später wieder - ohne weitere Änderungen - Werte:
ManagedBluelinkyError: @EuropeVehicle.fullStatus: [401] Unauthorized on [GET] https://prd.eu-ccapi.hyundai.com:8080/api/v2/spa/vehicles/XXX/latest - {"retCode":"F","resCode":"4017","resMsg":"Invalid request value - Invalid Application Id. - YYY","msgId":"ZZZ"}
Offenbar wurde in 7.6.3 das Stamp-Generation-Intervall auf 15 Minuten gesetzt, in 7.6.4 dann auf 4 Stunden.
/Edit:
So wie es aussieht, scheint npm install bluelinky@2.6.3 zwar die entsprechende Version zu installieren, node-red-contrib-bluelinky aber weiterhin die "aktuelle" Version zu verwenden:
+-- node-red-contrib-bluelinky@0.0.27
| `-- bluelinky@7.6.4
Gibt es da einen eleganten Trick, wie ich temporär und testweise die 7.6.3 verwenden kann?
/Edit 2:
Ok, erledigt. Repo gecloned, package.json editiert und Paket installiert. Mal sehen, ob es nun länger läuft...
Patrick
Zitat von: PatrickR am 09 Februar 2022, 12:22:11
Hi!
Nach dem Update auf 7.6.4 bekomme ich nach einiger Zeit leider wieder Fehler, dann später wieder - ohne weitere Änderungen - Werte:
Offenbar wurde in 7.6.3 das Stamp-Generation-Intervall auf 15 Minuten gesetzt, in 7.6.4 dann auf 4 Stunden.
/Edit:
So wie es aussieht, scheint npm install bluelinky@2.6.3 zwar die entsprechende Version zu installieren, node-red-contrib-bluelinky aber weiterhin die "aktuelle" Version zu verwenden:
+-- node-red-contrib-bluelinky@0.0.27
| `-- bluelinky@7.6.4
Gibt es da einen eleganten Trick, wie ich temporär und testweise die 7.6.3 verwenden kann?
/Edit 2:
Ok, erledigt. Repo gecloned, package.json editiert und Paket installiert. Mal sehen, ob es nun länger läuft...
Hallo,
wie kann ich denn die Version abfragen?
Bei mir wird ja wohl die latest gezogen.
VG
Christian
Hi!
Zitat von: ch.eick am 09 Februar 2022, 15:13:08
wie kann ich denn die Version abfragen?
npm ls
Ggf. vorher noch in das richtige Verzeichnis gehen, bei einem Docker-Container z. B. in /data
Patrick
Zitat von: PatrickR am 09 Februar 2022, 15:27:17
Hi!
npm ls
Ggf. vorher noch in das richtige Verzeichnis gehen, bei einem Docker-Container z. B. in /data
Patrick
Okay, Danke
-- node-red-contrib-bluelinky@0.0.27
`-- bluelinky@7.6.3
Damit läuft es noch immer stabiel.
Hi!
Zitat von: ch.eick am 09 Februar 2022, 17:04:39
-- node-red-contrib-bluelinky@0.0.27
`-- bluelinky@7.6.3
Damit läuft es noch immer stabiel.
Bei mir sieht es mit der 7.6.3 auch bislang gut aus. Mit der 7.6.4 gab es nach einiger Zeit Fehlermeldungen. Werde das beobachten.
Patrick
Hallo,
ich versuche mich auch seit letzter Woche an dem Thema, erstmal nur in node-red mit Inject und Debug und ohne
das Drumherum. Ich kann auch schon kommunizieren und Dinge wie Location, Status abfragen.
Ich würde nun gerne noch Fahrten wegschreiben und dafür gibt es ja den Node get-tripinfo.
Hier erhalte ich aber mit einfachem Timestamp-Inject die Meldung ""TypeError: Cannot read property 'toString' of undefined".
Ich vermute mal, das liegt daran, dass man einen Tag/Monat (und eventuell einen weiteren Parameter für die Form des Reports)
mitgeben muss, siehe auch
https://github.com/Hacksore/bluelinky/issues/126
Ich habe auch schonmal in dem Inject herumgespielt mit Topic/Payload aber irgendwie klappt
das noch nicht. Kann mir eventuell jemand sagen, wie das korrekte Format auszusehen hat,
eventuell auch direkt im Inject-Node? Ich habe auch mal in den anderen Codeschnipseln
geschaut (FHEM, EVCC und es gab ja auch schon ein Besipiel in einem Flow im Wiki mit JSON, funktioniert das?) aber irgendwie keinen Wert
gefunden, der da möglicherweise übergeben wird.
Vielen Dank!
Zitat von: tomahawk2015 am 22 Mai 2022, 07:35:58
Hallo,
ich versuche mich auch seit letzter Woche an dem Thema, erstmal nur in node-red mit Inject und Debug und ohne
das Drumherum. Ich kann auch schon kommunizieren und Dinge wie Location, Status abfragen.
Ich würde nun gerne noch Fahrten wegschreiben und dafür gibt es ja den Node get-tripinfo.
Hier erhalte ich aber mit einfachem Timestamp-Inject die Meldung ""TypeError: Cannot read property 'toString' of undefined".
Ich vermute mal, das liegt daran, dass man einen Tag/Monat (und eventuell einen weiteren Parameter für die Form des Reports)
mitgeben muss, siehe auch
Moin,
das würde mich auch interessieren, könntest Du mir Deine Definitionen mal hier anhängen, dann schaue ich mir das auch mal an.
Die Grunddeffinitionen funktionieren für den Kia eNiro ja bereits.
Ich habe noch ein zusätzliches Problem mit der Temperatur, da scheint die Umrechnung zwischen Farenheit und Celsius nicht richtig zu sein. Das hatte ich glaube ich auch schon mal hier geschrieben :-(
Gruß Christian
Hallo,
ich hängs mal als Screenshot an. Laut dem vorher verlinkten Github Issue bin ich mal von folgenden Übergabeparametern ausgegangen:
setTripMonth:202205 (Topic:Payload, jewils als String)
tripPeriodType:0 (Topic:Payload, String bzw. Number)
Alternativ kann man anscheinend setzen
setTripDay:20220521 (Topic:Payload, jewils als String)
tripPeriodType:1 (Topic:Payload, String bzw. Number)
und erhält dann eine Tagesauswertung.
Wobei man ja eigentlich alles in einem Inject übergeben müsste aber das habe ich nicht hinbekommen, in einem Inject Day und PeriodType gleichzeitig zu übergeben,
wie gesagt stecke da bei Node-red im Anfangsstadium. Die Fehlermeldung ist immer dieselbe wie in meinem ersten Post.
Später würde ich natürlich alles auch per FHEM machen wollen, vielleicht es auf dem Wege sogar einfacher per MQTT, keine Ahnung.
Leider ist die Doku ja sehr spärlich, eventuell kriegt man es zusammen hin :-)
VG Thorsten
Zitat von: tomahawk2015 am 22 Mai 2022, 10:37:15
Hallo,
ich hängs mal als Screenshot an. Laut dem vorher verlinkten Github Issue bin ich mal von folgenden Übergabeparametern ausgegangen:
setTripMonth:202205 (Topic:Payload, jewils als String)
tripPeriodType:0 (Topic:Payload, String bzw. Number)
Alternativ kann man anscheinend setzen
setTripDay:20220521 (Topic:Payload, jewils als String)
tripPeriodType:1 (Topic:Payload, String bzw. Number)
und erhält dann eine Tagesauswertung.
Wobei man ja eigentlich alles in einem Inject übergeben müsste aber das habe ich nicht hinbekommen, in einem Inject Day und PeriodType gleichzeitig zu übergeben,
wie gesagt stecke da bei Node-red im Anfangsstadium. Die Fehlermeldung ist immer dieselbe wie in meinem ersten Post.
Später würde ich natürlich alles auch per FHEM machen wollen, vielleicht es auf dem Wege sogar einfacher per MQTT, keine Ahnung.
Leider ist die Doku ja sehr spärlich, eventuell kriegt man es zusammen hin :-)
VG Thorsten
Hallo Torsten,
in meinem Node-RED ist bereits etwas drin, was ich aber noch nicht verwendet habe. Siehe Bild 1.
Dort habe ich einfach mal auf das Inject geklickt, was im Debug dann zu sehen ist.
Der Pfad mit dem JSON scheint über FHEM wahlweise durchlaufen zu werden. aber da müsste man im FHEM das JSON noch eingeben. Ein reines set ohne payload führt zu der zweiten Meldung im Debug.
VG
Christian
Hallo Thorsten,
ich habe jetzt mal etwas experimentiert und den node-RED Flow noch verändert. Beim JSON Objekt war anscheinend die Konvertierung bei mir falsch. Die habe ich jetzt auf JavaScript-Object gesetzt. Dann ist noch das MQTT am Ende dazu gekommen und ich bekomme nun die ersten readings.
set Kia_connect getTripinfo {"year": 2022, "month": 5, "day": 21}
2022-05-22 17:25:00 1_tripsCount 6
2022-05-22 17:25:00 1_trips_1_distance 3
2022-05-22 17:25:00 1_trips_1_durations_drive 7
2022-05-22 17:25:00 1_trips_1_durations_idle 1
2022-05-22 17:25:00 1_trips_1_end 2022-05-21T05:46:39.000Z
2022-05-22 17:25:00 1_trips_1_speed_avg 38
2022-05-22 17:25:00 1_trips_1_speed_max 83
2022-05-22 17:25:00 1_trips_1_start 2022-05-21T05:39:39.000Z
2022-05-22 17:25:00 1_trips_1_timeRaw 073939
2022-05-22 17:25:00 1_trips_2_distance 3
2022-05-22 17:25:00 1_trips_2_durations_drive 6
2022-05-22 17:25:00 1_trips_2_durations_idle 1
2022-05-22 17:25:00 1_trips_2_end 2022-05-21T04:48:19.000Z
2022-05-22 17:25:00 1_trips_2_speed_avg 41
2022-05-22 17:25:00 1_trips_2_speed_max 91
2022-05-22 17:25:00 1_trips_2_start 2022-05-21T04:42:19.000Z
2022-05-22 17:25:00 1_trips_2_timeRaw 064219
2022-05-22 17:25:00 1_trips_3_distance 0
2022-05-22 17:25:00 1_trips_3_durations_drive 1
2022-05-22 17:25:00 1_trips_3_durations_idle 1
2022-05-22 17:25:00 1_trips_3_end 2022-05-21T04:23:33.000Z
2022-05-22 17:25:00 1_trips_3_speed_avg 0
2022-05-22 17:25:00 1_trips_3_speed_max 0
2022-05-22 17:25:00 1_trips_3_start 2022-05-21T04:22:33.000Z
2022-05-22 17:25:00 1_trips_3_timeRaw 062233
2022-05-22 17:25:00 1_trips_4_distance 0
2022-05-22 17:25:00 1_trips_4_durations_drive 3
2022-05-22 17:25:00 1_trips_4_durations_idle 0
2022-05-22 17:25:00 1_trips_4_end 2022-05-21T04:22:45.000Z
2022-05-22 17:25:00 1_trips_4_speed_avg 23
2022-05-22 17:25:00 1_trips_4_speed_max 49
2022-05-22 17:25:00 1_trips_4_start 2022-05-21T04:19:45.000Z
2022-05-22 17:25:00 1_trips_4_timeRaw 061945
2022-05-22 17:25:00 1_trips_5_distance 0
2022-05-22 17:25:00 1_trips_5_durations_drive 2
2022-05-22 17:25:00 1_trips_5_durations_idle 0
2022-05-22 17:25:00 1_trips_5_end 2022-05-21T04:07:47.000Z
2022-05-22 17:25:00 1_trips_5_speed_avg 24
2022-05-22 17:25:00 1_trips_5_speed_max 43
2022-05-22 17:25:00 1_trips_5_start 2022-05-21T04:05:47.000Z
2022-05-22 17:25:00 1_trips_5_timeRaw 060547
2022-05-22 17:25:00 1_trips_6_distance 0
2022-05-22 17:25:00 1_trips_6_durations_drive 0
2022-05-22 17:25:00 1_trips_6_durations_idle 0
2022-05-22 17:25:00 1_trips_6_end 2022-05-21T04:04:57.000Z
2022-05-22 17:25:00 1_trips_6_speed_avg 2
2022-05-22 17:25:00 1_trips_6_speed_max 7
2022-05-22 17:25:00 1_trips_6_start 2022-05-21T04:04:57.000Z
2022-05-22 17:25:00 1_trips_6_timeRaw 060457
Für mehr habe ich jetzt gerade keine Zeit ;-)
Hallo Christian,
vielen Dank für Deinen Input, das ist ja eigentlich schon die fertige Lösung. Ich habe alles soweit nachvollziehen können inklusive der Einbindung in FHEM. Eine Frage interessehalbe hätte ich aber noch,
an welcher Stelle hast Du die zu übergebenden Parameter (Year,Month,Day) dokumentiert gefunden? Ich meine, sie sind natürlich nachvollziehbar aber den einzigen Hinweis auf das Übergabeformat
hatte ich in besagtem Github Issue gefunden und da war ja von einem Format YYYYMMDD die Rede...diese Funktionalität gettripinfo find ich nach wie vor nirgendwo dokumentiert? Kann man das
irgendwie aus dem Node get-tripinfo extrahieren, mit welchen Parametern die arbeitet?
VG
Thorsten
Zitat von: tomahawk2015 am 24 Mai 2022, 11:25:45
Hallo Christian,
vielen Dank für Deinen Input, das ist ja eigentlich schon die fertige Lösung. Ich habe alles soweit nachvollziehen können inklusive der Einbindung in FHEM. Eine Frage interessehalbe hätte ich aber noch,
an welcher Stelle hast Du die zu übergebenden Parameter (Year,Month,Day) dokumentiert gefunden? Ich meine, sie sind natürlich nachvollziehbar aber den einzigen Hinweis auf das Übergabeformat
hatte ich in besagtem Github Issue gefunden und da war ja von einem Format YYYYMMDD die Rede...diese Funktionalität gettripinfo find ich nach wie vor nirgendwo dokumentiert? Kann man das
irgendwie aus dem Node get-tripinfo extrahieren, mit welchen Parametern die arbeitet?
Hallo Torsten,
den ganzen Flow hatte ich hier irgendwo auch schon mal gepostet, es war aber noch ein Fehler drin, da ich das ja auch nur übernommen hatte und die Trip geschichte dort nur begonnen war.
Wenn Du auf das Objekt Tripinfo klickst, wird es recht im Node-RED angezeigt. Dort auf Hilfe-zeigen, was dann etwas das JSON erläutert.
Das mqtt-out hatte ich noch hinzugefügt und im FHEM das redingList erweitert. Die readings werden jedoch noch nicht schön gruppiert, das schaue ich mir nach dem Urlaub mal an, oder es hilft noch jemand anderes, da ich mgtt und Node-RED auch nur experimentell bearbeiten kann :-) Der Output von Kia muss ja auch noch vernünftig interpretiert werden, damit man damit etwas anfangen kann.
Und wie gesagt, die Temperaturanzeige scheint auch noch falsch berechnet zu werden.
So wie ich das gezählt habe sind wir bereits 6-7 Kia Nutzer in FHEM, somit wird sich sicherlich noch etwas bewegen.
VG
Christian
Hallo zusammen,
habt Ihr in den letzten tagen auch mal wieder Probleme bei der Kia Abfrage?
VG Christian
Zitat von: ch.eick am 20 Februar 2023, 12:45:44
Hallo zusammen,
habt Ihr in den letzten tagen auch mal wieder Probleme bei der Kia Abfrage?
VG Christian
Aktuell habe ich auch Probleme, aber nicht nur mit Bluelinky sondern auch direkt in der Kia Connect App.
Zitat von: xerion am 20 Februar 2023, 13:19:29
Aktuell habe ich auch Probleme, aber nicht nur mit Bluelinky sondern auch direkt in der Kia Connect App.
Okay, dann brauchen wir ja nicht bei uns zu suchen. Ich hab bei Kia ein Ticket über die App aufgemacht ;-)
EDIT: 15:00 Uhr Ich glaube die basteln da wieder rum :-( , mal geht es, mal kommt nix.
Aber egal, die 32 kWh Überschuss sind im Auto :-)
Hallo,
aktuell erhalte ich beim Login über Bluelinky (Hyundai) folgende Fehlermeldung:
"@EuropeController.login: sign in with EuropeanBrandAuthStrategy failed with error Error: @EuropeanBrandAuthStrategy.login: Cannot find the argument userId in https://prd.eu-ccapi.hyundai.com:8080/web/v1/user/integration/auth?&locale=en.
Please use the following url and connect from a browser, it may probably ask you to "Change your password" or "Accept the new conditions"
Once done, try again".
Dann kommt eine lange url mit einem Login, wenn ich da die Daten eingebe, kommt eine leere Seite.
Ich habe mich ehrlich gesagt auch noch nie per Browser eingeloggt, immer nur per Hyundai App, was auch noch normal funktioniert. Bisher nirgendwo
ein Hinweis auf aktuelle Bedingungen.
Habe die aktuellste bluelinky Version in Benutzung (0.0.30). Das ganze seit dem 1. April...
Hat das Problem noch jemand bzw. funktioniert der Login mit Hyundai Bluelink Daten generell noch?
Danke + VG
Hallo tomahawk2015,
Du bist nicht allein.
https://forum.fhem.de/index.php?topic=118822.msg1271135#msg1271135 (https://forum.fhem.de/index.php?topic=118822.msg1271135#msg1271135)
Gruß Reinhard
Moin,
ich habe ja hier schon das Bluelinky mit openWB in einem Device gekoppelt dargestellt.
Dazu habe ich hier mal wieder was geschrieben. (https://forum.fhem.de/index.php?msg=1274051)
VG Christian
Hallo zusammen,
nach einer Störung zwischen Kia und dem Dienstleister Vodafone (für Kia) lief zuerst meine App auf dem Handy in einen Netzwerk Fehler.
Bluelinky ging dann natürlich auch nicht mehr.
In der App auf dem Handy läuft es jetzt wieder, jedoch kann sich Bluelinky immer noch nicht verbinden.
Hat da noch jemand eine Idee, eventuell wo man in dem Node-Red Flow etwas sehen kann?
VG Christian
Es gibt aktuell wieder Probleme bei der Anmeldung. Hyundai/Kia haben das wohl wieder angepasst. App Id wurde wohl geändert wird aktuell in vielen Foren diskutiert. Es gibt aber schon Issues im Github Projekt von Bluelinky. Wir müssen einfach (mal wieder) warten.
Zitat von: xerion am 30 Juni 2023, 21:40:34Es gibt aktuell wieder Probleme bei der Anmeldung. Hyundai/Kia haben das wohl wieder angepasst. App Id wurde wohl geändert wird aktuell in vielen Foren diskutiert. Es gibt aber schon Issues im Github Projekt von Bluelinky. Wir müssen einfach (mal wieder) warten.
Sorry, das hatte ich im github noch nicht gefunden.
Warten gehört nicht immer zu meiner Kernkompetenz ;D
Hallo,
seit ihr schon wieder einen Schritt weiter mit der KIA Abfrage?
Klappt die Abfrage mittlerweile wieder? Bei mir kommt seit 28.06.2023 um 23:00 Uhr nichts mehr.
Ein aktuelles Update (Linux und Bluelinky) habe ich gemacht, frage ich unter der Linux Console node kia.js kommt aktuell keine Rückantwort und auch kein Fehler.
Irgendwie finde ich dieses Mal keine Lösung damit die Abfrage wieder funktioniert.
Mein Linux Wissen und mein Englisch ist auch nicht so gut, dass ich dies alleine schaffen würde.
Gruß Reinhard
Zitat von: Rewe2000 am 06 Juli 2023, 10:18:29Seit ihr schon wieder einen Schritt weiter mit der KIA Abfrage?
Klappt die Abfrage mittlerweile wieder? Bei mir kommt seit 28.06.2023 um 23:00 Uhr nichts mehr.
Ein aktuelles Update (Linux und Bluelinky) habe ich gemacht, frage ich unter der Linux Console node kia.js kommt aktuell keine Rückantwort und auch kein Fehler.
Irgendwie finde ich dieses Mal keine Lösung damit die Abfrage wieder funktioniert.
Hallo Reinhard,
im Node-red wird bereits daran gearbeitet und für Hyundai scheint es da schon etwas zu geben. Es ist jedoch noch keine neue Version bereit gestellt worden. Das Issue ist noch offen.
Hallo zusammen,
um für Kia die Verbindung wieder herzustellen muss man dieser Anleitung folgen (https://github.com/SondreNjaastad/node-red-contrib-bluelinky#what-to-do-when-bluelinky-is-updated). Danach hat es bei mir wieder funktioniert, jedoch ist die Palett Version von node-red-contrib-bluelinky 0.0.30 die selbe wie vorher. Es wird wohl nur im Hintergrund beim Löschen und wieder neu Installieren ein andes Paket aktualisiert, wo die Korrektur drin ist.
VG Christian
Hallo Christian,
irgendwie bekomme ich keine Daten vom Server, so wie es für mich aussieht sollte der Login mit meinen Benutzerdaten klappen.
Gebe ich direkt auf der Linux Kommandozeile den Abfrageaufruf:
reinhard@Fhem-Bullseye-SSD:~/bluelinky $ cd /home/reinhard/bluelinky
reinhard@Fhem-Bullseye-SSD:~/bluelinky $ node kia.js
reinhard@Fhem-Bullseye-SSD:~/bluelinky $
ein, so kommt überhaupt keine Rückmeldung. Nur die App am Android Handy stellt sich von Deutsch wieder auf Englisch zurück.
Schreibe ich den Usernamen in den Anmeldedaten falsch, so wird ein Fehler angezeigt, das sollte ja auch erwartet werden.
Ich verwende bei Bluelinky die aktuelle Version 8.1.1 und für node und npm folgende Versionen:
reinhard@Fhem-Bullseye-SSD:~/bluelinky $ node -v
v19.9.0
reinhard@Fhem-Bullseye-SSD:~/bluelinky $ npm -v
9.6.3
Linux Bullsey selbst ist aktuell.
Meine kia.js Datei sieht wie folgt aus:
const BlueLinky = require('bluelinky');
const MQTT = require("async-mqtt");
const client = new BlueLinky({
username: 'Benutzername',
password: 'Passwort',
brand: 'kia',
region: 'EU',
pin: 'Geheim'
});
client.on('ready', async () => {
const vehicle = client.getVehicle('Fahrgestellnummer');
try {
const odo = await vehicle.odometer();
console.log(odo);
const status = await vehicle.status({ parsed: false, refresh: true });
console.log(status);
const location = await vehicle.location();
console.log(location);
const mqttClient = await MQTT.connectAsync("mqtt://127.0.0.1:1883", { username:"Benutzer-Raspi", password:"Passwort-Raspi" })
console.log("Sending to MQTT server");
if ((status.evStatus.batteryStatus > 0) && (odo.value > 0)) { // wird gelegentlich falsch mit 0 ausgelesen, dann nicht senden
try {
var options={
retain:true,
qos:1};
await mqttClient.publish(
"BluelinkCarStatus/Fahrgestellnummer",
JSON.stringify({
odo: odo.value,
soc: status.evStatus.batteryStatus,
range: status.evStatus.drvDistance[0].rangeByFuel.evModeRange.value,
locked: status.doorLock,
battery12V: status.battery.batSoc,
longitude: location.longitude,
latitude: location.latitude,
}),options
);
// This line doesn't run until the server responds to the publish
await mqttClient.end();
// This line doesn't run until the client has disconnected without error
console.log("mqtt call Done");
} catch (e){
// Do something about it!
console.log(e.stack);
process.exit();
}
} // if
} catch (err) {
// log the error from the command invocation
}
});
client.on('error', async (err) => {
// something went wrong with login
});
Ich habe diese schon mit der Datei in der Doku verglichen, kann aber selbst keinen Fehler finden.
Ich verwende kein NodeRed sondern sende die Daten über MQTT nach Fhem. Aber grundsätzlich sollte doch die pure Linux Abfrage mit node zumindest Daten anzeigen.
Die Hinweise im vorigen Post habe ich umgesetzt, meine Anmeldedaten (Benutzer und Passwort) für die Android KIA App und den My KIA Account habe ich gleich angepasst und mich von der App ab und wieder angemeldet, leider ohne Änderung.
Irgendwie stecke ich aktuell fest.
Wäre prima wenn ihr noch eine Idee habt.
Gruß Reinhard
Hi,
Ich verwende den Node-Red docker Container und habe nur die verlinkte Anweisungen durchgearbeitet, also die Palette neu installiert und dann den Flow wieder import.
Vorher muss natürlich die Handy App laufen, dafür gibt es sogar einen Kia Support, der auch binnen 24h geantwortet hatte. Da war allerdings die App bereits wieder funktionsfähig.
Sorry, wenn ich nicht helfen konnte
Christian