FHEM Forum

FHEM => Codeschnipsel => Thema gestartet von: Michael am 24 Juli 2013, 20:01:26

Titel: Wolkenuntergrenze berechnen
Beitrag von: Michael am 24 Juli 2013, 20:01:26
Moin

Auf Gund dieser Entwicklung (Link (http://forum.fhem.de/index.php?topic=13771.0))
bin ich mal auf die suche im Netz gegangen.

Und folgendes Gefunden : http://www.cika.de/wetterlexikon/63-was-ist-die-wolkenuntergrenze.html (//www.cika.de/wetterlexikon/63-was-ist-die-wolkenuntergrenze.html)

Und würde es gern bei mir in Fhem einbauen, aber ich bin nicht fit in Perl und Fhem.

Könnt Ihr das mal Ansehen und mir Helfen ?

99_myUtils.pm
##############################################
# $Id: 99_myUtils.pm

package main;

use strict;
use warnings;
use POSIX;


#############################################
# Berechnung der Wolkenuntergrenze nach der Henning'schen Faustformel
# Quelle : http://www.cika.de/wetterlexikon/63-was-ist-die-wolkenuntergrenze.html
#

sub clouds_lower_limit($)
{
  $adewpoint = Hier muß der Messuwert hin, nur wie?;
  $atemp = Hier muß der Messuwert hin, nur wie?;
  $diffC = $atemp - $adewpoint0;
 
  $cloud_h = $diffC*122;

  return $cloud_h
}
###########################################

1;


Fhem.cfg
define test_cll_at at +*00:03:00 trigger test_n

define test_n notify test {\
{clouds_lower_limit}\


Achso der Messwerte kommen von einer KS300 Stadion und Willi 's
dewpoint Berechnung.

Könnt Ihr mir Helfen ?

Gruß, Michael

P.s. Ich kommt schon auf seltsam Gedanken ;-))
Titel: Aw: Wolkenuntergrenze berechnen
Beitrag von: justme1968 am 24 Juli 2013, 23:43:02
das geht doch noch einfach über ein user reading...

einfach das mit hier per telnet oder in die web kommandobox eingeben:
attr s300ht_1 userReadings cloudBase {(ReadingsVal("s300ht_1","temperature", 0)-ReadingsVal("s300ht_1","dewpoint",0))*122}s300ht_1 ist dein device in dem die temperature und dewpoint readings sind.

als ergebnis hast du ein neues reading cloudeBase in deinem device.

gruss
  andre
Titel: Aw: Wolkenuntergrenze berechnen
Beitrag von: Michael am 25 Juli 2013, 11:53:44
Hi Andre

Leider bekomme ich da kein Wert zurück.

Zitateinfach das mit hier per telnet oder in die web kommandobox eingeben:
Habe ich über die web kommandobox gemacht.


Das sagt der Eventmonitor dazu :
2013-07-25 11:40:44 KS300 Wittingen T: 25.7 H: 63 W: 0.0 R: 577.3 IR: no D: 18.1
2013-07-25 11:40:44 KS300 Wittingen rain: 577.3
2013-07-25 11:40:44 KS300 Wittingen wind: 0.0
2013-07-25 11:40:44 KS300 Wittingen humidity: 63
2013-07-25 11:40:44 KS300 Wittingen temperature: 25.7
2013-07-25 11:40:44 KS300 Wittingen israining: no
2013-07-25 11:40:44 KS300 Wittingen dewpoint: 18.1

Das sind die Device Einträge :

(siehe Anhang / see attachement)


(siehe Anhang / see attachement)


(siehe Anhang / see attachement)


???

Gruß, Michael
Titel: Aw: Wolkenuntergrenze berechnen
Beitrag von: justme1968 am 25 Juli 2013, 12:35:32
du hattest bei der eingabe ein 'attr Wittignen userReadings' zu viel.

es muss so aussehen:

(siehe Anhang / see attachement)


gruss
  andre
Titel: Aw: Wolkenuntergrenze berechnen
Beitrag von: Michael am 25 Juli 2013, 15:49:18
Hi Andre

Erst mal vielen Danke für deine Antworten und die Geduld.

Aber leider bekomme ich immer noch kein Wert in den Readings angezeigt.

Ist das setzen des Attributes im KS300 überhaupt möglich?

Gruß, Michael
Titel: Aw: Wolkenuntergrenze berechnen
Beitrag von: justme1968 am 25 Juli 2013, 17:23:48
wenn es ein temperature und ein dewpoint reading gibt sollte es gehen.

zeig bitte noch mal deine userReadings zeile. entweder als screenshot oder als list auf das device.

gruss
  andre
Titel: Aw: Wolkenuntergrenze berechnen
Beitrag von: Puschel74 am 25 Juli 2013, 17:35:36
Hallo,

muss das userReadings nicht noch unter

Zitatattr global userattr

mit aufgenommen werden?

Dann sollte es aber im fhem-log eine entsprechende Fehlermeldung geben bzw. beim eingeben der Zeile müsste schon eine solche
aufgetaucht sein.

Grüße
Titel: Aw: Wolkenuntergrenze berechnen
Beitrag von: justme1968 am 25 Juli 2013, 17:37:32
ich hab gerade im code nachgeschaut. du hast leider recht. das KS300 modul kann reine readingFnAttributes. schade.

du musst es doch von hand machen. die beiden werte die du brauchst bekommst du jeweils mit ReadingsVal

gruss
  andre
Titel: Aw: Wolkenuntergrenze berechnen
Beitrag von: Michael am 26 Juli 2013, 14:27:40
Dank euch beiden.

@Puschel74
Leider hilft der Eintrag zusätzlich unter attr global userattr auch nicht weiter.

@all
Kann mir den jemand dabei Helfen.
Und was muss in die Fhem.cfg

##############################################
# $Id: 99_myUtils.pm

package main;

use strict;
use warnings;
use POSIX;


#############################################
# Berechnung der Wolkenuntergrenze nach der Henning'schen Faustformel
# Quelle : http://www.cika.de/wetterlexikon/63-was-ist-die-wolkenuntergrenze.html
#

sub cloudBase($)
{
  $adewpoint = ReadingsVal("Wittingen","dewpoint",0);
  $atemp = ReadingsVal("Wittingen","temperature",0);
  $diffC = $atemp - $adewpoint0;
 
  $cloud_h = $diffC*122;

  return $cloud_h
}
###########################################

1;

Ist das richtig?

Gruß, Michael
Titel: Aw: Wolkenuntergrenze berechnen
Beitrag von: Michael am 28 Juli 2013, 11:44:40
keiner da mir zu Helfen?
Bzw auf den richtigen weg zubringen.

Verstehe ich bei diesen Wetter
Titel: Aw: Wolkenuntergrenze berechnen
Beitrag von: betateilchen am 28 Juli 2013, 12:09:10
Hallo Michael,

was funtioniert denn genau nicht? Die Berechnung in der 99_myUtils sollte grundsätzlich funktionieren. Aber die 99_myUtils ist in ihrer Struktur noch unvollständig.

probier mal so:


package main;

use strict;
use warnings;
use POSIX;

sub
myUtils_Initialize($$)
{
  my ($hash) = @_;
}

#############################################
# Berechnung der Wolkenuntergrenze nach der Henning'schen Faustformel
# Quelle : http://www.cika.de/wetterlexikon/63-was-ist-die-wolkenuntergrenze.html
#

sub cloudBase()
{
  $adewpoint = ReadingsVal("Wittingen","dewpoint",0);
  $atemp = ReadingsVal("Wittingen","temperature",0);
  $diffC = $atemp - $adewpoint0;
 
  $cloud_h = $diffC*122;

  return $cloud_h;
}
###########################################

1;


Danach solltest du mit { cloudBase } in der fhem Kommandozeile ein Ergebnis bekommen.

Viele Grüße
Udo
Titel: Aw: Wolkenuntergrenze berechnen
Beitrag von: Michael am 28 Juli 2013, 13:25:44
Hallo Udo

Dank dir für deine Hilfe.
Hat mich ein Stück weiter gebracht.

So, musste die "my" noch davor setzen.
Und mit { cloudBase } über die Kommandzeile bekommen ich ein Wert.

Wo (dummy,notify,???) in Fhem kann ich den Wert eintragen.

##############################################
# $Id: 99_myUtils.pm

package main;

use strict;
use warnings;
use POSIX;

sub
myUtils_Initialize($$)
{
  my ($hash) = @_;
}

#############################################
# Berechnung der Wolkenuntergrenze nach der Henning'schen Faustformel
# Quelle : http://www.cika.de/wetterlexikon/63-was-ist-die-wolkenuntergrenze.html
#

sub cloudBase()
{
  my $adewpoint = ReadingsVal("Wittingen","dewpoint",0);
  my $atemp = ReadingsVal("Wittingen","temperature",0);
  my $diffC = $atemp - $adewpoint;
 
  my $cloud_h = $diffC*122;

     $cloud_h = sprintf("%.0f", $cloud_h);

  return $cloud_h;
}
###########################################

1;


Gruß, Michael
Titel: Aw: Wolkenuntergrenze berechnen
Beitrag von: betateilchen am 28 Juli 2013, 13:42:25
Kommt drauf an, was willst Du denn mit dem Wert anfangen?
Titel: Aw: Wolkenuntergrenze berechnen
Beitrag von: Michael am 28 Juli 2013, 14:01:34
Hi

Ich möchte Ihn erstmal in eine Log schreiben lassen und dann einen Plot erstellen.

Denn mehr kann man da damit Wahrscheinlich nicht anfangen.

Gruß, Michael
Titel: Aw: Wolkenuntergrenze berechnen
Beitrag von: justme1968 am 28 Juli 2013, 15:15:10
du kannst es z.b. aus einem at regelmäßig als reading in dein device schreiben und dann ganz normal wie jedes reading loggen.

{ my $hash =  $defs{Wittingen};
  readingsSingleUpdate($hash,"cloudBase", cloudBase(), 1) if( defined($hash) );}

gruss
  andre
Titel: Aw: Wolkenuntergrenze berechnen
Beitrag von: Michael am 28 Juli 2013, 15:54:48
Hi

Habe es so in Fhen.cfg eingetragen.
define test at +00:00:10 { my $hash =  $defs{Wittingen};
  readingsSingleUpdate($hash,"cloudBase", cloudBase(), 1) if( defined($hash) );}

Und bekomme diese Fehlermeldung :
Unknown command readingsSingleUpdate($hash,"cloudBase",, try help Unknown command }, try help
Titel: Aw: Wolkenuntergrenze berechnen
Beitrag von: justme1968 am 28 Juli 2013, 16:02:31
die semikolon müssen verdoppelt werden wenn du sie direkt von hand in das config file schreibst. es ist viel einfacher wenn man das übers web frontend macht. das kümmert sich darauf.

leg dir per telnet oder command box ein at an: define updateCloudBase at +*01:00:00 {}
dann im web interface in der detail ansicht für dieses at auf DEF klicken einfach zwischen den geschweiften klammern editieren und danach modify drücken.

am ende save nicht vergessen.

gruss
  andre
Titel: Aw: Wolkenuntergrenze berechnen
Beitrag von: Michael am 28 Juli 2013, 16:22:57
DANKE !!![/color]

Jetzt steht es in den Readings.

Nun kommt gerade eine Frage auf.
Kann man diesen Wert jetzt auch noch in den STATE aufnehmen? :)
Titel: Aw: Wolkenuntergrenze berechnen
Beitrag von: justme1968 am 28 Juli 2013, 16:34:14
schau dir stateFormat an.

