NEWS
ABRP API
-
Hallo,
bei APRB (A better route planner) https://abetterrouteplanner.com/ besteht ja die Möglichkeit über ein Token die SoC Werte eines EVs einzuspielen.
Passenderweise hat jemand hierfür schon ein Projekt mit ein paar Scripten für den iobroker geschrieben: https://github.com/christophmoar/abrpTelemetrySmartInjector?tab=readme-ov-file
Der Entwickler hat das wegen dem vorhandene Adapter für die smart#1 API so gemacht, nutzt den iobroker aber ansonsten nicht und deshalb das ganze Projekt auch in ein docker image (inkl iobroker, smart-eq Adapter, simple API Adapter... )gepackt.
Da ich das script gerne in meine bestehende iobroker Umgebung nutzen möchte, nutzt mir das docker file wenig. Es ist ja auch der smart-eq Adaper mit drin und ggf will das jemand ja auch mit nem anderen EV nutzen.
Ich hatte über github auch Kontakt mit dem Entwickler, der aber wenig vom iobroker weiß und sein script gerne zur Nutzung so anbietet.Vielleicht hat ja jemand auch Interesse und kann weiterhelfen.
Im Script werden einige npm Module benötigt:
import PubSub from 'pubsub-js' import fetch from 'sync-fetch' import axios from 'axios'Fehlermeldung bei Starten:
script.js.common.abrp_js compile failed: at script.js.common.abrp_js:27Wie bekomme ich die in meiner Umgebung rein und das Script dann zum Laufen?
Danke und Gruß
Holger -
Hallo,
bei APRB (A better route planner) https://abetterrouteplanner.com/ besteht ja die Möglichkeit über ein Token die SoC Werte eines EVs einzuspielen.
Passenderweise hat jemand hierfür schon ein Projekt mit ein paar Scripten für den iobroker geschrieben: https://github.com/christophmoar/abrpTelemetrySmartInjector?tab=readme-ov-file
Der Entwickler hat das wegen dem vorhandene Adapter für die smart#1 API so gemacht, nutzt den iobroker aber ansonsten nicht und deshalb das ganze Projekt auch in ein docker image (inkl iobroker, smart-eq Adapter, simple API Adapter... )gepackt.
Da ich das script gerne in meine bestehende iobroker Umgebung nutzen möchte, nutzt mir das docker file wenig. Es ist ja auch der smart-eq Adaper mit drin und ggf will das jemand ja auch mit nem anderen EV nutzen.
Ich hatte über github auch Kontakt mit dem Entwickler, der aber wenig vom iobroker weiß und sein script gerne zur Nutzung so anbietet.Vielleicht hat ja jemand auch Interesse und kann weiterhelfen.
Im Script werden einige npm Module benötigt:
import PubSub from 'pubsub-js' import fetch from 'sync-fetch' import axios from 'axios'Fehlermeldung bei Starten:
script.js.common.abrp_js compile failed: at script.js.common.abrp_js:27Wie bekomme ich die in meiner Umgebung rein und das Script dann zum Laufen?
Danke und Gruß
Holger@holgerwolf Hier beschreibt das einer mit einer HA-Lösung und ein wenig später gibt es jemanden der es als Blockly umfunktioniert hat. Vielleicht testest du es mal damit und stellst deine finale Lösung hier rein. Ich habe leider bislang kein passendes Auto etc..
-
na hier ist das script
https://github.com/christophmoar/abrpTelemetrySmartInjector/blob/main/abrp.js
kopier es in ein javascript installier die module nach..

sollte laufen
naaa..ok.. bissel drumherum muss man noch bauen..
ich guck mir das mal an
-
na hier ist das script
https://github.com/christophmoar/abrpTelemetrySmartInjector/blob/main/abrp.js
kopier es in ein javascript installier die module nach..

sollte laufen
naaa..ok.. bissel drumherum muss man noch bauen..
ich guck mir das mal an
@arteck Soweit war ich ja auch schon.
Aber beim Starten des scripts mit den passenden Modulen in JS kommt gleich:
javascript.0 2025-01-29 08:42:09.249 error at processImmediate (node:internal/timers:485:21) javascript.0 2025-01-29 08:42:09.249 error at Immediate._onImmediate (/opt/iobroker/node_modules/iobroker.javascript/main.js:1732:17) javascript.0 2025-01-29 08:42:09.249 error at /opt/iobroker/node_modules/iobroker.javascript/main.js:2322:17 javascript.0 2025-01-29 08:42:09.248 error at prepareScript (/opt/iobroker/node_modules/iobroker.javascript/main.js:2224:37) javascript.0 2025-01-29 08:42:09.248 error at createVM (/opt/iobroker/node_modules/iobroker.javascript/main.js:1956:21) javascript.0 2025-01-29 08:42:09.248 error at new Script (node:vm:117:7) javascript.0 2025-01-29 08:42:09.248 error SyntaxError: Cannot use import statement outside a module javascript.0 2025-01-29 08:42:09.248 error ^^^^^^ javascript.0 2025-01-29 08:42:09.248 error import PubSub from 'pubsub-js' javascript.0 2025-01-29 08:42:09.248 error script.js.common.abrp_js compile failed: at script.js.common.abrp_js:27 -
Ich habe jetzt mal das Blockly von oben aus dem Enyak Forum als Vorlage genommen und es für den smart#1 angepasst:

-
Ich habe jetzt mal das Blockly von oben aus dem Enyak Forum als Vorlage genommen und es für den smart#1 angepasst:

@holgerwolf Habt Ihr das weiterentwickelt? Gibt's das auch als JAVA-Script und mit Anleitung?
-
@holgerwolf Habt Ihr das weiterentwickelt? Gibt's das auch als JAVA-Script und mit Anleitung?
@matis Nein, aber das Blockly oben läuft seit dem Post oben ohne Probleme durch.
-
So läuft das bei mir seit nem Jahr sauber durch:
<xml xmlns="https://developers.google.com/blockly/xml"> <block type="schedule" id="r$b2ECTPMDgy(7A~eS%H" x="-1262" y="-662"> <field name="SCHEDULE">*/5 * * * *</field> <statement name="STATEMENT"> <block type="http_post" id="s%1{Jn:w-w=5[,jTt],B"> <field name="TIMEOUT">2000</field> <field name="UNIT">ms</field> <field name="TYPE">text</field> <value name="URL"> <shadow type="text" id="8%z5t@uzh6^qIIC,*24l"> <field name="TEXT">http://</field> </shadow> <block type="text_join" id=")rE3Co;HL:4;Ng4%`As?"> <mutation items="28"></mutation> <value name="ADD0"> <block type="text" id="N*03Mk`lQ,7O^pWcV|}6"> <field name="TEXT">https://api.iternio.com/1/tlm/send?api_key=XXXX</field> </block> </value> <value name="ADD1"> <block type="text" id="osnkdZ#ONf)|#TQ^pV/s"> <field name="TEXT">&token=</field> </block> </value> <value name="ADD2"> <block type="text" id="=dAKHnad6[p;XCfsH}XB"> <field name="TEXT">73c3c6d2-3786-4e0f-a91e-1790ecd30124</field> </block> </value> <value name="ADD3"> <block type="text" id="5Rdg?JF!ryP8$KBVK.Cr"> <field name="TEXT">&tlm={</field> </block> </value> <value name="ADD4"> <block type="text" id="l_r|XG7ZS;:v7sak*YO?"> <field name="TEXT">"utc":</field> </block> </value> <value name="ADD5"> <block type="math_round" id="becJI}.|4p9QnF-moZek"> <field name="OP">ROUND</field> <value name="NUM"> <shadow type="math_number" id="Hx:8DeR-Mdz_nw+xVd7U"> <field name="NUM">3.1</field> </shadow> <block type="math_arithmetic" id="4^B],tyoZ9|S!@4Y1Jd9"> <field name="OP">DIVIDE</field> <value name="A"> <shadow type="math_number" id="c*(]W5yNuk:0]P@E]$+V"> <field name="NUM">1</field> </shadow> <block type="time_get" id=";aG^,|a2#hHRhyvl-UN8"> <mutation xmlns="http://www.w3.org/1999/xhtml" format="false" language="false"></mutation> <field name="OPTION">object</field> </block> </value> <value name="B"> <shadow type="math_number" id="I]#7QtE3v1PphATiifKN"> <field name="NUM">1000</field> </shadow> </value> </block> </value> </block> </value> <value name="ADD6"> <block type="text" id="-Xba~hamrgESIp4xLv}i"> <field name="TEXT">,"soc":</field> </block> </value> <value name="ADD7"> <block type="get_value" id="nF()UttDI-6g65h$Qct}"> <field name="ATTR">val</field> <field name="OID">smart-eq.0.HESXXX.status.additionalVehicleStatus.electricVehicleStatus.chargeLevel</field> </block> </value> <value name="ADD8"> <block type="text" id="/MUe{M4O0R,qGt^ME),q"> <field name="TEXT">,"capacity":62,"odometer":</field> </block> </value> <value name="ADD9"> <block type="get_value" id="6Fq=tzt^~L2}}lWxqi`T"> <field name="ATTR">val</field> <field name="OID">smart-eq.0.HESXXX.status.additionalVehicleStatus.maintenanceStatus.odometer</field> </block> </value> <value name="ADD10"> <block type="text" id="*ujr,G.,5X/8shmHf}Lr"> <field name="TEXT">,"est_battery_range":</field> </block> </value> <value name="ADD11"> <block type="get_value" id=":Nk6Nt%Fb,6ZS35*!-Wv"> <field name="ATTR">val</field> <field name="OID">smart-eq.0.HESXXX.status.additionalVehicleStatus.electricVehicleStatus.distanceToEmptyOnBatteryOnly</field> </block> </value> <value name="ADD12"> <block type="text" id="6;)D3`w:HI(S?x/:8LiE"> <field name="TEXT">,"ext_temp":</field> </block> </value> <value name="ADD13"> <block type="get_value" id="GhNq*}n;QAbB{vi_[#Yj"> <field name="ATTR">val</field> <field name="OID">smart-eq.0.HESXXX.status.additionalVehicleStatus.climateStatus.exteriorTemp</field> </block> </value> <value name="ADD14"> <block type="text" id="Bl4Mw3FG,5qhnjB$g3ZA"> <field name="TEXT">,"cabin_temp":</field> </block> </value> <value name="ADD15"> <block type="get_value" id=";XAm1(G-#UonJM0a(4PD"> <field name="ATTR">val</field> <field name="OID">smart-eq.0.HESXXX.status.additionalVehicleStatus.climateStatus.interiorTemp</field> </block> </value> <value name="ADD16"> <block type="text" id="E:x~/yrF{E{F`(Os$ZhJ"> <field name="TEXT">,"speed":</field> </block> </value> <value name="ADD17"> <block type="get_value" id="K8t=XO89y4#PV.4YY}VL"> <field name="ATTR">val</field> <field name="OID">smart-eq.0.HESXXX.status.basicVehicleStatus.speed</field> </block> </value> <value name="ADD18"> <block type="text" id="8C{#XS8h6C6.FV4`!FKg"> <field name="TEXT">,"elevation":</field> </block> </value> <value name="ADD19"> <block type="get_value" id="4*K:KrIuF-zc/aSL,6!."> <field name="ATTR">val</field> <field name="OID">smart-eq.0.HESXXX.status.basicVehicleStatus.position.altitude</field> </block> </value> <value name="ADD20"> <block type="text" id="VpF3Umzpb|l=:dWELE/7"> <field name="TEXT">,"lat":</field> </block> </value> <value name="ADD21"> <block type="math_arithmetic" id="BR68}a;E]2B5zZhK~~]J"> <field name="OP">DIVIDE</field> <value name="A"> <shadow type="math_number" id="_rMXc94n3xF^gi6L@Q3p"> <field name="NUM">1</field> </shadow> <block type="get_value" id="rro[))*;~~~))U|EX9Ci"> <field name="ATTR">val</field> <field name="OID">smart-eq.0.HESXXX.status.basicVehicleStatus.position.latitude</field> </block> </value> <value name="B"> <shadow type="math_number" id="}KD41:jX0iaH)`k:|w~Y"> <field name="NUM">3600000</field> </shadow> </value> </block> </value> <value name="ADD22"> <block type="text" id="DK}_]a74RuuiCjPH1kNf"> <field name="TEXT">,"lon":</field> </block> </value> <value name="ADD23"> <block type="math_arithmetic" id="Lz#YVURz-5oRwQvPZypU"> <field name="OP">DIVIDE</field> <value name="A"> <shadow type="math_number" id="_rMXc94n3xF^gi6L@Q3p"> <field name="NUM">1</field> </shadow> <block type="get_value" id="[3%]E|T/Z):B!GKu]Dp2"> <field name="ATTR">val</field> <field name="OID">smart-eq.0.HESXXX.status.basicVehicleStatus.position.longitude</field> </block> </value> <value name="B"> <shadow type="math_number" id="Tb[gIe=(A(WUwPWOIMU7"> <field name="NUM">3600000</field> </shadow> </value> </block> </value> <value name="ADD24"> <block type="text_join" id="Jm`uVa~n@p`KjsbLnVeA"> <mutation items="1"></mutation> <value name="ADD0"> <block type="logic_ternary" id="Qg357.ykWSUO:N)Wfh(-"> <value name="IF"> <block type="logic_compare" id="]EHVY4%@Tg4@d@%$|{L*"> <field name="OP">EQ</field> <value name="A"> <block type="get_value" id="9DVeuH#?6AoGioj;0bTx"> <field name="ATTR">val</field> <field name="OID">smart-eq.0.HESXXX.status.additionalVehicleStatus.electricVehicleStatus.chargeIAct</field> </block> </value> <value name="B"> <block type="text" id="yk-o3tiLP*$e13u#l+4}"> <field name="TEXT">0.000</field> </block> </value> </block> </value> <value name="THEN"> <block type="text_join" id="E]UaFngdhh5e-0?wkQb#"> <mutation items="2"></mutation> <value name="ADD0"> <block type="text" id="5^@eOPLNR,uc5by]=`n8"> <field name="TEXT">,"is_charging":</field> </block> </value> <value name="ADD1"> <block type="text" id="l#|l=2zJbKws0(rVx}o~"> <field name="TEXT">0</field> </block> </value> </block> </value> <value name="ELSE"> <block type="text_join" id="krMmu^H/+Q.xV509UdKK"> <mutation items="2"></mutation> <value name="ADD0"> <block type="text" id="i2T_y:9:eo-lK00^vETL"> <field name="TEXT">,"is_charging":</field> </block> </value> <value name="ADD1"> <block type="text" id="an^Ly~UUSA2KHGLaA9P0"> <field name="TEXT">1</field> </block> </value> </block> </value> </block> </value> </block> </value> <value name="ADD25"> <block type="text" id="9hlwo#SA_wxyUor)u~_Z"> <field name="TEXT">,"power":</field> </block> </value> <value name="ADD26"> <block type="text_join" id="}Pt|r$sr98%`Hw=.}We5"> <mutation items="1"></mutation> <value name="ADD0"> <block type="math_arithmetic" id="=~:M1slq|NhbiJQ;tNkU"> <field name="OP">MULTIPLY</field> <value name="A"> <shadow type="math_number" id="_rMXc94n3xF^gi6L@Q3p"> <field name="NUM">1</field> </shadow> <block type="math_arithmetic" id="$THQ7v}}{oBSq9Q_wdWF"> <field name="OP">MULTIPLY</field> <value name="A"> <shadow type="math_number" id="ISg(9F~VE.r/p`I|K7vT"> <field name="NUM">-1</field> </shadow> </value> <value name="B"> <shadow type="math_number" id="}:l9^HkYzxb9hcY*,yzn"> <field name="NUM">1</field> </shadow> <block type="get_value" id="i-8fN4*n/02%.N{]J~KR"> <field name="ATTR">val</field> <field name="OID">smart-eq.0.HESXXX.status.additionalVehicleStatus.electricVehicleStatus.chargeIAct</field> </block> </value> </block> </value> <value name="B"> <shadow type="math_number" id="x4u;{YRPS#k-YdmjPGa}"> <field name="NUM">3600000</field> </shadow> <block type="math_arithmetic" id="(Lt=dj#6$IlQ,J2=ae*O"> <field name="OP">DIVIDE</field> <value name="A"> <shadow type="math_number" id="9-Z!!/E`P8vblpQaVG,="> <field name="NUM">1</field> </shadow> <block type="get_value" id="#Ur.:rK1t5K^A:KRY%!k"> <field name="ATTR">val</field> <field name="OID">smart-eq.0.HESXXX.status.additionalVehicleStatus.electricVehicleStatus.chargeUAct</field> </block> </value> <value name="B"> <shadow type="math_number" id="P3=:w:Ccz_0jj4WVq.DA"> <field name="NUM">1000</field> </shadow> </value> </block> </value> </block> </value> </block> </value> <value name="ADD27"> <block type="text" id="0:-1FaL%lA-t=(#iR+*="> <field name="TEXT">}</field> </block> </value> </block> </value> <value name="DATA"> <shadow type="logic_null" id="4O5}pQt1WhYoQd:Q;T5h"></shadow> </value> </block> </statement> </block> <block type="convert_tonumber" id="b6]w[ZKgAf57In.$unjq" x="-362" y="-462"></block> </xml>Die Felder musst du halt nach von deinem EV Adapter sinnvoll befüllen.
-
Ich noch mal der Wert in der URL ist der welcher man von iternio.com per Mail anfragen muss und der token ist der unter live generic ?
-
Keine Ahnung mehr wie das funktioniert. Der jetzt in der App abgerufene Key passt nicht zu denen im script oben eingetragen. Oder gibt es immer einen Neuen?
Aber die API kann ich noch ansprechen und die Werte werden aktualisiert. Will ich jetzt aber auch nicht ändern... -
so läuft bei jetzt auch bei mir
wer es als js haben will:
/*************************************************************** * VW → ABRP Telemetry Script * für ioBroker Javascript Adapter * * Funktionen: * 1. Sendet Fahrzeugdaten alle 5 Minuten an ABRP * 2. Sendet sofort wenn sich der SOC ändert * * Gesendete Daten: * - SOC (Batteriestand) * - GPS Position * - Odometer * - Batteriekapazität * - Timestamp * * API: * https://api.iternio.com/1/tlm/send ***************************************************************/ const apiKey = "API-KEY-von-iternio.com"; const token = "Token-aus-der-APP"; const vin = "VIN-des-Autos"; /*********************** * Datenpunkte ***********************/ const dp_soc = "vw-connect.0." + vin + ".status.charging.status.battery.stateOfChargeInPercent"; const dp_odometer = "vw-connect.0." + vin + ".mqtt.events.charging-completed.data.odometer"; const dp_lat = "vw-connect.0." + vin + ".status.position.parkingPosition.gpsCoordinates.latitude"; const dp_lon = "vw-connect.0." + vin + ".status.position.parkingPosition.gpsCoordinates.longitude"; /*********************** * Funktion zum Senden ***********************/ function sendToABRP(trigger) { const soc = getState(dp_soc).val; const odometer = getState(dp_odometer).val; const lat = getState(dp_lat).val; const lon = getState(dp_lon).val; // Prüfen ob wichtige Daten vorhanden sind if (soc === null || lat === null || lon === null) { log("ABRP: Daten fehlen → kein Versand", "warn"); return; } const utc = Math.round(Date.now() / 1000); const tlm = { utc: utc, soc: soc, capacity: 85, odometer: odometer, lat: lat, lon: lon }; const url = "https://api.iternio.com/1/tlm/send?api_key=" + apiKey + "&token=" + token + "&tlm=" + encodeURIComponent(JSON.stringify(tlm)); httpGet(url, { timeout: 2000 }, function (err, response) { if (err) { log("ABRP Fehler: " + err, "error"); } else { log("ABRP gesendet (" + trigger + "): " + JSON.stringify(tlm), "info"); } }); } /*********************** * 1️⃣ Alle 5 Minuten senden ***********************/ schedule("*/5 * * * *", function () { sendToABRP("Timer"); }); /*********************** * 2️⃣ Senden wenn SOC sich ändert ***********************/ on({ id: dp_soc, change: "ne" }, function (obj) { log("SOC Änderung erkannt: " + obj.state.val + "%", "info"); sendToABRP("SOC Änderung"); });