ERLEDIGT: Fehler bei FHEM2FHEM RAW - Umsetzung / benötige Hilfe

Begonnen von Grinsekatze, 21 Juni 2016, 19:11:31

Vorheriges Thema - Nächstes Thema

Grinsekatze

#15
So, ich habe jetzt eine Version fertig, die bereits alles tut, jedoch noch etwas Optimierung bedarf.


  • Ich möchte die zwei FHEM2FHEM-Definitionen pro System zu einer pro System ändern - der erste Versuch brachte jedoch offenbar eine Endlosschleife. :D
  • Ich möchte die zwei Notifys Notify_FernseherWohnzimmerPowerOn und Notify_FernseherWohnzimmerPowerOff zu einem zusammenfassen - das hatte aber zur Folge, dass der neue Notify nicht, wie gewünscht abgearbeitet wird, auch wegen dem nächten Punkt.
  • Ich möchte noch die Dummys FernseherWohnzimmerPower und FernseherWohnzimmerPower_remote synchronisieren, sodass beide immer den richtigen Zustand anzeigen - das funktioniert jedoch nicht, da der STATE-Zustand nicht von FHEM2FHEM synchronisiert wird.

Remote-System (Pi 3 am TV):
define FernseherWohnzimmerPower dummy
attr FernseherWohnzimmerPower setList state:on,off
attr FernseherWohnzimmerPower webCmd on:off
attr FernseherWohnzimmerPower room Wohnzimmer
attr FernseherWohnzimmerPower comment Dummy um den Wohnzimmer-Fernseher ein- oder auszuschalten

define Notify_FernseherWohnzimmerPowerOn notify (FernseherWohnzimmerPower|FernseherWohnzimmerPower_remote):on {system("echo 'on 0' | sudo /usr/osmc/bin/cec-client -s -d 1 &")}
define Notify_FernseherWohnzimmerPowerOff notify (FernseherWohnzimmerPower|FernseherWohnzimmerPower_remote):off {fhem("set FernseherWohnzimmer power off")}
#define Notify_FernseherWohnzimmerPower notify (FernseherWohnzimmerPower|FernseherWohnzimmerPower_remote) {\
#    if ((ReadingsVal("FernseherWohnzimmerPower", "state", "undefined") eq "on") && (ReadingsVal("FernseherWohnzimmerPower_remote", "state", "undefined") eq "on")) {\
#     system("echo 'on 0' | sudo /usr/osmc/bin/cec-client -s -d 1 &")\
# }\
# elsif ((ReadingsVal("FernseherWohnzimmerPower", "state", "undefined") eq "off") && (ReadingsVal("FernseherWohnzimmerPower_remote", "state", "undefined") eq "off")) {\
#     fhem("set FernseherWohnzimmer power off")\
# }\
#}
#attr Notify_FernseherWohnzimmerPower comment Notify um den Wohnzimmer-Fernseher ein- oder auszuschalten

define FernseherWohnzimmer LGTV_RS232 /dev/ttyUSB0
attr FernseherWohnzimmer event-on-change-reading .*
attr FernseherWohnzimmer room Wohnzimmer
attr FernseherWohnzimmer comment LG 55 Zoll TV im Wohnzimmer

define Notify_FernseherWohnzimmer notify FernseherWohnzimmer_remote set FernseherWohnzimmer $EVENT
attr Notify_FernseherWohnzimmer comment Notify um den Wohnzimmer-Fernseher fernzusteuern

define FernseherWohnzimmerPower_remote2FernseherWohnzimmerPower FHEM2FHEM Smarthome:7072 LOG:FernseherWohnzimmerPower_remote
attr Notify_FernseherWohnzimmer comment Verbinden der zwei Dummys vom Remote- und Hauptsystem um den Wohnzimmer-Fernseher ein- oder auszuschalten

define FernseherWohnzimmer_remote2FernseherWohnzimmer FHEM2FHEM Smarthome:7072 LOG:FernseherWohnzimmer_remote
attr Notify_FernseherWohnzimmer comment Verbinden des TV-Moduls und Dummys vom Remote- und Hauptsystem um den Wohnzimmer-Fernseher fernzusteuern


