Daten vom Arduino an IPS übermitteln Ethernet

Hallo,
ich möchte mit einem Arduino über mein Netzwerk eine Steuerung für meine Dachfenster realisieren. Das Schalten funktioniert recht gut mit http Befehlen über IPS, nun möchte ich auch mit IPS meine Daten auslesen. Wenn ich die IP Adresse des Arduinos mit einem Browser aufrufe werden alle Analogen und Digitalen Daten angezeigt. Meine bisherige suche ergab bis jetzt „Arduino -> Ethernet Shield -> Server Socket in IPS -> Verbindung über TCP/IP -> simpel“. Aber wie dies zu realisieren ist, also eine genauere Anleitung habe ich bis jetzt noch nicht gefunden.
Kann mir jemand weiterhelfen? Danke. :confused:

Hallo,

hatte in dem Thread auch geschrieben, dass ein Beispiel-Sketch enthalten ist, wo eigentlich schon alles drin steht.
Aber hier mal mein Sketch, mit dem die digitalen Eingänge an IPS übermittelt werden können (über nen Server-Socket auf IPS-Seite).


#include <SPI.h>
#include <Ethernet.h>

byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED};
IPAddress ip(192,168,0,201);
IPAddress server(192,168,0,10);
EthernetClient client;
boolean socket = false;
int pinD2 = 2;
int pinD3 = 3;
int pinD4 = 4;
int pinD5 = 5;
int pinD6 = 6;
int pinD7 = 7;
int pinD8 = 8;
int pinD9 = 9;
int inputD1;
int inputD2;
int inputD3;
int inputD4;
int inputD5;
int inputD6;
int inputD7;
int inputD8;
int stateD1;
int stateD2;
int stateD3;
int stateD4;
int stateD5;
int stateD6;
int stateD7;
int stateD8;
int lastStateD1;
int lastStateD2;
int lastStateD3;
int lastStateD4;
int lastStateD5;
int lastStateD6;
int lastStateD7;
int lastStateD8;
int tD1;
int tD2;
int tD3;
int tD4;
int tD5;
int tD6;
int tD7;
int tD8;
int tDebounce = 150;

void setup() {

  pinMode(pinD2, INPUT);
  pinMode(pinD3, INPUT);
  pinMode(pinD4, INPUT);
  pinMode(pinD5, INPUT);
  pinMode(pinD6, INPUT);
  pinMode(pinD7, INPUT);
  pinMode(pinD8, INPUT);
  pinMode(pinD9, INPUT);
  digitalWrite(pinD2, HIGH);
  digitalWrite(pinD3, HIGH);
  digitalWrite(pinD4, HIGH);
  digitalWrite(pinD5, HIGH);
  digitalWrite(pinD6, HIGH);
  digitalWrite(pinD7, HIGH);
  digitalWrite(pinD8, HIGH);
  digitalWrite(pinD9, HIGH);
  stateD1 = digitalRead(pinD2);
  stateD2 = digitalRead(pinD3);
  stateD3 = digitalRead(pinD4);
  stateD4 = digitalRead(pinD5);
  stateD5 = digitalRead(pinD6);
  stateD6 = digitalRead(pinD7);
  stateD7 = digitalRead(pinD8);
  stateD8 = digitalRead(pinD9); 
  lastStateD1 = stateD1;
  lastStateD2 = stateD2;
  lastStateD3 = stateD3;
  lastStateD4 = stateD4;
  lastStateD5 = stateD5;
  lastStateD6 = stateD6;
  lastStateD7 = stateD7;
  lastStateD8 = stateD8;
  
  Ethernet.begin(mac, ip);
  delay(2000);
  
  if (client.connect(server, 5000)) {
    socket = true;
    client.print("{\"input_d1\" : ");
    client.print(stateD1);
    client.println("}");
    client.print("{\"input_d2\" : ");
    client.print(stateD2);
    client.println("}");
    client.print("{\"input_d3\" : ");
    client.print(stateD3);
    client.println("}");
    client.print("{\"input_d4\" : ");
    client.print(stateD4);
    client.println("}");
    client.print("{\"input_d5\" : ");
    client.print(stateD5);
    client.println("}");
    client.print("{\"input_d6\" : ");
    client.print(stateD6);
    client.println("}");
    client.print("{\"input_d7\" : ");
    client.print(stateD7);
    client.println("}");
    client.print("{\"input_d8\" : ");
    client.print(stateD8);
    client.println("}");
  } else {
    socket = false;
  }
  
}

