aktuellen Wert Logfile FileLog lesen auswerten und FS20 Dummy schalten

Begonnen von bhilde, 25 April 2016, 13:27:56

Vorheriges Thema - Nächstes Thema

bhilde

Hallo,
ich bin ganz frisch mit FHEM unterwegs. Ich habe das Einsteigertutorial gelesen und die command-ref versucht zu verstehen.. Konnte schon einiges umsetzen komme aber nun nicht weiter.

Ich habe ein Arduino mit Ethernet Shield u.a. einen Temperatursensor und RF Sender der eine Funkstecktdose schalten kann.

Auszug aus meiner fhem.cfg

define arduinogetsensorvalues at +*00:00:10 {\
my $val = GetHttpFile('192.168.35.161:80', '/?cmd=get_sensor_values');;\
fhem("trigger arduinogetsensorvalues $val");;\
}
attr arduinogetsensorvalues room Arduino
define FileLog_arduinogetsensorvalues FileLog ./log/arduinogetsensorvalues-%Y.log arduinogetsensorvalues:(TL|H|TW|mvpH|pH|DIS1|DIS2).*
attr FileLog_arduinogetsensorvalues room Arduino
#define weblink_getsensorvalues SVG FileLog_arduinogetsensorvalues:arduino:CURRENT
#attr weblink_getsensorvalues label "Arduino Sensorvalues Min $data{min1}, Max $data{max1}, Last $data{currval1}"
#attr weblink_getsensorvalues room Arduino
define weblink_getTW SVG FileLog_arduinogetsensorvalues:arduino_TW:CURRENT
attr weblink_getTW label "Wassertemperatur Min $data{min1}, Max $data{max1}, Last $data{currval1}"
attr weblink_getTW room Arduino

define arduinobutton4 FS20 55d4 00
attr arduinobutton4 room Arduino
define FileLog_arduinobutton4 FileLog ./log/arduinobuttonon4-%Y.log arduinobutton4
attr FileLog_arduinobutton4 room Arduino
define arduinoswitchon4 notify arduinobutton4:on { GetHttpFile("192.168.35.161:80","/?cmd=set_RF4_ON")}
attr arduinoswitchon4 room Arduino
define arduinoswitchoff4 notify arduinobutton4:off { GetHttpFile("192.168.35.161:80","/?cmd=set_RF4_OFF")}
attr arduinoswitchoff4 room Arduino
define weblink_arduinobutton4 SVG FileLog_arduinobutton4:fs20:CURRENT
attr weblink_arduinobutton4 label "arduinobutton4 Min $data{min1}, Max $data{max1}, Last $data{currval1}"
attr weblink_arduinobutton4 room Arduino

#Ich weiß dass folgende so nicht geht, wie kann ich auf FileLog_arduinogetsensorvalues auf den letzten Wert des Attributes TL zugreifen???
define HeizungTempSensor notify FileLog_arduinogetsensorvalues:arduino_TL:CURRENT { \
  my $temp = $data{currval1};;\
  my $val = Value("arduinobutton4 ");;\
  fhem("set arduinobutton4 on")  if($temp < 22.0 && $val eq "off");;\
  fhem("set arduinobutton4 off") if($temp > 23.5 && $val eq "on");;\
}


eine Zeile im Sensor Log sieht so aus:
2016-04-25_13:25:05 arduinogetsensorvalues TL: 21.00 H: 20.00 TW: 20.94 mvpH: 3002 pH: 8.68 DIS1: 3 DIS2: 6

Ich möchte den arduinobutton4 (Funkschalter) schalten wenn die TL (Temperatur) < 22C° ist.
Weiß jmd wie ich den letzten Wert des Attributes TL aus dem Logfile komme und auswerten kann?

Gruß Bastian

viegener

Ich bin nicht sicher ob ich das richtig verstanden habe, deshalb versuche ich es mal zu umschreiben:

Du holst den Sensorwert alle 10sek von Deinem Arduino und triggerst mit diesem Wert einen Event.
Da Du den Wert aber nicht ablegst, kannst Du an anderen Stellen auf dem aktuellen Wert nicht zugreifen sondern er steckt nur flüchtig im Event und ansonsten im Filelog.

Der einfachste Lösungsvorschlag wäre ein Dummy device
Also ein Dummy device in dem Dein at-Befehle die Werte setzt. Dann hast Du einen Filelog, im state vom dummy aber auch immer die aktuellen Werte.
Auf diesen state (ReadingsVal) kannst Du dann auch in anderen Teilen zugreifen und beim Setzen entsteht auch ein Event, den Du für andere Steuerungen verwenden kannst.

Generell wäre es aber natürlich besser die verschiedenen Sensorwerte in einzelne Readingsumzuwandeln und somit auch auf einzelne Wertänderungen zu reagieren.



Kein Support über PM - Anfragen gerne im Forum - Damit auch andere profitieren und helfen können

bhilde

hallo viegener,
danke für deine Antwort.
ich schnalle einfach den Aufbau der cfg noch nicht

define arduinogetsensorvalues at +*00:00:10 {\
my $val = GetHttpFile('192.168.35.161:80', '/?cmd=get_sensor_values');;\
fhem("trigger arduinogetsensorvalues $val");;\
}


in dem device arduinogetsensorvalues liegen ja die aktuellen sensorwerte

