rdmtc / RedMatic-HomeKit

HAP-Nodejs based Node-RED nodes to create (bridged) HomeKit Accessories
Apache License 2.0
61 stars 22 forks source link

redmatic-homekit-universal lightbulb für Farblampen #104

Open thinkcase opened 5 years ago

thinkcase commented 5 years ago

Ich versuche gerade eine innr Farblampe in HomeKit einzubinden, finde im redmatic-homekit-universal node jedoch nur die Möglichkeit eine normale lightbulb einzurichten, die ich in HomeKit dann nur Ein-, Ausschalten und Dimmen kann.

GIbt es eine Chance mit dem node auch die Farbauswahl in der Home-App von HomeKit zu ermöglichen?

hobbyquaker commented 5 years ago

Jap, Du musst die optionalen Characteristicen einfach einmal auf "irgendwas" setzen und dann erscheinen Sie bei dem Service auch. Siehe https://github.com/HM-RedMatic/RedMatic-HomeKit/issues/44#issuecomment-431591088

thinkcase commented 5 years ago

Danke mal für die Info, noch klappt es bei mir leider nicht:

Hab eine "universal node" auf 0 mit "Lightbulb" eingerichtet, und einen Inject davor mit Payload (JSON): {"0/Brightness":"100","0/ColorTemperature":"400"}.

Erhalte jedoch die Fehlermeldung: msg : string[16] -> "unknown subtype"

hobbyquaker commented 5 years ago

zeig ma bitte screenshots und ein flow export

thinkcase commented 5 years ago

bildschirmfoto 2019-01-06 um 20 59 05

thinkcase commented 5 years ago

bildschirmfoto 2019-01-08 um 20 11 37

Ich hab die Adresse der Bridge unkenntlich gemacht. Den flow hätte ich dir bereits per Email geschickt, da ich zu wenig Ahnung davon habe, ob da sensible Daten meines Netzwerks drinnen stehen. Hast du die Mail nicht erhalten?

hobbyquaker commented 5 years ago

Ich hab grad garnicht im Kopf ob man so mehrere Charakteristiken mit JSON payload setzen kann, muss ich nachschauen. Was aber auf jeden Fall gehen sollte ist dass Du jede Charakteristik einzeln setzt - ohne JSON, einfach mit einer Message in der Form

{
  "topic": "0/Brightness",
  "payload": 0
}

In einem Inject Node also so: image Mail kam an - aber der hobbyquaker-Account leidet grade unter mangelnder Disziplin und Übersicht ;-)

thinkcase commented 5 years ago

Danke – das hat zumindest mal soweit geklappt, dass ich in HomeKit jetzt eine Farbanzeige hab. Leider schaltet die noch nichts. Für mich sieht das auch eher nach einer Steuerung für eine Lampe mit unterschiedlichen Weißbereichen aus (da ich in Homekit nur zwischen Farben von Blauweiß bis Orange auswählen kann).

Ich hab mal die Farblampe ausgelesen und erhalte folgende Werte: bildschirmfoto 2019-01-08 um 21 44 12

thinkcase commented 5 years ago

Ich hab jetzt noch die Charakteristiken 0/Hue und 0/Saturation hinzugefügt. Damit hab ich jetzt zwar auch das volle Farbspektrum, meine Einstellungen in HomeKit haben jedoch keine Auswirkung auf die Lampe. Nur Ein und Aus klappt.

thinkcase commented 5 years ago

Ich hab jetzt die Hue-Node gewechselt, statt "node-red-contrib-huemagic" verwende ich nun "node-red-contrib-node-hue".

Damit klappt nun zumindest das Dimmen. Farben werden aber auch nicht gewechselt (wobei manche Farben zumindest die Helligkeit verändern, aber nicht den Farbwert!).

habeck76 commented 5 years ago

