Firmata Arduino Uno RaspBian FRM_IN

Begonnen von stehajo, 30 März 2013, 11:10:57

Vorheriges Thema - Nächstes Thema

stehajo

Hallo liebe FHEM-Community,

ich prüfe gerade für ein größeres Projekt die Möglichkeit via FRM_IN Schliesskontakte zu monitoren. Ich saß gestern den ganzen Tag dran, ich bekomme nichts, womit ich mit notify reagieren könnte. Da ich erst seit ein paar Wochen mit FHEM teste sind Anfängerfehler nicht auszuschließen. Bitte sagt mir, ob der Fehler im FRM_IN ist oder in meinem Kopf.

Mein Setup: Arduino Uno, Breadboard, 10kOhm PullDown Kondensator, USB-Verbindung zum RaspBian, aktuelle StandardFirmata drauf. An PIN10 des Arduinos ist eine Verbindung zu Ground via PullDown10kOhm, sowie ein switch (Steckbrücke) zu +5V. Wenn ich jetzt die Brücke schließe, sollte der PIN10 high sein, öffne ich die Brücke ist er low. An PIN13 hängt eine LED (ist bereits onboard vorhanden).

fhem.cfg:

include firmatatest.cfg

firmatatest.cfg:

define frmino FRM /dev/ttyACM0@directio
attr frmino sampling-interval 1000

define LED13 FRM_OUT 13

define PIN10 FRM_IN 10
attr PIN10 IODev frmino

define pinled notify PIN.* set LED13 blink 5 1


Alles ist super, laut tail -f fhem*.log wird alles erkannt. Wenn ich mich per telnet aufschalte funktionieren set LED13 on oder set LED13 blink 5 1 hervorragend.

Merkwürdig ist, dass ich beim FRM_IN zwar in der Weboberfläche von FHEM sehe, dass er geschlossen ist (STATE ist auf on/off, je nachdem wie die Brücke PIN10 geschlossen ist), aber ich bekomme kein event, auf dass ich per notify reagieren könnte.
Sobald ich die LED13 blinken lasse, sehe ich im Eventmonitor (und via telnet inform timer),

2013-03-29 22:29:06 FRM_OUT LED13 value: on
2013-03-29 22:29:08 FRM_OUT LED13 value: off
2013-03-29 22:29:37 FRM_OUT LED13 value: on
2013-03-29 22:29:45 FRM_OUT LED13 value: off
.
Soweit so gut. Aber ich sehe kein Event, wenn ich PIN10 schalte? Die Details über PIN10 verraten, dass er im state "initialized" ist und die readings den Status durch "on" und "off" angeben. Durch "attr stateFormat reading" wird das STATE in der Weboberfläche wohl durch das reading gesteuert (Vermutung von mir). Aber warum sehe ich kein Event, wenn das reading wechselt, die Weboberfläche bekommt das ja auch mit. Auch spannend: "get PIN10 state" gibt nichts zurück, "get PIN10 reading" jedoch schon.
Updatefhem habe ich via telnet gemacht.

Sorry, ich saß da gestern Stunden dran, sehe nicht wirklich weiter. Ich will vermeiden, dass einfach meine Installation oder das Modul kaputt ist und ich mich tot suche.

xmllist, Abteilung FRM_IN:



<FRM_IN_LIST>
<FRM_IN name="PIN10" state="on" sets="alarm" attrs="room group comment alias eventMap userReadings IODev count-mode count-threshold loglevel:0,1,2,3,4,5 event-on-change-reading event-on-update-reading event-min-interval stateFormat devStateIcon icon sortby webCmd">
<INT key="CFGFN" value="firmatates.cfg"/>
<INT key="DEF" value="10"/>
<INT key="NAME" value="PIN10"/>
<INT key="NR" value="256"/>
<INT key="PIN" value="10"/>
<INT key="STATE" value="on"/>
<INT key="TYPE" value="FRM_IN"/>
<INT key="IODev" value="frmino"/>
<ATTR key="IODev" value="frmino"/>
<ATTR key="stateFormat" value="reading"/>
<STATE key="alarm" value="on" measured="2013-03-29 23:37:40"/>
<STATE key="count" value="0" measured="2013-03-29 23:37:40"/>
<STATE key="reading" value="on" measured="2013-03-29 23:37:40"/>
<STATE key="state" value="Initialized" measured="2013-03-29 23:35:35"/>
</FRM_IN>
</FRM_IN_LIST>


Hoffe, der Fehler ist nicht nur meine Doofheit und trotzdem leicht zu beheben :-)

Euch noch ein frohes Osterfest und Dankeschön im Voraus!

Stephan

ntruchsess

Danke für das Feedback. Hab den Fehler grade gefunden:

In der Funktion FRM_IN_observer hatte ich im readingsEndUpdate(...) eine 0 statt einer 1 übergeben (das schaltet das Generieren von Evens ab...).

Den Fix habe ich grade ins svn committed. Jetzt kommen die events im Eventmonitor und notifies sollten wie gewohnt gehen.

Gruß,

Norbert
while (!asleep()) {sheep++};

stehajo

Hi Norbert!

Vielen Dank für die schnelle Hilfe, habe es eben getestet. Funktioniert wie es soll.

Damit wird arduino/firmata zu einer echten wired-Alternative zu vielen KNX-Bauteilen.

Lieber Gruss

Stephan

ntruchsess

prima. Ich hab den gleichen Patch grade noch für FRM_AD und FRM_I2C nachgezogen.
Die beiden Module habe ich mal mit einem Default-wert von 5 Sekunden für das event-min-interval versehen, um zu verhindern, dass man FHEM durch zu hohe event-rate versehentlich völlig lahm legt. Den Wert sollte man aber natürlich so anpassen, wie man es tatsächlich braucht, da sowohl AD als auch I2C sonst im takt des 'sampling-interval' events feuern. Das 'sampling-interval' ist ein Attribut des FRM-basis-moduls und wird von allen 'FRM_XXX'-modulen gemeinsam genutzt.
Natürlich sollte das event-min-interval nicht kürzer als das sampling-interval sein (dabei bitte berücksichtigen, dass das sampling-interval in Millisekunden und das event-min-interval in sekunden angegeben wird).
Mit dem event-min-interval ist man auch nicht wie beim sampling-intervals auf Werte kleiner 16384ms beschränkt.
Beim FRM_IN habe ich keinen Vorgabe-wert für event-min-interval gesetzt, da FRM_IN sich nur meldet, wenn sich der Status am I/O-pin tatsächlich ändert (das passiert dann nahezu verzögerungsfrei, je nachdem, was sonst parallel noch über das gleiche FRM-modul läuft).

Gruß,

Norbert
while (!asleep()) {sheep++};

hfecht

Hallo Zusammen,
leider sehe ich den Wald vor lauter Bäumen nicht. Kannst Du mir evtl. weiterhelfen, wie ich den notify Befehl dazu überreden kann, auf Basis der Digital Pin Eingänge zu reagieren?

Geht das nicht wie folgt:

Define PIN_Test notify Taster2:on set LED13 on?

Die FHEM.CFG sieht dafür so aus - LED13 lässt sich auch schalten - Taster2 meldet die Statusänderung, wenn ich ihn drücke + die Website aktualiere.

define Taster2 FRM_IN 2
attr Taster2 room Arduino_test
attr Taster2 stateFormat reading
define LED13 FRM_OUT 13
attr LED13 room Arduino_test
attr LED13 stateFormat value

Vielen Lieben Dank im Voraus
Holger

stehajo

Hallo Holger,

aus meiner Sicht (und ohne, dass ich jetzt einen Arduino vor mir hätte) könnte das notify zu eng gefasst sein. Probier einmal testweise

define PIN_Test notify Taster2.*on set LED13 on

anstelle von

Define PIN_Test notify Taster2:on set LED13 on

Durch die Wildcard " .* " reagierst Du dann auf alles, was mit Taster2 beginnt und mit on endet, und "define" sollte klein geschrieben sein.
Ob überhaupt ein Event generiert wird, auf das Du reagieren kannst, siehst Du wenn Du Dich per telnet auf den fhem aufschaltest und den Befehl inform timer absetzt.
Dann ein paar mal Pin2 öffnen und schliessen und schauen ob Du ein Event siehst. Die Eventmonitorseite auf FHEMWEB sollte auch funktionieren, nutze ich nur nie.

Wenn Du ein Event hast, dann liegt es an der Definition des Notify, wenn nicht, so ist Dein Notify unschuldig.
Im Eventmonitor / telnet solltest Du auch sehen welches Event genau ausgelöst wird und kannst Dein Notify entsprechend konkretisieren.

Bekommst Du kein Event, so prüfe die Verkabelung am Arduino, auch eine Möglichkeit ist es testweise ein Arduino-Sketch (z.B: http://arduino.cc/en/tutorial/button ) anstatt der Firmata heraufzuladen und die Schaltung zunächst ohne FHEM zu überprüfen. Ausserdem solltest Du auf die neueste Version des FHEM upgedatet haben, da FRM_IN noch keine Events sendete als ich diesen Thread gestartet habe.

Viel Erfolg!

Stephan