JeeLink v3c/ESP8266 zur Einbindung von Davis Vantage

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

Vorheriges Thema - Nächstes Thema

HCS


justme1968

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

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

habeIchVergessen

folgendes habe ich bis jetzt nur kompiliert (kein Laufzeittest)

Include-Datei Sensors.h
#include <Arduino.h>

#ifndef _TEST1_h

#define _TEST1_h

// output keys as String
#define KEYS_AS_STRING 1

#define SENSOR_KEY_DELIMITER ' '
#define SENSOR_KEY_VALUE_DELIMITER ':'
#define SENSOR_VALUE_DELIMITER ','

#define SensorValueHeader(type, id) { ((String)"OK") + SENSOR_KEY_DELIMITER + type + SENSOR_KEY_DELIMITER + id }
#define SensorValue(key, value) { ((String)SENSOR_KEY_DELIMITER) + key + SENSOR_KEY_VALUE_DELIMITER + value }

// define strings
#ifdef KEYS_AS_STRING

#define SENSOR_TEMPERATURE_OUTSIDE    F("TemperatureOutside")
#define SENSOR_TEMPERATURE_INSIDE     F("TemperatureInside")
#define SENSOR_PRESSURE               F("Pressure")

// define numbers
#else

#define SENSOR_TEMPERATURE_OUTSIDE 1
#define SENSOR_TEMPERATURE_INSIDE 2
#define SENSOR_PRESSURE 3

#endif

#endif  // _TEST1_h


im Sketch

#define PROGNAME      F("DAVIS")
#define PROGVERSION   "0.1"

  Serial.print(SensorValueHeader(PROGNAME, 0));
  Serial.print(SensorValue(SENSOR_TEMPERATURE_OUTSIDE, 59.4));

HCS

Zitat von: justme1968 am 17 November 2015, 14:23:48
das macht doch gleich was her :)
Definitiv ...  :)

Kannst Du schon mal die default MatchList und Clients vom JeeLink Modul erweitern?
"7:KeyValueProtocol" => "^OK\\sVALUES\\s"

justme1968

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

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

HCS

Zitat von: justme1968 am 17 November 2015, 16:51:52
erledigt.
Mist, bist schneller als ich, muss aber auch in paar Zeilen mehr produzieren  :)
Aber mit etwas Glück werfe ich heute Abend eine erste (Spar)Version von 36_KeyValueProtocol.pm in den Ring.
Gegen die kann habeIchVergessen dann anfangen zu implementieren.

habeIchVergessen

so habe jetzt den Laufzeit Test durch und den Sketch angepasst.


OK VALUES DAVIS 0 Channel:1 RSSI:-81 Battery:ok WindSpeed:1 WindDirection:-36 Rain:39
OK VALUES DAVIS 0 Channel:3 RSSI:-81 Battery:ok WindSpeed:0 WindDirection:-36 TemperatureOutside:55.90
OK VALUES DAVIS 0 Channel:0 RSSI:-81 Battery:ok WindSpeed:0 WindDirection:-36 Rain:39
OK VALUES DAVIS 0 Channel:1 RSSI:-81 Battery:ok WindSpeed:0 WindDirection:-36 RainSecs:-1
OK VALUES DAVIS 0 Channel:3 RSSI:-78 Battery:ok WindSpeed:0 WindDirection:-36
OK VALUES DAVIS 0 Channel:0 RSSI:-79 Battery:ok WindSpeed:0 WindDirection:-36 RainSecs:-1
OK VALUES DAVIS 0 Channel:1 RSSI:-79 Battery:ok WindSpeed:0 WindDirection:-38 TemperatureOutside:55.90
OK VALUES DAVIS 0 Channel:0 RSSI:-79 Battery:ok WindSpeed:0 WindDirection:-38 TemperatureOutside:55.90
OK VALUES DAVIS 0 Channel:4 RSSI:-79 Battery:ok WindSpeed:0 WindDirection:-38 TemperatureOutside:55.90
OK VALUES DAVIS 0 Channel:0 RSSI:-81 Battery:ok WindSpeed:0 WindDirection:-38 VueCAP:7.02
OK VALUES DAVIS 0 Channel:3 RSSI:-81 Battery:ok WindSpeed:0 WindDirection:-38 TemperatureOutside:55.90
OK VALUES DAVIS 0 Channel:4 RSSI:-79 Battery:ok WindSpeed:0 WindDirection:-38 VueSolar:4
OK VALUES DAVIS 0 Channel:0 RSSI:-80 Battery:ok WindSpeed:0 WindDirection:-38 Rain:39
OK VALUES DAVIS 0 Channel:1 RSSI:-80 Battery:ok WindSpeed:0 WindDirection:-38 RainSecs:-1
OK VALUES DAVIS 0 Channel:3 RSSI:-79 Battery:ok WindSpeed:0 WindDirection:-38
OK VALUES DAVIS 0 Channel:4 RSSI:-81 Battery:ok WindSpeed:0 WindDirection:-38 Rain:39
OK VALUES DAVIS 0 Channel:0 RSSI:-82 Battery:ok WindSpeed:0 WindDirection:-38 RainSecs:-1
OK VALUES DAVIS 0 Channel:1 RSSI:-81 Battery:ok WindSpeed:0 WindDirection:-38 TemperatureOutside:55.90


