Modul zur Nutzung der Raspberry Pi GPIO

Warum den Multiplexer nicht als Splitter einbauen?
Der macht das Umschalten und den sync. Und die anderen Instanzen braucht man dann nicht ändern.
Michael

Multiplexer unterstützung wäre echt sehr schön :-). Darf gern priorisiert werden

Gesendet von meinem SM-G935F mit Tapatalk

…was den Multiplexer angeht hatte ich vorhin so einen schönen Text als Antwort auf Michaels Hinweis geschrieben - offensichtlich aber vergessen es abzusenden…:rolleyes:

Im Kern: Um das hierarchisch einigermaßen korrekt abzubilden wäre meine Idee einen Multiplexer in die bestehende Splitter-Instanz zu integrieren. Das würde nach meiner Vorstellung bedeuten, dass man dann insgesamt sechs I²C-Busse hätte (Bus1 + vier für den Multiplexer + Bus 0).
Die Auswahl des gewählten Busses erfolgte dann über die jeweiligen Instanz-Formulare - ich meine, dass sollte doch eigentlich genug Möglichkeiten eröffnen?

Zum anderen: Bitte mal auf einen Testaufbau für 1-Wire schauen. Nach einem Update kann diese - wenn der 1-Wire-Server am Raspberry Pi (raspi-config) aktiviert und die 1-Wire 18x20 korrekt angeschlossen sind mit

I2G_GetOneWireData(ID der IO-Instanz);

aufgerufen werden.
Ergebnisse sind dann nur bei den Meldungen sichtbar!
Was auffällt: Der Zugriff auf die Datei, die den Messwert enthält dauert finde ich sehr lange…:confused:
Dieses ist übrigens schon auf dem Raspberry Pi selbst auffällig gewesen, wenn man nur versucht, mal mit MC da reinzuschauen.

Neu übrigens:

  • Einige Erweiterungen in der HTML-Darstellung im Enigma2-Modul
  • Neues Modul zur Heizungs-Einzelraumsteuerung

Joachim

Hallo Joachim,

nachdem ich mich zwischenzeitlich ein bisschen mit dem ESP8266 beschäftigt hatte, bin ich nun wieder zu deinem Modul zurückgekehrt und habe auch sogleich wieder einen Verbesserungsvorschlag. Da ich aber sehe, dass Du dich gerade an anderer Stelle engagierst würde ich diesen natürlich hinten anstellen… mit low Priority…

Zu dem Vorschlag…
Ich habe mal die PCF8574 ohne I2C Verbindung in Betrieb genommen und festgestellt, dass die Pins nach dem einschalten der Stromversorgung ein High Signal ausgeben. Genauso ist es wenn ich den Raspi ohne LAN Verbindung, aber mit, über I2C, angeschlossenen PCF8574 starte und pigpiod von Deinem Modul, wegen dem fehlendem Netzwerk, keine Befehle bekommen kann.
Das Problem ist nun, dass Du nach einem Reconnect als Initialisierung jeden Ausgangs Port auf Low setzt. (Die Eingänge hast Du ja auf meinen Wunsch hin bereits auf High gesetzt) Das bedeutet, dass er nach dem einschalten der Versorgungsspannung, wie gesagt, auf High geht und Dein Modul ihn nach einem Reconnect mit IPS auf Low schaltet. Das führt in jedem Fall zu einem schalten der Ausgänge! Egal ob die an dem Ausgang hängende Schaltung als Low oder High Aktiv konzipiert ist. Wobei, wahrscheinlich ist sie Low Aktiv, weil der Baustein nämlich geradezu dafür prädestiniert ist, denn er kann nur 500 Mikroampere als High Signal ausgeben, aber 12 Milliampere als Low Signal aufnehmen. Selbst für eine LED sind die 500 Mikroampere zu wenig. Also wird man ihn fast immer als Low Aktiv betreiben.

Worauf will ich hinaus…!? Ich würde vorschlagen das du je Baustein (Instanz) oder besser noch je Pin des Bausteins die Wahl zwischen Low und High Aktiv bietest. So wie auf deiner Konfig Seite mit Ein- und Ausgang und Logging ja/nein.
Im Augenblick kommt nämlich noch dazu, das wenn man den Baustein als Low Aktiv betreibt, dann ist immer die Visualisierung der Portzustände genau falsch herum! Das wäre demnach auch ein Punkt der bei dieser Änderung zu berücksichtigen wäre.
Die zu ändernde Punkte wären also…

  1. Erweiterung der Konfigurationsseite des PCF8574 Moduls
  2. Es müsste bei jeder Initialisierung bei der Auswahl Low Aktiv ein High Signal für den Port Pin gesetzt werden (Egal ob Eingang oder Ausgang) und umgekehrt ein Low Signal bei High Aktiv. Eingänge müssten dann von den Usern generell auf Low Aktiv gesetzt werden. Die Änderung die Du für mich eingebaut hast, würde dann dadurch ersetzt.
  3. Die Anzeige des aktuellen Zustands in allen Variablen müsste sich entsprechend der Konfiguration von Low oder High Aktiv entsprechend verhalten. Also bei Low Aktiv „AN“ zeigen wenn der 8574 eine 0 an dem Pin zurückmeldet und umgekehrt eine „Aus“ anzeigen wenn eine 1 an dem Pin ansteht.

