Zu 1wire auf dem Pi.
Dieses Skript liest den 1wire Bus auf dem Pi aus,wenn in der /boot/config.txt der Bus aktiviert ist.
config.txt um die Zeile erweitern, und 1wire an den GPIO Pin anschliessen :
Beispiel, alle Sensoren auslesen und alle VAR im IPS anlegen (geht automatisch..)
<?
$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;
}
?>
Dann hast du alle 1wire Sensoren im IPS, und kannst hinter jedem Sensor ein Ereignis legen (bei Werteänderung) welches ein Skript mit passenden senden zum LCN auslöst. (werde ich hier nicht posten, kommt dann per anders zu dir, wenn du es brauchst.)
Dafür brauchst du dann aber eine LCN-PCHK zur Kopplung am LCN !
ps hier noch der link zu den Bildern...
https://www.symcon.de/forum/threads/295 ... post273872