FHEM/Perl Verschachtelungen

Begonnen von MaxAut, 19 Juni 2016, 13:02:23

Vorheriges Thema - Nächstes Thema

MaxAut

Hallo!

Ich habe eine richtige Anfängerfrage, als FHEM und Perl Neuling. Ich möchte innerhalb eines Notify mittels FHEM Befehls ein at schedulen, worin wiederum ein Perl Script steht, in dem dann wieder ein FHEM Befehl ausgeführt wird. Mein Notify funktioniert soweit, daher paste ich das hier jetzt mal nicht rein, um die Sache übersichtlicher zu machen.

Folgender Teil funktioniert nicht:
{fhem ("define at_Eingangstuere_zusperren2 at +00:00:10 {if (Value("TFKontaktEingang") eq "closed") {fhem ("set KeyMaticEingang lock")}}")}

Führe ich diesen Teil direkt in FHEM aus klappt es:
define at_Eingangstuere_zusperren2 at +00:00:10 {if (Value("TFKontaktEingang") eq "closed") {fhem ("set KeyMaticEingang lock")}}

Was mache ich falsch?

Liebe Grüße,
Max

MadMax-FHEM

Hi Max,

besser ist trotzdem mal nicht wegzulassen, evtl. sieht es (manchmal) so aus als würde ein Teil klappen aber dann ist genau dort der Anfang vom Ende ;-)

und "Code-Schnipsel" in "code-tags" packen das ist das '#' in der Menüleiste...

Aber ich denke es hat mit den Anführungszeichen zu tun:

der erste "String" ist ja

"define at_Eingangstuere_zusperren2 at +00:00:10 {if (Value("

und nicht "define at_Eingangstuere_zusperren2 at +00:00:10 DOSOMETHING"

Mal die " in der Mitte durch ' ersetzen oder "escapen"...

Was ich bei sowas mach ist, dass ich den "Ausführteil" in eine sub in my_Utils auslagere und dann im notify / at etc. nur diese Sub aufrufe, die macht dann den Rest...

Eventuell mal devmod statt define, gibt Fehler, wenn das 'at' bereits definiert ist (also ab dem 2ten Aufruf)...

Ich habe folgendes bei mir:

{fhem("defmod Reset_Heating_ZiVier_Delayed at +00:00:10 {ResetHeatingZiVier()}")}

D.h. die Heizung wird erst 10min nach Fenster closed wieder hich gedreht...
...Hochdrehen der Heizung wird dann durch die Sub 'ResetHeatingZiVier' erledigt, da ich dort noch so einiges prüfe etc.

Gruß, Joachim
FHEM PI3B+ Bullseye: HM-CFG-USB, 40x HM, ZWave-USB, 13x ZWave, EnOcean-PI, 15x EnOcean, HUE/deCONZ, CO2, ESP-Multisensor, Shelly, alexa-fhem, ...
FHEM PI2 Buster: HM-CFG-USB, 25x HM, ZWave-USB, 4x ZWave, EnOcean-PI, 3x EnOcean, Shelly, ha-bridge, ...
FHEM PI3 Buster (Test)

MaxAut

Also der ganze Code sieht so aus:

define n_Eingangstuere_zusperren notify TFKontaktEingang {
my $time = sprintf("%02d:%02d", $hour, $min);;
if ((Value("TFKontaktEingang") eq "closed") && (($time gt "21:00") || (($time gt "00:00") && ($time lt "07:00")))) {fhem ("define at_Eingangstuere_zusperren2 at +00:00:10 {if (Value("TFKontaktEingang") eq "closed") {fhem ("set KeyMaticEingang lock")}}")}}


Doppelte at's sind nicht mein Problem - die sind nach 10 Sekunden ohnehin wieder weg ...

Danke für den Tipp! Ich habe es jetzt so implementiert und es funktioniert nun:

TFKontaktEingang {
my $time = sprintf("%02d:%02d", $hour, $min);;
if ((Value("TFKontaktEingang") eq "closed") && (($time gt "21:00") || (($time gt "00:00") && ($time lt "07:00")))) {fhem ("define at_Eingangstuere_zusperren2 at +00:00:10 {if (Value('TFKontaktEingang') eq 'closed') {fhem ('set KeyMaticEingang lock')}}")}}


MadMax-FHEM

Hi Max,

freut mich...

Allerdings:

der mit define angelegte 'at' bleibt (normalderweise), also der Name ist in fhem vergeben.

Legst du das 2te Mal den selben 'at' gleicher Name an (also 2ter Durchlauf des notify), dann gibt es den 'at' mit dem Namen schon und es wird wohl eine Fehlermeldung kommen.

War zumindest bei mir so, daher 'defmod' statt 'define'...

Richtig ist: der 'at' löst nur einmal nach 10sek aus, der definierte 'at' bleibt aber in fhem bestehen (mind. bis zum shutdown restart und wenn irgendwann ein save config folgt sogar darüber hinaus)...

Aber wenn das bei dir nicht auftritt: gut! ;-)

Gruß, Joachim
FHEM PI3B+ Bullseye: HM-CFG-USB, 40x HM, ZWave-USB, 13x ZWave, EnOcean-PI, 15x EnOcean, HUE/deCONZ, CO2, ESP-Multisensor, Shelly, alexa-fhem, ...
FHEM PI2 Buster: HM-CFG-USB, 25x HM, ZWave-USB, 4x ZWave, EnOcean-PI, 3x EnOcean, Shelly, ha-bridge, ...
FHEM PI3 Buster (Test)

MaxAut

hmmm ... also bei mir ist der AT gleich nach dem ausführen weg ... jedenfalls wenn ich ihn mit +00:00:10 anlege ...

CoolTux

