Wettersensor KS300-2

so nach langer Zeit habe ich mich auch mal an die Auswertung der Regenmenge rangemacht.
Die ganzen Scripte sind ja nichts neues, allerdings weit im Forum verstreut und teilweise auch nicht als PHP formatiert, man sucht sich dumm und dämlich :smiley:
Ich erlaube mir mal hier eine Zusammenfassung der Scripte sowie mein eigenes dazustellen. Ich hoffe, es ist genehm.

Die einzelnen Threads werde ich nach reichen, muss ich schon wieder suchen :slight_smile:

Hier mal meine Version mit angepassten Scripten und getestet mit Messbecher :rolleyes:

Ich habe die Scripte mal einigermassen dokumentiert, so das man ersehen kann welche Variablen oder Timer benötigt werden.

Dank auch noch mal an prof(Fabian).

Script von Thomas für Anpassung an KS300-2

<?
/*
*******************************
 IP-SYMCON Event Scripting
*******************************
File     : Regenmenge.ips.php
Trigger  : OnChange ks300_regenmenge
Interval : 
*/


//Anpassung für KS300-2
$a = floor((GetValueInteger("ks300_regenmenge")%256)/16)+(GetValueInteger("ks300_regenmenge")%16)*16+floor(GetValueInteger("ks300_regenmenge")/256)*256;
SetValueInteger("Regen_ist",intval($a));
?>

4 eigene Scripte mit Umrechnung von Thomas

<?
/*
*******************************
 IP-SYMCON Event Scripting
*******************************
File     : RegenStunde.ips.php
Trigger  : OnChange Regen_ist, Regenmenge_liter_stunde
Interval : 
*/

//Werte holen und Umrechnung
$Liter = GetValueInteger("Regen_ist");
$Stunde = GetValueInteger("Regenmenge_liter_stunde");
$LiterStunde = ($Liter-$Stunde)/16*0.295;
SetValueFloat("LiterStunde",$LiterStunde);
?>
<?
/*
*******************************
 IP-SYMCON Event Scripting
*******************************
File     : RegenTag.ips.php
Trigger  : OnChange Regen_ist, Regenmenge_liter_tag
Interval : 
*/

//Werte holen und Umrechnung
$Liter = GetValueInteger("Regen_ist");
$Tag = GetValueInteger("Regenmenge_liter_tag");
$LiterTag = ($Liter-$Tag)/16*0.295;
SetValueFloat("LiterTag",$LiterTag);
?>
<?
/*
*******************************
 IP-SYMCON Event Scripting
*******************************
File     : Regen_liter_stunde_pro_qm.ips.php
Trigger  :
Interval : über TimerEvent alle Stunde
*/

//Werte holen und setzen
$Regen = GetValueInteger("Regen_ist");
SetValueInteger("Regenmenge_liter_stunde",$Regen);
?>
<?
/*
*******************************
 IP-SYMCON Event Scripting
*******************************
File     : Regen_liter_tag-pro_qm.ips.php
Trigger  :
Interval : über TimerEvent jeden morgen um 7:30
*/

//Werte holen und setzen
$Regen = GetValueInteger("Regen_ist");
SetValueInteger("Regenmenge_liter_tag",$Regen);
?>

Sorry mein Rechner spinnt wohl, kann auswählen was ich will er kopiert immer das selbe :mad:
Da hat Windows nach dem letzten Update wieder mal ganze Arbeit geleistet, erst geht svchost in den Himmel und jetzt löscht er wohl die Zwischenablage nicht mehr.

Ich muss im Moment leider alles per Hand anpassen, bitte nicht antworten

Die Variablen sind als Bild angehängt.

Als Referenz für die Umrechnung setzte ich den Wippenzähler.
Der Regensensor funktioniert bei mir auch nur mit dem Messbecher einwandfrei, liegt wohl doch am Abstand der Kontakte.

Hoffe habe nichts vergessen und es ist etwas übersichtlicher geworden.

tut mir leid aber im Moment geht gar nix, wird alles nachgereicht :slight_smile:

So es darf gelästert werden :wink:

