IBM Maximo — Corriger les erreurs de calcul de moyenne des compteurs ASSETMETER et LOCATIONMETER

Introduction

Les compteurs continus dans IBM Maximo sont au cœur de nombreux processus de maintenance préventive : kilométrage, heures de fonctionnement, cycles, consommation, nombre d’opérations, etc.

Maximo permet d’associer ces compteurs aussi bien aux équipements qu’aux emplacements. Les données principales sont notamment stockées dans :

Pour un compteur continu, Maximo propose plusieurs méthodes de calcul de la consommation moyenne :

  • ALL
  • SLIDING-DAYS
  • SLIDING-READINGS
  • STATIC

Dans certaines situations plus complexes, notamment lors de la modification d’un historique, de la saisie rétroactive, d’un RESET ou de la modification du dernier relevé de type DELTA, des comportements différents peuvent être observés entre ASSETMETER et LOCATIONMETER.

Cet article présente l’analyse technique réalisée, les différents problèmes identifiés et une stratégie de correction permettant de conserver au maximum le comportement standard IBM.


1. Rappel sur les compteurs continus Maximo

Un compteur continu représente une grandeur évoluant dans le temps : kilométrage, heures moteur, cycles, quantité produite, etc.

Pour un équipement, les informations courantes sont principalement portées par :

et son historique par :

Pour un emplacement :

et :

Maximo permet également la propagation de relevés d’un emplacement vers les équipements configurés pour accepter le rolldown depuis l’emplacement.


2. Les méthodes de calcul de moyenne

Pour les compteurs continus, IBM expose quatre méthodes principales.

ALL

La moyenne est basée sur l’ensemble de l’historique.

Schématiquement :

SLIDING-DAYS

Seuls les relevés appartenant à une fenêtre de N jours sont utilisés.

Exemple générique :

Le principe est :

SLIDING-READINGS

La fenêtre n’est plus définie en jours mais en nombre de relevés.

STATIC

Aucun recalcul dynamique :


3. Pourquoi AVERAGE est important

Le champ :

ou :

ne sert pas uniquement à afficher une information à l’utilisateur.

Cette moyenne peut également participer à l’estimation de la consommation future et donc indirectement à la planification des maintenances basées sur compteur.

La modification d’un relevé historique doit donc être considérée comme un traitement différent de l’ajout d’un nouveau relevé en fin de chronologie.


4. Premier problème : saisie hors ordre chronologique

Prenons un historique saisi dans cet ordre :

Ordre de saisieDateReading
1Date A100
2Date C200
3Date B150

avec :

Chronologiquement, l’historique réel devient :

Le relevé 150 est ajouté après le relevé 200 , mais sa date est antérieure.

Le système doit donc potentiellement recalculer :

et pas uniquement enregistrer une nouvelle ligne.


5. Le piège ALL / SLIDING-DAYS

L’un des comportements analysés concerne une logique comparable à :

Le problème conceptuel est immédiatement visible.

allReadings représente :

alors que, pour SLIDING-DAYS, slidingWindowSize représente :

Exemple générique :

La comparaison peut être vraie mathématiquement, mais elle compare deux grandeurs qui n’ont pas la même unité.

Pour une configuration :

la fenêtre doit être déterminée temporellement.

Schéma :


6. Deuxième problème : skipAverageRefresh

L’analyse du standard Maximo montre également l’importance d’un indicateur interne :

Son rôle est de permettre à Maximo d’éviter certains recalculs successifs de moyenne pendant le traitement d’une chaîne de relevés.

Schématiquement :

Dans certains scénarios de modification historique ou de RESET , ce flag peut empêcher le recalcul final attendu.

Une première correction consiste donc à restaurer correctement cet état avant le recalcul approprié.


7. Architecture retenue

L’objectif d’architecture est volontairement conservateur :

et seules les classes de gestion des historiques sont personnalisées :

Architecture :

Cette approche permet :

  • de limiter la surface de personnalisation ;
  • de conserver le maximum de code IBM ;
  • de faciliter les montées de version ;
  • de réduire les risques de régression ;
  • d’isoler précisément le correctif.

