FS20 Regensensor: Wie in v2 Statusvariable zurücksetzen

Hallo zusammen,
irgendwie stehe ich gerade ziemlich auf dem Schlauch. Ich habe mich (noch unter v1) von den Fachleuten im Forum überzeugen lassen, dass es positiv ist, dass der FS20 Regenmelder zwar einen „Es beginnt zu regnen“-Befehl sendet, aber keinen „Es hat aufgehört“-Befehl. Man könne seinen Status ja über ein Skript resetten, etwas wie „SetValueBoolean(„Status.Regensensor“, false)“.

Das funktionierte damals ja auch leidlich. Nun kann man aber in v2 keine Statusvariablen mehr verändern. Trotz langer Suche habe ich den Workaround hierzu noch nicht verinnerlicht - könntet Ihr mir aufs Pferd helfen?

if(!GetValueBoolean("23132")) { return; }

if($IPS_SENDER == "Variable") {
   IPS_SetScriptTimer("Regendauer", 10); //10 Sekunden (nach max 8 sollte ein neuer Befehl kommen)
} else {
   IPS_SetScriptTimer("Regendauer", 0);
   SetValueBoolean("23132", false);
}

?>

Vielen Dank im Voraus
DocMarten

Wenn du es unbedingt benötigst, musst du eine neue Variable erstellen, die den Status der alten Variable spiegelt plus zusätzlich deine Ausschaltlogik enthält.

paresy

Grundsätzlich klar. Aber soweit ich den FS20 Regensensor verstehe, bleibt sein Status nach dem erstmaligen Einschalten der Spannung und dem ersten Tropfen für alle Ewigkeit auf „Regen“ bzw. „True“ bzw. sendet bei anhaltendem Regen in entsprechenden Abständen immer wieder ein „True“. Wie kann ich so über eine „Spiegel“-Variable herausfinden, dass der Sensor trocken ist und es nicht mehr regnet? Über das Feststellen per Script, dass über einen gewissen Zeitraum hinweg kein „True“ mehr vom Sensor kam und das dann als „False“ interpretieren?
Falls das so ist, wäre ich sehr dankbar, wenn ihr mir ein Code Snippet zeigen könntet, denn ich fürchte, dass das meine Anfängerkenntnisse doch weit übersteigt.
Danke,
DocMarten

Wenn du in deinem Regensensormodul die zwei Häkchen bei Timer emulieren und Status empfangen setzt, wird doch in V2 die Variable automatisch zurückgesetzt.

Oder habe ich das Problem nicht richtig verstanden?

Regensensor.jpg

Hoppala, bei mir ist der FS20 Regensensor beim Import aus v1 als FS20 EX Modul angelegt worden, das diese Optionen nicht besitzt. Danke für den Hinweis, werde das mal ausprobieren. Mit welchem Skript liest Du denn die Regensituation aus?
Grüße
DocMarten

Du kannst in deinem Regensensor einen Sendebefehl und einen Sendeabstand einstellen. Wenn du zb. den Sendebefehl auf 34 setzt [EIN für zb. 10 Sec] und den Sendeabstand auf zb. 8 sec. bleibt deine IPS Variable, wenn es regnet für mindestens 10sec auf True. Sollte es weiter regnen wird nach 8sec wieder wieder ein [EIN für 10sec] gesendet. Deine IPS Variable bleibt also True. Sollte es aufhöhren zu regnen wird kein [EIN für 10 sec.] gesendet. Die Zeit läuft ab und IPS setzt automatisch die Variable auf False ohne ein Scribt oder ähnliches.
Die Zeiten kannst du natürlich im Sensor bis 120 Sec Sendeabstand verlängern. Das spart Strom und bringt nicht so viel ‚FunKsmog‘.

Jetzt wo du es sagst, habe bei mir auch bei der Umstellung das Modul neu gemacht. Hatte ich schon wieder vergessen.

Mein Script ist wahrscheinlich nicht so doll. Ich habe das von V1 nach V2 migriert, aber wahrscheinlich könnte man da noch einiges optimieren.
Vielleicht hilfts als Ideengeber.

