Gestion Climatisation Réversible


#1

Bonjour à tous c’est encore moi :joy:

Après avoir fais le tour du forum quelques fois je ne crois pas être tombé sur ce sujet.
C’est pourquoi j’ouvre celui-ci.

J’ai lu sur beaucoup, beaucoup de forums qu’il était vraiment compliqué de gérer sa climatisation via l’IR + Arduino.
En effet les protocoles des clims (réversibles) sont légèrement différents de ceux proposer pour, par exemple, les TV.
J’ai essayé, surement comme beaucoup de lire les codes envoyés par ma télécommande de clim.
Un coup du NEC, un coup du AiwaRCT501, et d’autres fois carrément inconnu.
Mais je pense avoir trouvé quelques choses :slight_smile:
Je précise que ceci n’en ai encore qu’à la phase de TEST.
Après avoir lu de très bons articles; que je vous invite à lire également pour comprendre les modifs :wink:

j’ai modifier le fichier IRremoteInt de la librairie IRremote.

Trouver #define RAWBUF 100 ou 101 (il est quasiment tout en haut du code) et modifier par
#define RAWBUF 300 puis enregistrer !

Ensuite ouvrer l’IDE d’Arduino et faîtes :
Fichier --> Exemples --> IRremote --> IRrecvDumpV2
Connecter l’emetteur IR sur la pin D11 et téléverser le sketch
Ouvrir le moniteur série et appuyer sur une touche de la télécommande.
Copier TOUT le code RAW qui s’affiche (oui tout le code)

Pour moi par exemple c’est touuuuut ça !
8850, 4450, 550, 1650, 550, 1650, 450, 650, 500, 600, 500, 550, 550, 550, 500, 1700, 500, 1700, 500, 1700, 500, 1700, 500, 1700, 500, 550, 550, 550, 550, 550, 500, 600, 500, 550, 550, 550, 450, 650, 500, 550, 550, 550, 550, 550, 450, 650, 500, 550, 450, 650, 500, 600, 500, 550, 500, 600, 500, 600, 500, 600, 450, 600, 550, 550, 500, 600, 500, 550, 550, 550, 550, 550, 500, 600, 500, 550, 550, 1650, 550, 550, 450, 1750, 550, 550, 500, 550, 550, 550, 550, 550, 500, 550, 550, 550, 550, 550, 500, 600, 450, 600, 550, 550, 500, 600, 500, 550, 550, 550, 550, 550, 500, 600, 500, 550, 550, 550, 500, 600, 500, 550, 550, 550, 450, 650, 500, 600, 500, 550, 550, 550, 450, 650, 500, 550, 550, 550, 500, 600, 500, 600, 450, 600, 550, 550, 550, 550, 500, 550, 550, 550, 550, 550, 450, 650, 500, 550, 550, 1650, 550, 550, 500, 600, 500, 550, 550, 550, 550, 550, 550, 500, 550, 550, 550, 550, 550, 550, 500, 550, 550, 1650, 550, 550, 500, 1700, 500, 600, 500, 550, 550, 550, 500, 600, 500, 550, 550, 1650, 550, 1650, 500, 1700, 550, 1650, 550, 550, 500, 600, 550, 500, 500, 1700, 550

Une fois le code copié,
Ouvrir un nouvel IDE et faire
Fichier --> Exemples --> IRremote --> IRsendRawDemo

Dans la ligne :
unsigned int irSignal[] = {METTRE_VOTRE_CODE_RAW}
Connecter votre émetteur IR sur la pin 3 (uniquement pin 3 puisque codé en dur sur le programme, ou pour ce qui veulent modifier le fichier pour mettre un autre pin)
Téléverser le code sur l’arduino.

Je ne sais pas si c’est multi-climatiseur mais sachez que pour ma clim réversible Airton,
celà permet de démarrer ou d’éteindre ma clim en fonction du code Raw que j’ai inscrit.
C’est vraiment basique puisqu’elle démarre en mode Auto à 24°C mais maintenant, ELLE DÉMARRE :crazy_face: !

Maintenant je voudrais l’inclure dans Gladys.
Je souhaiterai juste un bouton ON/OFF (binary) pour allumer/éteindre ma clim.
J’ai essayé d’écrire un bout de code mais…

#include <ArduinoJson.h>
#include <IRremote.h>