gruss
  andre
Titel: Aw: Wolkenuntergrenze berechnen
Beitrag von: Michael am 28 Juli 2013, 17:49:15
Ich trau mir fast nicht mehr zu Fragen.

Aber, ...

1.) Wie od. womit kann man die lesen Zeit abgleichen?

+*00:00:30 {my $hash =  $defs{Wittingen};
  readingsSingleUpdate($hash,"cloudBase", cloudBase(), 1) if( defined($hash) );}

2.) Geh ich falsch der Annahme das der STATE gelockt wird?
    Wollte keinen eignen Erstellen.
 
Titel: Aw: Wolkenuntergrenze berechnen
Beitrag von: justme1968 am 28 Juli 2013, 18:18:33
in meinem beispiel war es +*01:00:00 -> jede stunde.

bei dir eben +*00:00:30 -> alle 30 sekunden. ich glaube nicht das du das willst...

STATE wird nicht geloggt. es ist nur das was du im frontend in der raum übersicht siehst.

gruss
  andre
Titel: Aw: Wolkenuntergrenze berechnen
Beitrag von: Michael am 28 Juli 2013, 19:49:23
Zitatbei dir eben +*00:00:30 -> alle 30 sekunden. ich glaube nicht das du das willst...
Nein, war nur zum Testen.

