Froggit 3500 Wetterstation

Hallo. Lässt sich eine Froggit 3500 Wetterstation einbinden?

Diese Wetterstation wurde ja schon mal als baugleich zur Sainlogic Professionelle WLAN Funk Wetterstation - 10 in 1 Wi-Fi identifiziert. Dann lassen sich die Daten auch durch „Umrouten mit DNS“ abgreifen.

Viele Grüsse
Harald

PS: Links sind in dieser „Schicken neuen Webseite“ leider nicht mehr zu erkennen, Mußt halt den Mauszeiger über den kompletten Text führen
PPS: Links sind doch zu erkennen, nur in der Vorschau beim Editieren nicht

Hallo,

die o.g. Wetterstation gibt es mit PC Software zum auslesen der Daten per PC. Ich gehe also davon aus es geht ohne die bereits vorgestellte Lösung mit der DNS Umleitung.

Nun fehlt mir die zum Zielführende herangehensweis die WH4000SE per W-Lan direkt mit IP-Symcon zu verbinden.

Mit Wireshark habe ich gefunden das PC und Wetterstation miteinander reden aber dann fehlt mir einfach das Wissen was die beiden da reden oder wenigstens ein Ansatz wie ich weiter machen sollte.

Ich hoffe vielleicht hat jemand interesse mir zu helfen.

:banghead: :confused:

Die Software wird wohl bei der Wetterstation mitgeliefert oder kann man diese irgendwo herunterladen? Was siehst Du denn in Wireshark, kannst Du ja mal posten. Was hast Du Dir mit Wireshark bisher angeschaut bzw. wo kommst Du da eventuell nicht weiter?

Die Software wird mit dazu geliefert und lässt sich beim lieferanten bei Dokumente auch herunterladen. (froggit.de)

Ich kann mit den Anzeigen in Wireshark eigentlich nix anfangen nur das ich weis das Daten ausgetauscht werden zwischen 192.168.2.80 (PC mit IP-Symcon) und 192.168.2.117 (Wetterstation).

Ich denke zunächst muss ich herausfinden was der PC sendet um die Daten zu bekommen von der Wetterstation und anschliesend wie ich dies in IP-Symcon umsetze.

Das gleiche dann mit den Empfangenendaten, ich kann zwar manuel Daten aus dem Programm exportieren als CSV wodurch ich wüsste was rauskommen muss leider funktioniert automatische exportieren nicht um dann einfach als text in IP-Symcon zu importieren.

Viele Fragen aber keinen Lösungsansatz…

export.txt (49.6 KB)

Wireshark.pdf (316 KB)

Ich habe es soweit geschaft, was ich senden muss um eine Antwort zu erhalten:

<?

#"255" "255" "VT" "0" "HT" "STX" "0" "0" "38 30 0a"

#$commandIn = chr(0xFF).chr(0xFF).chr(0x0B).chr(0x00).chr(0x06).chr(0x04).chr(0x04).chr(0x19);
#ffff0b0006040419
#ffff0b000605051b
#ffff0b000606061d
#ffff0b000607071f
#ffff0b0006080821
#ffff0b0009020000808218
#ffff0b0009028000800218
#ffff0b000902000180831a
#ffff0b000902800180031a
#ffff0b000902000280841c
#ffff0b000902800280041c
#ffff0b000902000380851e
#ffff0b000902800380051e
#ffff0b0009020004808620
#ffff0b0009028004800620
#ffff0b0009020005808722
#ffff0b0009028005800722
#ffff0b0009020006808824
#ffff0b000902e887900116
#ffff0b000902c08890dac8
#ffff0b000902d28890ecec

$vz = 1000;



