Abwesenheitsstatus erkennen

Nabend,

ich versuche mittels einem FS20S4a den AN/Abwesenheitsstatus zu ermitteln um dann darauf zu reagieren.

Der Sender hat vier Taster (Doppelte Kanalzahl), jedes Familienmitglied hat einen eigenen.

Geht oder kommt jemand drückt er seine Taster und die Statusvariable wird True oder False.

So, nun das Problemchen.

Fall 1: Es sind alle ausser Haus, alle 4 Statusvariablen sind also auf False
Present_State soll True sein

Fall 2: Es sind alle zu Haus, alle 4 Statusvariablen sind also auf True
Present_State soll False sein

Fall 3: Es ist noch jemand im Haus , 3 Statusvariablen sind auf False, 1 Statusvariable auf True
Present_State soll False sein

Das Script wird alle 10 Sekunden ausgeführt.

Das Script soll nun, je nach Fall die Variable „Present_State“ True oder False setzen.
Macht es aber nicht :frowning:


$KerstinPresent=GetValueBoolean("Status_Kerstin");
$RenePresent=GetValueBoolean("Status_Rene");
$ChristianPresent=GetValueBoolean("Status_Christian");
$SarahPresent=GetValueBoolean("Status_Sarah");

 if 
($KerstinPresent=="True" and $RenePresent=="True"
   and $ChristianPresent=="True" and $SarahPresent=="True") {
//Sind alle zu Haus dann ist die Bedingung erfüllt und Present_State wird False(Rot)
 SetValueBoolean("Present_State",False);
 SetValueString("Anwesenheit_Status","Jemand zu Hause");
   } else  if 
($KerstinPresent=="False" and $RenePresent=="False"
   and $ChristianPresent=="False" and $SarahPresent=="False") {
//Sind alle ausser Haus dann ist die Bedingung erfüllt und Present_State wird True(Grün)
 SetValueBoolean("Present_State",True);
 SetValueString("Anwesenheit_Status","Niemand zu Hause");
    } else {
  SetValueBoolean("Present_State",False);  //Irgendjemann ist noch im Haus, Present_State ist False
   SetValueString("Anwesenheit_Status","Jemand zu Hause");
    }

Ohne den else if Block funktioniert es.

Ich hab keine Ahnung wo der Fehler liegt, kann mir jemand dabei helfen, bitte?

Vielen Dank

René

Hi,

kann es sein, das bei den vergleichen im If die Anführungszeichen bei true und false weg müssen? Deine Variablen sind doch Typ = Boolean und nicht string.

Hier auch mal ein Auszug aus dem PHP Manual:

Umwandlung nach boolean
Um einen Wert ausdrücklich nach boolean zu konvertieren benutzen Sie entweder die Umwandlung mittels (bool) oder (boolean). In den allermeisten Fällen ist es jedoch nicht notwendig die Umwandlung selbst vorzunehmen. Ein Wert wird automatisch konvertiert, falls ein Operator, eine Funktion oder eine Kontrollstruktur ein boolean Argument erfordern.

Siehe auch Typ-Veränderung.

Bei der Umwandlung nach boolean werden folgende Werte als FALSE angesehen:

das boolean FALSE selbst

die Integer 0 (Null)

die Fließkomma-Zahl 0.0 (Null)

die leere Zeichenkette und die Zeichenkette „0“

ein Array ohne Elemente

ein Objekt ohne Mitgliedsvariablen

der spezielle Typ NULL (einschließlich nicht definierter Variablen)

Jeder andere Wert wird als TRUE angesehen (einschließlich jeder Resource).

Somit sollte „False“ = TRUE werden.

Weiterhin würde ich das Script nicht alle 10 Sekunden laufen lassen, sonderen über die 4 Statusvariablen:

Status_Kerstin
Status_Rene
Status_Christian
Status_Sarah

triggern. Somit würde das Script immer dann laufen, wenn eine Taste gedrückt wird.

Gruß Marcel

Das mit den boolschen Ausdrücken sehe ich auch so.

Noch ein Tip:

bei Abfragen auf den Zustand false oder true einfach nur die Var in die Abfrage stellen (! ist dabei die normale Negation):

if ($Variable) Befehl // führt den "Befehl" bei "true" aus
if (!$Variable) Befehl // führt den "Befehl" bei "false" aus

Aus

if 
($KerstinPresent=="True" and $RenePresent=="True"
   and $ChristianPresent=="True" and $SarahPresent=="True")

wird dann z.B.

if
($KerstinPresent and $RenePresent
   and $ChristianPresent and $SarahPresent)

und aus

