Hilfe: Switch - Case / mehrere if Abfragen

Hallo zusammen,

mal wieder eine blöde Frage eines „Nichtprogrammierers“ . Ich habe mir auch schon unter „Wie kann ich 2.0“ und bei google alles mögliche angeschaut und probiert, scheitere aber gerade an folgender Aufgabe. :banghead:
Möchte einfach nur mehrere Wenn dies dann das Abfragen…

Folgende Varianten habe ich probiert, komme aber nicht richtig weiter:

Variante 1: Hier bekomme ich null Rückmeldung. Kein Fehler aber auch kein Echo.

<?php

//Variablen Auslesen
$PV_Leistung_W		= GetValue(30069 /*[PHP_Module\SMA\PV Leistung aktuell gesamt]*/);
$Wallboxladestati		= GetValue(41219 /*[Gewerke\Energiemanagement\e-Auto\Status\Wert]*/);


	


if ($PV_Leistung_W >= 4100 & $PV_Leistung_W < 4800 & $Wallboxladestati =66)
{
		ModBus_WriteRegister(40330 /*[Gewerke\Energiemanagement\e-Auto\Ladeleistung setzen]*/, 6);
		ModBus_WriteCoil(15130 /*[Gewerke\Energiemanagement\e-Auto\Charge enable]*/, true); 
	   	echo "lade 6A";
}

if ($PV_Leistung_W >= 4800 & $PV_Leistung_W < 5200 & $Wallboxladestati =66)
{
		ModBus_WriteRegister(40330 /*[Gewerke\Energiemanagement\e-Auto\Ladeleistung setzen]*/, 7);
		ModBus_WriteCoil(15130 /*[Gewerke\Energiemanagement\e-Auto\Charge enable]*/, true); 
	   	echo "lade 7A";
}

if ($PV_Leistung_W >= 5200 & $Wallboxladestati =66)
{
		ModBus_WriteRegister(40330 /*[Gewerke\Energiemanagement\e-Auto\Ladeleistung setzen]*/, 8);
		ModBus_WriteCoil(15130 /*[Gewerke\Energiemanagement\e-Auto\Charge enable]*/, true); 
	   	echo "lade 8A";
}

if ($PV_Leistung_W < 4100)
{
		ModBus_WriteRegister(40330 /*[Gewerke\Energiemanagement\e-Auto\Ladeleistung setzen]*/, 6);
		ModBus_WriteCoil(15130 /*[Gewerke\Energiemanagement\e-Auto\Charge enable]*/, false); 
	   	echo "keine Ladung";
}

Variante 2: Auch hier kein Fehler aber auch kein Echo. Hier müsste ich bestimmt bei switch ($PV_Leistung_W) noch mehr angeben, aber try & Error hat auch nichts gebracht.




