Hallo Zusammen,
ich habe zu dem Thema schon einen Haufen Einträge gefunden und probiere hier auch schon eine Stunde rum, aber ich komme einfach nicht drauf.
Ich möchte einfach nur den Reading state der zur Zeit "temperature: 50.375" beinhaltet in eine eigenes Reading umwandeln, z.B. measured_temp und als Inhalt "50.4°C" wiedergeben.
Habe schon mit stateFormat und userReadings rumprobiert und ein bisschen in Perl mit "split" rumgepfuscht aber bin auf keinen grünen Zweig gekommen
Hi,
zwei Punkte vorab.
Bitte immer ein "list" des Devices (in code tags), keine Screenshots (siehe Unbedingt vor dem ersten Post lesen (https://forum.fhem.de/index.php/topic,71806.0.html))
Es kommt immer gut, wenn du deine (erfolglosen) Versuche und ihr Ergebnis postest.
Zu deinem Problem: Das kann man z.B. so lösen:
attr PufferUnten userReadings temp {sprintf("%.1f",ReadingsNum($name,"state",0))}
Hallo, danke für den Hinweis und für den Vorschlag. Leider funktioniert er nicht.
Internals:
NAME PufferUnten
NR 38
STATE temperature: 49.875
TYPE dummy
Readings:
2017-06-01 21:29:02 state temperature: 49.875
Attributes:
room Heizung
userReadings temp {sprintf("%.1f",ReadingsNum($name,"state",0))}
Es handelt sich um einen dummy!
Wo kommt also der Wert aus state her?
Ich nehme an der Wert wird durch notify "TempChange" gespeist?
Warum also nicht von dort aus runden und gleich in das richtige Reading schreiben?
Gruß
Dan
userreadings werden erst gesetzt, wenn ein Event kommt... bei dir war das offensichtlich um 21:29 das letzte Mal der Fall, also vor deiner Änderung.
Ansonsten hat DeeSPe natürlich recht... Die Frage wäre aber: Ist der Dummy überhaupt notwendig? Oder könnte man die (gerundete) Temperatur gleich im Original-Device setzen?
Danke euch für die Hinweise. Ich hab euch die entscheidenden Infos anscheinend vorenthalten. Ich hab die Zusammenhänge noch nicht ganz verinnerlicht.
Der Wert wird über Fhem2Fhem aus meiner Fhem-Instanz am Spitzboden ausgelesen. Das ganze funktioniert jetzt auch nach euren Angaben.
Ich werde mir über das Wochenende mal eure Vorschläge zur Vereinfachung überlegen und mich wieder melden.
Gesendet von meinem Nexus 5 mit Tapatalk
Guten Tag
und Danke für den Tip oben.
Das funktioniert ja prima, aber
wie bitte schön kommt man denn an den Wert von Down ?
ReadingsNum mag ja wohl nur den ersten Wert hergeben.
Internals:
CFGFN
CHANGED
NAME FB_Link
NR 685
STATE Up: 2170 Down: 5630
TYPE dummy
READINGS:
2018-01-24 15:06:03 Down 0.0
2018-01-24 15:06:03 Up 2170.0
2018-01-24 15:06:03 state Up: 2170 Down: 5630
Attributes:
event-on-change-reading .*
room BinDa,Check
userReadings Up {sprintf("%.1f",ReadingsNum($name,"state",0))},Down {sprintf("%.1f",ReadingsNum($name,"state:Down",0))}
my @val = split(/ /, ReadingsVal($name, "state", 0) );
=> $val[0] enthält nun "Up:", $val[1] 2170, $val[2] "Down:" und $val[3] 5630
Ich bedanke mich zahlreich für den Tip.
Ich habe das jetzt so gelöst:
Internals:
CFGFN
DEF FB_Link {
my @val = split(/ /, ReadingsVal("FB_Link", "state", 0) );;
fhem("attr FB_Link userReadings Down {sprintf($val[3])},Up {sprintf($val[1])}");;
}
NAME nFB_Link
NOTIFYDEV FB_Link
NR 2638
NTFY_ORDER 50-nFB_Link
REGEXP FB_Link
STATE 2018-01-24 18:22:03
TYPE notify
READINGS:
2018-01-24 18:21:38 state active
Attributes:
room BinDa
Internals:
CFGFN
NAME FB_Link
NR 685
STATE Up: 2189 Down: 5630
TYPE dummy
READINGS:
2018-01-24 18:24:04 Down 5630
2018-01-24 18:24:04 Up 2189
2018-01-24 18:24:04 state Up: 2189 Down: 5630
Attributes:
room BinDa,Check
userReadings Down {sprintf(5630)},Up {sprintf(2189)}
Ich bin mir ziemlich sicher, dass nun ein echter Crack mir einen Code hinstellt und sagt: so hättest Du das einfacher lösen können.
Ich bin mir ebenso sicher, dass ich das so gemacht hätte, wenn ich das Know-How gehabt hätte.
Seht es mir bitte nach, ich wusste es nicht besser.
Nochmals Danke schön für die Hilfe.
Zitat von: Ralph am 24 Januar 2018, 18:32:52
Ich bedanke mich zahlreich für den Tip.
Ich habe das jetzt so gelöst:
Internals:
CFGFN
DEF FB_Link {
my @val = split(/ /, ReadingsVal("FB_Link", "state", 0) );;
fhem("attr FB_Link userReadings Down {sprintf($val[3])},Up {sprintf($val[1])}");;
}
NAME nFB_Link
NOTIFYDEV FB_Link
NR 2638
NTFY_ORDER 50-nFB_Link
REGEXP FB_Link
STATE 2018-01-24 18:22:03
TYPE notify
READINGS:
2018-01-24 18:21:38 state active
Attributes:
room BinDa
Internals:
CFGFN
NAME FB_Link
NR 685
STATE Up: 2189 Down: 5630
TYPE dummy
READINGS:
2018-01-24 18:24:04 Down 5630
2018-01-24 18:24:04 Up 2189
2018-01-24 18:24:04 state Up: 2189 Down: 5630
Attributes:
room BinDa,Check
userReadings Down {sprintf(5630)},Up {sprintf(2189)}
Ich bin mir ziemlich sicher, dass nun ein echter Crack mir einen Code hinstellt und sagt: so hättest Du das einfacher lösen können.
Ich bin mir ebenso sicher, dass ich das so gemacht hätte, wenn ich das Know-How gehabt hätte.
Seht es mir bitte nach, ich wusste es nicht besser.
Nochmals Danke schön für die Hilfe.
Per notify das Attribut userReadings setzen ist völliger Quatsch!
Warum setzt Du Dir das nicht gleich als userReadings?
Gruß
Dan
Zitat von: DeeSPe am 24 Januar 2018, 18:35:15
Warum setzt Du Dir das nicht gleich als userReadings?
Warum ich das tat, das schrieb ich schon oben.
Du darfst den Beweis antreten, dass Due es besser weißt und kannst.
Ungefähr so (ungetestet):
attr FB_Link userReadings Up {if (ReadingsVal($NAME,"state","")=~/^Up:.(\d{1,})/){$1}}, Down {if (ReadingsVal($NAME,"state","")=~/^Up:.\d{1,}.Down:.(\d{1,})$/){$1}}
EDIT:
Noch kürzer:
attr FB_Link userReadings Up {if (ReadingsVal($NAME,"state","")=~/^Up:.(\d{1,})/){$1}}, Down {if (ReadingsVal($NAME,"state","")=~/Down:.(\d{1,})$/){$1}}
Gruß
Dan
Zitat von: DeeSPe am 24 Januar 2018, 20:17:27
Ungefähr so (ungetestet)
Nicht ungefähr, sondern ganz genau so. PERFEKT !
Und - ganz klar - ich stand schon immer mit diesen Hyroglyphen auf Kriegsfuß und hätte das nie so hingekriegt.
Insofern ein doppeltes Dankeschön.
Hallo,
ich stehe gerade bei einem sehr ähnlichen Thema an....
ich habe eine neue Bosch Waschmaschine und die liefert die Restdauer des Waschvorgangs (via Homeconnect) in Sekunden aber sie schreibt dann hinten noch den Text "seconds" dazu.
Ich habe nun gelesen das es mit Split oder so möglich sein kann diesen Text zu entfernen.
Hat jemand eine Idee?
Reading der Maschine:
BSH.Common.Option.RemainingProgramTime 1380 seconds
mein Userreading:
Stunden { ReadingsVal("Waschi","BSH.Common.Option.RemainingProgramTime",0)/3600;; }
Leider kommt nix an, und ich vermute eben wegen dem Zusatz "seconds" im String.
Bitte um Hilfe, danke.
LG
KOAL
Das habe ich bereits gelesen, aber nicht verstanden:
https://forum.fhem.de/index.php?topic=55005.0
https://forum.fhem.de/index.php?topic=72933.0
https://forum.fhem.de/index.php?topic=72685.0
https://forum.fhem.de/index.php?topic=30900.0
...dann nimm doch ReadingsNum...
Und setze ggf. einen trigger, damit das nur berechnet wird, wenn sich was relevantes ereignet:
Stunden:.*RemainingProgramTime.* { ReadingsVal($name,'BSH.Common.Option.RemainingProgramTime',0)/3600}
DANKE!
Geht, der Wert kommt an
LG
KOAL