8. Correction des insertions rétroactives

Deux méthodes sont particulièrement importantes dans les ReadingSet:

et :

La première intervient lors de l’ajout d’un relevé nécessitant la mise à jour des relevés suivants.

La seconde intervient lorsqu’un relevé existant est modifié.

Le principe retenu est :

avec des logs permettant notamment de suivre :


9. Troisième problème : RESET

Un autre cas particulier est :

Le RESET introduit une rupture dans la continuité du compteur.

Exemple générique :

On ne peut pas simplement considérer :

comme une consommation réelle.

Le RESET modifie la manière dont les deltas et le LIFETODATE doivent être interprétés.

Le problème rencontré était qu’après certains RESET , les relevés étaient correctement traités mais la moyenne n’était pas nécessairement rafraîchie.

La correction apportée aux ReadingSet doit donc garantir :

sans réimplémenter toute la logique métier de DeployedMeter.


10. Quatrième problème : modification du dernier relevé DELTA

C’est l’un des cas les plus subtils rencontrés.

Considérons un historique générique :

DateReadingDeltaType
T1100100ACTUAL
T215050ACTUAL
T320050ACTUAL
T4500300ACTUAL
T552020DELTA
T660080ACTUAL
T765050DELTA
T8800150DELTA
T97000RESET
T10820120ACTUAL
T1190080DELTA

Les historiques METERREADING et LOCMETERREADING peuvent être strictement identiques.

Pourtant, après modification du dernier DELTA, on peut observer un écart du type :

avec :


11. Diagnostic : $locmeterReadingsToUpd est vide

Le log Maximo permet d’identifier le problème.

Le standard construit une requête comparable à :

Lorsque le relevé modifié est précisément le dernier relevé, le résultat est :

Pourquoi ?

Parce que Maximo cherche :

et qu’aucun autre relevé n’existe après lui.

Schéma :


12. Conséquence sur updateReadingsAfterReadingUpdate()

Le standard suit conceptuellement ce flux :

Dans ce scénario :

donc :

n’est jamais appelée.

C’est précisément le trou fonctionnel identifié.


13. Pourquoi isEmpty() n’a pas été surchargée

La première idée naturelle serait :

Mais MboSet.isEmpty() est une méthode final.

Le compilateur retourne alors :

Il faut donc trouver un autre point d’interception sans modifier LocationMeter .


14. Utilisation de setOrderBy() comme hook technique

Pendant la construction de $locmeterReadingsToUpd, appelle :

Cette méthode est appelée avant le test :

La solution consiste donc à surcharger :

tout en conservant d’abord le comportement standard :

setOrderBy() n’est naturellement pas une méthode de calcul de moyenne.

Elle sert normalement à définir :

sur le MboSet.

Elle est ici utilisée comme hook technique ciblé, car elle reste appelée même lorsque le MboSet qui sera ensuite retourné est vide.


15. Sécurisation du hook

Il serait dangereux d’exécuter le correctif sur chaque appel à setOrderBy().

Plusieurs conditions sont donc vérifiées :

puis :

puis :

puis :

et enfin :

Le correctif ne s’applique donc que dans ce scénario :


16. Le correctif minimal

Le cœur du correctif reste volontairement limité :

Lorsque :

le relevé modifié ne passe jamais par :

Il n’est donc pas enregistré dans le contexte utilisé par le calcul de moyenne.

On le fait explicitement avec :

Puis :

permet au :

standard IBM qui suit de continuer son traitement.

Le principe est donc :

fournir au standard IBM le contexte qui lui manque plutôt que remplacer entièrement son calcul.


17. Flux avant correction


18. Flux après correction


19. Exemple de logs génériques

Les logs permettent de confirmer le scénario sans exposer de données réelles :

puis :

Ces logs sont particulièrement utiles pour distinguer :

de :


20. Pourquoi ASSETMETER et LOCATIONMETER peuvent diverger

Deux historiques identiques :

ne garantissent pas automatiquement :

