Modul zur Nutzung der Raspberry Pi GPIO

Zu 2:
Fehler in der Konsole.
Ist nach einem Neustart weg.
Steht auch in der Liste der bekannten Bugs.
Michael

Auch gut: mal etwas für das ich nicht verantwortlich bin![emoji4]

Danke Michael für den Hinweis!

…noch mal zu dem was in der Input-Instanz eingestellt werden muss: wenn das Signal auf die die Instanz reagieren soll ein true ist muss dieses eingestellt werden. (Z.B. Ein ganz normaler Taster der - wenn betätigt - dann ein high am Eingang ergibt).
Wenn Dein Interrupt „normal“ False ist und als Signal auf True wechselt muss Du das Häkchen setzen…

Joachim

@Nall chan
Das kann ich leider nicht bestätigen. Nach einem Neustart des Win 10 Rechners und somit der Konsole sind die Befehle weiterhin doppelt vorhanden. Vielleicht gibt es mehrere Ursachen…?

@Joachim
Das mit der Einstellung habe ich genau so verstanden. Durch den Pull Up habe ich ja ständig ein High Signal an dem Eingangsportpin und durch den Interrupt der Aktiv Low ist, wird das Signal dann gegen null gezogen.

Die Meldungen…

Ich bin mir nicht sicher wo die regelmäßige 10 sek. Aktivierung des Notify herkommt. Wenn ich die Leitung von dem Raspi Pin abziehe ist Ruhe. Daraus könnte man ja ableiten, dass Störungen durch den fliegenden Aufbau die Ursache sind. Aber immer genau nach 10 Sekunden? Sehr merkwürdig. Habe noch einmal überprüft ob ich irgendwo eine Zeit von 10 Sekunden eingestellt hatte, aber nein habe ich nicht. Wenn ich die Leitung wieder anstecke kommen die Notifys wie erwartet erstmal hektisch und chaotisch um dann wieder nach kurzer Zeit in den 10 Sekunden Rhythmus zu verfallen.
Also wenn es bei dir keine internen Poll’s in diesem Rhythmus gibt, dann könnte es vielleicht auch von pigpio her kommen…

Fazit…, wenn der Aufwand zu groß ist, dann belasse ich es bei der Pollabfrage von 1 Sekunde…, wobei die Sache mit dem Interrupt natürlich eleganter ist… und zeigt wie flexibel man deine Module einsetzen kann… :smiley:

…einen schönen Sonntag noch…

Ralf

…passt es vielleicht zu dem Zyklus, in dem Du den Baustein abfragst?
Für mich sieht es so aus, als wenn er sauber alle 10 Sekunden ein Signal bekommt…

Joachim

…aus meinem Modul heraus gibt es nichts mit 10 Sekunden Taktung. Pigpio selbst sendet alle 60 Sekunden ein „Update“…

Joachim

Ja natürlich… das hatte ich übersehen. Ich hatte nur in den Einstellungen kontrolliert ob ich alle auf Wiederholungszyklusse auf 0 gestellt hatte und ja das ist auch so, aber trotzdem wird einer der Bausteine auch weiterhin mit 10 Sekunden Abstand gepollt!

Diese PCF8574 Instanz hatte ich bei der Instanziierung auf 1 Sekunde gesetzt und dann Testweise auf 10 Sekunden geändert. Anschließend dann auf 0. So wie es noch immer steht wenn ich in die Konfiguration der Instanz wechsele. Trotzdem ist immer noch die 10 sekündige Abfrage aktiv. Das ist der Fehler! Wenn man von einem Wert > 0 auf 0 setzt, schaltest du den letzten gesetzten Zyklus (vielleicht ein Ereignis…) nicht ab.

Bleibt nur die Frage, warum die Poll Abfrage der PCF8574 zu einem Notify des Port Pins führt…!? Vielleicht eine gegenseitige Beeinflussung der Port Pins am Raspi… Oder doch ein Interrupt auslösen des PCF8574 wenn er abgefragt wird… Das wäre aber sicher ein Fehler in dem Baustein, den ich ausschließen würde…

