Pokeys56x wird logisch

Nachdem sich meine Sensoren immer wieder verabschieden haben, habe ich beim Support nachgefragt, ob es über Modbus einen Reset-Befehl gibt um die HW 1x pro Tag zu reseten. Bisher musste ich in den Keller und das Netzteil aus- / einstecken. Daraufhin wurde eine neue Version erstellt. Die von Dir empfohlenen Widerstände habe ich in jedes der Sensorkabel eingelötet.

Zum Anlegen der Pokey-HW in IP-Symcon habe ich mir ein Script geschrieben (Ist aber noch nicht vollständig):

<?
$poKeys56E_Name = "Relays";
$poKeys56E_Pin_Prefix = "Pin ";
$poKeys56E_DeviceId = 0;
$poKeys56E_Host = "192.168.123.121";
$poKeys56E_Port = 502;

$poKeys56E_AnalogPin_Suffix = " (Analog Input)";
$potLog27_TemperaturPin_Suffix = " (1-Wire DS18B20)";

//ID des Archive Handler (bitte anpassen)
$Archive_Handler = 31319 /*[Archive Handler]*/;

$object = IPS_GetObject($IPS_SELF);
$parentId = $object['ParentID'];

//createPoKeys56E($poKeys56E_Name, $poKeys56E_Pin_Prefix, 1, "192.168.123.121", $poKeys56E_Port, $parentId, $Archive_Handler);
//deletePotPog27($poKeys56E_Name, $poKeys56E_Pin_Prefix, $poKeys56E_DeviceId, $parentId, $potLog27_TemperaturPin_Suffix);
//createPotLog27($poKeys56E_Name, $poKeys56E_Pin_Prefix, $poKeys56E_DeviceId, $poKeys56E_Host, $poKeys56E_Port, $parentId, $potLog27_TemperaturPin_Suffix, $poKeys56E_AnalogPin_Suffix, $Archive_Handler);

/// Löscht eine PotLog27 Instanz
function deletePotPog27($name, $pinPrefix, $deviceId, $parentId, $tempPinSuffix) {
	$catName = $name." ".$deviceId;

	//Delete Pins
	$parent = @IPS_GetCategoryIDByName($catName, $parentId);
	if($parent != false) {
		for($i = 0; $i < 27; $i++) {
			$pinName = $pinPrefix.str_pad($i+1, 3 ,'0', STR_PAD_LEFT).$tempPinSuffix;
			$pin = IPS_GetInstanceIDByName($pinName , $parent);
			dropDS18B20($pin);
		}
		IPS_DeleteCategory($parent);
		
		//Delete Splitter
		$splitter = IPS_GetInstanceIDByName($name." ".$deviceId." RTU TCP" , 0);
		if($splitter != false) { IPS_DeleteInstance($splitter); }

		//Delete Socket
		$socket = IPS_GetInstanceIDByName($name." ".$deviceId." Client Socket" , 0);
		if($socket != false) { IPS_DeleteInstance($socket); }
		echo $catName." wurde gelöscht
";
	} else {
		echo $catName." existiert nicht und kann deswegen nicht gelöscht werden
";
	}
}

