Werte und Readings in ein Array Lesen

Begonnen von fritz, 20 September 2013, 12:44:25

Vorheriges Thema - Nächstes Thema

fritz

Ich liebe an Perl vor allem die Möglichkeit, mit Arrays (und Hashes) im Ganzen und als Slices (für Fortgeschrittene) arbeiten zu können. Daher wollte ich gern in meinen Funktionen die benötigten Messwerte in einem Rutsch einlesen, z.B. so:
# Anwendung
my ($celsius, $window, $soll, $next) = Wert (
  "bad:temperature", "badfenster", "badControl", "badControl:nextValue");

wobei Werte und Readings sich dadurch unterscheiden, dass Readings in der Form "unit:readingname" (also mit einem Doppelpunkt) gegeben sind, während für einfache Werte nur der Name der Unit angegeben wird. Die Funktion habe ich erst mal Wert genannt, kann mir aber vorstellen, dass sie Eingang in FHEM findet und die bisherige Value-Funktion ersetzt (ich habe sie jedenfalls so geschrieben, dass sie das könnte :-)

# Funktion Wert (mit Logging der Zugriffe)
sub Wert {
    my $v;
    if (wantarray) {
        return map {
                if (/^([^:]+):([^:]+)$/) {
                    # Wert ist objekt:reading
                    $v = ReadingsVal ($1, $2, undef);
                }
                else {
                    $v = Value ($_);
                }
                Log 4, "Read $_: " . (defined $v? "$v": "(undef)");
                $v;
            } @_;
    }
    my ($obj) = @_;
    my $val;
    if ($obj =~ /^([^:]+):([^:]+)$/) {
        # Wert ist objekt:reading
        $val= ReadingsVal ($1, $2, undef);
    }
    else {
        $val = Value ($obj);
    }
    Log 4, "Read $obj: " . (defined $val? "$val": "(undef)");
    return $val;
}


Ohne das Logging könnte man den map-Block ohne die Hilfsvariable schreiben, das sähe noch einfacher aus. Ich hätte dann aber im Log nicht die gelesenen Werte, die mir dann helfen, die Funktion meiner Funktion zu prüfen. Der zweite Teil der Funktion erledigt dann das, was die Value-Funktion vorher gemacht hat.
Der Unterschied zum "normalen" Reading-Lesen besteht darin, dass kein default-Wert mehr angegeben werden kann falls ein Wert (noch) nicht gesetzt ist. Aber ich denke mal, das wird so oft nicht gebraucht werden (und wenn doch, könnte ich mir etwas wie "badControl:nextValue(20)" vorstellen.

Vielleicht hilft die Funktion ja dem einen oder anderen weiter. Würde mich freuen, wenn sie a) nützlich erachtet wird und b) vielleicht sogar ins FHEM-Interface Eingang finden würde (dann aber unter anderem Namen und mit konfigurierbarem Logging).

Viele Grüße

<F>

Edit: Themenbeschreibung ergänzt

fritz

Was mir gerade auffällt: die Alternative zu wantarray, also der Teil des Codes, von dem ich behaupte, dass er die Values-Funktionalität enthält, wird in meinen Anwendungen nie ausgeführt - kann also noch nicht als getestet gelten. - Bitte mal darauf achten, ob das wirklich so funktioniert wie gedacht (Values-Interface vollständig unterstützen, Values-Interface für Readings (mit default undef) nutzen).

Danke
<F>