Gibt es denn die Möglichkeit die Zeit zu synchronisieren?
Die vom Device (KS300) auf die des updateCloudBase [gedachte Beispiel(at +* {KS300.timer}] zuübertragen.

SORRY, ich weiß ich Nerve.
Titel: Aw: Wolkenuntergrenze berechnen
Beitrag von: justme1968 am 28 Juli 2013, 19:53:50
nein. synchronisieren geht nicht.

aber du kannst statt einem at ein notify verwenden und den dewpoint als trigger verwenden. dann wird der wert immer aktualisiert nach dem sich der dewpoint geändert hat und der sollte sich immer ändern nach dem sich die temperatur geändert hat. also etwas in der art:define upateCloudBase notify Wittingen:dewpoint {...}

gruss
  andre
Titel: Aw: Wolkenuntergrenze berechnen
Beitrag von: stromer-12 am 28 Juli 2013, 19:55:27
Mit einen userreading würde es berechnet, wenn der ks300 werte liefert.
So habe ich es bei meinen Aussensensor eingetragen ohne die myUtils.

attr <name> userReadings cloudBase {(ReadingsVal($name,"temperature", 0)-ReadingsVal($name,"dewpoint",0))*122}

edit: tschuldigung, gerade gesehen das das beim ks300 nicht geht
Titel: Aw: Wolkenuntergrenze berechnen
Beitrag von: justme1968 am 28 Juli 2013, 19:57:32
das war auch mein erster vorschlag. aber wie wir weiter oben leider schon festgestellt haben kann der ks300 keine userreadings...

gruss
  andre