Gruß

Ralf

…wenn Du den Abfrageinterval auf 0 setzt, wird der Timer auch deaktiviert - eben hier noch mal probiert…
Wenn Du im Objektbaum das Ereignis öffnest, dann siehst Du ja unten links ob das Ereignis aktiv ist, außerdem sieht man es an der letzten Ausführungszeit. Bitte schaue da noch mal nach…

Ob es ein Feature oder ein Bug ist das der Interupt ein Signal bei Abfrage gibt, sollte ggf. im Datasheet stehen?

Joachim

Nachtrag: Schau mal hierauf Seite 9

@Wladimir: Offenbar ist es so, dass man die notwendigen manuellen Schritte für die Einrichtung der 1-Wire-Schnittstelle aktuell über raspi-config erledigen kann. Das wäre gut!

Hier mal der relevante Ausschnitt zum Anschluss von einer FHEM-Seite:

Dazu wird im ersten Schritt der 1-Wire Bus (bzw. zum Test nur ein einzelner Sensor) mit dem GPIO-Port des RPi verbunden, und zwar

1-Wire GND an GND vom Pi (Pin 6)
1-Wire Datenleitung an GPIO04 (Pin 7)
1-Wire VDD an +3,3V vom Pi (Pin 1)
Ausserdem ist noch ein Pullup-Widerstand von z.B. 4,7kOhm zwischen Pin1 und Pin7 zu schalten.

Obwohl die nominale Spannung für 1-Wire Devices 5V beträgt, ist hier die verringerte Spannung nötig, weil die GPIO-Ports des RPi nur 3,3, V vertragen und durch höhere Spannungen zerstört werden. Als Alternative kann man den 1-Wire Bus auch 5V (Pin 2) anschließen, dann muss aber zwingend das Signal der 1-Wire Datenleitung durch einen Spannungsteiler (z.B. 10 kOhm und 6.8 kOhm) auf 3,3 V begrenzt werden. Besser man verwendet einen aktiven Pegelwandler der sich mit einem einfachen MOS-FET realisieren lässt

Auf dem Weg würden dann aber wohl nur die DS18B20 funktionieren, das aber ohne einen weiteren Adapter.

Joachim

Hallo Joachim,

habe zum Test einen DS18B20 direkt am PI angeschlossen.
Als vorlage die seite https://www.einplatinencomputer.com/raspberry-pi-1-wire-temperatursensor-ds1820-ansteuern/
Per PuTTY verbunden.
Paar Befehle ausgführt: sudo modprobe wire
sudo modprobe w1-gpio
sudo modprobe w1-therm

Ohne welche Skripte zu installieren, bei ausführen: cat /sys/bus/w1/devices/10-000802f973a0/w1_slave
Antwort
24 00 4b 46 ff ff 0d 10 68 : crc=68 YES
24 00 4b 46 ff ff 0d 10 68 t=17937

Mein IPS läuft auf Windows, habe noch keine funktionierende Lösung gefunden die Daten zu holen:banghead:

Zum Modul. Für mich würde es reichen nur die DS18B20 einlesen, andere sensoren sind nicht in planung.
Ich kenne nicht den Aufwand so ein Modul zu schreiben, ob es lohnt nur für die Sensoren?

@all kennt jemand eine funktionierende Losung?
Daten vom 1-Wire (DS1820) am entferntem PI vom IPS auf Windows holen?

Danke

Hi Wladi,

schau dir mal meine PDF an, ich habe das schon mal auf einem IPS Stammtisch vorgeführt. Läuft bei mir jetzt seit 2 Jahren ohne Probleme.

Gruss
Bernd

Rasp_JSON_1Wire.pdf (354 KB)

Hallo Wladimir,

eine neue Instanz zu erstellen ist nicht so schwer. Jedoch ist hier die Herangehensweise eine gänzliche andere. Da ich das für eine gute Ergänzung halte werde ich mich damit mal inhaltlich beschäftigen. Kann aber bis zur vollständigen Funktion ein paar Tage dauern. Aber ich denke in Dir habe ich ja zumindest einen versierten Tester gefunden!:wink:

Insbesondere bei der Abbildung der n-Sensoren im Objektbaum habe ich noch - im Gedankenmodell - ein paar offene Fragen, ansonsten wird wohl die vom Modul schon vorhandene SSH-Verbindung und einige Dateioperationen genutzt…

Joachim

Hallo Joachim,

Mea Culpa, ich hatte Ursache und Wirkung verwechselt. Der Timer WAR deaktiviert, zeigte nur halt im Objektbaum immer noch den letzten Wert (10 Sek,) an. Davon lies ich mich verwirren… Sorry! Das Toggeln des Portpins löste mein Script aus, das die Werte aktualisiert hat… (Kam also wirklich nicht vom Timer bzw. Ereignis!)

Ok, ich habe dann alle Instanzen des PCF8574 aus dem IPS gelöscht. Aber der zyklische (10 Sek.) Toggle auf dem Input Pin GPIO4 , der trat weiterhin auf. Dann habe ich mir gesagt, nimm doch mal einen anderen Portpin, einen der möglichst weit weg ist von GPIO4 (Immerhin liegt I2C ja auf GPIO2 und 3). Entschieden habe ich mich für den Pin GPIO24 und siehe da es funktioniert. Seitdem herrschte Ruhe. Dann habe ich die PCF8574 Instanzen wieder angelegt, diesmal alle gleich mit Wiederholungszyklus 0 und es funktioniert seither. Nur wenn ich ein Signal an einem der Eingänge der Portexpander anlege wird ein Interrupt erzeugt, der dann wiederum die Notifikation des Portpins auslöst, mein Script aufruft und den Eingangsport ausliest! Perfekt! Fall erledigt!

Vielen, lieben Dank für deine geduldige Unterstützung! Ich bin sicher, das dein Modul erst vielen ermöglichen wird die Möglichkeiten des Raspis ins IPS zu integrieren…

Gruß…

Ralf

@Bernd Danke für die Anleitung.

habe folgenden Code getestet:

<?
$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(39496 /*[Raeume\Badezimmer\1Wire\1]*/);

if ($temperatur <> $alte_temperatur)
   {
   SetValueFloat(39496 /*[Raeume\Badezimmer\1Wire\1]*/, $temperatur);
   $rpc = new JSONRPC ("http://pi:123456@192.168.178.52/api/");
   $rpc->SetValue(39496 /*[Raeume\Badezimmer\1Wire\1]*/, $temperatur);
   } 
?>

wirft Fehler:
Warning: file(/sys/bus/w1/devices/10-000802f973a0/w1_slave): failed to open stream: No such file or directory in C:\IP-Symcon\scripts\13330.ips.php on line 3
Warning: implode(): Invalid arguments passed in C:\IP-Symcon\scripts\13330.ips.php on line 3

Was ist falsch an dem Code oder verstehe ich grundsätzlich was falsch?
Muss auf dem Raspi auch ein IPS-Server laufen? und da dieser Code laufen?
Magst du mich ein bischen erläuchten. Sorry Das Problem sitzt schon wieder mal vor dem PC.:smiley:

@Joachim, Testen mach ich gerne;)

Eine Bitte: das Thema bitte in einem eigenen Thread diskutieren…[emoji6]

Zur Information:

  • 1-Wire: da Bernd und Wladimir diesen Wunsch geäußert haben und auch ich diese Möglichkeit interessant findet bin ich dabei das zu implementieren…

  • Pi-Face digital 2: klingt passend. Ich bitte aber um Verständnis, das es mir zu teuer ist dieses nur zu bestellen um es für Euch zu implementieren. Wenn die Interessenten sich zusammen tun und mir das Teil dauerhaft zu Verfügung stellen (zur Implementierung und später um ggf. Korrekturen einzufügen, Änderungen vorzunehmen bzw. Fehler nachzuvollziehen) könnte da ein Schuh draus werden…

  • I²C-Multiplexer: Spontane Idee mit der Annahme es wird nur ein Multiplexer überhaupt an Bus 1 angeschlossen, dann könnte man das ggf. in den Splitter implementieren. (Ich habe aber immer noch Befürchtungen bzw. der Steuerung der Datenströme…)

Joachim

die I2C Adresse kann nicht durch den Benutzer geändert werden. Bitte setzen Sie einen I2C-Multiplexer ein. Ich verwende dieses (sehr günstige) Breakout Board:

Adafruit TCA9548A I2C Multiplexer - Schnittstellen - Module

Die Ansteuerung ist denkbar einfach, es gibt auch ein Tutorial bei Adafruit:

Overview | Adafruit TCA9548A 1-to-8 I2C Multiplexer Breakout | Adafruit Learning System

Mit freundlichen Grüßen aus Reutlingen

Martin Herold

Kannst du auch die Adressen von 0x70-0x77 zum einstellen hinzufüge dann sollte es doch einfach so mit dem multiplexer funktionieren?

Gesendet von meinem SM-G935F mit Tapatalk

Hallo Martin,

ganz so einfach ist es leider nicht. Der Multiplexer (habe hier auch welche rumliegen) stellt ein eigenes Device dar. Er muss angesteuert werden wie jedes andere Gerät auch.
Vom Prinzip läuft das dann so:

  • Umschaltung auf Kanal 1 des Multiplexers
  • Abfrage oder Senden der Daten von/an den n-Devices auf Kanal 1
  • Umschaltung auf Kanal 2 des Multiplexers
  • Abfrage… usw.

Es ist überhaupt kein Ding, dieses Device als neues Gerät zu implementieren, jedoch ergeben sich unheimlich viele Möglichkeiten daraus, weil jedes Device dahinter eine Art „Vorwahl“ hat. Im Moment sind noch ein paar andere Dinge auf der To-Do-Liste die Vorrang haben. Es fehlt mir ehrlich gesagt im Moment auch die zündende Idee, wie ich das abbilden soll - kommt aber vielleicht noch…:wink:

Joachim

Wenn ich da so mitdenke, würde ich den Multiplexer NICHT als Device implementieren.Das bekommt man nicht sortiert.

Ich würde es so machen: Bei den vorhandenen Devices wie BME280 oder iaq folgendes in der Config ergänzen:

o Gerät befindet sich am Multiplexer (zum Ankreuzen)
__ Multiplexer Adresse __ Multiplexer Kanal

Macht man den Haken an, muss das Device vorab nur die beiden Steuerkommandos an den Multiplexer absenden. Das Ganze dann in einer Semaphore kapseln, damit das auch sequenziell passiert und nicht zufällig ein Device den Multiplexer bedient, während ein anderes noch daraus liest.

…Device im Sinne der Struktur muss es schon deshalb werden, weil es ein Handle benötigt damit es über PIGPIO angesprochen werden kann.

Im Moment verfolge ich - bisher rein gedanklich - folgende Idee. In den I²C-Instanzen gibt es ja die Busauswahl. Wenn Multiplexer als Device angelegt worden sind, erscheinen diese in der Busauswahl (Bus 0, Bus 1, Multiplexer x an Kanal y…)

Wird jetzt das Device angesprochen erfolgt die „Vorwahl“ über die Angabe in diesem Pull-Down-Menü.
Mit den Semaphore wäre eine Möglichkeit, muss aber mal sehen, ob das dann in der Struktur eines PHP-Moduls so funktioniert wie ich mir das vorstelle…

Ansonsten sind aber noch ein paar andere Baustellen die ich gerne vorab abgearbeitet haben möchte:

  • letzte Ergänzungen an der Heizungs-Einzelraumsteuerung (IPS2SingleRoomControl)
  • ein paar Details an meinem Enigma-Modul (IPS2Enigma)
  • das gewünschte 1-Wire-Modul
  • das gewünschte Modul für das Piface

Joachim