Neues Modul PHTV für Philips Fernseher (inkl. Ambilight)

Begonnen von Loredo, 06 März 2014, 22:09:17

Vorheriges Thema - Nächstes Thema

MDietrich

Moin,
da meine Regierung unseren Fernseher 55PUS7181/12 unbedingt mit Sprachsteuerung bedienen will, habe ich nochmal einen Versuch unternommen.

Ich habe bei länger dauernder Suche  das hier gefunden: https://github.com/eslavnov/pylips

Wegen eines Fehlers im Aufrufs von paho habe ich in der Datei pylips.py die entsprechende Zeile mit dem import auskommentiert. Nach dem Eintragen der IP des TV wurde der Pairing Code auf dem Fernseher angezeigt. Nach Eingabe desselben erfolgte das Pairing und die .ini-Datei wurde aktualisiert.

Einen ersten Aufruf habe ich mit einem Dummy und einem NOTIFY realisiert:
defmod d_pylips dummy
attr d_pylips room Dummy
attr d_pylips setList mute powerstate standby power_on
attr d_pylips webCmd on:off:mute


defmod n_pylips notify (d_pylips.*) {\
my $start = Value("d_pylips");;\
system("python3 /opt/pylips/pylips.py --command ".$start);;\
fhem("set d_pylips ".$start."okay")\
}


Das Ganze funktioniert erst einmal grundsätzlich.
Eine Frage ist jetzt, wie es weitergeht:
a) die Informationen genügen um ein PHTV v2 zu bauen und es findet sich jemand der Interesse und Kompetenz hat
b) man(!!!) nutzt "python-fhem" o.ä. für den Austausch von settings und readings und modifiziert pylips.py
c) macht es Sinn diesen Thread zu nutzen oder ist es besser einen Neuen zu starten?

Freue mich auf Rückmeldungen
LG
MDietrich
FB 6591 Cable / Raspberry 3b+ (Bookworm) / 4xECHO DOT 4/ Homematic Thermostate, Fenster- und Fenster-Sensoren / Philips HUE / CUL-HM /  Zigbee Schalter und Lampen / Shelly 1

RoBra81

Guten Abend zusammen,

ich habe heut eine für mich ganz gute Möglichkeit gefunden, den neuen Philips TV mit FHEM kontrollieren zu können und bin nun dabei, mir diese auszubauen. Hierfür habe ich die Pylips von https://github.com/eslavnov/pylips genutzt: zunächst muss der Fernseher wie beschrieben gepairt werden. Anschließend habe ich die MQTT-Funktionalität der Pylips aktiviert, indem ich folgende Einstellungen in der settings.ini vorgenommen habe:


[DEFAULT]
verbose = True
mqtt_listen = True
mqtt_update = True
num_retries = 3
update_interval = 3

[TV]
host = 192.168.18.55
port = 1926
apiv = 6
user = ...
pass = ...
protocol = https://

[MQTT]
host = 192.168.18.18
port = 1883
user = {meinMQTTNutzer}
pass = {meinMQTTPasswort}
tls = False
cert_path =
topic_pylips = WZTV/libs
topic_status = WZTV/state


Nun noch Pylips starten:


python3 pylips.py


Jetzt brauchte ich noch ein MQTT-Gerät, um den Status des Fernseher abfragen und den Fernseher steuern zu können:


defmod WZTV MQTT2_DEVICE WZTV
attr WZTV devicetopic WZTV
attr WZTV event-on-change-reading .*
attr WZTV readingList $DEVICETOPIC/state:.* { json2nameValue($EVENT,'',$JSONMAP) }
attr WZTV setList off:noArg $DEVICETOPIC/libs {"command":"standby"}\
on:noArg $DEVICETOPIC/libs {"command":"power_on"}\
allow_on:noArg $DEVICETOPIC/libs {"command":"allow_power_on"}\
ambilight_off:noArg $DEVICETOPIC/libs {"command":"ambilight_off"}\
ambilight_video_vivid:noArg $DEVICETOPIC/libs {"command":"ambilight_video_vivid"}


Aktuell sind das nur die ersten Befehle zum Testen, da ich wie gesagt am Ausbau bin. Als nächstes möchte ich die Befehle erweitern (die Liste der möglichen Befehle findet man auf der Pylips Homepage) und die Pylips-Anbindung im Hintergrund ausführen - vielleicht kann man das ja gemeinsam zusammentragen...

Ronny

MDietrich

Hallo,

