diff --git a/fhem/CHANGED b/fhem/CHANGED index f08865711..7e664b22c 100644 --- a/fhem/CHANGED +++ b/fhem/CHANGED @@ -1,5 +1,6 @@ # Add changes at the top of the list. Keep it in ASCII, and 80-char wide. # Do not insert empty lines here, update check depends on it. + - new: 20_PET: new RESIDENTS module type for pets at home - bugfix: 73_AutoShuttersControl: fix bugs and logic problems - feature: 98_weekprofile: HMCCU support - change: 10_MYSENSORS_DEVICE: enhance support for SetExtensions; diff --git a/fhem/FHEM/10_RESIDENTS.pm b/fhem/FHEM/10_RESIDENTS.pm index 0263bc2c7..bec644f59 100644 --- a/fhem/FHEM/10_RESIDENTS.pm +++ b/fhem/FHEM/10_RESIDENTS.pm @@ -48,6 +48,9 @@ sub RESIDENTS_UpdateReadings (@) { my $state_totalGuests = 0; my $state_totalGuestsPresent = 0; my $state_totalGuestsAbsent = 0; + my $state_totalPets = 0; + my $state_totalPetsPresent = 0; + my $state_totalPetsAbsent = 0; my $state_totalRoommates = 0; my $state_totalRoommatesPresent = 0; my $state_totalRoommatesAbsent = 0; @@ -63,8 +66,10 @@ sub RESIDENTS_UpdateReadings (@) { my $residentsDevs_wayhomeDelayed = "-"; my $residentsDevs_totalAbsent = "-"; my $residentsDevs_totalPresent = "-"; - my $residentsDevs_totalAbsentGuest = "-"; - my $residentsDevs_totalPresentGuest = "-"; + my $residentsDevs_totalAbsentGuests = "-"; + my $residentsDevs_totalPresentGuests = "-"; + my $residentsDevs_totalAbsentPets = "-"; + my $residentsDevs_totalPresentPets = "-"; my $residentsDevs_totalAbsentRoommates = "-"; my $residentsDevs_totalPresentRoommates = "-"; my $residents_home = "-"; @@ -78,8 +83,10 @@ sub RESIDENTS_UpdateReadings (@) { my $residents_wayhomeDelayed = "-"; my $residents_totalAbsent = "-"; my $residents_totalPresent = "-"; - my $residents_totalAbsentGuest = "-"; - my $residents_totalPresentGuest = "-"; + my $residents_totalAbsentGuests = "-"; + my $residents_totalPresentGuests = "-"; + my $residents_totalAbsentPets = "-"; + my $residents_totalPresentPets = "-"; my $residents_totalAbsentRoommates = "-"; my $residents_totalPresentRoommates = "-"; my $wayhome = 0; @@ -97,6 +104,11 @@ sub RESIDENTS_UpdateReadings (@) { if ( defined( $hash->{GUESTS} ) && $hash->{GUESTS} ne "" ); + my @registeredPets = + split( /,/, $hash->{PETS} ) + if ( defined( $hash->{PETS} ) + && $hash->{PETS} ne "" ); + # count child states for ROOMMATE devices foreach my $roommate (@registeredRoommates) { $state_total++; @@ -349,6 +361,254 @@ sub RESIDENTS_UpdateReadings (@) { } } + # count child states for PET devices + foreach my $pet (@registeredPets) { + $state_total++; + $state_totalPets++; + + my $petName = + AttrVal( $pet, AttrVal( $pet, "rp_realname", "group" ), "" ); + + Log3 $name, 5, "RESIDENTS $name: considering $pet for state change"; + + if ( ReadingsVal( $pet, "state", "initialized" ) eq "home" ) { + $state_home++; + $residentsDevs_home .= "," . $pet + if ( $residentsDevs_home ne "-" ); + $residentsDevs_home = $pet + if ( $residentsDevs_home eq "-" ); + $residents_home .= ", " . $petName + if ( $petName ne "" && $residents_home ne "-" ); + $residents_home = $petName + if ( $petName ne "" && $residents_home eq "-" ); + + $state_totalPresent++; + $state_totalPetsPresent++; + $residentsDevs_totalPresent .= "," . $pet + if ( $residentsDevs_totalPresent ne "-" ); + $residentsDevs_totalPresent = $pet + if ( $residentsDevs_totalPresent eq "-" ); + $residentsDevs_totalPresentPets .= "," . $pet + if ( $residentsDevs_totalPresentPets ne "-" ); + $residentsDevs_totalPresentPets = $pet + if ( $residentsDevs_totalPresentPets eq "-" ); + $residents_totalPresent .= ", " . $petName + if ( $petName ne "" && $residents_totalPresent ne "-" ); + $residents_totalPresent = $petName + if ( $petName ne "" && $residents_totalPresent eq "-" ); + $residents_totalPresentPets .= ", " . $petName + if ( $petName ne "" + && $residents_totalPresentPets ne "-" ); + $residents_totalPresentPets = $petName + if ( $petName ne "" + && $residents_totalPresentPets eq "-" ); + } + + elsif ( ReadingsVal( $pet, "state", "initialized" ) eq "gotosleep" ) { + $state_gotosleep++; + $residentsDevs_gotosleep .= "," . $pet + if ( $residentsDevs_gotosleep ne "-" ); + $residentsDevs_gotosleep = $pet + if ( $residentsDevs_gotosleep eq "-" ); + $residents_gotosleep .= ", " . $petName + if ( $petName ne "" && $residents_gotosleep ne "-" ); + $residents_gotosleep = $petName + if ( $petName ne "" && $residents_gotosleep eq "-" ); + + $state_totalPresent++; + $state_totalPetsPresent++; + $residentsDevs_totalPresent .= "," . $pet + if ( $residentsDevs_totalPresent ne "-" ); + $residentsDevs_totalPresent = $pet + if ( $residentsDevs_totalPresent eq "-" ); + $residentsDevs_totalPresentPets .= "," . $pet + if ( $residentsDevs_totalPresentPets ne "-" ); + $residentsDevs_totalPresentPets = $pet + if ( $residentsDevs_totalPresentPets eq "-" ); + $residents_totalPresent .= ", " . $petName + if ( $petName ne "" && $residents_totalPresent ne "-" ); + $residents_totalPresent = $petName + if ( $petName ne "" && $residents_totalPresent eq "-" ); + $residents_totalPresentPets .= ", " . $petName + if ( $petName ne "" + && $residents_totalPresentPets ne "-" ); + $residents_totalPresentPets = $petName + if ( $petName ne "" + && $residents_totalPresentPets eq "-" ); + } + + elsif ( ReadingsVal( $pet, "state", "initialized" ) eq "asleep" ) { + $state_asleep++; + $residentsDevs_asleep .= "," . $pet + if ( $residentsDevs_asleep ne "-" ); + $residentsDevs_asleep = $pet + if ( $residentsDevs_asleep eq "-" ); + $residents_asleep .= ", " . $petName + if ( $petName ne "" && $residents_asleep ne "-" ); + $residents_asleep = $petName + if ( $petName ne "" && $residents_asleep eq "-" ); + + $state_totalPresent++; + $state_totalPetsPresent++; + $residentsDevs_totalPresent .= "," . $pet + if ( $residentsDevs_totalPresent ne "-" ); + $residentsDevs_totalPresent = $pet + if ( $residentsDevs_totalPresent eq "-" ); + $residentsDevs_totalPresentPets .= "," . $pet + if ( $residentsDevs_totalPresentPets ne "-" ); + $residentsDevs_totalPresentPets = $pet + if ( $residentsDevs_totalPresentPets eq "-" ); + $residents_totalPresent .= ", " . $petName + if ( $petName ne "" && $residents_totalPresent ne "-" ); + $residents_totalPresent = $petName + if ( $petName ne "" && $residents_totalPresent eq "-" ); + $residents_totalPresentPets .= ", " . $petName + if ( $petName ne "" + && $residents_totalPresentPets ne "-" ); + $residents_totalPresentPets = $petName + if ( $petName ne "" + && $residents_totalPresentPets eq "-" ); + } + + elsif ( ReadingsVal( $pet, "state", "initialized" ) eq "awoken" ) { + $state_awoken++; + $residentsDevs_awoken .= "," . $pet + if ( $residentsDevs_awoken ne "-" ); + $residentsDevs_awoken = $pet + if ( $residentsDevs_awoken eq "-" ); + $residents_awoken .= ", " . $petName + if ( $petName ne "" && $residents_awoken ne "-" ); + $residents_awoken = $petName + if ( $petName ne "" && $residents_awoken eq "-" ); + + $state_totalPresent++; + $state_totalPetsPresent++; + $residentsDevs_totalPresent .= "," . $pet + if ( $residentsDevs_totalPresent ne "-" ); + $residentsDevs_totalPresent = $pet + if ( $residentsDevs_totalPresent eq "-" ); + $residentsDevs_totalPresentPets .= "," . $pet + if ( $residentsDevs_totalPresentPets ne "-" ); + $residentsDevs_totalPresentPets = $pet + if ( $residentsDevs_totalPresentPets eq "-" ); + $residents_totalPresent .= ", " . $petName + if ( $petName ne "" && $residents_totalPresent ne "-" ); + $residents_totalPresent = $petName + if ( $petName ne "" && $residents_totalPresent eq "-" ); + $residents_totalPresentPets .= ", " . $petName + if ( $petName ne "" + && $residents_totalPresentPets ne "-" ); + $residents_totalPresentPets = $petName + if ( $petName ne "" + && $residents_totalPresentPets eq "-" ); + } + + elsif ( ReadingsVal( $pet, "state", "initialized" ) eq "absent" ) { + $state_absent++; + $residentsDevs_absent .= "," . $pet + if ( $residentsDevs_absent ne "-" ); + $residentsDevs_absent = $pet + if ( $residentsDevs_absent eq "-" ); + $residents_absent .= ", " . $petName + if ( $petName ne "" && $residents_absent ne "-" ); + $residents_absent = $petName + if ( $petName ne "" && $residents_absent eq "-" ); + + $state_totalAbsent++; + $state_totalPetsAbsent++; + $residentsDevs_totalAbsent .= "," . $pet + if ( $residentsDevs_totalAbsent ne "-" ); + $residentsDevs_totalAbsent = $pet + if ( $residentsDevs_totalAbsent eq "-" ); + $residentsDevs_totalAbsentPets .= "," . $pet + if ( $residentsDevs_totalAbsentPets ne "-" ); + $residentsDevs_totalAbsentPets = $pet + if ( $residentsDevs_totalAbsentPets eq "-" ); + $residents_totalAbsent .= ", " . $petName + if ( $petName ne "" && $residents_totalAbsent ne "-" ); + $residents_totalAbsent = $petName + if ( $petName ne "" && $residents_totalAbsent eq "-" ); + $residents_totalAbsentPets .= ", " . $petName + if ( $petName ne "" + && $residents_totalAbsentPets ne "-" ); + $residents_totalAbsentPets = $petName + if ( $petName ne "" + && $residents_totalAbsentPets eq "-" ); + } + + elsif ( ReadingsVal( $pet, "state", "initialized" ) eq "gone" ) { + $state_gone++; + $residentsDevs_gone .= "," . $pet + if ( $residentsDevs_gone ne "-" ); + $residentsDevs_gone = $pet + if ( $residentsDevs_gone eq "-" ); + $residents_gone .= ", " . $petName + if ( $petName ne "" && $residents_gone ne "-" ); + $residents_gone = $petName + if ( $petName ne "" && $residents_gone eq "-" ); + + $state_totalAbsent++; + $state_totalPetsAbsent++; + $residentsDevs_totalAbsent .= "," . $pet + if ( $residentsDevs_totalAbsent ne "-" ); + $residentsDevs_totalAbsent = $pet + if ( $residentsDevs_totalAbsent eq "-" ); + $residentsDevs_totalAbsentPets .= "," . $pet + if ( $residentsDevs_totalAbsentPets ne "-" ); + $residentsDevs_totalAbsentPets = $pet + if ( $residentsDevs_totalAbsentPets eq "-" ); + $residents_totalAbsent .= ", " . $petName + if ( $petName ne "" && $residents_totalAbsent ne "-" ); + $residents_totalAbsent = $petName + if ( $petName ne "" && $residents_totalAbsent eq "-" ); + $residents_totalAbsentPets .= ", " . $petName + if ( $petName ne "" + && $residents_totalAbsentPets ne "-" ); + $residents_totalAbsentPets = $petName + if ( $petName ne "" + && $residents_totalAbsentPets eq "-" ); + } + + if ( ReadingsVal( $pet, "wakeup", "0" ) > 0 ) { + $wakeup++; + $residentsDevs_wakeup .= "," . $pet + if ( $residentsDevs_wakeup ne "-" ); + $residentsDevs_wakeup = $pet + if ( $residentsDevs_wakeup eq "-" ); + $residents_wakeup .= ", " . $petName + if ( $petName ne "" && $residents_wakeup ne "-" ); + $residents_wakeup = $petName + if ( $petName ne "" && $residents_wakeup eq "-" ); + } + + if ( ReadingsVal( $pet, "wayhome", "0" ) > 0 ) { + $wayhome++; + $residentsDevs_wayhome .= "," . $pet + if ( $residentsDevs_wayhome ne "-" ); + $residentsDevs_wayhome = $pet + if ( $residentsDevs_wayhome eq "-" ); + $residents_wayhome .= ", " . $petName + if ( $petName ne "" && $residents_wayhome ne "-" ); + $residents_wayhome = $petName + if ( $petName ne "" && $residents_wayhome eq "-" ); + + if ( ReadingsVal( $pet, "wayhome", "0" ) == 2 ) { + $wayhomeDelayed++; + + $residentsDevs_wayhomeDelayed .= "," . $pet + if ( $residentsDevs_wayhomeDelayed ne "-" ); + $residentsDevs_wayhomeDelayed = $pet + if ( $residentsDevs_wayhomeDelayed eq "-" ); + $residents_wayhomeDelayed .= ", " . $petName + if ( $petName ne "" + && $residents_wayhomeDelayed ne "-" ); + $residents_wayhomeDelayed = $petName + if ( $petName ne "" + && $residents_wayhomeDelayed eq "-" ); + } + } + } + # count child states for GUEST devices foreach my $guest (@registeredGuests) { $state_guestDev++; @@ -365,16 +625,16 @@ sub RESIDENTS_UpdateReadings (@) { $state_totalGuests++; $state_total++; - $residentsDevs_totalPresentGuest .= "," . $guest - if ( $residentsDevs_totalPresentGuest ne "-" ); - $residentsDevs_totalPresentGuest = $guest - if ( $residentsDevs_totalPresentGuest eq "-" ); - $residents_totalPresentGuest .= ", " . $guestName + $residentsDevs_totalPresentGuests .= "," . $guest + if ( $residentsDevs_totalPresentGuests ne "-" ); + $residentsDevs_totalPresentGuests = $guest + if ( $residentsDevs_totalPresentGuests eq "-" ); + $residents_totalPresentGuests .= ", " . $guestName if ( $guestName ne "" - && $residents_totalPresentGuest ne "-" ); - $residents_totalPresentGuest = $guestName + && $residents_totalPresentGuests ne "-" ); + $residents_totalPresentGuests = $guestName if ( $guestName ne "" - && $residents_totalPresentGuest eq "-" ); + && $residents_totalPresentGuests eq "-" ); $residentsDevs_totalPresent .= "," . $guest if ( $residentsDevs_totalPresent ne "-" ); @@ -395,16 +655,16 @@ sub RESIDENTS_UpdateReadings (@) { $state_totalGuests++; $state_total++; - $residentsDevs_totalPresentGuest .= "," . $guest - if ( $residentsDevs_totalPresentGuest ne "-" ); - $residentsDevs_totalPresentGuest = $guest - if ( $residentsDevs_totalPresentGuest eq "-" ); - $residents_totalPresentGuest .= ", " . $guestName + $residentsDevs_totalPresentGuests .= "," . $guest + if ( $residentsDevs_totalPresentGuests ne "-" ); + $residentsDevs_totalPresentGuests = $guest + if ( $residentsDevs_totalPresentGuests eq "-" ); + $residents_totalPresentGuests .= ", " . $guestName if ( $guestName ne "" - && $residents_totalPresentGuest ne "-" ); - $residents_totalPresentGuest = $guestName + && $residents_totalPresentGuests ne "-" ); + $residents_totalPresentGuests = $guestName if ( $guestName ne "" - && $residents_totalPresentGuest eq "-" ); + && $residents_totalPresentGuests eq "-" ); $residentsDevs_totalPresent .= "," . $guest if ( $residentsDevs_totalPresent ne "-" ); @@ -425,16 +685,16 @@ sub RESIDENTS_UpdateReadings (@) { $state_totalGuests++; $state_total++; - $residentsDevs_totalPresentGuest .= "," . $guest - if ( $residentsDevs_totalPresentGuest ne "-" ); - $residentsDevs_totalPresentGuest = $guest - if ( $residentsDevs_totalPresentGuest eq "-" ); - $residents_totalPresentGuest .= ", " . $guestName + $residentsDevs_totalPresentGuests .= "," . $guest + if ( $residentsDevs_totalPresentGuests ne "-" ); + $residentsDevs_totalPresentGuests = $guest + if ( $residentsDevs_totalPresentGuests eq "-" ); + $residents_totalPresentGuests .= ", " . $guestName if ( $guestName ne "" - && $residents_totalPresentGuest ne "-" ); - $residents_totalPresentGuest = $guestName + && $residents_totalPresentGuests ne "-" ); + $residents_totalPresentGuests = $guestName if ( $guestName ne "" - && $residents_totalPresentGuest eq "-" ); + && $residents_totalPresentGuests eq "-" ); $residentsDevs_totalPresent .= "," . $guest if ( $residentsDevs_totalPresent ne "-" ); @@ -455,16 +715,16 @@ sub RESIDENTS_UpdateReadings (@) { $state_totalGuests++; $state_total++; - $residentsDevs_totalPresentGuest .= "," . $guest - if ( $residentsDevs_totalPresentGuest ne "-" ); - $residentsDevs_totalPresentGuest = $guest - if ( $residentsDevs_totalPresentGuest eq "-" ); - $residents_totalPresentGuest .= ", " . $guestName + $residentsDevs_totalPresentGuests .= "," . $guest + if ( $residentsDevs_totalPresentGuests ne "-" ); + $residentsDevs_totalPresentGuests = $guest + if ( $residentsDevs_totalPresentGuests eq "-" ); + $residents_totalPresentGuests .= ", " . $guestName if ( $guestName ne "" - && $residents_totalPresentGuest ne "-" ); - $residents_totalPresentGuest = $guestName + && $residents_totalPresentGuests ne "-" ); + $residents_totalPresentGuests = $guestName if ( $guestName ne "" - && $residents_totalPresentGuest eq "-" ); + && $residents_totalPresentGuests eq "-" ); $residentsDevs_totalPresent .= "," . $guest if ( $residentsDevs_totalPresent ne "-" ); @@ -485,16 +745,16 @@ sub RESIDENTS_UpdateReadings (@) { $state_totalGuests++; $state_total++; - $residentsDevs_totalAbsentGuest .= "," . $guest - if ( $residentsDevs_totalAbsentGuest ne "-" ); - $residentsDevs_totalAbsentGuest = $guest - if ( $residentsDevs_totalAbsentGuest eq "-" ); - $residents_totalAbsentGuest .= ", " . $guestName + $residentsDevs_totalAbsentGuests .= "," . $guest + if ( $residentsDevs_totalAbsentGuests ne "-" ); + $residentsDevs_totalAbsentGuests = $guest + if ( $residentsDevs_totalAbsentGuests eq "-" ); + $residents_totalAbsentGuests .= ", " . $guestName if ( $guestName ne "" - && $residents_totalAbsentGuest ne "-" ); - $residents_totalAbsentGuest = $guestName + && $residents_totalAbsentGuests ne "-" ); + $residents_totalAbsentGuests = $guestName if ( $guestName ne "" - && $residents_totalAbsentGuest eq "-" ); + && $residents_totalAbsentGuests eq "-" ); $residentsDevs_totalAbsent .= "," . $guest if ( $residentsDevs_totalAbsent ne "-" ); @@ -553,29 +813,56 @@ sub RESIDENTS_UpdateReadings (@) { readingsBulkUpdateIfChanged( $hash, "residentsTotalGuests", $state_totalGuests ); + readingsBulkUpdateIfChanged( $hash, "residentsTotalPets", + $state_totalPets ); + readingsBulkUpdateIfChanged( $hash, "residentsTotalGuestsPresent", $state_totalGuestsPresent ); + readingsBulkUpdateIfChanged( $hash, "residentsTotalPetsPresent", + $state_totalPetsPresent ); + readingsBulkUpdateIfChanged( $hash, "residentsTotalGuestsPresentDevs", - $residentsDevs_totalPresentGuest + $residentsDevs_totalPresentGuests + ); + + readingsBulkUpdateIfChanged( + $hash, + "residentsTotalPetsPresentDevs", + $residentsDevs_totalPresentPets ); readingsBulkUpdateIfChanged( $hash, "residentsTotalGuestsPresentNames", - $residents_totalPresentGuest ); + $residents_totalPresentGuests ); + + readingsBulkUpdateIfChanged( $hash, "residentsTotalPetsPresentNames", + $residents_totalPresentPets ); readingsBulkUpdateIfChanged( $hash, "residentsTotalGuestsAbsent", $state_totalGuestsAbsent ); + readingsBulkUpdateIfChanged( $hash, "residentsTotalPetsAbsent", + $state_totalPetsAbsent ); + readingsBulkUpdateIfChanged( $hash, "residentsTotalGuestsAbsentDevs", - $residentsDevs_totalAbsentGuest + $residentsDevs_totalAbsentGuests + ); + + readingsBulkUpdateIfChanged( + $hash, + "residentsTotalPetsAbsentDevs", + $residentsDevs_totalAbsentPets ); readingsBulkUpdateIfChanged( $hash, "residentsTotalGuestsAbsentNames", - $residents_totalAbsentGuest ); + $residents_totalAbsentGuests ); + + readingsBulkUpdateIfChanged( $hash, "residentsTotalPetsAbsentNames", + $residents_totalAbsentPets ); readingsBulkUpdateIfChanged( $hash, "residentsTotalRoommates", $state_totalRoommates ); @@ -761,6 +1048,7 @@ sub RESIDENTS_UpdateReadings (@) { # none elsif ($state_totalGuests == 0 + && $state_totalPets == 0 && $state_totalRoommates == 0 && $state_gone == 0 && $state_absent == 0 @@ -784,7 +1072,7 @@ sub RESIDENTS_UpdateReadings (@) { : "absent"; Log3 $name, 4, -"RESIDENTS $name: calculation result - residentsTotal:$state_total residentsTotalRoommates:$state_totalRoommates residentsTotalRoommatesPresent:$state_totalRoommatesPresent residentsTotalRoommatesAbsent:$state_totalRoommatesAbsent residentsTotalGuests:$state_totalGuests residentsTotalGuestsPresent:$state_totalGuestsPresent residentsTotalGuestsAbsent:$state_totalGuestsAbsent residentsTotalPresent:$state_totalPresent residentsTotalAbsent:$state_totalAbsent residentsHome:$state_home residentsGotosleep:$state_gotosleep residentsAsleep:$state_asleep residentsAwoken:$state_awoken residentsAbsent:$state_absent residentsGone:$state_gone presence:$newpresence state:$newstate"; +"RESIDENTS $name: calculation result - residentsTotal:$state_total residentsTotalRoommates:$state_totalRoommates residentsTotalRoommatesPresent:$state_totalRoommatesPresent residentsTotalRoommatesAbsent:$state_totalRoommatesAbsent residentsTotalGuests:$state_totalGuests residentsTotalPets:$state_totalPets residentsTotalGuestsPresent:$state_totalGuestsPresent residentsTotalPetsPresent:$state_totalPetsPresent residentsTotalGuestsAbsent:$state_totalGuestsAbsent residentsTotalPetsAbsent:$state_totalPetsAbsent residentsTotalPresent:$state_totalPresent residentsTotalAbsent:$state_totalAbsent residentsHome:$state_home residentsGotosleep:$state_gotosleep residentsAsleep:$state_asleep residentsAwoken:$state_awoken residentsAbsent:$state_absent residentsGone:$state_gone presence:$newpresence state:$newstate"; # safe current time my $datetime = FmtDateTime(time); @@ -903,8 +1191,8 @@ sub RESIDENTS_UpdateReadings (@) { =pod =item helper -=item summary combines ROOMMATE and GUEST devices to a residential community -=item summary_de fasst ROOMMATE und GUEST Geräte zu einer Wohngemeinschaft zusammen +=item summary combines ROOMMATE, GUEST and PET devices to a residential community +=item summary_de fasst ROOMMATE, GUEST und PET Geräte zu einer Wohngemeinschaft zusammen =begin html

