Status eines device ändern ohne notify zu triggern

Begonnen von Pati_Alpha, 26 Oktober 2016, 11:20:36

Vorheriges Thema - Nächstes Thema

Pati_Alpha

Hallo,

ich habe für meinen Mac Mini einen dummy definiert und führe die entsprechenden wake/sleep Befehle per notify aus:
define MacMini dummy
attr MacMini alias Mac Mini
attr MacMini group Geräte
attr MacMini room Homekit,Wohnzimmer
attr MacMini setList on off

define MacMiniNote notify MacMini {\
if ( Value ("MacMini") eq "on") {system "wakeonlan -i 192.168.0.10 -p 9 11:22:33:44:55:66"}\
else {system "ssh 192.168.0.10 -l User osascript -e \\\'tell application \\\"System Events\\\" to sleep\\\'"}\
}

(die MAC und IP habe ich hier im Beispiel geändert)

Ich habe vorher auch das WOL-Modul getestet, das Dumme ist aber, dass der Mini auch im Sleep-Zustand auf Pings reagiert, weswegen das WOL-Modul ihn immer als "an" anzeigt.

Jetzt ist aber das Problem, dass ich trotzdem einen check einbauen will, ob der Mini an ist oder nicht.
Ich habe dazu ein kleines Tool auf dem Mini installiert und zwei Skripte geschrieben, die dann wenn er in den Sleep-Modus geht bzw. aufwacht auf FHEM einen Befehl ausführen können (im Moment noch zum Test "set SofaLampe on/off"), somit würde der Status des devices AKTIV vom Mac aus gesetzt, was funktionieren sollte!

Das Problem ist nun folgendes:
Setze ich das device "MacMini" per "setstate" vom Mac aus auf an/aus wird es (besonders in HomeKit) nicht aktualisiert und auch im Webinterface nur wenn ich die Seite neu lade.
Setze ich das device "MacMini" allerdings per "setreading" auf an/aus (was bei Schaltern gut klappt) triggers es in diesem Fall das notify und der wake/sleep Befehl wird ausgeführt. Bei wake ist es nicht schlimm, dann empfängt der Mac einfach nur ein MagicPaket und gut ist, aber bei sleep weckt ihn der Schlafbefehl erst wieder auf um ihn dann wieder schlafen zu lassen und das ist Käse.

Ich suche als eine Möglichkeit ein Device:

  • mit zwei separaten Kommandozeilenbefehlen für on/off steuern zu können
  • mit "setreading" (oder vergleichbarem) von "außen" auf on/off setzen zu können, OHNE dass die Befehle ausgeführt werden

Das SELBE Problem habe ich auch bei ein paar Geräten die ich über Infrarot über LIRC steuere mit zwei Befehlen über jeweils ein Notify wenn ich nun möchte, dass LIRC das reading des jeweiligen Devices ändert, falls es entsprechende Infrarotbefehle empfängt. :/

Hat dazu jemand eine Idee?

Viele Grüße! :)

Ellert


marvin78

Entweder du löst ein Event aus oder nicht. Da gibt es tatsächlich nur 1 oder 0.

Ich würde setstate verwenden und ein refresh damit verknüpfen.

Pati_Alpha

Eilert: "readingsSingleUpdate" sieht gut aus, aber wie nutze ich es? Wenn ich es versuche irgendwo einzubinden bekomme ich nur "unknown command".

Ich fürchte das Frontend aktualisieren bringt auch nichts, das ist zwar das gleiche wie ein Neuladen der Seite, aktualisiert dann aber nicht den Status in HomeKit wie das zB bei einem "setReading" passiert.

Marvin: Das mit dem "1 oder 0" habe ich mir schon so gedacht, aber daher habe ich das Problem ja so ausführlich beschrieben. Falls das wirklich so ist suche ich wohl zB einen anderen weg um zB ein device mit zwei unterschiedlichen Kommandozeilenbefehlen an/aus zu schalten, denn dann könnte ich das wiederum (wie bei einem normalen Schalter) ohne ein notify machen und damit "setreading" benutzen, ohne dass eine Aktion ausgeführt wird.
Gibt es vielleicht eine Möglichkeit im notify einzubauen, dass er es ignoriert, falls der Befehl vom telnet her stammt oder so?

marvin78

Der einzige Weg, der mir einfällt ist, das notify per

set NOTIFYNAME inactive

zu deaktiveren und nach deinem setreading wieder zu aktivieren. Somit gibt es ein Event, das aber das notify nicht auslöst.

So könnte das aussehen

set NOTIFYNAME inactive;sleep 0.1;setreading DEVICE READING WERT;sleep 0.1;set NOTIFYNAME active

Ggf. auch ohne sleeps.

BTW: readingsSingleUpdate ist eine Perl-Funktion aus fhem.pl. Was sie macht, siehst du dort oder auch im Wiki im Developer-Bereich.

Pati_Alpha

#5
Das könnte doch gut gehen! Wird sofort ausprobiert!! :)

EDIT:
Yes!! Mein Held!! :)

Ich habe es nur leicht angepasst:
set Notify inactive ;; setreading MacMini state $EVENT ;; set Notify active

Die sleeps brauchte ich nicht und ich musste ";;" statt ";" zwischen die Kommandos setzen (wo ist eigentlich der Unterschied?).

Vielen vielen Dank!! :)
Ich fühl mich zwar damit, als hätte ich irgendwie für das Ganze die allerkomplizierteste Lösung genutzt und es ginge vielleicht auch in 2 Zeilen (ist wenn ich zB MATLAB programmiere oft so :P), aber es ist blitzschnell, funktioniert super und ist verständlich programmiert! :)

marvin78

Es ist ja nur eine Zeile und es ist, wie ich denke, die einzige Lösung.

Mein Code war für den DEF Bereich. Bitte nicht die Config direkt editieren.