Modul für die Raspberry Pi GPIOs

Ich würde gerne ein natives Modul für die Steuerung und Interrupt-Triggerung der Raspberry Pi GPIOs schreiben. Gibt es für die Raspi Version auch schon ein SDK oder eine Möglichkeit das Modul einzuklinken?

Ja gibt es.
Neue Funktion: Module
Geofency Modul

Auf Github hat Paresy einige nette Beispiele.

Allerdings fehlen noch immer einige Funktionen und Bugs gibt es auch noch.
Michael

Hallo,
ich hätte auch Interesse an einem Modul für die GPIOs.
Hat sich hier vielleicht schon etwas getan?

Gruß Mirank

…ich bin aktuell dabei ein solches Modul zu schreiben - und würde mich sehr über Unterstützung freuen!

Joachim

Hallo Joachim,

ich werde das auch noch angehen, wenn ich wieder etwas Zeit habe.
Bis jetzt habe ich nur Skripte für die GPIO’s, Eingänge, Ausgänge und 1wire Bus.
Damit steuere ich seit NOV2015 meine Ölheizung mit allem drum und dran.
Dazu habe ich in /etc/rc.local stehen:


#!/bin/sh -e
#
# rc.local
#
# This script is executed at the end of each multiuser runlevel.
# Make sure that the script will "exit 0" on success or any other
# value on error.
#
# In order to enable or disable this script just change the execution
# bits.
#
# By default this script does nothing.
/opt/gpio/gpio_init.sh
exit 0 

Inhalt von /opt/gpio/gpio_init.sh :


#!/bin/sh
# Input-Ports (Taster)
for Port in  20 21
  do
  echo "$Port" > /sys/class/gpio/export
  echo "in" >/sys/class/gpio/gpio${Port}/direction
  chmod 660 /sys/class/gpio/gpio${Port}/direction
  chmod 660 /sys/class/gpio/gpio${Port}/value
done

# Output-Ports (LED/Relais)
for Port in 17 27 22 23 24
  do
  echo "$Port" > /sys/class/gpio/export
  echo "out" >/sys/class/gpio/gpio${Port}/direction
  echo "0" >/sys/class/gpio/gpio${Port}/value
  chmod 660 /sys/class/gpio/gpio${Port}/direction
  chmod 660 /sys/class/gpio/gpio${Port}/value
done

Und ein Beispiel, um aus dem Webfront ein Relais zu schalten (aktion gpio):


<?
if($_IPS["SENDER"] == "WebFront")
{
   SetValue($_IPS["VARIABLE"], $_IPS["VALUE"]);
	if($_IPS["VALUE"] ==0) {exec ('echo "1" > /sys/class/gpio/gpio22/value');}// Brenner aus
	if($_IPS["VALUE"] ==1) {exec ('echo "0" > /sys/class/gpio/gpio22/value');}// Brenner ein
}
?>

1wire wird über /boot/config.txt eingerichtet :

gpu_mem=16
dtoverlay=sdhost
#dtoverlay=w1-gpio
dtoverlay=w1-gpio,gpiopin=4,pullup=on

Danach kann ich mir per Skript in IPS die Daten(in meinem Fall, Temperaturen holen.) :


<?
$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 habe ich noch einige Reglerskripte, die Kessel, Brenner, Mischer und Pumpen steuern, und das läuft richtig gut. Daher will ich da auch noch ein Modul von machen,

1 „Gefällt mir“