ich habe es so verstanden, dass im MQTT Modus keine Antwort zurückkommt:
"Enabling MQTT_listen in settings.ini will allow you to send commands to a topic specified in topic_pylips by posting a JSON message. This works pretty much the same as sending manual commands: your arguments become keys and their values - values of these keys. You can send any commands (POST, GET and built-in), but you won't get anything in return since you are just publishing a message over MQTT."

Daher versuche ich mich gerade mit einem FHEM API Modul:

Projekt-Source und Doku:
Github: https://github.com/domschl/python-fhem
API Dokumentation: https://domschl.github.io/python-fhem/index.html
PyPI Projekt: https://pypi.python.org/pypi?:action=display&name=fhem

Da kämpfe ich aber im Moment mit 'geht' 'geht nicht' Effekten. Da liegt aber wohl an meinen nicht vorhanden Python-Künsten und daran das ich CSRF noch nicht ganz verstanden habe.

Ideal wäre es, wenn am Ende ein funktionsfähiges Modul herauskäme.

LG
MDietrich

FB 6591 Cable / Raspberry 3b+ (Bookworm) / 4xECHO DOT 4/ Homematic Thermostate, Fenster- und Fenster-Sensoren / Philips HUE / CUL-HM /  Zigbee Schalter und Lampen / Shelly 1

RoBra81

Guten Morgen,

ja, es ist richtig, dass ich auf einen Befehl über MQTT keine direkte Antwort erhalte. Aber da ich auch den Status abonniert habe, bekomme ich immer sofort die aktuelle Info, wenn sich der "Zustand" des Fernsehers (an/aus, Lautstärke, Ambilight-Status, aktive App, manchmal auch der aktuelle Sender, ...) warum auch immer (MQTT-Befehl, Fernbedienung, ...) ändert...

Viele Grüße
Ronny

MDietrich

Hallo,
ich habe es jetzt mit https://github.com/eslavnov/pylips zum Laufen gebracht:

a) bei der Installation der requirements war zunächst etwas schief gelaufen. Ich habe jetzt die Pakete nochmals händisch installiert.
b) bei dem Versuch Befehl und Ergebnis in einem Dummy unterzubringen habe ich FHEM abgeschossen, durch Änderung von Readings entstand wohl eine Endlosschleife (für Hinweise, wie es klappen könnte, wäre ich dankbar)

meine aktuelle Lösung:
Dummy um Befehl an pylips zu schicken:

defmod d_pylipsOut dummy
attr d_pylipsOut room Dummy
attr d_pylipsOut setList power_on mute standby
attr d_pylipsOut verbose 5
attr d_pylipsOut webCmd on:off:

setstate d_pylipsOut mute
setstate d_pylipsOut 2022-01-26 03:43:54 state mute


ein zweiter Dummy um das Ergebnis in readings zu setzen:

defmod d_pylipsIn dummy
attr d_pylipsIn readingList Command r_string response state
attr d_pylipsIn room Dummy

setstate d_pylipsIn mute
setstate d_pylipsIn 2022-01-26 03:43:54 Command XXX
setstate d_pylipsIn 2022-01-26 03:43:56 r_string <Response [200]>
setstate d_pylipsIn 2022-01-26 03:43:56 response Request_Sent!
setstate d_pylipsIn 2022-01-26 03:43:54 state mute


und ein nofify um die Kommunikation auszulösen:
defmod n_pylips notify (d_pylipsOut.*) {\
my $start = Value("d_pylipsOut");;\
fhem("set d_pylipsIn ".$start);;\
system("python3 /opt/pylips/pylips.py --command ".$start." &");;\
fhem("set d_pylipsIn Command XXX")\
}
attr n_pylips room Dummy
attr n_pylips verbose 5

setstate n_pylips 2022-01-26 03:43:54
setstate n_pylips 2022-01-25 06:37:10 state active
setstate n_pylips 2022-01-26 03:43:54 triggeredByDev d_pylipsOut
setstate n_pylips 2022-01-26 03:43:54 triggeredByEvent mute


in der pylips.py habe ich das FHEM Python Interface genutzt:

# communication with FHEM
import fhem
import logging
logging.basicConfig(level=logging.DEBUG)

_FHEM = fhem.Fhem("192.168.xxx.yy", protocol="telnet", port=7072, username="myUserName", password="myPassWord")
_FHEM.connect()

zum Setzen der Readings dann an mehreren Stellen die Ausgabe in Richtung FHEM eingebaut (ein Beispiel):
_FHEM.send_cmd("setreading d_pylipsIn Command "+r.text)

Ich hoffe dies hilft dem Einen oder Anderen der auch eine Lösung sucht.
Nun würde ich das Ganze gern noch mit ALEXA verheiraten, hier habe ich aber noch keinen Lösungsansatz. Für Hinweise wäre ich sehr dankbar.

