2 Temperaturen subtrahieren, ich schaffs nicht....

Begonnen von Stromschiene, 24 Mai 2015, 15:31:06

Vorheriges Thema - Nächstes Thema

Stromschiene

Hallo lb Gemeinde:

Ich habe es bis jetzt geschafft, meine 10 Rollläden halbwegs komfortabel über mein Tablett zu steuern. (Raspberry PI)
Auch kann ich schon über 1Wire die Außentemperatur (T_schatten) und die Temp. in meinem sonnenbeschienen Kasterl (T_Sonne) messen.
Die Differenz der beiden Temp. ergibt ein Maß für die Sonneneinstrahlung und sollte ein Steuerkriterium für meine Rollläden werden.
Die 2 Temp. werden auch schon brav in meinem File mitgeloggt und als Plot angezeigt.

Nur wie subtrahiere ich die 2 Temp. zu T_diff?

Ich habe schon alle möglichen Code-Schnipsel versucht, aber leider bin ich scheinbar für Perl zu blöd.
zB.:{fhem ("set T_diff" +(Value("T_Sonne")-Value("T_Schatten")))} zeigt keine Wirkung.

T_diff ist als dummy definiert.

Als nächstes muss ich:

T_diff=T_Sonne-T_Schatten
T_diff im Loggfile speichern
T_diff im Plot anzeigen

und dann noch die Abfragen, sinngemäß:

Wenn T_diff 20 Minuten lang > 20 Grad C, dann R_alle=AB
Wenn T_diff 60 Minuten lang < 19 Grad C, dann R_alle=AUF

Könnte mir bitte wer einen Schubser in die richtige Richtung oder einen dazu passenden Link posten?
Ich schaffe es alleine nicht.

mfd

Stefan

franky08

#1
Schreib doch eine sub in die 99_myUtils, so in der Form my $temp1 = ReadingsVal("Sensor1","temperature",0);
my $temp2 = ReadingsVal("Sensor2","temperature",0);

und dann substahierst du einfach mit my $diff = ($temp1 - $temp2);
und fhem "set T_diff $diff";

fertig.

VG
Frank
Debian Bookworm auf HUNSN / Debian Bullseye auf 2.ter HUNSN F2F an 2x RaspiB
mit FHEM aktuell
22Zoll ViewSonic als Infodislay (WVC)
3xHMLAN mit vccu, raspmatic_rpi3, HMIP-HCU1

Dietmar63

oder.


{fhem ("set T_diff" . Value("T_Sonne")-Value("T_Schatten"))}
Gruß Dietmar
FB7390, CUL, 2 FHT, FS20
modules: 98_WOL.pm, 98_Heating_Control.pm,   98_WeekdayTimer.pm, 98_RandomTimer.pm, 59_Twilight.pm

igami

oder mit einem DOIF


define di_diff DOIF (([T_Sonne]-[T_Schatten]) > 20)(set R_alle AB)DOELSEIF(([T_Sonne]-[T_Schatten]) < 19)(set R_alle AUF)
attr di_diff cmdState alle auf|alle ab
attr di_diff stateFormat {(Value('T_Sonne')-Value('T_Schatten')).' °C<br>'.ReadingsVal('di_diff','state','???')}
attr di_diff wait 1200:3600


Grüße
igami
Pi3 mit fhem.cfg + DbLog/logProxy
Komm vorbei zum FHEM Treffen im Kreis Gütersloh! Das nächste Mal im April 2020.

MAINTAINER: archetype, LuftdatenInfo, monitoring, msgDialog, Nmap, powerMap
ToDo: AVScene, FluxLED

Stromschiene

Danke für die Antworten.
Ich habe mal diese Lösung versucht:

Zitat von: igami am 24 Mai 2015, 17:31:03
oder mit einem DOIF


define di_diff DOIF (([T_Sonne]-[T_Schatten]) > 20)(set R_alle AB)DOELSEIF(([T_Sonne]-[T_Schatten]) < 19)(set R_alle AUF)
attr di_diff cmdState alle auf|alle ab
attr di_diff stateFormat {(Value('T_Sonne')-Value('T_Schatten')).' °C<br>'.ReadingsVal('di_diff','state','???')}
attr di_diff wait 1200:3600


Grüße
igami


Leider führt das zu folgenden Logeintrag:

2015.05.26 12:33:13 1: PERL WARNING: Argument "T: 14.25" isn't numeric in subtraction (-) at (eval 323) line 1, <$fh> line 176.
2015.05.26 12:33:13 1: PERL WARNING: Argument "T: 14.437" isn't numeric in subtraction (-) at (eval 323) line 1, <$fh> line 176.

Scheinbar erkennt er die "a4.437" nicht als Zahl.