Switch ($_IPS['SENDER'])

    {

    Case "Execute":
	
	echo $_IPS['SENDER'] ,"
" ;
	
    Case "TimerEvent":

	CSCK_SendText(49716 /*[Client Socket]*/, ("\xff\xff\x0b\x00\x06\x04\x04\x19")); // Kommando senden
	IPS_Sleep($vz);
	CSCK_SendText(49716 /*[Client Socket]*/, ("\xff\xff\x0b\x00\x06\x05\x05\x1B")); // Kommando senden
	IPS_Sleep($vz);
	CSCK_SendText(49716 /*[Client Socket]*/, ("\xff\xff\x0b\x00\x06\x06\x06\x1d")); // Kommando senden
	IPS_Sleep($vz);
	CSCK_SendText(49716 /*[Client Socket]*/, ("\xff\xff\x0b\x00\x06\x07\x07\x1f")); // Kommando senden
	IPS_Sleep($vz);
	CSCK_SendText(49716 /*[Client Socket]*/, ("\xff\xff\x0b\x00\x06\x08\x08\x21")); // Kommando senden
	IPS_Sleep($vz);
	CSCK_SendText(49716 /*[Client Socket]*/, ("\xff\xff\x0b\x00\x09\x02\x00\x00\x80\x82\x18")); // Kommando senden
	IPS_Sleep($vz);
	CSCK_SendText(49716 /*[Client Socket]*/, ("\xff\xff\x0b\x00\x09\x02\x80\x00\x80\x02\x18")); // Kommando senden
	IPS_Sleep($vz);
	CSCK_SendText(49716 /*[Client Socket]*/, ("\xff\xff\x0b\x00\x09\x02\x00\x01\x80\x83\x1a")); // Kommando senden
	IPS_Sleep($vz);
	CSCK_SendText(49716 /*[Client Socket]*/, ("\xff\xff\x0b\x00\x09\x02\x80\x01\x80\x03\x1a")); // Kommando senden
	IPS_Sleep($vz);
	CSCK_SendText(49716 /*[Client Socket]*/, ("\xff\xff\x0b\x00\x09\x02\x00\x02\x80\x84\x1c")); // Kommando senden
	IPS_Sleep($vz);
	CSCK_SendText(49716 /*[Client Socket]*/, ("\xff\xff\x0b\x00\x09\x02\x80\x02\x80\x04\x1c")); // Kommando senden
	IPS_Sleep($vz);
	CSCK_SendText(49716 /*[Client Socket]*/, ("\xff\xff\x0b\x00\x09\x02\x00\x03\x80\x85\x1e")); // Kommando senden
	IPS_Sleep($vz);
	CSCK_SendText(49716 /*[Client Socket]*/, ("\xff\xff\x0b\x00\x09\x02\x80\x03\x80\x05\x1e")); // Kommando senden
	IPS_Sleep($vz);
	CSCK_SendText(49716 /*[Client Socket]*/, ("\xff\xff\x0b\x00\x09\x02\x00\x04\x80\x86\x20")); // Kommando senden
	IPS_Sleep($vz);
	CSCK_SendText(49716 /*[Client Socket]*/, ("\xff\xff\x0b\x00\x09\x02\x80\x04\x80\x06\x20")); // Kommando senden
	IPS_Sleep($vz);
	CSCK_SendText(49716 /*[Client Socket]*/, ("\xff\xff\x0b\x00\x09\x02\x00\x05\x80\x87\x22")); // Kommando senden
	IPS_Sleep($vz);
	CSCK_SendText(49716 /*[Client Socket]*/, ("\xff\xff\x0b\x00\x09\x02\x80\x05\x80\x07\x22")); // Kommando senden
	IPS_Sleep($vz);
	CSCK_SendText(49716 /*[Client Socket]*/, ("\xff\xff\x0b\x00\x09\x02\x00\x06\x80\x88\x24")); // Kommando senden
	IPS_Sleep($vz);
	CSCK_SendText(49716 /*[Client Socket]*/, ("\xff\xff\x0b\x00\x09\x02\xe8\x87\x90\x01\x16")); // Kommando senden
	IPS_Sleep($vz);
	CSCK_SendText(49716 /*[Client Socket]*/, ("\xff\xff\x0b\x00\x09\x02\xc0\x88\x90\xda\xc8")); // Kommando senden
	IPS_Sleep($vz);
	CSCK_SendText(49716 /*[Client Socket]*/, ("\xff\xff\x0b\x00\x09\x02\xd2\x88\x90\xec\xec")); // Kommando senden
		

	 break;
	 
    Default:
	echo $_IPS['SENDER'];
    break;

}


?>

Als Empfang leite ich es einfach nur erstmal weiter:

<?


Switch ($_IPS['SENDER'])
    {


	Case "RegisterVariable":
	
	
        $data = $_IPS['VALUE'];   
		
        echo $_IPS['SENDER']."
", "EMPFANGEN: " ."
" .$data;
		
		#$data1 = json_decode($data);
		#var_dump($data1);
		
	break;
    
	Default:
    break;
}
?>

