[GELÖST] Perl Script bringt FHEM zum Absturz

Begonnen von thgorjup, 29 April 2018, 15:56:45

Vorheriges Thema - Nächstes Thema

thgorjup

Hallo zusammen,

ich möchte selbst eine Alarmanlage mit FHEM realisieren, da mir die fertigen Lösungen nicht gefallen.
Dabei soll beim Öfnen der Haustür vom FunkGong ein MP3 abgespielt werden, welches 17s dauert und ein Piepen mit immer kürzer werdenden Wiederholungen abspielt.

Soweit sogut. Das funktioniert schonmal. Aber während das MP3 abspielt soll geprüft werden, ob mit der Fernbedienung die Alarmanlage deaktiviert wird oder nicht.
Ich habe dazu folgendes Script geschrieben, welches aber FHEM irgendwie in eine Dauerschleife versetzt und das Webinterface nicht mehr reagiert.

Starte ich die Subroutine { Alarm_Time() } manuell über das Webinterface, dann funktioniert alles einwandfrei.
Ich kann dann mit der Fernbedinung den Ablauf stoppen. Aber aus dem DOIF heraus funktioniert es nicht und FHEM stürzt ab.

Vielleicht hat jemand eine Idee. Danke schonmal im Voraus.
Gruß
Thomas

AliRF_673DD0 = Türkontakt

Auslösung durch Haustür:

define AlarmanlagenSteuerung DOIF ( [Alarmanlage] eq "on" && [AliRF_673DD0:"motion"] && ( time() - time_str2num(ReadingsTimestamp("Alarmanlage","state","0")) > 60 ) )   ( {Alarm_Timer()} )

attr AlarmanlagenSteuerung do always



AlarmUnscharf (Fernbedienung):

define AlarmanlageUnscharf DOIF ([06:00] ) ( {Alarm_Unscharf("auto")} )\
DOELSEIF ( [AliRF_589D8C:motion] ) ( {Alarm_Unscharf("Thomas")} )\
DOELSEIF ( [AliRF_0A2D4C:motion] ) ( {Alarm_Unscharf("Caro")} )\
DOELSEIF ( [AliRF_00B32C:motion] ) ( {Alarm_Unscharf("Geo")} )\



Alarm_Timer:

# Ablauf nach z.B. Öffnen der Haustüre bei aktivierter Alarmanlage
sub Alarm_Timer() {

my $i;
my $zustand;

# Alarm-Verzögerungston abspielen (17 Sekunden)
fhem("set FunkGong_MP3 playTone 001");

        # Schleife 17 Sekunden durchlaufen und dabei prüfen ob Alarmanlage noch "on" ist.
        # Wenn Alarmanlage = "off", dann Script mit "return" verlassen.
for ($i = 0; $i <= 17; $i++) {

$zustand = ReadingsVal("Alarmanlage", "state", "0");
if ($zustand eq "off") {
return;
}
sleep(1);
}

        # Wenn Alarmanlage nicht deaktiviert wurde, dann Alarmton auslösen, LED blinken lassen und Pushover schicken.
fhem("set FunkGong_MP3 playTone 002");
fhem("set FunkGong_LED redS 60");
fhem("set pushmsg msg 'fhem' 'Alarmanlage hat durch Timer (z.B. Haustür) ausgelöst!';");

}


Alarmanlage_Unscharf:

# Ablauf bein Entschärfen der Alarmanlage
sub Alarm_Unscharf($) {

my ($user) = @_;
my $zustand;

        fhem("set Alarmanlage off");

        $zustand = ReadingsVal("FunkGong_MP3", "state", "0");
if ($zustand ne "off") { fhem("set FunkGong_MP3 off"); }

        # Quittungston abspielen
fhem("set FunkGong_MP3 playTone 004");

sleep (5);

       # Begrüßung abspielen
if ($user eq "Caro")   { fhem("set FunkGong_MP3 playTone 010"); }
if ($user eq "Thomas") { fhem("set FunkGong_MP3 playTone 011"); }
if ($user eq "Geo")  { fhem("set FunkGong_MP3 playTone 012"); }

        # Pushover schicken
fhem("set pushmsg msg 'fhem' 'Alarmanlage unscharf ($user)!'");
}

