Hauptmenü

Regex im notify

Begonnen von SSSleep, 11 November 2015, 15:33:33

Vorheriges Thema - Nächstes Thema

SSSleep

Hallo,

Ich möchte ein Dezimalkomma durch einen Punkt ersetzen. Kann man die Regex s/,/\./ im notify direkt auf der fhem-Ebene ausführen, oder muss man dafür auf Perl wechseln? Mein notify sollte in etwa so ausehen:

Zitat
define Temperatur_Komma dummy
define Temperatur_Punkt dummy
define temp notify Temperatur_Komma set Temperatur_Punkt $EVENT=~ s/,/\./ 

Meine Syntax ist noch nicht richtig, aber ich finde kein Beispiel, wie ich das Event substituiert an den zweiten dummy übergeben kann.

Vielen  Dank

justme1968

das geht nur auf perl ebene.

aber warum kopierst du überhaupt readings von einem dummy in den nächsten.

schau dir stateFormat und setreading und readingsProxy an. es ist fast nie nötig mehr als einen dummy zu verwenden. und meistens ist sogar der überflüssig.

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

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

SSSleep

Weil ich nicht verstehe, wie die Module ihre Informationen untereinander austauschen. Wenn ich zum Beispiel ein

set Temperatur_Komma 21,6

setze, möchte ich sicherstellen, dass von meinem Wert erst das Komma durch einen Punkt ersetzt wird, bevor andere Module darauf zugreifen.

(Wobei der set-Befehl nur ein Beispiel für ein html-Befehl ist, sonst könnte ich ja direkt 21.6 schreiben.)

Zitatschau dir stateFormat und setreading und readingsProxy an.

Ich tue mir trotz intensiven Lesens tatsächlich schwer, die einzelnen Funktionsweisen zu verstehen. Falls du einen besseren Ansatz hast, könntest du mir die grobe Vorgehensweise erklären?
Ich bin soweit, dass ich einem dummy auch ein reading hinzufügen kann. Um beim obigen Beispiel zu bleiben, würde dann mein dummy folgende Erweiterung bekommen:

define Temperatur_Komma dummy
attr Temperatur_Komma readingList Temperatur_Punkt


aber wie beeinflusse ich nun das reading und sorge zugleich dafür, dass es von den anderen Modulen erst dann gelesen ist, wenn ich es aktualisiert habe?



justme1968

ich glaube dein ansatz ist nicht ganz richtig. in einem reading sollte immer ein sinnvoller wert stehen. für dezimalzahlen wird in fhem der punkt  verwendet. nicht das komma. d.h. der wert der gesetzt wird sollte schon gar kein komma enthalten. ein reading an sich kannst du normalerweise nicht beeinflussen. nur zusätzlich z.b. per user reading ein zusätzliches anders formatiertes erzeugen.

wenn du bestimmte randbedingungen für den wertebereich hast nimm eines der fhemwidgets wie drop down, slider oder knob um vorzugeben was eingestellt werden kann. freitext eingabe ist ziemlich sicher nicht sinnvoll.

normalerweise deshalb weil reading jeweils dem device gehören. nicht dem anwender. eine ausnahme ist vielleicht readingProxy. hier kannst du über die setFn oder valueFn einfluss nehmen.

set ist kein html befehl sondern ein fhem befehl. und ja: in dem beispiel ist es eben genau sinnvoller 21.6 statt 21,6 zu schreiben.

ein event wird ausgelöst sobald der wert per set oder setreading gesetzt wird.

vielleicht beschreibst du mal ganz allgemein was du vor hast.
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

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

SSSleep

Hallo,

ich fürchte du hast mich nicht verstanden. Ja, fhem verwenden den Punkt als Dezimaltrenner, deswegen stelle ich ja hier die Frage, wie ich aus dem gegeben Komma ein Punkt machen kann.

Zitatset ist kein html befehl sondern ein fhem befehl. und ja: in dem beispiel ist es eben genau sinnvoller 21.6 statt 21,6 zu schreiben.

Ich habe ein Inernetdevice. Dieses setzt zyklisch folgendenHTML(get) request ab:
GET /fhem?cmd=set%20Temperatur1%2020,6&XHR=1 HTTP/1.0

Damit wird der state des dummis Temperatur1 auf die aktuelle Temperatur gesetzt (hier 20,6). Nun habe ich eben leider ein "," welches ich in fhem und für fhem in einen "." wandeln muss.

Diesen Wert möchte ich dann beispielsweise im Modul Treshold verwenden:
define Heizung_Regler THRESHOLD Temperatur1:state:0.3:10.0 Heizung|set @ off|set @ on|1|aus:an

Klappt natürlich so nicht, weil das Modul einen Punkt will und durch das Komma ganzzahlig rundet. Also suche ich nach eine Zwischeninstanz,in die ich den Punkt-korrigierten Zahlenwert schreiben kann. Von dort kann er dann vom Modul Threshold ausgelesen werden:

define temp notify Temperatur1 set Temperatur_Punkt $EVENT=~ s/,/\./  <-- ist nur eine Idee um via Substitution das Komma zu ersetzen
define Heizung_Regler THRESHOLD Temperatur_Punkt:state:0.3:10.0 Heizung|set @ off|set @ on|1|aus:an









betateilchen

define temp notify Temperatur_Komma set Temperatur_Punkt $EVENT=~ s/,/\./

Das hier kann schon deshalb nicht funktionieren, weil Deine regexp bereits Teil eines perl-Codings ist und nicht mehr fhem. Und wenn Du schon mit perl arbeitest, solltest Du es auch möglichst richtig machen.

Probier doch mal sowas:

define temp notify Temperatur_Komma {my $e = $EVENT;; $e =~ s/,/\./;; CommandSet(undef, "Temperatur_Punkt $e");; }

(Hab ich aus dem Kopf hingetippt und noch nicht selbst getestet)
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

SSSleep

ZitatDas hier kann schon deshalb nicht funktionieren, weil Deine regexp bereits Teil eines perl-Codings ist und nicht mehr fhem. Und wenn Du schon mit perl arbeitest, solltest Du es auch möglichst richtig machen.

vielen Dank...das war ja meine ursprüngliche Frage, ob Regex auch auf der Fhem Ebene gehen:
ZitatHallo,

Ich möchte ein Dezimalkomma durch einen Punkt ersetzen. Kann man die Regex s/,/\./ im notify direkt auf der fhem-Ebene ausführen, oder muss man dafür auf Perl wechseln? Mein notify sollte in etwa so ausehen:

wobei Justme mir die Antwort ja gegeben hat:

Zitatdas geht nur auf perl ebene.

aber warum kopierst du überhaupt readings von einem dummy in den nächsten.

..und dann war mir nicht klar, ob mein Vorgehen so ideal ist:-)

Vielen Dank, mit zwei dummys und dem notify läuft es!

justme1968

hast du die url die dein device verwendet unter kontrolle? dann würde ich hier ansetzen und das kommando so anpassen das gleich das richtige format verwendet wird. du kannst in die url auch direkt perl code mit einbauen.

alternativ schau dir readingsProxy an. da kannst du die setFn so bauen das gleich der richtige wert gesetzt wird. z.b. so:define xxx readingsProxy xxx:temperature
attr xxx setFn {$ARGS=~s/,/./;;fhem("setreading $DEVICE temperature $ARGS");; return undef}
attr xxx setList temperature


du kannst dann direkt set xxx temperature 21,6 verwenden und das reading temperature wird auf  21.6 gesetzt.

das spart zwei devices.

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

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

SSSleep

Zitathast du die url die dein device verwendet unter kontrolle? dann würde ich hier ansetzen und das kommando so anpassen das gleich das richtige format verwendet wird. du kannst in die url auch direkt perl code mit einbauen.

Grundsätzlich ja, nur gerade komme ich nicht dran und brauchte eben eine Lösung über Fhem.

Ich hatte hier schon einmal gefragt, wie man es am saubersten angeht, die Daten via HTML in fhem zu bekommen:

http://forum.fhem.de/index.php/topic,43309.msg352891.html#msg352891

Könntst du das mit dem Perl Code in der URL noch etwas ausführen? Vielleicht könnte ich die Werte ja in ein Reading schreiben?


justme1968

du kannst z.b. auch so etwas in url verwenden:{my $t='26,1';;$t=~s/,/./;;fhem("setreading xxx temperature $t")}bzw. url encodedhttp://localhost:8083/fhem?cmd=%7Bmy%20%24t%3D%2726%2C1%27%3B%3B%24t%3D~s%2F%2C%2F.%2F%3B%3Bfhem(%22setreading%20xxx%20temperature%20%24t%22)%7D&XHR=1

das schaut zwar schrecklich aus, spart aber eben zwei devices pro gerät.

aber auf dem ESP8266 hast du doch volle kontrolle über den code. warum erzeigst du nicht gleich einen wert mit punkt statt komma.

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

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

SSSleep

Zitataber auf dem ESP8266 hast du doch volle kontrolle über den code. warum erzeigst du nicht gleich einen wert mit punkt statt komma.

na, weil ich gerade nicht an das device  dran komme...werde es aber nachholen. Du sagst in ein Reading schreiben, ist der elegantere Weg?

Könnte ich auch zwei Readings mit ein und demselben "set reading" Befehl setzen?

Wie erzeugst du diese url encoded schreibweise?

justme1968

#11
ob es elegant ist ist vielleicht geschmacksache. aber ein dummy statt zwei plus notify ist auf jeden fall sehr viel besser.

die encodierte url bekommst du z.b. hier mit: http://meyerweb.com/eric/tools/dencoder/.

wenn du mehr als das eine reading auf ein mal setzen willst schau dir das readingsProxy beispiel von oben an. den code kannst du etwas abwandeln und in einem set z.b. temperatur und humidity auf zwei readings aufteilen:define xxx readingsProxy xxx:temperature
attr xxx setFn {$ARGS=~s/,/./;; my @l = split(' ', $ARGS);; fhem("setreading $DEVICE temperature $l[0];;setreading $DEVICE humidity $l[1]");; return undef}
attr xxx setList values

ein set xxx values 21,6 50 setzt dann temperature auf 21.5 und humidity auf 50.

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

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

SSSleep

Prima, vielen Dank...jedenfalls gehe ich heute mit vielen neuen Erkenntnissen ins Bett ;D