Hallo. Ich möchte gern über meine Withings Waage unseren gotosleep und awake Modus steuern. Im Moment fehlt mir aber die Idee einer Umsetzung (und natürlich das Wissen).
Da die Waage sich nur jede Stunde aktualieren würde, habe ich schon das DOIF über das PRESENCE Modul erstellt
Internals:
CFGFN
DEF ([Waage] eq "present") (get withings_D228**** update, get withings_U1131***** update, get withings_U1132***** update, get withings_U1133***** update)
NAME di_Waage
NR 17059
NTFY_ORDER 50-di_Waage
STATE cmd_2
TYPE DOIF
Readings:
2016-12-30 09:44:15 Device Waage
2016-12-30 09:44:15 cmd 2
2016-12-30 09:44:15 cmd_event Waage
2016-12-30 09:44:15 cmd_nr 2
2016-12-30 09:44:15 e_Waage_STATE absent
2016-12-30 09:44:15 state cmd_2
2016-12-30 09:44:15 wait_timer no timer
Condition:
0 InternalDoIf($hash,'Waage','STATE') eq "present"
Devices:
0 Waage
all Waage
Do:
0:
0 get withings_D228**** update, get withings_U1131***** update, get withings_U1132***** update, get withings_U1133***** update
1:
Helper:
event absent,presence: absent
globalinit 1
last_timer 0
sleepdevice Waage
sleepsubtimer 0
sleeptimer -1
timerdev Waage
timerevent absent,presence: absent
triggerDev Waage
timerevents:
absent
presence: absent
timereventsState:
state: absent
presence: absent
triggerEvents:
absent
presence: absent
triggerEventsState:
state: absent
presence: absent
Internals:
0 Waage:STATE
all Waage:STATE
Itimer:
Readings:
Regexp:
0:
All:
State:
Trigger:
Attributes:
repeatcmd 240
Das klappt auch soweit. Es aktualisiert die einzelnen User.
Internals:
CFGFN
CHANGED
DEF 1131*****
INTERVAL 3600
IODev Withings
Key xxx
LAST_POLL 2016-12-30 15:22:19
NAME withings_U1131*****
NR 15065
NTFY_ORDER 50-withings_U1131*****
STATE 1.86 m
SUBTYPE USER
TYPE withings
User 1131*****
birthdate xx
shortName xx
status 0
userName xx
Readings:
2016-12-30 09:28:17 fatFreeMass xx.915
2016-12-30 09:28:17 fatMassWeight xx.342
2016-12-30 09:28:17 fatRatio xx.513
2016-12-30 09:28:17 heartPulse xx
2016-09-19 22:07:40 height 1.86
2016-12-30 01:08:13 weight xx.521
Attributes:
IODev Withings
alias xx
disable 1
room withings
stateFormat height m
Nun würde ich gern den Zeitstempel des Readings "weight" auslesen und wenn dieser mit Datum und Zeitspanne übereinstimmt, dass dann je nach dem der Status auf gotosleep oder awake gesetzt wird.
Habe schonmal was probiert aber nicht wirklich Hoffnung, dass das auch nur ansatzweise klappt :-\
([Waage] eq "present" and [15:30-03:00] and [withings_U1131*****:weight] eq "") (set rr_Mannl gotosleep) DOELSEIF ([Waage] eq "present" and [19:30-03:00] and [withings_U1132*****:weight] eq "") (set Frau gotosleep)
Kann mir jemand aus der Klemme helfen? Danke
Zeitstempel lesen geht mit "ReadingsTimestamp" siehe: http://fhem.de/commandref_DE.html#perl
Es scheint zu klappen. Habe es nun so eingefügt
([Waage] eq "present" and [15:30-03:00] and { ReadingsTimestamp("withings_U1131*****", "weight", 0)}) (set rr_Mann gotosleep)
Mal sehen wie es im Alltag wird. Ich verstehe die 0 noch nicht so ganz. Kann man dafür auch eine Zeit einsetzen sodass die reine Zeitangabe entfallen kann?
Edit: So richtig geht es irgendwie doch nicht, zumindest nicht ohne Fehler im Log
2016.12.31 00:37:06 1: PERL WARNING: Odd number of elements in anonymous hash at (eval 107709) line 1.
2016.12.31 00:37:06 3: eval: {PRESENCE_ProcessLocalScan('Waage|0|present')}
2016.12.31 00:37:06 2: ROOMMATE set rr_Mann gotosleep
Wenn das Reading für den Zeitstempel nicht existiert, dann wird der letzte Parameter zurück gegeben. Da sollte nicht 0 sondern eine Uhrzeit stehen, "hh:mm".
und die eckigen Klammern nicht vergessen [{ReadingsTimestamp...}]
Zitat von: Ellert am 31 Dezember 2016, 10:30:28
Wenn das Reading für den Zeitstempel nicht existiert, dann wird der letzte Parameter zurück gegeben. Da sollte nicht 0 sondern eine Uhrzeit stehen, "hh:mm".
und die eckigen Klammern nicht vergessen [{ReadingsTimestamp...}]
und nicht vergessen das Datum zuvor herauszufiltern, denn man darf bekanntlich nur Zeitangaben im Format HH:MM oder HH:MM:SS angaben.
Ok, jetzt komm ich doch nicht mehr mit. Habe jetzt verschiedene Varianten probiert aber immer ein Fehler erhalten. Wenn ich anstatt der 0 eine feste Uhrzeit eintrage, wird da die Bedingung überhaupt mal wahr?
([Waage] eq "present" and [15:30-04:30] and {ReadingsTimestamp("withings_U1131*****", "weight", "15:30")})
([Waage] eq "present" and [15:30-04:30] and [{ReadingsTimestamp("withings_U1131*****", "weight", "15:30")}])
([Waage] eq "present" and [{ReadingsTimestamp("withings_U1131*****", "weight", "15:30-04:30")}])
Ist von den Varianten überhaupt eine in der richtigen Richtung? Ich befürchte fast nicht...
Solche Sachen sind für Anfänger nicht trivial zu lösen und erfordern Perl-Kenntnisse. Mal schauen, ob du dir schon selbst zu helfen weißt. Schaue in der Perldokumentation nach der Perlfunktion: substr
::) oh, oh... ich hab zwar was gefunden aber wie und wo ich das einfügen muss, da muss ich passen.
$t="abcdefghijklmnopqrstuvwxyz0123456789";
$last_ten=substr($t,length($t)-10,10);
print $last_ten;
Deshalb wollte ich alles mit DOIF machen, weil ich dachte damit um Perl herumzukommen ;D
Ist das zumindest was, dass zu meinem Vorhaben passen würde?
Zitat von: Tabularasa am 02 Januar 2017, 01:13:12
::) oh, oh... ich hab zwar was gefunden aber wie und wo ich das einfügen muss, da muss ich passen.
$t="abcdefghijklmnopqrstuvwxyz0123456789";
$last_ten=substr($t,length($t)-10,10);
print $last_ten;
Deshalb wollte ich alles mit DOIF machen, weil ich dachte damit um Perl herumzukommen ;D
Ist das zumindest was, dass zu meinem Vorhaben passen würde?
Langfristig wirst du auch da um Perl nicht ganz herumkommen zumal die Bedingung von DOIF "erweitertes" Perl ist.
([Waage] eq "present" and [15:30-04:30] and [{substr(ReadingsTimestamp("withings_U1131*****", "weight", "xxxxxxxxxx15:30"),10)}])
Ok danke erstmal.
ZitatLangfristig wirst du auch da um Perl nicht ganz herumkommen zumal die Bedingung von DOIF "erweitertes" Perl ist
Das hatte ich befürchtet, aber mit der Zeit kommt ja die Erfahrung, hoffe ich :) Aber nochmal zu deiner Lösung. Muss ich für die xxx was einsetzen oder ist das der fertige Code, weil ich da diese Meldung wieder bekomme.
the function "substr(ReadingsTimestamp("withings_U1131*****","weight","xxxxxxxxxx15:30"),10)" must return a timespec and not 09:24:14.: {substr(ReadingsTimestamp("withings_U1131*****","weight","xxxxxxxxxx15:30"),10)}
Zitat von: Tabularasa am 02 Januar 2017, 16:46:30
Ok danke erstmal.Das hatte ich befürchtet, aber mit der Zeit kommt ja die Erfahrung, hoffe ich :) Aber nochmal zu deiner Lösung. Muss ich für die xxx was einsetzen oder ist das der fertige Code, weil ich da diese Meldung wieder bekomme.
the function "substr(ReadingsTimestamp("withings_U1131*****","weight","xxxxxxxxxx15:30"),10)" must return a timespec and not 09:24:14.: {substr(ReadingsTimestamp("withings_U1131*****","weight","xxxxxxxxxx15:30"),10)}
Ich habe noch mal nachgezählt. Das Datum besteht mit dem Leerzeichen aus 11 Zeichen, gezählt wird ab 0, daher fängt die Uhrzeit ab der 11. Position. Die x-Zeichen habe ich als Fülller eingetragen, um im Default-Fall auf die gleiche Länge zu kommen.
Es müsste dann wohl korrekt heißen:
{substr(ReadingsTimestamp("withings_U1131*****","weight","xxxxxxxxxxx15:30:00"),11)}
So ok, die Fehlermeldungen sind weg. Danke. Jedoch habe ich jetzt das Problem, dass das DOIF nicht auslöst wenn ich mich auf die Waage stelle. Ich hatte ja in einem Post gefragt, wenn ich eine feste Uhrzeit hinten eintrage, ob dann die Bedingung überhaupt mal wahr wird, falls ich nicht wie im Beispiel exakt 15:30 draufstehe? Ist das das Problem? Oder muss ich das dann eventuell doch komplett anders lösen bzw. habe ich mich im Anfangspost falsch ausgedrückt? Dann würde ich es ggf nochmal anders formulieren. Danke
Zitat von: Tabularasa am 02 Januar 2017, 17:48:31
So ok, die Fehlermeldungen sind weg. Danke. Jedoch habe ich jetzt das Problem, dass das DOIF nicht auslöst wenn ich mich auf die Waage stelle. Ich hatte ja in einem Post gefragt, wenn ich eine feste Uhrzeit hinten eintrage, ob dann die Bedingung überhaupt mal wahr wird, falls ich nicht wie im Beispiel exakt 15:30 draufstehe? Ist das das Problem? Oder muss ich das dann eventuell doch komplett anders lösen bzw. habe ich mich im Anfangspost falsch ausgedrückt? Dann würde ich es ggf nochmal anders formulieren. Danke
Zeitpunktangaben sind nur zum jeweiligen Trigger-Zeitpunkt wahr, sonst nicht.
Ok. Aber wie bekomme ich dann meine Anforderung vom Anfangspost gelöst? Also wie müsste das DOIF aussehen, dass wenn ich mich wiege im Zeitraum 15:30-04:30 dann der Status verändert wird? Muss ich die 15:30:00 auch mit x-Zeichen ersetzen? Ich würde gern das über die Waage machen, weil wir uns vorm Bettgehen halt immer wiegen. Einen Schalter drücken oder so kann man auch mal vergessen. Oder sind andere Automatiken bekannt, auf die ich nicht komme?
Edit: gerade in der commandref gesehen. Würde das für mein Szenario passen?
ZitatReadingauswertung nur beim Event des jeweiligen Readings back
Standardmäßig werden angegebene Readings ausgewertet, wenn irgend ein Event des angegebenen Devices triggert. Möchte man gezielt nur dann ein angegebenes Reading auswerten, wenn sich nur dieses ändert, so lässt sich das mit dem Attribut checkReadingEvent einschränken. Das ist insb. dann interessant, wenn ein Modul verschiedene Readings zu unterschiedlichen Zeitpunkten aktualisiert.
Beispiele:
define di_lamp DOIF ([mytwilight:light] < 3) (set lamp on) DOELSEIF ([mytwilight:light] > 3) (set lamp off)
attr di_lamp checkReadingEvent 1
Ebenso gilt die Einschränkung für indirekte Timer:
define di_lamp ([[mytwilight:ss_weather]]) (set lamp on)
attr di_lamp do always
attr di_lamp checkReadingEvent 1
Also wenn du dein Modul durch das Wiegen triggern willst, dann muss du doch einfach nur das Ereignis als Trigger angeben. Das sind Grundkonzepte von FHEM.
([Waage] eq "present" and [15:30-03:00] and [withings_U1131*****:"weight"]) (set rr_Mann gotosleep)
Ok sorry. Dann hab ich gleich zu kompliziert gedacht. Hatte irgendwie im Kopf dass ich den Zeitstempel verwenden muss um die Zeitspanne bestimmen zu können. Habe jetzt nochmal Wort für Wort den Abschnitt "Ereignissteuerung über Auswertung von Events" gelesen, aber das hatte ich vorher so nicht kapiert. Trotzdem Danke für deine Geduld
kleine Frage hab ich doch noch. Geht das so?
([Waage] eq "present" and [15:30-04:30] and [withings_U1131*****:"weight"]) (set rr_Mann gotosleep) DOELSEIF ([Waage] eq "present" and [15:30-04:30] and [withings_U1132****:"weight"]) (set rr_Frau gotosleep)
ich denke wenn die Waage nach meinem wiegen zwischenzeitlich auf absent wechselt, könnte danach die 2. Bedingung wahr werden wenn sich meine Frau wiegt, sonst nicht oder?