Konfiguration von fhem zur anbindung Arduino Ethernet

Begonnen von znbrain, 10 Oktober 2013, 22:22:47

Vorheriges Thema - Nächstes Thema

znbrain

Hallo zusammen,

ich habe einen Arduino Ethernet welcher mir per http Get Abfrage die Temperaturwerte der angeschlossenen Sensoren (1-Wire) entweder einzeln oder zusammengefasst ausgibt.

Ich möchte fhem dazu nutzen diese Werte zyklisch abzufragen, mitzuloggen und grafisch auszugeben.

Ich bekomme aber die konfiguration nicht hin. Die meisten Beispiele benutzen den Arduino direkt per USB/seriell.
Unten habe ich mal meine Versuche angehangen, waren alle nicht erfolgreich und sind sicherlich voll von Anfängerfehlern.
Wer kann mir helfen eine minimalkonfig für das mitloggen und darstellen der Werte zu erstellen?




-- Versuch 1 --
define Temperatur dummy
attr Temperatur room Arduino
define TemperaturLog FileLog ./log/TemperaturLog-%Y%M.log Temperatur
define TemperaturAt at +*00:05:00 {my $val = GetHttpFile('192.168.1.222:80', '/?cmd=readTemp_1')}
attr TemperaturAt room Arduino

-- Versuch 2--
define arduinogetsensorvalues at +*00:05:00 {\ my $val = GetHttpFile('192.168.1.222:80', '/?cmd=readTemp_');;\ fhem("trigger arduinogetsensorvalues $val");;\ }
 attr arduinogetsensorvalues room Arduino
 define FileLog_arduinogetsensorvalues FileLog ./log/arduinogetsensorvalues-%Y.log arduinogetsensorvalues:.*
 attr FileLog_arduinogetsensorvalues room Arduino
 define weblink_getsensorvalues weblink fileplot FileLog_arduinogetsensorvalues:arduino:CURRENT attr weblink_getsensorvalues label "Arduino Sensorvalues Min $data{min1}, Max $data{max1}, Last $data{currval1}"
 attr weblink_getsensorvalues room Arduino
 
-- Versuch 3 --
#define arduinogetsensorvalues at +*00:05:00 {my $val = GetHttpFile('192.168.1.222:80', '/?cmd=readTemp_');;fhem("trigger arduinogetsensorvalues $val");;}
#attr arduinogetsensorvalues room Arduino
#define FileLog_arduinogetsensorvalues FileLog ./log/arduinogetsensorvalues-%Y.log arduinogetsensorvalues:.*
#attr FileLog_arduinogetsensorvalues room Arduino
#define weblink_getsensorvalues SVG FileLog_arduinogetsensorvalues:arduino:CURRENT attr weblink_getsensorvalues label "Arduino Sensorvalues Min $data{min1}, Max $data{max1}, Last $data{currval1}"
#attr weblink_getsensorvalues room Arduino
#define SVG_FileLog_arduinogetsensorvalues_1 SVG FileLog_arduinogetsensorvalues:SVG_FileLog_arduinogetsensorvalues_1:CURRENT




ntruchsess

Du könntest es mit Firmata über Ethernet versuchen: https://github.com/ntruchsess/arduino/tree/configurable_ethernet/examples/ConfigurableEthernetclient. Damit kannst Du dann OWX zum Loggen der Temperaturwerde der DS18B20 verwenden. Konnte ich bisher nur mit Uno+Ethernetshield testen, sollte aber auf dem EthernetArduino nach meinem Verständnis auch laufen. Nachdem mein aktuelles Projekt jetzt läuft (https://github.com/ntruchsess/arduino_uip) habe ich mich grade wieder daran gemacht, die ConfigurableEthernetClient-Firmata endlich mal stabil zu kriegen - bisher hat der Sketch noch Problem mit dem Wiederverbinden, wenn die Verbindung mal abbricht, dazu hat WZut einen Workaround gebastelt (http://forum.fhem.de/index.php/topic,10744.msg70099.html#msg70099) der wohl auch zufriedenstellend funktioniert.

