NodeMCU + KeyValueProtocol + FHEM-Modul

Begonnen von habeIchVergessen, 11 Dezember 2015, 22:37:17

Vorheriges Thema - Nächstes Thema

habeIchVergessen

letzte veröffentlichte Version von 36_KVPUDP.pm (08-11-2017)

#############################################################

ich möchte mehr über die Erstellung eines Modules für FHEM lernen.
Dazu habe ich mir folgendes Beispiel ausgesucht:

  • Sketch auf NodeMCU liest alle 60s ein BMP180 aus
  • Daten werden per UDP-Multicast gesendet
  • 00_KVPUDP.pm empfängt die Daten und stellt sie in FHEM zur Verfügung
Leider sind mir noch eingige Sachen unklar bzgl. des FHEM-Modules

  • warum wird als IODev ein JeeLink eingetragen?
  • warum werden keine Daten mehr verarbeitet, wenn Clients gesetzt wird (KeyValueProtocol)?
Vieleicht findet sich ja der ein oder andere Wissende, um mich in die richtige Richtung zu schubsen.

anbei die Sourcen und der Sketch

kurzes Perl-Skript zum Testen ohne Harware

use IO::Socket::Multicast;

# create a new UDP socket ready to read datagrams on port 1100
my $s = IO::Socket::Multicast->new(LocalPort=>1100);

# Set time to live on outgoing multicast packets
$s->mcast_ttl(1);

# Multicast a message to group 225.0.0.1
$s->mcast_send('OK VALUES TEST 0 1=Test,','239.0.0.57:12345');
$s->mcast_send('OK VALUES TEST 0 1=Test,','239.0.0.57:12345');


Empfang ohne FHEM

use IO::Socket::Multicast;

use constant mCastAddr => '239.0.0.57';
use constant mCastPort => '12345';

# create a new UDP socket ready to read datagrams on port 1100
my $s = IO::Socket::Multicast->new
  (
    Domain    => AF_INET,
    Proto     => 'udp',
    LocalPort => mCastPort,
    ReuseAddr => 1,     # true
  );

die "couldn\'t create socket!" if (!defined($s));

# Add a multicast group
$s->mcast_add(mCastAddr) || die "set multicast group failed!";

print "\nrecv from multicast address " .  mCastAddr . ":" . mCastPort . "\n";

# recv a message
while (1) {
        my $data;
        next unless $s->recv($data, 1024);
        print $s->peerhost() . ": " . $data . "\n";
}

justme1968

als IODev wird automatisch das zuletzt definierte passende eingetragen. das kannst du aber per IODev attribut überschreiben. das ganze ist aber nicht für die sende richtung relevant. wenn dein modul nur empfängt ist es egal.

bau ein paar debug meldungen ein um zu sehen wo genau die nachrichten verloren gehen. vor dem empfang? in dispatch? in KeyValueProtocol?

was steht bei verbose 5 im log?

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

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

habeIchVergessen

#2
im phys. Modul muss die FingerprintFn definiert werden, sonst werden alle Nachrichten verworfen, da im Dispatch 2x CheckDuplicate und rejectDuplicate aufgerufen wird (fhem.pl). Ob das ein Bug oder Feature ist, kann ich nicht sagen.

Jedenfalls funktioniert jetzt der Empfang so wie erwartet.

@justme1968: danke

Nachtrag: Log-Auszug inkl. diverser Debug-Ausgaben aus fhem.pl

2015.12.17 20:10:22 3: myKVPUDP: Received 34 bytes from '192.168.10.52''
2015.12.17 20:10:22 3: Dispatch: dispatch 'OK VALUES BMP180 0 1=19.80,2=1018,'
2015.12.17 20:10:22 3: CheckDuplicate: msg 'OK VALUES BMP180 0 1=19.80,2=1018,'
2015.12.17 20:10:22 3: CheckDuplicate: #1
2015.12.17 20:10:22 3: CheckDuplicate: lim=1450379422.21072, TIM=1450379363.50959
2015.12.17 20:10:22 3: computeClientArray
2015.12.17 20:10:22 3: computeClientArray: m=KeyValueProtocol, re=KeyValueProtocol
2015.12.17 20:10:22 3: Dispatch: matched KeyValueProtocol
2015.12.17 20:10:22 3: CheckDuplicate: msg 'OK VALUES BMP180 0 1=19.80,2=1018,'
2015.12.17 20:10:22 3: KeyValueProtocol_Fingerprint: myKVPUDP, OK VALUES BMP180 0 1=19.80,2=1018,
2015.12.17 20:10:22 3: CheckDuplicate: #1
2015.12.17 20:10:22 3: CheckDuplicate: lim=1450379422.27607, TIM=1450379422.71072
2015.12.17 20:10:22 3: Dispatch: reject duplicate


