FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: Garbsen am 16 August 2016, 23:39:02

Titel: Datum vergleichen
Beitrag von: Garbsen am 16 August 2016, 23:39:02
Moin, ich habe zwei Dummies, die mit je einem Datum gefüllt werden. Jeweils YYYY-MM-DD
Ich würde diese Datum gerne mit einander anderem Vergleichen. Also z.B (Heizkosten PWc1 ähnliches, mit den Eingben, die jemand anderes z.B. Aus dem Meer gezogen hat.

Beste Grüße
Titel: Antw:Datum vergleichen
Beitrag von: igami am 17 August 2016, 06:05:59
Ein bisschen dürftig die Beschreibung. Passiert der Vergleich in einer sub, in einem notify, in einem at, in einem userreading, in einem DOIF? Soll das Datum identisch, größer oder kleiner sein?
https://wiki.selfhtml.org/wiki/Perl/Operatoren#Vergleichsoperatoren
Titel: Antw:Datum vergleichen
Beitrag von: Garbsen am 17 August 2016, 08:16:17
Zitat von: igami am 17 August 2016, 06:05:59
Ein bisschen dürftig die Beschreibung. Passiert der Vergleich in einer sub, in einem notify, in einem at, in einem userreading, in einem DOIF? Soll das Datum identisch, größer oder kleiner sein?
https://wiki.selfhtml.org/wiki/Perl/Operatoren#Vergleichsoperatoren
Genau!  ;)
Zunächst: sorry dafür, dass ich vor dem Absenden nicht noch einmal gelesen hatte und die dämlichen Auto-Korrekturfehler nicht beseitigt habe. War ja streckenweise kaum lesbar. Die späte Uhrzeit erklärt aber entschuldigt natürlich nicht.
Zum Thema: die Beschreibung war durchaus absichtlich vage, da es ja genau die Frage war, wie (Sub/at/notify oder was auch immer) löst man eine solche Vergleichsaufgabe am geschicktesten.
Die Tabelle mit den Vergelichsoperatoren hatte Tante Google schon gefunden, trotzdem Danke für den Link, konntest Du ja nicht wissen und gerade solche Quellenangaben sind oft am hilfreichsten und nicht immer einfach zu finden. Denn auch bei Tante Google ist nicht das Finden schwierig, sondern das richtige Suchen und manchmal weiß man einfach nicht, nach ws genau man suchen muss.
Ich habe jetzt zwar schon eine durchaus komplexe cfg zusammen gestrickt, halte mich aber immer noch für einen Anfänger, denn das meiste habe ich durch copy Paste und durch Ausprobieren geschafft. Wirklich verstanden habe ich die ganze Operatoren etc noch nicht. Leider gibt es im www viele viele Hinweise und Beispiele, aber selten gute Erklärungen, um die Zusammenhänge etc zu verstehen.
Und ich habe eines schon gelernt, ob machen klein erscheinende Unterschiede tatsächlich viel aus. Seltsamerweise gibt es dann wieder andere Situationen, bei denen der gleiche Unterschied nichts ausmacht.
Macht es für einen Anfänger eben nicht leicht aus Beispielen zu lernen.

Ich habe schon einmal etwas rumprobiert, es klappt aber nicht, mein Versuch:

Ich habe einen Dummy (Test4) mit dem aktuellen Datum in dem Format gefüllt, dass ich im Vergleichsdummy habe. (z.B. 2016-10-03)
Der Vergleichsdummy (Urlaubsanfang) wird durch das DateTimePicker Widget gefüllt.  https://forum.fhem.de/index.php/topic,35736.0.html

define Test4 dummy
define datumsetzen DOIF ([+:01]) ({fhem 'set Test4 '.strftime('%Y-%m-%d', localtime)})


In einem DOIF wollte ich dann den Wert der Dummies miteinander vergleichen.

define Test3 DOIF ((Val[Test4]) > (Val[Urlaubsanfang])) (set test5 on)
DOELSE (set test5 off)

Fehlermeldung:
perl error in condition: (ValInternalDoIf($hash,'Test4','STATE','','',AttrVal($hash->{NAME},'notexist',undef))) > (ValInternalDoIf($hash,'Urlaubsanfang','STATE','','',AttrVal($hash->{NAME},'notexist',undef))): Undefined subroutine &main::ValInternalDoIf called at (eval 14224) line 1.

Sagt mir leider nicht viel





Daher ja auch hier meine Frage.
Titel: Antw:Datum vergleichen
Beitrag von: Hans Franz am 17 August 2016, 08:46:09
Du kannst das Datum erst in Sekunden (seit 1970?) umrechnen mit time_str2num(). Siehe Perl Specials in der CommandRef. Keine Ahnung, wie das mit DOIF geht.

