Telefonat als Auslöser für Aktionen: Unterschied zwischen den Versionen

Aus FHEMWiki
(Artikel als Stub mit Verweis auf den entsprechenden Thread im Forum angelegt.)
 
(erster Versuch)
Zeile 1: Zeile 1:
=In Bearbeitung=
Zur Zeit nur ein Verweis auf einen Thread im Forum: [http://forum.fhem.de/index.php?t=msg&goto=79817&rid=932] - eine ausführliche Diskussion über die Möglichkeiten, mit einem Telefonanruf bestimmte Aktionen auszulösen. Dabei geht es unter anderem auch um
Zur Zeit nur ein Verweis auf einen Thread im Forum: [http://forum.fhem.de/index.php?t=msg&goto=79817&rid=932] - eine ausführliche Diskussion über die Möglichkeiten, mit einem Telefonanruf bestimmte Aktionen auszulösen. Dabei geht es unter anderem auch um
* Signalisierung eines Anrufs durch Licht
* Signalisierung eines Anrufs durch Licht
Zeile 5: Zeile 7:


Diese Informationen und Codeschnippsel sollen Wiki-gerecht aufbereitet hier zur Verfügung gestellt werden.
Diese Informationen und Codeschnippsel sollen Wiki-gerecht aufbereitet hier zur Verfügung gestellt werden.
==Beschreibung==
*Eine [[AVM_Fritz!Box]] dient als Zentrale für zwei Familien mit jeweils eigener Rufnummer
*FHEM läuft auf einem Raspberry Pi
*Bei einkommenden Anrufen auf eine der beiden Nummern (im Skript die 1234567) soll:
**der Fernseher das laufende Programm pausieren (beim stumm-schalten verpasste man ja den Film ;) )
**das Licht angehen (damit man im Dunkeln das Telefon leichter findet, vorausgesetzt es ist überhaupt dunkel)
*Nach dem Telefonat soll:
**ein 10-sekündiger Timer laufen (damit man Zeit hat sich wieder gemütlich vor den Fernseher zu setzen)
**der Fernseher weiterlaufen
**das Licht seinen Ursprungszustand wieder einnehmen (=sollte es vor dem Telefonat an gewesen sein, soll es nach dem Telefonat natürlich an bleiben)
==Eingesetzte Geräte==
*[http://fhem.de/commandref.html#FB_CALLMONITOR FritzBox mit dem Callmonitor Helpermodul]
**Fritz_Box (<=Bezeichnung im Skript)
*[http://www.fhemwiki.de/wiki/HM-Sen-MDIR-O_Funk-IR-Bewegungsmelder_au%C3%9Fen HM Bewegungsmelder außen] (der einen unabhängigen Helligkeitswert liefert)
**CUL_HM_HM_Sen_MDIR_O_1A8306 (<=Bezeichnung im Skript)
*SamsungTV (zur Zeit noch mit dem [http://forum.fhem.de/index.php?t=msg&th=12988&start=0&rid=0 Codeschnipsel] aus dem Forum)
**STV4 (<=Bezeichnung im Skript)
==so funktioniert es==
Anruf beginnt
*da lokale Variablen nur innerhalb eines Notifies Gültigkeit haben, werden für den Lichtstatus zwei Dummy-Devices eingerichtet
*ein Notify wird vom Callmonitor getriggert
*die Zielrufnummer wird geprüft (siehe oben, 2 Familien, 2 Telefonnummern, 1 FritzBox)
*die Helligkeit wird ausgelesen
*der Status vom Licht wird erfasst
*Prüfung, ob Telefonat für die richtige Familie ist (läutet es auf der anderen Nummer, interessiert es nicht)
*TV Pause Befehl
*prüfen ob die Helligkeit einen Schwellenwert unterschreitet (100 hat sich in meinem Fall als guter Wert herausgestellt)
*das Dummy Device wird mit dem aktuellen Lichtzustand gefüttert
*das Licht wird eingeschaltet
Anruf beendet
*Notify auf beenden des Anrufs
*der Lichtzustand jetzt wird gesichert
*der alte Lichtzustand wird vom Dummy Device abgefragt
*Prüfung ob das Telefonat mit der richtigen Nummer gehalten wurde (=das gleiche wie oben auch)
*mit 10 Sekunden Verzögerung geht der Fernseher wieder auf Play
*Prüfung, ob der alte Lichtzustand nicht identisch mit dem Neuen ist
*mit 10 Sekunden Verzögerung Licht aus
==Code==
In der fhem.cfg
<nowiki>
#### Meine eigenen Dummys
define Licht_Alt dummy
define Licht_Neu dummy
## Jemand ruft mich an
define TelefonAN notify Fritz_Box:event:.ring { \
  my $number=(ReadingsVal("Fritz_Box","internal_number",99));;\
  my $Helligkeit=(ReadingsVal("CUL_HM_HM_Sen_MDIR_O_1A8306","brightness",99));;\
  my $Licht_An=Value("OG_wz_WS_LICHT");;\
  if ($number == 1234567) { \
    fhem "set STV4 PAUSE";;\
    if ($Helligkeit <= 100) { \
      fhem ("set Licht_Alt on") if (($Licht_An) eq "on");;\
      fhem ("set OG_wz_WS_LICHT on") if (($Licht_An) ne "on");;\
    } \
  } \
}
## Anruf beendet
define TelefonAUS notify Fritz_Box:event:.disconnect { \
  my $number=(ReadingsVal("Fritz_Box","internal_number",99));;\
  my $Licht_Neu=Value("OG_wz_WS_LICHT");;\
  my $Licht_Alt=Value("Licht_Alt");;\
  if ($number == 1234567) { \
    fhem "define Latenz2 at +00:00:10 set STV4 PLAY";;\
    if ($Licht_Alt ne $Licht_Neu) { \
      fhem "define Latenz at +00:00:10 set OG_wz_WS_LICHT off";;\
    }\
  }\
}
</nowiki>
==Optimierungsmöglichkeiten==
*der Lichtzustand könnte über [http://fhem.de/commandref.html#LightScene LightScene] eleganter gelöst werden
**nämlich den Zustand speichern, am Schluss wieder laden; könnte so auch Dimmer und mehrere Lichter elegant erfassen
*Prüfung, ob der Fernseher überhaupt eingeschaltet ist ([http://fhem.de/commandref.html#PRESENCE PRESENCE] auf die IP vom TV), um Fehlermeldungen im Log zu vermeiden(ist er nämlich aus, gibt es eine Fehlermeldung im Log, dass nicht auf Play/Pause geschaltet werden kann)
*das .disconnect ist suboptimal, wenn man selber einen Anruf getätigt hat (da greift nur das 2te Notify, es lässt also auf den laufenden Fernseher einen Play Befehl los, was eine Timeshift-Einblendung im laufenden Bild erzeugt;
**ist nur ein optisches Problem, aber dennoch ist es halt da
==Dank==
Besonderer Dank geht an Puschel, der doch reichlich Geduld bewiesen hat :)





Version vom 18. Juli 2013, 14:48 Uhr

In Bearbeitung

Zur Zeit nur ein Verweis auf einen Thread im Forum: [1] - eine ausführliche Diskussion über die Möglichkeiten, mit einem Telefonanruf bestimmte Aktionen auszulösen. Dabei geht es unter anderem auch um

  • Signalisierung eines Anrufs durch Licht
  • Aktionen abhängig von der Rufnummer des Anrufers
  • FHEM auf Fritz!Box und/oder Raspberry Pi

Diese Informationen und Codeschnippsel sollen Wiki-gerecht aufbereitet hier zur Verfügung gestellt werden.


Beschreibung

  • Eine AVM_Fritz!Box dient als Zentrale für zwei Familien mit jeweils eigener Rufnummer
  • FHEM läuft auf einem Raspberry Pi
  • Bei einkommenden Anrufen auf eine der beiden Nummern (im Skript die 1234567) soll:
    • der Fernseher das laufende Programm pausieren (beim stumm-schalten verpasste man ja den Film ;) )
    • das Licht angehen (damit man im Dunkeln das Telefon leichter findet, vorausgesetzt es ist überhaupt dunkel)
  • Nach dem Telefonat soll:
    • ein 10-sekündiger Timer laufen (damit man Zeit hat sich wieder gemütlich vor den Fernseher zu setzen)
    • der Fernseher weiterlaufen
    • das Licht seinen Ursprungszustand wieder einnehmen (=sollte es vor dem Telefonat an gewesen sein, soll es nach dem Telefonat natürlich an bleiben)


Eingesetzte Geräte


so funktioniert es

Anruf beginnt

  • da lokale Variablen nur innerhalb eines Notifies Gültigkeit haben, werden für den Lichtstatus zwei Dummy-Devices eingerichtet
  • ein Notify wird vom Callmonitor getriggert
  • die Zielrufnummer wird geprüft (siehe oben, 2 Familien, 2 Telefonnummern, 1 FritzBox)
  • die Helligkeit wird ausgelesen
  • der Status vom Licht wird erfasst
  • Prüfung, ob Telefonat für die richtige Familie ist (läutet es auf der anderen Nummer, interessiert es nicht)
  • TV Pause Befehl
  • prüfen ob die Helligkeit einen Schwellenwert unterschreitet (100 hat sich in meinem Fall als guter Wert herausgestellt)
  • das Dummy Device wird mit dem aktuellen Lichtzustand gefüttert
  • das Licht wird eingeschaltet

Anruf beendet

  • Notify auf beenden des Anrufs
  • der Lichtzustand jetzt wird gesichert
  • der alte Lichtzustand wird vom Dummy Device abgefragt
  • Prüfung ob das Telefonat mit der richtigen Nummer gehalten wurde (=das gleiche wie oben auch)
  • mit 10 Sekunden Verzögerung geht der Fernseher wieder auf Play
  • Prüfung, ob der alte Lichtzustand nicht identisch mit dem Neuen ist
  • mit 10 Sekunden Verzögerung Licht aus


Code

In der fhem.cfg

#### Meine eigenen Dummys
define Licht_Alt dummy
define Licht_Neu dummy


## Jemand ruft mich an
define TelefonAN notify Fritz_Box:event:.ring { \
  my $number=(ReadingsVal("Fritz_Box","internal_number",99));;\
  my $Helligkeit=(ReadingsVal("CUL_HM_HM_Sen_MDIR_O_1A8306","brightness",99));;\
  my $Licht_An=Value("OG_wz_WS_LICHT");;\
  if ($number == 1234567) { \
    fhem "set STV4 PAUSE";;\
    if ($Helligkeit <= 100) { \
      fhem ("set Licht_Alt on") if (($Licht_An) eq "on");;\
      fhem ("set OG_wz_WS_LICHT on") if (($Licht_An) ne "on");;\
    } \
  } \
}



## Anruf beendet
define TelefonAUS notify Fritz_Box:event:.disconnect { \
  my $number=(ReadingsVal("Fritz_Box","internal_number",99));;\
  my $Licht_Neu=Value("OG_wz_WS_LICHT");;\
  my $Licht_Alt=Value("Licht_Alt");;\
  if ($number == 1234567) { \
    fhem "define Latenz2 at +00:00:10 set STV4 PLAY";;\
    if ($Licht_Alt ne $Licht_Neu) { \
      fhem "define Latenz at +00:00:10 set OG_wz_WS_LICHT off";;\
    }\
  }\
}


Optimierungsmöglichkeiten

  • der Lichtzustand könnte über LightScene eleganter gelöst werden
    • nämlich den Zustand speichern, am Schluss wieder laden; könnte so auch Dimmer und mehrere Lichter elegant erfassen
  • Prüfung, ob der Fernseher überhaupt eingeschaltet ist (PRESENCE auf die IP vom TV), um Fehlermeldungen im Log zu vermeiden(ist er nämlich aus, gibt es eine Fehlermeldung im Log, dass nicht auf Play/Pause geschaltet werden kann)
  • das .disconnect ist suboptimal, wenn man selber einen Anruf getätigt hat (da greift nur das 2te Notify, es lässt also auf den laufenden Fernseher einen Play Befehl los, was eine Timeshift-Einblendung im laufenden Bild erzeugt;
    • ist nur ein optisches Problem, aber dennoch ist es halt da


Dank

Besonderer Dank geht an Puschel, der doch reichlich Geduld bewiesen hat :)


Links


Todo: Informationen aus dem Forenthread konsolidieren und für das Wiki aufbereiten.