parallel zu: define FileLog_arduinogetsensorvalues FileLog ./log/arduinogetsensorvalues-%Y.log arduinogetsensorvalues:(TL|H|TW|mvpH|pH|DIS1|DIS2).*

kann ich da jetzt nicht noch: define irgendwas [i]arduinogetsensorvalues:(TL).*[/i]
{ \
  my $temp = [i]????;;\[/i]
  my $val = Value("arduinobutton4 ");;\
  fhem("set arduinobutton4 on")  if($temp < 22.0 && $val eq "off");;\
  fhem("set arduinobutton4 off") if($temp > 23.5 && $val eq "on");;\
}


Ich weiß einfach nicht wie ich es ausdrücken muss bzw. wie ich das Dummy Objekt definieren muss... Hast du wenig Beispielcode für mich?

justme1968

falls du den code auf deinem arduino selber unter Kontrolle hast wäre es besser nicht zu pollen sondern den arduino bei änderungen an FHEM senden zu lassen. dann brauchst du keinen dummy sondern kannst dir mal das KeyValueProtocoll modul anschauen.

ansonsten: einen dumme anlegen und statt mit trigger ein event auszulösen mit setreading ein reading schreiben. dann hast du den wert im reading stehen und automatisch ein event.

du kannst die readings im
prinzip auch direkt in das at device schreiben.

gruss
  andre
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

bhilde



Zitat von: justme1968 am 25 April 2016, 15:18:24
ansonsten: einen dumme anlegen und statt mit trigger ein event auszulösen mit setreading ein reading schreiben. dann hast du den wert im reading stehen und automatisch ein event.
das klingt so als würde ich es nicht verstehen.  :-\  die command-ref ist zu atomar um die zusammenhänge zu verdeutlichen. ich stehe auf dem schlauch

justme1968

du hast ein at das ein FHEM trigger aufruft. damit erzeugst du ein event. ein event ist aber flüchtig.

wenn du statt trigger setreading verwendest um ein reading anzulegen ist der wert persistent und nicht flüchtig.

das ist unabhängig vom log. das ist 'nur' für historische daten und zum plotten.
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

viegener

Also im einfachsten Fall erstmal folgendes:


define arduinoSensor dummy

define arduinogetsensorvalues at +*00:00:10 {\
my $val = GetHttpFile('192.168.35.161:80', '/?cmd=get_sensor_values');;\
fhem("set arduinoSensor $val");;\
}


Danach hast Du im Deivce arduinoSensor ein Reading state wie schon oben beschrieben und dazu kannst Du auch noch ein Filelog anlegen.
Also etwas wie:


define FileLog_arduinoSensor FileLog ./log/arduinoSensor -%Y.log arduinoSensor


Dein HeizungsSensor notify kann dann auf Events vom Deivce arduinoSensor reagieren


Kein Support über PM - Anfragen gerne im Forum - Damit auch andere profitieren und helfen können

bhilde

GELÖST: Arduino mit Ethernetshield, RF 433MHZ Modul u. div. Sensoren, unter anderem einem TempSensor dessen Wert eine Heizung an der Funksteckdose schalten soll.

define arduinoSensorTW dummy

#$val =TL: 22.00 H: 20.00 TW: 21.87 mvpH: 3037 pH: 8.48 DIS1: 8 DIS2: 2441
#Das AT Device 'arduinogetsensorvalues' wird zum einen für die Plots der Arduino Sensoren genutzt und zum anderen der 'state' des Dummys mit dem TW (Temperatur Wasser) value gesetzt
define arduinogetsensorvalues at +*00:00:10 {\
my $val = GetHttpFile('192.168.35.161:80', '/?cmd=get_sensor_values');;\
fhem("trigger arduinogetsensorvalues $val");;\
$val =~ /TW:\s(\d+\.\d+)\s/;;\
fhem("set arduinoSensorTW $1");;\

}

#Das Notify Device 'HeizungTempSensor' schaltet eine Heizung über ein Funkmodul am Arduino die Funksteckdose 4 (über das FS20 Device 'arduinobutton4')
define HeizungTempSensor notify arduinoSensorTW {\
my $val = ReadingsVal('arduinobutton4', 'state', 'off');;\
my $temp = ReadingsVal('arduinoSensorTW', 'state', 0);;\
  fhem("set arduinobutton4 on")  if($temp < 15.0 && $val eq "off");;\
  fhem("set arduinobutton4 off") if($temp > 16.0 && $val eq "on");;\
}\


# Das FS20 Device 'arduinobutton4' schaltet über über HTTP einen Arduino mit 433 MHZ Sender eine Funksteckdose
define arduinobutton4 FS20 55d4 00
attr arduinobutton4 room Arduino
define FileLog_arduinobutton4 FileLog ./log/arduinobuttonon4-%Y.log arduinobutton4
attr FileLog_arduinobutton4 room Arduino
define arduinoswitchon4 notify arduinobutton4:on { GetHttpFile("192.168.35.161:80","/?cmd=set_RF4_ON")}
attr arduinoswitchon4 room Arduino
define arduinoswitchoff4 notify arduinobutton4:off { GetHttpFile("192.168.35.161:80","/?cmd=set_RF4_OFF")}
attr arduinoswitchoff4 room Arduino


Danke für die Tips von Euch!
Gruß Bastian