Dashboard for SAIC Electrical Vehicles (MG4)

Please visit github repository for the lastest updates.

Goals

My main goal is to integrate my MG4 in Node-red to use car's data with my automation workflow. Moreover, SAIC's ISmart mobile app is limited that why I have developed this dashboard.

Features

Dash-MG4: flow.json

  • Support of Multi-language supported (default: French)
  • Dashboard with car's components status
  • Localization of my car on a map (daily, weekly, monthly and custom journeys)
  • Compute charge cost and duration using electricity pricing limplementation (EDF in France)
  • Override Saic MQTT gateway configuration
  • Charts for:
    • Tyres pressure
    • Battery voltage
    • Consumption + cost
    • Temperature
    • Battery capacity
    • Charge calendar
  • Remote actions
    • set remote temperature, A/C mode, target SOC
    • enable A/C, lock, boot ...

MG4 Gateway: flow_gateway.json

  • Manage MQTT SAIC Gateway instance.

Miscellaneous

These features are not includes in theses flows but they have been integrated:

  • Alerting (opened windows or doors at night, tyres pressure ...)
  • Closing automatically car at night
  • Starting automatically A/C
  • Integration with Google Home Ok Google MG4 -> Your car is in the avenue Champs-Elyseés, 7 near Mc Donalds restaurant ...

Dependencies

I use Saic MQTT gateway project to query data from MG's car.

Dashboard integrates:

  • MQTT input to query data from local Moquitto
  • nodered-dashboard-ui providing ui components
  • node-red-contrib-web-worldmap as map provider
  • node-red-contrib-ui-svg to integrate MG top view from official MG website
  • EDF pricing data file to compute cost
  • Persistance in SQLite database (in beta, to remove for production)

Installation guide

No warrantly, No support, No security requirements

Schema

main

Raspberry Pie

Saic MQTT gateway

# Slow process
https://raw.githubusercontent.com/tvdsluijs/sh-python-installer/main/python.sh | sudo bash -s 3.xx.x
# Default folder: /home/dietpi/.node-red/saic/
mkdir /home/dietpi/.node-red/
git clone --depth 1 https://github.com/SAIC-iSmart-API/saic-python-mqtt-gateway.git
mv saic-python-mqtt-gateway saic
cd saic
pip3 install -r requirements.txt
  • Launch manually SAIC Gateway for testing
# Launch gateway
python mqtt_gateway.py -m tcp://localhost:1883 -u "${saic email}" -p "${saic password}" --mqtt-user "mosquitto"  --mqtt-password "${mqtt password}"
  • Use MQTT Explorer to get path of data (ex: saic/xxx/vehicles/yyy)
    • xxx: account ID
    • yyy: vehicule ID

NodeRed

dietpi-software install 9
# or
dietpi-software reinstall 9
  • Install NodeRed
  • Enable Saving context data to the file-system
  • Import flow.json: Dash-MG4
  • Import flow_gateway.json: MG4 Gateway to manage SAIC Gateway instance in NodeRed
  • Modify Dash-MG4 to insert your configuration (replace '_to_change_xxx' variables, and see TO SETnode )
  • Modify MG4 Gateway to insert your configuration (see TO SETnode )
  • Deploy them
  • Watch Saic MQTT gateway outputs & see debug trace in Nodered
    • you have to see before MQTT gateway events
    • after that MQTT input in NodeRed will integrates data
  • Open http://${ip}:1880/ui/

Contribution

This flow is provided as it.

Feel free:

  • to improve it
  • to fix some bugs
  • to share your work ;)

Disseminating knowledge is the human duty, sharing it about so that all can benefit.

Translation

  • Edit saicInternationalFx subflow
  • Duplicate actionFR and rename actionXX
  • Translate everything in XX
  • Implement electricity functions
  • Edit label node and add XX in global.get("saic").language_supported (ex: XX=ES for spanish)
In Action

  • Test, test and test

  • Share with me actionXX && global.get("saic").language_supported contents

  • I will release a new version of this dashboard and you are the official maintainer of this language

  • Well done !

License

GNU GPLv3

Thanks

"Buy Me A Coffee"

