Howto - Feinstaubalarm (per zPNP)

Problemlösungen und Hinweise von allgemeinem Interesse zur Haussteuerung mit HomeMatic

Moderator: Co-Administratoren

Antworten
dtp
Beiträge: 10658
Registriert: 21.09.2012, 08:09
System: CCU
Wohnort: Stuttgart
Hat sich bedankt: 320 Mal
Danksagung erhalten: 501 Mal

Howto - Feinstaubalarm (per zPNP)

Beitrag von dtp » 08.08.2021, 12:49

Hallo,

das nachfolgende Programm samt Skript nutzt mein zentrales Pushnachtenprogramm (zPNP) für die Alarm- und Warnmeldungen.

Bereits hier hatte ich über den installierten Feinstaubsensor berichtet. Ursprünglich wollte ich ihn per Solarpanel und kleinem 5V-Solarmodul speisen, doch das schlug leider fehl, weil der HmIP-SFD zwar wenig Strom verbraucht, aber leider mit 24 V versorgt werden muss. Daher habe ich mir ein kleines, wasserdichtes 24V-Netzteil besorgt, um den Sensor über ein ca. 5 Meter langes Telefonkabel am Rand der Dachterrasse in ca. 8 Meter Höhe mit Energie zu versorgen.
2021-07-16 18-24-24.jpg
Leider konnte ich den Sensor nicht plan an der Hauswand anbringen, sondern ca. 40 cm nach hinten versetzt und ca. 1,50 m über der Umrandung der Dachterrasse.
2021-07-16 18-25-29.jpg
Mit folgendem Programm erfolgt nun eine Mitteilung, sobald die Massenkonzentration von Partikeln mit 10 und weniger µm den eingestellten Grenzwert von 40 µm/m³ überschreitet.
2021-08-07_18h37_33.png
Hier das zugehörige Skript des Dann-Zweigs:

Code: Alles auswählen

! Meldung Feinstaub
! Version 1.2.1, Autor: dtp
 
! Name von Kanal 1 des Feinstaubsensors
string channel = "DG Terrasse Feinstaubsensor Daten";

! +++++ Verschluss-Gewerk +++++
string closureTrade = "Verschluss";

! +++++ Liste der zu berücksichtigenden Räume; Räume mit "\t" trennen) +++++
string roomsList = "DG Schlafzimmer\tDG Flur\tOG Zimmer Lina\tOG Büro\tEG Wohnzimmer\tUG Büro/Gästezimmer";

! Namen der verwendeten Systemvariablen
string svPushText = "CCU SV Push Text"; ! gem. zPNS-xx, obligatorisch
string svPushPrio = "CCU SV Push Prio"; ! gem. zPNS-xx, obligatorisch
string svMassConcentrationPeak = "Haus SV Feinstaub Massenkonzentration PM10 Höchstwert"; ! Höchstwert der Massenkonzentration, obligatorisch
string svPushoverSound = "CCU SV Pushover Sound"; ! gem. zPNS-Po, optional
 
! Name des zentralen Push-Nachrichten-Programms
string zPNP = "CCU PRG Push-Nachrichten"; ! obligatorisch
 
! #####################################################################
! ##### ab hier bitte keine weiteren Einstellungen mehr vornehmen #####
! #####################################################################
 
! +++++ Deklaration weiterer Variablen +++++
string pollution; string massConcentration; string massConcentrationDayMax; string message; string fontColor = ""; string sound; 
string index; string closure; string closureName; string room; string list = "";
integer prio = 0;
object svObject; object svObjectList;

! +++++ Systemvariable für die Höchstgeschwindigkeit des Windes auslesen und ggf. anlegen +++++
if(!svMassConcentrationPeak){svMassConcentrationPeak = "Haus SV Feinstaub Massenkonzentration PM10 Höchstwert";}
svObject = dom.GetObject(ID_SYSTEM_VARIABLES).Get(svMassConcentrationPeak);
if(!svObject){   
  svObjectList = dom.GetObject(ID_SYSTEM_VARIABLES); svObject = dom.CreateObject(OT_VARDP); svObjectList.Add(svObject.ID());
  svObject.Name(svMassConcentrationPeak); svObject.DPInfo("Höchstwert der Feinstaub-Massenkonzentration (PM10)"); svObject.Internal(false); svObject.Visible(true);
  svObject.ValueType(ivtFloat); svObject.ValueSubType(istGeneric); svObject.ValueUnit("µg/m³"); svObject.ValueMin(0); svObject.ValueMax(65000); dom.RTUpdate(true);
}
else{massConcentrationDayMax = svObject.Value();}