int device = 3;
IRsend irsend;
int irSignal_ON[] = {8850, 4450, 550, 1650, 550, 1650, 450, 650, 500, 600, 500, 550, 550, 550, 500, 1700, 500, 1700, 500, 1700, 500, 1700, 500, 1700, 500, 550, 550, 550, 550, 550, 500, 600, 500, 550, 550, 550, 450, 650, 500, 550, 550, 550, 550, 550, 450, 650, 500, 550, 450, 650, 500, 600, 500, 550, 500, 600, 500, 600, 500, 600, 450, 600, 550, 550, 500, 600, 500, 550, 550, 550, 550, 550, 500, 600, 500, 550, 550, 1650, 550, 550, 450, 1750, 550, 550, 500, 550, 550, 550, 550, 550, 500, 550, 550, 550, 550, 550, 500, 600, 450, 600, 550, 550, 500, 600, 500, 550, 550, 550, 550, 550, 500, 600, 500, 550, 550, 550, 500, 600, 500, 550, 550, 550, 450, 650, 500, 600, 500, 550, 550, 550, 450, 650, 500, 550, 550, 550, 500, 600, 500, 600, 450, 600, 550, 550, 550, 550, 500, 550, 550, 550, 550, 550, 450, 650, 500, 550, 550, 1650, 550, 550, 500, 600, 500, 550, 550, 550, 550, 550, 550, 500, 550, 550, 550, 550, 550, 550, 500, 550, 550, 1650, 550, 550, 500, 1700, 500, 600, 500, 550, 550, 550, 500, 600, 500, 550, 550, 1650, 550, 1650, 500, 1700, 550, 1650, 550, 550, 500, 600, 550, 500, 500, 1700, 550};
int irSignal_OFF[] = {8900,4450, 500,1700, 550,1650, 500,600, 500,550, 550,550, 550,550, 500,1700, 550,1650, 500,1700, 550,1650, 500,1700, 550,550, 550,500, 550,550, 550,550, 550,550, 550,500, 550,550, 550,550, 550,500, 550,550, 600,500, 550,550, 550,500, 600,500, 600,500, 550,550, 550,500, 600,500, 600,500, 550,550, 550,500, 600,500, 550,550, 550,550, 550,500, 600,500, 550,1650, 550,550, 550,1650, 550,500, 600,500, 600,500, 550,550, 550,500, 600,500, 600,500, 550,550, 550,500, 550,550, 550,550, 550,550, 550,500, 600,500, 550,550, 550,550, 550,500, 600,500, 550,550, 550,500, 550,550, 550,550, 550,550, 550,500, 600,500, 550,550, 550,550, 550,500, 550,550, 550,550, 550,550, 500,550, 550,550, 550,550, 550,550, 500,550, 550,550, 550,550, 550,500, 550,550, 550,550, 500,600, 450,650, 450,650, 450,600, 500,600, 450,650, 450,650, 450,1750, 450,600, 500,1700, 500,600, 500,550, 550,550, 500,600, 500,600, 500,1700, 500,1700, 500,1700, 500,1650, 550,550, 550,1650, 550,1650, 550,550, 550};
int devicetype = 41;
void setup () {

  Serial.begin(9600);
  pinMode(device, OUTPUT); 
}

void loop () {
  
  int khz = 38;

  if (devicetype == 1) {
     irsend.sendRaw(irSignal_ON, sizeof(irSignal_ON) / sizeof(irSignal_ON[0]), khz); 
  }

  else if (devicetype == 0) {
     irsend.sendRaw(irSignal_OFF, sizeof(irSignal_OFF) / sizeof(irSignal_OFF[0]), khz);
  }
}

La encore mes connaissances en code me limite
CA NE FONCTIONNE PAS lol
promis @MathieuA je vais aller sans faute sur eskimon :joy:

Si quelqu’un sait comment faire je suis preneur haha
J’écris également ce topic dans le but de ne pas oublier tout ce que j’ai fais ce soir dès demain matin… :joy:

Bonne soirée à vous


#2

EDIT :

Je vais devoir passer par un esp8266 à cause de la configuration de mon local afin de mettre le capteur IR juste en face de la clim.
Sinon je suis trop et ça ne prend pas en compte le code. Pas cool !


#3

Salut, je ne pense pas que ça corresponde à ta configuration, mais il existe un module LIRC pour Gladys. Il est nécessaire d’avoir un émetteur IR sur le Raspberry, suivre un tuto pour configurer LIRC, et, avec le module, Gladys intègre les commandes comme des devices.


#4

Salut @AlexTrovato merci pour ta réponse
Le module LIRC gère l’infrarouge des téléviseurs il me semble
Pour les clims je crois que ça ne fonctionne pas


#5

Salut @ForzAguanno !

