Relance du projet Pronote pour Jeedom

Bonjour,
Cela m’est arrivé uniquement à la relance du Daemon RFXCOM.
A priori la réinstallation des dépendances RFXCOM a écrasé les modifs et mauvaises versions python des dépendances de Projote. Projote fonctionne toujours. Juste les infos de connexion projote dans http_error que je ne comprends pas. J’attends la mise à jour pour vous les coller ici.

Bonne journée

Ce serait super.
De mon côté j’ai tenté de faire cela via un scenario via la commande nouvelle note. Cela fonctionne lorsqu’une seule nouvelle note arrive, mais là j’en ai reçu 3 en même temps, mais je n’ai eu qu’une seule notif pour une seule note…

Le bloc code

// Récupération du JSON depuis ta commande info
$json = cmd::byId(23817)->execCmd();

// Décodage JSON en tableau associatif
$notes = json_decode($json, true);

// Extraction des champs
$id = $notes[0]["id"];
$date = $notes[0]["date"];
$cours = $notes[0]["cours"];
$note  = $notes[0]["note"];
$sur   = $notes[0]["sur"];
$coef = $notes[0]["coeff"];
$moyenne_classe = $notes[0]["moyenne_classe"];
$max = $notes[0]["max"];
$min = $notes[0]["min"];
$commentaire = $notes[0]["commentaire"];

// Tu peux ensuite les stocker dans des variables Jeedom :
scenario::setData("derniere_note_date", $date);
scenario::setData("derniere_note_cours", $cours);
scenario::setData("derniere_note_note", $note);
scenario::setData("derniere_note_sur", $sur);
scenario::setData("derniere_note_coef", $coef);
scenario::setData("derniere_note_moyenne_classe", $moyenne_classe);
scenario::setData("derniere_note_max", $max);
scenario::setData("derniere_note_min", $min);
scenario::setData("derniere_note_commentaire", $commentaire);

Il serait bien d’avoir aussi la dernière « Dernière compétence » :slight_smile:

1 « J'aime »

Ce soir j’ai essayé de détecter les nouvelles notes à partir de la liste des notes dans un bloc code avec chatgpt, mais je ne comprends pas pourquoi il m’indique qu’il y a de nouvelles notes à chaque exécution alors que les logs montrent bien que non… C’est comme si les clés connus n’étaient lues.

Si un expert php passe par là :pray:

Le code

// JSON reçu de Pronote
$json = cmd::byId(23816)->execCmd();
$notes = json_decode($json, true);

// Récupération sécurisée des clés
$cles_connues = json_decode(config::byKey('pronote_cles', 'projote', '[]'), true);
if (!is_array($cles_connues)) {
    $cles_connues = [];
}

// Fonction de nettoyage pour stabiliser les données
function normalize($val) {
    // Supprimer espaces spéciaux (insécables, tab, etc.)
    $val = preg_replace('/\s+/u', ' ', $val);
    // Supprimer espaces début/fin et uniformiser en minuscules
    return strtolower(trim($val));
}

$nouvelles_notes = [];

// Debug : afficher les clés connues avant le traitement
error_log("=== Début exécution Pronote ===");
error_log("Clés connues AVANT : " . json_encode($cles_connues));

foreach ($notes as $note) {
    // Création clé unique stable
    $cle_note = md5(
        normalize($note['date']) . '|' .
        normalize($note['cours']) . '|' .
        normalize($note['note']) . '|' .
        normalize($note['sur']) . '|' .
        normalize($note['commentaire'])
    );

    // Debug : afficher la clé générée et les champs sources
    error_log("Note : {$note['cours']} {$note['note']} / {$note['sur']} ({$note['date']})");
    error_log("Commentaire : {$note['commentaire']}");
    error_log("Clé calculée : $cle_note");

    if (!in_array($cle_note, $cles_connues)) {
        error_log("➡️ Nouvelle note détectée !");
        $nouvelles_notes[] = $note;
        $cles_connues[] = $cle_note;

        // Message Discord
        $message = "Le {$note['date']}
Matière : {$note['cours']}
Note : {$note['note']} / {$note['sur']}
Coef. : {$note['coeff']}
Moy. classe : {$note['moyenne_classe']}
Note max : {$note['max']}
Note min : {$note['min']}
Commentaire : {$note['commentaire']}";

        $options = [
            'Titre' => "Pronote - Nouvelle note Noé",
            'colors' => "#1ea6fa",
            'description' => $message,
            'footer' => ""
        ];
        cmd::byString("#[Monitoring][Communication discord - Pronote][Envoi message évolué]#")->execCmd($options, $cache = 0);
    } else {
        error_log("✅ Déjà connue, ignorée.");
    }
}

