JeeLink v3c/ESP8266 zur Einbindung von Davis Vantage

Begonnen von habeIchVergessen, 15 November 2015, 12:13:53

Vorheriges Thema - Nächstes Thema

habeIchVergessen

1. aktuell kann per  Define zwischen Senden mit/ohne Dictionary gewechselt werden (fehlte in deinem Code).
2. wenn ein Soil/Leaf-Packet empfangen wird und kein Sensor detektiert wurde, dann werden nur RSSI und Battery übertragen. Der eigentliche Grund (Art des Packets) verschwindet vollständig. Blacklisten würde ich auch nicht toll finden.
3. die Resourcen vom Arduino sind sehr limitiert und ich würde sie gern für das Wesentliche nutzen (Daten dekodieren und weiterreichen).

Wenn du Lust und Laune hast, dann versuch dich an o.g. und wir diskutieren weiter, wenn Aufwand (Resourcen) und Nutzen deutlich werden.

Für LeafWetness fehlt noch das korrekte Auslesen der Daten und die Berechnung. Gibt es diesbzgl. weitere Informationen?

Moisture wird aktuell nur ausgegeben, wenn die Temperatur mitgeliefert wird (bei der Berechnung notwendig). Eine Default-Temperatur von 24°C habe ich nicht eingebaut.
Sonstige Einwände bzgl. der leichten Abwandlungen?

StefanStrobel

Zitat
1. aktuell kann per  Define zwischen Senden mit/ohne Dictionary gewechselt werden (fehlte in deinem Code).
2. wenn ein Soil/Leaf-Packet empfangen wird und kein Sensor detektiert wurde, dann werden nur RSSI und Battery übertragen. Der eigentliche Grund (Art des Packets) verschwindet vollständig. Blacklisten würde ich auch nicht toll finden.
baue ich gerne noch ein.

Zitat
3. die Resourcen vom Arduino sind sehr limitiert und ich würde sie gern für das Wesentliche nutzen (Daten dekodieren und weiterreichen).
Da bin ich prinzipiell Deiner Meinung. Dennoch wird es immer ein Kompromiss sein, bei dem auch Usability und sinnvolle Integration in FHEM eine Rolle spielen sollten.
Bei einer ganz konsequenten Linie um Ressourcen im Sketch zu sparen, müssten auch die Formeln zur Umrechnung in Userreadings ausgelagert werden. Ich halte das nicht für erstrebenswert, solange die Ressourcen es noch problemlos hergeben. Die reduzierte Verwendung von String-Objekten bzw. Nutzung von PROGMEM ist da ein offensichtlicherer Hebel.

Zitat
Wenn du Lust und Laune hast, dann versuch dich an o.g. und wir diskutieren weiter, wenn Aufwand (Resourcen) und Nutzen deutlich werden.
Zum Thema Nutzen:
Auch aus Sicht der FHEM-Integration würde ich von der bisherigen Variante abraten. Wenn ca. alle drei Sekunden ein Reading mit einem anderen Wert mit einer anderen Bedeutung in FHEM eingeliefert wird, gehen die üblichen Konstrukte wie event-on-change-reading .* ins Leere. Ohne aufwändigere Konfiguration wird jedes mal ein Event erzeugt.

Zitat
Für LeafWetness fehlt noch das korrekte Auslesen der Daten und die Berechnung. Gibt es diesbzgl. weitere Informationen?
Bisher habe ich nichts im Internet gefunden.
Es sollte aber nicht so schwer sein das noch zu reversen.
Ich habe gerade noch ein paar offene Baustellen bzw. Erweiterungswünsche bei meinen Fhem-Modulen, die ich implementieren möchte (insbes. Modbus und HTTPMODD), aber in den nächsten Wochen sollte das irgendwann noch reinpassen.

