Hallo Zusammen,
folgender Hintergrund, ich versuche Ikea Tradfri Lampen mit einem Arduino über einen
Raspberry Pi mit DeConz über die ReST API zu steuern.
nach langem hin und her und Probieren und googlen habe ich auch die richtige Zusammensetzung
des HTML PUT Befehls gefunden und es funktioniert.
Im Ersten Ansatz, hatte ich das Zusammenstellen und Senden in einer extra Funktion, habe dies aber
aufgrund der Probleme wieder in den Loop gezogen.
Auch das zum Testen angesetzte Timing von 4 Schaltzuständen ob mit oder ohne delay habe
ich durch senden eines Serial Kommandos ersetzt um die Fehlerquelle auch auszuschließen.
Nun zum Problem:
Am Anfang ist alles ok, ich sende das Serial Kommando "LIGHT 1 20" es wird per HMTL gesendet,
es erfolgt die Rückmeldung dass der Status gesetzt wurde, die Lampe geht auf Wert 20.
Dann sende ich "LIGHT 1 40" auch das geht usw. usw.
Rückmeldung Serial:
10 (Kontrolle für die Länge)
0 (Kontrolle für false)
0 (Kontrolle für false)
PUT /api/720FC36C33/lights/1/state HTTP/1.1
Host: 192.168.5.60
Connection: close
Content-Type: application/json
Content-Length: 10
{"bri":40}
Abfrage
Success
1
HTTP/1.1 200 OK
Access-Control-Allow-Origin: *
Content-Type: application/json; charset=utf-8
Content-Length:40
Connection: close
ETag:"d5b1c44e68e46da9ba27727e80b128fb"
[{"success":{"/lights/1/state/bri":40}}]
Bis dann nach ca 10x (mal mehr mal weniger)
Nur noch ausgegeben wird
10
*0 *
*0 *
PUT /api/720FC36C33/lights/1/state HTTP/1.1
Host: 192.168.5.60
Connection: close
Content-Type: application/json
Content-Length: 10
{"bri":20}
closing connection
und irgendwann nur noch:
10
0
0
closing connection
Am Anfang mit dem Senden in der Funktion, lief der Loop nicht mehr!
Jetzt wo das ganze im Loop ist, läuft das Blinken LED 13 weiter, nur
es wird nichts mehr abgesetzt....
Dazu gesagt sei noch, dass über den Webbrowser mit REST Plugin es so fot geht
wie man möchte... nur mit dem Arudino nicht..
Hat jemand ne Lösung, Verbesserung, Vorschlag???
Hier der Code:
Danke
Gruß Jens
#include <SPI.h>
#include <Ethernet.h>
#include <string.h>
byte mac[] = { 0x90, 0xA2, 0xDA, 0x0D, 0x83, 0x9D };
byte ip[] = { 192, 168, 5, 74 };
byte gateway[] = { 192, 168, 5, 1 };
byte subnet[] = { 255, 255, 255, 0 };
String befehl;
String befehl2;
String ContentLength;
boolean gesendet = false;
byte ledPin = 13;
boolean value = LOW;
unsigned long previousMillis = 0;
unsigned long intervalBlink = 1000;
void setup()
{
Ethernet.begin(mac, ip);
Serial.begin(9600);
delay(1000);
pinMode(ledPin, OUTPUT);
}
void loop()
{
EthernetClient client;
IPAddress server(192, 168, 5, 60);
if (Serial.available() > 0)
{
if (Serial.findUntil("LIGHT", "\n"))
{
int RCval = Serial.parseInt();
int RCval1 = Serial.parseInt();
//Befehl zusammensetzten
befehl = "PUT /api/";
befehl += "720FC36C33";
befehl += "/lights/";
befehl += RCval;
befehl += "/state HTTP/1.1";
//Befehl2 zusammensetzten
befehl2 = "{\"";
befehl2 += "bri";
befehl2 += "\":";
befehl2 += RCval1;
befehl2 += "}";
int Laenge = befehl2.length();
Serial.println(Laenge);
ContentLength = "Content-Length: ";
ContentLength += Laenge;
ContentLength += "\r\n";
gesendet = false;
Serial.println(gesendet);
// Senden mit wiederholung bis "Success" Rückgemeldet wird
if (gesendet == false)
{
Serial.println(gesendet);
EthernetClient client;
IPAddress server(192, 168, 5, 60);
if (client.connect(server, 80))
{
client.println(befehl);
Serial.println(befehl);
client.println("Host: 192.168.5.60");
Serial.println("Host: 192.168.5.60");
client.println("Connection: close");
Serial.println("Connection: close");
//client.println("Content-Type: application/x-www-form-urlencoded");
//Serial.println("Content-Type: application/x-www-form-urlencoded");
client.println("Content-Type: application/json");
Serial.println("Content-Type: application/json");
client.println(ContentLength);
Serial.println(ContentLength);
client.println(befehl2);
Serial.println(befehl2);
}
delay(20);
// Rückmeldung auslesen, Success finden und Serielle ausgabe
if (client.available()) {
Serial.println("Abfrage");
String str = client.readString();
gesendet = true;
if (strstr(str.c_str(), "success") != NULL)
{
Serial.println("Success");
gesendet = true;
Serial.println(gesendet);
}
Serial.print(str);
}
delay(500);
}
Serial.println();
Serial.println("closing connection");
//gesendet = true;
}
}
if (millis() - previousMillis > intervalBlink) {
previousMillis = millis();
value = !value;
digitalWrite(ledPin, value);
}
}