// Sauvegarder les clés mises à jour
config::save('pronote_cles', json_encode($cles_connues), 'projote');

// Debug : état final
error_log("Clés connues APRÈS : " . json_encode($cles_connues));
error_log("Nombre de nouvelles notes : " . count($nouvelles_notes));
error_log("=== Fin exécution Pronote ===");

Les logs

0075|=== Début exécution Pronote ===
0076|Clés connues AVANT : []
0077|Note : ANGLAIS LV1 13,5 / 20 (22/09/2025)
0078|Commentaire : CE-SEQ1-INTRODUCING
0079|Clé calculée : 74c3c4551aba244043217623874a4434
0080|➡️ Nouvelle note détectée !
0081|Note : MATHEMATIQUES 18,5 / 20 (22/09/2025)
0082|Commentaire : contrôle "  expression numérique"
0083|Clé calculée : a85e0550318967e29f0ee1dc827f7407
0084|➡️ Nouvelle note détectée !
0085|Note : ANGLAIS LV1 13 / 20 (19/09/2025)
0086|Commentaire : CO-SEQ1- INTRODUCING
0087|Clé calculée : 73553eb9ee057f11650477e908a838fa
0088|➡️ Nouvelle note détectée !
0089|Note : ANGLAIS LV1 16,75 / 20 (19/09/2025)
0090|Commentaire : EOD_SEQ1_Dialogue_introducing
0091|Clé calculée : cd367c0f12e1b4296a83121638544f37
0092|➡️ Nouvelle note détectée !
0093|Note : HISTOIRE-GEOGRAPHIE 7 / 10 (19/09/2025)
0094|Commentaire : Rédaction - la ville de Constantinople
0095|Clé calculée : d7982998def13e78384693af4696e5af
0096|➡️ Nouvelle note détectée !
0097|Note : HISTOIRE-GEOGRAPHIE 4 / 5 (04/09/2025)
0098|Commentaire : Interrogation orale individuelle
0099|Clé calculée : 63303e1f67d429ab139f61ab7a0a6b99
0100|➡️ Nouvelle note détectée !
0101|Clés connues APRÈS : ["74c3c4551aba244043217623874a4434","a85e0550318967e29f0ee1dc827f7407","73553eb9ee057f11650477e908a838fa","cd367c0f12e1b4296a83121638544f37","d7982998def13e78384693af4696e5af","63303e1f67d429ab139f61ab7a0a6b99"]
0102|Nombre de nouvelles notes : 6
0103|=== Fin exécution Pronote ===

Bonjour

je sais pas si cela répondra à ta question mais j’ai utilisé ton code dans un scenario

il se déclenche quand la commande #[Plugin Physique][Pronote ALEXIS3][Dernière note]# du plugin se met à jour

mais je test une variable qui concatène : variable(derniere_note_note,0) variable(derniere_note_cours,0) variable(derniere_note_date,0)
si elle n’a pas changée alors je ne fais rien

c’est pas super propre, le script se lance toutes les heures mais ne fait rien si pas une nouvelle note

l’objectif étant de juste nous envoyé un message quand une nouvelle note arrive

Perso, mon objectif est de m’envoyer toutes les nouvelles notes pour éviter d’aller voir ensuite sur Pronote.
Le scénario sur la cde dernière noté fonctionne bien lorsqu’il y a qu’une seule nouvelle note lors de l’actualisation, mais s’il y a en plusieurs nouvelles, certaines passent à la trappe.

D’où l’essai d’une nouvelle version en passant par la liste des notes et en scrutant le listing.

1 « J'aime »

Essayes ca :

// JSON reçu de Pronote
$json = cmd::byId(53412)->execCmd();
$notes = json_decode($json, true);

// Récupération sécurisée des clés (stockées en tableau PHP)
$cles_connues = config::byKey('pronote_cles', 'projote', []);
if (!is_array($cles_connues)) {
    // Si jamais c'est encore une string JSON, on tente de décoder
    $tmp = json_decode($cles_connues, true);
    $cles_connues = is_array($tmp) ? $tmp : [];
}

