Mehrere Variablen in einem HTTP Request? (Anbindung Loxone -> IFTTT -> Nibe F1245)

Einklappen
X
 
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge
  • DerFlash
    Smart Home'r
    • 06.07.2017
    • 39

    #1

    Mehrere Variablen in einem HTTP Request? (Anbindung Loxone -> IFTTT -> Nibe F1245)

    Hallo zusammen,

    nachdem meine kleine Familie hier endlich im neuen Haus angekommen ist, geht die Konfiguration der Loxone-Steuerung so langsam ins Detail.
    Nach diversen Spielereien komme ich dabei nun an der Anbindung meiner NIBE Heizung an.

    Hierbei habe ich über nen privaten IFTTT WebHook schon alle Loxone Temperatur-Sensoren in Form von virtuellen Thermostaten in die Nibe einbinden können. Allerdings sieht der IFTTT Hook dabei vor, dass sowohl die aktuelle Temperatur als auch die Zieltemperatur in einem Request gesendet werden.

    tl;dr; Vielleicht stell ich mich zu doof an (daher frag ich hier), aber die Virtuellen Ausgänge unterstützen scheinbar wirklich nur einen Eingangswert, den ich dann per <v.1> in den POST Request einbinden kann, oder?
    Kennt jemand noch einen alternativen Trick, 2 Werte in den Request zu bekommen?


    Als grundsätzliche Alternative schwebt mit noch ein PicoC Progrämmchen oder eine Zwischenstation über den vorhandenen RaspberrryPi vor. Bei letzterem würde ich dann einfach 2 einzelne Request schicken und bei Vollständigkeit von dort aus jeweils den IFTTT Hook antriggern. Aber bevor ich solche Klimmzüge mache, hake ich lieber nach!


    Btw: Falls jemand Interesse an der Integration hat, einfach bescheid geben (vielleicht dokumentiere ich das aber auch so bei Gelegenheit mal). Von der Ansteuerung des Luxusmodus, über das Setzen des Away/Home-Modus bis hin zum Setzen des Urlaubs-Modus über eine Loxone-Schaltuhr in der Visu ist ansonsten alles angebunden :-)


    Viele Grüße
    Björn
  • DerFlash
    Smart Home'r
    • 06.07.2017
    • 39

    #2
    Ok, keine Antwort ist auch eine ;-) -> Gibt wohl wirklich keine offensichtliche Methode über den Virtuellen Ausgang, nehme ich an.

    Ich hab mir also mal alternativ ein passendes PicoC Programm gehackt. Dort schliesse ich jeweils für bis zu 6 Räume ihre Temperatur+Zieltemperatur an und es läuft wie geschmiert!

    Klicke auf die Grafik für eine vergrößerte Ansicht  Name: Bildschirmfoto 2017-07-07 um 14.06.42.png Ansichten: 1 Größe: 155,3 KB ID: 105990Klicke auf die Grafik für eine vergrößerte Ansicht  Name: Bildschirmfoto 2017-07-07 um 14.07.03.png Ansichten: 1 Größe: 57,7 KB ID: 105991

    Code:
    #define BUFF_SIZE 40000
    #define RD_BLOCK_SIZE 128
    
    int sendTemps(char *room, float currentTemp, float targetTemp) {
        printf("Sending room temperature update for %s: Actual: %f / Target: %f", room, currentTemp, targetTemp);
    
        STREAM* pTcpStream = stream_create("/dev/tcp/maker.ifttt.com/80",0,0); // create tcp stream
    
        char postBody[128];
        sprintf(postBody,"value1=%s&value2=%f&value3=%f", room, currentTemp, targetTemp);
    
        char pTcpCmd[2048];
        sprintf(pTcpCmd,"POST /trigger/<TRIGGER>/with/key/<KEY> HTTP/1.0\r\nHost: maker.ifttt.com\r\nContent-Type: application/x-www-form-urlencoded\r\nContent-Length: %d\r\n\r\n%s\r\n", strlen(postBody), postBody);
    
        stream_write(pTcpStream,pTcpCmd,strlen(pTcpCmd)); // write to output buffer
        stream_flush(pTcpStream); // flush output buffer
    
        char szBuffer[BUFF_SIZE];
        char szTmpBuffer[RD_BLOCK_SIZE];
        int nCnt;
        int nBytesReceived = 0;
    
        // read stream
        do {
            nCnt = stream_read(pTcpStream,szTmpBuffer,RD_BLOCK_SIZE,4000);
            if (nCnt + nBytesReceived > BUFF_SIZE)
            {
                nBytesReceived = -1;
                break; //File is too large
            }
            else if(nCnt > 0)
            {
                strncpy((char*)szBuffer + nBytesReceived, szTmpBuffer, nCnt);
                nBytesReceived += nCnt;
            }
        } while (nCnt > 0);
    
        if (nBytesReceived > 0) {
            //printf("Bytes received: %d",nBytesReceived);
            //printf("Text: %s", szBuffer);
        }
    
        stream_close(pTcpStream);
        return 1;
    }
    
    int nEvents;
    char *rooms[6] = {"Bad", "Büro", "FlurOben", "FlurUnten", "HWR", "KiZi2"};
    int lastUpdate[12] = { 0 };
    
    while(TRUE) {
        nEvents = getinputevent();
    
        for (int i = 0; i < 13; i++) {
            if (i >= sizeof(rooms) / sizeof(rooms[0])) break;
    
            int currentTempID = i*2;
            int targetTempID = i*2+1;
    
            int checkCurrentTemp = 0x8 << currentTempID;
            int checkTargetTemp = 0x8 << targetTempID;
    
            int currentTime = getcurrenttime();
    
            if (nEvents & checkCurrentTemp | nEvents & checkTargetTemp | currentTime - lastUpdate[i] > 600)
            {
                sendTemps(rooms[i], getinput(currentTempID),getinput(targetTempID));
                lastUpdate[i] = currentTime;
                sleep(100);
            }
        }
    
        sleep(100);
    }
    Zuletzt geändert von DerFlash; 07.07.2017, 15:10.

    Kommentar

    • romildo
      Lebende Foren Legende
      • 25.08.2015
      • 5144

      #3
      Hallo,
      Virtuelle Ausgänge kann man auch an einen Statusbaustein anschliessen. Pro Statusbaustein können bis zu 4 Eingänge mit Werten gefüttert werden, welche dann im Statusbaustein zusammengefasst und an den Ausgang weitergegeben werden können. Es können auch mehrere Statusbausteine in Reihe geschaltet werden.
      Dies nur so zur Info.

      Keine Antwort innerhalb von 20 Stunden inklusive Nacht bedeutet noch lange nicht, dass es keine Lösung gibt, zudem gibt es im Forum ja auch noch die Suche
      lg Romildo

      Kommentar

      • DerFlash
        Smart Home'r
        • 06.07.2017
        • 39

        #4
        Hallo romildo,

        keine Angst, das mit der fehlenden Antwort war natürlich nur als Spaß zu verstehen.

        Wie das halt im Eifer dann so ist, wird's ohne Lösung schnell langweilig und dann war das PicoC Programm plötzlich doch eine recht angenehme Lösung. ;-) Vor allem da sie somit sehr flexibel und zentral ist.

        Deinen Hinweis schaue ich mir aber trotzdem mal an. Das klingt ja interessant. Allerdings hab ich die Befürchtung dass damit dann nur die 4 Wertebytes (\1 \2 \3 \4) befeuert werden, also dann dennoch nur 4x quasi-digital eine 0 oder 1 weiterverarbeitet werden kann. Vielleicht irre ich aber.

        Kommentar

        • romildo
          Lebende Foren Legende
          • 25.08.2015
          • 5144

          #5
          Du sendest ja einen "String" sagen wir nur so als Beispiel:
          Wohnzimmer, Isttemperatur=20.3°, Solltemperatur=22.0°

          Dafür legst Du die Isttemperatur an AI1, die Solltemperatur an AI2 eines Statusbausteins.
          Im Statusbaustein gibst Du unter dem Statustext in Zeile 1 den "String" wie folgt ein:
          Wohnzimmer, Isttemperatur=<v1.1>°, Solltemperatur=<v2.1>°
          An den Ausgang TQ hängst Du den Virtuellen Ausgangs Befehl mit <v> als Befehl bei EIN

          Damit der "String" nur dann gesendet wird, wenn Du es möchtest, kannst Du an den Eingang AI3 den Trigger anlegen und im Statustext die Bedingung AI3 == 1 in Zeile 1 eintragen.

          Hoffe wir haben uns verstanden
          lg Romildo

          Kommentar

          • DerFlash
            Smart Home'r
            • 06.07.2017
            • 39

            #6
            Funktioniert wie geschmiert. Per Virtuellem Texteingang lässt sich da sogar der Raumname mit in den POST-Body einbinden - also alle 3 notwendigen Parameter völlig dynamisch an einen Web-Ausgang. Prima, danke für die Erleuchtung!

            Das Einzige was das Ganze nun wiederum zu komplex machen würde, als dass ich nun von dem Programm zurück wechseln würde, ist die Notwendigkeit, dass die NIBE Heizung über den SmartHome Eingang scheinbar mindestens aller X Minuten mal ein Update benötigt. Also selbst wenn sich da nichts geändert hat. (das war heute im C-Code schnell nachgerüstet)
            Die Logik, die also nur bei Änderung auslöst, sich das merkt und nur als Backup dann nach X-Minuten dennoch auslöst, dürften dann doch ein paar Bausteine (Analogspeicher, Reset, ...) mehr werden als es lohnt ;-)

            Aber spätestens wenn die maximal 8 Programme doch mal am Limit ankommen hab ich nun einen Alternativ-Plan!

            Nochmals herzlichsten Dank!

            Kommentar

            • romildo
              Lebende Foren Legende
              • 25.08.2015
              • 5144

              #7
              Das wiederholen wäre nicht das Problem, das kann man direkt im Ausgangsbefehl eingeben. Erste Wiederholung, Abstand Wiederholung.

              Aber für komplexere Aufgaben sind die Programmbausteine ja da.

              In den neueren Versionen scheinen die Programmfehler etwas besser abgefangen zu werden.
              Bei älteren Versionen hatte ich des öfteren bei Programmfehlern das Vergnügen dass der Miniserver ständig einen Reboot ausgelöst und er somit nicht mehr erreichbar war.
              Da half dann nur noch die SD-Karte neu zu formatieren. Daten waren dann somit auch alle verloren.
              lg Romildo

              Kommentar

              • DerFlash
                Smart Home'r
                • 06.07.2017
                • 39

                #8
                Wieder was gelernt. Na vielleicht überleg ich mir das ja noch ;-) Testen werd ich's allemal beides noch ein wenig.

                Ja mit dem PicoC-Interpreter hab ich auch schon den ein oder anderen Reboot hinbekommen gestern. Da reicht es ja direkt nen Char-Array zu klein zu machen oder beim printf 'ne falsche Typisierung für eine Variable anzugeben.. Eieiei... Da hab ich auch schon kurz gezittert, ob der MS nicht gleich im Reboot-Loop verschwindet. Aber bisher ging alles gut ;-)

                Kommentar

                • svethi
                  Lebende Foren Legende
                  • 25.08.2015
                  • 6314

                  #9
                  Ja, Du solltest mit PicoC vorsichtig sein. Ich hatte mal 2 Scripts laufen. Eines läuft schon seit Jahren problemlos, das Andere, trotz aller zur Verfügung stehenden Errorhandlings blieb aus unerklärlichen Gründen immer nach ein paar Tagen einfach stehen. Hab ich dann anders gelöst. Gleichlautende Berichte liest man hier immermal wieder.
                  Miniserver; KNX; Vitogate; EnOcean (EnOceanPi); Loxone Air; Caldav-Kalenderanbindung; RaspberryPi und für keine Frickellösung zu schade :-)

                  Kommentar

                  • joesie
                    Smart Home'r
                    • 10.11.2015
                    • 34

                    #10
                    Hallo zusammen. Ich scheitere dabei, die Thermostate in der Nibe Uplink Umgebung einzubinden. Eine Verbindung zwischen meinem Uplink und der IFTTT habe ich (erfolgreich?) angelegt. Ich kann auch ein Thermostat im IFTTT anlegen. Nur dann komme ich nicht weiter.

                    Ich hoffe, ich habe mich verständlich ausgedrückt. Mir fehlt gerade das Gefühl, wo der Fehler liegen könnte.

                    Grüße
                    Jörg

                    Kommentar

                    Lädt...