Phillips HUE mit Loxone verwenden

Einklappen
X
 
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge
  • fr4ntic
    Azubi
    • In den letzten 2 Wochen
    • 1

    Hallo

    Ich habe erfolgreich 2 Hue Bulbs (RGB) und 2 Enrave Ceiling Lights eingebunden. Da sowohl die Bulbs wie auch die Ceiling Lights immer zusammen geschalten werden sollen, wollte ich fragen, wie es funktioniert, dass ich die Lampen gruppiere?

    Beispiel Ceiling Lights: Bei diesem Lichtsteuerungsbaustein habe ich die beiden Merker für die Lampen auf einen Ausgang gelegt und im Progammbaustein, den Lampentyp 2 mal auf I1 und I2 gelegt. So schalten sie zwar miteinander.
    Aber im Programm gibt es ja auch die Option für Gruppen.
    Was genau muss ich das setzen, dass ich die beiden Ceiling Lights als Lichtgruppe im Hue Programm ansteuere?

    Das sind meine Settings
    Enrave Ceiling Lights
    inputType[2] = 0;
    inputType[3] = 0;

    Lichtsteuerungsbaustein
    Klicke auf die Grafik für eine vergrößerte Ansicht  Name: image.png Ansichten: 0 Größe: 23,5 KB ID: 445217

    Programmbaustein
    Klicke auf die Grafik für eine vergrößerte Ansicht  Name: image.png Ansichten: 0 Größe: 10,1 KB ID: 445216

    Wie weise ich nun die beiden Deckenlampe einer Gruppe im Hue Script zu?
    Klicke auf die Grafik für eine vergrößerte Ansicht  Name: image.png Ansichten: 0 Größe: 10,1 KB ID: 445218


    Und zweite Frage, kann man in der Hue App Szenen anlegen und diese dann auch über das Programm in Loxone ansteuern?
    Wie ich die Szenen IDs aus CLIP rausbekomme weiß ich? Verstehe nur nicht, wie man sie dann im Script zuweist.

    Vielen Dank vorab
    ​​
    Zuletzt geändert von fr4ntic; In den letzten 2 Wochen.

    Kommentar


    • Andreas Lackner
      Andreas Lackner kommentierte
      Kommentar bearbeiten
      Du kannst die Lampen in der HUE-App zu einer Zone hinzufügen, dann sind diese Lampen gruppiert.

      Über den CLIP-API-Debugger (siehe auch https://developers.meethue.com/develop/get-started-2/) kannst du dir dann die Gruppe ansehen, damit du die Gruppen-ID kennst.
      Link zum Debugger: https://<bridge ip address>/debug/clip.html
      GET /api/<username>/groups

      Du kannst auch über den Debugger direkt eine Gruppe anlegen:

      POST /api/<username>/groups

      {
      "lights": [
      "1",
      "2"
      ],
      "name": "bedroom",
      "type": "LightGroup"
      }

    • Andreas Lackner
      Andreas Lackner kommentierte
      Kommentar bearbeiten
      Szenen sind aktuell nicht aufrufbar über das Pico-Script. Das ist auch nicht notwendig. Verwalte die Szenen einfach im Loxone Lichtbaustein, wo du die Lampe ja ohnehin drinnen hast.

      Technisch wäre es aber möglich:
      Um eine bestimmte Szene in der HUE zu aktivieren muss eine Gruppen-ID und die Szenen-ID verwendet werden.
      Theoretisch könnte man die Szenen-ID aus dem Lichtbaustein (AQs, ein Integer) in die passende Szenen-ID der HUE (ein String) übersetzen, diesen String auf einen input des Picos legen, und das Skript halt entsprechend um eine Type "Szene" erweitern...

      Aber Achtung: Das hat sicher Nebeneffekte: Wenn du eine Szene angewählt hast und nun irgendeine Lampe dimmst, wird AQs auf -1 gesetzt!
      Und natürlich hast du das Problem, dass du einerseits die Lampe direkt ansteuerst und andererseits die Szenen setzt.
      Du müsstest somite Änderungen in einer Szene sowohl in der HUE als auch in Loxone verwalten. IMHO komplett sinnbefreit ;-)

    • svethi
      svethi kommentierte
      Kommentar bearbeiten
      Ich hatte tatsächlich das anwählen einer Szene mal eingebaut. War ein Kundenwunsch. Man muss sich nur darüber im Klaren sein, dass eine Szene ein festes Setting aus Farben und Helligkeit ist. Wenn eine Szene angewählt wird, hat diese immer die selbe Helligkeit. Wenn man dann dimmen möchte, muss man die Gruppe dimmen. Eine Szene kann nicht gedimmt werden.
  • hauwech
    Dumb Home'r
    • 03.07.2024
    • 20

    Hallo zusammen,
    jetzt muß ich doch mal fragen. Ich habe im Wohnzimmer 8 Hue RGB Spots. Die wollte ich jetzt mal mit Loxone steuern. Den Programmbaustein mit dem script habe ich eingerichtet. Mit den ersten 4 Lampen geht das prima. Nun habe ich festgestellt, daß der Lichtbaustein zwar 18 Lichtkreis Ausgänge (Lc1 - Lc18) hat, aber nur vier Lichtkreis-Eingänge (Lc1 - Lc4). Wenn ich einen fünften Merker an einen der Ausgänge klemme, tauchen nach einem Doppelklick im Reiter "Lichtkreise" weitere Lichtkreise im Dialog auf. Es gibt aber keinen weiteren Lichtkreis Eingang, wo ich den entsprechenden Merker mit dem Lichtbaustein verbinden könnte.
    Wie kann man denn jetzt alle 8 Spots separat mit einem Lichtbaustein steuern?

    Klicke auf die Grafik für eine vergrößerte Ansicht