C’est effectivement la première fois que je vois passer le sujet des clim sur le forum :thinking:
Cela dit ça m’étonne que tu ne puisse pas récupérer de simple code hexadécimal comme pour les TV, car ça reste de l’IR, donc c’est un moyen de transmission peu sécurisé (voir pas du tout d’ailleurs) car de toute façon ses cas d’utilisation n’ont, en général, pas besoin de l’être…

Mais peu importe si avec le code raw ça fonctionne tant mieux :slight_smile:

Par contre quelque chose me pose problème :thinking:
Il manque une partie de ton code non ? Parce que je ne vois pas la fonction qui réceptionne et décode les informations reçu par le biais de la communication série…

Et si tu ne lis pas ces infos c’est sur que ça ne peux pas marcher ^^
D’autant plus que tu crée une variable nommé “devicetype” en haut de ton code avec comme valeur “41” et après dans ton loop tu test si cette même variable vaut “1” ou “0”… sauf qu’elle est jamais modifié null part ! Donc évidement elle ne vaudra jamais que “41” :joy:

Tu devrais partir du code qui est sur le git du module serial, celui que tu as utilisé pour ta lampe. Ça sera plus simple :slightly_smiling_face:

Si tu veux au passage je me suis fais un repo avec tout mes sketch Arduino ! D’une pour les sauvegarder et de deux parce que je me dit que ça pourrais servir à d’autres surtout qu’il y a un dossier dans lequel il y en a quelques-uns dédié à Gladys. Je ne garantis pas qu’ils fonctionnent tous car ils sont un peu vieux, mais bon ça fais pas mal d’exemple de simple à un peu plus compliqué si tu veux explorer ^^

https://github.com/MathieuAndrade/Arduino-Programs


#6

Juste pour confirmer qu’effectivement, les clims ne peuvent pas être en général piloter comme de simple appareil IR, et en particulier IRremote ne fait pas le job.
En général, les fabricants d’appareils pour piloter par IR des devices font une version spécifique pour les clims.


#7

Encore un grand merci @MathieuA
Je referai un code au propre demain :slight_smile:
De ce que je lu l’encodage n’est pas tout a fait le même et selon les clims il se peut que le nombre de bits soir différent. Le seul moyen de les décrypter que j’ai trouvé c’est d’augmenter la taille du buffer pour lire un code plus grand car il est limité a 32bits avec la librairie IRremote.
Et sinon comment tu as pu écrire autant de code c’est inhumain lol

Merci @piznel pour la confirmation :wink:


#8

Certains dossier en contiennent même plusieurs :sweat_smile:
Mais souvent ce n’est que quelques lignes pour des tests, dans le lot il ne doit pas y avoir beaucoup de sketch qui dépasse la centaine de lignes ^^


#9

De rien, de ce que j’en avais lu à l’époque, en plus, certaines clims utilisent des « codes » spéciaux, genre pour sécuriser la liaison (Je suppose que c’est plus pour avoir un format propriétaire qu’autre chose !)


#10

Airton en fait parti de ce que j’ai lu :sob:
Quelle galere pour extraire ces codes !
Ça fait un peu travail bâclé en Raw mais au moins ça a l’air de fonctionner.
Bon après j’ai aussi lu que les codes était carrément casse tête quand tu veux donner une consigne particulière, genre :
Changement de mode (passage du mode auto a chaud par exemple) +
Consigne de température à 20°C +
Vitesse de ventilation (moyenne par exemple)

Je vais surement rigolé deux minutes avec ça

En tout merci de m’aider autant j’apprends beaucoup ! C’est un vrai plaisir


#11

Mais je vais essayer de faire ça.
Je voudrais mettre des scénarios en place après.
Du style quand j’ai finis admettons vers 20h, passer la consigne de température de 20°C à 15°C pour la nuit.
Puis vers 7h rallumer la clim pour avoir la bonne temperature à 9h.
Ou quelques choses dans le genre.
Je pense que pour les économies d’énergie ca peut être cool :slight_smile:
Et avec ma nouvelle gestion électrique (j’en suis fier lol) ça va être un régale


#12

Sinon, tu as ça :

https://m.gearbest.com/smart-home/pp_229556.html


#13

C’est génial !!
Comment ça peut coûter que 20€
Le kit emetteur récepteur bon je l’ai pris sur Amazon aussi mais il m’a coûté 10€
En comparaison y’a pas photo
Et ça s’intègre sous Gladys assez facilement cette petite chose ?


#14

C’est du Xiaomi, ça doit se faire, oui :slight_smile:


