Erreur mysql Data too long for column

Bonjour,
Depuis hier, j’ai ce type d’erreur MYSQL

Erreur sur meteofrance::pullDataVigilance() : [MySQL] Error code : 22001 (1406). Data too long for column 'value' at row 1 : REPLACE INTO history SET cmd_id=:cmd_id, `datetime`=:datetime, value=:value	

Jeedom 4.4 beta

Bonjour,
A mon avis tu as coché historiser sur une commande qui renvoi une valeur trop grande. L’historique n’est pas fair pour ce genre de cas.

Bonjour,
Dans la bdd, la colonne value de la table history est limitée à 127 caractères.
Regardez dans les commandes Vigilance de type Autre lesquelles sont historisées et décochez l’historisation sur ces commandes. Principalement la commande « Vigilance - Json » qui dépasse allégrement les 127 caractères.

C’est une règle valable pour Jeedom en entier.

merci je suis passé en vigilance orage ça doit être ça

Bonjour Loic,

Ça serait peut-être pas mal un substr sur les valeurs en string afin de réduire leur longueur et éviter cette erreur MySql pas propre.
Et aussi que les commandes créées par exemple par le plugin virtual ne soient pas historisées par défaut.

J’explique pourquoi ces commandes ont une string de plus de 127 caractères.
Dans le plugin-meteofrance, pour faire cela:
image
J’avais le choix entre

  • Créer des dizaines de cmd à assembler dans un équipement pour chaque heure, jour, moment de la journée des prévisions météo. Le plugin meteofrance était déjà à environ 170 cmds. Ces commandes n’auraient alors comme seul lien entre elles que leur nom alors qu’elles sont très liées entre elles.

  • Créer une seule cmd dont la valeur sera en json. Le json peut être parsé en javascript par le navigateur. Des widgets qui le font sont fournis avec le plugin.
    Si un utilisateur a besoin d’un valeur contenue dans une cmd en json, une fonction php est fournie pour l’extraire. Actuellement, il faut créer un scénario qui ira chercher la valeur et l’affectera à une cmd d’un virtual. Si l’on pouvait ajouter cette fonction dans utils.inc.php, on pourrait le faire directement dans le virtuel en calcul. Est-ce possible ?

PS: Ce n’est pas tout à fait du json qui est dans la valeur de la cmd. Il a fallu contourner le $result = str_replace('"', '', $result); du plugin virtual en remplacant les " par "

Bonjour
Hésites pas à faire un pr, perso je le ferais pas car derrière je vais avoir des tonnes de ticket de pk ma chaîne est pas complète… Sans compter la maintenance en plus si on agrandit la colonne un jour…

OK.
Ce message d’erreur ne me dérange pas . Je sais comment le traiter. Pourvu que tout ce qui était à faire après l’erreur MySQL soit fait. :thinking:

Un avis peut-être sur ma façon de faire pour éviter la création de dizaine de cmds et la possibilité d’intégrer une fonction d’extraction de data dans du json dans utils.inc.php?

Je comprends pas ce que tu fais donc compliqué de te répondre… De plus ya tout ce qu’il faut en php pour gérer les JSON donc je sais pas trop ce qu’il te manque

Et si tu stockais la valeur json dans un $eqLogic->setConfiguration(json, valeurs);

Les cmds json passent partout designs, équipements, plugin virtuel …
Si c’est dans la configuration d’un équipement, il faudra faire des adaptations partout dans Jeedom.

Pour stocker des valeur vivante mieux vaut utiliser le cache.

1 « J'aime »

J’essaie de réduire le nombre de cmds dans un plugin en groupant les valeurs dans le json d’une seule commande.

Je n’ai fait que reprendre ce qui était fait dans le plugin script pour aller chercher un champ dans le json.
La fonction:

function extractValueFromJsonTxt($cmdValue, $request) {
  $txtJson = str_replace('"','"',$cmdValue);
  $json =json_decode($txtJson,true);
  if($json !== null) {
    $tags = explode('>', $request);
    foreach ($tags as $tag) {
      $tag = trim($tag);
      if (isset($json[$tag])) {
        $json = $json[$tag];
      } elseif (is_numeric(intval($tag)) && isset($json[intval($tag)])) {
        $json = $json[intval($tag)];
      } elseif (is_numeric(intval($tag)) && intval($tag) < 0 && isset($json[count($json) + intval($tag)])) {
        $json = $json[count($json) + intval($tag)];
      } else {
        $json = "Request error: tag[$tag] not found in " .json_encode($json);
        break;
      }
    }
    return (is_array($json)) ? json_encode($json) : $json;
  }
  return ("*** Unable to decode JSON: " .substr($txtJson,0,20));
}

$cmdValue est du texte en json. $request est sous la forme T > value ( Même syntaxe que le plugin script. )
Sur ce json dans $cmdValue, {"dt":1688000400,"T":{"value":16.5,"windchill":18.8},"h.... la fonction va retourner 16.5

J’ajoute que c’est comme ça que fonctionne le plugin-meteofrance dans sa dernière version.
Il y a juste l’erreur MySQL si une commande json est archivée. Et l’extraction de données d’une commande json qui nécessite un bloc code de scénario