Anwesenheit > Homestatus > Manuelle Änderung

Begonnen von accessburn, 20 Oktober 2016, 11:06:37

Vorheriges Thema - Nächstes Thema

DeeSPe

Zitat von: Loredo am 20 Oktober 2016, 13:00:38
Nee kann/sollte man eben nicht. Das Haus hat auch einen eigenen Status unabhängig davon ob wer anwesend ist oder nicht.


Gruß

Julian

Das ist doch alles eine Frage der persönlichen Anforderungen und Einrichtung!
Mein Homestatus wechselt bei Abwesenheit nur von absent auf gone, entsprechend des RESIDENTS Devices.
Nur bei Anwesenheit möchte ich den Homestatus anhand von awoken oder der Uhrzeit automatisch steuern.

Das ist aber offensichtlich so nicht gewünscht. Darum werde ich meinen Code dafür auch nicht hier zur Verfügung stellen.

Gruß
Dan
MAINTAINER: 22_HOMEMODE, 98_Hyperion, 98_FileLogConvert, 98_serviced

Als kleine Unterstützung für meine Programmierungen könnt ihr mir gerne einen Kaffee spendieren: https://buymeacoff.ee/DeeSPe

accessburn

Zitat von: DeeSPe am 20 Oktober 2016, 15:00:56
Das ist aber offensichtlich so nicht gewünscht. Darum werde ich meinen Code dafür auch nicht hier zur Verfügung stellen.

So ist das nicht ganz richtig  ;D

Ich möchte das mein Bee wechselt zwischen "da" und "nicht da", den Rest wie "Urlaub" und "Schlafen" z.b. will ich selbst bestimmen können.
Für micht hört sich das aber genauso an als wenn ich mir das wünsche  ;)

Wezzy Rpi2b> FHEM, Elro, Intenso, FTUI, Jeelink v3, Max!Cube, Fire5, Foscam, NAS, Fritz!Box + Fon, Max!Wandthermostat, Amazon Echo
Wezzy Rp3b> OctoPi
Jessie Rp3b> UPNP, NAS, Pi-Hole

DeeSPe

#17
Dann hier mal der Code für deinen GTag (oder Bee).

Meine PRESENCE Devices heißen genau so wie die Bewohner/Gäste, nur mit PRESENCE_ davor.
Also das PRESENCE Device für "rr_Dan" heißt "PRESENCE_rr_Dan". Das macht die ganze Sache etwas leichter.

99_myUtils.pm:
sub DevicePresence($$)
{
  my ($dev,$event) = @_;
  my $name = (split("PRESENCE_",$dev))[1];
  my $state = ReadingsVal($name,"state","home");
  if ($event eq "present" && $state =~ /^(absent|gone|none)$/)
  {
    fhem "set $name state home";
  }
  elsif ($event eq "absent" && $state !~ /^(absent|gone|none)$/)
  {
    fhem "sleep 0.5; set $name state absent";
  }
}


Das notify für alle PRESENCE Devices:
define n_PRESENCE_user notify PRESENCE_.*:presence.* {DevicePresence($NAME,$EVTPART1)}

Damit wird nun der Status des jeweiligen ROOMMATE/GUEST Devices verändert, das RESIDENTS Device zieht automatisch mit.

Nun noch die Funktion für das RESIDENTS Device.
99_myUtils.pm:
sub ResidentsState($)
{
  my ($state) = @_;
  my $mode = DayTime();
  $mode = "morning" if ($state eq "awoken");
  $mode = $state if ($state =~ /^(absent|gone|asleep)$/);
  fhem "set HouseMode:FILTER=mode!=$mode mode $mode";
}


Und das notify für das RESIDENTS Device:
define n_rgr_Residents_state notify rgr_Residents:state:.* {ResidentsState($EVTPART1)}
attr n_rgr_Residents_state addStateEvent 1


Damit ist es nun möglich den HouseMode (Homestatus) über die PRESENCE und ROMMATE/GUEST Devices zu steuern.
Es werden hierbei auch noch TelegramBot Nachrichten verschickt. Die zum Benutzer gehörende TelegramID ist als userattr "contactPush" hinterlegt.

Falls Fragen zum Code sind, dann frag.

Gruß
Dan
MAINTAINER: 22_HOMEMODE, 98_Hyperion, 98_FileLogConvert, 98_serviced

