FHEM vs. HomeMatic Homputer CL

Begonnen von fabian1987, 23 November 2013, 18:55:12

Vorheriges Thema - Nächstes Thema

Puschel74

#15
Hallo,

per putty die fhem.cfg editieren und die Zeile löschen.

Grüße

Edith:
Hier http://www.meintechblog.de/2013/05/fhem-server-auf-dem-raspberry-pi-in-einer-stunde-einrichten/ findest du ab
ZitatDa der sichere Zugriff per Benutzer/Passwort von unterwegs per Smartphone-Browser möglich
eine gute Anleitung zum absichern der Zugänge.
Damit hab sogar ich das geschafft  8)
Zotac BI323 als Server mit DBLog
CUNO für FHT80B, 3 HM-Lan per vCCU, RasPi mit CUL433 für Somfy-Rollo (F2F), RasPi mit I2C(LM75) (F2F), RasPi für Panstamp+Vegetronix +SONOS(F2F)
Ich beantworte keine Supportanfragen per PM! Bitte im Forum suchen oder einen Beitrag erstellen.

fabian1987

Hi,

du sagst das so einfach. Wo liegt denn die fhem.cfg in der Dateistruktur des Raspberry und wie sind die Befehle um diese zu öffnen?

Vielen Dank für deine Hilfe!

Gruß,
Fabian

fabian1987

Ah ich hab's gefunden. Liegt unter

cd /opt/fhem

und editieren kann man sie dann mit

sudo nano fhem.cfg

Puschel74

Zotac BI323 als Server mit DBLog
CUNO für FHT80B, 3 HM-Lan per vCCU, RasPi mit CUL433 für Somfy-Rollo (F2F), RasPi mit I2C(LM75) (F2F), RasPi für Panstamp+Vegetronix +SONOS(F2F)
Ich beantworte keine Supportanfragen per PM! Bitte im Forum suchen oder einen Beitrag erstellen.

fabian1987

Die Anleitung von meintechblog.de scheint für mich aber nicht ganz anwendbar zu sein, da zum einen fhem nicht auf der Fritzbox läuft und zum anderen ich einen Airport Extreme habe, der bei Portweiterleitungen irgendwie seinen eigenen Kopf hat. Habe mir jetzt einen Account bei selfhost.de registriert, aber noch keinen Plan, wie ich die Daten im Router hinterlege.

Aber ich bleibe dran...

Puschel74

Hallo,

in dieser Anleitung wird auch erklärt wie man seine FHEM-Installation auf dem RasPi absichern kann  ;)

Grüße
Zotac BI323 als Server mit DBLog
CUNO für FHT80B, 3 HM-Lan per vCCU, RasPi mit CUL433 für Somfy-Rollo (F2F), RasPi mit I2C(LM75) (F2F), RasPi für Panstamp+Vegetronix +SONOS(F2F)
Ich beantworte keine Supportanfragen per PM! Bitte im Forum suchen oder einen Beitrag erstellen.

fabian1987

#21
Hallo allerseits,

ich muss euch nochmals mit einem kleinen Problem nerven. Ich habe jetzt alle Heizungen mit Schaltern automatisiert und prinzipiell tut die Heizung auch das, was ich will. Allerdings bekomme ich häufig den Fehler:

2013.12.12 06:24:45 2: HMLAN_Parse: HMLAN1 new condition Warning-HighLoad
2013.12.12 06:35:54 2: HMLAN_Parse: HMLAN1 new condition ERROR-Overload

Prinzipiell nutze ich für jede Heizung folgende Logik:


##############################################################
# Heizungsregelung Arbeitszimmer

define AzHeizungsregelungNotify notify Az_Thermostat {if ((ReadingsVal("Az_Thermostat","desired-temp","")> ReadingsVal("Az_Thermostat","measured-temp","")) && (Value("Az_Schaltaktor") eq "off")) { fhem("set Az_Schaltaktor on")} elsif (ReadingsVal("Az_Thermostat","desired-temp","")< ReadingsVal("Az_Thermostat","measured-temp","") && (Value("Az_Schaltaktor") eq "on")) {fhem("set Az_Schaltaktor off") }\
}


