[Gelöst] Wie bekommt man "pollende" Module dazu, readings in eine Logfile...

Begonnen von dadoc, 09 November 2015, 17:04:12

Vorheriges Thema - Nächstes Thema

dadoc

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
Standort 1: FS20 mit CUL und FHEM auf Raspi. HM-Komponenten (Heizung, Rollladen, Schalter). HM IP über Raspimatic (testweise)
Standort 2: Homematic (Wired) über CCU2 und PocketHome HD
3 x Raspi3 mit piCorePlayer/Kodi für Multiroom Audio (+ Tablets/iPeng/iPods

herrmannj

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

dadoc

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
Standort 1: FS20 mit CUL und FHEM auf Raspi. HM-Komponenten (Heizung, Rollladen, Schalter). HM IP über Raspimatic (testweise)
Standort 2: Homematic (Wired) über CCU2 und PocketHome HD
3 x Raspi3 mit piCorePlayer/Kodi für Multiroom Audio (+ Tablets/iPeng/iPods

Icinger

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
Verwende deine Zeit nicht mit Erklärungen. Die Menschen hören (lesen) nur, was sie hören (lesen) wollen. (c) Paulo Coelho

dadoc

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
Standort 1: FS20 mit CUL und FHEM auf Raspi. HM-Komponenten (Heizung, Rollladen, Schalter). HM IP über Raspimatic (testweise)
Standort 2: Homematic (Wired) über CCU2 und PocketHome HD
3 x Raspi3 mit piCorePlayer/Kodi für Multiroom Audio (+ Tablets/iPeng/iPods

dadoc

dottrigger setzen habe ich mir nun zusammengereimt - das wäre wohl einfach
readingsEndUpdate($hash, 1);
Fehler bleiben jedoch dieselben.
Standort 1: FS20 mit CUL und FHEM auf Raspi. HM-Komponenten (Heizung, Rollladen, Schalter). HM IP über Raspimatic (testweise)
Standort 2: Homematic (Wired) über CCU2 und PocketHome HD
3 x Raspi3 mit piCorePlayer/Kodi für Multiroom Audio (+ Tablets/iPeng/iPods

Icinger

readingsBulkUpdate($hash,@POOLnames[$i],"$wert @POOLunits[$i]");
oder
readingsBulkUpdate($hash,@POOLnames[$i],$wert . " " . @POOLunits[$i]);
Verwende deine Zeit nicht mit Erklärungen. Die Menschen hören (lesen) nur, was sie hören (lesen) wollen. (c) Paulo Coelho

dadoc

Vielen Dank Stefan - jetzt klappt's. You made my day!
Grüße
Martin
Standort 1: FS20 mit CUL und FHEM auf Raspi. HM-Komponenten (Heizung, Rollladen, Schalter). HM IP über Raspimatic (testweise)
Standort 2: Homematic (Wired) über CCU2 und PocketHome HD
3 x Raspi3 mit piCorePlayer/Kodi für Multiroom Audio (+ Tablets/iPeng/iPods