[Résolu] Gestion climate via Node Red

Bonjour,
J’essaie de me débarrasser d’un thermostat et de vannes thermostatiques netatmo cloud, pour passer en local, je suis parti sur Node red, avec création d’un calendrier local et récupération des températures de consigne pièce par pièce en fonction du calendrier/planning, cette partie fonctionne basiquement. Par contre une fois les températures récupérées en fonction de l’heure et du planning, je me casse les dents pour les envoyer dans les climate (netatmo en attendant de changer de matériel)

Donc en fonction du calendrier, je récupère l’événement du jour (matin, soir, nuit, repos, etc) et en fonction de l’heure, je ressors via une fonction la température des différentes pièces, sous la forme d’un nombre.
Le retour de la fonction =>
La partie debug avec la valeur 19, et l’erreur dans le node call service (climate)
Et la config du call service =>

Si j’ai bien compris, le node call service attend une valeur, que j’envoie mal.
Donc si quelqu’un pouvait m’aiguiller sur la bonne façon d’envoyer cette valeur (dans ce cas 19) dans le call service. Merci.

Dans « Data » il faut indiquer quelle temperature cible tu veux.
Normalement ça doit être { "temperature" : payload } en laissant le type à S: (comme c’est sur ta photo).

Merci golfvert, effectivement c’est bien ça, je viens de tester { « temperature » : payload } et j’ai la modif de la consigne presque instantanément sur mon smartphone. C’est magique :hugs: Merci encore.

Bonjour,

Désolé, je déterre un peu le sujet, mais butant sur la possibilité de déclencher mon climate via des éléments de calendrier dans les automatisations classiques de HA, je me suis dit que j’allais essayer via node red.

Mais je suis novice coté Node Red et j’ai du mal à trouver les infos que je cherche (surement une histoire de mots clés , mais je ne sais pas trop comment démarrer)

j’ai déjà réussi à gérer (mais ce n’était finalement pas si compliqué) la partie climate / set_temperature, donc en gros la « fin de parcours » mais je bloque sur le milieu je pense.

Je souhaite commencer par un trigger sur mon calendrier nommé Chauffage.
Jusque là, ça va, je vois les infos passer dans le debug mais c’est là que ça commence à coincer.

Le payload me ressort une quantité faramineuse de données dans une assez grande arborescence

J’aurais souhaité modifier le payload de sortie, de manière à n’avoir qu’un message au format JSON du type :

{
  message: "Test",
  description: "23",
  start_time: "2023-11-24 08:53:00"
}

Comment faire ceci svp ?

Et autre petite question pour @Ludoc si ça ne t’embête pas stp, à quoi correspond ta fonction Décodage ?

Merci d’avance

Bonjour @lacrima08

Voilà comment j’ai procédé dans NR => j’ai tout refait car plantage total et impossible de relancer une sauvegarde (pas grave, je corrige mes boulettes du départ) =>

Dans horodate, je vérifie toutes les 5mns le planning du jour, qui me donne soit matin, soir, nuit, absent…(je travaille en poste) et le noeud planning chauffage me ressort le poste en cours =>

Ce sensor est créé dans sensors.yaml (suite au découpage de la config) :

- platform: template
  sensors:
    planning_du_jour:
      friendly_name: "Planning du jour"
      value_template: "{{ state_attr('calendar.planning_chauffage', 'message') }}"
      attribute_templates:
        icon: "mdi:heat-wave"

Et dans la fonction décodage, je traite le poste de travail avec un planning de chauffage codé en dur, parce que je n’ai pas trouvé, pour l’instant, d’interface graphique qui me permette de générer un planning en fonction de l’heure.

// Décodage du planning
// La matrice commence à l'index 0
var planning = msg.payload;
var matin =             0;
var soir =              167;
var nuit_1 =            335;
var nuit_2 =            503;
var journee =           671;
var repos =             839;
var absent =            1007;
var salon =             0;
var salle_a_manger =    23;
var salle_de_bain =     47;
var cuisine =           71;
var chambre_avant =     95;
var chambre_arriere =   119;
var thermostat =        143;
var date = new Date();
var heure = parseInt(date.getHours());
var sonnette = true;
var calcul_intermediaire = 0;

if (planning == 'MATIN') 
        { calcul_intermediaire = matin}
if (planning == 'SOIR') 
        { calcul_intermediaire = soir}
if (planning == 'NUIT 1') 
        { calcul_intermediaire = nuit_1 }
if ((planning == 'NUIT 2') || (planning == 'DESCENTE')) 
        { calcul_intermediaire = nuit_2 ,
          sonnette = false}
if (planning == 'JOURNEE') 
        { calcul_intermediaire = journee }
if (planning == 'REPOS') 
        { calcul_intermediaire = repos }