@@ -919,7 +1207,7 @@ sub RESIDENTS_UpdateReadings (@) { define <rgr_ResidentsName> RESIDENTS

Provides a special virtual device to represent a group of individuals living at your home.
- It locically combines individual states of ROOMMATE and GUEST devices and allows state changes for all members.
+ It locically combines individual states of ROOMMATE, GUEST and PET devices and allows state changes for all members.
Based on the current state and other readings, you may trigger other actions within FHEM.

Example:
@@ -938,12 +1226,18 @@ sub RESIDENTS_UpdateReadings (@) {

  • addGuest   -   creates a new GUEST device and adds it to the current RESIDENTS group. Just enter the dummy name and there you go.
  • +
  • + addPet   -   creates a new PET device and adds it to the current RESIDENTS group. Just enter the dummy name and there you go. +
  • addRoommate   -   creates a new ROOMMATE device and adds it to the current RESIDENTS group. Just enter the first name and there you go.
  • removeGuest   -   shows all GUEST members and allows to delete their dummy devices easily.
  • +
  • + removePet   -   shows all PET members and allows to delete their dummy devices easily. +
  • removeRoommate   -   shows all ROOMMATE members and allows to delete their dummy devices easily.
  • @@ -955,7 +1249,7 @@ sub RESIDENTS_UpdateReadings (@) {
    @@ -990,7 +1284,7 @@ sub RESIDENTS_UpdateReadings (@) {

    - Note: State 'none' cannot explicitly be set. Setting state to 'gone' will be handled as 'none' for GUEST member devices. + Note: State 'none' cannot explicitly be set. Setting state to 'gone' will be handled as 'none' for GUEST or PET member devices.

    @@ -1160,6 +1454,27 @@ sub RESIDENTS_UpdateReadings (@) {
  • residentsTotalGuestsPresentNames - device alias of all active guests who are currently at home
  • +
  • + residentsTotalPets - number of active pets who are currently treated as part of the residents scope +
  • +
  • + residentsTotalPetsAbsent - number of all active pets who are currently underway +
  • +
  • + residentsTotalPetsAbsentDevs - device name of all active pets who are currently underway +
  • +
  • + residentsTotalPetsAbsentNames - device alias of all active pets who are currently underway +
  • +
  • + residentsTotalPetsPresent - number of all active pets who are currently at home +
  • +
  • + residentsTotalPetsPresentDevs - device name of all active pets who are currently at home +
  • +
  • + residentsTotalPetsPresentNames - device alias of all active pets who are currently at home +
  • residentsTotalRoommates - number of residents treated as being a permanent resident
  • @@ -1230,7 +1545,7 @@ sub RESIDENTS_UpdateReadings (@) { RESIDENTS Toolkit


    - Hinweis: Der Status 'none' kann nicht explizit gesetzt werden. Das setzen von 'gone' wird bei Mitgliedern vom Typ GUEST als 'none' behandelt. + Hinweis: Der Status 'none' kann nicht explizit gesetzt werden. Das setzen von 'gone' wird bei Mitgliedern vom Typ GUEST oder PET als 'none' behandelt.

    @@ -1535,6 +1856,27 @@ sub RESIDENTS_UpdateReadings (@) {
  • residentsTotalGuestsPresentNames - Gerätealias der aktiven Gäste, die momentan zu Hause sind
  • +
  • + residentsTotalPets - Anzahl der aktiven Gäste, welche momentan du den Bewohnern dazugezählt werden +
  • +
  • + residentsTotalPetsAbsent - Anzahl der aktiven Gäste, die momentan unterwegs sind +
  • +
  • + residentsTotalPetsAbsentDevs - Gerätename der aktiven Gäste, die momentan unterwegs sind +
  • +
  • + residentsTotalPetsAbsentNames - Gerätealias der aktiven Gäste, die momentan unterwegs sind +
  • +
  • + residentsTotalPetsPresent - Anzahl der aktiven Gäste, die momentan zu Hause sind +
  • +
  • + residentsTotalPetsPresentDevs - Gerätename der aktiven Gäste, die momentan zu Hause sind +
  • +
  • + residentsTotalPetsPresentNames - Gerätealias der aktiven Gäste, die momentan zu Hause sind +
  • residentsTotalRoommates - Anzahl der Bewohner, die als permanente Bewohner behandelt werden
  • @@ -1605,7 +1947,7 @@ sub RESIDENTS_UpdateReadings (@) { RESIDENTS Toolkit
    @@ -449,16 +460,26 @@ sub GUEST_Initialize($) {


    -
    +
    +
    +
    +
    diff --git a/fhem/FHEM/20_PET.pm b/fhem/FHEM/20_PET.pm new file mode 100644 index 000000000..383bf2dc8 --- /dev/null +++ b/fhem/FHEM/20_PET.pm @@ -0,0 +1,678 @@ +############################################################################### +# $Id$ +package main; +use strict; +use warnings; +use Data::Dumper; +use Time::Local; + +require RESIDENTStk; +our (@RESIDENTStk_attr); + +# initialize ################################################################## +sub PET_Initialize($) { + my ($hash) = @_; + + $hash->{InitDevFn} = "RESIDENTStk_InitializeDev"; + $hash->{DefFn} = "RESIDENTStk_Define"; + $hash->{UndefFn} = "RESIDENTStk_Undefine"; + $hash->{SetFn} = "RESIDENTStk_Set"; + $hash->{AttrFn} = "RESIDENTStk_Attr"; + $hash->{NotifyFn} = "RESIDENTStk_Notify"; + + $hash->{AttrPrefix} = "rp_"; + + $hash->{AttrList} = + "disable:1,0 disabledForIntervals do_not_notify:1,0 " + . "rp_states:multiple-strict,home,gotosleep,asleep,awoken,absent,gone " + . $readingFnAttributes; + + foreach (@RESIDENTStk_attr) { + $hash->{AttrList} .= " " . $hash->{AttrPrefix} . $_; + } + + return FHEM::Meta::InitMod( __FILE__, $hash ); +} + +1; + +=pod +=item helper +=item summary special virtual device to represent a pet in your home +=item summary_DE spezielles virtuelles Device, welches ein Haustier zu Hause repräsentiert +=begin html + + +

    PET

    + + +=end html + +=begin html_DE + + +

    PET

    + + +=end html_DE + +=for :application/json;q=META.json 20_PET.pm +{ + "author": [ + "Julian Pawlowski " + ], + "x_fhem_maintainer": [ + "loredo" + ], + "x_fhem_maintainer_github": [ + "jpawlowski" + ], + "keywords": [ + "Attendence", + "Family", + "People", + "Presence", + "RESIDENTS" + ] +} +=end :application/json;q=META.json + +=cut diff --git a/fhem/FHEM/20_ROOMMATE.pm b/fhem/FHEM/20_ROOMMATE.pm index 69d487419..e69c68a75 100644 --- a/fhem/FHEM/20_ROOMMATE.pm +++ b/fhem/FHEM/20_ROOMMATE.pm @@ -156,16 +156,26 @@ sub ROOMMATE_Initialize($) {



    +
    +




    +
    +