Einfache Angabe von Reading-Values in notify Commands

Begonnen von Markus Bloch, 18 Juni 2015, 23:01:02

Vorheriges Thema - Nächstes Thema

rudolfkoenig

Es zaehlt mein Beitrag #17 vom 22 Juni 2015, 20:32: die erwaehnten Punkte werden bis featurelevel 5.6 inklusive unterstuetzt.

Das mit device:reading:regexp habe ich nicht kapiert.

Damian

#31
Zitat von: rudolfkoenig am 23 Juni 2015, 19:37:37
Mit featurelevel 5.7 hagelt es z.Zt. an Fehler wie
Useless use of a constant ("Shuffle") in void context

Nach einem Umbau, der den eval immer mit {} ausfuehrt, scheint es mit der ref($x) eq "HASH" Pruefung zu funktionieren.
Wuesste ich gerne, wonach perl entscheidet, ob das Ergebnis ein String (return aus dem Codeblock) oder ein HASH sein soll.
Ich fuehle mich weiterhin sehr unwohl mit {}, und bin nicht sicher, dass es bleibt.

Ein Modul oder set Argument abhaengige Evaluirung finde ich falsch, entweder funktioniert es ueberall, oder nirgends.

Ich habe {} zu erst in DOIF für alle FHEM-Befehle als eval eingebaut, das ging nicht lange gut. Daher habe ich es auf  {(...)} innerhalb eines beliebigen Ausdrucks eingeschränkt. Damit gibt es bei über 7000 definierten DOIF-Modulen keine Kompatibilitätsprobleme zum bisherigen FHEM. Es ist zwar nicht so elegant mit den doppelten Klammern, aber eben ohne Nebenwirkungen.

Gruß

Damian
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

rudolfkoenig

Da kommen die ersten Beschwerden wg. {}.
Ich habe eine Weile lang gegruebelt, diesen Artikel wieder durchgelesen, und Damians Loesung {(...)} implementiert.

rudolfkoenig

Gerade aufgefallen: mit {()} (aka ReplaceSetMagic) kann man allowedCommands in bestimmten ausgefallenen Faellen umgehen. Irgendeine elegante Idee, wie wir das verhindern koennen?

Btw. $hash->{CL} wird jetzt auch in set bzw. setreading gesetzt, und ReplaceSetMagic verwendet AnalyzePerlCommand, statt einen direkten eval. Ist aufgefallen, weil {($min)} nicht funktioniert hat.


justme1968

für {} hatten wir eingebaut das es nur geht wenn perl in den allowedCommands steht. entweder verwenden wir das gleiche schlüsselwort oder wir überlegen uns ein neues. ich wäre dafür bei perl zu bleiben.
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

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

rudolfkoenig

Das ist klar, allerdings habe ich an der Stelle kein Zugriff auf das Attribut. $cl zeigt nicht auf die FHEMWEB-Instanz (Server), sondern auf die konkrete Verbindung, und das hat keine Attribute :/

justme1968

achso...

drei ideen:

- ReplaceSetMagic wird nicht in DoSet und CommandSetReading aufgerufen sondern zentral in AnalyzeCommandChain bzw. AnalyzeCommand. da ist $allowed direkt vorhanden. dann würde das {()} auch an anderen stellen wie z.b. get funktionieren. ich weiss nicht ob es unerwünschte nebeneffekte hätte. das ist aber glaube ich die sauberste variante da nirgends auf irgendwelche attribute von unbekannten devices zugegriffen werden muss.

- $allowed wird von AnalyzeCommand als zusätzlicher parameter an alle cmds durchgereicht.

- AnalyzeCommand steckt $allowed in $cl->{'.allowed'}. ich glaube das ist die zweit beste lösung. kein zusätzlicher parameter wie bei 2., keine potentiellen nebeneffekte wie bei 1 aber auch kein {()} in kommandos ausser set und setreading.

- hier standen noch ein paar ideen wie fhemweb $allowed oder die server instanz in den hash für die konkrete verbindung stecken kann. aber 1. oder 3. oben sind sowieso besser.
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

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

rudolfkoenig

Danke, ich habe Vorschlag #3 uebernommen, ich befuerchte #1 kollidiert mit DOIF.
Habe allowedCommands jetzt auch fuer telnet eingefuehrt.

Dabei entdeckt, dass devspec2array AnalyzePerlCommand aufruft, und damit lustige Sachen, wie
Zitatset {exit}
moeglich sind. Damit allowedCommands greift, rufe ich aus fhem.pl devspec2array ab sofort mit $cl auf, es gibt aber noch 26 weitere Module, die devspec2array aufrufen. Daher die Frage: koennten wir dieses Feature in devspec2array bitte abschaffen? Nutzt das jemand?

BioS

Hi zusammen,

in der neuen Funktion ReplaceSetMagic in Featurelevel 5.7 werden die Argumente in einen string ge-joined und zum Schluss wieder per split(" ",...) zu einem Array geteilt.

Ist es Absicht, dass der split() Aufruf whitespaces (und auch newlines etc.) mit entfernt?

Ich habe aktuell das Problem, dass ein paar User meines Moduls 70_Jabber.pm sich per "set msg ... text\n text2 \n text3" schicken lassen und das nun seit neuestem zu einem one-liner wird.

Könnte man in der Funktion ReplaceSetMagic  split(/ /, $a, $nsplit) anstatt split(" "...) benutzen?
Damit lässt er eventuell vorhandene whitespaces so wie am Anfang auch drin.

Grüße
Heiko
FHEM auf Debian in ESXi5 VM
Homematic mit HMLAN
Raspi mit Pilight für Relais der Heizung

rudolfkoenig

Habe den Vorschlag uebernommen. Weiterhin wird der alte Parametersatz zurueckgeliefert (d.h. kein split durchgefuehrt), falls keine Ersetzung stattgefunden ist.

viegener

@Rudi et al: Sorry wenn ich das hier nochmal hochhole, aber ich war gerade auf der Suche nach einer Funktion um elegant auf dem Server für das Tablet UI auch Ersetzungen (Readings etc) durchzuführen (siehe hier --> http://forum.fhem.de/index.php/topic,43110.0.html). Dazu würde ich einfach gerne ReplaceSetMagic verwenden, um nicht das Rad neu erfinden zu müssen.

Gibt es Gründe ReplaceSetMagic nicht in eigenen Modulen einzusetzen?

Generische Anschlussfrage, wäre es nicht hilfreich eine Art von Library der für Modulentwickler zur Verfügung stehenden Funktionen zu machen, um eine Art API-Beschreibung für Modulentwickler zu haben, oder habe ich das nur nicht gefunden.

Johannes
Kein Support über PM - Anfragen gerne im Forum - Damit auch andere profitieren und helfen können

betateilchen

Zitat von: viegener am 08 Februar 2016, 22:42:26
eine Art von Library der für Modulentwickler zur Verfügung stehenden Funktionen zu machen

Die Library nennt sich fhem.pl und wer noch mehr braucht, findet weitere nützliche Funktionen in der 99_Utils.pm :)
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

viegener

Zitat von: betateilchen am 08 Februar 2016, 22:53:18
Die Library nennt sich fhem.pl und wer noch mehr braucht, findet weitere nützliche Funktionen in der 99_Utils.pm :)
Das finde ich jetzt weder witzig noch hilfreich, aber vielleicht fehlt mir ja der entsprechende Tiefgang
Kein Support über PM - Anfragen gerne im Forum - Damit auch andere profitieren und helfen können

rudolfkoenig

@Johannes: Ich bin in deinem Fall bei ReplaceSetMagic unsicher: du willst damit ein mit PHP vergleichbares Konzept umsetzen. Ob ReplaceSetMagic dem gewachsen ist, weiss ich nicht. Falls du ReplaceSetMagic deswegen staendig anpassen muesstest, dann waere es falsch, sie zu verwenden. Wenn sie dir passt, so wie sie ist: nur zu.

Falls du Lust hast, die zur Verfuegung stehenden Funktionen zu dokumentieren: nur zu. Ich werde mir keine neue Baustelle aufmachen, ich habe einfach zu viele offen. Ich beantworte aber gerne Fragen, soweit ich es kann.

betateilchen

Zitat von: viegener am 09 Februar 2016, 01:18:04
Das finde ich jetzt weder witzig

Das war von mir auch in keinster Weise witzig gemeint, sondern mein voller Ernst.

Wo sonst - ausser in der fhem.pl - willst Du fhem-spezifische Funktionen finden, die man als Entwickler in eigenen Modulen verwenden kann?
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!