FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: Pf@nne am 15 Februar 2015, 16:29:48

Titel: Syntax Probleme.....
Beitrag von: Pf@nne am 15 Februar 2015, 16:29:48
Moin,

Ich habe jetzt schon eine ganze Menge am Laufen:


Läuft auch alles echt prima.

Nun geht es an das Aufbereiten der Messdaten.
Leider haben die Sensoren ab und an Messfehler zu verzeichnen, daher wäre es sinnvoll wenn die Fehlmessungen garnicht erst gelogt werden. Momentan wird das LOG so befüllt:
define FileLog_GPIO4_DS18B20_0000055d15a7 FileLog ./log/GPIO4_DS18B20_0000055d15a7-%Y.log GPIO4_DS18B20_0000055d15a7:.*(T:).*
attr FileLog_GPIO4_DS18B20_0000055d15a7 alias Output 1 T-LOG
attr FileLog_GPIO4_DS18B20_0000055d15a7 logtype temp4:Temp,text
attr FileLog_GPIO4_DS18B20_0000055d15a7 room Overheat


Mit GPIO4_DS18B20_0000055d15a7:.*(T:).* werden nur die "T:" Werte gelogt.
Wie kann ich hier noch weiter "Filtern", z.B. wenn der Messwert <-100 ist oder =85 ist.

Danke für eure Unterstützung

Gruß
Pf@nne
Titel: Antw:Syntax Probleme.....
Beitrag von: Pf@nne am 16 Februar 2015, 06:09:20
Moin,

hat denn keiner einen Tipp für mich?
Oder fehlen noch Informationen?

Mir ist noch nicht klar ob ich die Filterung der zu loggenden Daten gleich in der Definition des LogFiles erledigen kann oder ob ich über einen dummy gehen muss?

Schönen Start in die Woche...
Titel: Antw:Syntax Probleme.....
Beitrag von: Wuppi68 am 16 Februar 2015, 08:38:55
Hi,

Filtern geht nicht auf Werteebene ...
was Du aber machen könntest: mit awk dein Filelog parsen und alle entsprechenden Vorkommnisse löschen :-)
Einfacher wäre es aber umstellen auf DbLog und dann einmal am Tag oder per SQL Abfragediese EInträge aus dem Log rauswerfen
Titel: Antw:Syntax Probleme.....
Beitrag von: Pf@nne am 16 Februar 2015, 15:05:13
OK,

ich hätte jetzt gedacht, weil ich ja hier:
define FileLog_GPIO4_DS18B20_0000055d15a7 FileLog ./log/GPIO4_DS18B20_0000055d15a7-%Y.log GPIO4_DS18B20_0000055d15a7:.*(T:).*

mit dem :.*(T:).* ja schon gewissermaßen nur die T: logge, man könnte diesen Filter noch erweitern.
Vielleich ja auch mit einer {Pearl-Anweisung}.......

Wenn dies nicht geht würde ich versuchen die gefilterten Messwerte über einen dummy in ein neues LOG zu schreiben.

define MyValue dummy

define MyValue_DataRead at +*00:00:02 IF ([GPIO4_DS18B20_0000055d15a7:temperature] < 50 and [GPIO4_DS18B20_0000055d6980:temperature] > 0) (set MyValue [GPIO4_DS18B20_0000055d15a7:temperature])


um diesen dann zu loggen.....

Wie ist den die o.g. Syntax zu verstehen:
:.*(T:).*

Gruß
Pf@nne
Titel: Antw:Syntax Probleme.....
Beitrag von: flurin am 16 Februar 2015, 15:29:26
Du könntest auch eine kleine Sub in 99_Utils.pm schreiben und soviel filtern, umrechnen wie Du möchtest.

Beispielsweise verwende ich für einen ähnlichen Fall folgende Sub:

# arguments: room, target_point
# return: none
sub write_Log_File($$)
{
  my ($room,$target_point) = @_;
  my $sensor = $room_hash{$room}{sensor};
  my @target_set = split('=', $target_point);
 
  my @now = localtime;
  my $log_time = sprintf("%04d-%02d-%02d_%s:00",$now[5]+1900,$now[4]+1,$now[3],$target_set[0]);
  my $log_entry =  $log_time . " $sensor target: " . $target_set[1] . "\n";
  my $log_file = sprintf("./log/$sensor-%4d.log",$now[5]+1900);
   
  # todo open once for more entries
  if (open(FILE, ">> $log_file")) {
    print FILE $log_entry;
    close(FILE);
  } else {
    myLog("$log_file not found");
  }
}
Titel: Antw:Syntax Probleme.....
Beitrag von: Icinger am 16 Februar 2015, 17:41:37
Am einfachsten wäre es in diesem Fall wohl, mit einem UserReading zu arbeiten, oder?