// Fonction de nettoyage pour stabiliser les données
function normalize($val) {
    $val = preg_replace('/\s+/u', ' ', (string)$val);
    return strtolower(trim($val));
}

$nouvelles_notes = [];

// Debug
$scenario->setLog("=== Début exécution Pronote ===");
$scenario->setLog("Clés connues AVANT : " . json_encode($cles_connues));

foreach ($notes as $note) {
    $cle_note = md5(
        normalize($note['date']) . '|' .
        normalize($note['cours']) . '|' .
        normalize($note['note']) . '|' .
        normalize($note['sur']) . '|' .
        normalize($note['commentaire'])
    );

    $scenario->setLog("Note : {$note['cours']} {$note['note']} / {$note['sur']} ({$note['date']})");
    $scenario->setLog("Commentaire : {$note['commentaire']}");
    $scenario->setLog("Clé calculée : $cle_note");

    if (!in_array($cle_note, $cles_connues, true)) {
        $scenario->setLog("➡️ Nouvelle note détectée !");
        $nouvelles_notes[] = $note;
        $cles_connues[] = $cle_note;

        $message = "Le {$note['date']}
            Matière : {$note['cours']}
            Note : {$note['note']} / {$note['sur']}
            Coef. : {$note['coeff']}
            Moy. classe : {$note['moyenne_classe']}
            Note max : {$note['max']}
            Note min : {$note['min']}
            Commentaire : {$note['commentaire']}";

        $options = [
            'Titre' => "Pronote - Nouvelle note Noé",
            'colors' => "#1ea6fa",
            'description' => $message,
            'footer' => ""
        ];
        #cmd::byString("#[Monitoring][Communication discord - Pronote][Envoi message évolué]#")->execCmd($options, $cache = 0);
    } else {
        $scenario->setLog("✅ Déjà connue, ignorée.");
    }
}

// Sauvegarder le tableau directement (pas JSON)
config::save('pronote_cles', $cles_connues, 'projote');

// Debug final
$scenario->setLog("Clés connues APRÈS : " . json_encode($cles_connues));
$scenario->setLog("Nombre de nouvelles notes : " . count($nouvelles_notes));
$scenario->setLog("=== Fin exécution Pronote ===");

changer l’ID et décommenter le discord :slight_smile:

Merci pour ce bout de code!

Ta commande 53412 correspond à quoi?

$json = cmd::byId(53412)->execCmd();

Edit: est-ce qu’on n’ouvrirai pas un nouveau fil pour ce sujet (notification nouvelles notes)?

Merci cela fonctionne parfaitement :pray:

J’ai ajouté une petite gestion des couleurs dans le message en fonction de la matière.

// JSON reçu de Pronote
$json = cmd::byId(23816)->execCmd();
$notes = json_decode($json, true);

// Récupération sécurisée des clés (stockées en tableau PHP)
$cles_connues = config::byKey('pronote_cles', 'projote', []);
if (!is_array($cles_connues)) {
    // Si jamais c'est encore une string JSON, on tente de décoder
    $tmp = json_decode($cles_connues, true);
    $cles_connues = is_array($tmp) ? $tmp : [];
}

// Fonction de nettoyage pour stabiliser les données
function normalize($val) {
    $val = preg_replace('/\s+/u', ' ', (string)$val);
    return strtolower(trim($val));
}

// Fonction qui retourne la couleur selon la matière
function couleurMatiere($matiere) {
    $mapping = [
        'FRANCAIS' => '#27BBF5',
        'PHYSIQUE-CHIMIE' => '#57C412',
        'ESPAGNOL LV2' => '#99270B',
        'MATHEMATIQUES' => '#098218',
        'VIE DE CLASSE' => '#FFFFFF',
        'ANGLAIS LV1' => '#FFE300',
        'EDUCATION MUSICALE' => '#FFF2F2',
      	'HISTOIRE-GEOGRAPHIE' => '#E04B26',
        'ARTS PLASTIQUES' => '#FFF2F2',
        'ED.PHYSIQUE & SPORT.' => '#5585B5',
      	'TECHNOLOGIE' => '#E027F5',
      	'SCIENCES VIE & TERRE' => '#266E35',
    ];

    // Normalisation : on passe tout en majuscules
    $matiere = strtoupper(normalize($matiere));

    // Si la matière exacte est dans la table
    if (isset($mapping[$matiere])) {
        return $mapping[$matiere];
    }

    // Sinon couleur "AUTRES"
    return '#B5559F';
}

