X_DbLog_splitFn

Begonnen von Sailor, 10 November 2014, 15:46:30

Vorheriges Thema - Nächstes Thema

Sailor

Hallo zusammen

im Wiki 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
******************************
Man wird immer besser...

betateilchen

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.

-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

Sailor

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!
******************************
Man wird immer besser...

betateilchen

gut, dass es dir selbst aufgefallen ist :)
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

Sailor

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
******************************
Man wird immer besser...

justme1968

#5
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
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

Tobias

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...
Maintainer: Text2Speech, TrashCal, MediaList

Meine Projekte: https://github.com/tobiasfaust
* PumpControl v2: allround Bewässerungssteuerung mit ESP und FHEM
* Ein Modbus RS485 zu MQTT Gateway für SolarWechselrichter

justme1968

wäre das nicht FileRead und FileWrite besser? die arbeiten transparent mit dem filesystem oder mit configdb wenn vorhanden.
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

Sailor

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
******************************
Man wird immer besser...

betateilchen

Zitat von: Sailor am 13 Januar 2015, 14:13:07
Meine Frage ist, wie komme ich da bloß ran?

Über den Devicenamen.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

Tobias

Maintainer: Text2Speech, TrashCal, MediaList

Meine Projekte: https://github.com/tobiasfaust
* PumpControl v2: allround Bewässerungssteuerung mit ESP und FHEM
* Ein Modbus RS485 zu MQTT Gateway für SolarWechselrichter

Sailor

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

******************************
Man wird immer besser...

justme1968

der hash steckt in $defs{$name} und den Namen bekommst du aus dem event.

gruß
  andre
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

Sailor

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
******************************
Man wird immer besser...

Sailor

#14
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.
******************************
Man wird immer besser...