Zitat
Moisture wird aktuell nur ausgegeben, wenn die Temperatur mitgeliefert wird (bei der Berechnung notwendig). Eine Default-Temperatur von 24°C habe ich nicht eingebaut.
Ich denke ein Default-Wert von 24Grad sind nur sehr wenige zusätzliche Bytes im Code. Das sollte es wert sein.

Zitat
Sonstige Einwände bzgl. der leichten Abwandlungen?

Keine Einwände - nur Ergänzungsvorschläge :-)
Ein sleep 1000 zu Beginn hatte das Problem mit den Jeelinks doch noch nicht behoben. Nachdem ich mir das mit zusätzlichen Debug-Logs im Jeelink-Modul näher angesehen hatte, besteht die Lösung entweder in einem zusätzlichen Newline oder in einer kleinen Änderung der Regex im Jeelink-Modul, so dass die Null-Bytes weggeworfen werden (siehe mein vorletzter Post).

@Andre: falls Du mitliest, was meinst Du dazu?

Die eingefügten "const" im Code, die ich im Diff vorgeschlagen habe, entfernen einige Compiler-Warnings. Das ist nur kosmetischer Natur, sorgt aber bei unbedarfteren Anwendern für weniger Verwirrung und schadet sicher nichts.

Die <> Syntax, mit der Du die eigenen #include-Dateien des Sketches einbindest funktioniert nicht bei Anwendern, die einfach nur das Archiv extrahieren und das ganze in der neu installierten Arduino-IDE comilierten wollen. Du könntest entweder eine Anleitung dazu schreiben, wo man die jeweiligen Dateien hinkopieren soll oder aber für die hier veröffentlichte Version die Dateien mit "" includen.

Gruss
    Stefan

StefanStrobel

Hallo habeIchVergessen,

ich habe inzwischen die Dekodierung der Leaf-Wetness-Meldungen (SubType 2) eingebaut. Interessanterweise wird zusammen mit Leaf-Wetness auch immer der Tempertaturwert mit der gleichen Portnummer mitgesendet. Die Kodierung der Temperatur ist dann identisch mit den Soil-Moisture- und Temperature-Meldungen bei SubType 1. Leaf-Wetness wird dabei in Byte 2 als 8-Bit Wert gesendet.
Daher habe ich die Reihenfolge im Programmcode so umgestellt, dass die Temperatur in beiden Fällen als erstes ausgewertet wird. Falls kein Temperatursensor vorhanden ist, gehe ich von den 24 Grad aus. Das könnte man natürlich noch wählbar machen.
Deine Variante der Interpolation für die Temperaturberechnung habe ich übernommen. Sie ist ohne Zweifel eleganter als mein erster Entwurf.

Zitat
3. die Resourcen vom Arduino sind sehr limitiert und ich würde sie gern für das Wesentliche nutzen (Daten dekodieren und weiterreichen).
Wenn du Lust und Laune hast, dann versuch dich an o.g. und wir diskutieren weiter, wenn Aufwand (Resourcen) und Nutzen deutlich werden.

Um das mit den Portnummern bei den Werten eleganter umsetzen zu können, war ich so frei Deine Präprozessor-Makros zur Ausgabe der Sensor-Werte durch Funktionsaufrufe zu ersetzen und die Tabelle der Namen explizit ins Progmem zu legen. Dadurch fällt einiges an Redundanz weg, die der Präprozessor sonst erzeugt hat und es wird deutlich einfacher Namen mit Suffixen (-1 bis -4) zu erzeugen. Damit die Tabelle einfacher indizierbar ist, habe ich die numerischen Keys auch ohne Lücken nummeriert. Ich hoffe das hat bei Dir keine negativen Seiteneffekte.
Das Senden mit / ohne Dictionary sollte ebenfalls funktionieren.

Für die Ressourcendiskussion ist damit auf jeden Fall trotz zusätzlicher Funktionen der verwendete Programmspeicher von 75% auf 70% und der verwendete Variablenspeicher von 57% auf 48% gesunken.