2015.12.17 20:11:22 3: myKVPUDP: Received 34 bytes from '192.168.10.52''
2015.12.17 20:11:22 3: Dispatch: dispatch 'OK VALUES BMP180 0 1=19.80,2=1018,'
2015.12.17 20:11:22 3: CheckDuplicate: msg 'OK VALUES BMP180 0 1=19.80,2=1018,'
2015.12.17 20:11:22 3: CheckDuplicate: #1
2015.12.17 20:11:22 3: CheckDuplicate: lim=1450379482.24323, TIM=1450379422.71072
2015.12.17 20:11:22 3: Dispatch: matched KeyValueProtocol
2015.12.17 20:11:22 3: CheckDuplicate: msg 'OK VALUES BMP180 0 1=19.80,2=1018,'
2015.12.17 20:11:22 3: KeyValueProtocol_Fingerprint: myKVPUDP, OK VALUES BMP180 0 1=19.80,2=1018,
2015.12.17 20:11:22 3: CheckDuplicate: #1
2015.12.17 20:11:22 3: CheckDuplicate: lim=1450379482.24795, TIM=1450379482.74323
2015.12.17 20:11:22 3: Dispatch: reject duplicate

habeIchVergessen

Sketch v0.3

  • OTA via FHEM-Modul eingefügt
  • SoftAP startet automatisch, wenn nicht mit WLAN verbunden
  • WiFi Setup via HTML

36_KVPUDP.pm

  • set raw <peer ip> <cmd list>
  • set flash <peer ip> [filename]

habeIchVergessen

v0.3a

Sketch

  • ESP8266WiFi.waitForConnectResult ausgebaut (Endlosschleife)
  • SoftAP startet auch, wenn Wifi nicht connected ist (hat in v0.3 nicht richtig funktioniert)
FHEM-modul

  • Filter für ChipID eingebaut

habeIchVergessen

Discovery-Mode für Davis Vantage funktionsfähig.
Leider noch keine komplette Unterstützung, da noch keine Lösung für die 2 Interrupt-Implementierungen von Arduino umgesetzt.

Shojo

#6
Moin,

ich spiele aktuell mit deiner "36_KVPUDP.pm".
Kannst Du mir mal erläutern was Du da genau mit deiner Config-Abfrage machst?

PS: Danke fürs sharen!

Gruß
Shojo
FHEM auf: Shuttle PC (x64) (Docker)
Bridge: SignalESP 433mHz, ConBee (deCONZ in Docker)
Rest: ESP8266, SONOFF, Sonos, Echo Dot, Xiaomi Vacuum (root), ESP RGBWW Wifi Led Controller, Node-RED, LEDMatrix, Pixel It

habeIchVergessen

meinst du den HTTP-Request?

my $req = HTTP::Request->new(GET => "http://" . $remote . "/config?Version=&ChipID=&MAC=&Dictionary=");

Da werden SW-Version, ChipID und Dictionary abgefragt.
$remote ist die IP-Adresse aus dem UDP-Multicast-Paket.

Shojo

Ja genau das meinte ich :)

verstehe ich das richtig das Du so optional deine Readings anlegst ?
FHEM auf: Shuttle PC (x64) (Docker)
Bridge: SignalESP 433mHz, ConBee (deCONZ in Docker)
Rest: ESP8266, SONOFF, Sonos, Echo Dot, Xiaomi Vacuum (root), ESP RGBWW Wifi Led Controller, Node-RED, LEDMatrix, Pixel It

justme1968

@Shojo: wofür verwendest du den http rückweg? der sketch kann die daten doch auch von sich aus senden?

und schau mal hier: https://forum.fhem.de/index.php?topic=73623.msg655717#msg655717
vielleicht wäre es gut wenn wir uns alle einigen. auch HCS.
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

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

Shojo

Nutzen tue ich es nicht, wollte nur wissen was seine Idee dahinter ist / war ;)
FHEM auf: Shuttle PC (x64) (Docker)
Bridge: SignalESP 433mHz, ConBee (deCONZ in Docker)
Rest: ESP8266, SONOFF, Sonos, Echo Dot, Xiaomi Vacuum (root), ESP RGBWW Wifi Led Controller, Node-RED, LEDMatrix, Pixel It

habeIchVergessen

Beim Empfang eines UDP-Mulitcast-Paket in FHEM wird die Konfiguration des Absenders aktiv ausgelesen, wenn der Absender
- nicht bekannt ist
- ein entsprechendes Paket gesendet hat (passiert bei jedem Booten vom NodeMCU)

habeIchVergessen


Shojo

Moin,

magst Du in deinen Modul die Paketgröße von 128 auf 512 Byte anheben?
(Zeile 204)
Da ich in einen anderen Projekt mit den 128 Byte nicht mehr klar komme :)   
FHEM auf: Shuttle PC (x64) (Docker)
Bridge: SignalESP 433mHz, ConBee (deCONZ in Docker)
Rest: ESP8266, SONOFF, Sonos, Echo Dot, Xiaomi Vacuum (root), ESP RGBWW Wifi Led Controller, Node-RED, LEDMatrix, Pixel It

habeIchVergessen