Hauptsystem (Pi 2 der das gesamte Smarthome steuert):
define FernseherWohnzimmerPower_remote dummy
attr FernseherWohnzimmerPower_remote room Wohnzimmer
attr FernseherWohnzimmerPower_remote setList state:on,off
attr FernseherWohnzimmerPower_remote webCmd on:off
attr FernseherWohnzimmerPower_remote comment Dummy um den Wohnzimmer-Fernseher ein- oder auszuschalten


define FernseherWohnzimmerPower2FernseherWohnzimmerPower_remote FHEM2FHEM Wohnzimmer:7072 LOG:FernseherWohnzimmerPower
define FernseherWohnzimmer2FernseherWohnzimmer_remote FHEM2FHEM Wohnzimmer:7072 LOG:FernseherWohnzimmer


define FernseherWohnzimmer_remote dummy
attr FernseherWohnzimmer_remote event-on-change-reading .*
attr FernseherWohnzimmer_remote room Wohnzimmer
attr FernseherWohnzimmer_remote setList energy_saving:auto,max,off input:digitalTV,hdmi1,hdmi2,hdmi3,video1,video2 power:on,off screen_mute:on,off statusRequest volume:00,01,02,03,04,05,06,07,08,09,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30 volume_mute:on,off volume_step:down,up
attr FernseherWohnzimmer_remote comment Dummy um den Wohnzimmer-Fernseher fernzusteuern


define Notify_FernseherWohnzimmer_remote notify FernseherWohnzimmer { $EVENT=~s/://;;;; fhem("setreading FernseherWohnzimmer_remote $EVENT") ;;;;\
    my $FernseherWohnzimmer_CommandAccepted= ReadingsVal("FernseherWohnzimmer_remote","CommandAccepted","") ;;;;\
    my $FernseherWohnzimmer_aspectRatio= ReadingsVal("FernseherWohnzimmer_remote","aspectRatio","") ;;;;\
    my $FernseherWohnzimmer_input= ReadingsVal("FernseherWohnzimmer_remote","input","") ;;;;\
    my $FernseherWohnzimmer_power= ReadingsVal("FernseherWohnzimmer_remote","power","") ;;;;\
    my $FernseherWohnzimmer_presence= ReadingsVal("FernseherWohnzimmer_remote","presence","") ;;;;\
    my $FernseherWohnzimmer_screenMute= ReadingsVal("FernseherWohnzimmer_remote","screenMute","") ;;;;\
    my $FernseherWohnzimmer_state= ReadingsVal("FernseherWohnzimmer_remote","state","") ;;;;\
    my $FernseherWohnzimmer_videoOutMute= ReadingsVal("FernseherWohnzimmer_remote","videoOutMute","") ;;;;\
    my $FernseherWohnzimmer_volume= ReadingsVal("FernseherWohnzimmer_remote","volume","") ;;;;\
    my $FernseherWohnzimmer_volumeMute= ReadingsVal("FernseherWohnzimmer_remote","volumeMute","") ;;;;\
#    fhem("setreading FernseherWohnzimmer_remote state $FernseherWohnzimmer_state")\
}
attr Notify_FernseherWohnzimmer_remote comment Notify, notwendig um die Werte des Original-Moduls auf dem Remote-Dummy abzulegen, um den Wohnzimmer-Fernseher fernzusteuern


define Notify_FernseherWohnzimmerPower_remote notify FernseherWohnzimmerPower { $EVENT=~s/://;;;; fhem("setreading FernseherWohnzimmerPower_remote $EVENT") ;;;;\
    my $FernseherWohnzimmerPower_state= ReadingsVal("FernseherWohnzimmerPower_remote","state","") ;;;;\
    fhem("setreading FernseherWohnzimmerPower_remote state $FernseherWohnzimmerPower_state")\
}
attr Notify_FernseherWohnzimmerPower_remote comment Notify, notwendig um die Werte des Original-Dummys auf dem Remote-Dummy abzulegen, um den Wohnzimmer-Fernseher ein- oder auszuschalten



Edit:
Um die Dummys zu synchronisieren kann folgendes eingetragen werden:
Remotesystem:
define Notify_FernseherWohnzimmerPowerSync notify FernseherWohnzimmerPower_remote set FernseherWohnzimmerPower $EVENT