#5
Ein at bleibt nur so lange bestehen wie es mit * als sich wiederholend angelegt wurde.

Was ich bisher in Deinem Code sehen konnte war das es sich um sehr kurzlebige at's handelt. Hier kannst Du mit einem FHEM sleep besser arbeiten


{ fhem ("sleep 10; set KeyMaticEingang lock") if (Value("TFKontaktEingang") eq "closed") }


Ich weiß nicht mehr ganz genau wie es sich verhält wenn das sleep der erste FHEM Befehl ist. Aber probiere das erstmal so.



Grüße
Leon
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

MadMax-FHEM

Hi,

ah, ok.

Vielleicht hatte ich auch beim Rumprobieren mal andere 'at'...

Bleibe (da es läuft) aber (erst mal) bei defmod...

Gruß, Joachim
FHEM PI3B+ Bullseye: HM-CFG-USB, 40x HM, ZWave-USB, 13x ZWave, EnOcean-PI, 15x EnOcean, HUE/deCONZ, CO2, ESP-Multisensor, Shelly, alexa-fhem, ...
FHEM PI2 Buster: HM-CFG-USB, 25x HM, ZWave-USB, 4x ZWave, EnOcean-PI, 3x EnOcean, Shelly, ha-bridge, ...
FHEM PI3 Buster (Test)

MaxAut

Das mit dem FHEM sleep hatte ich vorher ... das Problem ist, dass ich nach den 10 Sekunden nochmal prüfen möchte ob die Türe immer noch zu ist ... FHEM sleep blockiert außerdem wenn aus PERL Code heraus aufgerufen das System ... zumindest war das bei mir so.

CoolTux

Das kann ich definitiv verneinen, da Du ja das sleep aus dem FHEM Kontext heraus aufrufst.
Und um zu schauen ob nach x Sekunden ein bestimmter Status noch vorhanden ist nimmt man watchdog
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

CoolTux

Am besten Du zeigst uns mal dein gesamtes Konzept was Du gerade am bearbeiten bist. Was genau willst Du erreichen?
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

MaxAut

Ah ... Watchdog ;-) ... muss ich mir ansehen, kannte ich noch nicht ;-).

Ich habe euch das ganze Ding gezeigt, aber hier gerne nochmals. So ist es jetzt implementiert und funktioniert:

define n_Eingangstuere_zusperren notify TFKontaktEingang {
my $time = sprintf("%02d:%02d", $hour, $min);;
if ((Value("TFKontaktEingang") eq "closed") && (($time gt "21:00") || (($time gt "00:00") && ($time lt "07:00")))) {fhem ("define at_Eingangstuere_zusperren2 at +00:00:10 {if (Value('TFKontaktEingang') eq 'closed') {fhem ('set KeyMaticEingang lock')}}")}}


Was soll es tun? (tut es jetzt auch!)
- Auslösen wenn die Türe zwischen 21:00 Abends und 07:00 Früh geschlossen wird (Türkontakt)
- Nach 10 Sekunden prüfen ob die Türe immer noch geschlossen ist
- Falls ja, zusperren

Wenn es dafür eine bessere Lösung gibt setze ich das auch wirklich sehr gerne anders um! ich bin ja vollkommen neu bei FHEM und hatte bisher auch nie Perl programmiert, also kenne ich die Feinheiten noch nicht.

CoolTux

Wie gesagt. Watchdog wäre gut.
Ein watchdog prüft ob der Auslösezustand nach x Zeit noch vorhanden ist wenn ja führe aus.

Hast Du Dich schon mit Anwesenheitserkennung befasst? Hier könnte man das ganze Abhängig vom Bewohnerstatus besser realisieren. Schließe ab wenn alle Bewohner weg sind oder wenn alle Bewohner schlafen.
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

MaxAut

Ich habe mir Watchdog jetzt angesehen; mein Problem ist, dass dafür alles mit Regular Expressions ausgedrückt werden muss und ich damit nicht fit bin. Ich habe keine Ahnung, wie ich die mit den ifs abgebildeten  Bedingungen durch RegExs ablöse.

Die Erste wäre ja mal: Wenn innerhalb eines gewissen Uhrzeitfensters die Türe zu gemacht wird.

Und die Zweite: Wenn sie 10 Sekunden danach immer noch zu ist.

Wie würde ich diese beiden Abfragen durch RegExs ausdrücken? Also ganz konkret: Wie würde der äquivalente Watchdog zu meinem Miniprogramm aussehen?

Benni

Zitat von: CoolTux am 19 Juni 2016, 14:22:16
Ich weiß nicht mehr ganz genau wie es sich verhält wenn das sleep der erste FHEM Befehl ist.

Das ist kein Problem!
Nur wenn direkt nach dem Sleep kein weiterer Befehl mehr kommt, dann blockiert es.

CoolTux

Anhand Deiner Frage stelle ich fest das Du noch nicht so ganz watchdog verstanden hast. Versuche mal andersrum zu denken.

Ziel ist es das die Tür zugeschlossen werden soll wenn sie zu gemacht wurde und innerhalb von 10m nicht wieder auf gemacht. Dabei gilt zu beachten das der Schaltbefehle nur zwischen bla und bla ausgeführt werden soll. Lass also den watchdog ruhig anspringen und im Schaltbefehl fragst dann die Uhrzeit an


define w_Eingangstuer_zusperren watchdog TFKontaktEingang.closed 00:10 TFKontaktEingang.closed { if (($time gt "21:00") || (($time gt "00:00") && ($time lt "07:00")))
                  fhem ("set KeyMaticEingang lock; trigger w_Eingangstuer_zusperren .");
}


Bitte noch mal anschauen und kucken ob das if so ok ist. Habe auf Tablet geschrieben.
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net