Gruß
Hans
Titel: Antw:Datum vergleichen
Beitrag von: igami am 17 August 2016, 09:18:52
Bitte Code-Tags verwenden (das # Zeichen über dem Eingabefeld)
> ist ein numerischer Vergleich, YYYY-MM-DD ist jedoch keine Zahl, hier muss gt genutzt werden.
Was macht Val[Test4] ? Diesen Ausdruck kenne ich so nicht. Bei DOIF gibt [<name>] den STATE zurück.
Es sollte also genügen

define Test3 DOIF
([Test4] gt [Urlaubsanfang])(
  set test5 on
)
DOELSE (
  set test5 off
)
Titel: Antw:Datum vergleichen
Beitrag von: Garbsen am 17 August 2016, 10:15:04
Zitat von: igami am 17 August 2016, 09:18:52
Bitte Code-Tags verwenden (das # Zeichen über dem Eingabefeld)
> ist ein numerischer Vergleich, YYYY-MM-DD ist jedoch keine Zahl, hier muss gt genutzt werden.
Was macht Val[Test4] ? Diesen Ausdruck kenne ich so nicht. Bei DOIF gibt [<name>] den STATE zurück.
Es sollte also genügen

define Test3 DOIF
([Test4] gt [Urlaubsanfang])(
  set test5 on
)
DOELSE (
  set test5 off
)


Danke, probiere ich aus, sieht zumindest viel einfacher aus, als mein untauglicher Versuch.

Und mit # für die Code Ausschnitte habe ich sowieso schon definitiv etwas gelernt. Hatte mich schon lange gefragt, wie man da so formatiert. Auch dafür danke
Titel: (Gelöst):Datum vergleichen
Beitrag von: Garbsen am 17 August 2016, 10:29:46
Nochmals Danke für die Hilfe hier.
Die Funktion gt zum Vergleich von Daten (Und wohl auch Uhrzeit) war genau das, was ich gesucht und nicht gefunden habe, weil ich nicht wusste wonach ich suchen muss. Wie schon gesagt, für Anfänger ist die Dokumentation nicht immer selbsterklärend. Aber FHEM ist wohl einfach viel zu umfangreich, um alles auch für Anfänger verständlich zu dokumentieren. Schließlich ist das alles kein professionelles, bezahltes Projekt, sondern Fleißarbeit von vielen.
Als Anfänger und damit jemand, der von der Entwicklungsarbeit anderer profitiert, möchte ich die Gelegenheit für ein Danke an alle nutzen!
Ich habe das jetzt so wie oben angeregt umgesetzt, das funktioniert und darauf kann ich jetzt den nächsten Schritt angegeben.

Für andere Anfänger als Hilfe habe ich den gt Befehl (?) nochmals gegoogelt und folgendes gefunden (falls nicht korrekt, bitte von erfahrenen Hasen korrigieren):

Man kann hiermit Uhrzeiten und Datumsangaben vergleichen, und zwar mit:
lt = kleiner als
gt = größer als
le = kleiner/gleich als
ge = größer/gleich als

Genial einfach!

Ich habe damit zwei Daten (Die in den Dummies Test4 und Urlaubsanfang im State stehen) im Format 2016-10-03 also Y-m-d verglichen, ich vermute es klappt mit allen anderen Formateinstellungen ebenso, solange beide gleich formatiert sind.


Titel: Antw:Datum vergleichen
Beitrag von: CoolTux am 17 August 2016, 11:45:15
Da Du es so schön aufgeschrieben hast eine kleine Ergänzung.

Man kann mit mathematischen Operatoren nur Zahlen vergleichen. Also <= , >= , ==, < , >
Was Du mit lt, gt, usw. machst ist ein sogenannter Stringvergleich. FHEM ist in der Programmiersprache Perl geschrieben und mit eben genau dieser Sprache werden auch alle Arten von Logiken erstellt.
Deine Datumsangabe in Deinem Dummy ist ein String, daher nimmst Du die Operatoren für einen Stringvergleich.



Grüße
Titel: Antw:Datum vergleichen
Beitrag von: Garbsen am 17 August 2016, 12:59:19
Zitat von: CoolTux am 17 August 2016, 11:45:15
Da Du es so schön aufgeschrieben hast eine kleine Ergänzung.

Man kann mit mathematischen Operatoren nur Zahlen vergleichen. Also <= , >= , ==, < , >
Was Du mit lt, gt, usw. machst ist ein sogenannter Stringvergleich. FHEM ist in der Programmiersprache Perl geschrieben und mit eben genau dieser Sprache werden auch alle Arten von Logiken erstellt.
Deine Datumsangabe in Deinem Dummy ist ein String, daher nimmst Du die Operatoren für einen Stringvergleich.

Danke für die Ergänzung, solche Infos sind zum Lernen wirklich wichtig. Zumindest wenn man, so wie vermutlich viele hier, learning by doing macht.
Eine kleine Frage noch: ist es - wie von mir vermutet - wichtig, dass beide Strings gleich formatiert sind oder würde Perl auch mit einem Vergleich 2016-12-03 lg 4.12.16 klarkommen?



Grüße
Titel: Antw:Datum vergleichen
Beitrag von: CoolTux am 17 August 2016, 14:43:08
Wenn der String Deiner Freundin rot und der Deiner Frau blau wären, wären sie dann gleich  ;)


Grüße
Titel: Antw:Datum vergleichen
Beitrag von: Garbsen am 17 August 2016, 14:56:22
Zitat von: CoolTux am 17 August 2016, 14:43:08
Wenn der String Deiner Freundin rot und der Deiner Frau blau wären, wären sie dann gleich  ;)


Grüße
Ne, aber wenn sie beide blau sind, dann sind sie gleich, ob ich sie von vorne oder hinten angucke oder einer auf links ist  ;)
Aber hätte mich auch gewundert, wenn das ohne umformatierung geklappt hätte.