! +++++ Aktuelle Massenkonzentration für PM 10 +++++
massConcentration = (dom.GetObject(ID_CHANNELS).Get(channel)).DPByHssDP("MASS_CONCENTRATION_PM_10").Value();

! +++++ Nachricht senden, wenn Massenkonzentration den bisherigen Spiztenwert überschritten hat +++++
if(massConcentration > massConcentrationDayMax){
  ! ----- Erzeugung der Begriffe in Abhängigkeit von der Massenkonzentration -----
  if(massConcentration > 300){pollution = "gesundheitsgefährdend"; prio = 2; sound = "siren"; fontColor = "orangered";}
  elseif(massConcentration > 200){pollution = "sehr ungesund"; prio = 2; sound = "siren"; fontColor = "orangered";}
  elseif(massConcentration > 150){pollution = "ungesund"; prio = 1; sound = "gamelan"; fontColor = "orangered";}
  elseif(massConcentration > 100){pollution = "kritisch"; prio = 1; sound = "gamelan"; fontColor = "orange";}
  elseif(massConcentration > 50){pollution = "mäßig"; prio = 1; sound = "gamelan"; fontColor = "orange";}
  else{pollution = "noch gut"; prio = 0; sound = "pushover"; fontColor = "yellowgreen";}

  ! ----- Ermitteln offener oder gekippter Fenster aus roomsList bei ungesunder Massenkonzentration und gesetztem Verschluss-Gewerk -----
  if((massConcentration > 100) && (closureTrade)){
    foreach(index, dom.GetObject(ID_FUNCTIONS).Get(closureTrade).EnumUsedIDs()){
      if(dom.GetObject(index).IsTypeOf(OT_CHANNEL)){
        closure = dom.GetObject(dom.GetObject(index).Device());
        closureName = closure.Name();
        
        if(closure.HssType() == "HmIP-SRH"){
          if(roomsList){
            foreach(room, roomsList){
              if(closureName.Contains(room)){
                if(dom.GetObject(index).DPByHssDP("STATE").Value() == 2){list = list#"\n- "#closureName#" offen.";}
                elseif(dom.GetObject(index).DPByHssDP("STATE").Value() == 1){list = list#"\n- "#closureName#" gekippt.";}
              }
            }
          }
          else{
            if(dom.GetObject(index).DPByHssDP("STATE").Value() == 2){list = list#"\n- "#closureName#" offen.";}
            elseif(dom.GetObject(index).DPByHssDP("STATE").Value() == 1){list = list#"\n- "#closureName#" gekippt.";}
          }
        }
      }
    }
  }
  if(list){prio = 2; sound = "siren"; fontColor = "orangered";}

  ! ----- Setzen der Höchstgeschwindigkeit des Windes -----
  (dom.GetObject(ID_SYSTEM_VARIABLES).Get(svMassConcentrationPeak)).State(massConcentration);

  ! +++++ Setzen der Priorität für die Push-Nachricht +++++
  (dom.GetObject(ID_SYSTEM_VARIABLES).Get(svPushPrio)).State(prio);

  ! +++++ Sound für Pushover-Nachricht +++++
  if(dom.GetObject(ID_SYSTEM_VARIABLES).Get(svPushoverSound)){(dom.GetObject(ID_SYSTEM_VARIABLES).Get(svPushoverSound)).State(sound);}

  ! +++++ Erzeugen der Nachricht +++++
  if(list){message = "<font color="#fontColor#">Achtung, Feinstaubwerte (PM10) "#pollution#": "#massConcentration.ToString(1)#" µg/m³. Fenster schließen!</font>"#list;}
  elseif(massConcentration <= 50){message = "<font color="#fontColor#">Feinstaubwerte (PM10) "#pollution#": "#massConcentration.ToString(1)#" µg/m³.</font>";}
  else{message = "<font color="#fontColor#">Achtung, Feinstaubwerte (PM10) "#pollution#": "#massConcentration.ToString(1)#" µg/m³!</font>";} 
 
  ! +++++ Programm "CCU PRG Push-Nachrichten" ausführen ++++
  (dom.GetObject(ID_SYSTEM_VARIABLES).Get(svPushText)).State(message);
  (dom.GetObject(ID_PROGRAMS).Get(zPNP)).ProgramExecute();
}
Es legt beim ersten Aufruf automatisch eine unter der lokalen Variablen "svMassConcentrationPeak" definierte Systemvariable zum Speichern des Tageshöchstwert an. Diese Systemvariable wird durch das Programm jede Nacht um 0:00 Uhr auf den Wert null gesetzt und jeweils bei Aufruf des Skripts mit dem dann aktuellen Tageshöchstwert überschrieben. Eine Meldung erfolgt somit nur, wenn dieser Tageshöchstwert beim nochmaligen Aufruf des Programms bzw. Skripts überschritten wurde. Das soll verhindern, dass man mit Meldungen überschüttet wird.

Unter der lokalen Skriptvariablen "channel" gibt man den Namen von Kanal 1 des Feinstaubsensors an. Mit "closureTrade" kann das Gewerk für etwaige Fensterverschlüsse gesetzt werden. Lässte man diese Variable leer, so werden keine Fensterzustände berückichtigt. Die zu berücksichtigenden Fenster kann man in "roomsList" definieren. Das macht z.B. dann Sinn, wenn man auch bei geringeren Feinstaubwerten bestimmte Räume vor z.B. eindringendem Rauch von Holzkohlegrills, Zigaretten, etc. schützen möchte.

Die restlichen lokalen Variablen ergeben sich aus dem zPNP.

Eine generelle Feinstaubmeldung per Pushover sieht dann z.B. so aus.
2021-08-07 20-05-56.jpg
Hat man unter "roomsList" eine Liste der zu berücksichtigenden Räume und unter "closureTrade" das Gewerk für die Verschlusssensoren definiert, dann kann eine Meldung wie folgt aussehen:
2021-08-07 18-48-54.jpg
Es handelt sich hier aber nur um eine Testnachricht. Normalerweise wird diese erst ab einer Massenkonzentraton von über 100 µg/m³ erzeugt.

Bemerkung: Derzeit ist das Skript noch auf die HmIP-SRH Fenstergriff-Sensoren beschränkt. Muss ich mal auf andere Sensoren erweitern, wenn Bedarf besteht.
Zuletzt geändert von dtp am 17.08.2021, 10:51, insgesamt 2-mal geändert.
CCU3 mit stets aktueller FW und den Addons "CUxD" und "Programmedrucken", ioBroker auf Synology DiskStation DS718+ im Docker-Container;
einige Projekte: zentrales Push-Nachrichten-Programm zPNP, DoorPi-Videotürsprechanlage, An- und Abwesenheitsdetektion per Haustürschloss, zentrales Programm zur Steuerung von Beschattungsgeräten zBSP.

dtp
Beiträge: 10658
Registriert: 21.09.2012, 08:09
System: CCU
Wohnort: Stuttgart
Hat sich bedankt: 320 Mal
Danksagung erhalten: 501 Mal

Re: Howto - Feinstaubalarm (per zPNP)

Beitrag von dtp » 08.08.2021, 12:56

Ich habe mir auch eine entsprechende Anzeige in meiner ioBroker-Visualisierung gebastelt. Hier mal zwei Beispiele.
2021-08-07_17h53_17.png
Im ersten Screenshot gab es einen Feinstaubarlarm, weil der Nachbar seinen Holzkohlegrill angeschmissen hatte. Daher auch die rote Bargraph-Anzeige.
2021-08-08_12h51_38.png
Im zweiten Screenshot sind die Werte wieder normal (grüne Bargraph-Anzeige). Zudem ist dort der zeitliche Verlauf der Werte dargestellt. Man sieht sehr gut den gestrigen Peak von fast 250 µg/m³.
CCU3 mit stets aktueller FW und den Addons "CUxD" und "Programmedrucken", ioBroker auf Synology DiskStation DS718+ im Docker-Container;
einige Projekte: zentrales Push-Nachrichten-Programm zPNP, DoorPi-Videotürsprechanlage, An- und Abwesenheitsdetektion per Haustürschloss, zentrales Programm zur Steuerung von Beschattungsgeräten zBSP.

Antworten

Zurück zu „HomeMatic Tipps & Tricks - keine Fragen!“