Teil eines Readings auslesen und formatieren

Begonnen von z0lt1, 01 Juni 2017, 21:29:10

Vorheriges Thema - Nächstes Thema

z0lt1

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

KernSani

Hi,


zwei Punkte vorab.
Bitte immer ein "list" des Devices (in code tags), keine Screenshots (siehe Unbedingt vor dem ersten Post lesen)
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))}


RasPi: RFXTRX, HM, zigbee2mqtt, mySensors, JeeLink, miLight, squeezbox, Alexa, Siri, ...

z0lt1

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))}

DeeSPe

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
MAINTAINER: 22_HOMEMODE, 98_Hyperion, 98_FileLogConvert, 98_serviced

Als kleine Unterstützung für meine Programmierungen könnt ihr mir gerne einen Kaffee spendieren: https://buymeacoff.ee/DeeSPe

KernSani

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?
RasPi: RFXTRX, HM, zigbee2mqtt, mySensors, JeeLink, miLight, squeezbox, Alexa, Siri, ...

z0lt1

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


Ralph

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))}
FHEM auf RaspberryPi3 mit Geekworm USV und SignalDUINO 433MHz und HM-MOD-RPI-PCB mit 3 HM-Sec-SD-2, 5 FHT, 2 RM 100-2 Uni S, 2 HMS100, 6 CUL_WS, 6 CUL_FHTTK, 11 FS20 und 7 FS20V Spannungsüberwachungen

nils_

my @val = split(/ /, ReadingsVal($name, "state", 0) );
=> $val[0] enthält nun "Up:", $val[1] 2170, $val[2] "Down:" und $val[3] 5630
viele Wege in FHEM es gibt!

Ralph

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.
FHEM auf RaspberryPi3 mit Geekworm USV und SignalDUINO 433MHz und HM-MOD-RPI-PCB mit 3 HM-Sec-SD-2, 5 FHT, 2 RM 100-2 Uni S, 2 HMS100, 6 CUL_WS, 6 CUL_FHTTK, 11 FS20 und 7 FS20V Spannungsüberwachungen

DeeSPe

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
MAINTAINER: 22_HOMEMODE, 98_Hyperion, 98_FileLogConvert, 98_serviced

Als kleine Unterstützung für meine Programmierungen könnt ihr mir gerne einen Kaffee spendieren: https://buymeacoff.ee/DeeSPe

Ralph

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.
FHEM auf RaspberryPi3 mit Geekworm USV und SignalDUINO 433MHz und HM-MOD-RPI-PCB mit 3 HM-Sec-SD-2, 5 FHT, 2 RM 100-2 Uni S, 2 HMS100, 6 CUL_WS, 6 CUL_FHTTK, 11 FS20 und 7 FS20V Spannungsüberwachungen

DeeSPe

#11
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
MAINTAINER: 22_HOMEMODE, 98_Hyperion, 98_FileLogConvert, 98_serviced

Als kleine Unterstützung für meine Programmierungen könnt ihr mir gerne einen Kaffee spendieren: https://buymeacoff.ee/DeeSPe

Ralph

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.
FHEM auf RaspberryPi3 mit Geekworm USV und SignalDUINO 433MHz und HM-MOD-RPI-PCB mit 3 HM-Sec-SD-2, 5 FHT, 2 RM 100-2 Uni S, 2 HMS100, 6 CUL_WS, 6 CUL_FHTTK, 11 FS20 und 7 FS20V Spannungsüberwachungen

KOAL

#13
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
1X DEBAIN 11 ESXI VM, Openvpn-Server, FHEM, DHCP, HM-LAN W, USB-Enocean, Smartvisu V3.X
1X UBUNU 20.X LTS ESXI VM, AUTO-SERVER, Openvpn-Backup Server
1X UBUNU 20.X LTS ESXI VM, MAILSERVER, CLOUD
1X Lockerstor 4, NAS + APC CS650
1X WIN-10 ESXI VM, BLUEIRIS CAM Server

Beta-User

...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}
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: ZigBee2mqtt, MiLight@ESP-GW, BT@OpenMQTTGw | ZWave | SIGNALduino | MapleCUN | RHASSPY
svn: u.a Weekday-&RandomTimer, Twilight,  div. attrTemplate-files, MySensors