Auch ist der Logeintrag folgend:
2015-05-26_12:34:11 T_Sonne temperature: 14.375
2015-05-26_12:34:12 T_Schatten temperature: 14.25

Da steht nicht: "T: 14.437" Wie kommt er auf diesen Text?

Ich habe den Logeintrag folgendermaßen erzeugt:

define T_Sonne GPIO4 10-000802b577a4
attr T_Sonne group temp
attr T_Sonne icon weather_sun
attr T_Sonne model DS1820
attr T_Sonne pollingInterval 3000
attr T_Sonne stateFormat {sprintf "%.1f °C", ReadingsVal($name, "temperature", 0)}

(auch irgendwo abgeschrieben)
Ich taumle von einem Fehler zum Nächsten.

Kann man den Text in eine Zahl umwandeln?

mfg




VB90

Vermutung an:

Vielleicht wird mindestens eine ganze Zahl erwartet.
Deine aktuellen Werte liefern aber 0,125 zurück.

Anderer Ansatz:
Bei der Subtraktion wird u.U. das "T:" mit einbezogen, was selbstverständlich für eine Berechnung nonsens ist.
Zumindest verstehe ich die Fehlermeldung so.
Müsste man schauen, wie man das "ausgeblendet bekommt.

Da die Stellen hinter dem Komma eher uninteressant sind, die DS1820 haben eh eine 0,5 Genauigkeit, würde ich die Werte erstmal auf ganze Zahlen runden lassen und erst diese Verarbeiten.
Man muss das Rad nicht neu erfinden, nur wissen wie es gedreht wird.

flurin

#6
Versuchs mal so:


define di_temp_diff DOIF
attr di_temp_diff state {([T_Sonne:temperature:d])-([T_Schatten:temperature:d])}


Unter di_temp_diff state wird die Temperatur-Differenz gespeichert. Ein Dummy brauchst du dafür nicht.

Die Auswertung erfolgt z.B. wiederum mit einem DOIF:


define di_action DOIF ([di_temp_diff] > 20) (set R_alle AB)
DOELSEIF ([di_temp_diff] < 19) (set R_alle AUF)
attr di_action wait 1200:3600
attr di_action do always


Gruss
flurin

igami

Zitat von: Stromschiene am 26 Mai 2015, 12:40:05
Auch ist der Logeintrag folgend:
2015-05-26_12:34:11 T_Sonne temperature: 14.375
2015-05-26_12:34:12 T_Schatten temperature: 14.25

Da steht nicht: "T: 14.437" Wie kommt er auf diesen Text?

Was steht im STATE von T_Sonne? Vielleicht T: 14.437? Dann müsste noch das Reading angegeben werden als [T_Sonne:temperature] und ReadingsVal('T_Sonne', 'temperature', 0).

Zitat von: flurin am 26 Mai 2015, 14:42:42
Versuchs mal so:
Da braucht man ja zwei DOIF für :P

Grüße
igami
Pi3 mit fhem.cfg + DbLog/logProxy
Komm vorbei zum FHEM Treffen im Kreis Gütersloh! Das nächste Mal im April 2020.

MAINTAINER: archetype, LuftdatenInfo, monitoring, msgDialog, Nmap, powerMap
ToDo: AVScene, FluxLED

flurin

#8
Zitat von: igami am 26 Mai 2015, 17:11:07
Da braucht man ja zwei DOIF für :P

Wie hast du diese Vorgabe gelöst?
Zitat
Als nächstes muss ich:

T_diff=T_Sonne-T_Schatten
T_diff im Loggfile speichern
T_diff im Plot anzeigen

Bei meinem Vorschlag kommt lediglich noch FileLog + SVG dazu:


define FileLog_di_temp_diff FileLog ./log/di_temp_diff-%Y.log di_temp_diff
attr FileLog_di_temp_diff logtype text

igami

Zitat von: flurin am 26 Mai 2015, 19:27:02
Wie hast du diese Vorgabe gelöst?
garnicht, hab ich überlesen.

Verändern wir also das DOIF zu

define di_diff DOIF
(([T_Sonne]-[T_Schatten]) > 20)
  (
    set R_alle AB,
    setreading di_diff difference {([T_Sonne]-[T_Schatten])}
  )
DOELSEIF(([T_Sonne]-[T_Schatten]) < 19)
  (
    set R_alle AUF,
    setreading di_diff difference {([T_Sonne]-[T_Schatten])}
  )
attr di_diff cmdState alle auf|alle ab
attr di_diff stateFormat {ReadingsVal($name, 'difference', 0).' °C<br>'.ReadingsVal('di_diff','state','???')}
attr di_diff wait 1200:3600

nun wird im DOIF noch das Reading difference angelegt, welches geplottet werden kann.

