Problème de JSON dans une configuration

Bonjour à tous, je tourne en rond depuis ce matin et j’embête le pauvre @Xav-74 aussi avec ça depuis ce soi et nous ne trouvons pas de solution c’est pourquoi je vous sollicite.

Voilà le problème, dans mon plugin myToyota je récupère des données sur un site et certaines de ces données vont être stockées dans la configuration de l’équipement. Je passe par AJAX pour aller chercher les données qui sont au format json. Lorsque ces données arrivent pour être affichées dans u textarea (mais ça fait pareil pour un pre, un input, …) tout se passe bien. Je fais la sauvegarde et là les données sont bien enregistrées en json mais le textarea ne peut plus les afficher. Par exemple, voici l’affichage lorsque les données reviennent:

Je clique sur "enregistrer et là:

Pourtant les données sont bien présentes dans la configuration (« capabilities »: …)

En texte si vous préférez:

capabilities":{"remoteEngineStartStop":false,"remoteEConnectCapable":false,"doorLockUnlockCapable":false,"frontDriverDoorLockStatus":false,"frontPassengerDoorLockStatus":false,"rearDriverDoorLockStatus":false,"rearPassengerDoorLockStatus":false,"frontDriverDoorOpenStatus":false,"frontPassengerDoorOpenStatus":false,"rearDriverDoorOpenStatus":false,"rearPassengerDoorOpenStatus":false,"frontDriverDoorWindowStatus":false,"frontPassengerDoorWindowStatus":false,"rearDriverDoorWindowStatus":false,"rearPassengerDoorWindowStatus":false,"rearHatchRearWindow":false,"moonroof":false,"powerWindowsCapable":false,"hazardCapable":false,"hornCapable":false,"lightsCapable":false,"climateCapable":false,"climateTemperatureControlFull":false,"climateTemperatureControlLimited":false,"frontDriverSeatHeater":false,"frontPassengerSeatHeater":false,"rearDriverSeatHeater":false,"rearPassengerSeatHeater":false,"frontDriverSeatVentilation":false,"frontPassengerSeatVentilation":false,"rearDriverSeatVentilation":false,"rearPassengerSeatVentilation":false,"steeringHeater":false,"mirrorHeater":false,"frontDefogger":false,"rearDefogger":false,"vehicleFinder":false,"guestDriver":false,"buzzerCapable":false,"trunkLockUnlockCapable":false,"evChargeStationsCapable":false,"fcvStationsCapable":false,"lastParkedCapable":false,"acScheduling":false,"chargeManagement":false,"nextCharge":false,"weeklyCharge":false,"powerTailgateCapable":false,"batteryStatus":false,"evBattery":false,"drivePulse":false,"electricPulse":false,"hydrogenPulse":false,"hybridPulse":true,"emergencyAssist":false,"bumpCollisions":false,"fuelLevelAvailable":true,"fuelRangeAvailable":false,"equippedWithAlarm":false,"manualRearWindows":false,"lightStatus":false,"bonnetStatus":false,"sunroof":false,"smartKeyStatus":false,"ecare":false,"tryAndPlay":false,"dashboardWarningLights":false,"weHybridCapable":false,"enhancedSecuritySystemCapable":false,"vehicleStatus":false,"stellantisVehicleStatusCapable":false,"stellantisClimateCapable":false,"vehicleDiagnosticCapable":true,"telemetryCapable":true,"econnectClimateCapable":false,"econnectVehicleStatusCapable":false}}

Au cours de mes expériences j’ai réusi à faire enregistrer en texte et ça fonctionne bien:

