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