Um den Code auch in fremden Umgebungen ohne Verschieben der Includes zu erleichtern habe ich ein
#define LOCALINCLUDES   1
eingebaut. Vielleicht wäre das ja ein Kompromiss ...

Zitat
2. wenn ein Soil/Leaf-Packet empfangen wird und kein Sensor detektiert wurde, dann werden nur RSSI und Battery übertragen. Der eigentliche Grund (Art des Packets) verschwindet vollständig. Blacklisten würde ich auch nicht toll finden

Da sehe ich noch Diskussionsbedarf. Durch die neuen Funktionen zur Ausgabe der Sensorwerte könnte man jetzt auch die Ausgabe von Header, Channel, RSSI und Battery in eine Funktion auslagern und bei der ersten Ausgabe eines Sensorwertes aufrufen. Ob hier der Aufwand aber gerechtfertigt ist, würde ich anzweifeln. Id, Channel etc. müssten dann sinnvoll zwischengespeichert werden, es werden neue Flags nötig um den Header nur einmal auszugeben etc.
Mich stört es eigentlich nicht, wenn gelegentlich nur Battery und RSSI gemeldet werden.
Problematisch ist dabei auch dass auch die Debug-Ausgaben im Interrupt-Handler dazwischen funken können.

Anbei der Sketch mit meinen Änderungen / Erweiterungen

Gruss
    Stefan



habeIchVergessen

hab es schon mal kurz angeschaut. mir fehlt aktuell die Zeit zum Testen. Melde mich dann.

habeIchVergessen

#154
hat lange gedauert!

anbei ein Sketch, der sich für ein Arduino Uno/Nano und ESP8266 kompilieren lässt und die Änderungen zu Soil Temperature/Moisture und LeafWetness enthält. Bitte nur zu Testzwecken einsetzen und ggf. ein Feedback abgeben.

fhem-master.7z unter Windows in folgendes Verzeichnis entpacken (Arduino IDE neu starten)

%USERPROFILE%\Documents\Arduino\libraries

Michael Schmidt

Hallo,

ich überlege mir gerade eine Wetterstation zu kaufen.
Die Vantage PRO 2 sagt mir schon ziemlich zu, jedoch wäre mir sehr wichtig das meine neue Wetterstation fast alles in FHEM überträgt.

Kann mir jemand sagen welche Daten nun tatsächlich in FHEM gelesen werden können?

LG Jens

habeIchVergessen

grundsätzlich sollten die Readings für Wind (Richtung, Stärke, Böe), Temperatur, Luftfeuchtigkeit, Regen (Tip-Count, Sekunden), Batterie + RSSI geliefert werden. Bei den Ausführungen mit Solar eben auch die Spannung am Panel + Kapazität Kondensator. Letzere sind von der Vantage Vue. Ggf. muss hier die Software (Sketch) angepasst werden.

Ansonsten finden sich hier weiterführende Infos zu berechneten Werten, die auf den Readings basieren.

reisner

Hallo,
ich habe mir einen NanoJeeLink mit dem RFM69CW zusammen gebastelt und in fhem eingebunden.
model: [DAVIS.0.7e (RFM69 b:2)]
initCommands: 0,0s 1r

Leider erhalte ich als RAWMSG: OK VALUES DAVIS 0 17=2,19=73,18=ok,4=0.00,5=55,8=55 und nicht Battery, Temperature, Humidity....
Ich kann leider beim durchflöhen des Scetches und der beteiligten fhem Module nich heraus finden, was die Ursache ist, habt Ihr einen zweckdienlichen Hinweis für mich?

Wenn ich wüsste, für welchen Sensorwert die Zahlen stehen, könnte ich über UserReadings ja umschlüsseln.

Danke schon einmal
reisner

reisner

ich denke, es liegt an diesem auskommentierten define   "// #define KVP_LONG_KEY_FORMAT 1"

reisner

