Flammtronik Laufzeit in Fhem

Flammtronik an Fhem und andere Steuerungs bzw. Visualisierungs Projekte
Benutzeravatar
jostmario
Administrator
Beiträge: 891
Holzvergaser: Do 28. Jan 2016, 00:11
Bewertung: 139
Wohnort: Zimmern ob Rottweil
Kontaktdaten:

Flammtronik Laufzeit in Fhem

Beitrag #20137 von jostmario » Do 8. Nov 2018, 20:12

Hallo,

wer kann mir bei dem script in der 99_myutils.pm helfen.
Würde gerne die Ofenlaufzeit besser aufzeichnen.
aktuell wird die Laufzeit und auszeit zudem falsch angezeigt.
HV aus zeigt die Zeit HV an + stillstand an zudem löscht sich diese Zeit wenn die FT in Standby geht.
kann sich das mal jemand per Teamviewer ansehen ???
HV aus1.JPG

Gruß Josty
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
Holzvergaser Orlan 40KW Brennkammer und Turbolatoren von Spikisveni Holzgasverteiler von Jens
Flammtronik umbau mit getrennter Primär/Secundärluft 3200 Liter Puffer
Visualisierung über Raspberry mit FHEM

Bild

Benutzeravatar
Mathias
--Mitglied--
Beiträge: 611
Holzvergaser: Do 28. Jan 2016, 21:13
Bewertung: 104
Wohnort: Herten

Re: Flammtronik Laufzeit in Fhem

Beitrag #20152 von Mathias » Sa 10. Nov 2018, 10:36

Hi, mit fhem und dem Perl Kram steh ich total auf Kriegsfuß.

Wenn du mir sagst, an welcher Stelle welcher Wert steht, kann ich dir da versuchen zu helfen.
Grüße
Mattes

SolarBayer HVS 40E Holzvergaser, Flammtronik, Große Brennkammer, Gussdüse, 3200l Puffer, 500l Warmwasser Speicher, 730l MAG,
270qm WF, 8 Personen, Solarthermie geplant
Rücklaufanhebung + Heizkreis via Arduino geregelt.

Benutzeravatar
jostmario
Administrator
Beiträge: 891
Holzvergaser: Do 28. Jan 2016, 00:11
Bewertung: 139
Wohnort: Zimmern ob Rottweil
Kontaktdaten:

Re: Flammtronik Laufzeit in Fhem

Beitrag #20154 von jostmario » Sa 10. Nov 2018, 20:06

Hallo Mathias,

hast du Lust dir das mal per Teamviewer anzuschauen.
Vieleicht haste nachher ja paar minuten.

Gruß Josty
Holzvergaser Orlan 40KW Brennkammer und Turbolatoren von Spikisveni Holzgasverteiler von Jens
Flammtronik umbau mit getrennter Primär/Secundärluft 3200 Liter Puffer
Visualisierung über Raspberry mit FHEM

Bild

Benutzeravatar
jostmario
Administrator
Beiträge: 891
Holzvergaser: Do 28. Jan 2016, 00:11
Bewertung: 139
Wohnort: Zimmern ob Rottweil
Kontaktdaten:

Re: Flammtronik Laufzeit in Fhem

Beitrag #20158 von jostmario » So 11. Nov 2018, 17:50

Hallo Mathias,

Wenn Daten von der Flammtronik in fhem ankommen wird die Funktion Checkframe aufgerufen.

Code: Alles auswählen

package main;
use strict;
use warnings;
use POSIX;
use XML::Simple;
use HttpUtils;
use vars qw {$KeepedRest};

sub myUtils_Initialize($$)
{
my ($hash) = @_;
my $NewMailtime = time;
}


###############################################################################
#
#  Moving average
#
#  Aufruf: movingAverage(devicename,readingname,zeitspanne in s)
#
###############################################################################




sub CheckFrame($$)
{
my $name = shift;
my $hash = $defs{$name};
if (!defined $KeepedRest) { $KeepedRest = ""; }
else { Log3 $hash,5,"Used Prefix from prior line: $KeepedRest" };
my $frame = $KeepedRest . shift;
# Pumpe and Primaerluefter have both "P" as key, so change Primaerluefter to PL
$frame =~ s/P(\d{3})/PL$1/g;

# divide  into hash-table of [key,value] and take undetected rest into extra var forcheck
my %items = $frame=~/([A-Za-z]+)([-+]?[\d.]+)\W+/g;
my $Rest=$'; #';
# Keep all rest of line for next use
$frame=~/((.*\r\n\021)+)/g;
$KeepedRest=$'; #';
CalcItems($hash,\%items);
ReportItems($hash,\%items);
if ($Rest ne '') { Log3 $hash,5,"Unknown rest of frame: $Rest|$KeepedRest (Frame:
$frame)" };
Log3 $hash,5,"CheckFrame finished.";
return $KeepedRest;
}