Darauf erhalte ich die Antwort wo die Wetter Daten drin versteckt sind:

siehe Dok1 und Dok2:

nun mei Problem:

wie bekomme ich aus dem Datensalat meine Werte oder muss ich die Empfangenen Zeichenketten irgenwie decodieren?
Was könnte ich alles Versuchen um an die Werte zu gelangen oder kommt es jemanden bekannt vor wie womit ich decodieren oder umwandeln muss…

VG
Sven

Dok1.pdf (98.4 KB)

Dok2.pdf (102 KB)

Das ist ja schon mal was.

Mach mal im Clientsocket Fenster (dok1) unten links den Haken für HEX raus und schau ob da irgendwas Sinnvolles ankommt. Wenn da JSON oder XML oder sonst was lesbares gesendet wird, ist das kein Problem. Wenn da zunächst irgendwelche nicht lesbaren Daten ankommen muss das eventuell dekodiert werden. Da wird das dann nicht einfach, da man wissen muss wie man das dekodiert. Aber schaue Dir erst mal die Daten im Clientsocket als Text an, vielleicht werden da ja Daten übertragen die man extrahieren kann.

das sieht so aus???

:confused:

Dok2.pdf (186 KB)

Hast Du mal bei Wetterstation WS980WiFi von ELV geschaut ? Die Stationen sind wohl nicht alle baugleich, kann aber sein das das ja bei Dir funktioniert.

Perfekt funktoniert auf anhieb, vielen Dank für deine Hilfe und mit Suchen :slight_smile:

Ich bin jetzt schon auf Seite 39 von dem Sainlogic Wetterstations-Thread und suche nebenher nach passenden Wetterstationen.
Da die Froggit-Stationen auch als kompatibel genannt wurde war ich dort auch auf der Webseite.
Dort habe ich unter anderem den DP1500 Wetterserver gefunden. An diesen lässt sich eine WH4000SE oder WH3000SE Außeneinheit anmelden und weitere Meßfühler wie ein Bodenfeuchte-Sensor und zahlreiche Inneneinheiten für Temperatur und Luftfeuchte, außerdem ist der Luftqualitätssensor interessant. Es gibt hier teilweise auch Bundles.
Das fände ich noch interessanter, als so eine Wetterstation mit Displayeinheit, die ich sowieso nicht nutzen möchte.
Der Wetterserver kann wohl auch die Daten an div. Onlinedienste schicken, daher denke ich, die DNS-Umleitung wäre machbar, jedoch steht in der Beschreibung, dass dort nur die Außenwerte übertragen werden und nicht die von den Zusatzsensoren.
In der Beschreibung steht: „Live-Daten Ansicht auf der App: Alle Messdaten der angebunden Sensoren stehen mittels der WS-View App in Ihrem lokalen Netzwerk zur Verfügung.“

Das hört sich so an, als ob es evtl. eine Schnittstelle gäbe. Hat das schon mal jemand eingebunden?

VG
Ralph

Das hört sich zumindest spannend an, da bräuchte es aber letztlich jemand der sowohl die Station als auch die Sensoren besitzt und sich das dann mal näher anschaut. Wenn WS-View die Daten auslesen kann, dann sollte das wohl auf anderem Weg bzw. aus IP-Symcon auch gehen.Vielleicht findet sich ja jemand von den Froggit Besitzern, der den Datenverkehr mal näher analysieren kann.

Servus,

such auch gerade eine WS die ich gut in Symcon bringen würde. Leider ist eine Davis preislich derzeit nicht drin.
Auf die Froggit HP1000SE kam ich weil sie
a) so aussieht wie die ELV WS980WiFi
B) es für die HP1000SE einen günstigen (ca. 70 Euro) Bodenfeuchte Sensor geben soll.
Und um die Bodenfeuchte geht es mir hauptsächlich.

Vlt hat das mal jemand versucht oder sonst eine Idee?

Danke und Gruss
Seppm

Hallo,

ich habe mir die DP1500 inzwischen bestellt und die ganze Wetterstation inkl. Aufbau und Einrichtung in IP-Symcon innerhalb einer Stunde am Laufen gehabt. In der App kann man frei die IP-Adresse und den Port eintragen, wohin die Daten geschickt werden.
Das vorhandene Modul für IP-Symcon konnte ich nicht nutzen, da es nur das Wunderground Format unterstützt. Das Ecowitt-Format ist aber sehr ähnlich und es war kein Problem, die Warte auszulesen. Hier habe ich den Vorteil, weitere günstige Temperatur-/Luftfeuchtesensoren einzubinden und auch einen oder mehrere Bodenfeuchtesensoren und den Luftqualitätssensor.

