Modul zur Nutzung der Raspberry Pi GPIO

hi Joachim,
ich muss ehrlich sein ich bin absoluter Neueinsteiger in symcon. Bis jetzt habe ich auch alles nach meinem Geschmack sehr gut hinbekommen, nur leider am Rollo scheitert es :frowning:

hier mal ein Bild wie ich es versucht habe.

währe echt cool wann du oder ihr mir helfen könntet:D

Hallo next,

gesucht wird ja offensichtlich eine „Instanz“ - auswählen möchtest Du aber wohl eine „Variable“. Ich kenne das Shutter-Control leider nicht, von daher mal mein Gedankenansatz.

Das im Link aufgeführte Skript müsste wohl um die Möglichkeit der Nutzung des PCF8574 erweitert werden. Dazu muss man wohl lediglich wissen, welcher Ausgang, welche Steuerung (Up, Down, Stop) ausführt.

Joachim

Hallo Joachim,

da ich meine Schaltung soweit fertig habe, die an die PCF 8574 angeschlossen wird, wollte ich noch einmal vorsichtig anfragen ob du noch die Sache mit dem LOW bzw. HIGH Aktiv einbauen könntest. Ich hatte gestern Abend noch einmal quer über deinen Code gelesen, aber die notwendigen Stellen einfach nicht finden können. Gerne hätte ich es selber erweitert…

Wie schon gesagt, so wie es jetzt ist, wird bei jedem Neustart eine Schaltung ausgelöst,weil der PCF8574 beim Start alle Pins auf HIGH setzt und deine Software, alle Pins die laut IPS auf AUS stehen dann sofort auf LOW setzt. Die einfachste Lösung wäre, wenn du generell alle Pins, nicht nur die Eingänge generell als LOW Aktiv betreibst, sie also nach dem Start erstmal gleich, bei AUS auf HIGH setzt. Natürlich könnte man das noch weiter verbessern und einen Konfigurationsschalter einbauen der zwischen HIGH und LOW Aktiv der Ausgänge umschaltet…

Übrigens geht es auch bei mir, ähnlich wie bei next um Rolläden…

Vielen Dank für deine Bemühungen…

…einen schönen Tag noch…

Ralf

Hallo Leute,

@Ralf: Du hast Dir viel Mühe gegeben, es mir zu erklären - bin aber immer noch nicht sicher wie es zum Start sein soll:
Eingänge: HIGH/LOW???
Ausgänge:HIGH/LOW???
Wenn ich es verstanden habe bin ich gerne bereit das umzusetzen - und Du hilfst dafür next bei den noch notwenigen Skripten für das Shutter Modul!:smiley:

@Bernd: Ich habe den BH1750 entsprechend erweitert. Du solltest jetzt sowohl die Auflösung als auch die Sensibilität einstellen können. ABER: Bisher noch nicht selbst getestet, könnten also sowohl Syntax-Fehler als auch Fehler in der Berechnung sein!

  • Wenn Du das Input-Modul verwendest, dann solltest Du auf jedem Fall mit einer RC-Kombination und der Glitch -Funktion arbeiten, besser ist das…
  • Der Entfernungssensor bekommt einen Timestamp bei Triggern als auch beim Ergebnis von PIGPIO, mit diesen wird dann die Distanz errechnet. Da dieses Verfahren wohl programmtechnisch nicht weiter zu verbessern ist, muss man mit den Schwankungen wohl leben.

Joachim

Hallo Joachim,

habe gerade etwas mit dem BH1750 getestet. Es scheint noch nicht ganz zu passen. Folgende Werte habe ich bei HR2 bekommen:

Sensitivity Lux
31 215
69 98
130 53
254 27

Das Umschalten der Modi LR, HR und HR2 (Senitivity default 69) ergab folgendes:

Mode LUX
LR 240
HR 200
HR2 97

Bei HR2 bekam ich als kleinsten Wert bisher 0,47 Lux, damit scheint die Umschaltung geklappt zu haben. Kleinere Werte habe ich bisher aber nicht gesehen.

Ich lass den Sensor jetzt mal alle 10 Sekunden in HR2 und Sensitivity in die Dämmerung laufen und beobachte, was passiert.

Gruss
Bernd

…dann scheint das Setzen der Sensibilität ja schon zu funktionieren, sehe aber gerade, dass für den HR-2 ein verändertes Berechnungsverfahren für den Rückgabewert gilt!

Das muss ich mir noch mal anschauen…

Joachim

Nachtrag: Wer es beschleunigen mag…
Bei LR und HR wird das Ergebnis (im Moment) so berechnet:

$Lux = (($data->Value & 0xff00)>>8) | (($data->Value & 0x00ff)<<8);
(nach Datenblatt müsste es jedoch noch mal durch 1.2 geteilt werden)

Bei HR2 findet eine Bitverschiebung im Ergebnis statt (siehe Datasheet Seite 12)
Wie bekommt man das am Besten hin? Hier auch die Hinweise auf Seite 12 beachten die ich so umgesetzt habe:
$Lux = max(0, $Lux / 1.2 * (69 / $this->ReadPropertyInteger(„Sensitivity“)) ); für HR
$Lux = max(0, $Lux / 1.2 * (69 / $this->ReadPropertyInteger(„Sensitivity“)) / 2 ); für HR 2

Hallo Joachim,

da habe ich wohl zu verwirrend gebrabbelt… :slight_smile:

Ok also noch mal.
Bei den Eingänge so wie du es jetzt schon realisiert hast, muss der Pin des PCF8574 auf HIGH gesetzt werden. Anschliessend ist dann, so wie es auch schon einwandfrei funktioniert, ein HIGH am Eingang, ein ‚EIN‘ in IPS und umgekehrt.

Bei den Ausgängen, wäre es am sinnvollsten Sie auch beim Start auf HIGH zu setzen, genau wie bei den Eingängen. Was im IPS dann ABER ‚AUS‘ bedeuten muss! Die Pins müssen invertiert angesteuert werden. IPS ‚EIN‘ bedeutet eine 0 an den Pin zu senden und IPS ‚AUS‘ bedeutet ein 1 an den Pin zu senden. Daher auch beim einschalten oder reconnect eine 1 (IPS AUS) an den Chip senden.
(Und falls IPS auf ‚EIN‘ steht beim reconnect oder neustart, dass zuvor noch auf ‚AUS‘ setzen! Nicht das irgendwelche Motoren einfach loslaufen!!!)

Das zurückinvertieren ist dann später ziemlich easy. Da reicht bei einem Umschalter Relais ja schon der andere Kontakt…
Aber und das ist der riesen Vorteil, es kommt nicht zu einer Schaltaktion beim Start, denn der Chip gibt nach Stromanschluss sofort ein HIGH aus und wenn du von IPS drauf zugreifen kannst, folgt noch ein HIGH.
Also alles auf der sicheren Seite…

Das mit der Konfiguration hatte ich nur angemerkt, falls jemand da ganz andere Wünsche hat… und nicht das LOW Aktiv so wie hier beschrieben gebrauchen kann. Was ich mir aber nicht vorstellen kann…

…ich hoffe ich konnte mich nun verständlich machen…, wenn nicht dann einfach noch ein mal melden…

… ach und das mit den Scripten für next, ich bin auch noch blutiger Änfänger mit IPS… Aber das wird schon…:-):smiley:

Ralf

Hallo Bernd,

magst Du bitte noch mal testen?

Joachim

Hallo Joachim,

ich habe das Update geladen. Nun kommen folgende Werte bei sehr dunkler Umgebung:

LR = 3,33 lx
HR = 3,33 lx
HR2 = 1,67 lx

Gruss
Bernd

…klingt irgendwie nach der Hälfte?!?:confused:

Da muss ich noch mal schauen…

Joachim

…bin nach demDatasheet Seite 12 vorgegangen…

Drehen von High- und Low-Byte:

$Lux = (($data->Value & 0xff00)>>8) | (($data->Value & 0x00ff)<<8);

Den 2^-1 hinzurechnen und um ein Bit verschieben:

$Lux = (($Lux & 1) * 0.5) + ($Lux >> 1);

Das entspricht eben auch der Division durch 2. Vielleicht wird der HR-2-Mode nicht akzeptiert?:confused:

Bin verwirrt…

Joachim

Hallo Bernd,

ich habe noch Änderungen am Modul vorgenommen. Jetzt sind bei mir - zumindest in der kurzen Testphase - die Messwerte von der Größenordnung in den verschiedenen Modi nahe beieinander.

Bitte noch mal testen…

Joachim

Hallo Joachim,

ich denke weiterer Aufwand lohnt sich nicht. HT2 bedeutet ja nur, dass wir von 1 auf 0,5 lx runter kommen. Um die 0,11 lx zu erreichen, muessten ja noch zusätzliche Anpassungen gemacht werden.

Für die Erfassung kleiner Lichtstärken gibt es aus meiner Sicht bessere Alternativen. Dafür braucht man aber einen hochauflösenden ADC. Mit dem PCF8591 und seinen 8 bit wird es nicht gehen. Bin gerade schon am suchen. Der ADS1115 mit 16 bit (Kosten < 5€) wäre da schon was. Beim MCP3424 mit seinen max. 18 bit bekommt man als Ingenieur leuchtende Augen (Kosten ~ 13 €). Beide sind über I2C anzusteuern. Mit den beiden könnte man auch viele andere analoge Sensoren sehr elegant über den Paspberry PI an IP Symcon anbinden.

Was meinst du dazu.

Gruss
Bernd

Ok, ich teste nochmal

Noch ein Vorschlag, lass uns über das Forum PN die Email Adressen austauschen. Wir blähen sonst den Thread unnötig auf, OK ?

Gruss
Bernd

…alles um auf die 0.11 lx zu kommen sollte eingerichtet sein:

  • Messauflösung HR2
  • Sensivität auf 254

…sind die Messwerte bei Dir immer noch so unterschiedlich?

Mit Tischlampe getestet lag der Messwert in jeder Auflösung bei 450 lx, jetzt das Nextion Display mal raufgelegt um und bei 13 lx…

Grundsätzlich bleibt selbstverständlich die Fragestellung, wozu ein so genauer Messwert erforderlich sein sollte.
Vielleicht handelt es sich bei der geringen Lichtstärke einfach um einen großen Messfehler?

Joachim

Ich habe nochmal mit minimalen Lichtstärken getestet:

LR = 0 lx -> OK tiefer als 4 lx kann der Mode nicht
HR = 1,67 lx
HR2 = 1,67 lx

hier scheint alles zu passen

LR = 0 lx -> OK tiefer als 4 lx kann der Mode nicht
HR = 0,83 lx -> unter 1 lx
HR2 = 0,47 lx

Kleinere Werte als 0,47 (quasi 0,5) habe ich nicht hin bekommen. Also weit von den 0,11 lx weg.

Ich habe im vorherigen Post ja schon einen anderen Weg mit hochauflösenden ADCs (z.B. ADS1115 oder MCP3424) vorgeschlagen, was meinst du dazu.

Gruss
Bernd

Hi,
das Modul sieht super aus, damit könnte ich meine Steuerungslogik vom Raspberry auf IPS umlagern. Frage dazu: Der Raspberry und das IPS System stehen an verschiedenen Standorten, also nich in einem Netzwerk. Kann der Raspberry an das IPS auch über das Internet, also eine Portfreigabe (myfritz) angebunden werden?

Gruß

Moin,

wir verwenden gerne das Breakout von Watterott mit dem TSL45315 , als Lichtsensor

Guten Morgen!

@Bernd: Mathematisch kann es nicht anders sein. Die Auflösung ist - wenn Du im oben verlinkten Datasheet schaust - im letzten Bit 2 hoch -1 = 0,5 lx. Das mal der ebenfalls im Datenblatt angezeigten Division durch1,2 ergibt eben nur zwei Nachkommavarianten (entweder ist das letzte Bit 0 oder 1) im angezeigten Wert. Was mit den 0.11 lx wohl eher gemeint ist, dass der Sensor in der höchsten Sensibilität dieses unterscheiden kann und dann dem letzten Bit eben eine 0 oder 1 gibt.
Nach der Seite 11 des Datenblattes kann man noch die lx/Count ausrechnen. Wobei ich den Mehrwert davon, als auch überhaupt von dem Ansinnen die Nachkommastellen bei einem Wert der eben „normal“ in ganz anderen Potenzen sich befindet immer noch nicht ganz nachvollziehen kann.

@Luca: Dein IPS und der entfernten Raspberry Pi müssen selbstverständlich im selben Netzwerk sein. Das funktioniert aber auch wenn zu dem entfernten Raspberry Pi eine Verbindung via DynDNS hergestellt wird. Als ich den iAQ eingerichtet und gestestet habe, waren zwischen meinem Test-IPS und dem iAQ auch ein paar hundert Kilometer.

Joachim

…so, Ralf, jetzt zu Dir…:wink:

Im Moment ist es so beim „Setup“:

$Bitmask = 0;
		for ($i = 0; $i <= 7; $i++) {
			If ($this->ReadPropertyBoolean("P".$i) == true) {
				// wenn true dann Eingang, dann disable		
 				$Bitmask = $Bitmask + pow(2, $i);
 			}		
		}
		If ($Bitmask > 0) {
			$this->SetOutput($Bitmask);
		}

Das sollte folgendes bezwecken: Alle Eingänge werden auf 1 gesetzt, alle Ausgänge auf 0.

Mögliche Alternativen:

  1. $this->SetOutput(255); -> Setzt alles auf 1
  2. $this->SetOutput(0); -> Setzt alles auf 0
  3. $this->SetOutput(~$Bitmask); -> Setzt alle Eingänge auf 0, alle Ausgänge auf 1.

Deinem Beitrag habe ich es so verstanden, wie jetzt sein sollte (habe es nicht selbst ausprobiert)

Wir können es auch mal Testweise ändern und Du schaust ob das von Dir gewünschte Verhalten eintritt?
Wenn Du Dir unsicher bist, könnte man dieses ggf. auch als „Startoption“ im Konfigurationsformular auswählen lassen…

Joachim

Nachtrag: Ich habe mal die vier verschiedenen Varianten ins Modul integriert (selbst noch nicht getestet!). Bitte mal probieren bzw. mitteilen, ob ich noch eine Variante vergessen habe…