mit defined ein at abragen und löschen

Begonnen von Elektrolurch, 22 Juli 2013, 10:46:13

Vorheriges Thema - Nächstes Thema

Elektrolurch

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

 
configDB und Windows befreite Zone!

betateilchen

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
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

Elektrolurch

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
configDB und Windows befreite Zone!

betateilchen

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!
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

MisterEltako

Macht nicht genau das unter Pkt. 1  "watchdog" ????? ;o)

MfG, MisterEltako.
HMLAN-Konfigurations-Adapter, HM-Funkjalousieaktor/HM-Dimmaktor/HM-Schaltaktor f. Markenschalter, Jalousie-/Schaltaktor von Eltako, FT4 v. Eltako, TCM310

stromer-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.
FHEM (SVN) auf RPi1B mit HMser | ESPLink
FHEM (SVN) virtuell mit HMLAN | HMUSB | CUL