Als kleine Unterstützung für meine Programmierungen könnt ihr mir gerne einen Kaffee spendieren: https://buymeacoff.ee/DeeSPe

accessburn

Oha, sieht mächtig kompliziert aus.

Ich sage schonmal vielen Dank, da muss ich mich erst einmal drin vergraben. Aber eine Frage bleibt nach wie vor offen.
Wie gebe ich die verschiedenen Staten an um festzulegen was da alles passiert. Ich hatte das die ganze Zeit mit notifys gemacht.
Wezzy Rpi2b> FHEM, Elro, Intenso, FTUI, Jeelink v3, Max!Cube, Fire5, Foscam, NAS, Fritz!Box + Fon, Max!Wandthermostat, Amazon Echo
Wezzy Rp3b> OctoPi
Jessie Rp3b> UPNP, NAS, Pi-Hole

DeeSPe

Habe Dir noch die Funktion für DayTime() unterschlagen:
99_myUtils.pm:
sub DayTime()
{
  my ($sec,$min,$hour,$mday,$month,$year,$wday,$yday,$isdst) = localtime;
  my $dt = "morning";
  $dt = "day" if ($hour >= 10 && $hour <= 13);
  $dt = "afternoon" if ($hour >= 14 && $hour <= 17);
  $dt = "evening" if ($hour >= 18 && $hour <= 22);
  $dt = "night" if ($hour == 23 || $hour <= 4);
  return $dt;
}


Zitat von: accessburn am 20 Oktober 2016, 15:26:13
Oha, sieht mächtig kompliziert aus.

Ich sage schonmal vielen Dank, da muss ich mich erst einmal drin vergraben. Aber eine Frage bleibt nach wie vor offen.
Wie gebe ich die verschiedenen Staten an um festzulegen was da alles passiert. Ich hatte das die ganze Zeit mit notifys gemacht.

Ist gar nicht so kompliziert wie es aussieht.

Das PRESENCE Device setzt eigentlich immer nur absent oder present im RESIDENTS Device.
Anhand der Uhrzeit wird dann der entsprechende HouseMode gesetzt.

Gruß
Dan
MAINTAINER: 22_HOMEMODE, 98_Hyperion, 98_FileLogConvert, 98_serviced

Als kleine Unterstützung für meine Programmierungen könnt ihr mir gerne einen Kaffee spendieren: https://buymeacoff.ee/DeeSPe

accessburn

Okay, ich hab mir das mal zusammenkopiert und mit dem angeschaut was ich zusammen getragen habe.
Boar das macht keinen sinn. Ich kriege da nicht mein ein Bild rein um zu wissen was ich wie anpassen soll. Irgendwie hatte ich mir das etwas einfacher vorgestellt:

Deine 99_myutils
sub DevicePresence($$)
{
  my ($dev,$event) = @_;
  my $name = (split("PRESENCE_",$dev))[1];
  my $alias = AttrVal($name,"alias",$name);
  my $mid = +TB_MY_ID;
  my $id = AttrVal($name,"contactPush",$mid);
  my $pres = ReadingsVal($name,"presence","");
  if ($event eq "present")
  {
    if ($pres ne $event)
    {
      my $text = "$alias kommt gerade.";
      fhem "set TB message @".$id." Herzlichen Willkommen $alias."
        if ($id ne $mid);
      fhem "set $name location arrival; set $name home; set $name location arrival";
      fhem "defmod -temporary atTmp_".$name."_arrival at +00:05:00 set $name:FILTER=location=arrival location home";
      fhem "msg push 0 $text"
        if ($name ne "rr_Dan");
      speak("|Doorbell| $text")
        if (Value("rr_Dan") =~ /^(home|gotosleep)$/ && $name ne "rr_Dan");
    }
  }
  elsif ($event eq "absent")
  {
    if ($pres ne $event)
    {
      fhem "set TB message @".$id." Bis bald und auf Wiedersehen $alias."
        if ($id ne $mid);
      fhem "set $name $event";
      fhem "msg push 0 $alias hat die Wohnung verlassen."
        if ($name ne "rr_Dan");
    }
  }
}
sub ResidentsState($)
{
  my ($state) = @_;
  my $mode = DayTime();
  $mode = "morning" if ($state eq "awoken");
  $mode = $state if ($state =~ /^(absent|gone|asleep)$/);
  fhem "set HouseMode:FILTER=mode!=$mode mode $mode";
}
sub DayTime()
{
  my ($sec,$min,$hour,$mday,$month,$year,$wday,$yday,$isdst) = localtime;
  my $dt = "morning";
  $dt = "day" if ($hour >= 10 && $hour <= 13);
  $dt = "afternoon" if ($hour >= 14 && $hour <= 17);
  $dt = "evening" if ($hour >= 18 && $hour <= 22);
  $dt = "night" if ($hour == 23 || $hour <= 4);
  return $dt;
}


