FHEM Forum

FHEM - Entwicklung => FHEM Development => Thema gestartet von: Sailor am 10 November 2014, 15:46:30

Titel: X_DbLog_splitFn
Beitrag von: Sailor am 10 November 2014, 15:46:30
Hallo zusammen

im Wiki http://www.fhemwiki.de/wiki/DevelopmentModuleIntro#X_DbLog_splitFn (http://www.fhemwiki.de/wiki/DevelopmentModuleIntro#X_DbLog_splitFn) steht eine Beschreibung wie ich die Einheiten (units) eines Reading ins DbLog bekomme.

Leider verstehe ich diese Funktion noch nicht so ganz...

a) Wer ruft diese Funktion auf?
b) Wann, bzw. durch welches Event wird diese Funktion ausgelöst/aufgerufen?

Der Hintergrund ist, dass ich ein Gerät auslese, welches mir die Einheit beim auslesen gleich mitliefert.

Am liebsten wäre es mir, wenn ich es wie beispielsweise nach oder vor dem Befehl readingsSingleUpdate() gleich die unit hiterher schreiben könnte.

Weiß da Jemand vielleicht Rat?

Gruss
   Sailor
Titel: Antw:X_DbLog_splitFn
Beitrag von: betateilchen am 10 November 2014, 16:03:24
Die SplitFn wird von DbLog aufgerufen, wenn eine entsprechende Funktion im zugehörigen Gerätemodul, das die Daten liefert, implementiert ist. Im Moment ist das noch nicht bei allzuvielen Modulen der Fall ;)

Normalerweise werden reading und unit von DbLog gesplittet, sofern das in DbLog festgelegt ist. Da dies aber nicht für alle denkbaren reading-/Unit-Kombis vorprogrammiert ist, kann ein Modulentwickler auf diesem Weg selbst bestimmen, wie die beiden Teile getrennt werden.

Titel: Antw:X_DbLog_splitFn
Beitrag von: Sailor am 11 November 2014, 09:47:04
Hallo betateilchen, Tobias

ok, soweit verstanden!

Mein Aufbau:

In der fhem.cfg wurde DbLog initialisiert

in meinem Modul gibt es folgenden Eintrag in der km200_Initialize($)

sub km200_Initialize($)
{
    my ($hash)  = @_;

    $hash->{Version}         = "v1.17";
    $hash->{STATE}           = "Init";
    $hash->{DefFn}           = "km200_Define";
    $hash->{UndefFn}         = "km200_Undefine";
    $hash->{SetFn}           = "km200_Set";
    $hash->{GetFn}           = "km200_Get";
    $hash->{AttrFn}          = "km200_Attr";
    $hash->{DbLog_splitFn}   = "DbLog_splitFn";
    $hash->{AttrList}        = "do_not_notify:1,0 " .
                               "loglevel:0,1,2,3,4,5,6 " .
                               "IntervalDynVal " .
                               "IntervalStatVal " .
                               $readingFnAttributes;
}


Und folgenden Test-Eintrag in der DbLog_splitFn:

sub km200_DbLog_splitFn($)
{
my ($event) = @_;
my ($reading, $value, $unit);

print("km200_DbLog_splitFn - event: $event\n");

    return ($reading, $value, $unit);
}


Warum taucht dann nicht jedesmal, sobald ich ein ReadingsSingleUpdate() mache eine Konsolenausgabe wie

km200_DbLog_splitFn - event: xxxxxx
auf?

(Und ja ich habe vorher "sudo service fhem stop" & "sudo service fhem start" in die Konsole eingegeben...)   ;)

Gruß
    Sailor

Nachtrag: Höchstwahrscheinlich Fehler während des Schreibens dieses Eintrags gefunden. Ich glaube ich habe einen Fehler in der Initialize

$hash->{DbLog_splitFn}   = "DbLog_splitFn";


statt

$hash->{DbLog_splitFn}   = "km200_DbLog_splitFn";


