FHEM Forum

FHEM => Automatisierung => Thema gestartet von: wildea am 25 Januar 2017, 13:47:56

Titel: [gelöst]Perl bringt Fehlermeldungen bei at Funktion
Beitrag von: wildea am 25 Januar 2017, 13:47:56
Hallo Leute brauche mal eure Hilfe,

Ich habe diese Funktion für meine OWL im Internet gefunden und würde diese gerne bei mir umsetzen. Ich habe die Funktion in einen at eingefügt und bekomme leider eine Fehlermeldung und weiß nicht wo der Fehler liegt. Vielleicht scheut einer von euch Perl Spezies ja drauf und erkennt schnell den Fehler.

Hier der Code der im at drin steht:

define update_stromzaehler at +*00:00:05 {my $mode=InternalVal(,,OWL_energy","MODE",0);;;;\
if ( $mode eq ,,live data" ) {\
my $leistung_vorher=ReadingsVal(,,stromzaehler","leistung",0)+0;;;; my $leistung_jetzt=ReadingsVal(,,OWL_energy","W",0);;;; $leistung_jetzt =~ s/[^0-9\.]//g;;;; my $timestamp_jetzt=time();;;;my $differenz=$timestamp_jetzt-\
ReadingsVal(,,stromzaehler","zaehler_leistung_timestamp",$timestamp_jetzt);;;;\
my $energie_diff_kwh=($leistung_vorher*$differenz)/3600/1000;;;; my $energie_tag=$energie_diff_kwh+ReadingsVal(,,stromzaehler","energie_tag",0);;;;\
my $energie_gesamt=$energie_diff_kwh+ReadingsVal(,,stromzaehler","energie_gesamt",0);;;; my ($s, $mi, $h, $tag_jetzt, $mo, $y, $w, $yd, $st)=localtime(time);;;;\
my $zaehler_tag=ReadingsVal(,,stromzaehler","zaehler_tag",0);;;;\

if ( $tag_jetzt != $zaehler_tag ) {\\
fhem(,,setreading stromzaehler zaehler_tag $tag_jetzt");;;;fhem(,,setreading zusammenfassung_stromzaehler tag $energie_tag");;;;$energie_tag=0;;;;\
}\
fhem(,,setreading stromzaehler leistung $leistung_jetzt");;;;\
fhem(,,setreading stromzaehler energie_tag $energie_tag");;;;\
fhem(,,setreading stromzaehler energie_gesamt $energie_gesamt");;;;\
fhem(,,setreading stromzaehler zaehler_leistung_timestamp $timestamp_jetzt");;;;\
fhem(,,setreading stromzaehler state ,,.sprintf(,,%.3f",$energie_gesamt)." kWh");;;;}}



Hier die Fehlermeldung aus dem Log


2017.01.25 13:42:38 3: update_stromzaehler: Unknown command {my, try help.
Titel: Antw:Perl bringt Fehlermeldungen bei at Funktion
Beitrag von: betateilchen am 25 Januar 2017, 14:07:26
In perl kenne ich doppelte Anführungszeichen oben "" und einfache Anführungszeichen oben ''

Aber Anführungszeichen unten und oben kenne ich nicht... wie um alles in der Welt bearbeitest Du Deine fhem Konfiguration, um das hinzubekommen?
Titel: Antw:Perl bringt Fehlermeldungen bei at Funktion
Beitrag von: wildea am 25 Januar 2017, 14:25:06
Danke für die schnelle Antwort.

Hab die Funktion aus einem Blog Post kopiert und da ging die Formatierung kaputt. Ich hab den Wald vor lauter Bäumen nicht gesehen mit den "".
Das habe ich jetzt berichtigt bekomme jetzt aber diese Fehlermeldung:

2017.01.25 14:19:54 1: PERL WARNING: Useless use of reference constructor in void context at (eval 14341) line 2.
2017.01.25 14:19:54 3: eval: my $DEV='update_stromzaehler';{my $mode=InternalVal("OWL_energy","MODE",0);;;; if ( $mode eq "live data" ) { my $leistung_vorher=ReadingsVal("stromzaehler","leistung",0)+0;;;; my $leistung_jetzt=ReadingsVal("OWL_energy","W",0);;;; $leistung_jetzt =~ s/[^0-9\.]//g;;;; my $timestamp_jetzt=time();;;;my $differenz=$timestamp_jetzt- ReadingsVal("stromzaehler","zaehler_leistung_timestamp",$timestamp_jetzt);;;; my $energie_diff_kwh=($leistung_vorher*$differenz)/3600/1000;;;; my $energie_tag=$energie_diff_kwh+ReadingsVal("stromzaehler","energie_tag",0);;;; my $energie_gesamt=$energie_diff_kwh+ReadingsVal("stromzaehler","energie_gesamt",0);;;; my ($s, $mi, $h, $tag_jetzt, $mo, $y, $w, $yd, $st)=localtime(time);;;; my $zaehler_tag=ReadingsVal("stromzaehler","zaehler_tag",0);;;;
if ( $tag_jetzt != $zaehler_tag ) {\ fhem("setreading stromzaehler zaehler_tag $tag_jetzt");;;;fhem("setreading zusammenfassung_stromzaehler tag $energie_tag");;;;$energie_tag=0;;;; } fhem("setreading stromzaehler leistung $leistung_jetzt");;;; fhem("setreading stromzaehler energie_tag $energie_tag");;;; fhem("setreading stromzaehler energie_gesamt $energie_gesamt");;;; fhem("setreading stromzaehler zaehler_leistung_timestamp $timestamp_jetzt");;;; fhem("setreading stromzaehler state ".sprintf("%.3f",$energie_gesamt)." kWh");;;;}}
Titel: Antw:Perl bringt Fehlermeldungen bei at Funktion
Beitrag von: wildea am 25 Januar 2017, 14:35:19
Hab den Fehler gefunden. War ein \ an einer Stelle wo er nicht hingehört hat.

Danke für dir Hilfe mit den ""
Titel: Antw:[gelöst]Perl bringt Fehlermeldungen bei at Funktion
Beitrag von: betateilchen am 25 Januar 2017, 14:43:34
Ein solches Konstrukt gehört sowieso nicht in die Definition eines at, sondern in eine Funktion in der 99_myUtils.pm



sub werteUpdate {
my $mode=InternalVal("OWL_energy","MODE",0);
if ( $mode eq "live data" ) {
  my $leistung_vorher  = ReadingsNum("stromzaehler","leistung",0);
  my $leistung_jetzt   = ReadingsVal("OWL_energy","W",0);
  $leistung_jetzt      =~ s/[^0-9\.]//g;
  my $timestamp_jetzt  = time();
  my $differenz        = $timestamp_jetzt - ReadingsVal("stromzaehler","zaehler_leistung_timestamp",$timestamp_jetzt);
  my $energie_diff_kwh = $leistung_vorher*$differenz/3600/1000;
  my $energie_tag      = $energie_diff_kwh + ReadingsVal("stromzaehler","energie_tag",0);
  my $energie_gesamt   = $energie_diff_kwh + ReadingsVal("stromzaehler","energie_gesamt",0);
  my ($s, $mi, $h, $tag_jetzt, $mo, $y, $w, $yd, $st) = localtime(time);
  my $zaehler_tag      = ReadingsVal("stromzaehler","zaehler_tag",0);
  if ( $tag_jetzt != $zaehler_tag ) {
     fhem("setreading stromzaehler zaehler_tag $tag_jetzt");
fhem("setreading zusammenfassung_stromzaehler tag $energie_tag");
$energie_tag=0;
  }
  fhem("setreading stromzaehler leistung $leistung_jetzt");
  fhem("setreading stromzaehler energie_tag $energie_tag");
  fhem("setreading stromzaehler energie_gesamt $energie_gesamt");
  fhem("setreading stromzaehler zaehler_leistung_timestamp $timestamp_jetzt");
  fhem("setreading stromzaehler state ".sprintf("%.3f",$energie_gesamt)." kWh");}
}
return;
}



und dann wird im at einfach diese Funktion aufgerufen:


define update_stromzaehler at +*00:00:05 { werteUpdate() }


Davon abgesehen macht ein solches at im 5-Sekunden-Abstand ohnehin nicht viel Sinn, sondern belastet nur (unnötigerweise) fhem.