Code um den Status einer Variable an andere Variablen weiterzugeben

Hallo, ich habe ein für Profis relativ simples Problem:

Ich habe eine Integer-Variable, welche den Text je nach Status ausgibt (z.B. 0,1,2,3 und 4)
Hierfür habe ich nochmals 4x Boolean-Variable angelegt. Die Aufgabe lautet wie folgt:

Ist: Integer-Variable „0“
Soll: 1. Boolean-Variable „false“
Soll: 2. Boolean-Variable „false“
Soll: 3. Boolean-Variable „false“
Soll: 4. Boolean-Variable „false“

Ist: Integer-Variable „1“
Soll: 1. Boolean-Variable „true“
Soll: 2. Boolean-Variable „false“
Soll: 3. Boolean-Variable „false“
Soll: 4. Boolean-Variable „false“

Ist: Integer-Variable „2“
Soll: 1. Boolean-Variable „false“
Soll: 2. Boolean-Variable „true“
Soll: 3. Boolean-Variable „false“
Soll: 4. Boolean-Variable „false“

Ist: Integer-Variable „3“
Soll: 1. Boolean-Variable „false“
Soll: 2. Boolean-Variable „false“
Soll: 3. Boolean-Variable „true“
Soll: 4. Boolean-Variable „false“

Ist: Integer-Variable „4“
Soll: 1. Boolean-Variable „false“
Soll: 2. Boolean-Variable „false“
Soll: 3. Boolean-Variable „false“
Soll: 4. Boolean-Variable „true“

Ich habe es zwar mit Ereignisse auch hinbekommen, aber mit einem Code wäre es bestimmt einfacher zu gestalten.
Aber leider scheitert es beim umsetzten des Codes und wäre auf Hilfe angewiesen.
Für Hinweise im Voraus vielen Dank, Gruß Yansop.

Moin yansoph,

schau dir mal den switch Befehl an PHP: switch - Manual Also einfach die Integer Variable abfragen und in den case Bedingungen die Variablen setzen :wink:

Eigentlich hast du den Befehl schon fast in deinem Post fertig.

Gruß
Hans

Hi,

in etwa so:

<?php
$Int_ID = 12345;
$Bool_IDs = array(22222,33333,44444,55555);
$Integer = GetValue($Int_ID);
foreach ($Bool_IDs as $key => $ID)
{
    SetValue($ID,($Integer >> $key) & 1);
}

Attain

Hallo, habe es mal nach deinem Muster angepasst

<?php
$Int_ID = 11950;
$Bool_IDs = array(40346,34127,57175,21277);
$Integer = GetValue($Int_ID);
foreach ($Bool_IDs as $key => $ID)
{
    SetValue($ID,($Integer >> $key) & 1);
}

Wo oder wie spreche ich aber das Handlich an: wenn Integer-Variable „1“ dann…?

… script ausführen

Soweit ist mir das schon klar, ich vermisse allerdings ein Case um die 5 Wörter aus der Integer Variable an die Boolean-Variablen weiterzugeben (je nach Wort sind die Boolean-Variablen „true“ oder „false“).
Die genannten 1,2,3,4 und 5 aus dem ersten Post waren ja wie bereits geschildert nur Beispiele, es handelt sich aber tatsächlich um Wörter.

Hmm.
Ein Integer ist eine Zahl.
Ein „Wort“ ist String.
Boolean ist true oder false.

Irgendwas stimmt hier nicht oder ich verstehe Deine Anforderung nicht.

Attain

Musste gerade erstmal nochmals nachsehen, aber du hast natürlich Recht:
Die Variable ist Integer, öffne ich die Variable stehen als Wert Zahlen drin aber in der Übersicht und in der WebFront steht ein Wort (als ob es um einen Zahlencode handelt das ein Wort ergibt)??
Dennoch kann ich hier die verschiedenen Zahlencodes verwenden, wird hier dann doch ein Case benötigt?

Eine Integer Variable ist immer eine Zahl und damit kann in einem Script gearbeitet werden.
Für das Webfront kann ein Variablenprofil zugeordent werden, um dem Zahlenwert besser zu visualisieren.

https://www.symcon.de/service/dokumentation/konzepte/variablen/variablenprofile/

Attain

Hallo,
ich habe die Integer-Variable mit den Istwerten korrigiert, nur einen Weg zur Umsetzung fehlt mir noch:

Ist: Integer-Variable „-1“
Soll: 1. Boolean-Variable „false“
Soll: 2. Boolean-Variable „false“
Soll: 3. Boolean-Variable „false“
Soll: 4. Boolean-Variable „false“

Ist: Integer-Variable „44872390“
Soll: 1. Boolean-Variable „true“
Soll: 2. Boolean-Variable „false“
Soll: 3. Boolean-Variable „false“
Soll: 4. Boolean-Variable „false“

Ist: Integer-Variable „44872391“
Soll: 1. Boolean-Variable „false“
Soll: 2. Boolean-Variable „true“
Soll: 3. Boolean-Variable „false“
Soll: 4. Boolean-Variable „false“

Ist: Integer-Variable „44872392“
Soll: 1. Boolean-Variable „false“
Soll: 2. Boolean-Variable „false“
Soll: 3. Boolean-Variable „true“
Soll: 4. Boolean-Variable „false“