Hmm, wenn ich mir die letzten beiden skripte anschaue, dann kann ich mir nicht vorstellen das sie das machen, was ich mir darunter vorstellen würde wenn ich mir die jeweiligen Skriptnamen vergegenwärtige…

Gruss,
Olli

PS: aber ich habe auch keine KS300 oder so… also wer weiss…

Hmm, wenn ich mir die letzten beiden skripte anschaue, dann kann ich mir nicht vorstellen das sie das machen, was ich mir darunter vorstellen würde wenn ich mir die jeweiligen Skriptnamen vergegenwärtige…

Und das wäre ?

Da gibt es das Skript: Regen_liter_tag-pro_qm

Da würde ich draus schliessen, dass mir dort die gefallenen Liter des vergangenen Tages angezeigt werden - oder alternativ die gefallenen Liter des aktuellen Tages ab einer bestimmten Uhrzeit (z.B. 7:30).

Nun weiss ich nicht genau wie die KS300 funktioniert - es ändert aber nicht’s am System. Ich gehe jetzt einfach mal davon aus, das die KS300 keine aktuelle Regenmenge anzeigt sondern die Gesamtregenmenge auf einen Zähler einfach nur aufaddiert (das wäre technisch relativ einfach zu lösen mit einer Regenwippe).

Wenn ich nun die Regenmenge über ein Zeitintervall berechnen möchte (sei es eine Stunde oder ein Tag) dann muss ich mir den Zählerstand zum Beginn des Zeitintervalls merken (also Beginn der Stunde oder Beginn des Tages).

Erst dann kann ich ein Delta berechnen zum aktuellen Zählerstand und somit die entsprechenden Liter an Regen ausrechnen.

Und nun bin ich ein wenig verwirrt: das Skript heisst „Regen_liter_tag-pro_qm“ -> ist DAS evtl. der Merker für den Startwert des Zählers eines Intervalls? Vom Namen hört’s sich ja eher so an als würde mir das Skript den aktuellen Stand berechnen…

Also ist die Berechnung der Differenz wohl in den oberen beiden Skripten (des 4’er Packs)??

Gruss,
Olli

Hallo Rainer,

das Skript von Thomas mag wohl seinen Zweck erfüllen (das ist ja die Hauptsache) ist aber etwas umständlich programmiert.

//Anpassung für KS300-2
$a = floor((GetValueInteger("ks300_regenmenge")%256)/16)+(GetValueInteger("ks300_regenmenge")%16)*16+floor(GetValueInteger("ks300_regenmenge")/256)*256;
SetValueInteger("Regen_ist",intval($a));

Das folgende Skript-Fragment verwendet ausschließlich reine Integer-Verknüpfungen. Es spielt zwar bei den heutigen schnellen CPUs keine Rolle, aber es dürfte mindestens 100mal (vielleicht sogar 1000mal) schneller sein.

$rm = GetValueInteger("ks300_regenmenge");
// die beiden Halb-Bytes (Nibbles) des niederwertigen Bytes (LSB) vertauschen:
$a =   ( $rm & 0xff00      )  // LSB ausblenden
     + (($rm & 0xf0  ) >> 4)  // oberes  Nibble des LSB 4x rechts schieben (entspricht Division durch 16)
     + (($rm & 0x0f  ) << 4); // unteres Nibble des LSB 4x links schieben  (entspricht Multiplikation mit 16)
SetValueInteger("Regen_ist", $rm);

Man sollte grundsätzlich immer bestrebt sein unnötige Typkonvertierungen zu vermeiden. Besonders zeitaufwändig sind dabei Float-Funktionen („floor(…)“) und alle Arten von Divisionen ("/", „%“).

Es ist immer von Vorteil sich erst einmal klar zu machen, was eigentlich bezweckt werden soll. Diese „Anpassung“ bewirkt offensichtlich nichts anderes, als die Vertauschung der beiden Nibbles (Halb-Bytes) des unteren Bytes. Wenn man das weiß, wird schnell deutlich, dass Float-Funktionen hier unangebracht sind.

Ansonsten geht es mir wie Olli, ich habe ebenfalls von der KS300 keine Ahnung :D. Darüber hinaus ist mir völlig unklar, warum diese Vertauschung überhaupt nötig ist :confused:.