Mit den Huemagic-Nodes funktioniert das einwandfrei. Du kannst den Flow nicht nur so konfigurieren, dass du On, Brightness + ColorTemperature an die Lampe übermittelst, sondern du kannst die Werte auch zurück in die Lightbulp holen. D.h. wenn du über die Hue-App oder manuell schaltest, holst du die aktuellen Werte auch direkt ins Homekit. Wichtig zu wissen ist, dass die Light-Node nur zuverlässig mit original Hue-Lampen funktioniert. Wenn keine Philips Geräte eingesetzt werden, funktioniert das aber immer top über die Groups. Saturation hat bei mir auch keinen Effekt. Das mit dem Farbwert bei den RGB-Lampen habe ich aber auch noch nicht hinbekommen. Problem ist ist die Umwandlung des HUE-Wertes in RGB oder HEX. Vielleicht kann da jemand helfen?

thinkcase commented 5 years ago

Wie in meinem Ausgangspost geschrieben, verwende ich innr Farblampen und da klappt aktuell nur Ein/Aus + Helligkeit.

Kannst du mir das mit den Groups bitte näher erklären?

Deinem Request schließe ich mich an, und verweise mal auf den Blogpost: https://www.imakeyouintelligent.com/node-red-nicht-homekit-zertifizierte-lampen-an-homekit-anbinden-via-hue-teil1/

Leider dürfte der Code von der Blogsoftware verändert worden sein und ist nicht zu verwenden. Der Autor hat bisher leider auch auf meine Email-Anfrage nicht reagiert.

EDIT: Ich hab es jetzt mit einer offiziellen HUE Lampe probiert und konnte damit auch keine Änderung der Farbe bewirken.

hobbyquaker commented 5 years ago

Vorneweg: Die Hue Charcteristik von HomeKit hat einen Wertebereich von 0-360, der Hue Wert den die Philips-API ausspuckt von 0-65535 für Philips Lampen und 0-65400 für Osram Lampen. Sprich das muss umgerechnet werden via einfachem Dreisatz in einem Function Node. Saturation muss glaube ich auch umgerechnet werden, ColorTemperature kann man iirc 1:1 durchreichen. Ich bastel mal ein Beispielflow bei Gelegenheit. Die Huemagic Nodes sind für den Anwendungsfall etwas dämlich, die geben den Hue Wert gar nicht raus seh ich grade... Umständlich dass wieder zurückzurechnen in ein Hue/Sat/Bri Wert, aber machbar. Ich denk mal drüber nach. Vielleicht gibt es auch andere Hue-Nodes für Node-RED die den Hue Wert rausgeben, ansonsten könnt man bei Hue-Magic auch mal ein PR stellen.

thinkcase commented 5 years ago

bildschirmfoto 2019-01-15 um 18 45 41

Hier einmal ein Test mit zwei unterschiedlichen Lampen und zwei verschiedenen Nodes. Bei Verwendung von "node-red-contrib-huemagic" funktioniert nur Ein/Aus, bei "node-red-contrib-node-hue" zusätzlich auch die Helligkeit. Farbe geht bei beiden nicht.

hobbyquaker commented 5 years ago

Ja, so einfach ists leider nicht. Zwischen das universal accessory und die HueMagic Nodes müssen definitiv noch change/function Nodes die die Topics/Payloads anpassen. Gebt mir etwas Zeit, ich mach n Beispielflow.

ptweety commented 5 years ago

Den gibt es doch schon hier https://github.com/HM-RedMatic/RedMatic-HomeKit/issues/44#issuecomment-431985389

hobbyquaker commented 5 years ago

ah top, ganz vergessen. magst den mal ins wiki kopieren?

thinkcase commented 5 years ago

Ich hab es damit jetzt tatsächlich auch hinbekommen.

Ich musste jedoch ColorTemperature entfernen, da ich sonst ein falsches Farbspektrum in der Farbauswahl/Temperatur in HomeKit erhalte und die Farbauswahl dann verbuggt ist.

