Hallo Joachim,
bei mir braucht mein Ausleseskript ~12000ms bis alle 7 Ds18S20 Werte da sind.
Nutze ich für meine Heizungssteuerung, die komplet per Skripten gemacht ist.
Hier noch mal mein skript, wie es bis heute klaglos läuft :
<?
$id = IPS_GetParent($_IPS['SELF']);
$id2= IPS_GetParent($id);
$id3= IPS_GetObjectIDByName("GPIO Temperatur", $id2);
//------------------------------------------------------------------------------
if($_IPS['SENDER'] == "Execute") // nur wenn bei "Ausführen"
{
CreateVariableByName($id3, "onewireId", 3);
CreateVariableByName($id3, "onewirezaehler", 1);
$onewireID = IPS_GetObjectIDByName("onewireId", $id3);
SetValue($onewireID, "");
$vid = CreateVariableByName($_IPS['SELF'], "Running", 0);
$eid = CreateEventIDByName($_IPS['SELF'], "StartStop", 0);
IPS_SetEventActive($eid, true);
IPS_SetEventTrigger($eid, 0, $vid);
IPS_SetEventScript($eid, $_IPS['SELF']);
$zaehler = intval(exec('cat /sys/bus/w1/devices/w1_bus_master1/w1_master_slave_count'));
$onewirezaehlerID = IPS_GetObjectIDByName("onewirezaehler", $id3);
SetValue($onewirezaehlerID, $zaehler);
$datei = file("/sys/bus/w1/devices/w1_bus_master1/w1_master_slaves");
$i=1;
foreach($datei AS $dallas_id)
{
$ds_id[$i]= $dallas_id;
$wire = GetValue($onewireID);
$wire = "".$wire." ".$ds_id[$i];
SetValue($onewireID, $wire);
$i++;
}
}
//------------------------------------------------------------------------------
// if($_IPS['SENDER'] == "TimerEvent") //
$onewireID = IPS_GetObjectIDByName("onewireId", $id3);
$onewirezaehlerID = IPS_GetObjectIDByName("onewirezaehler", $id3);
$zaehler = GetValue($onewirezaehlerID);
//$zaehler = intval(exec('cat /sys/bus/w1/devices/w1_bus_master1/w1_master_slave_count'));
$wire = GetValue($onewireID);
$ds_id = explode(" ", $wire);
for ($i = 1; ; $i++)
{
if ($i > $zaehler) {
break;
}
$ds_id[$i]= trim($ds_id[$i]);
$temp = exec('cat /sys/bus/w1/devices/'.$ds_id[$i].'/w1_slave |grep t=');
$crc = exec('cat /sys/bus/w1/devices/'.$ds_id[$i].'/w1_slave | grep crc | sed "s/^.*\(...\)$/\1/"');
$temp = explode('t=',$temp);
//The power-on reset value of the temperature register is +85°C
if($crc =="YES" and $temp[1] !== "-62" and $temp[1] !== "85000") //Fehler raus, -1.2 °C ,85°C und CRC
{
$temp = $temp[1] / 1000;
$temp = round($temp,2);
$id = CreateVariableByName($id3, $ds_id[$i], 2);
SetValue($id, $temp);
}
}
//------------------------------------------------------------------------------
if($_IPS['SENDER'] == "Variable")
{
if($_IPS['VALUE'])
{
IPS_SetScriptTimer($_IPS['SELF'], 10); // Sekunden-Takt
} else {
IPS_SetScriptTimer($_IPS['SELF'], 0);
}
}
//------------------------------------------------------------------------------
//##############################################################################
function CreateVariableByName($id, $name, $type)
{
$vid = @IPS_GetVariableIDByName($name, $id);
if($vid===false) {
$vid = IPS_CreateVariable($type);
IPS_SetParent($vid, $id);
IPS_SetName($vid, $name);
}
return $vid;
}
//##############################################################################
function CreateEventIDByName($id, $name, $type)
{
$eid = @IPS_GetEventIDByName($name, $id);
if($eid===false) {
$eid = IPS_CreateEvent($type);
IPS_SetParent($eid, $id);
IPS_SetName($eid, $name);
}
return $eid;
}
?>