attr GPIO4_DS18B20_0000055d15a7 userReadings Fehlerfrei {return undef if (ReadingsVal("GPIO4_DS18B20_0000055d15a7","temperature",0)==85);ReadingsVal("GPIO4_DS18B20_0000055d15a7","temperature",0)}

Und dann das Logfile halt auf dieses Reading triggern lassen.

lg, Ici
Titel: Antw:Syntax Probleme.....
Beitrag von: Pf@nne am 17 Februar 2015, 19:12:49
Hi,

das mit dem neuen Reading habe ich glaube ich verstanden, ist ja genau das was ich gesucht habe!
Vielen Dank für den Tip.

Leider schmeißt mir die Zeile einen Syntaxfehler raus:
ZitatERROR:
Unknown command ReadingsVal("GPIO4_DS18B20_0000055d15a7","temperature",0)}, try help.

Demnach ist das Lesen des zweiten Wertes fehlerbehaftet, das Lesen des ersten Wertes scheint aber zu klappen.
Glaubt mir, ich habe schon einiges probiert, hab aber keine Idee mehr.

Wo liegt hier der Syntaxfehler??

Zum Testen hab ich das hier probiert:
attr GPIO4_DS1820_000801ff97da userReadings Final {ReadingsVal("GPIO4_DS1820_000801ff97da","temperature",0)+3;;}


Damit wird das Reading "Final" auch richtig wiedergegeben.....

Titel: Antw:Syntax Probleme.....
Beitrag von: Pf@nne am 18 Februar 2015, 18:34:31
Das obere Problem ist noch garnicht gelöst, da tut sich schon das Nächste auf.....

Ich versuche verzweifelt einem Dummy Werte aus einem anderen Dummy zuzuweisen....

define WP_Status dummy
attr WP_Status room Waermepumpe
attr WP_Status setList on off
define WP_Status_LOG dummy
attr WP_Status_LOG room Waermepumpe
attr WP_Status_LOG setList on off

define Set_WP_Status_Update at +*00:00:05 set WP_Status_LOG ReadingsVal("WP_Status","State","")
attr Set_WP_Status_Update room Waermepumpe


Der State von WP_Status_LOG ändert sich aber nicht....
Was habe ich hier wieder für einen Syntaxfehler fabriziert?

Wo kann ich einen FHEM-Syntaxkurs belegen?
Titel: Antw:Syntax Probleme.....
Beitrag von: Icinger am 18 Februar 2015, 18:48:18
Zitatattr GPIO4_DS18B20_0000055d15a7 userReadings Fehlerfrei {return undef if (ReadingsVal("GPIO4_DS18B20_0000055d15a7","temperature",0)==85);;ReadingsVal("GPIO4_DS18B20_0000055d15a7","temperature",0)}
Sorry, da hatte ich nen Fehler drinnen, müssen 2 Strichpunkte sein....

ZitatReadingsVal("WP_Status","State","")
ist ein Perl-Befehl, gehört daher in geschwungene Klammern.
define Set_WP_Status_Update at +*00:00:05 {fhem "set WP_Status_LOG ".ReadingsVal("WP_Status","State","")}

Allerdings ist mir nicht ganz klar, wofür du einem Dummy den selben Wert eines anderen Dummys setzen willst.
Ausserdem würde ich statt dem "at" ein notify machen. Das triggert dann nur wirklich, wenn das erste Dummy gesetzt wird, und nicht alle 5 Sekunden, so wie dein jetziger Ansatz.
Ausserdem könntest du ja gleich beide Dummys in einem Rutsch setzen.

lg, Ici
Titel: Antw:Syntax Probleme.....
Beitrag von: Puschel74 am 18 Februar 2015, 19:11:23
Zitat Icinger:
define Set_WP_Status_Update at +*00:00:05 {fhem "set WP_Status_LOG ".ReadingsVal("WP_Status","State","")}
Zitat Ende:

Wenn es um einen Dummy geht der den Wert liefert sollte auch
define Set_WP_Status_Update at +*00:00:05 {fhem "set WP_Status_LOG ".Value("WP_Status")}
klappen.