Mit einem inject von ColorTemperature ist die Farbtemperatur von Orange bis Weiß möglich, ohne von Orange bis Blau.

Also mein inject sieht jetzt so aus für 2 Lampen:

{"0/Brightness":"100","0/Hue":"360","0/Saturation":"100",
"1/Brightness":"100","1/Hue":"360","1/Saturation":"100"}
ptweety commented 5 years ago

@hobbyquaker` ich habe mal etwas Text dazu geschrieben und das Beispiel sowohl für node-red-contrib-node-hue als auch node-red-contrib-huemagic gebaut.

kannst du bitte mal drüberschauen und eine kleine Qualitätssicherung machen?

[{"id":"e65ca9c2.4b0b68","type":"comment","z":"d1553ba8.467ce","name":"Wohnzimmer - Beispiel (node-red-contrib-node-hue)","info":"Voraussetzungen:\n- Philips Hue Bridge\n- Lampen(-gruppen) in Hue-App definiert\n\nZiel:\n- Alle Lampen(-gruppen) sind in der Hue- und in der Home-App steuerbar und synchron\n\nVorbereitung:\n- Hue Bridge in jedem hue node neu erstellen oder auswählen\n- Gruppe oder Licht auswählen und die ID merken\n- Homekit Bridge im universal accessory neu erstellen oder auswählen\n- Pro Gruppe oder Licht einen lightbulb anlegen\n\nWichtig:\n- Die Reihenfolge der Gruppen oder Lampen ist ab jetzt entscheidend\n- Im Beispiel sind die Gruppen 8, 10, 9 und das Licht 2 den lightbulbs 0, 1, 2, 3 zugeordnet\n\nAnpassungen:\n- Im inject node \"init\" sind nun pro Gruppe oder Licht die jeweiligen Fähigkeiten zu definieren\n- In jedem function node \"modify\" ist das array der Gruppen und Lichter an deine Nummern anzupassen. Aus [8, 10, 9, 2] wird dann evtl. [21, 1, 7] oder [15, 14, 4, 9, 32]\n- Im change node \"route\" ist pro lightbulb eine Zeile anzulegen. Auch hier wieder ist die Reihenfolge von 0,..,3 den Gruppen und Lichter zuzuordnen","x":270,"y":100,"wires":[]},{"id":"a78546de.06ea18","type":"redmatic-homekit-universal","z":"d1553ba8.467ce","bridgeConfig":"","name":"Wohnen","services":[{"subtype":"0","service":"Lightbulb","name":"Deckenlampe"},{"subtype":"1","service":"Lightbulb","name":"Stehlampe Links"},{"subtype":"2","service":"Lightbulb","name":"Stehlampe Rechts"},{"subtype":"3","service":"Lightbulb","name":"Tischlampe"}],"x":500,"y":200,"wires":[["30e83299.512146"]]},{"id":"98b312b7.219728","type":"split","z":"d1553ba8.467ce","name":"","splt":"\\n","spltType":"str","arraySplt":"1","arraySpltType":"len","stream":false,"addname":"topic","x":470,"y":140,"wires":[["a78546de.06ea18"]]},{"id":"5d94178d.00b7f8","type":"inject","z":"d1553ba8.467ce","name":"init","topic":"","payload":"{\"0/Brightness\":\"100\",\"0/ColorTemperature\":\"400\",\"1/Brightness\":\"100\",\"1/ColorTemperature\":\"400\",\"2/Brightness\":\"100\",\"2/ColorTemperature\":\"400\",\"3/Brightness\":\"25\",\"3/ColorTemperature\":\"400\",\"3/Hue\":\"360\",\"3/Saturation\":\"100\"}","payloadType":"json","repeat":"","crontab":"","once":true,"onceDelay":0.1,"x":330,"y":140,"wires":[["98b312b7.219728"]]},{"id":"459921fd.e53188","type":"function","z":"d1553ba8.467ce","name":"modify","func":"const id = [8, 10, 9, 2].indexOf(parseInt(msg.info.id));\nconst cm = msg.info.capability.indexOf(msg.state.colormode);\n\nif (id >- 1) {\n  node.status({fill:\"blue\",shape:\"dot\",text: id+\" (cm: \"+msg.info.capability[cm]+\")\"});\n\n  return [[\n    { topic: id+\"/On\", payload: msg.payload.on},\n    [\"bri\", \"ct\"].includes(msg.info.capability[cm]) ?\n      { topic: id+\"/Brightness\", payload: msg.payload.bri} : undefined,\n    [\"ct\"].includes(msg.info.capability[cm]) ?\n      { topic: id+\"/ColorTemperature\", payload: msg.payload.ct} : undefined,\n    [\"hs\"].includes(msg.info.capability[cm]) ?\n      { topic: id+\"/Hue\", payload: msg.payload.hsv[0]} : undefined,\n    [\"hs\"].includes(msg.info.capability[cm]) ?\n      { topic: id+\"/Saturation\", payload: msg.payload.hsv[1]} : undefined\n  ]];\n} else {\n  node.status({});\n}","outputs":1,"noerr":0,"x":330,"y":200,"wires":[["a78546de.06ea18"]],"outputLabels":["original"]},{"id":"283fdbce.69a5f4","type":"node-hue-out","z":"d1553ba8.467ce","server":"","lightID":"<GroupId>","name":"Decke","x":170,"y":140,"wires":[["459921fd.e53188"]]},{"id":"e3cfda87.8d777","type":"node-hue-in","z":"d1553ba8.467ce","server":"","lightID":"<GroupId>","name":"Decke","x":950,"y":140,"wires":[]},{"id":"e0210296.43c52","type":"node-hue-in","z":"d1553ba8.467ce","server":"","lightID":"<GroupId>","name":"Steh L","x":950,"y":180,"wires":[]},{"id":"ba4fa06a.9d5f5","type":"node-hue-in","z":"d1553ba8.467ce","server":"","lightID":"<GroupId>","name":"Steh R","x":950,"y":220,"wires":[]},{"id":"1306637c.fd7d0d","type":"node-hue-in","z":"d1553ba8.467ce","server":"","lightID":"<LightId>","name":"Tisch","x":950,"y":260,"wires":[]},{"id":"3e269a1c.ec9a66","type":"node-hue-out","z":"d1553ba8.467ce","server":"","lightID":"<GroupId>","name":"Steh L","x":170,"y":180,"wires":[["459921fd.e53188"]]},{"id":"e8096b2f.16e0e8","type":"node-hue-out","z":"d1553ba8.467ce","server":"","lightID":"<GroupId>","name":"Steh R","x":170,"y":220,"wires":[["459921fd.e53188"]]},{"id":"bc10d8c9.e0697","type":"node-hue-out","z":"d1553ba8.467ce","server":"","lightID":"<LightId>","name":"Tisch","x":170,"y":260,"wires":[["459921fd.e53188"]]},{"id":"30e83299.512146","type":"function","z":"d1553ba8.467ce","name":"modify","func":"const ids = [8, 10, 9, 2];\nconst ops = {\n  'On': 'on',\n  'Brightness': 'bri',\n  'ColorTemperature': 'ct',\n  'Hue': 'hue',\n  'Saturation': 'sat'\n};\n\nif (ids[msg.topic.split('/')[0]] && ops[msg.topic.split('/')[1]]) {\n  let id = ids[msg.topic.split('/')[0]];\n  let op = ops[msg.topic.split('/')[1]];\n\n  node.status({fill:\"blue\",shape:\"dot\",text: id+\" (\"+op+\": \"+msg.payload+\")\"});\n\n  return [\n    { id: id, payload: {[op]: msg.payload} }\n  ];\n} else {\n  node.status({});\n}","outputs":1,"noerr":0,"x":650,"y":200,"wires":[["28488385.9a861c"]],"outputLabels":["original"]},{"id":"26f7b6ec.56056a","type":"comment","z":"d1553ba8.467ce","name":"Wohnzimmer - Beispiel (node-red-contrib-huemagic)","info":"Voraussetzungen:\n- Philips Hue Bridge\n- Lampen(-gruppen) in Hue-App definiert\n\nZiel:\n- Alle Lampen(-gruppen) sind in der Hue- und in der Home-App steuerbar und synchron\n\nVorbereitung:\n- Hue Bridge in jedem hue node neu erstellen oder auswählen\n- Gruppe oder Licht auswählen und die ID merken\n- Homekit Bridge im universal accessory neu erstellen oder auswählen\n- Pro Gruppe oder Licht einen lightbulb anlegen\n\nWichtig:\n- Die Reihenfolge der Gruppen oder Lampen ist ab jetzt entscheidend\n- Im Beispiel sind die Gruppen 8, 10, 9 und das Licht 2 den lightbulbs 0, 1, 2, 3 zugeordnet\n\nAnpassungen:\n- Im inject node \"init\" sind nun pro Gruppe oder Licht die jeweiligen Fähigkeiten zu definieren\n- In jedem function node \"modify\" ist das array der Gruppen und Lichter an deine Nummern anzupassen. Aus [8, 10, 9, 2] wird dann evtl. [21, 1, 7] oder [15, 14, 4, 9, 32]\n- Im change node \"route\" ist pro lightbulb eine Zeile anzulegen. Auch hier wieder ist die Reihenfolge von 0,..,3 den Gruppen und Lichter zuzuordnen","x":270,"y":320,"wires":[]},{"id":"c190d3ae.ded6e","type":"split","z":"d1553ba8.467ce","name":"","splt":"\\n","spltType":"str","arraySplt":"1","arraySpltType":"len","stream":false,"addname":"topic","x":470,"y":360,"wires":[["655ff827.a14ca8"]]},{"id":"4cbe6147.0edf18","type":"hue-group","z":"d1553ba8.467ce","name":"Steh R","bridge":"","groupid":"<GroupId>","colornamer":true,"x":950,"y":440,"wires":[["9da5841f.627f48"]]},{"id":"d000c7b2.2647f","type":"hue-group","z":"d1553ba8.467ce","name":"Steh L","bridge":"","groupid":"<GroupId>","colornamer":true,"x":950,"y":400,"wires":[["9da5841f.627f48"]]},{"id":"e3888f7c.50d2d","type":"hue-light","z":"d1553ba8.467ce","name":"Tisch","bridge":"","lightid":"<LightId>","colornamer":true,"x":950,"y":480,"wires":[["9da5841f.627f48"]]},{"id":"a57f64ba.7cafe8","type":"hue-group","z":"d1553ba8.467ce","name":"Decke","bridge":"","groupid":"<GroupId>","colornamer":true,"x":950,"y":360,"wires":[["9da5841f.627f48"]]},{"id":"f7f15ac5.ffac5","type":"function","z":"d1553ba8.467ce","name":"modify","func":"const id = [8, 10, 9, 2].indexOf(parseInt(msg.info.id));\nconst cm = msg.payload.colorTemp !== undefined ? 'ct' : 'bri';\n \nif (id >- 1) {\n  node.status({fill:'blue',shape:'dot',text: id+' (cm: '+cm+')'});\n \n  return [[\n      { topic: id+'/On', payload: msg.payload.on },\n      ['bri', 'ct'].includes(cm) ?\n        { topic: id+'/Brightness', payload: msg.payload.brightness} : undefined,\n      ['ct'].includes(cm) ?\n        { topic: id+'/ColorTemperature', payload: msg.payload.colorTemp} : undefined\n    ]];\n} else {\n  node.status({});\n}","outputs":1,"noerr":0,"x":330,"y":420,"wires":[["655ff827.a14ca8"]]},{"id":"2bb34ad.8e1e836","type":"function","z":"d1553ba8.467ce","name":"modify","func":"const ids = [8, 10, 9, 2];\nconst ops = {\n  'On': 'on',\n  'Brightness': 'brightness',\n  'ColorTemperature': 'colorTemp',\n  'Saturation': 'saturation'\n};\n \nif (ids[msg.topic.split('/')[0]] && ops[msg.topic.split('/')[1]]) {\n  let id = ids[msg.topic.split('/')[0]];\n  let op = ops[msg.topic.split('/')[1]];\n \n  node.status({fill:'blue',shape:'dot',text: id+' ('+op+': '+msg.payload+')'});\n \n  return [{ id: id, payload: {[op]: msg.payload} }];\n} else {\n  node.status({});\n}","outputs":1,"noerr":0,"x":650,"y":420,"wires":[["d1fd3fd2.7ac07"]]},{"id":"d1fd3fd2.7ac07","type":"switch","z":"d1553ba8.467ce","name":"route","property":"id","propertyType":"msg","rules":[{"t":"eq","v":"8","vt":"num"},{"t":"eq","v":"10","vt":"num"},{"t":"eq","v":"9","vt":"num"},{"t":"eq","v":"2","vt":"num"}],"checkall":"true","repair":false,"outputs":4,"x":790,"y":420,"wires":[["a57f64ba.7cafe8"],["d000c7b2.2647f"],["4cbe6147.0edf18"],["e3888f7c.50d2d"]]},{"id":"581b11ea.4dc28","type":"link in","z":"d1553ba8.467ce","name":"","links":["9da5841f.627f48","c65bd187.b8e9a"],"x":235,"y":420,"wires":[["f7f15ac5.ffac5"]]},{"id":"9da5841f.627f48","type":"link out","z":"d1553ba8.467ce","name":"","links":["581b11ea.4dc28"],"x":1075,"y":420,"wires":[]},{"id":"655ff827.a14ca8","type":"redmatic-homekit-universal","z":"d1553ba8.467ce","bridgeConfig":"","name":"Wohnen","services":[{"subtype":"0","service":"Lightbulb","name":"Deckenlampe"},{"subtype":"1","service":"Lightbulb","name":"Stehlampe Links"},{"subtype":"2","service":"Lightbulb","name":"Stehlampe Rechts"},{"subtype":"3","service":"Lightbulb","name":"Tischlampe"}],"x":500,"y":420,"wires":[["2bb34ad.8e1e836"]]},{"id":"28488385.9a861c","type":"switch","z":"d1553ba8.467ce","name":"route","property":"id","propertyType":"msg","rules":[{"t":"eq","v":"8","vt":"num"},{"t":"eq","v":"10","vt":"num"},{"t":"eq","v":"9","vt":"num"},{"t":"eq","v":"2","vt":"num"}],"checkall":"true","repair":false,"outputs":4,"x":790,"y":200,"wires":[["e3cfda87.8d777"],["e0210296.43c52"],["ba4fa06a.9d5f5"],["1306637c.fd7d0d"]]},{"id":"59b40167.d2ce08","type":"inject","z":"d1553ba8.467ce","name":"init","topic":"","payload":"{\"0/Brightness\":\"100\",\"0/ColorTemperature\":\"400\",\"1/Brightness\":\"100\",\"1/ColorTemperature\":\"400\",\"2/Brightness\":\"100\",\"2/ColorTemperature\":\"400\",\"3/Brightness\":\"25\",\"3/ColorTemperature\":\"400\",\"3/Hue\":\"360\",\"3/Saturation\":\"100\"}","payloadType":"json","repeat":"","crontab":"","once":true,"onceDelay":0.1,"x":330,"y":360,"wires":[["c190d3ae.ded6e"]]}]