#15

Je vais essayer de bidouiller un peu avec ce que j’ai déjà, ça fait un peu plus DIY lol
Mais si je galère un peu trop je pense que je vais pas me casser la tête !
Je garde le lien précieusement.
Merci @piznel
J’essaierai d’éditer le topic demain en fin d’aprem après le boulot.
On verra si les tests fonctionnent.
Bonne soirée les gars :slight_smile:


#16

Salut les amis,

Bon tout d’abord, désolé pour hier.
Une bonne dose de fatigue conjugué avec beaucoup de café… et ça donne cet espèce de code pourri d’hier :fearful::scream:

Bon cet aprèm j’ai pu en refaire un nettement mieux, merci @MathieuA à ta place je m’aurai carrément engueuler hier ! mdrr

/***********************************************************
 ******** Déclarations des variables et librairies *********
 **********************************************************/

#include <ArduinoJson.h>
#include <IRremote.h>

String command = "";
char endMarker = '%';

int device = 3;
int devicetype_id = 45;
int khz = 38;
const int irSignal_ON[] = {8850, 4450, 550, 1650, 550, 1650, 450, 650, 500, 600, 500, 550, 550, 550, 500, 1700, 500, 1700, 500,
 1700, 500, 1700, 500, 1700, 500, 550, 550, 550, 550, 550, 500, 600, 500, 550, 550, 550, 450, 650, 500,
 550, 550, 550, 550, 550, 450, 650, 500, 550, 450, 650, 500, 600, 500, 550, 500, 600, 500, 600, 500, 600,
 450, 600, 550, 550, 500, 600, 500, 550, 550, 550, 550, 550, 500, 600, 500, 550, 550, 1650, 550, 550, 450,
 1750, 550, 550, 500, 550, 550, 550, 550, 550, 500, 550, 550, 550, 550, 550, 500, 600, 450, 600, 550, 550,
 500, 600, 500, 550, 550, 550, 550, 550, 500, 600, 500, 550, 550, 550, 500, 600, 500, 550, 550, 550, 450,
 650, 500, 600, 500, 550, 550, 550, 450, 650, 500, 550, 550, 550, 500, 600, 500, 600, 450, 600, 550, 550,
 550, 550, 500, 550, 550, 550, 550, 550, 450, 650, 500, 550, 550, 1650, 550, 550, 500, 600, 500, 550, 550,
 550, 550, 550, 550, 500, 550, 550, 550, 550, 550, 550, 500, 550, 550, 1650, 550, 550, 500, 1700, 500, 600,
 500, 550, 550, 550, 500, 600, 500, 550, 550, 1650, 550, 1650, 500, 1700, 550, 1650, 550, 550, 500, 600, 550, 500, 500, 1700, 550};

const int irSignal_OFF[] = {8900,4450, 500,1700, 550,1650, 500,600, 500,550, 550,550, 550,550, 500,1700, 550,1650, 500,1700, 550,1650, 500,1700, 550,550, 550,500,
 550,550, 550,550, 550,550, 550,500, 550,550, 550,550, 550,500, 550,550, 600,500, 550,550, 550,500, 600,500, 600,500, 550,550, 550,500,
 600,500, 600,500, 550,550, 550,500, 600,500, 550,550, 550,550, 550,500, 600,500, 550,1650, 550,550, 550,1650, 550,500, 600,500, 600,500,
 550,550, 550,500, 600,500, 600,500, 550,550, 550,500, 550,550, 550,550, 550,550, 550,500, 600,500, 550,550, 550,550, 550,500, 600,500, 
550,550, 550,500, 550,550, 550,550, 550,550, 550,500, 600,500, 550,550, 550,550, 550,500, 550,550, 550,550, 550,550, 500,550, 550,550,
 550,550, 550,550, 500,550, 550,550, 550,550, 550,500, 550,550, 550,550, 500,600, 450,650, 450,650, 450,600, 500,600, 450,650, 450,650,
 450,1750, 450,600, 500,1700, 500,600, 500,550, 550,550, 500,600, 500,600, 500,1700, 500,1700, 500,1700, 500,1650, 550,550, 550,1650, 550,1650, 550,550, 550};

IRsend irsend;

/***********************************************************
 *************** Début du programme Setup ******************
 **********************************************************/

 void setup () {
  Serial.begin(9600);
  pinMode(device, OUTPUT);
 }