Ich verstehe notify so, dass ich jedes Mal, wenn das Thermostat neue Werte schickt, die if-else Anweisung prüfe und falls eine Bedingung zutrifft, die Heizung an oder abschalte. Das heißt aber doch auch, dass nur dann Funkverkehr entsteht, wenn ich auch einen Statuswechsel anfordern will. Wieso kommt es dann trotzdem zu dem Overload?

Ein zweites Problem ist, dass ich im Wohnzimmer mit einem Thermostat drei Heizungen schalten will. Folgendes funktioniert in FHEM:


##############################################################
# Heizungsregelung Wohnzimmer

# HeizungUG groß

define WzUGGrHeizungsregelungNotify notify Wz_Thermostat {if ((ReadingsVal("Wz_Thermostat","desired-temp","")> ReadingsVal("Wz_Thermostat","measured-temp","")) && (Value("Wz_SchaltaktorGr") eq "off")) { fhem("set Wz_SchaltaktorGr on")} elsif (ReadingsVal("Wz_Thermostat","desired-temp","")< ReadingsVal("Wz_Thermostat","measured-temp","") && (Value("Wz_SchaltaktorGr") eq "on")) {fhem("set Wz_SchaltaktorGr off") }\
}

# HeizungUG klein

define WzUGKlHeizungsregelungNotify notify Wz_Thermostat {if ((ReadingsVal("Wz_Thermostat","desired-temp","")> ReadingsVal("Wz_Thermostat","measured-temp","")) && (Value("Wz_SchaltaktorKl") eq "off")) { fhem("set Wz_SchaltaktorKl on")} elsif (ReadingsVal("Wz_Thermostat","desired-temp","")< ReadingsVal("Wz_Thermostat","measured-temp","") && (Value("Wz_SchaltaktorKl") eq "on")) {fhem("set Wz_SchaltaktorKl off") }\
}

# HeizungOG

define WzOGHeizungsregelungNotify notify Wz_Thermostat {if ((ReadingsVal("Wz_Thermostat","desired-temp","")> ReadingsVal("Wz_Thermostat","measured-temp","")) && (Value("Wz_SchaltaktorOG") eq "off")) { fhem("set Wz_SchaltaktorOG on")} elsif (ReadingsVal("Wz_Thermostat","desired-temp","")< ReadingsVal("Wz_Thermostat","measured-temp","") && (Value("Wz_SchaltaktorOG") eq "on")) {fhem("set Wz_SchaltaktorOG off") }\
}



Das erscheint mir jedoch unsauber, da ich ja drei Mal notify auf das gleiche Thermostat abfrage. Da wäre es doch sicher sauberer, wenn ich folgenden Code implementieren würde:



##############################################################
# Heizungsregelung Wohnzimmer

define WzUGGrHeizungsregelungNotify notify Wz_Thermostat {

# HeizungUG groß
if ((ReadingsVal("Wz_Thermostat","desired-temp","")> ReadingsVal("Wz_Thermostat","measured-temp","")) && (Value("Wz_SchaltaktorGr") eq "off")) { fhem("set Wz_SchaltaktorGr on")}
elsif (ReadingsVal("Wz_Thermostat","desired-temp","")< ReadingsVal("Wz_Thermostat","measured-temp","") && (Value("Wz_SchaltaktorGr") eq "on")) {fhem("set Wz_SchaltaktorGr off") }

# HeizungUG klein
elsif ((ReadingsVal("Wz_Thermostat","desired-temp","")> ReadingsVal("Wz_Thermostat","measured-temp","")) && (Value("Wz_SchaltaktorKl") eq "off")) { fhem("set Wz_SchaltaktorKl on")}
elsif (ReadingsVal("Wz_Thermostat","desired-temp","")< ReadingsVal("Wz_Thermostat","measured-temp","") && (Value("Wz_SchaltaktorKl") eq "on")) {fhem("set Wz_SchaltaktorKl off") }

# HeizungOG
elsif ((ReadingsVal("Wz_Thermostat","desired-temp","")> ReadingsVal("Wz_Thermostat","measured-temp","")) && (Value("Wz_SchaltaktorOG") eq "off")) { fhem("set Wz_SchaltaktorOG on")}
elsif (ReadingsVal("Wz_Thermostat","desired-temp","")< ReadingsVal("Wz_Thermostat","measured-temp","") && (Value("Wz_SchaltaktorOG") eq "on")) {fhem("set Wz_SchaltaktorOG off") }\

}