habeIchVergessen

nach dem Booten vom Nano sollte eine Zeile ausgegeben werden, die mit INIT beginnt.
In dieser steht das Mapping. Sollte von JeeLink entsprechend erkannt werden und von KeyValueProtocol-Device auch gelesen werden, sofern dass Attribute Mapping dort nicht existiert. Kannst du bitte mal ein list für die beiden Devices posten?

reisner

list JeeLink:

Internals:
   Clients    :PCA301:EC3000:RoomNode:LaCrosse:ETH200comfort:CUL_IR:HX2272:FS20:AliRF:Level:EMT7110:KeyValueProtocol
   DEF        /dev/ttyUSB2@57600
   Davis_MSGCNT 19449
   Davis_TIME 2017-09-07 10:21:38
   DeviceName /dev/ttyUSB2@57600
   FD         48
   NAME       Davis
   NR         206
   PARTIAL
   RAWMSG     OK VALUES DAVIS 0 17=1,19=70,18=ok,4=1.61,5=55,3=81,
   STATE      opened
   TYPE       JeeLink
   initMessages
   model      [DAVIS.0.7e (RFM69 b:2)] config: 2b 0r
   Matchlist:
     1:PCA301   ^\S+\s+24
     2:EC3000   ^\S+\s+22
     3:RoomNode ^\S+\s+11
     4:LaCrosse ^(\S+\s+9 |OK\sWS\s)
     5:AliRF    ^\S+\s+5
     6:EMT7110  ^OK\sEMT7110\s
     7:KeyValueProtocol ^OK\sVALUES\s
   Readings:
     2017-09-07 10:28:11   state           opened
Attributes:
   event-min-interval 60
   flashCommand avrdude -p atmega328P -c arduino -P [PORT] -D -U flash:w:[HEXFILE] 2>[LOGFILE]
   initCommands 0,0s 1r
   room       Davis,System


list KeyValue Protocol:

Internals:
   DEF        DAVIS 0
   Davis_MSGCNT 19449
   Davis_RAWMSG OK VALUES DAVIS 0 17=1,19=70,18=ok,4=1.61,5=55,3=81,
   Davis_TIME 2017-09-07 10:21:38
   ID         DAVIS_0
   IODev      Davis
   LASTInputDev Davis
   MSGCNT     19449
   NAME       KeyValueProtocol_DAVIS_0
   NR         207
   STATE      Initialized
   TYPE       KeyValueProtocol
   model      DAVIS
   Readings:
     2017-09-07 10:21:30   1               14.72
     2017-09-07 10:21:38   17              1
     2017-09-07 10:21:38   18              ok
     2017-09-07 10:21:38   19              70
     2017-09-07 10:21:38   3               81
     2017-09-07 10:21:38   4               1.61
     2017-09-07 10:21:38   5               55
     2017-09-07 10:21:28   6               9.65
     2017-09-07 10:21:28   7               6
     2017-09-07 10:21:33   8               90
     2017-09-07 10:21:36   9               -1
     2017-09-07 10:21:30   DewPoint        11.12
Attributes:
   IODev      Davis
   event-min-interval *:60
   room       Davis,KeyValueProtocol
   userReadings DewPoint:(1.*|3.*) { sprintf("%.2f", ReadingsVal("KeyValueProtocol_DAVIS_0", "1", 0) - (100 - ReadingsVal("KeyValueProtocol_DAVIS_0", "3", 99)) / 5.0);; }


habeIchVergessen

bei meinem JeeLink-Device gibt es das Internal initMessages. dort steht die ersten Nachricht aus dem Sketch (wenn nicht  KVP_LONG_KEY_FORMAT definiert ist). Diese wird vom KeyValueProtocol-Device gelesen und für das Mapping herangezogen.

