wie ich an einem UDP Socket was rausschreibe ist klar (USCK_SendText).
Gibt es auch ein Spezialkommando mit dem ich einen UDP Socket lese? Bzw kann mir jemand ein Beispiel geben, wie ich lese und wie ich feststelle, ob auf dem Socket ein Kommando kam.
Also dazu gibt im Prinzip schon diverses hier im Forum, ansonsten in der Doku nach RegisterVariable suchen…
Prizipiell legst du nen Server Socket an (Port usw.) und dazu dann bei Bedarf einen Cutter und dann eine RegisterVariable. So bald auf dem Port etwas empfangen wird, landet das in der Registervariable und darüber wird das hinterlegte Script angetriggert welches den Inhalt dann auswertet.
Wie das aussieht hängt von deinen Daten ab die du auswerten willst …
Ich habe einen UDP Socket angelegt und übergebe die empfangenen Daten einer RegisterVarariblen.
Diese Variable triggert das beigefügte Script
(Sorry, bin kein PHP Profi und immer für Verbesserungsvorschläge dankbar).
<?php
// Ventos Lüftungsüberwachung
// Empfangener Datensatz von Ventos UDP Port via RegisterVariable:
// MSW=004;THH=007;TMM=050;TSS=019;DYY=011;DMM=003;DDD=013;DDW=007;FAN=B;TFO=+26.4;TAU=+26.8;TAB=+26.8;TZU=+26.5;TR1=-99.9;TR2=-99.9;<cr><lf>
if ($IPS_SENDER == "RegisterVariable") // über Register Var ausgeführt
{
if ($IPS_INSTANCE == 36782 /*[Wohnen\Lüftung\Hidden\LU RegVar UDP]*/)
{
$Data = RegVar_GetBuffer($IPS_INSTANCE); // im Puffer der Instanz vorhandene Daten in $data kopieren
$Data .= $IPS_VALUE; // neu empfangene Daten an $data anhängen
$CRLF = "
";
if (strpos($Data, $CRLF)) // wenn das Trennzeichen CRLF in $data gefunden worden ist
{
$DataSets = explode($CRLF, $Data); // $data in durch CRLF separierte Datensätze zerlegen
for ($i = 0; $i < count($DataSets) - 1; $i++) // alle nicht durch CRLF terminierten Datensätze ausgeben
{
echo "[".IPS_GetLocation($IPS_INSTANCE)."] ".$DataSets[$i]."
";
$Pair = explode(';', $DataSets[$i]); // Datensätze trennen
for ($j = 0; $j < count($Pair) - 1; $j++)
{
$VarVal = explode('=', $Pair[$j]); // InVariable und Wert trennen
for ($k = 0; $k < count($VarVal) - 1; $k++)
{
switch ($VarVal[$k])
{
case "MSW": $MSW = (int)$VarVal[$k+1]; // MainSwitch
break;
case "THH": $THH = (int)$VarVal[$k+1]; // TimeHour
break;
case "TMM": $TMM = (int)$VarVal[$k+1]; // TimeMinute
break;
case "TSS": $TSS = (int)$VarVal[$k+1]; // TimeSecond
break;
case "DYY": $DYY = (int)$VarVal[$k+1]; // DateYear
break;
case "DMM": $DMM = (int)$VarVal[$k+1]; // DateMonth
break;
case "DDD": $DDD = (int)$VarVal[$k+1]; // DateDay
break;
case "DDW": $DDW = (int)$VarVal[$k+1]; // DateDayOfWeek
break;
case "FAN": $FAN = $VarVal[$k+1]; // Ventilatoren
break;
case "TFO": $TFO = $VarVal[$k+1]; // Temperatur Fortluft
break;
case "TAU": $TAU = $VarVal[$k+1]; // Temperatur Aussenluft
break;
case "TAB": $TAB = $VarVal[$k+1]; // Temperatur Abluft
break;
case "TZU": $TZU = $VarVal[$k+1]; // Temperatur Zuluft
break;
case "TR1": $TR1 = $VarVal[$k+1]; // Temperatur Reserve 1
break;
case "TR2": $TR2 = $VarVal[$k+1]; // Temperatur Reserve 2
break;
case "STA": $STA = $VarVal[$k+1]; // Status rebooted : BOT, running : RUN
break;
}
}
}
if (isset($THH))
{
$SYTime = time();
$LUTime = mktime((int)$THH, (int)$TMM, (int)$TSS, (int)$DMM, (int)$DDD, (int)$DYY);
$TimeDiff = abs($SYTime - $LUTime);
setvalue(23207 /*[Wohnen\Lüftung\Zeitdifferenz in Sekunden]*/, $TimeDiff);
}
if (isset($MSW))
{
$MSW = substr($MSW,-1);
setvalue(34123 /*[Wohnen\Lüftung\Stufe]*/,$MSW);
}
if (isset($FAN))
{
switch ($FAN)
{
case "Z": setvalue(42844 /*[Wohnen\Lüftung\Zuluftventilator]*/,true);
setvalue(31716 /*[Wohnen\Lüftung\Abluftventilator]*/,false);
break;
case "F": setvalue(42844 /*[Wohnen\Lüftung\Zuluftventilator]*/,false);
setvalue(31716 /*[Wohnen\Lüftung\Abluftventilator]*/,true);
break;
case "B": setvalue(42844 /*[Wohnen\Lüftung\Zuluftventilator]*/,true);
setvalue(31716 /*[Wohnen\Lüftung\Abluftventilator]*/,true);
break;
}
}
if (isset($TFO)) {setvalue(32137 /*[Wohnen\Lüftung\Temperatur Fortluft]*/,$TFO);}
if (isset($TAU)) {setvalue(44197 /*[Wohnen\Lüftung\Temperatur Aussenluft]*/,$TAU);}
if (isset($TAB)) {setvalue(29813 /*[Wohnen\Lüftung\Temperatur Abluft]*/,$TAB);}
if (isset($TZU)) {setvalue(51191 /*[Wohnen\Lüftung\Temperatur Zuluft]*/,$TZU);}
if (isset($TR1)) {setvalue(24327 /*[Wohnen\Lüftung\Temperatur Reserve 1]*/,$TR1);}
if (isset($TR2)) {setvalue(19245 /*[Wohnen\Lüftung\Temperatur Reserve 2]*/,$TR2);}
if (isset($STA))
{
if ($STA == "BOT")
{
setvalue(30070 /*[Wohnen\Lüftung\Status]*/,$STA);
}
}
}
$Data = $DataSets[count($DataSets) - 1]; // $data auf den Inhalt des letzten (unvollständigen) Datensatzes setzen
}
RegVar_SetBuffer($IPS_INSTANCE, $Data); // Inhalt von $data im Puffer der RegisterVariable-Instanz speichern
}
}
?>