JVC Projector - Python Script

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

filmgucker2
Beiträge: 228
Registriert: 8. Apr 2020 20:59

JVC Projector - Python Script

Beitrag von filmgucker2 »

Hallo mal wieder,

ich habe mir einen JVC Projektor zugelegt und möchte ihn gern steuern. Man kann wohl
mit ihm über Lan kommunizieren. Mit TCP und einem handshake geht das auch, was ich
mit dem von JVC empfohlenen kleinen Programm testen konnte. Ein JVC Binding für openhab
3.3 gibt es wohl nicht. TCP Binding schon, aber nicht im "offiziellen" Repo. Zu dem habe ich schon
im Englischen Forum was gefragt, aber noch keine Antwort...
Jetzt habe ich bei git noch ein Python Script gefunden. Mein Openhab kann ja auch Python Scripte...
Also: Script kopiert in den Editor von openhab. Zuvor war noch ein Modul zu installieren. Gemacht
wie in git beschrieben mit pip install ....Wohin auch immer das gegangen ist.
Das Script:

Code: Alles auswählen

from jvc_projector import JVCProjector

 # replace with your projector's local IP
host = "192.168.188.103"

 # replace with your projector's network password (if applicable)
password = "MYPASSWORD"

# initialise
projector = JVCProjector(host)

# initialise (alternate, with network password)
projector = JVCProjector(host, password)

# power on, power off
projector.power_on()
# check status once it's on
projector.is_on()
True

projector.power_off()
# check if it's off
projector.is_on()
False

# Send arbitrary command
# possibilities include:
#   - memory1, memory2, memory3, memory4, memory5
#   - hdmi1, hdmi2
#   - add new commands to the Commands class in __init__.py
projector.command("menu")
...und es kommt der log Eintrag, das Modul sei nicht zu finden...
Weiß vielleicht jemand, wie ich das zum Laufen bringen kann? Und wie
kann ich das dann über items bedienen?

VG
Knut
Raspberry Pi 4, OH 4.0.3

Benutzeravatar
udo1toni
Beiträge: 13864
Registriert: 11. Apr 2018 18:05
Answers: 222
Wohnort: Darmstadt

Re: JVC Projector - Python Script

Beitrag von udo1toni »

Du wirst mit pip (das ist der Python Paket Manager) das Paket jvc_projector nachinstallieren müssen.
Versuche mal

Code: Alles auswählen

pip install jvc_projector
evtl. auch mit sudo.

Das Script sollte übrigens als erstes noch die Zeile

Code: Alles auswählen

#!/usr/bin/python
bekommen, so dass klar ist, dass diese Datei mit python gestartet wird.
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

filmgucker2
Beiträge: 228
Registriert: 8. Apr 2020 20:59

Re: JVC Projector - Python Script

Beitrag von filmgucker2 »

hatte ich vorher schon gemacht und jetzt wieder:

Code: Alles auswählen

Installing collected packages: jvc-projector-remote
  Attempting uninstall: jvc-projector-remote
    Found existing installation: jvc-projector-remote 0.1.1.post1
    Uninstalling jvc-projector-remote-0.1.1.post1:
      Successfully uninstalled jvc-projector-remote-0.1.1.post1
  Running setup.py develop for jvc-projector-remote
Successfully installed jvc-projector-remote
... auch mit sudo.

