Einschaltzeit bei "Stromstoß" messen

Anbindung von FS20-Komponenten, ELV-Wetterstationen, EnOcean und DMX an HomeMatic

Moderator: Co-Administratoren

Benutzeravatar
HM-Villa
Beiträge: 508
Registriert: 24.01.2022, 10:13
System: CCU
Hat sich bedankt: 29 Mal
Danksagung erhalten: 120 Mal

Re: Einschaltzeit bei "Stromstoß" messen

Beitrag von HM-Villa » 08.07.2022, 17:23

So weit, so gut:

Code: Alles auswählen

string stufen_p = "0,300,550,875";   ! Leistungen der einzelnen Pumpenstufen
integer i = 0;                       ! Zählvariable für Schleife
boolean control;                     ! Schaltzustände Aktorkanäle
integer stufe_akt;                   ! Pumpenstufe aktuell
integer stufe_neu = 0;               ! Pumpenstufe neu
integer p_ueber = 50;                ! (verbleibende) Überschussleistung
var p_akt;                           ! Leistung Pumpe aktuell
var p;                               ! Leistung der Pumpenstufe
string cuxd_bsz = "9001001,9001002,9001003";                    ! Seriennummern der CUxD-Wrapper-Devices eintragen [Stufe 1,2,3]
var ue_mess = dom.GetObject("CUxD.CUX9000001:1.MEAN").Value();  ! gemessene Überschussleistung (Deine var ueberschuss_gemittelt)

stufe_akt = dom.GetObject(ID_SYSTEM_VARIABLES).Get("Poolpumpe Stufe").Value().ToInteger();
p_akt = stufen_p.StrValueByIndex(",", stufe_akt).ToFloat();

! erstes Listenelement für Schleife auslesen
p = stufen_p.StrValueByIndex(",", i).ToFloat();

while (((ue_mess + p_akt - p) >= p_ueber) && (i <= 3))
   {
   stufe_neu = i;
   i = i + 1;
   p = stufen_p.StrValueByIndex(",", i).ToFloat();
   }