capabilities":"{\"remoteEngineStartStop\":false,\"remoteEConnectCapable\":false,\"doorLockUnlockCapable\":false,\"frontDriverDoorLockStatus\":false,\"frontPassengerDoorLockStatus\":false,\"rearDriverDoorLockStatus\":false,\"rearPassengerDoorLockStatus\":false,\"frontDriverDoorOpenStatus\":false,\"frontPassengerDoorOpenStatus\":false,\"rearDriverDoorOpenStatus\":false,\"rearPassengerDoorOpenStatus\":false,\"frontDriverDoorWindowStatus\":false,\"frontPassengerDoorWindowStatus\":false,\"rearDriverDoorWindowStatus\":false,\"rearPassengerDoorWindowStatus\":false,\"rearHatchRearWindow\":false,\"moonroof\":false,\"powerWindowsCapable\":false,\"hazardCapable\":false,\"hornCapable\":false,\"lightsCapable\":false,\"climateCapable\":false,\"climateTemperatureControlFull\":false,\"climateTemperatureControlLimited\":false,\"frontDriverSeatHeater\":false,\"frontPassengerSeatHeater\":false,\"rearDriverSeatHeater\":false,\"rearPassengerSeatHeater\":false,\"frontDriverSeatVentilation\":false,\"frontPassengerSeatVentilation\":false,\"rearDriverSeatVentilation\":false,\"rearPassengerSeatVentilation\":false,\"steeringHeater\":false,\"mirrorHeater\":false,\"frontDefogger\":false,\"rearDefogger\":false,\"vehicleFinder\":false,\"guestDriver\":false,\"buzzerCapable\":false,\"trunkLockUnlockCapable\":false,\"evChargeStationsCapable\":false,\"fcvStationsCapable\":false,\"lastParkedCapable\":false,\"acScheduling\":false,\"chargeManagement\":false,\"nextCharge\":false,\"weeklyCharge\":false,\"powerTailgateCapable\":false,\"batteryStatus\":false,\"evBattery\":false,\"drivePulse\":false,\"electricPulse\":false,\"hydrogenPulse\":false,\"hybridPulse\":true,\"emergencyAssist\":false,\"bumpCollisions\":false,\"fuelLevelAvailable\":true,\"fuelRangeAvailable\":false,\"equippedWithAlarm\":false,\"manualRearWindows\":false,\"lightStatus\":false,\"bonnetStatus\":false,\"sunroof\":false,\"smartKeyStatus\":false,\"ecare\":false,\"tryAndPlay\":false,\"dashboardWarningLights\":false,\"weHybridCapable\":false,\"enhancedSecuritySystemCapable\":false,\"vehicleStatus\":false,\"stellantisVehicleStatusCapable\":false,\"stellantisClimateCapable\":false,\"vehicleDiagnosticCapable\":true,\"telemetryCapable\":true,\"econnectClimateCapable\":false,\"econnectVehicleStatusCapable\":false}","updatetime":"2024-04-04 20:58:41"}

on a bien un affichage correct:

Si on rafraichi la page pas de problème mais dès qu’on clique sur « sauvegarder » paf on retombe sur le même problème…

Voici la ligne du php qui affiche les données de configuration:

<textarea id=get_capabilities rows="2" cols="50" class="eqLogicAttr form-control" data-l1key="configuration" data-l2key="capabilities" readonly></textarea>

Donc pour résumer, comment peut on faire pour afficher du json dans un textarea (ou un input :wink: )

Merci d’avance pour l’aide que vous pourrez apporter.

Hello,

Vu que c’est que de l’affichage, pourquoi lui attribuer un data-l1key & data-l2key ?

Bonjour,

Pourquoi vouloir afficher un json dans un textarea?

Pourquoi vouloir permettre de le modifier et le sauver? Vu les données j’imagine mal que ca soit utile pour une fonction du plugin

Hello, je le fait dans mon plugin homebridge, si tu l’as pas je peux te passer un code gratuit.

Hello à tous,

@Phpvarious, @Mips
Pour le json, il s’agit des possibilités du véhicules d’être interfacées avec le plugin. C’est uniquement à titre informatif pour le user (readonly) et pour le dev ca lui permet d’affiner son widget notamment en fonction de cela (ex : possibilité de lacer la ventilation à distance → j’affiche le bouton dans le widget).
Ces « capabilities » peuvent évoluées au fil du temps et des fonctions ajoutées par le constructeur.
D’où l’idée d’utiliser un attribut configuration :wink:

@nebz
J’ai le plugin, je vais jeter un oeil merci.
On arrive sans souci à afficher le json (en brut ou formaté (pretty)) mais lors du « save » de l’équipement, on perd l’info et je ne comprends pas pourquoi. Un json n’est qu’un string au final.
J’ai également essayer avec les balises <pre> (je le fais dans mon plugin pour afficher les données brutes renvoyées par BMW pour debug). Essayé aussi avec un <input> pour voir. Mais à chaque fois c’est pareil. Si on envoie juste un ‹ toto › en value, ca fonctionne par contre sans souci :thinking:

