Status-Abfrage des Alexa-Geräts

Begonnen von erikr, 29 November 2022, 05:41:47

Vorheriges Thema - Nächstes Thema

erikr

Hallo zusammen,

ab und zu bleibt der Alexa-Prozess hängen, was an einem "Das Geräte XYZ reagiert nicht" nach einem Sprachkommando an Alexa zu erkennen ist. In FHEM zeigt das Alexa-Geräte dann das Icon mit dem A an.

Ich habe alle paar Minuten ein Skript am Laufen, das die korrekte Einstellung der Heizungsthermostate prüft und nachregelt. Dort wollte ich einen Check des Status des Alexa-Geräts unterbringen und dieses bei Bedarf neu starten lassen. Leider ist die Status-Abfrage nicht möglich, aber mit ein paar Handgriffen in der Datei "39_alexa.pm" nachgerüstet.

In der Subroutine "alexa_Get" muss in Zeile 688 der alte Code ...

           my $list = "customSlotTypes:noArg interactionModel:noArg skillId:noArg proxyKey:noArg";

durch ...

           my $list = "customSlotTypes:noArg interactionModel:noArg skillId:noArg proxyKey:noArg status:noArg";

ausgetauscht werden.

Am Ende der If-Abfragen in dieser Subroutine in Zeile 1087 nach diesem Block ...

             } elsif( $cmd eq 'proxyToken' ) {
               my $token = ReadingsVal($name, 'alexaFHEM.bearerToken', undef);

               return alexa_decrypt($token);
             }

dann diesen Code anfügen ...

           elsif( $cmd eq 'status' ) {
               return $hash->{"STATE"};
             }

Anschließend mit "shutdown restart" neu starten und schon kann mit "get alexa status" der korrekte Status abgefragt werden (siehe angehängten Screenshot). Mein Skript macht dann bei allem, was nicht "running" enthält ein "set alexa restart" und schon läuft die Sprachsteuerung wieder.

Würde mich freuen, wenn das Eingang in den Modul-Code findet, damit ich die Änderung nach dem nächsten Update nicht wiederherstellen muss.

Viele Grüße

Erik

MadMax-FHEM

#1
Wozu per get abfragen?

ReadingsVal("alexaDevicename", "alexaFHEM", "") liefert doch genauso das zurück was du im get bekommst...

EDIT: (mag jetzt wieder zu "übergriffig" sein aber trotzdem) warum überhaupt ein Script das alle paar Minuten läuft? Zumindest bei dem alexa-Problem kann man doch ein notify auf das Reading/Event alexaFHEM nehmen und dann "nur" wenn passiert, dass der Status nicht passt darauf reagieren (ansonsten würde es ja erst beim nächsten "Poll" erannt -> ginge also sogar [meist] schneller)...
https://wiki.fhem.de/wiki/Event_monitor -> da kann man sich notify (DOIF/FileLog/...) anlegen lassen: https://wiki.fhem.de/wiki/Event_monitor#Vorgehensweise_beim_Anlegen_eines_Ger.C3.A4tes

Gruß, Joachim
FHEM PI3B+ Bullseye: HM-CFG-USB, 40x HM, ZWave-USB, 13x ZWave, EnOcean-PI, 15x EnOcean, HUE/deCONZ, CO2, ESP-Multisensor, Shelly, alexa-fhem, ...
FHEM PI2 Buster: HM-CFG-USB, 25x HM, ZWave-USB, 4x ZWave, EnOcean-PI, 3x EnOcean, Shelly, ha-bridge, ...
FHEM PI3 Buster (Test)

justme1968

es ist nicht 'normal' das der externe prozess hängen bleibt. du solltest rausfinden was da genau schief geht und die ursache beheben.

fhem ist event basiert. d.h. es ist fast immer der falsche ansatz irgendetwas regelmässig und dann auch noch oft zu tun. erst recht wenn, wie in diesem fall, des modul den tatsächlichen status kennt und sogar in ein reading schreibt. an des zugehörige event hängt man dann ein passendes notify das den restart übernimmt.

was aber eigentlich auch nicht nötig ist weil das modul den externen prozess am laufen halten sollte.

-> finde raus was genau passiert und behebe die tatsächliche ursache

übrigens sollte man immer die werte der entsprechenden readings verwenden und nicht STATE da STATE mit stateFormat überschrieben werden kann und dann nicht mehr das enthält das erwartet wird.
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968