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
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
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
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
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
dottrigger setzen habe ich mir nun zusammengereimt - das wäre wohl einfach
readingsEndUpdate($hash, 1);
Fehler bleiben jedoch dieselben.
readingsBulkUpdate($hash,@POOLnames[$i],"$wert @POOLunits[$i]");
oder
readingsBulkUpdate($hash,@POOLnames[$i],$wert . " " . @POOLunits[$i]);
Vielen Dank Stefan - jetzt klappt's. You made my day!
Grüße
Martin