Hallo,
ich habe folgendes vor. Wenn meine Freundin und ich nicht mehr zu Hause sind, soll der MediaPC 15 Minuten später herunter fahren. Man kann bei watchdogs ja nur auf eine Statusänderung prüfen. Der Status der Anwesenheit wird bereits über das PRESENCE Modul erkannt. Der Shut Befehl kann natürlich auch mit einem at Befehl erledigt werden.
Zusätzlich soll der Herunterfahren Befehl natürlich nur ein mal durchgeführt werden (und danach nicht alle 30 Sekunden, wenn das PRESENCE Modul alle 30 Sekunden feststellt, dass keiner da ist und das Notify oder der Watchdog ausgelöst wird). Sobald einer aber wieder nach Hause kommt, soll es natürlich wieder triggern wenn beide das Haus verlassen.
Ich hoffe ich habe mein Ziel klar ausgedrückt. Folgendes habe ich bisher versucht, aber nichts hat bisher so funktioniert wie es soll:
define w_nachhausekommen watchdog meinhandy:absent 00:00:10 meinhandy:present set media shutdown;; #trigger w_nachhausekommen .
attr w_nachhausekommen room Status
define nt_nachhausekommen notify (meinhandy|freundinhandy) {\
if (Value("meinhandy") eq "absent" && Value("freundinhandy") eq "absent"){\
fhem("set media shutdown");;\
}else{\
}\
}
attr nt_nachhausekommen room Status
define w_nachhausekommen watchdog meinhandy:absent 00:00:10 meinhandy:present {\
if (Value("meinhandy") eq "absent" && Value("freundinhandy") eq "absent"){\
fhem("set media shutdown");;\
}else{\
}\
};; trigger w_nachhausekommen .
attr w_nachhausekommen room Status
define nt_nachhausekommenich notify meinhandy {\
if (Value("meinhandy") eq "absent" && Value("freundinhandy") eq "absent"){\
fhem("set media shutdown");;\
}else{\
}\
}
define nt_nachhausekommenich notify freundinhandy {\
if (Value("meinhandy") eq "absent" && Value("freundinhandy") eq "absent"){\
fhem("set media shutdown");;\
}else{\
}\
}
attr nt_nachhausekommen room Status
Hallo,
ZitatIch hoffe ich habe mein Ziel klar ausgedrückt.
Äh :o fast
Ich bin noch am nochmal durchlesen und überlegen.
Ich les besser nochmal was du geschrieben hast.
ZitatFolgendes habe ich bisher versucht,
Na immerhin schon 3 Codes die aber ??? 2-mal auf 2 Handys triggern und einmal - ich gebs auf.
Du willst wenn --
niemand zuhause ist nach 15 Minuten den MediaPC ausschalten?
Das wars?
Und dafür 3 notify - ach ne 2 notify und 1 watchdog.
Sorry aber kannst du
a) deine Anforderung etwas vereinfachen oder
b) einen Ingenieur beauftragen :o
Tut mir leid aber ich zerpflück deine Codes nicht und pass sie an deine Anforderung an.
Macht das bitte jemand hier?
Wenn nicht dann bitte
a) klar formulieren was du WILLST
b) klar formulieren woran du scheiterst und
c) Fehlermeldungen aus dem Logfile - so welche vorhanden sind.
Gn8
Grüße
Ok, kein Problem. Hier in Stichpunkten:
- Person 1 und Person 2 sind zu Hause
- Person 1 verlässt das Haus --> nichts passiert
- Person 2 verlässt auch das Haus (niemand mehr da) --> 15 Minuten später fährt Media PC runter
Die verschiedenen Codesegmente sind einzeln zu betrachten und stellen mehrere Lösungsversuche meinerseits dar. Auf die PRESENCE Codezeilen habe ich verzichtet, da die Prüfung ob jemand ("meinhandy" und "freundinhandy") da (present) oder abwesend (absent) ist funktioniert.
In den Codesegmenten sind auch manchmal nur ein 10sec Timer und manchmal gar kein Timer integriert. War halt zum testen, denn es geht mir hauptsächlich um das auslösen einer Aktion, wenn 2 Parameter auf 2 Devices (in diesem Fall PRESENCE Devices) zutreffen.
Hey,
für ein Codevorschlag fehlt mir leider die Zeit. Aber eine ähliche Idee habe ich schon mal umgesetzt:
Mach doch ein notify auf das Presence Modul. Darin kannst du dann mit if den satutus von dir, deiner Freundin und dem Media Pc abfragen und anschließend ein "define blablabla at +00:15:00 (warum eigentlich mit so einer Verzögerung?) set media off" erzeugen.
Die funktion wird zwar mit jeder Presence- Meldung aufgerufen, aber nur geschaltet wenn ihr weg seid und der Pc an.
pack beide presence in eine structure um zustände zu verknüpfen und häng einen watchdog dahinter um das auslösen 15 minuten zu verzögern.
wenn du nach structure und watchdog (in zusammenhang mit presence) suchst wirst du genau finden was du möchtest.
gruss
andre
Danke für die Antworten, unten steht meine Lösung und sie funktioniert genau so wie ich es mir vorgestellt habe. :)
Die Idee mit der Structure von justme1968 war super! Erst wenn beide PRESENCE Devices den State "absent" annehmen, wird auch der Status der Structure auf "absent" gesetzt. Zusätzlich wird durch das Structureattribut "event-on-change-reading state" der Befehl nur bei der ersten Statusänderung auf "absent" durchgeführt.
Die 15 Minuten sind übrigens da, falls ich alleine zu Hause bin und nur schnell den Müll rausbringe oder ähnliches. ;)
define meinhandy PRESENCE lan-ping 192.168.1.5
attr meinhandy anwesend st_anwesenheit
attr meinhandy event-on-change-reading state
attr meinhandy ping_count 2
attr meinhandy room Status
define freundinhandy PRESENCE lan-ping 192.168.1.6
attr freundinhandy anwesend st_anwesenheit
attr freundinhandy event-on-change-reading state
attr freundinhandy ping_count 2
attr freundinhandy room Status
define st_anwesenheit structure anwesend meinhandy freundinhandy
attr st_anwesenheit event-on-change-reading state
attr st_anwesenheit room Status
define w_nachhausekommen watchdog st_anwesenheit:absent 00:15:00 st_anwesenheit:undefined set media shutdown;; trigger w_nachhausekommen .
attr w_nachhausekommen room Status
Hallo
Möchte bei mir ein Windows 7 Pc runterfahren
habe die fhem um diese Zeilen ergänzt
define wol_mediapc WOL BC:xx:F4:xx:10:xx 192.168.2.110
attr wol_mediapc shutdownCmd sh "/home/pi/shutdown.sh"
attr wol_mediapc webCmd on:off
shudown.sh mit diesen Befehl
#!/bin/sh
sudo net rpc SHUTDOWN -I 192.168.2.110 -U user%pass
Den Rest den Codes habe ich beibehalten
nur diese Zeile angepaßt
st_anwesenheit:undefined set wol_mediapc shutdown;; trigger w_nachhausekommen .
Es passiert nichts der PC fährt nicht runter was ist hier falsch an meinen code?
set wol_mediapc on funktioniert dagegen
Das shutdown per script klappt dagegen
./shutdown.sh
Gruß Inesa
EDIT: Moment mal, versuche mal das, bevor du meinen Text hier drunter probierst:
set wol_mediapc off
Ich habe in meinem Code "shutdown", weil es sich hier um ein XBMC Device handelt. Ein WOL Device wird mit "off" herunter gefahren. Denke hier liegt der Hase im Pfeffer begraben. ;)
Versuch mal:
attr wol_mediapc shutdownCmd "/home/pi/shutdown.sh"
Hier der Auszug aus der Commandref dazu:
attr wol shutdownCmd "/bin/echo "Teatime" > /dev/console" # shell command
Ansonsten würde ich erst mal testen ob folgendes Kommando funktioniert
set wol_mediapc shutdown
Falls das alles nicht funktioniert kann ich mir nur noch Berechtigungsprobleme vorstellen. Dann mal am besten folgendes auf der Kommandozeile zum Test eingeben.
chmod 777 /home/pi/shutdown.sh
Hallo Siggi85,
wenn ich versuche, nach Deinem Vorbild meine Schaltungen zu machen, bekomme ich beim speichern der config folgende Fehlermeldung:
Zitatmeinhandy: unknown attribute anwesend. Type 'attr meinhandy ?' for a detailed list. freundinhandy: unknown attribute anwesend. Type 'attr freundinhandy ?' for a detailed list.
Woran kann das liegen?
Gruß
LinuxQ
Zitat von: linuxq am 15 Mai 2014, 10:22:21
Hallo Siggi85,
wenn ich versuche, nach Deinem Vorbild meine Schaltungen zu machen, bekomme ich beim speichern der config folgende Fehlermeldung:
Woran kann das liegen?
Gruß
LinuxQ
Versuche mal diese Zeilen weg zu lassen. Ich glaube die wird beim Anlegen der Structure auf den zugehörigen Devices generiert.
Falls das nicht funktioniert, melde dich noch mal. Dann gucke ich heute abend zu Hause und kopiere hier noch mal die aktuellen Zeilen aus meiner Config rein. :)
Sehr schönes Beispiel, das ich nachgebaut habe und gut funktioniert.
define Zuhause structure anwesend Bluetooth_Simon Bluetooth_Freundin
define Bluetooth_Simon PRESENCE local-bluetooth xx:9B:xx:97:xx:D9 10 60
attr Bluetooth_Simon anwesend Zuhause
attr Bluetooth_Simon event-on-change-reading state
attr Bluetooth_Simon room Anwesenheit
define Bluetooth_Freundin PRESENCE local-bluetooth xx:26:xx:5B:xx:64 10 60
attr Bluetooth_Freundin anwesend Zuhause
attr Bluetooth_Freundin event-on-change-reading state
attr Bluetooth_Freundin room Anwesenheit
attr Zuhause event-on-change-reading state
attr Zuhause room Anwesenheit
attr Zuhause alias Person(en) anwesend
attr Zuhause group Anwesenheitsstatus
define Nicht_Zuhause watchdog Zuhause:absent 00:15:00 Zuhause:undefined set group=Licht off;; trigger Nicht_Zuhause .
attr Nicht_Zuhause room Anwesenheit
Vielleicht kann mir jemand jetzt einen kleinen Anstoss geben, ich möchte folgendes dazubauen:
Auf Basis dieses An- und Abwesenheits Status (Structure) würde ich gerne noch "Mail versenden WHEN Absent AND Bewegungsmelder:Motion".
Zitat von: Simon74 am 22 Juli 2014, 11:59:27
Vielleicht kann mir jemand jetzt einen kleinen Anstoss geben, ich möchte folgendes dazubauen:
Auf Basis dieses An- und Abwesenheits Status (Structure) würde ich gerne noch "Mail versenden WHEN Absent AND Bewegungsmelder:Motion".
Ich würde ein notify bauen, welches bei "Bewegungsmelder:Motion" triggert. Inhalt des Notify:
IF Absent THEN Mail versenden.
Der einzige "Nachteil", es triggert halt bei jedem Mal wenn der Bewegungsmelder was erkennt. Es wird bei PRESENT zwar keine Mail verschickt, aber wenn jemand eine performanceschonenderen Lösungsansatz hat, immer her damit. :)
ein notify kann man deaktivieren. es ist möglich das von dir genannte notify bei present einfach zu disablen und bei absend wieder zu aktivieren.
Zitat von: chris1284 am 22 Juli 2014, 17:51:42
ein notify kann man deaktivieren. es ist möglich das von dir genannte notify bei present einfach zu disablen und bei absend wieder zu aktivieren.
Einfache und perfekte Lösung. Danke dafür, diesen Kniff werde ich sicher noch mal benötigen. :)
Ein Beispielschnipsel für ein Disable vom Notify
fhem ("attr notify_motion_jl disable [b]1[/b]");;\
Enable
fhem ("attr notify_motion_jl disable [b]0[/b]");;\
Ich brauche mehr Details :-)
Den notify "Mail_Bewegengunsmelder_Absent" habe ich mal gebaut, er funktioniert:
DEF:
t5.fl.bm1:motion { if (Value("Zuhause") eq "absent")
{my $DNAME = AttrVal($NAME,"alias",$NAME);DebianMail('mail@adr.net', 'Bewegung im Flur ohne anwesende Person !', $DNAME." ".$EVENT)}
}
Ich frage mich nun wenn ich das aktivieren des notify so einbauen würde:
DEF:
Zuhause:absent 00:10:00 Zuhause:undefined set group=Licht off,attr Mail_Bewegungsmelder_Absent disable 0; trigger Nicht_Zuhause .
..würde das bedeuten das erst 10 Minuten später die Aktivierung stattfinden würde.
Dieselbe Problematik habe ich auch beim deaktivieren:
Ich komme nach Hause, bis mein Smartphone per Bluetooth gefunden wird kann es etwas dauern darum sollte ich hier eine Minute Verzögerung haben.
Bin im Moment ja schon fast zufrieden wenn ich mit den PERL Klammern klar komme, wie ich aber das nun am besten Abbilde.. ?
Bitte um ein Zaunpfahlschwingen :-)
Über wann die Mail kommt habe ich mir auch Gedanken gemacht. Bin zu dem Entschluss gekommen die Mail einfach zu löschen wenn eine kommen sollte und meine Anwesenheit wie auch immer noch nicht verifiziert wurde.
Mir ist es wichtiger sofort eine Mail zu erhalten wenn der Ernstfall eintritt. So würdest du eine Minute lang deine Mailfunktion brach legen. Somit hätte man eine Minute Zeit sich frei zu bewegen ohne das es bemerkt wird. Vor allem müsste nach der Minute dann ein neues Event kommen das die Mail versendet. Die Mail einfach eine Minute später senden ergibt auch keinen Sinn.
Edit: meint es wäre nicht nur eine Minute sondern 10 ...
Wenn ich weg bin werden sofort Mails versendet. (Bei einem Event)
Wenn ich 10min abwesend bin ohne Rückkehr, wird alles Abgeschalten.
Nach etwas grübeln denke ich einen Lösungsweg zu haben den ich beschreiben kann, jedoch dürfte mir die PERL-Syntax zu schaffen machen :-)
Die Logik: Wenn eine "Bewegung bei Abwesend" stattfindet sollte nicht sofort ein Mail versendet, sondern ein AT Job der in einer Minute nochmals prüft ob Status immer noch Absend, wenn ja Mail senden.
Damit für jede Bewegung ein Mail generiert wird sollte der Name des AT Jobs dynamisch sein (at_TIME)
define Bewegung_Abwesend notify t5.fl.bm:motion { if (Value("Zuhause") eq "absent")
my $at_TIME=%hh%mm%ss
(define Bewegung_Abwesend_Mail_$at_TIME at +01:00 {if if (Value("Zuhause") eq "absent")} {DebianMail('mail@adr.net', 'FHEM Alarm !', 'Bewegung ohne anwesende Person !')};)
}
Wie jetzt die Syntax richtig aussehen müsste, da werde ich noch länger sitzen :-)
Die Klammerei, Escapen und das hüpfen zw. FHEM, PERL ... ist "schön" ausgetrückt eine kleine Katastrophe. ::)
Ich habe nun soweit das die Mail 1 Minute verzögert gesendet wird:
t5.fl.bm:motion { if (Value("Zuhause") eq "absent")
{ fhem('define Bewegung_Abwesend_Mail_ at +00:01 { if (Value("Zuhause") eq "absent") {DebianMail(\'mail@@adr.net\', \'FHEM Alarm !\', \'Bewegung ohne anwesende Person !\')}}')}
}
Was mir jetzt noch fehlt ist ein Timestamp, so das mehrere Mails gesendet werden können und nicht mit "notify exist" nicht erstellt werden können
Wenn ich das in die 2. Zeile setze mag er das nicht:
my $attime=sprintf("%02d:%02d:%02d", $hour, $min, $sec);
Wenns funktionieren würde könnte ich:
{ fhem('define Bewegung_Abwesend_Mail_$attime...
So, nach ersten Frustabbau eine 2. Variante mit Sleep. Leider lässt sich FHEM in dieser Zeit nicht bedienen.
t5.fl.bm:motion { if (Value("Zuhause") eq "absent")
{ fhem("sleep 60") };
if (Value("Zuhause") eq "absent")
{ DebianMail('mail@@adr', 'FHEM Alarm !', 'Bewegung im Flur ohne anwesende Person !') }
}
Die at Variante wäre sichlerlich besser, es bleibt dort wie Frage wie der "define Name" mit einer Variable ausgestattet werden kann.
Hallo,
Ich habe da mal eine Idee oder besser Lösungsansatz. Warum wird hier nicht einfach mit Hilfe des Residents Modules gearbeitet. Notify wäre "Ist $RESIDENTS:residentsHome.0 dann tue das oder jenes". Oder denke ich da zu einfach???
Grüße
Leon