MySensors auf Arduino basis

Hallo zusammen,
durch Zufall bin ich auf http://www.mysensors.org gestoßen und wollte mal fragen ob schon jemand an einer Integration arbeitet?
Das ist ein Open Source Projekt (absolut kostenlos) und mit nur zwei Arduinos + zwei Funk Modulen kann man seinen eigenen Sensor oder Aktor aufbauen und über Funk auswerten/steuern.

Kennt das schon jemand?

Gruß, Luar.

Hört sich interessant an,

gleich mal direkt ein paar Arduino Sachen und Sensoren bestellt. Also in ca. 4-6 Wochen kann ich mehr sagen.

Nachdem es ja alle möglichen Controller gibt (zB: FHEM, OpenHAB)

sollte da sicherlich auch was Richtung IPS gelingen.

Eine API Beschreibung gibt es ja auch zwischen Gateway und Controller:
http://www.mysensors.org/download/serial_api_15

LG
Thiemo

Hi Leute, ich habe mich mal die letzten Tage damit beschäftigt. Mysensors hat den vorteil, dass es sich um den ganzen message packing und flow kümmert. Am Empfänger kommt also auch was brauchbares an :-). Ich habe ein relais und ein thermostat zusammengesteckt. Das serial gateway ist versuchweise mit mynetsensor (gateway software auf dem pc) gekoppelt. Mit einem telnet programm wie putty kann man lauschen was ankommt. In der api sind die messagebestandteile beschrieben, heisst also man könnte es mit ipsymcon abgreifen, interpretieren und dann einbinden. Soweit bin ich aber lange noch nicht. Wurde mich freuen wenn es noch andere mit erfahrungen gibt.

Im FHEM-Bereich wird damit schon ganz viel gemacht. Mein Kollege berichtet andauernd was die damit basteln. Meist zusammen mit MQTT.

Kann mich da mal jemand aufklären, was ich benötige zur „Kabellose“ Übertragung von Temperatur + Feuchte.

Ich habe die Bestellliste dort mal angeschaut, und die Beispiele… ganz verstanden hab ich es nicht…?

Sensor:
Sensebender Micro -> Sensorboard

  • Batterieboard mit 2x 1,5V AA / AAA Batterien

Funkboard für Sensebender Micro
NRF24L01+ 2,4Ghz

Empfänger für PC:
NRF24L01+ USB das per RS232 angesprochen werden kann
oder
Arduino Nano compatible mit integriertem Empfänger + FTDI USB

Programmierer:
FTDI USB to TTL Serial Adapter
(Programmer zur Einstellung/Firmwareeinspielung des Sensebender Boards)

Beim Empfänger für den PC + Programmierer bin ich mir nicht sicher?

Ist die Aufstellung korrekt / ausreichend?

Wie angedeutet, bin ich auf der Suche nach einer Batteriebetriebenen Temperatur/Feuchtemessung (im Haus)
Ein passendes Gehäuse dazu, und fertig - so mein Gedanke. Die Batterien sollen natürlich auch lange genug halten.

Meine Anfrage bei panStamp war leider ernüchternd - hinsichtlich der Gesamtinvestition. War mir einfach zu teuer.

Ich war mir da auch nicht ganz sicher, Ich habe für das Gateway sicherheitshalber noch zusätzlich einen NRF24L01+ mit externe Antenne dazu bestellt und ein ams1117 (um von 5V auf 3.3V zu drosseln da 5V das NRF24L01+ Modul schrotten) da der Arduino Nano den ich bestellt habe glaube ich keinen NRF24L01+ mit an Board hat.

Bzgl. der Sensoren habe ich nicht das fertige Sensebender bestellt sondern folgendes:
Arduino Pro Mini 328 Mini 3,3 V ATmega328
NRF24L01+
DHT22 fertiges Modul (Temparatur+Luftfeuchtigkeit)
3V AA Battery holder

