BulkUpdate auch über telnet/Kommando verfügbar?

Begonnen von mumpitzstuff, 16 Juli 2023, 13:01:27

Vorheriges Thema - Nächstes Thema

mumpitzstuff

Soweit ich das sehen konnte besteht aktuell nicht die Möglichkeit ein Bulk Update von Readings über telnet oder als Komando zu übergeben. Falls die Annahme richtig sein sollte, besteht eventuell die Möglichkeit das nachzurüsten?

So in etwa:
perl /opt/fhem/fhem.pl 7072 'readingsbeginupdate <hash>; readingsbulkupdate <hash> <device> <reading> x; readingsendupdate <hash> 1;'
Der telnet use case würde dann ähnlich aussehen.

Hintergrund:
Manchmal werden externe Programme aufgerufen, die dann wiederum von außen Werte an FHEM übergeben. Das "scheint" aktuell nur über setreading zu funktionieren, was bei mehreren Werten aber schnell ineffizient wird.

Dr. Boris Neubert

Hallo,

es sind ja schon sehr spezielle Anwendungsfälle, die die gewünschte Funktionalität erfordern. Und in der angegebenen Form benötigt der Anwender schon Kenntnisse der Interna von FHEM. Wäre es da nicht einfacher, eine Perl-Funktion zu schreiben, die das Benötigte leistet, und diese in dem Kommando aufzurufen?

sub setreadings() {
  my ($devicename, %readingvaluepairs)= @_;
  ...
}

Viele Grüße
Boris
Globaler Moderator, Developer, aktives Mitglied des FHEM e.V. (Marketing, Verwaltung)
Bitte keine unaufgeforderten privaten Nachrichten!

rudolfkoenig

Oder man ruft readingsBeginUpdate(),etc mit etwas Escape-Akrobatik direkt in einem Perl-Ausdruck auf.

betateilchen

Zitat von: Dr. Boris Neubert am 16 Juli 2023, 13:37:07Wäre es da nicht einfacher, eine Perl-Funktion zu schreiben, die das Benötigte leistet, und diese in dem Kommando aufzurufen?

Beim Aufruf eines Kommandos (im Sinne eine FHEM Befehls) ist es halt recht aufwändig, einen hash zu übergeben. Die Idee mit einer entsprechenden Funktion könnte ich mir gut vorstellen.

Weiter gedacht: eine Funktion "setBulkReadings($devicename, %readingvaluepairs, $doTrigger)" könnte ich mir gut in der 99_Utils.pm vorstellen.

Andererseits: mit json2reading() steht in der fhem.pl ja bereits eine einfach zu verwendende Funktion zur Verfügung, mit der man mehrere readings auf einmal erzeugen kann.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

mumpitzstuff

Zitat von: betateilchen am 16 Juli 2023, 17:57:27
Zitat von: Dr. Boris Neubert am 16 Juli 2023, 13:37:07Wäre es da nicht einfacher, eine Perl-Funktion zu schreiben, die das Benötigte leistet, und diese in dem Kommando aufzurufen?

Beim Aufruf eines Kommandos (im Sinne eine FHEM Befehls) ist es halt recht aufwändig, einen hash zu übergeben. Die Idee mit einer entsprechenden Funktion könnte ich mir gut vorstellen.

Weiter gedacht: eine Funktion "setBulkReadings($devicename, %readingvaluepairs, $doTrigger)" könnte ich mir gut in der 99_Utils.pm vorstellen.

Andererseits: mit json2reading() steht in der fhem.pl ja bereits eine einfach zu verwendende Funktion zur Verfügung, mit der man mehrere readings auf einmal erzeugen kann.

Die Funktion war mir bisher nicht bekannt, aber ich glaube diese Funktion könnte ich auch nicht einfach von außen aufrufen und auch nur über eine Anwenderfunktion schleifen. Oder täusche ich mich da?

mumpitzstuff

Zitat von: Dr. Boris Neubert am 16 Juli 2023, 13:37:07Hallo,

es sind ja schon sehr spezielle Anwendungsfälle, die die gewünschte Funktionalität erfordern. Und in der angegebenen Form benötigt der Anwender schon Kenntnisse der Interna von FHEM. Wäre es da nicht einfacher, eine Perl-Funktion zu schreiben, die das Benötigte leistet, und diese in dem Kommando aufzurufen?

sub setreadings() {
  my ($devicename, %readingvaluepairs)= @_;
  ...
}

Viele Grüße
Boris

Hmm okay stimmt. Da könnte man etwas generelles draus basteln. Mir war nicht klar, das ich Userfunktionen direkt von außen aufrufen kann...

rudolfkoenig

ZitatMir war nicht klar, das ich Userfunktionen direkt von außen aufrufen kann...
Ueber HTTP kann man genau das aufrufen, was man von einem notify/at/etc.
Beispiel:
http://localhost:8083/fhem&cmd={Log 1,"Hello"}&XHR=1&fwcsrf=...

Ich wuerde den Weg ueber MQTT + JSON gehen.
Das ist portabel und effizient.

mumpitzstuff

Sieht gut aus. Danke. Damit experimentiere ich mal etwas.