Hallo Andreas,
Im Bild sind noch die Einstellungen im IP-Symcon zu sehen.
Das Script „Client Überwachung“ startet die Verbindung neu, falls die Wetterstation mal spannungslos wurde.
der Code
„Wetterscript WLAN“
<?
//Ids der Variablen
$Wert1 = 29586 /*[Hardware\Wetter\Wetterstation USB\Innentemperatur]*/ ;// Innentemperatur
$Wert2 = 29968 /*[Hardware\Wetter\Wetterstation USB\Außentemperatur]*/ ;// Außentemperatur
$Wert3 = 17951 /*[Hardware\Wetter\Wetterstation USB\Taupunkt]*/ ;// Taupunkt
$Wert4 = 10083 /*[Hardware\Wetter\Wetterstation USB\gefühlte Temperatur]*/ ;// gefühlte Temperatur
$Wert5 = 53031 /*[Hardware\Wetter\Wetterstation USB\Hitzeindex]*/ ;// Hitzeindex
$Wert6 = 57311 /*[Hardware\Wetter\Wetterstation USB\Luftfeuchtigkeit Innen]*/ ;// Luftfeuchtigkeit Innen
$Wert7 = 13848 /*[Hardware\Wetter\Wetterstation USB\Luftfeuchtigkeit Außen]*/ ;// Luftfeuchtigkeit Außen
$Wert8 = 44044 /*[Hardware\Wetter\Wetterstation USB\Luftdruck absolut]*/ ;// Luftdruck absolut
$Wert9 = 42726 /*[Hardware\Wetter\Wetterstation USB\Luftdruck]*/ ;// Luftdruck relativ
$Wert10 = 34416 /*[Hardware\Wetter\Wetterstation USB\Windrichtung]*/ ;// Windrichtung
$Wert11 = 35193 /*[Hardware\Wetter\Wetterstation USB\Windgeschwindigkeit]*/ ;// Windgeschwindigkeit
$Wert12 = 24839 /*[Hardware\Wetter\Wetterstation USB\Windböe]*/ ;// Windböe
$Wert13 = 10102 /*[Hardware\Wetter\Wetterstation USB\Niederschlag aktuell]*/ ;// Niederschlag aktuell
$Wert14 = 54363 /*[Hardware\Wetter\Wetterstation USB\Niederschlag Stunde]*/ ;// Niederschlag Stunde
$Wert15 = 41107 /*[Hardware\Wetter\Wetterstation USB\Niederschlag 10min auf Stunde hochgerechnet]*/ ;// Niederschlag 10min auf Stunde hochgerechnet
$Wert16 = 14732 /*[Hardware\Wetter\Wetterstation USB\Niederschlag täglich]*/ ;// Niederschlag täglich
$Wert17 = 30192 /*[Hardware\Wetter\Wetterstation USB\Niederschlag wöchentlich]*/ ;// Niederschlag wöchentlich
$Wert18 = 45004 /*[Hardware\Wetter\Wetterstation USB\Niederschlag monatlich]*/ ;// Niederschlag monatlich
//Wert19 fehlt im Paket
$Wert20 = 53763 /*[Hardware\Wetter\Wetterstation USB\Niederschlag total]*/ ;// Niederschlag gesamt
$Wert21 = 34800 /*[Hardware\Wetter\Wetterstation USB\Sonneneinstrahlung]*/ ;// Sonneneinstrahlung
$Wert22 = 15634 /*[Hardware\Wetter\Wetterstation USB\Lichtintensität eventuell gemittelt]*/ ;// Lichtintensität eventuell gemittelt
$Wert23 = 42171 /*[Hardware\Wetter\Wetterstation USB\UV]*/ ;// UV
$Wert24a= 22271 /*[Hardware\Wetter\Wetterstation USB\Datum]*/ ;// Datum
$Wert24b= 41073 /*[Hardware\Wetter\Wetterstation USB\Letzter Paketempfang]*/ ;// Letzter Paketempfang
$Wert25 = 33828 /*[Hardware\Wetter\Wetterstation USB\Windgeschwindigkeit Tagesspitze]*/ ;// Windgeschwindigkeit Tagesspitze
$Dp = 14020 /*[Hardware\Wetter\Wetterstation USB\Datenpaketlänge]*/ ;// Datenpaketlänge
$Daten_USB = 11179 /*[Alte USB VersionCutter Wetterstation Wetterdaten\RegVar Wetterstation\Wetterdaten USB]*/ ;// Wetterdaten USB
$Sync = GetValueBoolean(37181 /*[Client Socket wetter WLAN\RegVar Wetterdaten WLan\Wetterscript WLAN\Sync]*/);
$Datenpaket = 0;
$Sendetext = "";
$Wertlänge = array(2,2,2,2,2,1,1,2,2,2,2,2,4,4,4,4,4,4,0,4,4,2,1,6,2);
if ($_IPS['SENDER'] == "RegisterVariable")
{
$data = RegVar_GetBuffer($_IPS['INSTANCE']); // bereits im Puffer der Instanz vorhandene Daten in $data kopieren
$data .= $_IPS['VALUE']; // neu empfangene Daten an $data anhängen
$CRCist = 0;
if (strlen($data) >= 4) //kleinster Datenblock
{
if (($Sync == false) and (strpos($data, chr(0x07).chr(0x00).chr(0x04).chr(0x0B))) !== false) //Syncronisieren
{
$Position = strpos($data, chr(0x07).chr(0x00).chr(0x04).chr(0x0B));
$data = substr( $data , ($Position + 4 ) - strlen($data));
$Sync = true;
}
if (($Sync == true) and (strlen($data) >= 3))
{
$Paketlaenge = ord($data[2]);
if (strlen($data) >= $Paketlaenge ) // Warten bis Paket vollständig
{
$CRCsoll = ord($data[$Paketlaenge-1]); //Prüfsumme kontrollieren
for ($i = 0; $i <= ($Paketlaenge-2); $i++)
{
$CRCist = $CRCist + ord($data[$i]);
If ($CRCist > 255)
{
$CRCist = $CRCist-256;
}
}
if ($CRCist <> $CRCsoll)
{
$Sync = false;
}
else
{
$Datenpaket = substr( $data ,0,($Paketlaenge) );
$data = substr( $data , ($Paketlaenge) );
}
}
}
SetValueBoolean(37181 /*[Client Socket wetter WLAN\RegVar Wetterdaten WLan\Wetterscript WLAN\Sync]*/,$Sync );
}
RegVar_SetBuffer($_IPS['INSTANCE'], $data);
if (ord($Datenpaket[0]) == 0x07) //07 00 04 0B Komunikation noch vorhanden?
{
CSCK_SendText(27728 /*[Client Socket wetter WLAN]*/,chr(0x07).chr(0x00).chr(0x06).chr(0x02).chr(0x00).chr(0x0F) ); //Antwort auf Test Kommunikation
}
if (ord($Datenpaket[0]) == 0x06) //06 00 04 0A Hole Datum
{
//06 00 0B FF FF FF FF FF FF 00 0B //Antwort wenn noch keine WLAN Verbindung
//06 00 0B 13 01 1B 09 0D 25 00 7B //Datum und Uhrzeit
date_default_timezone_set("Europe/Berlin");
$timestamp = time();
$dat[0] = 6;
$dat[1] = 0;
$dat[2] = 11;
$dat[3] = date("y",$timestamp);
$dat[4] = date("m",$timestamp);
$dat[5] = date("d",$timestamp);
$dat[6] = (date("H",$timestamp)-1);
$dat[7] = date("i",$timestamp);
$dat[8] = date("s",$timestamp);
$dat[9] = 0x00;
$dat[10] = 0x00; //Prüfsumme
$CRCist = 0;
for ($i = 0; $i <= 0x0B-2; $i++)
{
$CRCist = $CRCist + $dat[$i];
If ($CRCist > 255)
{
$CRCist = $CRCist-256;
}
}
$dat[10] = $CRCist;//Prüfsumme
for ($i = 0; $i < count($dat); $i++)
{
$Sendetext = $Sendetext.chr($dat[$i]);
}
CSCK_SendText(27728 /*[Client Socket wetter WLAN]*/,($Sendetext)); //Antwort auf Test Kommunikation
}
if (ord($Datenpaket[0]) == 0x01)
{
//01 00 07 00 01 00 09 Abfrage Sensoren
$Datenpaket = substr( $Datenpaket ,2,($Paketlaenge) );
$x = 0;
for ($i = 1; $x <= $Paketlaenge - 5; $i++)
{
$x++;
$Sensor = ord($Datenpaket[$x]); //Sensor für Kennung des Gebers
$BytePosition = ($Wertlänge[($Sensor)-1]); //Wertlänge für Sensor (Anzahl Byte)
If ($Sensor == 1) //Temp innen
{
SetValue($Wert1, (ord($Datenpaket[$x+1])*0x100 +ord($Datenpaket[$x+2])-400)/10);
$x = $x + $BytePosition;
};
If ($Sensor == 2) //Temp aussen
{
SetValue($Wert2, (ord($Datenpaket[$x+1])*0x100 + ord($Datenpaket[$x+2])-400)/10);
$x = $x + $BytePosition;
};
If ($Sensor == 3) //Temp Taupunkt
{
SetValue($Wert3, (ord($Datenpaket[$x+1])*0x100 +ord($Datenpaket[$x+2])-400)/10);
$x = $x + $BytePosition;
};
If ($Sensor == 4) //gefühlte Temp
{
SetValue($Wert4, (ord($Datenpaket[$x+1])*0x100 +ord($Datenpaket[$x+2])-400)/10);
$x = $x + $BytePosition;
};
If ($Sensor == 5) //Hitzeindex
{
SetValue($Wert5, (ord($Datenpaket[$x+1])*0x100 +ord($Datenpaket[$x+2])-400)/10);
$x = $x + $BytePosition;
};
If ($Sensor == 6) //rel. Feuchte innen
{
SetValue($Wert6, ord($Datenpaket[$x+1]));
$x = $x + $BytePosition;
};
If ($Sensor == 7) //rel. Feuchte aussen
{
SetValue($Wert7, ord($Datenpaket[$x+1]));
$x = $x + $BytePosition;
};
If ($Sensor == 8) //Absoluter Luftdruck
{
SetValue($Wert8, (ord($Datenpaket[$x+1])*0x100 +ord($Datenpaket[$x+2]))/10);
$x = $x + $BytePosition;
};
If ($Sensor == 9) //relativer Luftdruck
{
SetValue($Wert9, (ord($Datenpaket[$x+1])*0x100 +ord($Datenpaket[$x+2]))/10);
$x = $x + $BytePosition;
};
If ($Sensor == 10) //Windrichtung
{
SetValue($Wert10, ord($Datenpaket[$x+1])*0x100 +ord($Datenpaket[$x+2]));
$x = $x + $BytePosition;
};
If ($Sensor == 11) //Windgeschwindigkeit m/s
{
SetValue($Wert11, (ord($Datenpaket[$x+1])*0x100 +ord($Datenpaket[$x+2]))/10);
$x = $x + $BytePosition;
};
If ($Sensor == 12) //Windboen m/s
{
SetValue($Wert12, (ord($Datenpaket[$x+1])*0x100 +ord($Datenpaket[$x+2]))/10);
$x = $x + $BytePosition;
};
If ($Sensor == 13) //Regen aktuell
{
SetValue($Wert13, (ord($Datenpaket[$x+1])*0x1000000+ord($Datenpaket[$x+2])*0x10000 +ord($Datenpaket[$x+3])*0x100 +ord($Datenpaket[$x+4]))/10);
$x = $x + $BytePosition;
};
If ($Sensor == 14) //Regen Stunde
{
SetValue($Wert14, (ord($Datenpaket[$x+1])*0x1000000+ord($Datenpaket[$x+2])*0x10000 +ord($Datenpaket[$x+3])*0x100 +ord($Datenpaket[$x+4]))/10);
$x = $x + $BytePosition;
};
If ($Sensor == 15) //Regen auf eine Stunde hochgerechnet 10min * 6
{
SetValue($Wert15, ((ord($Datenpaket[$x+1])*0x1000000+ord($Datenpaket[$x+2])*0x10000 +ord($Datenpaket[$x+3])*0x100 +ord($Datenpaket[$x+4]))/10)*6);
$x = $x + $BytePosition;
};
If ($Sensor == 16) //Regen tag
{
SetValue($Wert16, (ord($Datenpaket[$x+1])*0x1000000+ord($Datenpaket[$x+2])*0x10000 +ord($Datenpaket[$x+3])*0x100 +ord($Datenpaket[$x+4]))/10);
$x = $x + $BytePosition;
};
If ($Sensor == 17) //Regen Woche
{
SetValue($Wert17, (ord($Datenpaket[$x+1])*0x1000000+ord($Datenpaket[$x+2])*0x10000 +ord($Datenpaket[$x+3])*0x100 +ord($Datenpaket[$x+4]))/10);
$x = $x + $BytePosition;
};
If ($Sensor == 18) //Regen Monat
{
SetValue($Wert18, (ord($Datenpaket[$x+1])*0x1000000+ord($Datenpaket[$x+2])*0x10000 +ord($Datenpaket[$x+3])*0x100 +ord($Datenpaket[$x+4]))/10);
$x = $x + $BytePosition;
};
//Sensor 19 Fehlt
If ($Sensor == 20) //Regen gesamt
{
SetValue($Wert20, (ord($Datenpaket[$x+1])*0x1000000+ord($Datenpaket[$x+2])*0x10000 +ord($Datenpaket[$x+3])*0x100 +ord($Datenpaket[$x+4]))/10);
$x = $x + $BytePosition;
};
If ($Sensor == 21) //Lichtsensor kLux
{
SetValue($Wert21, (ord($Datenpaket[$x+1])*0x1000000+ord($Datenpaket[$x+2])*0x10000 +ord($Datenpaket[$x+3])*0x100 +ord($Datenpaket[$x+4]))/10000);
$x = $x + $BytePosition;
};
If ($Sensor == 22) //?? Sonneneinstrahlung W/m2
{
SetValue($Wert22, (ord($Datenpaket[$x+1])*0x100 +ord($Datenpaket[$x+2])));
$x = $x + $BytePosition;
};
If ($Sensor == 23) //UV Index
{
SetValue($Wert23, ord($Datenpaket[$x+1]));
$x = $x + $BytePosition;
};
If ($Sensor == 24) //Datum
{
SetValue($Wert24a, ord($Datenpaket[$x+3]).".".ord($Datenpaket[$x+2]).".".ord($Datenpaket[$x+1]));
SetValue($Wert24b, ord($Datenpaket[$x+4]).":".ord($Datenpaket[$x+5]).":".ord($Datenpaket[$x+6]));
$x = $x + $BytePosition;
};
If ($Sensor == 25) //Windgeschwindigkeit Tagesspitze
{
SetValue($Wert25 , (ord($Datenpaket[$x+1])*0x100 +ord($Datenpaket[$x+2]))/10);
$x = $x + $BytePosition;
};
}
}
}
?>
und „Client Überwachung“
<?
define('Intervall', '60');
if($_IPS['SENDER'] == "TimerEvent")
{
//Zeit abgelaufen Überprüfen der letzten Aktualisierung/Änderung einer Variable
$Variablen_ID = 37181 /*[Client Socket wetter WLAN\RegVar Wetterdaten WLan\Wetterscript WLAN\Sync]*/;
$Variable_Daten = IPS_GetVariable($Variablen_ID);
$Delta = time()-($Variable_Daten['VariableUpdated']); // Letzte Variablenaktualisierung
//echo "DELTA seit letzter Aktualisierung: ".$Delta."
";
if ($Delta > 30)
{ // Variable wurde vor über 30 Sekunden zuletzt aktualisiert
//Client neu verbinden
$socket_id = IPS_GetInstance(27728 /*[Client Socket wetter WLAN]*/);
$IOinstanz = 27728 /*[Client Socket wetter WLAN]*/;
echo "FEHLER - Socket nicht verbunden!";
IPS_SetProperty($IOinstanz, "Open", false);
IPS_ApplyChanges($IOinstanz); //Neue Konfiguration übernehmen
IPS_Sleep(1000);
IPS_SetProperty($IOinstanz, "Open", true);
IPS_ApplyChanges($IOinstanz); //Neue Konfiguration übernehmen
}
//Timer nur neustarten
IPS_SetScriptTimer($_IPS['SELF'], Intervall);
echo "Client Wetter Timer neu gestartet" , "
" ;
}
else
{
//Timer anschalten
IPS_SetScriptTimer($_IPS['SELF'], Intervall);
}
?>