Internals:
   CFGFN      fhem_davis.cfg
   Clients    :PCA301:EC3000:RoomNode:LaCrosse:ETH200comfort:CUL_IR:HX2272:FS20:AliRF:Level:EMT7110:KeyValueProtocol
   DEF        /dev/ttyUSB0@57600
   DeviceName /dev/ttyUSB0@57600
   FD         35
   NAME       davisJeeLink
   NR         202
   PARTIAL
   RAWMSG     OK VALUES DAVIS 0 20=1,22=-62,21=ok,4=0.00,5=255,8=24,
   STATE      initialized
   TYPE       JeeLink
   davisJeeLink_MSGCNT 1218720
   davisJeeLink_TIME 2017-09-07 19:40:37
   initMessages INIT DICTIONARY 1=Temperature,2=Pressure,3=Humidity,4=WindSpeed,5=WindDirection,6=WindGust,7=WindGustRef,8=RainTipCount,9=RainSecs,10=Solar,11=VoltageSolar,12=VoltageCapacity,13=SoilLeaf,14=UV,20=Channel,21=Battery,22=RSSI,255=PacketDump,
   model      [DAVIS.0.6 (RFM69 b:2)]
   Matchlist:
     1:PCA301   ^\S+\s+24
     2:EC3000   ^\S+\s+22
     3:RoomNode ^\S+\s+11
     4:LaCrosse ^(\S+\s+9 |OK\sWS\s)
     5:AliRF    ^\S+\s+5
     6:EMT7110  ^OK\sEMT7110\s
     7:KeyValueProtocol ^OK\sVALUES\s
   Readings:
     2017-09-07 19:40:37   state           initialized
Attributes:
   flashCommand avrdude -p atmega328P -c arduino -P [PORT] -D -U flash:w:[HEXFILE] 2>[LOGFILE]
   initCommands 0,16s r


Davis-Device

Internals:
   CFGFN      fhem_davis.cfg
   DEF        DAVIS 0
   ID         DAVIS_0
   IODev      davisJeeLink
   LASTInputDev davisJeeLink
   MSGCNT     1218338
   NAME       VantageVue
   NR         203
   STATE      Initialized
   TYPE       KeyValueProtocol
   davisJeeLink_MSGCNT 1218872
   davisJeeLink_RAWMSG OK VALUES DAVIS 0 20=3,22=-62,21=ok,4=0.00,5=257,8=24,
   davisJeeLink_TIME 2017-09-07 19:48:50
   model      DAVIS
   Helper:
     Dblog:
       Humidity:
         Dbhistdatalog:
           TIME       1504806178.95634
           VALUE      76.00
       Pressure:
         Dbhistdatalog:
           TIME       1504803616.43996
           VALUE      1010
       Rainamount:
         Dbhistdatalog:
           TIME       1504786500.67796
           VALUE      0
       Rainamounttotal:
         Dbhistdatalog:
           TIME       1504785599.45913
           VALUE      1033.6
       Rainsecs:
         Dbhistdatalog:
           TIME       1504786626.99847
           VALUE      -1
       Raintipcount:
         Dbhistdatalog:
           TIME       1504785599.45913
           VALUE      24
       Temperature:
         Dbhistdatalog:
           TIME       1504806483.89835
           VALUE      14.94
       Winddirection:
         Dbhistdatalog:
           TIME       1504806504.39456
           VALUE      257
       Windspeed:
         Dbhistdatalog:
           TIME       1504806522.33656
           VALUE      0.00
       State:
         Dbhistdatalog:
           TIME       1500639252.37319
           VALUE      Pressure:
   Readings:
     2017-09-07 19:48:50   Battery         ok
     2017-09-07 19:48:50   Channel         3
     2017-09-07 19:48:03   DewPoint        10.14
     2017-09-07 19:48:06   Humidity        76.00
     2017-09-07 19:48:50   Pressure        1010
     2017-09-07 19:48:50   RSSI            -62
     2017-09-07 14:15:00   RainAmount      0
     2017-09-07 13:59:59   RainAmountTotal 1033.6
     2017-09-07 19:48:42   RainSecs        -1
     2017-09-07 19:48:50   RainTipCount    24
     2017-09-07 19:48:44   Temperature     14.94
     2017-09-07 19:48:16   VoltageCapacity 8.34
     2017-09-07 19:48:26   VoltageSolar    444
     2017-09-07 19:48:42   WindChill
     2017-09-07 19:48:50   WindDirection   257
     2017-09-07 19:48:42   WindForce       0
     2017-09-07 19:48:50   WindSpeed       0.00
     2017-09-07 19:48:50   _IsRaining      0
     2017-09-07 14:15:00   _LastRainTipCount 24
     2017-09-07 13:59:59   _LastRainTipCountTotal 24
Attributes:
   IODev      davisJeeLink
   event-min-interval Pressure:3600, Humidity:3600
   event-on-change-reading .*
   event-on-update-reading _LastRainTipCount
   userReadings _IsRaining { (ReadingsVal("HM_RegenSensor.Status", "state", "dry") eq "dry" ? 0 : 1) }, DewPoint:(Temperature.*|Humidity.*) { sprintf("%.2f", ReadingsVal("VantageVue", "Temperature", 0) - (100 - ReadingsVal("VantageVue", "Humidity", 99)) / 5.0); }, WindChill:(WindSpeed.*|Temperature.*) { my $wc; my $ws = (ReadingsVal("VantageVue", "WindSpeed", 0) ** 0.16); my $temp = ReadingsVal("VantageVue", "Temperature", 0); my $calc = 13.12 + 0.6215 * $temp - 11.37 * $ws + 0.3965 * $temp * $ws; $wc = sprintf("%.2f", $calc) if ($calc < $temp); }, WindForce:WindSpeed.* { my $wf; my $ws=ReadingsVal("VantageVue", "WindSpeed", 0.00); $ws=~s/(\d+)\.\d+/$1<1?0:($1<6?1:($1<12?2:($1<20?3:($1<29?4:($1<39?5:($1<50?6:($1<62?7:($1<75?8:($1<89?9:($1<103?10:($1<117?11:12)))))))))))/eg; $wf=sprintf("%d", $ws); }, Pressure { ReadingsVal("BMP180", "Pressure", "") }


was liefert folgendes Kommando?

fhem> version (36_JeeLink|36_KeyValueProtocol)
File          Rev   Last Change

36_JeeLink.pm          12695 2016-12-01 21:38:18Z justme1968
36_KeyValueProtocol.pm 12157 2016-09-13 11:23:02Z hcs-svn

reisner

Hi,
folgende Versionsinfo bekomme ich:
36_JeeLink.pm          12695 2016-12-01 21:38:18Z justme1968
36_KeyValueProtocol.pm 13429 2017-02-18 11:46:50Z HCS

Bei mir wird offensichtlich die initMessages nicht gefüllt, ich habe kurzerhand das attribut Mapping manuell gefüllt und somit läuft es nun auch wie gewünscht.
Ich danke Dir trotzdem schon mal für deinen Einsatz!

wünsche ein schönes WE.
reisner

wagenkna

#163
Hallo allerseits,

ich mir einen fertig gebauten Jeelink mit dem richtigen Chip für eine Davis Vanatge Pro gekauft.

Leider bekomme ich den Empfänger nicht an eine Vantage Pro geflascht.

Auch an einem anderen Raspi habe ich das gleiche Problem..

Weiß jemand  Rat?

Danke awa
Homematic mit CCU2, Fensterkontakt, Thermostaten, Steckdosen, Regen.-Bewegung.-Wassermelder (76) Devices)
Raspberry2 und 3 Mit KNX, OWL, Fritzbox, Unifi, Luftmessungmodul

habeIchVergessen

beim Flash wurde der JeeLink nicht gefunden. Hat noch eine LaCross-Firmware.