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;
}
}