FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: dadoc am 09 November 2015, 17:04:12

Titel: [Gelöst] Wie bekommt man "pollende" Module dazu, readings in eine Logfile...
Beitrag von: dadoc am 09 November 2015, 17:04:12
Hallo,
darauf habe ich keine Antwort gefunden - wie bekomme ich ein Modul, dass Daten von einem Gerät pollt, dazu, die readings unter fhem in eine Logfile zu schreiben (so dass man z.B. einfach Plots daraus machen könnte)?
Die Funktion "log3" schreibt ja nur ins allgemeine fhem.log.
Wenn ich das richtig verstehe, werden prinzipiell nur events in die Logfiles geschrieben. Das pollende Modul erzeugt jedoch keine solchen.
Versucht habe ich es gerade mal mit 99_myPoolcontroller.pm (Modul für den Poolcontroller, http://forum.fhem.de/index.php/topic,37599.msg299213.html#msg299213):

[...]   
### fertigen Messwert berechnen
    $wert = @POOLoffset[$i] + (@POOLgain[$i] * @POOLvalue[$i]);

    ### Messwert auf 2 Nachkommastellen runden
    $wert = sprintf("%.2f", $wert);

    ###Ausgeben
    $hash->{READINGS}{@POOLnames[$i]}{VAL} = "$wert @POOLunits[$i]";
    $hash->{READINGS}{@POOLnames[$i]}{TIME} = TimeNow();
  }
  $hash->{STATE} = "OK";
}

Die Readings des von mir angelegten Device "Pool" sind:
Internals:
   DEF        192.168.0.xxx:xxxx user pass 300
   NAME       Pool
   NR         698
   STATE      OK
   TYPE       myPoolcontroller
   interval   300
   name       Pool
   pass       pass
   url        192.168.0.xxx:xxxx
   user       user
   Readings:
     2015-11-09 16:54:27   Brr             0.00 mV
     2015-11-09 16:33:27   CL              Rest 28.20 %
     2015-11-09 16:54:27   CL Rest         28.20 %
     2015-11-09 16:33:27   CPU             Temp 46.40 C
     2015-11-09 16:54:27   CPU Temp        45.95 C
     2015-11-09 16:54:27   Grr             213.44 mV
     2015-11-09 16:54:27   Hilfsrelais     0.00 --
     2015-11-09 16:54:27   Kesseldruck     -398.08 mBar
     2015-11-09 16:54:27   Polarit�t       0.00 --
     2015-11-09 16:54:27   Pool            19.50 C
     2015-11-09 16:54:27   Pumpe           0.00 --
     2015-11-09 16:54:27   Redox           708.44 mV
     2015-11-09 16:54:27   TASTER1         0.00 --
     2015-11-09 16:54:27   TASTER2         0.00 --
     2015-11-09 16:54:27   TASTER3         0.00 --
     2015-11-09 16:54:27   TASTER4         0.00 --
     2015-11-09 16:54:27   Wassersensor    -6.57 V
     2015-11-09 16:54:27   Zelle           0.00 --
     2015-11-09 16:54:27   n.a.            0.00 --
     2015-11-09 16:54:27   pH              7.20 pH
     2015-11-09 16:33:27   pH+             Rest 100.00 %
     2015-11-09 16:54:27   pH+ Rest        100.00 %
     2015-11-09 16:33:27   pH-             Rest 19.30 %
     2015-11-09 16:54:27   pH- Rest        19.30 %
     2015-11-09 16:54:27   ph-             0.00 --

Müsste ich da etwas am Modul selbst ändern, damit Events bzw. Logeinträge erzeugt werden oder an der Definition des Device?
Grüße
Martin
Titel: Antw:Wie bekommt man "pollende" Module dazu, readings in eine Logfile zu schreiben?
Beitrag von: herrmannj am 09 November 2015, 17:12:36
Hi

es geht nicht um "pollend" oder nicht. Das Modul ist so programmiert das es keine events erzeugt. Der modulautor muss Bulkupdate verwenden. Bitte an den Autor wenden.

Wenn Du das selber anpassen möchtest findest Du dort http://www.fhemwiki.de/wiki/DevelopmentModuleIntro unter "readings" den Weg.

