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
$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?
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:
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?
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
vielen Dank für Eure Tips, Ihr habt mir sehr geholfen, ich hätte mir hier nen Wolf gespielt.
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");
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?)
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.
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?
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.
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.