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

    • @Glemp hast du alles auf der box editiert oder im Vorfeld mit nem editor?
    • ja so hab ichs auch gemacht...mich wundert nur der Fehler der bei uns beiden gleichermaßen auftritt, also die letzte Zeile

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von J_Ryan ()

    • Hallo Kollegen,

      ich möchte mal die Lösung von @Glemp aufgreifen und die nachfolgende Code-Beispiele beisteuern.

      Ausgabe: Shell-Ebene



      Python-Quellcode

      1. from socket import socket, AF_INET, SOCK_DGRAM
      2. from dtls import do_patch
      3. import requests
      4. import binascii
      5. import sslpsk
      6. import json
      7. BRIDGE_IP = '192.168.X.XX'
      8. VALID_API_VERSION = 1.22
      9. USERNAME = '------USERNAME eintragen-----------------'
      10. CLIENT_KEY = '-----Clientkey eintragen ------'
      11. STREAMING_PORT = 2100
      12. # Check aktuelle Version der Hue Bridge, notwendig ist > 1.22 fuer Entertainment
      13. def check_bridge_version(ip):
      14. url = 'http://%s/api/config' % ip
      15. r = requests.get(url).json()
      16. api_version_raw = r['apiversion']
      17. final_period = api_version_raw.rfind('.')
      18. api_version = float(api_version_raw[0:final_period])
      19. print ('API-Version: %s' % api_version)
      20. if api_version >= VALID_API_VERSION:
      21. return True
      22. return False
      23. # Ermittlung Entertainment-Group
      24. # Eingabe: IP
      25. # Rueckgabe: Datensatz der Entertainmentgroup
      26. def get_entertainment_groups(ip):
      27. url = 'http://%s/api/%s/groups' % (ip, USERNAME)
      28. r = requests.get(url)
      29. groups = r.json()
      30. entertainment_groups = {}
      31. for group_id in groups:
      32. group = groups[group_id]
      33. #print ('group: %s' % group)
      34. if group['type'] == 'Entertainment':
      35. entertainment_groups[group_id] = group
      36. print ('Entertainment-Group-ID: %s' % group_id)
      37. #print ('Entertainment-Groups: %s' % entertainment_groups[group_id])
      38. return entertainment_groups
      39. # Streammodus setzen
      40. # Eingabe: Betreffende Entertainment-Group-ID + State fuer Stream
      41. # Rueckgabe: Info, ob Steammodus gesetzt ist
      42. def toggle_group_streaming(group_id, state):
      43. url = 'http://%s/api/%s/groups/%s' % (BRIDGE_IP, USERNAME, group_id)
      44. data = {
      45. 'stream': {
      46. 'active': state
      47. }
      48. }
      49. body = json.dumps(data)
      50. #print (body)
      51. r = requests.put(url, data=body, timeout=5)
      52. print (r.json())
      53. # Handshake und Ubertragung Datenstream
      54. # Eingabe: keine
      55. # Rueckgabe: Info, Daten gesetzt
      56. def dtls_handshake():
      57. psk = bin(int(binascii.hexlify(CLIENT_KEY), 16))
      58. do_patch()
      59. s = socket(AF_INET, SOCK_DGRAM)
      60. s.connect((BRIDGE_IP, STREAMING_PORT))
      61. sock = sslpsk.wrap_socket(s,
      62. psk=psk,
      63. hint=USERNAME,
      64. ciphers='PSK-AES128-CBC-SHA')
      65. message = 'ping'
      66. sock.sendto(message, (BRIDGE_IP, STREAMING_PORT))
      67. msg = s.recv(4)
      68. print ('Client received: %s' % msg)
      69. # Anlage User fuer Entertainment-Group
      70. # Eingabe: IP-Hue-Bridge
      71. # Rueckgabe: Username + Clientkey
      72. def entertainment_registration(ip):
      73. url = 'http://%s/api/' % ip
      74. data = {
      75. 'devicetype': 'myapplication#myiphone',
      76. 'generateclientkey': True
      77. }
      78. body = json.dumps(data)
      79. r = requests.post(url, data=body, timeout=5)
      80. if __name__ == '__main__':
      81. if check_bridge_version(BRIDGE_IP): # Check API
      82. print ('Bridge API version is OK!')
      83. # entertainment_registration(BRIDGE_IP) # Anlage User
      84. GROUPS = get_entertainment_groups(BRIDGE_IP)
      85. print ('GROUPS: %s' % GROUPS)
      86. toggle_group_streaming(4, True) # Streammodus: Ein
      87. #dtls_handshake() # Datentransfer
      88. toggle_group_streaming(4, False) # Streammodus: Aus
      89. else:
      90. print ('Bridge API Version ist nicht aktuell fuer Hue Entertainment.')
      91. print ('Es wird eine Bridge groesser 2.0 mit aktueller Firmware benoetigt!')
      Alles anzeigen
      Damit kann man die nachfolgenden Zeilen 41 bis 47 von "Enigmalight_hue_1cx.py" ändern/austauschen.


      Quellcode

      1. ....
      2. if (counter>=13):
      3. connection = httplib.HTTPConnection(ip, timeout=10)
      4. lparams = {'xy': converter.rgb_to_xy(lr,lg,lb), 'colormode': 'xy', 'bri': int(lll), 'on': True}
      5. connection.request('PUT', lurl, json.dumps(lparams))
      6. response = connection.getresponse()
      7. connection.close()
      8. counter=0
      9. .....
      Alles anzeigen

      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
      wesseli

      Dieser 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?
    • @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:

      Quellcode

      1. root@vusolo4k:/# python ./hue.py
      2. File "./hue.py", line 1
      3. {\rtf1\ansi\ansicpg1252\cocoartf1561\cocoasubrtf200
      4. ^
      5. SyntaxError: unexpected character after line continuation character
      Ich gehe mal davon aus, dass mir die notwendigen Bibliotheken fehlen, oder?
    • ja @wesseli , sehr geile Sache. also entertainuser hab ich anlegen können...aber die Gruppe nicht...
      die hab ich dann mal in der hue app angelegt, allerdings steht da nen anderer owner drunter wenn man es abfragt, ist das egal?
    • 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.
      Dateien
    • @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 ()

    • @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

      1. {
      2. 'H', 'u', 'e', 'S', 't', 'r', 'e', 'a', 'm', //protocol
      3. 0x01, 0x00, //version 1.0
      4. 0x07, //sequence number 7
      5. 0x00, 0x00, //Reserved write 0’s
      6. 0x00, //color mode RGB
      7. 0x00, // Reserved, write 0’s
      8. 0x00, 0x00, 0x01, //light ID 1
      9. 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, //red
      10. 0x00, 0x00, 0x02, //light ID 2
      11. 0x00, 0x00, 0x00, 0x00, 0xff, 0xff //blue
      12. }
      Alles anzeigen
      Eigentlich werden nur die Funktionen
      1. toggle_group_streaming(4, True) # Streammodus: Ein
      2. dtls_handshake(stream) # Datentransfer mit stream, wie zuvor beschrieben
      3. toggle_group_streaming(4, False) # Streammodus: Aus
      benötigt, wenn die Entertainment-Gruppe (hier '4') bekannt ist.

      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:

      Quellcode

      1. opkg install python-pkgutil
      2. opkg install python-unittest
      3. opkg install python-compile
      4. cd /tmp
      5. wget https://bootstrap.pypa.io/ez_setup.py -O ez_setup.py
      6. python ez_setup.py
      7. easy_install pip
      8. pip install dtls
      Allerdings komme mit SSLPSK nicht weiter, da ich weder Pakete für libssl-dev noch Python-dev finde.