OK VALUES DAVIS 0 253:0 252:-79 254:ok 6:0 7:63 15:7.08
OK VALUES DAVIS 0 253:3 252:-79 254:ok 6:0 7:-31 1:55.90
OK VALUES DAVIS 0 253:0 252:-79 254:ok 6:0 7:-31 10:39
OK VALUES DAVIS 0 253:1 252:-79 254:ok 6:0 7:-31
OK VALUES DAVIS 0 253:3 252:-79 254:ok 6:1 7:-30
OK VALUES DAVIS 0 253:4 252:-79 254:ok 6:0 7:-30 10:39
OK VALUES DAVIS 0 253:0 252:-79 254:ok 6:0 7:-31
OK VALUES DAVIS 0 253:1 252:-80 254:ok 6:0 7:40 1:55.90
OK VALUES DAVIS 0 253:3 252:-80 254:ok 6:0 7:41 10:39


Ausgabe mit Text oder ID kann über define im Header-File (s. Anhang) eingestellt werden.

Im Sketch sieht das dann so aus:

    case VP2P_HUMIDITY:
      val = ((packet[4] >> 4) << 8 | packet[3]) / 10; // 0 -> no sensor
      Serial.print(SensorDataValue(SENSOR_HUMIDITY, (float)val));
      break;

    case VP2P_WINDGUST:
      Serial.print(SensorDataValue(SENSOR_WIND_GUST, packet[3]));
      if (packet[3] != 0)
        Serial.print(SensorDataValue(SENSOR_WIND_GUST_REF, (packet[5] & 0xf0 >> 4)));
      break;

    case VP2P_SOIL_LEAF:
      // no public documentation of the packet type yet
      Serial.print(SensorDataValue(SENSOR_SOIL_LEAF, -1));
      break;

    case VUEP_VCAP:
      val = (packet[3] << 2) | (packet[4] & 0xc0) >> 6;
      Serial.print(SensorDataValue(SENSOR_VCAP, (float)(val / 100.0)));
      break;

    case VUEP_VSOLAR:
      val = (packet[3] << 2) | (packet[4] & 0xc0) >> 6;
      Serial.print(SensorDataValue(SENSOR_VSOLAR, val));

HCS

#22
Zitat von: habeIchVergessen am 17 November 2015, 18:20:12
OK VALUES DAVIS 0 Channel:3 RSSI:-81 Battery:ok WindSpeed:0 WindDirection:-36 TemperatureOutside:55.90

Wohnst Du im Death Valley?  ;D

Du musst die einzelnen Readings mit Komma trennen:
OK VALUES DAVIS 0 Channel:3, RSSI:-81, Battery:ok, WindSpeed:0, WindDirection:-36, TemperatureOutside:55.90

habeIchVergessen

kein Problem. Ich hätte das Komma für Wertelisten zurückgehalten. z.B.

OK VALUES DAVIS 0 Channel:1 RSSI:-75 Battery:ok WindSpeed:3 WindDirection:-58,-60


OK VALUES DAVIS 0 Channel:1, RSSI:-75, Battery:ok, WindSpeed:3, WindDirection:-58
OK VALUES DAVIS 0 Channel:2, RSSI:-76, Battery:ok, WindSpeed:2, WindDirection:-58, Rain:42
OK VALUES DAVIS 0 Channel:3, RSSI:-76, Battery:ok, WindSpeed:1, WindDirection:-58, RainSecs:31
OK VALUES DAVIS 0 Channel:4, RSSI:-75, Battery:ok, WindSpeed:1, WindDirection:-58, TemperatureOutside:55.60
OK VALUES DAVIS 0 Channel:0, RSSI:-75, Battery:ok, WindSpeed:0, WindDirection:-58, WindGust:6, WindGustRef:9
OK VALUES DAVIS 0 Channel:1, RSSI:-75, Battery:ok, WindSpeed:0, WindDirection:-57, Rain:42
OK VALUES DAVIS 0 Channel:2, RSSI:-75, Battery:ok, WindSpeed:0, WindDirection:-57, RainSecs:31
OK VALUES DAVIS 0 Channel:3, RSSI:-75, Battery:ok, WindSpeed:0, WindDirection:-57, TemperatureOutside:55.60
OK VALUES DAVIS 0 Channel:4, RSSI:-76, Battery:ok, WindSpeed:0, WindDirection:-57, Humidity:90.00


anbei die aktualisierte Header-Datei.
Sketch muss jetzt wissen, ob ein Trennzeichen geschrieben werden muss.


  Serial.print(SensorDataHeader(PROGNAME, id));

  Serial.print(SensorDataValue(SENSOR_CHANNEL, rd->channel));
  Serial.print(SensorDataValueDelimiter(SENSOR_RSSI, -rd->rssi));
  Serial.print(SensorDataValueDelimiter(SENSOR_BATTERY_STATUS, (char*)(packet[0] & 0x8 ? "err" : "ok")));

