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