SONY VPL Projektoren in FHEM via ADCP

Begonnen von suchmich1983, 02 September 2021, 09:18:22

Vorheriges Thema - Nächstes Thema

suchmich1983

Hallo zusammen,

vielleicht ist ja auch der ein oder andere Heimkino-Fan und SONY VPL Beamer Besitzer hier im Forum unterwegs und würde diesen, genau wie ich, gerne irgendwie in FHEM integrieren und schalten können.
Ich habe mich in den letzten Tagen damit beschäftigt und kann meinen VPL-HW65 nun in FHEM Ein/Ausschalten und Werte wie Status, Eingang oder Lampenstunden auslesen.

Dazu nutze ich ADCP was wohl ein SONY proprietäres Steuerungsprotokoll ist. Dies kann man, wenn man seinen Projektor ins Netzwerk gebracht hat (in meinem Fall via LAN Kabel) via Webinterface aktivieren. Bei mir war es tatsächlich sogar ab Werk eingeschaltet. Ebenfalls bin ich mir ziemlich sicher, dass der Großteil aller SONY Projektoren mit RJ45/LAN Schnittstelle dies unterstützen, mindestens aber alle VPL-HW und VPL-VW Modelle..

Um die Daten nun ins FHEM zu bekommen bin ich wie folgt vorgegangen:

1. Ein Dummy Device anlegen, in meinem Fall ist der Name SONYHW65

define SONYHW65 dummy

2. Ein at erstellen was in regelmässigen Intervallen ein Shell-Script ausführt um die Daten zu aktualisieren.
Wer mag kann die Benamung so belassen oder nach seinen Bedürfnissen/Modellnummer frei wählen.


define SONYHW65_Update at +*00:02:00 { fhem("setreading SONYHW65_Update myReading ".`cat /opt/fhem/hw65.txt`) ;; { system("/opt/fhem/SonyBeamerStatus.sh") } }

Das "at" führt alle 2 Minuten ein Update auf das Reading "myReading" aus im Device SONYHW65_Update mit dem Inhalt aus der Text-Datei /opt/fhem/hw65.txt. Ebenfalls führt es ein Shell-Script aus welches die hw65.txt mit Daten vom Projektor füllt!

So sehen Shellscript und hw65.txt Datei aus:

root@HOME:/opt/fhem# more SonyBeamerStatus.sh
#!/bin/sh
HOST='192.168.1.100 53595'
CMD='power_status ?'
CMD2='modelname ?'
CMD3='filter_status ?'
CMD4='input ?'
CMD5='timer ?'
CMD6='serialnum ?'
CMD7='picture_mode ?'
(
echo open "$HOST"
sleep 1
echo "$CMD"
sleep 1
echo "$CMD2"
sleep 1
echo "$CMD3"
sleep 1
echo "$CMD4"
sleep 1
echo "$CMD5"
sleep 1
echo "$CMD6"
sleep 1
echo "$CMD7"
sleep 1
echo "^]"
) | telnet | tee /opt/fhem/hw65.txt


telnet> Trying 192.168.1.100...
Connected to 192.168.1.100.
Escape character is '^]'.
NOKEY
"standby"
"VPL-HW65ES"
"normal"
"hdmi1"
[{"operation":136},{"light_src":133},{"prev_light_src":0}]
"5005154"


dazu dann noch einen notify, damit die Formatierung in FHEM stimmt.
Erst grob definieren und dann die Definition ändern:

SONYHW65_update_notify notify SONYHW65:(on|off)

SONYHW65_Update:myReading:.* {

ReadingsVal("SONYHW65_Update","myReading","") =~ /\"(.*)\"\n\"(.*)\"\n\"(.*)\"\n\"(.*)\"\n\[(.*)]\n\"(.*)\"\n(\"(.*)\"|err_inactive)/;


fhem("setreading SONYHW65 power_status ". $1);;
fhem("setreading SONYHW65 model_name ". $2);;
fhem("setreading SONYHW65 filter_status ". $3);;
fhem("setreading SONYHW65 input_source ". $4);;
fhem("setreading SONYHW65 serial_number ". $6);;


my $picturemode = $8;
if ($7 eq 'err_inactive'){
$picturemode = 'err_inactive';
}

fhem("setreading SONYHW65 picture_mode ". $picturemode);;

#Log 3, "picture mode is: '$7' und '$8'";;

my $timer = $5;

$timer =~ /\{\"operation":(.*?)}/;
fhem("setreading SONYHW65 timer_operation ". $1);;

$timer =~ /\{\"light_src":(.*?)}/;
fhem("setreading SONYHW65 timer_light_current ". $1);;

$timer =~ /\{\"prev_light_src":(.*?)}/;
fhem("setreading SONYHW65 timer_light_previous ". $1);;
}


So würde das ganze dann im Dummy Device in FHEM ausschauen:

Internals:
   FUUID      612cefe4-f33f-c18f-5c32-ae9f8e3edf0fa646
   NAME       SONYHW65
   NR         384
   STATE      off
   TYPE       dummy
   READINGS:
     2021-09-06 14:17:41   filter_status   normal
     2021-09-06 14:17:41   input_source    hdmi1
     2021-09-06 14:17:41   model_name      VPL-HW65ES
     2021-09-06 14:17:41   picture_mode    user
     2021-09-06 14:17:41   power_status    on
     2021-09-06 14:17:41   serial_number   5005154
     2021-09-06 13:45:41   state           on
     2021-09-06 14:17:41   timer_light_current 145
     2021-09-06 14:17:41   timer_light_previous 0
     2021-09-06 14:17:41   timer_operation 148


3. benötigen wir noch einen notify um A) den Projektor via FHEM zu schalten und B) den Status zwischen manueller Bedienung und FHEM "möglichst synchron" zu halten.

erstmal grob definieren:
define SONYHW65_notify notify SONYHW65:(on|off)

und dann so anpassen dass je nach Status entsprechend geschaltet und gewaltet wird.
Achtet darauf die Device-Namen entsprechend Euren Geräten/Namen anzupassen, falls Ihr es nicht stumpf so übernommen habt!

(SONYHW65:power_status:.(standby|on))|(SONYHW65:state:.(on|off)) {

#SONYHW65:state -> represents the status of the FHEM-dummy
#SONYHW65:power_status -> represents the status of projector itself (hanging in the basement)

#Log 3, "2- SONYHW65_notify: attr: '$EVTPART0' val: '$EVTPART1'.";;

if ($EVTPART0 eq "power_status:"){
#set dummy status according to projector
my $dummyDeviceState = ReadingsVal("SONYHW65","state","");;

if ($EVTPART1 eq "standby"){

if ($dummyDeviceState eq "on"){
#Log 3, "SONYHW65_notify: set dummy device to 'off' because beamer is currently in standby and dummy device status is currently 'on'";;
fhem("setreading SONYHW65 state off");;
}
else {
#Log 3, "SONYHW65_notify: nothing to do as beamer is currently in standby and dummy device status is already 'off'";;
}
}
else {

if ($dummyDeviceState eq "off"){
#Log 3, "SONYHW65_notify: set dummy device to 'on' because beamer is currently running and dummy device status is currently 'off'";;
fhem("setreading SONYHW65 state on");;
}
else {
#Log 3, "SONYHW65_notify: nothing to do as beamer is currently running and dummy device status is already 'on'";;
}

}
}

if ($EVTPART0 eq "state:"){
#setting up projector according to FHEM-Dummy
my $projectorPowerState = ReadingsVal("SONYHW65","power_status","");;

if ($EVTPART1 eq "on"){

if ($projectorPowerState eq "standby"){
#Log 3, "SONYHW65_notify: start beamer because it is currently in standby and dummy device has switchted to 'on'";;
system("/opt/fhem/SonyBeamerOn.sh");;
}
else {
#Log 3, "SONYHW65_notify: nothing to do as beamer is already running and dummy device has switched to 'on'";;
}
}
else {##dummy switched to off

if ($projectorPowerState eq "on"){
#Log 3, "SONYHW65_notify: shutdown beamer because it is currently running and dummy device has switchted to 'off'";;
system("/opt/fhem/SonyBeamerOff.sh");;
}
else {
#Log 3, "SONYHW65_notify: nothing to do as beamer is already switched off and dummy device has switched to 'off'";;
}

}
}


}


Zum Auslesen und schalten benötigt Ihr noch die kleinen Shell-Scripte die ich hier mal angehängt habe.
Rüberkopieren nach /opt/fhem/ und ausführbar machen via:

chmod +x /opt/fhem/SonyBeamer*

Damit sollte es auch schon laufen. In den Shell-Scripten bitte auch entsprechend IPs, Dateinamen und Pfade Euren Bedürfnissen anpassen.

Funktioniert bisher einwandfrei. Ich bin mir auch ziemlich sicher dass dies vielleicht sehr viel einfacher möglich wäre, vielleicht via eigenem Modul oder vlt sind meine notifier auch zu aufwändig erstellt, aber besser kann ich es Stand heute nicht ;)

Verbesserungsvorschläge sind aber sehr gerne willkommen und Ihr könnt den ganzen Kram natürlich komplett ändern/anpassen/weitergeben etc.

Viele Grüße
Christian

vencam

@suchmich1983:

Vielen Dank für deinen Beitrag! Ich hatte das vor 2 Jahren mal versucht den Beamer aus dem Netzwerk zu starten, jedoch ohne Erfolg.

Mit den zwei Scripts funktioniert das einwandfrei! Gibt es da ne Liste mit Befehlen?

Die Abfrage über den Status blockiert bei mir nach Abhandlung der Befehle, mein komplettes FHEM. Ist das bei dir auch so?

Grüße

suchmich1983


suchmich1983

Ich hab mir das Shellscript zur Abfrage der Werte aus dem Beamer noch mal angesehen.
Man braucht tatsächlich nur nen "sleep" am Anfang und am Ende... Das macht das Ganze auch noch mal etwas flotter:

#!/bin/sh
HOST='192.168.178.39 53595'
CMD='power_status ?'
CMD2='modelname ?'
CMD3='filter_status ?'
CMD4='input ?'
CMD5='timer ?'
CMD6='serialnum ?'
CMD7='picture_mode ?'
CMD8='warning ?'
(
echo open "$HOST"
sleep 1
echo "$CMD"
echo "$CMD2"
echo "$CMD3"
echo "$CMD4"
echo "$CMD5"
echo "$CMD6"
echo "$CMD7"
echo "$CMD8"
sleep 1
echo "^]"
) | telnet | tee /opt/fhem/hw65.txt