E-Auto Hyundai Bluelink / Bluelinky (Hilfe zu Node.js)

Begonnen von mnl1234, 26 November 2020, 08:50:37

Vorheriges Thema - Nächstes Thema

ch.eick

#120
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
RPI4; Docker; CUNX; Eltako FSB61NP; SamsungTV H-Serie; Sonos; Vallox; Luxtronik; 3x FB7490; Stromzähler mit DvLIR; wunderground; Plenticore 10 mit BYD; EM410; SMAEM; Modbus TCP
Contrib: https://svn.fhem.de/trac/browser/trunk/fhem/contrib/ch.eick

ch.eick

#121
Update: 2022-01-12

Zitat 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
RPI4; Docker; CUNX; Eltako FSB61NP; SamsungTV H-Serie; Sonos; Vallox; Luxtronik; 3x FB7490; Stromzähler mit DvLIR; wunderground; Plenticore 10 mit BYD; EM410; SMAEM; Modbus TCP
Contrib: https://svn.fhem.de/trac/browser/trunk/fhem/contrib/ch.eick

ch.eick

#122
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
RPI4; Docker; CUNX; Eltako FSB61NP; SamsungTV H-Serie; Sonos; Vallox; Luxtronik; 3x FB7490; Stromzähler mit DvLIR; wunderground; Plenticore 10 mit BYD; EM410; SMAEM; Modbus TCP
Contrib: https://svn.fhem.de/trac/browser/trunk/fhem/contrib/ch.eick

xerion

#123

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"
            ]
        ]
    }
]
Ich würde mich  freuen, wenn du meinen Einladungscode für Tibber, der Stromanbieter, der dir hilft, deinen Stromverbrauch zu verstehen und zu reduzieren, nutzt: https://invite.tibber.com/5fc08jbs. So bekommen wir beide 50 Euro und 100 % Ökostrom / https://geld-fuer-eauto.de/ref/334561880

xerion

Ja so passt es jetzt. Hast du eine Idee wegen der uiTable?
Ich würde mich  freuen, wenn du meinen Einladungscode für Tibber, der Stromanbieter, der dir hilft, deinen Stromverbrauch zu verstehen und zu reduzieren, nutzt: https://invite.tibber.com/5fc08jbs. So bekommen wir beide 50 Euro und 100 % Ökostrom / https://geld-fuer-eauto.de/ref/334561880

ch.eick

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?
RPI4; Docker; CUNX; Eltako FSB61NP; SamsungTV H-Serie; Sonos; Vallox; Luxtronik; 3x FB7490; Stromzähler mit DvLIR; wunderground; Plenticore 10 mit BYD; EM410; SMAEM; Modbus TCP
Contrib: https://svn.fhem.de/trac/browser/trunk/fhem/contrib/ch.eick

xerion

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.
Ich würde mich  freuen, wenn du meinen Einladungscode für Tibber, der Stromanbieter, der dir hilft, deinen Stromverbrauch zu verstehen und zu reduzieren, nutzt: https://invite.tibber.com/5fc08jbs. So bekommen wir beide 50 Euro und 100 % Ökostrom / https://geld-fuer-eauto.de/ref/334561880

ch.eick

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.
RPI4; Docker; CUNX; Eltako FSB61NP; SamsungTV H-Serie; Sonos; Vallox; Luxtronik; 3x FB7490; Stromzähler mit DvLIR; wunderground; Plenticore 10 mit BYD; EM410; SMAEM; Modbus TCP
Contrib: https://svn.fhem.de/trac/browser/trunk/fhem/contrib/ch.eick

xerion

#128
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
Ich würde mich  freuen, wenn du meinen Einladungscode für Tibber, der Stromanbieter, der dir hilft, deinen Stromverbrauch zu verstehen und zu reduzieren, nutzt: https://invite.tibber.com/5fc08jbs. So bekommen wir beide 50 Euro und 100 % Ökostrom / https://geld-fuer-eauto.de/ref/334561880

ch.eick

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...
RPI4; Docker; CUNX; Eltako FSB61NP; SamsungTV H-Serie; Sonos; Vallox; Luxtronik; 3x FB7490; Stromzähler mit DvLIR; wunderground; Plenticore 10 mit BYD; EM410; SMAEM; Modbus TCP
Contrib: https://svn.fhem.de/trac/browser/trunk/fhem/contrib/ch.eick

ch.eick

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
RPI4; Docker; CUNX; Eltako FSB61NP; SamsungTV H-Serie; Sonos; Vallox; Luxtronik; 3x FB7490; Stromzähler mit DvLIR; wunderground; Plenticore 10 mit BYD; EM410; SMAEM; Modbus TCP
Contrib: https://svn.fhem.de/trac/browser/trunk/fhem/contrib/ch.eick

ch.eick

#131
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
RPI4; Docker; CUNX; Eltako FSB61NP; SamsungTV H-Serie; Sonos; Vallox; Luxtronik; 3x FB7490; Stromzähler mit DvLIR; wunderground; Plenticore 10 mit BYD; EM410; SMAEM; Modbus TCP
Contrib: https://svn.fhem.de/trac/browser/trunk/fhem/contrib/ch.eick

ch.eick

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
RPI4; Docker; CUNX; Eltako FSB61NP; SamsungTV H-Serie; Sonos; Vallox; Luxtronik; 3x FB7490; Stromzähler mit DvLIR; wunderground; Plenticore 10 mit BYD; EM410; SMAEM; Modbus TCP
Contrib: https://svn.fhem.de/trac/browser/trunk/fhem/contrib/ch.eick

ch.eick

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
RPI4; Docker; CUNX; Eltako FSB61NP; SamsungTV H-Serie; Sonos; Vallox; Luxtronik; 3x FB7490; Stromzähler mit DvLIR; wunderground; Plenticore 10 mit BYD; EM410; SMAEM; Modbus TCP
Contrib: https://svn.fhem.de/trac/browser/trunk/fhem/contrib/ch.eick

ch.eick

#134
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
RPI4; Docker; CUNX; Eltako FSB61NP; SamsungTV H-Serie; Sonos; Vallox; Luxtronik; 3x FB7490; Stromzähler mit DvLIR; wunderground; Plenticore 10 mit BYD; EM410; SMAEM; Modbus TCP
Contrib: https://svn.fhem.de/trac/browser/trunk/fhem/contrib/ch.eick