Von daher bin ich sehr zufrieden und kann das System nur weiterempfehlen.

Das ist sehr spanned zu lesen, könntest Du das teilen wie Du dazu genau vorgegangen bist um die Bodenfeuchtesensoren und den Luftqualitätssensor einzubinden? Dann könnte man das ja noch im Modul ergänzen, und wegen den Sensoren hatte schon öfter der ein oder andere gefragt ob und wie das funktioniert.

Oh, Du bist ja flott!
Ich hab die genau gleichen Fragen wie Fonzo. Dann ja lieber die DP1500 wenn da auch ein paar Bodenfühler dran gehen (die sind grad nicht lieferbar sah ich im Froggit Shop).
Wäre super wenn Du uns da ein wenig Licht ans Fahrrad machen kannst.
Dachte schon ich bin wieder der Einzige der es nicht schnallt, daher danke Fonzo :slight_smile:

Cheers Seppm

Hi Ralph,

noch eine Frage zum DP1500 selbst.

Du hast den DP1500 USB-Dongle genommen, oder?
Froggit Wetterstationen Shop - DP1500 Wi-Fi Wetterserver USB-Dongle inkl. 1 x DP50 & WH3000SE All-in-One Außensensor
Das schliesst sich mit deren Displays wohl aus (also entweder empfängt das Display oder die USB-Einheit?).
Und es scheint auch als ob nur an den USB-Dongle die weiteren Sensoren angebunden werden können, u.a. der Bodenfeuchte, Feinstaub etc.

Die Menge an Optionen macht es grad nicht einfacher.

Bedankt! Cheers Seppm

Der Bodenfeuchte-Sensor ist bei Froggit schon gelistet und noch interessanter ist der Preis: 39,99€

Froggit selbst schreibt zur Anbindung:

Unterstützt die Überwachung von mehreren Standorten: Das froggit DP1500 (separat erhältlich) unterstützt bis zu 8 DP100 Bodenfeuchtesensoren. An die HP1000SE PRO kann 1 DP100 Bodenfeuchtsensor angebunden werden.

Das schreit nach Investition.

Gruß

Burkhard

Hallo Ralph,

ich bin auch auf der Suche nach einer neuen Wetterstation, da meine LCN-WRL schön langsam den Geist aufgibt und alleine der Außentemperaturfühler (bei mir gerade defekt) ca. satte Euro 120,00 kostet :eek:

Nach vielen Recherchen bin ich auch bei der DP1500 gelandet.(flexibel erweiterbar!, kein für mich unnützes Display,…).

Aber wie hast du jetzt die froggit eingebunden? Mit dem Modul oder dem Skript hier?

lg
hagi

Hallo,

sorry, ich war ein paar Tage nicht im Forum.
Also ich habe den DP1500 USB-Dongle genommen, genau das von seppm verlinkte Set, nur mit einem DP50 Sensor mehr. Die Bodenfeuchte-Sensoren habe ich auch noch nicht.

Da ich inzwischen einige Rückfragen habe, wie das in IP-Symcon eingerichtet wird, hier eine kleine Beschreibung:
DP1500 an ein USB-Ladegerät oder PC anschließen, um es mit Strom zu versorgen, App installieren und damit suchen. Grundeinrichtung mit der App abschließen.
Der Dongle erkennt die Geräte und bindet sie automatisch ein, bei mir Wetterstation, die beiden DP50 und den Luftgütesensor. In der App erscheinen deren Werte dann automatisch. Unter dem Menüpunkt More/Weather Services gibt es folgende Wetterdienste, denen man seine Daten anvertrauen kann: ecowitt.net, Wunderground, Weathercloud, WeatherObservationsWebsite und Customized.
Letztere Einstellung habe ich gewählt.
Also Protokoll geht Ecowitt und Wunderground. Wunderground geht sofort mit Fonzos Modul, aber es werden dort nicht alle Daten übertragen, weil Wunderground das nicht verarbeitet. Das Ecowitt-Protokoll kann das. Unter Server IP gibt man die IP-Adresse von IP-Symcon ein. Der Pfad-Eintrag kann ignoriert werden. Der Port ist noch wichtig. Hier wird der Port des IP-Symcon Sockets hinterlegt.
Bei Upload Intervall kann man einstellen, wie oft die Daten übertragen werden. 60 Sekunden sind bei mir gut.

