JeeLink v3c/ESP8266 zur Einbindung von Davis Vantage

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

Vorheriges Thema - Nächstes Thema

justme1968

ich denke in den aller meisten fällen kommen wir mit einem default von : und , hin. : um den key von value zu trennen und , um einzelne reading zu trennen.

mit der logik von HCS funktioniert das sogar wenn das , in einem wert auftaucht. das geht erst schief wenn auch das zweite zeichen im wert auftauchen darf.

wir können jetzt lange über einen anderen default diskutieren (z.b. = und ;) aber das ändert nichts daran das es probleme gib sobald beide zeichen auch im wert auftauchen dürfen.

es gibt zwei möglichkeiten das zu lösen: wir definieren wie man die beiden zeichen escapen kann oder wird erlauben das der sketch angeben kann welche beiden zeichen als trennzeichen verwendet werden.

- als teil der DICTIONARY nachricht
- oder in einer eigenen INIT SEPARATOR nachricht

INIT SEPARATOR wäre vermutlich das sauberstes und flexibelste. z.b. so: INIT SEPARATOR 1:= 2:;

gruss
  andre
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

habeIchVergessen

oder eben per regexp pattern festlegen, wie das Format sein soll.


[\s]{0,}(\w+)::([\w\-,][\w\-\s,:]*)(&.*|$)

(<Name>)::(<Wert>)(&<restliche Zeichenkette, die geparst wird>)


vor dem Namen beliebig viele Leerzeichen zulassen
Name besteht aus a-z A-Z 0-9 _
Trennzeichen (2 Byte) zwischen Name und Wert ist ::
Wert begint mindestens mit a-z A-Z 0-9 _ - , alle nachfolgenden Zeichen können a-z A-Z 0-9 _ - ' ' : sein
Trennzeichen (im Beispiel &) und die restliche Zeichenkette oder Zeilenende.


OK VALUES LGW 12345 UpTime::2345678& SSID::MyCoolNetwork&LastReceiveTime::2015-11-17 13:39:14,2015-11-18 13:33:14&  Mode::OK,Connected,Cool&OTA::Ready


da & nicht in den Werten zugelassen ist, sollte es kein Problem geben.

HCS

Zitat von: justme1968 am 21 November 2015, 18:22:37
es gibt zwei möglichkeiten das zu lösen: wir definieren wie man die beiden zeichen escapen kann oder wird erlauben das der sketch angeben kann welche beiden zeichen als trennzeichen verwendet werden.
Darüber denke ich dann bei Gelegenheit mal nach, bin gerade mit den Nerven runter  :o

Beim Testen ist mir aufgefallen, dass der JeeLink weder bei einem "set myJeeLink reset" noch bei einem Neustart einen Reset macht.
Anderen JeeLink genommen, genauso.
Auf dem Produktivsystem geschaut, da geht es.
Server neu gebootet, hilft nix.
Ewig gesucht, IODev wird geschlossen und wieder geöffnet, alles prima.
Ein blankes neues FEHM aufgespielt, ein JeeLink device angelegt, geht.
Das ursprüngliche FHEM wieder draufgespielt -> FUNKTIONIERT
Ich verstehe nur nicht, warum?

Egal, zu den newlines:
Da brauchen wir diese Variante:
  if( $dmsg =~ /^INIT / ) {
    $hash->{initMessages} .= "\n" if( $hash->{initMessages} );
    $hash->{initMessages} .= $dmsg;
    return;
  }

An der rmsg, die JeeLink_Parse rein bekommt, sind nie linefeeds dran, bei keiner "OK ..." und auch bei sonst nichts.

Ich habe einen LaCrosse Sketch laufen, der eine Initialisierung schickt, das klappt so weit.
Internals:
   Clients    :PCA301:EC3000:RoomNode:LaCrosse:ETH200comfort:CUL_IR:HX2272:FS20:AliRF:Level:EMT7110:KeyValueProtocol
   DEF        /dev/ttyUSB0@57600
   DeviceName /dev/ttyUSB0@57600
   FD         10
   NAME       myJeeLink
   NR         20
   PARTIAL
   RAWMSG     OK 9 41 1 4 184 60
   STATE      Initialized
   TYPE       JeeLink
   initMessages INIT DICTIONARY U=UpTime,M=MessagesPerMinute,S:SSID
INIT TEST InitTest
   model      [LaCrosseITPlusReader.10.1q (RFM12 f:868300 r:9579)]


Die "OK VALUES JeeLink 01 U:25005,M:25,S:USB" laufen auch wunderbar in das per autcreate entstandene KeyValueProtocol_JeeLink_01 device.
Dem werde ich dann mal die initMessages aus den JeeLink internals beibringen.

justme1968

hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

HCS

Zitat von: justme1968 am 21 November 2015, 18:22:37
ich denke in den aller meisten fällen kommen wir mit einem default von : und , hin. : um den key von value zu trennen und , um einzelne reading zu trennen.

mit der logik von HCS funktioniert das sogar wenn das , in einem wert auftaucht. das geht erst schief wenn auch das zweite zeichen im wert auftauchen darf.

Genau, und da stelle ich mir die Frage, ob das den ganzen Aufwand wert ist, mit noch mehr Initialisierung usw.
Das ist doch ein eher hypothetischer use case.

Das gegebene Beispiel
OK VALUES LGW 12345 UpTime:2345678, SSID:MyCoolNetwork,LastReceiveTime:2015-11-17 13:39:14,2015-11-18 13:33:14,   Mode:OK,Connected,Cool,   OTA:Ready
kann ein Sketch doch problemlos dadurch vermeiden, dass er es in zwei KVPs übermittelt.
LastReceiveTime1:2015-11-17 13:39:14
LastReceiveTime2:2015-11-18 13:33:14