```php
<?php

//Variablen Auslesen
$PV_Leistung_W		= GetValue(30069 /*[PHP_Module\SMA\PV Leistung aktuell gesamt]*/);
$Wallboxladestati		= GetValue(41219 /*[Gewerke\Energiemanagement\e-Auto\Status\Wert]*/);


switch ($PV_Leistung_W) 
{ 
    case ($PV_Leistung_W >= 4100 & $PV_Leistung_W < 4800 & $Wallboxladestati =66): 
       ModBus_WriteRegister(40330 /*[Gewerke\Energiemanagement\e-Auto\Ladeleistung setzen]*/, 6);
	   ModBus_WriteCoil(15130 /*[Gewerke\Energiemanagement\e-Auto\Charge enable]*/, true); 
	   echo "lade 6A";
       break; 

    case ($PV_Leistung_W >= 4800 & $PV_Leistung_W < 5200 & $Wallboxladestati =66): 
       ModBus_WriteRegister(40330 /*[Gewerke\Energiemanagement\e-Auto\Ladeleistung setzen]*/, 7);
	   ModBus_WriteCoil(15130 /*[Gewerke\Energiemanagement\e-Auto\Charge enable]*/, true); 
       echo "lade 7A";
	   break;
	   
	case ($PV_Leistung_W >= 5200 & $Wallboxladestati =66): 
       ModBus_WriteRegister(40330 /*[Gewerke\Energiemanagement\e-Auto\Ladeleistung setzen]*/, 8);
	   ModBus_WriteCoil(15130 /*[Gewerke\Energiemanagement\e-Auto\Charge enable]*/, true); 
       echo "lade 8A";
	   break;  
	   
	case ($PV_Leistung_W < 4100): 
       ModBus_WriteRegister(40330 /*[Gewerke\Energiemanagement\e-Auto\Ladeleistung setzen]*/, 6);
	   ModBus_WriteCoil(15130 /*[Gewerke\Energiemanagement\e-Auto\Charge enable]*/, false); 
       echo "nicht laden";
	   break;  
}  


Variante 3: Diese Variante funktioniert bedingt. Auch wenn eigentlich case 2 befolgt werden müsste weil $PV_Leistung_W größer 4800W beträgt, nimmt er immer nur den ersten case und setzt 6A.



<?php

//Variablen Auslesen
$PV_Leistung_W		= GetValue(30069 /*[PHP_Module\SMA\PV Leistung aktuell gesamt]*/);
$Wallboxladestati		= GetValue(41219 /*[Gewerke\Energiemanagement\e-Auto\Status\Wert]*/);


switch ($PV_Leistung_W) 
{ 
    case ($PV_Leistung_W >= 4100): 
       ModBus_WriteRegister(40330 /*[Gewerke\Energiemanagement\e-Auto\Ladeleistung setzen]*/, 6);
	   ModBus_WriteCoil(15130 /*[Gewerke\Energiemanagement\e-Auto\Charge enable]*/, true); 
	   echo "lade 6A";
       break; 

    case ($PV_Leistung_W >= 4800): 
       ModBus_WriteRegister(40330 /*[Gewerke\Energiemanagement\e-Auto\Ladeleistung setzen]*/, 7);
	   ModBus_WriteCoil(15130 /*[Gewerke\Energiemanagement\e-Auto\Charge enable]*/, true); 
       echo "lade 7A";
	   break;
	   
	case ($PV_Leistung_W >= 5200): 
       ModBus_WriteRegister(40330 /*[Gewerke\Energiemanagement\e-Auto\Ladeleistung setzen]*/, 8);
	   ModBus_WriteCoil(15130 /*[Gewerke\Energiemanagement\e-Auto\Charge enable]*/, true); 
       echo "lade 8A";
	   break;  
	   
	case ($PV_Leistung_W < 4100): 
       ModBus_WriteRegister(40330 /*[Gewerke\Energiemanagement\e-Auto\Ladeleistung setzen]*/, 6);
	   ModBus_WriteCoil(15130 /*[Gewerke\Energiemanagement\e-Auto\Charge enable]*/, false); 
       echo "nicht laden";
	   break;  
}  


Ist mir immer wieder unangenehm für solche eigentlich einfachen Dinge zu fragen, aber ich hab nun alle Möglichkeiten durch.
Ich habe sogar if Abfragen in einem Case versucht zu erstellen… ^^

Schöne Ostern allen !
Gruß Zeppi

Hallo
Nur mal so auf die Schnelle. Probier mal das in Variante 1

if ( ($PV_Leistung_W >= 4100) and ($PV_Leistung_W < 4800) and  ($Wallboxladestati =66) )

In Variante 3 ist das Switch mit dem 1. break beendet und wird nicht weiter bearbeitet.

Hallo,

zum Vergleichen brauchst Du ‚==‘ oder ‚===‘ (dann muss auch der Typ gleich sein). ‚=‘ ist eine ZUWEISUNG. Die möchtest Du in Deiner Abfrage aber nicht.
Es sollte also heißen:

if ($PV_Leistung_W >= 4100 & $PV_Leistung_W < 4800 & $Wallboxladestati [b]==[/b] 66)

Grüße, Gerhard

Danke euch !!! :loveips:

Funktioniert nun mit den doppelten klammern und dem „and“ statt „&“ Zeichen.


<?php

//Variablen Auslesen
$PV_Leistung_W        = GetValue(30069 /*[PHP_Module\SMA\PV Leistung aktuell gesamt]*/);
$Wallboxladestati        = GetValue(41219 /*[Gewerke\Energiemanagement\e-Auto\Status\Wert]*/);

if ( ($PV_Leistung_W >= 4100) and ($PV_Leistung_W < 4800) and  ($Wallboxladestati =66) )
{
		ModBus_WriteRegister(40330 /*[Gewerke\Energiemanagement\e-Auto\Ladeleistung setzen]*/, 6);
		ModBus_WriteCoil(15130 /*[Gewerke\Energiemanagement\e-Auto\Charge enable]*/, true); 
	   	echo "lade 6A";
}

if ( ($PV_Leistung_W >= 4800) and ($PV_Leistung_W < 5200) and  ($Wallboxladestati =66) )
{
		ModBus_WriteRegister(40330 /*[Gewerke\Energiemanagement\e-Auto\Ladeleistung setzen]*/, 7);
		ModBus_WriteCoil(15130 /*[Gewerke\Energiemanagement\e-Auto\Charge enable]*/, true); 
	   	echo "lade 7A";
}
if ( ($PV_Leistung_W >= 5200) and ($Wallboxladestati =66) )
{
		ModBus_WriteRegister(40330 /*[Gewerke\Energiemanagement\e-Auto\Ladeleistung setzen]*/, 8);
		ModBus_WriteCoil(15130 /*[Gewerke\Energiemanagement\e-Auto\Charge enable]*/, true); 
	   	echo "lade 8A";
}

if ($PV_Leistung_W < 4100)
{
		ModBus_WriteRegister(40330 /*[Gewerke\Energiemanagement\e-Auto\Ladeleistung setzen]*/, 6);
		ModBus_WriteCoil(15130 /*[Gewerke\Energiemanagement\e-Auto\Charge enable]*/, false); 
	   	echo "keine Ladung";
}

Und wenn du den Hinweis von GerhardBS

.. $Wallboxladestati == 66)...

noch einbaust, wird es perfekt :smiley:

und & funktioniert auch, müsste aber eigentlich && heissen

Perfekt. Hatte ich auch mittlerweile eingebaut. So lernt man immer wieder was dazu ! Dank dieser hilfsbereiten Community !

Darf ich noch mal stören ?
Es wird doch weiterhin nur der erste if Fall betrachtet. (Nicht wundern… habe nur die Variablen Bezeichnungen geändert)

Bei aktuell $PV_Ueberschuss_o_Batt = 4800, müsste eigentlich der 2. íf Fall angewandt werden und 7A schalten. Er setzt aber weiterhin fleissig nur 6A aus dem ersten if Fall.

<?php

//Variablen Auslesen
$ELWA_W					= GetValue(38824);
$PV_Leistung_W			= GetValue(30069);
$Ladeleistung_lesen_W	= GetValue(50241);
$Wallboxstatus  		= GetValue(41219);
$PV_Ueberschuss_m_Batt	= GetValue(11910);
$PV_Ueberschuss_o_Batt  = GetValue(40848);
	


if ( ($PV_Ueberschuss_o_Batt >= 4000) and ($PV_Ueberschuss_o_Batt < 4600) and  ($Wallboxstatus == 66) )
{
		ModBus_WriteRegister(40330, 6);
		ModBus_WriteCoil(15130, true); 
	   	echo "lade 6A";
}

if ( ($PV_Ueberschuss_o_Batt >= 4600) and ($PV_Ueberschuss_o_Batt < 5000) and  ($Wallboxstatus == 66) )
{
		ModBus_WriteRegister(40330, 7);
		ModBus_WriteCoil(15130, true); 
	   	echo "lade 7A";
}
if ( ($PV_Ueberschuss_o_Batt >= 5000) and ($Wallboxstatus == 66) )
{
		ModBus_WriteRegister(40330, 8);
		ModBus_WriteCoil(15130, true); 
	   	echo "lade 8A";
}

if ($PV_Ueberschuss_o_Batt < 3900)
{
		ModBus_WriteRegister(40330, 6);
		ModBus_WriteCoil(15130, false); 
	   	echo "keine Ladung";
}

Bei meinem Versuch kommt 7A raus bei 4800.

	$Wallboxstatus          = 66; 

	$PV_Ueberschuss_o_Batt  = 4800; 
     
	if ( ($PV_Ueberschuss_o_Batt >= 4000) and ($PV_Ueberschuss_o_Batt < 4600) and  ($Wallboxstatus == 66) ) 
		{ 
        echo "lade 6A"; 
		} 
	if ( ($PV_Ueberschuss_o_Batt >= 4600) and ($PV_Ueberschuss_o_Batt < 5000) and  ($Wallboxstatus == 66) ) 
		{ 
        echo "lade 7A"; 
		} 
	if ( ($PV_Ueberschuss_o_Batt >= 5000) and ($Wallboxstatus == 66) ) 
		{ 
        echo "lade 8A"; 
		} 
	if ($PV_Ueberschuss_o_Batt < 3900) 
		{ 
        echo "keine Ladung"; 
		}

Ja, du hast recht… Hmm, ab und an hat es gestern dann auch mal funktioniert.
Ich hab da eine Vermutung, dass ich das Script was ja auch Modbus write Befehle beinhaltet zu oft getriggert wurde und den Modbus überlastet hat. Heute trigger ich das mal nur noch minütlich statt sekündlich bei Vaiablenaktualisierung. Denke das klappt dann schon :slight_smile: