FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: Phill am 07 November 2014, 19:06:58

Titel: Geräte ohne Modulunterstützung mit Rückmeldungen richtig einbinden?!
Beitrag von: Phill am 07 November 2014, 19:06:58
Hallo,

ich wollte mich mal näher mit FHEM beschäftigen und bevor ich nun jetzt tiefer einsteige wollte ich mal wissen ob das was ich da entwickelt habe der richtige Ansatz ist, oder ob man es doch besser anders macht. Klar gibt's beim programmieren immer viele Wege zum Ziel aber manche sind dann doch besser oder haben zumindest Vorteile. Ich wäre euch für konstruktive Kritik sehr Dankbar.

Ausgangslage:
FHEM auf RasberryPi
Audio-Verstärker (Receiver) über USB-5V mit Spannungsteiler am GPIO des RasPi zur Gerätestatusabfrage
Funksteckdose am aktiven Subwoofer
LIRC Infrarotsender

Problemstellung:
Der Receiverstatus (EIN/AUS) soll in FHEM angezeigt werden und manuell oder über FHEM geschaltet werden.
Subwoofer soll anhand des Receiverstatus geschaltet werden.

Meine Lösung: (funktioniert, kommt mir aber irgendwie umständlich und unübersichtlich vor)

Receiverstatusabfrage:
define in_Receiver RPI_GPIO 9
attr in_Receiver direction input
attr in_Receiver interrupt both
attr in_Receiver room Wohnzimmer


dummy Receiverstatus zum schalten des Receivers
define hifi_sw_Receiver dummy
attr hifi_sw_Receiver devStateIcon Aus:off-for-timer Ein:on-for-timer
attr hifi_sw_Receiver room Wohnzimmer
attr hifi_sw_Receiver setList power:Ein,Aus,on,off
attr hifi_sw_Receiver webCmd Ein:Aus


notify's:
Receiver GPIO Überwachung
define n_in_Receiver notify in_Receiver {
Log 1, $NAME." - ".$EVENT;

if ("$EVENT" eq "on") {
Log 1, "Receiver Eingeschaltet";
fhem("set hifi_sw_Receiver on");
fhem("trigger hifi_sw_Subwoofer on");
}
if ("$EVENT" eq "off") {
Log 1, "Receiver Ausgeschaltet";
fhem("set hifi_sw_Receiver off");
fhem("trigger hifi_sw_Subwoofer off");
}
}


FHEM Bedienungsüberwachung
define n_hifi_sw_Receiver notify hifi_sw_Receiver {
Log 1, $NAME." - ".$EVENT;
if ("$EVENT" eq "Ein") {
  if (Value('in_Receiver') eq "on") {
     fhem("set hifi_sw_Receiver on");
   } else {
     Log 1, "Receiver Einschalten";
      system('/usr/local/bin/irsend SEND_ONCE onkyo on');
   }
  }

if ("$EVENT" eq "Aus") {
if (Value('in_Receiver') eq "off") {
  fhem("set hifi_sw_Receiver off");
} else {
  Log 1, "Receiver Ausschalten";
   system('/usr/local/bin/irsend SEND_ONCE onkyo stdby');
}
}
fhem("define a_hifi_sw_Receiver at +00:00:08 IF ([hifi_sw_Receiver] ne [in_Receiver]) ( set hifi_sw_Receiver fail )");
}


Erklärung:
Man drückt auf der FHEM-Oberfläche auf Ein, dadurch wird das Lampensymbol mit einer Uhr versehen.
"Wenn" der Receiver jetzt eingegangen ist wird über die GPIO Überwachung das Symbol auf die gelbe Lampe gesetzt.
Genau so in die Aus-Richtung.
Wird nach 8 Sekunden der on oder off Status nicht gesetzt geht der Receiverstatus auf "fail".

Mein größtes Problem war das die Rückmeldung des Receivers irgendwie eingebunden werden musste, ist das so Sinvoll? Bevor ich jetzt groß weiter mache würde ich gerne wissen ob das die richtige herangehensweise ist, weil als nächstes sollte das IR-signal die kompletten 8 Sekunden gesendet werden. Und da hatte ich schon meine Schwierigkeiten.

Danke schon mal im Vorraus!
Titel: Antw:Geräte ohne Modulunterstützung mit Rückmeldungen richtig einbinden?!
Beitrag von: Phill am 10 November 2014, 01:22:21
Also das Thema lässt mich irgendwie nicht los. Ich vermute ich habe da nur irgendeine funktion übersehen, das muss doch einfacher gehen. Ich versuche mal die problematik etwas algemeiner zu verfassen.

Die funktion die ich benötige oder das modul das ich suche soll einen beliebigen schaltvorgang managen. Der schaltvorgang soll nachdem er angefordert wird ausgelöst werden. Jetzt wird auf eine bestimmte rückmeldung gewartet, tritt diese ein wird der schaltvorgang abgeschlossen. Tritt die rückmeldung nach einer gewissen zeit nicht ein wird ein error handler ausgelöst.

Das ist so eine universelle und häufig benötigte grundfunktion, die muss es doch als modul geben!? Ich habe versucht es noch anders wie oben zu lösen u.a. mit DOIF und watchdog, aber wirklich übersichtlicher ist das auch nicht geworden.
kann mir einer sagen ob es da etwas gibt? Ansonsten mach ich mich ran und pack das in ein modul.

Gruß.
Titel: Antw:Geräte ohne Modulunterstützung mit Rückmeldungen richtig einbinden?!
Beitrag von: Phill am 10 November 2014, 16:42:00
Ok, "DOIF" scheint wohl doch das beste für mein Problem zu sein, habe mir den Befehl nochmal genauer angeschaut.

Meine jetztige Lösung (v3)  ;D hier beispielsweise für einen Fernseher.

Man benötigt einen dummy (hifi_sw_TV)
define hifi_sw_TV dummy
attr hifi_sw_TV setList power:ondone,offdone,on,off
attr hifi_sw_TV webCmd on:off
attr hifi_sw_TV devStateIcon off:off-for-timer on:on-for-timer ondone:on offdone:off error:set_off


und ein DOIF (di_hifi_sw_TV)
define di_hifi_sw_TV DOIF ([hifi_sw_TV] eq "on") (\
"/usr/local/bin/irsend SEND_ONCE Samsung_BN59-01014A PowerOn",\
IF ([in_TV] eq "on") (define a at +00:00:01 trigger in_TV on)\
)\
DOELSEIF ([hifi_sw_TV] eq "off") (\
"/usr/local/bin/irsend SEND_ONCE Samsung_BN59-01014A PowerOff",\
IF ([in_TV] eq "off") (define b at +00:00:01 trigger in_TV off)\
)\
DOELSEIF ([in_TV] eq "on") (\
set hifi_sw_TV ondone\
) \
DOELSEIF ([in_TV] eq "off") (\
set hifi_sw_TV offdone\
) \
DOELSEIF ([di_hifi_sw_TV:cmd_nr] < 3) (\
set hifi_sw_TV error\
)\

attr di_hifi_sw_TV wait 0:0:0:0:8


Das ist schon viel eher nach meinem Geschmack, vor allem da man es relativ einfach auf andere Anwendungen übertragen kann.
Erklärung:
Der dummy ist zur Anzeige und zum schalten von der FHEM Oberfläche des Gerätes (hier ein TV über den shell command irsend) da.
Das "DOIF" di_hifi_sw_TV überwacht und managed die Zustände. Im 1. Kommandobereich des "DOIF" wird die Handlung zum einschalten des TV's ausgelöst und falls der TV schon AN ist die Rückmeldung AN getriggert. Im 2. Bereich das selbe für AUS.
In der Bedingung des 3. und 4. Bereichs werden die Rückmeldungen überwacht und der dummy auf ondone bzw. offdone als Bestätigung des Abschlusses gesetzt.
Bleibt es jetzt aus irgendeinem Grund in den ersten zwei Bereichen länger als 8 Sekunden stehen, wird der Status vom dummy auf error gesetzt.
Jetzt ist es auch einfach noch weitere Kommandos hinzuzufügen.

Ich musste komischerweise den trigger eine Sekunde verzögern, da DOIF trotz das es die Kommandos 3 und 4 ausführt die cmd_nr noch auf den ersten beiden stehen blieb, das führte dazu das der Fehlerstatus immer gesetzt wurde. Erst bei einer Verzögerung wurden die readings richtig gesetzt.

Ein Intervall für die ausführenden Befehle ist aber leider noch nicht integriert.

Liest das hier überhaupt jemand???  ;)

Gruß