/// Erstellt eine PoKeys56E Instanz
function createPoKeys56E($name, $pinPrefix, $deviceId, $host, $port, $parent, $archiveHandler) {
	$catName = $name." ".$deviceId;

	//Prüfen, ob es die Instanz schon gibt. Falls ja wird nichts angelegt!
	if(IPS_GetCategoryIDByName($catName, $parent) == false) {

		// Client Socket erstellen
		$socket = cretateClientSocket($name." ".$deviceId." Client Socket", $host, $port);

		// Modbus RTU TCP erstellen
		$splitter = createModbusRTUTCP($name." ".$deviceId." RTU TCP", 0, $deviceId, true, $socket);

		$parent = createKategorie($name." ".$deviceId, $parent);

		createPoExtBus(3, $parent, $splitter, $archiveHandler);

		//Client Socket aktivieren!
		aktiviereClientSocket($socket);

		echo $catName." wurde erstellt
";
	} else {
	   echo $catName." existiert bereits
";
	}
}
/// Erstellt eine PotLog27 Instanz
function createPotLog27($name, $pinPrefix, $deviceId, $host, $port, $parent, $tempPinSuffix, $analogPinSuffix, $archiveHandler) {
	$catName = $name." ".$deviceId;

	//Prüfen, ob es die Instanz schon gibt. Falls ja wird nichts angelegt!
	if(IPS_GetCategoryIDByName($catName, $parent) == false) {

		// Client Socket erstellen
		$socket = cretateClientSocket($name." ".$deviceId." Client Socket", $host, $port);

		// Modbus RTU TCP erstellen
		$splitter = createModbusRTUTCP($name." ".$deviceId." RTU TCP", 0, $deviceId, true, $socket);

		$parent = createKategorie($name." ".$deviceId, $parent);

		//Temperatur Pins erstellen (27 Stück)
		for($i = 0; $i < 27; $i++) {
			$pinName = $pinPrefix.str_pad($i+1, 3 ,'0', STR_PAD_LEFT).$tempPinSuffix;
			$pinAddress = 400 + ($i*2);
			createDS18B20($pinName, $pinAddress, $parent, $splitter, $archiveHandler);
		}

		//Analoge Pins erstellen (7 Stück)

		for($i = 0; $i < 7; $i = $i + 2) {
			$pinName = $pinPrefix.str_pad($i+41, 3 ,'0', STR_PAD_LEFT);
			if($i < 6) {
				$pinName = $pinName." / ".str_pad($i+42, 3 ,'0', STR_PAD_LEFT);
			}
			$pinName = $pinName.$analogPinSuffix;
			createAnalogenTemperatursensor($pinName, $i, $parent, $splitter, $archiveHandler);
		}


		//Client Socket aktivieren!
		aktiviereClientSocket($socket);
		
		echo $catName." wurde erstellt
";
	} else {
	   echo $catName." existiert bereits
";
	}

}

function createKategorie($name, $parent) {
	$catId = IPS_CreateCategory();
	IPS_SetName($catId, $name);
   IPS_SetParent($catId, $parent);

	return $catId;
}

function aktiviereClientSocket($clientSocketId) {
	IPS_SetProperty($clientSocketId, "Open", true);
	IPS_ApplyChanges($clientSocketId);
}

function cretateClientSocket($modulName, $host, $port) {
	$moduleId = "{3CFF0FD9-E306-41DB-9B5A-9D06D38576C3}";

	$clientSocketId = IPS_CreateInstance($moduleId);
   IPS_SetName($clientSocketId, $modulName);
	IPS_SetProperty($clientSocketId, "Host", $host);
	IPS_SetProperty($clientSocketId, "Port", $port);
	IPS_SetProperty($clientSocketId, "Open", false);
   IPS_SetParent($clientSocketId, 0);
	IPS_ApplyChanges($clientSocketId);

	return $clientSocketId;
}

function createModbusRTUTCP($modulName, $gatewaymode, $deviceId, $swapWords, $socketId) {
	$moduleId = "{A5F663AB-C400-4FE5-B207-4D67CC030564}";

   $modbusRTUTCP = IPS_CreateInstance($moduleId);
   IPS_SetName($modbusRTUTCP, $modulName);
	IPS_SetProperty($modbusRTUTCP, "GatewayMode", $gatewaymode);
	IPS_SetProperty($modbusRTUTCP, "DeviceID", $deviceId);
	IPS_SetProperty($modbusRTUTCP, "SwapWords", $swapWords);
	IPS_ConnectInstance($modbusRTUTCP, $socketId);
   IPS_SetParent($modbusRTUTCP, 0);
   IPS_ApplyChanges($modbusRTUTCP);

	return $modbusRTUTCP;
}

function dropDS18B20($pin) {
	if($pin != false) {
		IPS_DisconnectInstance($pin);
		$variable = IPS_GetVariableIDByName("Value", $pin);
		if($variable != false) { IPS_DeleteVariable($variable); }
		$variable = IPS_GetVariableIDByName("Temperatur", $pin);
		if($variable != false) { IPS_DeleteVariable($variable); }
		IPS_DeleteInstance($pin);
	} else {
		echo "Der DS18B20 mit der Id ".$pin." wurde nicht gelöscht, da dieser nicht exisitert
";
	}
}


function createTemperaturVariable($name, $parent, $archiveHandler) {
	// Variable für die Temperatur erstellen. Diese kann dann umbenannt und in eine andere Kategorie verschoben werden.
	$pinTemperatur = IPS_CreateVariable(2);
   IPS_SetParent($pinTemperatur, $parent);
   IPS_SetName($pinTemperatur, $name);
   IPS_SetVariableCustomProfile($pinTemperatur, "~Temperature");
	AC_SetLoggingStatus($archiveHandler, $pinTemperatur, true);
	return $pinTemperatur;
}