[{"id":"cc759b59f1b564bf","type":"subflow","name":"saicInternationalFx","info":"","category":"","in":[{"x":140,"y":120,"wires":[{"id":"d40805fdc8017173"}]}],"out":[{"x":1080,"y":280,"wires":[{"id":"283017ef5bd81f39","port":0}]}],"env":[],"meta":{},"color":"#DDAA99","status":{"x":1080,"y":380,"wires":[{"id":"88432ef352e5edbb","port":0}]}},{"id":"594601dc8c93b65a","type":"function","z":"cc759b59f1b564bf","name":"actionEN","func":"return msg;\n","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":520,"y":120,"wires":[["283017ef5bd81f39"]]},{"id":"283017ef5bd81f39","type":"function","z":"cc759b59f1b564bf","name":"label","func":"msg.translate = (key) => {\n  if (msg.action[key]) return msg.action[key].translation\n  else {\n    let k = Object.keys(msg.action).find(f => f.indexOf(key) > -1)\n    return k ? msg.action[k].translation : 'Not defined'\n  }\n}\n\nif (!msg.getPowerByHour) {\n  // if not implemented but translation maintainer\n  msg.getLoss = () => 0 //35 / 100\n  msg.getPriceBykwh = () => 0.12\n  msg.getPowerByHour = (ampere = 9.9) => ampere * 220\n  global.get('saic').gateway.drivetrain_restToSOCTarget = 0\n  global.get('saic').gateway.drivetrain_durationToSOCTarget = 0\n  global.get('saic').gateway.drivetrain_priceToSOCTarget = 0\n}\n\n\n\n\nglobal.get(\"saic\").language_supported = [\n  { \"Français\": \"FR\" },\n // { \"English\": \"EN\" }\n]\nreturn msg;","outputs":1,"timeout":0,"noerr":0,"initialize":"","finalize":"","libs":[],"x":770,"y":280,"wires":[["88432ef352e5edbb"]]},{"id":"d40805fdc8017173","type":"switch","z":"cc759b59f1b564bf","name":"","property":"saic.language","propertyType":"global","rules":[{"t":"eq","v":"EN","vt":"str"},{"t":"eq","v":"ES","vt":"str"},{"t":"else"}],"checkall":"false","repair":false,"outputs":3,"x":320,"y":120,"wires":[["594601dc8c93b65a"],["52a6361bebaf6518"],["9bb4da20b26b86a9"]]},{"id":"9bb4da20b26b86a9","type":"function","z":"cc759b59f1b564bf","name":"actionFR","func":"//https://github.com/SAIC-iSmart-API/saic-python-mqtt-gateway/blob/a9fa48622a9bb4cf75ed1dd70d3e67039ede0f70/vehicle.py#L526\nconst CURRENCY = '€'\n\nfunction open(value) {\n    return value ? 'ouvert' : 'fermé'\n}\n\nfunction kwh(value) {\n    return parseFloat(value).toFixed(1) + ' kwh'\n}\n\nfunction start(value) {\n    return value ? 'actif' : 'inactif'\n}\n\nfunction time(value) {\n    //2023-10-15T05:12:09.160873+00:00\n    let d = new Date(value)\n    let tmp = d.toISOString().split('T')\n    return tmp[0] + ' ' + d.toLocaleTimeString('fr-FR')\n}\n\nfunction to_charging_schedule_mode(value) {\n    if (value === 1) return 'UNTIL_CONFIGURED_TIME'\n    else if (value === 2) return 'DISABLED'\n    else if (value === 3) return 'UNTIL_CONFIGURED_SOC'\n    else { return 'UNKNOWN MODE ' + value }\n}\n\nfunction onoff(value) {\n    return value === 'on' ? 'actif' : 'inactif'\n}\n\nmsg.action = {\n    \"batteryVoltage\": {\n        \"transform\": \"V\",\n        \"translation\": \"Voltage de la batterie\"\n    },\n    \"doors_bonnet\": {\n        \"transform\": open,\n        \"translation\": \"Capot\"\n    },\n    \"doors_boot\": {\n        \"transform\": open,\n        \"translation\": \"Coffre\"\n    },\n    \"canBusActive\": {\n        \"transform\": false,\n        \"translation\": \"CanBus active\"\n    },\n    \"clstrDspdFuelLvlSgmt\": {\n        \"transform\": false,\n        \"translation\": \"Fuel level\"\n    },\n    \"currentJourneyID\": {\n        \"transform\": false,\n        \"translation\": \"Trajet ID\"\n    },\n    \"currentjourneyDistance\": {\n        \"transform\": \"Km\",\n        \"translation\": \"Distance journalière\"\n    },\n    \"lights_dippedBeam\": {\n        \"transform\": start,\n        \"translation\": \"Feux de croisement\"\n    },\n    \"doors_driver\": {\n        \"transform\": open,\n        \"translation\": \"Porte chauffeur\"\n    },\n    \"windows_driver\": {\n        \"transform\": open,\n        \"translation\": \"Fenêtre chauffeur\"\n    },\n    \"engineStatus\": {\n        \"transform\": start,\n        \"translation\": \"Moteur\"\n    },\n    \"extendedData1\": {\n        \"transform\": false,\n        \"translation\": \"Données 1\"\n    },\n    \"extendedData2\": {\n        \"transform\": false,\n        \"translation\": \"Données 2\"\n    },\n    \"climate_exteriorTemperature\": {\n        \"transform\": \"°C\",\n        \"translation\": \"Température extérieure\"\n    },\n    \"climate_remoteTemperature\": {\n        \"transform\": \"°C\",\n        \"translation\": \"Température int. cible\"\n    },\n    \"climate_remoteClimateState\": {\n        \"transform\": undefined,\n        \"translation\": \"A/C\"\n    },\n    \"climate_rearWindowDefrosterHeating\": {\n        \"transform\": onoff,\n        \"translation\": \"Dégivrage arrière\"\n    },\n    \"climate_frontWindowDefrosterHeating\": {\n        \"transform\": onoff,\n        \"translation\": \"Dégivrage avant\"\n    },\n    \"frontLeftSeatHeatLevel\": {\n        \"translation\": \"Chaleur du siége avant-gauche\"\n    },\n    \"tyres_frontLeftPressure\": {\n        \"transform\": \"bar\",\n        \"translation\": \"Pression du pneu avant-gauche\"\n    },\n    \"frontRightSeatHeatLevel\": {\n        \"translation\": \"Chaleur du siége avant-droit\"\n    },\n    \"tyres_frontRightPressure\": {\n        \"transform\": \"bar\",\n        \"translation\": \"Pression du pneu avant-droit\"\n    },\n    \"fuelLevelPrc\": {\n        \"transform\": false,\n        \"translation\": \"Niveau de carburant\"\n    },\n    \"fuelRange\": {\n        \"transform\": false,\n        \"translation\": \"Plage de carburant\"\n    },\n    \"fuelRangeElec\": {\n        \"transform\": false,\n        \"translation\": \"Place de carburant électrique\"\n    },\n    \"handBrake\": {\n        \"transform\": start,\n        \"translation\": \"Frein à main\"\n    },\n    \"climate_interiorTemperature\": {\n        \"transform\": \"°C\",\n        \"translation\": \"Température intérieure\"\n    },\n    \"lastKeySeen\": {\n        \"transform\": false,\n        \"translation\": \"Dernier clé vue\"\n    },\n    \"doors_locked\": {\n        \"transform\": start,\n        \"translation\": \"Verrouillage\"\n    },\n    \"drivetrain_hybrid_electrical_range\": {\n        \"transform\": false,\n    },\n    \"lights_mainBeam\": {\n        \"transform\": start,\n        \"translation\": \"Feux de route\"\n    },\n    \"drivetrain_mileage\": {\n        \"transform\": \"Km\",\n        \"translation\": \"Kilométrage\"\n    },\n    \"doors_passenger\": {\n        \"transform\": open,\n        \"translation\": \"Porte passager\"\n    },\n    \"windows_passenger\": {\n        \"transform\": open,\n        \"translation\": \"Fenêtre passager\"\n    },\n    \"powerMode\": {\n        \"translation\": \"Mode de conduite\"\n    },\n    \"doors_rearLeft\": {\n        \"transform\": open,\n        \"translation\": \"Porte arrière-gauche\"\n    },\n    \"tyres_rearLeftPressure\": {\n        \"transform\": \"bar\",\n        \"translation\": \"Pression du pneu arrière-gauche\"\n    },\n    \"windows_rearLeft\": {\n        \"transform\": open,\n        \"translation\": \"Fenêtre arrière-gauche\"\n    },\n    \"doors_rearRight\": {\n        \"transform\": open,\n        \"translation\": \"Porte arrière-droite\"\n    },\n    \"tyres_rearRightPressure\": {\n        \"transform\": \"bar\",\n        \"translation\": \"Pression du pneu arrière-droit\"\n    },\n    \"windows_rearRight\": {\n        \"transform\": open,\n        \"translation\": \"Fenêtre arrière-droite\"\n    },\n    \"remoteClimateStatus\": {\n        \"translation\": \"Climatisation\"\n    },\n    \"remoteClimateState\": {\n        \"transform\": start,\n        \"translation\": \"Climatisation\"\n    },\n    \"rearWindowDefrosterHeating\": {\n        \"transform\": start,\n        \"translation\": \"Dégivrage arriêre\"\n    },\n    \"rmtHtdRrWndSt\": {\n        \"translation\": \"\"\n    },\n    \"sideLightStatus\": {\n        \"transform\": open,\n        \"translation\": \"Clignotants\"\n    },\n    \"windows_sunRoof\": {\n        \"transform\": false,\n        \"translation\": \"Toit panoramique\"\n    },\n    \"timeOfLastCANBUSActivity\": {\n        \"transform\": false,\n        \"translation\": \"Date de la dernière activité du bus CAN\"\n    },\n    \"vehElecRngDsp\": {\n        \"translation\": \"Dispositif véhcule élec.\"\n    },\n    \"vehicleAlarmStatus\": {\n        \"translation\": \"Alarme\"\n    },\n    \"wheelMonitorStatus\": {\n        \"translation\": \"Alarme pour les pneus\"\n    },\n    \"eventcreationtime\": {\n        \"transform\": time,\n        \"translation\": \"Heure de la requête\"\n    },\n    \"bmspacksocdsp\": {\n        \"transform\": \"%\",\n        \"translation\": \"Etat de charge (SOC)\"\n    },\n    \"realtimepower\": {\n        \"translation\": \"Puissance en temps réel\"\n    },\n    \"bmsestdelecrng\": {\n        \"translation\": \"Audience totale projetée\"\n    },\n    \"drivetrain_mileageOfTheDay\": {\n        \"transform\": \"Km\",\n        \"translation\": \"Kilomètrage journalier\"\n    },\n    \"lastcharge_endtime\": {\n        \"transform\": time,\n        \"translation\": \"Dernier chargement le\"\n    },\n    \"drivetrain_mileageSinceLastCharge\": {\n        \"transform\": \"Km\",\n        \"translation\": \"Kilomètres depuis la dernière charge\"\n    },\n    \"powerusagesincelastcharge\": {\n        \"translation\": \"Consommation depuis la dernière charge\"\n    },\n    \"lastchargeendingpower\": {\n        \"translation\": \"Niveau de la batterie après la dernière charge\"\n    },\n    \"totalbatterycapacity\": {\n        \"translation\": \"Capacité de la batterie\"\n    },\n    \"statusTime\": {\n        \"transform\": time,\n        \"translation\": \"Heure de mise à jour\"\n    },\n    \"bmsReserCtrlDspCmd\": {\n        \"transform\": \"to_charging_schedule_mode\",\n        \"translation\": \"Programmation de la recharge\"\n    },\n    \"bmsReserStHourDspCmd\": {\n        \"translation\": \"Heure de démarrage de la recharge\"\n    },\n    \"bmsReserStMintueDspCmd\": {\n        \"translation\": \"Minute de démarrage de la recharge\"\n    },\n    \"bmsReserSpHourDspCmd\": {\n        \"translation\": \"Heure de fin de la recharge\"\n    },\n    \"bmsReserSpMintueDspCmd\": {\n        \"translation\": \"Minute de fin de la recharge\"\n    },\n    \"bmsOnBdChrgTrgtSOCDspCmd\": {\n        \"translation\": \"Cible de la recharge max.\"\n    },\n    \"bmsEstdElecRng\": {\n        \"translation\": \"\"\n    },\n    \"bmsAltngChrgCrntDspCmd\": {\n        \"translation\": \"\"\n    },\n    \"bmsChrgCtrlDspCmd\": {\n        \"translation\": \"\"\n    },\n    \"chrgngRmnngTime\": {\n        \"transform\": (v) => v * 60,\n        \"translation\": \"Temps restant de chargement\"\n    },\n    \"chrgngRmnngTimeV\": {\n        \"transform\": time,\n        \"translation\": \"\"\n    },\n    \"bmsChrgOtptCrntReq\": {\n        \"translation\": \"\"\n    },\n    \"bmsPackCrnt\": {\n        \"translation\": \"\"\n    },\n    \"bmsPackVol\": {\n        \"translation\": \"\"\n    },\n    \"bmsPackSOCDsp\": {\n        \"transform\": (v) => v / 10 + \" %\",\n        \"translation\": \"SOC\"\n    },\n    \"bmsChrgSts\": {\n        \"translation\": \"\"\n    },\n    \"bmsChrgSpRsn\": {\n        \"translation\": \"\"\n    },\n    \"clstrElecRngToEPT\": {\n        \"translation\": \"\"\n    },\n    \"bmsPTCHeatReqDspCmd\": {\n        \"translation\": \"\"\n    },\n    \"realtimePower\": {\n        \"translation\": \"Puissance en temps réel\"\n    },\n    \"chargingGunState\": {\n        \"transform\": open,\n        \"translation\": \"Etat de branchement\"\n    },\n    \"startTime\": {\n        \"transform\": undefined,\n        \"translation\": \"Heure de démarrage de recharge\"\n    },\n    \"endTime\": {\n        \"transform\": undefined,\n        \"translation\": \"Heure de fin de recharge\"\n    },\n    \"workingCurrent\": {\n        \"transform\": \"I\",\n        \"translation\": \"Intensité en cours\"\n    },\n    \"workingVoltage\": {\n        \"transform\": \"V\",\n        \"translation\": \"Voltage en cours\"\n    },\n    \"powerUsageSinceLastCharge\": {\n        \"translation\": \"Puissance consommée depuis la dernière recharge\"\n    },\n    \"powerUsageOfDay\": {\n        \"transform\": \"W\",\n        \"translation\": \"Puissance consomméé du jour\"\n    },\n    \"chargingDuration\": {\n        \"translation\": \"Durée de la charge\"\n    },\n    \"bmsAdpPubChrgSttnDspCmd\": {\n        \"translation\": \"\"\n    },\n    \"bmsChrgOtptCrntReqV\": {\n        \"translation\": \"\"\n    },\n    \"bmsPackCrntV\": {\n        \"translation\": \"\"\n    },\n    \"bmsPTCHeatResp\": {\n        \"translation\": \"Programmation du chauffage\"\n    },\n    \"ccuEleccLckCtrlDspCmd\": {\n        \"translation\": \"\"\n    },\n    \"bmsDsChrgSpRsn\": {\n        \"translation\": \"\"\n    },\n    \"disChrgngRmnngTime\": {\n        \"transform\": time,\n        \"translation\": \"\"\n    },\n    \"disChrgngRmnngTimeV\": {\n        \"translation\": \"\"\n    },\n    \"imcuVehElecRng\": {\n        \"translation\": \"\"\n    },\n    \"imcuVehElecRngV\": {\n        \"translation\": \"\"\n    },\n    \"imcuChrgngEstdElecRng\": {\n        \"translation\": \"\"\n    },\n    \"imcuChrgngEstdElecRngV\": {\n        \"translation\": \"\"\n    },\n    \"imcuDschrgngEstdElecRng\": {\n        \"translation\": \"\"\n    },\n    \"imcuDschrgngEstdElecRngV\": {\n        \"translation\": \"\"\n    },\n    \"chrgngSpdngTime\": {\n        \"translation\": \"\"\n    },\n    \"chrgngSpdngTimeV\": {\n        \"translation\": \"\"\n    },\n    \"chrgngAddedElecRng\": {\n        \"translation\": \"\"\n    },\n    \"chrgngAddedElecRngV\": {\n        \"translation\": \"\"\n    },\n    \"onBdChrgrAltrCrntInptCrnt\": {\n        \"translation\": \"\"\n    },\n    \"onBdChrgrAltrCrntInptVol\": {\n        \"translation\": \"\"\n    },\n    \"ccuOnbdChrgrPlugOn\": {\n        \"translation\": \"\"\n    },\n    \"ccuOffBdChrgrPlugOn\": {\n        \"translation\": \"\"\n    },\n    \"chrgngPosSts\": {\n        \"translation\": \"\"\n    },\n    \"chrgngOpenCnd\": {\n        \"translation\": \"\"\n    },\n    \"drivetrain_hvBatteryActive\": {\n        \"transform\": start,\n        \"translation\": \"Préchauffage de la batterie\"\n    },\n    \"drivetrain_running\": {\n        \"transform\": start,\n        \"translation\": \"En fonctionnement\"\n    },\n    \"drivetrain_charging\": {\n        \"transform\": start,\n        \"translation\": \"En charge\"\n    },\n    \"drivetrain_auxiliaryBatteryVoltage\": {\n        \"transform\": \"V\",\n        \"translation\": \"Voltage de la batterie auxiliare\"\n    },\n    \"drivetrain_current\": {\n        \"transform\": \"A\",\n        \"translation\": \"Courant\"\n    },\n    \"drivetrain_voltage\": {\n        \"transform\": \"V\",\n        \"translation\": \"Tension\"\n    },\n    \"drivetrain_power\": {\n        \"transform\": undefined,\n        \"translation\": \"Puissance\"\n    },\n    \"drivetrain_socTarget\": {\n        \"transform\": \"%\",\n        \"translation\": \"Charge cible\"\n    },\n    \"drivetrain_soc\": {\n        \"transform\": \"%\",\n        \"translation\": \"Charge\"\n    },\n    \"drivetrain_soc_kwh\": {\n        \"transform\": kwh,\n        \"translation\": \"Puissance courante\"\n    },\n    \"drivetrain_chargingType\": {\n        \"transform\": undefined,\n        \"translation\": \"Type de charge\"\n    },\n    \"drivetrain_chargerConnected\": {\n        \"transform\": start,\n        \"translation\": \"Chargeur connecté\"\n    },\n    \"drivetrain_remainingChargingTime\": {\n        \"transform\": undefined,\n        \"translation\": \"Temps de charge restant\"\n    },\n    \"drivetrain_lastChargeEndingPower\": {\n        \"transform\": kwh,\n        \"translation\": \"Puissance finale lors de la dernière charge\"\n    },\n    \"drivetrain_totalBatteryCapacity\": {\n        \"transform\": kwh,\n        \"translation\": \"Puissance totale de la batterie\"\n    },\n    \"location_speed\": {\n        \"transform\": undefined,\n        \"translation\": \"Vitesse\"\n    },\n    \"location_latitude\": {\n        \"transform\": undefined,\n        \"translation\": \"Latitude\"\n    },\n    \"location_longitude\": {\n        \"transform\": undefined,\n        \"translation\": \"Longitude\"\n    },\n    \"latitude\": {\n        \"transform\": false,\n        \"translation\": \"Latitude\"\n    },\n    \"longitude\": {\n        \"transform\": false,\n        \"translation\": \"Longitude\"\n    },\n    \"info_brand\": {\n        \"transform\": undefined,\n        \"translation\": \"Marque\"\n    },\n    \"info_model\": {\n        \"transform\": undefined,\n        \"translation\": \"Modèle\"\n    },\n    \"info_year\": {\n        \"transform\": undefined,\n        \"translation\": \"Année\"\n    },\n    \"info_series\": {\n        \"transform\": undefined,\n        \"translation\": \"Série\"\n    },\n    \"info_color\": {\n        \"transform\": undefined,\n        \"translation\": \"Couleur\"\n    },\n    \"info_configuration\": {\n        \"transform\": undefined,\n        \"translation\": \"Configuration\"\n    },\n    \"lastMessage_title\": {\n        \"transform\": undefined,\n        \"translation\": \"Titre du message\"\n    }, \"lastMessage_messageTime\": {\n        \"transform\": time,\n        \"translation\": \"Date du message\"\n    }, \"lastMessage_sender\": {\n        \"transform\": undefined,\n        \"translation\": \"Expéditeur du message\"\n    }, \"lastMessage_content\": {\n        \"transform\": undefined,\n        \"translation\": \"Contenu du message\"\n    }, \"refresh_lastVehicleState\": {\n        \"transform\": time,\n        \"translation\": \"Date du dernier status du véhicule\"\n    }, \"refresh_lastChargeState\": {\n        \"transform\": time,\n        \"translation\": \"Date du dernier status de charge\"\n    }\n    , \"refresh_lastActivity\": {\n        \"transform\": time,\n        \"translation\": \"Date de la dernière activité\"\n    }\n    , \"refresh_mode\": {\n        \"transform\": undefined,\n        \"translation\": \"Mode d'actualisation\"\n    }\n    , \"refresh_lastError\": {\n        \"transform\": time,\n        \"translation\": \"Date de la dernière erreur\"\n    }\n    , \"drivetrain_durationToSOCTarget\": {\n        \"transform\": (v) => Math.floor(v) + 'h ' + Math.floor((v - Math.floor(v)) * 60) + 'mn',\n        \"translation\": \"Nombre d'heure pour recharger\"\n    }\n    , \"drivetrain_priceToSOCTarget\": {\n        \"transform\": CURRENCY,\n        \"translation\": \"Coût pour recharger\"\n    }\n    , \"drivetrain_restToSOCTarget\": {\n        \"transform\": kwh,\n        \"translation\": \"Puissance à charger\"\n    }\n    , \"drivetrain_range\": {\n        \"transform\": 'Km',\n        \"translation\": \"Autonomie restante\"\n    }\n    , \"drivetrain_chargeCurrentLimit\": {\n        \"transform\": undefined,\n        \"translation\": \"Ampérage maximale autorisé\"\n    },\n    \"climate_heatedSeatsFrontLeftLevel\": {\n        \"transform\": undefined,\n        \"translation\": \"Siége chauffant gauche\"\n    },\n    \"climate_heatedSeatsFrontRightLevel\": {\n        \"transform\": undefined,\n        \"translation\": \"Siége chauffant droit\"\n    },\n    \"drivertrain_batteryHeating\": {\n        \"transform\": undefined,\n        \"translation\": \"Préchauffage de la batterie\"\n    },\n    \"language\": {\n        \"translation\": \"Langue\"\n    },\n    \"clean\": {\n        \"translation\": \"N\"\n    },\n    \"current\": {\n        \"translation\": \"A\"\n    },\n    \"daily\": {\n        \"translation\": \"Journalier\"\n    },\n    \"weekly\": {\n        \"translation\": \"Hebdo\"\n    },\n    \"monthly\": {\n        \"translation\": \"Mensuel\"\n    },\n    \"from\": {\n        \"translation\": \"Depuis\"\n    },\n    \"to\": {\n        \"translation\": \"Jusqu'au\"\n    },\n    \"validate\": {\n        \"translation\": \"\"\n    },\n    \"pressure\": {\n        \"translation\": \"Pression des pneus (bar)\"\n    },\n    \"consumption\": {\n        \"translation\": \"Consommation\"\n    },\n    \"cost\": {\n        \"translation\": \"Coût\"\n    },\n    \"monthly_consumption\": {\n        \"translation\": \"Consommation mensuelle\"\n    },\n    \"monthly_cost\": {\n        \"translation\": \"Coût mensuel\"\n    },\n    \"monthly_mileage\": {\n        \"translation\": \"Kilométrage mensuel\"\n    },\n    \"charge_date\": {\n        \"translation\": \"Date de charge\"\n    },\n    \"charge_soc\": {\n        \"translation\": \"SOC ajouté\"\n    },\n    \"charge_loss\": {\n        \"translation\": \"perte\"\n    },\n    \"charge_price\": {\n        \"translation\": \"Prix (hc-bleu)\"\n    }\n    ,\n    \"average\": {\n        \"translation\": \"moy.\"\n    },\n    \"currency\": {\n        \"translation\": CURRENCY\n    },\n    \"off\": {\n        \"translation\": \"Arrêté\"\n    },\n    \"on\": {\n        \"translation\": \"Actif\"\n    },\n    \"blowingOnly\": {\n        \"translation\": \"Dégivrage \"\n    },\n    \"front\": {\n        \"translation\": \"Dégivrage av.\"\n    },\n    \"warning_title\": {\n        \"translation\": \"MG configuration\"\n    },\n    \"warning_description_before\": {\n        \"translation\": \"Voulez-vous affecter à \"\n    },\n    \"warning_description_middle\": {\n        \"translation\": \", la valeur \"\n    },\n    \"warning_description_after\": {\n        \"translation\": \"?\"\n    }\n}\n\nmsg.actionTime=time;\n\n/* Manage Electricy pricing\n    Please implement:\n    msg.getLoss\n    msg.getPriceBykwh\n    msg.getPowerByHour \n    global.get('saic').gateway.drivetrain_restToSOCTarget\n    global.get('saic').gateway.drivetrain_durationToSOCTarget \n    global.get('saic').gateway.drivetrain_priceToSOCTarget\n\n*/\nconst DEFAULT_PRICE = 'tarif_edf_tempo_bleu_hc'\nif (global.get('saic').gateway && global.get('edf').pricing && global.get('edf').pricing[DEFAULT_PRICE] && global.get('edf').pricing['tarif_edf_tempo_bleu_hc'].initial) {\n\n    msg.getLoss = () => 0 //35 / 100\n\n\n    msg.getPriceBykwh = (kwh) => {\n        const LOSS = 1 + msg.getLoss()\n        return kwh * global.get('edf').pricing[DEFAULT_PRICE].initial * LOSS\n    }\n\n    msg.getPowerByHour = (ampere = 9.9) => {\n        // 220 V * 9.9 A\n        return ampere * 220\n\n    }\n    global.get('saic').gateway.drivetrain_restToSOCTarget = (global.get('saic').gateway.drivetrain_totalBatteryCapacity * global.get('saic').gateway.drivetrain_socTarget / 100 - global.get('saic').gateway.drivetrain_soc_kwh).toFixed(2)\n    global.get('saic').gateway.drivetrain_durationToSOCTarget = (global.get('saic').gateway.drivetrain_restToSOCTarget / msg.getPowerByHour()).toFixed(1)\n    global.get('saic').gateway.drivetrain_priceToSOCTarget = (msg.getPriceBykwh(global.get('saic').gateway.drivetrain_restToSOCTarget)).toFixed(2)\n}\n\n\nreturn msg;\n","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":520,"y":280,"wires":[["283017ef5bd81f39"]]},{"id":"88432ef352e5edbb","type":"function","z":"cc759b59f1b564bf","name":"status","func":"msg.payload = { \"fill\": \"green\", \"shape\": \"ring\", \"text\":global.get(\"saic\").language}\nreturn msg;","outputs":1,"timeout":0,"noerr":0,"initialize":"","finalize":"","libs":[],"x":930,"y":380,"wires":[[]]},{"id":"52a6361bebaf6518","type":"function","z":"cc759b59f1b564bf","name":"actionES","func":"\nreturn msg;\n","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":520,"y":160,"wires":[["283017ef5bd81f39"]]},{"id":"34b59e6388f9bd44","type":"subflow","name":"translateFx","info":"","category":"","in":[{"x":380,"y":200,"wires":[{"id":"a33e820e1d67b046"}]}],"out":[{"x":700,"y":200,"wires":[{"id":"a33e820e1d67b046","port":0}]}],"env":[],"meta":{},"color":"#DDAA99"},{"id":"a33e820e1d67b046","type":"function","z":"34b59e6388f9bd44","name":"translate","func":"const EXCEPTION = ['climate_remoteClimateState']\nmsg.label = msg.translate(msg.key)\nif(!msg.payload) msg.payload = global.get(\"saic\").gateway[msg.key]\n\nif (msg.payload === 'off' && !EXCEPTION.includes(msg.key)) msg.payload = false\nif (msg.payload === 'on' && !EXCEPTION.includes(msg.key)) msg.payload = true\nreturn msg;","outputs":1,"timeout":0,"noerr":0,"initialize":"","finalize":"","libs":[],"x":540,"y":200,"wires":[[]]},{"id":"508cc9124d7eeab6","type":"subflow","name":"convertConsumptionFx","info":"","category":"","in":[{"x":500,"y":320,"wires":[{"id":"dcde2b4736ef4c24"}]}],"out":[{"x":780,"y":320,"wires":[{"id":"dcde2b4736ef4c24","port":0}]}],"env":[],"meta":{},"color":"#DDAA99"},{"id":"dcde2b4736ef4c24","type":"function","z":"508cc9124d7eeab6","name":"convert","func":"const SERIES = [\"drivetrain_consumption\"]\n// Sometimes data has no sense\n/*const LIMIT_LOW = 10\nlet LIMIT_HIGH = 30\nif (msg.topic.indexOf('0, 8') > -1) {\n    LIMIT_HIGH = 3000\n}*/\n\nlet payload = msg.payload\n//node.warn(payload)\nlet data = SERIES.map(m => msg.payload.map(n => n.mileage_max - n.mileage_min===0?0: n.soc_kwh / (n.mileage_max - n.mileage_min) * 100))\nlet dataKm = SERIES.map(m => msg.payload.map(n => (n.mileage_max - n.mileage_min)))\nlet labels = payload.map(m => m.timestamp)\n//node.warn(data)\n//let indexToRemove = []\n/*data[0].forEach((f, i) => {\n    if (f < LIMIT_LOW || f > LIMIT_HIGH) {\n        indexToRemove.push(i)\n    }\n})*/\n\n//labels = labels.filter((f, i) => !indexToRemove.includes(i))\n//data = data.map(m => m.filter((f, i) => !indexToRemove.includes(i)))\n\n//if (data[0].length !== labels.length) node.error(\"Taille différente de liste\")\nconst average = data.flat().filter(f=> f>0).reduce((a, b) => parseFloat(a) + parseFloat(b), 0) / data.flat().filter(f=> f>0).length\nconst averageKm = dataKm.flat().filter(f=> f>0).reduce((a, b) => parseFloat(a) + parseFloat(b), 0) / dataKm.flat().filter(f=> f>0).length\nmsg.payload = [{\n    \"series\": [`${msg.translate('consumption')} - ${msg.translate('average')} : ${average.toFixed(1)} kWh/100 km`],\n    \"data\": data.map(m => m.map(n => n.toFixed(1))),\n    \"labels\": labels,\n}]\n\nmsg.km = [{\n    \"series\": [`${msg.translate('drivetrain_mileage')} - ${msg.translate('average')}: ${averageKm.toFixed(1)} km`],\n    \"data\": dataKm.map(m => m.map(n => n.toFixed(1))),\n    \"labels\": labels,\n}]\n\nif (global.get('edf').pricing) {\n    const costs = data.map(m => m.map(r => msg.getPriceBykwh(parseFloat(r)).toFixed(1)))\n    const averageCost = costs.flat().filter(f=> f>0).reduce((a, b) => parseFloat(a) + parseFloat(b), 0) / costs.flat().filter(f=> f>0).length\n\n    msg.cost = [{\n        \"series\": [`${msg.translate('cost')} - ${msg.translate('average')}: ${averageCost.toFixed(1)} ${msg.translate('currency')}/100 km`],\n        \"data\": costs,\n        \"labels\": labels,\n    }]\n}\ndelete msg.topic\ndelete msg.action\n\nreturn msg;","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":640,"y":320,"wires":[[]]},{"id":"f83f9fc08f5e66d7","type":"subflow","name":"MGDB","info":"","category":"","in":[{"x":500,"y":200,"wires":[{"id":"38ed6a5fa6871842"}]}],"out":[{"x":980,"y":200,"wires":[{"id":"38ed6a5fa6871842","port":0}]}],"env":[],"meta":{},"color":"#DDAA99"},{"id":"38ed6a5fa6871842","type":"sqlite","z":"f83f9fc08f5e66d7","mydb":"799e85c6a93a19ad","sqlquery":"msg.topic","sql":"","name":"MG database","x":760,"y":200,"wires":[[]]},{"id":"799e85c6a93a19ad","type":"sqlitedb","z":"f83f9fc08f5e66d7","db":"mg.db","mode":"RWC"},{"id":"7cf6ee7ab0891d5c","type":"subflow","name":"MGInFx","info":"","category":"","in":[{"x":260,"y":260,"wires":[{"id":"f0acb1890ca94018"}]}],"out":[{"x":1080,"y":260,"wires":[{"id":"6770036c3a166587","port":0}]}],"env":[],"meta":{},"color":"#DDAA99"},{"id":"6770036c3a166587","type":"json","z":"7cf6ee7ab0891d5c","name":"","property":"payload","action":"obj","pretty":false,"x":670,"y":260,"wires":[[]]},{"id":"f0acb1890ca94018","type":"subflow:f83f9fc08f5e66d7","z":"7cf6ee7ab0891d5c","name":"","x":450,"y":260,"wires":[["6770036c3a166587","958f6e2298473bb4"]]},{"id":"958f6e2298473bb4","type":"debug","z":"7cf6ee7ab0891d5c","d":true,"name":"debug 69","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","statusVal":"","statusType":"auto","x":1020,"y":360,"wires":[]},{"id":"94975f0123611419","type":"subflow","name":"tableFormatFx","info":"","category":"","in":[{"x":320,"y":200,"wires":[{"id":"b71dc036ccc52791"}]}],"out":[{"x":640,"y":200,"wires":[{"id":"b71dc036ccc52791","port":0}]}],"env":[],"meta":{},"color":"#DDAA99"},{"id":"b71dc036ccc52791","type":"function","z":"94975f0123611419","name":"tableFormat","func":"\nfunction flat(o, tmp) {\n    let keys = Object.keys(o);\n    for (let key in keys) {\n        let originalK = keys[key]\n        let originalV = o[keys[key]]\n        let value = originalV\n        if (typeof value === 'object' && value !== null) {\n            flat(o[keys[key]], tmp)\n        } else {\n            let k, v\n            if (msg.action[keys[key]]) {\n                //Definition\n\n                //Value\n                let transform = msg.action[keys[key]].transform\n                if (transform === false) {\n                    v = undefined\n                    //node.warn(keys[key] + ' ignoré')\n                }\n                else if (!transform) {\n                    v = value\n                    //node.warn(keys[key] + ' tel quel')\n                }\n                else if (typeof transform === 'string' || transform instanceof String) {\n                    v = o[keys[key]] + ' ' + transform\n                    //node.warn(keys[key] + ' unité')\n                } else {\n                    //node.warn(keys[key] + ' conversion')\n                    v = transform(o[keys[key]])\n                }\n                //Key\n                k = keys[key]\n                if (msg.action[keys[key]] && msg.action[keys[key]].translation && msg.action[keys[key]].translation.length > 0) {\n                    k = msg.action[keys[key]].translation\n                }\n            } else {\n                //Default\n                k = keys[key]\n                v = o[keys[key]]\n            }\n            let row = { \"key\": k, \"originalK\": originalK, \"value\": v, \"originalV\": originalV }\n\n            if (v) tmp.push(row);\n        }\n\n    }\n}\n\nvar tmp = [];\nif (global.get('saic').gateway && Object.keys(global.get('saic').gateway).length > 0) {\n\n    flat(global.get('saic').gateway, tmp)\n\n    msg.payload = tmp.sort((a, b) => {\n        if (a.originalK < b.originalK) {\n            return -1;\n        }\n        if (a.originalK > b.originalK) {\n            return 1;\n        }\n        return 0;\n    });\n\n    const category = [\"info\", \"refresh\", 'climate', 'drivetrain', 'location', 'windows', 'doors', 'tyres', 'lights']\n    category.forEach(c => {\n        msg[c] = tmp.filter(f => f.originalK.startsWith(c)).sort((a, b) => {\n            if (a.key < b.key) {\n                return -1;\n            }\n            if (a.key > b.key) {\n                return 1;\n            }\n            return 0;\n        })\n    })\n}\nreturn msg;","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":490,"y":200,"wires":[[]]},{"id":"ab15ca25fb016f10","type":"tab","label":"Dash-MG4","disabled":false,"info":"","env":[]},{"id":"482144536de7156b","type":"junction","z":"ab15ca25fb016f10","x":2090,"y":1080,"wires":[["5dcc3e9a40a8a30a","2f6cc945037ebff5","5c5607806ef72b83","7e7e515f0ea06a8a","a2676ef2c5eadcb6","92f5325539d5e0ca","dd936499b4be0225","63bd6e8b0e5cdc66","afeae3221618e4cd","c6b0ba6d81d9ca7d","db5de115ba2f855e","eefcfb4d121a1167"]]},{"id":"90032e79edd41703","type":"junction","z":"ab15ca25fb016f10","x":3570,"y":980,"wires":[[]]},{"id":"357c69da8648f436","type":"junction","z":"ab15ca25fb016f10","x":2940,"y":960,"wires":[["d5b6b02e2631fd92"]]},{"id":"d070dcb1b29d3078","type":"junction","z":"ab15ca25fb016f10","x":100,"y":380,"wires":[["821470b5181d2145","fca0d70265f5d261","677f68cd9e0cf116","a2b5e885f970e155","09633dc922f8ed80","59ead8467f4706b9","6a5ee124c0889de2","755ed15aad6588a4"]]},{"id":"6071c4716e763e7c","type":"junction","z":"ab15ca25fb016f10","x":220,"y":720,"wires":[["5cc9edd42ab567bc"]]},{"id":"71a472da6ba2be61","type":"ui_worldmap","z":"ab15ca25fb016f10","group":"6472389d15f1336f","order":9,"width":18,"height":11,"name":"","lat":"","lon":"","zoom":"17","layer":"EsriS","cluster":"","maxage":"","usermenu":"hide","layers":"show","panit":"true","panlock":"false","zoomlock":"false","hiderightclick":"true","coords":"none","showgrid":"false","showruler":"false","allowFileDrop":"false","path":"/worldmap","overlist":"TL","maplist":"OSMC,EsriC,EsriS","mapname":"","mapurl":"","mapopt":"","mapwms":false,"x":1460,"y":360,"wires":[]},{"id":"af5ed0d285ca9e39","type":"function","z":"ab15ca25fb016f10","name":"map","func":"//https://icons8.com/icons/set/electric-vehicle\nconst POSITIONS = msg.payload\nconst LAYER = 'Vehicles'\n\nmsg.payload = { \"command\": { \"clear\": LAYER } }\nnode.send(msg)\nif (POSITIONS) {\n    for (let index = 0; index < POSITIONS.length; index++) {\n        const gradientArray = new Gradient()\n            .setColorGradient(\"#F8F01C\", \"#5EFBEE\", \"#78F681\", \"#A80909\")\n            .setMidpoint(POSITIONS.length)\n            .getColors();\n        let date = new Date(POSITIONS[index].timestamp).toLocaleString('fr-FR').split(\" \")\n        let color = gradientArray[index]\n\n        let tmp = {\n            \"name\": `Le ${date[0]} à ${date[1]}`,\n            \"layer\": LAYER,\n            \"lat\": POSITIONS[index].location_latitude,\n            \"lon\": POSITIONS[index].location_longitude,\n            \"icon\": 'globe',//\"https://img.icons8.com/officexs/20/map-marker.png\",\n            \"iconColor\": `${color}`,\n            //    \"iconSize\": 1\n        }\n\n        if (index === POSITIONS.length - 1) {\n            //tmp.speed = global.get('saic').gateway.location_speed\n            tmp.icon = \"https://img.icons8.com/external-soft-fill-juicy-fish/80/external-electric-electric-vehicles-soft-fill-soft-fill-juicy-fish-3.png\"\n            tmp.iconSize = 80\n            //tmp.track = true,\n            //tmp.accuracy = true,\n            tmp.command = {\n                \"fit\": true,\n                \"fly\": true,\n                \"zoom\": msg.zoom || 17,\n                \"panit\": true,\n                // \"map\": {\n                //     \"minimap\": \"OSM\",\n                //     \"opt\": {\n                //         toggleDisplay: true\n                //     }>\n                // }\n            }\n        }\n        msg.payload = tmp\n        node.send(msg);\n    }\n}","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[{"var":"Gradient","module":"javascript-color-gradient"}],"x":1310,"y":360,"wires":[["71a472da6ba2be61"]]},{"id":"71696372707df2b5","type":"ui_table","z":"ab15ca25fb016f10","group":"734cb7f669648776","name":"Info","order":1,"width":9,"height":4,"columns":[{"field":"key","title":"","width":"270","align":"left","formatter":"plaintext","formatterParams":{"target":"_blank"}},{"field":"value","title":"","width":"200","align":"left","formatter":"plaintext","formatterParams":{"target":"_blank"}}],"outputs":0,"cts":false,"x":1270,"y":680,"wires":[]},{"id":"3b715bc2401b5450","type":"ui_svg_graphics","z":"ab15ca25fb016f10","group":"51eafba7.ffc054","order":3,"width":20,"height":11,"svgString":"<svg xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" width=\"100%\" height=\"97%\"\n    viewBox=\"90 120 800 550\" preserveAspectRatio=\"xMinYMin meet\">\n    <defs id=\"svgEditorDefs\">\n        <style type=\"text/css\">\n            .svg_text_unselect {\n                -moz-user-select: none;\n                -webkit-user-select: none;\n                -ms-user-select: none;\n            }\n        </style>\n        <style class=\"darkreader darkreader--sync\" media=\"screen\" />\n    </defs>\n    <g id=\"svgEditorBackgroundLayer\">\n        <image id=\"svgEditorBackgroundImage\" x=\"0\" y=\"0\" width=\"1199\" height=\"799\"\n            xlink:href=\"data:image/webp;base64,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\"\n            preserveAspectRatio=\"xMidYMid meet\" />\n        <rect id=\"svgEditorBackground\" x=\"0\" y=\"0\" width=\"1199\" height=\"799\"\n            style=\"fill:none;stroke:none;--darkreader-inline-fill:none;--darkreader-inline-stroke:none\"\n            data-darkreader-inline-fill=\"\" data-darkreader-inline-stroke=\"\" />\n    </g>\n    <circle id=\"doors_driver\" cx=\"595\" cy=\"243\"\n        style=\"fill: rgb(255, 0, 0); stroke: black; --darkreader-inline-fill: #d62828; --darkreader-inline-stroke: #e2e1df; stroke-width: 1px;fill:none;\"\n        data-darkreader-inline-fill=\"\" data-darkreader-inline-stroke=\"\" r=\"18.5393\" />\n    <circle id=\"doors_passenger\" cx=\"603\" cy=\"574\"\n        style=\"fill: rgb(255, 0, 0); stroke: black; --darkreader-inline-fill: #d62828; --darkreader-inline-stroke: #e2e1df; stroke-width: 1px;fill:none;\"\n        data-darkreader-inline-fill=\"\" data-darkreader-inline-stroke=\"\" r=\"18.5393\" />\n    <circle id=\"doors_rearRight\" cx=\"396\" cy=\"571\"\n        style=\"fill: rgb(255, 0, 0); stroke: black; --darkreader-inline-fill: #d62828; --darkreader-inline-stroke: #e2e1df; stroke-width: 1px;fill:none;\"\n        data-darkreader-inline-fill=\"\" data-darkreader-inline-stroke=\"\" r=\"18.5393\" />\n    <circle id=\"doors_rearLeft\" cx=\"399\" cy=\"244\"\n        style=\"fill: rgb(255, 0, 0); stroke: black; --darkreader-inline-fill: #d62828; --darkreader-inline-stroke: #e2e1df; stroke-width: 1px;fill:none;\"\n        data-darkreader-inline-fill=\"\" data-darkreader-inline-stroke=\"\" r=\"18.5393\" />\n\n    <circle id=\"doors_bonnet\" cx=\"972\" cy=\"410\"\n        style=\"fill: rgb(255, 0, 0); stroke: black; --darkreader-inline-fill: #d62828; --darkreader-inline-stroke: #e2e1df; stroke-width: 1px;fill:none;\"\n        data-darkreader-inline-fill=\"\" data-darkreader-inline-stroke=\"\" r=\"18.5393\" />\n    <circle id=\"doors_locked\" cx=\"713\" cy=\"291\"\n        style=\"fill: rgb(255, 0, 0); stroke: black; --darkreader-inline-fill: #d62828; --darkreader-inline-stroke: #e2e1df; stroke-width: 1px;fill:none;\"\n        data-darkreader-inline-fill=\"\" data-darkreader-inline-stroke=\"\" r=\"12.8824\" />\n    <circle id=\"lights_dippedBeam\" cx=\"929.853\" cy=\"544.574\"\n        style=\"fill: rgb(255, 0, 0); stroke: black; --darkreader-inline-fill: #d62828; --darkreader-inline-stroke: #e2e1df; stroke-width: 1px;fill:none;\"\n        data-darkreader-inline-fill=\"\" data-darkreader-inline-stroke=\"\" r=\"7.89462\" />\n    <circle id=\"lights_mainBeam\" cx=\"950\" cy=\"296\"\n        style=\"fill: rgb(255, 0, 0); stroke: black; --darkreader-inline-fill: #d62828; --darkreader-inline-stroke: #e2e1df; stroke-width: 1px;fill:none;\"\n        data-darkreader-inline-fill=\"\" data-darkreader-inline-stroke=\"\" r=\"12.8824\" />\n    <rect x=\"871\" y=\"360\"\n        style=\"fill: rgb(255, 0, 0); stroke: black; --darkreader-inline-fill: #d62828; --darkreader-inline-stroke: #e2e1df; stroke-width: 1px;fill:none;\"\n        id=\"drivetrain_running\" data-darkreader-inline-fill=\"\" data-darkreader-inline-stroke=\"\" width=\"38\"\n        height=\"84\" /><text\n        style=\"fill:black;font-family:Arial;font-weight:bold;font-size:30px;--darkreader-inline-fill:#e2e1df\" x=\"370\"\n        y=\"377\" id=\"climate_interiorTemperature\" data-darkreader-inline-fill=\"\" textLength=\"103\" /><text\n        style=\"fill:black;font-family:Arial;font-size:20px;--darkreader-inline-fill:#e2e1df\" x=\"403\" y=\"132\"\n        id=\"e8_texte\" data-darkreader-inline-fill=\"\" />\n    <text style=\"fill:black;font-family:Arial;font-size:20px;--darkreader-inline-fill:#e2e1df\" x=\"429\" y=\"339\"\n        id=\"e9_texte\" data-darkreader-inline-fill=\"\" /><text\n        style=\"fill:black;font-family:Arial;font-size:20px;--darkreader-inline-fill:#e2e1df\" x=\"455\" y=\"346\"\n        id=\"e11_texte\" data-darkreader-inline-fill=\"\" />\n    <text style=\"fill:black;font-family:Arial;font-size:30px;--darkreader-inline-fill:#e2e1df;font-weight:bold\" x=\"370\"\n        y=\"634\" id=\"climate_exteriorTemperature\" data-darkreader-inline-fill=\"\" textLength=\"103\">0°C</text><text\n        style=\"fill:black;font-family:Arial;font-size:20px;--darkreader-inline-fill:#e2e1df\" x=\"440\" y=\"625\"\n        id=\"e12_texte\" data-darkreader-inline-fill=\"\" />\n    <text style=\"fill:black;font-family:Arial;font-size:20px;--darkreader-inline-fill:#e2e1df;font-weight:bold\" x=\"280\"\n        y=\"580\" id=\"tyres_rearRightPressure\" data-darkreader-inline-fill=\"\" textLength=\"70\" xml:space=\"preserve\">0\n        bar</text><text\n        style=\"fill:black;font-family:Arial;font-size:20px;--darkreader-inline-fill:#e2e1df;font-weight:bold\" x=\"800\"\n        y=\"580\" id=\"tyres_frontRightPressure\" data-darkreader-inline-fill=\"\" textLength=\"70\" xml:space=\"preserve\">0\n        bar</text><text\n        style=\"fill:#000000;font-family:Arial;font-size:20px;--darkreader-inline-fill:#e2e1df;font-weight:bold\" x=\"280\"\n        y=\"240\" id=\"tyres_rearLeftPressure\" data-darkreader-inline-fill=\"\" textLength=\"70\" xml:space=\"preserve\">0\n        bar</text>\n    <circle id=\"windows_driver\" cx=\"651\" cy=\"270\"\n        style=\"fill: rgb(255, 0, 0); stroke: black; --darkreader-inline-fill: #d62828; --darkreader-inline-stroke: #e2e1df; stroke-width: 1px;fill:none;\"\n        data-darkreader-inline-fill=\"\" data-darkreader-inline-stroke=\"\" r=\"12.8824\" />\n    <circle id=\"windows_passenger\" cx=\"654\" cy=\"549\"\n        style=\"fill: rgb(255, 0, 0); stroke: black; --darkreader-inline-fill: #d62828; --darkreader-inline-stroke: #e2e1df; stroke-width: 1px;fill:none;\"\n        data-darkreader-inline-fill=\"\" data-darkreader-inline-stroke=\"\" r=\"12.8824\" />\n    <circle id=\"windows_rearLeft\" cx=\"480\" cy=\"272\"\n        style=\"fill: rgb(255, 0, 0); stroke: black; --darkreader-inline-fill: #d62828; --darkreader-inline-stroke: #e2e1df; stroke-width: 1px;fill:none;\"\n        data-darkreader-inline-fill=\"\" data-darkreader-inline-stroke=\"\" r=\"12.8824\" />\n    <circle id=\"windows_rearRight\" cx=\"482\" cy=\"543\"\n        style=\"fill: rgb(255, 0, 0); stroke: black; --darkreader-inline-fill: #d62828; --darkreader-inline-stroke: #e2e1df; stroke-width: 1px;fill:none;\"\n        data-darkreader-inline-fill=\"\" data-darkreader-inline-stroke=\"\" r=\"12.8824\" /><text\n        style=\"fill:black;font-family:Arial;font-size:20px;--darkreader-inline-fill:#e2e1df;font-weight:bold\"\n        x=\"634.254\" y=\"415.172\" id=\"climate_remoteTemperature\" data-darkreader-inline-fill=\"\"\n        textLength=\"50\">0°C</text><text\n        style=\"fill:black;font-family:Arial;font-size:20px;font-weight:bold;--darkreader-inline-fill:#e2e1df;font-weight:bold\"\n        x=\"800\" y=\"240\" id=\"tyres_frontLeftPressure\" data-darkreader-inline-fill=\"\" textLength=\"70\"\n        xml:space=\"preserve\">0 bar</text>\n    <text\n        style=\"fill:black;font-family:Arial;font-size:20px;--darkreader-inline-fill:#e2e1df;font-weight:bold;font-style:italic\"\n        x=\"824.162\" y=\"303.525\" id=\"drivetrain_auxiliaryBatteryVoltage\" data-darkreader-inline-fill=\"\" textLength=\"49\"\n        xml:space=\"preserve\">0 V</text>\n    <text style=\"fill:#000000;font-family:Arial;font-size:30px;--darkreader-inline-fill:#e2e1df;font-weight:bold\"\n        x=\"203.955\" y=\"197.749\" id=\"drivetrain_mileage\" data-darkreader-inline-fill=\"\" textLength=\"211.875\"\n        xml:space=\"preserve\">0 km</text>\n    <text style=\"fill:#000000;font-family:Arial;font-size:30px;--darkreader-inline-fill:#e2e1df;font-weight:bold\"\n        x=\"864.224\" y=\"204.156\" id=\"drivetrain_soc\" data-darkreader-inline-fill=\"\" textLength=\"109.587\"\n        xml:space=\"preserve\">0 %</text>\n    <text\n        style=\"fill:black;font-family:Arial;font-size:15px;--darkreader-inline-fill:#e2e1df;font-weight:bold;font-style:italic\"\n        x=\"746.233\" y=\"335.896\" id=\"drive_power\" data-darkreader-inline-fill=\"\" textLength=\"49\"\n        xml:space=\"preserve\">0</text>\n    <text style=\"fill:#000000;font-family:Arial;font-size:20px;--darkreader-inline-fill:#e2e1df;font-weight:bolder\"\n        x=\"598.826\" y=\"142.789\" id=\"info_model\" data-darkreader-inline-fill=\"\" textLength=\"124.085\"\n        xml:space=\"preserve\">EH32</text><text\n        style=\"fill:#000000;font-family:Arial;font-size:20px;--darkreader-inline-fill:#e2e1df;font-weight:bolder\"\n        x=\"392.889\" y=\"140.091\" id=\"info_year\" data-darkreader-inline-fill=\"\" textLength=\"70.5804\"\n        xml:space=\"preserve\">2023</text>\n    <text style=\"fill:#000000;font-family:Arial;font-size:20px;--darkreader-inline-fill:#e2e1df;font-weight:bolder\"\n        x=\"281.18\" y=\"142.677\" id=\"info_brand\" data-darkreader-inline-fill=\"\" textLength=\"47.7621\"\n        xml:space=\"preserve\">MG</text>\n    <text style=\"fill:#000000;font-family:Arial;font-size:20px;--darkreader-inline-fill:#e2e1df;font-weight:bolder\"\n        x=\"828.654\" y=\"142.713\" id=\"info_color\" data-darkreader-inline-fill=\"\" textLength=\"127.529\"\n        xml:space=\"preserve\">white</text>\n    <text\n        style=\"fill:black;font-family:Arial;font-size:10px;--darkreader-inline-fill:#e2e1df;font-weight:bold;font-style:italic\"\n        x=\"210.321\" y=\"648.211\" id=\"refresh_lastVehicleState\" data-darkreader-inline-fill=\"\" textLength=\"116.594\"\n        xml:space=\"preserve\">0</text><text\n        style=\"fill:black;font-family:Arial;font-size:10px;--darkreader-inline-fill:#e2e1df;font-weight:bold;font-style:italic\"\n        x=\"821.765\" y=\"648.211\" id=\"lastMessage_messageTime\" data-darkreader-inline-fill=\"\" textLength=\"123.787\"\n        xml:space=\"preserve\">0</text>\n    <circle id=\"climate_rearWindowDefrosterHeating\" cx=\"266.615\" cy=\"406.906\"\n        style=\"fill: rgb(255, 0, 0); stroke: black; --darkreader-inline-fill: #d62828; --darkreader-inline-stroke: #e2e1df; stroke-width: 1px;fill:none;\"\n        data-darkreader-inline-fill=\"\" data-darkreader-inline-stroke=\"\" r=\"12.8824\" />\n    <circle id=\"doors_boot\" cx=\"204.285\" cy=\"405.319\"\n        style=\"stroke:black;--darkreader-inline-fill:#d62828;--darkreader-inline-stroke:#e2e1df;stroke-width:1px;fill:none\"\n        data-darkreader-inline-fill=\"\" data-darkreader-inline-stroke=\"\" r=\"18.5393\" />\n    <text\n        style=\"fill:black;font-family:Arial;font-size:10px;--darkreader-inline-fill:#e2e1df;font-weight:bold;font-style:italic\"\n        x=\"569.694\" y=\"647.028\" id=\"lastMessage_title\" data-darkreader-inline-fill=\"\" textLength=\"230\"\n        xml:space=\"preserve\">0</text>\n    <circle id=\"climate_remoteClimateState\" cx=\"720\" cy=\"405\"\n        style=\"--darkreader-inline-fill:#d62828;--darkreader-inline-stroke:#e2e1df;stroke-width:1px;fill:none\"\n        data-darkreader-inline-fill=\"\" data-darkreader-inline-stroke=\"\" r=\"12\" />\n    <text\n        style=\"fill:black;font-family:Arial;font-size:14px;font-weight:bold;--darkreader-inline-fill:#e2e1df;font-weight:bold\"\n        x=\"720\" y=\"405\" id=\"climate_remoteClimateState\" data-darkreader-inline-fill=\"\" textLength=\"60\"\n        xml:space=\"preserve\"></text>\n\n</svg>","clickableShapes":[],"javascriptHandlers":[],"smilAnimations":[],"bindings":[{"selector":"","bindSource":"","bindType":"text","attribute":""}],"showCoordinates":false,"autoFormatAfterEdit":true,"showBrowserErrors":false,"showBrowserEvents":false,"enableJsDebugging":false,"sendMsgWhenLoaded":false,"noClickWhenDblClick":false,"outputField":"payload","editorUrl":"//drawsvg.org/drawsvg.html","directory":"","panning":"both","zooming":"disabled","panOnlyWhenZoomed":false,"doubleClickZoomEnabled":false,"mouseWheelZoomEnabled":false,"dblClickZoomPercentage":150,"cssString":"div.ui-svg svg{\n    color: var(--nr-dashboard-widgetColor);\n    fill: currentColor !important;\n}\ndiv.ui-svg path {\n    fill: inherit;\n}","name":"Top view ","x":1280,"y":1320,"wires":[[]]},{"id":"192a38eea9cdeff0","type":"function","z":"ab15ca25fb016f10","name":"top view","func":"let st = msg.payload\ndelete msg.topic\nfor (let index = 0; index < st.length; index++) {\n    const key = st[index].originalK;\n    const kUp = key.toUpperCase()\n    const value = st[index].value\n    const oValue = st[index].originalV\n    //node.warn(key)\n    //if (key === \"climate_remoteClimateState\") node.warn(value + \" \" + oValue)\n\n    if (typeof oValue === \"boolean\") {\n        msg.payload = {\n            \"command\": \"update_style\",\n            \"selector\": '#' + key,\n            \"attributeName\": \"fill\",\n            \"attributeValue\": oValue === true ? 'darkcyan' : 'darkred'\n        }\n\n    } else if (oValue === \"on\" || oValue === \"off\") {\n        msg.payload = {\n            \"command\": \"update_style\",\n            \"selector\": '#' + key,\n            \"attributeName\": \"fill\",\n            \"attributeValue\": oValue === 'on' ? 'darkcyan' : 'darkred'\n        }\n\n    } else if (kUp.indexOf('PRESSURE') > -1) {\n        msg.payload = {\n            \"command\": \"update_text\",\n            \"selector\": '#' + key,\n            \"textContent\": value\n        }\n        node.send(msg)\n        msg.payload = {\n            \"command\": \"update_style\",\n            \"selector\": '#' + key,\n            \"attributeName\": \"fill\",\n            \"attributeValue\": oValue > 60 ? 'darkcyan' : 'darkred'\n        }\n        node.send(msg)\n    }\n    else if (kUp.indexOf('TEMPERATURE') > -1) {\n        msg.payload = {\n            \"command\": \"update_text\",\n            \"selector\": '#' + key,\n            \"textContent\": value\n        }\n        node.send(msg)\n        msg.payload = {\n            \"command\": \"update_style\",\n            \"selector\": '#' + key,\n            \"attributeName\": \"fill\",\n            \"attributeValue\": oValue < 28 ? 'darkcyan' : 'darkred'\n        }\n        node.send(msg)\n    }\n    else if (kUp.indexOf('VOLTAGE') > -1) {\n        msg.payload = {\n            \"command\": \"update_text\",\n            \"selector\": '#' + key,\n            \"textContent\": value\n        }\n        node.send(msg)\n        msg.payload = {\n            \"command\": \"update_style\",\n            \"selector\": '#' + key,\n            \"attributeName\": \"fill\",\n            \"attributeValue\": oValue > 12.4 ? 'darkcyan' : 'darkred'\n        }\n        node.send(msg)\n        msg.payload = {\n            \"command\": \"update_style\",\n            \"selector\": '#' + key,\n            \"attributeName\": \"font-size\",\n            \"attributeValue\": 15\n        }\n        node.send(msg)\n    }\n    else if (kUp.indexOf('SOC') > -1) {\n        msg.payload = {\n            \"command\": \"update_text\",\n            \"selector\": '#' + key,\n            \"textContent\": value\n        }\n        node.send(msg)\n        msg.payload = {\n            \"command\": \"update_style\",\n            \"selector\": '#' + key,\n            \"attributeName\": \"fill\",\n            \"attributeValue\": oValue > 50 ? 'darkcyan' : 'darkred'\n        }\n        node.send(msg)\n    }\n    else {\n        msg.payload = {\n            \"command\": \"update_text\",\n            \"selector\": '#' + key,\n            \"textContent\": value\n        }\n    }\n    node.send(msg)\n\n}\n","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":1080,"y":1320,"wires":[["3b715bc2401b5450"]]},{"id":"a731e42158618715","type":"subflow:94975f0123611419","z":"ab15ca25fb016f10","name":"","x":760,"y":820,"wires":[["dbe83a055ef4f9fb","d63b72764ad0b5fb","4b7751c51955cb20","2645b6a4dd751351","65ab4d9c5982cbae","ec653576ae59490d","adc2cc7e95e7df68","7854bf3f206ea053"]]},{"id":"645a019413c7acd7","type":"mqtt in","z":"ab15ca25fb016f10","name":"","topic":"saic/_to_change_accountID_/vehicles/_to_change_vehiculeID_/#","qos":"2","datatype":"auto-detect","broker":"acbce132.6eef4","nl":false,"rap":true,"rh":0,"inputs":0,"x":260,"y":120,"wires":[["04201b3a75059494"]]},{"id":"04201b3a75059494","type":"function","z":"ab15ca25fb016f10","name":"convert","func":"/*\n{\"topic\":\"saic/_to_change_accountID_/vehicles/_to_change_vehiculeID_/lights/mainBeam\",\n\"payload\":false,\n\"qos\":0,\n\"retain\":false,\n\"_topic\":\"saic/_to_change_accountID_/vehicles/_to_change_vehiculeID_/lights/mainBeam\",\n\"_msgid\":\"c26de614c49f10df\"}\n*/\nfunction roundToNearest(date = new Date()) {\n    const minutes = 2;\n    const ms = 1000 * 60 * minutes;\n    //replace Math.round with Math.ceil to always round UP\n    return new Date(Math.round(date.getTime() / ms) * ms);\n}\n\nconst REF = [\n    \"location_latitude\",\n    \"location_longitude\",\n    \"tyres_frontLeftPressure\",\n    \"tyres_frontRightPressure\",\n    \"tyres_rearLeftPressure\",\n    \"tyres_rearRightPressure\",\n    \"drivetrain_auxiliaryBatteryVoltage\",\n    \"drivetrain_mileageSinceLastCharge\",\n    \"drivetrain_totalBatteryCapacity\",\n    \"drivetrain_mileage\",\n    \"drivetrain_mileageOfTheDay\",\n    \"drivetrain_soc_kwh\",\n    \"drivetrain_totalBatteryCapacity\",\n    \"drivetrain_lastChargeEndingPower\",\n    \"drivetrain_charging\",\n    \"climate_exteriorTemperature\"\n]\n\n\nif (!global.get(\"saic\") || typeof global.get(\"saic\") !== 'object') global.set(\"saic\", { \"gateway\": {} })\nif (!global.get(\"saic\").gateway) global.get(\"saic\").gateway = {}\n\nlet tab = msg.topic.split('/')\nlet k = tab[tab.length - 2] + '_' + tab[tab.length - 1]\nlet v = msg.payload\n\nif (k !== 'climate_remoteClimateState') {\n    switch (v) {\n        case 'True':\n        case 'on':\n            v = true;\n            break;\n        case 'False':\n        case 'off':\n            v = false\n            break;\n    }\n}\n\nif ((k.indexOf(\"Temperature\") > 1 - 1 && parseInt(v) > 60) || k.startsWith('configuration_')){\n     node.warn(k + ' ' +v);  \n}else{\n    //Remove Crazy temperature 89°C\n    global.get(\"saic\").gateway[k] = v\n}\n\n\n// node.warn(k + '->' + v)\nif (REF.includes(k)) {\n    //TO REMOVE\n    msg.keyDB = k\n    msg.payload = v\n\n    //RELATIONAL DATABASE\n    let t = k.split('_')[0]\n    let d = roundToNearest(new Date())\n    msg.topic = `INSERT INTO \"${t}\" (\"timestamp\", \"${k}\") VALUES (${d.getTime()}, ${v}) ON CONFLICT do UPDATE SET \"${k}\"=${v};`\n\n    node.send(msg);\n} else if (k.indexOf(\"result\") > 0) {\n    msg.error = true\n    global.get('saic').setError = { key: k, value: v, date:new Date() }\n    node.send(msg)\n} else {\n    //node.warn(k + '->' + v)\n}\n","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":590,"y":120,"wires":[["6e7ed7606a600f42"]]},{"id":"dd2ae9ddae7e41ab","type":"ui_table","z":"ab15ca25fb016f10","group":"734cb7f669648776","name":"Climate","order":4,"width":9,"height":4,"columns":[{"field":"key","title":"","width":"270","align":"left","formatter":"plaintext","formatterParams":{"target":"_blank"}},{"field":"value","title":"","width":"200","align":"left","formatter":"plaintext","formatterParams":{"target":"_blank"}}],"outputs":0,"cts":false,"x":1280,"y":720,"wires":[]},{"id":"89867fad86b8331a","type":"ui_table","z":"ab15ca25fb016f10","group":"734cb7f669648776","name":"Drive train","order":2,"width":11,"height":12,"columns":[{"field":"key","title":"","width":"370","align":"left","formatter":"plaintext","formatterParams":{"target":"_blank"}},{"field":"value","title":"","width":"200","align":"left","formatter":"plaintext","formatterParams":{"target":"_blank"}}],"outputs":0,"cts":false,"x":1290,"y":760,"wires":[]},{"id":"6790d7863572edc8","type":"ui_table","z":"ab15ca25fb016f10","group":"734cb7f669648776","name":"Windows","order":3,"width":9,"height":3,"columns":[{"field":"key","title":"","width":"270","align":"left","formatter":"plaintext","formatterParams":{"target":"_blank"}},{"field":"value","title":"","width":"200","align":"left","formatter":"plaintext","formatterParams":{"target":"_blank"}}],"outputs":0,"cts":false,"x":1280,"y":800,"wires":[]},{"id":"cbcfb1b214b048d4","type":"ui_table","z":"ab15ca25fb016f10","group":"734cb7f669648776","name":"Doors","order":6,"width":11,"height":4,"columns":[{"field":"key","title":"","width":"370","align":"left","formatter":"plaintext","formatterParams":{"target":"_blank"}},{"field":"value","title":"","width":"200","align":"left","formatter":"plaintext","formatterParams":{"target":"_blank"}}],"outputs":0,"cts":false,"x":1270,"y":840,"wires":[]},{"id":"a9237fa9b377b2eb","type":"ui_table","z":"ab15ca25fb016f10","group":"734cb7f669648776","name":"Lights","order":5,"width":9,"height":2,"columns":[{"field":"key","title":"","width":"270","align":"left","formatter":"plaintext","formatterParams":{"target":"_blank"}},{"field":"value","title":"","width":"200","align":"left","formatter":"plaintext","formatterParams":{"target":"_blank"}}],"outputs":0,"cts":false,"x":1270,"y":880,"wires":[]},{"id":"7051e1f7cbd913df","type":"ui_table","z":"ab15ca25fb016f10","group":"734cb7f669648776","name":"Tyres","order":7,"width":9,"height":3,"columns":[{"field":"key","title":"","width":"270","align":"left","formatter":"plaintext","formatterParams":{"target":"_blank"}},{"field":"value","title":"","width":"200","align":"left","formatter":"plaintext","formatterParams":{"target":"_blank"}}],"outputs":0,"cts":false,"x":1270,"y":920,"wires":[]},{"id":"dbe83a055ef4f9fb","type":"change","z":"ab15ca25fb016f10","name":"","rules":[{"t":"set","p":"payload","pt":"msg","to":"info","tot":"msg","dc":true}],"action":"","property":"","from":"","to":"","reg":false,"x":1000,"y":680,"wires":[["71696372707df2b5"]]},{"id":"d63b72764ad0b5fb","type":"change","z":"ab15ca25fb016f10","name":"","rules":[{"t":"set","p":"payload","pt":"msg","to":"climate","tot":"msg","dc":true}],"action":"","property":"","from":"","to":"","reg":false,"x":1000,"y":720,"wires":[["dd2ae9ddae7e41ab"]]},{"id":"4b7751c51955cb20","type":"change","z":"ab15ca25fb016f10","name":"","rules":[{"t":"set","p":"payload","pt":"msg","to":"drivetrain","tot":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":1000,"y":760,"wires":[["89867fad86b8331a"]]},{"id":"2645b6a4dd751351","type":"change","z":"ab15ca25fb016f10","name":"","rules":[{"t":"set","p":"payload","pt":"msg","to":"windows","tot":"msg","dc":true}],"action":"","property":"","from":"","to":"","reg":false,"x":1000,"y":800,"wires":[["6790d7863572edc8"]]},{"id":"65ab4d9c5982cbae","type":"change","z":"ab15ca25fb016f10","name":"","rules":[{"t":"set","p":"payload","pt":"msg","to":"doors","tot":"msg","dc":true}],"action":"","property":"","from":"","to":"","reg":false,"x":1000,"y":840,"wires":[["cbcfb1b214b048d4"]]},{"id":"ec653576ae59490d","type":"change","z":"ab15ca25fb016f10","name":"","rules":[{"t":"set","p":"payload","pt":"msg","to":"lights","tot":"msg","dc":true}],"action":"","property":"","from":"","to":"","reg":false,"x":1000,"y":880,"wires":[["a9237fa9b377b2eb"]]},{"id":"adc2cc7e95e7df68","type":"change","z":"ab15ca25fb016f10","name":"","rules":[{"t":"set","p":"payload","pt":"msg","to":"tyres","tot":"msg","dc":true}],"action":"","property":"","from":"","to":"","reg":false,"x":1000,"y":920,"wires":[["7051e1f7cbd913df"]]},{"id":"8c1367247296577e","type":"subflow:94975f0123611419","z":"ab15ca25fb016f10","name":"","x":820,"y":1320,"wires":[["192a38eea9cdeff0"]]},{"id":"3e318641c91924af","type":"ui_table","z":"ab15ca25fb016f10","group":"734cb7f669648776","name":"Refresh","order":8,"width":9,"height":3,"columns":[{"field":"key","title":"","width":"270","align":"left","formatter":"plaintext","formatterParams":{"target":"_blank"}},{"field":"value","title":"","width":"200","align":"left","formatter":"plaintext","formatterParams":{"target":"_blank"}}],"outputs":0,"cts":false,"x":1280,"y":960,"wires":[]},{"id":"7854bf3f206ea053","type":"change","z":"ab15ca25fb016f10","name":"","rules":[{"t":"set","p":"payload","pt":"msg","to":"refresh","tot":"msg","dc":true}],"action":"","property":"","from":"","to":"","reg":false,"x":1000,"y":960,"wires":[["3e318641c91924af"]]},{"id":"8a1d0c5a28ee64bc","type":"comment","z":"ab15ca25fb016f10","name":"## MQTT tree path (TO SET using Mqtt explorer)","info":"","x":190,"y":80,"wires":[]},{"id":"630af5c96423185c","type":"comment","z":"ab15ca25fb016f10","name":"SQLite Persistence","info":"","x":760,"y":80,"wires":[]},{"id":"379602aac1af28c1","type":"subflow:7cf6ee7ab0891d5c","z":"ab15ca25fb016f10","name":"","x":1120,"y":360,"wires":[["af5ed0d285ca9e39"]]},{"id":"39ba1fdd8d432c67","type":"function","z":"ab15ca25fb016f10","name":"SQL Builder","func":"msg.zoom = 13\nconst from = flow.get('from') ? flow.get('from') : \"date('now', 'start of day')\"\nconst to = flow.get('to') ? flow.get('to') : \"date('now','+1 day')\"\n\nconst criteriaFrom = ' >= ' + from\nconst criteriaTo = ' <= ' + to\n\nmsg.topic = `select *  from location \nwhere datetime(timestamp/1000,'unixepoch') ${criteriaFrom} \nand datetime(timestamp/1000,'unixepoch') ${criteriaTo} \nORDER BY timestamp ASC`\n\nreturn msg;\n","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":910,"y":360,"wires":[["379602aac1af28c1","b0015328619bfc5d"]]},{"id":"3ae4b7eebead8bb6","type":"function","z":"ab15ca25fb016f10","name":"set global value","func":"msg.payload = [{\n    location_latitude: global.get('saic').gateway.location_latitude,\n    location_longitude: global.get('saic').gateway.location_longitude,\n    timestamp: new Date().getTime()\n}]\n\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":700,"y":280,"wires":[["af5ed0d285ca9e39"]]},{"id":"93d7d24440def7cf","type":"ui_button","z":"ab15ca25fb016f10","name":"weekly","group":"6472389d15f1336f","order":4,"width":2,"height":1,"passthru":false,"label":"{{ msg.label }}","tooltip":"","color":"","bgcolor":"","className":"","icon":"","payload":"datetime('now', '-7 days')","payloadType":"str","topic":"topic","topicType":"msg","x":480,"y":360,"wires":[["39a4466fe5cd25ad"]]},{"id":"a7c7b7a6fd50054f","type":"ui_button","z":"ab15ca25fb016f10","name":"monthly","group":"6472389d15f1336f","order":5,"width":2,"height":1,"passthru":false,"label":"{{ msg.label }}","tooltip":"","color":"","bgcolor":"","className":"","icon":"","payload":"datetime('now', '-30 days')","payloadType":"str","topic":"topic","topicType":"msg","x":480,"y":400,"wires":[["39a4466fe5cd25ad"]]},{"id":"b7657bca89fe3c38","type":"ui_chart","z":"ab15ca25fb016f10","name":"Pressure","group":"779fd73bbe80ab61","order":4,"width":9,"height":4,"label":"{{ msg.label }}","chartType":"bar","legend":"true","xformat":"auto","interpolate":"linear","nodata":"","dot":false,"ymin":"2.3","ymax":"","removeOlder":1,"removeOlderPoints":"","removeOlderUnit":"86400","cutout":0,"useOneColor":false,"useUTC":false,"colors":["#1f77b4","#aec7e8","#ff7f0e","#2ca02c","#98df8a","#d62728","#ff9896","#9467bd","#c5b0d5"],"outputs":1,"useDifferentColor":false,"className":"","x":1570,"y":1520,"wires":[[]]},{"id":"29a1df6426249525","type":"subflow:7cf6ee7ab0891d5c","z":"ab15ca25fb016f10","name":"","x":890,"y":1520,"wires":[["ac8ba49dfb6937d0"]]},{"id":"8d8a87b67fae565e","type":"function","z":"ab15ca25fb016f10","name":"SQL","func":"let LIMIT = new Date()\nLIMIT.setTime(LIMIT.getTime() - (31 * 24 * 60 * 60 * 1000))\n\n\nmsg.topic = `select  substr( DATETIME(timestamp/1000, 'unixepoch'), 0,11 ) as timestamp,\n\t\tMIN(tyres_frontLeftPressure) AS tyres_frontLeftPressure ,\n\t\tMIN(tyres_frontRightPressure) AS tyres_frontRightPressure ,\n\t\tMIN(tyres_rearLeftPressure) AS tyres_rearLeftPressure ,\n\t\tMIN(tyres_rearRightPressure) AS tyres_rearRightPressure \nfrom tyres \nwhere timestamp > ${LIMIT.getTime()}\nGROUP BY substr( DATETIME(timestamp/1000, 'unixepoch'), 0,11 ) \nORDER BY TIMESTAMP  ASC;`\nreturn msg;\n","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":740,"y":1520,"wires":[["29a1df6426249525"]]},{"id":"ac8ba49dfb6937d0","type":"function","z":"ab15ca25fb016f10","name":"convert","func":"const SERIES = [\"tyres_frontLeftPressure\", \"tyres_frontRightPressure\", \"tyres_rearLeftPressure\", \"tyres_rearRightPressure\"]\n\nmsg.payload = [{\n    \"labels\": msg.payload.map(m => m.timestamp),\n    \"data\": SERIES.map(m => msg.payload.map(n => n[m])),\n    \"series\": SERIES.map(m => msg.action[m].translation.replace(\"Pression du pneu \", \"\")),\n}]\n\ndelete msg.topic\ndelete msg.action\n\nreturn msg;\n\n","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":1070,"y":1520,"wires":[["0246f1a316d0a79a","f83b8d5a92f8c3b4"]]},{"id":"9be901e93499814a","type":"ui_chart","z":"ab15ca25fb016f10","name":"Battery","group":"779fd73bbe80ab61","order":5,"width":9,"height":4,"label":"{{ msg.label }}","chartType":"bar","legend":"false","xformat":"auto","interpolate":"linear","nodata":"","dot":false,"ymin":"12.1","ymax":"","removeOlder":1,"removeOlderPoints":"","removeOlderUnit":"86400","cutout":0,"useOneColor":false,"useUTC":false,"colors":["#1f77b4","#aec7e8","#ff7f0e","#2ca02c","#98df8a","#d62728","#ff9896","#9467bd","#c5b0d5"],"outputs":1,"useDifferentColor":false,"className":"","x":1580,"y":1600,"wires":[[]]},{"id":"fd4542e0e72a0d30","type":"subflow:7cf6ee7ab0891d5c","z":"ab15ca25fb016f10","name":"","x":890,"y":1600,"wires":[["ef5410e4454b70e5"]]},{"id":"062b4f602c8fcfbe","type":"function","z":"ab15ca25fb016f10","name":"SQL","func":"let LIMIT = new Date()\nLIMIT.setTime(LIMIT.getTime() - (31 * 24 * 60 * 60 * 1000))\n\nmsg.topic = `select  substr( DATETIME(timestamp/1000, 'unixepoch'), 0, 11 ) as timestamp,\n\t\tMIN(drivetrain_auxiliaryBatteryVoltage) AS drivetrain_auxiliaryBatteryVoltage \nfrom drivetrain\nwhere timestamp > ${LIMIT.getTime()}\nGROUP BY substr( DATETIME(timestamp/1000, 'unixepoch'), 0, 11 ) \nORDER BY TIMESTAMP  ASC;`\n\nreturn msg;\n","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":740,"y":1600,"wires":[["fd4542e0e72a0d30"]]},{"id":"ef5410e4454b70e5","type":"function","z":"ab15ca25fb016f10","name":"convert","func":"const SERIES = [\"drivetrain_auxiliaryBatteryVoltage\"]\n\nmsg.payload = [{\n    \"labels\": msg.payload.map(m => m.timestamp),\n    \"data\": SERIES.map(m => msg.payload.map(n => n[m])),\n    /*\"data\": [msg.payload.map(m => {\n        let v = Object.values(m)\n        v.splice(0, 1)\n        return v\n    }).flat()],*/\n    \"series\": SERIES.map(m => msg.action[m].translation),\n}]\n\ndelete msg.topic\ndelete msg.action\n\nreturn msg;","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":1070,"y":1600,"wires":[["2c58edee9e3d1eae","2319c9a1db807f6d"]]},{"id":"a6bcd2289fe0a9e2","type":"comment","z":"ab15ca25fb016f10","name":"## Charts","info":"https://github.com/node-red/node-red-dashboard/blob/master/Charts.md","x":80,"y":1420,"wires":[]},{"id":"418081c077c6bb11","type":"ui_chart","z":"ab15ca25fb016f10","name":"Consumption","group":"779fd73bbe80ab61","order":2,"width":6,"height":4,"label":"{{ msg.label }}","chartType":"bar","legend":"true","xformat":"auto","interpolate":"linear","nodata":"","dot":false,"ymin":"10","ymax":"","removeOlder":1,"removeOlderPoints":"","removeOlderUnit":"86400","cutout":0,"useOneColor":true,"useUTC":false,"colors":["#1f77b4","#aec7e8","#ff7f0e","#2ca02c","#98df8a","#d62728","#ff9896","#9467bd","#c5b0d5"],"outputs":1,"useDifferentColor":false,"className":"","x":1600,"y":1720,"wires":[[]]},{"id":"7a98846a109f089d","type":"subflow:7cf6ee7ab0891d5c","z":"ab15ca25fb016f10","name":"","x":880,"y":1720,"wires":[["ac51efddc0490804"]]},{"id":"3dca0b567697f449","type":"function","z":"ab15ca25fb016f10","name":"SQL","func":"let LIMIT = new Date()\nLIMIT.setTime(LIMIT.getTime() - (3 * 31 * 24 * 60 * 60 * 1000))\n\nmsg.topic = `\nselect  substr( DATETIME(timestamp/1000, 'unixepoch'), 0, 11 ) as timestamp,    \n\t(     \n\t\tselect drivetrain_mileage\n\t\tfrom drivetrain t2\n\t\twhere  drivetrain_mileage is not null and substr( DATETIME(t1.timestamp/1000, 'unixepoch'),0, 11  ) =  substr( DATETIME(t2.timestamp/1000, 'unixepoch'),0, 11 ) and drivetrain_mileage is not null\n\t\torder by timestamp asc limit 1\n\t)  as mileage_min,\n\t(     \n\t\tselect drivetrain_mileage\n\t\tfrom drivetrain t2\n\t\twhere drivetrain_mileage is not null and substr( DATETIME(t1.timestamp/1000, 'unixepoch'),0, 11  ) =  substr( DATETIME(t2.timestamp/1000, 'unixepoch'),0, 11  ) and drivetrain_mileage is not null\n\t\torder by timestamp desc limit 1\n\t)  as mileage_max,\n\tABS(SUM(DIFF)) as soc_kwh\nfrom (\n\tselect timestamp, drivetrain_mileage,drivetrain_soc_kwh,\n\t\t(drivetrain_soc_kwh - LAG(drivetrain_soc_kwh, 1) OVER (ORDER BY timestamp)) as DIFF,\n\t\t(drivetrain_mileage - LAG(drivetrain_mileage, 1) OVER (ORDER BY timestamp)) as DIFFKM,\n\t\tABS(((drivetrain_soc_kwh - LAG(drivetrain_soc_kwh, 1) OVER (ORDER BY timestamp))/(drivetrain_mileage - LAG(drivetrain_mileage, 1) OVER (ORDER BY timestamp)))) as COEF \n\tfrom drivetrain \n\twhere drivetrain_mileage is not null and drivetrain_soc_kwh is not null ORDER BY TIMESTAMP  ASC\n) as t1 \nwhere DIFF is not null and COEF is not null and COEF<1 and COEF >0 and  timestamp > ${LIMIT.getTime()}\nGROUP BY substr( DATETIME(timestamp/1000, 'unixepoch'),0, 11 )\nORDER BY TIMESTAMP  ASC;`\nreturn msg;\n","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":730,"y":1720,"wires":[["7a98846a109f089d"]]},{"id":"352fbd0ec73ddbfb","type":"ui_chart","z":"ab15ca25fb016f10","name":"Cost","group":"779fd73bbe80ab61","order":3,"width":6,"height":4,"label":"{{ msg.label }}","chartType":"bar","legend":"true","xformat":"auto","interpolate":"linear","nodata":"","dot":false,"ymin":"1","ymax":"","removeOlder":1,"removeOlderPoints":"","removeOlderUnit":"86400","cutout":0,"useOneColor":true,"useUTC":false,"colors":["#1f77b4","#aec7e8","#ff7f0e","#2ca02c","#98df8a","#d62728","#ff9896","#9467bd","#c5b0d5"],"outputs":1,"useDifferentColor":false,"className":"","x":1570,"y":1780,"wires":[[]]},{"id":"f47a28c6c616e0ca","type":"change","z":"ab15ca25fb016f10","name":"","rules":[{"t":"set","p":"payload","pt":"msg","to":"cost","tot":"msg"},{"t":"set","p":"title","pt":"msg","to":"costTitle","tot":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":1220,"y":1780,"wires":[["d62d9e025b1cfff5"]]},{"id":"7cb8af3d630b1b6b","type":"comment","z":"ab15ca25fb016f10","name":"## Car top view : SVG","info":"","x":120,"y":1240,"wires":[]},{"id":"0768795e93d66abb","type":"comment","z":"ab15ca25fb016f10","name":"## Position","info":"","x":90,"y":200,"wires":[]},{"id":"7decee4224e3e341","type":"inject","z":"ab15ca25fb016f10","name":"","props":[{"p":"payload"}],"repeat":"","crontab":"0 8-20 * * *","once":true,"onceDelay":"5","topic":"","payload":"","payloadType":"date","x":110,"y":700,"wires":[["6071c4716e763e7c"]]},{"id":"741d41078f190ae6","type":"ui_chart","z":"ab15ca25fb016f10","name":"Monthly consumption","group":"9d9f0155553a9dcb","order":1,"width":9,"height":4,"label":"{{ msg.label }}","chartType":"bar","legend":"true","xformat":"auto","interpolate":"linear","nodata":"","dot":false,"ymin":"10","ymax":"","removeOlder":1,"removeOlderPoints":"","removeOlderUnit":"86400","cutout":0,"useOneColor":false,"useUTC":false,"colors":["#1f77b4","#aec7e8","#ff7f0e","#2ca02c","#98df8a","#d62728","#ff9896","#9467bd","#c5b0d5"],"outputs":1,"useDifferentColor":false,"className":"","x":1620,"y":1900,"wires":[[]]},{"id":"9a24b5a0549e3fa7","type":"subflow:7cf6ee7ab0891d5c","z":"ab15ca25fb016f10","name":"","x":880,"y":1900,"wires":[["c77594cbf624106e"]]},{"id":"41b05e97941fb486","type":"function","z":"ab15ca25fb016f10","name":"SQL","func":"let LIMIT = new Date()\nLIMIT.setTime(LIMIT.getTime() - (365 * 24 * 60 * 60 * 1000))\n\nmsg.topic = `\nselect  substr( DATETIME(timestamp/1000, 'unixepoch'), 0, 8 ) as timestamp,    \n\t(     \n\t\tselect drivetrain_mileage\n\t\tfrom drivetrain t2\n\t\twhere  substr( DATETIME(t1.timestamp/1000, 'unixepoch'),0, 8  ) =  substr( DATETIME(t2.timestamp/1000, 'unixepoch'),0, 8 ) and drivetrain_mileage is not null\n\t\torder by timestamp asc limit 1\n\t)  as mileage_min,\n\t(     \n\t\tselect drivetrain_mileage\n\t\tfrom drivetrain t2\n\t\twhere  substr( DATETIME(t1.timestamp/1000, 'unixepoch'),0, 8  ) =  substr( DATETIME(t2.timestamp/1000, 'unixepoch'),0, 8  ) and drivetrain_mileage is not null\n\t\torder by timestamp desc limit 1\n\t)  as mileage_max,\n\tABS(SUM(DIFF)) as soc_kwh\nfrom (\n\tselect timestamp, drivetrain_mileage,drivetrain_soc_kwh,\n\t\t(drivetrain_soc_kwh - LAG(drivetrain_soc_kwh, 1) OVER (ORDER BY timestamp)) as DIFF,\n\t\t(drivetrain_mileage - LAG(drivetrain_mileage, 1) OVER (ORDER BY timestamp)) as DIFFKM,\n\t\tABS(((drivetrain_soc_kwh - LAG(drivetrain_soc_kwh, 1) OVER (ORDER BY timestamp))/(drivetrain_mileage - LAG(drivetrain_mileage, 1) OVER (ORDER BY timestamp)))) as COEF \n\tfrom drivetrain \n\twhere drivetrain_mileage is not null and drivetrain_soc_kwh is not null ORDER BY TIMESTAMP  ASC\n) as t1\nwhere DIFF is not null and COEF is not null and COEF<1 and COEF >0 and  timestamp > ${LIMIT.getTime()}\nGROUP BY substr( DATETIME(timestamp/1000, 'unixepoch'),0, 8 )\nORDER BY TIMESTAMP  ASC;`\nreturn msg;\n","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":730,"y":1900,"wires":[["9a24b5a0549e3fa7"]]},{"id":"4ac8a0c035004bb0","type":"ui_chart","z":"ab15ca25fb016f10","name":"Monthly cost","group":"9d9f0155553a9dcb","order":2,"width":9,"height":4,"label":"{{ msg.label }}","chartType":"bar","legend":"true","xformat":"auto","interpolate":"linear","nodata":"","dot":false,"ymin":"1","ymax":"","removeOlder":1,"removeOlderPoints":"","removeOlderUnit":"86400","cutout":0,"useOneColor":false,"useUTC":false,"colors":["#1f77b4","#aec7e8","#ff7f0e","#2ca02c","#98df8a","#d62728","#ff9896","#9467bd","#c5b0d5"],"outputs":1,"useDifferentColor":false,"className":"","x":1600,"y":1960,"wires":[[]]},{"id":"5a7c812c68b82627","type":"change","z":"ab15ca25fb016f10","name":"","rules":[{"t":"set","p":"payload","pt":"msg","to":"cost","tot":"msg"},{"t":"set","p":"title","pt":"msg","to":"costTitle","tot":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":1220,"y":1960,"wires":[["3b3e5ee2e5136378"]]},{"id":"914787e43f19998e","type":"ui_chart","z":"ab15ca25fb016f10","name":"Monthly mileage","group":"9d9f0155553a9dcb","order":3,"width":9,"height":4,"label":"{{ msg.label }}","chartType":"bar","legend":"true","xformat":"auto","interpolate":"linear","nodata":"","dot":false,"ymin":"100","ymax":"","removeOlder":1,"removeOlderPoints":"","removeOlderUnit":"86400","cutout":0,"useOneColor":false,"useUTC":false,"colors":["#1f77b4","#aec7e8","#ff7f0e","#2ca02c","#98df8a","#d62728","#ff9896","#9467bd","#c5b0d5"],"outputs":1,"useDifferentColor":false,"className":"","x":1610,"y":2080,"wires":[[]]},{"id":"bddd1ab999093f5a","type":"subflow:7cf6ee7ab0891d5c","z":"ab15ca25fb016f10","name":"","x":880,"y":2080,"wires":[["7bdc1cd72bb5c367"]]},{"id":"099ee327b467a213","type":"function","z":"ab15ca25fb016f10","name":"SQL","func":"let LIMIT = new Date()\nLIMIT.setTime(LIMIT.getTime() - (2 * 365 * 24 * 60 * 60 * 1000))\n\nmsg.topic = `select \n substr( DATETIME(timestamp/1000, 'unixepoch'),0, 8 ) as timestamp,\n\t(     \n\t\tselect drivetrain_mileage\n\t\tfrom drivetrain t2\n\t\twhere  substr( DATETIME(drivetrain.timestamp/1000, 'unixepoch'),0, 8 ) =  substr( DATETIME(t2.timestamp/1000, 'unixepoch'),0, 8 )\n\t\torder by timestamp desc limit 1\n\t) - (    \n\t\tselect drivetrain_mileage\n\t\tfrom drivetrain t2\n\t\twhere  substr( DATETIME(drivetrain.timestamp/1000, 'unixepoch'),0, 8 ) =  substr( DATETIME(t2.timestamp/1000, 'unixepoch'),0, 8 )\n\t\torder by timestamp asc limit 1\n\t) as drivetrain_mileage\nfrom drivetrain \nwhere timestamp > ${LIMIT.getTime()}\nGROUP BY substr( DATETIME(timestamp/1000, 'unixepoch'),0, 8 )\nORDER BY TIMESTAMP  ASC;;`\n\nreturn msg;\n","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":730,"y":2080,"wires":[["bddd1ab999093f5a"]]},{"id":"7bdc1cd72bb5c367","type":"function","z":"ab15ca25fb016f10","name":"convert","func":"const SERIES = [\"drivetrain_mileage\"]\nconst data=SERIES.map(m => msg.payload.map(n => n[m]))\nconst average = data.flat().filter(f => f > 0).reduce((a, b) => parseFloat(a) + parseFloat(b), 0) / data.flat().filter(f => f > 0).length\nmsg.payload = [{\n    \"labels\": msg.payload.map(m => m.timestamp),\n    \"data\": data,\n    \"series\": [`${msg.translate('drivetrain_mileage')} - ${msg.translate('average')} : ${average.toFixed(1)} km`],\n}]\n\ndelete msg.topic\ndelete msg.action\n\nreturn msg;","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":1060,"y":2080,"wires":[["5ba46ec20fc8af22","f45d6a4b153bd5b9"]]},{"id":"bceb719b2a30ab3b","type":"inject","z":"ab15ca25fb016f10","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":360,"y":1960,"wires":[["03dd5a0476e59c78"]]},{"id":"dd2c969d0928260c","type":"inject","z":"ab15ca25fb016f10","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":360,"y":2120,"wires":[["d63dd82e06c583bf"]]},{"id":"cc73df5698ee4b45","type":"ui_chart","z":"ab15ca25fb016f10","name":"SOC capacity","group":"9d9f0155553a9dcb","order":4,"width":9,"height":4,"label":"{{ msg.label }}","chartType":"line","legend":"false","xformat":"auto","interpolate":"linear","nodata":"","dot":false,"ymin":"61","ymax":"73","removeOlder":1,"removeOlderPoints":"","removeOlderUnit":"86400","cutout":0,"useOneColor":false,"useUTC":false,"colors":["#1f77b4","#aec7e8","#ff7f0e","#2ca02c","#98df8a","#d62728","#ff9896","#9467bd","#c5b0d5"],"outputs":1,"useDifferentColor":false,"className":"","x":1590,"y":2180,"wires":[[]]},{"id":"f75686fcb07a3722","type":"subflow:7cf6ee7ab0891d5c","z":"ab15ca25fb016f10","name":"","x":880,"y":2180,"wires":[["37fb161449a6debd"]]},{"id":"33492c8da9a7be0c","type":"function","z":"ab15ca25fb016f10","name":"SQL","func":"let LIMIT = new Date()\nLIMIT.setTime(LIMIT.getTime() - (5 * 365 * 24 * 60 * 60 * 1000))\n\nmsg.topic = `select \n substr( DATETIME(timestamp/1000, 'unixepoch'),0, 8 ) as timestamp,\n\t(     \n\t\tselect drivetrain_totalBatteryCapacity\n\t\tfrom drivetrain t2\n\t\twhere  substr( DATETIME(drivetrain.timestamp/1000, 'unixepoch'),0, 8 ) =  substr( DATETIME(t2.timestamp/1000, 'unixepoch'),0, 8 )\n\t\torder by timestamp desc limit 1\n\t) as drivetrain_totalBatteryCapacity\nfrom drivetrain \nwhere timestamp > ${LIMIT.getTime()}\nGROUP BY substr( DATETIME(timestamp/1000, 'unixepoch'),0, 8 )\nORDER BY TIMESTAMP  ASC;`\n\nreturn msg;\n","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":730,"y":2180,"wires":[["f75686fcb07a3722"]]},{"id":"37fb161449a6debd","type":"function","z":"ab15ca25fb016f10","name":"convert","func":"const SERIES = [\"drivetrain_totalBatteryCapacity\"]\n\nmsg.payload = [{\n    \"labels\": msg.payload.map(m => m.timestamp),\n    \"data\": SERIES.map(m => msg.payload.map(n => n[m])),\n    \"series\": SERIES.map(m => msg.action[m].translation),\n}]\n\ndelete msg.topic\ndelete msg.action\n\nreturn msg;","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":1060,"y":2180,"wires":[["c02b81e47ea14c58","c13c7ee13c027946"]]},{"id":"c3d04e44c8b38477","type":"inject","z":"ab15ca25fb016f10","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":360,"y":2220,"wires":[["3d15f2681506b318"]]},{"id":"a9fb1a6e2e590cf5","type":"ui_button","z":"ab15ca25fb016f10","name":"current","group":"6472389d15f1336f","order":2,"width":1,"height":1,"passthru":false,"label":"{{ msg.label }}","tooltip":"Actuel","color":"","bgcolor":"#ffcccb","className":"","icon":"","payload":"","payloadType":"str","topic":"topic","topicType":"msg","x":480,"y":280,"wires":[["3ae4b7eebead8bb6"]]},{"id":"861effece44b5d91","type":"ui_button","z":"ab15ca25fb016f10","name":"clean","group":"6472389d15f1336f","order":1,"width":1,"height":1,"passthru":false,"label":"{{ msg.label }}","tooltip":"Nettoyer","color":"","bgcolor":"lightgreen","className":"","icon":"","payload":"","payloadType":"str","topic":"topic","topicType":"msg","x":470,"y":240,"wires":[["7b5aeb5e382e9bb2"]]},{"id":"7b5aeb5e382e9bb2","type":"function","z":"ab15ca25fb016f10","name":"clean","func":"msg.payload = []\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":670,"y":240,"wires":[["af5ed0d285ca9e39"]]},{"id":"ac51efddc0490804","type":"subflow:508cc9124d7eeab6","z":"ab15ca25fb016f10","name":"","x":1090,"y":1720,"wires":[["f47a28c6c616e0ca","bd03b56a4395e481","bf45bc7f117a4a02","6339284c3359db19"]]},{"id":"c77594cbf624106e","type":"subflow:508cc9124d7eeab6","z":"ab15ca25fb016f10","name":"","x":1100,"y":1900,"wires":[["5a7c812c68b82627","dc9a8a7a7b309829","d0e88a651121bd95"]]},{"id":"5f78df9cb7abc569","type":"ui_chart","z":"ab15ca25fb016f10","name":"Outdoor temperature","group":"779fd73bbe80ab61","order":6,"width":18,"height":5,"label":"{{ msg.label }}","chartType":"line","legend":"false","xformat":"auto","interpolate":"linear","nodata":"","dot":false,"ymin":"-10","ymax":"","removeOlder":1,"removeOlderPoints":"","removeOlderUnit":"86400","cutout":0,"useOneColor":false,"useUTC":false,"colors":["#1f77b4","#aec7e8","#ff7f0e","#2ca02c","#98df8a","#d62728","#ff9896","#9467bd","#c5b0d5"],"outputs":1,"useDifferentColor":false,"className":"","x":1620,"y":2280,"wires":[[]]},{"id":"e03f477368e5bfa5","type":"subflow:7cf6ee7ab0891d5c","z":"ab15ca25fb016f10","name":"","x":880,"y":2280,"wires":[["ddf6fb442b92c0c2"]]},{"id":"61696cbe18eebc34","type":"function","z":"ab15ca25fb016f10","name":"SQL","func":"let LIMIT = new Date()\nLIMIT.setTime(LIMIT.getTime() - (31 * 24 * 60 * 60 * 1000))\n\nmsg.topic = `select  \nsubstr(DATETIME(timestamp/1000, 'unixepoch'),3,11) || ':00' as timestamp,\nclimate_exteriorTemperature\nfrom climate\nwhere timestamp > ${LIMIT.getTime()}\nGROUP BY substr(DATETIME(timestamp/1000, 'unixepoch'),3,11)\nORDER BY TIMESTAMP  ASC;`\n\nreturn msg;\n","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":730,"y":2280,"wires":[["e03f477368e5bfa5"]]},{"id":"ddf6fb442b92c0c2","type":"function","z":"ab15ca25fb016f10","name":"convert","func":"const SERIES = [\"climate_exteriorTemperature\"]\n\nmsg.payload = [{\n    \"labels\": msg.payload.map(m => m.timestamp),\n    \"data\": SERIES.map(m => msg.payload.map(n => n[m])),\n    \"series\": SERIES.map(m => msg.action[m].translation),\n}]\n\ndelete msg.topic\ndelete msg.action\n\nreturn msg;","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":1060,"y":2280,"wires":[["d3599d5f5db5ccb3","96568f943c4bc2d2"]]},{"id":"3130e99368a44b53","type":"inject","z":"ab15ca25fb016f10","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":360,"y":2320,"wires":[["2035bcdb9c111760"]]},{"id":"234d6aef3e821821","type":"ui_switch","z":"ab15ca25fb016f10","name":"drivetrain_charging","label":"{{ msg.label }}","tooltip":"","group":"7e73c2e872a65376","order":1,"width":3,"height":1,"passthru":false,"decouple":"true","topic":"drivetrain_charging","topicType":"str","style":"","onvalue":"true","onvalueType":"bool","onicon":"","oncolor":"","offvalue":"false","offvalueType":"bool","officon":"","offcolor":"","animate":false,"className":"color:\"#FFF0F0\"","x":2700,"y":800,"wires":[["357c69da8648f436"]]},{"id":"149ce7d5e0fe2df1","type":"ui_slider","z":"ab15ca25fb016f10","name":"climate_remoteTemperature","label":"{{ msg.label }}","tooltip":"","group":"7e73c2e872a65376","order":11,"width":8,"height":1,"passthru":false,"outs":"end","topic":"climate_remoteTemperature","topicType":"str","min":"16","max":"30","step":1,"className":"","x":2770,"y":1460,"wires":[["357c69da8648f436"]]},{"id":"19bbccec1f38a461","type":"ui_dropdown","z":"ab15ca25fb016f10","name":"climate_remoteClimateState","label":"{{ msg.label }}","tooltip":"","place":"","group":"7e73c2e872a65376","order":8,"width":4,"height":1,"passthru":false,"multiple":false,"options":[],"payload":"","topic":"climate_remoteClimateState","topicType":"str","className":"","x":2770,"y":1520,"wires":[["357c69da8648f436"]]},{"id":"a3194335f7bf86e4","type":"ui_switch","z":"ab15ca25fb016f10","name":"doors_boot","label":"{{ msg.label }}","tooltip":"","group":"7e73c2e872a65376","order":5,"width":6,"height":1,"passthru":false,"decouple":"true","topic":"doors_boot","topicType":"str","style":"","onvalue":"true","onvalueType":"bool","onicon":"","oncolor":"","offvalue":"false","offvalueType":"bool","officon":"","offcolor":"","animate":false,"className":"","x":2700,"y":1180,"wires":[["357c69da8648f436"]]},{"id":"85edd902984e04c2","type":"ui_switch","z":"ab15ca25fb016f10","name":"doors_locked","label":"{{ msg.label }}","tooltip":"","group":"7e73c2e872a65376","order":6,"width":5,"height":1,"passthru":false,"decouple":"true","topic":"doors_locked","topicType":"str","style":"","onvalue":"true","onvalueType":"bool","onicon":"","oncolor":"","offvalue":"false","offvalueType":"bool","officon":"","offcolor":"","animate":false,"className":"","x":2700,"y":1120,"wires":[["357c69da8648f436"]]},{"id":"ef6c126b064c4bca","type":"ui_switch","z":"ab15ca25fb016f10","name":"climate_rearWindowDefrosterHeating","label":"{{ msg.label }}","tooltip":"","group":"7e73c2e872a65376","order":10,"width":4,"height":1,"passthru":false,"decouple":"true","topic":"climate_rearWindowDefrosterHeating","topicType":"str","style":"","onvalue":"on","onvalueType":"str","onicon":"","oncolor":"","offvalue":"off","offvalueType":"str","officon":"","offcolor":"","animate":false,"className":"","x":2790,"y":1340,"wires":[["357c69da8648f436"]]},{"id":"5be9cf2de934de4c","type":"ui_switch","z":"ab15ca25fb016f10","name":"climate_frontWindowDefrosterHeating","label":"{{ msg.label }}","tooltip":"","group":"7e73c2e872a65376","order":9,"width":4,"height":1,"passthru":false,"decouple":"true","topic":"climate_frontWindowDefrosterHeating","topicType":"str","style":"","onvalue":"on","onvalueType":"str","onicon":"","oncolor":"","offvalue":"off","offvalueType":"str","officon":"","offcolor":"","animate":false,"className":"","x":2790,"y":1400,"wires":[["357c69da8648f436"]]},{"id":"ad3b33f927ca67f4","type":"ui_slider","z":"ab15ca25fb016f10","name":"drivetrain_socTarget","label":"{{ msg.label }}","tooltip":"","group":"7e73c2e872a65376","order":3,"width":7,"height":1,"passthru":false,"outs":"end","topic":"drivetrain_socTarget","topicType":"str","min":"40","max":"100","step":"10","className":"","x":2720,"y":680,"wires":[["357c69da8648f436"]]},{"id":"12ad41d70ae916c6","type":"comment","z":"ab15ca25fb016f10","name":"## set SAIC vehicle parameters","info":"/drivetrain/charging/set \ttrue/false \tStart (true) or stop (false) charging. Stopping works fine, starting is not so reliable yet\n/climate/remoteTemperature/set \ttemperature \tSet A/C temperature\n/climate/remoteClimateState/set \ton/off/front/blowingOnly \tTurn A/C on or off, activate A/C blowing (front) or blowing only (blowingOnly)\n/doors/boot/set \ttrue/false \tLock or unlock boot\n/doors/locked/set \ttrue/false \tLock or unlock your car. This is not always working. It might take some time until it takes effect. Don't trust this feature. Use your car key!\n/climate/rearWindowDefrosterHeating/set \ton/off \tTurn rear window defroster heating on or off. This is not always working. It might take some time until it takes effect.\n/climate/frontWindowDefrosterHeating/set \ton/off \tTurn front window defroster heating on or off\n/drivetrain/socTarget/set \t[40,50,60,70,80,90,100] \tTarget SoC in percent. Only values from the defined value range are valid.\n\nhttps://github.com/SAIC-iSmart-API/saic-python-client/blob/main/src/saic_ismart_client/common_model.py\n","x":1880,"y":1040,"wires":[]},{"id":"83c8dc97592bef8f","type":"mqtt out","z":"ab15ca25fb016f10","name":"","topic":"","qos":"","retain":"","respTopic":"","contentType":"","userProps":"","correl":"","expiry":"","broker":"acbce132.6eef4","x":3090,"y":280,"wires":[]},{"id":"1f345b854877aed0","type":"function","z":"ab15ca25fb016f10","name":"set Refresh","func":"/*\n{\"topic\":\"saic/_to_change_accountID_/vehicles/_to_change_vehiculeID_/lights/mainBeam\",\n\"payload\":false,\"qos\":0,\"retain\":false,\"_topic\":\"saic/_to_change_accountID_/vehicles/_to_change_vehiculeID_/lights/mainBeam\",\n\"_msgid\":\"c26de614c49f10df\"}\n*/\n\n\nmsg.sets = [\n    {\n        //Vehicule juste après l'arrêt\n        \"topic\": \"/refresh/period/inActiveGrace\",\n        \"payload\": 15 * 60\n        //en s\n\n    },\n    {\n        //Vehicule arrêté\n        \"topic\": \"/refresh/period/afterShutdown\",\n        \"payload\": 120 * 60\n        //en s\n\n    },\n    {\n        //Vehicule en marche\n        \"topic\": \"/refresh/period/active\",\n        \"payload\": 1 * 60\n        //en s\n\n    },\n    {\n        //Vehicule éteint ATTENTION A LA BATTERIE\n        \"topic\": \"/refresh/period/inActive\",\n        \"payload\": 24 * 60 * 60\n        //> 86400 (24h)\n        //h en s\n\n    },\n\n]\n\nreturn msg","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":2490,"y":280,"wires":[["72eed443eb74cad1"]]},{"id":"0b4ca1f19c54176e","type":"inject","z":"ab15ca25fb016f10","name":"","props":[],"repeat":"","crontab":"","once":true,"onceDelay":"1","topic":"","x":2170,"y":280,"wires":[["1f345b854877aed0"]]},{"id":"72eed443eb74cad1","type":"function","z":"ab15ca25fb016f10","name":"format","func":"msg.sets.forEach((s) => {\n    msg.topic = s.topic;\n    msg.payload = s.payload\n    node.send(msg)\n});\n","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":2650,"y":280,"wires":[["9e3571af22d21f59"]]},{"id":"75bc5e5c63a8d081","type":"comment","z":"ab15ca25fb016f10","name":"## MQTT Set parameters to refresh data","info":"https://github.com/SAIC-iSmart-API/saic-python-mqtt-gateway","x":2250,"y":240,"wires":[]},{"id":"19f0f6a4c921fd2d","type":"ui_are_you_sure","z":"ab15ca25fb016f10","name":"","group":"7d655f63961c4544","iconColor":"#ffffff","textColor":"#ffffff","backgroundColor":"#000000","icon":"","title":"MG","description":"Description","timeoutSec":"30","x":3390,"y":960,"wires":[["9e3571af22d21f59","596ecf358aecf766"],["90032e79edd41703"]]},{"id":"c096f521dbd64168","type":"function","z":"ab15ca25fb016f10","name":"set","func":"const tab = msg.topic.split('_')\nlet title = msg.translate(\"warning_title\")\nlet description = msg.translate(\"warning_description_before\") + `'${msg.action[msg.topic].translation}' ` + msg.translate(\"warning_description_middle\") + ` '${msg.payload}' ` + msg.translate(\"warning_description_after\")\nnode.warn(msg.topic + \" \" + msg.payload + \" \" + global.get('saic').gateway[msg.topic])\nif (msg.topic in global.get('saic').gateway && (msg.payload !== global.get('saic').gateway[msg.topic] || !global.get('saic').gateway[msg.topic])) {\n    msg.options = {\n        \"icon\": \"\",\n        \"title\": title,\n        \"description\": description,\n        \"timeoutSec\": 10,\n    }\n    msg.topic = `${tab[0]}/${tab[1]}`;\n    return msg\n}\n","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":3230,"y":960,"wires":[["19f0f6a4c921fd2d"]]},{"id":"9e3571af22d21f59","type":"function","z":"ab15ca25fb016f10","name":"msg.topic","func":"msg.topic = 'saic/_to_change_accountID_/vehicles/_to_change_vehiculeID_/' + msg.topic+'/set';\ndelete msg.action;\ndelete msg.option;\ndelete msg.config;\nreturn msg;","outputs":1,"timeout":0,"noerr":0,"initialize":"","finalize":"","libs":[],"x":2930,"y":280,"wires":[["83c8dc97592bef8f","fadb1cdda47e9de6"]]},{"id":"558c3fca96d54bc7","type":"comment","z":"ab15ca25fb016f10","name":"TO SET","info":"","x":2910,"y":240,"wires":[]},{"id":"596ecf358aecf766","type":"delay","z":"ab15ca25fb016f10","name":"","pauseType":"delay","timeout":"2","timeoutUnits":"seconds","rate":"1","nbRateUnits":"1","rateUnits":"second","randomFirst":"1","randomLast":"5","randomUnits":"seconds","drop":false,"allowrate":false,"outputs":1,"x":3200,"y":780,"wires":[["90032e79edd41703","9e3571af22d21f59"]]},{"id":"6f20a289c6f7926a","type":"ui_dropdown","z":"ab15ca25fb016f10","name":"drivetrain_chargeCurrentLimit","label":"{{ msg.label }}","tooltip":"","place":"","group":"7e73c2e872a65376","order":2,"width":5,"height":1,"passthru":false,"multiple":false,"options":[{"label":"6A","value":"6A","type":"str"},{"label":"8A","value":"8A","type":"str"},{"label":"16A","value":"16A","type":"str"},{"label":"Max","value":"Max","type":"str"}],"payload":"","topic":"drivetrain_chargeCurrentLimit","topicType":"str","className":"","x":2730,"y":740,"wires":[["357c69da8648f436"]]},{"id":"a2676ef2c5eadcb6","type":"function","z":"ab15ca25fb016f10","name":"rearWindowDefrosterHeating","func":"msg.key='climate_rearWindowDefrosterHeating'\nreturn msg\n","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":2300,"y":1340,"wires":[["d99d79da044dabe9"]]},{"id":"92f5325539d5e0ca","type":"function","z":"ab15ca25fb016f10","name":"frontWindowDefrosterHeating","func":"msg.key='climate_frontWindowDefrosterHeating'\nreturn msg\n","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":2310,"y":1400,"wires":[["2f976fc33084702a"]]},{"id":"db5de115ba2f855e","type":"function","z":"ab15ca25fb016f10","name":"socTarget","func":"msg.key='drivetrain_socTarget'\nreturn msg;","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":2210,"y":680,"wires":[["4b89f802a542d145"]]},{"id":"5c5607806ef72b83","type":"function","z":"ab15ca25fb016f10","name":"chargeCurrentLimit","func":"msg.key='drivetrain_chargeCurrentLimit'\nreturn msg;","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":2240,"y":740,"wires":[["fbb42fe6a5ce9379"]]},{"id":"2f6cc945037ebff5","type":"function","z":"ab15ca25fb016f10","name":"charging","func":"msg.key='drivetrain_charging'\nreturn msg;","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":2210,"y":800,"wires":[["e8093890731ab8a0"]]},{"id":"5dcc3e9a40a8a30a","type":"function","z":"ab15ca25fb016f10","name":"locked","func":"msg.key='doors_locked'\n\nreturn msg;","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":2220,"y":1120,"wires":[["95c77b95b5f74d95"]]},{"id":"7e7e515f0ea06a8a","type":"function","z":"ab15ca25fb016f10","name":"boot","func":"msg.key='doors_boot'\nreturn msg;","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":2220,"y":1180,"wires":[["dbed60bbdfaa1d44"]]},{"id":"eefcfb4d121a1167","type":"function","z":"ab15ca25fb016f10","name":"remoteTemperature","func":"msg.key='climate_remoteTemperature'\nreturn msg;","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":2280,"y":1460,"wires":[["3fc87905df480f87"]]},{"id":"dd936499b4be0225","type":"function","z":"ab15ca25fb016f10","name":"remoteClimateState","func":"msg.key = 'climate_remoteClimateState'\nmsg.options = []\n\n\nfor (const e of [\n    \"off\",\n    \"on\",\n    \"blowingOnly\",\n    \"front\"\n]) {\n    let t = {};\n    let k = msg.translate(e)\n    t[k] = e;\n    msg.options.push(t)\n}\nreturn msg;","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":2280,"y":1520,"wires":[["34c66d126581d7e7"]]},{"id":"0a806303ed7f95ba","type":"comment","z":"ab15ca25fb016f10","name":"### Charging parameters","info":"","x":2270,"y":640,"wires":[]},{"id":"3103a20b604cc006","type":"comment","z":"ab15ca25fb016f10","name":"### open/close parameters","info":"","x":2260,"y":1080,"wires":[]},{"id":"84ec08a0b7f92f12","type":"comment","z":"ab15ca25fb016f10","name":"### battery parameters","info":"","x":2240,"y":880,"wires":[]},{"id":"63bd6e8b0e5cdc66","type":"function","z":"ab15ca25fb016f10","name":"batteryHeating","func":"msg.key='drivertrain_batteryHeating'\n\nreturn msg;","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":2230,"y":920,"wires":[["b8c591c2fab06c20"]]},{"id":"107712b25c370a69","type":"ui_switch","z":"ab15ca25fb016f10","name":"drivertrain_batteryHeating","label":"{{ msg.label }}","tooltip":"","group":"7e73c2e872a65376","order":4,"width":5,"height":1,"passthru":false,"decouple":"true","topic":"drivertrain_batteryHeating","topicType":"str","style":"","onvalue":"true","onvalueType":"bool","onicon":"","oncolor":"","offvalue":"false","offvalueType":"bool","officon":"","offcolor":"","animate":false,"className":"","x":2710,"y":920,"wires":[["357c69da8648f436"]]},{"id":"4002889619fa0faa","type":"comment","z":"ab15ca25fb016f10","name":"### climate parameters","info":"","x":2250,"y":1300,"wires":[]},{"id":"6c86d36b34969048","type":"ui_dropdown","z":"ab15ca25fb016f10","name":"climate_heatedSeatsFrontLeftLevel","label":"{{ msg.label }}","tooltip":"","place":"","group":"7e73c2e872a65376","order":13,"width":10,"height":1,"passthru":false,"multiple":false,"options":[{"label":"0","value":"0","type":"str"},{"label":"1","value":"1","type":"str"},{"label":"2","value":"2","type":"str"},{"label":"3","value":"3","type":"str"}],"payload":"","topic":"climate_heatedSeatsFrontLeftLevel","topicType":"str","className":"","x":2790,"y":1580,"wires":[["357c69da8648f436"]]},{"id":"afeae3221618e4cd","type":"function","z":"ab15ca25fb016f10","name":"heatedSeatsFrontLeftLevel","func":"msg.key='climate_heatedSeatsFrontLeftLevel'\nreturn msg;","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":2300,"y":1580,"wires":[["70eac03f6f1fae07"]]},{"id":"581b2ac63061530b","type":"ui_dropdown","z":"ab15ca25fb016f10","name":"climate_heatedSeatsFrontRightLevel","label":"{{ msg.label }}","tooltip":"","place":"","group":"7e73c2e872a65376","order":12,"width":10,"height":1,"passthru":false,"multiple":false,"options":[{"label":"0","value":"0","type":"str"},{"label":"1","value":"1","type":"str"},{"label":"2","value":"2","type":"str"},{"label":"3","value":"3","type":"str"}],"payload":"","topic":"climate_heatedSeatsFrontRightLevel","topicType":"str","className":"","x":2790,"y":1640,"wires":[["357c69da8648f436"]]},{"id":"c6b0ba6d81d9ca7d","type":"function","z":"ab15ca25fb016f10","name":"heatedSeatsFrontRightLevel","func":"msg.key='climate_heatedSeatsFrontRightLevel'\nreturn msg;","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":2300,"y":1640,"wires":[["a8dcd66c1bb19d17"]]},{"id":"b299ac5a7763118f","type":"ui_date_picker","z":"ab15ca25fb016f10","name":"to","label":"{{ msg.label }}","group":"6472389d15f1336f","order":7,"width":4,"height":1,"passthru":true,"topic":"topic","topicType":"msg","className":"","x":470,"y":480,"wires":[["356493e4b0d10d7f"]]},{"id":"10854a269219b0ab","type":"ui_date_picker","z":"ab15ca25fb016f10","name":"from","label":"{{ msg.label }}","group":"6472389d15f1336f","order":6,"width":4,"height":1,"passthru":true,"topic":"topic","topicType":"msg","className":"","x":470,"y":440,"wires":[["10ee3b6b4699d7ff"]]},{"id":"a069ee20ef620458","type":"ui_button","z":"ab15ca25fb016f10","name":"Display","group":"6472389d15f1336f","order":8,"width":1,"height":1,"passthru":false,"label":"{{ msg.label }}","tooltip":"","color":"","bgcolor":"","className":"","icon":"fa-check","payload":"datetime('now', '-30 days')","payloadType":"str","topic":"topic","topicType":"msg","x":480,"y":540,"wires":[["39ba1fdd8d432c67"]]},{"id":"10ee3b6b4699d7ff","type":"function","z":"ab15ca25fb016f10","name":"fromInit","func":"if (!msg.payload) msg.payload = new Date().getTime()\nconst target = 'from'\nlet date = new Date(msg.payload)\ndate.setHours(0, 0)\nflow.set(target, `datetime(${Math.round(date.getTime() / 1000)}, 'unixepoch')`)\n","outputs":1,"timeout":0,"noerr":0,"initialize":"","finalize":"","libs":[],"x":600,"y":440,"wires":[[]]},{"id":"356493e4b0d10d7f","type":"function","z":"ab15ca25fb016f10","name":"toInit","func":"if (!msg.payload) msg.payload = new Date().getTime()\nconst target='to'\nlet date=new Date(msg.payload)\ndate.setHours(23,59)\nflow.set(target, `datetime(${Math.round(date.getTime()/1000)}, 'unixepoch')`)\n","outputs":1,"timeout":0,"noerr":0,"initialize":"","finalize":"","libs":[],"x":590,"y":480,"wires":[[]]},{"id":"39a4466fe5cd25ad","type":"function","z":"ab15ca25fb016f10","name":"fromTo","func":"flow.set('from', msg.payload)\nflow.set('to', undefined)\nreturn msg","outputs":1,"timeout":0,"noerr":0,"initialize":"","finalize":"","libs":[],"x":690,"y":360,"wires":[["39ba1fdd8d432c67"]]},{"id":"45537282ba7287a7","type":"ui_button","z":"ab15ca25fb016f10","name":"today","group":"6472389d15f1336f","order":3,"width":3,"height":1,"passthru":false,"label":"{{ msg.label }}","tooltip":"","color":"","bgcolor":"","className":"","icon":"","payload":"date('now', 'start of day')","payloadType":"str","topic":"topic","topicType":"msg","x":470,"y":320,"wires":[["39a4466fe5cd25ad"]]},{"id":"bd03b56a4395e481","type":"change","z":"ab15ca25fb016f10","name":"","rules":[{"t":"set","p":"payload","pt":"msg","to":"km","tot":"msg"},{"t":"set","p":"title","pt":"msg","to":"kmTitle","tot":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":1220,"y":1680,"wires":[["8b133ebc448dcc99"]]},{"id":"4ae18de659c5b48f","type":"ui_chart","z":"ab15ca25fb016f10","name":"Mileage","group":"779fd73bbe80ab61","order":1,"width":6,"height":4,"label":"{{ msg.label }}","chartType":"bar","legend":"true","xformat":"auto","interpolate":"linear","nodata":"","dot":false,"ymin":"10","ymax":"","removeOlder":1,"removeOlderPoints":"","removeOlderUnit":"86400","cutout":0,"useOneColor":true,"useUTC":false,"colors":["#1f77b4","#aec7e8","#ff7f0e","#2ca02c","#98df8a","#d62728","#ff9896","#9467bd","#c5b0d5"],"outputs":1,"useDifferentColor":false,"className":"","x":1580,"y":1680,"wires":[[]]},{"id":"342d669b77b1f9b6","type":"comment","z":"ab15ca25fb016f10","name":"# Reading data","info":"","x":90,"y":20,"wires":[]},{"id":"0a955deb285c300a","type":"comment","z":"ab15ca25fb016f10","name":"# Writing data","info":"","x":2140,"y":60,"wires":[]},{"id":"ab7679b6c1802136","type":"function","z":"ab15ca25fb016f10","name":"SQL","func":"/*msg.topic = `delete from mg where KEY='drivetrain_mileageOfTheDay' AND \nCAST(VALUE as INTEGER) >1 AND \nCAST(substr( TIMESTAMP, 11, 3 ) as INTEGER)<8;`\n*/\nmsg.topic = `\ndrop table MG;\n`\nreturn msg;\n","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":3790,"y":300,"wires":[["9e1ba2ab5615bc92"]]},{"id":"9e1ba2ab5615bc92","type":"subflow:7cf6ee7ab0891d5c","z":"ab15ca25fb016f10","name":"","x":3940,"y":300,"wires":[["6da0ad653937d14a"]]},{"id":"6bbd531eeca1bf14","type":"inject","z":"ab15ca25fb016f10","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":3640,"y":300,"wires":[["ab7679b6c1802136"]]},{"id":"c0c8fc5011bf31f6","type":"inject","z":"ab15ca25fb016f10","name":"create table","props":[],"repeat":"","crontab":"","once":true,"onceDelay":0.1,"topic":"","x":3570,"y":120,"wires":[["8e9e27267a35a9b3"]]},{"id":"07e4d72be297352d","type":"subflow:f83f9fc08f5e66d7","z":"ab15ca25fb016f10","name":"","x":4110,"y":120,"wires":[[]]},{"id":"8e9e27267a35a9b3","type":"function","z":"ab15ca25fb016f10","name":"create MG","func":"msg.topic = `\nCREATE TABLE IF NOT EXISTS \"location\" (\n\t\"timestamp\"\tINTEGER UNIQUE,\n\t\"location_latitude\"\tREAL,\n\t\"location_longitude\"\tREAL,\n\t\"location_speed\"\tREAL,\n\tPRIMARY KEY(\"timestamp\")\n);\nCREATE TABLE IF NOT EXISTS \"tyres\" (\n\t\"timestamp\"\tINTEGER UNIQUE,\n\t\"tyres_frontLeftPressure\"\tREAL,\n\t\"tyres_frontRightPressure\"\tREAL,\n\t\"tyres_rearLeftPressure\"\tREAL,\n\t\"tyres_rearRightPressure\"\tREAL,\n\tPRIMARY KEY(\"timestamp\")\n);\nCREATE TABLE IF NOT EXISTS \"drivetrain\" (\n\t\"timestamp\"\tINTEGER UNIQUE,\n\t\"drivetrain_auxiliaryBatteryVoltage\"\tREAL,\n\t\"drivetrain_mileageSinceLastCharge\"\tREAL,\n\t\"drivetrain_totalBatteryCapacity\"\tREAL,\n\t\"drivetrain_mileage\"\tREAL,\n\t\"drivetrain_mileageOfTheDay\"\tREAL,\n\t\"drivetrain_soc_kwh\"\tREAL,\n\t\"drivetrain_lastChargeEndingPower\"\tREAL,\n\t\"drivetrain_charging\"\tREAL,\n\tPRIMARY KEY(\"timestamp\")\n);\nCREATE TABLE IF NOT EXISTS \"climate\" (\n\t\"timestamp\"\tINTEGER UNIQUE,\n\t\"climate_exteriorTemperature\"\tREAL,\n\tPRIMARY KEY(\"timestamp\")\n);\nCREATE INDEX IF NOT EXISTS \"idx_key_timestamp\" ON \"MG\" (\n\t\"KEY\",\n\t\"TIMESTAMP\"\n);\nCREATE INDEX IF NOT EXISTS \"idx_location\" ON \"location\" (\n\t\"timestamp\",\n\t\"location_latitude\",\n\t\"location_longitude\"\n);\nCREATE INDEX IF NOT EXISTS \"idx_consumption\" ON \"drivetrain\" (\n\t\"timestamp\",\n\t\"drivetrain_mileageSinceLastCharge\",\n\t\"drivetrain_soc_kwh\",\n\t\"drivetrain_lastChargeEndingPower\"\n);\nCOMMIT;\n`\nreturn msg;\n\n","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":3820,"y":120,"wires":[["07e4d72be297352d"]]},{"id":"7250e4c741df3ca7","type":"comment","z":"ab15ca25fb016f10","name":"# Dabatabase initialisation (TO LAUNCH ONCE)","info":"","x":3630,"y":60,"wires":[]},{"id":"2d5bfc24058b3680","type":"comment","z":"ab15ca25fb016f10","name":"## maintenance","info":"","x":3640,"y":180,"wires":[]},{"id":"731812bb2b274e9a","type":"function","z":"ab15ca25fb016f10","name":"PURGE","func":"[\n   `delete from climate where timestamp <= ((STRFTIME('%s') - 60 * 24 * 3600)*1000);`,\n   `delete from location where timestamp <= ((STRFTIME('%s') - 60 * 24 * 3600)*1000);`,\n   `delete from tyres where timestamp <= ((STRFTIME('%s') - 14 * 24 * 3600)*1000);`,\n   `delete from drivetrain where timestamp <= ((STRFTIME('%s') - 2 * 365 * 24 * 3600)*1000);`\n].forEach(f => {\n   msg.topic = f\n   node.send(msg)\n})\n\n\nreturn msg;\n","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":3800,"y":240,"wires":[["9e1ba2ab5615bc92"]]},{"id":"e4a5cd352c56d5ff","type":"inject","z":"ab15ca25fb016f10","name":"","props":[],"repeat":"","crontab":"","once":true,"onceDelay":0.1,"topic":"","x":3630,"y":240,"wires":[["731812bb2b274e9a"]]},{"id":"32cd3f95b7c654fe","type":"http request","z":"ab15ca25fb016f10","name":"","method":"GET","ret":"txt","paytoqs":"ignore","url":"https://gist.githubusercontent.com/hekmon/33cba41728bfe2e4e522851da052f91f/raw/input_numbers.yaml","tls":"","persist":false,"proxy":"","insecureHTTPParser":false,"authType":"","senderr":false,"headers":[],"x":4670,"y":100,"wires":[["039b08378754771f"]]},{"id":"bde724e10d96e3db","type":"inject","z":"ab15ca25fb016f10","name":"","props":[],"repeat":"","crontab":"05 11 * * *","once":true,"onceDelay":0.1,"topic":"","x":4460,"y":100,"wires":[["32cd3f95b7c654fe"]]},{"id":"c072f5a224017843","type":"comment","z":"ab15ca25fb016f10","name":"# Electricity pricing","info":"EDF Tempo: https://particulier.edf.fr/fr/accueil/gestion-contrat/options/tempo.html#/","x":4470,"y":40,"wires":[]},{"id":"039b08378754771f","type":"yaml","z":"ab15ca25fb016f10","property":"payload","name":"","x":4850,"y":100,"wires":[["ab114e5e3492626d"]]},{"id":"325aa73cc40d0a2e","type":"function","z":"ab15ca25fb016f10","name":"today","func":"const date = new Date();\n\nlet day = date.getDate();\nlet month = date.getMonth() + 1;\nlet year = date.getFullYear();\n\nlet currentDate = `${year}-${month}-${day}`;\n\nmsg.query = currentDate;\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":5150,"y":200,"wires":[["ee90097bf8b07f95"]]},{"id":"ee90097bf8b07f95","type":"http request","z":"ab15ca25fb016f10","name":"Tempo","method":"GET","ret":"obj","paytoqs":"ignore","url":"https://particulier.edf.fr/services/rest/referentiel/searchTempoStore?dateRelevant={{{query}}}","tls":"","persist":false,"proxy":"","insecureHTTPParser":false,"authType":"","senderr":false,"headers":[],"x":5290,"y":200,"wires":[["74d0bab2167a3881","409ba4b0d2f33f5f"]]},{"id":"74d0bab2167a3881","type":"function","z":"ab15ca25fb016f10","name":"couleur","func":"if (!global.get('edf').tempo) global.get('edf').tempo = {}\ntry {\n    global.get('edf').tempo.today = msg.payload.couleurJourJ.split('_')[1].toLowerCase();\n} catch (e) {\n    node.error('EDF TEMPO not downloaded!')\n    global.get('edf').tempo.today='indisponible'\n}\nreturn msg;","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":5460,"y":200,"wires":[[]]},{"id":"a423a4ed2c723818","type":"function","z":"ab15ca25fb016f10","name":"tomorrow","func":"const date = new Date();\ndate.setDate(date.getDate() + 1);\n\nlet day = date.getDate();\nlet month = date.getMonth() + 1;\nlet year = date.getFullYear();\n\nlet currentDate = `${year}-${month}-${day}`;\n\nmsg.query = currentDate;\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":5160,"y":240,"wires":[["0339e70954055f5e"]]},{"id":"0339e70954055f5e","type":"http request","z":"ab15ca25fb016f10","name":"Tempo","method":"GET","ret":"obj","paytoqs":"ignore","url":"https://particulier.edf.fr/services/rest/referentiel/searchTempoStore?dateRelevant={{{query}}}","tls":"","persist":false,"proxy":"","insecureHTTPParser":false,"authType":"","senderr":false,"headers":[],"x":5290,"y":240,"wires":[["265087583bc525ac"]]},{"id":"265087583bc525ac","type":"function","z":"ab15ca25fb016f10","name":"couleur","func":"if (!global.get('edf').tempo) global.get('edf').tempo = {}\ntry {\n    global.get('edf').tempo.tomorrow = msg.payload.couleurJourJ.split('_')[1].toLowerCase();\n} catch (e) {\n    node.error('EDF TEMPO not downloaded!')\n    global.get('edf').tempo.tomorrow='indisponible'\n}\nreturn msg;","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":5460,"y":240,"wires":[[]]},{"id":"ab114e5e3492626d","type":"function","z":"ab15ca25fb016f10","name":"set","func":"global.set('edf', {})\nglobal.get('edf').pricing = msg.payload\nreturn msg","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":5010,"y":100,"wires":[["325aa73cc40d0a2e","a423a4ed2c723818","409ba4b0d2f33f5f"]]},{"id":"e7f53e0f4edea962","type":"inject","z":"ab15ca25fb016f10","d":true,"name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":4970,"y":200,"wires":[["325aa73cc40d0a2e"]]},{"id":"0d1942808aac968c","type":"link out","z":"ab15ca25fb016f10","name":"inject-dashboard-ui-out","mode":"link","links":["f2180f313b438230","4bd820d669082c23","e40c59f062a7adb9","7bca7951c9de3929","4c3e9698ddc24371","714ab173b87d4e1c","21d51f1b80601073","7ea7d01818d48baa","98827a9c43eb60f6","7b30ef15d86cc476","e094ffb284ce3910","b941481be75ad4d1","ceb08ca45a656149","8c786b4d23c4067b"],"x":465,"y":720,"wires":[]},{"id":"f2180f313b438230","type":"link in","z":"ab15ca25fb016f10","name":"inject-dashboard-ui-in","links":["0d1942808aac968c"],"x":555,"y":820,"wires":[["a731e42158618715"]]},{"id":"5a86bf60347c6515","type":"ui_ui_control","z":"ab15ca25fb016f10","name":"","events":"all","x":100,"y":740,"wires":[["6071c4716e763e7c","cc90e2604eabfc14"]]},{"id":"4bd820d669082c23","type":"link in","z":"ab15ca25fb016f10","name":"inject-dashboard-ui-in","links":["0d1942808aac968c"],"x":565,"y":1320,"wires":[["8c1367247296577e"]]},{"id":"e40c59f062a7adb9","type":"link in","z":"ab15ca25fb016f10","name":"inject-dashboard-ui-in","links":["0d1942808aac968c"],"x":585,"y":300,"wires":[["3ae4b7eebead8bb6"]]},{"id":"ebb392d4c763f70a","type":"inject","z":"ab15ca25fb016f10","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":380,"y":1660,"wires":[["f3a00f41c7af9c6a"]]},{"id":"7bca7951c9de3929","type":"link in","z":"ab15ca25fb016f10","name":"inject-dashboard-ui-in","links":["0d1942808aac968c"],"x":505,"y":1520,"wires":[["8d8a87b67fae565e"]]},{"id":"4c3e9698ddc24371","type":"link in","z":"ab15ca25fb016f10","name":"inject-dashboard-ui-in","links":["0d1942808aac968c"],"x":505,"y":1600,"wires":[["062b4f602c8fcfbe"]]},{"id":"714ab173b87d4e1c","type":"link in","z":"ab15ca25fb016f10","name":"inject-dashboard-ui-in","links":["0d1942808aac968c"],"x":515,"y":1700,"wires":[["3dca0b567697f449"]]},{"id":"21d51f1b80601073","type":"link in","z":"ab15ca25fb016f10","name":"inject-dashboard-ui-in","links":["0d1942808aac968c"],"x":525,"y":1880,"wires":[["41b05e97941fb486"]]},{"id":"7ea7d01818d48baa","type":"link in","z":"ab15ca25fb016f10","name":"inject-dashboard-ui-in","links":["0d1942808aac968c"],"x":525,"y":2060,"wires":[["099ee327b467a213"]]},{"id":"98827a9c43eb60f6","type":"link in","z":"ab15ca25fb016f10","name":"inject-dashboard-ui-in","links":["0d1942808aac968c"],"x":525,"y":2160,"wires":[["33492c8da9a7be0c"]]},{"id":"7b30ef15d86cc476","type":"link in","z":"ab15ca25fb016f10","name":"inject-dashboard-ui-in","links":["0d1942808aac968c"],"x":525,"y":2260,"wires":[["61696cbe18eebc34"]]},{"id":"83c159656f1f48d0","type":"comment","z":"ab15ca25fb016f10","name":"## Tables","info":"","x":80,"y":640,"wires":[]},{"id":"fd547689570206bf","type":"subflow:7cf6ee7ab0891d5c","z":"ab15ca25fb016f10","name":"","x":920,"y":1040,"wires":[["f7814a9b6d3b634f"]]},{"id":"76fc9867bf3a48d6","type":"function","z":"ab15ca25fb016f10","name":"SQL","func":"let LIMIT = new Date()\nLIMIT.setTime(LIMIT.getTime() - (3 * 31 * 24 * 60 * 60 * 1000))\n\nmsg.topic = `\nselect  DATETIME(timestamp/1000, 'unixepoch') as timestamp,\nDIFF ,\nDIFFKM\nfrom (\n\tselect timestamp, drivetrain_mileage,drivetrain_soc_kwh,\n\t\t(drivetrain_soc_kwh - LAG(drivetrain_soc_kwh, 1) OVER (ORDER BY timestamp)) as DIFF,\n\t\t(drivetrain_soc_kwh - LAG(drivetrain_soc_kwh, -1) OVER (ORDER BY timestamp)) as DIFFNEXT,\n\t\t(drivetrain_mileage - LAG(drivetrain_mileage, 1) OVER (ORDER BY timestamp)) as DIFFKM\n\tfrom drivetrain \n\twhere drivetrain_soc_kwh is not null ORDER BY TIMESTAMP  ASC\n) as t1\nwhere DIFF is not null and DIFF>1 and ABS(DIFF-DIFFNEXT)>3 and  timestamp > ${LIMIT.getTime()}\nORDER BY TIMESTAMP  DESC;`\nreturn msg;\n","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":770,"y":1040,"wires":[["fd547689570206bf"]]},{"id":"582c127b45504f09","type":"ui_table","z":"ab15ca25fb016f10","group":"b4a570f691d09351","name":"Charge","order":1,"width":18,"height":4,"columns":[{"field":"date","title":"","width":"200","align":"left","formatter":"plaintext","formatterParams":{"target":"_blank"}},{"field":"soc","title":"","width":"600","align":"left","formatter":"progress","formatterParams":{"target":"_blank"}},{"field":"price","title":"","width":"140","align":"left","formatter":"plaintext","formatterParams":{"target":"_blank"}}],"outputs":0,"cts":false,"x":1300,"y":1040,"wires":[]},{"id":"f7814a9b6d3b634f","type":"function","z":"ab15ca25fb016f10","name":"convert","func":"let data = msg.payload\n\nlet month = [... new Set(data.map(m => msg.action['refresh_lastVehicleState'].transform(m.timestamp).substring(0, 7)))]\n\nmsg.payload = data.map(m => {\n    let result = {\n        date: msg.action['refresh_lastVehicleState'].transform(m.timestamp).substring(0, 11),\n        soc: m.DIFF / global.get('saic').gateway.drivetrain_totalBatteryCapacity * 100\n    }\n    if (msg.getPriceBykwh) {\n        result.price = msg.getPriceBykwh(m.DIFF).toFixed(2) + ' ' + msg.translate('currency')\n    }\n    return result\n})\n\nconst gradientArray = new Gradient()\n    .setColorGradient(\"#F8F01C\", \"#5EFBEE\", \"#78F681\", \"#A80909\")\n    .getColors();\n\nconst FULL = global.get('saic').gateway.drivetrain_totalBatteryCapacity\nconst legend = `function(value){\n    let data = parseFloat(value);\n    if (data > 0) return '&nbsp;&nbsp;' + data.toFixed(0) + ' % - '  + (data * ${FULL} / 100).toFixed(1) + ' kW';\n    else return '-'; \n}`\nmsg.label_date = msg.translate(\"charge_date\")\nmsg.label_soc = msg.translate(\"charge_soc\")\nmsg.label_price = msg.translate(\"charge_price\")\nmsg.label_loss = msg.translate(\"charge_loss\")\n\nmsg.ui_control = {\n    \"tabulator\": {\n        \"columnResized\": \"function(column){     var newColumn = {         field: column._column.field,         visible: column._column.visible,         width: column._column.width,         widthFixed: column._column.widthFixed,         widthStyled: column._column.widthStyled     }; this.send({topic:this.config.topic,ui_control:{callback:'columnResized',columnWidths:newColumn}}); }\",\n        \"columnMoved\": \"function(column, columns){     var newColumns=[];     columns.forEach(function (column) {         newColumns.push({'field': column._column.field});     });     this.send({topic:this.config.topic,ui_control:{callback:'columnMoved',columns:newColumns}}); }\",\n        \"groupHeader\": \"function (value, count, data, group) {return value + \\\"<span style='color:#d00; margin-left:10px;'>(\\\" + count + \\\" Termostat\\\"+((count>1) ? \\\"e\\\" : \\\"\\\") + \\\")</span>\\\";}\",\n        \"columns\": [{\n            \"title\": `${msg.label_date}`,\n            \"field\": \"date\",\n        },\n        {\n            \"formatterParams\": {\n                \"target\": \"_blank\",\n                \"min\": 10,\n                \"max\": 80,\n                \"color\": gradientArray,\n                \"legend\": legend,\n                \"legendColor\": \"#101010\",\n                \"legendAlign\": \"center\"\n            },\n            \"title\": `${msg.label_soc} ( ${msg.label_loss}: ${(msg.getLoss() * 100).toFixed(0)} %)`,\n            \"field\": \"soc\",\n            \"formatter\": \"progress\",\n            \"width\": 600\n        },\n        {\n            \"title\": `${msg.label_price}`,\n            \"field\": \"price\",\n        }\n        ],\n        \"movableColumns\": false,\n        \"groupBy\": \"\"\n    },\n    \"customHeight\": 12\n}\n\n\n\ndelete msg.topic\ndelete msg.action\n\nreturn msg;","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[{"var":"Gradient","module":"javascript-color-gradient"}],"x":1120,"y":1040,"wires":[["582c127b45504f09"]]},{"id":"27f0265196954880","type":"inject","z":"ab15ca25fb016f10","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":410,"y":1080,"wires":[["cf4341f12af69043"]]},{"id":"e094ffb284ce3910","type":"link in","z":"ab15ca25fb016f10","name":"inject-dashboard-ui-in","links":["0d1942808aac968c"],"x":555,"y":1040,"wires":[["76fc9867bf3a48d6"]]},{"id":"b941481be75ad4d1","type":"link in","z":"ab15ca25fb016f10","name":"inject-dashboard-ui-in","links":["0d1942808aac968c"],"x":65,"y":380,"wires":[["d070dcb1b29d3078"]]},{"id":"ceb08ca45a656149","type":"link in","z":"ab15ca25fb016f10","name":"inject-dashboard-ui-in","links":["0d1942808aac968c"],"x":1825,"y":1080,"wires":[["69a107e740c7ddbe"]]},{"id":"59f1ac6111023403","type":"function","z":"ab15ca25fb016f10","name":"languageInit","func":"if (!msg.payload) msg.payload = 'FR'\nglobal.get('saic').language = msg.payload\nreturn msg","outputs":1,"timeout":0,"noerr":0,"initialize":"","finalize":"","libs":[],"x":2590,"y":160,"wires":[["532f7e6aa607c42a"]]},{"id":"8c786b4d23c4067b","type":"link in","z":"ab15ca25fb016f10","name":"inject-dashboard-ui-in","links":["0d1942808aac968c"],"x":2105,"y":160,"wires":[["f5e3e38862d0527b"]]},{"id":"cef023a594399a57","type":"comment","z":"ab15ca25fb016f10","name":"## Language","info":"https://github.com/SAIC-iSmart-API/saic-python-mqtt-gateway","x":2160,"y":100,"wires":[]},{"id":"582248828656e31d","type":"ui_dropdown","z":"ab15ca25fb016f10","name":"language","label":"{{ msg.label }}","tooltip":"","place":"FR","group":"51eafba7.ffc054","order":1,"width":4,"height":1,"passthru":false,"multiple":false,"options":[],"payload":"","topic":"","topicType":"str","className":"","x":2410,"y":160,"wires":[["59f1ac6111023403"]]},{"id":"f5e3e38862d0527b","type":"function","z":"ab15ca25fb016f10","name":"label","func":"msg.label = msg.translate(\"language\");\nmsg.payload = global.get(\"saic\").language\nmsg.options = global.get(\"saic\").language_supported\nreturn msg;","outputs":1,"timeout":0,"noerr":0,"initialize":"","finalize":"","libs":[],"x":2260,"y":160,"wires":[["582248828656e31d"]]},{"id":"4b89f802a542d145","type":"subflow:34b59e6388f9bd44","z":"ab15ca25fb016f10","name":"","x":2480,"y":680,"wires":[["ad3b33f927ca67f4"]]},{"id":"fbb42fe6a5ce9379","type":"subflow:34b59e6388f9bd44","z":"ab15ca25fb016f10","name":"","x":2470,"y":740,"wires":[["6f20a289c6f7926a"]]},{"id":"e8093890731ab8a0","type":"subflow:34b59e6388f9bd44","z":"ab15ca25fb016f10","name":"","x":2470,"y":800,"wires":[["234d6aef3e821821"]]},{"id":"b8c591c2fab06c20","type":"subflow:34b59e6388f9bd44","z":"ab15ca25fb016f10","name":"","x":2470,"y":920,"wires":[["107712b25c370a69"]]},{"id":"95c77b95b5f74d95","type":"subflow:34b59e6388f9bd44","z":"ab15ca25fb016f10","name":"","x":2470,"y":1120,"wires":[["85edd902984e04c2"]]},{"id":"dbed60bbdfaa1d44","type":"subflow:34b59e6388f9bd44","z":"ab15ca25fb016f10","name":"","x":2470,"y":1180,"wires":[["a3194335f7bf86e4"]]},{"id":"d99d79da044dabe9","type":"subflow:34b59e6388f9bd44","z":"ab15ca25fb016f10","name":"","x":2510,"y":1340,"wires":[["ef6c126b064c4bca"]]},{"id":"2f976fc33084702a","type":"subflow:34b59e6388f9bd44","z":"ab15ca25fb016f10","name":"","x":2530,"y":1400,"wires":[["5be9cf2de934de4c"]]},{"id":"3fc87905df480f87","type":"subflow:34b59e6388f9bd44","z":"ab15ca25fb016f10","name":"","x":2520,"y":1460,"wires":[["149ce7d5e0fe2df1"]]},{"id":"34c66d126581d7e7","type":"subflow:34b59e6388f9bd44","z":"ab15ca25fb016f10","name":"","x":2510,"y":1520,"wires":[["19bbccec1f38a461"]]},{"id":"70eac03f6f1fae07","type":"subflow:34b59e6388f9bd44","z":"ab15ca25fb016f10","name":"","x":2530,"y":1580,"wires":[["6c86d36b34969048"]]},{"id":"a8dcd66c1bb19d17","type":"subflow:34b59e6388f9bd44","z":"ab15ca25fb016f10","name":"","x":2530,"y":1640,"wires":[["581b2ac63061530b"]]},{"id":"821470b5181d2145","type":"function","z":"ab15ca25fb016f10","name":"label","func":"msg.label = msg.translate(\"clean\");\nreturn msg;","outputs":1,"timeout":0,"noerr":0,"initialize":"","finalize":"","libs":[],"x":310,"y":240,"wires":[["861effece44b5d91"]]},{"id":"5cc9edd42ab567bc","type":"subflow:cc759b59f1b564bf","z":"ab15ca25fb016f10","name":"","x":330,"y":720,"wires":[["0d1942808aac968c"]]},{"id":"8641e57fec030732","type":"inject","z":"ab15ca25fb016f10","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":380,"y":1560,"wires":[["f025636b8fa5dfc7"]]},{"id":"7dd47608491a24ad","type":"inject","z":"ab15ca25fb016f10","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":410,"y":1360,"wires":[["50b8f45e39e9e43d"]]},{"id":"0eab5bf646d4ffa9","type":"inject","z":"ab15ca25fb016f10","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":410,"y":880,"wires":[["dc367f0ff5380d8f"]]},{"id":"fca0d70265f5d261","type":"function","z":"ab15ca25fb016f10","name":"label","func":"msg.label = msg.translate(\"current\");\nreturn msg;","outputs":1,"timeout":0,"noerr":0,"initialize":"","finalize":"","libs":[],"x":310,"y":280,"wires":[["a9fb1a6e2e590cf5"]]},{"id":"677f68cd9e0cf116","type":"function","z":"ab15ca25fb016f10","name":"label","func":"msg.label = msg.translate(\"daily\");\nreturn msg;","outputs":1,"timeout":0,"noerr":0,"initialize":"","finalize":"","libs":[],"x":310,"y":320,"wires":[["45537282ba7287a7"]]},{"id":"a2b5e885f970e155","type":"function","z":"ab15ca25fb016f10","name":"label","func":"msg.label = msg.translate(\"weekly\");\nreturn msg;","outputs":1,"timeout":0,"noerr":0,"initialize":"","finalize":"","libs":[],"x":310,"y":360,"wires":[["93d7d24440def7cf"]]},{"id":"09633dc922f8ed80","type":"function","z":"ab15ca25fb016f10","name":"label","func":"msg.label = msg.translate(\"monthly\");\nreturn msg;","outputs":1,"timeout":0,"noerr":0,"initialize":"","finalize":"","libs":[],"x":310,"y":400,"wires":[["a7c7b7a6fd50054f"]]},{"id":"59ead8467f4706b9","type":"function","z":"ab15ca25fb016f10","name":"label","func":"msg.label = msg.translate(\"from\");\nmsg.payload = new Date()\nreturn msg;","outputs":1,"timeout":0,"noerr":0,"initialize":"","finalize":"","libs":[],"x":310,"y":440,"wires":[["10854a269219b0ab"]]},{"id":"6a5ee124c0889de2","type":"function","z":"ab15ca25fb016f10","name":"label","func":"msg.label = msg.translate(\"to\");\nmsg.payload = new Date()\nreturn msg;","outputs":1,"timeout":0,"noerr":0,"initialize":"","finalize":"","libs":[],"x":310,"y":480,"wires":[["b299ac5a7763118f"]]},{"id":"755ed15aad6588a4","type":"function","z":"ab15ca25fb016f10","name":"label","func":"msg.label = msg.translate(\"validate\");\nreturn msg;","outputs":1,"timeout":0,"noerr":0,"initialize":"","finalize":"","libs":[],"x":310,"y":540,"wires":[["a069ee20ef620458"]]},{"id":"0246f1a316d0a79a","type":"function","z":"ab15ca25fb016f10","name":"label","func":"msg.label = msg.translate(\"pressure\");\nreturn msg;","outputs":1,"timeout":0,"noerr":0,"initialize":"","finalize":"","libs":[],"x":1390,"y":1520,"wires":[["b7657bca89fe3c38"]]},{"id":"2c58edee9e3d1eae","type":"function","z":"ab15ca25fb016f10","name":"label","func":"msg.label = msg.translate(\"drivetrain_auxiliaryBatteryVoltage\");\nreturn msg;","outputs":1,"timeout":0,"noerr":0,"initialize":"","finalize":"","libs":[],"x":1390,"y":1600,"wires":[["9be901e93499814a"]]},{"id":"8b133ebc448dcc99","type":"function","z":"ab15ca25fb016f10","name":"label","func":"msg.label = msg.translate(\"drivetrain_mileage\");\nreturn msg;","outputs":1,"timeout":0,"noerr":0,"initialize":"","finalize":"","libs":[],"x":1390,"y":1680,"wires":[["4ae18de659c5b48f"]]},{"id":"d62d9e025b1cfff5","type":"function","z":"ab15ca25fb016f10","name":"label","func":"msg.label = msg.translate(\"cost\");\nreturn msg;","outputs":1,"timeout":0,"noerr":0,"initialize":"","finalize":"","libs":[],"x":1390,"y":1780,"wires":[["352fbd0ec73ddbfb"]]},{"id":"bf45bc7f117a4a02","type":"function","z":"ab15ca25fb016f10","name":"label","func":"msg.label = msg.translate(\"consumption\");\nreturn msg;","outputs":1,"timeout":0,"noerr":0,"initialize":"","finalize":"","libs":[],"x":1390,"y":1720,"wires":[["418081c077c6bb11"]]},{"id":"dc9a8a7a7b309829","type":"function","z":"ab15ca25fb016f10","name":"label","func":"msg.label = msg.translate(\"monthly_consumption\");\nreturn msg;","outputs":1,"timeout":0,"noerr":0,"initialize":"","finalize":"","libs":[],"x":1390,"y":1900,"wires":[["741d41078f190ae6"]]},{"id":"3b3e5ee2e5136378","type":"function","z":"ab15ca25fb016f10","name":"label","func":"msg.label = msg.translate(\"monthly_cost\");\nreturn msg;","outputs":1,"timeout":0,"noerr":0,"initialize":"","finalize":"","libs":[],"x":1390,"y":1960,"wires":[["4ac8a0c035004bb0"]]},{"id":"5ba46ec20fc8af22","type":"function","z":"ab15ca25fb016f10","name":"label","func":"msg.label = msg.translate(\"monthly_mileage\");\nreturn msg;","outputs":1,"timeout":0,"noerr":0,"initialize":"","finalize":"","libs":[],"x":1390,"y":2080,"wires":[["914787e43f19998e"]]},{"id":"c02b81e47ea14c58","type":"function","z":"ab15ca25fb016f10","name":"label","func":"msg.label = msg.translate(\"drivetrain_totalBatteryCapacity\");\nreturn msg;","outputs":1,"timeout":0,"noerr":0,"initialize":"","finalize":"","libs":[],"x":1390,"y":2180,"wires":[["cc73df5698ee4b45"]]},{"id":"d3599d5f5db5ccb3","type":"function","z":"ab15ca25fb016f10","name":"label","func":"msg.label = msg.translate(\"climate_exteriorTemperature\");\nreturn msg;","outputs":1,"timeout":0,"noerr":0,"initialize":"","finalize":"","libs":[],"x":1390,"y":2280,"wires":[["5f78df9cb7abc569"]]},{"id":"55bce74691e09ac7","type":"debug","z":"ab15ca25fb016f10","d":true,"name":"debug link","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"true","targetType":"full","statusVal":"","statusType":"auto","x":420,"y":2440,"wires":[]},{"id":"26a3e2a121d61529","type":"link in","z":"ab15ca25fb016f10","name":"debug-in","links":["f83b8d5a92f8c3b4","2319c9a1db807f6d","6339284c3359db19","d0e88a651121bd95","f45d6a4b153bd5b9","c13c7ee13c027946","96568f943c4bc2d2","b0015328619bfc5d","fadb1cdda47e9de6","6da0ad653937d14a","409ba4b0d2f33f5f"],"x":175,"y":2440,"wires":[["55bce74691e09ac7"]]},{"id":"f83b8d5a92f8c3b4","type":"link out","z":"ab15ca25fb016f10","name":"debug-out","mode":"link","links":["26a3e2a121d61529"],"x":1175,"y":1540,"wires":[]},{"id":"2319c9a1db807f6d","type":"link out","z":"ab15ca25fb016f10","name":"debug-out","mode":"link","links":["26a3e2a121d61529"],"x":1175,"y":1620,"wires":[]},{"id":"6339284c3359db19","type":"link out","z":"ab15ca25fb016f10","name":"debug-out","mode":"link","links":["26a3e2a121d61529"],"x":1255,"y":1740,"wires":[]},{"id":"d0e88a651121bd95","type":"link out","z":"ab15ca25fb016f10","name":"debug-out","mode":"link","links":["26a3e2a121d61529"],"x":1265,"y":1920,"wires":[]},{"id":"f45d6a4b153bd5b9","type":"link out","z":"ab15ca25fb016f10","name":"debug-out","mode":"link","links":["26a3e2a121d61529"],"x":1155,"y":2100,"wires":[]},{"id":"c13c7ee13c027946","type":"link out","z":"ab15ca25fb016f10","name":"debug-out","mode":"link","links":["26a3e2a121d61529"],"x":1155,"y":2200,"wires":[]},{"id":"96568f943c4bc2d2","type":"link out","z":"ab15ca25fb016f10","name":"debug-out","mode":"link","links":["26a3e2a121d61529"],"x":1155,"y":2300,"wires":[]},{"id":"b0015328619bfc5d","type":"link out","z":"ab15ca25fb016f10","name":"debug-out","mode":"link","links":["26a3e2a121d61529"],"x":1045,"y":420,"wires":[]},{"id":"fadb1cdda47e9de6","type":"link out","z":"ab15ca25fb016f10","name":"debug-out","mode":"link","links":["26a3e2a121d61529"],"x":3075,"y":240,"wires":[]},{"id":"6da0ad653937d14a","type":"link out","z":"ab15ca25fb016f10","name":"debug-out","mode":"link","links":["26a3e2a121d61529"],"x":4055,"y":300,"wires":[]},{"id":"409ba4b0d2f33f5f","type":"link out","z":"ab15ca25fb016f10","name":"debug-out","mode":"link","links":["26a3e2a121d61529"],"x":5415,"y":100,"wires":[]},{"id":"cc90e2604eabfc14","type":"debug","z":"ab15ca25fb016f10","d":true,"name":"ui events","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"true","targetType":"full","statusVal":"","statusType":"auto","x":280,"y":820,"wires":[]},{"id":"69a107e740c7ddbe","type":"function","z":"ab15ca25fb016f10","name":"clean","func":"delete msg.payload;\nreturn msg;","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":1940,"y":1080,"wires":[["482144536de7156b","94d9af55c9f0b823"]]},{"id":"d74264dae2a9131f","type":"inject","z":"ab15ca25fb016f10","name":"","props":[],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","x":1890,"y":1220,"wires":[["ca96252befb068d6"]]},{"id":"ca96252befb068d6","type":"subflow:cc759b59f1b564bf","z":"ab15ca25fb016f10","name":"","x":1920,"y":1280,"wires":[["dd936499b4be0225"]]},{"id":"9f7a01882f7c6ea7","type":"link in","z":"ab15ca25fb016f10","name":"ui-in","links":["532f7e6aa607c42a","f866de69287e5337"],"x":55,"y":800,"wires":[["6071c4716e763e7c"]]},{"id":"532f7e6aa607c42a","type":"link out","z":"ab15ca25fb016f10","name":"ui-out","mode":"link","links":["9f7a01882f7c6ea7"],"x":2805,"y":160,"wires":[]},{"id":"d5b6b02e2631fd92","type":"subflow:cc759b59f1b564bf","z":"ab15ca25fb016f10","name":"","x":3060,"y":960,"wires":[["c096f521dbd64168"]]},{"id":"09a762b569ef2219","type":"ui_text","z":"ab15ca25fb016f10","group":"51eafba7.ffc054","order":2,"width":16,"height":1,"name":"setError","label":"{{msg.label}}","format":"{{msg.payload}}","layout":"row-spread","className":"","style":true,"font":"Verdana,Verdana,Geneva,sans-serif","fontSize":"12","color":"#8080ff","x":2720,"y":500,"wires":[]},{"id":"b7762254b4f06234","type":"function","z":"ab15ca25fb016f10","name":"label","func":"delete msg.label \nreturn msg;","outputs":1,"timeout":0,"noerr":0,"initialize":"","finalize":"","libs":[],"x":2570,"y":500,"wires":[["09a762b569ef2219"]]},{"id":"6e7ed7606a600f42","type":"switch","z":"ab15ca25fb016f10","name":"Error","property":"error","propertyType":"msg","rules":[{"t":"true"},{"t":"else"}],"checkall":"true","repair":false,"outputs":2,"x":770,"y":120,"wires":[["f866de69287e5337"],["66505a9f9b43c08d"]]},{"id":"f866de69287e5337","type":"link out","z":"ab15ca25fb016f10","name":"ui-out","mode":"link","links":["9f7a01882f7c6ea7"],"x":945,"y":100,"wires":[]},{"id":"94d9af55c9f0b823","type":"function","z":"ab15ca25fb016f10","name":"convert","func":"const e = global.get('saic').setError\n/*\t\n\"key\": \"boot_result\",\n\"value\": \"Failed: return code: 4, message: Échec de L'exécution de la commande à distance, veuillez réessayer plus tard.\",\n\"date\": \"2024-03-05T05:02:08.689Z\"\n*/\n\nif (e && e.date && (new Date().getTime() - new Date(e.date).getTime()) < 24 * 60 * 60 * 1000) {\n    const date = msg.actionTime(e.date.getTime())\n    const text = e.value.split('message:')[1].split('(')[0]\n    msg.payload = `(${date}: ${msg.translate(e.key.split('_')[0])}) ${text}`\n} else {\n    msg.payload = ``\n}\n\nreturn msg;","outputs":1,"timeout":0,"noerr":0,"initialize":"","finalize":"","libs":[],"x":2240,"y":500,"wires":[["b7762254b4f06234"]]},{"id":"66505a9f9b43c08d","type":"subflow:7cf6ee7ab0891d5c","z":"ab15ca25fb016f10","name":"","x":980,"y":140,"wires":[[]]},{"id":"188f843b54583b11","type":"comment","z":"ab15ca25fb016f10","name":"### Return error","info":"","x":2240,"y":460,"wires":[]},{"id":"dc367f0ff5380d8f","type":"subflow:cc759b59f1b564bf","z":"ab15ca25fb016f10","name":"","x":590,"y":880,"wires":[["a731e42158618715"]]},{"id":"cf4341f12af69043","type":"subflow:cc759b59f1b564bf","z":"ab15ca25fb016f10","name":"","x":590,"y":1080,"wires":[["76fc9867bf3a48d6"]]},{"id":"50b8f45e39e9e43d","type":"subflow:cc759b59f1b564bf","z":"ab15ca25fb016f10","name":"","x":610,"y":1360,"wires":[["8c1367247296577e"]]},{"id":"03dd5a0476e59c78","type":"subflow:cc759b59f1b564bf","z":"ab15ca25fb016f10","name":"","x":530,"y":1960,"wires":[["41b05e97941fb486"]]},{"id":"44e6d7a0a133927a","type":"subflow:cc759b59f1b564bf","z":"ab15ca25fb016f10","name":"","x":550,"y":1760,"wires":[["3dca0b567697f449"]]},{"id":"072353f498eceeb6","type":"inject","z":"ab15ca25fb016f10","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":380,"y":1760,"wires":[["44e6d7a0a133927a"]]},{"id":"f3a00f41c7af9c6a","type":"subflow:cc759b59f1b564bf","z":"ab15ca25fb016f10","name":"","x":550,"y":1660,"wires":[["062b4f602c8fcfbe"]]},{"id":"f025636b8fa5dfc7","type":"subflow:cc759b59f1b564bf","z":"ab15ca25fb016f10","name":"","x":550,"y":1560,"wires":[["8d8a87b67fae565e"]]},{"id":"d63dd82e06c583bf","type":"subflow:cc759b59f1b564bf","z":"ab15ca25fb016f10","name":"","x":530,"y":2120,"wires":[["099ee327b467a213"]]},{"id":"3d15f2681506b318","type":"subflow:cc759b59f1b564bf","z":"ab15ca25fb016f10","name":"","x":530,"y":2220,"wires":[["33492c8da9a7be0c"]]},{"id":"2035bcdb9c111760","type":"subflow:cc759b59f1b564bf","z":"ab15ca25fb016f10","name":"","x":530,"y":2320,"wires":[["61696cbe18eebc34"]]},{"id":"82ee511fbe4d08d7","type":"ui_spacer","z":"ab15ca25fb016f10","name":"spacer","group":"7e73c2e872a65376","order":7,"width":9,"height":1},{"id":"460562628fc9f770","type":"ui_spacer","z":"ab15ca25fb016f10","name":"spacer","group":"734cb7f669648776","order":9,"width":11,"height":1},{"id":"3b7ebfb5f9b6d805","type":"ui_spacer","z":"ab15ca25fb016f10","name":"spacer","group":"734cb7f669648776","order":10,"width":11,"height":1},{"id":"bb14461294f17bc3","type":"ui_spacer","z":"ab15ca25fb016f10","name":"spacer","group":"734cb7f669648776","order":11,"width":11,"height":1},{"id":"b6051e041cd47746","type":"ui_spacer","z":"ab15ca25fb016f10","name":"spacer","group":"7d655f63961c4544","order":2,"width":5,"height":1},{"id":"6472389d15f1336f","type":"ui_group","name":"Maps","tab":"8d5192172f95a29e","order":4,"disp":false,"width":"18","collapse":false,"className":""},{"id":"734cb7f669648776","type":"ui_group","name":"Etat","tab":"8d5192172f95a29e","order":3,"disp":false,"width":"20","collapse":false,"className":""},{"id":"51eafba7.ffc054","type":"ui_group","name":"Car Status","tab":"8d5192172f95a29e","order":1,"disp":false,"width":"20","collapse":false,"className":""},{"id":"acbce132.6eef4","type":"mqtt-broker","name":"mosquitto","broker":"localhost","port":"1883","clientid":"","autoConnect":true,"usetls":false,"protocolVersion":"4","keepalive":"60","cleansession":true,"birthTopic":"","birthQos":"0","birthPayload":"","birthMsg":{},"closeTopic":"","closeQos":"0","closePayload":"","closeMsg":{},"willTopic":"","willQos":"0","willPayload":"","willMsg":{},"userProps":"","sessionExpiry":""},{"id":"779fd73bbe80ab61","type":"ui_group","name":"Journalier","tab":"8d5192172f95a29e","order":6,"disp":false,"width":"18","collapse":false,"className":""},{"id":"9d9f0155553a9dcb","type":"ui_group","name":"Mensuel","tab":"8d5192172f95a29e","order":7,"disp":false,"width":"18","collapse":false,"className":""},{"id":"7e73c2e872a65376","type":"ui_group","name":"Settings","tab":"8d5192172f95a29e","order":2,"disp":false,"width":"20","collapse":false,"className":""},{"id":"7d655f63961c4544","type":"ui_group","name":"Hidden","tab":"8d5192172f95a29e","order":8,"disp":false,"width":"6","collapse":false,"className":""},{"id":"b4a570f691d09351","type":"ui_group","name":"Charge","tab":"8d5192172f95a29e","order":5,"disp":false,"width":18,"collapse":false,"className":""},{"id":"8d5192172f95a29e","type":"ui_tab","name":"MG","icon":"https://img.icons8.com/clouds/100/car.png","order":3,"disabled":false,"hidden":false}]

Flow Info

Created 7 months ago
Updated 1 week, 6 days ago
Rating: not yet rated

Owner

Actions

Rate:

Node Types

Core
  • change (x11)
  • comment (x20)
  • debug (x3)
  • delay (x1)
  • function (x78)
  • http request (x3)
  • inject (x18)
  • json (x1)
  • link in (x16)
  • link out (x14)
  • mqtt in (x1)
  • mqtt out (x1)
  • mqtt-broker (x1)
  • switch (x2)
  • yaml (x1)
Other
  • junction (x5)
  • sqlite (x1)
  • sqlitedb (x1)
  • subflow (x6)
  • subflow:34b59e6388f9bd44 (x12)
  • subflow:508cc9124d7eeab6 (x2)
  • subflow:7cf6ee7ab0891d5c (x11)
  • subflow:94975f0123611419 (x2)
  • subflow:cc759b59f1b564bf (x13)
  • subflow:f83f9fc08f5e66d7 (x2)
  • tab (x1)
  • ui_are_you_sure (x1)
  • ui_button (x6)
  • ui_chart (x10)
  • ui_date_picker (x2)
  • ui_dropdown (x5)
  • ui_group (x8)
  • ui_slider (x2)
  • ui_spacer (x5)
  • ui_svg_graphics (x1)
  • ui_switch (x6)
  • ui_tab (x1)
  • ui_table (x9)
  • ui_text (x1)
  • ui_ui_control (x1)
  • ui_worldmap (x1)

Tags

  • car
  • mg
  • dashboard
  • mg4
  • french
Copy this flow JSON to your clipboard and then import into Node-RED using the Import From > Clipboard (Ctrl-I) menu option