deine cfg:

define n_PRESENCE_user notify PRESENCE_.*:presence.* {DevicePresence($NAME,$EVTPART1)}

define n_rgr_Residents_state notify rgr_Residents:state:.* {ResidentsState($EVTPART1)}
attr n_rgr_Residents_state addStateEvent 1


und meine cfg:
define Bewohner RESIDENTS
  attr Bewohner alias Residents
  attr Bewohner devStateIcon .*home:HOME_Status.home:absent .*absent:HOME_Status.absent:home .*gone:HOME_Status.gone.png:home .*none:HOME_Status.3 .*gotosleep:HOME_Status.gotosleep:asleep .*asleep:HOME_Status.asleep:awoken .*awoken:HOME_Status.awoken:home .*:HOME_Status.1:home
  attr Bewohner event-on-change-reading state
  attr Bewohner fp_uj36eg 164,453,0,
  attr Bewohner group Home State
  attr Bewohner icon control_building_filled
  attr Bewohner room Residents
  attr Bewohner verbose 0
  attr Bewohner webCmd state 

define Tobias ROOMMATE Bewohner
  attr Tobias alias Status
  attr Tobias fp_uj36wecker 190,750,1,Tobias
  attr Tobias group Tobias
  attr Tobias icon people_sensor
  attr Tobias room Residents
  attr Tobias rr_autoGoneAfter 1
  attr Tobias rr_realname alias
  attr Tobias sortby 1
  attr Tobias verbose 0
  attr Tobias webCmd state

define MeinGtAG PRESENCE lan-bluetooth xx:xx:xx... 127.0.0.1:5333 20 120
  attr MeinGtAG group Tobias
  attr MeinGtAG icon it_wireless_dcf77
  attr MeinGtAG room Residents



Zumal mir die ganzen notifys fehlen:


define Zuhause notify HomeStatus.Zuhause { ...
define Schlafen notify HomeStatus.Schlafen { ...
define KurzWeg notify HomeStatus.KurzWeg { ...
define LangeWeg notify HomeStatus.LangeWeg { ...


Das sind so viele Werte und informationen   :o
Keinen Plan wie ich das zusammen soll.
Wezzy Rpi2b> FHEM, Elro, Intenso, FTUI, Jeelink v3, Max!Cube, Fire5, Foscam, NAS, Fritz!Box + Fon, Max!Wandthermostat, Amazon Echo
Wezzy Rp3b> OctoPi
Jessie Rp3b> UPNP, NAS, Pi-Hole

DeeSPe

Das ist das notify für den HouseMode, mehr als dieses eine benötigst Du nicht:
define n_HouseMode notify HouseMode.* {HouseMode($EVTPART1)}

In der Funktion HouseMode($) werden dann die eigentlichen Schaltungen vorgenommen.

Gruß
Dan
MAINTAINER: 22_HOMEMODE, 98_Hyperion, 98_FileLogConvert, 98_serviced

Als kleine Unterstützung für meine Programmierungen könnt ihr mir gerne einen Kaffee spendieren: https://buymeacoff.ee/DeeSPe

accessburn

Zitat von: DeeSPe am 20 Oktober 2016, 15:50:01
In der Funktion HouseMode($) werden dann die eigentlichen Schaltungen vorgenommen.

Na dann danke für deine mühe, jedoch versteh ich nicht mal das.
Also lasse ich es besser. Denn das krieg ich so nicht zum laufen.

Ich schaue mal ob ich das irgendwie anders gebastelt bekomme das wenn der PebbleBee das Haus verlässt wenigstens direkt auf "LangeWeg" umspringt. Mehr nicht, sonst haut es mir da in die Steuerung so rein das ich da nie wieder was ändern kann weil ich nicht weiß wie.

Etwas doof jetzt weil du dir die Mühe gemacht hast und die Zeit geopfert hast. Aber da muss ich einfach noch viel lernen...

MFG Toby
Wezzy Rpi2b> FHEM, Elro, Intenso, FTUI, Jeelink v3, Max!Cube, Fire5, Foscam, NAS, Fritz!Box + Fon, Max!Wandthermostat, Amazon Echo
Wezzy Rp3b> OctoPi
Jessie Rp3b> UPNP, NAS, Pi-Hole

DeeSPe

#23
Dann mache es doch einfach Stück für Stück!
Bei mir ist der Code auch über viele Wochen hin entstanden und so gewachsen.

Jetzt erst einmal den PRESENCE Device Status einem ROOMMATE/GUEST zuweisen:

Wenn Du bereits RESIDENTS und ROOMMATE benutzt dann nenne bitte Dein verbundenes PRESENCE Device "PRESENCE_DEINROOMMATENAME".
Dann EIN notify für ALLE dieser PRESENCE Devices:
define n_PRESENCE_user notify PRESENCE_.*:presence.* {DevicePresence($NAME,$EVTPART1)}

Und der Code in der 99_myUtils.pm:
sub DevicePresence($$)
{
  my ($dev,$event) = @_;
  my $name = (split("PRESENCE_",$dev))[1];
  my $state = ReadingsVal($name,"state","home");
  if ($event eq "present" && $state =~ /^(absent|gone|none)$/)
  {
    fhem "set $name state home";
  }
  elsif ($event eq "absent" && $state !~ /^(absent|gone|none)$/)
  {
    fhem "set $name state absent";
  }
}


Damit sollte schon einmal das ROOMMATE Device auf das PRESENCE Device reagieren (absent/home).
Ich habe den Code auf ein Minimum gekürzt damit es für Dich übersichtlicher ist. Ausschmücken kannst Du auch später selber wieder.

Gruß
Dan
MAINTAINER: 22_HOMEMODE, 98_Hyperion, 98_FileLogConvert, 98_serviced

Als kleine Unterstützung für meine Programmierungen könnt ihr mir gerne einen Kaffee spendieren: https://buymeacoff.ee/DeeSPe

DeeSPe

Hab den Code im vorherigen Beitag nochmals gekürzt!

Gruß
Dan
MAINTAINER: 22_HOMEMODE, 98_Hyperion, 98_FileLogConvert, 98_serviced

Als kleine Unterstützung für meine Programmierungen könnt ihr mir gerne einen Kaffee spendieren: https://buymeacoff.ee/DeeSPe

Tabularasa

Hallo. Ich würde gern einen Schritt früher verstehen. Das meiste hab ich mir zusammenkopiert ohne richtig zu verstehen.
Bis jetzt habe ich RESIDENTS und ROOMMATE angelegt

define Bewohner RESIDENTS
attr Bewohner alias Residents
attr Bewohner devStateIcon .*home:status_available:absent .*absent:status_away_1:home .*gone:status_standby:home .*none:control_building_empty .*gotosleep:status_night:asleep .*asleep:status_night:awoken .*awoken:status_available:home .*:user_unknown:home
attr Bewohner group Home State
attr Bewohner icon control_building_filled
attr Bewohner room Residents
attr Bewohner webCmd state


define rr_Manuel ROOMMATE Bewohner
attr rr_Manuel alias Status
attr rr_Manuel devStateIcon .*home:user_available:absent .*absent:user_away:home .*gone:user_ext_away:home .*gotosleep:scene_toilet:asleep .*asleep:scene_sleeping:awoken .*awoken:scene_sleeping_alternat:home .*:user_unknown:home
attr rr_Manuel group Manuel
attr rr_Manuel icon people_sensor
attr rr_Manuel room Residents
attr rr_Manuel rr_realname group
attr rr_Manuel sortby 1
attr rr_Manuel webCmd state


define rr_Lydia ROOMMATE Bewohner
attr rr_Lydia alias Status
attr rr_Lydia devStateIcon .*home:user_available:absent .*absent:user_away:home .*gone:user_ext_away:home .*gotosleep:scene_toilet:asleep .*asleep:scene_sleeping:awoken .*awoken:scene_sleeping_alternat:home .*:user_unknown:home
attr rr_Lydia group Lydia
attr rr_Lydia icon people_sensor
attr rr_Lydia room Residents
attr rr_Lydia rr_realname group
attr rr_Lydia sortby 1
attr rr_Lydia webCmd state


wenn ich den Status in dem Webinterface ändere wird es im FTUI auch mit geändert.
Nun möchte ich das PRESENCE damit verknüpfen und nur erstmal die Änderung sehen.
Hatte dazu folgendes angelegt
define HandyManuel PRESENCE function {checkAllFritzMACpresent("C0:EE:CC:43:82:E7")} 300 300
attr HandyManuel absenceThreshold 2
attr HandyManuel room Mobil
define FritzBox FRITZBOX
attr FritzBox allowTR064Command 1
attr FritzBox event-on-change-reading 1
attr FritzBox room System
define HandyLydia PRESENCE function {checkAllFritzMACpresent("78:C5:63:2F:5E:13")} 300 300
attr HandyLydia absenceThreshold 2
attr HandyLydia room Mobil


Was muss ich jetzt wo eingeben, dass sich der Status im FTUI automatisch verändert?
Habe irgendwie so viel gelesen und jeder macht es anders, sodass ich etwas verwirrt bin.
Im Anschluss würde ich zwar gern auch automatisiert was schalten, aber erstmal Stück für Stück vorankommen. Danke

DeeSPe

#26
Benenne mal Deine PRESENCE Devices so:
PRESENCE_rr_Manuel
PRESENCE_rr_Lydia

Das geht am Einfachsten per rename:
rename HandyManuel PRESENCE_rr_Manuel
rename HandyLydia PRESENCE_rr_Lydia


Diesen Code in die 99_myUitls.pm:
sub DevicePresence($$)
{
  my ($dev,$event) = @_;
  my $name = (split("PRESENCE_",$dev))[1];
  my $state = ReadingsVal($name,"state","home");
  if ($event eq "present" && $state =~ /^(absent|gone|none)$/)
  {
    fhem "set $name state home";
  }
  elsif ($event eq "absent" && $state !~ /^(absent|gone|none)$/)
  {
    fhem "set $name state absent";
  }
}


Und dann kannst Du das notify genau so anlegen:
define n_PRESENCE_user notify PRESENCE_.*:presence.* {DevicePresence($NAME,$EVTPART1)}

Somit sollten nun Deine RESIDENTS dem Status des entsprechenden PRESENCE Devices folgen.

Gruß
Dan

EDIT: Habe den Code der 99_myUtils.pm noch ein Wenig angepasst damit sich der Status wirklich nur bei Veränderung ändert.
MAINTAINER: 22_HOMEMODE, 98_Hyperion, 98_FileLogConvert, 98_serviced

Als kleine Unterstützung für meine Programmierungen könnt ihr mir gerne einen Kaffee spendieren: https://buymeacoff.ee/DeeSPe

Tabularasa

#27
Danke erstmal. Aber so ganz klappt es glaube noch nicht. Im Anhang sind die Stati nicht gleich. Der Presence Status ist aktuell, da es ja von der Fritzbox empfängt, aber die anderen ändern sich nicht. Oder müssen die sich garnicht ändern? Weil im FTUI wird der richtige Status angezeigt.
Da ich erst so seit 2 Wochen überhaupt mich mit FHEM beschäftige und auch 0 Grundkenntnisse vorher hatte, würde ich euch bitten mir zu sagen was ihr braucht um mir eventuell helfen zu können. Danke

In den Readings von Residents und Roommate steht als Zeit heute nachmittag drin. Müsste das nicht aktueller sein?

DeeSPe

Ich habe oben den Code der sub DevicePresence noch einmal angepasst.
Warum auch immer klappt das mit dem FILTER nicht. Habe es bei mir auch ohne drin.
So sollte es gehen!

Gruß
Dan
MAINTAINER: 22_HOMEMODE, 98_Hyperion, 98_FileLogConvert, 98_serviced

Als kleine Unterstützung für meine Programmierungen könnt ihr mir gerne einen Kaffee spendieren: https://buymeacoff.ee/DeeSPe

Tabularasa

Bin grad an der Arbeit und habe per VPN mal zuhause geschaut. Jetzt scheinen die Stati richtig zu sein ohne das ich was am Code geändert habe. Also das mit dem FILTER ist noch drin. Ich hatte gestern gleich nach dem anlegen das event-on-change reading Attribut gesetzt bei Residents, Roommate und Presence weil im event monitor immer Einträge erzeugt wurden jede Minute. Ich wollte eigentlich damit die SD Karte nicht so belasten, oder wird sie dadurch garnicht belastet? Jedenfalls hatte ich dann gestern abend die Attribute wieder gelöscht nachdem es nicht ging. Kann das damit was zu tun haben da es ja jetzt funktioniert?