ah oui moi c’est pas dans l’eqLogic, c’est un dialog donc j’appelle mon propre ajax et je gère moi même le format et tout…

le problème arrive des que tu ajoutes une " ou bien dès que tu as une structure objet {} ? tu as regardé en preSave ce que tu recois ? ou directement en dev mode et voir les appels ajax

je viens de faire le test dans le champ commentaire d’un plugin et ça fait la même chose, j’ai mis {"test":"test"} et la valeur est bien dans le champ configuration quand on va voir les infos avancées, mais ne s’affiche plus dans le champ.

je pencherais plus sur un problème core… je suis en 4.3

j’ai trouvé je pense


il considère que c’est un objet et pas une chaine, il faudrait faire un JSON.stringify

Oui il ne faut pas mettre ce genre d’info accessible dans un champ qui va être géré par le save de l’équipement (avec les data-key) même si en readOnly ce n’est que sur le client, l’info sera sauvée à chaque fois et donc encodé.

C’était mon point en fait sinon j’avais bien compris que ca pouvait servir au plugin.

oui c’est peut-etre mieux de le mettre dans un dialog qu’on ouvre avec un bouton dans l’eqLogic.

genre un bouton « Configuration Avancée en JSON »

OK je comprends mieux
Merci pour votre aide !
Du coup, en effet, il vaut mieux passer par une modal comme je le fais dans myBMW. A voir ensuite comment sauvegarder les infos pour qu’elles soient accessibles au dev :wink:

:pray: :pray:

Ou alors en quickfix dans le preSave tu forces la valeur de la config avec la valeur actuellement en db.

1 « J'aime »

Tu veux dire copier/coller par l’utilisateur sur community par exemple?

Il y a sûrement plein d’exemple pour ca mais je peux aussi partager le code que j’ai pour ca

Non non je ne pense pas ! Enfin seul @Noyax37 peut le dire :slight_smile:
Juste les sauvegarder en db pour pouvoir checker les capabilities lors de l’affichage du widget

Par contre ca me fais penser que pour mon plugin, j’avais ca à faire en to-do : gérer le copié-collé pour les données brutes afin de faciliter l’envoi des données sur le forum :stuck_out_tongue:

Pour le sauver ca peut être dans la config comme maintenant si j’ai bien compris.
Faut juste pas l’afficher via le systeme de data-xxx je pense.

Oui tu as raison puisque les données sont bien en db :+1: my bad !

@Noyax37 d’autant plus que j’ai vu sur la dernière version que tu affiches un tableau plus lisible derrière reprenant les infos, je me trompe ? Donc pas besoin d’afficher le json brut.

Pour pouvoir le sauvegarder dans la config et le réutiliser plus tard

parce que c’est dans cette partie de la réponse que se trouvent les infos qui vont permettre de savoir ce que l’on peut envoyer comme commandes au véhicule.

merci c’est sympa, je te promets que je ne l’utiliserai pas pour autre chose :wink:

merci @Xav-74 c’est exactement ça :+1:

oui, non, non

ça me le fait aussi en 4.3 et 4.4

j’ai tenté mais ça me rajoute trois \ avant chaque " et la donnée n’est plus exploitable en json même avec un JSON.parse

"capabilities":"\"{\\\"remoteEngineStartStop\\\":false,

oui j’ai bien essayé de me passer de ça mais comment tu récupères la donnée après dans la configuration de ton équipement?

pourquoi pas, en fait je suis tétu et je voulais absolument trouver un moyen pour y arriver…

ah ok je n’avais pas pensé à ça, merci

c’est ça et pouvoir dire à l’utilisateur de ne pas essayer de verrouiller ses portes car sa voiture ne le permet pas

oui c’est ça

Merci à tous

1 « J'aime »

je viens de tenter ça, super ça marche. Merci @Mips :+1:

Merci aussi à tous le monde pour vos conseils précieux qui me serviront certainement dans d’autres situations :wink:

++

j’ai oublié de te répondre, oui j’affiche uniquement les valeurs à « true » de la liste en dessous du textarea