Das nur so als Anregung, wenn Du fertige Module verwenden willst. Ansonsten spricht natürlich nichts gegen Deine Lösung den Arduino als WebServer zu verwenden und die Werte per get-request abzufragen. Das ist dann halt speziell dafür programmiert (was ja nicht schlecht ist, wenn es richtig gemacht ist, wird das stabil funktionieren) - die Firmata-lösung versucht halt ein bischen die eierlegende Wollmilchsau zu sein.

Gruß,

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

znbrain

Hallo Norbert,

vielen Dank für deine Hilfe, das hat mich wirklich viel weiter gebracht.
Ich habe jetzt deinen Firmata-Scetch laufen -> funktioniert problemlos.
Die Standard OW*- Module habe ich zuerst verwendet, damit wurden zwar teilweise die Sensoren erkannt aber eine Temperaturauslesung war nicht bis kaum möglich. Die OW*-Module aus dem Thread "OWX asynchron überarbeitet" habe ich als nächstes probiert -> damit lief es schon besser.
Es stellte sich nur ein Problem heraus:
Wird eine fertige config mit allen Einstellungen(FRM,OWX,OWTHERM,FileLog,Fileplot,...) geladen dann funktioniert es nicht. Die Devices sind zwar alle da aber eine Auslesung der Temperaturen findet nicht statt. Gibt mann alle Definitionen schön gemütlich über die Befehlszeile des Frontends ein dann funktioniert es. Kann mann in der Config Pausen für die Abarbeitung definieren ?

Nun habe ich den FHEM-Server auf meinen gefritzten Speedport verbannt (vorher lief er unter Windows). Auch dort ist das Problem mit der Config vorhanden und mann kann den Server eigentlich nicht ohne größeren Aufwand neu starten. Was allerdings viel besser ist ist die Zuverlässigkeit der Temperaturmessungen. Unter Windows hatte ich zeitweise enorme Lücken im Log, das scheint auf der Tritzbox wesentlich besser zu funktionieren.

Kann mann das Intervall für die OWTHERM Devices schon bei der Config mitgeben? Ich habe Messstellen die ich minütlich abfragen möchte.
Wozu dient die Einstellung "Interval" beim OWX-Device?

Hier noch meine Config:

attr global autoload_undefined_devices 1
attr global logfile ./log/fhem-%Y-%m.log
attr global modpath .
attr global motd SecurityCheck:\
\
WEB,WEBphone,WEBtablet has no basicAuth attribute.\
telnetPort has no password/globalpassword attribute.\
\
Restart fhem for a new check if the problem is fixed,\
or set the global attribute motd to none to supress this message.\

attr global nofork 1
attr global statefile ./log/fhem.save
attr global updateInBackground 1
attr global userattr devStateIcon devStateStyle icon sortby webCmd
attr global verbose 3

define telnetPort telnet 7072 global

define WEB FHEMWEB 8083 global

define WEBphone FHEMWEB 8084 global
attr WEBphone stylesheetPrefix smallscreen

define WEBtablet FHEMWEB 8085 global
attr WEBtablet stylesheetPrefix touchpad

# Fake FileLog entry, to access the fhem log from FHEMWEB
define Logfile FileLog ./log/fhem-%Y-%m.log fakelog

define autocreate autocreate
attr autocreate filelog ./log/%NAME-%Y.log

define eventTypes eventTypes ./log/eventTypes.txt

