Das sieht derzeit so aus:
Code: Alles auswählen
! Temperaturkompensation der Bodenfeuchte im Rasen (Sensor1 - Schaukelturm)
!
! **********************************************************************
! ** Annahmen: 2% pro °C Unterschied, Referenztemperatur = 20.0°C **
! ** k_faktor muß empirisch angepaßt werden, bis feuch_korr nachts **
! ** (sinkende Bodentemperatur!) nicht mehr deutlich fällt **
! ** **
! **********************************************************************
var debug = 0;
var Rohdaten = dom.GetObject("BidCos-RF.PEQ1887817:1.TEMPERATURE").Value(); ! Rohdaten Feuchte
var bodentemp = dom.GetObject("BidCos-RF.PEQ1887817:2.TEMPERATURE").Value(); ! Rohdaten Bodentemperatur
var feuch_roh = dom.GetObject("CUxD.CUX9000009:1.MEAN").Value(); ! CUxD-gemittelter, unkompensierter Feuchtewert
var feuch_korr = 0.0;
var k_faktor = 2.4; ! "empirischer" Kompensationsfaktor pro Kelvin
var hysterese = 0.35;
string SV1var = 0; ! String für Anzeige
var Mittel_k = dom.GetObject(ID_SYSTEM_VARIABLES).Get("Garten.Bodenfeuchte.Rasen1_kompensiert").Value();
object SV1 = dom.GetObject(ID_SYSTEM_VARIABLES).Get("Garten.Bodenfeuchte.Rasen1");
object log = dom.GetObject(ID_SYSTEM_VARIABLES).Get("System.Programme_Log");
feuch_korr = ((1.0 + (k_faktor * (20.0 - bodentemp))/100) * feuch_roh).Round(1);
if ((dom.GetObject("Garten.Bodenfeuchte.Rasen1_kompensiert").Value().Round(1) - feuch_korr).Abs() > hysterese) {
dom.GetObject("Garten.Bodenfeuchte.Rasen1_kompensiert").State(feuch_korr);
if (debug) {dom.GetObject("System.Programme_Log").State("Bodenfeuchte Rasen1: "#feuch_korr.ToString(0)#"% temperaturkompensiert, Rohdaten "#feuch_roh.ToString(0)#"% bei "#bodentemp.ToString(0)#"°C");
WriteLine("SV geschrieben");
}
}
WriteLine(".\n");
if (Mittel_k >= 88) {SV1var = "sehr naß";} ! 0 - sehr naß
if (Mittel_k < 88) {SV1var = "naß";} ! 1 - naß
if (Mittel_k < 65) {SV1var = "feucht";} ! 2 - feucht delta 23
if (Mittel_k < 45) {SV1var = "Ok";} ! 3 - OK delta 20
if (Mittel_k < 30) {SV1var = "etwas trocken";} ! 4 - etwas trocken delta 15
if (Mittel_k < 20) {SV1var = "trocken";} ! 5 - trocken delta 10
if (Mittel_k < 12) {SV1var = "furztrocken!";} ! 6 - furztrocken! delta 8
SV1var = SV1var +" ("#Mittel_k.ToString(0)#"%)";
if (debug) {
WriteLine("Rohdaten: "#Rohdaten.ToString(1)#"°C");
WriteLine("entspr. rel. Feuchte: "#feuch_roh.ToString(0)#"%");
WriteLine("entspr. rel. Feuchte (t-komp): "#Mittel_k.ToString(0)#"%");
WriteLine("SV1var: "#SV1var);
if (SV1.Value() != SV1var) {log.State("Bodenfeuchte: SV Garten.Bodenfeuchte.Rasen1 neu geschrieben");
log.State("Bodenfeuchte: "#feuch_roh.ToString(0)#"% ("#Rohdaten.ToString(1)#"°C)");
}
}
if (SV1.Value() != SV1var) {SV1.State(SV1var);}
WriteLine("\nfertig");
Unterm Strich funktioniert das immerhin schon soweit, daß ich jetzt noch keinen Fehlalarm wegen angeblich zu trockenem Boden hatte, da die Werte nach oben korrigiert (oder besser: "verändert") werden.