if (planning == 'ABSENT') { calcul_intermediaire = absent }

const matrice_temperature =
      //00  01  02  03  04  05  06  07  08  09  10  11  12  13  14  15  16  17  18  19  20  21  22  23
      // matin
       [16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 19, 19, 19, 19, 19, 19, 19, 16, 16, 16,
        16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 19, 19, 19, 19, 19, 19, 19, 16, 16, 16,
        16, 16, 16, 19, 19, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
        16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 19, 19, 19, 19, 19, 19, 19, 16, 16, 16,
        16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
        16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
        16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 19, 19, 19, 19, 19, 19, 19, 16, 16, 16,
        // soir
        16, 16, 16, 16, 16, 16, 16, 19, 19, 19, 19, 19, 19, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
        16, 16, 16, 16, 16, 16, 16, 19, 19, 19, 19, 19, 19, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
        16, 16, 16, 16, 16, 16, 19, 19, 19, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
        16, 16, 16, 16, 16, 16, 16, 19, 19, 19, 19, 19, 19, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
        16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
        16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
        16, 16, 16, 16, 16, 16, 16, 19, 19, 19, 19, 19, 19, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
        // nuit 1
        16, 16, 16, 16, 16, 16, 16, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 16, 16, 16,
        16, 16, 16, 16, 16, 16, 16, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 16, 16, 16,
        16, 16, 16, 16, 16, 16, 19, 19, 19, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
        16, 16, 16, 16, 16, 16, 16, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 16, 16, 16,
        16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
        16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
        16, 16, 16, 16, 16, 16, 16, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 16, 16, 16,
        // nuit 2 ou descente
        16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 19, 19, 19, 19, 19, 19, 19, 19, 19, 16, 16, 16,
        16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 19, 19, 19, 19, 19, 19, 19, 19, 19, 16, 16, 16,
        16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
        16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 19, 19, 19, 19, 19, 19, 19, 19, 19, 16, 16, 16,
        16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
        16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
        16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 19, 19, 19, 19, 19, 19, 19, 19, 19, 16, 16, 16,
        // journée
        16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 19, 19, 19, 19, 19, 19, 16, 16, 16,
        16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 19, 19, 19, 19, 19, 19, 16, 16, 16,
        16, 16, 16, 16, 19, 19, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
        16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 19, 19, 19, 19, 19, 19, 16, 16, 16,
        16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
        16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
        16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 19, 19, 19, 19, 19, 19, 16, 16, 16,
        // repos
        16, 16, 16, 16, 16, 16, 16, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 16, 16, 16,
        16, 16, 16, 16, 16, 16, 16, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 16, 16, 16,
        16, 16, 16, 16, 16, 16, 19, 19, 19, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
        16, 16, 16, 16, 16, 16, 16, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 16, 16, 16,
        16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
        16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
        16, 16, 16, 16, 16, 16, 16, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 16, 16, 16,
        // absent
        16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
        16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
        16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
        16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
        16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
        16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
        16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16];

var calcul = matrice_temperature[heure];
// salon
// salle_a_manger
// salle_de_bain
// cuisine
// chambre_avant
// chambre_arriere
return [{ payload: matrice_temperature[calcul_intermediaire + salon + heure]},
        { payload: matrice_temperature[calcul_intermediaire + salle_a_manger + heure] },
        { payload: matrice_temperature[calcul_intermediaire + salle_de_bain + heure] },
        { payload: matrice_temperature[calcul_intermediaire + cuisine + heure] },
        { payload: matrice_temperature[calcul_intermediaire + chambre_avant + heure] },
        { payload: matrice_temperature[calcul_intermediaire + chambre_arriere + heure] },
        { payload: sonnette},
        { payload: matrice_temperature[calcul_intermediaire + thermostat + heure] }];

Chaque ligne de valeur correspond à une pièce différente donc à la consigne pour une vanne thermostatique.
Pour faire la matrice de température, j’ai créé un fichier excel qui me met en forme, et que je n’ai plus qu’à coller dans la fonction.

Je sais pas si cela vient de moi mais sur le post 1 je ne vois aucune image !

Si le post est résolu cocher la case du poste qui apporte la réponse pour nos futurs lecteurs

Merci

Hello, passé en résolu, et pour les images ça doit venir de chez toi, je les ai bien.

Ah oui… bien trop complexe pour moi (pour le moment), je ne connais pas les matrices

Par contre je vois que tu es passé par un template sensor pour récupérer les infos du calendrier, si je n’arrive pas a gérer via le trigger node, j’essaierais par cette voie là.

Beau boulot en tout cas et merci pour ta réponse !

J’ai fini par réussir a extraire mes infos à me trouver un flow (minimaliste pour le moment) qui fonctionne

Il me reste à faire mon planning et a tester tout ça et améliorer mon flow