Script für gleitenden Mittelwert

Homematic-, TCL- und Shell-Script, Toolchain, C, etc.

Moderator: Co-Administratoren

xaler
Beiträge: 3
Registriert: 01.05.2017, 15:12

Re: Script für gleitenden Mittelwert

Beitrag von xaler » 02.05.2017, 20:36

paul53 hat geschrieben:
xaler hat geschrieben:Jetzt müsste mir nur noch erklärt werden, wieso nur 2 Werte in die Messwertliste "list" und in die Variable eingetragen werden. Es sollten doch 5 sein, bzw. die Anzahl = n entsprechen.
Die Zahl der Werte in der Liste wird durch das einmalig auszuführende Initialisierungsskript (s.o.) vorgegeben. Falls fehlerhaft, dann das Skript noch einmal ohne Fehler ausführen !
Das mit dem Initialiseren macht natürlich Sinn. :)
Es läuft wie es soll, danke an alle die sich Gedanken und die viele Mühe dazu gemacht haben!

der-flash
Beiträge: 31
Registriert: 05.07.2015, 17:26

Re: Script für gleitenden Mittelwert

Beitrag von der-flash » 07.07.2017, 15:39

Sorry aber ich stehe hier auf dem Schlauch.
Ich habe 2 Variablen
"Außentemperatur unten"
und
"Außentemperatur oben"

da werden auch fleißig die Werte der zwei Sensoren rein geschrieben.

Jetzt komme ich aber überhaupt nicht mit dem Skript klar womit ich einen Mittelwert in Variable
"Außentemperatur mittel"
bekomme.

Kann sich einer meiner Erbarmen und mir helfen.

Vielen Dank
104 Geräte, und ja ich bin süchtig.

paul53
Beiträge: 2554
Registriert: 26.04.2012, 20:42
Wohnort: Berlin
Danksagung erhalten: 15 Mal

Re: Script für gleitenden Mittelwert

Beitrag von paul53 » 07.07.2017, 16:03

Das Skript ermittelt den Mittelwert eines Sensors über die Zeit. Was Du vermutlich möchtest, ist den Mittelwert aus beiden Sensoren bilden ? Das geht viel einfacher als die Bildung eines zeitlichen Mittelwertes. Prinzip:

Code: Alles auswählen

real ATmittel = 0.5 * (AToben + ATunten);
Versionen: HM-CC-TC 2.1, HM-LC-Sw1 1.9, HM-CC-RT-DN 1.1, HM-MOD-RPI-PCB 1.2.1 (keine CCU)

der-flash
Beiträge: 31
Registriert: 05.07.2015, 17:26

Re: Script für gleitenden Mittelwert

Beitrag von der-flash » 07.07.2017, 16:47

sorry für die blöde frage aber wie schreibe ich das jetzt als Skript.
Skripte sind leider noch nicht so meins.
104 Geräte, und ja ich bin süchtig.

paul53
Beiträge: 2554
Registriert: 26.04.2012, 20:42
Wohnort: Berlin
Danksagung erhalten: 15 Mal

Re: Script für gleitenden Mittelwert

Beitrag von paul53 » 07.07.2017, 17:29

der-flash hat geschrieben:Ich habe 2 Variablen
"Außentemperatur unten"
und
"Außentemperatur oben"
Ich nehme mal an, es handelt sich um Systemvariablen (virtuelle Datenpunkte) mit den angegebenen Namen. Dann sollte es so funktionieren:

Code: Alles auswählen

real ATunten = dom.GetObject("Außentemperatur unten").Value();
real AToben = dom.GetObject("Außentemperatur oben").Value();
real ATmittel = 0.5 * (AToben + ATunten);
dom.GetObject("Außentemperatur mittel").State(ATmittel);
Versionen: HM-CC-TC 2.1, HM-LC-Sw1 1.9, HM-CC-RT-DN 1.1, HM-MOD-RPI-PCB 1.2.1 (keine CCU)

der-flash
Beiträge: 31
Registriert: 05.07.2015, 17:26

Re: Script für gleitenden Mittelwert

Beitrag von der-flash » 07.07.2017, 23:03

Also das mit den Systemvariablen hat nicht geklappt ich habe jetzt einfach direkt die Geräte eingebunden.
Was ich jetzt nur habe ist das Problem mit den nach komma stellen.
Ich habe durch .Value().ToString(1) die ausgangswerte auf normal stellen können, aber leider nicht den Mittelwert der erscheint
leider immer noch mit vielen nach komma stellen.
Ich weiß das das thema schon oft hier beschrieben wurde, habe auch viel gelesen und ausprobiert.
Und mit dem Script Executor getestet. leider ohne erfolg

Code: Alles auswählen

real ATunten = dom.GetObject("BidCos-RF.LEQ1343208:1.TEMPERATURE").Value().ToString(1);
real AToben = dom.GetObject("BidCos-RF.NEQ0773851:2.TEMPERATURE").Value().ToString(1);
real ATmittel =  0.5 * (AToben + ATunten);
dom.GetObject("Außentemperatur mittel").State(ATmittel);
104 Geräte, und ja ich bin süchtig.

paul53
Beiträge: 2554
Registriert: 26.04.2012, 20:42
Wohnort: Berlin
Danksagung erhalten: 15 Mal

