UBus: Unterschied zwischen den Versionen

Aus FHEMWiki
(Example: network.device status)
(→‎network: network.interface.<name> status)
Zeile 81: Zeile 81:


Hier werden zuerst mit <code>FHEM::UBUS_CALL::DefaultReadings($RAW)</code> die Standard-Readings erzeugt. Jedes Reading, das _statistics_ enthält, wird dann durch zwei andere Readings ersetzt, eines für den Gesamtwert, eines für die Änderung seit dem letzten Aufruf.
Hier werden zuerst mit <code>FHEM::UBUS_CALL::DefaultReadings($RAW)</code> die Standard-Readings erzeugt. Jedes Reading, das _statistics_ enthält, wird dann durch zwei andere Readings ersetzt, eines für den Gesamtwert, eines für die Änderung seit dem letzten Aufruf.
==== network.interface.<name> status ====
Um z.B. den Status des Interface <code>lan</code> abzufragen, dient der Aufruf
define <name> UBUS_CALL network.interface.lan status
Es können auch mehrere Interfaces abgefragt werden:
define <name> UBUS_CALL network.interface.lan,network.interface.wan status
Damit bei dieser Form der Abfrage die Readings von den verschiedenen Interfaces nicht gegenseitig überschrieben werden, bietet es sich an, den Namen des Interface als Präfix zu übergeben. Das Attribut <code>readings</code> sähe dann wie folgt aus:
attr <name> readings {\
  my $p = $MODULE =~ s/network.interface.//r;;\
  return FHEM::UBUS_CALL::DefaultReadings($RAW, $p . '_');;\
}

Version vom 19. Februar 2022, 16:37 Uhr


Clock - Under Construction.svg An dieser Seite wird momentan noch gearbeitet.


Die Module UBUS_CLIENT und UBUS_CALL dienen der Kommunikation mit Geräten, die über eine uBus-Schnittstelle verfügen. Mittels UBUS_CLIENT wird die Verbindung zu einem solchen Gerät hergestellt. Über UBUS_CALL wird ein Funktionsaufruf (bzw. eine Reihe von Funktionsaufrufen) an das Gerät gesendet und die Antwort in Readings ausgewertet.

UBUS_CLIENT - Modul zur Kommunikation mit uBus

UBUS_CLIENT
Zweck / Funktion
Einbinden von Geräten, die über die uBus Schnittstelle kommunizieren
Allgemein
Typ Gerätemodul
Details
Dokumentation EN / DE
Support (Forum) Sonstige Systeme
Modulname 72_UBUS_CLIENT.pm
Ersteller xenos1984 (Forum / Wiki)
Wichtig: sofern vorhanden, gilt im Zweifel immer die (englische) Beschreibung in der commandref!


Je nach Gerät kann die uBus-Schnittstelle über Websocket oder über HTTP freigegeben sein.

Kommunikation über Websocket

Beispiel:

define <name> UBUS_CLIENT ws://192.168.1.1

Kommunikation über HTTP

Beispiel:

define <name> UBUS_CLIENT http://192.168.1.1/ubus

UBUS_CALL - Modul zur Ausführung von uBus-Anfragen

UBUS_CALL
Zweck / Funktion
Senden von "call" Anfragen an Geräte, die über die uBus Schnittstelle kommunizieren
Allgemein
Typ Gerätemodul
Details
Dokumentation EN / DE
Support (Forum) Sonstige Systeme
Modulname 72_UBUS_CALL.pm
Ersteller xenos1984 (Forum / Wiki)
Wichtig: sofern vorhanden, gilt im Zweifel immer die (englische) Beschreibung in der commandref!


Die folgenden Beispiele basieren auf der OpenWRT Dokumentation. Je nach Gerät können andere Funktionsaufrufe implementiert sein. Welche dies sind, zeigen die Readings des UBUS_CLIENT.

network

Siehe network Referenz.

network.device status

Mittels

define <name> UBUS_CALL network.device status

wird der Status aller vorhandenen Netzwerk-Schnittstellen zurückgegeben. Soll nur eine Schnittstelle abgefragt werden, kann der Parameter name übergeben werden:

define <name> UBUS_CALL network.device status name=eth0

Es können auch mehrere Namen angegeben werden:

define <name> UBUS_CALL network.device status name=eth0,eth1

In diesem Fall wird für jede Schnittstelle eine Abfrage durchgeführt. Alternativ kann eine Perl-Funktion benutzt werden:

define <name> UBUS_CALL network.device status name={GetNetworkNames()}

Hierfür sollte die Funktion (im Beispiel GetNetworkNames()) z.B. in der 99_myUtils.pm definiert sein.

Wenn das angesprochene Gerät eine Reihe von *_statistics_* Readings zurückgibt, die angeben, wie viele Bytes über eine Schnittstelle übertragen wurde etc., kann es hilfreich sein, dies in eine Anzahl Bytes seit dem letzten Aufruf umzurechnen. Das kann mit einer eigenen Funktion im Attribut readings erreicht werden:

attr <name> readings {\
  my $r = FHEM::UBUS_CALL::DefaultReadings($RAW);;\
  foreach my $k (grep(/_statistics_/, keys %{$r}))\
  {\
    my $kt = $k . '_total';;\
    my $kr = $k . '_rate';;\
    my $d = $r->{$k} - ReadingsNum($NAME, $kt, 0);;\
    my $t = ReadingsAge($NAME, $kt, 1);;\
    $r->{$kt} = $r->{$k};;\
    $r->{$kr} = $d / $t;;\
    delete $r->{$k};;\
  }\
  $r\
}

Hier werden zuerst mit FHEM::UBUS_CALL::DefaultReadings($RAW) die Standard-Readings erzeugt. Jedes Reading, das _statistics_ enthält, wird dann durch zwei andere Readings ersetzt, eines für den Gesamtwert, eines für die Änderung seit dem letzten Aufruf.

network.interface.<name> status

Um z.B. den Status des Interface lan abzufragen, dient der Aufruf

define <name> UBUS_CALL network.interface.lan status

Es können auch mehrere Interfaces abgefragt werden:

define <name> UBUS_CALL network.interface.lan,network.interface.wan status

Damit bei dieser Form der Abfrage die Readings von den verschiedenen Interfaces nicht gegenseitig überschrieben werden, bietet es sich an, den Namen des Interface als Präfix zu übergeben. Das Attribut readings sähe dann wie folgt aus:

attr <name> readings {\
  my $p = $MODULE =~ s/network.interface.//r;;\
  return FHEM::UBUS_CALL::DefaultReadings($RAW, $p . '_');;\
}