In IP-Symcon habe ich das ganze so eingerichtet:
Unter I/O-Instanzen wird ein Server Socket eingerichtet. Rechte Maustaste -> Objekt hinzufügen -> Instanz
Dann i Server Socket[/i] auswählen und OK. Im folgenden Dialog auf Aktiv stellen und Port eingeben. In meinem Fall Port 46000.
Dann unten Änderungen übernehmen. Dann kann man im Reiter rechts oben auf Debug klicken und sollte dort alle 60 Sekunden einen neuen Datensatz empfangen. Wieder rechts oben unter dem Punkt Darstellung kann man Text (Roh) auswählen und sieht dann die Daten im Klartext. In meinem Beispiel sieht das so aus:

[i]03.07.2020, 05:59:17 | RECEIVED [192.168.99.65:16604] | POST /data/report/ HTTP/1.1
HOST: 192.168.99.132
Connection: Close
Content-Type: application/x-www-form-urlencoded
Content-Length: 558

PASSKEY=05DA123455F1234D05BCC3EB123B5EF3&stationtype=GW1000A_V1.6.0&dateutc=2020-07-03+03:59:17&tempinf=81.3&humidityin=55&baromrelin=29.338&baromabsin=29.338&tempf=60.3&humidity=91&winddir=0&windspeedmph=1.12&windgustmph=2.24&maxdailygust=3.36&solarradiation=6.48&uv=0&rainratein=0.000&eventrainin=0.417&hourlyrainin=0.000&dailyrainin=0.000&weeklyrainin=1.000&monthlyrainin=0.417&yearlyrainin=4.260&totalrainin=4.260&temp1f=78.98&humidity1=64&temp2f=63.32&humidity2=78&pm25_ch1=8.0&pm25_avg_24h_ch1=8.3&wh65batt=0&batt1=0&batt2=0&freq=868M&model=GW1000_Pro[/i]

Hier Info an Fonzo: Die Temperatur und Luftfeuchtigkeitswerte der Zusatzsensoren werden durchnumeriert, ebenso die pm25-Werte, falls man mehrere Sensoren hat. Den Bodenfeuchtesensor habe ich leider noch nicht, daher weiß ich nicht, wie das übermittelt wird. Das werde ich aber nachreichen, sobald dieser kommt.
Ein Problem habe ich noch mit dem Luftruck. Ich weiß nicht, wie ich den gelieferten Wert 29.338 umrechne in hPa. In der App steht hier 993.4 hPa.

Weiter geht es in IP-Symcon unter dem Punkt Splitter-Instanzen. Dort mit der rechten Maustaste wieder eine neue Instanz einrichten.
Ich wählte hier i Cutter[/i]. Als Name vergebe ich: Wetterstations-Cutter. In den folgenden Einstellungen benutze ich als Typ Benutze Zeichen für Schnitte.
Linkes Trennzeichen: PASSKEY=05DA123455F1234D05BCC3EB123B5EF3&
Rechtes Trennzeichen: &model=GW1000_Pro
Dann abspeichern. Oben im Reiter noch auf Schnittstelle ändern klicken und dort den erstellten Socket auswählen und OK.
Rechts oben unter Debug kann man wieder schauen, was dabei herauskommt.
In meinem Fall:
stationtype=GW1000A_V1.6.0&dateutc=2020-07-03+03:59:17&tempinf=81.3&humidityin=55&baromrelin=29.338&baromabsin=29.338&tempf=60.3&humidity=91&winddir=0&windspeedmph=1.12&windgustmph=2.24&maxdailygust=3.36&solarradiation=6.48&uv=0&rainratein=0.000&eventrainin=0.417&hourlyrainin=0.000&dailyrainin=0.000&weeklyrainin=1.000&monthlyrainin=0.417&yearlyrainin=4.260&totalrainin=4.260&temp1f=78.98&humidity1=64&temp2f=63.32&humidity2=78&pm25_ch1=8.0&pm25_avg_24h_ch1=8.3&wh65batt=0&batt1=0&batt2=0&freq=868M