Der bringt jedoch im Logfile immer Fehler, wie z.B. folgenden:

2013.12.12 07:06:19 3: WzUGGrHeizungsregelungNotify return value: syntax error at (eval 7257) line 1, at EOF


Danke für eure Hilfe schonmal im Voraus!! :)

Gruß,
Fabian

Puschel74

Hallo,

bitte deinen Beitrag nochmal bearbeiten und verwende die Code-Tags (# oben).
So les ich mir den Code nicht durch - auch wenn alles sauber getrennt aussieht.

Aber was anderes - warum prüfst du auf desired-temp und measured-temp nicht auf actuator?
Ich weiß allerdings nicht ob HM das kann.
actuator ist die Ventilstellung und damit liese sich mit wenig Aufwand auch eine Hysterese einbauen.

Hat die Fehlermeldung nicht noch eine zweite Zeile??

Grüße
Zotac BI323 als Server mit DBLog
CUNO für FHT80B, 3 HM-Lan per vCCU, RasPi mit CUL433 für Somfy-Rollo (F2F), RasPi mit I2C(LM75) (F2F), RasPi für Panstamp+Vegetronix +SONOS(F2F)
Ich beantworte keine Supportanfragen per PM! Bitte im Forum suchen oder einen Beitrag erstellen.

fabian1987

Hi,

hoffe so passt es. Auf den Actuator-Status abfragen, darüber habe ich noch nicht nachgedacht. Letztendlich kann ich den Lüfter ja nicht regeln, daher der Gedanke mit der Soll- und Isttemperatur. Eine Hysterese war bislang nicht nötig, da die Thermostate von Homematic so stark bedämpft sind, dass man ohnehin schon Überschwinger von 0,1-0,3°C macht. Damit ist ja quasi eine Hysterese gegeben.

Gruß,
Fabian

Puschel74

Hallo,

danke für Code-Tags. Sieht doch schon um einiges Besser aus  ;)

Ok. Da ich kein "Einzeiler-Fan" bin muss ich deine Abfragen erstmal - für mich - passend aufbereiten.
Das wird nun ein bischen dauern.

Zu den Overload-Warnings kann ich dir nichts sagen.
Ich verwende zwar einen HM-Lan aber da hängen nur ein paar Funkschalter und -dimmer dran.

Die Idee mit dem actuator würde dann in etwa so aussehen:

if ((ReadingsVal("Wz_Thermostat","actuator","")> 40)...
Wobei du die 40 natürlich an deine gewünschte Ventilstellung anpassen kannst.

Grüße
Zotac BI323 als Server mit DBLog
CUNO für FHT80B, 3 HM-Lan per vCCU, RasPi mit CUL433 für Somfy-Rollo (F2F), RasPi mit I2C(LM75) (F2F), RasPi für Panstamp+Vegetronix +SONOS(F2F)
Ich beantworte keine Supportanfragen per PM! Bitte im Forum suchen oder einen Beitrag erstellen.

Puschel74

#25
Hallo,

grad schnell über deinen Code drüber geschaut.
Sieht soweit nicht schlecht aus aber ...

FHEM ist pingelig was Leerzeichen am Ende von Zeilen anbelangt.
z.B.:
hier steht der Code {
und hier gehts weiter

sieht für uns in Ordnung aus - nach der { habe ich aber ein Leerzeichen versteckt  8)
Das mag FHEM nicht.

# im Code musste ich gestern erst feststellen mag FHEM auch nicht.
Entweder hinter den Code stellen (wenn das klappt) oder ganz weg lassen.

Und - wie schon erwähnt.
Ich bearbeite ausschliesslich das DEF eines notify.
1:1 Kopien von meinen Vorschlägen werden sowieso nie fehlerfrei laufen da bei mir einfach die \ und ;; fehlen.
Ich würde dir auch ans Herz legen die fhem.cfg in Ruhe zu lassen und über die Gefehlszeile bzw. das DEF eines notify (oder at) gehen.

So. Nun schauen wir mal was du mit diesen Erkenntnissen anfangen kannst und welche Fehlermeldung
dein nächster Code auspuckt  ;)

Grüße

Edith: Ich vergas - ganze Leerzeilen sind auch nicht so gut.
der Code wird zwar uU für Menschen lesbarer aber im Endeffekt soll der Code durch einen Interpreter ausgeführt werden - und die haben in aller Regel einen genauen Syntax.
Und da sind diese Interpreter kompromisslos  ;)
Zotac BI323 als Server mit DBLog
CUNO für FHT80B, 3 HM-Lan per vCCU, RasPi mit CUL433 für Somfy-Rollo (F2F), RasPi mit I2C(LM75) (F2F), RasPi für Panstamp+Vegetronix +SONOS(F2F)
Ich beantworte keine Supportanfragen per PM! Bitte im Forum suchen oder einen Beitrag erstellen.

