FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: Thomas0401 am 24 Januar 2021, 14:09:46

Titel: Teil eines Readings extrahieren und formatieren
Beitrag von: Thomas0401 am 24 Januar 2021, 14:09:46
Hallo,

in einem dummy wird über ein notify ein Reading erzeugt. Dieses Readin beinhaltet 4 "Einträge", 2 dieser "Einträge" würde ich gerne als gesonderte Readings haben wollen. Ich weiss das man das über userReadings hinbekommen kann aber absolut keine Ahnung wie.

statuses


Vacuum Status: STATE_DOCKED
Battery: 100%
Fan Speed: max
Water Level: ultrahigh


Hat jemand eine Idee


VG Thomas
Titel: Antw:Teil eines Readings auslesen und formatieren
Beitrag von: betateilchen am 24 Januar 2021, 14:14:48
Zitat von: Thomas0401 am 24 Januar 2021, 14:09:46
in einem dummy wird über ein notify ein Reading erzeugt. Dieses Readin beinhaltet 4 "Einträge", 2 dieser "Einträge" würde ich gerne als gesonderte Readings haben wollen.

Wieso können die gewünschten readings nicht direkt im notify erzeugt werden?
Wie sieht denn das notify aus?
Titel: Antw:Teil eines Readings extrahieren und formatieren
Beitrag von: Thomas0401 am 24 Januar 2021, 14:39:00
Das Gerät ist ein Saugroboter und funktioniert über eine Cloudlösung. Bei der Abfrage "statuses" gibt der Bot diese 4 Werte komplett an

{my $botcmd = (split ' ',ReadingsVal("DeebotOzmo950","state",0))[1];;my $result = qx "sudo deebotozmo $botcmd &";; fhem("setreading DeebotOzmo950 $botcmd $result");;}
Titel: Antw:Teil eines Readings extrahieren und formatieren
Beitrag von: betateilchen am 24 Januar 2021, 15:01:03
Ersetze mal den letzten Teil Deines Codes (fhem(setreading...) durch


  foreach my $line (split("\n",$result)){
    next unless $line;
    my ($r,$v) = split(":",$line);
$r =~s/\ /_/g;
fhem("setreading DeebotOzmo950 $r $v");
  }


Schöner wäre es allerdings, den kompletten Ausführungsteil in Deinem notify in die 99_myUtils.pm auszulagern.

EDIT: korrekten deviceName in den Code eingefügt

--
Titel: Antw:Teil eines Readings extrahieren und formatieren
Beitrag von: Thomas0401 am 24 Januar 2021, 16:39:53
Ich habe völlig falsch beschrieben.

Dieses notify erzeugt auf dem Pi einen "List-Befehl" und eine Auswahl auf dem dummy z.B.

set DeebotOzmo950 05_Systeminfos statuses

und das kommt dann von dem Pi bzw. an den dummy

pi@PI-FHEM:~ $ sudo deebotozmo statuses
Vacuum Status: STATE_DOCKED
Battery: 100%
Fan Speed: max
Water Level: ultrahigh
pi@PI-FHEM:~ $


Titel: Antw:Teil eines Readings extrahieren und formatieren
Beitrag von: betateilchen am 24 Januar 2021, 16:51:27
Ich habe schon verstanden was Du möchtest.
Und mein Codeschnipsel oben, macht aus der Rückgabe 4 readings in Deinem device.
Titel: Antw:Teil eines Readings extrahieren und formatieren
Beitrag von: Thomas0401 am 24 Januar 2021, 17:00:29
Ok dann habe ich es nicht begriffen wo ich diesen Schnipsel genau einfügen bw. was ich im Code ersetzen soll  ;)
Titel: Antw:Teil eines Readings extrahieren und formatieren
Beitrag von: betateilchen am 24 Januar 2021, 17:07:18
Der Code gehört in Dein notify.

Hier die raw definition. Die erste Zeile musst Du natürlich mit den Werten aus Deinem bestehenden notify anpassen,
Du hast ja immer noch nicht Dein vollständiges notify gepostet.


defmod testNotify notify BLA:BLUB {\
  my $botcmd = (split ' ',ReadingsVal("DeebotOzmo950","state",0))[1];;\
  my $result = qx "sudo deebotozmo $botcmd &";;\
  foreach my $line (split("\n",$result)){\
    next unless $line;;\
    my ($r,$v) = split(":",$line);;\
    $r =~s/\ /_/g;;\
    fhem("setreading DeebotOzmo950 $r $v");;\
  }\
}
Titel: Antw:Teil eines Readings extrahieren und formatieren
Beitrag von: Thomas0401 am 24 Januar 2021, 17:28:02
so ist das original