void loop() {
 
  inputD1 = digitalRead(pinD2);
  if (inputD1 != lastStateD1) {
    tD1 = millis();
  }
  if ((millis() - tD1) > tDebounce) {
    if (inputD1 != stateD1) {
      stateD1 = inputD1;
      if (socket) {
        client.print("{\"input_d1\" : ");
        client.print(inputD1);
        client.println("}");
      }
    }
  }
  lastStateD1 = inputD1;
  
  inputD2 = digitalRead(pinD3);
  if (inputD2 != lastStateD2) {
    tD2 = millis();
  }
  if ((millis() - tD2) > tDebounce) {
    if (inputD2 != stateD2) {
      stateD2 = inputD2;
      if (socket) {
        client.print("{\"input_d2\" : ");
        client.print(inputD2);
        client.println("}");
      }
    }
  }
  lastStateD2 = inputD2;
  
  inputD3 = digitalRead(pinD4);
  if (inputD3 != lastStateD3) {
    tD3 = millis();
  }
  if ((millis() - tD3) > tDebounce) {
    if (inputD3 != stateD3) {
      stateD3 = inputD3;
      if (socket) {
        client.print("{\"input_d3\" : ");
        client.print(inputD3);
        client.println("}");
      }
    }
  }  
  lastStateD3 = inputD3;
  
  inputD4 = digitalRead(pinD5);
  if (inputD4 != lastStateD4) {
    tD4 = millis();
  }
  if ((millis() - tD4) > tDebounce) {
    if (inputD4 != stateD4) {
      stateD4 = inputD4;
      if (socket) {
        client.print("{\"input_d4\" : ");
        client.print(inputD4);
        client.println("}");
      }
    }
  }  
  lastStateD4 = inputD4;
  
  inputD5 = digitalRead(pinD6);
  if (inputD5 != lastStateD5) {
    tD5 = millis();
  }
  if ((millis() - tD5) > tDebounce) {
    if (inputD5 != stateD5) {
      stateD5 = inputD5;
      if (socket) {
        client.print("{\"input_d5\" : ");
        client.print(inputD5);
        client.println("}");
      }
    }
  }
  lastStateD5 = inputD5;
  
  inputD6 = digitalRead(pinD7);
  if (inputD6 != lastStateD6) {
    tD6 = millis();
  }
  if ((millis() - tD6) > tDebounce) {
    if (inputD6 != stateD6) {
      stateD6 = inputD6;
      if (socket) {
        client.print("{\"input_d6\" : ");
        client.print(inputD6);
        client.println("}");
      }
    }
  }  
  lastStateD6 = inputD6;
  
  inputD7 = digitalRead(pinD8);
  if (inputD7 != lastStateD7) {
    tD7 = millis();
  }
  if ((millis() - tD7) > tDebounce) {
    if (inputD7 != stateD7) {
      stateD7 = inputD7;
      if (socket) {
        client.print("{\"input_d7\" : ");
        client.print(inputD7);
        client.println("}");
      }
    }
  }
  lastStateD7 = inputD7;
  
  inputD8 = digitalRead(pinD9);
  if (inputD8 != lastStateD8) {
    tD8 = millis();
  }
  if ((millis() - tD8) > tDebounce) {
    if (inputD8 != stateD8) {
      stateD8 = inputD8;
      if (socket) {
        client.print("{\"input_d8\" : ");
        client.print(inputD8);
        client.println("}");
      }
    }
  }  
  lastStateD8 = inputD8;
  if (!client.connected()) {
    client.stop();
    delay(100);
    //Reconnect
    if (client.connect(server, 5000)) {
      socket = true;
      stateD1 = digitalRead(pinD2);
      client.print("{\"input_d1\" : ");
      client.print(stateD1);
      client.println("}");
      stateD2 = digitalRead(pinD3);
      client.print("{\"input_d2\" : ");
      client.print(stateD2);
      client.println("}");
      stateD3 = digitalRead(pinD4);
      client.print("{\"input_d3\" : ");
      client.print(stateD3);
      client.println("}");
      stateD4 = digitalRead(pinD5);
      client.print("{\"input_d4\" : ");
      client.print(stateD4);
      client.println("}");
      stateD5 = digitalRead(pinD6);
      client.print("{\"input_d5\" : ");
      client.print(stateD5);
      client.println("}");
      stateD6 = digitalRead(pinD7);
      client.print("{\"input_d6\" : ");
      client.print(stateD6);
      client.println("}");
      stateD7 = digitalRead(pinD8);
      client.print("{\"input_d7\" : ");
      client.print(stateD7);
      client.println("}");
      stateD8 = digitalRead(pinD9);
      client.print("{\"input_d8\" : ");
      client.print(stateD8);
      client.println("}");
    } else {
      socket = false; 
    }
  }

}


Hier noch das Skript auf IPS-Seite:


<?
if($_IPS['SENDER'] == "RegisterVariable") {

	$data = RegVar_GetBuffer($_IPS['INSTANCE']);
	$data .= $_IPS['VALUE'];
	
	if (strpos($data, '{') === false || strpos($data, '}') === false) {
		RegVar_SetBuffer($_IPS['INSTANCE'], $data);
   } else {
		while (strpos($data, '{') !== false && strpos($data, '}') !== false) {
			$pos1 = strpos($data, '{');
			$pos2 = strpos($data, '}');
			$msg = substr($data, $pos1, ($pos2-$pos1)+1);
			$json = json_decode($msg);
			if ($json) {
		   	foreach($json as $entryName => $entryValue) {
					IPS_LogMessage("Arduino", $entry_name.": ".$entryValue);
		      	switch ($entryName) {
		         	case "input_d1":
		            	SetValue(27799 /*[Konfiguration\Arduino\DI_1_Regensensor]*/, !$entryValue);
		               break;
		          	case "input_d2":
		               SetValue(54722 /*[Konfiguration\Arduino\DI_2_BMI_Dusche]*/, !$entryValue);
		               break;
		          	case "input_d3":
		               SetValue(10583 /*[Konfiguration\Arduino\DI_3]*/, !$entryValue);
		               break;
		          	case "input_d4":
		          	   $var_time = IPS_GetVariable(38708 /*[Konfiguration\Arduino\DI_4_BMI_Flur_OG]*/)['VariableUpdated'];
		          	   if (time() - $var_time >= 1) {
		               	SetValue(38708 /*[Konfiguration\Arduino\DI_4_BMI_Flur_OG]*/, !$entryValue);
							}
		               break;
		         	case "input_d5":
		         		$var_time = IPS_GetVariable(43325 /*[Konfiguration\Arduino\DI_5_BMI_Ankleide]*/)['VariableUpdated'];
                     if (time() - $var_time >= 1) {
		            		SetValue(43325 /*[Konfiguration\Arduino\DI_5_BMI_Ankleide]*/, !$entryValue);
							}
		               break;
		          	case "input_d6":
		          	   $var_time = IPS_GetVariable(49265 /*[Konfiguration\Arduino\DI_6_BMI_Windfang]*/)['VariableUpdated'];
		          	   if (time() - $var_time >= 1) {
		               	SetValue(49265 /*[Konfiguration\Arduino\DI_6_BMI_Windfang]*/, !$entryValue);
							}
		               break;
		          	case "input_d7":
		               SetValue(21018 /*[Konfiguration\Arduino\DI_7_BMI_Bad]*/, !$entryValue);
		               break;
		          	case "input_d8":
		          	   $var_time = IPS_GetVariable(37661 /*[Konfiguration\Arduino\DI_8_Dämmerungsschalter]*/)['VariableUpdated'];
		          	   if (time() - $var_time >= 1) {
			               SetValue(37661 /*[Konfiguration\Arduino\DI_8_Dämmerungsschalter]*/, !$entryValue);
							}
		               break;
		        	}
		    	}
			}
			$data = substr($data, $pos2 + 1);
			RegVar_SetBuffer($_IPS['INSTANCE'], $data);
		}
	}
}

?>

Die Lösung mit dem Server Socket und den Beispielen für PHP und ARduino funzt echt super, selbst mit den kleinen 28J60er NW Bausteinen.

Gibt es in Ergänzung zu der geposteten Lösung einen einfachen Weg per PHP Script bei aufgebautem Socket auf der IPS eine Datenquittierung durch den IPS Server an den Arduino Client zu schicken?

Ich denke an etwas das so ähnlich ist wie bei den Musterbeispielen (Siehe unten rot) der Arduino NW Lib´s nur halt auf der IPS Server Seite?

//RX Part…

while((size = client.available()) > 0)
{
uint8_t* msg = (uint8_t*)malloc(size);
size = client.read(msg,size);
Serial.write(msg,size);
free(msg);
}
//TX Quittierung…
client.println(„DATA from Server!“);

Bin leider auf Seiten der IPS PHP SW Erstellung am absoluten Anfang, die Arduino Seite spielt schon recht gut…
Danke für nen kurzen Tipp…

Atlantis

Nabend,

kann mir das mal einer mit dem „Server Socket“ mal erklären, wie man die Verbindung zwischen Arduino und IPS herstellt.
Muß man bei dem Client auch etwas angeben?

Gruß Stefan

Auf dem Arduino (=Client) musst Du nur die IP und den Port deines IPS-Servers angeben.

OK Danke.

Gruß
Stefan

Hi,
ich habe diesen Sketch

#include <SPI.h>
#include <Ethernet.h>

byte mac = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED};
IPAddress ip(192,168,0,201);
IPAddress server(192,168,0,10);
EthernetClient client;
boolean socket = false;
int pinD2 = 2;
int pinD3 = 3;
int pinD4 = 4;
int pinD5 = 5;
int pinD6 = 6;
int pinD7 = 7;
int pinD8 = 8;
int pinD9 = 9;
int inputD1;
int inputD2;
int inputD3;
int inputD4;
int inputD5;
int inputD6;
int inputD7;
int inputD8;
int stateD1;
int stateD2;
int stateD3;
int stateD4;
int stateD5;
int stateD6;
int stateD7;
int stateD8;
int lastStateD1;
int lastStateD2;
int lastStateD3;
int lastStateD4;
int lastStateD5;
int lastStateD6;
int lastStateD7;
int lastStateD8;
int tD1;
int tD2;
int tD3;
int tD4;
int tD5;
int tD6;
int tD7;
int tD8;
int tDebounce = 150;

