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
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.
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!
gut, dass es dir selbst aufgefallen ist :)
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
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
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...
wäre das nicht FileRead und FileWrite besser? die arbeiten transparent mit dem filesystem oder mit configdb wenn vorhanden.
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
Zitat von: Sailor am 13 Januar 2015, 14:13:07
Meine Frage ist, wie komme ich da bloß ran?
Über den Devicenamen.
Weitere Infos:
http://www.fhemwiki.de/wiki/DevelopmentModuleIntro#X_DbLog_splitFn
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
der hash steckt in $defs{$name} und den Namen bekommst du aus dem event.
gruß
andre
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
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.
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
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
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
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
Du musst ja auch das Device in deinem Modul behandeln.
ÜberNimm einfach das Dev-Beispiel aus dem Wiki als Start in dein Modul!