<?
/*
*******************************
 IP-SYMCON Event Scripting
*******************************
File     : Regensensor.ips.php
Trigger  : Raining1 = True danach ca. alle 30sek
Interval :
Variablen : RainWarnActive, Raining1, LastRain, Count, Rain_Ack, AlarmTyp
Kommentar: 17.9.07 Zeile: SetValueInteger("LastRain",$time); von if in else Zweig verschoben
                   soll bei Dauerregen nicht alle halbe Stunde piepen
*/
//Variablen
$regenwarnung = GetValueBoolean ("RainWarnActive");   // soll überhaupt gewarnt werden?
$regen      = GetValueBoolean ("Raining1");         // Aktueller Status des Sensors
$varupdt= IPS_GetVariableID("Raining1");
$varupdt= IPS_GetVariable($varupdt);
$updatetime = $varupdt["VariableUpdated"];       // Zeit des letzten Variablen-Updates
$time       = time();                               // Aktuelle Zeit
$timedelay  = $updatetime +20;                      // Berechnung der Referenzzeit
$delta = $time-$updatetime;                         // Zeitdiff. zw. letzem Update und akt. Zeit
$totzeit = 900;                                     // Zeit seit letztem Regen ohne Alarm (15min)
$lastrain = GetValueInteger("LastRain");            // Zeitpunkt des letzten Regens

$akt_time = date ("G:i");
$timestr = explode(":", $akt_time, 2);    // Uhrzeitstring von Uhrzeit in Minuten ab 0:00Uhr formatieren
$timestr[0] = $timestr[0] * 60;
$akt_time = $timestr[0] + $timestr[1];


//if ($IPS_SENDER == "Variable" && $regen)
//{
//    SetValueString("LAST_MESSAGE","es regnet");
//}

//Programm
if ($regen == true)                              //Einstiegsbedingung in den Reset
{
    if ("$time" > "$timedelay")                  // Bedingung das die Aktuelle Zeit "Größer" ist wie
    {                                         // die Updatezeit + Verzögerung => Regen hat aufgehört
//        SetValueBoolean("Raining1",False);       // Reset der Variablen auf "False"
//        SetValueBoolean("Raining2",False);
        IPS_SetScriptTimer("Regensensor",0);     // Scriptimer auf 0 zurücksetzen
//        SetValueString("LAST_MESSAGE","es regnet nicht mehr");
        SetValueInteger ("Count",0);
        SetValueBoolean ("Rain_Ack",False);
        if ($time > $lastrain + $totzeit)             // wenn seit letztem Regen $totzeit(30min) vergangen, dann
            SetValueInteger("LastRain",$time);        // aktuelle Zeit als letzte Regenzeit merken
    }
    else                                    // wenns regnet dann
    {
        IPS_SetScriptTimer("Regensensor",30-$delta);  // Script nach ca.30sek wieder aufrufen unterschiedliche Zeitdifferenzen
                                                      // durch $delta neutralisieren soll additiven Zeitfehler verhindern
        if ($regenwarnung)                            //Regenwarnflag aktiv?
        {
          if ($akt_time<1320 && $akt_time>420)        // Nachts (22:00-07:00) nicht warnen
          {
           if ($lastrain + $totzeit < $time)          //Totzeit schon rum?
           {
              $count = GetValueInteger("Count");
              if ($count < 1 && GetValueBoolean("Rain_Ack") == False) //nur 5mal warnen, sonst nervts
              {
				     SetValueInteger("AlarmTyp",1);                       //Aarmtyp für Touchalarm Script setzen
                 IPS_RunScript("XbeeTouchLCDAlarm");
                 $count = $count+1;
                 SetValueInteger("Count", $count);
                 SetValueString("LastAlarm",Date("d.m.Y")." ".Date("H:i:s")."h  >".chr(9)."Regen");
                 SetValueString("LAST_MESSAGE","es regnet");
              }
           }
           else SetValueInteger("LastRain",$time);
          }
        }
    }
}
?>

Ich habe mir mein Script jetzt selber nochmal angeschaut.
Ich glaube man kann den ganzen Time Schnickschnack mittlerweile rausschmeissen, weil ja die Variable von IPS schon zurüchgesetzt wird.
Wie gesagt habe damals nur die angemeckerten Befehle auf V2 angepasst und da es lief nicht weiter drüber nachgedacht.

Edit:
Habe gerade mal ein bisschen optimiert, kann es allerdings momentan nicht testen.

