frische Installation2.7 und Problem/frage mit 1 Wire ds2423 S0 Counter

@khge:
Der sensor auf dem 1W Bus wird nach den weiter oben geposteten settings alle 30sek abgepollt. Sobald die Var upgedatet wird, egal ob mit dem gleichen oder einem neuen Wert, muss einfach nur das Skript getriggert werden. Das macht on update.

Problem an der Sache ist halt - soweit mein Verständnis.

der S0 Zähler zählt jeden Impuls fortlaufend hoch. (wie ein Stromzähler)
D.h. z.B.
Um 08:00:00 Uhr-> 10000
um 08:00:30 Uhr-> 10030
um 08:01:00 Uhr-> 10070

Abgerufen wird dieser Zähler derzeit - alle 30 Sekunden- wie im 1Wire Konfigurator für den S0 Zähler hinterlegt.

In meiner Berechnung muss ich die Differenz von 08:00:00 und 08:00:30 bilden.
D.h. Neuer Wert 08:00:30 - (MINUS) Alter Wert 08:00:00 Uhr
Hier 30 Impulse. Damit kann ich ausrechnen wieviel m/s bzw. km/h das waren.

Mir fehlt aber der alte Wert - oder kann ich den durch aktivieren des Loggings dieser Variable - irgendwie im nachhinein abrufen?
Also
GetValueInteger(56076) ???TIMESTAMP -30sekunden???;

Oder wie wupperi beschrieben hat,

  • max execution time in der php.ini anpassen und erhöhen und ein sleep von 30 Sekunden einbauen.
    Dann könnte ich den alten wert abfragen, 30 sek. pause einlegen, wert nochmals abfragen.
    -> Hierbei sollte ich den automatischen Abruf von 1Wire für dieses Device dann aber vermutlich deaktivieren.
    Ansonsten gibts ein durcheinander.

Problem ist halt die 30 Sekunden abstand hinzubekommen, damit es nicht massiv ungenau wird.

http://www.ip-symcon.de/service/dokumentation/konzepte/skripte/systemvariablen/

$_IPS[‚OLDVALUE‘] Wert der auslösenden Variable vor Auslösezeitpunkt

|$_IPS[‚VALUE‘]|Wert der auslösenden Variable zum Auslösezeitpunkt
|—|

|

Das sollte dein Problem lösen

also $_IPS[‚VALUE‘] - $_IPS[‚OLDVALUE‘] = Impulse

Warum schreibst Du den neuen Wert nicht einfach am Ende des Skripts in eine Variable? Beim nächsten Skriptaufruf liest Du diesen Wert dann ein (er ist dann dein alter Wert).

Quasi so:

  • IPS-Variable „Alter Wert“ erstellen
    Dann im Skript:
  • getvalue „alter Wert“ (Aus der IPS Variable)
  • getvalue „aktueller Wert“ (Aus dem 1W Zähler)
  • Differenz= aktueller Wert minus alter Wert
  • Windspeed ausrechenen
  • Windspeed in IPS Variable schreiben (Setvalue)
  • „Aktueller Wert“ in IPS Variable „alter Wert“ schreiben

Dieses Skript triggerst Du dann bei onupdate des 1W Zählers. Da dieser alle 30sek aktualisiert wird, bist Du genau auf 30s Takt.

Also in etwa so?


 <?
// Debug-Modus an=true / aus=false
$debug = false;

//Berechung der Windgeschwindigkeit
$Faktor_Windrad = 71.00; //70,83 Impulse = 1m/s bei 30 sek. Einlesezyklus