und trotzdem sagt das log, dass das Modul fehlt :(

Ich starte den Pi mal neu...

Gleiches Resultat...No module named jvc_projector in <script> at line number 3

Ist in Python 3.7 geschrieben, sagt git. Vielleicht liegts daran?
Raspberry Pi 4, OH 4.0.3

Benutzeravatar
udo1toni
Beiträge: 13864
Registriert: 11. Apr 2018 18:05
Answers: 222
Wohnort: Darmstadt

Re: JVC Projector - Python Script

Beitrag von udo1toni »

Das ist aber ein anderes Paket als das angegebene. Ob es sich dabei um die richtige Bibliothek handelt, kann ich natürlich nicht sagen, aber wenn, müsstest Du den import Befehl anpassen:

Code: Alles auswählen

from jvc-projector-remote import JVCProjector
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

filmgucker2
Beiträge: 228
Registriert: 8. Apr 2020 20:59

Re: JVC Projector - Python Script

Beitrag von filmgucker2 »

Jetzt krieg ich: Script execution of rule with UID 'JVCPython' failed: SyntaxError: mismatched input '-' expecting IMPORT in <script> at line number 2 at column number 8

git sagt:


Installation
PyPi
Install this package from PyPi with:

pip install jvc_projector_remote
From this repo
Install from this repo with:

pip install -e git+https://github.com/bezmi/jvc_projector. ... tor-remote

und ich hab das vom repo genommen.

Und das erste scheint er schon zu haben:
Looking in indexes: https://pypi.org/simple, https://www.piwheels.org/simple
Requirement already satisfied: jvc_projector_remote in ./src/jvc-projector-remote (0.1.1.post1)
Raspberry Pi 4, OH 4.0.3

filmgucker2
Beiträge: 228
Registriert: 8. Apr 2020 20:59

Re: JVC Projector - Python Script

Beitrag von filmgucker2 »

...hat vielleicht mit dem Pfad zu tun, in dem die Dateien sind? Bei mir liegen die in dem o.a. Pfad. Und das Openhab script
ist woanders?

Mal wieder eine schwere Geburt bei mir. Sorry. Aber das wird wohl zu lösen sein...
Und wenn, dann wäre der nächste Schritt ja, wie ich in openhab dem Skript die verschiedenen Befehle
übergebe. Im Skript am Ende ist das ja "Menu", und das müsste dann je nach Befehl jeweils ersetzt werden?

Ich muss jetzt ins Bett und sag schon mal wieder: Vielen, vielen Dank!!
Raspberry Pi 4, OH 4.0.3

Benutzeravatar
udo1toni
Beiträge: 13864
Registriert: 11. Apr 2018 18:05
Answers: 222
Wohnort: Darmstadt

Re: JVC Projector - Python Script

Beitrag von udo1toni »

Dann aber bitte wieder das Originalrepo eintragen.
Die Pfade sind egal, da kümmert sich Python selbst drum.
Eher könnte es mit der Python Version zu tun haben.

Es ist aber an dieser Stelle für mich schwer, da qualifiziert zu antworten, der Einäugige kann vielleicht dem Blinden erklären, was sehen bedeutet, stereoskopisches Sehen ist aber noch eine andere Nummer.
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

filmgucker2
Beiträge: 228
Registriert: 8. Apr 2020 20:59

Re: JVC Projector - Python Script

Beitrag von filmgucker2 »

Es scheint an Openhab zu liegen. Ich habe eine Python Datei mit dem gleichen Inhalt wie das Skript erstellt
und dann in das Verzeichnis /home/openhabian gelegt. Die habe ich dann über die Kommandozeile gestartet.
Mein Beamer wurde ausgeschaltet...Dann konnte ich natürlich nichts mehr sehen :lol:
Schnell den Powerkram im Inhalt deaktiviert. Noch mal ausführt, und schwupps zeigte mir mein Beamer
sein Menü. Das zeigt wohl, dass das Modul gefunden wird. Neuer Ansatz: Ausführung mit exec? Aber wie
kriege ich die verschiedenen Befehle in die Items?

VG
Knut

...und über: executeCommandLine("python", "/home/openhabian/jvc.py")
gehts auch ;)
Raspberry Pi 4, OH 4.0.3

Benutzeravatar
udo1toni
Beiträge: 13864
Registriert: 11. Apr 2018 18:05
Answers: 222
Wohnort: Darmstadt

Re: JVC Projector - Python Script

Beitrag von udo1toni »

Ah, das hatte ich überhaupt nicht realisiert, dass Du es direkt aus Jython heraus nutzen wolltest.
openHAB kennt kein Python, lediglich Jython (das wäre quasi Python für Java oder so ähnlich). Du wirst die Bibliothek also bestimmt irgendwie nutzen können, aber eben nicht mit nativem Python Code in Jython.

Aber ich bin nicht in der Materie drin, ich nutze selbst ausschließlich die DSL für Rules.
Wenn ich etwas extern steuern muss, was nicht einfach mit Bordmitteln geht, nutze ich gewöhnlich Python Scripte, die ich als Dienst laufen lasse.
Die Scripte steuere ich dann per mqtt, das ist sehr einfach umzusetzen und benötigt keine Klimmzüge wie mit exec usw.