function createPinEvent($triggerPin, $parent, $script) {
	// Event zur Aktualisierung von $pinTemperatur
	$eid = IPS_CreateEvent(0);
	IPS_SetEventTrigger($eid, 0, $triggerPin);
	IPS_SetParent($eid, $parent);
	IPS_SetEventActive($eid, true);

	IPS_SetEventScript($eid, $script);

	return $eid;
}


function createAnalogenTemperatursensor($modulName, $offset, $parent, $modbusRTUTCP, $archiveHandler) {
	$pin = createModbusDevice(3, $modulName, 10 + $offset, 1000, true, $parent, $modbusRTUTCP);
	$pinValue = IPS_GetVariableIDByName("Value", $pin);
	$pinTemperatur1 = createTemperaturVariable("Temperatur 1", $pin, $archiveHandler);
   $pinTemperatur2 = false;
	$script = "\$value = GetValueInteger($pinValue);
SetValueFloat($pinTemperatur1, (\$value & 65535) * 3.3 / 4095);";

	if($offset < 6) {
	   $pinTemperatur2 = createTemperaturVariable("Temperatur 2", $pin, $archiveHandler);
		$script = $script."
SetValueFloat($pinTemperatur2, ((\$value  >> 16) & 65535)  * 3.3 / 4095);";
	}
	createPinEvent($pinValue, $pin, $script);
}

function createPoExtBus($numDevices, $parent, $modbusRTUTCP, $archiveHandler) {
		$cat = createKategorie("PoExtBus", $parent);
		for($i = 1; $i <= $numDevices; $i++) {
		   createPoExtBusDevice($i, $cat, $modbusRTUTCP, $archiveHandler);
		}
		return $cat;
}

function createPoExtBusDevice($deviceNo, $parent, $modbusRTUTCP, $archiveHandler) {
		$cat = createKategorie("Device ".$deviceNo, $parent);
		for($i = 1; $i <= 8; $i++) {
         createPoExtBusPin($deviceNo, $i, $cat, $modbusRTUTCP, $archiveHandler);
		}
		return $cat;
}

function createPoExtBusPin($deviceNo, $pinNo, $parent, $modbusRTUTCP, $archiveHandler) {
   $adresse = 2079 - ($deviceNo - 1) - ($pinNo - 1);
   $temp = Array(1 => "A", 2 => "B", 3 => "C", 4 => "D", 5 => "E", 6 => "F", 7 => "G", 8 => "H");
   $modulName = "Output ".$temp[$pinNo];

	$pin = createModbusDevice(0, $modulName, $adresse, 1000, true, $parent, $modbusRTUTCP);
	//$pinValue = IPS_GetVariableIDByName("Value", $pin);
   return $pin;
}


function createDS18B20($modulName, $adresse, $parent, $modbusRTUTCP, $archiveHandler) {
	$pin = createModbusDevice(3, $modulName, $adresse, 1000, true, $parent, $modbusRTUTCP);
	$pinValue = IPS_GetVariableIDByName("Value", $pin);
	$pinTemperatur =createTemperaturVariable("Temperatur", $pin, $archiveHandler);

	createPinEvent($pinValue, $pin, "\$value = GetValueInteger(".$pinValue.");
if(\$value <= 13000 /*[Objekt #13000 existiert nicht]*/) {
    SetValueFloat(".$pinTemperatur.", \$value/100);
}");

   return $pin;
}

function createModbusDevice($datenTyp, $modulName, $adresse, $time, $nurLesen, $parent, $modbusRTUTCP) {
	$moduleId = "{CB197E50-273D-4535-8C91-BB35273E3CA5}";

   $modbusDevice = IPS_CreateInstance($moduleId);
   IPS_SetName($modbusDevice, $modulName);
   ModBus_SetType($modbusDevice, $datenTyp);
   ModBus_SetWriteAddress($modbusDevice, $adresse);
   ModBus_SetReadAddress($modbusDevice, $adresse);
   ModBus_SetPoller($modbusDevice, $time);
   ModBus_SetReadOnly($modbusDevice, $nurLesen);
	IPS_ConnectInstance($modbusDevice,$modbusRTUTCP);
   IPS_SetParent($modbusDevice, $parent);
   IPS_ApplyChanges($modbusDevice);
   
   return $modbusDevice;
}
?>

Keine Garantie für das Script :slight_smile:

Einen Widerstand habe ich für den gesamten Bus…

Kann ja daran liegen?

Würde mich mal interssieren ob Du mit diesem Script Ruhe hast bzw gehabt hättest…

Du muß Dir die Fühlernummern imm XML-Script anschauen, dann mein Script anpassen… wenn Du willst;-)