sub ReportItems($$)
{
my %ItemNotes = (
"T" => "Laufzeit",
"K" => "Kesseltemp",
"A" => "Abgas",
"B" => "Brennkammer",
"PL" => "Primaerluefter",
"O" => "O2",
"S" => "Sekundaerluefter",
"R" => "Ruecknahme",
"V" => "Verlust",
"Rt" => "Rt",
"Ra" => "Ra",
"P" => "Pumpe",
"Z" => "status",
"Sp" => "Speicher",
"w" => "CAN_T1",
"x" => "CAN_T2",
"y" => "CAN_T3",
"z" => "CAN_T4",
"a" => "Temp_a",
"b" => "Temp_b",
"c" => "Temp_c",
"d" => "Temp_d",
"e" => "Temp_e",
"f" => "Temp_f",
"g" => "Temp_g",
"h" => "Temp_h",
"LZ_h" => "Laufzeit_h",
"LZ_m" => "Laufzeit_m",
"U" => "Uhrzeit",
#"HL" => "Heizlast",
#"ENERG" => "Energiemenge",
#"AZT" => "Anheizzeit",
"Dauer_h" => "Dauer_h",
"Dauer_m" => "Dauer_m",
"Dauer_min" => "Dauer_min"
);

my $hash = shift;
my %items = %{shift()};

foreach my $Key (sort keys %items)
 {
  my $Notation = $ItemNotes{$Key};
  my $Value = $items{$Key};
  readingsSingleUpdate($hash, $Notation, $Value,1);
 }
}


sub CalcDauer_h(@)
{
 my ($Laufzeit_h,$Status) = @{shift()};  my $Dauer_h;  unless ($Status eq "000") {$Dauer_h = $Laufzeit_h; }  return $Dauer_h; }

sub CalcDauer_m(@)
{
 my ($Laufzeit_m,$Status) = @{shift()};  my $Dauer_m;  unless ($Status eq "000") {$Dauer_m = $Laufzeit_m; }  return $Dauer_m; }


sub CalcDauer_min(@)
{
 my ($Dauer_min,$Status) = @{shift()};  my $Laufzeit;  unless ($Status eq "000") {$Dauer_min = $Laufzeit; }  return $Dauer_min; }



#Das ist die Berechnung der aktuell nutzbaren Energiemenge (Temperaturen > 40°, 8 Fühler, Puffer 3200 l ).

sub CalcEnergiemenge(@)
{
 my $Sum = 0;
 foreach(@_)
 { $Sum += ($_ > 40 ? $_ : 40) }
 return sprintf("%d", (($Sum - 310)/ 8 * 3200 * 0.001163));
}



#my @TEST = @{shift()};
# my @TEST = @_;
#return sprintf("%d", $TEST[2]);


