FHEM Forum

FHEM - Hausautomations-Systeme => 1Wire => Thema gestartet von: mikezulugolf am 06 Dezember 2013, 17:31:25

Titel: kleiner Verbesserungsvorschlag für 21_OWCOUNT.pm
Beitrag von: mikezulugolf am 06 Dezember 2013, 17:31:25
Hallo Zusammen,

bei meinen ersten Gehversuchen mit OWX und einem DS2423 Counter bin ich irgendwann auf den Zustand gestoßen, dass  alle 5 Minuten (=default OWCOUNT Intervall) die Meldung
Argument "" isn't numeric in multiplication (*) at ./FHEM/21_OWCOUNT.pm line 1226.
angezeigt wurde.
Diese Zeile und die beiden davor sehen so aus:       $owg_str =~ s/[^\d\.]+//g;
      $owg_str = 0.0 if(!(defined($owg_str)));
      $owg_str = int($owg_str*100)/100;

Mit der ersten soll wohl erreicht werden, dass aus dem Inhalt von $owg_str alles entfernt wird, was nicht Ziffer oder Punkt ist.  Und in der 2. Zeile  soll wohl erreicht werden, dass wenn in $owg_str nichts mehr drin ist, es dann auf 0.0 gesetzt wird.  Das scheint aber mit der "defined()" Funktion  nicht der richtige Weg zu sein, da mit der ersten Zeile beispielsweise aus einem vermüllten Inhalt ein Leerstring (= "") entstehen kann, der durchaus "defined" ist. Dies führt dann zu der obigen Fehlermeldung bei der Ausführung der dritten Zeile.
Anstatt dessen wäre es passender die Prüfung mit       $owg_str = 0.0 if($owg_str eq "");durchzuführen, dann tritt auch die obige Fehlermeldung nicht mehr auf. 
Dieses Code-Snippet ist insgesamt vier mal in 21_OWCOUNT.pm zu finden.

Gruß,
Richard.
Titel: Antw:kleiner Verbesserungsvorschlag für 21_OWCOUNT.pm
Beitrag von: ntruchsess am 08 Dezember 2013, 18:37:57
mach doch mal ein update, das habe ich am 4.11.2013 schon angepasst:

    $owg_str =~ s/[^\d\.]+//g;
    $owg_str = 0.0 if(!defined($owg_str) or $owg_str !~ /^\d+\.?\d*$/);
    $owg_str = int($owg_str*100)/100;
    $owg_midnight[0] = $owg_str;

- Norbert
Titel: Antw:kleiner Verbesserungsvorschlag für 21_OWCOUNT.pm
Beitrag von: Prof. Dr. Peter Henning am 16 Dezember 2013, 21:22:53
Passt.

LG

pah
Titel: Antw:kleiner Verbesserungsvorschlag für 21_OWCOUNT.pm
Beitrag von: Wzut am 30 Dezember 2013, 15:14:13
@Norbert , hast du jetzt die Pflege von OWCOUNT übernommen ? Wenn ja, ich habe heute meinen FIRMATA 1W Bus um einen DS2423 erweitert  (fhem V5.5 + update heute) und mir ist aufgefallen das OWCOUNT keinen Unterschied bei der Rückgabe von get counter (A oder B) und get counters macht.

root@mail:/opt/fhem-5.5# ./fhem.pl 7072 "get Zaehler counters"
OWCOUNT: Zaehler.counters => A:   0.0 cts A_rate:  0.00 cts/h B:   0.0 cts B_rate:  0.00 cts/h
root@mail:/opt/fhem-5.5# ./fhem.pl 7072 "get Zaehler counter A"
Use of uninitialized value in string ne at ./FHEM/21_OWCOUNT.pm line 718.
OWCOUNT: Zaehler.counter => A:   0.0 cts A_rate:  0.00 cts/h B:   0.0 cts B_rate:  0.00 cts/h
root@mail:/opt/fhem-5.5# ./fhem.pl 7072 "get Zaehler counter B"
Use of uninitialized value in string ne at ./FHEM/21_OWCOUNT.pm line 718.
OWCOUNT: Zaehler.counter => A:   0.0 cts A_rate:  0.00 cts/h B:   0.0 cts B_rate:  0.00 cts/h

Ich habe mir dann auf Grund der Fehlermeldung den Bereich um die Zeile 718 herum angeschaut und gesehen das dort im Erfolgsfall immer der komplette hash zurück gegeben wird. Ich habe dann ein paar Zeilen  darüber zum Test eine kleinen Änderung für mich eingefügt :
if( $reading eq "counter" ) {

#### snipp #####

}else{
      return "OWCOUNT: Get with wrong IODev type $interface";
    }
    ###   neu #####
    if( defined($ret ){ return "OWCOUNT: Could not get values from device $name, reason: ".$ret;}
    else {
      if ($page==14) { return "$name.counter A => ".$owg_val[0]; }
      else { return "$name.counter B => ".$owg_val[1]; }
    ############
}

Damit ist die Fehlermeldung weg und die Rückgabe der beiden Counter schaut auch ein bissel "schöner" aus:
root@mail:/opt/fhem-5.5# ./fhem.pl 7072 "get Zaehler counters"
OWCOUNT: Zaehler.counters => A:   0.0 cts A_rate:  0.00 cts/h B:   0.0 cts B_rate:  0.00 cts/h
root@mail:/opt/fhem-5.5# ./fhem.pl 7072 "get Zaehler counter A"
Zaehler.counter A => 0
root@mail:/opt/fhem-5.5# ./fhem.pl 7072 "get Zaehler counter B"
Zaehler.counter B => 0
 
Titel: Antw:kleiner Verbesserungsvorschlag für 21_OWCOUNT.pm
Beitrag von: Prof. Dr. Peter Henning am 31 Dezember 2013, 07:54:50
Nein, hat er nicht - jedenfalls nicht vollständig. Ich bin aber wie immer vollständig überlastet, wir teilen uns also die Arbeit etwas. Ich bin am OWCOUNT dran und werde möglicherweise heute oder übermorgen eine neue Version mit ein paar Fixes einchecken.

Allerdings werde ich dabei den "Verbesserungsvorschlag" nicht ganz übernehmen - der macht nämlich kein Update der State-Variablen, das kann man besser lösen.

LG

pah