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
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
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?
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.
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
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)
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!
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
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 (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?
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
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?
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/ (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
Prima, vielen Dank...jedenfalls gehe ich heute mit vielen neuen Erkenntnissen ins Bett ;D