LG
MDietrich

FB 6591 Cable / Raspberry 3b+ (Bookworm) / 4xECHO DOT 4/ Homematic Thermostate, Fenster- und Fenster-Sensoren / Philips HUE / CUL-HM /  Zigbee Schalter und Lampen / Shelly 1

Marlen

#425
Hallo,

ich hab das jetzt auch so ein bisschen zum laufen gebracht, allerdings bekommen ich nur info's vom Fernseher, solange ich
python3 pylips.py
auf der Konsole laufen lasse, sobald ich die Konsole schließe geht nicht's mehr.

Wie kann man das im Hintergrund dauerhaft laufen lassen?

Bzw. wie bekomme ich wenn ich den Befehl
ystem("python3 /opt/pylips/pylips.py --command powerstate abgebe
die "Antwort mit?

LG
  Marlen

MDietrich

Hallo Marlen, ich hoffe das hilft dir weiter:
Zitat von: MDietrich am 26 Januar 2022, 04:02:42

in der pylips.py habe ich das FHEM Python Interface genutzt:

# communication with FHEM
import fhem
import logging
logging.basicConfig(level=logging.DEBUG)

_FHEM = fhem.Fhem("192.168.xxx.yy", protocol="telnet", port=7072, username="myUserName", password="myPassWord")
_FHEM.connect()

zum Setzen der Readings dann an mehreren Stellen die Ausgabe in Richtung FHEM eingebaut (ein Beispiel):
_FHEM.send_cmd("setreading d_pylipsIn Command "+r.text)

Ich hoffe dies hilft dem Einen oder Anderen der auch eine Lösung sucht.
Nun würde ich das Ganze gern noch mit ALEXA verheiraten, hier habe ich aber noch keinen Lösungsansatz. Für Hinweise wäre ich sehr dankbar.

LG
MDietrich
Falls nötig kann ich auch "meine" pylips.py schicken.
LG
MDietrich
FB 6591 Cable / Raspberry 3b+ (Bookworm) / 4xECHO DOT 4/ Homematic Thermostate, Fenster- und Fenster-Sensoren / Philips HUE / CUL-HM /  Zigbee Schalter und Lampen / Shelly 1

Marlen

#427
Hi,
ja, bitte schick mal deine pylips.py.

Aber wer oder was startet dann die pylips.py?
Nur der Eintrag:
# communication with FHEM
.....

startet doch die Datei nicht!?

LG
  Marlen

RoBra81

Hallo,

Zitat von: Marlen am 16 Mai 2022, 17:06:05
...
Wie kann man das im Hintergrund dauerhaft laufen lassen?
...

ich habe es so gemacht, dass ich es aus dem FHEM starte:

Ein PRESENCE-Device, das erkennt, wann der Fernseher im Netzwerk erreichbar ist (wenn er auf stromsparen ist, wird das Netzwerk getrennt, wenn er aus ist):
defmod DG.wz.PR.WohnzimmerTV PRESENCE lan-ping 192.168.18.55
attr DG.wz.PR.WohnzimmerTV event-on-change-reading .*


Ein DOIF, das die Anwesenheit erkennt und das pylibs ein- und ausschaltet:

defmod DG.wz.DI.WohnzimmerTV_MQTT_ein_aus DOIF ([DG.wz.PR.WohnzimmerTV:"^absent$"]) (set MedienWohnzimmer MQTT_aus)\
DOELSEIF ([DG.wz.PR.WohnzimmerTV:"^present$"]) (set MedienWohnzimmer MQTT_ein)
attr DG.wz.DI.WohnzimmerTV_MQTT_ein_aus do always


Und ein DOIF zum Ein- und Ausschalten der pylibs:

defmod MedienWohnzimmer DOIF (1) ("python3 /opt/fhem/pylips/pylips.py --config /opt/fhem/pylips/settings.ini 2> /dev/null >&2 &")\
DOELSEIF (1) ("pkill -if .*pylips\.py", setreading DG.wz.TV.WohnzimmerTV powerstate Off)
attr MedienWohnzimmer do always
attr MedienWohnzimmer eventMap /cmd_1:MQTT_ein/cmd_2:MQTT_aus/


Kann sicherlich optimiert werden, läuft aber schon eine Weile stabil...

Grüße
Ronny

Marlen

Ja, mit meinem Fernseher funktioniert das mit dem presence Device nicht so toll, der is nach dem Ausschalten manchmal noch 20 online und geht auch so einfach mal online.
Ich möchte eigentlich nur zuverlässig die Info bekommen, wann er an oder aus ist.

RoBra81

Du kannst das letzte DOIF auch anderweitig triggern, um die pylibs aus dem FHEM zu starten - die können dann ja dauerhaft laufen. Ich hatte nur das Gefühl, dass die ein Problem bekommen, wenn der Fernseher aus ist, sodass ich sie beim Einschalten des Fernsehers neu gestartet hatte...

Marlen

Ich versteh sowieso nicht wie du das doif triggerst.
defmod MedienWohnzimmer DOIF (1)
ich fordere den Status damit an:
system("python3 /opt/pylips/pylips.py --command powerstate
allerdings bekomme ich die antwort nur im Logfile:
{"powerstate":"On"} oder
{"powerstate":"Standby"}
danach führt das zu fehler, da der Fernseher scheinbar nicht mehr antwortet.

LG
  Marlen

RoBra81

Das DOIF muss manuell getriggert werden und startet nur den pylips-Prozess (bzw. beendet ihn). Im pylips selbst nutze ich dann MQTT (wie weiter oben beschrieben) um den Status zu empfangen und Kommandos zu senden.

Beim DOIF oben ist noch ein kleiner Fehler (bzw. ein Eintrag zu viel) drin:

defmod MedienWohnzimmer DOIF (1) ("python3 /opt/fhem/pylips/pylips.py --config /opt/fhem/pylips/settings.ini 2> /dev/null >&2 &")\
DOELSEIF (1) ("pkill -if .*pylips\.py", setreading DG.wz.TV.WohnzimmerTV powerstate Off)
attr MedienWohnzimmer do always
attr MedienWohnzimmer eventMap /cmd_1:MQTT_ein/cmd_2:MQTT_aus/


Der Befehl

"python3 /opt/fhem/pylips/pylips.py --config /opt/fhem/pylips/settings.ini 2> /dev/null >&2 &"

startet den pylips-Prozess im Linux und setzt ihn in den Hintergrund, damit er ab dem Zeitpunkt mit MQTT kommuniziert...

ares

Meine Tochter bekommt ihren ersten TV. Wir haben uns für einen Philips TV 43PUS8506 (2021 Modell) entschieden. Da wir mindestens die Einschalt-Zeit überwachen wollen und ich kein Modul finde, habe ich angefangen zu lesen.
Hier meine ersten Schritte an Tag 1, die sicher noch ausbaufähig sind. Vielleicht mag ja sogar jemand eine Modul draus basteln?

(1) Zum Pairing... was ist das überhaupt und was muss ich alles installieren?
Ich habe derzeit (noch) kein Testsystem für fhem und will auf dem Produktivsystem nicht zu viel installieren.
Zum Glück bin ich über https://github.com/suborb/philips_android_tv gestolpert und da steht:
ZitatThe tool here will do the initial pairing. The credentials can then be used in a standard way (digest) in other tools.

"In other tools" hört sich mehr als nur gut an... in einer virutellen Maschine mit MINT habe ich mir also einen User mit Passwort erstellt. Das sollte aber auch auf dem RasPi & Co. funktionieren.
(192.168.0.164 ist die IP des TV, 8216 wurde nach dem python3-pair-Aufruf am TV angezeigt... der sollte also in Sichtweite und eingeschaltet sein!)
sudo apt install git
git clone https://github.com/suborb/philips_android_tv
cd philips_android_tv
sudo apt install python3.pip
pip install -r requirements.txt
python3 philips.py --host 192.168.0.164 pair

> Starting pairing request
> Enter onscreen passcode: 8216
> Attempting to pair
> {'error_id': 'SUCCESS', 'error_text': 'Pairing completed'}
> Username for subsequent calls is: XrzlLwa41ic5NvH4
> Password for subsequent calls is: c64dff111a21fa0bc5219e479896fe863a39516de9ddbc52312fd5a3cdb2c722


Den User und das Passwort notieren, danach kann wieder alles installierte gelöscht werden.

(2) Test im Browser unter Windows ohne Pairing, aber mit dem notierten Benutzer/Kennwort
In der Philips TV (2015+) Unofficial API Reference: https://github.com/eslavnov/pylips/blob/master/docs/Home.md steht unter 27. Power state (GET), dass hier Ein/Aus abgefragt werden kann.
Also Browser auf und mit meiner IP, User und Passwort getestet:
https://XrzlLwa41ic5NvH4:c64dff111a21fa0bc5219e479896fe863a39516de9ddbc52312fd5a3cdb2c722@192.168.0.164:1926/6/powerstate
Sehr schön... funktioniert auch wenn mir der Unterschied zwischen Standby und StandbyKeep immer noch nicht klar ist. Folgende 3 Ergebnisse habe ich erhalten:
{"powerstate":"On"}
{"powerstate":"Standby"}
{"powerstate":"StandbyKeep"}


(3) Einbindung in fhem... ohne viel Aufwand?
Wenn es in Chrome geht, dann sollte das doch auch HTTPMOD schaffen und vielleicht lässt sich der TV so auch gleich mit Standby ein-/ausschalten und mehr?
Da ich ungeduldig bin, starte ich mit einer Aktualisierung von 5 Sekunden (Ende von Zeile 1). Sobald alles läuft kann sind sicher 60 Sekunden und mehr ausreichend.
defmod PhilipsTV HTTPMOD https://XrzlLwa41ic5NvH4:c64dff111a21fa0bc5219e479896fe863a39516de9ddbc52312fd5a3cdb2c722@192.168.0.164:1926/6/powerstate 5
attr PhilipsTV event-on-change-reading .*
attr PhilipsTV event-on-update-reading Status

attr PhilipsTV get00Name activities/current
attr PhilipsTV get00Poll 1
attr PhilipsTV get00URL https://XrzlLwa41ic5NvH4:c64dff111a21fa0bc5219e479896fe863a39516de9ddbc52312fd5a3cdb2c722@192.168.0.164:1926/6/activities/current

attr PhilipsTV reading00MaxAge 90
attr PhilipsTV reading00MaxAgeReplacement 0
attr PhilipsTV reading00MaxAgeReplacementMode text
attr PhilipsTV reading00Name Status
attr PhilipsTV reading00Regex (?s)(1).*powerstate

attr PhilipsTV reading01Name powerstate
attr PhilipsTV reading01Regex {"powerstate":"(.*)"}

attr PhilipsTV reading02Name current_packageName
attr PhilipsTV reading02Regex "packageName":"([^"]*)

