Per Array mehere Float Werte abfragen

Hallo!

Ich möchte gerne per PHP mit einer Array Abfrage mehrere Heizkörperthermostate abfragen und bei überschreitung eines Wertes eine Variable auf true schalten.
Leider gelingt mir die Abfrage nicht.
Vermutlich habe ich mehere Fehler Skript.
Könntet ihr dabei behilflich sein?

<?php $ids = array( 45974, 24740, 20892 ); $result > 0.5; foreach ($ids as $id) { if (GetValueFloat($id)) { $result > 0.5; break; } } switch ($result) { case > 0.5: SetValueBoolean (58822, true); print "ja"; break; case < 0.5: SetValueBoolean (58822, false); print "nein"; break; } ?>

Leider ist mir in der aktuellen Boardversion nicht ersichtlich wie ich ein Skript vernünftig dargestellt bekomme. Sorry. Vielleicht kann mir das auch einer eklären.

Poste doch das Skript nochmal als „Vorformierter Text“ </> oben drücken. Das kann man sonst echt nicht lesen.

Grüße
Stefan

Bitte nicht, sondern editieren.
@haz.man Bitte editiere den Beitrag, entsprechend.
Michael

Ich habe mal versucht dein Skript zu interpretieren… Keine Ahnung, ob es jetzt das tut, was du dir vorstellst.

<?php
$ids = array( 45974, 24740, 20892 );
$result = 0.5;

foreach ($ids as $id) {
$value = GetValueFloat($id);

switch ($value) {
case ($value > $result):
#SetValueBoolean (58822, true);
print "größer";
exit; //breche for-schleife ab wenn ein Wert größer als $result
break;

case ($value <= $result):
#SetValueBoolean (58822, false);
print "kleiner,gleich";
#exit; //breche for-schleife ab wenn ein Wert kleiner als $result
break;
}
}

@steppe
Vielen Dank fürs Anpassen.
Die Fehlermeldungen sind weg.
Aber selbst wenn ich bei result 99999 eingebe, das ergebnis ist immer „größer“.

In meiner Anzeige ist kein Button für Vorformatierter Text drin.
Nur:

Findest du unter dem Zahnrad.
IMG_20221014_061336
Michael

1 „Gefällt mir“

Trage doch mal nach der Zeile:

$value = GetValueFloat($id);

folgende Zeile ein:

echo "Wert: ".$value.PHP_EOL;

Man muss halt mal sehen, welche Werte da geholt werden.

Grüße
Stefan

und wenn Du " $result = 1;" statt 0 oder 0.5 schreibst?

@steppe
Das Ergebnis ist:
Wert: 0
größer

Wert 0 stimmt in diesem Fall auch, denn die Heizkörper sind zu.

@Helmut
Auch bei 1 ist das Ergebnis: größer

Obwohl ja 1 das Maximum ist was bei dieser Floatvariablen erreicht werden kann.
Es handelt sich um das LEVEL der Stellantriebe an Heizkörpern von Homematic.
5% entspricht 0,05 und 100% entspricht 1.

Hier das aktuelle Skrip:



<?php

$ids = array( 
    45974, 
    24740, 
    20892 );
$result = 1;

foreach ($ids as $id) {
$value = GetValueFloat($id);
echo "Wert: ".$value.PHP_EOL;

switch ($value) {
case ($value > $result):
#SetValueBoolean (58822, true);
print "größer";
exit; //breche for-schleife ab wenn ein Wert größer als $result
break;

case ($value <= $result):
#SetValueBoolean (58822, false);
print "kleiner,gleich";
exit; //breche for-schleife ab wenn ein Wert kleiner als $result
break;
}
}

$ids = array( 39495, 50256, 21380,32848 );
$result = 1;

foreach ($ids as $id) {
$value = GetValueFloat($id);
//echo $value;

switch ($value) {
case ($value <= $result):
SetValueBoolean (35746, true);
//print "größer".$id;
exit; //breche for-schleife ab wenn ein Wert größer als $result
break;

case ($value >= $result):
SetValueBoolean (35746, false);
//print "kleiner,gleich".$id;
#exit; //breche for-schleife ab wenn ein Wert kleiner als $result
break;
}
}

Das ist von mir ausprobiert, ich vergleiche Heizkörper Ventilstellungen.
Allerdings haben die Ventilstellungen „%“ ~Valve.F und DAS funktioniert.

Wenn es bei Helmut funktioniert, muss es wohl an den Variablen liegen.

Ich würde aber nicht <= und >= zusammen verwenden. Entweder < und >= oder <= und >.
Es wird zwar im Fall der Gleichheit immer die erste case zutreffen, aber ist halt unschön.

Grüße
Stefan

Auch wenn ich das Gleichzeichen entferne, bleibt das Ergebnis das gleiche.

Eine 0 ist größer als eine 1. :tired_face:

Für mich ist das leider unlogisch.
Ich glaube ich gebe das Projekt auf.

Ist ja auch nicht logisch. Mach doch mal einen Screenshot von einer der Variablen, die du prüfen möchtest und schau mal, welches Profil verwendet wird.