Gruß
HJH

Hallo HJH, Olli,

das ganze habe ich probiert nach diesem Thread. http://www.ipsymcon.de/forum/showthread.php?t=1865&highlight=ks300

Dein Script setzt mir allerdings den selben Wert wie vom KS300 gesendet wird. Das wiederum heist, das ich die selben Sprünge wieder drin habe. Irgendwas fehlt da noch.

$rm = GetValueInteger("ks300_regenmenge"); 
// die beiden Halb-Bytes (Nibbles) des niederwertigen Bytes (LSB) vertauschen: 
$a =   ( $rm & 0xff00      )  // LSB ausblenden 
     + (($rm & 0xf0  ) >> 4)  // oberes  Nibble des LSB 4x rechts schieben (entspricht Division durch 16) 
     + (($rm & 0x0f  ) << 4); // unteres Nibble des LSB 4x links schieben  (entspricht Multiplikation mit 16) 
SetValueInteger("Regen_ist", $rm);

Und nun bin ich ein wenig verwirrt: das Skript heisst „Regen_liter_tag-pro_qm“ → ist DAS evtl. der Merker für den Startwert des Zählers eines Intervalls?

Richtig, der aktuelle Zählwert ist Regen_ist, jeden Morgen und alle Stunde wird verglichen und gegebenenfalls sofern er sich verändert hat, neu gesetzt.

Also ist die Berechnung der Differenz wohl in den oberen beiden Skripten (des 4’er Packs)??

Ja.

Ich dachte ja der ein oder andere der auch einen KS300-2 hat würde sich mal dazu äußern, ist wohl Fehlanzeige.

Ich habe da noch ein Problem mit dem Zählerüberlauf das ganze passt so auch noch nicht richtig.

//Werte holen und Umrechnung
$Liter = GetValueInteger("Regen_ist");
$Tag = GetValueInteger("Regenmenge_liter_tag");
if ( $Liter < $Tag )
      {
		// Zaehlerueberlauf 12bit
		$Liter = $Liter + 4095;
      }
$LiterTag = ($Liter-$Tag)/16*0.295;
SetValueFloat("LiterTag",$LiterTag);

Vielleicht bekommen wir das dann ja auch noch gelöst.

Hallo Rainer,

das Skript macht genau das, was es soll: die beiden unteren Nibbles vertauschen.

Wenn Deine KS300 neueren Datums ist, liefert sie velleicht bereits richtige Werte. Möglicherweise wurde der Bug inzwischen vom Hersteller beseitigt.

Gruß
HJH

Hallo HJH,

habe ich nie bezweifelt :slight_smile:

Jetzt passt es auch

SetValueInteger("Regen_ist", $a);

Hallo Rainer,

Du hast recht, mein Fehler! :o

Gruß
HJH

Hallo Rainer,

um den Zählerüberlauf abzufangen, musst Du genau den Zeitpunkt abpassen, wo der Zähler wieder auf 0 springt.

Hierzu musst Du immer zwei aufeinader folgende Werte miteinander vergleichen. Die Variable „Regenmenge_liter_tag“ ist für den Vergleich ungeeignet, da sie ja während des ganzen Tages konstant bleibt.

Es ist also nötig zusätzlich zur Variablen „Regen_ist“ noch eine weitere einzuführen (z.B. „Regen_Bezug“), die den letzten Messwert enthält. Diese beiden Werte müssen dann jedesmal, wenn es eine Änderung gibt miteinander verglichen werden. Ist „Regen_Bezug“ größer als „Regen_ist“, dann hat ein Überlauf stattgefunden.

In diesem Falle muss 4096 (nicht 4095) aufaddiert werden.

Gruß
HJH

Hallo HJH,

erstmal Vielen Dank.

Wenn ich dich jetzt richtig verstanden habe müsste es in etwa so aussehen :confused:

<?
/*
*******************************
 IP-SYMCON Event Scripting
*******************************
File     : RegenTag.ips.php
Trigger  : OnChange Regen_ist, Regenmenge_liter_tag
Interval : 
*/

