Modul für den Kostal PIKO Wechselrichter

Begonnen von matzefisi, 25 Juni 2013, 19:43:13

Vorheriges Thema - Nächstes Thema

AK-868

nimm Anstatt $now $hour als Wert dann z.B. 17

{if ($hour > 15)&&($hour < 17)&&(ReadingsVal("Wechselrichter", "AC.Power", "") < 2500) {fhem ("set Poolpumpe off")}}

Hab es nicht getestet. Sollte aber klappen.

Ich weiss nicht wie $now definiert ist.  
Hardware FHEM:
Neue Fritzbox 7390 keine Labor von AVM
Konfigurationsadapter Lan
Funk-Schließerkontaktschnittstellen
Funk-Fenster/Türkontakt
Funk-Schaltaktoren UP ein und zweifach
Funk-Jalousieaktoren
Funk-Rauchmelder


Heiner

hi, klappt leider noch nicht.

Also der erste Befehl funktioniert, der zweite leider nicht. wie muss ich den zweiten Befehl aendern?

define PoolbeiSonne notify Wechselrichter:.* {if (ReadingsVal("Wechselrichter", "AC.Power", "") > 1500) {if("Poolpumpe" eq "off"){fhem ("set Poolpumpe on")}}}

define PoolkeineSonne notify Wechselrichter:.* {if ((ReadingsVal("Wechselrichter", "AC.Power", "") < 1400)&&($hour> 15)&&($hour< 17)) { fhem ("set Poolpumpe off")}}

Der einzige Unterschied ist eigentlich nur der das ich 3 Bedingungen habe statt nur einer wie im ersten Beispiel. Klingt so simpel und ist doch so schwierig.

die Fehlermeldung lautet:

2013.08.28 09:03:51 3: PoolkeineSonne return value: Unknown command {if, try help
Heiner
--------------------------------
fhem auf Pi3+
CUL 868MHz, Signalduino 434MHz, HM-CFG-USB
HM, THZ, Kostal, Somfy, Conbee, Pytonbinding, FritzBox, FTUI, MQTT2

AK-868



define PoolkeineSonne notify Wechselrichter:.* {if (ReadingsVal("Wechselrichter", "AC.Power", "") < 1400 && $hour > "15" && $hour < "17") {fhem ("set Poolpumpe off")}}



Probier es mal so. Ich hoffe da sind keine Zeichenfehler mehr drin. Für mich ist das in einer Zeile schreiben unübersichtlich.
Hardware FHEM:
Neue Fritzbox 7390 keine Labor von AVM
Konfigurationsadapter Lan
Funk-Schließerkontaktschnittstellen
Funk-Fenster/Türkontakt
Funk-Schaltaktoren UP ein und zweifach
Funk-Jalousieaktoren
Funk-Rauchmelder


Heiner

Hi klappt leider nicht.

ich hab nun beide Versionen in einer Zeile die nicht funktionieren mal im Vergleich, nehme aber auch gerne die mit Zeielnumbruch

nochmal das geht (eine Bedingung)
define Pool5 notify Wechselrichter:.* {if (ReadingsVal("Wechselrichter", "AC.Power", "") < 1400) { fhem ("set Poolpumpe off")}}

und das mit 3 Bedingungen nicht. (egal ob die 3 in Klammern stehen oder nicht)

define PoolkeineSonne notify Wechselrichter:.* {if ((ReadingsVal("Wechselrichter", "AC.Power", "") < 1400)&& ($hour> 15)&& ($hour< 17)) { fhem ("set Poolpumpe off")}}

define PoolkeineSonne notify Wechselrichter:.* {if (ReadingsVal("Wechselrichter", "AC.Power", "") < 1400 && $hour > "15" && $hour < "17") {fhem ("set Poolpumpe off")}}

Was ich eh nocht nicht in dem code kapiere ist das: Wechselrichter:.*
Was soll das? Ist das der Killer?

Eigentlich ist doch: ReadingsVal("Wechselrichter", "AC.Power", "") < 1400
eine vernuenftige Abfrage. Warum muss dieses "Wechselrichter:.*" noch vor dem IF stehen? Bewege ich mich eventuell nun nur innerhalb des Wechselrichters und somit klappt "$hour" nicht mehr?
Heiner
--------------------------------
fhem auf Pi3+
CUL 868MHz, Signalduino 434MHz, HM-CFG-USB
HM, THZ, Kostal, Somfy, Conbee, Pytonbinding, FritzBox, FTUI, MQTT2

Heiner

mit Zeielenumbruch solle es dann das sein, richtig?:

define PoolkeineSonne notify Wechselrichter:.* {\
 if (ReadingsVal("Wechselrichter", "AC.Power", "") < 1400)&&\
 ($hour> 15)&&\
 ($hour< 17) {\
 fhem ("set Poolpumpe off");;\
}\
}
Heiner
--------------------------------
fhem auf Pi3+
CUL 868MHz, Signalduino 434MHz, HM-CFG-USB
HM, THZ, Kostal, Somfy, Conbee, Pytonbinding, FritzBox, FTUI, MQTT2

AK-868

Das Wechselrichter:.* bedeutet soviel wie das jedes Event vom Wechselrichter was gefeuert wird diese Routine abarbeiten lässt.

Mit ReadginsVal liest du aus die Readings aus. Die in deinem definierten Wechselrichter stehen.


Die generierten Events sind nicht eindeutig da der State irgendwas mit W: 1220 MPP einspeisen ist, klick mal auf Eventmonitor und schau was da so kommt.

Deswegen der Weg:

Wechselrichter sendet irgendwas -> notify löst aus -> mit dem IF wird geprüft ob in den Readings AC.Power der Wert X steht wenn true mach das in dem Fall set Poolpumpe off.

Den Code hab ich getestet mal flott. der geht. Weiß ja nicht wie das Wetter bei dir ist, hier ist gerade über 1400 Watt deswegen gt du möchtest ja lt.

define notify_Test notify Wechselrichter:.* {\
if (ReadingsVal("Wechselrichter", "AC.Power", "") gt 1400 && $hour > "15" && $hour < "17")\
 {\
 fhem ("set Poolpumpe off");;\
 }\
Log 3, "True @ $hour";;\
}


Achso was ich vergas, der code zieht natürlich nur zwischen 15 und 17 Uhr bedeutet nur von 16:00 - 16:59Uhr. >= <= wäre dann die Abwandlung ;)



Hardware FHEM:
Neue Fritzbox 7390 keine Labor von AVM
Konfigurationsadapter Lan
Funk-Schließerkontaktschnittstellen
Funk-Fenster/Türkontakt
Funk-Schaltaktoren UP ein und zweifach
Funk-Jalousieaktoren
Funk-Rauchmelder


Heiner

hi, funktioniert soweit uasser das ich statt GT doch das Zeichen ">" benutzen muss. keine Ahnung warum....


Um jetzt die Funkbefhele zu minimieren wollte ich in die IF Schleife auch och einfuegen das er nur EIN schaltet wenn der Schalter aud AUS steht, dann braucht er nicht alle paar Minuten zu wiederholen, nur weil die Sonne scheint. Klappt aber auch wieder nicht.

Mein code sieht so aus:
define PoolbeiSonne notify (5min_check|global:INITIALIZED) {\
if ("Poolpumpe" eq "on") &&(ReadingsVal("Wechselrichter", "AC.Power", "") > 2500))\
 {\
 fhem ("set Poolpumpe on");;\
 }\
}

Es gibt keine Fehlermeldung, aber die Pumpe schaltet nicht. Loesche ich hingegen den kursiven Teil, dann klappts. Was mach ich denn nun shcon wieder falsch?
Heiner
--------------------------------
fhem auf Pi3+
CUL 868MHz, Signalduino 434MHz, HM-CFG-USB
HM, THZ, Kostal, Somfy, Conbee, Pytonbinding, FritzBox, FTUI, MQTT2

betateilchen

Zitatdas ich statt GT doch das Zeichen ">" benutzen muss. keine Ahnung warum

weil 1400 numerisch ist und kein String "1400"

Zitatif ("Poolpumpe" eq "on")

Das Wort Poolpumpe ist nunmal ein völlig anderes Wort als das Wort "on", deshalb kann der Vergleich mit "eq" (und damit Deine gesamte mit logischem UND verknüpfte Bedingung) niemals wahr werden. Der Vergleich an sich ist syntaktisch völlig richtig, wenn auch sinnlos, deshalb gibt es keine Fehlermeldung.

Vermutlich willst Du den WERT von "Poolpumpe" abfragen, also Value("Poolpumpe"), das würde ein bißchen mehr Sinn machen ;)
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

AK-868

Hallo Betateilchen,

kannst mir das nochmal erklaeren?

Ist gt und lt nicht das gleiche wie > <  ?

Bei mir lief der code mit gt.




Hardware FHEM:
Neue Fritzbox 7390 keine Labor von AVM
Konfigurationsadapter Lan
Funk-Schließerkontaktschnittstellen
Funk-Fenster/Türkontakt
Funk-Schaltaktoren UP ein und zweifach
Funk-Jalousieaktoren
Funk-Rauchmelder


betateilchen

Grundsätzlich ist entscheidend, ob Du numerische Werte oder Zeichenketten vergleichen willst.
Dafür gibt es unterschiedliche Vergleichsoperatoren.

14 ist eine Zahl (numerischer Wert), da vergleichst Du mit < > = !=
"14" ist ein Text (Zeichenkette), da vergleichst Du mit lt gt eq ne

Hier findest Du ausführliche Erklärungen:

http://de.selfhtml.org/perl/sprache/operatoren.htm



---
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

Heiner

hi, vielen dank, so  langsam komme ich dahinter.

Ich habe nun die Poolpumpe im Griff. sie schaltet immer ein wenn genug Sonne scheint und wenn der Poolrolladen offen ist sowie zu bestimmten Schaltzeiten.

Nun waere perfekt wenn ich irgendiwe die Zeit messen kann in der die Pumpe laeuft. Dann koennte ich die zeitabhaengige Regelung anpassen da diese eigentlich nur sicherstellen soll das eine gewisse mindestdauer pro Tag eingehalten wird.

Es gibt doch da siche reine moeglichkeit eine Variable zu definieren und irgendwie einen Zaehler mit zu verknuepfen, oder?

Danke fuer die Tipps.
Heiner
--------------------------------
fhem auf Pi3+
CUL 868MHz, Signalduino 434MHz, HM-CFG-USB
HM, THZ, Kostal, Somfy, Conbee, Pytonbinding, FritzBox, FTUI, MQTT2

betateilchen

natürlich. Vom Timestamp des Ausschaltens den Timestamp des Einschaltens abziehen und schon hast Du die Laufzeit. Und die addierst speicherst Du irgendwo, z.B. in einem userreading oder zur Not sogar in einem Attribut.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

Heiner

Hi, klase Idee,

da ich ja an einem Tag unbekannt viele Schaltvorgaengehabe ( immer bei Sonne ein, und bei sonne weg aus) summiere ich dann also alle ausschaltzeiten und ziehe davon die summe aller einschaltzeiten ab und shcon hab ich die Laufzeit, cool. Werd ich mal ausprobieren.



Heiner
--------------------------------
fhem auf Pi3+
CUL 868MHz, Signalduino 434MHz, HM-CFG-USB
HM, THZ, Kostal, Somfy, Conbee, Pytonbinding, FritzBox, FTUI, MQTT2

betateilchen

hä?

Du musst die Summe bei jedem Abschalten ermitteln. Alles andere dürfte kompliziert werden.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

Heiner

Hi, nun die ganze schalterei der Pumpe wird ziemlich kompliziert, also hab ich mich entschlossen das lieber in die 99_myUtils.pm zu packen. Was ich soweit habe ist das hier:

package main;
use strict;
use warnings;
use POSIX;
sub
myUtils_Initialize($$)
{
 my ($hash) = @_;
}
##########################################################
# Poolpumpensteuerung
# Aufruf in fhem.cfg mit
#      define Poolpumpenparameter notify (5min_check|global:INITIALIZED) ..
#                       ..{Pool(an1, aus1, an2, aus2, Tagesdauer, minPV)}
# an1 und aus1 ist das erste Zeitschaltpaar zwischen der die Poolpumpe an sein muss
# an2 und aus2 ist das zweite Zeitschaltpaar zwischen der die Poolpumpe an sein muss
# Tagesdauer gibt die maximale Laufzeit pro Tag an, sobald erreicht schaltet Pumpe aus
# die Pumpe geht auch an wenn die PV anlage mindestens x kwh Stom produziert,
# abschalten erfolgt dann bei 10% weniger
# damit alles funktioniert sind folgende Geraete in fhem.cfg
#   define Poolpumpe CUL_HM xxxxx das zu steuernde Geraet
#   define Wechselrichter KOSTALPIKO xxxx  liefert den PV Strom als reading "AC.Power"
#   define Poolog Filelog xxxxx liefert die Laufzeit der Pumpe
##########################################################

sub Pool($$$$$$){
my ($an1, $aus1, $an2, $aus2, $Tagesdauer, $minPV) = @_;

$Laufzeit_Poolpumpe_erreicht = ????

if (((Value("Poolpumpe") eq "off") && $hour == $an1)||
    ((Value("Poolpumpe") eq "off") && $hour == $an2))||
    ((Value("Poolpumpe") eq "off") && (ReadingsVal("Wechselrichter", "AC.Power", "") > $minPV))||{
   fhem("set Poolpumpe on");
  }

if (((Value("Poolpumpe") eq "on") &&
    ($hour <= $an1||($hour >= $aus1 && $hour <= $an2) || $hour >= $aus2) &&
    (ReadingsVal("Wechselrichter", "AC.Power", "") < ($minPV * 0.9) ||
    (Laufzeit_Poolpumpe_erreicht){
   fhem("set Poolpumpe off");
  }

}

1;

Leider ist der code nicht getestet. Gibt es dafuer sowas wie einen debug modus das man schritt fuer schritt durchspielt und sieht wie welche Variable reagiert? waere toll.

Nun aber zurueck zu dem Problem. Ich habe hier noch offen die Laufzeit der Pumpe zu ermitteln. Mein Logfile hat folgende Eintraege:

2013.09.04 15:02:56 2: CUL_HM set Poolpumpe on

Ich habe auch noch ein Poolspezifisches Logfile definiert mit:

define Log_Pool FileLog ./log/Homematic-Pool-%Y.log Pool.*level.*

das liefert diesen eintrag:

2013-08-20_18:05:34 Poolpumpe level: 100 %
2013-08-20_18:05:40 Poolpumpe level: 0 %

Aber wie lese ich die Werte nun aus?

Das hier klappt ja wohl nicht so ganz:

$Logzeit = (ReadingsVal("Log_Pool", "2013-$month-$day_", "")

Ich hab da leider nix imForum gefunden, ich hoffe ich bin einigermassen nah dran, aber ohne tipps komm ich hier leider nicht weiter.

Danke nochmals fuer die Unterstuetzung






Heiner
--------------------------------
fhem auf Pi3+
CUL 868MHz, Signalduino 434MHz, HM-CFG-USB
HM, THZ, Kostal, Somfy, Conbee, Pytonbinding, FritzBox, FTUI, MQTT2