EDIT: Beim Schreiben dieser Nachricht bin ich auf die Lösung gekommen, daher möchte ich mein Anliegen trotzdem formulieren:
In apptime tauchen sehr viele tmr-DOIF_TimerTrigger-Einträge auf, ich sehe auf Anhieb jedoch nicht, um welches DOIF es sich handelt.
Lösung: Bei dem Parameter ist ein Zeitstempel mit ausgegeben. Über den Zeitstempel liess sich in meinem Fall rekonstruieren, welches DOIF geprüft wurde (im Zweifelsfall loglevel 5).
ORIGINAL:
Versuche gerade sporadischen "Hängern" von fhem auf die Schliche zu bekommen und habe folgendes apptime-Ergebnis:
tmr-DOIF_SleepTrigger HASH(0x3e33f80) 27263 10 118660.21 11866.02 1137.02 116.18 09.01. 00:06:22 HASH(DOIF_PRE_Grundversorgung)
GL_NY_Grundversorgung notify_Exec 27166 10 117715.68 11771.57 0.00 0.00 09.01. 00:06:22 HASH(GL_NY_Grundversorgung); HASH(GL_Grundversorgung)
tmr-DOIF_TimerTrigger REF(0x4f1e878) 6866 1 6866.58 6866.58 2.96 2.96 08.01. 01:00:06 REF(0x4f1e878)
GL_Grundversorgung dummy_Set 27199 20 118024.58 5901.23 0.00 0.00 09.01. 00:06:22 HASH(GL_Grundversorgung); GL_Grundversorgung; off
tmr-TelegramBot_UpdatePoll HASH(0x46d9ba0) 20130 14 80655.66 5761.12 3.07 2.51 09.01. 08:54:55 HASH(teleBot)
tmr-DOIF_TimerTrigger REF(0x72c54a0) 4805 1 4805.75 4805.75 3.50 3.50 09.01. 03:35:04 REF(0x72c54a0)
tmr-DOIF_TimerTrigger REF(0x4f38be0) 4165 1 4165.70 4165.70 3.14 3.14 07.01. 22:00:04 REF(0x4f38be0)
tmr-at_Exec HASH(0x4e0a820) 3967 1 3967.38 3967.38 2.73 2.73 07.01. 20:01:25 HASH(GL_AT_FZ_OFF)
IZ_NAS dummy_Set 20323 30 98418.04 3280.60 0.00 0.00 09.01. 00:06:16 HASH(IZ_NAS); IZ_NAS; off
tmr-DOIF_TimerTrigger REF(0x59f31c0) 3266 1 3266.32 3266.32 3.48 3.48 08.01. 04:35:03 REF(0x59f31c0)
tmr-DOIF_TimerTrigger REF(0x4cb4338) 2986 1 2986.23 2986.23 783.85 783.85 07.01. 20:10:03 REF(0x4cb4338)
tmr-DOIF_SleepTrigger HASH(0x3ee00b0) 4211 5 13034.38 2606.88 2.85 2.53 08.01. 07:47:44 HASH(AZ_DOIF_Drucker)
tmr-DOIF_TimerTrigger REF(0x5f135f0) 2375 1 2375.18 2375.18 3.89 3.89 08.01. 17:37:01 REF(0x5f135f0)
tmr-DOIF_SleepTrigger HASH(0x3f359f0) 3906 14 31231.92 2230.85 908.64 151.86 08.01. 00:21:56 HASH(DOIF_PRE_HOME_ASLEEP)
tmr-at_Exec HASH(0x6d03ee8) 2011 1 2011.56 2011.56 3.06 3.06 08.01. 22:58:55 HASH(GL_AT_SZ_OFF)
GL_SYSTEM_COMMAND notify_Exec 19198 37 73380.51 1983.26 0.00 0.00 09.01. 00:06:16 HASH(GL_SYSTEM_COMMAND); HASH(SYSTEM_COMMAND)
tmr-DOIF_TimerTrigger REF(0x5ab0c50) 1927 1 1927.86 1927.86 3.43 3.43 08.01. 05:15:01 REF(0x5ab0c50)
SYSTEM_COMMAND dummy_Set 19232 39 74563.84 1911.89 0.00 0.00 09.01. 00:06:16 HASH(SYSTEM_COMMAND); SYSTEM_COMMAND; /opt/fhem/script/shutdown_diskstation
tmr-DOIF_TimerTrigger REF(0x7b04e98) 1880 1 1880.41 1880.41 3.25 3.25 09.01. 13:03:42 REF(0x7b04e98)
tmr-DOIF_TimerTrigger REF(0x645f188) 1864 1 1864.66 1864.66 3.42 3.42 08.01. 16:30:01 REF(0x645f188)
tmr-DOIF_TimerTrigger REF(0x7c4a2b8) 1776 1 1776.13 1776.13 1.94 1.94 09.01. 15:45:01 REF(0x7c4a2b8)
tmr-DOIF_TimerTrigger REF(0x7279508) 1769 1 1769.04 1769.04 2.94 2.94 09.01. 03:20:01 REF(0x7279508)
tmr-DOIF_TimerTrigger REF(0x4f387a8) 1641 1 1641.31 1641.31 114.96 114.96 08.01. 05:30:01 REF(0x4f387a8)
tmr-DOIF_TimerTrigger REF(0x57b9f60) 1613 1 1613.45 1613.45 3.14 3.14 09.01. 02:30:01 REF(0x57b9f60)
tmr-DOIF_TimerTrigger REF(0x4f38460) 1587 1 1587.51 1587.51 3.17 3.17 08.01. 02:30:01 REF(0x4f38460)
tmr-DOIF_TimerTrigger REF(0x5296e70) 1544 1 1544.47 1544.47 3.33 3.33 08.01. 20:00:01 REF(0x5296e70)
tmr-DOIF_TimerTrigger REF(0x4a42378) 1508 1 1508.83 1508.83 110.53 110.53 07.01. 21:00:01 REF(0x4a42378)
tmr-DOIF_TimerTrigger REF(0x4a42870) 1490 1 1490.74 1490.74 119.07 119.07 07.01. 20:00:01 REF(0x4a42870)
tmr-DOIF_TimerTrigger REF(0x57ba170) 1441 1 1441.73 1441.73 3.31 3.31 09.01. 01:50:01 REF(0x57ba170)
tmr-DOIF_TimerTrigger REF(0x5b85860) 1422 1 1422.18 1422.18 125.66 125.66 09.01. 06:00:01 REF(0x5b85860)
tmr-DOIF_TimerTrigger REF(0x49aceb8) 1380 1 1380.76 1380.76 3.15 3.15 08.01. 06:00:01 REF(0x49aceb8)
tmr-at_Exec HASH(0x3ea6ca0) 1426 2 2743.11 1371.55 3.31 3.30 08.01. 04:00:01 HASH(IZ_AT_NAS_ON)
tmr-at_Exec HASH(0x4be5d18) 1359 1 1359.22 1359.22 3.38 3.38 08.01. 23:41:27 HASH(GL_AT_SZ_OFF)
tmr-at_Exec HASH(0x6721a18) 1335 1 1335.66 1335.66 3.14 3.14 09.01. 10:41:05 HASH(IZ_AT_WOL)
tmr-DOIF_TimerTrigger REF(0x4f38640) 1326 1 1326.13 1326.13 2.78 2.78 08.01. 01:30:01 REF(0x4f38640)
tmr-at_Exec HASH(0x66a6208) 1315 1 1315.47 1315.47 3.12 3.12 08.01. 21:35:17 HASH(GL_AT_SZ_OFF)
tmr-DOIF_TimerTrigger REF(0x4f167b0) 1307 1 1307.05 1307.05 15.87 15.87 08.01. 09:00:01 REF(0x4f167b0)
tmr-DOIF_TimerTrigger REF(0x4f1ebd8) 1292 1 1292.44 1292.44 2.42 2.42 08.01. 08:15:59 REF(0x4f1ebd8)
tmr-DOIF_TimerTrigger REF(0x5708d18) 1286 1 1286.74 1286.74 3.65 3.65 08.01. 16:50:10 REF(0x5708d18)
tmr-at_Exec HASH(0x4cd82a8) 1279 1 1279.34 1279.34 2.99 2.99 08.01. 18:16:02 HASH(GL_AT_SZ_OFF)
tmr-DOIF_TimerTrigger REF(0x570e990) 1244 1 1244.73 1244.73 128.64 128.64 09.01. 01:00:01 REF(0x570e990)
Ich habe es mit sehr vielen tmr-DOIF_TimerTrigger Einträge zu tun. Gibt es eine Möglichkeit anzuzeigen, um welches DOIF es sich handelt? So stehe ich etwas ratlos davor, da ich 50 DOIFs habe..
Zusätzlich kann man sagen, dass Sleep-Timer von waits kommen.
Man kann viele Timer durch ständiges Pollen produziert, z. B. [+00:00:01], so etwas sollte man nach Möglichkeit vermeiden und ereignisorientiert ohne Timer arbeiten.
vielen Dank für den Hinweis! Aber ist das bei mir der Fall? Siehe folgenden Auszug von cat fhem.cfg | grep " DOIF ":
define DOIF_Whatsapp_AB DOIF ([TYPE]~="yowsup" and [room]~="yowsup") ( set $DEVICE send "Auf meiner Festnetznummer bin ich per Whatsapp nicht erreichbar")
define DOIF_PRE_Grundversorgung DOIF ( [rgr_Residents_oben] eq "asleep" or [rgr_Residents_oben] eq "absent" or [rgr_Residents_oben] eq "gone" ) ( set GL_Grundversorgung off ) DOELSE ( set GL_Grundversorgung on )
define DOIF_BACKUP_CHECK DOIF ( ([20:44] or [IZ_START_BACKUPCHECK] eq "on") and [global:hosttype] eq "produktiv" ) \
define DOIF_IT DOIF ( [rgr_IZ_USERDEV] eq "home") \
define IZ_DOIF_NAS DOIF ## Hier ein Zeitgatter zu haben ist sinnvoo, um grundversorgungsevents zu ignorieren\
define FZ_DOIF_SAUGROBOTER_START DOIF ( [rgr_Residents_oben] eq "absent" or [rgr_Residents_oben] eq "gone") (set FZ_SAUGROBOTER on, set LOGEINTRAG Saugroboter los )
define FZ_Decke1_AUTOOFF DOIF ( [FZ_Decke1] eq "on" ) ( set FZ_Decke1 off )
define AZ_DOIF_Drucker DOIF ( [AZ_Drucker] =~ "on") \
define AZ_DOIF_Farblaser DOIF ( [AZ_ZS_Drucker] =~ "on") \
define DOIF_PRE_TTS DOIF ( ["^r[rg]_:^home"] and [$DEVICE:&RESIDENTGROUPS] =~ "rgr_Residents_oben" )\
define WZ_DOIF_Deko DOIF ( [({sunset()}-2000)-01:00] or [5:00-({sunrise()}+2000)] ) ( set purpose=Deko on, set LOGEINTRAG Deko an ) DOELSE ( set purpose=Deko off, set LOGEINTRAG Deko aus )
define DOIF_TEMPERATURSTEUERUNG DOIF ([rgr_Residents_oben] eq "gone") ( set RT_[A-Z]Z [RT_KALT], set LOGEINTRAG Heizung off weil gone, set MyTTS tts Schalte Heizung ab )\
define DOIF_RUNTESTS DOIF ( [HOSTTYPE] eq "test" ) ( { testUtils::runtests() } )
define IZ_DOIF_NAS_RESTART DOIF ( [IZ_NAS] eq "on" and [IZ_NAS_PRESENCE] eq "absent" ) \
define DOIF_TEMPERATURSTEUERUNG_UNTEN_LR DOIF ( [rr_Felix] eq "gone")\
define DOIF_VALVEPOSKUMUL_FENSTERWARNUNG DOIF ([+[4]:05]) ( setreading chanNo=04 ValvePositionKumul 0 )\
define DOIF_BLUETOOTH_CHECK DOIF ([GTag_Test1] ne "present" and [GTag_Test2] ne "present" )\
define DOIF_TEST DOIF ([dummy] ne '' and [{print substr("dummy2",0,5)}] eq "hallo" ) ( { speak("1") })\
define DOIF_TEMPERATURSTEUERUNG_UNTEN_GEMEINSCHAFTSRAEUME DOIF ([rgr_Residents_unten] eq "gone") ( set RT_[A-Z]R [RT_KALT], set LOGEINTRAG_UNTEN Heizung_unten off weil gone )\
define DOIF_TEMPERATURSTEUERUNG_UNTEN_RR DOIF ( [rr_Daniel] eq "gone")\
define DOIF_CHECK_PRODUCTIVE DOIF ( [HOSTNAME] =~ "smarthome3" ) ( set HOSTTYPE test )\
define DOIF_HOSTNAME DOIF ( ["HmUART"] ) \
define DOIF_GETLOGS DOIF ( [+:05] ) \
define DOIF_TEST_ANALYSIS DOIF ( [testlogs] =~ "Fehler" ) \
define DOIF_Whatsapp_DOWN DOIF ([WhatsApp] =~ "Disconnected" ) ( set LOGEINTRAG "Whatsapp Disconnected" )
define DOIF_DISABLE_PRODUCTIVES DOIF ( [HOSTTYPE] =~ "test" ) \
define WZ_DOIF_Decke DOIF ( [WZ_Decke_1] eq "on") \
define SZ_DOIF_Decke DOIF ( [SZ_Decke_1] eq "on") \
define DOIF_PRE_HOME_ASLEEP DOIF ( ( [GL_LichtAnzahl] eq 0 ) and [?{sunset()}-{sunrise()}] ) ( { einschlafen() } ) DOELSE ( { aufwachen() } )
define DOIF_SAISONANPASSUNG DOIF ( [+7200] and [07:00-22:00]) \
define SZ_DOIF_Decke2 DOIF ( [SZ_Decke_2] eq "on") \
define WZ_DOIF_Decke_2 DOIF ( [WZ_Decke_2] eq "on") \
define DOIF_REFRESH_LICHTANZAHL_ZIMMER DOIF ([+:01]) \
define IZ_DOIF_SMARTHOME2_PRESENCE DOIF ( [IZ_SMARTHOME2_PRESENCE] ne "present" ) { WAMessage("Smarthome2 down");;;; }
define DOIF_GTag_alt DOIF ( ["^GTag_:present"] )\
define DOIF_PRE_Simulation DOIF ( ( [rr_Max] eq "gone" ) and ( [rr_Lisa] eq "gone" ) and ( [FZ_Aussen_2] eq "on" ) and ( [GL_LichtAnzahl] eq 0 ) and ( [18:30-22:30] )) \
define DOIF_SB_SZ DOIF ( ([SZ_LichtAnzahl] eq 0) and ([SB_SZ] eq "on") )\
define WZ_DOIF_Drucker_aus DOIF ( ( [WZ_ZS_Drucker] eq "on" ) or [03:00] or ( [WZ_LichtAnzahl] < 1 ) ) \
define DOIF_RT_SETZEN DOIF ([SAISONANPASSUNG] >= 20 ) ( set RT_WARM 5, set RT_NORMAL 5,set RT_KUEHL 5, set RT_KALT 5, set MyTTS tts Setze Zimmertemperatur auf [RT_NORMAL] Grad, set LOGEINTRAG Setze Zimmertemperatur auf [RT_NORMAL] Grad - Temperatur:[SAISONANPASSUNG] )\
define DOIF_LichtAnzahlZimmer DOIF ( ["^[A-Z]Z_LichtAnzahl:"] )\
define DOIF_Guest_AUTO_GONE DOIF ( ([rg_guest] eq "home") and [09:00] ) \
define DOIF_DVD_PRESENCE DOIF ( [IZ_DVD_PRESENCE] eq "present")\
define DOIF_TEMPERATURSTEUERUNG_UNTEN_LR_BLUETOOTH DOIF ([rr_Felix] eq "home" and [05:00-23:00]) ( set RT_LR [RT_WARM], set LOGEINTRAG_UNTEN Felix warm )\
define DOIF_TEMPERATURSTEUERUNG_UNTEN_RR_BLUETOOTH DOIF ([rr_Daniel] eq "home" and [17:00-23:59|7]) ( set RT_RR 25, set LOGEINTRAG_UNTEN Daniel warm )\
define IZ_DOIF_NAS_AUTO_OFF DOIF ( [rgr_IZ_USERDEV] ne "home" and [IS_ZS_NAS] eq "on") \
define IZ_DOIF_NAS_ON DOIF ( [IZ_USERDEV_LaptopTV] eq "present" or [IZ_DVD_PRESENCE] eq "on" or ([20:00-22:00] and [rgr_Residents_oben] eq "home")) \
define WZ_DOIF_Drucker_2 DOIF ( [WZ_ZS_Drucker] eq "on" ) \
define WZ_DOIF_Decke_Beide DOIF (( [WZ_Decke_2] eq "on") or ( [WZ_Decke_1] eq "on") )\
define IZ_DOIF_SH3 DOIF ( [IZ_SH3_PRESENCE] eq "present") \
define DOIF_Guest_MODE DOIF ( [rgr_Residents_oben:residentsTotalGuestsPresent] > 0 ) \
Ich habe einen weiteren Verdacht: Ich verwende gerne sleep 1;<Aktion> in den Ausführungsteilen, um Hintergrundaktionen zu verzögern, zeitkritische DOIFs bei Schalterbetätigung aber sofort auszuführen. Beispielsweise hier in einem notify:
.*:on|.*:off sleep 6;{
my $lightsOn = fhem "list STATE=on:FILTER=purpose=Licht NAME";;
if(defined $lightsOn)
{
my $lightCount = scalar(split('\n', $lightsOn));;
fhem "set GL_LichtAnzahl ".$lightCount;;
}
else
{
fhem "set GL_LichtAnzahl 0";;
}
}
Dieser Code kann auf einem Raspi3 gut 2 Sekundern dauern, was mich überrascht hat.
Liesse sich das auch über ein DOIF ohne sleep lösen, aber derart, dass ein zweites DOIF definitiv vorher ausgeführt wird (Nämlich um eine zweite Lampe mit der Ersten zusammen einzuschalten)?
Grüße!
Zitat von: Fridtjof am 09 Januar 2018, 20:42:24
Liesse sich das auch über ein DOIF ohne sleep lösen, aber derart, dass ein zweites DOIF definitiv vorher ausgeführt wird (Nämlich um eine zweite Lampe mit der Ersten zusammen einzuschalten)?
Wenn es Abhängigkeiten zwischen Ereignissen gibt, dann gibt es zwei Vorgehensweisen, entweder die Einzelteile, die nacheinander erfolgen sollen hintereinander in die gleiche Definition aufzunehmen oder im zweiten Modul auf ein eindeutiges Ereignis der ersten Definition, welches am Ende gesetzt, zu triggern.