Teil eines Readings extrahieren und formatieren

Begonnen von Thomas0401, 24 Januar 2021, 14:09:46

Vorheriges Thema - Nächstes Thema

Thomas0401

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

betateilchen

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?
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

Thomas0401

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

betateilchen

#3
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

--
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

Thomas0401

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:~ $



betateilchen

Ich habe schon verstanden was Du möchtest.
Und mein Codeschnipsel oben, macht aus der Rückgabe 4 readings in Deinem device.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

Thomas0401

Ok dann habe ich es nicht begriffen wo ich diesen Schnipsel genau einfügen bw. was ich im Code ersetzen soll  ;)

betateilchen

#7
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");;\
  }\
}
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

Thomas0401

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

betateilchen

#9
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.


--
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

Thomas0401

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?

betateilchen

#11
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
}\


--
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

Thomas0401

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?

betateilchen

Klar, könnte man das auch entfernen, aber wieso stört denn die Angabe der zugehörigen Einheit beim Reading?


--
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

Thomas0401