<?
/*
*******************************
 IP-SYMCON Event Scripting
*******************************
File     : Regensensor.ips.php
Trigger  : Raining1 = Variablenänderung
Interval :
Variablen : RainWarnActive, Raining1, LastRain, Count, Rain_Ack, AlarmTyp
Kommentar: 17.9.07 Zeile: SetValueInteger("LastRain",$time); von if in else Zweig verschoben
                   soll bei Dauerregen nicht alle halbe Stunde piepen
*/
//Variablen
$regenwarnung = GetValueBoolean ("RainWarnActive"); // soll überhaupt gewarnt werden?
$regen      = GetValueBoolean ("Raining1");         // Aktueller Status des Sensors
$time       = time();                               // Aktuelle Zeit
$totzeit = 900;                                     // Zeit seit letztem Regen ohne Alarm (15min)
$lastrain = GetValueInteger("LastRain");            // Zeitpunkt des letzten Regens

$akt_time = date ("G:i");
$timestr = explode(":", $akt_time, 2);    // Uhrzeitstring von Uhrzeit in Minuten ab 0:00Uhr formatieren
$timestr[0] = $timestr[0] * 60;
$akt_time = $timestr[0] + $timestr[1];

//Programm
if ($regen == false)                             //wenns nicht regnet
{
        SetValueInteger ("Count",0);            //für mehrfach Warnung, falls mal überhört wird
//        SetValueBoolean ("Rain_Ack",False);   //wird nur benutzt wenn man die Regenwarnung quittieren will
        if ($time > $lastrain + $totzeit)             // wenn seit letztem Regen $totzeit(30min) vergangen, dann
            SetValueInteger("LastRain",$time);        // aktuelle Zeit als letzte Regenzeit merken
}
else                                    			// wenns regnet dann
{
	if ($regenwarnung)                            //Regenwarnflag aktiv?
	{
		if ($akt_time<1320 && $akt_time>420)        // Nachts (22:00-07:00) nicht warnen
		{
			if ($lastrain + $totzeit < $time)          //Totzeit schon rum?
			{
				$count = GetValueInteger("Count");
//				if ($count < 1 && GetValueBoolean("Rain_Ack") == False) //nur 1mal warnen, sonst nervts, noch nicht quittiert
				if ($count < 1 ) 					//nur 1mal warnen, sonst nervts, ohne Quittierung
				{
				 SetValueInteger("AlarmTyp",1);                       //Aarmtyp für Touchalarm Script setzen
                 IPS_RunScript("XbeeTouchLCDAlarm");
                 $count = $count+1;
                 SetValueInteger("Count", $count);
                 SetValueString("LastAlarm",Date("d.m.Y")." ".Date("H:i:s")."h  >".chr(9)."Regen");
                 SetValueString("LAST_MESSAGE","es regnet");
				}
			}
			else SetValueInteger("LastRain",$time);      //Totzeit noch nicht rum, Zeit des letzten regens aktualisieren
		}
	}
}

?>

Sollte es aufhöhren zu regnen wird kein [EIN für 10 sec.] gesendet. Die Zeit läuft ab und IPS setzt automatisch die Variable auf False ohne ein Scribt oder ähnliches.

Danke, Heiner, war mir nicht bewusst, dass IPS Statusvariablen, die nicht upgedated werden, ohne Script oder ähnliches selbsständig von TRUE auf FALSE setzt, aber genau das wäre ja das, was ich brauche.
@Michael: Danke für die Scripts, das sieht ja sehr vollständig aus. Werde das heute Abend mal ausprobieren.
Grüße
DocMarten

Hmm… Bei mir bleibt die standardmäßig mit dem FS20 Modul angelegte Statusvariable des Regensensors nach dem ersten Regen auf „TRUE“ bzw. „Regen“ und wird auch nach stundenlagem Nicht-Regnen nicht von IPS automatisch auf FALSE zurück gesetzt, obwohl sie durchaus regelmäßig aktualisiert wird. Wo in der Dokumentation kann man das denn mal zum besseren Verständniss nachlesen, dass Statusvariablen von FS20-Sendern durch IPS autoamtisch geändert werden?
Grüße
DocMarten

Wenn Du das Timer-Häkchen in IPS gesetzt hast, musst Du noch in der Anleitung Deiner FS20-Komponente nachsehen, wie man aktiviert, dass Timer-Informationen gesendet werden.

Ich habe meinen Regensensor auf den Werkseinstellungen gelassen.
Das wäre zumindest zum einstellen bei dir ein schneller Test ob der Sensor falsch eingestellt ist. Adresse musst du dann natürlich neu anlernen.

