FileLog: Eintrag um bestimmte Uhrzeit

Begonnen von user1, 12 August 2015, 21:41:28

Vorheriges Thema - Nächstes Thema

user1

Hi,

Ich habe ein wohl einfaches Problem, finde aber keine Lösung. Ein Grund ist wohl, dass ich nicht verstehe, wie genau der interne Mechanismus ist, über welchen Events verarbeitet werden.

Ich habe ein Log-File, welches Werte eines Dummy speichert. Das Dummy triggert LogFile-Einträge, wenn Werte sich ändern. Das funktioniert soweit auch wunderbar:


define AlleT dummy

define FileLog_AlleT FileLog ./log/AlleT-%Y-%m-%d.log AlleT
attr FileLog_AlleT logtype text
attr AlleT event-on-change-reading .*
attr AlleT event-min-interval 60


Nur möchte ich zusätzlich um eine bestimmte Uhrzeit einen Logeintrag auslösen, und zwar unabhängig davon, ob sich die Werte geändert haben.

Erster Gedanke war mit "at" eine Aktion auszulösen, bloss wie triggere ich damit ein Log-Ereignis? Ich möchte den Wert ja nicht ändern, der steht schon im Dummy drin... Wahrscheinlich hat das Dummy entsprechende Funktionen, um solche Events auszulösen (wie mache ich das aber?) oder das FileLog-Device lässt sich direkt ansprechen. Bloss: Wie?

Danke für Hinweise!

maxritti

Ein at mit deiner Zeit definieren und dann addLog aufrufen wäre eine Alternative:

http://www.fhemwiki.de/wiki/Plot-Abriss_vermeiden

user1

