[gelöst]Auslesen aller vorhandener Readings eines Geräts

Begonnen von Oliver1985, 30 April 2021, 18:56:32

Vorheriges Thema - Nächstes Thema

Oliver1985

Hallo zusammen,

ich wüsste gern wie ich alle Readings eines Geräts auslesen und dann damit weiterarbeiten kann.

Konkret geht es um alle Alarme, die in Alexa gespeichert sind. Diese IDs befinden sich dann auch als Reading im Device. Simples Ziel ist es, dass alle vorhandenen Alarme restlos entfernt werden. Dazu brauche ich jedoch die ID des Alarms. Bevor ich nun in einer Zählschleife einfach hochzähle und prüfe, ob dort eine ID existiert oder nicht, wollte ich die Fragestellung mal an euch weitergeben:

Die lese ich alle Readings eines Devices in ein Array ein? Oder alternativ:
Wieso mag FHEM den folgende Befehl nicht: set ECHO_G090U610915314JA notifications_delete Alarm_.*

Vielen Dank im Voraus :)

PS: Am nähsten dran kam ich mit einer ReadingsGroup = .*:alarm.*_id
Leider weiß ich aber dann immer noch nicht, wie ich die Werte in eine Variable bekomme...


KernSani

Hi Namensvetter,

zunächst mal: Bitte immer ein List des devices, Screenshots schaut sich niemand an. Dann wäre auch allen klar, dass es sich um ein echodevice-Gerät handelt.

Zitat von: Oliver1985 am 30 April 2021, 18:56:32
Konkret geht es um alle Alarme, die in Alexa gespeichert sind. Diese IDs befinden sich dann auch als Reading im Device. Simples Ziel ist es, dass alle vorhandenen Alarme restlos entfernt werden. Dazu brauche ich jedoch die ID des Alarms. Bevor ich nun in einer Zählschleife einfach hochzähle und prüfe, ob dort eine ID existiert oder nicht, wollte ich die Fragestellung mal an euch weitergeben:
Ich fürchte da bleibt dir nichts anderes übrig.

Zitat
Wieso mag FHEM den folgende Befehl nicht: set ECHO_G090U610915314JA notifications_delete Alarm_.*
Was heisst den "mag nicht"? Bei mir stehen in "notifications_delete" nur Reminder drin, keine Alarme (ich habe aber auch keine Alarm-Readings...)

Grüße,

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

Otto123

Hi,

alle Readings eines Devices SD3:
{
my $d="SD3";; 
my @arr = keys %{$defs{$d}->{READINGS}} ;;
return join "\n", @arr
}


Gruß Otto
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

TomLee

#3
ZitatSimples Ziel ist es, dass alle vorhandenen Alarme restlos entfernt werden.

Moin,

mein Ansatz (der muss nicht korrekt sein) die Alarme (sprich Wecker) nach dem stoppen gleich zu löschen.

Nach dem stoppen per Sprache gibts ein Event, bei mir:
OG_Echo_Wohnzimmer alarm_01_status: off

Meine bisherige Lösung nach einmal drüber schlafen ist bestimmt optimierfähig und nur kurz getestet, klappt aber erstmal:

defmod OG_Echo_Wohnzimmer_notify_1 notify OG_Echo_Wohnzimmer:alarm_.._status:.off {\
my $v=substr($EVTPART0,0,8)._id;;\
fhem(qq(set $NAME notifications_delete {(sprintf("fw@".ReadingsVal("$NAME","$v",0)))}))}


Vor dem @ kann stehen was will, das wird beim ausführen des Befehls notifications_delete nicht benötigt, nur die id, deswegen klappt auch
Zitatset ECHO_G090U610915314JA notifications_delete Alarm_.*
nicht, vermute ich.

Gruß

Thomas

Oliver1985

Danke euch beiden.

@Otto123: Funktioniert wunderbar. Das war genau das was ich brauchte. Und: Ich wäre auch niemals drauf gekommen. :-D Ist ja schon nicht mehr ganz so 0-8-15... (...und Verstehen tue ich es auch nicht, aber dies werde ich irgendwann mal autodidaktisch in Erfahrung bringen, wenn die Zeit es zulässt ;-)

@TomLee: Danke auf für deinen Ansatz. Ich hatte nicht erwähnt, dass das Ziel ist, dass gesetzte Alarme von einer anderen Logik abgeschaltet werden soll. Daher gibt es in meinem Use-Case leider keinen Stop-Sprachbefehl, welcher ausgewertet werden kann. Dennoch: Der Hinweis, dass überhaupt ein Event dabei ausgelöst wird, ist eine sehr gute Info! Sicher nützt diese noch an anderer Stelle :)

Ich schließe das Thema.

Oliver1985

@Oli: Auch an dich ein Dankeschön. Ich nahm an, dass ein "list" hier keinen Mehrwert erbringen würde. Nächstes Mal hänge ich es an :)

TomLee

#6
Danke für das wieder öffnen.

