Temperaturüberwachung mit Oregon Scientific Sensoren

Begonnen von --- Marko ---, 11 Januar 2017, 22:34:44

Vorheriges Thema - Nächstes Thema

--- Marko ---

Hallo zusammen!

Ich bin grad neu hier im Forum und möchte mit meinem 1. Beitrag erstmal etwas zurückgeben, da ich hier auch schon viele nützliche Infos als lesender Gast sammeln konnte.  :)

Ich hab Ende letzten Jahres angefangen mich mit FHEM zu beschäftigen und mein 1. Projekt sollte eine Temperatur- und Luftfeuchtigkeitsüberwachung der einzelnen Räume unseres Hauses sein. Ich wollte gerne eine Benachrichtigung auf mein Handy, wenn es in einem Raum zu kalt (Heizung aus, Fenster zu lange offen), zu warm (habs mal so mit eingebaut, vielleicht als zusätzlichen Feuermelder, da wirds ja ganz schnell warm ??? ) oder zu feucht ist. Dabei sollte auch noch der Batteriestatus überwacht werden.

Anhand der Anleitung unter http://www.computerhilfen.de/info/fhem-temperatur-warnung-mit-push-benachrichtigung-auf-dem-handy.html habe ich damit angefangen und dies für mich ausgebaut.

Hier als erstes mal anhand eines Temperatursensors die nötigen Geräte in fhem:

Der Temperatursensor OG_SCHLAFZIMMER_THERMOMETER selbst. Diesem habe ich drei Userattribute gegeben, damit man bei jedem Temperatursensor unterschiedliche Schwellwerte eingeben kann.
define OG_SCHLAFZIMMER_THERMOMETER TRX_WEATHER THGR810_6
attr OG_SCHLAFZIMMER_THERMOMETER userattr temp_low_threshold temp_high_threshold humidity_high_threshold
attr OG_SCHLAFZIMMER_THERMOMETER IODev RFXTRXUSB
attr OG_SCHLAFZIMMER_THERMOMETER event-min-interval state:600
attr OG_SCHLAFZIMMER_THERMOMETER event-on-change-reading state
attr OG_SCHLAFZIMMER_THERMOMETER event-on-update-reading .*
attr OG_SCHLAFZIMMER_THERMOMETER group Temperatur/Luftfeuchtigkeit
attr OG_SCHLAFZIMMER_THERMOMETER humidity_high_threshold 70
attr OG_SCHLAFZIMMER_THERMOMETER icon temperature_humidity
attr OG_SCHLAFZIMMER_THERMOMETER room Haus,Schlafzimmer,TRX_WEATHER
attr OG_SCHLAFZIMMER_THERMOMETER temp_high_threshold 40
attr OG_SCHLAFZIMMER_THERMOMETER temp_low_threshold 17


Der Dummy OG_SCHLAFZIMMER_THERMOMETER_STATUS. Diesem Dummy wird der Status zukalt, zuwarm, zufeucht, lowbatt oder ok durch die Abfrage der Werte des Temperatursensors über das nachfolgende Notify zugewiesen.
define OG_SCHLAFZIMMER_THERMOMETER_STATUS dummy
attr OG_SCHLAFZIMMER_THERMOMETER_STATUS event-on-change-reading state
attr OG_SCHLAFZIMMER_THERMOMETER_STATUS group Temperatur/Luftfeuchtigkeit
attr OG_SCHLAFZIMMER_THERMOMETER_STATUS room Schlafzimmer,Status


Das Notify OG_SCHLAFZIMMER_THERMOMETER_CHECK für die Abfrage der Werte des Temperatursensors. Je nach Ergebnis wird beim dummy OG_SCHLAFZIMMER_THERMOMETER_STATUS der entsprechende Status gesetzt.
define OG_SCHLAFZIMMER_THERMOMETER_CHECK notify OG_SCHLAFZIMMER_THERMOMETER:.* {tempsensorcheck ($NAME)}
attr OG_SCHLAFZIMMER_THERMOMETER_CHECK group Temperatur/Luftfeuchtigkeit
attr OG_SCHLAFZIMMER_THERMOMETER_CHECK room Check


Das Notify OG_SCHLAFZIMMER_THERMOMETER_ALARM. Je nach Status des Dummys wird eine entsprechend Nachricht per Telegram gesendet.
define OG_SCHLAFZIMMER_THERMOMETER_ALARM notify OG_SCHLAFZIMMER_THERMOMETER_STATUS:.* {tempsensoralarm($NAME)}
attr OG_SCHLAFZIMMER_THERMOMETER_ALARM group Temperatur/Luftfeuchtigkeit
attr OG_SCHLAFZIMMER_THERMOMETER_ALARM room Alarm