//Drehzahl Windrad (4 Impulse pro Umdrehung)
[b]$counter = $_IPS['OLDVALUE']; // Impulse Windrad einlesen - Alter Wert
$counter_neu = $_IPS['VALUE']; // Impulse Windrad - Neuer Wert
$delta = $counter_neu - $counter; //Neuer Wert minus Alter Wert[/b]
SetValueInteger(59050, $delta ); //Ausgabe "Differenz Alt-Neu"
SetValueInteger(41822, $counter ); //Alte Impulse des Windrads ablegen "Counter"
if($debug) {echo "Counter-alt: $counter
";}
if($debug) {echo "Wind-Delta: $delta
";}

//Berechnung Einspeisung pro Stunde
$delta_wind = ((($delta / $Faktor_Windrad) * 3600)/1000) ; //0.00285
$delta_wind_ms = $delta / $Faktor_Windrad;
$round_delta_wind = round ($delta_wind, 1); // auf 1 Stellen runden
$round_delta_wind_ms = round ($delta_wind_ms, 1); // auf 1 Stellen runden

SetValueString (52346, $round_delta_wind. " Km/h"); // "Windmesser km/h"
SetValueString (20444, $round_delta_wind_ms. " m/s"); // "Windmesser m/s"
SetValueFloat (15146 , $round_delta_wind); // "Delta Wind - Abfrage"
if($debug) {echo "Windgeschwindigkeit aktuell:
 Km/h: $round_delta_wind
 m/s: $delta_wind_ms ";}

?> 


oder - „kürzer“:

 
<?
// Debug-Modus an=true / aus=false
$debug = false;

//Berechung der Windgeschwindigkeit
$Faktor_Windrad = 71.00; //70,83 Impulse = 1m/s bei 30 sek. Einlesezyklus

//Drehzahl Windrad (4 Impulse pro Umdrehung)
[b]$delta = $_IPS['VALUE'] - $_IPS['OLDVALUE']; //Neuer Wert minus Alter Wert[/b]
SetValueInteger(59050, $delta ); //Ausgabe "Differenz Alt-Neu"
[b]SetValueInteger(41822, $_IPS['OLDVALUE'] ); //Alte Impulse des Windrads ablegen "Counter"
if($debug) {echo "Counter-alt: $_IPS['OLDVALUE']
";}[/b]
if($debug) {echo "Wind-Delta: $delta
";}

//Berechnung Einspeisung pro Stunde
$delta_wind = ((($delta / $Faktor_Windrad) * 3600)/1000) ; //0.00285
$delta_wind_ms = $delta / $Faktor_Windrad;
$round_delta_wind = round ($delta_wind, 1); // auf 1 Stellen runden
$round_delta_wind_ms = round ($delta_wind_ms, 1); // auf 1 Stellen runden

SetValueString (52346, $round_delta_wind. " Km/h"); // "Windmesser km/h"
SetValueString (20444, $round_delta_wind_ms. " m/s"); // "Windmesser m/s"
SetValueFloat (15146 , $round_delta_wind); // "Delta Wind - Abfrage"
if($debug) {echo "Windgeschwindigkeit aktuell:
 Km/h: $round_delta_wind
 m/s: $delta_wind_ms ";}

?> 


D.h. ich lasse 1 Wire das S0 Device alle 30 sek. abfragen.
Bei Wind ergibt sich eine Wertänderung der Zählervariable.
Bei Wertänderung lasse ich das Skript Ereignisgesteuert laufen - und somit hat er den alten + neuen Wert, anhand
$_IPS[‚VALUE‘] - $_IPS[‚OLDVALUE‘].
Das wars?

nachteil:
Falls IPS mal eine Downtime hätte (der 1Wire USB Stick aber Saft hat), dann ergibt sich eine einmalig hohe Differenz
zwischen altem und neuem Wert…

Da ich zur weiteren Verwendung die Variable String Windmesser m/s verwende, gibts dort leider bei Ereignisauslöung nur die Auswahl „bei erreichung eines Wertes“… Funktioniert dort >13 (d.h. sobald über 13 m/s gemessen werden, soll etwas passieren???
Die Option „bei Überschreitung eines Wertes“ ist leider ausgegraut.

Gewöhn Dir bitte mal an den PHp Code in Tags zu schreiben. Ansonsten bin ich dann raus hier! Die Lösung steht in meiner Beschreibung und wenn IPS weg ist, dann ist IPS weg und der Bus läuft weiter. Das ist immer so. Und es ist auch gut so.

@wupperi

danke für den Hinweis… dachte immer die „PHP Code Umrahmung“ kommt von allein :o

Korrekt?




 <?
// Debug-Modus an=true / aus=false
$debug = false;

//Berechung der Windgeschwindigkeit
$Faktor_Windrad = 71.00; //70,83 Impulse = 1m/s bei 30 sek. Einlesezyklus

//Drehzahl Windrad (4 Impulse pro Umdrehung)
$alterwert = $_IPS['OLDVALUE'];
SetValueInteger(123456, $alterwert); //Alter Wert des Windrads ablegen "Counter"

$delta = GetValueInteger(56076) - GetValueInteger(123456); //Neuer Wert minus Alter Wert
SetValueInteger(59050, $delta ); //Ausgabe "Differenz Alt-Neu"

if($debug) {echo "Counter-alt: $alterwert
";}
if($debug) {echo "Wind-Delta: $delta
";}

//Berechnung Einspeisung pro Stunde
$delta_wind = ((($delta / $Faktor_Windrad) * 3600)/1000) ; //0.00285
$delta_wind_ms = $delta / $Faktor_Windrad;
$round_delta_wind = round ($delta_wind, 1); // auf 1 Stellen runden
$round_delta_wind_ms = round ($delta_wind_ms, 1); // auf 1 Stellen runden

SetValueString (52346, $round_delta_wind. " Km/h"); // "Windmesser km/h"
SetValueString (20444, $round_delta_wind_ms. " m/s"); // "Windmesser m/s"
SetValueFloat (15146 , $round_delta_wind); // "Delta Wind - Abfrage"
if($debug) {echo "Windgeschwindigkeit aktuell:
 Km/h: $round_delta_wind
 m/s: $delta_wind_ms ";}

?>

Nein, das war der CODE-Rahmen, php ist da wo es draufsteht :eek:

Gruß
Bruno

korrigiert :slight_smile:

Na geht doch :wink: :smiley:

Folgendes Skript habe ich nun testweise:

<?
// Debug-Modus an=true / aus=false
$debug = false;

//Berechung der Windgeschwindigkeit
$Faktor_Windrad = 71.00; //70,83 Impulse = 1m/s bei 30 sek. Einlesezyklus

//Drehzahl Windrad (4 Impulse pro Umdrehung)
$counter = $_IPS['OLDVALUE']; // Impulse Windrad einlesen - Alter Wert
$counter_neu = $_IPS['VALUE']; // Impulse Windrad - Neuer Wert
$delta = $counter_neu - $counter; //Neuer Wert minus Alter Wert
SetValueInteger(59050 /*[DS2423 4k NV RAM memory with external counters\Zähler 1 - Windmessung\Differenz Alt - Neu]*/, $delta ); //Ausgabe "Differenz Alt-Neu"
SetValueInteger(41822 /*[DS2423 4k NV RAM memory with external counters\Zähler 1 - Windmessung\Zählerwert Zwischenspeicher]*/, $counter ); //Alte Impulse des Windrads ablegen "Counter"
if($debug) {echo "Counter-alt: $counter
";}
if($debug) {echo "Wind-Delta: $delta
";}

//Berechnung Einspeisung pro Stunde
$delta_wind = ((($delta / $Faktor_Windrad) * 3600)/1000) ; //0.00285
$delta_wind_ms = $delta / $Faktor_Windrad;
$round_delta_wind = round ($delta_wind, 1); // auf 1 Stellen runden
$round_delta_wind_ms = round ($delta_wind_ms, 1); // auf 1 Stellen runden

SetValueString (52346 /*[DS2423 4k NV RAM memory with external counters\Zähler 1 - Windmessung\Windmesser km/h]*/, $round_delta_wind. " Km/h"); // "Windmesser km/h"
SetValueString (20444 /*[DS2423 4k NV RAM memory with external counters\Zähler 1 - Windmessung\Windmesser m/s]*/, $round_delta_wind_ms. " m/s"); // "Windmesser m/s"
SetValueFloat (15146 /*[DS2423 4k NV RAM memory with external counters\Zähler 1 - Windmessung\Delta Wind - Abfrage]*/ , $round_delta_wind); // "Delta Wind - Abfrage"
if($debug) {echo "Windgeschwindigkeit aktuell:
 Km/h: $round_delta_wind
 m/s: $delta_wind_ms ";}

?>

Sieht dann wie folgt aus - schaut soweit korrekt aus.

Nun gehts mit einer Ereigniserstellung bei einer Wertüberschreitung weiter?
Funktioniert das - der Wert ist ein String (Windmesser m/s).
Sobald größer als 13 m/s soll ein Ereignis ausgeführt werden…

Funktioniert >13
Siehe Screenshot - wie bekomme ich die Option „Bei Wertüberschreitung“ aktiviert?

Hallo mastermind,
melde dich bitte per pm bei mir.

Gruesse

Andrge

Um die Ergebnisse m/s und km/h für weitere Ereignisse verwenden zu können (bei Wertüberschreitung usw.) muss man die beiden Variablen anstatt als String -> als Float oder Integer anlegen.
SetValueFloat (52346 /[DS2423 4k NV RAM memory with external counters\Zähler 1 - Windmessung\Windmesser km/h]/, $round_delta_wind. " Km/h"); // „Windmesser km/h“
SetValueFloat (20444 /[DS2423 4k NV RAM memory with external counters\Zähler 1 - Windmessung\Windmesser m/s]/, $round_delta_wind_ms. " m/s"); // „Windmesser m/s“

Daher die korrigierte Variante:

Für interessierte:

 <?
// Debug-Modus an=true / aus=false
$debug = false;

//Berechung der Windgeschwindigkeit
$Faktor_Windrad = 71.00; //70,83 Impulse = 1m/s bei 30 sek. Einlesezyklus

//Drehzahl Windrad (4 Impulse pro Umdrehung)
$counter = $_IPS['OLDVALUE']; // Impulse Windrad einlesen - Alter Wert
$counter_neu = $_IPS['VALUE']; // Impulse Windrad - Neuer Wert
$delta = $counter_neu - $counter; //Neuer Wert minus Alter Wert
SetValueInteger(59050 /*[DS2423 4k NV RAM memory with external counters\Zähler 1 - Windmessung\Differenz Alt - Neu]*/, $delta ); //Ausgabe "Differenz Alt-Neu"
SetValueInteger(41822 /*[DS2423 4k NV RAM memory with external counters\Zähler 1 - Windmessung\Zählerwert Zwischenspeicher]*/, $counter ); //Alte Impulse des Windrads ablegen "Counter"
if($debug) {echo "Counter-alt: $counter
";}
if($debug) {echo "Wind-Delta: $delta
";}

//Berechnung Einspeisung pro Stunde
$delta_wind = ((($delta / $Faktor_Windrad) * 3600)/1000) ; //0.00285
$delta_wind_ms = $delta / $Faktor_Windrad;
$round_delta_wind = round ($delta_wind, 1); // auf 1 Stellen runden
$round_delta_wind_ms = round ($delta_wind_ms, 1); // auf 1 Stellen runden

SetValueFloat (52346 /*[DS2423 4k NV RAM memory with external counters\Zähler 1 - Windmessung\Windmesser km/h]*/, $round_delta_wind. " Km/h"); // "Windmesser km/h"
SetValueFloat (20444 /*[DS2423 4k NV RAM memory with external counters\Zähler 1 - Windmessung\Windmesser m/s]*/, $round_delta_wind_ms. " m/s"); // "Windmesser m/s"
SetValueFloat (15146 /*[DS2423 4k NV RAM memory with external counters\Zähler 1 - Windmessung\Delta Wind - Abfrage]*/ , $round_delta_wind); // "Delta Wind - Abfrage"
if($debug) {echo "Windgeschwindigkeit aktuell:
 Km/h: $round_delta_wind
 m/s: $delta_wind_ms ";}

?> 
<?
// Debug-Modus an=true / aus=false
$debug = false;

//Berechung der Windgeschwindigkeit
$Faktor_Windrad = 71.00; //70,83 Impulse = 1m/s bei 30 sek. Einlesezyklus

//Drehzahl Windrad (4 Impulse pro Umdrehung)
$counter = $_IPS['OLDVALUE']; // Impulse Windrad einlesen - Alter Wert
$counter_neu = $_IPS['VALUE']; // Impulse Windrad - Neuer Wert
$delta = $counter_neu - $counter; //Neuer Wert minus Alter Wert
SetValueInteger(59050 /*[Windmesser\DS2423 Windzaehler\Zähler Wind\Differenz Alt - Neu]*/, $delta ); //Ausgabe "Differenz Alt-Neu"
SetValueInteger(41822 /*[Windmesser\DS2423 Windzaehler\Zähler Wind\Zwischensp.]*/, $counter ); //Alte Impulse des Windrads ablegen "Counter"
if($debug) {echo "Counter-alt: $counter
";}
if($debug) {echo "Wind-Delta: $delta
";}

//Berechnung Einspeisung pro Stunde
$delta_wind = ((($delta / $Faktor_Windrad) * 3600)/1000) ; //0.00285
$delta_wind_ms = $delta / $Faktor_Windrad;
$round_delta_wind = round ($delta_wind, 1); // auf 1 Stellen runden
$round_delta_wind_ms = round ($delta_wind_ms, 1); // auf 1 Stellen runden

SetValueString (52346 /*[Windmesser\DS2423 Windzaehler\Zähler Wind\Wind km/h]*/, $round_delta_wind. " Km/h"); // "Windmesser km/h"
SetValueInteger (57196 /*[Windmesser\DS2423 Windzaehler\Zähler Wind\Wind m/s]*/, $round_delta_wind_ms); // "Windstatus m/s"
SetValueFloat (15146 /*[Windmesser\DS2423 Windzaehler\Zähler Wind\Delta Wind - Abfrage]*/ , $round_delta_wind); // "Delta Wind - Abfrage"
if($debug) {echo "Windgeschwindigkeit aktuell:
 Km/h: $round_delta_wind
 m/s: $delta_wind_ms ";}

?>

-> Fehlermeldung:

Notice: Undefined index: OLDVALUE in C:\IP-Symcon\scripts\42902.ips.php on line 9
Notice: Undefined index: VALUE in C:\IP-Symcon\scripts\42902.ips.php on line 10

Damit ist gemeint:
$counter = $_IPS[‚OLDVALUE‘]; // Impulse Windrad einlesen - Alter Wert
$counter_neu = $_IPS[‚VALUE‘]; // Impulse Windrad - Neuer Wert

Gibt es diese Funktion nicht mehr? Was könnte sich verändert haben…

Hallo,

lese in deinem Script nicht per Name ein sondern wirklich die ID, dann sollte es gehen. Diese Form des Einlesens sollte man schon lange nicht mehr machen. Wenn du die ID anhand des Namens haben möchtest, gibt es hierfür einen richtigen Befehl.

Grüße
andrge

Das Skript wurde nicht durch eine Variable getriggert.