//Werte holen und Umrechnung
$Regenaktuell = GetValueInteger("Regen_ist");
$Tag = GetValueInteger("Regenmenge_liter_tag");
$Regenalt = GetValueInteger("Regen_alt");

if ( $Regenalt > $Regenaktuell )
      {
      $Ueberlauf = $Regenaktuell - $Regenalt;
      if ($Ueberlauf <0) $Ueberlauf + 4096;
		//$Liter = $Liter + 4096;
      $LiterTag = ($Ueberlauf-$Tag)/16*0.273;
      SetValueFloat("LiterTag",$LiterTag);
      }
SetValueInteger("Regen_alt",$Regenalt);


?>

Hallo Rainer,

seit Deiner Anpassung (15:52 Uhr WZ) wird die Sache etwas klarer.

Die Externe Variable „LiterTag“ wird nur berechnet, wenn es einen Zählerüberlauf gibt. Ist das so beabsichtigt?

Was ist der Unterschied zwischen „LiterTag“ und „Regenmenge_liter_tag“?

Gruß
HJH

Hallo HJH,

schön das es noch Menschen wie dich gibt, die sich auch einer Sache annehmen welche sie nicht besitzen und helfen.
Ich bin ja nicht der einzige der dieses Teil hat, nur sagen mir die Scripte alle nicht viel oder es ist einfach aufgehört worden und jeder nimmt halt hin das es so ist, wie es ist.
Ich sehe allerdings nicht ein das ich 100 Euro in den Garten stelle für ein paar Daten die ich auch billiger haben könnte und ELV nicht mal fähig ist ein vernünftiges Protokoll bei zulegen daszumindest Profis auswerten können. :mad: Soweit zu meinem Frust über die 300 :slight_smile:

Hallo Rainer,

seit Deiner Anpassung (15:52 Uhr WZ) wird die Sache etwas klarer.

Die Externe Variable „LiterTag“ wird nur berechnet, wenn es einen Zählerüberlauf gibt. Ist das so beabsichtigt?

Nein, die Variable LiterTag wird berechnet aus Regen_ist und Regenmenge_liter_tag

$Liter = GetValueInteger("Regen_ist");
$Tag = GetValueInteger("Regenmenge_liter_tag");
if ( $Liter < $Tag )
      {
		// Zaehlerueberlauf 12bit
		$Liter = $Liter + 4096;
      }
$LiterTag = ($Liter-$Tag)/16*0.273;
SetValueFloat("LiterTag",$LiterTag);

Was ist der Unterschied zwischen „LiterTag“ und „Regenmenge_liter_tag“?

LiterTag wird auf addiert bei jeder Änderung von regen_ist und um 7:30 morgens wird Regenmenge_liter_tag auf 0 gesetzt.

Wobei Regen_ist mittlerweile über dein Script den angepassten Wert vorgibt.

Vielleicht hab ich auch alles zu umständlich gemacht aber es geht soweit, anderst kann ich mir leider im Moment nicht helfen :mad:

Hallo Rainer,

erst einmal Danke für die netten Worte. :slight_smile:

So ganz komme ich mit der Logik Deiner Skripte aber nicht klar. Ich habe daher selbst mal eins geschrieben:

<?
/*
*******************************
 IP-SYMCON Event Scripting
*******************************
File     : Regenerfassung.ips.php
Trigger  : Regenzaehler_neu
Interval : OnUpdate
*/



define("KORREKTURFAKTOR", 0.273); // Faktor für die Umrechnung der Wippenschläge in Millimeter



// aktuelle Werte einlesen
$rza = GetValueInteger("Regenzaehler_alt"); // vorausgegangene Messung
$rzn = GetValueInteger("Regenzaehler_neu"); // aktuelle Messung

// zur Bug-Bereinigung die unteren Nibbles vertauschen
$rzn = ( $rzn & 0xff00      )  // LSB ausblenden
     + (($rzn & 0x00f0) >> 4)  // oberes  Nibble des LSB 4x rechts schieben (entspricht Division durch 16)
     + (($rzn & 0x000f) << 4); // unteres Nibble des LSB 4x links schieben  (entspricht Multiplikation mit 16)