Eine switch-Anweisung ist keine if-Anweisung.
Man kann in das switch keinen beliebigen Variablenwert geben und anschließend im case-Block irgendwelche logischen Vergleiche machen. OK, kann man schon, nur kommt dabei halt nichts vernünftiges raus. :wink:

Entweder if-Anweisungen nutzen oder in das switch einen boolschen Wert (true / false) packen und die case-Blöcke dann so gestalten, dass eben ein true oder false dabei raus kommt, was dann mit dem switch übereinstimmt.

Exkurs dazu:
Bei switch/case wird der Wert vom switch mit den Werten der case Blöcke verglichen.
Da hier in den case aber keine Werte, sondern vergleiche stehen, müssen diese vergleiche zuerst aufgelöst werden.
Dann schaut das wie folgt aus, bei einem Beispielwert von 0.2.

<?php
$result = 0.5;

switch (0.2) {
case (0.2 > $result): // wird zu false
print "größer";
break;

case (0.2 <= $result): // wird zu true
print "kleiner,gleich";
break;
}
}

Jetzt ist ersichtlich daß wir 0.2 im switch mit true und false vergleichen.
Da 0.2 kein bool ist, konvertiert PHP das intern und alles was nicht 0 ist wird zu true.
Somit kommt hier kleiner raus, außer wir haben als $value eine 0, dann wird größer rauskommen.

Dennoch kann eine Prüfung in case funktionieren, es muss dann aber immer auf true geprüft, also in switch übergeben werden:

<?php

$ids = array( 
    45974, 
    24740, 
    20892 );
$result = 1;

foreach ($ids as $id) {
$value = GetValueFloat($id);
echo "Wert: ".$value.PHP_EOL;

switch (true) {
case ($value > $result):
#SetValueBoolean (58822, true);
print "größer";
exit; //breche for-schleife ab wenn ein Wert größer als $result
break;

case ($value <= $result):
#SetValueBoolean (58822, false);
print "kleiner,gleich";
exit; //breche for-schleife ab wenn ein Wert kleiner als $result
break;
}
}

Michael

1 „Gefällt mir“

Danke für die ausführliche Erläuterung und Ergänzung mit Beispiel! Ich hatte heute Nacht nur noch schnell vom Handy geantwortet. Da hatte ich keine Lust mehr Code zu tippen.

Michaels Erklärungen haben mich ermuntert es mal zu versuchen:

<?php
$ids = array( 39495, 50256, 21380,32848 );
$result = 10.0;
$Flag = 1;

foreach ($ids as $id) 
{
$value = GetValueFloat($id);
//echo $value;

If ($value > $result)
{
$Flag = $Flag * 2;
//print "  größer  ".$id." Flag=  ".$Flag."  " ;
}

If ($value < $result)
{
$Flag = $Flag * 1;
//print "kleiner,gleich".$id;
}
}

If ($Flag > 1)
{
// echo "Flag  ".$Flag;   
  SetValueBoolean (35746, true);  
}
elseif ($Flag = 1)
{
// echo "Flag = 1 ... ".$Flag;
  SetValueBoolean (35746, false);  
}

In deinem elseif musst du ein doppeltes Gleichheitszeichen verwenden.

Ansonsten fehlt dir ggf. noch eine Bedingung für den Fall, dass $value gleich $result ist. Keine Ahnung, ob der Fall für dich relevant ist.

Hallo Michael und Kollegen!

vielen Dank für deine/eure Hilfe und ausführliche Erklärung.
Leider konnte ich nicht schneller reagieren, aber ich bin begeistert wie schnell ihr alle zur Hilfe kommt. Vielen Dank dafür!

Wenn ich es richtig verstanden habe, dann sollte doch bei folgendem Skript eigentlich das Eergebnis „größer“ rauskommen, richtig?

<?php

$ids = array( 
    45974, 
    24740, 
    46809 ,
    30631,
    31758); //dieser wert steht auf 0.5
$result = 0.1;

foreach ($ids as $id) {
$value = GetValueFloat($id);
echo "Wert: ".$value.PHP_EOL;

switch (true) {
case ($value > $result):
#SetValueBoolean (58822, true);
print "größer";
exit; //breche for-schleife ab wenn ein Wert größer als $result
break;

case ($value <= $result):
#SetValueBoolean (58822, false);
print "kleiner,gleich";
exit; //breche for-schleife ab wenn ein Wert kleiner als $result
break;
}
}

Ich habe den vierten zu prüfenden Float mit einem Wert von 0.5 versehen.
Dennoch bleibt bei mir immer der Output:
Wert: 0
kleiner,gleich

Übrigens alle Float Profile sind auf ~Intensity.1 gestellt. Also 0 ist Minimum und 1 ist Maximum.

Die Erklärung sollte von Michael dem Hand zahmen Drachen genügen.
Ist vom 15.Oktober, darin erklärt er, dass man „If“ Anweisung statt „switch“ nehmen sollte, da mit switch nur boolsche Geschichten raus kommen.