iButton an Arduino

Begonnen von Spielmann, 28 Februar 2014, 21:48:43

Vorheriges Thema - Nächstes Thema

Spielmann

Hallo,
ich möchte mit fhem (auf FritzBox 7270) und einem arduino mega + ethernet shield  (Firmata configurable) unsere Diesel Tankstelle schalten. Bis vor kurzem konnte ich per RFID Chip und einem RFID–nach- 1wire-Reader ein Relais am Arduino schalten und im web änderte sich auch jeweils der state present / not present.

alte funktionierende fhem.cfg:
define Reader OWX 7
attr Reader buspower real
attr Reader verbose 0

define Abfrage at +*00:00:01 get Reader devices
attr Abfrage verbose 0

define Chip1 OWID 01.0028001BFDF0 2
attr Chip1 IODev Reader
attr Chip1 event-on-change-reading state
attr Chip1 model DS2401

define FreigabeChip1 notify Chip1 { if (ReadingsVal("Chip1","state","present") eq "present"){ fhem("set Rel_1 on} }

Nach einem update am 22.01.14 wurde das reading von "state" in "present"  bei OWID geändert. Im web ändert sich nur noch der state von ,,present"  in ,,not present". Nur durch Aktualisieren des Browsers wird wieder ,,present" angezeigt.
Das Relais schaltet auch nur noch von ,,present"  nach ,,not present" – d.h. es geht nur noch:
define FreigabeiButton1 notify iButton1 { if (ReadingsVal("iButton1","present","0") eq "0"){ fhem("set Rel_1 on} }
jedoch nicht:
define FreigabeiButton1 notify iButton1 { if (ReadingsVal("iButton1","present","1") eq "1"){ fhem("set Rel_1 on } }

Auch der Austausch des RFID-Readers durch originale iButtons DS1990R (der einen zusätzlichen presence pulse erzeugt) brachte keinen Erfolg.
Kann mir jemand einen Tip geben,  dass der iButton  wieder von  ,,not present"  auf ,,present" reagiert bzw. gibt es eine elegantere Art das Vorhandensein des iButtons abzufragen als jede Sekunde ein "get Reader devices" zu senden?

Gruß
Spielmann
FHEM mit Raspi (Zentrale)
Raspberrymatic (Heizung)
Siemens LOGO8 (Lichtsteuerung)
Philips HUE Gedöns
Diesel-Tankstelle mit fhem und ESP (eine ewige Baustelle)

Prof. Dr. Peter Henning

Ich verstehe das Problem nicht - denn die Abfrage des Status ist dieselbe geblieben. Ich baue gerade ein Schließsystem mit iButtons auf (und zwar mit den "alten" ohne zusätzlichen Presence Puls).

Gerufen wird im Modul in den vordefinierten Abständen die Funktion Verify. Die ist relativ langsam, weil sie sehr ähnlich wie der 1-Wire Suchalgorithmus funktioniert. Mit dem folgenden Code frage ich einmal pro Sekunde den Bus nach vier verschiedenen iButtons ab und schalte den Ausgang eines DS2408 so, dass ein oder zwei Chips einer dreifarbigen LED angesteuert werden. Und zwar so, dass die LED gerade der Farbe des betreffenden iButton-Halters entspricht:


define iBlue OWID 01 6797A2160000 1
attr iBlue IODev OWXNEU
attr iBlue model DS2401
attr iBlue room OWX
attr iBlue stateFormat {ReadingsVal($name,"present",0) ? "present" : "not present"}

define iBlue.present notify iBlue:present.*1 set OWX_29_058E0B000000 gpio 3
attr iBlue.present room OWX
define iBlue.unpresent notify iBlue:present.*0 set OWX_29_058E0B000000 gpio 7
attr iBlue.unpresent room OWX

define iGreen OWID 01 36F3A1160000 1
attr iGreen IODev OWXNEU
attr iGreen model DS2401
attr iGreen room OWX
attr iGreen stateFormat {ReadingsVal($name,"present",0) ? "present" : "not present"}

define iGreen.present notify iGreen:present.*1 set OWX_29_058E0B000000 gpio 5
attr iGreen.present room OWX
define iGreen.unpresent notify iGreen:present.*0 set OWX_29_058E0B000000 gpio 7
attr iGreen.unpresent room OWX

define iRed OWID 01 0FEEA1160000 1
attr iRed IODev OWXNEU
attr iRed model DS2401
attr iRed room OWX
attr iRed stateFormat {ReadingsVal($name,"present",0) ? "present" : "not present"}

define iRed.present notify iRed:present.*1 set OWX_29_058E0B000000 gpio 6
attr iRed.present room OWX
define iRed.unpresent notify iRed:present.*0 set OWX_29_058E0B000000 gpio 7
attr iRed.unpresent room OWX

define iOrange OWID 01 3292A2160000 1
attr iOrange IODev OWXNEU
attr iOrange model DS2401
attr iOrange room OWX
attr iOrange stateFormat {ReadingsVal($name,"present",0) ? "present" : "not present"}

define iOrange.present notify iOrange:present.*1 set OWX_29_058E0B000000 gpio 4
attr iOrange.present room OWX
define iOrange.unpresent notify iOrange:present.*0 set OWX_29_058E0B000000 gpio 7
attr iOrange.unpresent room OWX


LG

pah

Spielmann

Eigentlich hat sich schon etwas geändert.
Ich habe den Status vor dem Update mit ,,ReadingsVal("iButton1","state","present")"  abgefragt.
Jetzt muss ich mit ,,ReadingsVal("iButton1","present","0") eq "0"" abfragen (dies wäre mir auch egal).
Ich schaffe es den  ,,present/not present" Status über ein sekündlich abgesetztes ,,get OWX devices"  zu aktualisieren. 
Auch nach dem Update wird zwar im Logfile das device erkannt/nicht erkannt, jedoch ändert sich der Status im Webinterface nur noch von ,,present" zu ,,not present". Genauso verhält sich das notify – es reagiert nur auf ,,not present" (wie schon im ersten Post beschrieben).

Logfile im Sekundentakt:

2014.03.01 07:11:07 1: OWX: 1-Wire devices found on bus Reader (iButton1)
2014.03.01 07:11:08 1: OWX: 1-Wire devices found on bus Reader (iButton1)
2014.03.01 07:11:09 1: OWX: 1-Wire devices found on bus Reader ()
2014.03.01 07:11:10 1: OWX: 1-Wire devices found on bus Reader ()
2014.03.01 07:11:11 1: OWX: 1-Wire devices found on bus Reader ()
2014.03.01 07:11:12 1: OWX: 1-Wire devices found on bus Reader ()
2014.03.01 07:11:13 1: OWX: 1-Wire devices found on bus Reader ()
2014.03.01 07:11:14 1: OWX: 1-Wire devices found on bus Reader (iButton1)
2014.03.01 07:11:15 1: OWX: 1-Wire devices found on bus Reader (iButton1)
2014.03.01 07:11:16 1: OWX: 1-Wire devices found on bus Reader (iButton1)
2014.03.01 07:11:17 1: OWX: 1-Wire devices found on bus Reader (iButton1)
2014.03.01 07:11:18 1: OWX: 1-Wire devices found on bus Reader (iButton1)
2014.03.01 07:11:19 1: OWX: 1-Wire devices found on bus Reader (iButton1)
2014.03.01 07:11:20 1: OWX: 1-Wire devices found on bus Reader (iButton1)
2014.03.01 07:11:21 1: OWX: 1-Wire devices found on bus Reader ()
2014.03.01 07:11:22 1: OWX: 1-Wire devices found on bus Reader ()



Ich habe jetzt noch mal, wie von pah vorgeschlagen, so den present Status abzufragen. Leider ändert sich nichts. Vielleicht ist dieses Verhalten des OWX nur in Kombination mit der configurable Firmata (über Ethernet).  Die I/O Ports am Arduino funktionieren auch tadellos.
Der Zusammenhang zwischen den sampling Intervallen von ,,FRM sampling Interval", OWX Interval (??) und OWID Intervall ist mir auch nicht so klar. Vielleicht kann mir Jemand auf die Sprünge helfen.
Hier noch ein Auszug meiner fhem.cfg aller relevanten OW Einträge.


define FIRMATA FRM 3030 global
attr FIRMATA sampling-interval 1000

define Reader OWX 7
attr Reader IODev FIRMATA
attr Reader buspower real
attr Reader room Tankstelle

define iButton1 OWID 01 904DD8160000 1
attr iButton1 IODev Reader
attr iButton1 model DS2401
attr iButton1 room Tankstelle
attr iButton1 stateFormat {ReadingsVal($name,"present",0) ? "present" : "not present"}

define iButton1.present notify iButton1:present.*1 set Rel_1 on
attr iButton1.present room Tankstelle
define iButton1.unpresent notify iButton1:present.*0 set Rel_1 off
attr iButton1.unpresent room Tankstelle

define Abfrage at +*00:00:01 get Reader devices
attr Abfrage verbose 0

define Rel_1 FRM_OUT 23
attr Rel_1 activeLow yes
attr Rel_1 alias Tankstelle_Versorgung
attr Rel_1 devStateIcon ein:Restart aus:Shutdown
attr Rel_1 eventMap on:ein off:aus
attr Rel_1 restoreOnReconnect on
attr Rel_1 restoreOnStartup on
attr Rel_1 room Tankstelle
attr Rel_1 stateFormat value


Der Gedanke dass ich einen zentralen FHEM-Server habe und dezentral durch Arduinos  an Haustür, Schaltschrank, Garten... I/Os, Displays, 1-Wire Geräte zur Verfügung habe reizt mich schon sehr.

Gruß
Spielmann
FHEM mit Raspi (Zentrale)
Raspberrymatic (Heizung)
Siemens LOGO8 (Lichtsteuerung)
Philips HUE Gedöns
Diesel-Tankstelle mit fhem und ESP (eine ewige Baustelle)

moorjunge

Hallo,

ich beobachte bei mir das gleiche Verhalten.

Sobald der iButton vom Reader genommen wird bekommt FHEM das mit.
Der Status auf der Seite wird automatisch aktualisiert, es gibt einen Eintrag im Logfile und Aktionen werden ausgeführt.

In die andere Richtung funktioniert dies aber nicht.
Der Status wird erst nach Aktualisierung der Website richtig angezeigt.
Aktionen werden nicht ausgeführt und es gibt auch keinen Eintrag ins Logfile


2014-03-01_22:48:31 iGreen present: 0
2014-03-01_22:48:34 iGreen present: 0
2014-03-01_22:48:42 iGreen present: 0
2014-03-01_22:49:38 iGreen present: 0
2014-03-01_22:50:24 iGreen present: 0
2014-03-02_09:56:06 iGreen present: 0
2014-03-02_09:57:41 iGreen present: 0
2014-03-02_09:57:58 iGreen present: 0
2014-03-02_09:58:17 iGreen present: 0
2014-03-02_09:58:22 iGreen present: 0
2014-03-02_13:26:57 iGreen present: 0



Gruß
Thiemo

UweH

#4
Kurioserweise funktioniert das Script von pah bei mir auch nur in eine Richtung.
Dieses hier in der OWDevice-Version läuft bei mir problemlos. Besteht aus der Definition des iButton, einem Dummy (hier nur zur Visualisierung, kann ein 1-Wire-Aktor sein und was auch immer) und einem Notify.
define iButton OWDevice 01.60D9A6160000 30
attr iButton IODev OW_UG
attr iButton model DS2401
attr iButton room OWX

define dmy_iButton dummy
attr dmy_iButton room OWX
attr dmy_iButton setList on off
attr dmy_iButton webCmd on:off

define ntf_iButton notify iButton:present.* {\
my $wert_1=ReadingsVal("iButton", "present", "NG");;\
my $wert_2=ReadingsVal("dmy_iButton", "state", "NG");;\
if ( $wert_1 eq "1" and $wert_2 ne "on"){\
fhem "set dmy_iButton on"\
}\
elsif ( $wert_1 eq "0" and $wert_2 ne "off") {\
fhem "set dmy_iButton off"\
}\
}

moorjunge

#5
Hallo Uwe,

Deine Variante über OWDevice funktioniert bei mir leider nicht.

Der iButton wird beim einlegen einfach wieder als OWID angelegt.
Das OWDevice reagiert gar nicht.

Ich würde mal vermuten, dass etwas in dem OWID nicht sauber durchgetragen wird oder das ein Push-Befehl fehlt.
Hab mich mit dem Aufbau von Modulen noch nicht beschäftigt, deswegen ist das mehr eine Mutmaßung  das es so läuft ;D

Gruß
Thiemo

UweH

#6
Wenn Du den iButton an ein mit OWX definiertes Interface anschließt, dann wird da auch OWID drauf reagieren. Definierst Du das Interface mit OWServer, dann wird ein OWDevice draus...mal so formuliert  ;)

In der OWX-Variante sieht's so aus:
define iButton OWID 01 15A0B9160000
...

Der Rest ist gleich.

moorjunge

Hallo Uwe.

danke, wieder was gelernt :)

Da ich den Bus gerade über einen Arduino mit Firmata betreibe bleibt leider nur OWX.

Ich werde mich nachher vielleicht mal mehr mit der 21_OWID beschäftigen.

Jetzt muss ich erstmal Kaffee machen.  ;D


Prof. Dr. Peter Henning

#8
@moorjunge: Wer sich mit den Modulen nicht beschäftigt hat, sollte sich Mutmaßungen über fehlerhaften Code vielleicht erst einmal verbeißen. Da gibt es nämlich weder "durchgetragene" Werte, noch "push"-Befehle.

Das OWID-Modul löst einen Event nur aus, wenn sich der Wert von $hash->{PRESENT} geändert hat. Diese Events sollte man mit dem Event Monitor sehen können.
Die Feststellung, ob sich PRESENT geändert hat, erfolgt mit dem relativ langsamen Verify. Das lässt sich auch nicht beschleunigen.

Ich würde gerne wissen, ob der Arduino dieses Verify korrekt ausführt. Also bitte mal mit angelegtem und nicht angelegtem iButton den "get present" Befehl manuell ausführen.

pah

Ach ja: Ich frage derzeit nach 5 verschiedenen iButtons ab, mit einem Intervall von 1 Sekunde. Jeder wird ordentlich erkannt und eine dreifarbige LED entsprechend angesteuert. Hier gibts ein Video von dem Spielzeug: http://youtu.be/iuyXPVNfZdU

moorjunge

Hallo pah,

tut mir leid, ich werde mich das nächste Mal erst mit dem Code beschäftigen!
Hab nun auch gesehen, dass ich dort mit einer völlig falschen Denke heran gegangen bin.

Nun zu Deiner Frage:

iButton angelegt -> get present manuell gesetzt -> Keine Reaktion im Event Monitor
iButton abziehen -> folgendes im Event Monitor "2014-03-02 17:30:45 OWID iGreen present: 0"
iButton abgezogen -> get present manuell gesetzt -> Keine Reaktion im Event Monitor


global verbose steht auf 3

fhem.cfg
define iGreen OWID 01 0074FD160000 1
attr iGreen IODev Reader
attr iGreen event-on-update-reading present
attr iGreen model DS2401
attr iGreen room OWX
attr iGreen stateFormat {ReadingsVal($name,"present",0) ? "present" : "not present"}
attr iGreen verbose 5
define FileLog_iGreen FileLog ./log/iGreen-%Y.log iGreen
attr FileLog_iGreen logtype text
attr FileLog_iGreen room Logs



Prof. Dr. Peter Henning

"get present" setzt nichts, sondern startet die Verify-Routine auf dem 1-Wire Bus.

Die sollte immer "1! liefern, wenn das Device da ist - und "0" sonst. Für das (Teil-)Modul zur Anbindung des Arduino ist ntruchsess veranwortlich, vielleicht kann er helden.

LG

pah

moorjunge

Ok,

iButton angelegt -> get present -> iGreen.present => 1
iButton abziehen -> folgendes im Event Monitor "... OWID iGreen present: 0"
iButton abgezogen -> get present -> iGreen.present => 0

Ich bin gerade aber noch auf folgendes gestoßen:

Wenn ich ein zweites Gerät anlege, mit der gleichen ID des  iButtons, dann funktioniert es zumindest bei einem von beiden.

define iGreen_02 OWID 01 0074FD160000 1
attr iGreen_02 room OWX

define iGreen OWID 01 0074FD160000 1
attr iGreen IODev Reader
attr iGreen model DS2401
attr iGreen room OWX
attr iGreen stateFormat {ReadingsVal($name,"present",0) ? "present" : "not present"}


Sobald ich nun den iButton abziehe reagiert iGreen_02 sofort.
Bei iGreen ist es wie vorher.
Dort sieht man erst nach dem Refresh der Seite die Änderung.

Ich werde mich mal an  ntruchsess wenden und ihn auf den Thread aufmerksam machen.

Danke

Prof. Dr. Peter Henning

Das Anlegen eines zweiten Gerätes mit der gleichen ID macht gar keinen Sinn, kann man sich sparen.

LG

pah

moorjunge

Dessen bin ich mir durchaus bewusst.
Ist auch eher aus einer Unachtsamkeit entstanden.

Aber ich denke, dass das Verhalten welches daraus resultiert eventuell hilfreich sein könnte.
Deswegen wollte ich es zumindest hier mit dokumentiert haben.

LG
Thiemo

Spielmann

Zitat
Dessen bin ich mir durchaus bewusst.
Ist auch eher aus einer Unachtsamkeit entstanden.

Aber ich denke, dass das Verhalten welches daraus resultiert eventuell hilfreich sein könnte.
Deswegen wollte ich es zumindest hier mit dokumentiert haben.

Das mit der "doppelten ID" kann ich nachvollziehen. Ich habe mal zwei iButtons und für jeden zwei dummys angelegt. Nur der alphanumerisch erste Name reagiert nicht. Alle weitern "doppelten ID" Einträge funktionieren.

Vielleicht könnte dies auch noch hilfreich sein.

Gruß
Spielmann

FHEM mit Raspi (Zentrale)
Raspberrymatic (Heizung)
Siemens LOGO8 (Lichtsteuerung)
Philips HUE Gedöns
Diesel-Tankstelle mit fhem und ESP (eine ewige Baustelle)