Grüße
igami
Pi3 mit fhem.cfg + DbLog/logProxy
Komm vorbei zum FHEM Treffen im Kreis Gütersloh! Das nächste Mal im April 2020.

MAINTAINER: archetype, LuftdatenInfo, monitoring, msgDialog, Nmap, powerMap
ToDo: AVScene, FluxLED

flurin

#10
@igami

Die Berechnung [T_Sonne]-[T_Schatten] wird 4 mal ausgeführt. In höheren Sprachen würde man dafür eine Variable verwenden.
Was ist der Sinn und Zweck, alles mit einem DOIF zu lösen?

Gruss
flurin

igami

Zitat von: flurin am 27 Mai 2015, 09:11:58
Die Berechnung [T_Sonne]-[T_Schatten] wird 4 mal ausgeführt. In höheren Sprachen würde man dafür eine Variable verwenden.
Was ist der Sinn und Zweck, alles mit einem DOIF zu lösen?
Das habe ich  mir heute morgen auf dem Weg zur Arbeit auch gedacht ;)
Nur ein DOIF um das ganze schlank zu halten. Warum sollte ich einen Dummy umgehen wollen und dafür ein DOIF einsetzten?


define di_diff DOIF
([di_diff:difference] >20)
  (set R_alle AB)
DOELSEIF([di_diff:difference] < 19)
  (set R_alle AUF)
DOELSEIF([T_Sonne] or [T_Schatten])
  (setreading di_diff difference {([T_Sonne:temperature]-[T_Schatten:temperature])})
attr di_diff cmdState alle auf|alle ab|difference
attr di_diff stateFormat difference °C
attr di_diff wait 1200:3600:0

Nun wird es nur noch einmal berechnet.
Pi3 mit fhem.cfg + DbLog/logProxy
Komm vorbei zum FHEM Treffen im Kreis Gütersloh! Das nächste Mal im April 2020.

MAINTAINER: archetype, LuftdatenInfo, monitoring, msgDialog, Nmap, powerMap
ToDo: AVScene, FluxLED

flurin

#12
Zitat von: igami am 27 Mai 2015, 13:21:19
Das habe ich  mir heute morgen auf dem Weg zur Arbeit auch gedacht ;)
Nur ein DOIF um das ganze schlank zu halten. Warum sollte ich einen Dummy umgehen wollen und dafür ein DOIF einsetzten?

schlank? Ansichtssache.
Mit dem Dummy hätte es noch ein notify oder DOIF gebraucht, mit dem "di_temp_diff" DOIF wird der Dummy überflüssig.

igami

#13
Mit meiner letzten Version funktioniert es auch noch nicht.
Edit: aber so:

define di_diff DOIF
([T_Sonne] or [T_Schatten])
  (sleep 0.001; setreading di_diff difference {([T_Sonne]-([T_Schatten]))})
DOELSEIF([di_diff:?difference] and [di_diff:difference] > 20)
  (set R_alle AB)
DOELSEIF([di_diff:?difference] and [di_diff:difference] < 19)
  (set R_alle AUF)
attr di_diff cmdState difference|alle auf|alle ab
attr di_diff stateFormat difference °C
attr di_diff wait 0:1200:3600:0
Pi3 mit fhem.cfg + DbLog/logProxy
Komm vorbei zum FHEM Treffen im Kreis Gütersloh! Das nächste Mal im April 2020.

MAINTAINER: archetype, LuftdatenInfo, monitoring, msgDialog, Nmap, powerMap
ToDo: AVScene, FluxLED

Stromschiene

Danke für die zahlreiche Anteilnahme!

Ich habe den Code von flurin verwendet, und er funkt fast perfekt (THX!).

define T_diff DOIF
attr T_diff state {([T_Sonne:temperature:d])-([T_Schatten:temperature:d])}
attr T_diff group temp

# OG Alle (außer Kinderzimmer)
define T_diff_OG DOIF ([T_diff] > 9) (set R_OG_Alle AB) DOELSEIF ([T_diff] < 6) (set R_OG_Alle AUF)
attr   T_diff_OG wait 600:60
attr   T_diff_OG do always

Nur leider wird das DOIF mehrmals, alle 10/1 Minute ausgeführt. Ich möchte aber die Rollläden wg. der Luftzirkulation nicht ganz schließen. Werden sie mehrmals geschlossen, so sind sie später ganz zu und der Luftpolster zwischen Scheibe und Rollladen heizt sich unnötig auf.

Lasse ich "attr   T_diff_OG do always" weg, so wird das DOIF kein einziges mal, auch wenn sich T_diff ändert, nicht ausgelöst.
Es sollte aber einmal ausgelöst, auf die 2 Bedingung (>6) warten, um dann von vorne zu beginnen.

Einen kleinen Schubbs noch bitte! (:=))

mfg
Stefan