Nun muss das ganze ja noch durch ein Skript verarbeitet werden, daher übergebe alles ich mittels einer Register-Variablen an ein Skript.
Die Register Variable wird folgendermaßen angelegt. Unter einem geeigneten Unterpunkt (bei mir ist es der Skripte-Ordner), klickt man wieder mit der rechten Maustaste und erstellt eine neue Instanz i Register Variable[/i]. Im folgenden Dialog wählt man als Ziel sein Skript aus, mit dem die Daten verarbeitet werden und übernimmt die Änderung. Dann wird im Reiter noch der Punkt Gateway ändern geklickt und dort der vorher erstellte Cutter ausgewählt. Fertig.

Mein einfaches Skript möchte ich hier auch noch weitergeben. Hier habe ich mir ein paar Ideen und Umrechungsfunktionen von Fonzo’s Skript geliehen, um nicht alles neu machen zu müssen. Manche Funktionen werden gar nicht benutzt, aber ich habe sie drin gelassen, falls ich sie mal brauche.
Die ausgelesenen Werte schreibe ich mittels SetValueFloat direkt in meine Variablen, die natürlich vorher an der gewünschten Stelle erzeugt werden müssen. Dort gleich darauf achten, dass diese den richtigen Typ haben und unter Profil- und Aktionseinstellungen das richtige Profil hinterlegt ist. Ggf. unter Archiveinstellungen die Archivierung aktivieren.

<?php
// wenn das Skript von einer RegisterVariable-Instanz aus aufgerufen worden ist
if ($_IPS['SENDER'] == "RegisterVariable")
{
    // bereits im Puffer der Instanz vorhandene Daten in $data kopieren
    $data  = $_IPS['VALUE']; //RegVar_GetBuffer($_IPS['INSTANCE']);
    
IPS_LogMessage(IPS_GetName($IPS_INSTANCE), 'Aktuelle Daten: '.$data);
// wenn das Trennzeichen ; in $data gefunden worden ist

    if (strpos($data, '&')) {
        // $data in durch & separierte Datensätze zerlegen
        $datasets = explode('&', $data);
        $wsvar = array();
 
        // alle nicht durch ; terminierten Datensätze ausgeben
        for ($i = 0; $i < count($datasets) - 1; $i++) {
            echo "empfangener Datensatz: ".$datasets[$i]."
";
            $array = explode('=', $datasets[$i]);
            $wsvar[$array[0]] = $array[1];
        }
    }

    // Werte aktualisieren
    SetValueString(19071, $wsvar['stationtype']);
    SetValueString(48191, $wsvar['dateutc']);
    SetValueFloat(23825, FahrenheitToCelsius(floatval($wsvar['tempinf'])));
    SetValueFloat(53008, FahrenheitToCelsius(floatval($wsvar['tempf'])));
    SetValueFloat(55921, FahrenheitToCelsius(floatval($wsvar['temp1f'])));
    SetValueFloat(48870, FahrenheitToCelsius(floatval($wsvar['temp2f'])));
    SetValueFloat(21877, $wsvar['humidityin']);
    SetValueFloat(54217, $wsvar['humidity']);
    SetValueFloat(24986, $wsvar['humidity1']);
    SetValueFloat(20981, $wsvar['humidity2']);
    SetValueFloat(51053, $wsvar['baromrelin']);
    SetValueFloat(26457, $wsvar['baromabsin']);
    SetValueFloat(41177, MilesToKilometer(floatval($wsvar['windspeedmph'])));
    SetValueFloat(58958, MPHToMS(floatval($wsvar['windspeedmph'])));
    SetValueFloat(16936, MilesToKilometer(floatval($wsvar['windspeedmph'])));
    SetValueFloat(46939, MilesToKilometer(floatval($wsvar['maxdailygust'])));
    SetValueFloat(26557, $wsvar['solarradiation']);
    SetValueInteger(16780, intval($wsvar['uv']));
    SetValueFloat(29781, floatval($wsvar['pm25_ch1']));
    SetValueInteger(59295, intval(floatval($wsvar['pm25_ch1'])*4.222));
    SetValueFloat(57084, floatval($wsvar['pm25_avg_24h_ch1']));
    SetValueInteger(50849, intval(floatval($wsvar['pm25_avg_24h_ch1'])*4.222));
    SetValueInteger(19440, floatval($wsvar['pm25batt1']));
    SetValueFloat(33017, Rain(floatval($wsvar['dailyrainin'])));
    SetValueFloat(37955, Rain(floatval($wsvar['hourlyrainin'])));
    SetValueFloat(51919, Rain(floatval($wsvar['weeklyrainin'])));
    SetValueFloat(11511, Rain(floatval($wsvar['monthlyrainin'])));
    SetValueFloat(31384, Rain(floatval($wsvar['yearlyrainin'])));
    SetValueFloat(10942, Rain(floatval($wsvar['totalrainin'])));
    SetValueFloat(33139, Rain(floatval($wsvar['rainratein'])));
    SetValueFloat(53623, windchill(FahrenheitToCelsius(floatval($wsvar['tempf'])),MilesToKilometer(floatval($wsvar['windspeedmph']))));
    SetValueFloat(21306, heatindex(FahrenheitToCelsius(floatval($wsvar['tempf'])),(floatval($wsvar['baromrelin']))));
}