Laut „Handbuch FS20SR“ (das man auch mal lesen sollte ;)) ist die Werkseinstellung Kanal1: Einschaltdauer 60sec, Sendeabstand 24sec, Kanal2 deaktiviert. In IPS Instanz hinzufügen, Häckchen bei Timer emulieren setzen, Gerät suchen wählen, nassen Finger auf Sensor, Gerät wählen (ist immer Adresse 1111, Hauscode zufällig), alles übernehmen. Nun gibt es eine Statusvariable die sich nach 1 Minute von alleine zurücksetzen sollte.

Danke für die Hinweise. Das Handbuch kenne ich mittlerweile so, als hätte ich es selbst verfasst :wink:
Aber irgendwie scheint der Wurm drin zu sein:

  • Ich habe heute früh mal alles Regensensor-related Instanzen gelöscht. Dabei wurden dann zwar die Unterinstanzen (= Statusvariablen) gelöscht, nicht aber die Hauptinstanz, d.h. sie blieb hartnäckig im Objektbaum. Wenn man aber irgendetwas mit ihr machen wollte, kam die Meldung „Instanz 12345 existiert nicht“. IPS Neustart hat sie dann davon gefegt.
  • Reset des Sensors auf Werkeinstellungen: „Drücken Sie gleichzeitig die Tasten 2+4, bis die Status-LED blinkt.“ Leider blinkt die LED bei mir nicht, sondern dauerleuchtet, geht aber wie beschrieben aus, wenn man eine beliebige Taste drückt (kann jemand bestätigen, dass das ein Fehler im Handbuch ist oder ist der Sensor vielleicht schlicht hinüber?). Hauscode eingegeben und Adresse von Kanal 1 auf 4313 eingestellt (1111 ist anderweitig im Einsatz), ansonsten alles belassen. FS20-Instanz neu angelegt, aber nun empfängt sie garnichts mehr (Sensor schaltet aber hörbar bei Befeuchten).
    Ich werde heute Abend nochmals alles resetten und etwas dem Funkverkehr lauschen - vielleicht habe ich mich ja vertastert.
    Grüße
    DocMarten

Nur um sicher zu gehen,
ausser im Sensor die Adresse zu programmieren hast du die aber auch in der Instanz eingestellt?

claro! Außer, wie gesagt, ich hätte mich bei den Tastern „vertippt“ müsste alles passen.
Grüße
DocMarten

Das Dauerleuchten nach drücken von Taste 2+4 ist normal. Es hat noch die, meist undokumentierte, Funktion den Sender in den IR Empfangsmodus zu versetzen. Wenn der Sender mit einer IR Empfangsdiode ausgerüstet ist empfängt er dann Daten vom FS20IRP (Einstellen aller Werte im Sender mit dem PC)

Hallo,
ich habe gestern abend noch mal bei Null begonnen, Sensor resettet und neu programmiert (vorsichtshalber mit einer neuen Adresse). Instanz neu angelegt (die alte ließ sich wieder nicht auf Anhieb löschen) - und es funktionierte auf Anhieb. Variable wird korrekt nach 60 sec zurückgesetzt.
Vielen Dank für Tippas und Ratschläge
DocMarten

Habe mir jetzt diesen Beitrag mehrmals durchgelesen, kann aber nicht nachvollziehen, wie ich meine Statusvariablen löschen kann.

Situation: Homematic OC3 … Regenmenge wird aufsummiert und nie zurückgesetzt. Damit kann ich die Tagesmenge nie messen.

Toll wäre es an dieser Stelle die Statusvariable „Regenmenge“ vom Typ float auf Null setzen zu können. Das es hierfür keinen unmittelbaren Befehl gibt, ist mir jetzt mal bewußt, kann aber wie gesagt nicht machvollziehen, wie ich es trotzdem schaffen kann, diese Variable zurücksetzen zu können.

Bitte um Hilfe :confused:

Nachsatz: Seit dem ich versucht habe die Variable zu löschen bzw. die Stati auslesen wollt, hat der OC3 keine Aktualisierung mehr geschickt (???)

Guten Morgen Meister … es geht hier um einen FS20SR

FS20 SR Funk-Regensensor | ELV-Elektronik

hat mit dem OC3 nur den Lieferanten (wenn bei ELV gekauft) gemeinsam. :smiley:

Wundert mich nicht, wenn nix mehr geht.

Noch Info-Link:
http://www.fhz-forum.de/viewtopic.php?f=27&t=4691

Weiss aber nicht, ob der was bringt. Ansonsten Deinen ersten Thread nochmal aufwärmen oder neue Frage stellen (bei Homematic).

Gruß
Bruno