$nouvelles_notes = [];

// Debug
$scenario->setLog("=== Début exécution Pronote ===");
$scenario->setLog("Clés connues AVANT : " . json_encode($cles_connues));

foreach ($notes as $note) {
    $cle_note = md5(
        normalize($note['date']) . '|' .
        normalize($note['cours']) . '|' .
        normalize($note['note']) . '|' .
        normalize($note['sur']) . '|' .
        normalize($note['commentaire'])
    );

    $scenario->setLog("Note : {$note['cours']} {$note['note']} / {$note['sur']} ({$note['date']})");
    $scenario->setLog("Commentaire : {$note['commentaire']}");
    $scenario->setLog("Clé calculée : $cle_note");

    if (!in_array($cle_note, $cles_connues, true)) {
        $scenario->setLog("➡️ Nouvelle note détectée !");
        $nouvelles_notes[] = $note;
        $cles_connues[] = $cle_note;

        // Choix de la couleur
        $color = couleurMatiere($note['cours']);

        $message = "Le {$note['date']}
            Matière : {$note['cours']}
            Note : {$note['note']} / {$note['sur']}
            Coef. : {$note['coeff']}
            Moy. classe : {$note['moyenne_classe']}
            Note max : {$note['max']}
            Note min : {$note['min']}
            Commentaire : {$note['commentaire']}";

        $options = [
            'Titre' => "Pronote - Nouvelle note Noé",
            'colors' => $color,
            'description' => $message,
            'footer' => ""
        ];
        cmd::byString("#[Monitoring][Communication discord - Pronote][Envoi message évolué]#")->execCmd($options, $cache = 0);
    } else {
        error_log("✅ Déjà connue, ignorée.");
    }
}

// Sauvegarder le tableau directement (pas JSON)
config::save('pronote_cles', $cles_connues, 'projote');

// Debug final
$scenario->setLog("Clés connues APRÈS : " . json_encode($cles_connues));
$scenario->setLog("Nombre de nouvelles notes : " . count($nouvelles_notes));
$scenario->setLog("=== Fin exécution Pronote ===");

il faut mettre le numéro de ta commande « liste de note »

1 « J'aime »

Et voici l’équivalent pour les compétences…

// JSON reçu de Pronote (compétences)
$json = cmd::byId(23820)->execCmd(); // ⚠️ adapte l'ID à ton Jeedom
$competences = json_decode($json, true);

// Récupération sécurisée des clés (stockées en tableau PHP)
$cles_connues = config::byKey('pronote_competences_cles', 'projote', []);
if (!is_array($cles_connues)) {
    $tmp = json_decode($cles_connues, true);
    $cles_connues = is_array($tmp) ? $tmp : [];
}

// Fonction de nettoyage
function normalize($val) {
    $val = preg_replace('/\s+/u', ' ', (string)$val);
    return strtolower(trim($val));
}

// Fonction couleur selon la matière
function couleurMatiere($matiere) {
    $mapping = [
        'FRANCAIS' => '#27BBF5',
        'PHYSIQUE-CHIMIE' => '#57C412',
        'ESPAGNOL LV2' => '#99270B',
        'MATHEMATIQUES' => '#098218',
        'VIE DE CLASSE' => '#FFFFFF',
        'ANGLAIS LV1' => '#FFE300',
        'EDUCATION MUSICALE' => '#FFF2F2',
      	'HISTOIRE-GEOGRAPHIE' => '#E04B26',
        'ARTS PLASTIQUES' => '#FFF2F2',
        'ED.PHYSIQUE & SPORT.' => '#5585B5',
      	'TECHNOLOGIE' => '#E027F5',
      	'SCIENCES VIE & TERRE' => '#266E35',
    ];
    $matiere = strtoupper(normalize($matiere));
    return $mapping[$matiere] ?? '#B5559F'; // AUTRES
}

$nouvelles_competences = [];

// Debug
$scenario->setLog("=== Début exécution Pronote (compétences) ===");
$scenario->setLog("Clés connues AVANT : " . json_encode($cles_connues));