HCS

#24
So, hier der erste Anlauf.

Testen kann man es z.B. mit
set myJeeLink parse OK VALUES DAVIS 0 Channel:3, RSSI:-81, Battery:ok, WindSpeed:0, WindDirection:-36, TemperatureOutside:55.90

Wenn man das zwei mal absetzt, bekommt man per AutoCreate das device und ein FileLog und sollte dann auch Werte sehen.

Das Modul kann manuell so definiert werden:
define myDavis KeyValueProtocol DAVIS 0

define <Name> KeyValueProtocol <Type> <ID>
wobei <Type> und <ID> den ersten beiden Angaben entspricht, was der Sketch sendet.

Aktuell noch ohne die Dictionary Umsetzung.
Da ist mir aber ein Gedanke dazu gekommen: evtl. wäre es praktisch, wenn das Dictionary nicht vom Sketch sondern vom Anwender in einem Attribut definiert wird. Dann kann jeder selbst bestimmen, wie die Readings heißen sollen und ist nicht den Sketch-Ersteller ausgeliefert.

Der Sketch könnte eine noch verständliche Kurzform senden (oder alternativ auch die Langversion):
OK VALUES DAVIS 0 C:3 R:-81 B:ok WS:0 WD:-36 TO:55.90

Aus beidem (kurz oder lang) könnte der Anwender dann die Readings machen, die er wirklich will, evtl. sogar so, dass dann nur die entstehen, für die er ein Mapping gemacht hat.

Er würde also in diesem Beispiel in das Attribut "Readings" das hier "WS:WindSpeed,WD:WindDirection,TO:Temperature" eintragen und nur die drei readings bekommen.

habeIchVergessen

noch ein Vorschlag

zu Analysezwecken
OK DIAG DAVIS PacketRawData:37-a5-65-ce-49-22-b9-c3-04-f7

und für ein Discover von Device-IDs
OK DISCOVER DAVIS 0 RSSI:-75

HCS

Zitat von: habeIchVergessen am 17 November 2015, 23:53:33
zu Analysezwecken
OK DIAG DAVIS PacketRawData:37-a5-65-ce-49-22-b9-c3-04-f7
Sende doch einfach "OK VALUES DavisDiag 0 PacketRawData:37-a5-65-ce-49-22-b9-c3-04-f7"

Zitat von: habeIchVergessen am 17 November 2015, 23:53:33
und für ein Discover von Device-IDs
OK DISCOVER DAVIS 0 RSSI:-75
Sinngemäß

habeIchVergessen

#27
Zitat von: HCS am 17 November 2015, 23:49:20
Der Sketch könnte eine noch verständliche Kurzform senden (oder alternativ auch die Langversion):

warum nicht gleich die Version mit den IDs, die für alle in der Header-Datei als Referenz abgelegt sind? Oder durch ein XSLT/oder noch nicht beschriebene Alternative den Perl- und Sketch-Code (Header-Datei) generieren lassen?
Dann müssen nur die Kompilate zusammen passen.

Kann bei der Initialisierung eines Modules so eine Mapping-Liste von außen übergeben werden, die dann das generierte Default-Mapping (s.o.) ersetzt?

Noch eine Frage zur Initialisierung. Bei Davis gibt es nur 8 Device-IDs. Zusätzlich wird ein Frequenz-Hopping genutzt, das für jede ID unterschiedlich lange Sendeintervalle hat. Somit muss ständig berechnet werden, auf welcher Frequenz das nächste Gerät senden wird. Deshalb ist der Sketch zur Zeit so aufgebaut, dass er über die serielle Eingabe konfiguriert werden muss (ID und Device-Typ). Gibt es dafür auch Mechanismen in FHEM?

HCS

Das ist der erste Anlauf, der nun Stück für Stück ausgebaut wird.
Perl oder Sketch Code generieren und verwenden ist mir definitiv zu speziell weil nur für diesen Anwendungsfall hier.

Der Sketch könnte das Mapping senden (optional, wenn er will) so dass das Attribut erst mal automatisch entsteht, und der Anwender es, wenn er will, dann anpassen kann.

Oder mal so formuliert: ich will keine Speziallösung für Davis bauen sondern eine universelle, die auch für das LaCrosseGateway und andere Sketches funktioniert, ohne denen neue Zwänge aufzuerlegen.

HCS

Zitat von: habeIchVergessen am 18 November 2015, 00:06:57Deshalb ist der Sketch zur Zeit so aufgebaut, dass er über die serielle Eingabe konfiguriert werden muss (ID und Device-Typ). Gibt es dafür auch Mechanismen in FHEM?
Ja, die InitCommands im JeeLink Modul. Die werden nach dem Öffnen der Schnittstelle an den Sketch gesendet.
Siehe LaCrosse Sketch.