Name: Screenshot 2024-11-05 143832.png
Ansichten: 111
Größe: 59,1 KB
ID: 445926

    Gruß Roland
    Zuletzt geändert von hauwech; vor einer Woche.

    Kommentar

    • svethi
      Lebende Foren Legende
      • 25.08.2015
      • 6289

      Ich glaube Du hast da was falsch verstanden.
      Das Programm kommt nach der Lichtsteuerung und nicht davor. Die HUE Lampen werden auch nicht von Ausgängen gesteuert sondern direkt über Netzwerk.
      Miniserver; KNX; Vitogate; EnOcean (EnOceanPi); Loxone Air; Caldav-Kalenderanbindung; RaspberryPi und für keine Frickellösung zu schade :-)

      Kommentar

      • hauwech
        Dumb Home'r
        • 03.07.2024
        • 20

        Da habe ich sicher was falsch verstanden. Das habe ich aber bis jetzt verdrängt, weil das Konstrukt mit vier Lampen so funktioniert hatte. Ich finde gerade nicht mehr, wo ich das mit den Merkern abgekuckt habe. Ich habe jetzt die Merker abgeklemmt und nur die Ausgänge vom Lichtbaustein auf die Eingänge vom Programm gehängt. So wird langsam ein Schuh draus, danke für den Hinweis.

        Gruß Roland

        Kommentar

        • lasse
          Azubi
          • vor einem Tag
          • 2

          Hi,
          Das Skript sollte auch mit Drittanbieter-Lampen oder Controllern wie z.B. einem mit Hue kompatiblem Zigbee LED-Controller für Leuchtstreifen funktionieren oder?

          Danke!

          Kommentar

          • harryair
            Azubi
            • 03.06.2023
            • 1

            Hallo Allemiteinander
            Erst mal herzlichen Dank für alle die super Beiträge und Beantwortungen. Das hat mir sehr weit geholfen meine Hue Leuchten, zusätzlich zur Heizung und den Storen mit Loxone zu Steuern. Ein Genuss!
            Mein nächstes Ziel ist es die Farbtemperstur Temperaturabhängig, bei Kalten Temperaturen warm, im Sommer bei Hitze kühl zu steuern. Aber erst mal einfach Lichtimmung warm, Lichtstimmung kalt mit einem Touch angesteuert.
            Ich bekomme die Farbtemperatur, den Wert "ct" nicht über 361. Meine Leuchten können ct bis 454. Hier mal meine zusammengetragenen Infos nach einigen Versuchen in Script, in der Lichtsteuerung und in den Merkern. Was verstehe ich bloss nicht?

            // Philips HUE Steuerung
            // Eingang des Programmbausteins wird mit dem Ausgang der Lichtsteuerung (RGB, Dimmer, Ein/Aus) verbunden
            //
            // (c) 2013 by Romy Glauser
            // FÜR LIVING COLORS GEN 2 - MIT HUE!
            //
            // (c) 2015 Erweiterung durch Andreas Lackner-Werner um LUMITECH (rgbw) & Gruppenfunktionen sowei generelles Cleanup des Codes
            //
            // (c) 2015 Erweiterung durch Sven Thierfelder um cx/cy Farbsteuerung für hue-bulbs sowie Glühlampensimulation
            //

            #define BUFF_SIZE 40000
            #define RD_BLOCK_SIZE 128

            int DEBUG_LEVEL=0;
            int DIMMER_MIN=5;
            int DIMMER_MAX=100;

            // Übergangszeit von einem Dimmwert zum nächsten (10 = 1 Sekunde)
            int TRANSITION_TIME=10;

            int DIMMER_SIMMIN[12];DIMMER_SIMMIN[0] = 154; //154 = 6400k
            DIMMER_SIMMIN[1] = 154;
            DIMMER_SIMMIN[2] = 50;
            DIMMER_SIMMIN[3] = 154;
            DIMMER_SIMMIN[4] = 154;
            DIMMER_SIMMIN[5] = 154;
            DIMMER_SIMMIN[6] = 154;
            DIMMER_SIMMIN[7] = 154;
            DIMMER_SIMMIN[8] = 154;
            DIMMER_SIMMIN[9] = 154;
            DIMMER_SIMMIN[10] = 154;
            DIMMER_SIMMIN[11] = 154;

            int DIMMER_SIMMAX[12];
            DIMMER_SIMMAX[0] = 500; //370 = 2700k
            DIMMER_SIMMAX[1] = 500;
            DIMMER_SIMMAX[2] = 600;
            DIMMER_SIMMAX[3] = 500;
            DIMMER_SIMMAX[4] = 500;
            DIMMER_SIMMAX[5] = 500;
            DIMMER_SIMMAX[6] = 500;
            DIMMER_SIMMAX[7] = 500;
            DIMMER_SIMMAX[8] = 500;
            DIMMER_SIMMAX[9] = 500;
            DIMMER_SIMMAX[10] = 500;
            DIMMER_SIMMAX[11] = 500;


            // Bitte folgende Website:
            // http://www.developers.meethue.com/do...etting-started
            // beachten um einen gültigen User-Namen zu generieren!
            char* IP_ADDRESS = "192.xxx.x.xxx";
            char* PORT = "xx";
            char* USERNAME = "xxxxxxxxxxxxxxxxxxxxxxxxxx";



            int inputType[12];

            // Hier die Funktion des Eingangs definieren:
            // 0 = RGB-Eingang (Eingang LoxoneFormat, 9-stellige Zahl die RGB codiert mit 100100100 für weiß. Ansteuerung der Lampe via Hue/Sat/Bri
            // 1 = Dimmereingang. Eingangswert muss im Bereich DIMMER_MIN / DIMMER_MAX sein. Ansteuerung der Lampe via Bri.
            // 2 = ON/OF - Eingang (z.B. für Steckdosen-Adapter)
            // 4 = RGB-Eingang (wie '0', aber ansteuerung der Lampe via X/Y/Bri)
            // 5 = Dimmereingang (wie '1', Ansteuerung der Lampe via Bri/Ct, Glühlampensimulation)

            // Wenn Lampengruppen bestehen, dann diese Typen verwenden:
            // 3 = RGB-Eingang (wie '0', aber steuert Lampengruppe via Hue/Sat/Bri)
            // 6 = RGB-Eingang (wie '0', aber steuert Lampengruppe via X/Y/Bri)
            // 7 = Dimmereingang, wie 1, aber für Gruppe oder Szene
            // für diese Gruppe eine Szene angegeben, so wird die Szene bei Wert 1 oder 100 gesetzt

            inputType[0] = 6;
            inputType[1] = -1;
            inputType[2] = -1;
            inputType[3] = -1;
            inputType[4] = -1;
            inputType[5] = -1;
            inputType[6] = -1;
            inputType[7] = -1;
            inputType[8] = -1;
            inputType[9] = -1;
            inputType[10] = -1;
            inputType[11] = -1;

            int lightOrGroupID[12];

            // Zuweisung der Lampen- oder GruppenIDs.
            // Definiert welcher Eingang des Bausteins welche Lampe bzw. Gruppe ansteuert:
            lightOrGroupID[0] = 84;
            lightOrGroupID[1] = 84;
            lightOrGroupID[2] = 84;
            lightOrGroupID[3] = 84;
            lightOrGroupID[4] = 5;
            lightOrGroupID[5] = 6;
            lightOrGroupID[6] = 7;
            lightOrGroupID[7] = 8;
            lightOrGroupID[8] = 9;
            lightOrGroupID[9] = 10;
            lightOrGroupID[10] = 11;
            lightOrGroupID[11] = 12;

            // Zuweisung von Scenen zu Gruppen

            char* sceneIDforGroup[12];
            sceneIDforGroup[0] = ""; //uI5rFcZpEC2lyIcy
            sceneIDforGroup[1] = "";
            sceneIDforGroup[2] = "";
            sceneIDforGroup[3] = "";
            sceneIDforGroup[4] = "";
            sceneIDforGroup[5] = "";
            sceneIDforGroup[6] = "";
            sceneIDforGroup[7] = "";
            sceneIDforGroup[8] = "";
            sceneIDforGroup[9] = "";
            sceneIDforGroup[10] = "";
            sceneIDforGroup[11] = "";

            // Ende der Konfiguration...


            char streamname[100];
            sprintf(streamname, "/dev/tcp/%s/%s/", IP_ADDRESS, PORT);

            int nEvents;

            int LIGHT = 1;
            int GROUP = 2;

            void updateLamp(int idx, float value) {
            if (inputType[idx] == -1) {
            //ignorieren
            } else if (inputType[idx] == 0 || inputType[idx] == 4) { // Lampe Bri/Hue/Sat or X/Y/Bri
            if (value < 200000000) { // RGB
            if (inputType[idx] == 0) {
            setColorBHS(lightOrGroupID[idx], value, LIGHT);
            } else if (inputType[idx] == 4) {
            setColorXYB(lightOrGroupID[idx], value, LIGHT);
            }
            } else { // LUMITECH
            setCtBri(lightOrGroupID[idx], value, LIGHT);
            }
            } else if (inputType[idx] == 1) {
            setBrightness(lightOrGroupID[idx], value, LIGHT, 0);
            } else if (inputType[idx] == 7) {
            setBrightness(lightOrGroupID[idx], value, GROUP, idx);
            } else if (inputType[idx] == 2) {
            setOnOff(lightOrGroupID[idx], value);
            } else if (inputType[idx] == 3 || inputType[idx] == 6) { // Gruppe Bri/Hue/Sat or X/Y/Bri
            if (value < 200000000) { // RGB
            if (inputType[idx] == 3) {
            setColorBHS(lightOrGroupID[idx], value, GROUP);
            } else if (inputType[idx] == 6) {
            setColorXYB(lightOrGroupID[idx], value, GROUP);
            }
            } else { // LUMITECH
            setCtBri(lightOrGroupID[idx], value, GROUP);
            }
            } else if (inputType[idx] == 5) {
            setBrightnessAsBulb(lightOrGroupID[idx], value, idx);
            }
            }

            void setBrightness(int lightID, float bri, int type, int idx) {
            char command[200];
            char cmdscene[100];
            char selector[20];
            // Normieren von 35-100 -> 1-255
            if (bri > 0) {
            bri = (bri- DIMMER_MIN )/( DIMMER_MAX - DIMMER_MIN )*254+1;
            }

            if (type==LIGHT) {
            sprintf(selector,"lights/%d/state", lightID);
            } else if (type==GROUP) {
            sprintf(selector,"groups/%d/action", lightID);
            }

            if (bri == 0) {
            sprintf(command, "{"on": false}");
            if (DEBUG_LEVEL > 0) printf("Light %d OFF", lightID);
            } else {
            if (strlen(sceneIDforGroup[idx]) != 0) {
            if (bri == 1 || bri == 255) {
            sprintf(cmdscene, ", "scene": "%s"", sceneIDforGroup[idx]);
            }
            }
            sprintf(command, "{"on": true, "bri": %d, "transitiontime": %d%s}", (int) (bri), TRANSITION_TIME, cmdscene);
            if (DEBUG_LEVEL > 0) printf("Light %d ON %d%%", lightID, (int) ((bri-1)/2.55)+1);
            }

            sendCommand(selector, command);
            }

            void setBrightnessAsBulb(int lightID, float bri, int idx) {
            char command[100];
            char selector[20];
            float ct,cl;

            // Normieren von 35-100 -> 1-255
            if (bri > 0) {
            bri = (bri- DIMMER_MIN )/( DIMMER_MAX - DIMMER_MIN )*254+1;
            cl = (DIMMER_SIMMAX[idx] - DIMMER_SIMMIN[idx]);
            ct = DIMMER_SIMMAX[idx] - (cl * log10(1+((bri-1)/254)*9));
            }

            sprintf(selector,"lights/%d/state", lightID);

            if (bri == 0) {
            sprintf(command, "{"on": false}");
            if (DEBUG_LEVEL > 0) printf("Light %d OFF", lightID);
            } else {
            sprintf(command, "{"on": true, "bri": %d, "ct": %d, "transitiontime": %d}", (int) (bri), (int) (ct), TRANSITION_TIME);
            if (DEBUG_LEVEL > 0) printf("Light %d ON %d%% with %d", lightID, (int) ((bri-1)/2.55)+1, (int) (ct));
            }

            sendCommand(selector, command);
            }

            void setCtBri(int lightID, float ctbrivalue, int type) {
            char command[100];
            char selector[20];
            float bri, ct;
            int briNorm, miredNorm;

            bri = floor((ctbrivalue-200000000) / 10000); // 0-100
            ct = floor((ctbrivalue-200000000) - (bri * 10000)); // Wert in Kelvin, von 2700 - 6500 das habe ich auf 9000 geändert und die ct bleibt unverändert(bri * 10000)


            briNorm = (int) round(bri*2.55); // 0-255
            miredNorm = (int) round(1000000/ct); // Wert von 154 - 370



            if (type==LIGHT) {
            sprintf(selector,"lights/%d/state", lightID);
            } else if (type==GROUP) {
            sprintf(selector,"groups/%d/action", lightID);
            }

            if (bri == 0) {
            sprintf(command, "{"on": false}");
            if (DEBUG_LEVEL > 0) printf("Light %d OFF", lightID);
            } else {
            sprintf(command, "{"on": true, "bri": %d, "ct": %d, "transitiontime": %d}", briNorm, miredNorm, TRANSITION_TIME);
            if (DEBUG_LEVEL > 0) printf("Light %d ON %d%% %dK", lightID, (int) bri, (int) ct);
            }

            sendCommand(selector, command);
            }


            void setOnOff(int lightID, float bri) {
            char command[100];
            char selector[20];

            sprintf(selector,"lights/%d/state", lightID);

            if (bri == 0) {
            sprintf(command, "{"on": false}");
            if (DEBUG_LEVEL > 0) printf("Light %d OFF", lightID);
            } else {
            sprintf(command, "{"on": true}");
            if (DEBUG_LEVEL > 0) printf("Light %d ON", lightID);
            }

            sendCommand(selector, command);

            }

            void setColorXYB(int lightOrGroupID, float rgbvalue, int type) {
            char buffer[256];
            float red,green,blue;
            float cx,cy, bri;
            float X,Y,Z;
            char command[100];
            char selector[50];

            blue = floor(rgbvalue/1000000);
            green = floor((rgbvalue-blue*1000000)/1000);
            red = rgbvalue-blue*1000000-green*1000;

            bri = blue;
            if (bri < green) bri = green;
            if (bri < red) bri = red;
            bri = bri * 2.55;

            blue = blue / 100;
            green = green / 100;
            red = red / 100;

            // Apply gamma correction v1
            if (red > 0.04055) {
            red = pow((red + 0.055) / 1.055, 2.4);
            } else {
            red = red / 12.92;
            }
            if (green > 0.04055) {
            green = pow((green + 0.055) / 1.055, 2.4);
            } else {
            green = green / 12.92;
            }
            if (blue > 0.04055) {
            blue = pow((blue + 0.055) / 1.055, 2.4);
            } else {
            blue = blue / 12.92;
            }
            // Convert to XYZ
            X = red * 0.649926 + green * 0.103455 + blue * 0.197109;
            Y = red * 0.234327 + green * 0.743075 + blue * 0.022598;
            Z = red * 0.013932 + green * 0.053077 + blue * 1.035763;

            // Apply gamma correction v2
            // //if (red > 0.04045) {
            // // red = pow((red + 0.055) / 1.055, 2.4);
            // //} else {
            // // red = red / 12.92;
            // //}
            // //if (green > 0.04045) {
            // // green = pow((green + 0.055) / 1.055, 2.4);
            // //} else {
            // // green = green / 12.92;
            // //}
            // //if (blue > 0.04045) {
            // // blue = pow((blue + 0.055) / 1.055, 2.4);
            // //} else {
            // // blue = blue / 12.92;
            // //}

            // // Wide gamut conversion D65
            // X = red * 0.664511f + green * 0.154324f + blue * 0.162028f;
            // Y = red * 0.283881f + green * 0.668433f + blue * 0.047685f;
            // Z = red * 0.000088f + green * 0.072310f + blue * 0.986039f;

            // Calculate xy and bri
            if ((X+Y+Z) == 0){
            cx = 0;
            cy = 0;
            } else { // round to 4 decimal max (=api max size)
            cx = X / (X + Y + Z);
            cy = Y / (X + Y + Z);
            }

            if (type==LIGHT) {
            sprintf(selector,"lights/%d/state", lightOrGroupID);
            } else if (type==GROUP) {
            sprintf(selector,"groups/%d/action", lightOrGroupID);
            }

            if (bri == 0) {
            sprintf(command, "{"on": false}");
            } else {
            sprintf(command, "{"xy": [%f,%f],"bri": %d,"on":true, "transitiontime": %d}", cx, cy, bri, TRANSITION_TIME);
            }

            if (DEBUG_LEVEL > 1) printf(command);

            sendCommand(selector,command);

            }

            void setColorBHS(int lightOrGroupID, float rgbvalue, int type) {
            char buffer[256];
            float red,green,blue;
            float hue,sat,bri;
            char command[100];
            char selector[50];

            // Hinweis: rgbvalue ist red + green*1000 + blue*1000000
            blue = floor(rgbvalue/1000000);
            green = floor((rgbvalue-blue*1000000)/1000);
            red = rgbvalue-blue*1000000-green*1000;

            // nochmal umrechnen nach hue irgendwie, weil die Living Colors Gen2 irgendwie nich gehen mit xy
            hue = 0;
            sat = 0;
            bri = 0;

            if (blue > 0 || green > 0 || red > 0) {

            if ((red >= green) && (green >= blue)) {
            if (red == blue) {
            hue = 0;
            } else {
            hue = 60*(green-blue)/(red-blue);
            }
            sat = (red - blue) / red;
            bri = red;
            } else if ((green > red) && (red >= blue)) {
            hue = 60*(2 - (red-blue)/(green-blue));
            sat = (green - blue) / green;
            bri = green;
            } else if ((green >= blue) && (blue > red)) {
            hue = 60*(2 + (blue-red)/(green-red));
            sat = (green - red) / green;
            bri = green;
            } else if ((blue > green) && (green > red)) {
            hue = 60*(4 - (green-red)/(blue-red));
            sat = (blue - red) / blue;
            bri = blue;
            } else if ((blue > red) && (red >= green)) {
            hue = 60*(4 + (red-green)/(blue-green));
            sat = (blue - green) / blue;
            bri = blue;
            } else if ((red >= blue) && (blue > green)) {
            hue = 60*(6 - (blue-green)/(red-green));
            sat = (red - green) / red;
            bri = red;
            }

            // Werte für HUE normieren (hue = 0-65535, sat 0-255, bri 0-255)
            hue = hue / 360 * 65535;
            sat = sat * 255;
            bri = bri * 2.55;
            }

            // Ausgeben ins Log
            if (DEBUG_LEVEL > 1) printf("value:%09d, b:%d, g:%d, r: %d, hue:%d, sat: %d, bri: %d\n", rgbvalue, blue, green, red, (int)hue, (int)sat, (int)bri);

            if (bri == 0) {
            sprintf(command, "{"on": false}");
            if (DEBUG_LEVEL > 0 && type==LIGHT ) printf("Light %d OFF", lightOrGroupID);
            if (DEBUG_LEVEL > 0 && type==GROUP ) printf("Group %d OFF", lightOrGroupID);
            } else {
            sprintf(command, "{"bri": %d, "hue": %d, "sat": %d, "on": true, "transitiontime": %d}", (int)bri, (int)hue, (int)sat, TRANSITION_TIME);
            if (DEBUG_LEVEL > 0 && type==LIGHT ) printf("Light %d ON %d%%, %d° %d%%", lightOrGroupID, (int) ((bri-1)/2.55)+1, (int) (hue / 65535 * 360), (int)(sat/2.55));
            if (DEBUG_LEVEL > 0 && type==GROUP ) printf("Group %d ON %d%%, %d° %d%%", lightOrGroupID, (int) ((bri-1)/2.55)+1, (int) (hue / 65535 * 360), (int)(sat/2.55));
            }

            if (type==LIGHT) {
            sprintf(selector,"lights/%d/state", lightOrGroupID);
            } else if (type==GROUP) {
            sprintf(selector,"groups/%d/action", lightOrGroupID);
            }

            sendCommand(selector, command);

            }

            void sendCommand(char* selector, char* command) {

            if (DEBUG_LEVEL > 1) char szBuffer[BUFF_SIZE];
            char szTmpBuffer[RD_BLOCK_SIZE];
            int nCnt;
            int nBytesReceived = 0;
            int blData = 0;

            STREAM* TcpStream = stream_create(streamname,0,0);
            if (TcpStream == NULL) {
            printf("Creating Stream failed");
            stream_close(TcpStream);
            return;
            }

            char buffer[1024];
            sprintf(buffer, "PUT /api/%s/%s HTTP/1.1\r\nHost: %s\r\nConnection: keep-alive\r\nContent-Length: %d\r\n\r\n%s",
            USERNAME, selector, IP_ADDRESS, strlen(command), command);
            if (DEBUG_LEVEL > 1) printf(buffer);
            stream_write(TcpStream,buffer,sizeof(buffer));
            stream_flush(TcpStream);
            // read stream
            do
            {
            nCnt = stream_read(TcpStream,szTmpBuffer,RD_BLOCK_SIZE,40 00);
            if (nCnt + nBytesReceived > BUFF_SIZE)
            {
            nBytesReceived = -1;
            break; //File is too large
            }
            else if(nCnt > 0)
            {
            if (DEBUG_LEVEL > 1) strncpy((char*)szBuffer + nBytesReceived, szTmpBuffer, nCnt);
            nBytesReceived += nCnt;
            }
            }
            while (nCnt > 0);
            if (DEBUG_LEVEL > 1) printf(strstr(szBuffer,"[{"));
            //sleep(150);
            stream_close(TcpStream);
            }


            while (1==1) {
            nEvents = getinputevent();

            // Sonderfunkion: AI12 löst ein "ALLES AUSSCHALTEN"-Signal an die HUE-Bridge aus
            if (nEvents & 0x8 << 12 && getinput(12)==1) {
            if (DEBUG_LEVEL > 0) printf("All Lights OFF");
            sendCommand( "groups/0/action", "{"on":false}");
            // Alle anderen Eingänge werden an die HUE laut Konfiguration weitergegeben:
            } else {
            int i;
            for (i = 0; i < 12; i++) {
            if (nEvents & 0x8 << i) {
            updateLamp(i, getinput(i));
            }
            }
            }
            sleep(100);
            }


            COMAND GET CLIP API DEBUGGER
            "11": {
            "state": {
            "on": true,
            "bri": 84,
            "ct": 361,
            "alert": "select",
            "colormode": "ct",
            "mode": "homeautomation",
            "reachable": true
            },
            "swupdate": {
            "state": "noupdates",
            "lastinstall": "2024-11-01T11:23:12"
            },
            "type": "Color temperature light",
            "name": "Hue ambiance ceiling 1",
            "modelid": "LTC003",
            "manufacturername": "Signify Netherlands B.V.",
            "productname": "Hue ambiance ceiling",
            "capabilities": {
            "certified": true,
            "control": {
            "mindimlevel": 100,
            "maxlumen": 2400,
            "ct": {
            "min": 153,
            "max": 454
            }

            Klicke auf die Grafik für eine vergrößerte Ansicht

Name: image.png
Ansichten: 0
Größe: 35,1 KB
ID: 446788

            Klicke auf die Grafik für eine vergrößerte Ansicht

Name: image.png
Ansichten: 0
Größe: 37,1 KB
ID: 446786Klicke auf die Grafik für eine vergrößerte Ansicht

Name: image.png
Ansichten: 0
Größe: 363,4 KB
ID: 446787

            Kommentar

            Lädt...