SetValueInteger("Regenzaehler_alt", $rzn);

// Zählerüberlauf abfangen
if ($rza > $rzn) $rzn += 4096;

// Zuwachs (Wippenschläge) seit der letzten Messung
$Zuwachs = $rzn - $rza;

// Berechnung der aktuellen Regenmenge in Millimetern (entspricht Liter/qm) für den laufenden Tag
$lpd = GetValueFloat("Liter_heute");
$lpd += $Zuwachs*KORREKTURFAKTOR;
SetValueFloat("Liter_heute", $lpd);
?>

Das Skript wird von der Variablen „Regenzaehler_neu“ OnUpdate getriggert. Der Wert wird Bug-bereinigt und dann nach „Regenzaehler_alt“ gespeichert. Es wird die Differenz gebildet und damit der Zuwachs seit der letzten Messung berechnet.

Dieser Zuwachs wird mit einem Korrekturfaktor für die Umrechnung nach Liter/qm beaufschlagt und dann auf die bisher am heutigen Tage angefallene Regenmenge „Liter_heute“ aufaddiert.

Man kann nun jeden Morgen um 07:30 Uhr diesen Wert in eine weitere Variable (z.B. „Liter_gestern“) übernehmen, die den Gesamtniederschlag des vergangenen Tages enthält. Diese Variable entspricht dem Niederschlagstag (precipitation day), den bauhaus hier erwähnt hat.

Es sollte kein Problem sein weitere Variablen mit kürzerem Intervall (z.B. 1 Stunde) zu definieren, um so verschiedene Niederschlagsintensitäten zu berechnen.

Gruß
HJH

PS: Die Regenmenge in Millimetern ist zahlenmäßig identisch mit der Menge in Liter/qm.

Hallo HJH,

wie immer erst mal Vielen Dank.

Ich werde das ganze mal testen und berichten.

Dein Link von Bauhaus ist auch in WIPPS verankert :slight_smile:

Wo der dann her kommt, können nur die Herren sagen.

ich habe mir auch denke ich so um die 20 Threads durchgelesen über das Thema auch den von Babba welche relevant sind, aber es liegt wohl an meiner Vorstellungskraft.

Das ganze Teil hat wohl so seine Eigenart auch mit der Windgeschwindigkeit.

Was passen dürfte, so eingermaßen ist die Luftfeuchte.

Deswegen verstehe ich auch nicht, das sich keiner zu Wort meldet von denen die es schon „angeblich erfolgreich“ betreiben :smiley:

Es kommt ja nicht auch einen 10tel Liter an oder um 2 KM/H mehr oder weniger aber so eingermaßen sollte es doch passen.

Wenn ich mir meine Zeit, deine und anderer Zeit rumrechne dann kann ich auch 500 Euro investieren und erfreue mich nach 1 Stunde das alles geht.

Soviel zum KS300-2

Zumal es ja wohl mit allen angebotenen Wetterstationen geht, aber wer sieht da das Protokoll/Umrechnung…:smiley:

Tausend Dank Hans Jörg

mehr Geld heisst manchmal auch : noch mehr Fehler.:mad:
„Herstellerspezifische Protokolle“ sind leider an der Tagesordnung und sollen den Hersteller wohl mehr vor Gesichtsverlust als vor Nachahmern technischer Inovationen schützen.
Wer’s nicht glaubt, dem sei ein Blick ins "Wetterstationsforum"empfohlen.
Uns als Konsumenten sei da nur empfohlen, nur die bekannt guten und dokumentierten Produkte von bewährten Produzenten mit vernünftigem Support zu kaufen.

Tommi

Hi Tommi,

das ist sicher richtig, nur für 100 Euro ein Schätzeisen zuhaben ist mir das Geld zu schade, das bekomme ich im Internet gratis, meine Onlinekosten nicht eingerechnet.
Wenn ich allerdings 500 oder auch 3000 Euro ausgebe erwarte ich eine Funktion die der Beschreibung und der Funktion auch 100% entspricht, Fehler gibt es überall davon abgesehen.
Die Erwartungen sind dann natürlich auch etwas gehoben und das denke ich , mit zu Recht :slight_smile: