Zählersensor Powerfox Poweropti Leistung auslesen und in Variable schreiben

Allgemeines zur HomeMatic Haussteuerung

Moderator: Co-Administratoren

Fonzo
Beiträge: 6743
Registriert: 22.05.2012, 08:40
System: CCU
Hat sich bedankt: 25 Mal
Danksagung erhalten: 485 Mal

Re: Zählersensor Powerfox Poweropti Leistung auslesen und in Variable schreiben

Beitrag von Fonzo » 17.01.2023, 16:03

Sirko hat geschrieben:
15.01.2023, 17:46
Ich sehe meinen aktuellen Verbrauch (wie beschrieben). Die Einspeisung fehlt noch.
Das Vorgehen ist grundsätzlich das gleiche wie in der Dokumentation s.o. beschrieben, Du bekommst jeweils ein JSON zurück geliefert, was Du dann einem Textfeld oder anderem Element zuordnen kannst. Eine Übersicht über alle verfügbaren Befehle findest Du in der API Dokumentation des Herstellers beschrieben.

pwmo
Beiträge: 3
Registriert: 26.08.2022, 17:39
System: CCU
Hat sich bedankt: 2 Mal

Re: Zählersensor Powerfox Poweropti Leistung auslesen und in Variable schreiben

Beitrag von pwmo » 25.04.2023, 09:40

Baxxy hat geschrieben:
29.08.2022, 19:38



Könnte man natürlich im Script splitten auf 2 SysVars wobei dann je nach Strombilanz eine SV immer 0 anzeigt.
Beispiel Einspeisung:
PwrFox_Dual_SV_Einspeisung.JPG
Beispiel Bezug:
PwrFox_Dual_SV_Bezug.JPG

Hast du dafür zufällig ein fertiges Script für mich, ich versuche es schon seit ein paar Tagen selbst allerdings wird mir immer nur der Bezug negativ angezeigt und bei Einspeisung is immer null... :evil:

Benutzeravatar
Baxxy
Beiträge: 10832
Registriert: 18.12.2018, 15:45
System: Alternative CCU (auf Basis OCCU)
Hat sich bedankt: 608 Mal
Danksagung erhalten: 2227 Mal

Re: Zählersensor Powerfox Poweropti Leistung auslesen und in Variable schreiben

Beitrag von Baxxy » 26.04.2023, 09:53

pwmo hat geschrieben:
25.04.2023, 09:40
zufällig ein fertiges Script
Zufällig lag da ein fast fertiges Script in meiner Script Datenbank. :wink:
(was jetzt komplett ist)

Kurzanleitung:
  • 4 SysVars Typ Zahl anlegen (Summe-Bezug, Summe-Einspeisung, Leistung-Bezug, Leistung-Einspeisung).
    Die Benamung ist egal, Namen im Script und in der WebUI müssen natürlich übereinstimmen
  • Das Script erstmal im "Script testen" mit den korrekten SysVar-Namen (ansonsten unverändert) ausführen.
    Leistung-Bezug sollte 0W und Leistung-Einspeisung 159W sein
    Die "Test_Ausgabe_Daten" auf einen positiven Watt-Wert ändern (z.B. 159)
    Leistung-Bezug sollte 159W und Leistung-Einspeisung 0W sein
  • Passt alles dann im Script den "Test_Mode" auf false ändern und das Script nochmal ausführen.
    Kommen die realen Daten korrekt an kann das Script im Programm genutzt werden.

Code: Alles auswählen

!- original Code by @Hattermann - https://homematic-forum.de/forum/viewtopic.php?f=19&t=62796&start=20#p695773
!- modified by @Baxxy
!- added "Summe Einspeisung wird in SysVar geschrieben" und Code-Optimierunge
!- added "Duale Ausgabe", Leistung Bezug/Einspeisung können in 2 SysVars geschrieben werden
!- https://homematic-forum.de/forum/viewtopic.php?f=19&t=62796&p=765144#p765144

!-------- Hier die eigenen Daten Eintragen------------------
string username = "Hans.Wurst@Mueller.de";
string password  = "4711";
string poweropti_serial = "1234567890ab";
!-----------------------------------------------------------

! - Duale Ausgabe, bei true werden Leistung-Bezug und Leistung-Einspeisung in separate SysVars geschrieben werden
boolean Duale_Ausgabe     = true; !- bei true duale Ausgabe in 2 SysVars, false = Ausgabe in eine SysVar
boolean Test_Mode 	      = true; !- bei true wird mit Test-Ausgabe-Daten gearbeitet, im Regelbetrieb auf false setzen
string Test_Ausgabe_Daten = '{"Outdated":false,"Watt":-159,"Timestamp":1659294930,"A_Plus":220.065,"A_Minus":921.478}';

! - diese Systemvariablen als Typ: Zahl anlegen!
! - Benamung egal, aber die Namen in der WebUI und in der Scriptdeklaration müssen gleich sein
string SV_Leistung_Bezug       = "PWRFox Leistung aktuell - Bezug";
string SV_Leistung_Einspeisung = "PWRFox Leistung aktuell - Einspeisung"; !- nur benötigt wenn "Duale_Ausgabe" auf true
string SV_Summe_Verbrauch      = "PWRFox Verbrauch Summe - Bezug";
string SV_Summe_Einspeisung    = "PWRFox Verbrauch Summe - Einspeisung";

!###########################################################
! - ab hier keine Änderungen nötig!

object oSV_Leistung_aktell      = dom.GetObject (ID_SYSTEM_VARIABLES).Get (SV_Leistung_Bezug);
object oSV_Leistung_Einspeisung = dom.GetObject (ID_SYSTEM_VARIABLES).Get (SV_Leistung_Einspeisung);
object oSV_Summe_Verbrauch      = dom.GetObject (ID_SYSTEM_VARIABLES).Get (SV_Summe_Verbrauch);
object oSV_Summe_Einspeisung    = dom.GetObject (ID_SYSTEM_VARIABLES).Get (SV_Summe_Einspeisung);

string usernameEnc = username.UriEncode();
string passwordEnc = password.UriEncode();
string JSON_All; var stemp; integer StrLen; integer pos; real AktuelleLeistung; real VerbrauchSumme; real EinspeiseSumme; boolean dual_sv_out;

if (Duale_Ausgabe) {
   if ( oSV_Leistung_aktell && oSV_Leistung_Einspeisung && oSV_Summe_Verbrauch && oSV_Summe_Einspeisung ) {
        WriteLine("Modus - Duale SysVar Ausgabe: Alle SysVars vorhanden!");
        dual_sv_out = true; }
     else { WriteLine("Modus - Duale SysVar Ausgabe: Nicht alle SysVars vorhanden ...Script wird beendet!"); quit; }
     }
else {
     if ( oSV_Leistung_aktell && oSV_Summe_Verbrauch && oSV_Summe_Einspeisung ) {
          WriteLine("Modus - Single SysVar Ausgabe: Alle SysVars vorhanden!"); }
     else { WriteLine("Modus - Single SysVar Ausgabe: Nicht alle SysVars vorhanden ...Script wird beendet!"); quit; }
     }

! Username, Password ausgeben um Strings selbst zu basteln
! WriteLine(usernameEnc);
! WriteLine(passwordEnc);
! Abfrage der Serial im Browser:
! https://%usernameEnc%:%passwordEnc%@backend.powerfox.energy/api/2.0/my/all/devices

string cmd = "curl -X GET \"https://" + usernameEnc + ":" + passwordEnc + "@backend.powerfox.energy/api/2.0/my/" + poweropti_serial + "/current\"";

! Daten der Geräte abrufen
!string Test_Ausgabe;
if (!Test_Mode) {
   dom.GetObject("CUxD.CUX2801002:1.CMD_SETS").State(cmd);
   dom.GetObject("CUxD.CUX2801002:1.CMD_QUERY_RET").State(1);
   JSON_All = dom.GetObject("CUxD.CUX2801002:1.CMD_RETS").State().ToLatin();
   WriteLine("Ausgabe_Daten: "# JSON_All);
   }
 else {
!- Teststring nutzen
  JSON_All = Test_Ausgabe_Daten;
  StrLen = JSON_All.Length();
  WriteLine("Test_Ausgabe_Daten: "# JSON_All);
  }

! Leistung Lesen
  pos = JSON_All.Find( "\"Watt\":" ) + 7;
  JSON_All = JSON_All.Substr( pos, JSON_All.Length() - pos );
  pos = JSON_All.Find( "," );
  stemp = JSON_All.Substr( 0, pos );
!  WriteLine( stemp );
  AktuelleLeistung = stemp.ToFloat();
  WriteLine("PwrFox Leistung: "# AktuelleLeistung.ToString(0) #"W");

 if ( dual_sv_out ) {
      if ( AktuelleLeistung > 0.0 ) {
           oSV_Leistung_aktell.State(AktuelleLeistung);
           oSV_Leistung_Einspeisung.State(0.0, 100);
           WriteLine("PwrFox Leistung = Bezug: "# AktuelleLeistung.ToString(0)  #"W");
           }
        elseif ( AktuelleLeistung < 0.0 ) {
                 oSV_Leistung_aktell.State(0.0);
                 oSV_Leistung_Einspeisung.State(AktuelleLeistung.Abs(), 100);
                 WriteLine("PwrFox Leistung = Einspeisung: "# AktuelleLeistung.Abs().ToString(0)  #"W");
                }
             else { oSV_Leistung_aktell.State(0.0); oSV_Leistung_Einspeisung.State(0.0, 100);
                    WriteLine("PwrFox Leistung = Ausgeglichen: "# AktuelleLeistung.ToString(0)  #"W");
                  }
   }
  else { oSV_Leistung_aktell.State(AktuelleLeistung); }

! Verbrauch lesen
  pos = JSON_All.Find( "\"A_Plus\":" ) + 9;
  JSON_All = JSON_All.Substr( pos, JSON_All.Length() - pos );
  pos = JSON_All.Find( "," );
  stemp = JSON_All.Substr( 0, pos );
!  WriteLine( stemp );
  VerbrauchSumme = stemp.ToFloat();
  WriteLine("Summe Verbrauch: "# VerbrauchSumme);

! Einspeisung Summe lesen
  pos = JSON_All.Find( "\"A_Minus\":" ) + 10;
  JSON_All = JSON_All.Substr( pos, JSON_All.Length() - pos );
  stemp = JSON_All.RTrim("}");
!  WriteLine( stemp );
  EinspeiseSumme = stemp.ToFloat();
  WriteLine("Summe Einspeisung: "# EinspeiseSumme);

! Variablen setzen
oSV_Summe_Verbrauch.State(VerbrauchSumme, 200);
oSV_Summe_Einspeisung.State(EinspeiseSumme, 300);
Viel Erfolg! :)

Deman89
Beiträge: 1
Registriert: 27.04.2023, 22:01
System: CCU

Re: Zählersensor Powerfox Poweropti Leistung auslesen und in Variable schreiben

Beitrag von Deman89 » 27.04.2023, 22:03

Hallo Zusammen,

bei mir geht der Skript nicht, was mache ich falsch ?
Habe ihn eingefügt und meine Daten ergänzt und alle Systemvariablen angelegt, die Daten werden immer mit 0 angezeigt.

mfg
Deman

dovogt
Beiträge: 11
Registriert: 26.02.2021, 18:03
System: CCU
Hat sich bedankt: 2 Mal

Re: Zählersensor Powerfox Poweropti Leistung auslesen und in Variable schreiben

Beitrag von dovogt » 21.08.2023, 15:34

besten Dank für das Script. Wie habt ihr es eingebunden (als Programm mit Zeitsteuerung)?

Ich würde gerne eine Steckdose schalten (wenn Einspeisung vorhanden ist) und wieder abschalten.


dovogt
Beiträge: 11
Registriert: 26.02.2021, 18:03
System: CCU
Hat sich bedankt: 2 Mal

Re: Zählersensor Powerfox Poweropti Leistung auslesen und in Variable schreiben

Beitrag von dovogt » 21.08.2023, 16:17

Dann lese ich alle paar Minuten die Daten aus und frage die Avriablen ab. Ist es so korrekt?
Screenshot_3.jpg

Benutzeravatar
Baxxy
Beiträge: 10832
Registriert: 18.12.2018, 15:45
System: Alternative CCU (auf Basis OCCU)
Hat sich bedankt: 608 Mal
Danksagung erhalten: 2227 Mal

Re: Zählersensor Powerfox Poweropti Leistung auslesen und in Variable schreiben

Beitrag von Baxxy » 21.08.2023, 16:22

Naja, nicht so wirklich.
"Nur prüfen" triggert kein Programm, "bei Änderung" wäre passender.

Dann solltest du über eine Hysterese nachdenken.
Schwankt dein Bezug um die 50W geht dein Aktor immer AN/AUS.

Beschreibe mal möglichst präzise wie das Szenario aussehen soll... mit allen Eventualitäten.

dovogt
Beiträge: 11
Registriert: 26.02.2021, 18:03
System: CCU
Hat sich bedankt: 2 Mal

Re: Zählersensor Powerfox Poweropti Leistung auslesen und in Variable schreiben

Beitrag von dovogt » 21.08.2023, 16:58

Danke für deine Unterstützung. Prüfen hatte ich so verstanden, dass er prüft, ob die Bedingung erfüllt ist. Ich möchte eine Steckdose einschalten, wenn die Einspeisung größer als 50 Watt ist. Fältt der Einspeisewert unter 50 Watt, soll die Steckdose wieder ausgeschaltet werden.
Die Variable Einspeisung setze ich alle 10 Minuten über ein anderes weiteres Script.


Antworten

Zurück zu „HomeMatic allgemein“