Hauptsystem:
define Notify_FernseherWohnzimmerPowerSync_remote notify FernseherWohnzimmerPower set FernseherWohnzimmerPower_remote $EVENT

bergadler

Also wenn ich jetzt nicht wieder was verdrehe, sollte der Empfang nur dieser beiden Eventtypen

define FernseherWohnzimmerPower_remote2FernseherWohnzimmerPower FHEM2FHEM Smarthome:7072 LOG:FernseherWohnzimmerPower_remote
define FernseherWohnzimmer_remote2FernseherWohnzimmer FHEM2FHEM Smarthome:7072 LOG:FernseherWohnzimmer_remote


auf dem Remote so funktionieren:

define remote_Smarthome FHEM2FHEM Smarthome:7072 LOG:(FernseherWohnzimmerPower_remote.*|FernseherWohnzimmer_remote.*)

Die Gegenrichtung dann nach dem gleichen Schema.

Gruß
aktuelles FHEM auf Raspberry B+, FHEM von fhem.de V.5.7, CUL868 V1.57, (6x FHT80B+ FHTTK, div. IT,div. FS20,Harmony Hub)

Grinsekatze

LOL, daran hab ich an dieser Stelle überhauptnicht gedacht. So mach ich es schon länger etwa bei Notifys. Irgendwie hatte ich was wie FernseherWohnzimmer.* im Kopf.

Da ist es gut, wenn auch mal Jemand mit etwas Abstand draufguckt.

Danke!

marvin78

Warum wurde der RFHEM Hinweis oben eigentlich konstant ignoriert?

Grinsekatze

Zitat von: marvin78 am 24 Juni 2016, 11:54:48Warum wurde der RFHEM Hinweis oben eigentlich konstant ignoriert?

Zufall. Ich habe mit FHEM2FHEM begonnen, daher habe ich gehofft, damit auch erste Resultate zu bekommen. Ich werde mir RFHEM aber auch mal ansehen - vielleicht geht's ja leichter.

Ein PRoblem habe ich zzt. mit FHEM2FHEM: Es liest nicht den state (weder Internals noch Readings) aus. Gibt's da irgendwie ein Tipp?

bergadler

Zitat...  Es liest nicht den state (weder Internals noch Readings) aus.
FHEM2FHEM schickt eben "nur" Events weiter.

Also z.B. mittels Dummy ein entsprechendes Event generieren und dies auf dem Remote per Log:xy auswerten.
aktuelles FHEM auf Raspberry B+, FHEM von fhem.de V.5.7, CUL868 V1.57, (6x FHT80B+ FHTTK, div. IT,div. FS20,Harmony Hub)

Grinsekatze

Ich habe nun alles, wie im Wiki beschrieben umgesetzt (spez. den Notify um den Dummy mit Werten zu füllen). Dabei ist mir jedoch etwas merkwürdiges aufgefallen:

Sobald ich am Modul ein Wert ändere, z.B. die Lautstärke, wird es auch im Dummy übernommen ABER danach das Reading sekündlich neu im Dummy geschrieben (immer mit dem selben Wert). Das Obwohl ich zusätzlich ein event-on-change im Modul und Dummy hinterlegt habe.

marvin78

Es ist doch im Grunde ganz einfach. Statt mit notifies etc. zu arbeiten, verwenden man einfach FHEM2FHEM (ggf. in Kombination mit cloneDummy) für die ankommenden Events und RFHEM um auf einem Remote-System etwas zu schalten. Ganz so schwer ist das nicht.

Grinsekatze

Naja, ich probiere gerade mal die Umsetzung mit cloneDummy und RFHEM (auch wenn ich lieber offizielle Module verwende). Dabei habe ich auch einige negative Aspekte bemerkt:
- Der State wird von cloneDummy verfremdet: So ist er defined/active. Es ist also erstmal nicht erkennbar, ob der Clone z.B. on oder off ist.
- Ich kann den Clone nicht direkt schalten, da u.a. kein setList definiert werden kann.

Daher denke ich, ist die cloneDummy-Lösung nicht wirklich brauchbarer - da ich dann eh zusätzliche Notifys und weitere Dummys anlegen muss. Das macht es dann unübersichtlich.

marvin78

Wofür sollen denn die weiteren dummyS sein? Maximal einer reicht. Den Rest versteckt man dann ggf. im hiddenroom und nichts ist unübersichtich. Ein wenig Phantasie ist natürlich schon notwendig. Eine fertige Lösung wird dir keiner bauen.

Grinsekatze

#25
Die Unübersichtlichkeit entsteht eher dadurch, dass ich dann mehrere Dummys benötige um 1 Gerät zu bedienen (geklonte Dummys vom Modul und PowerOn/Off, da diese dann aber nicht bedienbar sind für jedes noch je ein weiterer Dummy zum bedienen - etwa mittels RFHEM). Da ich auf dem Host jedoch sowohl die aktuellen zustände sehen, als auch die Bedienung durchführen möchte hilft es nicht, die Dummys zu verstecken.

Ich habe (oder besser hatte!) nun jedoch eine schöne Lösung gefunden:

Ich leg auf dem zu steuernden System / Remotesystem (TV-Pi) das Modul an, ein Dummy für Power On/Off (da dort nur mittels CEC angeschaltet werden kann und nicht über das Modul) und je ein Notify, für On, Off und um den Zustand des States vom Dummy und Modul zu synchronisieren (falls z.B. mal Jemand mit der Fernbedienung an oder aus macht).

Auf dem Hauptsystem habe/hatte ich dann 2 Dummys um Modul und Dummy des Remotesystems zu klonen. F2F, RFHEM und je ein Notify um die beiden Dummys mit Werten vom Remotesystem zu füllen sowie auf das Schalten des der beiden Dummys zu reagieren (mit RFHEM).

