FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: Elektrolurch am 22 Juli 2013, 10:46:13

Titel: mit defined ein at abragen und löschen
Beitrag von: Elektrolurch am 22 Juli 2013, 10:46:13
Hallo zusammen,

wieder mal zwei Anfängerfragen:
1. Ich möchte ein Ereignis verzögert auslösen, sagen wir mal nach 1 Stunde, wenn das Ereignis aufgetreten ist. Dazu definiere ich mir ein at:
Auszug:
my $comtext = "define Familie_set_absent at +01:00:00 set Familie absent";; \
Sollte binnen einer Stunde ein neues Ereignis auftreten, so möchte ich das at wieder löschen, damit es dann doch nicht ausgeführt wird:
> Bedingung für Löschen eingetreten:
if (defined("Familie_set_absent")) { \
    fhem ("delete Familie_set_absent");;  }\
 } \
"defined" liefert aber immer den Wert 1 zurück, auch wenn das at nicht definiert ist.
Das Löschen, bzw. der Versuch führt im log dann zu einer Fehlermeldung:
2013.07.22 08:07:07 3: delete Familie_set_absent : Please define Familie_set_absent first
2013.07.22 08:07:07 3: JemandzuHause return value: Please define Familie_set_absent first
Ansonsten funktioniert das at, wie es gewünscht ist. Nur das Löschen nicht, bzw. mit Fehlermeldung.
Wie kann ich das Problem lösen?
Was muss ich statt "defined" nehmen?
2. Mehrere devices für set - Befehl in perl
fhem("set .*_Panik off");;
Führt zu einer Fehlermeldung:
Geht das überhaupt, hier mehrere devices dem set - Befehl per regex mit zu geben?
Und wie muss die regex aussehen, wenn ich .*Panik und .*Media mit einem Befehl ausschalten will?

Gruß

Elektrolurch

 
Titel: Aw: mit defined ein at abragen und löschen
Beitrag von: betateilchen am 22 Juli 2013, 10:56:16
Du brauchst gar nicht abfragen, ob es das at gibt.

Du kannst einfach den Löschbefehl absetzen. Logischerweise wird das im Log protokolliert, wenn das at gar nicht existiert, aber ein Fehler im eigentlichen Sinne ist das eben nicht. Deshalb wird das auch im Loglevel 3 (quasi nur als Information) geführt und nicht in 1 oder 2 was bei wirklichen Fehlern der Fall wäre.

Stör Dich einfach nicht an der Log-Meldung. Wenn es das AT gibt, wird es gelöscht. Wenn nicht, gibt es den Hinweis.
Das Ganze funktioniert so übrigens auch beim define: wenn es das AT schon gibt, wird ein Hinweis protokolliert, und das wars.

Man sollte das Logfile nicht immer nur als "Fehlerdatei" betrachten, sondern einfach als Protokolldatei für alles mögliche.


ZitatGeht das überhaupt, hier mehrere devices dem set - Befehl per regex mit zu geben?
Nein, das geht nicht. Da mußt Du Dir erstmal ein array bauen, in dem alle devices gelistet sind, und dann in einer Schleife den Befehl an alle gefundenen Geräte schicken.

Ein Beispiel findest Du im Wiki, wo alle FHT Devices regelmäßig die aktuelle Uhrzeit/Datum geschickt bekommen: http://www.fhemwiki.de/wiki/FHT:_Datum_und_Zeit_von_fhem_setzen_lassen (//www.fhemwiki.de/wiki/FHT:_Datum_und_Zeit_von_fhem_setzen_lassen)
Titel: Aw: mit defined ein at abragen und löschen
Beitrag von: Elektrolurch am 22 Juli 2013, 11:18:15
Hallo,

aber warum gibt der "defined" Befehl immer "1" zurück, auch wenn das at nicht existiert?
Das die Routine läuft, trotz der Meldung, hatte ich ja geschrieben. Es geht auch ein bisschen um "Programmierethik". -:)
Und wie löse ich das, falls das überhaupt geht, mit den mehreren devices für den set-Befehl?

Elektrolurch
Titel: Aw: mit defined ein at abragen und löschen
Beitrag von: betateilchen am 22 Juli 2013, 11:56:08
Zitat von: Elektrolurch schrieb am Mo, 22 Juli 2013 11:18Und wie löse ich das, falls das überhaupt geht, mit den mehreren devices für den set-Befehl?

Das hatte ich Dir doch oben - inklusive Beispielanwendung - schon geschrieben?

Zitat von: Elektrolurch schrieb am Mo, 22 Juli 2013 11:18aber warum gibt der "defined" Befehl immer "1" zurück, auch wenn das at nicht existiert?

vielleicht weil Du defined() noch nicht richtig verstanden hast:

defined
Returns a Boolean value telling whether EXPR has a value other than the undefined value undef. If EXPR is not present, $_ is checked.

http://perldoc.perl.org/functions/defined.html


Ein String (wie von Dir angegeben) ist nunmal von Haus aus nicht undefined.

defined() ist eine perl-Funktion, keine fhem-Funktion!
Titel: Aw: mit defined ein at abragen und löschen
Beitrag von: MisterEltako am 23 Juli 2013, 16:33:17
Macht nicht genau das unter Pkt. 1  "watchdog" ????? ;o)

MfG, MisterEltako.
Titel: Aw: mit defined ein at abragen und löschen
Beitrag von: stromer-12 am 28 Juli 2013, 11:26:12
Zitat von: Elektrolurch schrieb am Mo, 22 Juli 2013 10:46Sollte binnen einer Stunde ein neues Ereignis auftreten, so möchte ich das at wieder löschen, damit es dann doch nicht ausgeführt wird:
> Bedingung für Löschen eingetreten:
if (defined("Familie_set_absent")) { \
    fhem ("delete Familie_set_absent");;  }\
 } \
"defined" liefert aber immer den Wert 1 zurück, auch wenn das at nicht definiert ist.
Das Löschen, bzw. der Versuch führt im log dann zu einer Fehlermeldung:
2013.07.22 08:07:07 3: delete Familie_set_absent : Please define Familie_set_absent first
2013.07.22 08:07:07 3: JemandzuHause return value: Please define Familie_set_absent first
Ansonsten funktioniert das at, wie es gewünscht ist. Nur das Löschen nicht, bzw. mit Fehlermeldung.
Wie kann ich das Problem lösen?
Was muss ich statt "defined" nehmen?

Versuche es mit:

if (Value("Familie_set_absent") ne "") { \
    fhem ("delete Familie_set_absent");;  }\
 } \

Value liefert den nächsten Triggerzeitpunkt oder bei nicht vorhanden sein eine leere Zeichenkette.