foreach ($competences as $comp) {
    // Génération clé unique
    $cle_comp = md5(
        normalize($comp['date']) . '|' .
        normalize($comp['nom']) . '|' .
        normalize($comp['Sujet']) . '|' .
        normalize($comp['professeur'])
    );

    $scenario->setLog("Compétence : {$comp['nom']} ({$comp['Sujet']} - {$comp['date']})");
    $scenario->setLog("Clé calculée : $cle_comp");

    if (!in_array($cle_comp, $cles_connues, true)) {
        $scenario->setLog("➡️ Nouvelle compétence détectée !");
        $nouvelles_competences[] = $comp;
        $cles_connues[] = $cle_comp;

        // Couleur selon matière
        $color = couleurMatiere($comp['Sujet']);

        // Construire la liste des acquisitions
        $acquis_txt = "";
        foreach ($comp['acquisitions'] as $acq) {
            $nom = $acq['name'] ?: "(sans intitulé)";
            $abbr = $acq['abbreviation'] ?: "-";
            $acquis_txt .= "- Note : {$abbr} -  {$acq['level']} 
            {$acq['domain']}
            → {$nom}\n";
        }

        // Message Discord
        $message = "Le {$comp['date']}
            Matière : {$comp['Sujet']}
            Compétence : {$comp['nom']}
            Professeur : {$comp['professeur']}
            Paliers : " . implode(', ', $comp['Paliers']) . "
            
            ✅ Acquisitions :
            {$acquis_txt}";

        $options = [
            'Titre' => "Pronote - Nouvelle compétence Noé",
            'colors' => $color,
            'description' => $message,
            'footer' => ""
        ];
        cmd::byString("#[Monitoring][Communication discord - Pronote][Envoi message évolué]#")->execCmd($options, $cache = 0);
    } else {
        error_log("✅ Déjà connue, ignorée.");
    }
}

// Sauvegarde des clés
config::save('pronote_competences_cles', $cles_connues, 'projote');

// Debug final
$scenario->setLog("Clés connues APRÈS : " . json_encode($cles_connues));
$scenario->setLog("Nombre de nouvelles compétences : " . count($nouvelles_competences));
$scenario->setLog("=== Fin exécution Pronote (compétences) ===");

Si vous faites des tests, vouspouvez avoir besoin de vider les tables pour pouvoir renvoyer les notifications. Voici donc les codes à mettre dans un scenario.
Pour les notes

// Vider toutes les clés connues
config::save('pronote_cles', [], 'projote');
$scenario->setLog("Table des clés vidée !");

Pour les compétences

// Vider toutes les compétences connues
config::save('pronote_competences_cles', [], 'projote');
$scenario->setLog("Table des compétences vidée !");
1 « J'aime »

Merci à vous deux @dsigmoun et @Nemeraud!

Voici mon code avec l’ajout d’emoticon en fonction de la note et l’envoi par PushOver:

//<?php
// ==========================
// Définition des emojis en code hex
// ==========================
$tags['#logoBooks#'] = "&"."#x1F4DA;";
$tags['#logoClappingHands#'] = "&"."#x1F44F;";
$tags['#logoThumbsUp#'] = "&"."#x1F44D;";
$tags['#logoSlightlyFrowningFace#'] = "&"."#x1F641;";
$tags['#logoThumbsDown#'] = "&"."#x1F44E;";
$tags['#logoHundredPoints#'] = "&"."#x1F4AF;";
$tags['#logoSpiralNotepad#'] = "&"."#x1F5D2;";

// ==========================
// JSON reçu de Pronote
// ==========================
$json = cmd::byId(6814)->execCmd();
$notes = json_decode($json, true);

// ==========================
// Récupération sécurisée des clés connues
// ==========================
$cles_connues = config::byKey('pronote_cles', 'projote', []);
if (!is_array($cles_connues)) {
    $tmp = json_decode($cles_connues, true);
    $cles_connues = is_array($tmp) ? $tmp : [];
}

// ==========================
// Fonction pour normaliser les valeurs
// ==========================
function normalize($val) {
    $val = preg_replace('/\s+/u', ' ', (string)$val);
    return strtolower(trim($val));
}

// ==========================
// Préparation pour stocker les nouvelles notes
// ==========================
$nouvelles_notes = [];

// ==========================
// Debug initial
// ==========================
$scenario->setLog("=== Début exécution Pronote ===");
$scenario->setLog("Clés connues AVANT : " . json_encode($cles_connues));