defmod DeebotOzmo950_Cmd05 notify DeebotOzmo950:05_Systeminfos.* {my $botcmd = (split ' ',ReadingsVal("DeebotOzmo950","state",0))[1];;;;my $result = qx "sudo deebotozmo $botcmd &";;;; fhem("setreading DeebotOzmo950 $botcmd $result");;;;}
Titel: Antw:Teil eines Readings extrahieren und formatieren
Beitrag von: betateilchen am 24 Januar 2021, 17:30:29
Zitat von: betateilchen am 24 Januar 2021, 17:07:18
Die erste Zeile musst Du natürlich mit den Werten aus Deinem bestehenden notify anpassen,

Was ist denn daran so schwer?


defmod DeebotOzmo950_Cmd05 notify DeebotOzmo950:05_Systeminfos.*  {\
  my $botcmd = (split ' ',ReadingsVal("DeebotOzmo950","state",0))[1];;\
  my $result = qx "sudo deebotozmo $botcmd &";;\
  foreach my $line (split("\n",$result)){\
    next unless $line;;\
    my ($r,$v) = split(":",$line);;\
    $r =~s/\ /_/g;;\
    fhem("setreading DeebotOzmo950 $r $v");;\
  }\
}


Probier doch einfach mal aus, was man Dir vorschlägt.


--
Titel: Antw:Teil eines Readings extrahieren und formatieren
Beitrag von: Thomas0401 am 24 Januar 2021, 17:34:53
Hast ja recht, Westfalen sind manchmal etwas Stur ;D


Hat aber geklappt und funktioniert. Ist immer schwierig am Anfang für Anfänger. Gibt es was was Du empfehlen kannst wo man Perl usw. vernünftig erlenen kann?
Titel: Antw:Teil eines Readings extrahieren und formatieren
Beitrag von: betateilchen am 24 Januar 2021, 17:42:13
Zitat von: Thomas0401 am 24 Januar 2021, 17:34:53
Gibt es was was Du empfehlen kannst wo man Perl usw. vernünftig erlenen kann?

Naja, perl Tutorials gibt es jede Menge im Internet. Welches einem am besten weiterhilft, ist persönliche Geschmackssache.

Lass mich raten, Du möchtest verstehen, was mein Codeschnipsel macht und warum es funktioniert? Guter Plan...  8)


foreach my $line (split("\n",$result)){\       # der Rückgabewert wird zeilenweise verarbeitet
    next unless $line;;\                       # Leerzeilen werden übersprungen
    my ($r,$v) = split(":",$line);;\           # der Zeileninhalt wird am Doppelpunkt in readingName und readingValue geteilt
    $r =~s/\ /_/g;;\                           # im readingName werden Leerzeichen durch Unterstriche ersetzt, sonst funktioniert es nicht
    fhem("setreading DeebotOzmo950 $r $v");;\  # das reading wird gesetzt
}\


--
Titel: Antw:Teil eines Readings extrahieren und formatieren
Beitrag von: Thomas0401 am 24 Januar 2021, 17:55:55
Ja genau, immer abschreiben oder kopieren bringt auf Dauer keinen Spaß.

Der Wert des Readings "Battery" wird in % angezeigt, gibt es die Möglichkeit das auch zu löschen bzw. nicht anzeigen zu lassen?
Titel: Antw:Teil eines Readings extrahieren und formatieren
Beitrag von: betateilchen am 24 Januar 2021, 18:15:51
Klar, könnte man das auch entfernen, aber wieso stört denn die Angabe der zugehörigen Einheit beim Reading?


--
Titel: Antw:Teil eines Readings extrahieren und formatieren
Beitrag von: Thomas0401 am 24 Januar 2021, 18:31:20
Ja es stört im FTUI,
Titel: Antw:Teil eines Readings extrahieren und formatieren
Beitrag von: betateilchen am 24 Januar 2021, 18:34:35
$v =~s/%$// if $r eq 'Battery';

und wo das hingehört, findest Du sicher selbst raus :)

--
Titel: Antw:Teil eines Readings extrahieren und formatieren
Beitrag von: Thomas0401 am 24 Januar 2021, 18:52:25
Nicht so ganz



na gut, doch gefunden

Vielen Dank für deine tolle Hilfe

VG Thomas