Ich werde berichten!
Titel: Antw:X_DbLog_splitFn
Beitrag von: betateilchen am 11 November 2014, 11:13:21
gut, dass es dir selbst aufgefallen ist :)
Titel: Antw:X_DbLog_splitFn
Beitrag von: Sailor am 11 November 2014, 14:59:55
Hallo betateilchen,

Zitat von: betateilchen am 11 November 2014, 11:13:21
gut, dass es dir selbst aufgefallen ist :)

wie wahr, wie wahr.

Da du so gut zu DbLoggen bist anbei eine Frage:

Wie bekomme ich innerhalb eines fremden Moduls herausgefunden, ob eine DbLog Datei initialisiert worden ist?

Quasi ein
if (exist DbLog){}

Gruß
   Sailor
Titel: Antw:X_DbLog_splitFn
Beitrag von: justme1968 am 11 November 2014, 15:35:17
das kannst du rausfinden in dem du alle $defs durchgehst. das ist aber ziemlich sicher nicht was du willst. selbst wenn es ein dblog device gibt muss es ja nicht für dein device sein.

mir fällt auch gerade kein grund ein warum ein modul wissen sollte oder müsste ob und wie geloggt wird.

gruß
  andre
Titel: Antw:X_DbLog_splitFn
Beitrag von: Tobias am 12 November 2014, 19:35:26
Ich prüfe zb. in TEXT2SPEECH.pm ob es eine DbLog Instanz gibt (ganz weit hinten/unten im Modul). Ich nutze dort die current Tabelle um Statistiken der Cachefiles zu hinterlegen. Eine Option für eine später zu implementierende automatisierte Löschung...
Titel: Antw:X_DbLog_splitFn
Beitrag von: justme1968 am 12 November 2014, 19:37:08
wäre das nicht FileRead und FileWrite besser? die arbeiten transparent mit dem filesystem oder mit configdb wenn vorhanden.
Titel: Antw:X_DbLog_splitFn
Beitrag von: Sailor am 13 Januar 2015, 14:13:07
Hallo justme,

bin jetzt mal wieder zeitlich dazu gekommen mich um meine DbLog_Split Funktion zu kümmern.

Ich habe folgende Problemstellung:

Ich kenne die unit eines Readings nicht im vorwege.
Ich bin aber in der glücklichen Lage, dass mein auszulesendes Gerät mir die unit mitliefert.

Um die ausgelesene unit an das DbLog bzw. DbLog_Split zu übergeben, müsste ich irgendwie innerhalb der DbLog_Split auf den hash zugreifen koennen.

Meine Frage ist, wie komme ich da bloß ran???  ???
Scheinbar wird das hash nicht mit übergeben.

Gruß
    Sailor
Titel: Antw:X_DbLog_splitFn
Beitrag von: betateilchen am 13 Januar 2015, 16:21:17
Zitat von: Sailor am 13 Januar 2015, 14:13:07
Meine Frage ist, wie komme ich da bloß ran?

Über den Devicenamen.
Titel: Antw:X_DbLog_splitFn
Beitrag von: Tobias am 14 Januar 2015, 08:20:53
Weitere Infos:
http://www.fhemwiki.de/wiki/DevelopmentModuleIntro#X_DbLog_splitFn
Titel: Antw:X_DbLog_splitFn
Beitrag von: Sailor am 14 Januar 2015, 09:14:33
Hallo Tobias

das WIKI kannte ich schon und dort geht ja eindeutig hervor, dass das hash nicht übergeben wird.

ZitatX_DbLog_splitFn Mit der DbLog_SplitFn kann der Modulautor selbst festlegen, wie die Events des Moduls in die Bestandteile Reading/Value/Unit zerlegt werden um ein korrektes Logging per DbLog zu gewährleisten.
Eingangsparameter: Das generierte Event
Rückgabewerte: Array: Reading/Value/Unit

Es wird nur das event übergeben, aber nicht das hash des moduls aus dem es stammt

Gruß
    Sailor

Titel: Antw:X_DbLog_splitFn
Beitrag von: justme1968 am 14 Januar 2015, 09:15:58
der hash steckt in $defs{$name} und den Namen bekommst du aus dem event.