oder er in so einem Spezialfall das Komma vermeidet
OK VALUES LGW 12345 UpTime:2345678, SSID:MyCoolNetwork,LastReceiveTime:2015-11-17 13:39:14 / 2015-11-18 13:33:14,   Mode:OK,Connected,Cool,   OTA:Ready

Ich bin dafür, das erst mal so zu lassen, wie es jetzt funktioniert und abzuwarten, ob es wirklich real world use cases geben wird, wo man damit nicht klar kommt. Dann kann man es immer noch erweitern.

justme1968

#80
das denke ich auch.

wir können höchstens überlegen = statt : zu verwenden.
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

HCS

Zitat von: justme1968 am 22 November 2015, 09:42:15
wir können höchstens überlegen = statt : zu verwenden.
Wäre auch OK, dann passt es auch zu "INIT DICTIONARY T=Temperature,H=Humidity"

OK VALUES LGW 12345 UpTime=2345678, SSID=MyCoolNetwork, LastReceiveTime=2015-11-17 13:39:14,2015-11-18 13:33:14, Mode=OK,Connected,Cool, OTA=Ready

Ich baue es auf = um

habeIchVergessen

hab mal ein Select über die Anzahl der Readings (WindSpeed) ausgeführt.

Wert|Anzahl
0.00|31249
1.61|3884
11.26|2
14.48|1
3.22|983
4.83|247
6.44|102
8.05|21
9.65|6


Können wir in 36_KeyValueProtocol einbauen, dass Readings nur aktualisiert werden, wenn sie sich geändert haben? Vorschlag:

if ($rhash->{READINGS}{$key}{VAL} ne $value) {
readingsBulkUpdate($rhash, $key, $value);
}

ggf. noch ein Attribut zum steuern dessen (nicht im Beispiel enthalten; bin schon zufrieden, dass das o.g. funktioniert).

justme1968

für gibt es die event-on-change-reading und event-on-update-reading attribute.

gruss
  andre
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

HCS

36_KeyValueProtocol.pm ist eingecheckt.

- Auf = umgebaut
- commandref erledigt
- verwendet initMessages vom JeeLink modul, das eigene Dictionary Attribut hat Vorrang

habeIchVergessen

Dictionary geht bei mir nicht!?

fhem> list KeyValue.*
Internals:
   CFGFN
   DEF        DAVIS 0
   ID         DAVIS_0
   IODev
   LASTInputDev davisJeeLink
   MSGCNT     45
   NAME       KeyValueProtocol_DAVIS_0
   NR         534
   STATE      Initialized
   TYPE       KeyValueProtocol
   davisJeeLink_MSGCNT 45
   davisJeeLink_RAWMSG OK VALUES DAVIS 0 20=3,22=-85,21=ok,4=0.00,5=-50,9=-1,
   davisJeeLink_TIME 2015-11-22 19:45:15
   model      DAVIS
   Readings:
     2015-11-22 19:43:55   1               -1.67
     2015-11-22 19:43:48   11              1
     2015-11-22 19:43:37   12              6.74
     2015-11-22 19:45:15   20              3
     2015-11-22 19:45:15   21              ok
     2015-11-22 19:45:15   22              -85
     2015-11-22 19:45:10   3               96.00
     2015-11-22 19:45:15   4               0.00
     2015-11-22 19:45:15   5               -50
     2015-11-22 19:43:17   6               0
     2015-11-22 19:43:17   7               -1
     2015-11-22 19:43:50   8               93
     2015-11-22 19:45:15   9               -1
Attributes:
   room       KeyValueProtocol


fhem> list davisJeeLink
Internals:
   CFGFN      fhem_davis.cfg
   Clients    :PCA301:EC3000:RoomNode:LaCrosse:ETH200comfort:CUL_IR:HX2272:FS20:AliRF:Level:EMT7110
   DEF        /dev/ttyUSB0@57600
   DeviceName /dev/ttyUSB0@57600
   FD         6
   NAME       davisJeeLink
   NR         144
   PARTIAL
   RAWMSG     OK VALUES DAVIS 0 20=1,22=-86,21=ok,4=0.00,5=-50,1=-1.67,
   STATE      Initialized
   TYPE       JeeLink
   davisJeeLink_MSGCNT 39522
   davisJeeLink_TIME 2015-11-22 19:46:39
   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,20=Channel,21=Battery,22=RSSI,255=PacketDump,
   model      [DAVIS.0.1 (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:
     2015-11-22 19:45:02   state           opened
     $key:
     Battery:
     Channel:
     Humidity:
     Rssi:
     Rain:
     Rainsecs:
     Temperature:
     Voltagecapacity:
     Voltagesolar:
     Winddirection:
     Windspeed:
Attributes:
   flashCommand avrdude -p atmega328P -c arduino -P [PORT] -D -U flash:w:[HEXFILE] 2>[LOGFILE]
   initCommands 0,16s r


eine Idee, warum?

HCS

Zitat von: habeIchVergessen am 22 November 2015, 19:48:48
Dictionary geht bei mir nicht!?
...
eine Idee, warum?

Dein KeyValueProtocol_DAVIS_0 hat kein IODev (ist leer). Dann weiß das Modul nicht, wo es die initMessages hernehmen soll.
Setz mal das Attribut.

habeIchVergessen

Damit in dem Internal was drin stehen kann, muss bestimmt ein autocreate erfolgen?

HCS

Es gibt ein Attribut in 36_KeyValueProtocol, das man setzen kann.

habeIchVergessen

Ja, das Mapping Attribut.
Ich wollte wissen, ob im Internals IODev nur ein Wert erscheint, wenn die KeyValueProtocol-Instance per AutoCreate erstellt wurde. Ist das so?