Beispielscript, um auf einer Remote Maschine Calibre Server oder Calibre Web zu starten und zu stoppen:

Code: Alles auswählen

#!/usr/bin/python

import configparser
import logging
from paho.mqtt import client as mqtt
import time
from sysdmanager import SystemdManager

config = configparser.ConfigParser()
config.read('/etc/default/mqttclient')

log_file = (config['logging']).get('filename','/var/log/pymqtt.log')
log_level = int((config['logging']).get('level','30'))
logging.basicConfig(filename=log_file,format='%(asctime)s %(levelname)s:%(message)s', datefmt='%Y/%m/%d/ %H:%M:%S', level=log_level)

MQTT_SERVER = (config['mqtt']).get('url','localhost')
MQTT_PORT = int((config['mqtt']).get('port','1883'))
MQTT_RECONNECT = int((config['mqtt']).get('reconnect','60'))
MQTT_PATH = (config['mqtt']).get('path','/')
MQTT_COMMAND = (config['mqtt']).get('command','cmnd')
MQTT_STATE = (config['mqtt']).get('state','state')
MY_COMMAND = MQTT_PATH+MQTT_COMMAND
MY_STATE = MQTT_PATH+MQTT_STATE

# The callback for when the client receives a CONNACK response from the server.
def on_connect(client, userdata, flags, rc):
    client.publish(MQTT_PATH+"LWT", payload="Online", qos=0, retain=True)
    logging.info("Connected with result code "+str(rc))
    if rc: logging.warning("Connecting resulted with" +str(rc))
    # Subscribing in on_connect() means that if we lose the connection and
    # reconnect then subscriptions will be renewed.
    client.subscribe(MY_COMMAND)
    logging.info("Subscribed to "+str(MY_COMMAND))

# The callback for when a PUBLISH message is received from the server.
def on_message(client, userdata, msg):
    manager = SystemdManager()
    logging.debug("got message!")
    payload=format(msg.payload.decode("utf-8"))
    logging.info(msg.topic+" : "+payload)
    startunit=""
    stopunit1=""
    stopunit2=""
    if payload == "1":
        logging.debug("Payload is 1 -> CS")
        stopunit1="cps.service"
        startunit="calibre-server.service"
    elif payload == "2":
        logging.debug("Payload is 2 -> CPS")
        startunit="cps.service"
        stopunit1="calibre-server.service"
    elif payload == "0":
        logging.debug("Payload is 0 -> OFF")
        stopunit2="cps.service"
        stopunit1="calibre-server.service"
    else:
        logging.info("Payload is "+payload+" -> only send state")
    if stopunit1 != "":
        logging.debug("stop service "+stopunit1+"!")
        manager.stop_unit(stopunit1)
    if stopunit2 != "":
        logging.debug("stop service "+stopunit2+"!")
        manager.stop_unit(stopunit2)
    client.publish(MY_STATE, payload="0", qos=0, retain=False)
    logging.debug("published state 0 to "+MY_STATE)
    if startunit != "":
        logging.debug("wait until starting service!")
        time.sleep(10)
        logging.debug("starting service "+startunit+"!")
        manager.start_unit(startunit)
    logging.debug("publishing state")
    if manager.is_active("cps.service"):
        cpsstate="ON"
        client.publish(MY_STATE, payload="2", qos=0, retain=False)
        logging.debug("published state 2 to "+MY_STATE)
    else:
        cpsstate="OFF"
    if manager.is_active("calibre-server.service"):
        csstate="ON"
        client.publish(MY_STATE, payload="1", qos=0, retain=False)
        logging.debug("published state 1 to "+MY_STATE)
    else:
        csstate="OFF"
    client.publish(MQTT_PATH+"cs/state", payload=csstate, qos=0, retain=False)
    client.publish(MQTT_PATH+"cps/state", payload=cpsstate, qos=0, retain=False)
    logging.debug("published state "+csstate+" to "+MQTT_PATH+"cs/state")
    logging.debug("published state "+cpsstate+" to "+MQTT_PATH+"cps/state")

    # more callbacks, etc

client = mqtt.Client()
client.on_connect = on_connect
client.on_message = on_message
client.will_set(MQTT_PATH+"LWT", payload="Offline", qos=0, retain=True)

client.connect(MQTT_SERVER, MQTT_PORT, MQTT_RECONNECT)