void setup() {

pinMode(pinD2, INPUT);
pinMode(pinD3, INPUT);
pinMode(pinD4, INPUT);
pinMode(pinD5, INPUT);
pinMode(pinD6, INPUT);
pinMode(pinD7, INPUT);
pinMode(pinD8, INPUT);
pinMode(pinD9, INPUT);
digitalWrite(pinD2, HIGH);
digitalWrite(pinD3, HIGH);
digitalWrite(pinD4, HIGH);
digitalWrite(pinD5, HIGH);
digitalWrite(pinD6, HIGH);
digitalWrite(pinD7, HIGH);
digitalWrite(pinD8, HIGH);
digitalWrite(pinD9, HIGH);
stateD1 = digitalRead(pinD2);
stateD2 = digitalRead(pinD3);
stateD3 = digitalRead(pinD4);
stateD4 = digitalRead(pinD5);
stateD5 = digitalRead(pinD6);
stateD6 = digitalRead(pinD7);
stateD7 = digitalRead(pinD8);
stateD8 = digitalRead(pinD9);
lastStateD1 = stateD1;
lastStateD2 = stateD2;
lastStateD3 = stateD3;
lastStateD4 = stateD4;
lastStateD5 = stateD5;
lastStateD6 = stateD6;
lastStateD7 = stateD7;
lastStateD8 = stateD8;

Ethernet.begin(mac, ip);
delay(2000);

if (client.connect(server, 5000)) {
socket = true;
client.print("{„input_d1“ : „);
client.print(stateD1);
client.println(“}");
client.print("{„input_d2“ : „);
client.print(stateD2);
client.println(“}");
client.print("{„input_d3“ : „);
client.print(stateD3);
client.println(“}");
client.print("{„input_d4“ : „);
client.print(stateD4);
client.println(“}");
client.print("{„input_d5“ : „);
client.print(stateD5);
client.println(“}");
client.print("{„input_d6“ : „);
client.print(stateD6);
client.println(“}");
client.print("{„input_d7“ : „);
client.print(stateD7);
client.println(“}");
client.print("{„input_d8“ : „);
client.print(stateD8);
client.println(“}");
} else {
socket = false;
}

}

void loop() {

inputD1 = digitalRead(pinD2);
if (inputD1 != lastStateD1) {
tD1 = millis();
}
if ((millis() - tD1) > tDebounce) {
if (inputD1 != stateD1) {
stateD1 = inputD1;
if (socket) {
client.print("{„input_d1“ : „);
client.print(inputD1);
client.println(“}");
}
}
}
lastStateD1 = inputD1;

inputD2 = digitalRead(pinD3);
if (inputD2 != lastStateD2) {
tD2 = millis();
}
if ((millis() - tD2) > tDebounce) {
if (inputD2 != stateD2) {
stateD2 = inputD2;
if (socket) {
client.print("{„input_d2“ : „);
client.print(inputD2);
client.println(“}");
}
}
}
lastStateD2 = inputD2;

inputD3 = digitalRead(pinD4);
if (inputD3 != lastStateD3) {
tD3 = millis();
}
if ((millis() - tD3) > tDebounce) {
if (inputD3 != stateD3) {
stateD3 = inputD3;
if (socket) {
client.print("{„input_d3“ : „);
client.print(inputD3);
client.println(“}");
}
}
}
lastStateD3 = inputD3;

inputD4 = digitalRead(pinD5);
if (inputD4 != lastStateD4) {
tD4 = millis();
}
if ((millis() - tD4) > tDebounce) {
if (inputD4 != stateD4) {
stateD4 = inputD4;
if (socket) {
client.print("{„input_d4“ : „);
client.print(inputD4);
client.println(“}");
}
}
}
lastStateD4 = inputD4;

inputD5 = digitalRead(pinD6);
if (inputD5 != lastStateD5) {
tD5 = millis();
}
if ((millis() - tD5) > tDebounce) {
if (inputD5 != stateD5) {
stateD5 = inputD5;
if (socket) {
client.print("{„input_d5“ : „);
client.print(inputD5);
client.println(“}");
}
}
}
lastStateD5 = inputD5;

inputD6 = digitalRead(pinD7);
if (inputD6 != lastStateD6) {
tD6 = millis();
}
if ((millis() - tD6) > tDebounce) {
if (inputD6 != stateD6) {
stateD6 = inputD6;
if (socket) {
client.print("{„input_d6“ : „);
client.print(inputD6);
client.println(“}");
}
}
}
lastStateD6 = inputD6;

inputD7 = digitalRead(pinD8);
if (inputD7 != lastStateD7) {
tD7 = millis();
}
if ((millis() - tD7) > tDebounce) {
if (inputD7 != stateD7) {
stateD7 = inputD7;
if (socket) {
client.print("{„input_d7“ : „);
client.print(inputD7);
client.println(“}");
}
}
}
lastStateD7 = inputD7;

inputD8 = digitalRead(pinD9);
if (inputD8 != lastStateD8) {
tD8 = millis();
}
if ((millis() - tD8) > tDebounce) {
if (inputD8 != stateD8) {
stateD8 = inputD8;
if (socket) {
client.print("{„input_d8“ : „);
client.print(inputD8);
client.println(“}");
}
}
}
lastStateD8 = inputD8;
if (!client.connected()) {
client.stop();
delay(100);
//Reconnect
if (client.connect(server, 5000)) {
socket = true;
stateD1 = digitalRead(pinD2);
client.print("{„input_d1“ : „);
client.print(stateD1);
client.println(“}");
stateD2 = digitalRead(pinD3);
client.print("{„input_d2“ : „);
client.print(stateD2);
client.println(“}");
stateD3 = digitalRead(pinD4);
client.print("{„input_d3“ : „);
client.print(stateD3);
client.println(“}");
stateD4 = digitalRead(pinD5);
client.print("{„input_d4“ : „);
client.print(stateD4);
client.println(“}");
stateD5 = digitalRead(pinD6);
client.print("{„input_d5“ : „);
client.print(stateD5);
client.println(“}");
stateD6 = digitalRead(pinD7);
client.print("{„input_d6“ : „);
client.print(stateD6);
client.println(“}");
stateD7 = digitalRead(pinD8);
client.print("{„input_d7“ : „);
client.print(stateD7);
client.println(“}");
stateD8 = digitalRead(pinD9);
client.print("{„input_d8“ : „);
client.print(stateD8);
client.println(“}");
} else {
socket = false;
}
}

}

und dieses Skript

<?
if($_IPS[‚SENDER‘] == „RegisterVariable“) {

$data = RegVar_GetBuffer($_IPS['INSTANCE']); 
$data .= $_IPS['VALUE']; 
 
if (strpos($data, '{') === false || strpos($data, '}') === false) { 
    RegVar_SetBuffer($_IPS['INSTANCE'], $data); 

} else {
while (strpos($data, ‚{‘) !== false && strpos($data, ‚}‘) !== false) {
$pos1 = strpos($data, ‚{‘);
$pos2 = strpos($data, ‚}‘);
$msg = substr($data, $pos1, ($pos2-$pos1)+1);
$json = json_decode($msg);
if ($json) {
foreach($json as $entryName => $entryValue) {
IPS_LogMessage(„Arduino“, $entry_name.": ".$entryValue);
switch ($entryName) {
case „input_d1“:
SetValue(27799 /[Konfiguration\Arduino\DI_1_Regensensor]/, !$entryValue);
break;
case „input_d2“:
SetValue(54722 /[Konfiguration\Arduino\DI_2_BMI_Dusche]/, !$entryValue);
break;
case „input_d3“:
SetValue(10583 /[Konfiguration\Arduino\DI_3]/, !$entryValue);
break;
case „input_d4“:
$var_time = IPS_GetVariable(38708 /[Konfiguration\Arduino\DI_4_BMI_Flur_OG]/)[‚VariableUpdated‘];
if (time() - $var_time >= 1) {
SetValue(38708 /[Konfiguration\Arduino\DI_4_BMI_Flur_OG]/, !$entryValue);
}
break;
case „input_d5“:
$var_time = IPS_GetVariable(43325 /[Konfiguration\Arduino\DI_5_BMI_Ankleide]/)[‚VariableUpdated‘];
if (time() - $var_time >= 1) {
SetValue(43325 /[Konfiguration\Arduino\DI_5_BMI_Ankleide]/, !$entryValue);
}
break;
case „input_d6“:
$var_time = IPS_GetVariable(49265 /[Konfiguration\Arduino\DI_6_BMI_Windfang]/)[‚VariableUpdated‘];
if (time() - $var_time >= 1) {
SetValue(49265 /[Konfiguration\Arduino\DI_6_BMI_Windfang]/, !$entryValue);
}
break;
case „input_d7“:
SetValue(21018 /[Konfiguration\Arduino\DI_7_BMI_Bad]/, !$entryValue);
break;
case „input_d8“:
$var_time = IPS_GetVariable(37661 /[Konfiguration\Arduino\DI_8_Dämmerungsschalter]/)[‚VariableUpdated‘];
if (time() - $var_time >= 1) {
SetValue(37661 /[Konfiguration\Arduino\DI_8_Dämmerungsschalter]/, !$entryValue);
}
break;
}
}
}
$data = substr($data, $pos2 + 1);
RegVar_SetBuffer($_IPS[‚INSTANCE‘], $data);
}
}
}

?>

nun habe ich die IP Adressen angepasst

IPAddress ip(192,168,3,177); Arduino
IPAddress server(192,168,3,11); IPS

und den Port der beim IPS unter Server Socket hier

if (client.connect(server, 1024)) {

und

if (client.connect(server, 1024)) {

ist das soweit richtig?

Gruß

Stefan

Ja, das passt so. Sollte sich verbinden.

Sent from my iPhone using Tapatalk

Hm, es scheint das er sich Verbindet, als was muß ich denn die Variablen in IPS anlegen.

Na als Boolean, ist ja ein digitaler Eingang. Die RegVar hast Du eingerichtet?

Sent from my iPhone using Tapatalk

ja hätte mich auch gewundert…

Die RegVar hast Du eingerichtet

ne glaub nicht, weis auch nicht genau was du damit meinst

Auf IPS-Seite musst Du auch ein paar Sachen einrichten: RegisterVariable auf den ServerSocket und das Skript. Hast Du das gemacht?

Sent from my iPhone using Tapatalk

Hi,

Ok habe ich gemacht…muß ich bei Target das Skript auswählen, hat zumindest keinen Fehler angezeigt.

Gruß

Irgendwie blick ich es nicht, wo oder ob Du überhaupt noch ein Problem hast…? :flushed:

Sent from my iPhone using Tapatalk

so hier ist einmal das Script der Sketch und die Variablen im IPS…

#include <SPI.h>
#include <Ethernet.h>

byte mac = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED};
IPAddress ip(192,168,3,177);
IPAddress server(192,168,3,11);
EthernetClient client;
boolean socket = false;
int pinD2 = 2;
int pinD3 = 3;
int pinD4 = 4;
int pinD5 = 5;
int pinD6 = 6;
int pinD7 = 7;
int pinD8 = 8;
int pinD9 = 9;
int inputD1;
int inputD2;
int inputD3;
int inputD4;
int inputD5;
int inputD6;
int inputD7;
int inputD8;
int stateD1;
int stateD2;
int stateD3;
int stateD4;
int stateD5;
int stateD6;
int stateD7;
int stateD8;
int lastStateD1;
int lastStateD2;
int lastStateD3;
int lastStateD4;
int lastStateD5;
int lastStateD6;
int lastStateD7;
int lastStateD8;
int tD1;
int tD2;
int tD3;
int tD4;
int tD5;
int tD6;
int tD7;
int tD8;
int tDebounce = 150;

void setup() {
Serial.begin(9600);
pinMode(pinD2, INPUT);
pinMode(pinD3, INPUT);
pinMode(pinD4, INPUT);
pinMode(pinD5, INPUT);
pinMode(pinD6, INPUT);
pinMode(pinD7, INPUT);
pinMode(pinD8, INPUT);
pinMode(pinD9, INPUT);
digitalWrite(pinD2, HIGH);
digitalWrite(pinD3, HIGH);
digitalWrite(pinD4, HIGH);
digitalWrite(pinD5, HIGH);
digitalWrite(pinD6, HIGH);
digitalWrite(pinD7, HIGH);
digitalWrite(pinD8, HIGH);
digitalWrite(pinD9, HIGH);
stateD1 = digitalRead(pinD2);
stateD2 = digitalRead(pinD3);
stateD3 = digitalRead(pinD4);
stateD4 = digitalRead(pinD5);
stateD5 = digitalRead(pinD6);
stateD6 = digitalRead(pinD7);
stateD7 = digitalRead(pinD8);
stateD8 = digitalRead(pinD9);
lastStateD1 = stateD1;
lastStateD2 = stateD2;
lastStateD3 = stateD3;
lastStateD4 = stateD4;
lastStateD5 = stateD5;
lastStateD6 = stateD6;
lastStateD7 = stateD7;
lastStateD8 = stateD8;

Ethernet.begin(mac, ip);
delay(2000);

if (client.connect(server, 1024)) {
socket = true;
client.print("{„input_d1“ : „);
client.print(stateD1);
client.println(“}");
client.print("{„input_d2“ : „);
client.print(stateD2);
client.println(“}");
client.print("{„input_d3“ : „);
client.print(stateD3);
client.println(“}");
client.print("{„input_d4“ : „);
client.print(stateD4);
client.println(“}");
client.print("{„input_d5“ : „);
client.print(stateD5);
client.println(“}");
client.print("{„input_d6“ : „);
client.print(stateD6);
client.println(“}");
client.print("{„input_d7“ : „);
client.print(stateD7);
client.println(“}");
client.print("{„input_d8“ : „);
client.print(stateD8);
client.println(“}");
} else {
socket = false;
}

}

void loop() {

inputD1 = digitalRead(pinD2);
if (inputD1 != lastStateD1) {
tD1 = millis();
}
if ((millis() - tD1) > tDebounce) {
if (inputD1 != stateD1) {
stateD1 = inputD1;
if (socket) {
client.print("{„input_d1“ : „);
client.print(inputD1);
client.println(“}");
}
}
}
lastStateD1 = inputD1;

inputD2 = digitalRead(pinD3);
if (inputD2 != lastStateD2) {
tD2 = millis();
}
if ((millis() - tD2) > tDebounce) {
if (inputD2 != stateD2) {
stateD2 = inputD2;
if (socket) {
client.print("{„input_d2“ : „);
client.print(inputD2);
client.println(“}");
}
}
}
lastStateD2 = inputD2;

inputD3 = digitalRead(pinD4);
if (inputD3 != lastStateD3) {
tD3 = millis();
}
if ((millis() - tD3) > tDebounce) {
if (inputD3 != stateD3) {
stateD3 = inputD3;
if (socket) {
client.print("{„input_d3“ : „);
client.print(inputD3);
client.println(“}");
}
}
}
lastStateD3 = inputD3;

inputD4 = digitalRead(pinD5);
if (inputD4 != lastStateD4) {
tD4 = millis();
}
if ((millis() - tD4) > tDebounce) {
if (inputD4 != stateD4) {
stateD4 = inputD4;
if (socket) {
client.print("{„input_d4“ : „);
client.print(inputD4);
client.println(“}");
}
}
}
lastStateD4 = inputD4;

inputD5 = digitalRead(pinD6);
if (inputD5 != lastStateD5) {
tD5 = millis();
}
if ((millis() - tD5) > tDebounce) {
if (inputD5 != stateD5) {
stateD5 = inputD5;
if (socket) {
client.print("{„input_d5“ : „);
client.print(inputD5);
client.println(“}");
}
}
}
lastStateD5 = inputD5;

inputD6 = digitalRead(pinD7);
if (inputD6 != lastStateD6) {
tD6 = millis();
}
if ((millis() - tD6) > tDebounce) {
if (inputD6 != stateD6) {
stateD6 = inputD6;
if (socket) {
client.print("{„input_d6“ : „);
client.print(inputD6);
client.println(“}");
}
}
}
lastStateD6 = inputD6;

inputD7 = digitalRead(pinD8);
if (inputD7 != lastStateD7) {
tD7 = millis();
}
if ((millis() - tD7) > tDebounce) {
if (inputD7 != stateD7) {
stateD7 = inputD7;
if (socket) {
client.print("{„input_d7“ : „);
client.print(inputD7);
client.println(“}");
}
}
}
lastStateD7 = inputD7;

inputD8 = digitalRead(pinD9);
if (inputD8 != lastStateD8) {
tD8 = millis();
}
if ((millis() - tD8) > tDebounce) {
if (inputD8 != stateD8) {
stateD8 = inputD8;
if (socket) {
client.print("{„input_d8“ : „);
client.print(inputD8);
client.println(“}");
}
}
}
lastStateD8 = inputD8;
if (!client.connected()) {
client.stop();
delay(100);
//Reconnect
if (client.connect(server, 1024)) {
socket = true;
stateD1 = digitalRead(pinD2);
client.print("{„input_d1“ : „);
client.print(stateD1);
client.println(“}");
stateD2 = digitalRead(pinD3);
client.print("{„input_d2“ : „);
client.print(stateD2);
client.println(“}");
stateD3 = digitalRead(pinD4);
client.print("{„input_d3“ : „);
client.print(stateD3);
client.println(“}");
stateD4 = digitalRead(pinD5);
client.print("{„input_d4“ : „);
client.print(stateD4);
client.println(“}");
stateD5 = digitalRead(pinD6);
client.print("{„input_d5“ : „);
client.print(stateD5);
client.println(“}");
stateD6 = digitalRead(pinD7);
client.print("{„input_d6“ : „);
client.print(stateD6);
client.println(“}");
stateD7 = digitalRead(pinD8);
client.print("{„input_d7“ : „);
client.print(stateD7);
client.println(“}");
stateD8 = digitalRead(pinD9);
client.print("{„input_d8“ : „);
client.print(stateD8);
client.println(“}");
} else {
socket = false;
}
}

}

<?
if($_IPS[‚SENDER‘] == „RegisterVariable“) {

$data = RegVar_GetBuffer($_IPS['INSTANCE']);
$data .= $_IPS['VALUE'];
if (strpos($data, '{') === false || strpos($data, '}') === false) {
    RegVar_SetBuffer($_IPS['INSTANCE'], $data);

} else {
while (strpos($data, ‚{‘) !== false && strpos($data, ‚}‘) !== false) {
$pos1 = strpos($data, ‚{‘);
$pos2 = strpos($data, ‚}‘);
$msg = substr($data, $pos1, ($pos2-$pos1)+1);
$json = json_decode($msg);
if ($json) {
foreach($json as $entryName => $entryValue) {
IPS_LogMessage(„Arduino“, $entry_name.": ".$entryValue);
switch ($entryName) {
case „input_d1“:
SetValue(36301 /[Arduino\Test\DI1]/, !$entryValue);
break;
case „input_d2“:
SetValue(49388 /[Arduino\Test\DI2]/, !$entryValue);
break;
case „input_d3“:
SetValue(17883 /[Arduino\Test\DI3]/, !$entryValue);
break;
case „input_d4“:
$var_time = IPS_GetVariable(59506 /[Arduino\Test\DI4]/)[‚VariableUpdated‘];
if (time() - $var_time >= 1) {
SetValue(59506 /[Arduino\Test\DI4]/, !$entryValue);
}
break;
case „input_d5“:
$var_time = IPS_GetVariable(19019 /[Arduino\Test\DI5]/)[‚VariableUpdated‘];
if (time() - $var_time >= 1) {
SetValue(19019 /[Arduino\Test\DI5]/, !$entryValue);
}
break;
case „input_d6“:
$var_time = IPS_GetVariable(24182 /[Arduino\Test\DI6]/)[‚VariableUpdated‘];
if (time() - $var_time >= 1) {
SetValue(24182 /[Arduino\Test\DI6]/, !$entryValue);
}
break;
case „input_d7“:
SetValue(54295 /[Arduino\Test\DI7]/, !$entryValue);
break;
case „input_d8“:
$var_time = IPS_GetVariable(20118 /[Arduino\Test\DI8]/)[‚VariableUpdated‘];
if (time() - $var_time >= 1) {
SetValue(20118 /[Arduino\Test\DI8]/, !$entryValue);
}
break;
}
}
}
$data = substr($data, $pos2 + 1);
RegVar_SetBuffer($_IPS[‚INSTANCE‘], $data);
}
}
}

?>



hoffe das man das so besser nachvollziehen kann

Ich habe das Script mal etwas Angepasst um vom Arduino aus Variablen in IPS Anlegen zu können um verschiedenen Sensoren zu Visualisieren.

Dazu sendet der Arduino pro Sensor ein Eigens JSON Object wo neben dem Aktuellen Messwert auch der Name, der Typ und das zu verwendende Profiel enthalten sind. Ziel war es dass ich nur Auf Arduino Seite etwas ändern muss wenn neue Sensoren hinzukommen.

Das IPS Script dazu sieht wie folgt aus:

<?
 if($_IPS['SENDER'] == "RegisterVariable")
 {

	 $data = RegVar_GetBuffer($_IPS['INSTANCE']);
	 $data .= $_IPS['VALUE'];

	 if (strpos($data, '{') === false || strpos($data, '}') === false)
	 {
	 	RegVar_SetBuffer($_IPS['INSTANCE'], $data);
	 }
	 else
	 {
	 	 while (strpos($data, '{') !== false && strpos($data, '}') !== false)
		 {
			 $pos1 = strpos($data, '{');
			 $pos2 = strpos($data, '}');
			 $msg = substr($data, $pos1, ($pos2-$pos1)+1);
			 $json = json_decode($msg);
			 if ($json)
			 {
			   $ObjektID = @IPS_GetObjectIDByName($json->Name, IPS_GetParent($_IPS['SELF']));

				if ($ObjektID == false)
				{
				   //0 Legt eine Variable vom Typ Boolean an
					//1 Legt eine Variable vom Typ Integer an
					//2 Legt eine Variable vom Typ Float an
					//3 Legt eine Variable vom Typ String an

				    $ObjektID = IPS_CreateVariable( $json->Typ/* Float */ );
				    IPS_SetParent ( $ObjektID, IPS_GetParent($_IPS['SELF']) );
				    IPS_SetVariableCustomProfile($ObjektID, $json->Profile);
				    IPS_SetName($ObjektID, $json->Name);

				}
				else
				    echo "Die Objekt-ID lautet: ". $ObjektID;
				 $oldVal = GetValue($ObjektID );
				 if($oldVal !== $json->Value)
				 {
					 SetValue($ObjektID  , $json->Value);
				 }

	 		}
	 		$data = substr($data, $pos2 + 1);
			RegVar_SetBuffer($_IPS['INSTANCE'], $data);
 		}
  	}
 }


?>

Aus Arduino Seite dann Beispielhaft für meine Sesoren:

Serial.println("Sende Daten an IPS");
           ipsclient.print("{\"Name\" : \"Temp\", ");
           ipsclient.print("\"Value\" : ");
           ipsclient.print(t);
           ipsclient.print(", \"Typ\" : 2");
           ipsclient.print(", \"Profile\" : \"~Temperature\"");
           ipsclient.println("}");
           
           Serial.println("Sende Daten an IPS");
           ipsclient.print("{\"Name\" : \"Hum\", ");
           ipsclient.print("\"Value\" : ");
           ipsclient.print(h);
           ipsclient.print(", \"Typ\" : 2");
           ipsclient.print(", \"Profile\" : \"~Humidity.F\"");
           ipsclient.println("}");
           
           Serial.println("Sende Daten an IPS");
           ipsclient.print("{\"Name\" : \"PIR\", ");
           ipsclient.print("\"Value\" : ");
           ipsclient.print(pir);
           ipsclient.print(", \"Typ\" : 0");
           ipsclient.print(", \"Profile\" : \"~Precence\"");
           ipsclient.println("}");

Vielleicht findet es ja jemand hilfreich.

Hallo Nibles

Vor 2 Wochen habe ich mir ebenfalls einen Arduino geholt habe und nun lese ich vorerst 8 Sensoren aus und in möchte diese in IPS visualisieren.
Das Script läuft auf anhieb Fehlerfrei. Dabei muss ich nicht mal wissen welche ObjectId was anzeigen soll. Nur den Arduino Updaten und die Daten sind im IPS. Perfekt

Danke und Gruss
tschewie

Ich habe auch den Arduino Mega 2560 und einen Raspi. Beide sind über LAN angebunden.

Der IPS läuft auf dem Raspi.
Wie kann ich efststellen ob der Skecth mit dem Script „spricht“ ? Im Moment wurde die Testvariable noch nie aktualisiert. Da stimmt irgendwas nicht.
Mein Port ist 3777 im Sketch vom Arduino . liegt es daran?
Wie sieht denn die Minimallösung aus?

SG, Thomas