# Disable this to avoid looking for new USB devices on startup
#define initialUsbCheck notify global:INITIALIZED usb create
define FRM FRM 3030 global
define OWio OWX 2
define OWX_28_CEA5EB030000 OWTHERM DS18B20 CEA5EB030000
attr OWX_28_CEA5EB030000 IODev OWio
attr OWX_28_CEA5EB030000 alias Vorlauf Kollektor
attr OWX_28_CEA5EB030000 model DS1822
attr OWX_28_CEA5EB030000 room OWX
attr OWX_28_CEA5EB030000 tempHigh 75
attr OWX_28_CEA5EB030000 tempLow 70
define OWX_28_7EF9F8030000 OWTHERM DS18B20 7EF9F8030000
attr OWX_28_7EF9F8030000 IODev OWio
attr OWX_28_7EF9F8030000 alias Vorlauf
attr OWX_28_7EF9F8030000 model DS1822
attr OWX_28_7EF9F8030000 room OWX
attr OWX_28_7EF9F8030000 tempHigh 75
attr OWX_28_7EF9F8030000 tempLow 70
define OWX_28_A103F9030000 OWTHERM DS18B20 A103F9030000
attr OWX_28_A103F9030000 IODev OWio
attr OWX_28_A103F9030000 alias Rücklauf
attr OWX_28_A103F9030000 model DS1822
attr OWX_28_A103F9030000 room OWX
attr OWX_28_A103F9030000 tempHigh 75
attr OWX_28_A103F9030000 tempLow 70
define OWX_28_5936EA030000 OWTHERM DS18B20 5936EA030000
attr OWX_28_5936EA030000 IODev OWio
attr OWX_28_5936EA030000 alias Speicher Oben
attr OWX_28_5936EA030000 model DS1822
attr OWX_28_5936EA030000 room OWX
attr OWX_28_5936EA030000 tempHigh 75
attr OWX_28_5936EA030000 tempLow 70
define OWX_28_03ABEB030000 OWTHERM DS18B20 03ABEB030000
attr OWX_28_03ABEB030000 IODev OWio
attr OWX_28_03ABEB030000 alias Speicher Mitte
attr OWX_28_03ABEB030000 model DS1822
attr OWX_28_03ABEB030000 room OWX
attr OWX_28_03ABEB030000 tempHigh 75
attr OWX_28_03ABEB030000 tempLow 70
define OWX_28_2301EA030000 OWTHERM DS18B20 2301EA030000
attr OWX_28_2301EA030000 IODev OWio
attr OWX_28_2301EA030000 alias HW-Raum
attr OWX_28_2301EA030000 model DS1822
attr OWX_28_2301EA030000 room OWX
attr OWX_28_2301EA030000 tempHigh 75
attr OWX_28_2301EA030000 tempLow 70
define TempLog_CEA5EB030000 FileLog ./log/Temp_CEA5EB030000-%Y.log OWX_28_CEA5EB030000:temperature:.*
define TempLog_7EF9F8030000 FileLog ./log/Temp_7EF9F8030000-%Y.log OWX_28_7EF9F8030000:temperature:.*
define TempLog_A103F9030000 FileLog ./log/Temp_A103F9030000-%Y.log OWX_28_A103F9030000:temperature:.*
define TempLog_5936EA030000 FileLog ./log/Temp_5936EA030000-%Y.log OWX_28_5936EA030000:temperature:.*
define TempLog_03ABEB030000 FileLog ./log/Temp_03ABEB030000-%Y.log OWX_28_03ABEB030000:temperature:.*
define TempLog_2301EA030000 FileLog ./log/Temp_2301EA030000-%Y.log OWX_28_2301EA030000:temperature:.*
define TempLog_512CF9030000 FileLog ./log/Temp_512CF9030000-%Y.log OWX_28_512CF9030000:temperature:.*
define SVG_TempLog_2301EA030000_1 SVG TempLog_2301EA030000:SVG_TempLog_2301EA030000_1:CURRENT
define SVG_TempLog_7EF9F8030000_1 SVG TempLog_7EF9F8030000:SVG_TempLog_7EF9F8030000_1:CURRENT
attr SVG_TempLog_7EF9F8030000_1 room OWX
define SVG_TempLog_A103F9030000_1 SVG TempLog_A103F9030000:SVG_TempLog_A103F9030000_1:CURRENT
attr SVG_TempLog_A103F9030000_1 room OWX
define SVG_TempLog_03ABEB030000_1 SVG TempLog_03ABEB030000:SVG_TempLog_03ABEB030000_1:CURRENT
attr SVG_TempLog_03ABEB030000_1 room OWX
define SVG_TempLog_5936EA030000_1 SVG TempLog_5936EA030000:SVG_TempLog_5936EA030000_1:CURRENT
attr SVG_TempLog_5936EA030000_1 room OWX
define SVG_TempLog_CEA5EB030000_1 SVG TempLog_CEA5EB030000:SVG_TempLog_CEA5EB030000_1:CURRENT


Viele Grüße
Nico