Le résultat dépend également :

  • du contexte DeployedMeter ;
  • des relevés considérés comme modifiés ;
  • des traitements de propagation ;
  • de skipAverageRefresh ;
  • de la méthode standard appelée ;
  • du contenu du MboSet intermédiaire ;
  • du type ACTUAL, DELTA ou RESET.

Dans le cas analysé, les historiques étaient identiques : l’origine de l’écart se situait donc dans le cycle de recalcul, pas dans les données persistées elles-mêmes.


21. Attention aux relevés ayant la même date

Un autre point à surveiller concerne plusieurs relevés très rapprochés.

Il est important de conserver les timestamps complets :

et pas seulement :

Une différence de quelques secondes peut modifier le résultat d’une clause :

Exemple :

Même si les deux relevés apparaissent à l’écran comme :

ils ne sont pas équivalents pour les requêtes SQL de Maximo.


22. Requête SQL générique de diagnostic

Une requête utile consiste à comparer les historiques Asset et Location.

Cette requête reste un outil de diagnostic et doit être adaptée si plusieurs relevés partagent exactement le même timestamp.


23. Checklist de diagnostic

Lorsque AVERAGE semble incorrecte, il est recommandé de contrôler dans cet ordre :


24. Tests de non-régression indispensables

Un correctif sur les compteurs ne doit jamais être validé avec un seul scénario.

TestScénarioRésultat attendu
T01ACTUAL dans l’ordremoyenne correcte
T02ACTUAL rétroactifrecalcul des suivants
T03DELTA dans l’ordremoyenne correcte
T04DELTA historique modifiémoyenne recalculée
T05dernier DELTA modifiémoyenne recalculée
T06RESETmoyenne recalculée
T07relevé après RESETcontinuité correcte
T08plusieurs RESETmoyenne correcte
T09timestamps très prochescomportement maîtrisé
T10SLIDING-DAYSfenêtre temporelle correcte
T11SLIDING-READINGSaucune régression
T12ALLaucune régression
T13STATICaucun recalcul
T14propagation Asset / Locationpropagation correcte
T15historiques identiquesmoyennes cohérentes lorsque le contexte métier est équivalent

25. Références techniques IBM

Pour approfondir le fonctionnement standard, les références IBM utiles sont notamment :

  • documentation IBM sur les méthodes de calcul de moyenne des compteurs ;
  • documentation sur les compteurs d’équipements ;
  • documentation sur les compteurs d’emplacements ;
  • documentation sur le mécanisme de propagation des relevés ;
  • APAR IBM relatifs aux calculs de moyenne après modification de l’historique ;
  • APAR relatifs aux comportements SLIDING-DAYS, SLIDING-READINGS et aux relevés hérités.

Dans une analyse de code Maximo 7.6.1.x, les classes particulièrement importantes sont :

et notamment les méthodes :


Pour résumé :

Une anomalie de AVERAGE dans Maximo ne provient pas nécessairement de la formule mathématique elle-même.

Plusieurs mécanismes peuvent intervenir simultanément :

Le cas le plus subtil concerne la modification du dernier LOCMETERREADING de type DELTA.

Comme aucun relevé postérieur n’existe :

le standard n’appelle pas :

Le relevé modifié peut alors ne pas être enregistré dans le contexte nécessaire au calcul de la moyenne.

La solution retenue respecte un principe important en personnalisation Maximo :

Corriger le contexte nécessaire au standard plutôt que réécrire tout le standard.

L’architecture reste ainsi :

avec des personnalisations concentrées dans :

et, pour le cas spécifique du dernier DELTA, l’enregistrement explicite du relevé modifié :

tout en maintenant :

afin que le refreshAverage() standard IBM puisse terminer correctement le traitement.

Cette approche illustre une méthode efficace pour diagnostiquer les anomalies complexes dans Maximo : partir des données, tracer le cycle MBO, comparer les chemins Asset et Location, identifier précisément le point de divergence puis appliquer la correction la plus locale possible.

maximo4you
maximo4you

Laisser un commentaire

Ce site utilise Akismet pour réduire les indésirables. Découvrez comment les données de vos commentaires sont traitées.