Und Sachen die ich sowieso schon zuhause habe die sonst noch so benötigt werden:
Steckkabeln
Lötkolben + Lötzinn
usw…

Ja genau, das ganze ist eine Mischung aus dem Nrf24l1 modul und einem Arduino. Das ist immer die Grundlage für den Sensor. Je nach gewünschter funktion eben die sensoren wie ds1820 oder ultraschall sensor etc. Diese Kombinationen senden ihre werte an das Gateway. Ein Gateway ist auch nix anderes als ein Arduino mit dem Nrf24l1. Wenn das ein Arduino Nano ist, dann hat der ein usb port, den man zum beschreiben aber auch zum auslesen nutzen kann. Das ganze message protokoll ist beschrieben.
Ich bin lausig im php programmieren, aber könnte jemand was grundlegendes erstellen um wie beim CUNO die messages auszuwerten und im Ipsymcon in Instanzen und Variablen abzulegen?
Ich bin der Meinung dass es ipsymcon nochmal um eine weitere, sehr coole Schnittstelle erweitern würde.

Hallo,

Per seriellen Port kann man auf die Sensor Daten auch ohne Software-Controller zugreifen. Dafür benötigt man ein Arduino mit „Serial Gateway“ Sketch, welcher per COM Port an IP Symcon angeschlossen wird (Splitter Instanz, etc).

Zwingend notwendig ist dann nur, dass die einzelnen Nodes eine statische Node-ID bekommen, da normalerweise die Node-ID dynamisch von einer Controller-Software an die Node’s vergeben wird.

Auf diese Weise klappt es auch ohne Controller-Software direkt per IP Symcon.

Viele Grüße!

So Leute,
nach ein wenig bastelei habe ich mal ein kleines script zum einlesen der Daten von einem Ethernet Gateway.
Nach etwas rumprobieren mit dem Serial Gateway, dachte ich mir dass es mit einem Ethernet GW einfach flexibler ist.

Also hier ein Anfang zu dem Thema. Es wird einfach der String vom Cutter entgegengenommen, jeweils variablen zugewiesen und dann Kategorie und Variablen im IPsymcon erstellt.

<?php
//Tye definitons
$typ = 2 ;// "2" is Float
$kategory = 'Arduino';
$reg = 50680 /*[Arduino_Cutter\Arduino_Register Variable]*/; //this is the RegVar that holds the buffer
if ($IPS_SENDER == "RegisterVariable"){
	$data  = RegVar_GetBuffer($reg);
//$data = '137;0;1;0;1;45.9'; // This is a test sample for programming
	$data .= $IPS_VALUE;
	 
	$rows=preg_split("/
/",$data);
	//reset Regvar Buffer
	$data="";
	RegVar_SetBuffer($reg, "");
    //
	//here comes the code what to do with the information
  //
	foreach($rows as $data1) {
 		$actual = preg_split ('/;/',$data1);
			$node = $actual[0];
			$ChildSensor = $actual[1];
			$MsgType = $actual [2];
			$ack = $actual [3];
			$SubType =$actual [4];
			$payload =str_replace ('.',',',$actual[5]);

	$catID = getPar ($kategory, $node, $payload);// look in $kategory for an ID with name $node
	//echo $catID; //Found it and print it out
	$vid = getVid($catID,$ChildSensor,$typ); //now look under that ID for variables like $ChildSensor
	setValue($vid,$payload); //update value with $payload
	
//	setvalue($vid,$payload);
//echo $kategory;
//echo $vid;
//echo "   ";
//echo $nodeID;
//echo "   ";
//echo $payload;
		}
}  //this is the ENDIF OF THE IPSSENDER
//IPS_LogMessage ('Arduino',$data);
//echo $data;

function getPar ($kategory, $node, $payload) //lets look for the parent Category and ID
		{ 
 		$par = IPS_GetCategoryIDByName ($kategory, 0 ); //ID of Kategory 'arduino' under "0"
 		$catID = @IPS_GetCategoryIDByName($node, $par); //ID of Node "$node(136)" under Parent "arduino"
		 	if ($catID === false) 	{
   			$catID = IPS_CreateCategory();
   			ips_setname($catID,$node);
  				ips_setParent($catID,$par);
  		  									}
		return $catID; //after identifying, pass on to the main script
		}

function getVid($catID,$ChildSensor,$typ) //lets look for Variables like $ChildSensor
 		{
		if (IPS_GetVariableIDByName ( $ChildSensor,$catID) == TRUE) {
		$vid = IPS_GetVariableIDByName ( $ChildSensor,$catID);
	   																				}
	      else
	      {
   		$vid=IPS_CreateVariable($typ);
			ips_setname($vid,$ChildSensor);
			ips_setParent($vid,$catID);
			setValue($vid,'0');
			}
		return $vid;
		}

?>

Vielleicht hat jemand lust, mir etwas zu helfen bei der Erweiterung. Auf jeden Fall müssen die Variablen noch ein Profil bekommen und irgendwie muss das mit der Vergabe der NodeID noch rein…
Ich habe die Bausteine innerhalb von 2 Stunden zusammengebaut und die Sketches aufgespielt. Das geht recht geschmeidig muss ich sagen.:):slight_smile:

Grüße zum Weihnachtsfest
Bubi124

Ich habe jetzt einen großen Haufen Arduinos, Radios und Zubehör aus China bestellt… Finde das Thema sehr spannend :wink:

Bis das alles aber bei mir eingetroffen ist, werden noch 3-4 Wochen vergehen. Gibt es denn schon weitere Fortschritte an der Implementierung in IPS? Das als Modul wär natürlich die Wucht :smiley:

Ich warte auch noch immer auf ein paar wenige Teile. Aber einen Großteil habe ich schon. :smiley:
https://dl.dropboxusercontent.com/u/32562665/DSC_0005.JPG

Cool!!

Ich habe gestern meinen zweiten DHT22 Sensor gebaut. Das ist wirklich sehr einfach (wenn man seine Verdrahtungen und Lötstellen immer wieder auf Richtigkeit prüft)

Der Sensor meldet sich auch promt und läuft - nach einigen Modifikationen des ProMini - hoffentlich auch sehr lange auf seinen 2 AAA Batterien.

Leider muss ich im Augenblick noch den Umweg über ein Drittprogramm machen (MYS) um der Node eine ID zu geben. Dannach läuft das kleine Skript im IP Symcon und erstellt eine Kategorie mit den Variablen.

Wäre jemand in der Lage die Vergabe der ID’s und die Bennenung gemäß der API in PHP zu giessen? Ich bin nicht wirklich so gut darin.
Hat jemand mal mein Skript ausprobiert?

Bubi124

Eine kleine Basis an Komponenten ist jetzt auch schon bei mir eingetroffen - ein MAX6675 Thermometer für den Grill z.B. :smiley:

Vielleicht schaffe ich es heute Abend mal die Steckerleisten anzulöten und zumindest das Gateway zu bauen. Dein Script wird getestet :wink: Melde mich dann nochmal.

Ich glaube hier drin steckt viel Potential, vielleicht schaffen wir es ja noch zu einem Modul für :loveips: 4.0

Gruß,

Björn

Das Serial Gateway lauft bei mir auch schon einwandfrei. Da hatte ich am Anfang noch einen Fehler in meiner Konfiguration :smiley: Ich habe einen Spannungsregler auf 3,3V vor dem Funk Modul NRF24L01+ angebracht der aber nur geht wenn zwischen 4,5-7V anliegen und auf dem Arduino Nano der per USB betrieben wird, habe ich blöderweise das Plus auf 3,3V Ausgang angehängt :rolleyes:

Bei den Sensoren bin ich noch nicht ganz so weit.

  • den Arduino Pro Mini mit 3,3V kann ich mit einem FTDI USB Modul entsprechend flashen (nachdem ich manuell den Reset Button gedrückt habe am Arduino Pro Mini klappt es dann auch dass das Image korrekt geladen wird)
  • 2x AA Batterien liefern nach dem Messgerät ca. 3,2V Ausgang
  • wenn ich ohne Spannungsregler arbeitet erhalte ich aber keine korrekten Werte vom Sensor über das Funk Modul

Hier bin ich noch am überlegen an was es liegt. Schlecht gelötet oder brauche ich 3x AA Batterien mit einem Spannungsregler vor dem Funk Modul oder falsch gesteckt oder…

Hier werde ich wohl am Wochenende nochmal Zeit investieren.

LG
Thiemo

Ich habe bei allen teilen eine gemeinsame VCC und GND Versorgung. Damit gehen alle komponenten auch mit 2AA batterien.
Einen Sensor habe ich versuchsweise mit einem alten Handyakku (LiIon akku) 3,7V und der geht seit 4 Wochen. Lies mal nach wie sich manche über fehlenden strom am NRF beklagen und einen 10 uF Kondensator zwischen VCC und GND löten um die Spitzenströme zu managen.

Ich habe jetzt ein serial Gateway und einen MAX6675 Temperatursensor für meinen Smoker fertig :smiley:

Hatte Probleme mit nicht ankommenden Signalen. In MysController sah ich die ID_REQUEST und ID_RESPONSE aber das wars. Jetzt habe ich überall einen 4.7uF zwischen GND und VCC der Radios und danach ging es.

@Bubi124 - dein Script läuft auch, nachdem ich die richtige Cutterkonfiguration hatte :o

Die $IPS_VALUE und $IPS_SENDER mussten noch in $_IPS[‚VALUE‘] sowie $_IPS[‚SENDER‘] umgeschrieben werden.

Laufen tut es jetzt auf meinem Test Raspi mit IPS4.0

Gibt es bei euch noch Neuigkeiten? Ich werde den Sensornode dann mal auf eine Streifenplatine löten und in ein Gehäuse bauen. So auf einem Breadboard ist das im Garten beim Grill unpraktisch :wink:

Super. Ach ja, sorry, wollte die Cutter config noch beschreiben, hab’s aber vergessen. Ich habe nun mit der „Massenproduktion“ begonnen. Will in diversen Räumen temperaturen ermitteln. Ich wage mich dannach mal an ein Relais, dafür muss aber die Umsetzung der API hinsichtlich der set Befehle funktionieren. Bin leider kein PHP spezi.
Eigentlich braucht es sowas wie Tommi für das CUNO / CUL geschrieben hat.
Ich mache morgen mal Bilder von mein Aufbau und den verwendeten Platinen.

Hallo!

ich habe auch beschlossen mich Mal mit dem Thema zu beschaeftigen.
Die ersten Nodes laufen und ich habe angefangen mich um die IPS Integration zu kuemmern.
Zuerst hatte ich geguckt, ob es Sinn macht eine vorhandenen Controller Software als IPS Gateway zu patchen. Die ideale Basis habe ich aber leider nicht gefunden.
Danach habe ich MQTT als Gateway zu IPS probiert. Da hier der Controller auch in IPS implemetiert werden muss, habe ich dann beschlossen direkt mit dem Gateway (in meinem Fall Ethernet) zu reden.

Momentan ist das Script noch ‚work in progress‘, aber einige Sachen gehen schon.

Es muss ein ‚Client Socket‘ und ein ‚RegisterVariable‘ angelegt werden. ‚RegisterVariable‘ triggert das Script unten, welches am besten in einer eigenen Kategorie liegt.
Pro Node wird automatisch eine Conf Variable angelegt und eine freie ID vergeben. Die Conf Variable haelt ein Array mit den IPS Var IDs der jeweiligen MySensor Child Variablen. Das hat den Vorteil, das alle automatisch angelegten Varibalen beliebig umbenannt und verschoben werden koennen.