Ist: Integer-Variable „44872393“
Soll: 1. Boolean-Variable „false“
Soll: 2. Boolean-Variable „false“
Soll: 3. Boolean-Variable „false“
Soll: 4. Boolean-Variable „true“

Vielen Dank für Hinweise, Gruß Yansop.

Habe den Code mal nicht gerade professionell zusammengebastelt.
Dieser ist bestimmt auch noch kürzer zu gestalten…
Hier habe ich bereits in Zeile 2 eine Fehlermeldung: Notice: Undefined index: VALUE in /var/lib/symcon/scripts/51736.ips.php on line 2


<?php
switch ($_IPS['VALUE']){
case (11950):

if ($_IPS['VALUE'] == "-1") {
SetValueBoolean(34127, false);
SetValueBoolean(57175, false);
SetValueBoolean(40346, false);
SetValueBoolean(21277, false);
}
break;

if ($_IPS['VALUE'] == "44872390") {
SetValueBoolean(34127, true);
SetValueBoolean(57175, false);
SetValueBoolean(40346, false);
SetValueBoolean(21277, false);
}
break;

if ($_IPS['VALUE'] == "44872391") {
SetValueBoolean(34127, false);
SetValueBoolean(57175, true);
SetValueBoolean(40346, false);
SetValueBoolean(21277, false);
}
break;

if ($_IPS['VALUE'] == "44872392") {
SetValueBoolean(34127, false);
SetValueBoolean(57175, false);
SetValueBoolean(40346, true);
SetValueBoolean(21277, false);
}
break;

if ($_IPS['VALUE'] == "44872393") {
SetValueBoolean(34127, false);
SetValueBoolean(57175, false);
SetValueBoolean(40346, false);
SetValueBoolean(21277, true);
}
break;

}

Moin yansoph,

die Länge ist nicht entscheidend sondern dass du den Befehl verstehst :wink:

 <?php
switch ($_IPS['VALUE']){
case -1:
    SetValueBoolean(34127, false);
    SetValueBoolean(57175, false);
    SetValueBoolean(40346, false);
    SetValueBoolean(21277, false);
break;

case 44872390:
    SetValueBoolean(34127, true);
    SetValueBoolean(57175, false);
    SetValueBoolean(40346, false);
    SetValueBoolean(21277, false);
break;

case 44872391:
    SetValueBoolean(34127, false);
    SetValueBoolean(57175, true);
    SetValueBoolean(40346, false);
    SetValueBoolean(21277, false);
break;

case 44872392:
    SetValueBoolean(34127, false);
    SetValueBoolean(57175, false);
    SetValueBoolean(40346, true);
    SetValueBoolean(21277, false);
break;

case 44872393:
    SetValueBoolean(34127, false);
    SetValueBoolean(57175, false);
    SetValueBoolean(40346, false);
    SetValueBoolean(21277, true);
break;

} 

Hilfreich wäre es, wenn du mal schreiben könntest worum es dabei eigentlich geht. Vielleicht bieten sich dann andere Möglichkeiten an.

Gruß
Hans

Vielen Dank für deine Korrektur, der Fehler in Zeile 2 besteht leider immer noch.

Zur Erklärung:
Eine Variable sagt mir welches der vier Geräte gerade eingeschaltet ist oder ob alle ausgeschaltet sind (-1).
Nun möchte ich eine Grafik erstellen wie lange die einzelne Geräte eingeschaltet waren und habe deshalb für jedes Gerät eine Variable erstellt.
Bei Änderung der Hauptvariable soll sich der Zustand der vier Gerätevariablen ändern (true=Ein bzw. false=Aus).
Diese vier Gerätevariablen werden dann geloggt um ein Diagramm zu erstellen.
Ich hoffe dass das jemand versteht…:slight_smile:

Moin,

wie rufst du das Programm denn auf? Einfach starten darfst du es nicht, da die Variable $_IPS[‚VALUE‘] dann nicht besetzt ist.

Wo kommt die Hauptvariable denn her?

Gruß
Hans

über ein Ereignis: wenn Änderung in der Hauptvariable dann Skript ausführen

Wo kommt die Hauptvariable denn her?

das ist ja noch mein Problem: wie muss ich die zweite Zeile ändern, damit das Skript die zu überwachende Variable erkennt

Moin,

dann muss es so lauten:

switch (GetValueInteger(IdIntVar)){ 

Damit wird der Wert der Integer Variable zur Verfügung gestellt und ausgewertet. So kann das Programm auch direkt zum Test aus der Konsole aufgerufen werden.

Gruß
Hans

Vielen Dank Hans,

wenn man die Lösung sieht ist es selbsterklärend, nur muss man erst mal draufkommen…

Gruß Yansop.

Moin,

na siehste geht doch :wink:

Haben diese 4 Geräte denn nicht eine STATE Variable? Also bei Homematic Geräten wäre dies der Fall und man könnte diese booleschen STATE Gerätevariablen direkt loggen. Somit hätte man das gewünschte Ergebnis ohne Ereignis und ohne Skript als Grafik :wink:

Gruß
Hans

Leider nein, nur Integer.