ZitatAllerdings ist mir nicht ganz klar, wofür du einem Dummy den selben Wert eines anderen Dummys setzen willst.
Ja das machen hier einige ganz gerne - warum würde mich auch mal interessieren.
ZitatAusserdem könntest du ja gleich beide Dummys in einem Rutsch setzen.
Das wäre noch eleganter.
Titel: Antw:Syntax Probleme.....
Beitrag von: Pf@nne am 18 Februar 2015, 19:15:41
Werde ich nach dem Abendbrot gleich mal testen.....
Vielen Dank....

ZitatAllerdings ist mir nicht ganz klar, wofür du einem Dummy den selben Wert eines anderen Dummys setzen willst.
Ausserdem würde ich statt dem "at" ein notify machen. Das triggert dann nur wirklich, wenn das erste Dummy gesetzt wird, und nicht alle 5 Sekunden, so wie dein jetziger Ansatz.
Ausserdem könntest du ja gleich beide Dummys in einem Rutsch setzen.

Der zweite Dummy ist nur für ein on/off-LOG damit das fill immer mitläuft und nicht erst mit dem "off" vervollständigt wird.
Daher ist es notwendig den Dummy ständig zu aktualisieren.

Ich habe bereits den Tip mit "addLog" bekommen, scheue mich aber noch vor dem Ändern von *.pm-Files.
Ich komme ja noch nichtmal mit der einfachsten Syntax klar!
Titel: Antw:Syntax Probleme.....
Beitrag von: Puschel74 am 18 Februar 2015, 19:17:58
Zitat von: Pf@nne am 18 Februar 2015, 19:15:41
Ich habe bereits den Tip mit "addLog" bekommen, scheue mich aber noch vor dem Ändern von *.pm-Files.
Ich komme ja noch nichtmal mit der einfachsten Syntax klar!
Welche Files willst du ändern?
addLog wird einfach nur definiert und auf das/die Device(s) losgelassen - da werden keine Files geändert.

Edith: Aus dem Wiki -
ZitatDie Routine wird in die lokale Programmdatei integriert, z.B. 99_myUtils.pm,
Du meinst DAS?
Titel: Antw:Syntax Probleme.....
Beitrag von: Icinger am 18 Februar 2015, 19:24:05
ZitatDaher ist es notwendig den Dummy ständig zu aktualisieren.

Und sich deswegen das Log vollmüllen? Wenn schon, dann würd ich das im 5-Minutentakt oder so machen, aber doch nicht alle 5 Sekunden?!?

Welche Monitor-Auflösung hast du bitte, dass du da den Unterschied erkennst? gg

lg, Ici
Titel: Antw:Syntax Probleme.....
Beitrag von: Puschel74 am 18 Februar 2015, 19:25:24
ZitatWelche Monitor-Auflösung hast du bitte, dass du da den Unterschied erkennst? gg
Vermutlich 80" mit Abstand 1/2 Meter *duckundwech*
Titel: Antw:Syntax Probleme.....
Beitrag von: Pf@nne am 18 Februar 2015, 19:44:56
ZitatUnd sich deswegen das Log vollmüllen? Wenn schon, dann würd ich das im 5-Minutentakt oder so machen, aber doch nicht alle 5 Sekunden?!?
Ist doch nur zum Testen ob im LOG was ankommt!
Jedesmal 5Min warten um dann festzustellen, dass man es wieder nicht hinbekommen hat...... :-(
Da bin ich ja alt und grau bis ich mal was zum laufen habe.... :-)

Wie habt ihr die Syntax unter Kontrolle bekommen?
Learning by doing oder habt ihr was gelesen, wenn ja was....


Werde jetzt mal testen...
Titel: Antw:Syntax Probleme.....
Beitrag von: Puschel74 am 18 Februar 2015, 19:47:00
1. Perl-Handbuch und Forum, Forum, Forum, Wiki, Wiki.
2. try-and-error, Logmeldungen in notifys einbauen und schauen was ankommt, überlegen, siehe 1.  ;)

Edith: Ja ich gebs zu - in der Google-group eine Menge dummer Fragen gestellt (aber da gab es noch kein Einsteiger.pdf) und im Forum sucht es sich einfach besser.
Titel: Antw:Syntax Probleme.....
Beitrag von: Pf@nne am 18 Februar 2015, 19:51:26
2015-02-18_19:46:50 WP_Status_LOG .ReadingsVal("WP_Status","State","")
2015-02-18_19:46:55 WP_Status_LOG .ReadingsVal("WP_Status","State","")
2015-02-18_19:47:01 WP_Status_LOG .ReadingsVal("WP_Status","State","")


Der will noch nicht..... Die Perl-Klammern hatte ich auch schon probiert....
define Set_WP_Status_Update at +*00:00:05 {fhem "set WP_Status_LOG ".ReadingsVal("WP_Status","State","")}
Titel: Antw:Syntax Probleme.....
Beitrag von: Pf@nne am 18 Februar 2015, 19:55:58
define Set_WP_Status_Update at +*00:00:05 {fhem "set WP_Status_LOG ".Value("WP_Status")}

Der läuft!!
2015-02-18_19:53:09 WP_Status_LOG on
2015-02-18_19:53:14 WP_Status_LOG on
2015-02-18_19:53:19 WP_Status_LOG on


Bekommen wir noch raus, warum das Andere nicht läuft?


ZitatDie Routine wird in die lokale Programmdatei integriert, z.B. 99_myUtils.pm,

Du meinst DAS?

Ja, da wollte ich erst ran wenn ich ein wenig mehr verstehe, nicht noch eine Baustelle aufmachen... :-)
Titel: Antw:Syntax Probleme.....
Beitrag von: Puschel74 am 18 Februar 2015, 19:59:08
ZitatBekommen wir noch raus, warum das Andere nicht läuft?
Sicher aber ich mag heut nichtmehr - sorry.

ZitatJa, da wollte ich erst ran wenn ich ein wenig mehr verstehe, nicht noch eine Baustelle aufmachen... :-)
Hmmm, und das wäre genau EIN Code der tatsächlich nach Wiki 1:1 übernommen werden kann - und das anlegen der 99_myUtils.pm ist auch verlinkt und wird erklärt.
Aber nach diesem Satz von dir:
ZitatDas obere Problem ist noch garnicht gelöst, da tut sich schon das Nächste auf.....
kann ich dich verstehen  ;)
Titel: Antw:Syntax Probleme.....
Beitrag von: Pf@nne am 18 Februar 2015, 20:08:23
ZitatSicher aber ich mag heut nichtmehr - sorry.
Da kann ich dich verstehen.... ::)
Vielen Dank für die bisherige Mühe, die du dir gemacht hast!
Ich würde mich riesig freuen, wenn du weiter so tolle Starthilfe leisten könntest.... :)

Auch das läuft jetzt!
attr GPIO4_DS18B20_0000055d15a7 userReadings Fehlerfrei {return undef if (ReadingsVal("GPIO4_DS18B20_0000055d15a7","temperature",0)==85);;ReadingsVal("GPIO4_DS18B20_0000055d15a7","temperature",0)}
Die beiden Striche hätte ich doch nie im Leben gefunden!
Danke dafür!
Titel: Antw:Syntax Probleme.....
Beitrag von: Icinger am 18 Februar 2015, 20:24:59
Zitat1. Perl-Handbuch und Forum, Forum, Forum, Wiki, Wiki, Einsteiger-PDF usw.
2. try-and-error, Logmeldungen in notifys einbauen und schauen was ankommt, überlegen, siehe 1.

Könnte eigentlich auch von mir sein.

Gut, ich hab schon von vorher einiges an Programmiererfahrung (nur Hobbymäßig, nicht beruflich), aber Perl ist schon ein recht eigenes Kaliber :)
(In welcher anderen Sprache könntest du wohl zB komplett in Latein oder Klingonisch programmieren)

lg, Ici
Titel: Antw:Syntax Probleme.....
Beitrag von: Pf@nne am 18 Februar 2015, 21:10:26
Ja, ist schon ein wenig besonders....

Ich habe mit Pascal / TurboPascal angefangen und bin dann bei Delphi hängen geblieben.
Mach aber auch einiges mit VBA, B4A und Bascom.....und Python.


Ich möchte jetzt nur dauerhaft loggen, wenn der state "on" ist, wo muss hier das if hin:
{fhem if (.Value("WP_Status") == on) {"set WP_Status_LOG ".Value("WP_Status")}}
oder
{fhem "set WP_Status_LOG ".Value("WP_Status")}
oder
{if (.Value("WP_Status") == on) {fhem "set WP_Status_LOG ".Value("WP_Status")}}
laufen nicht....