Objectif
  - Interfacer Calaos avec des sondes et périphériques Mqtt
  - Scripts a faire en 30 minutes
Ce projet est (aujourd'hui) découpe en 2 morceaux :
  - un Script Mqtt vers Calaos
  - un Script Mqtt vers Calaos
A faire evoluer
  - Mettre _toutes_ les configurations dans un fichier tiers (le port 4456 aussi)
  - Utiliser un publisher mqtt propre au langage, de meme pour **nc** et **expect**
  - Mettre en œuvre un mot de passe sur le mqtt
Outils utilisées
  - nc et expect : pour communiquer avec le port 4456 de Calaos
  - perl
====== Mqtt2Calaos ======
#!/usr/bin/perl
my $mqtts="MQTTSRV";
my $calaos="CALAOSSRV";
my $login="MOIMOI";
my $pwd="SECRET";
my $prefmqtt="calaos/";
my $prefcalaos='expect -c \'spawn -noecho nc '.$calaos.' 4456;send "login '.$login.' '.$pwd.'\n";expect -re {login '.$login.' ok\r\n};send "';
my $postcalaos='\n";\'';
$cmdlisten="/usr/bin/mosquitto_sub -h $mqtts -t '$prefmqtt#' -v";
open LISMQ,$cmdlisten." |";
sleep(5);
print "Mqtt 2 Calaos Listening $mqtts $prefmqtt#\n";
while() {
        chomp();
        s/^$prefmqtt//g;
        ($cmd,$id,$act,$params)=split(/[\/ ]/,$_,4);
        $cmdcalaos=$prefcalaos.$cmd.' '.$id.' '.$act.' '.$params.$postcalaos;
        open CALAOS,$cmdcalaos." |";
        while() {}
        close(CALAOS);
        }
print "Mqtt 2 Calaos listener dead\n";
====== Calaos2Mqtt ======
#!/usr/bin/perl
my $mqtts="MQTT";
my $calaos="CALAOSSRV";
my $login="MOIMOI";
my $pwd="SECRET";
my $prefmqtt="ha/calaos/";
my ($action,$obj,$status);
my ($clef,$val);
my $cmdcalaos='expect -c \'spawn -noecho nc '.$calaos.' 4456;send "login '.$login.' '.$pwd.'\n";expect -re {login '.$login.' ok\r\n};send "listen\n";interact\'';
my $i=0;
open CALAOS, $cmdcalaos." |" or die "Can't open < $cmdcalaos $!";
sleep(5);
print "Calaos 2 Mqtt Running\n";
while() {
        chop();
        if(/input_(1|2) /) {
             #print "No more $_\n";
             $i=0;
             }
        elsif(/^(input|output)/) {
            ($action,$obj,$status)=split(/ /,$_,3);
            $status=~s/%([A-Fa-f\d]{2})/chr hex $1/eg;
            if($status =~ /:/) {
                ($clef,$val)=split(/:/,$status,2);
                }
            else {
                $clef="status";
                $val=$status;
                }
            my $value=chop($val);
            my $cmdmqtt="/usr/bin/mosquitto_pub -h $mqtts -r -t $prefmqtt$action/$obj/$clef -m '$val'";
            open MQTT, $cmdmqtt.' |';
            while() {}
            close(MQTT);
            }
        else {
            #print "Unknown $_\n";
            $i=0;
            }
        }