FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: z0lt1 am 01 Juni 2017, 21:29:10

Titel: Teil eines Readings auslesen und formatieren
Beitrag von: z0lt1 am 01 Juni 2017, 21:29:10
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
Titel: Antw:Teil eines Readings auslesen und formatieren
Beitrag von: KernSani am 01 Juni 2017, 22:11:25
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))}


Titel: Antw:Teil eines Readings auslesen und formatieren
Beitrag von: z0lt1 am 01 Juni 2017, 22:42:27
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))}
Titel: Antw:Teil eines Readings auslesen und formatieren
Beitrag von: DeeSPe am 01 Juni 2017, 22:46:13
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
Titel: Antw:Teil eines Readings auslesen und formatieren
Beitrag von: KernSani am 01 Juni 2017, 23:06:35
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?
Titel: Antw:Teil eines Readings auslesen und formatieren
Beitrag von: z0lt1 am 02 Juni 2017, 08:24:32
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

Titel: Antw:Teil eines Readings auslesen und formatieren
Beitrag von: Ralph am 24 Januar 2018, 15:13:29
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))}
Titel: Antw:Teil eines Readings auslesen und formatieren
Beitrag von: nils_ am 24 Januar 2018, 16:23:51
my @val = split(/ /, ReadingsVal($name, "state", 0) );
=> $val[0] enthält nun "Up:", $val[1] 2170, $val[2] "Down:" und $val[3] 5630
Titel: Antw:Teil eines Readings auslesen und formatieren
Beitrag 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.
Titel: Antw:Teil eines Readings auslesen und formatieren
Beitrag von: DeeSPe am 24 Januar 2018, 18:35:15
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
Titel: Antw:Teil eines Readings auslesen und formatieren
Beitrag von: Ralph am 24 Januar 2018, 19:35:53
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.
Titel: Antw:Teil eines Readings auslesen und formatieren
Beitrag von: DeeSPe am 24 Januar 2018, 20:17:27
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
Titel: Antw:Teil eines Readings auslesen und formatieren
Beitrag von: Ralph am 24 Januar 2018, 21:13:00
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.
Titel: Antw:Teil eines Readings auslesen und formatieren
Beitrag von: KOAL am 15 Oktober 2021, 22:32:03
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
Titel: Antw:Teil eines Readings auslesen und formatieren
Beitrag von: Beta-User am 15 Oktober 2021, 22:42:54
...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}
Titel: Antw:Teil eines Readings auslesen und formatieren
Beitrag von: KOAL am 15 Oktober 2021, 22:56:24
DANKE!

Geht, der Wert kommt an


LG
KOAL