if 
($KerstinPresent=="False" and $RenePresent=="False"
   and $ChristianPresent=="False" and $SarahPresent=="False")

wird

if 
(!$KerstinPresent and !$RenePresent
   and !$ChristianPresent and !$SarahPresent)

So ist es am einfachsten… :smiley:

Gruß
Fabian

Hallo Zusammen

würde folgendes nicht auch funktionieren?
So ohne if wenn und aber?

$Present_State = ($KerstinPresent or $RenePresent or $ChristianPresent or $SarahPresent) 

Gruss Patrik

Hallo,

dass man die Abfragen so einfach gestalten kann wusste ich nicht. Danke.

$Present_State = ($KerstinPresent or $RenePresent or $ChristianPresent or $SarahPresent)

Wenn das funktioniert (kann es leider erst heute abend testen), bekomme ich ja nur den Status ob irgend jemand da ist, nicht aber ob alle weg sind, oder?

Gruß René

Was ist denn wenn nicht irgend jemand da ist?!? :confused:

Toni :wink:

Mit einem not sollte es deinen oben beschriebenen Fällen entsprechen:

$Present_State = !($KerstinPresent or $RenePresent or $ChristianPresent or $SarahPresent); 

Gruss,
Olli

PS: ich glaube jedoch nicht, dass dein System mit den 4 Schaltern für 4 Personen funktionieren wird - ich schätze es wird ziemlich oft vergessen den richtigen Taster zu drücken… es sei denn du programmierst drakonische Strafmassnahmen ein :wink:

Kuck mal hier ! Da sind logische Verknüpfungen sehr gut erklärt !

mfG Franz

Hallo @all,

vielen Dank für Eure Tips, Ihr habt mir sehr geholfen, ich hätte mir hier nen Wolf gespielt. :slight_smile:
So klappts jetzt:

  $Present_State = !($KerstinPresent or $RenePresent or $ChristianPresent or $SarahPresent) ;
    SetValueBoolean("Present_State",$Present_State);
  if ($Present_State)
    SetValueString("Anwesenheit_Status","Niemand zu Hause");
  else
    SetValueString("Anwesenheit_Status","Jemand zu Hause");

@Toni

Was ist denn wenn nicht irgend jemand da ist?!?

Ist doch ein Widerspruch in sich, oder?

Für mich heisst das ganz klar ich muss mich wohl mehr mit PHP beschäftigen :rolleyes:

@Olli
Ich habe auch so meine Zweifel ob das mit dem Taster so funktionieren wird,
es gibt immerhin noch eine akustische An- und Abmeldebestätigung.
Wenn das nix bringt muss ein TFK an der Wohnungseingangstür beim Öffnen für eine Nachfrage sorgen(Hey schon an- oder abgemeldet?) :stuck_out_tongue:

Einen schönen Abend allen Helfern

Gruß René

Dann solltest du ggf. überlegen zusätzlich zum TFK einen Piri zu installieren - je nach Reihenfolge der Signale weiss deine Wohnung dann mehr oder weniger ob jemand kommt oder geht. Aber auch hierbei gibt’s lustige Ausnahmen…

Ich werde wahrscheinlich im nächsten Jahr alle meine Zimmer mit mehreren Bewegungsmeldern ausstatten - davon erhoffe ich mir eine zuverlässigere und automatisch funktionierende Anwesenheitsüberprüfung. Ausserdem kann dann auch das Licht pro Raum geschickter geregelt werden.

Gruss,
Olli

Eigentlich nicht. Computer denken so. True/False, 1/0, Jemand Da/Niemand da.

Wenn nun also „nicht Jemand da ist“, also das Gegenteil von „Jemand da ist“, ist das doch eine durchaus zulässige Aussage, oder etwa nicht? :wink:

Demnach ist „nicht jemand“ gleich „niemand“. Ein Problem der deutschen Sprache, nicht der Mathematik.

Oder einfacher: $JemandDa = $KerstinDa Oder $ReneDa Oder $ChristianDa oder $SarahDa. Wenn weder Kerstin, noch Rene, Christian oder Sarah da sind ist Die Aussage $JemandDa unwahr (false).

Einfache boolsche Algebra. :wink:

Blöde wirds wenn man den Variablen Namen ungünstig gewählt hat. Wenn $JemandDa $AlleDa heissen würde, so würde das Script zwar tadellos funktionieren, aber du wüsstest nie warum $AlleDa wahr ist obwohl Kerstin ausser haus ist… Hat mehr was mit „BrettVormKopf“ als programmieren zu tun. Glaub mir, die Phase haben alle Programmierer mal durchmachen müssen. :cool:

Toni

Toni