// ==========================
// Boucle sur les notes Pronote
// ==========================
foreach ($notes as $note) {

    // Génération d'une clé unique pour chaque note
    $cle_note = md5(
        normalize($note['date']) . '|' .
        normalize($note['cours']) . '|' .
        normalize($note['note']) . '|' .
        normalize($note['sur']) . '|' .
        normalize($note['commentaire'])
    );

    $scenario->setLog("Note : {$note['cours']} {$note['note']} / {$note['sur']} ({$note['date']})");
    $scenario->setLog("Commentaire : {$note['commentaire']}");
    $scenario->setLog("Clé calculée : $cle_note");

    // Vérification si la note est nouvelle
    if (!in_array($cle_note, $cles_connues, true)) {
        $scenario->setLog("➡️ Nouvelle note détectée !");
        $nouvelles_notes[] = $note;
        $cles_connues[] = $cle_note;

        // ==========================
        // Calcul du ratio et appréciation
        // ==========================
        $note_note = (float) $note['note'];
        $sur_note  = (float) $note['sur'];
        $ratio     = $note_note / $sur_note;

        if ($ratio == 1) {
            $appreciation = $tags['#logoClappingHands#'];
        } elseif ($ratio >= 0.75 && $ratio < 1) {
            $appreciation = $tags['#logoThumbsUp#'];
        } elseif ($ratio >= 0.5 && $ratio < 0.75) {
            $appreciation = $tags['#logoSlightlyFrowningFace#'];
        } else {
            $appreciation = $tags['#logoThumbsDown#'];
        }

        // ==========================
        // Construction du message Pushover
        // ==========================
        $title   = "Nouvelle note en {$note['cours']}";
        $message = $tags['#logoBooks#'] . " {$note['commentaire']} du {$note['date']}\n$appreciation $note_note/$sur_note";

        // ==========================
        // Envoi de la notification via Pushover
        // ==========================
        $options = [
            'title'    => $title,
            'message'  => $message
        ];

        cmd::byString("#[Communication][PushOver2 - Notification][Ju]#")->execCmd($options);

        // ==========================
        // Mise à jour variable de suivi
        // ==========================
        $scenario->setData('note_appréciation', $appreciation);

    } else {
        $scenario->setLog("✅ Déjà connue, ignorée.");
    }
}

// ==========================
// Sauvegarde des clés mises à jour
// ==========================
config::save('pronote_cles', $cles_connues, 'projote');

// ==========================
// Debug final
// ==========================
$scenario->setLog("Clés connues APRÈS : " . json_encode($cles_connues));
$scenario->setLog("Nombre de nouvelles notes : " . count($nouvelles_notes));
$scenario->setLog("=== Fin exécution Pronote ===");

Et voici le résultat:

@Aldarande :

Le plugin semble afficher la dernière note en fonction de la date du devoir et non en fonction de la date à laquelle la note a été dévoilée.
Te serait-il possible de modifier cela?

Exemple:
Le plugin affiche comme « Dernière note » celle d’anglais alors que parmi les 4 c’est celle qui a été transmise sur Pronote en premier (même si la date de l’évaluation est la plus récente…):

Finalement, j’ai les mêmes compétences qui reviennent chaque heure ce matin. Je regarderai ce soir ce qui ne va pas.mm,.mais je pense que cela provient de cette ligne dans la création de la clé. J’ai remarqué que l’id changeait à chaque fois

normalize($comp[‹ id ›]) . ‹ | › .

Je vais la retirer

EDIT : c’était bien cela, je modifie le post avec le code.

Bonjour,

Je vais regarder cela.

1 « J'aime »

Est-ce que comme moi vous avez un décallage de 2h sur cette commande ? ou bien cela provient de mon environnement.

Je n’ai pas ce problème de mon côté.

Ce qui est d’autant plus bizarre c’est que la date de collecte est à 21h mais la valeur donne 19h…

image

Bonsoir, donc je viens de vérifier et la date de la dernière mise à jour n’a rien à voir avec la dernière collecte.

L’heure de collecte est l’heure où le plugin s’est connecté la dernière fois.
La « Derniére Mise à Jour » affiche l’heure de la dernière connexion, le probléme est que le deamon python est en UTC.

1 « J'aime »

Bonjour,

Savez-vous ce que contient la maj projote du 28/09 ?

Merci

Pour Info il y a systématiquement cette erreur Erreur : Le fichier n’existe pas à l’emplacement spécifié : /plugins/ProJote/data/851/enfant.ProJote.json.txt