ntruchsess

das Problem ist mir schon bekannt, es liegt am OWX, das nicht damit umgehen kann, wenn das zugehörige IODevice noch nicht aktiv ist.
WZut hat hier einen Workaround gepostet um das OWX erst zu definieren, wenn sich der Arduino gemeldet hat:
http://forum.fhem.de/index.php?topic=10744.msg87729.msg#87729

ist im asynchronen OWX leider noch nicht saubere, aber das will ich in der näheren Zukunft eh angehen.

Gruß,

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

betateilchen

blöde Frage...

define TemperaturAt at +*00:05:00 {my $val = GetHttpFile('192.168.1.222:80', '/?cmd=readTemp_1')}

damit liest Du die Temperatur in eine Variable namens $val. Und dann? Du verwendest doch $val danach gar nirgends. Irgendwie fehlt da eine anschließende Zuweisung des gelesenen Wertes and den dummy Temperatur, z.B. in der (vereinfacht dargestellten) Form set Temperatur $val

-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

znbrain

ich werde mal den Workaround von WZut ausprobieren.

in seinem Beispiel:
define go_myow notify Firmata_IN_5:reading.* { if (!$value{myonwire}) {fhem("define myonwire OWX 7");;}}
wird ja in Abhängigkeit des Signals am Eingang 5 des Arduino lediglich das OWX-Device myonwire definiert. Soweit ist mir das klar.
Ich möchte jetzt aber noch weitere Objekte definieren die erst nach dem OWX-Device definierbar sind. Wie sieht dann da die Syntax aus? Kann man eine Datei übergeben in der die Befehle drinnstehen? Also quasi eine 2. Config-Datei die erst ausgeführt wird wenn der Arduino angebunden ist ?


Wie kann ich über die Config das Abfrageintervall für die OWTherm-Devices übergeben ?

Wozu dient die Einstellung "Interval" beim OWX-Device?

Viele Grüße,
Nico

ntruchsess

So, jetzt geht's hier meinerseits auch mal ein bischen weiter: habe grade ins OWX eingebaut, dass es damit klarkommt, wenn der Arduino noch nicht verbunden ist, wenn es definiert wird.
https://github.com/ntruchsess/fhem-mirror/tree/owx_async/fhem/FHEM, hier alle Dateien, die FRM im Namen drinhaben übernehmen.
Konnte ich nur mit Firmata over Ethernet testen, die USB-anschlüsse meines Notebooks sind mir vorgestern abgeraucht :-(

weitere config-Dateien kann man übrigens per 'include' nachladen: http://fhem.de/commandref.html#include

Gruß,

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

ntruchsess

Zitat von: znbrain am 21 Oktober 2013, 10:48:06
ich werde mal den Workaround von WZut ausprobieren.
Das habe ich jetzt gründlich überarbeitet, der Workaround sollte damit hinfällig geworden sein!
https://github.com/ntruchsess/fhem-mirror/tree/owx_async/fhem/FHEM

Zumindestens schon mal die OWTHERM-devices werden bei einem Neustart sauber geladen, auch wenn OWX noch nicht zur Firmata verbinden konnte. An die anderen Devices muss ich noch ran.

Zitat von: znbrain am 21 Oktober 2013, 10:48:06
Wie kann ich über die Config das Abfrageintervall für die OWTherm-Devices übergeben ?
dafür hat das OWTHERM-device gerade sein eigenes Attribut 'interval' bekommen (übersteht jetzt auch einen Neustart).

Zitat von: znbrain am 21 Oktober 2013, 10:48:06
Wozu dient die Einstellung "Interval" beim OWX-Device?

In diesem Interval führt das OWX-device Searches auf dem Bus aus (um neue Devices und solche im 'Alarmed'-zustand zu erkennen). Wenn man zusätzlich das Attribut 'doKick' gesetzt hat (und die DS18B20 nicht parasitär über den Bus, sondern über den Vdd-Pin versorgt werden), dann wird vor dem Search in allen DS18B20-devices eine Temperaturmessung getriggert (aber nicht ausgelesen, das machen die Devices selber, in diesem Fall dann ohne selbst zu triggern).

Gruß,

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