Hauptmenü

Syntax Probleme.....

Begonnen von Pf@nne, 15 Februar 2015, 16:29:48

Vorheriges Thema - Nächstes Thema

Pf@nne

Moin,

Ich habe jetzt schon eine ganze Menge am Laufen:


  • 2 x Raspberry PI über FHEM2FHEM verbunden
  • 20 x 1-Wire DS18B20 Temperatursensoren
  • 6 x I2C MCP23017 Portexpander

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
FHEM auf: DS415+ (Master), Raspberry Pi 2

Pf@nne

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...
FHEM auf: DS415+ (Master), Raspberry Pi 2

Wuppi68

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
FHEM unter Proxmox als VM

Pf@nne

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
FHEM auf: DS415+ (Master), Raspberry Pi 2

flurin

#4
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");
  }
}

Icinger

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

Pf@nne

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.....

FHEM auf: DS415+ (Master), Raspberry Pi 2

Pf@nne

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?
FHEM auf: DS415+ (Master), Raspberry Pi 2

Icinger

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

Puschel74

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.
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.

Pf@nne

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!
FHEM auf: DS415+ (Master), Raspberry Pi 2

Puschel74

#11
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?
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.

Icinger

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

Puschel74

ZitatWelche Monitor-Auflösung hast du bitte, dass du da den Unterschied erkennst? gg
Vermutlich 80" mit Abstand 1/2 Meter *duckundwech*
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.

Pf@nne

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...
FHEM auf: DS415+ (Master), Raspberry Pi 2