Philips Hue Leuchten mit Enigmalight steuern
Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen
-
-
Zuvor mit TextWrangler editiert und dann zur Box übertragen
-
-
Hallo Kollegen,
ich möchte mal die Lösung von @Glemp aufgreifen und die nachfolgende Code-Beispiele beisteuern.
Ausgabe: Shell-Ebene
Python-Quellcode
- from socket import socket, AF_INET, SOCK_DGRAM
- from dtls import do_patch
- import requests
- import binascii
- import sslpsk
- import json
- BRIDGE_IP = '192.168.X.XX'
- VALID_API_VERSION = 1.22
- USERNAME = '------USERNAME eintragen-----------------'
- CLIENT_KEY = '-----Clientkey eintragen ------'
- STREAMING_PORT = 2100
- # Check aktuelle Version der Hue Bridge, notwendig ist > 1.22 fuer Entertainment
- def check_bridge_version(ip):
- url = 'http://%s/api/config' % ip
- r = requests.get(url).json()
- api_version_raw = r['apiversion']
- final_period = api_version_raw.rfind('.')
- api_version = float(api_version_raw[0:final_period])
- print ('API-Version: %s' % api_version)
- if api_version >= VALID_API_VERSION:
- return True
- return False
- # Ermittlung Entertainment-Group
- # Eingabe: IP
- # Rueckgabe: Datensatz der Entertainmentgroup
- def get_entertainment_groups(ip):
- url = 'http://%s/api/%s/groups' % (ip, USERNAME)
- r = requests.get(url)
- groups = r.json()
- entertainment_groups = {}
- for group_id in groups:
- group = groups[group_id]
- #print ('group: %s' % group)
- if group['type'] == 'Entertainment':
- entertainment_groups[group_id] = group
- print ('Entertainment-Group-ID: %s' % group_id)
- #print ('Entertainment-Groups: %s' % entertainment_groups[group_id])
- return entertainment_groups
- # Streammodus setzen
- # Eingabe: Betreffende Entertainment-Group-ID + State fuer Stream
- # Rueckgabe: Info, ob Steammodus gesetzt ist
- def toggle_group_streaming(group_id, state):
- url = 'http://%s/api/%s/groups/%s' % (BRIDGE_IP, USERNAME, group_id)
- data = {
- 'stream': {
- 'active': state
- }
- }
- body = json.dumps(data)
- #print (body)
- r = requests.put(url, data=body, timeout=5)
- print (r.json())
- # Handshake und Ubertragung Datenstream
- # Eingabe: keine
- # Rueckgabe: Info, Daten gesetzt
- def dtls_handshake():
- psk = bin(int(binascii.hexlify(CLIENT_KEY), 16))
- do_patch()
- s = socket(AF_INET, SOCK_DGRAM)
- s.connect((BRIDGE_IP, STREAMING_PORT))
- sock = sslpsk.wrap_socket(s,
- psk=psk,
- hint=USERNAME,
- ciphers='PSK-AES128-CBC-SHA')
- message = 'ping'
- sock.sendto(message, (BRIDGE_IP, STREAMING_PORT))
- msg = s.recv(4)
- print ('Client received: %s' % msg)
- # Anlage User fuer Entertainment-Group
- # Eingabe: IP-Hue-Bridge
- # Rueckgabe: Username + Clientkey
- def entertainment_registration(ip):
- url = 'http://%s/api/' % ip
- data = {
- 'devicetype': 'myapplication#myiphone',
- 'generateclientkey': True
- }
- body = json.dumps(data)
- r = requests.post(url, data=body, timeout=5)
- if __name__ == '__main__':
- if check_bridge_version(BRIDGE_IP): # Check API
- print ('Bridge API version is OK!')
- # entertainment_registration(BRIDGE_IP) # Anlage User
- GROUPS = get_entertainment_groups(BRIDGE_IP)
- print ('GROUPS: %s' % GROUPS)
- toggle_group_streaming(4, True) # Streammodus: Ein
- #dtls_handshake() # Datentransfer
- toggle_group_streaming(4, False) # Streammodus: Aus
- else:
- print ('Bridge API Version ist nicht aktuell fuer Hue Entertainment.')
- print ('Es wird eine Bridge groesser 2.0 mit aktueller Firmware benoetigt!')
Quellcode
Bin aus Zeitgründen bisher nicht dazu gekommen. Der o.g. Code funktioniert gut. Mit der Funktion "dtls_handshake" können die Daten über die Hue API Entertainment-Schnittstelle, Port 2100, übertragen werden. Geht sehr schnell!
Viele Grüße
wesseliDieser Beitrag wurde bereits 1 mal editiert, zuletzt von wesseli ()
-
Das klingt ja sehr gut! Werde mir das Ganze direkt mal ansehen, wenn ich nach Hause komme. Bin sehr gespannt!
Verstehe ich dich richtig, dass ich mir lediglich einen Benutzer inkl. CLIENT_KEY erzeugen muss, die Informationen eintrage, den Code in der Python Datei austausche und es dann laufen sollte? -
ja ich will auch dringend heim
-
@Glemp
Nicht ganz:
1. User mit Funktion: "entertainment_registration" anlegen oder auch über Web, wie bei HUE beschrieben
2. Antwort: username + clientkey (dringend aufschreiben! - sieht man ihn nie wieder - wie bei HUE beschrieben)
3. Username + clientkey Im Script eintragen und starten
Packt den Code in eine Datei und legt diese auf die Box, startet mit python. Ihr könnt es aber auch von einem PC mit installiertem Python tun. Kann sein, dass auch noch die o.g. Module installieren müsst.
Anbei mal die Ausgaben: Es funktioniert!
Bildschirmfoto 2018-03-15 um 14.02.56.png
Die Funktion "dtls_handshake()" muß noch geändert bzw. angepasst werden. Sie führt nur ein "ping" (siehe Variable: message) als Stream aus. Das soll die Datenübergabe demonstrieren. Der notwendige Datenstream muß an die Variable übergeben werden. Das ist aber simpel. Komme aber im Moment aus Zeitgründen nicht dazu.
Seht es als einen Auftakt zur gemeinsamen Entwicklung.Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von wesseli ()
-
Alles klar! Dann halte ich nochmal die Füße still und lasse dich in Ruhe machen. Ist ja alles nicht zeitkristisch. Freue mich, wenn es dann irgendwann klappt.
Aber sehr schön, dass du dich der Sache annimmst. Vielen Dank dafür! -
Ich habe das Ganze gerade mal getestet. Bekomme sowohl auf dem Mac als auch auf der Box folgende Ausgabe:
Ich gehe mal davon aus, dass mir die notwendigen Bibliotheken fehlen, oder? -
-
Alles zurück! Ich hatte die Datei dummerweise als RTF erstellt und dann umbenannt. Daher waren noch Reste vorhanden.
Ich habe nun über Xcode alles überarbeitet und die Formatierung korrigiert, die bei mir irgendwie nicht passte (Python ist echt merkwürdig )
Nun bekomme ich aber einen Fehler, der wohl auf ein fehlendes Modul hindeutet
Spoiler anzeigen root@vusolo4k:/# python ./hue.py
Traceback (most recent call last):
File "./hue.py", line 2, in <module>
from dtls import do_patch
ImportError: No module named dtls
Ich habe mir mal erlaubt das Ganze in eine Datei zu packen und anzuhängen. -
@J_Ryan
Das ist völlig egal. Jeder User darf alles. Es geht im Grunde nur darum, dass der User auf der Bridge bekannt ist.
Normalerweise ist ja die App/Anwendung dafür zuständig einen User anzulegen. Das passiert, nachdem du aufgefordert wirst den Knopf an der Bridge zu drücken. Der User wird dann gespeichert und zukünftig verwendet. Es legt ja nicht jede App einen User für den Entertainmentbereich an.Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von Glemp ()
-
jo...nun hab ich deinen Codeschnipsel mal angepasst und dann legt er los und unten schneidet wieder etwas ab, ich dreh bald durch hier ist da zwischen UNO4k und solo4k was anders?
Spoiler anzeigen :~# /usr/bin/enigmalight
[InitLog] start of log /home/elight-addons/.enigmalight/enigmalight.log
[CConfig::LoadConfigFromFile] Opening /etc/enigmalight.conf
[CConfig::CheckConfig] checking config lines
[CConfig::CheckConfig] config lines valid
[CConfig::LoadConfigFromFile] Opening /etc/enigmalight.conf
[CConfig::BuildConfig] building config
[CConfig::BuildConfig] built config successfully
[main] Start device 1 from 1
[CDevice::Process] ambilight: starting with output "python /home/el"ght-addons/wifilight/philips_hue/enigmalight_hue_LR.py
[CDevice::Process] ambilight: setting up
[CEnigmaLight::SetColorSequence]Set colorsequence to RGB
[CGuiServer::Process] Start GuiServer
[CDevice::Process] set adjust 0 0 0
ambilight: setup succeeded1
[CFlagManager::SetVideoGamma] Gamma not set, using 2.2 since this is default for video
[CGuiServer::Process] Opening listening socket for Enigma2 GUI on 127.0.0.1:6767
[CMainLoop::Process] Starting grabber..
[CGrabber::Setup] Lights: 2, Cluster leds: 1 as one led
[CGrabber::Setup] Channels: 6
[CGrabber::Setup] Interval: 0.10
[CGrabber::Run] Mode -> Dynamic
[CGrabber::Run] Framegrabber initialized
[CGrabber::Run] Framegrabber Image initialized
[CGrabber::Run] Blackbar Detection initialized
[CGrabber::Run] Framegrabber set up
[CGrabber::Run] entering grabloop
[CFrameGrabber::CheckRes] Set Scanrange to 120x67 (Source 538976288x538976288)
python: can't open file '/home/elight-addons/wifilight/philips_hue/enigmalight_h': [Errno 2] No such file or directory
Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von J_Ryan ()
-
Das läuft doch auch noch gar nicht über EL. Das ist bisher noch in Arbeit. Wenn du es starten willst, geht es auch nicht über EL sondern nur über einen manuellen python Aufruf.
-
also deine Datei aufrufen? Sorry bin mehr Anwender als Entwickler
Spoiler anzeigen :~# /etc/hue_entertain_api.py
/etc/hue_entertain_api.py: line 1: from: not found
/etc/hue_entertain_api.py: line 2: from: not found
/etc/hue_entertain_api.py: line 3: import: not found
/etc/hue_entertain_api.py: line 4: import: not found
/etc/hue_entertain_api.py: line 5: import: not found
/etc/hue_entertain_api.py: line 6: import: not found
: not foundtertain_api.py: line 7:
/etc/hue_entertain_api.py: line 8: BRIDGE_IP: not found
/etc/hue_entertain_api.py: line 9: VALID_API_VERSION: not found
/etc/hue_entertain_api.py: line 10: USERNAME: not found
/etc/hue_entertain_api.py: line 11: CLIENT_KEY: not found
/etc/hue_entertain_api.py: line 12: STREAMING_PORT: not found
: not foundtertain_api.py: line 13:
: not foundtertain_api.py: line 14:
/etc/hue_entertain_api.py: line 16: syntax error: unexpected "(" -
Am besten lässt du erstmal alles wie es ist.
Der Code von @wesseli schaltet noch kein Licht. Bisher wird "nur" geprüft, ob die Bridge die richtige Version hat, es wird die Entertainmentgruppe ermittelt, diese in den Zustand "Stream" versetzt und dann ein PING hingeschickt.
Du siehst also nichts an deinen Lampen.Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Glemp ()
-
oh kay
-
@Glemp
Korrekt. Anbei mal ein Beispiel für das Protokoll, wie bei Hue beschrieben. So muss die Variable 'message' gefüllt sein. Den genauen Aufbau kann man dort nachlesen.
Quellcode
- {
- 'H', 'u', 'e', 'S', 't', 'r', 'e', 'a', 'm', //protocol
- 0x01, 0x00, //version 1.0
- 0x07, //sequence number 7
- 0x00, 0x00, //Reserved write 0’s
- 0x00, //color mode RGB
- 0x00, // Reserved, write 0’s
- 0x00, 0x00, 0x01, //light ID 1
- 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, //red
- 0x00, 0x00, 0x02, //light ID 2
- 0x00, 0x00, 0x00, 0x00, 0xff, 0xff //blue
- }
- toggle_group_streaming(4, True) # Streammodus: Ein
- dtls_handshake(stream) # Datentransfer mit stream, wie zuvor beschrieben
- toggle_group_streaming(4, False) # Streammodus: Aus
Komme aber im Moment nicht dazu, die restliche Anpassungen durchzuführen.
VG
wesseli -
@wesseli hast du evtl. einen Tip, wie ich das DTLS Modul hinzufügen muss. Aktuell bekomme ich diese Meldung:
Spoiler anzeigen root@vusolo4k:/# python ./hue.py
Traceback (most recent call last):
File "./hue.py", line 2, in <module>
from dtls import do_patch
ImportError: No module named dtls
Wenn es bei mir läuft, würde ich mich mal an der Message versuchen.Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Glemp ()
-
Moin,
bin mir nicht sicher, ob es eine einfachere Variante gibt:
Allerdings komme mit SSLPSK nicht weiter, da ich weder Pakete für libssl-dev noch Python-dev finde.