FHEM auf Ubuntu 18.04LTS, 2x nanoCUL, JeeLink, nanoPIR, MQTT, ESP-Easy, HUE.
Sensoren+Aktoren: HM, IT, Lacrosse, Multitrade-PIR, VU+, Somfy

CoolTux

Du legst absichtlich FHEM schlafen. Einmal für 17s und einmal für 5s.
Mit Deinen Funktionen wird der Hauptprozess von FHEM in einen sleep geschickt.
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

thgorjup

Ok, also schickt "sleep" FHEM komplett schlafen. Dann muss ich das irgendwie anders lösen....
FHEM auf Ubuntu 18.04LTS, 2x nanoCUL, JeeLink, nanoPIR, MQTT, ESP-Easy, HUE.
Sensoren+Aktoren: HM, IT, Lacrosse, Multitrade-PIR, VU+, Somfy

CoolTux

Ja das musst Du.
Das gute ist, du bist nicht der erste mit diesem Problem, es bedarf aber ein wenig hartnäckige Suche im Forum.
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

thgorjup

#4
Ok, ich habe jetzt einen Dummy namens "AlarmCountdown" eingebaut, der beim Öffnen der Tür auf "on" gesetzt wird.
Wenn der Timestamp dieses Dummy dann > 17s ist und der Dummy immernoch auf "on" steht, soll der Alarm auslösen.
Aber hier ist das nächste Problem. Das DOIF scheint das nicht zu intressieren....?


define AlarmanlagenSteuerung DOIF ( [Alarmanlage] eq "on" && [AliRF_673DD0:"motion"] && ( time() - time_str2num(ReadingsTimestamp("Alarmanlage","state","0")) > 60 ) )   ( set AlarmCountdown on; set FunkGong_MP3 playTone 001 )

DOELSEIF ( [Alarmanlage] eq "on" && [AlarmCountdown] eq "on" && ( time() - time_str2num(ReadingsTimestamp("AlarmCountdown","state","0")) > 17 ) ) ( set pushmsg msg 'fhem' 'Alarmanlage hat durch Haustür ausgelöst!'; {Alarm()} )

attr AlarmanlagenSteuerung do always


Hier könnte ich auch noch einen Tipp gebrauchen.

FHEM auf Ubuntu 18.04LTS, 2x nanoCUL, JeeLink, nanoPIR, MQTT, ESP-Easy, HUE.
Sensoren+Aktoren: HM, IT, Lacrosse, Multitrade-PIR, VU+, Somfy

thgorjup

Oder muss ich das in einem separaten DOIF machen?
FHEM auf Ubuntu 18.04LTS, 2x nanoCUL, JeeLink, nanoPIR, MQTT, ESP-Easy, HUE.
Sensoren+Aktoren: HM, IT, Lacrosse, Multitrade-PIR, VU+, Somfy

thgorjup

Ok, Lösung gefunden, die ich euch nicht vorenthalten will.

Ich löse beim Öffnen der Haustür einen Countdown aus:

define temp_alarm at +00:00:17 {Alarm("Haustür")}


Dieser wird durch die Fernbedienung wieder gelöscht:

...
fhem("delete temp_alarm");
fhem("set Alarmanlage off");
...


Somit wird die Auslösung des Alarmes verhindert. Dann braucht man auch keinen Dummy als Zwischenschritt.
FHEM auf Ubuntu 18.04LTS, 2x nanoCUL, JeeLink, nanoPIR, MQTT, ESP-Easy, HUE.
Sensoren+Aktoren: HM, IT, Lacrosse, Multitrade-PIR, VU+, Somfy