Kurze Frage zu einem Codeschnipsel

Begonnen von BenWend, 01 April 2013, 08:22:38

Vorheriges Thema - Nächstes Thema

BenWend

Hallo,

ich möchte mit FHEM eine Alarmanlage realisieren und habe mir im Wiki den artikel zur Alarmanlage durchgelesen. Da ich mit mit perl noch nicht auskenne, versuche ich mich Schritt für Schritt ranzutatsen.

Hat jemand eine Idee, was am unten genannten Code nicht richtig ist. FHEM zeigt zwar keinen Fehler an, es passiert aber auch nicht, wenn der Bewegungsmelder aktiviert wird:

Ich aktiviere die Alarmanlage in FHEM manuell mit

set anlage_status scharf

und hoffte, dass die funktioniert:


define anlage_status dummy
attr anlage_status room Waechter

define xxtestxx notify Bewegungsmelder_3:on.* {\
   if Value("anlage_status") eq "scharf" {\
   fhem ("set Wzvornerechts on");;\
   }\
else {\
   fhem ("set Wzvornelinks on");;\
   }\
}


Leider geht bei Aktivierung des Bewegungsmelders keine der Lampen an.

Vielleicht sieht einer von Euch ja mit einem Blick, was ich falsch gemacht habe.

Danke

Ben

eppi

Hallo Ben
Zitatdefine xxtestxx notify Bewegungsmelder_3:on.*

Bist du sicher, dass dein Bewegungsmelder ein "on" sendet?

Versuch mal (ohne das :on.*):
define xxtestxx notify Bewegungsmelder_3

Ansonsten mal die Log des Bewegungsmelders hier anhängen.
Viel Erfolg!

Gruss Dani

BenWend

Hallo Dani,

ja, der Bewegungsmelder sendet direkt on/off Befehle.

Dies hier klappt z.B.:

define Bewegungsmelderaktionan notify Bewegungsmelder_3:on.* {\
  fhem "set Testaktor on";;\
}


Un in den Logs sieht es auszugsweise folgendermaßen aus:

Zitat2013-04-01_08:50:26 Bewegungsmelder_3 light: on
2013-04-01_08:50:26 Bewegungsmelder_3 on
2013-04-01_08:50:41 Bewegungsmelder_3 light: off
2013-04-01_08:50:41 Bewegungsmelder_3 off
2013-04-01_14:55:24 Bewegungsmelder_3 light: on
2013-04-01_14:55:24 Bewegungsmelder_3 on
2013-04-01_14:55:39 Bewegungsmelder_3 light: off
2013-04-01_14:55:39 Bewegungsmelder_3 off

Es müsste also irgendwas an meinem Codeschnipsel falsch sein.

Schöne Grüße und vielen Dank

Ben


BenWend

Okay, so klappt es:

define test notify Bewegungsmeld.*:on.* \
{if (Value("anlage_status") eq "scharf"){fhem "set anlage_status alarm"} \
else \
{fhem "set anlage_status keinalarm"} \
}


Danke

Ben

BenWend

So und hier das kleine Alarmanlagenscript - das Beispiel im Wiki war mir als Anfänger zu kompliziert (hat aber trotzdem sehr geholfen).


#---- Alarmanlage

define anlage_status dummy
attr anlage_status room Waechter

define alarm_status dummy
attr alarm_status room Waechter

define sirenen_status dummy
attr sirenen_status room Waechter

define Alarmroutine notify Bewegungsmeld.*:on.* \
{if (Value("anlage_status") eq "scharf"){fhem "set alarm_status alarm"} \
else \
{fhem "set alarm_status keinalarm"} \
}

define Scharfschalten notify Testaktor:on.* {\
  fhem "set anlage_status scharfschalten;;sleep 10.0;;set anlage_status scharf";;\
}

define Unscharfschalten notify Testaktor:off.* {\
  fhem "set anlage_status unscharf";;\
  fhem "set alarm_status kein alarm";;\
  fhem "set sirenen_status aus";;\
}

define Alarmfall notify alarm_status:alarm {\
  fhem "set sirenen_status hauptalarm";;\
  fhem "set Brandmeld.* alert";;\
}


Funktioniert soweit ganz gut, wobei ich noch nicht die Nerven hatte, meine Rauchmelder (momentan sechs, bald neun) wirklich zu aktivieren.

Von hier aus möchte das Alarmanlagenscript jetzt weiter aufbauen (Voralarm/ Hauptalarm/ Mail versenden, alarmgebenden Raum erkennen und protokollieren, Statusanzeige einbinden[hier fehlt mir noch eine Idee, da die Anzeige kabellos und nicht auf einem Smartphone sein soll], etc.).

Im ersten Schritt werde ich im Alarmfall wohl nur mal eine Mail versenden und ein paar Tage testen :o)

Schöne Grüße

Ben

Nachtrag: Das erste Problem ist mir schon aufgefallen. Wenn ich während des Scharfschaltens (also innerhalb der 10 Sekunden) die Anlage unscharf schalte, wird sie nach 10 Sekunden dennoch scharf geschaltet. Habe es mir mit dem "sleep" wohl zu einfach gemacht :o)

Ändere ich die Zeile aber in

define Scharfschalten notify Testaktor:on.* {\
  fhem "set anlage_status scharfschalten;;sleep 10.0"}\
  {if (Value("anlage_status") eq "scharfschalten"){fhem "set anlage_status scharf"}\
}


so hängt FHEM einige Sekunden und nimmt nichts mehr an (vermutlich für die Dauer des sleeps). Ist das eigentlich ein normales Verhalten des "sleep" Befehls?


justme1968

hallo ben,

ja. sleep ist nicht das richtige. damit legst du fhem wirklich schlafen und es passiert nichts mehr.

statt dem sleep 10.0;;set anlage_status scharf kannst du dir z.b. mit define tmp_timer at +00:00:10 set anlage_status scharfeinen timer definieren der in 10 Sekunden deinen status setzt.

gruss
  andre
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

Zrrronggg!

Das Problem des verzögerten Scharfschaltens und was passiert wenn man in der Verzögerungszeit unscharf schaltet ist im Wikiartikel eigentlich ganz gut behandelt.

Grob legst du beim Scharfschalten ein weiteres define an, das in x Sekunden greift und erst dann wirklich scharf schaltet, und das löscht du, wenn du unscharf schaltest.
Z.B so wie justme1968  es oben darlegt.
Und wenn du unscharf schaltest dann kommt in Unscharf-Befehlskette auch ein "delete tmp_timer" vor.

Sleep ist eigentlich meistens keine gute Idee um solche Sacen (bzw IRGENDWELCHE Sachen zu lösen.)

Sieh dir doch einfach mal an, wie das da gemacht ist, dann brauch ich den Text nicht hier reinkopieren.

Ich sehe in deinem Alarmscript auch noch ein paar andere konzeptionelle Probleme, die dich ggf früher oder später ereilen... auch die sind im Wikiartikel mehr oder weniger alle adressiert.
Eventuell lohnt es sich doch, dem Artikel etwas mehr Zeit zu gönnen.
FHEM auf Linkstation Mini, CUL 868 SlowRF, 2xCUL 868 RFR, CUL 433 für IT, 2xHMLAN-Configurator mit VCCU, ITV-100 Repeater, Sender und Aktoren von FHT, FS20, S300, HM, IT, RSL