für die Übertragung der Daten aus der Fröling Steuerung nach MQTT und nutze ich jetzt ein Perl Script, p4tomqtt.pl. Dies liest die Daten mittels des vorhandenen Kommandozeilen Tools p4 aus und schickt diese an einen MQTT Broker weiter. (Das Tool p4 hatte ich bei meinem vorigen Post leider übersehen.)
In dem Script p4tomqtt.pl können die zu lesende Werte unten entsprechend angepasst werden.
Das Perl Script folgt, vielleicht kann es jemand gebrauchen, ich finde es extrem nützlich, da hiermit die Fröhling Steuerung in meine Hausautomatisierung eingebunden ist. Schreibzugriff von MQTT in die Fröling Steuerung ist NICHT implementiert, kann aber einfach ergänzt werden.
#!/usr/bin/perl
use strict;
use warnings;
use Net::MQTT::Simple;
my $debug = 0;
my $pretopic = "d8/p4";
my $mqtt1 = Net::MQTT::Simple->new("192.168.20.240");
#my $mqtt2 = Net::MQTT::Simple->new("mosquitto.example.com");
my $swversion = ""; my $htime = ""; my $state = ""; my $mode = "";
initstate();
my %umlaute = ("ä" => "ae", "Ä" => "Ae", "ü" => "ue", "Ü" => "Ue", "ö" => "oe", "Ö" => "Oe", "ß" => "ss", " " => "" );
my $umlautkeys = join ("|", keys(%umlaute));
# Aufruf: p4ToMqtt(<Typ>,<ID>,<Name>,[<divider>],[<unit>])
sub p4ToMqtt{
my ($type, $id, $name, $divider, $unit) = @_;
if ($debug) {print STDERR "\nDEBUG: Type: $type, ID: $id, Name: $name, divider: $divider, unit: $unit \n";}
my $message = -1;
if ($type eq "VA"){
$message = getVA($id);
} elsif ($type eq "DO"){
$message = getDO($id);
} elsif ($type eq "ST"){
$message = getST($id);
}
if ($message ne -1){
if (($divider) and ($divider ne 0)){
$message = (int(($message / $divider) * 100))/100;
}
if ($unit) {
$message = "$message $unit";
}
$id = sprintf("%03d", $id);
$name = normalizeString($name);
if ($debug) {print STDERR "Topic: $pretopic/$type$id-$name, Message: $message\n";}
# Weitere MQTT Server ggfs ergänzen: for my $server ($mqtt1,$mqtt2,...) {
for my $server ($mqtt1) {
$server->publish("$pretopic/$type$id-$name", "$message");
}
}
}
sub getST {
my $address = shift;
if ($address == 0) {return $swversion}
elsif ($address == 1) {return $htime}
elsif ($address == 2) {return $state}
elsif ($address == 3) {return $mode}
else {return (-1)}
}
sub getVA {
my $address = shift;
my $vline = `/usr/local/bin/p4 getv -a "$address" 2>&1`;
my $RC = ${^CHILD_ERROR_NATIVE}/256;
chomp($vline);
if ($debug) {
print STDERR "DEBUG: getVA \n";
print STDERR "DEBUG: the result is: $vline\n";
print STDERR "DEBUG: returncode was: $RC\n";
}
if ($RC eq 0) {
return((split(/ /,$vline))[3]);
}else{
return(-1);
}
}
sub getDO {
my $address = shift;
my $vline = `/usr/local/bin/p4 getdo -a "$address" 2>&1`;
my $RC = ${^CHILD_ERROR_NATIVE}/256;
chomp($vline);
if ($debug) {
print STDERR "DEBUG: getDO \n";
print STDERR "DEBUG: the result is: $vline\n";
print STDERR "DEBUG: returncode was: $RC\n";
}
if ($RC eq 0) {
return((split(/ /,$vline))[3]);
}else{
return(-1);
}
}
sub initstate {
$swversion = "";
$htime = "";
$state = "";
$mode = "";
my $vline = `/usr/local/bin/p4 state 2>&1`;
my $RC = ${^CHILD_ERROR_NATIVE}/256;
chomp($vline);
if ($debug) {
print STDERR "DEBUG: state \n";
print STDERR "DEBUG: the result is:\n$vline\n";
print STDERR "DEBUG: returncode was: $RC\n";
}
if ($RC eq 0) {
my @lines = split /\n/, $vline;
$swversion = ((split(/ /,$lines[0]))[1]);
$htime = ((split(/Time: /,$lines[1]))[1]);
$state = $lines[2];
$mode = $lines[3];
}else{
return(-1);
}
if ($debug) {print STDERR "SWversion: $swversion, Zeit: $htime, Status: $state, Modus: $mode\n";}
}
sub normalizeString {
my $name = shift;
$name =~ s/($umlautkeys)/$umlaute{$1}/g;
return $name;
}
########################################################### Main #################################################
# Hier die zu lesenden Werte der Steuerung eintragen.
p4ToMqtt("ST","0","Softwareversion");
p4ToMqtt("ST","1","Datum Uhrzeit der Heizung");
p4ToMqtt("ST","2","Heizungsstatus");
p4ToMqtt("ST","3","Betriebsmodus");
p4ToMqtt("VA","0","Kesseltemperatur", 2, "°C");
p4ToMqtt("VA","1","Abgastemperatur","","°C");
p4ToMqtt("VA","3","Restsauerstoffgehalt", 10, "%");
p4ToMqtt("VA","4","Außentemperatur",2,"°C");
p4ToMqtt("VA","7","Saugzugdrehzahl","","U/min");
p4ToMqtt("DO","10","Sonde 1 öffnen");
p4ToMqtt("DO","11","Sonde 2 öffnen");
p4ToMqtt("DO","12","Sonde 3 öffnen");
p4ToMqtt("VA","12","Luftgeschwindigkeit in der Ansaugöffnung", 100,"m/s");
p4ToMqtt("DO","15","Pellets Saugturbine");
p4ToMqtt("VA","25","Vorlauf-Isttemperatur", 2, "°C");
p4ToMqtt("VA","26","Vorlauf-Solltemperatur", 2, "°C");
p4ToMqtt("VA","93","Boilertemperatur oben", 2, "°C");
p4ToMqtt("VA","98","Betriebsstunden","","h");
p4ToMqtt("VA","113","Füllstand im Pelletsbehälter", 207, "%");
p4ToMqtt("VA","118","Puffertemperatur oben", 2, "°C");
p4ToMqtt("VA","120","Puffertemperatur unten", 2, "°C");
p4ToMqtt("VA","140","Pufferpumpen Ansteuerung", "", "%");
p4ToMqtt("VA","144","Boilerpumpe Ansteuerung", "", "%");
p4ToMqtt("VA","212","Betriebsstunden Zündung","","h");
p4ToMqtt("VA","213","Stunden seit letzter Wartung","","h");
p4ToMqtt("VA","273","Resetierbarer kg-Zähler:","","kg");
p4ToMqtt("VA","274","Resetierbarer t-Zähler:","","t");
p4ToMqtt("VA","279","Verbleibende Heizstunden bis zur Asche entleeren Warnung","","h");
Alles anzeigen