Wetterstation P03/3-RS485

Hallo zusammen,
ich bin aktuell dabei meine alte Haussteuerung auf IPS umzubauen.
Jedoch habe ich bei der Wetterstation ELSNER [Wetterstation P03/3-RS485] so meine aktuelle Grenze erreicht. Ich habe die Schnittstelle über ein WAVESHARE 2-CH RS485 TO POE ETH (B) an IPS angebunden und bekomme auch jede menge Datenpakete in HEX.
Leider habe ich nun keine Idee wie ich diese in Werte umwandeln kann um die Instanzen dann weiter nutzen zu können.

Ich habe mir das ELSNER Test Tool installiert um rauszubekommen welche Werte die Signale darstellen.

Ich habe im Datenblatt zwar die Zuordnungstabelle gefunden,


was mir jedoch beim PHP Scripting nicht so richtig weiterhilft.

Leider konnten ich im Forum bisher keine Artikel finden die mir hier weiterhelfen könnten. Vielleicht hat jemand einen TIP oder ein Skript.
Gruß
Christian

Nennt sich Client-Socket mit Cutter und Registervariable.

Wenn der Cutter korrekt eingerichtet ist, sollte eigentlich schon folgende Zeile im RegisterVariablen Script (per Hand anlegen → Automatition->PHP Script, dann als Ziel in der Registervariable auswählen und OBEN unter Gateway ändern den Cutter wählen).

 if ($_IPS['SENDER'] == "RegisterVariable") {
        IPS_LogMessage("Wetterstation", $_IPS['VALUE']);
}

jetzt sollten die Daten im ‚Meldungsfenster‘ sichtbar sein.
Im nächsten Schritt kann man dann die Daten zusammenbauen.
Sinngemäß etwas wie:

$atID = 12345; // meine ID der Float Variable
$data = $_IPS['VALUE']; // nur für die Übersichtlichkeit
$at = (float)substr($data, 0,5);
SetValueFloat($atID, $at);

Moin,
vielen dank für die schnelle Unterstützung. Werde das gleich mal ausprobieren.
Bin sehr gespannt auf das erste Ergebnis.
Gruß
Christian

Hallo,
ich habe das jetzt Ausprobiert, jedoch wohl nicht in allen Schritten, da am Ende kein Ergebnis angezeigt wird. Ich kann mir gut vorstellen das ich einen kleinen, jedoch Wichtigen Schritt nicht beachtet habe, so wie ich das Programm bisher kennengelernt habe. Mir ist auch nicht so ganz klar wie ich mit dem „Zerschneider“ den String so zerteile das ich meine acht Werte bekomme, die mir die Wetterstation liefert.

  • Temperatur
  • Helligkeitswert in kLUX für Süd, Ost und West
  • Tageslichtwert 0-999lx
  • Dämmerung
  • Regen
  • Windgeschwindigkeit in m/s

Ich habe bereits einzelne Variablen für jeden Messwert angelegt, jedoch fehlt mir gerade noch die Verknüpfung wie ich die mit den Messwerten aus dem „Zerschneider“ fülle und wie ich die Registervariable nutze das diese die Zerschneiderwerte aufnimmt und dann weitergibt.

Wenn man das verstanden hat ist es bestimmt wieder am ende ganz einfach :wink:
Gruß
Christian

Ich habe hier noch das passende Skript zum Beitrag, welches mit Hilfe von @tobiasr entstanden ist.

<?php
if ($_IPS['SENDER'] == "RegisterVariable") {
    $data = $_IPS['VALUE']; // nur für die Übersichtlichkeit

    //IPS_LogMessage("Wetterstation", $data);

    $pruefsumme = 87; // Dezimal fuer "W" - 1. byte durch Cutter abgeschnitten
    for($i=0;$i<34;$i++){
        $pruefsumme = $pruefsumme +  ord( $data[$i] );
    }
    $ws_ps = (int)substr($data, 34,4);
    //IPS_LogMessage("Wetterstation", "Pruefsumme: " . $pruefsumme . " -- WS_PS: ". $ws_ps);
    if($ws_ps != $pruefsumme){
        // Abbruch - E-Mail senden oder so
    }else{

        //Werte aus Wetterstation
        $atID = 55351; // Temperatur
        $at = (float)substr($data, 0,5);
        SetValueFloat($atID, $at);

        $ssID = 30914; // Süd
        $ss = (int)substr($data, 5,2);
        SetValueInteger($ssID, $ss);

        $swID = 42803; // West
        $sw = (int)substr($data, 7,2);
        SetValueInteger($swID, $sw);

        $atID = 47520; // Ost
        $at = (int)substr($data, 9,2);
        SetValueInteger($atID, $at);

        $atID = 14621; // Dämmerung
        $at = substr($data, 11,1);
        $at = ($at=="J") ? true : false;
        SetValueBoolean($atID, $at);

        $atID = 22780; // Tageslicht
        $at = (int)substr($data, 12,3);
        SetValueInteger($atID, $at);

        $atID = 29037; // Wind in m/s
        $at = (float)substr($data, 15,4);
        SetValueFloat($atID, $at);

        //Umrechnung von m/s in km/h
        $speedms = GetValue(29037); // Objekt ID der Variable m/s
        $speedkmh = $speedms*3.6;
        SetValue(25521, $speedkmh); // Objekt ID der Variable km/h

        // Wert aus der Wetterstation
        $atID = 14071; // Regen
        $at = substr($data, 19,1);
        $at = ($at=="J") ? true : false;
        SetValueBoolean($atID, $at);
    }
}