// Windchill Berechnung
function windchill(float $temperatur, float $windspeed) {
    if ($windspeed > 4.8) {
        $windchill = 13.12 + 0.6215 * $temperatur - 11.37 * pow($windspeed, 0.16) + 0.3965 * $temperatur * pow($windspeed, 0.16);
        return $windchill;
    } else {
        $windchill = $temperatur;
        return $windchill;
    }
}

// Hitze-Index-Berechnung
function heatindex($t, $r) {
  // Relative Luftfeuchtigkeit limitieren
  if ($r < 0) { $r = 0; }
  if ($r > 100) { $r = 100; }
 
  // Hitzeindex
  $hi = -8.784695 + 1.61139411*$t + 2.338549*$r - 0.14611605*$t*$r - 0.012308094*$t*$t - 0.016424828*$r*$r + 0.002211732*$t*$t*$r + 0.00072546*$t*$r*$r - 0.000003582*$t*$t*$r*$r;
  return $hi;
} // end heatindex

function CelsiusToFahrenheit(float $celsius)
{
    return $celsius * 1.8 + 32;
}

function FahrenheitToCelsius(float $fahrenheit)
{
    return ($fahrenheit - 32) / 1.8;
}

function MilesToKilometer(float $mph)
{
    $kmh = $mph * 1.609344;
    return $kmh;
}

function MilesToKN(float $mph)
{
    $kn = $mph * 0.86897624190065;
    return $kn;
}

function KilometerToKN(float $kmh)
{
    $kn = $kmh / 1.852;
    return $kn;
}

function MPHToMS(float $mph)
{
    $ms = $mph * 0.44704;
    return $ms;
}

function MSToMPH(float $ms)
{
    $mph = $ms * 2.23694;
    return $mph;
}

function Rain(float $inch)
{
    $mm = $inch * 25.4;
    return $mm;
}

function RainToInch(float $mm)
{
    $inch = $mm * 0.03937007874;
    return $inch;
}

function Pressure_absolute(float $pressure)
{
    $pascal = $pressure / 0.02952998751;
    return $pascal;
}

function Pressure(float $pressure, float $temperature)
{
    $pascal   = $pressure / 0.02952998751;
    $altitude = $this->ReadPropertyInteger('altitude_above_sea_level');

    $g0 = 9.80665;                                         // Normwert der Fallbeschleunigung
    $R  = 287.05;                                          // Gaskonstante trockener Luft
    $T  = 273.15;                                          // 0°C in Kelvin
    $Ch = 0.12;                                            // Beiwert zu E
    if ($temperature < 9.1) {
        $E = 5.6402 * (-0.0916 + exp(0.06 * $temperature));        // Dampfdruck des Wasserdampfanteils bei t < 9.1°C
    } else {
        $E = 18.2194 * (1.0463 - exp(-0.0666 * $temperature));    // Dampfdruck des Wasserdampfanteils bei t >= 9.1°C
    }
    $a  = 0.0065;                                          // vertikaler Temperaturgradient
    $xp = $altitude * $g0 / ($R * ($T + $temperature + $Ch * $E + $a * $altitude / 2)); // Exponent für Formel
    $p0 = $pascal * exp($xp);                             // Formel für den NN-bezogenen Luftdruck laut Wikipedia
    return $p0;
}

function PressurehPaToBar($pressure)
{
    $bar = $pressure * 0.02952998751;
    return $bar;
}    
?>

Viele Grüße
Ralph