Damit man bei Änderungen an der Abfrage der Temperaturwerte oder den Meldungen, welche per Telegram verschickt werden, dies nicht bei jedem Temperatursensor einzeln im define ändern muss, habe ich diese in die 99_myUtils.pm als Funktion ausgelagert. So muss im define nur die Funktion angegeben werden und mit $NAME wird der Name des entsprechenden Geräts an die Funktion übergeben.

Überprüfung der Temperatursensoren
# Check der Temperatursensoren

sub tempsensorcheck ($) {

  my ($device) = @_;
  my $temperature = ReadingsVal("$device","temperature","");
  my $humidity = ReadingsVal("$device","humidity","");
  my $battstatus = ReadingsVal("$device","battery","");
 
  my $temp_low_threshold = AttrVal("$device","temp_low_threshold","");
  my $temp_high_threshold = AttrVal("$device","temp_high_threshold","");
  my $humidity_high_threshold = AttrVal("$device","humidity_high_threshold","");

  if ($battstatus eq "low") {
     {fhem("set ".$device."_STATUS lowbatt")}
  }
  elsif ($temperature < $temp_low_threshold) {
     {fhem("set ".$device."_STATUS zukalt")}
  }
  elsif ($temperature > $temp_high_threshold) {
     {fhem("set ".$device."_STATUS zuwarm")}
  }
  elsif ($humidity > $humidity_high_threshold) {
     {fhem("set ".$device."_STATUS zufeucht")}
  }
  else {
     {fhem("set ".$device."_STATUS ok")}
  }
 
}



Status per Telegram verschicken (kann sicherlich leicht für andere Dienste wie pushover o.ä. angepasst werden)
# Status der Temperatursensoren per Telegram verschicken

sub tempsensoralarm ($) {

  my ($status_device) = @_;
 
  my $status = ReadingsVal("$status_device","state","");
  my $room = AttrVal("$status_device","room","");
  $room =~ s/,Status//;
  $room =~ s/Status,//;

  my $device = $status_device;
  $device =~ s/_STATUS//;

  my $temperature = ReadingsVal("$device","temperature","");
  my $humidity = ReadingsVal("$device","humidity","");
  my $battstatus = ReadingsVal("$device","battery","");
  my $temp_low_threshold = AttrVal("$device","temp_low_threshold","");
  my $temp_high_threshold = AttrVal("$device","temp_high_threshold","");
  my $humidity_high_threshold = AttrVal("$device","humidity_high_threshold","");

  my $message = "Achtung, ";

  if ($status eq "lowbatt") {
     $message .= "die Batterie für den Temperatursensor im Raum ".$room." ist fast leer! \nAktueller Batteriestatus: ".$battstatus;
  } 
  elsif ($status eq "zukalt") {
     $message .= "die Temperatur im Raum ".$room." beträgt unter ".$temp_low_threshold."°C! \nAktuelle Temperatur: ".$temperature."°C.";
  }
  elsif ($status eq "zuwarm") {
     $message .= "die Temperatur im Raum ".$room." beträgt über ".$temp_high_threshold."°C! \nAktuelle Temperatur: ".$temperature."°C.";
  }
  elsif ($status eq "zufeucht") {
     $message .= "die Luftfeuchtigkeit im Raum ".$room." ist zu hoch! \nAktuelle Luftfeuchtigkeit: ".$humidity."%.";
  }
  else {
     $message = "Am Temperatursensor im Raum ".$room." ist wieder alles ok. \nStatus:".$status." \nBatteriestatus: ".$battstatus." \nTemperatur: ".$temperature."°C \nLuftfeuchtigkeit: ".$humidity."%";
  }

  { fhem("set fhemserver_tele_bot message ".$message) }
}


Hier noch zwei Beispiele für die Telegram-Meldungen:

Achtung, die Temperatur im Raum Schlafzimmer beträgt unter 17°C!
Aktuelle Temperatur: 16.7°C.


Am Temperatursensor im Raum Schlafzimmer ist wieder alles ok.
Status:ok
Batteriestatus: ok
Temperatur: 17°C
Luftfeuchtigkeit: 44%


Meine Programmierkenntnisse sind sicherlich noch stark ausbaufähig und vielleicht hat ja jemand noch eine Idee, wie man dies besser umsetzen kann. Jedoch funktioniert dies so seit einigen Wochen sehr zuverlässig bei mir. Für Anregungen bin ich natürlich offen und freue mich auf Eurer Feedback.

Gruß

Marko