attr PhilipsTV set01Name Send_key
attr PhilipsTV set01URL https://XrzlLwa41ic5NvH4:c64dff111a21fa0bc5219e479896fe863a39516de9ddbc52312fd5a3cdb2c722@192.168.0.164:1926/6/input/key
attr PhilipsTV set01Data {"key": "$val"}
attr PhilipsTV set01TextArg 1
attr PhilipsTV set01IMap Standby:Standby, Home:Home

attr PhilipsTV timestamp-on-change-reading onoff
attr PhilipsTV userReadings onoff:.* {if (ReadingsVal($name,"Status","") ne "1") {return 'offline'}\
          else {if (ReadingsVal($name,"powerstate","") eq "On") {return 1} else {return 0}}}


Und weil das so schön funktioniert möchte ich auch noch die gesamte TV-Zeit pro (Vor-)Tag/Monat/Jahr sehen:
defmod stat_PhilipsTV statistics PhilipsTV
attr stat_PhilipsTV durationReadings onoff
attr stat_PhilipsTV ignoreDefaultAssignments 1
attr stat_PhilipsTV singularReadings PhilipsTV:onoff:1:(Day|Month|Year)


(4) Und nun...
...findet sich sicher jemand, der daraus eine vollständige und vor allem komfortablere Lösung bastelt und ich meine Notlösung ersetzen kann.

Danke schon mal vorab
Manfred

ares

Hallo MDietrich,

meine Lösung läuft bei mir immer noch und ich kann damit auch die Lautstärke über meine SmartVisu-Visualisierung anpassen.
Anbei nochmal die erweiterte Version set01IMap:

attr PhilipsTV set01IMap Standby:Standby,AmbilightOnOff:AmbilightOnOff,\
CursorUp:CursorUp,CursorLeft:CursorLeft,Confirm:Confirm,CursorRight:CursorRight,CursorDown:CursorDown,\
Back:Back,Home:Home,Source:Source,\
Play:Play,Pause:Pause,Stop:Stop,FastForward:FastForward,Rewind:Rewind,Next:Next,Previous:Previous,\
Mute:Mute,VolumeUp:VolumeUp,VolumeDown:VolumeDown,\
WatchTV:WatchTV,ChannelStepUp:ChannelStepUp,ChannelStepDown:ChannelStepDown,\
Find:Find,Options:Options,Info:Info,\
Digit0:Digit0,Digit1:Digit1,Digit2:Digit2,Digit3:Digit3,Digit4:Digit4,Digit5:Digit5,Digit6:Digit6,Digit7:Digit7,Digit8:Digit8,Digit9:Digit9,\
RedColour:RedColour,GreenColour:GreenColour,YellowColour:YellowColour,BlueColour:BlueColour


Viele Grüße
Manfred