sub CalcAnheizzeit(@)
{
 my @TEMP_ANH = @_;
 my $ENERG = $TEMP_ANH[0];
 my $HL = $TEMP_ANH[1];
 my ($Zeit) = time ();
# Log 1,"Calcanheizzeit HL($HL)";
# Log 1,"Calcanheizzeuit Energ ($ENERG)";
 
 $Zeit += ($ENERG / $HL * 3600);
 my($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime($Zeit);
 $Zeit = sprintf("%02u:%02u",$hour,$min);
 return $Zeit; 
}




sub AdaptIntervalValue($@)
{
 my $Value = shift;
 my @CorrectionTable = @{shift()};
 my $Prior = 0; my $PriorCorrect = 0; my $Search = 0; my $Correct = 0;
 while (@CorrectionTable)
{
 ($Prior, $PriorCorrect) = ($Search, $Correct);
 ($Search, $Correct) = (shift @CorrectionTable, shift @CorrectionTable);
  last if $Value <= $Search;
}

my $CorrVal = $PriorCorrect + (($Value-$Prior) * ($Correct-$PriorCorrect) /($Search-$Prior));
return $CorrVal;
}


sub CorrectKesselTemp($)
{
 my @CorrectionTable = (
 20 => 20,
 30 => 30,
 40 => 40,
 50 => 50,
 60 => 60,
 70 => 70,
 80 => 80,
 90 => 90
);

my $KesselTemp = shift;
my $Result = AdaptIntervalValue($KesselTemp,\@CorrectionTable);
$KesselTemp = sprintf("%d",( $Result));
return $KesselTemp;
}


sub CorrectVerlust($)
{
my $Verlust = shift;
$Verlust *= 1;
return $Verlust;
}


sub CorrectSpeicher($)
{
my $Speicher = shift;
$Speicher += 1;
return $Speicher;
}


sub Uhrzeit()
{
(my $sek, my $min, my $std, my $tag, my $mon, my $jahr, my $wt, my $jtag, my $sn)
= localtime(time);
return sprintf("Aktuelle Zeit: %02u.%02u.%04u %02u:%02u:%02u", $tag, $mon + 1,$jahr + 1900, $std, $min, $sek);
}


sub CalcLaufzeit_h(@)
{
my ($Laufzeit) = @{shift()};
return sprintf("%d", ($Laufzeit / 60));
}


sub CalcLaufzeit_m(@)
{
my ($Laufzeit) = @{shift()};
return
sprintf("%d", ($Laufzeit % 60));
}



sub CalcHeizlast($)
{
   my @CorrectionTable = (
   -15 => 12.5,
   -10 => 12.5,
   -5 => 11.0,
   0 => 10.5,
   2 => 8.0,
   5 => 7.5,
   10 => 5.5,
   15 => 2.5,
   20 => 2.0,
   25 => 0,
   30 => 0
   );
   #my ($Heizlast) = @{shift()};
         my ($Heizlast) = shift;
 
   my $Result = AdaptIntervalValue($Heizlast, \@CorrectionTable);
   $Heizlast = sprintf("%d", $Result);
   return $Heizlast;
}

sub CalcHeizlastt($)
{
   my @CorrectionTable = (
   -15 => 12.5,
   -10 => 12.5,
   -5 => 11.0,
   0 => 10.5,
   2 => 10.0,
   5 => 8.5,
   10 => 6.5,
   15 => 2.5,
   20 => 2.0,
   25 => 0,
   30 => 0
   );
   #my ($Heizlastt) = @{shift()};
         my ($Heizlastt) = shift;
 
   my $Result = AdaptIntervalValue($Heizlastt, \@CorrectionTable);
   $Heizlastt = sprintf("%d", $Result);
   
       Log 5, "Heizlast RCP: ($Heizlastt)";
       
       return $Heizlastt;
              }



sub CalcItems($$)
{
  my $hash = shift;
  my $itemRef = shift;

  # the next two arrays can be used to define correction-functions
  # definition of functions to correct single values
 
  my @CorrectFuncs = (
                "K" => \&CorrectKesselTemp,
                "V" => \&CorrectVerlust,
                "Sp" => \&CorrectSpeicher
  );


  # definition of functions to combine multiple values to new or existing value
  my @MultiCorrectFuncs = (
                 "LZ_h" => \&CalcLaufzeit_h, "T",
                 "LZ_m" => \&CalcLaufzeit_m, "T",
                 "U" => \&Uhrzeit, "",
                 "HL" => \&CalcHeizlast, "w",
                 "ENERG" => \&CalcEnergiemenge, "a,b,c,d,e,f,g,h",
                 "AZT" => \&CalcAnheizzeit, "ENERG,HL",
                 "Dauer_h" => \&CalcDauer_h, "LZ_h,Z",
                 "Dauer_m" => \&CalcDauer_m, "LZ_m,Z"
               #  "Dauer_min" => \&CalcDauer_min, "Laufzeit,Z"




  );

   # the next lines normally don't have to be changed
   # Correct all values which have defined a correction function with a single parameter
    while (@CorrectFuncs)
    {


my ($Search, $Func) = (shift @CorrectFuncs, shift @CorrectFuncs);
if ( exists $itemRef->{$Search} ) { $itemRef->{$Search} = &$Func($itemRef->{$Search}); }
}
# Correct all values which have defined a correction function with mutliple parameter.
while (@MultiCorrectFuncs)
{
my ($Search, $Func, $ParamStr) = (shift @MultiCorrectFuncs,shift@MultiCorrectFuncs,shift @MultiCorrectFuncs);
my @ParamNames = $ParamStr=~/(\w+)\W*/g;
my @ParamArray=();
my $NotUsedParams="";
foreach my $ParamName (@ParamNames)
{
if ( exists $itemRef->{$ParamName} ) { push @ParamArray, $itemRef->{$ParamName} }
else { $NotUsedParams.=$ParamName.","; }
}
if (@ParamNames != @ParamArray)
{
if (@ParamArray != 0)
{
$NotUsedParams =~s/,$//;
Log3 $hash,5,"Incomplete Params to calc\"$Search\". Notfound: $NotUsedParams";
}
next;
}
my $Result = &$Func(\@ParamArray);
$itemRef->{$Search} = $Result;
}
}

1;


Wenn der HV jetzt z.b. läuft zählt er beide Zähler für Laufdauer und auszeit hoch was ja schon nicht ganz richtig ist.
Wenn er dann aus ist zählt die auszeit weiter sollte aber da neu anfangen zu zählen.
Ja schlewcht zu erklären so.
Wenn der kessel nach einer gewissen zeit von aus auf Stromsparen umschaltet setzt er die auszeit auch irgendwie zurück.

Gruß Josty


Gruß Josty
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
Holzvergaser Orlan 40KW Brennkammer und Turbolatoren von Spikisveni Holzgasverteiler von Jens
Flammtronik umbau mit getrennter Primär/Secundärluft 3200 Liter Puffer
Visualisierung über Raspberry mit FHEM

Bild

Benutzeravatar
Mathias
--Mitglied--
Beiträge: 611
Holzvergaser: Do 28. Jan 2016, 21:13
Bewertung: 104
Wohnort: Herten

Re: Flammtronik Laufzeit in Fhem

Beitrag #20165 von Mathias » Mo 12. Nov 2018, 08:08

Da weiss ich spontan wieder, warum ich nix mit fhem oder Perl machen will ...

also, du übernimmst die Daten aus der FT, aber wo wird gerechnet?


Ich sehe da nirgends etwas wie += wo er die Laufzeiten addiert?!

Eigentlich ist es doch so, wenn der Kessel läuft, addiert man die Minuten bei Laufzeit.
Sonst die bei "Pause'?!

Ohne das man da unbedingt Daten der FT übernehmen muss.

Oder bin ich auf dem Holzweg?
Grüße
Mattes

SolarBayer HVS 40E Holzvergaser, Flammtronik, Große Brennkammer, Gussdüse, 3200l Puffer, 500l Warmwasser Speicher, 730l MAG,
270qm WF, 8 Personen, Solarthermie geplant
Rücklaufanhebung + Heizkreis via Arduino geregelt.

Benutzeravatar
jostmario
Administrator
Beiträge: 891
Holzvergaser: Do 28. Jan 2016, 00:11
Bewertung: 139
Wohnort: Zimmern ob Rottweil
Kontaktdaten:

Re: Flammtronik Laufzeit in Fhem

Beitrag #20170 von jostmario » Mo 12. Nov 2018, 12:28

Hallo,

ich denke er verwertet den Wert Laufzeit der von der FT kommt und kombiniert das mit dem Status der FT

000 aus
001 Anheizen
002 Heizen
003 ??
004 Ausbrand
005 Ruhemodus Stromsparen
006 Anzünden Start

Nach einem Neustart des Raspberry zählt er Laufzeit_h und Laufzeit_m weiter weil die FT die Laufzeit ja auch weiterzählt.
Dauer_h und Dauer_m ist dann erst mal verschwunden und generiert er gar nicht.
Bleibt die Frage wann er das generiert und ob er es bei z.b. status von 001 auf 002 wieder zurücksetzt.


Gruß Josty
Holzvergaser Orlan 40KW Brennkammer und Turbolatoren von Spikisveni Holzgasverteiler von Jens
Flammtronik umbau mit getrennter Primär/Secundärluft 3200 Liter Puffer
Visualisierung über Raspberry mit FHEM

Bild

Benutzeravatar
Mathias
--Mitglied--
Beiträge: 611
Holzvergaser: Do 28. Jan 2016, 21:13
Bewertung: 104
Wohnort: Herten

Re: Flammtronik Laufzeit in Fhem

Beitrag #20172 von Mathias » Mo 12. Nov 2018, 16:42

jostmario hat geschrieben:Hallo,

ich denke er verwertet den Wert Laufzeit der von der FT kommt und kombiniert das mit dem Status der FT

000 aus
001 Anheizen
002 Heizen
003 ??
004 Ausbrand
005 Ruhemodus Stromsparen
006 Anzünden Start

Nach einem Neustart des Raspberry zählt er Laufzeit_h und Laufzeit_m weiter weil die FT die Laufzeit ja auch weiterzählt.
Dauer_h und Dauer_m ist dann erst mal verschwunden und generiert er gar nicht.
Bleibt die Frage wann er das generiert und ob er es bei z.b. status von 001 auf 002 wieder zurücksetzt.


Gruß Josty


Code: Alles auswählen

sub CalcLaufzeit_h(@)
{
   my ($Laufzeit) = @{shift()};
   return sprintf("%d", ($Laufzeit / 60));
}


sub CalcLaufzeit_m(@)
{
   my ($Laufzeit) = @{shift()};
   return sprintf("%d", ($Laufzeit % 60));
}

sub CalcDauer_h(@)
{
    my ($Laufzeit_h,$Status) = @{shift()}; 
    my $Dauer_h; 
    unless ($Status eq "000") {
          $Dauer_h = $Laufzeit_h;
    } 
    return $Dauer_h;
 
 }


sub CalcDauer_m(@)
{
     my ($Laufzeit_m,$Status) = @{shift()}; 
    my $Dauer_m; 
    unless ($Status eq "000") {
       $Dauer_m = $Laufzeit_m;
    } 
    return $Dauer_m;
 }



sub CalcDauer_min(@)
{
    my ($Dauer_min,$Status) = @{shift()}; 
    my $Laufzeit; 
    unless ($Status eq "000") {
       $Dauer_min = $Laufzeit;
    } 
    return $Dauer_min;
 }





Ich weiß, ich wiederhole mich, aber diese Sprache ist ...

Also der Reihe nach:
-> my ($Dauer_min,$Status) = @{shift()};

das macht irgendwas ... keine Ahnung was.

-> my $Laufzeit;
Variablen deklaration?


-> unless ($Status eq "000") {
ähnlich einer IF Anweisung
WENN $Status GLEICH "000", DANN MACHE FOLGENDES

->$Dauer_min = $Laufzeit;
Der Wert von Laufzeit wird Dauer_min zugewiesen ... aber nichts gerechnet

->return $Dauer_min;
Rückgabewert ist Dauer_min, auch wenn $Status nicht "000" ist


Ich finde keine Stelle, wo eine Zeit addiert wird, also vermute ich, das die Zeitangabe der FT benutzt wird.


Wenn der Status 000 = AUS bzw. 005 = RUHEMODUS ist, müsste er AUSZEIT erhöhen
Wenn der Status 001, 002, 003?, 004? und 006 ist, müsste er LAUFZEIT erhöhen

Besser wäre aber, man merkt sich, wann er den Modus(AN/AUS bzw. AUS/AN) gewechselt hat und berechnet die Laufzeit, bzw. Auszeit mit der Aktuellen Zeit ab diesem Datumswert.

Wechselt der Modus erneut, addiert man den letzten errechneten Wert zu der Gesamtlaufzeit.

Das ganze müsste man natürlich speichern ... in einer Datenbank könnte man das alles der Reihe nach hineinschreiben und danach, bei bedarf direkt passend auslesen ...


Als Anhaltspunkt, wie man das in etwa machen kann folgende Zeilen Code ... nicht Perl:

Code: Alles auswählen

varKesselStatus
varStartZeit
varAusZeit
varLaufZeit



if (logSTATUS != "000" && logSTATUS != "005"){
   if (varKesselStatus != logSTATUS){
      varKesselStatus  = logSTATUS;
      varLaufZeit += time() - varStartZeit;   
      varStartZeit = time();
   }
 
}else{
    if (varKesselStatus != logSTATUS){
      varKesselStatus  = logSTATUS;
      varAusZeit+= time() - varStartZeit ;
         varStartZeit = time();
   }
 
}
print time() - varStartZeit; <----  Aktuelle Zeit - StartZeit = Dauer, ob als Rückgabewert einer Funktion oder als Direktausgabe .... Tage usw. müsste man noch beachten, also unbedingt anpassen oder mit Methoden der Zeitberechnung der entsprechenden Sprache umsetzen.



geht sicher besser, aber für den Anfang OK?
Grüße
Mattes

SolarBayer HVS 40E Holzvergaser, Flammtronik, Große Brennkammer, Gussdüse, 3200l Puffer, 500l Warmwasser Speicher, 730l MAG,
270qm WF, 8 Personen, Solarthermie geplant
Rücklaufanhebung + Heizkreis via Arduino geregelt.


Zurück zu „Raspberry , FHEM , Arduino etc.“

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 0 Gäste