FHEM Forum

FHEM => Sonstiges => Thema gestartet von: Kornelius777 am 29 April 2019, 19:05:55

Titel: DbRep Ergebnis in Variable übernehmen
Beitrag von: Kornelius777 am 29 April 2019, 19:05:55
Hallo Leute,

jetzt habe ich mein DbRep-Device angelegt und möchte gerne innerhalb eines bestehenden at die Berechnung anstoßen und das Ergebnis in eine Variable übernehmen. (in Perl)

Quasi:
$var = set DbRep_fuer_DBLogging maxValue display;

Wie kriege ich das hin?

Danke euch!

Grüße,

Kornelius

Titel: Antw:DbRep Ergebnis in Variable übernehmen
Beitrag von: CoolTux am 29 April 2019, 19:10:10
Aus dem Bauch heraus würde ich behaupten das geht nicht. Der get Befehl wird sicherlich asynchron ausgeführt.
Ansonsten aber auf jeden Fall mit Perl. Also auf Perlebene.

Titel: Antw:DbRep Ergebnis in Variable übernehmen
Beitrag von: DS_Starter am 29 April 2019, 19:23:29
Na das geht schon  ;)
Aber wie Cooltux schon richtig schrieb ist die Arbeitsweise des Moduls asynchron.
Deswegen gibt es das Attribut "userExitFn". Dort hinterlegt man eine Funktion die in 99_myUtils.pm aufgerufen wird.

Auszug aus Commandref:

userExitFn - stellt eine Schnittstelle zur Ausführung eigenen Usercodes zur Verfügung.
Um die Schnittstelle zu aktivieren, wird zunächst die aufzurufende Subroutine in 99_myUtls.pm nach folgendem Muster erstellt:

        sub UserFunction {
          my ($name,$reading,$value) = @_;
          my $hash = $defs{$name};
          ...
          # z.B. übergebene Daten loggen
          Log3 $name, 1, "UserExitFn $name called - transfer parameter are Reading: $reading, Value: $value " ;
          ...
        return;
        }
        

Die Aktivierung der Schnittstelle erfogt durch Setzen des Funktionsnamens im Attribut. Optional kann ein Reading:Value Regex als Argument angegeben werden. Wird kein Regex angegeben, werden alle Wertekombinationen als "wahr" gewertet (entspricht .*:.*).

    Beispiel:
    attr userExitFn UserFunction .*:.*
    # "UserFunction" ist die Subroutine in 99_myUtils.pm.


Grundsätzlich arbeitet die Schnittstelle OHNE Eventgenerierung bzw. benötigt zur Funktion keinen Event. Sofern das Attribut gesetzt ist, erfolgt Die Regexprüfung NACH der Erstellung eines Readings. Ist die Prüfung WAHR, wird die angegebene Funktion aufgerufen. Zur Weiterverarbeitung werden der aufgerufenenen Funktion folgende Variablen übergeben:

    $name - der Name des DbRep-Devices
    $reading - der Namen des erstellen Readings
    $value - der Wert des Readings


Ein Beispiel findet sich für "maxValue" im Wiki:
https://wiki.fhem.de/wiki/DbRep_-_Reporting_und_Management_von_DbLog-Datenbankinhalten#Ein_Userreading_anlegen_und_f.C3.BCr_stateformat_verwenden

Das heißt, du müstest in deinem "DbRep_fuer_DBLogging" das Attribut userExitFn setzen und in der dort angegebenen Funktion in myUtils den $value des entstandenen Readings einer Variablen zuweisen.
Titel: Antw:DbRep Ergebnis in Variable übernehmen
Beitrag von: CoolTux am 29 April 2019, 19:27:09
Quasi Aufruf einer Callback Funktion. Oder?
Titel: Antw:DbRep Ergebnis in Variable übernehmen
Beitrag von: DS_Starter am 29 April 2019, 19:30:36
Ja genau. Ist direkt eine Userschnittstelle.
Ich versuche gleich mal noch ein Beispiel für Kornelius ...
Titel: Antw:DbRep Ergebnis in Variable übernehmen
Beitrag von: CoolTux am 29 April 2019, 19:31:46
Find ich super. Gut zu wissen.
Titel: Antw:DbRep Ergebnis in Variable übernehmen
Beitrag von: DS_Starter am 29 April 2019, 19:47:21
Hier ein Beispiel.
Gesetzt den Fall das im DbRep generierte Reading dessen Wert du "fangen" willst heißt "2019-04-28_19-39-42__/__total_pac__MAX__2019".
Dann könnte die kleine Sub in 99_myUtils so aussehen:

        sub fang {
          my ($name,$reading,$value) = @_;
          my $hash = $defs{$name};
         
          my $var;
          if ($reading =~ /^.*__total_pac__MAX.*$/) {
              $var = $value;
              .... jetzt mache etwas mit $var .....
          }

        return;
        }


Dann würdest du im DbRep_fuer_DBLogging  setzen:

attr  DbRep_fuer_DBLogging  userExitFn fang

Innerhalb der Sub könntest du zum Beispiel Readings von Dummies setzen oder ähnliches.
Du könntest in der Sub auch mit "trigger" (FHEM -Kommando) einen definierten Event mit immer dem gleichen Namen generieren und ein Notify verwenden um diesen Event auszuwerten und weiter zu verarbeiten.
Die Möglichkeiten sind nun sehr weitreichend und der Phantasie kaum Grenzen gesetzt.  ;)

Grüße,
Heiko