Sollte das Ganze allerdings mit zuviel Aufwand verbunden sein, wäre es vielleicht zumindest im ersten Schritt besser, als Initialisierungswert eine Eins in ALLE Portpins zu schreiben, nicht nur in die Eingänge. Dann würde es zumindest beim starten nicht zu einem unbeabsichtigten Schalten externer Hardware kommen… Das die Statusvisualisierung dann nicht der Realität entspricht, kann man vielleicht anderweitig umgehen oder damit leben.

Danke für die viele Zeit die Du in dies alles investierst…

Gruß

Ralf

Hallo Ralf,

hänge im Moment noch beim 1-Wire, werde das aber versuchen schnellst möglich nachzuführen!

Hier noch mal zum Thema 1-Wire:
Das ist der Code im Prinzip

  1. SFTP Verbindung zum Raspberry Pi
  2. Schauen ob die Verzeichnis-Struktur des 1-Wire-Servers existiert
  3. die angeschlossenen DS1820 ermitteln
  4. die 1w_slave-Datei auslesen, um den Messwert zu ermitteln

Ist im Prinzip auch ganz einfach, nur der Zugriff auf die Datei mit dem Messwert dauert „ewig“!
Schritte 1 bis inkl. 3 liegen bei ungefähr 3 Sekunden, bis die Ergebnisse da sind weitere 30-45 Sekunden!

Ich habe keine Ahnung warum es so lange dauert, diese Datei auszulesen. Die Messung des DS wird im Internet mit ungefähr 750ms angegeben…
Wenn man sich direkt auf den Raspberry Pi einloggt und versucht z.B. mit mc die Datei zu lesen, dauert es auch ungewöhnlich lange…

Hat jemand eine Erklärung dafür?

Joachim

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;
}
?>

Hallo Joachim,

die lange laufzeit kann ich bestätigen mit

I2G_GetOneWireData(ID der IO-Instanz);  

Das Skript

<?
$Sensor = "10-000802f973a0";
$temperatur = implode('', file("/sys/bus/w1/devices/".$Sensor."/w1_slave"));
$temperatur = substr($temperatur, strpos($temperatur, "t=") +2);
$temperatur = round(($temperatur/1000),1);

$alte_temperatur = GetValueFloat(15294 /*[1-Wire\1]*/);

if ($temperatur <> $alte_temperatur)
   {
   SetValueFloat(15294 /*[1-Wire\1]*/, $temperatur);
   $rpc = new JSONRPC ("http://xxx.xxxx@xxx.de:12345678@192.168.1.38:3777/api/");
   $rpc->SetValue(39496, $temperatur);
   }
   
?>

braucht ~840 ms. Über PuTTY kommt die Antwort auch recht flott. Es ist zurzeit nur ein DS1820 angeschlossen.

Zu Schritt 1-3. Muss das jedes mal ermittelt werden? Würde es nicht reichen im Instanzkonfigurator einstellen?

Ich stell mir das so vor: Im Instanzkonfigurator Schaltfläche „Suchen“ führt Schritte 1bis 3 aus und listet die ermittelte Sensoren auf.
Ein Pull-Down-Menü bittet die auswahl an.

Wladimir

Sorry wenn ich das in Erwägung ziehe Joachim, aber laut dieser Seite:

Raspberry Pi: 1-Wire Temperatursensor DS1820

ist der Standardport für 1 Wire GPIO04. Genauso wie für pigpio i2c. Hast Du evtl. beide paralell laufen ohne die Ports anzupassen?

Wie Du sicher weißt kannst Du dir mit lsmod die laufenden Kernelmodule anzeigen lassen. Und mit modprobe -r Modulname wieder entladen.

Gruß

Ralf

…dem würde ich widersprechen:
I2C ist auf GPIO 2/3, 1-Wire auf GPIO 4.
Vielleicht hast Du jetzt gerade Pin-Nummer und GPIO-Nummer verwechselt?

Joachim

:banghead: Ich scheine noch nicht richtig wach zu sein! Natürlich hast Du Recht mit der Belegung! Ich muss einfach besser recherchieren bevor ich etwas poste, Mist!

Dennoch würde ich, sich ‚behackelnde‘ Treiber in Erwägung ziehen, wenn der Hardwareanschluß korrekt ist. Mehr bleibt ja auch nicht mehr…

Gruß

Ralf

…geht mir manchmal auch so - bist da in guter Gesellschaft![emoji2]

Ich werde es mit 1-Wire noch mal mit SSH statt mit SFTP versuchen…

Joachim

…so ein erstes funktionsfähiges 1-Wire-Modul ist fertig.

Bitte mal testen. Voraussetzungen:

  • 1-Wire-Server aktiviert
  • 1-Wire-18x20 Sensoren korrekt an GPIO 4 angeschlossen

Die Antwortzeiten sind jetzt akzeptabel. Im Moment wird nur die Temperatur selbst angezeigt.
Es kommt ja eine Datei in dieser Form

37 01 4b 46 7f ff 09 10 26 : crc=26 YES
37 01 4b 46 7f ff 09 10 26 t=19437

Was kann man mit dem „YES“ machen? Was kann da sonst noch so stehen? „NO“?
Soll mit diesem Wert noch neben der Temperatur eine Boolean-Variable gesetzt werden?

Bin auf Eure Rückmeldung gespannt…

Joachim

Hi,

habt ihr mal die Reichweiten der einzelnen Sensoren verfolgt? Ich meine die Leitungslänge…
Geht mir darum, ob man den RPi in der VT läßt und die Sensoren ‚‚Sternförmig‘‘ verlegt.

Hatte mal HYT und TSL am IX. Da waren die Reichweiten knapp um die 3m gewesen. Ich weiß ist I²C und ist nur für Platinen gedacht… und Expander gibt es auch… aber wäre mal interessant, wie der PI das nimmt.

Hallo Lutz,

der Zweck ist hier sicherlich nicht, lange Netzwerke von einem zentralen Punkt aufzubauen, sondern den Raspberry Pi dort hin zu bringen, wo eine Häufung von vielen Sensoren auf engem Raum erforderlich ist. Bei mir z.B. sitzt ein Raspberry Pi im Schlafzimmer unter dem Bett, steuert dort RGB-Stripes, die Nachttischleuchten und hat den BME280 Sensor, nebenbei ist er auch noch eine Squeezebox…
Andere haben den Raspberry Pi neben die Heizung gehängt, um dort diverse Messwerte aufzunehmen.

Wer lange Netzwerke aufbauen will - gerade im Bezug auf 1-Wire - sollte andere Wege gehen.
Bei I²C wird in verschiedenen Foren durchaus darüber berichtet, dass sie etliche Meter an Kabel dort verbaut haben - über die tatsächlichen Längen gibt es aber unterschiedliche Aussagen, hängt vielleicht auch vom Sensor ab.

Joachim

…zum Multiplexer:
Ich habe begonnen diesen zu integrieren. Wer also schon „Fragmente“ in den Instanzen findet, sie funktionieren (noch) nicht!
Dazu sind verschiedene Erweiterungen auch im „Kern“ notwendig, bitte daher noch etwas Geduld!

Joachim

Juhu dann bestelle ich mir schonmal den multiplexer ;-)…danke

Gesendet von meinem SM-G935F mit Tapatalk

Hallo Joachim,

Ich bin begeistert, 1Wire Modul rennt. Vielen vielen Dank :slight_smile:

Habe mal einen Kabelbruch simuliert, dabei geht die Temperatur auf -1,3 und nach einer weile auf 0. Dabei
könnte die Steuerung schon schief laufen. Was hältst du von einer Boolean „Online b.z.w Störung“ ?
ps: Mit low Priorität, hast ja noch andere Projekte :wink:

@Lutz, Mich hat die Neugier gepackt mit der Kabellänge.
Habe ein 12 Meter Cat7 angeschlossen (nichts längeres gefunden), DS1820 dran und ?? es läuft :cool:

Klar Lutz,
du kennst meinen Heizungs Pi:D
Habe vom Pi Längen (WILD durcheinander ) von ca .35 Meter Klingeldraht mit 7 x DS18x20, da ist kein Aussetzer seit über einem Jahr zu sehen.

I2C, Hagi hat da am IX mal locker 20 Meter am alufen, aber das ist nicht mein Ding…Ich halte die Dinge kurz…:slight_smile:
BME, TSL am Pi und Ix werkeln perfekt mit 20cm (im Wechsel Test, wenn ich probiere…)

.

Hi,

ich werde das Modul auch mal testen. Habe hier auch noch ein IAQ, HY-SRF05, Napions liegen, sowie einen SHT11.

Gibt es eigentlich für den BME280 eine Filterkappe, um diesen auf ‚‚IP67‘‘ Niveau (bei mir geht es hauptsächlich um Staub) zu bekommen. Habe im Netz noch nichts gefunden. Würde den Sensor gerne an meinem Trockner anschliessen und diesen regeln. Habe immer noch einen Alten, wo nur ne Z-Uhr eingebaut ist.

Den Napion sollte dann für das Aufwachen des 7" Touch sein.

Naja und der HY-SRF für die Garage, wegen Auto einfahren usw…