Ansatzweise setzt das Script auch schon den richtigen Variablen Typ und Profil.
Leider ist mir noch nicht ganz klar, ob, bzw. wie MySensors definiert, welchen Variablen Typ ein Child nutzt und ob eine Variable Read, Write oder Read/Write ist.
Letztendlich moechte ich aber, das z.B. ein Relay Node auch automatisch aus dem Webfront geschaltet werden kann.

Wie gesagt, ugly work in progress…


<?
print ( $_IPS['VALUE']);

$mysensors_base_category = IPS_GetParent($_IPS['SELF']);
$mysensors_client_socket = 17889 /*[Client Socket MySensors]*/;

$topic_level = explode(";", $_IPS['VALUE']);

$node_id = $topic_level[0];
$child_id = $topic_level[1];
$message_type = $topic_level[2];
$ack = $topic_level[3];
$sub_type = $topic_level[4];
$payload = trim(@$topic_level[5], "
");; //sometimes no payload, ignore.

$ms_msg_type = array(
        0 => 'presentation',
        1 => 'set',
        2 => 'req',
        3 => 'internal',
        4 => 'stream',
        );

$ms_s_type = array(
        0 => 'S_DOOR',
        1 => 'S_MOTION',
        2 => 'S_SMOKE',
        //3 => 'S_LIGHT',
        3 => 'S_BINARY',
        4 => 'S_DIMMER',
        5 => 'S_COVER',
        6 => 'S_TEMP',
        7 => 'S_HUM',
        8 => 'S_BARO',
        9 => 'S_WIND',
        10 => 'S_RAIN',
        11 => 'S_UV',
        12 => 'S_WEIGHT',
        13 => 'S_POWER',
        14 => 'S_HEATER',
        15 => 'S_DISTANCE',
        16 => 'S_LIGHT_LEVEL',
        17 => 'S_ARDUINO_NODE',
        18 => 'S_ARDUINO_REPEATER_NODE',
        19 => 'S_LOCK',
        20 => 'S_IR',
        21 => 'S_WATER',
        22 => 'S_AIR_QUALITY',
        23 => 'S_CUSTOM',
        24 => 'S_DUST',
        25 => 'S_SCENE_CONTROLLER',
        26 => 'S_RGB_LIGHT',
        27 => 'S_RGBW_LIGHT',
        28 => 'S_COLOR_SENSOR',
        29 => 'S_HVAC',
        30 => 'S_MULTIMETER',
        31 => 'S_SPRINKLER',
        32 => 'S_WATER_LEAK',
        33 => 'S_SOUND',
        34 => 'S_VIBRATION',
        35 => 'S_MOISTURE',
        255 => 'S_PRESENTATION',
);

/*
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
*/

/*
~Mode.HM
~Milliampere.HM
~Temperature.HM
~Window.HM
~Electricity.HM
~Motion.HM
~Volt.230
~Raining
~ShutterPosition.255
~ShutterAssociation
~Battery.Reversed
~WindDirection.Text
~WindDirection
~WindSpeed.ms
~WindSpeed.kmh
~Motion
~Valve.F
~Battery.100
~ShutterPosition.100
~Intensity.100
~Temperature.Difference
~Motion.Reversed
~Humidity.F
~Presence.Reversed
~Valve
~Temperature
~Illumination.F
~Temperature.Room
~Temperature.Fahrenheit
~Intensity.32767
~MailMessages
~Occurrence.CO2
~AirPressure.F
~Alert
~WindDirection.F
~UVIndex
~Switch
~Intensity.1
~Battery
~Illumination
~Presence
~Lock.Reversed
~HTMLBox
~Alert.Reversed
~Brightness.HM
~ShutterMove
~Window.Reversed
~Volt
~Shutter
~Lock
~Ampere
~Ampere.16
~Watt.3680
~Humidity
~Watt.14490
~Hertz
~Hertz.50
~Intensity.255
~Electricity
~Water
~Gas
~Power
~Window
~Flow
~String
~UnixTimestamp
~TextBox
~Rainfall
~HexColor
~AirPressure
*/

//arrays to be finished...
$ms_v_type = array(
        0 => array('v_type_name' => 'V_TEMP', 		'ips_v_type' => 2, 'ips_v_profile' => '~Temperature'),
        1 => array('v_type_name' => 'V_HUM',       'ips_v_type' => 2, 'ips_v_profile' => '~Humidity.F'),
        2 => array('v_type_name' => 'V_STATUS',    'ips_v_type' => 0, 'ips_v_profile' => '~Switch'),
        //2 => 'V_LIGHT',
        3 => array('v_type_name' => 'V_PERCENTAGE','ips_v_type' => 2, 'ips_v_profile' => '~Intensity.100'),
        //3 => 'V_DIMMER',
        4 => array('v_type_name' => 'V_PRESSURE',  'ips_v_type' => 2, 'ips_v_profile' => '~AirPressure'),
        5 => 'V_FORECAST',
        6 => 'V_RAIN',
        7 => 'V_RAINRATE',
        8 => 'V_WIND',
        9 => 'V_GUST',
        10 => 'V_DIRECTION',
        11 => 'V_UV',
        12 => 'V_WEIGHT',
        13 => 'V_DISTANCE',
        14 => 'V_IMPEDANCE',
        15 => 'V_ARMED',
        16 => 'V_TRIPPED',
        17 => 'V_WATT',
        18 => 'V_KWH',
        19 => 'V_SCENE_ON',
        20 => 'V_SCENE_OFF',
        21 => 'V_HVAC_FLOW_STATE',
        22 => 'V_HVAC_SPEED',
        23 => 'V_LIGHT_LEVEL',
        24 => 'V_VAR1',
        25 => 'V_VAR2',
        26 => 'V_VAR3',
        27 => 'V_VAR4',
        28 => 'V_VAR5',
        29 => 'V_UP',
        30 => 'V_DOWN',
        31 => 'V_STOP',
        32 => 'V_IR_SEND',
        33 => 'V_IR_RECEIVE',
        34 => 'V_FLOW',
        35 => 'V_VOLUME',
        36 => 'V_LOCK_STATUS',
        37 => 'V_LEVEL',
        38 => array('v_type_name' => 'V_VOLTAGE',    'ips_v_type' => 1, 'ips_v_profile' => '~Volt'), //well, actually mV...
        39 => 'V_CURRENT',
        40 => 'V_RGB',
        41 => 'V_RGBW',
        42 => 'V_ID',
        43 => 'V_UNIT_PREFIX',
        44 => 'V_HVAC_SETPOINT_COOL',
        45 => 'V_HVAC_SETPOINT_HEAT',
        46 => 'V_HVAC_FLOW_MODE',
        );
        
$ms_i_type = array(
        0 => 'I_BATTERY_LEVEL',
        1 => 'I_TIME',
        2 => 'I_VERSION',
        3 => 'I_ID_REQUEST',
        4 => 'I_ID_RESPONSE',
        5 => 'I_INCLUSION_MODE',
        6 => 'I_CONFIG',
        7 => 'I_FIND_PARENT',
        8 => 'I_FIND_PARENT_RESPONSE',
        9 => 'I_LOG_MESSAGE',
        10 => 'I_CHILDREN',
        11 => 'I_SKETCH_NAME',
        12 => 'I_SKETCH_VERSION',
        13 => 'I_REBOOT',
        14 => 'I_GATEWAY_READY',
        15 => 'I_REQUEST_SIGNING',
        16 => 'I_GET_NONCE',
        17 => 'I_GET_NONCE_RESPONSE',
        );


//parse different message types
switch ($ms_msg_type[$message_type])
{
   //($node_id, $child_sensor_id, $message_type, $ack, $sub_type, $payload)

   case 'presentation':
		print "Node:" .$node_id
		    ." - Child:" .$child_id
		    ." - Func:" .$ms_msg_type[$message_type]
		    ." - ACK:" .$ack
		    ." - Sub-Type:" .$ms_s_type[$sub_type]//['v_type_name']
		    ." - Payload:" .$payload
		    ."
";

		$node_conf_var = create_node_conf($node_id);
		$node_conf = unserialize(GetValueString($node_conf_var));
		
		//a new node?
		if (!@array_key_exists ('node_id_' .$node_id, $node_conf)) //ignore empty conf warning
		{
		   echo "creating node instance
";
		   
			$instance_id = IPS_CreateInstance("{485D0419-BE97-4548-AA9C-C083EB82E61E}"); //dummy
			IPS_SetParent($instance_id, $mysensors_base_category);
		   IPS_SetName($instance_id, "node ID" .$node_id);

		   $node_conf['node_id_' .$node_id] = $instance_id;
		}

		//a new child?
		if (!@array_key_exists ('child_id_' .$child_id, $node_conf)) //ignore empty conf warning
		{
		   echo "creating child variable
";
		   
		   $child_var_id = IPS_CreateVariable(3); //since we don't know the var type yet, set it to string for the moment
		   IPS_SetParent($child_var_id, $node_conf['node_id_' .$node_id]);
		   IPS_SetName($child_var_id, "child ID" .$child_id .':' .$payload);
		   
		   $node_conf['child_id_' .$child_id] = $child_var_id;
		}
		
		//should we acknolege? correct way to be checked..
		if($ack === '1')
		{
			echo "send ack";
			CSCK_SendText($mysensors_client_socket, $node_id .';' .$child_id .';' .$message_type .';1;' .$sub_type .';' .$payload .';' .chr(0x0a));
		}
		
		break;

	case 'set':
   	print "Node:" .$node_id
				." - Child:" .$child_id
				." - Func:" .$ms_msg_type[$message_type]
				." - ACK:" .$ack
				." - Sub-Type:" .$ms_v_type[$sub_type]['v_type_name']
				." - Payload:" .$payload
				."
";
				
      $node_conf_var = get_node_conf($node_id);

		//skip unknown nodes.
		if(!$node_conf_var)
		{
			print "unknown node id" .$node_id ."- skipping";
			exit;
		}

		$node_conf = unserialize(GetValueString($node_conf_var));
		
		//var type is not 100% known during presentation. check if it was already updated.
		if(IPS_GetVariable($node_conf['child_id_' .$child_id])['VariableType'] != $ms_v_type[$sub_type]['ips_v_type'])
		{
			Print "updating var type
";
			$old_var_name = IPS_GetName($node_conf['child_id_' .$child_id]);
			IPS_DeleteVariable($node_conf['child_id_' .$child_id]);
			$child_var_id = IPS_CreateVariable($ms_v_type[$sub_type]['ips_v_type']);
			$node_conf['child_id_' .$child_id] = $child_var_id;
         IPS_SetParent($child_var_id, $node_conf['node_id_' .$node_id]);
		   IPS_SetName($child_var_id, $old_var_name);
		   IPS_SetVariableCustomProfile($child_var_id, $ms_v_type[$sub_type]['ips_v_profile']);
		}
		
		echo "payload" .$payload ."#";
		
		//cast the payload into the right type and write it to ips variable
		switch ($ms_v_type[$sub_type]['ips_v_type'])
		{
		   case 0: SetValue($node_conf['child_id_' .$child_id], (bool)$payload); break; //it's bool
		   case 1: SetValue($node_conf['child_id_' .$child_id], (integer)$payload); break; //it's int
			case 2: SetValue($node_conf['child_id_' .$child_id], (float)$payload); break; //it's float
			case 3: SetValue($node_conf['child_id_' .$child_id], (string)$payload); break; //it's string
		}

				
		break;

   case 'req':
		print "Node:" .$node_id
				." - Child:" .$child_id
				." - Func:" .$ms_msg_type[$message_type]
				." - ACK:" .$ack
				." - Sub-Type:" .$ms_v_type[$sub_type]
				." - Payload:" .$payload;
		break;

	case 'internal':
		print "Node:" .$node_id
			 ." - Child:" .$child_id
			 ." - Func:" .$ms_msg_type[$message_type]
			 ." - ACK:" .$ack
			 ." - Sub-Type:" .$ms_i_type[$sub_type]
			 ." - Payload:" .$payload;
			 
		switch ($ms_i_type[$sub_type])
		{
		   case 'I_ID_REQUEST':
				//find a node addess free to assign
				$id=1;
				while ($id <= 254)
				{
				   $free_node_id = @IPS_GetVariableIDByName('node_id_' .$id, $mysensors_base_category);
					if(!$free_node_id) break;
					$id++;
				}
				
				if ($id > 254)
				{
					print "no more free node IDs - skipping.";
					exit;
				}
				
				echo 'sending new ID ' .$id;
				CSCK_SendText($mysensors_client_socket, '255;255;3;0;4;' .$id .';' .chr(0x0a));
		      
		   	break;

         case 'I_CONFIG':
		      echo 'send I_CONFIG';
		      //correct way? to be checked...
				CSCK_SendText($mysensors_client_socket, $node_id .';' .$child_id .';3;0;6;M;' .chr(0x0a));

		   	break;
		}
			 
		break;

	case 'stream':
	   echo 'stream is not supported, yet';
		break;
}

if (isset($node_conf_var))
{
	SetValueString($node_conf_var , serialize($node_conf));
   print_r ($node_conf);
}
/*----------------------------------------------------------------------------*/

function create_node_conf($node_id)
{
	$parent_category = IPS_GetParent($_IPS['SELF']);

	$var_node_id = @IPS_GetVariableIDByName("node_id_" .$node_id, $parent_category);
	if($var_node_id === false)
	{
	       echo "creating missing node conf variable for ID:" .$node_id ."
";
	       $var_node_id = IPS_CreateVariable(3);
	       IPS_SetName($var_node_id , "node_id_" .$node_id);
	       IPS_SetParent($var_node_id, $parent_category);
	}

	return $var_node_id;
}

function get_node_conf($node_id)
{
	$parent_category = IPS_GetParent($_IPS['SELF']);
	$var_node_id = @IPS_GetVariableIDByName("node_id_" .$node_id, $parent_category);
	return $var_node_id;
}

?>

So, ich werde Mal weiter machen. Comments welcome!

Gruss, Michael

Hallo Michael,

auf den ersten Blick sieht das super aus , gerne mehr. Ich baue heute Abend mal einen weiteren Node zusammen, dann teste ich den aktuellen Stand des Script mal auf ID Vergabe und so weiter. Die API Dokumentation habe ich mir noch nicht im Detail angeschaut, ganz schlau geworden bin ich auf die Schnelle daraus auch noch nicht. Welcher Subtype set/req unterstützt :confused:

Hi Michael,

ganz klasse! ich probiere das dann auch mal bei mir.
Zusätzlich zu meinen 3 Nodes habe ich jetzt auch ein Relay-Station erstellt. Kommunikation ist transparent. Man sieht also in den Werten nicht dass es weitergeleitet wurde.Genauer gesagt, scheint es für die Nodes und den Variablen die wir typischerweise sehen wollen (Temp, Volt, Hum etc. ) keinen Unterschied zu machen.

Jedenfalls danke! Ich bin in PHP eine Niete.

Neil