vg
joerg
Titel: Antw:Wie bekommt man "pollende" Module dazu, readings in eine Logfile zu schreiben?
Beitrag von: dadoc am 09 November 2015, 17:43:22
Vielen Dank Jörg,
da steht zwar nur, dass man damit auch readings in events überführen kann, aber nicht wie:
ZitatZum Setzen von Readings sollen bei Gruppen von Readings der Funktionsblock readingsBeginUpdate, readingsBulkUpdate (mehrfach wiederholt), readingsEndUpdate bei einzelnen Updates die Funktion readingsSingleUpdate aufgerufen werden. Dabei kann man auch angeben, ob dabei ein Event ausgelöst werden soll oder nicht.
Ist es dotrigger, wie es in http://www.fhemwiki.de/wiki/DevelopmentIntroduction steht?
readingsEndUpdate($hash, $dotrigger);
Grüße
Martin
Titel: Antw:Wie bekommt man "pollende" Module dazu, readings in eine Logfile zu schreiben?
Beitrag von: Icinger am 09 November 2015, 18:03:05
Statt

    $hash->{READINGS}{@POOLnames[$i]}{VAL} = "$wert @POOLunits[$i]";
    $hash->{READINGS}{@POOLnames[$i]}{TIME} = TimeNow();


brauchst du dann den Ablauf:

readingsBeginUpdate($hash);
readingsBulkUpdate($hash,@POOLnames[$i],$wert @POOLunits[$i]);
readingsEndUpdate($hash, $dotrigger);


Wenn du dotrigger auf "1" setzt, werden Events erzeugt.
Auf diese Events kannst du dann zB mittels FileLog, notify etc reagieren.

lg, Stefan
Titel: Antw:Wie bekommt man "pollende" Module dazu, readings in eine Logfile zu schreiben?
Beitrag von: dadoc am 09 November 2015, 18:35:49
Vielen Dank Stefan,
klappt noch nicht ganz. Log sagt:
[Mon Nov  9 18:21:42 2015] fhem.pl: Array found where operator expected at ./FHEM/99_myPoolcontroller.pm line 124, at end of line
[Mon Nov  9 18:21:42 2015] fhem.pl: (Missing operator before ?)
2015.11.09 18:21:42 1: reload: Error:Modul 99_myPoolcontroller deactivated:
syntax error at ./FHEM/99_myPoolcontroller.pm line 124, near "$wert @POOLunits"

2015.11.09 18:21:42 0: syntax error at ./FHEM/99_myPoolcontroller.pm line 124, near "$wert @POOLunits"

2015.11.09 18:21:42 1: Including ./log/fhem.save
2015.11.09 18:21:45 1: configfile: Cannot load module myPoolcontroller


So habe ich es jetzt drin:    ###Ausgeben
#    $hash->{READINGS}{@POOLnames[$i]}{VAL} = "$wert @POOLunits[$i]";
#    $hash->{READINGS}{@POOLnames[$i]}{TIME} = TimeNow();
readingsBeginUpdate($hash);
readingsBulkUpdate($hash,@POOLnames[$i],$wert @POOLunits[$i]);
readingsEndUpdate($hash, $dotrigger);
}
  $hash->{STATE} = "OK";
 
}

1;

ZitatWenn du dotrigger auf "1" setzt, werden Events erzeugt.
Blöde Frage: Ich konnte nichts dazu finden, wie bzw. wo ich dotrigger auf 1 setzen kann? Wahrscheinlich kaum im Modul selbst mit
  my $dotrigger = 1;
Zumindest ergab der Versuch dieselben Fehler wie ohne.
Grüße
Martin
Titel: Antw:Wie bekommt man "pollende" Module dazu, readings in eine Logfile zu schreiben?
Beitrag von: dadoc am 09 November 2015, 18:53:42
dottrigger setzen habe ich mir nun zusammengereimt - das wäre wohl einfach
readingsEndUpdate($hash, 1);
Fehler bleiben jedoch dieselben.
Titel: Antw:Wie bekommt man "pollende" Module dazu, readings in eine Logfile zu schreiben?
Beitrag von: Icinger am 09 November 2015, 19:06:15
readingsBulkUpdate($hash,@POOLnames[$i],"$wert @POOLunits[$i]");
oder
readingsBulkUpdate($hash,@POOLnames[$i],$wert . " " . @POOLunits[$i]);
Titel: Antw:Wie bekommt man "pollende" Module dazu, readings in eine Logfile zu schreiben?
Beitrag von: dadoc am 09 November 2015, 19:51:24
Vielen Dank Stefan - jetzt klappt's. You made my day!
Grüße
Martin