Leider musste ich jedoch gerade feststellen, dass mir gut 100 Zeilen Code aus der fhem.cfg abhanden gekommen sind. Nachdem ich sie dann ein zweites Mal vom Webfrontend geöffnet habe waren es bereits 500 Zeilen! Es ist also alles das, was ich auf dem Hauptsystem generiert habe weg, sowie ein paar weitere Sachen auch.  >:(
Das muss ich jetzt erstmal lösen, danach poste ich mal meine Lösung (ich hoffe nur, ich bekomm es wieder so hübsch zusammen).


Edit:
So, wie es aussieht, hat es meinen Pi2 zerchossen - keine Ahnung warum, doch er ist tot. Bei Strom leuchten zwar alle Lampen (rot & grün), doch weder der WLAN-Stick leuchtet blau, noch kann ich mich via SSH einwähllen, ist er im Netzwerk angezeigt, funktioniert die USB-Tastatur oder bekomme ich ein Signal am HDMI-Port. ... also ein neuen kaufen ...  :'(

Grinsekatze

#26
So, der neue Pi ist da und das System wieder aufgesetzt.

Ich habe noch einmal mein letzten Versuch überarbeitet und nun eine sehr schlanke Lösung gefunden.

Benötigt werden ein HDMI-Kabel (für die CEC-Steuerung, da mein LG Fernseher sich nicht über RS232 aufwecken lässt), Ein RS232-USB-Adapter (es sind eigentlich 2 Kabel, zur Steuerung des TV) und ein zweiten Pi.

Auf dem Remotesystem (dem 2. Pi, der am TV angeschlossen ist) wird ein cec-client benötigt. Ich verwende als Betriebssystem OSMC, da ist der gleich mit installiert. Wird ein anderes Betriebssystem benutzt, dann muss ggf. auch der Pfad in der fhem.cfg zum Client angepasst werden, hier /usr/osmc/bin/cec-client!

In FHEM ist es dann so abgebildet (ggf. den Pfad zum Remotesystem, hier Wohnzimmer, anpassen):
Remotesystem:
define FernseherWohnzimmer LGTV_RS232 /dev/ttyUSB0
attr FernseherWohnzimmer comment LG 55 Zoll TV im Wohnzimmer
attr FernseherWohnzimmer event-on-change-reading .*
attr FernseherWohnzimmer room Wohnzimmer
attr FernseherWohnzimmer webCmd power

define Notify_FernseherWohnzimmerOn notify FernseherWohnzimmer:power.on {system("echo 'on 0' | sudo /usr/osmc/bin/cec-client -s -d 1 &")}


Hauptsystem:
define FernseherWohnzimmer_reomote dummy
attr FernseherWohnzimmer_reomote comment Dummy um den Wohnzimmer-Fernseher fernzusteuern
attr FernseherWohnzimmer_reomote event-on-change-reading .*
attr FernseherWohnzimmer_reomote room Wohnzimmer
attr FernseherWohnzimmer_reomote setList energy_saving:auto,max,off input:digitalTV,hdmi1,hdmi2,hdmi3,video1,video2 power:on,off screen_mute:on,off statusRequest volume:00,01,02,03,04,05,06,07,08,09,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30 volume_mute:on,off volume_step:down,up
attr FernseherWohnzimmer_reomote userReadings FernseherWohnzimmer:CommandAccepted.*, FernseherWohnzimmer:aspectRatio.*, FernseherWohnzimmer:input.*, FernseherWohnzimmer:power.*, FernseherWohnzimmer:presence.*, FernseherWohnzimmer:screenMute.*, FernseherWohnzimmer:videoOutMute.*, FernseherWohnzimmer:volume.*, FernseherWohnzimmer:volumeMute.*
attr FernseherWohnzimmer_reomote DbLogExclude .*

define RemoteWohnzimmerLog FHEM2FHEM wohnzimmer:7072 LOG:(FernseherWohnzimmer.*)
attr RemoteWohnzimmerLog comment Verbindung zum Wohnzimmer-Computer, um die für die TV-Fernsteuerung nötigen Daten auszulesen

define RemoteWohnzimmer RFHEM wohnzimmer:7072
attr RemoteWohnzimmer comment Verbindung zum Wohnzimmer-Computer, um den Fernseher fernzusteuern

define Notify_FernseherWohnzimmer notify FernseherWohnzimmer.* {\
    $EVENT=~s/://;;;;\
    fhem("setreading FernseherWohnzimmer_reomote $EVENT") ;;;;\
    my $FernseherWohnzimmer_CommandAccepted= ReadingsVal("FernseherWohnzimmer_reomote","CommandAccepted","undefined") ;;;;\
    my $FernseherWohnzimmer_aspectRatio= ReadingsVal("FernseherWohnzimmer_reomote","aspectRatio","undefined") ;;;;\
    my $FernseherWohnzimmer_input= ReadingsVal("FernseherWohnzimmer_reomote","input","undefined") ;;;;\
    my $FernseherWohnzimmer_power= ReadingsVal("FernseherWohnzimmer_reomote","power","undefined") ;;;;\
    my $FernseherWohnzimmer_presence= ReadingsVal("FernseherWohnzimmer_reomote","presence","undefined") ;;;;\
    my $FernseherWohnzimmer_screenMute= ReadingsVal("FernseherWohnzimmer_reomote","screenMute","undefined") ;;;;\
    my $FernseherWohnzimmer_videoOutMute= ReadingsVal("FernseherWohnzimmer_reomote","videoOutMute","undefined") ;;;;\
    my $FernseherWohnzimmer_volume= ReadingsVal("FernseherWohnzimmer_reomote","volume","undefined") ;;;;\
    my $FernseherWohnzimmer_volumeMute= ReadingsVal("FernseherWohnzimmer_reomote","volumeMute","undefined") ;;;;\
    fhem("setreading FernseherWohnzimmer_reomote state $FernseherWohnzimmer_power") ;;;;\
}
attr Notify_FernseherWohnzimmer comment Notify, notwendig um die Readings des Original-Module auf den Remote-Dummys abzulegen, um den Wohnzimmer-Fernseher fernzusteuern

define Notify_FernseherWohnzimmerPower notify FernseherWohnzimmer:(on|off) {\
    fhem("setreading FernseherWohnzimmer_remote state $EVENT ;; setreading FernseherWohnzimmer_remote power $EVENT")\
}
attr Notify_FernseherWohnzimmerPower comment Notify, um den Betriebszustand des Dummys korrekt zu setzen, wenn der Wohnzimmer-Fernseher mittels Fernbedienung an- oder abgeschaltet wird

define Notify_FernseherWohnzimmer_remote notify FernseherWohnzimmer_reomote.*:(energy_saving|input|power|screen_mute|statusRequest|volume|volume_mute|volume_step).* {\
    fhem ("set RemoteWohnzimmer cmd set FernseherWohnzimmer $EVENT")\
}
attr Notify_FernseherWohnzimmer_remote comment Notify, notwendig um den Wohnzimmer-Fernseher fernzusteuern


osid-timo

Hallo,
mir ist bekannt, dass euer Thema erledigt ist, aber:

wie definiert Ihr eure Namen/dummy um
define RemoteWohnzimmerLog FHEM2FHEM [color=red][i][b]wohnzimmer[/b][/i][/color]:7072 LOG:(FernseherWohnzimmer.*)

nutzen zu können?
mir gelingt es nicht
wenn ich einen dummy nutzen will, den ich je nach Umgebung produktiv/test umschalten will
habe ich immer ein disconnected für mein FHEM2FHEM

define Raspi1.Remote FHEM2FHEM 192.168.178.31 LOG:.*
funktioniert wunderbar

define Raspi1IP dummy
set Raspi1IP 192.168.178.31
define Raspi1.Remote FHEM2FHEM Raspi1IP LOG:.*
bringt immer disconnected

ich benötige einen Tipp

Gruß osid-timo
FHEM Pi3: 1* CUL, 30* Homematic, 10* EnOcean
FHEM Pi3: IR-Lesekopf, BT->SMA
FHEM Pi3: ZHK, 1-wire, 1* VBus   Resol DeltaSol BS

Grinsekatze

#28
Du musst in der F2F Definition den Hostnamen oder dessen IP angeben (s. auch in der Commandref).

Das erste klappt, weil F2F unter 192.168.178.31 das Remotesystem findet.

Das zweite finde ich etwas verwirrend. Zum einen kann ich nichts mit dem Set anfangen - ist das so zulässig?
Zum anderen hast Du sichergestellt, dass der Host-Name von 192.168.178.31  auch tatsächlich Raspi1IP ist? Ich gehe bei der angegebenen IP-Adresse davon aus, dass Du eine Fritzbox benutzt. Dort kann man die IP-Adressen und Host-Namen ganz einfach im Webfrontend sehen.

Du musst ebenso den Dummy Raspi1IP noch mit Werten füllen. Zzt. ist er einfach nur da und bleibt leer. Das ist im Wiki gut beschrieben.


Edit:
Mir drängt sich das Gefühl auf, dass Du die Funktionsweise von F2F noch nicht so recht verstanden hast?
Mit der F2F-Definition stellst Du erst mal nur eine Verbindung herzwischen Remote- und Hauptsystem. Ausgehend von deiner Definition willst Du auf dem Hauptsystem auf alles vom Remotesystem "zugreifen" (.*)?
Die Dummys benötigst Du, um die Werte des Remotesystm auf dem Hauptsystm (den Dummys) zu spiegeln. Das mus aber z.B. mit einem Notify o.ä. erfolgen und passiert nicht von selbst.

Edit2:
Ausgehend von meinem von Dir genannten Beispiel ist "wohnzimmer" der Name des Remote-Systems, so wie ich ihn im Netzwerk angegeben habe. Das hat nichts mit FHEM zutun. Alternativ hätte ich auch die IP des Systems hinschreiben können.

osid-timo

Hallo
Danke für den schnellen Tipp
Ich will nicht auf alle Informationen im Remote System zugreifen, war nur eine schnelle Kopie
Dass ich nur den Hostnamen nehmen kann habe ich nicht erkannt

Meine Idee war eine einfache Umschaltung der IPAdressen mittels Dummy Belegung um ohne Code Änderungen zwischen produktiv/test wechseln kann, geht damit nicht!

Gruß Oswald
FHEM Pi3: 1* CUL, 30* Homematic, 10* EnOcean
FHEM Pi3: IR-Lesekopf, BT->SMA
FHEM Pi3: ZHK, 1-wire, 1* VBus   Resol DeltaSol BS