Leider bringe ich den zusätzlichen Logeintrag nicht wie vorgeschlagen (http://www.fhemwiki.de/wiki/Plot-Abriss_vermeiden) zum Laufen.

Am Ende habe ich versucht, den Logeintrag von der Telnet-Konsole aus mit { addLog("Dach","temperature");; } anzustossen, was mir aber nur folgende Fehlermeldung einbringt:

Undefined subroutine &main::addLog called at (eval 61) line 1.

Dann dachte ich, ok, vielleicht ist addLog beim Aufruf via Telnet nicht aus dem entsprechenden Perl-Modul importiert? Neugierig geworden, habe ich deshalb nach "addLog" ge-grep-ped  (grep -r -i addLog *), dabei aber  nur sub HourCounter_AddLog($$$) in 98_HourCounter.pm gefunden.

Was mache ich falsch? Ist meine Installation am Ende unvollständig?


marvin78

Na du hast den Wiki-Eintrag nicht gelesen. addLog ist eine Funktion (sub), die du erst noch in eine myUtils einfügen musst. Erst dann steht sie dir auch zur Verfügung. Bitte den von maxritti verlinkten Beitrag vollständig lesen.

user1

Jetzt laeuft alles, war irgendwie gerade mit Blindheit geschlagen.

Hanner72

Hallo,

Ich hab das alles probiert, jedoch ohne Erfolg weil ich mich mit der 99_myUtils.pm nicht auskenne.
Da ich schon Google befragt habe und zahlreiche Seiten gelesen habe, musste ich feststellen, dass ich
mich in dieser Programmiersprache (und auch andere) nicht auskenne.  :-\

Ich möchte gerne zu einem bestimmten Zeitpunkt einen Logeintrag machen.

Auszug aus meiner fhem.cfg

define addLog_WZ_Heiz notify addLog {addLog("WZ_Heiz_Weather","temperature");;addLog("WZ_Heiz_Climate","measured-temp");;addLog("WZ_Heiz_Climate","desired-temp");;}
attr addLog_WZ_Heiz room 020_WZ

define a_WZ_Heiz at *16:00 trigger addLog
attr a_WZ_Heiz room 020_WZ


und hier meine 99_myUtils.pm

package main;
use strict;
use warnings;
use POSIX;
sub
myUtils_Initialize($$)
{
  my ($hash) = @_;
}
## Ab hier den Code eintragen #######################

#### Log-abriss vermeiden
# called by
# define addLog notify addLog {addLog("ez_Aussensensor","state");addLog("ez_FHT","actuator");\
#               addLog("MunichWeather","humidity");addLog("MunichWeather","pressure");\
#               addLog("MunichWeather","temperature");addLog("MunichWeather","wind_chill");}
# define a_midnight1 at *23:59 trigger addLog
# define a_midnight2 at *00:01 trigger addLog
sub
addLog($$) {
  my ($logdevice, $reading) = @_; # device and reading to be used  <---  HIER WEISS ICH NICHT WAS REIN SOLL!!!
  my $logentry = ReadingsVal($logdevice,$reading,"addLog: invalid reading");
  if ($reading =~ m,state,i) {
    fhem "trigger $logdevice $logentry   << addLog";
  } else {
    fhem "trigger $logdevice $reading: $logentry   << addLog";
  }
}

## Ab hier nichts mehr eintragen ######################
1;


wobei ich nicht weiss was in die Zeile my ($logdevice, $reading) = @_; rein muss.

Kann mir bitte jemand helfen?

mfG
Hanner

kumue

Zitat von: Hanner72 am 07 Oktober 2016, 10:46:53

wobei ich nicht weiss was in die Zeile my ($logdevice, $reading) = @_; rein muss.

Da musst Du garnichts eintragen.

Wie hast Du die 99_myUtils.pm angelegt / editiert ?

In der GUI über "Edit files" ? Dann wird die Datei automatisch neu geladen nach dem Speichern.

Falls Du einen anderen Weg gegangen bist, muß die Datei neu geladen werden..

reload 99_myUtils.pm

Hanner72

Hallo,

Danke für die schnelle Antwort.

Das hab ich schon probiert. Da tut sich nichts und im Logfile steht eine Fehlermeldung von der 99_myUtils.
Welche genau kann ich im Moment nicht sagen, weil ich nicht zu Hause bin.

Jedenfalls sagt er in dieser Zeile
myUtils_Initialize ($$)
{     <-- IN DIESER ZEILE
  my ($hash) = @_;
}


Und in dieser

addLog ($$) {  <-- IN DIESER ZEILE
  my ($logdevice, $reading) = @_;



Gesendet von meinem SM-G900F mit Tapatalk


Puschel74

#8
Das Wiki sollte wohl hilfreich sein:
http://www.fhemwiki.de/wiki/Plot-Abriss_vermeiden

Einfach hier:
define a_WZ_Heiz at *16:00 trigger addLog
noch das Device und das Reading einfügen dann sollte es mit addLog auch klappen.
addLog sollte schon wissen von welchem Device welches Reading geloggt werden soll.

Edith: Da addLog wohl schon benutzt wird - wie das notify vermuten lässt und Hanner72 nicht geschrieben hat das das notify nicht klappt - benötigt es kein zusätzliches reload der 99_myUtils.pm
Einzig der Aufruf von addLog im at sollte so wie im Wiki beschrieben durchgeführt werden.

Edith1: Sorry erst jetzt gesehen:
Zitatmy ($logdevice, $reading) = @_; # device and reading to be used  <---  HIER WEISS ICH NICHT WAS REIN SOLL!!!
Dazu gehört noch die eine Zeile davor - also so:
addLog($$) {
  my ($logdevice, $reading) = @_;

In der ersten Zeile wird der sub bekannt gemacht das 2 Werte - durch das ($$) dargestellt - übergeben werden.
In der zweiten Zeile werden diese 2 übergebenen Werte al $logdevice und als $reading zugewiesen um sie im Code weiter verarbeiten zu können.
d.h. für dich:
In der sub brauchst du nichts zu ändern oder zusätzlich einzubauen - du musst die sub nur mit 2 Parameter aufrufen.
Als Beispiel aus deinem notify:
{addLog("WZ_Heiz_Weather","temperature")}
Hier wird addLog mit den beiden Parameter WZ_Heiz_Weather und temperature aufgerufen - ich hab den Aufruf auf dem notify angepasst für 1 Device.
Das genau so in dein at kopiert fügt für diese Device/Reading-Kombination um 16:00:00 Uhr einen weiteren Logeintrag hinzu.
Zotac BI323 als Server mit DBLog
CUNO für FHT80B, 3 HM-Lan per vCCU, RasPi mit CUL433 für Somfy-Rollo (F2F), RasPi mit I2C(LM75) (F2F), RasPi für Panstamp+Vegetronix +SONOS(F2F)
Ich beantworte keine Supportanfragen per PM! Bitte im Forum suchen oder einen Beitrag erstellen.

Hanner72

Hallo,

Danke euch vielmals für eure schnellen Antworten.

Ich habe erst heute testen können.

Nach einigen versuchen bin ich draufgekommen, dass ich in der fhem.cfg einen Fehler hatte.

define addLog_WZ_Heiz notify addLog {addLog("WZ_Heiz_Weather","temperature");;addLog("WZ_Heiz_Climate","measured-temp");;addLog("WZ_Heiz_Climate","desired-temp");;}
attr addLog_WZ_Heiz room 020_WZ

define a_WZ_Heiz at *16:00 trigger addLog_WZ <-- HIER WAR MEIN FEHLER !!!???  :-[
attr a_WZ_Heiz room 020_WZ


define addLog_WZ_Heiz notify addLog {addLog("WZ_Heiz_Weather","temperature");;addLog("WZ_Heiz_Climate","measured-temp");;addLog("WZ_Heiz_Climate","desired-temp");;}
attr addLog_WZ_Heiz room 020_WZ

define a_WZ_Heiz at *16:00 trigger addLog  <-- SO IST ES RICHTIG
attr a_WZ_Heiz room 020_WZ