In Teil 1 möchte ich erklären wie, wir eine nicht Apple HomeKit zertifizierte Lampe die wir in unserer Hue App haben via Node-Red im Apple HomeKit anbinden. Dies kann z.b eine IKEA Tradfri,  Innr oder OSRAM Lightify sein. Diese Lampen lassen sich alle an das Philips Hue System binden – jedoch fehlt dann die Integration ins Apple HomeKit.

Ich werde in Teil 1 erst einmal nur auf den Weg eingehen die Lampe im Apple HomeKit zu sehen und dass sie die Änderungen aus der Philips Hue App bemerkt und Ihren Status dahingehend ändert.

Die Hürde, die wir hier haben ist die Umrechnung der Licht/Farbwerte aus der Philips Hue App ins Apple HomeKit. Wir müssen als RGB welche uns die HUE App liefert in das von Apple geforderte Format HSL umrechnen.

Dies habe ich mit einer Funktionsnode und der folgenden Formel erledigt:

/** * Converts an RGB color value to HSL. Conversion formula * adapted from http://en.wikipedia.org/wiki/HSL_color_space. * Assumes r, g, and b are contained in the set [0, 255] and * returns h, s, and l in the set [0, 1]. * * @param {number} r The red color value * @param {number} g The green color value * @param {number} b The blue color value * @return {Array} The HSL representation */ function rgbToHsl(r, g, b){ r /= 255, g /= 255, b /= 255; var max = Math.max(r, g, b), min = Math.min(r, g, b); var h, s, l = (max + min) / 2; if(max == min){ h = s = 0; // achromatic }else{ var d = max – min; s = l > 0.5 ? d / (2 – max – min) : d / (max + min); switch(max){ case r: h = (g – b) / d + (g < b ? 6 : 0); break; case g: h = (b – r) / d + 2; break; case b: h = (r – g) / d + 4; break; } h /= 6; } return [h, s, l];

Zu sehen hier ist der fertige Flow in Node-Red:

In meiner Beschreibung arbeite ich mit einer Innr, dies spielt jedoch keine Rolle beim anlegen des Flows. Nach erfolgreichem hinzufügen der in Node-Red neu angelegten Lampe wird diese im Apple HomeKit wie folgt angezeigt

    

Mit diesem Flow ist es nun möglich die Änderungen der Hue-Lampe im AppleHomeKit zu sehen. Der komplette Flow zum importieren:

[{„id“:“8f898b4.d25a778″,“type“:“debug“,“z“:“27ae8d45.93d07a“,“name“:““,“active“:true,“console“:“false“,“complete“:“true“,“x“:990,“y“:1020,“wires“:[]},{„id“:“8ae927b8.6131b8″,“type“:“hue-light“,“z“:“27ae8d45.93d07a“,“name“:“Lampe Kleiderschrank“,“bridge“:“7bbf47a6.f94908″,“lightid“:“10″,“x“:340,“y“:780,“wires“:[[„63259b2b.c68274“]]},{„id“:“79edc8eb.e3258″,“type“:“inject“,“z“:“27ae8d45.93d07a“,“name“:“Ausschalten“,“topic“:““,“payload“:“false“,“payloadType“:“bool“,“repeat“:““,“crontab“:““,“once“:false,“x“:130,“y“:940,“wires“:[[„8ae927b8.6131b8“]]},{„id“:“4c4c2cdc.1b76c4″,“type“:“inject“,“z“:“27ae8d45.93d07a“,“name“:“Einschalten“,“topic“:““,“payload“:“true“,“payloadType“:“bool“,“repeat“:““,“crontab“:““,“once“:false,“x“:130,“y“:900,“wires“:[[„8ae927b8.6131b8“]]},{„id“:“1ab1f8f2.ce461f“,“type“:“function“,“z“:“27ae8d45.93d07a“,“name“:“Rot“,“func“:“msg.payload={\n\“on\“:[true],\n\“transitiontime\“:[5],\n\“bri\“:[100],\n\“rgb\“:[255,0,0]\n}\nreturn msg;\n“,“outputs“:1,“noerr“:0,“x“:270,“y“:1000,“wires“:[[„8ae927b8.6131b8“]]},{„id“:“8d08fc80.634d38″,“type“:“inject“,“z“:“27ae8d45.93d07a“,“name“:““,“topic“:““,“payload“:““,“payloadType“:“date“,“repeat“:““,“crontab“:““,“once“:false,“x“:120,“y“:1000,“wires“:[[„1ab1f8f2.ce461f“]]},{„id“:“68ad4cf8.166f44″,“type“:“function“,“z“:“27ae8d45.93d07a“,“name“:“Grün“,“func“:“msg.payload={\n\“on\“:[true],\n\“transitiontime\“:[5],\n\“bri\“:[100],\n\“rgb\“:[0,255,0]\n}\nreturn msg;\n“,“outputs“:1,“noerr“:0,“x“:270,“y“:1040,“wires“:[[„8ae927b8.6131b8“]]},{„id“:“9b1304da.36eff“,“type“:“inject“,“z“:“27ae8d45.93d07a“,“name“:““,“topic“:““,“payload“:““,“payloadType“:“date“,“repeat“:““,“crontab“:““,“once“:false,“x“:120,“y“:1040,“wires“:[[„68ad4cf8.166f44“]]},{„id“:“c5bf1afd.52427″,“type“:“homekit-service“,“z“:“27ae8d45.93d07a“,“accessory“:“299f9416.0ec254″,“name“:““,“serviceName“:“Lightbulb“,“x“:680,“y“:780,“wires“:[[„15f5e4fa.608d6b“]]},{„id“:“63259b2b.c68274″,“type“:“function“,“z“:“27ae8d45.93d07a“,“name“:“Schnitstelle“,“func“:“var ausgabe = {};\n\nausgabe[\“Brightness\“] = msg.payload.brightness;\nausgabe[\“On\“] = msg.payload.on;\n\nausgabe[\“Hue\“] = rgbToHsl(msg.payload.rgb[0],msg.payload.rgb[1],msg.payload.rgb[2])[0]\nausgabe[\“Saturation\“] = rgbToHsl(msg.payload.rgb[0],msg.payload.rgb[1],msg.payload.rgb[2])[1]\nausgabe[\“ColorTemperature\“] = rgbToHsl(msg.payload.rgb[0],msg.payload.rgb[1],msg.payload.rgb[2])[2]\n\nmsg.payload = ausgabe;\ndelete msg.info;\nreturn msg;\n\n\n\n\n\n\n\n\n/**\n * Converts an RGB color value to HSL. Conversion formula\n * adapted from http://en.wikipedia.org/wiki/HSL_color_space.\n * Assumes r, g, and b are contained in the set [0, 255] and\n * returns h, s, and l in the set [0, 1].\n *\n * @param {number} r The red color value\n * @param {number} g The green color value\n * @param {number} b The blue color value\n * @return {Array} The HSL representation\n */\nfunction rgbToHsl(r, g, b){\n r /= 255, g /= 255, b /= 255;\n var max = Math.max(r, g, b), min = Math.min(r, g, b);\n var h, s, l = (max + min) / 2;\n\n if(max == min){\n h = s = 0; // achromatic\n }else{\n var d = max – min;\n s = l > 0.5 ? d / (2 – max – min) : d / (max + min);\n switch(max){\n case r: h = (g – b) / d + (g < b ? 6 : 0); break;\n case g: h = (b – r) / d + 2; break;\n case b: h = (r – g) / d + 4; break;\n }\n h /= 6;\n }\n\n return [h, s, l];\n}“,“outputs“:1,“noerr“:0,“x“:530,“y“:780,“wires“:[[„c5bf1afd.52427“]]},{„id“:“15f5e4fa.608d6b“,“type“:“function“,“z“:“27ae8d45.93d07a“,“name“:“Schnitstelle“,“func“:“var ausgabe = {};\nausgabe[\“rgb\“] = {};\n\nausgabe[\“brightness\“] = msg.payload.Brightness;\nausgabe[\“on\“] = msg.payload.On;\n\nausgabe[\“rgb\“][0] = hslToRgb(msg.payload.Hue, msg.payload.Saturation, msg.payload.ColorTemperature)[0]\nausgabe[\“rgb\“][1] = hslToRgb(msg.payload.Hue, msg.payload.Saturation, msg.payload.ColorTemperature)[1]\nausgabe[\“rgb\“][2] = hslToRgb(msg.payload.Hue, msg.payload.Saturation, msg.payload.ColorTemperature)[2]\n\nmsg.payload = ausgabe;\ndelete msg.hab;\nreturn msg;\n\n\n\n\n\n/**\n * Converts an HSL color value to RGB. Conversion formula\n * adapted from http://en.wikipedia.org/wiki/HSL_color_space.\n * Assumes h, s, and l are contained in the set [0, 1] and\n * returns r, g, and b in the set [0, 255].\n *\n * @param {number} h The hue\n * @param {number} s The saturation\n * @param {number} l The lightness\n * @return {Array} The RGB representation\n */\nfunction hslToRgb(h, s, l){\n var r, g, b;\n\n if(s == 0){\n r = g = b = l; // achromatic\n }else{\n var hue2rgb = function hue2rgb(p, q, t){\n if(t < 0) t += 1;\n if(t > 1) t -= 1;\n if(t < 1/6) return p + (q – p) * 6 * t;\n if(t < 1/2) return q;\n if(t < 2/3) return p + (q – p) * (2/3 – t) * 6;\n return p;\n }\n\n var q = l < 0.5 ? l * (1 + s) : l + s – l * s;\n var p = 2 * l – q;\n r = hue2rgb(p, q, h + 1/3);\n g = hue2rgb(p, q, h);\n b = hue2rgb(p, q, h – 1/3);\n }\n\n return [Math.round(r * 255), Math.round(g * 255), Math.round(b * 255)];\n}“,“outputs“:1,“noerr“:0,“x“:830,“y“:780,“wires“:[[„8f898b4.d25a778“]]},{„id“:“7bbf47a6.f94908″,“type“:“hue-bridge“,“z“:““,“name“:“Philips hue 2.OG“,“bridge“:“192.168.178.82″,“key“:“1c9-iDOTUO1F6sdEy3rYArh6oYkrbH9zHy3eXwpO“,“interval“:“3000″},{„id“:“299f9416.0ec254″,“type“:“homekit-accessory“,“z“:““,“accessoryName“:“HueTest“,“pinCode“:“111-11-111″,“port“:““,“manufacturer“:“Default Manufacturer“,“model“:“Default Model“,“serialNo“:“Default Serial Number“,“accessoryType“:“5″}]

[ratings id=“4221″]

WordPress Cookie Hinweis von Real Cookie Banner
Datenschutz
, Inhaber: (Firmensitz: Deutschland), verarbeitet zum Betrieb dieser Website personenbezogene Daten nur im technisch unbedingt notwendigen Umfang. Alle Details dazu in der Datenschutzerklärung.
Datenschutz
, Inhaber: (Firmensitz: Deutschland), verarbeitet zum Betrieb dieser Website personenbezogene Daten nur im technisch unbedingt notwendigen Umfang. Alle Details dazu in der Datenschutzerklärung.