gruß
  andre
Titel: Antw:X_DbLog_splitFn
Beitrag von: Sailor am 14 Januar 2015, 09:16:58
Zitat von: betateilchen am 13 Januar 2015, 16:21:17
Über den Devicenamen.

Och menno betateilchen

immer du mit deinen Superkurzantworten!  8)

Kannst Du mir einen etwas gezielteren Tipp geben.

Wir können auch Verbal-Topfschlagen spielen: "Wärmer, ja Wärmer, heiß..."  ;D

Gruß
    Sailor
Titel: Antw:X_DbLog_splitFn
Beitrag von: Sailor am 14 Januar 2015, 09:18:11
Zitat von: justme1968 am 14 Januar 2015, 09:15:58
der hash steckt in $defs{$name} und den Namen bekommst du aus dem event.

gruß
  andre

Hallo Andre

Danke, ich probiers mal aus und werde berichten.  ;)

Gruß
    Sailor

Nachtrag: Wenn ich das richtig verstanden habe muss ich nur

my $myDevice="mykm200"; # Diesen Wert vorher aus dem event extrahieren.
$hash=$defs{$myDevice};


eingeben und schon habe ich den hash.

Ich gehe mal davon aus, das die Variable "$defs" als globale fhem variable über alle module hinweg verankert ist.
(Alles andere würde irgendwie auch keinen Sinn ergeben...)

Wie gesagt, ich werde berichten.
Titel: Antw:X_DbLog_splitFn
Beitrag von: Tobias am 14 Januar 2015, 12:39:59
Ich sehe das Problem nicht.  Du musst doch nur die Beispielfunktion in dein Modul übernehmen und die Funktion deinem Modul bekannt machen....

Gesendet von meinem ALCATEL ONE TOUCH 997D mit Tapatalk

Titel: Antw:X_DbLog_splitFn
Beitrag von: Sailor am 14 Januar 2015, 13:46:26
Hallo Tobias


das Problem liegt darin, dass die unit e.g. "uA" oder "mbar" als string Werte innerhalb des $hash bzw. $defs{$myDevice} liegen.

Dort muss ich sie rausholen um sie als $unit in dem Befehl
return ($reading, $value, $unit);

zurückgeben zu können.

Die unit als string wird nicht mit dem $event übergeben.

Gruß
    Sailor

Titel: Antw:X_DbLog_splitFn
Beitrag von: Tobias am 15 Januar 2015, 09:34:42
die splitFn Funktion kann aber nur innerhalb eines Moduls eingebaut werden!

Der Aufruf erfolgt aus dem DBLog-Modul heraus: Das DBLog-Modul bekommt ein Device und Event. Fall das Modul dieses Devices diese Funktion bereitstellt wird diese benutzt, ansonsten wird bei bekannten Devices selbst versucht die Unit zu extrahieren. Andernfalls passiert nix
Titel: Antw:X_DbLog_splitFn
Beitrag von: Sailor am 15 Januar 2015, 10:16:23
Zitat von: Tobias am 15 Januar 2015, 09:34:42
die splitFn Funktion kann aber nur innerhalb eines Moduls eingebaut werden!

Der Aufruf erfolgt aus dem DBLog-Modul heraus: Das DBLog-Modul bekommt ein Device und Event. Fall das Modul dieses Devices diese Funktion bereitstellt wird diese benutzt, ansonsten wird bei bekannten Devices selbst versucht die Unit zu extrahieren. Andernfalls passiert nix

Hallo Tobias,


ich habe mir den Inhalt des event mal ausgeben lassen und festgestellt, das ausschließlich READING und dessen Wert übergeben werden. Nicht aber der Name des Device von dem es stammt.

Habe ich da was falsch gemacht?

Gruß
    Sailor
Titel: Antw:X_DbLog_splitFn
Beitrag von: Tobias am 16 Januar 2015, 14:28:17
Du musst ja auch das Device in deinem Modul behandeln.
ÜberNimm einfach das Dev-Beispiel aus dem Wiki als Start in dein Modul!