Re: Script für gleitenden Mittelwert

Beitrag von paul53 » 07.07.2017, 23:24

der-flash hat geschrieben:

Code: Alles auswählen

real ATunten = dom.GetObject("BidCos-RF.LEQ1343208:1.TEMPERATURE").Value().ToString(1);
Mit Strings kann nicht gerechnet werden: Also beim Einlesen weglassen. Wenn eine definierte Anzeige von Nachkommastellen im Ergebnis gewünscht wird, dann kann dort .ToString(1) angewendet werden. Die SV muss dann aber vom Typ "Zeichenkette" sein.

Code: Alles auswählen

real ATunten = dom.GetObject("BidCos-RF.LEQ1343208:1.TEMPERATURE").Value();
real AToben = dom.GetObject("BidCos-RF.NEQ0773851:2.TEMPERATURE").Value();
real ATmittel =  0.5 * (AToben + ATunten);
dom.GetObject("Außentemperatur mittel").State(ATmittel.ToString(1)#" °C");
Versionen: HM-CC-TC 2.1, HM-LC-Sw1 1.9, HM-CC-RT-DN 1.1, HM-MOD-RPI-PCB 1.2.1 (keine CCU)

der-flash
Beiträge: 31
Registriert: 05.07.2015, 17:26

Re: Script für gleitenden Mittelwert

Beitrag von der-flash » 07.07.2017, 23:44

Ok super soweit läuft alles, jetzt bekomme ich aber nicht den wert von dem Gerät ersetzt in den wert aus der SV Temperatur mittelwert. also ganz oben bei der Außentemperatur

Code: Alles auswählen

var dp_temperatur_aussen = dom.GetObject("BidCos-RF.LEQ1343208:1.TEMPERATURE");
var temperatur_aussen = dp_temperatur_aussen.Value();

var dp_temperatur_innen = dom.GetObject("BidCos-RF.LEQ1461759:1.TEMPERATURE");
var temperatur_innen = dp_temperatur_innen.Value();

var obj = dom.GetObject("Temperatur_Fenster");

if (temperatur_aussen > temperatur_innen)
{ obj.State(true);}
else
{ obj.State(false);}
Wenn ich diese hier Probiere

Code: Alles auswählen

var dp_temperatur_aussen= dom.GetObject("Außentemperatur mittel");
var temperatur_aussen = dp_temperatur_aussen.Value();

var dp_temperatur_innen = dom.GetObject("BidCos-RF.LEQ1461759:1.TEMPERATURE");
var temperatur_innen = dp_temperatur_innen.Value();

var obj = dom.GetObject("Temperatur_Fenster");

if (temperatur_aussen > temperatur_innen)
{ obj.State(true);}
else
{ obj.State(false);}
Kommt als Ausgabe nur

Code: Alles auswählen

{
  "temperatur_innen": "null",
  "sessionId": "",
  "dp_temperatur_aussen": "null",
  "httpUserAgent": "",
  "obj": "null",
  "dp_temperatur_innen": "null",
  "temperatur_aussen": "null",
  "STDOUT": ""
}
104 Geräte, und ja ich bin süchtig.

der-flash
Beiträge: 31
Registriert: 05.07.2015, 17:26

Re: Script für gleitenden Mittelwert

Beitrag von der-flash » 08.07.2017, 00:10

OK hab es es lag am "ß"
104 Geräte, und ja ich bin süchtig.

TobiasL
Beiträge: 97
Registriert: 24.01.2017, 21:04
Hat sich bedankt: 3 Mal
Danksagung erhalten: 1 Mal

Re: Script für gleitenden Mittelwert

Beitrag von TobiasL » 03.05.2020, 18:47

Ich würde die Scripts von hanan auch gerne verwenden (für den Mittelwert eines Außentemperatursensors) aber leider wird die Variable
AussenMittel immer nur mit "-50" beschrieben (mein Wertebereich geht von -50 bis +50) und bei der Variable AussenTListe steht nur "???" drin.


Hier mein 1. Script zum Initialisieren

Code: Alles auswählen

integer n = 8;
string x = dom.GetObject("BidCos-RF.MEQ1600666:1.TEMPERATURE").DPByHssDP("TEMPERATURE").Value().ToString(1);
string list = x;
integer i = 1;
while(i < n)
{list = list#","#x;
i = i + 1;}
dom.GetObject("AussenTListe").State(list);
und hier mein 2. Script, das regelmäßig ausgeführt werden soll

Code: Alles auswählen

integer n = 8;
string list;
integer len;
real s = 0.0;
list = dom.GetObject("AussenTListe").Value();
len = list.StrValueByIndex(",",0).Length() + 1;
list = list.Substr(len, list.Length() - len);
list = list#","#dom.GetObject("BidCos-RF.MEQ1600666:1.TEMPERATURE").DPByHssDP("TEMPERATURE").Value().ToString(1);
dom.GetObject("AussenTListe").State(list);
string summand;
foreach(summand, list.Split(","))
{s = s + summand.ToFloat();}
dom.GetObject("AussenMittel").State(s/n);

50 Beiträge      5
Kann mir jemand helfen wo mein Fehler liegt?
DANKE

Antworten

Zurück zu „Softwareentwicklung für die HomeMatic CCU“