# Blocking call that processes network traffic, dispatches callbacks and
# handles reconnecting.
# Other loop*() functions are available that give a threaded interface and a
# manual interface.
client.loop_forever()
mqttclient.service:

Code: Alles auswählen

[Install]
WantedBy=multi-user.target
Type=simple

[Service]
ExecStart=/usr/bin/python3 /usr/local/sbin/mqttclient.py
User=root
Restart=always
RestartSec=10
und /etc/default/mqttclient:

Code: Alles auswählen

[mqtt]
url = 192.168.178.155
port = 1883
reconnect = 60
path = calibre/
command = cmnd
state = state
lwt = LWT

[logging]
filename = /var/log/pymqtt.log
# CRITICAL=50 ERROR=40 WARNING=30 INFO=20 DEBUG=10 NOTSET=0
level = 30
Das Script stellt nicht wirklich fest, ob der entsprechende Dienst erfolgreich gestartet wurde (weil ich dazu zu faul war... funktioniert auch so zuverlässig)
Ich habe mehrere ähnliche Scripte, bei denen der Rumpf quasi identisch ist, lediglich die konkrete Funktion unterscheidet sich dann. Hier ist halt als "Herausforderung" Systemd mit im Spiel, was eher ungewöhnlich sein dürfte.
Logging und Configparser sind aber eine schöne Möglichkeit, die nötigen Einstellungen komfortabel vom eigentlichen Script zu trennen. Lohn ist ein Zweig im mqtt Baum, über den die beiden Dienste gestartet und gestoppt werden können. Das Script stellt dabei sicher, dass maximal einer der beiden Dienste läuft. So in etwa könntest Du ein externes Python Script zum Steuern des Projektors auch einbinden. Das Script läuft dann dauerhaft als Dienst, die Verbindung zu openHAB findet über mqtt statt und du bekommst ein Topic, in dem der Zustand gemeldet wird (in welcher Form auch immer... man könnte z.B. ein JSON Objekt zusammensetzen) und ein weiteres Topic, welches die Steuerbefehle als Klartext oder auch beliebig codiert entgegen nimmt. In openHAB brauchst Du dann nur entsprechende Gegenstücke, welche die Status darstellen und die Befehle (ggf. codiert) an mqtt senden.
mqtt ist wesentlich flexibler als exec, weshalb ich diesen Weg gewählt habe. Allerdings laufen die Scripte bei mir auch auf unterschiedlichen Rechnern, so dass ich ohnehin Netzwerkkommunikation brauche.
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

filmgucker2
Beiträge: 228
Registriert: 8. Apr 2020 20:59

Re: JVC Projector - Python Script

Beitrag von filmgucker2 »

Oha, eine solche Lösung würde bei Weitem meine digital-intellektuellen Fähigkeiten übersteigen...Und wenn ich diesen Weg
ginge, so würde ich garantiert wieder viel, viel hier nachfragen müssen und wertvolle Supportzeit in Anspruch nehmen. Denn auch in MQTT müsste ich mich erst lange einarbeiten. Bin halt ein Noob...Vielleicht kann man es so beschreiben: Ich koche gern, aber nur, um was Leckeres zu essen. Nicht um des Kochens willen. Von den jetzt 589 Items in meinem Openhab nutze ich tatsächlich wohl nicht viel mehr als 10%...Wenn ich meinen JVC mit openhab (dann auch Alexa) nutzen will, brauche ich eigentlich nur ein paar Funktionen: An/Ausschalten, PowerStatus, LensMemories so 3 verschiedene, je nach Eingangsquelle und ein paar Bildmodi. Die Python Datei enthält zwar fast 100 Befehle und Statusabfragen. Für die, wenn ich sie überhaupt jemals brauche, kann ich aber auch mal die Fernbedienung wieder rauskramen ..
Meine Nooblösung soll also so aussehen: Jeder Befehl kriegt eine Python Datei mit anderem "projector.command()" 8-) . Und die
wird dann jeweils mit executeCommandline ausgeführt mit Dummyitem...
Das entspricht dann auch wieder meinem Niveau... :D . Hättest Du vielleicht noch einen kleinen Tipp, wie ich den Status
abfrage?

Beste Grüße!
Raspberry Pi 4, OH 4.0.3

Antworten