/***********************************************************
 *************** Début du programme Loop *******************
 **********************************************************/

 void loop () {}

 void devicetypeNewValue (int code) {
  if (code == 1) {
  irsend.sendRaw(irSignal_ON, sizeof(irSignal_ON) / sizeof(irSignal_ON[0]), khz);
  }
  else if (code == 0) {
  irsend.sendRaw(irSignal_OFF, sizeof(irSignal_OFF) / sizeof(irSignal_OFF[0]), khz);
  }
 }

/***********************************************************
 *********** Début de l'éxécution de la foncion ************
 **********************************************************/

 void executeFunction(String json_data) {
  StaticJsonBuffer<600> jsonBuffer;
  JsonObject& json_ir = jsonBuffer.parseObject(json_data);

  if ( json_ir["deviceType"] == int(devicetype_id) ) {
  devicetypeNewValue (json_ir["value"]);
  }
 }

/***********************************************************
 ***************** Début de serieEvent *********************
 **********************************************************/

 void serialEvent() {
  char last_readed_char = Serial.read();
  if ( last_readed_char == endMarker ) {
    executeFunction(command);
    command = "";
  }
  else {
    command += last_readed_char;
  }
}

J’ai réécris un code, fonctionnel et sans caféine lol
Je suis plutôt satisfait de ce code puisque qu’il fonctionne même si il faut que je le commente et le rende un peu plus présentable, on verra ça plus tard.

LE point positif :

  • Allumage et extinction de la clim fonctionnel ! (heureusement, c’est ce qu’on lui demande)

Les nombreux points négatifs :

  • La portée de l’émission du capteur infra-rouge… oulaLaLA ( je dirais 1 à 2 mètres) ça c’est la m**de.
  • L’angle de direction du capteur IR (moins catastrophique mais peut être problématique pour certains)
  • Le plus gros points négatifs est le fait que les déclarations de variables en signal Raw c’est très Très TRÈS gourmands !

    83% !! :sob::sob:
    Il faut vraiment que je trouve une alternative à ça…
    Je vais essayer de bidouiller un peu la librairie de IRremote.

Si vous avez des idées surtout n’hésitez pas !


#17

Qu’est ce que je donnerai pas pour un Oscillo :sob::sob::sob:


#18

Bonjour tout le monde,

J’ai fais quelques tests concernant la climatisation airton…
En vrai, la seule solution que j’ai trouvé pour l’instant c’est de continuer à envoyé un signal RAW.
Est ce que vous savez @piznel, @MathieuA et les autres :wink: si c’est possible de donner une valeur à une grande variable.
C’est à dire, voici ma valeur actuelle :

unsigned int irSignal_ON[] = {8850, 4450, 550, 1650, 550, 1650, 450, 650, 500, 600, 500, 550, 550, 550, 500, 1700, 500, 1700, 500,
 1700, 500, 1700, 500, 1700, 500, 550, 550, 550, 550, 550, 500, 600, 500, 550, 550, 550, 450, 650, 500,
 550, 550, 550, 550, 550, 450, 650, 500, 550, 450, 650, 500, 600, 500, 550, 500, 600, 500, 600, 500, 600,
 450, 600, 550, 550, 500, 600, 500, 550, 550, 550, 550, 550, 500, 600, 500, 550, 550, 1650, 550, 550, 450,
 1750, 550, 550, 500, 550, 550, 550, 550, 550, 500, 550, 550, 550, 550, 550, 500, 600, 450, 600, 550, 550,
 500, 600, 500, 550, 550, 550, 550, 550, 500, 600, 500, 550, 550, 550, 500, 600, 500, 550, 550, 550, 450,
 650, 500, 600, 500, 550, 550, 550, 450, 650, 500, 550, 550, 550, 500, 600, 500, 600, 450, 600, 550, 550,
 550, 550, 500, 550, 550, 550, 550, 550, 450, 650, 500, 550, 550, 1650, 550, 550, 500, 600, 500, 550, 550,
 550, 550, 550, 550, 500, 550, 550, 550, 550, 550, 550, 500, 550, 550, 1650, 550, 550, 500, 1700, 500, 600,
 500, 550, 550, 550, 500, 600, 500, 550, 550, 1650, 550, 1650, 500, 1700, 550, 1650, 550, 550, 500, 600, 550, 500, 500, 1700, 550};

Je voudrais savoir si je peux attribuer à cette (grande) valeur, un autre valeur sans que ça me prenne autant de mémoire sur mon programme.
J’ai cru pouvoir le faire directement sur internet avec ce site mais en vain… Il me met une erreur lorsque je rentre mon code.

En attendant de recevoir mon oscilloscope je ne peux pas avancer plus sur le projet.