Vlt. war "noch etwas beitragen" falsch ausgedrückt, eine Frage hätte ich noch was denn der Unterschied zu einem Sprachbefehl sein soll der den Wecker stoppt oder eine andere "Logik", meiner Verständnis nach sollte es das alarm_.._status: off Event doch auch dann in echodevice geben und mit dem gezeigten notify die entsprechenden Readings gelöscht werden ?

Oliver1985

Hallo Thomas,

Wenn ich deinen Lösungsansatz richtig verstanden habe, löscht dieser jeden Alarm korrekt aus Alexa, sobald dieser gestoppt wurde.
Was ich brauche ist folgendes: Ich drücke einen HueSmartButton und dieser entfernt alle existierenden Alarme.

Und deshalb habe ich kein Event auf welches ich reagieren könnte.

TomLee

Ok, danke, verstanden.

da ich nicht mal einen Wecker nutze (an dem hab ich das nachvollzogen), frag ich mich aber dennoch jetzt was für eine Funktion du denn nutzt das es die alarm_.*-Readings gibt ?

Oliver1985

Die Alarme werden automatisch erzeugt, wenn ich schlafen gehe. Dort werden dann, sobald ich im Bett liege (Stromverbrauchmessung Handyladekabel) Wecker-ATs wie folgt gestellt:
fhem "define WakeupAlarm at +08:$min:00 set $echoDev volume 30;; set $echoDev alarm_normal now";
fhem "define WakeupAlarm at +08:${minp10}:00 set $echoDev volume 40;; set $echoDev alarm_normal now";
fhem "define WakeupAlarm at +08:${minp20}:00 set $echoDev volume 50;; set $echoDev alarm_normal now";


Wenn ich dann Snoozen möchte, sage ich immer "Alexa Stop", wobei die anderen Alarme dann noch vorhanden bleiben.
Es gab nun öfters mal den Fall, dass ich dann aber einen Tag frei hatte und liegen bleiben wollte und zwar ohne, dass die anderen noch definierten Wecker mich wachschütteln. Daher möchte ich nun meinen HueSmartButton, welcher ohnehin auf der Nachtkonsole liegt, bei aktivem Alarm in einen "Delete all and leave me alone"-button umwandeln^^. Um die Funktion erstellen zu können, musste ich aber irgendwie an die Alarm-IDs kommen, da ich diese sonst nicht stoppen/entfernen kann.

Nun, da ich weiß wie ich an die IDs herankomme, kann ich die ganze Funktion sogar noch weiter verbessern, da ich dann von den ATs definitiv abstand nehmen werde und auf Echo-interne Wecker umsteige, damit ich die "Alexa, wann klingelt der Wecker"-Frage stellen kann.


TomLee

Eine weitere Frage, woher hast das mit dem now, in der Doku steht das nicht ?

Oliver1985

Habe ich einfach ausprobiert, da die Angabe eines Werts obligatorisch gewesen ist. Habe es soeben nochmal gegengeprüft. Du kannst auch "kikeriki" da reinschreiben... Das Gerät bimmelt dann trotzdem^^

Oliver1985

Hey Thomas,

aus irgendeinem Grund bin mit meiner "set DEVICENAME notifications_delete ID-ONLY"-Idee gescheitert. Der Befehlt wurde einfach ignoriert. Auf der Suche nach einer Lösung bin ich über einen anderen Forumbeitrag von dir gestoplert und habe mich an deiner sprintf-fw@-Variante bedient:

my $d="ECHO_G090U610915314JA";
my @arr = keys %{$defs{$d}->{READINGS}};

foreach my $m (@arr){
if ($m =~ m/^alarm.*_id$/){
fhem "set $d notifications_delete ".(sprintf("fw@".ReadingsVal($d,$m,"")));
}
}
fhem "deletereading $d alarm_.*";


ZitatVor dem @ kann stehen was will, das wird beim ausführen des Befehls notifications_delete nicht benötigt, nur die id
Ich nahm an, dass "nur die id" auch erlauben würde, dass man das @ gänzlich weglässt,... Er scheint aber benötigt zu werden (plus irgendwas zusätzliches anderes davor, genau wie du sagtest).
Ist der Grund für dieses Phänomen bekannt?

LG, Oliver

TomLee

ZitatIst der Grund für dieses Phänomen bekannt?

Hab keine Ahnung warum und weshalb.
Ich find den Beitrag nicht mehr ( ist schon einige Zeit her ) in dem mir entweder Michael.Winkler oder Markus M. die sprintf-Variante gezeigt hat.

Und allgemein zum Fhem-Befehl, hier:
fhem "set $d notifications_delete ".(sprintf("fw@".ReadingsVal($d,$m,"")))
Den du aus dem anderen Forumbeitrag (wie dort vermutlich gezeigt) ohne Klammern übernommen hast, hat mir vor kurzem irgendwer gesagt (oder hab ichs einfach nur irgendwo gelesen), das man das vermeiden soll (ohne Klammern), darum hab ich in #3 das Beispiel mit Klammern gezeigt.