<?
//http://192.168.0.250/devStat.xml
$array = simplexml_load_file('http://192.168.0.250/devStat.xml');

echo $array->in[0]."  ";
echo $array->out[0]."   ";
echo $array->enc[0]."  ";
echo $array->anMax[0]."  ";
echo $array->anIn[0]."  ";
echo $array->sensor[21]."  ";// hier Fühler nummern anpassen
echo $array->PoILshare[1]."  ";

?>

Hat der Support Dir deshalb das File geschickt?

Gruß Helmut

Ich habe die Sensoren ja einzeln angeschlossen, da ich die Potlog27-Firmware verwende. Da brauche ich doch pro Sensor einen Widerstand, oder nicht?

Dem Support habe ich kein File geschickt. Die haben die Fix ohne irgendwelche weitere Angaben von mir gemacht.

LG
Stefan

Entschuldige, ja dann brauchst Du je Einen.

Hast Recht, wie groß? So um 3,3kOhm?

Gruß Helmut

So wie Du es mir vor ca. einem Jahr gesagt hast. Ich glaube es wären 3,3kOhm.

Gruß
Stefan

Na, dann hoffe ich, dass die neue Soft Dir hilft.

Gruß Helmut

Und seit heute gibt es eine 3.1.7

Und seit heute gibt es eine 3.1.9

und wurde durch 3.1.9b ersetzt

Mal wieder was Neues von PoKeys.

Firmwareupdate auf V. 3.1.10 (22.02.2014)

Pulse engine - external 4 channel mode bug fixed
Pulse engine - improved transitions between number of enabled channels
PoIL bug fixes

Update:
Firmwareupdate auf V. 3.1.12 (23.02.2014)

Keine Unterschiede erläutert zu 3.1.10

WiKi ist upgedatet.
Hab mal die Firmwarevon PoBlocks getrennt und bei Hardware angehängt.

Hallo Eisi2003,

habe nun auch begonnen, mich mit dem Pokeys zu beschäftigen und bin auch schon gut vorangekommen dank Helmuts Hilfe - dafür danke.

Habe ich PoTLog27 Firmware geladen und ein paar DS18B20 auf dem Steckbrett (ist ja ne geile Erfindung) zusammegebastelt. Werte werden gelesen und in IPS kommen sie auch an.

Da ich nun gern die 27 Instanzen automatisch anlegen möchte, bin ich über dein Script im Post #141 gestolpert und habe es für meine Bedürfniss angepasst. Klappt gut.

 <?

$object = IPS_GetObject($IPS_SELF);
$parentId = $object['ParentID'];

$modbusRTUTCP = 50593 /*[ModBus RTU TCP - Pokeys 1]*/;
$pin = 44;
$new = createModbusDevice(3, "Mein Modbus-Gerät - Pin $pin", $pin, 9500, true, $parentId, $modbusRTUTCP);

// -----------------------------------------------------------------------------
// Funktionen


function createModbusDevice($datenTyp, $modulName, $adresse, $time, $nurLesen, $parent, $modbusRTUTCP) {
    $moduleId = "{CB197E50-273D-4535-8C91-BB35273E3CA5}";

   $modbusDevice = IPS_CreateInstance($moduleId);
   IPS_SetName($modbusDevice, $modulName);
   ModBus_SetType($modbusDevice, $datenTyp);
   ModBus_SetWriteAddress($modbusDevice, $adresse);
   ModBus_SetReadAddress($modbusDevice, $adresse);
   ModBus_SetPoller($modbusDevice, $time);
   ModBus_SetReadOnly($modbusDevice, $nurLesen);
   //IPS_ConnectInstance($modbusDevice,$modbusRTUTCP);
   IPS_SetParent($modbusDevice, $parent);
   IPS_ApplyChanges($modbusDevice);

   return $modbusDevice;
}


?>

Allerdings finde ich die Befehle ModBus_SetXXX in der Hilfe nicht. Ich möchte noch den Haken bei „Status emulieren“ löschen lassen. Geht das überhaupt per Script?

In der Hilfe habe ich als die wohl ähnlichste Sache diese (IPS_SetProperty) gefunden:

ModBus Address
Eigenschaft Typ Standardwert
WriteAddress integer 0
ReadAddress integer 0
Poller integer 0
ReadOnly boolean 0

Weiterhin die Frage nach der Stabilität von DS18B20 per PotLog27 an Pokeys: gibt es bei dir Aussetzer? Habe PoTLog-Firmware 5.0.8 im Einsatz. Bis jetzt (sind aber auch erst 2 Tage) keinerlei Aussetzer. Habe mit dem USB-Buskoppler meine Sorgen und möchte nun auf etwas anderes umsteigen - der Pokeys klingt da sehr passend. Dabei die Frage nach PoTLog27 oder lieber Bus?

Es sollte irgendwie mit „IPS_SetProperty“ gehen. Frag doch mal beim Support nach. Eventuell fehlt der Eintrag nur in der Dokumentation.

Seit der Version 5.0.8 funktioniert die Potlog-Firmware fehlerfrei. Ich hatte seit dem keine Aussetzer mehr, trotz teilweise sehr langer Kabel. Wichtig ist, dass Du den Widerstand (3,3kOhm) in das Kabel des 1-Wire-Sensors einlötest.

Gruß
Stefan

Nee, Der Befehl findet sich [b]hier[/b].

Gruß Helmut

Update:
Firmwareupdate auf V. 3.1.12b (27.02.2014)
Keine Unterschiede erläutert zu 3.1.12

Nee, Der Befehl findet sich hier.

Welche Eigenschaft ist für „Status emulieren“ zuständig? Man muss doch unter „ModBus Address“ schauen, oder? Wobei „Status emulieren“ auch bei anderen Instanzen vorhanden ist und somit keine spezifische Eigenschaft für „ModBus Address“ sein muss. Möglicherweise gibt es dafür aber nichts oder tatsächlich versteckt und nciht dokumentiert. Denn die Befehle von Eisi2003 finde ich in der Hilfe ebenfalls nicht, aber sie funktionieren.

PS: Hiersind schon andere darüber gefallen.

Firmwareupdate auf V. 3.1.14 (01.03.2014)
PoIL updates
Ultra fast encoder Modbus bug fixed

Firmwareupdate V. 3.1.15,
UDP Mode (der Pokeys kann jetzt endlich was zu IPS senden und nicht nur umgekehrt)

weitere Funktionen:
KP, hab ich weggeklickt :wink:

Weiß jetzt nicht ob die offiziell ist, da die Poscope Seite grad Down ist aber ueber den Beitrag von Helmut (Pokeys über UDP) findet man den Link.

Firmwareupdate V.3.1.16

PoKeys software changelog: 3.1.16: 1-wire and I2C sensors support via PoBlocks, Limit switch configuration bug fixed, PoBlocks update; 3.1.15: UDP mode added to report server support; 3.1.14: Modbus encoder access bug fixed

Wo bleibt nur der PoPLC58 und vor allem die passende Firmware, damit das Teil auch mal was zeigen kann.

Ein wichtiges Update für alle 1Wire Freunde.

Es scheint, dass man jetzt ein beliebiges 1Wire- oder I2C-Gerät lesen/beschreiben kann.

Wohl auch zB DS2408. Guggst Du:

Gruß Helmut

BWow, ich dachte noch beim Lesen: 1wire Sensoren kann ich doch schon lesen.
Dass damit alle Devices möglich sind, daran hatte ich ja nicht zu hoffen gewagt. Ich hab leider nix zum Testen da.

Nachtrag: Nur wenn der echte Bus geht, ist dann evtl auch die Restriktion auch 10 Sensoren gefallen?
Das wäre ein Doppel-Wow wert.

Na…ja…
Du mußt dann die Seriennummer lesen und mit Deinen Anforderungen in PoBlocks verknüpfen… schätze das ist ein hoher Aufwand.

In Pokey gab es schon immer einen 1Wire-Bus-Test, nur wie ich da 700ms Pause mache, das habe ich nicht verstanden…

In PoBlock geht sowas naturlemang…

Ich wünsche mir immer noch eine RS232 TTL-Schnittstelle ;=)

Gruß Helmut
PS UDP mit Pokey56E habe ich nicht geschafft, 57E geht… Support glaubt mir nicht…

1wire_bus_test.jpg

Ich hab zwar Euer UDP-Problemchen gelesen aber da ich momentan andere Dinge mache, halt ich mich da bedeckt.