fabian1987

Hi,

vielen Dank für deine ausführliche Antwort. Das werde ich morgen mal ausprobieren! Heute hat sich übrigens noch ein weiteres Problem ergeben. Ich frage im Code (siehe oben) ab, ob der Status des Aktors eq "off" oder eq "on" ist, um die Schaltanweisung zu schicken. Das ist prinzipiell auch so nicht schlecht, denn damit wird vermieden, dass eine Schaltanweisung geschickt wird, obschon sich der Aktor bereits im Zielzustand befindet.

Leider ergibt sich folgendes Problem: Meine Aktoren sind in der Nachtspeicherheizung verbaut (Metallgehäuse), was funktechnisch wohl nicht so optimal ist (will daher die Schalter nach außen legen, wovon das Problem zwar weniger häufig auftritt, aber nach wie vor bestehen bleibt). Setze ich den Schaltaktor auf "on" oder "off" und dieser verpasst meinen Schaltbefehl, so schaltet FHEM irgendwann auf "MISSING ACK" um. Lese ich dann den Value des Schaltaktors aus, gibt dieser "set_on" oder "set_off" zurück. Da dies jedoch nicht mit der Abfrage übereinstimmt, wird diese nie wieder ausgeführt. Das heißt, dass die Heizung endlos weiterläuft. Nicht so gut. Bin vor ein paar Tagen schon schweißgebadet aufgewacht... ;)

Jetzt habe ich gedacht, alles klar, fragst du eben als ODER-Verknüpfung beide Stati ("off" oder "set_off") und ("on" oder "set_on") ab:


define AzHeizungsregelungNotify notify Wz_Thermostat {if ((ReadingsVal("Wz_Thermostat","desired-temp","")> ReadingsVal("Wz_Thermostat","measured-temp","")) && ((Value("Wz_SchaltaktorOG") eq "off") || (Value("Wz_SchaltaktorOG") eq "set_on"))) { fhem("set Wz_SchaltaktorOG on")} elsif (ReadingsVal("Wz_Thermostat","desired-temp","")< ReadingsVal("Wz_Thermostat","measured-temp","") && ((Value("Wz_SchaltaktorOG") eq "on") || (Value("Wz_SchaltaktorOG") eq "set_off")))  {fhem("set Wz_SchaltaktorOG off") }\
}


Das führt jedoch dazu, dass trotz notify mehrere Schaltanweisungen innerhalb von wenigen Sekunden an den Schaltaktor rausgeschickt werden:


2013.12.14 17:47:16 2: CUL_HM set Az_Schaltaktor off
2013.12.14 17:47:16 2: CUL_HM set Az_Schaltaktor off
2013.12.14 17:47:16 2: CUL_HM set Az_Schaltaktor off
2013.12.14 17:47:16 2: CUL_HM set Az_Schaltaktor off
2013.12.14 17:47:16 2: CUL_HM set Az_Schaltaktor off
2013.12.14 17:47:16 2: CUL_HM set Az_Schaltaktor off
2013.12.14 17:47:22 2: CUL_HM set Az_Schaltaktor on
2013.12.14 17:47:22 2: CUL_HM set Az_Schaltaktor on
2013.12.14 17:47:22 2: CUL_HM set Az_Schaltaktor on
2013.12.14 17:47:22 2: CUL_HM set Az_Schaltaktor on


Habe schon überlegt, mit einem "at" und alle fünf Minuten oder so alle Aktoren auf "set_on" oder "set_off" zu überprüfen. Aber auch das scheint mir etwas unsauber, da ja das "at" dann zu ungünstigen Zeitpunkten mitten in einem Schaltvorgang aufgerufen werden könnte.

Habt ihr eine Idee, wie das klappen könnte? Vielen Dank schonmal im Voraus!

Gruß,
Fabian

Puschel74

Hallo,

hat zwar mit der Anfangsfrage nichtsmehr zu tun (nächstes mal bitte neuen Beitrag aufmachen) aber ...

das
define AzHeizungsregelungNotify notify Wz_Thermostat {if
von dir gepostete macht genau das was es soll.

Wenn ein Ereigniss von Wz_Thermostat eintritt wird das notify geprüft.
Naja - WzThermostat sendet mehr als ein! Ereigniss wie du schön im Event Monitor erkennen kannst.

Einfach mal öffnen und warten - nicht nochmal klicken!! - warten.
Sobald die ersten Device ihr Nachrichten schicken werden sie im Event Monitor angezeigt.
Also einfach nur warten - es kommt schon was.

Da siehst du das Wz_Thermostat mehrere Readings hat und auf alle trifft ja dein regepx zu.
Wz_Thermostat (mit ohne nix oder allem was kommt).
Genauso könntest du schreiben
Wz_Thermostat.*
Das trifft auch auf alles zu was von Wz_Thermostat kommt.

Und was soll das notify machen?
Genau.
Bei jedem Treffer des regexp wird es geprüft.
Die Bedingungen werden abgefragt und die Aktionen ausgelöst.

Du willst aber eigentlich nur auf "desired-temp" prüfen - RSSI und alles was der sonst noch sendet ist dir ja in diesem notify egal.

Also erweitern wir mal das regexp und schauen was passiert.

Wz_Thermostat.desired.* (sollte hoffentlich richtig sein - der Punkt . steht für ein beliebiges Zeichen und ein Leerzeichen müsste eigentlich als beliebiges Zeichen durchgehen).
also das es so aussieht:
define AzHeizungsregelungNotify notify Wz_Thermostat.desired.* {if ((ReadingsVal("Wz_Thermostat","desired-temp
und schauen was jetzt passiert.

Grüße
Zotac BI323 als Server mit DBLog
CUNO für FHT80B, 3 HM-Lan per vCCU, RasPi mit CUL433 für Somfy-Rollo (F2F), RasPi mit I2C(LM75) (F2F), RasPi für Panstamp+Vegetronix +SONOS(F2F)
Ich beantworte keine Supportanfragen per PM! Bitte im Forum suchen oder einen Beitrag erstellen.

fabian1987

Das klingt jetzt erstmal plausibel. Allerdings muss ich doch sowohl bei Ankuft des "desired-temp", als auch bei Ankunft des "measured-temp" das notify ausführen. Sonst würde sich bei Änderung der Ist-Temperatur oder bei Änderung der Solltemperatur die Heizung nicht anschalten, korrekt?

Puschel74

Hallo,

ZitatAllerdings muss ich doch sowohl bei Ankuft des "desired-temp", als auch bei Ankunft des "measured-temp" das notify ausführen.

Wenn das so sein muss brauchst du doch nur das regexp entsprechend umbauen das es auf "desired-temp" und "measured-temp" reagiert.

Such dir eine Gemeinsamkeit der beiden "Daten" und bau dir ein passendes regexp  ;)

Grüße
Zotac BI323 als Server mit DBLog
CUNO für FHT80B, 3 HM-Lan per vCCU, RasPi mit CUL433 für Somfy-Rollo (F2F), RasPi mit I2C(LM75) (F2F), RasPi für Panstamp+Vegetronix +SONOS(F2F)
Ich beantworte keine Supportanfragen per PM! Bitte im Forum suchen oder einen Beitrag erstellen.