WriteLine("Stufe aktuell: "#stufe_akt#"\tStufe neu: "#stufe_neu);

! sicherheitshalber noch mal schauen, ob alle Kanäle aus, jedoch ohne aktive Abfrage des Aktors (DC sparen)
i = 0;
while (i <= 3)
   {
   dom.GetObject("HmIP-RF.000D1BE9A4E4C3:"#(25 + (i * 4))#".STATE").Value(control);
   if (control)
      {
      string stdout;
      string stderr;
      system.Exec("logger -t script -p user.debug [Fehler Steuerung Poolpumpe, 000D1BE9A4E4C3, Ch 25//29//33//37 nicht aus]", &stdout, &stderr);
      quit;
      }
   i = i + 1;
   }

! geänderte Schaltstufe in SV schreiben, Aktor und CUxD-WD ansteuern
if (stufe_neu <> stufe_akt)
   {
   dom.GetObject(ID_SYSTEM_VARIABLES).Get("Poolpumpe Stufe").State(stufe_neu);
   dom.GetObject("HmIP-RF.000D1BE9A4E4C3:"#(26 + (stufe_neu * 4))#".ON_TIME").State(1);
   dom.GetObject("HmIP-RF.000D1BE9A4E4C3:"#(26 + (stufe_neu * 4))#".STATE").State(true, 200);
   if (stufe_akt > 0) { dom.GetObject("CUxD.CUX"#cuxd_bsz.StrValueByIndex(",", stufe_akt - 1).ToInteger()#":1.SET_STATE").State(0); }
   if (stufe_neu > 0) { dom.GetObject("CUxD.CUX"#cuxd_bsz.StrValueByIndex(",", stufe_neu - 1).ToInteger()#":1.SET_STATE").State(1); }
   }
Die Ansteuerung des OC8 erfolgt mit Impulsen von 1 s Länge. Wenn die zu kurz sind, einfach bei ...ON_TIME").State(1); noch etwas erhöhen. Die nächste Anweisung schaltet dann tatsächlich ein (mit 200 ms Verzögerung). Das war's schon. Nur so zum Spaß ist das 2. while hinzugekommen. Das schaut, ob einer der Kanäle noch eingeschaltet ist, was ja bei der Impulssteuerung sowieso garnicht vorkommen dürfte. Wenn doch, wird das Script beim ersten eingeschalteten Kanal abgebrochen und ein Eintrag ins Systemlog generiert. Am Schaltzustand ändert sich nichts. Ach so, fast die Wrapper-Devices vergessen. In das Listenfeld cuxd_bsz musst Du die Seriennummern Deiner WD's eintragen, Reihenfolge Stufe 1 - 3. Nicht vergessen, bei den Geräteeinstellungen der Wrapper USE_HMDATAPT [ ] zu deaktivieren. Fehlt noch was? Viel Spaß!
Zuletzt geändert von HM-Villa am 10.07.2022, 14:47, insgesamt 4-mal geändert.
______________________________________________________
950 Kanäle in 201 Geräten und 39 CUxD-Kanäle in 5 CUxD-Geräten

7thguest
Beiträge: 83
Registriert: 06.02.2015, 21:32
System: CCU
Wohnort: Niedersachsen
Hat sich bedankt: 5 Mal

Re: Einschaltzeit bei "Stromstoß" messen

Beitrag von 7thguest » 08.07.2022, 23:39

So, mal testen...
Was nehme ich am besten als Auslöser für das Skript :?:

In Zeile 9 - string... - habe ich die S/N angepasst und ein ";" hinten dran gesetzt
In der drittletzten Zeile - if... - habe ich aus "alt" mal "akt" gemacht

Ich hoffe, das war so gemeint?!

Außerdem habe ich wieder was gelernt: Ich habe heut eine Systemvariable "Überschuß aktuell" (zum Probieren) angelegt und dann das Ausleseskript für den Solarlog laufen lassen - das dauerte ewig, bis das durch war...
Dann habe ich aus dem "Ü" ein "Ue" gemacht und siehe da - das Ganze lief flüssig.
Merke - Sonderzeichen umgehen :P

7thguest
Beiträge: 83
Registriert: 06.02.2015, 21:32
System: CCU
Wohnort: Niedersachsen
Hat sich bedankt: 5 Mal

Re: Einschaltzeit bei "Stromstoß" messen

Beitrag von 7thguest » 09.07.2022, 09:20

Die Betriebsstundenzähler funktionieren leider nicht 🤷‍♂️

Benutzeravatar
HM-Villa
Beiträge: 508
Registriert: 24.01.2022, 10:13
System: CCU
Hat sich bedankt: 29 Mal
Danksagung erhalten: 120 Mal

Re: Einschaltzeit bei "Stromstoß" messen

Beitrag von HM-Villa » 09.07.2022, 10:45

Deine Korrekturen sind OK, müsste einfach mehr Zeit haben und 'nen größeren Bildschirm am Handy...

Trigger des Programmes, in dem sich das Script befindet, sollte die Aktualisierung von .....:1.MEAN sein.

In cuxd_bsz dürfen nur die Zahlen der Wrapper, die vollständige Bezeichnung wird erst in den beiden letzten Zeilen zusammengesetzt. Bei mir hat der Vorschlag von @Uwe111 (irgendwo von fast am Anfang dieses Threads) auf Anhieb funktioniert. Einfach leeren Wrapper anlegen, Haken bei usehmadapt raus, fertig.

Bin aktuell leider schon wieder auf dem Sprung. Wir kriegen das schon noch hin.
______________________________________________________
950 Kanäle in 201 Geräten und 39 CUxD-Kanäle in 5 CUxD-Geräten

7thguest
Beiträge: 83
Registriert: 06.02.2015, 21:32
System: CCU
Wohnort: Niedersachsen
Hat sich bedankt: 5 Mal

Re: Einschaltzeit bei "Stromstoß" messen

Beitrag von 7thguest » 09.07.2022, 12:49

Ja, alles gut...

Ich bin erstmal wieder zurück auf das Programm von gestern (Stufen bleiben "ein"). Das läuft auch :-)

Ich habe noch ein Programm aktiv, wo ich nach umgewälztem Volumen X dann die Pumpe auf "Stop" schalte und eine Systemvariable auf "manuellen" Betrieb.
Diese Systemvariable habe ich als Bedingung immer in dem Schaltprogramm der Pumpe abgefragt > wenn Betrieb auf "Automatik", dann schalte > wenn "manuell" dann nichts machen.

Täglich um 0.00 Uhr läuft ein Programm, welches die 3 Betriebsstundenzähler auf "0" setzt und den Pumpenbetrieb wieder auf "Automatik", damit es bei ausreichendem Sonnenschein wieder los geht.

Damit blieb aber ebenfalls der Schaltkontakt "STOP" geschlossen und dein Skript von gestern konnte nicht laufen.

Ich habe den dann händisch ausgeschaltet und trotzdem kam das Skript nicht zum Laufen. Leider bin ich hier jetzt an der Stelle, wo ich selbst nicht nachvollziehen kann, warum...

Und folgender Punkt ist mir noch aufgefallen: Die Variable "Poolpumpe Stufe" wird im Skript gesetzt und zum Schalten verwendet. Sie spiegelt aber nicht immer den "wahren" Stand der geschalteten Stufe wieder. Heut Morgen war es ja so, dass der Kontakt für "Stop" aktiviert war - in der systemvariable stand aber "N3"...
Das heißt, ich habe bei Schalten per Stromstoß keinen wirklichen Status des Schaltaktors, welcher gerade offen / geschlossen ist. :?

Das ist aus dem CUxD-Full-Syslog:

Code: Alles auswählen

Jul  9 09:50:02 raspberry-matic local0.err ReGaHss: ERROR: ScriptRuntimeError: string stufen_p = "0,300,550,875";   ! Leistungen der einzelnen Pumpenstufen integer i = 0;                       ! Zählvariable für Schleife boolean control;                     ! Schaltzustände Aktorkanäle integer stufe_akt;                   ! Pumpenstufe aktuell integer stufe_neu = 0;               ! Pumpenstufe neu integer p_ueber = 50;                ! (verbleibende) Überschussleistung var p_akt;                          
! Leistung Pumpe aktuell var p;                               ! Leistung der Pumpenstufe string cuxd_bsz = "9001002,9001003,9001004";                    ! Seriennummern der CUxD-Wrapper-Devices eintragen [Stufe 1,2,3] var ue_mess = dom.GetObject("CUxD.CUX9000001:1.MEAN").Value();  ! gemessene Überschussleistung (Deine var ueberschuss_gemittelt)  stufe_akt = dom.GetObject(ID_SYSTEM_VARIABLES).Get("Poolpumpe Stufe").Value().ToInteger(); p_akt = stufen_p.StrValueByIndex(",", stufe_akt).ToFloat();  ! erstes L
stenelement für Schleif
Jul  9 09:52:01 raspberry-matic local0.err ReGaHss: ERROR: ScriptRuntimeError: string stufen_p = "0,300,550,875";   ! Leistungen der einzelnen Pumpenstufen integer i = 0;                       ! Zählvariable für Schleife boolean control;                     ! Schaltzustände Aktorkanäle integer stufe_akt;                   ! Pumpenstufe aktuell integer stufe_neu = 0;               ! Pumpenstufe neu integer p_ueber = 50;                ! (verbleibende) Überschussleistung var p_akt;                          
! Leistung Pumpe aktuell var p;                               ! Leistung der Pumpenstufe string cuxd_bsz = "9001002,9001003,9001004";                    ! Seriennummern der CUxD-Wrapper-Devices eintragen [Stufe 1,2,3] var ue_mess = dom.GetObject("CUxD.CUX9000001:1.MEAN").Value();  ! gemessene Überschussleistung (Deine var ueberschuss_gemittelt)  stufe_akt = dom.GetObject(ID_SYSTEM_VARIABLES).Get("Poolpumpe Stufe").Value().ToInteger(); p_akt = stufen_p.StrValueByIndex(",", stufe_akt).ToFloat();  ! erstes L
stenelement für Schleif
Jul  9 09:54:01 raspberry-matic local0.err ReGaHss: ERROR: ScriptRuntimeError: string stufen_p = "0,300,550,875";   ! Leistungen der einzelnen Pumpenstufen integer i = 0;                       ! Zählvariable für Schleife boolean control;                     ! Schaltzustände Aktorkanäle integer stufe_akt;                   ! Pumpenstufe aktuell integer stufe_neu = 0;               ! Pumpenstufe neu integer p_ueber = 50;                ! (verbleibende) Überschussleistung var p_akt;                          
! Leistung Pumpe aktuell var p;                               ! Leistung der Pumpenstufe string cuxd_bsz = "9001002,9001003,9001004";                    ! Seriennummern der CUxD-Wrapper-Devices eintragen [Stufe 1,2,3] var ue_mess = dom.GetObject("CUxD.CUX9000001:1.MEAN").Value();  ! gemessene Überschussleistung (Deine var ueberschuss_gemittelt)  stufe_akt = dom.GetObject(ID_SYSTEM_VARIABLES).Get("Poolpumpe Stufe").Value().ToInteger(); p_akt = stufen_p.StrValueByIndex(",", stufe_akt).ToFloat();  ! erstes L
stenelement für Schleif
Jul  9 09:56:01 raspberry-matic local0.err ReGaHss: ERROR: ScriptRuntimeError: string stufen_p = "0,300,550,875";   ! Leistungen der einzelnen Pumpenstufen integer i = 0;                       ! Zählvariable für Schleife boolean control;                     ! Schaltzustände Aktorkanäle integer stufe_akt;                   ! Pumpenstufe aktuell integer stufe_neu = 0;               ! Pumpenstufe neu integer p_ueber = 50;                ! (verbleibende) Überschussleistung var p_akt;                          
! Leistung Pumpe aktuell var p;                               ! Leistung der Pumpenstufe string cuxd_bsz = "9001002,9001003,9001004";                    ! Seriennummern der CUxD-Wrapper-Devices eintragen [Stufe 1,2,3] var ue_mess = dom.GetObject("CUxD.CUX9000001:1.MEAN").Value();  ! gemessene Überschussleistung (Deine var ueberschuss_gemittelt)  stufe_akt = dom.GetObject(ID_SYSTEM_VARIABLES).Get("Poolpumpe Stufe").Value().ToInteger(); p_akt = stufen_p.StrValueByIndex(",", stufe_akt).ToFloat();  ! erstes L
stenelement für Schleif
Jul  9 10:13:54 raspberry-matic local0.err ReGaHss: ERROR: ScriptRuntimeError: string stufen_p = "0,300,550,875";   ! Leistungen der einzelnen Pumpenstufen integer i = 0;                       ! Zählvariable für Schleife boolean control;                     ! Schaltzustände Aktorkanäle integer stufe_akt;                   ! Pumpenstufe aktuell integer stufe_neu = 0;               ! Pumpenstufe neu integer p_ueber = 50;                ! (verbleibende) Überschussleistung var p_akt;                          
! Leistung Pumpe aktuell var p;                               ! Leistung der Pumpenstufe string cuxd_bsz = "9001002,9001003,9001004";                    ! Seriennummern der CUxD-Wrapper-Devices eintragen [Stufe 1,2,3] var ue_mess = dom.GetObject("CUxD.CUX9000001:1.MEAN").Value();  ! gemessene Überschussleistung (Deine var ueberschuss_gemittelt) WriteLine("Variable ue_mess= "#ue_mess);  stufe_akt = dom.GetObject(ID_SYSTEM_VARIABLES).Get("Poolpumpe Stufe").Value().ToInteger(); p_akt = stufen_p.StrValueByInd
x(",", stufe_akt).ToFlo
Jul  9 10:15:54 raspberry-matic local0.err ReGaHss: ERROR: ScriptRuntimeError: string stufen_p = "0,300,550,875";   ! Leistungen der einzelnen Pumpenstufen integer i = 0;                       ! Zählvariable für Schleife boolean control;                     ! Schaltzustände Aktorkanäle integer stufe_akt;                   ! Pumpenstufe aktuell integer stufe_neu = 0;               ! Pumpenstufe neu integer p_ueber = 50;                ! (verbleibende) Überschussleistung var p_akt;                          
! Leistung Pumpe aktuell var p;                               ! Leistung der Pumpenstufe string cuxd_bsz = "9001002,9001003,9001004";                    ! Seriennummern der CUxD-Wrapper-Devices eintragen [Stufe 1,2,3] var ue_mess = dom.GetObject("CUxD.CUX9000001:1.MEAN").Value();  ! gemessene Überschussleistung (Deine var ueberschuss_gemittelt) WriteLine("Variable ue_mess= "#ue_mess);  stufe_akt = dom.GetObject(ID_SYSTEM_VARIABLES).Get("Poolpumpe Stufe").Value().ToInteger(); p_akt = stufen_p.StrValueByInd
x(",", stufe_akt).ToFlo
Jul  9 10:21:16 raspberry-matic daemon.warn cuxd[8602]: getValue(CUX9001002:1.TIME_ON_SUM) firmware differ '2.8' ''!
Jul  9 10:21:17 raspberry-matic daemon.warn cuxd[8602]: getValue(CUX9001002:1.TIME_ON_SUM) firmware differ '2.8' ''!
Jul  9 10:21:44 raspberry-matic daemon.warn cuxd[8602]: getValue(CUX9001003:1.TIME_ON_SUM) firmware differ '2.8' ''!
Jul  9 10:21:45 raspberry-matic daemon.warn cuxd[8602]: getValue(CUX9001003:1.TIME_ON_SUM) firmware differ '2.8' ''!
Jul  9 10:22:11 raspberry-matic daemon.warn cuxd[8602]: getValue(CUX9001004:1.TIME_ON_SUM) firmware differ '2.8' ''!
Jul  9 10:22:12 raspberry-matic daemon.warn cuxd[8602]: getValue(CUX9001004:1.TIME_ON_SUM) firmware differ '2.8' ''!
Jul  9 10:27:55 raspberry-matic daemon.info cuxd[8602]: save paramsets(/usr/local/addons/cuxd/cuxd.ps) size:6724 trigger(-344s) from CUX9001004

Das aus dem CUxD-Syslog:

Code: Alles auswählen

! Leistung Pumpe aktuell var p;                               ! Leistung der Pumpenstufe string cuxd_bsz = "9001002,9001003,9001004";                    ! Seriennummern der CUxD-Wrapper-Devices eintragen [Stufe 1,2,3] var ue_mess = dom.GetObject("CUxD.CUX9000001:1.MEAN").Value();  ! gemessene Überschussleistung (Deine var ueberschuss_gemittelt)  stufe_akt = dom.GetObject(ID_SYSTEM_VARIABLES).Get("Poolpumpe Stufe").Value().ToInteger(); p_akt = stufen_p.StrValueByIndex(",", stufe_akt).ToFloat();  ! erstes L
! Leistung Pumpe aktuell var p;                               ! Leistung der Pumpenstufe string cuxd_bsz = "9001002,9001003,9001004";                    ! Seriennummern der CUxD-Wrapper-Devices eintragen [Stufe 1,2,3] var ue_mess = dom.GetObject("CUxD.CUX9000001:1.MEAN").Value();  ! gemessene Überschussleistung (Deine var ueberschuss_gemittelt)  stufe_akt = dom.GetObject(ID_SYSTEM_VARIABLES).Get("Poolpumpe Stufe").Value().ToInteger(); p_akt = stufen_p.StrValueByIndex(",", stufe_akt).ToFloat();  ! erstes L
! Leistung Pumpe aktuell var p;                               ! Leistung der Pumpenstufe string cuxd_bsz = "9001002,9001003,9001004";                    ! Seriennummern der CUxD-Wrapper-Devices eintragen [Stufe 1,2,3] var ue_mess = dom.GetObject("CUxD.CUX9000001:1.MEAN").Value();  ! gemessene Überschussleistung (Deine var ueberschuss_gemittelt)  stufe_akt = dom.GetObject(ID_SYSTEM_VARIABLES).Get("Poolpumpe Stufe").Value().ToInteger(); p_akt = stufen_p.StrValueByIndex(",", stufe_akt).ToFloat();  ! erstes L
! Leistung Pumpe aktuell var p;                               ! Leistung der Pumpenstufe string cuxd_bsz = "9001002,9001003,9001004";                    ! Seriennummern der CUxD-Wrapper-Devices eintragen [Stufe 1,2,3] var ue_mess = dom.GetObject("CUxD.CUX9000001:1.MEAN").Value();  ! gemessene Überschussleistung (Deine var ueberschuss_gemittelt)  stufe_akt = dom.GetObject(ID_SYSTEM_VARIABLES).Get("Poolpumpe Stufe").Value().ToInteger(); p_akt = stufen_p.StrValueByIndex(",", stufe_akt).ToFloat();  ! erstes L
! Leistung Pumpe aktuell var p;                               ! Leistung der Pumpenstufe string cuxd_bsz = "9001002,9001003,9001004";                    ! Seriennummern der CUxD-Wrapper-Devices eintragen [Stufe 1,2,3] var ue_mess = dom.GetObject("CUxD.CUX9000001:1.MEAN").Value();  ! gemessene Überschussleistung (Deine var ueberschuss_gemittelt)  stufe_akt = dom.GetObject(ID_SYSTEM_VARIABLES).Get("Poolpumpe Stufe").Value().ToInteger(); p_akt = stufen_p.StrValueByIndex(",", stufe_akt).ToFloat();  ! erstes L
! Leistung Pumpe aktuell var p;                               ! Leistung der Pumpenstufe string cuxd_bsz = "9001002,9001003,9001004";                    ! Seriennummern der CUxD-Wrapper-Devices eintragen [Stufe 1,2,3] var ue_mess = dom.GetObject("CUxD.CUX9000001:1.MEAN").Value();  ! gemessene Überschussleistung (Deine var ueberschuss_gemittelt)  stufe_akt = dom.GetObject(ID_SYSTEM_VARIABLES).Get("Poolpumpe Stufe").Value().ToInteger(); p_akt = stufen_p.StrValueByIndex(",", stufe_akt).ToFloat();  ! erstes L
! Leistung Pumpe aktuell var p;                               ! Leistung der Pumpenstufe string cuxd_bsz = "9001002,9001003,9001004";                    ! Seriennummern der CUxD-Wrapper-Devices eintragen [Stufe 1,2,3] var ue_mess = dom.GetObject("CUxD.CUX9000001:1.MEAN").Value();  ! gemessene Überschussleistung (Deine var ueberschuss_gemittelt)  stufe_akt = dom.GetObject(ID_SYSTEM_VARIABLES).Get("Poolpumpe Stufe").Value().ToInteger(); p_akt = stufen_p.StrValueByIndex(",", stufe_akt).ToFloat();  ! erstes L
! Leistung Pumpe aktuell var p;                               ! Leistung der Pumpenstufe string cuxd_bsz = "9001002,9001003,9001004";                    ! Seriennummern der CUxD-Wrapper-Devices eintragen [Stufe 1,2,3] var ue_mess = dom.GetObject("CUxD.CUX9000001:1.MEAN").Value();  ! gemessene Überschussleistung (Deine var ueberschuss_gemittelt)  stufe_akt = dom.GetObject(ID_SYSTEM_VARIABLES).Get("Poolpumpe Stufe").Value().ToInteger(); p_akt = stufen_p.StrValueByIndex(",", stufe_akt).ToFloat();  ! erstes L
! Leistung Pumpe aktuell var p;                               ! Leistung der Pumpenstufe string cuxd_bsz = "9001002,9001003,9001004";                    ! Seriennummern der CUxD-Wrapper-Devices eintragen [Stufe 1,2,3] var ue_mess = dom.GetObject("CUxD.CUX9000001:1.MEAN").Value();  ! gemessene Überschussleistung (Deine var ueberschuss_gemittelt)  stufe_akt = dom.GetObject(ID_SYSTEM_VARIABLES).Get("Poolpumpe Stufe").Value().ToInteger(); p_akt = stufen_p.StrValueByIndex(",", stufe_akt).ToFloat();  ! erstes L
! Leistung Pumpe aktuell var p;                               ! Leistung der Pumpenstufe string cuxd_bsz = "9001002,9001003,9001004";                    ! Seriennummern der CUxD-Wrapper-Devices eintragen [Stufe 1,2,3] var ue_mess = dom.GetObject("CUxD.CUX9000001:1.MEAN").Value();  ! gemessene Überschussleistung (Deine var ueberschuss_gemittelt)  stufe_akt = dom.GetObject(ID_SYSTEM_VARIABLES).Get("Poolpumpe Stufe").Value().ToInteger(); p_akt = stufen_p.StrValueByIndex(",", stufe_akt).ToFloat();  ! erstes L
! Leistung Pumpe aktuell var p;                               ! Leistung der Pumpenstufe string cuxd_bsz = "9001002,9001003,9001004";                    ! Seriennummern der CUxD-Wrapper-Devices eintragen [Stufe 1,2,3] var ue_mess = dom.GetObject("CUxD.CUX9000001:1.MEAN").Value();  ! gemessene Überschussleistung (Deine var ueberschuss_gemittelt)  stufe_akt = dom.GetObject(ID_SYSTEM_VARIABLES).Get("Poolpumpe Stufe").Value().ToInteger(); p_akt = stufen_p.StrValueByIndex(",", stufe_akt).ToFloat();  ! erstes L
! Leistung Pumpe aktuell var p;                               ! Leistung der Pumpenstufe string cuxd_bsz = "9001002,9001003,9001004";                    ! Seriennummern der CUxD-Wrapper-Devices eintragen [Stufe 1,2,3] var ue_mess = dom.GetObject("CUxD.CUX9000001:1.MEAN").Value();  ! gemessene Überschussleistung (Deine var ueberschuss_gemittelt)  stufe_akt = dom.GetObject(ID_SYSTEM_VARIABLES).Get("Poolpumpe Stufe").Value().ToInteger(); p_akt = stufen_p.StrValueByIndex(",", stufe_akt).ToFloat();  ! erstes L
! Leistung Pumpe aktuell var p;                               ! Leistung der Pumpenstufe string cuxd_bsz = "9001002,9001003,9001004";                    ! Seriennummern der CUxD-Wrapper-Devices eintragen [Stufe 1,2,3] var ue_mess = dom.GetObject("CUxD.CUX9000001:1.MEAN").Value();  ! gemessene Überschussleistung (Deine var ueberschuss_gemittelt)  stufe_akt = dom.GetObject(ID_SYSTEM_VARIABLES).Get("Poolpumpe Stufe").Value().ToInteger(); p_akt = stufen_p.StrValueByIndex(",", stufe_akt).ToFloat();  ! erstes L
! Leistung Pumpe aktuell var p;                               ! Leistung der Pumpenstufe string cuxd_bsz = "9001002,9001003,9001004";                    ! Seriennummern der CUxD-Wrapper-Devices eintragen [Stufe 1,2,3] var ue_mess = dom.GetObject("CUxD.CUX9000001:1.MEAN").Value();  ! gemessene Überschussleistung (Deine var ueberschuss_gemittelt)  stufe_akt = dom.GetObject(ID_SYSTEM_VARIABLES).Get("Poolpumpe Stufe").Value().ToInteger(); p_akt = stufen_p.StrValueByIndex(",", stufe_akt).ToFloat();  ! erstes L
! Leistung Pumpe aktuell var p;                               ! Leistung der Pumpenstufe string cuxd_bsz = "9001002,9001003,9001004";                    ! Seriennummern der CUxD-Wrapper-Devices eintragen [Stufe 1,2,3] var ue_mess = dom.GetObject("CUxD.CUX9000001:1.MEAN").Value();  ! gemessene Überschussleistung (Deine var ueberschuss_gemittelt)  stufe_akt = dom.GetObject(ID_SYSTEM_VARIABLES).Get("Poolpumpe Stufe").Value().ToInteger(); p_akt = stufen_p.StrValueByIndex(",", stufe_akt).ToFloat();  ! erstes L
! Leistung Pumpe aktuell var p;                               ! Leistung der Pumpenstufe string cuxd_bsz = "9001002,9001003,9001004";                    ! Seriennummern der CUxD-Wrapper-Devices eintragen [Stufe 1,2,3] var ue_mess = dom.GetObject("CUxD.CUX9000001:1.MEAN").Value();  ! gemessene Überschussleistung (Deine var ueberschuss_gemittelt)  stufe_akt = dom.GetObject(ID_SYSTEM_VARIABLES).Get("Poolpumpe Stufe").Value().ToInteger(); p_akt = stufen_p.StrValueByIndex(",", stufe_akt).ToFloat();  ! erstes L
! Leistung Pumpe aktuell var p;                               ! Leistung der Pumpenstufe string cuxd_bsz = "9001002,9001003,9001004";                    ! Seriennummern der CUxD-Wrapper-Devices eintragen [Stufe 1,2,3] var ue_mess = dom.GetObject("CUxD.CUX9000001:1.MEAN").Value();  ! gemessene Überschussleistung (Deine var ueberschuss_gemittelt) WriteLine("Variable ue_mess= "#ue_mess);  stufe_akt = dom.GetObject(ID_SYSTEM_VARIABLES).Get("Poolpumpe Stufe").Value().ToInteger(); p_akt = stufen_p.StrValueByInd
! Leistung Pumpe aktuell var p;                               ! Leistung der Pumpenstufe string cuxd_bsz = "9001002,9001003,9001004";                    ! Seriennummern der CUxD-Wrapper-Devices eintragen [Stufe 1,2,3] var ue_mess = dom.GetObject("CUxD.CUX9000001:1.MEAN").Value();  ! gemessene Überschussleistung (Deine var ueberschuss_gemittelt) WriteLine("Variable ue_mess= "#ue_mess);  stufe_akt = dom.GetObject(ID_SYSTEM_VARIABLES).Get("Poolpumpe Stufe").Value().ToInteger(); p_akt = stufen_p.StrValueByInd
Jul  9 10:21:16 raspberry-matic daemon.warn cuxd[8602]: getValue(CUX9001002:1.TIME_ON_SUM) firmware differ '2.8' ''!
Jul  9 10:21:17 raspberry-matic daemon.warn cuxd[8602]: getValue(CUX9001002:1.TIME_ON_SUM) firmware differ '2.8' ''!
Jul  9 10:21:44 raspberry-matic daemon.warn cuxd[8602]: getValue(CUX9001003:1.TIME_ON_SUM) firmware differ '2.8' ''!
Jul  9 10:21:45 raspberry-matic daemon.warn cuxd[8602]: getValue(CUX9001003:1.TIME_ON_SUM) firmware differ '2.8' ''!
Jul  9 10:22:11 raspberry-matic daemon.warn cuxd[8602]: getValue(CUX9001004:1.TIME_ON_SUM) firmware differ '2.8' ''!
Jul  9 10:22:12 raspberry-matic daemon.warn cuxd[8602]: getValue(CUX9001004:1.TIME_ON_SUM) firmware differ '2.8' ''!
Jul  9 10:27:55 raspberry-matic daemon.info cuxd[8602]: save paramsets(/usr/local/addons/cuxd/cuxd.ps) size:6724 trigger(-344s) from CUX9001004

7thguest
Beiträge: 83
Registriert: 06.02.2015, 21:32
System: CCU
Wohnort: Niedersachsen
Hat sich bedankt: 5 Mal

Re: Einschaltzeit bei "Stromstoß" messen

Beitrag von 7thguest » 09.07.2022, 15:50

Heut ist - durch die wechselnde Sonne - ein guter Tag zum Spielen.

Da habe ich gemerkt, dass irgendwas an der Berechnung des resultierenden Überschusses und somit der Festlegung der "neuen" Stufe nicht stimmt...

Code: Alles auswählen

string stufen_p = "0,300,550,875";   ! Leistungen der einzelnen Pumpenstufen
integer i = 0;                       ! Zählvariable für Schleife
integer stufe_akt;                   ! Pumpenstufe aktuell
integer stufe_neu = 0;               ! Pumpenstufe neu
integer p_ueber = 50;                ! (verbleibende) Überschussleistung
var p_akt;                           ! Leistung Pumpe aktuell
var p;                               ! Leistung der Pumpenstufe

! Zum Test - hinterher wieder weg
! var ue_mess = dom.GetObject("CUxD.CUX9000001:1.MEAN").Value();  ! gemessene Überschussleistung (Deine var ueberschuss_gemittelt)
 var ue_mess = -100;

WriteLine("Ueberschuss-mittel: "#ue_mess);

stufe_akt = dom.GetObject(ID_SYSTEM_VARIABLES).Get("Poolpumpe Stufe").Value().ToInteger();
WriteLine("aktuelle Stufe: "#stufe_akt);
p_akt = stufen_p.StrValueByIndex(",", stufe_akt).ToFloat();
WriteLine("p_akt= "#p_akt);

! erstes Listenelement für Schleife auslesen
p = stufen_p.StrValueByIndex(",", i).ToFloat();
WriteLine("p: "#p);

! resultierende Leistung nach Schalten
var result = ue_mess + p_akt - p;
WriteLine("resultierender Ueberschuss: "#result);

while ((result >= p_ueber) && (i <= 3))
   {
   stufe_neu = i;
   i = i + 1;
   p = stufen_p.StrValueByIndex(",", i).ToFloat();
   }

WriteLine("Stufe aktuell: "#stufe_akt#"\tStufe neu: "#stufe_neu);

! geänderte Schaltstufe in SV schreiben
if (stufe_neu <> stufe_akt) { dom.GetObject(ID_SYSTEM_VARIABLES).Get("Poolpumpe Stufe").State(stufe_neu);
                            object o = dom.GetObject("Poolpumpe Stufe");
                            dom.GetObject("CUxD.CUX2801003:1.LOGIT").State(o.Name()#";"#o.Value());}
Liefert als Ergebnis:

Code: Alles auswählen

Ueberschuss-mittel: -100
aktuelle Stufe: 3
p_akt= 875.000000
p: 0.000000
resultierender Ueberschuss: 775
Stufe aktuell: 3	Stufe neu: 3

Das heißt...
Momentan läuft die Pumpe auf Stufe 3 und verbraucht 875 Watt.
Wir sind aber bereits mit 100 Watt im negativen Bereich (Ueberschuss-Mittel: -100)

Ergo: Pumpe muss runterschalten.
Resultierender Überschuß bei "Stop" wären derzeit 775 Watt (-100 + 875) weniger der "Sicherheit" von 50 Watt = 725 Watt > Pumpe muss auf Stufe 2

Benutzeravatar
HM-Villa
Beiträge: 508
Registriert: 24.01.2022, 10:13
System: CCU
Hat sich bedankt: 29 Mal
Danksagung erhalten: 120 Mal

Re: Einschaltzeit bei "Stromstoß" messen

Beitrag von HM-Villa » 10.07.2022, 12:12

Die Schleife testet die Leistungen der einzelnen Stufen durch. Die Pumpe würde auch korrekt runterschalten, wenn Du nicht der Bedingung in der While-Schleife die Kenntnis über die Leistung p der einzelnen Stufen weggenommen hättest. Siehe hier:

Zwischenablage01.jpg
Zwischenablage01.jpg (7.33 KiB) 722 mal betrachtet

Der unterstrichene Term muss da wieder hin. result müsstest Du auch in der Schleife berechnen, da das bei jedem Durchlauf einen neuen Wert annimmt. Tipp: Wenn etwas nicht mehr funktioniert, was schon getestet ist, dann einfach die getroffenen Änderungen noch mal genauestens analysieren. Ohne Erkenntnis, warum's nicht mehr funktioniert: wieder "zurückbauen".

Anderes Problem:
7thguest hat geschrieben:
09.07.2022, 12:49
Damit blieb aber ebenfalls der Schaltkontakt "STOP" geschlossen und dein Skript von gestern konnte nicht laufen.
Genau das meinte ich, als ich schrieb:
HM-Villa hat geschrieben:
08.07.2022, 10:09
Wenn ich einen Impulseingang mit Dauerstrom ansteuere, kann während der Dauerbestromung keine weitere Verwendung dieses Einganges erfolgen, kein anderer Teil der Steuerung darf währenddessen "auch mal draufdrücken".
Zuletzt geändert von HM-Villa am 10.07.2022, 14:52, insgesamt 1-mal geändert.
______________________________________________________
950 Kanäle in 201 Geräten und 39 CUxD-Kanäle in 5 CUxD-Geräten

Benutzeravatar
HM-Villa
Beiträge: 508
Registriert: 24.01.2022, 10:13
System: CCU
Hat sich bedankt: 29 Mal
Danksagung erhalten: 120 Mal

Re: Einschaltzeit bei "Stromstoß" messen

Beitrag von HM-Villa » 10.07.2022, 14:45

7thguest hat geschrieben:
09.07.2022, 12:49
Und folgender Punkt ist mir noch aufgefallen: Die Variable "Poolpumpe Stufe" wird im Skript gesetzt und zum Schalten verwendet. Sie spiegelt aber nicht immer den "wahren" Stand der geschalteten Stufe wieder. Heut Morgen war es ja so, dass der Kontakt für "Stop" aktiviert war - in der systemvariable stand aber "N3"...
Das heißt, ich habe bei Schalten per Stromstoß keinen wirklichen Status des Schaltaktors, welcher gerade offen / geschlossen ist.
7thguest hat geschrieben:
09.07.2022, 12:49
Ich habe noch ein Programm aktiv, wo ich nach umgewälztem Volumen X dann die Pumpe auf "Stop" schalte und eine Systemvariable auf "manuellen" Betrieb.
Und was machst Du mit "Poolpumpe Stufe" in diesem Fall? Wenn ein anderes Programm die Poolpumpe ansteuert, musst Du die SV "Poolpumpe Stufe" natürlich auch aktualisieren, damit die synchron zum Betriebszustand der Pumpe bleibt. Es wäre auch notwendig, diese Ansteuerung ebenfalls mit kurzen Impulsen vorzunehmen, sonst hat mein Script immer "keine Lust", etwas zu schalten.

Ich habe die letzte Version vom Script oben noch mal aktualisiert. In den letzten beiden Programmzeilen fehlte jeweils eine "-1", die notwendig ist, weil die Indizierung in Listenfeldern (hier cuxd_bsz) bei 0 beginnt (und es für den Zustand "Aus" (Index = 0) kein CUxD-Wrapper-Device gibt). Das sollte die Ursache dafür gewesen sein, dass die BSZ nicht oder nicht richtig funktionierten.
______________________________________________________
950 Kanäle in 201 Geräten und 39 CUxD-Kanäle in 5 CUxD-Geräten

Xel66
Beiträge: 14149
Registriert: 08.05.2013, 23:33
System: Alternative CCU (auf Basis OCCU)
Wohnort: Nordwürttemberg
Hat sich bedankt: 583 Mal
Danksagung erhalten: 1497 Mal

Re: Einschaltzeit bei "Stromstoß" messen

Beitrag von Xel66 » 10.07.2022, 15:05

Ich weiß ja nicht, wieviel kW die Pumpe hat, aber wäre nicht ein Messaktor und ein CUxD-Betriebszeitenzähler die deutlich stressfreiere und zuverlässigere Alternative als das ganze Scriptgerödel? Diesen Lösungsansatz hat uwe111 am 02.07.2022 um 20:39 Uhr bereits vorgeschlagen. Aber hier wurde sich voll wie üblich mit aufgesetzten Scheuklappen in eine Scriptlösung verrannt, nur um die emöglichst naheliegendste und einfachste Lösung nicht umzusetzen. Der einzige Unterschied ist, dass ein Messaktor Geld kosten würde. Aber da wird lieber über inzwischen sieben Seiten mit halbgaren Softwarelösungen von hinten durch die Brust ins Auge experimentiert, als ein paar Euro in die Hand zu nehmen. Sorry, ICNR. Aber vielleicht bin ich einfach zu pragmatisch und zu wenig Software-Guru.

Gruß Xel66
-------------------------------------------------------------------------------------------
524 Kanäle in 146 Geräten und 267 CUxD-Kanäle in 34 CUxD-Geräten:
343 Programme, 334 Systemvariablen und 183 Direktverknüpfungen,
RaspberryMatic Version: 3.65.11.20221005 + Testsystem: CCU2 2.61.7
-------------------------------------------------------------------------------------------
Einsteigerthread, Programmlogik-Thread, WebUI-Handbuch

Benutzeravatar
HM-Villa
Beiträge: 508
Registriert: 24.01.2022, 10:13
System: CCU
Hat sich bedankt: 29 Mal
Danksagung erhalten: 120 Mal

Re: Einschaltzeit bei "Stromstoß" messen

Beitrag von HM-Villa » 10.07.2022, 17:43

Der Lösungsansatz von @Uwe111 vom 07.07.2022 um 20:39 Uhr ist zielführend, ich glaube, es gab auch einen User, der dies schon am 02.07.2022 um 17:52 Uhr vorgeschlagen hat. Allerdings bezog sich der Vorschlag nur auf die Ermittlung der Betriebsstunden der Poolpumpe in den einzelnen Leistungsstufen. Irgendwas muss die Stufen ja aber auch ansteuern. Es gab ja auch noch weitere Hinweise z. B. von @Funkleuchtturm zum Betrieb der Umwälzanlage. Ich glaube, dass es aber nicht zu einer Verurteilung kommen wird - nimmt ein User Vorschläge aus dem Forum nicht an.

Dennoch ging die Entwicklung in Richtung Script, woran ich sicher auch einen Anteil habe. Da ich nun keinesfalls der Script-Guru bin (eher umgedreht), konnte ich auch noch etwas dazu lernen, @7thguest hat es ganz gewiss getan. Deshalb war es nicht von Anfang an perfekt und erhebt diesen Anspruch auch jetzt nicht.

Falls wir das Forum und insbesondere diesen Thread über die Maßen abgenutzt haben, bitte ich um Entschuldigung - ich will es gewiss nicht wieder tun. :cry: :wink:

P. S. Die Pumpe hat übrigens 875 Watt.
Zuletzt geändert von HM-Villa am 10.07.2022, 19:25, insgesamt 2-mal geändert.
______________________________________________________
950 Kanäle in 201 Geräten und 39 CUxD-Kanäle in 5 CUxD-Geräten

Antworten

Zurück zu „CUxD“