Buderus KM200 Kommunikationsmodul

Begonnen von Sailor, 21 Juli 2014, 12:39:47

Vorheriges Thema - Nächstes Thema

arnoaugustin

Zitat von: furban am 02 Februar 2016, 19:34:26
Habe gerade auch mal einen Test gemacht. Erst waren meine Einstellungen so. Warmwasserbereitung war also aktiv.
usw....

Komischerweise ist currentSetpoint keinen Wert den ich selbst beschreiben kann. Riecht also stark danach das es da doch noch weitere Readings gibt die bisher nicht gefunden wurden.

Das könnte ich nun mal versuchen mit WireShark mitzuschneiden, aber so was habe ich ewig nicht mehr gemacht.
Dazu muss ich auch mit dem WireShark im IP Strom sein, oder? Das wäre dann leider nur auf meiner FritzBox 7490 der Fall. Oder ginge das auch von meinem PC hier aus der ja im selben Netz steht?

Gruß

Frank

Hallo Frank,

das ist aber scheinbar normal. Wenn ich in den Keller gehe und da Einmalladung anstoße, dann lädt er auch nur, wenn schon irgendwelche Temperaturgrenzen unterschritten sind. Geladen wird nur wenn normal auch geladen worden wäre. Das ist für mich aber auch ok, so kann ich ihn aus der Wassernachtabsenkung holen. So muss man die Einmalladung bei meiner RC300 wohl auch verstehen......

VG
Arno

furban

Zitat von: arnoaugustin am 02 Februar 2016, 19:39:48
Hallo Frank,

das ist aber scheinbar normal. Wenn ich in den Keller gehe und da Einmalladung anstoße, dann lädt er auch nur, wenn schon irgendwelche Temperaturgrenzen unterschritten sind. Geladen wird nur wenn normal auch geladen worden wäre. Das ist für mich aber auch ok, so kann ich ihn aus der Wassernachtabsenkung holen. So muss man die Einmalladung bei meiner RC300 wohl auch verstehen......

VG
Arno

Ich sage nicht das an dem Verhalten etwas nicht normal wäre. Das ist schon ok so. Es ist halt nur merkwürdig das sich bei einer Einmalladung nur ein Wert verändert der eigentlich so gar nicht beschreibbar ist. Da die Einmalladung ja auch nur für eine Stunde gültig ist (Meine ich in der Anleitung gelesen zu haben), muss es eigentlich auch ein Reading geben in dem irgendwie die Zeit steht wie lange die Einmalladung noch läuft.

arnoaugustin

Zitat von: furban am 02 Februar 2016, 19:50:53
Ich sage nicht das an dem Verhalten etwas nicht normal wäre. Das ist schon ok so. Es ist halt nur merkwürdig das sich bei einer Einmalladung nur ein Wert verändert der eigentlich so gar nicht beschreibbar ist. Da die Einmalladung ja auch nur für eine Stunde gültig ist (Meine ich in der Anleitung gelesen zu haben), muss es eigentlich auch ein Reading geben in dem irgendwie die Zeit steht wie lange die Einmalladung noch läuft.

Oder das geht einfach per "Pfusch". Die setzen die Termperatur auf "high" und stellen dann selber wieder runter. Das könnte eine RC300 und ein Buderus-Connect so lange ein Zugang besteht. Testen kann mans so:
Buderus-Connect=>Einmalladung und dann Internet Trennen und dann gucken obs wieder zurück gestellt wird.
Oder es ist so, dass die Hauptsteuerung (also nicht die RC300) intern nen Timer aufzieht (also falls nur 1h möglich ist).

furban

Habe inzwischen den Wiresharke auf der Fritzbox angeworfen. Ist ja Cool das es so was gibt. War mir bisher auch neu.
Und siehe da ich finde diese Zeilen:


value: PUT /dhwCircuits/dhw1/singleChargeSetpoint HTTP/1.1
value: PUT /dhwCircuits/dhw1/chargeDuration HTTP/1.1
value: GET /dhwCircuits/dhw1/charge HTTP/1.1




arnoaugustin

#1144
Zitat von: furban am 02 Februar 2016, 20:16:09
Habe inzwischen den Wiresharke auf der Fritzbox angeworfen. Ist ja Cool das es so was gibt. War mir bisher auch neu.
Und siehe da ich finde diese Zeilen:


value: PUT /dhwCircuits/dhw1/singleChargeSetpoint HTTP/1.1
value: PUT /dhwCircuits/dhw1/chargeDuration HTTP/1.1
value: GET /dhwCircuits/dhw1/charge HTTP/1.1



Auf den "charge" wird ein GET gemacht. Auch interessant. Also erst die Werte setzen und dann charge-URL lesen um das zu aktivieren?
Konntest du noch was in den Frames erkennen? Bzw. was ist an denen anderes als bei anderen Kommandos?
km200 modul liest diese Services als leer ohne Werte/Infos.....

arnoaugustin

Zitat von: Sailor am 02 Februar 2016, 15:05:52
Hallo Arno

Ich habe deine Konfiguration mal verwendet und konnte dein Vierfach-Problem nicht nachvollziehen.
Daher habe ich den Patch (noch) nicht eingebunden, da ich erst gerne die Ursache kennen möchte.

Wenn Du du `ne Ahnung hast, dann melde dich doch mal.
Danke

Gruss
    Sailor

Evtl. könntest Du ja wenigsten in Zeile 2397 vor das aufziehen vom Timer noch ein
RemoveInternalTimer($hash);
setzen. Dann laufen wenigsten keine zwei Timer und alles wird doppelt gepollt. Die Änderung tut niemandem weh und ich muss das Modul nicht immer patchen lassen.
Falls der Timer an der Stelle läuft ist er dann wenigstens nicht doppelt oder mehrfach am laufen. Das DYNARRAY überschreibe ich mir von außen dann selber. Da ist mir egal ob die Sachen mehrfach drin sind.

###START###### Initiate the timer for continuous polling of dynamical values from KM200 ###################START####
                RemoveInternalTimer($hash);
InternalTimer(gettimeofday()+($hash->{INTERVALDYNVAL}), "km200_GetDynService", $hash, 0);
Log3 $name, 4, $name. " : km200 - Define: InternalTimer for dynamic values started with interval of: ".($hash->{INTERVALDYNVAL});
####END####### Initiate the timer for continuous polling of dynamical values from KM200 ####################END#####

Jorge3711

#1146
Ich mal wieder mit meinem vermurksten Km200. Heute FHEM update gemacht und den danach obligatorischen "shutdown restart" durchgeführt und mein FHEM bekommt keine Verbindung zum Km200. Damit mir das Log nicht vollmüllt bis ich das KM200 stromlos machen kann, "attr gb172 disable 1" gesetzt, gespeichert und FHEM neu gestartet.

Trotzdem folgende Zeilen im Log:

2016.02.03 10:22:07 2 : gb172 : km200_ParseHttpResponseInit - ERROR - Service: /dhwCircuits/dhw1/operationMode: No proper Communication with Gateway: read from to http://172.28.135.35:80 timed out
2016.02.03 10:22:07 2 : gb172 : km200_ParseHttpResponseInit - ERROR - Timer restarted to try again in 10s
2016.02.03 10:22:22 2 : gb172 : km200_ParseHttpResponseInit - ERROR - Service: /dhwCircuits/dhw1/operationMode: No proper Communication with Gateway: read from to http://172.28.135.35:80 timed out
2016.02.03 10:22:22 2 : gb172 : km200_ParseHttpResponseInit - ERROR - Timer restarted to try again in 10s
2016.02.03 10:22:37 2 : gb172 : km200_ParseHttpResponseInit - ERROR - Service: /dhwCircuits/dhw1/operationMode: No proper Communication with Gateway: read from to http://172.28.135.35:80 timed out
2016.02.03 10:22:37 2 : gb172 : km200_ParseHttpResponseInit - ERROR - Timer restarted to try again in 10s


Hier ein List meines km200 Devices:


Internals:
   CONSOLEMESSAGE 0
   DEF        172.28.135.35 LALA BUBU
   DELAYDYNVAL 60
   INTERVALDYNVAL 180
   NAME       gb172
   NR         91
   POLLINGTIMEOUT 5
   READBACKDELAY 5000
   STATE      ERROR - Initial Connection failed... Try to re-connect in 10s
   TYPE       km200
   URL        172.28.135.35
   Readings:
     2016-02-03 10:19:46   /dhwCircuits/dhw1/actualTemp 54.8
     2016-02-03 10:19:46   /dhwCircuits/dhw1/currentSetpoint 53
   Secret:
     CRYPTKEYINITIAL ���bZÀ���W޾��П�/��ȟ�;��+
     CRYPTKEYPRIVATE ���bZÀ���Wި'�qq�u��d�����
     KM200ALLSERVICES:
       /
       /dhwCircuits
       /dhwCircuits/dhw1
       /dhwCircuits/dhw1/actualTemp
       /dhwCircuits/dhw1/charge
       /dhwCircuits/dhw1/chargeDuration
       /dhwCircuits/dhw1/cpStartph
       /dhwCircuits/dhw1/cpoperationMode
       /dhwCircuits/dhw1/currentSetpoint
       /dhwCircuits/dhw1/operationMode
       /dhwCircuits/dhw1/singleChargeSetpoint
       /dhwCircuits/dhw1/status
       /dhwCircuits/dhw1/tdMode
       /dhwCircuits/dhw1/tdsetPoint
       /dhwCircuits/dhw1/temperatureLevels
       /dhwCircuits/dhw1/waterFlow
       /dhwCircuits/dhw1/workingTime
       /gateway
       /heatSources
       /heatingCircuits
       /notifications
       /recordings
       /solarCircuits
       /system
     KM200ALLSERVICESBACKUP:
       /
       /dhwCircuits
       /gateway
       /heatSources
       /heatingCircuits
       /notifications
       /recordings
       /solarCircuits
       /system
     KM200DONOTPOLL:
       /system/holidayModes
       /gateway
       /dhwCircuits/dhw1/switchPrograms
     KM200DYNSERVICES:

     KM200RESPONDINGSERVICES:
       /dhwCircuits/dhw1/actualTemp
       /dhwCircuits/dhw1/currentSetpoint
     KM200WRITEABLESERVICES:
   Status:
     FlagDynRequest 0
     FlagGetRequest 0
     FlagInitRequest 1
     FlagSetRequest 0
     FlagStatRequest 0
   Temp:
     JsonRaw    {"id":"/gateway/DateTime","type":"stringValue","writeable":1,"recordable":0,"value":"2016-02-03T10:19:53"}
     ServiceCounterDyn 0
     ServiceCounterInit 9
     decodedcontent
     service    /gateway/DateTime
     Servicedblogsplithash:
       id         /dhwCircuits/dhw1/currentSetpoint
       recordable 0
       type       floatValue
       unitOfMeasure C
       value      53
       writeable  0
Attributes:
   DbLogInclude /system/sensors/temperatures/hotWater_t2,/system/sensors/temperatures/supply_t1,/heatSources/hs1/CHpumpModulation,/system/sensors/temperatures/outdoor_t1,/heatSources/actualPower,/system/appliance/numberOfStarts,/heatSources/actualModulation,/heatSources/numberOfStarts,/heatSources/flameStatus,/dhwCircuits/dhw1/workingTime,/system/appliance/workingTime/centralHeating,/system/appliance/workingTime/totalSystem
   DoNotPoll  /system/holidayModes /gateway /dhwCircuits/dhw1/switchPrograms
   IntervalDynVal 180
   ReadBackDelay 5000
   disable    1
   room       Heizung



Bezgl. den Readings Einmalladung:
Die finden sich alle in der Liste der Readings bei GET. Wg. meinem komischen Km200 kann ich über FHEM aber nichtmal ein "set gb172 /dhwCircuits/dhw1/operationMode high" machen" - es passiert schlicht nix. Ein get vom selben Reading liefert bei mir i.d.R. ein ERROR.

Habe mich in der Zwischenzeit damit abgefunden, dass ich mit dem KM200 lediglich WErte monitoren kann, steuern ist nicht :(

Viele Grüße
Carsten

arnoaugustin

#1147
Zitat von: Jorge3711 am 03 Februar 2016, 10:28:48
Ich mal wieder mit meinem vermurksten Km200. Heute FHEM update gemacht und den danach obligatorischen "shutdown restart" durchgeführt und mein FHEM bekommt keine Verbindung zum Km200. Damit mir das Log nicht vollmüllt bis ich das KM200 stromlos machen kann, "attr gb172 disable 1" gesetzt, gespeichert und FHEM neu gestartet.

Trotzdem folgende Zeilen im Log:

2016.02.03 10:22:07 2 : gb172 : km200_ParseHttpResponseInit - ERROR - Service: /dhwCircuits/dhw1/operationMode: No proper Communication with Gateway: read from to http://172.28.135.35:80 timed out
2016.02.03 10:22:07 2 : gb172 : km200_ParseHttpResponseInit - ERROR - Timer restarted to try again in 10s
2016.02.03 10:22:22 2 : gb172 : km200_ParseHttpResponseInit - ERROR - Service: /dhwCircuits/dhw1/operationMode: No proper Communication with Gateway: read from to http://172.28.135.35:80 timed out
2016.02.03 10:22:22 2 : gb172 : km200_ParseHttpResponseInit - ERROR - Timer restarted to try again in 10s
2016.02.03 10:22:37 2 : gb172 : km200_ParseHttpResponseInit - ERROR - Service: /dhwCircuits/dhw1/operationMode: No proper Communication with Gateway: read from to http://172.28.135.35:80 timed out
2016.02.03 10:22:37 2 : gb172 : km200_ParseHttpResponseInit - ERROR - Timer restarted to try again in 10s


Hier ein List meines km200 Devices:


Internals:
   CONSOLEMESSAGE 0
   DEF        172.28.135.35 LALA BUBU
   DELAYDYNVAL 60
   INTERVALDYNVAL 180
   NAME       gb172
   NR         91
   POLLINGTIMEOUT 5
   READBACKDELAY 5000
   STATE      ERROR - Initial Connection failed... Try to re-connect in 10s
   TYPE       km200
   URL        172.28.135.35
   Readings:
     2016-02-03 10:19:46   /dhwCircuits/dhw1/actualTemp 54.8
     2016-02-03 10:19:46   /dhwCircuits/dhw1/currentSetpoint 53
   Secret:
     CRYPTKEYINITIAL ���bZÀ���W޾��П�/��ȟ�;��+
     CRYPTKEYPRIVATE ���bZÀ���Wި'�qq�u��d�����
     KM200ALLSERVICES:
       /
       /dhwCircuits
       /dhwCircuits/dhw1
       /dhwCircuits/dhw1/actualTemp
       /dhwCircuits/dhw1/charge
       /dhwCircuits/dhw1/chargeDuration
       /dhwCircuits/dhw1/cpStartph
       /dhwCircuits/dhw1/cpoperationMode
       /dhwCircuits/dhw1/currentSetpoint
       /dhwCircuits/dhw1/operationMode
       /dhwCircuits/dhw1/singleChargeSetpoint
       /dhwCircuits/dhw1/status
       /dhwCircuits/dhw1/tdMode
       /dhwCircuits/dhw1/tdsetPoint
       /dhwCircuits/dhw1/temperatureLevels
       /dhwCircuits/dhw1/waterFlow
       /dhwCircuits/dhw1/workingTime
       /gateway
       /heatSources
       /heatingCircuits
       /notifications
       /recordings
       /solarCircuits
       /system
     KM200ALLSERVICESBACKUP:
       /
       /dhwCircuits
       /gateway
       /heatSources
       /heatingCircuits
       /notifications
       /recordings
       /solarCircuits
       /system
     KM200DONOTPOLL:
       /system/holidayModes
       /gateway
       /dhwCircuits/dhw1/switchPrograms
     KM200DYNSERVICES:

     KM200RESPONDINGSERVICES:
       /dhwCircuits/dhw1/actualTemp
       /dhwCircuits/dhw1/currentSetpoint
     KM200WRITEABLESERVICES:
   Status:
     FlagDynRequest 0
     FlagGetRequest 0
     FlagInitRequest 1
     FlagSetRequest 0
     FlagStatRequest 0
   Temp:
     JsonRaw    {"id":"/gateway/DateTime","type":"stringValue","writeable":1,"recordable":0,"value":"2016-02-03T10:19:53"}
     ServiceCounterDyn 0
     ServiceCounterInit 9
     decodedcontent
     service    /gateway/DateTime
     Servicedblogsplithash:
       id         /dhwCircuits/dhw1/currentSetpoint
       recordable 0
       type       floatValue
       unitOfMeasure C
       value      53
       writeable  0
Attributes:
   DbLogInclude /system/sensors/temperatures/hotWater_t2,/system/sensors/temperatures/supply_t1,/heatSources/hs1/CHpumpModulation,/system/sensors/temperatures/outdoor_t1,/heatSources/actualPower,/system/appliance/numberOfStarts,/heatSources/actualModulation,/heatSources/numberOfStarts,/heatSources/flameStatus,/dhwCircuits/dhw1/workingTime,/system/appliance/workingTime/centralHeating,/system/appliance/workingTime/totalSystem
   DoNotPoll  /system/holidayModes /gateway /dhwCircuits/dhw1/switchPrograms
   IntervalDynVal 180
   ReadBackDelay 5000
   disable    1
   room       Heizung



Bezgl. den Readings Einmalladung:
Die finden sich alle in der Liste der Readings bei GET. Wg. meinem komischen Km200 kann ich über FHEM aber nichtmal ein "set gb172 /dhwCircuits/dhw1/operationMode high" machen" - es passiert schlicht nix. Ein get vom selben Reading liefert bei mir i.d.R. ein ERROR.

Habe mich in der Zwischenzeit damit abgefunden, dass ich mit dem KM200 lediglich WErte monitoren kann, steuern ist nicht :(

Viele Grüße
Carsten

Was den operationMode angeht: Was hast Du für eine Steuerung? Das ist bei RC300 und RC35 unterschiedlich.
Das km72 Modul gibt auch leider nicht aus welche Werte für einen Service möglich ist (im Log)
Was sagt den bei dir?
fhem> get <DEINKM200> /dhwCircuits/dhw1/operationMode json
Wenn du das hier in den 73_km200.pm Code einbaust und den verbose Level auf 2 hast, dann kannst Du dir ausgeben lassen, was dein Gateway als Werte haben möchte:


      Log3 $name, 2, "$Service :";
       foreach my $key (keys %{$json}) {
           Log3 $name, 2, "   $key => $json->{$key}";
           if($key =~ /allowed/) {
               foreach my $val (@{$json->{$key}}) {
                   Log3 $name, 2, "      $val";
               }
           }
       }

So bei Zeile 1975 wo folgendes steht. Also vor diesem hier:
                ### Check whether the type is a single value containing a string or float value
                if(($json -> {type} eq "stringValue") || ($json -> {type} eq "floatValue"))

Überall wo im log allowedValues steht, werden die möglichen Werte die das Gateway akzeptiert ausgegeben. Evtl. hilft Dir das weiter.
Sollte man eigentlich mit Loglevel 4 fest ins Modul einbauen. Da tut man sich dann deutlich leichter wenn irgendwelche Werte nicht akzeptiert werden.

Was den Log angeht: Es ist möglich, dass da mehrere Timer gleichzeitig laufen. Sailor wollte das aber erst mal nicht ändern (Ich hatte dazu bereits nen Patch zur Verfügung gestellt - siehe weiter vorne im Thread). Ohne DoNotPoll und ohne disable sollte das mit dem Timer nicht passieren. Da ist halt noch was faul am Code. Ich habe mittlerweile das DoNotPoll weggelassen und mache dieses hier:


define set_km200_dynvalues_at at +00:01:30 { @{$defs{myKM200}{Secret}{KM200DYNSERVICES}}=qw(/system/sensors/temperatures/return /system/sensors/temperatures/supply_t1);; }

myKM200 durch "deinen" ersetzen und die Liste durch deine. Hier wird 1,5 Minuten nach dem Start einfach das Array mit den Poll-Services überschrieben und dann wird auch nur noch das gepollt was da drin steht. Nachträgliches(!) Setzen von disable/DoNotPoll ändern das aber wieder!
OK, ich mach das bei mir noch etwas anders mit userattr und notify usw., so das das konsistent ist. Eigentlich wäre es ne Kleinigkeit das ins KM200-Modul als attribut zu bauen. Ich könnte das auch machen (wenn es dann übernommen wird).
Vorteil der Geschichte: Das mit den Timern passiert nicht. Man kann Services noch per get/set bedienen (was aber nicht geht wenn sie per DoNotPoll rausgeworfen wurden.). Es werden auch wirklich nur die Services gepollt die du angibst. Bei DoNoPoll wurde bei mir /system (als Root-Verzeichnis, obwols da nix zu lesen gibt) immer mit gelesen, da ich den nicht raus werfen kann wenn ich noch andere Werte aus /system brauche.

Bei get/set usw. bin ich mir ja nicht sicher ob die sich mit den Poll-Services in die Quere kommen können, wenn die zwischen rein laufen. Ich würde die hinten weg queuen, wenn gerade ein Poll aktiv ist und diese dann nach dem Polling ausführen.
Vlt. stelle ich mal ein Modul zur Verfügung, wo ich die Sachen eingebaut habe. Evtl. tut man sich damit dann leichter.

Sailor

Hallo Arno

Zitat von: arnoaugustin am 02 Februar 2016, 15:15:36
Bei mir passiert das wenn ich DoNotPoll gesetzt habe. Ich denke, das ist aber auch aus dem Code ersichtlich, da beim Attribut-Setzen auch noch mal ein Timer aufgezogen wird. Beim "define" in der Init-Funktion. Und wenn in der fhem.cfg dann das DoNotPoll attribut kommt wird im Modul nochmal ein Timer aufgezogen. Evtl. liegts auch daran, dass ich nen Dualcore habe und die Threads dann möglicherweise echt parallel laufen....
Falls das der Fall ist, dann sollte das auf einem PC (der ja heute üblicherweise min. 2 Cores hat) auch passiern.

Da wird ja kein neuer Timer aufgezogen, da vorher alle Timer geloescht werden (RemoveInternalTimer($hash))
Das mit dem DualCore waere schoen! Aber ich habe fhem auf einem RasPi II mit 4 Kernen laufen und fhem ist leider immer nur auf einem aktiv.

Ich habe mal den "RemoveInternalTimer" - Befehl weiter nach oben gesetzt. Vielleicht hilft das der ganzen Sache etwas.

Gruss
   Sailor
******************************
Man wird immer besser...

Sailor

Hallo Arno

Zitat von: arnoaugustin am 02 Februar 2016, 15:00:14
Gibt es eigentlich ein Problem, wenn ich ein get mache und das Polling gerade aktiv ist? Das wird ja asynchron ausgeführt. Wenn der Request abgesetzt ist kann FHEM ja weiter laufen und theoretisch könnte ich dran kommen und einen get-Befehl absetzen und wieder im Modul landen?

Das Polling wird mit Rudis "non-blocking-get" gemacht, das "get" wird mit Rudis "blocking-get" gemacht.
Soll heißen, beim Polling wird der Polling - Prozess (und der Rest von fhem) kurzeitig geblockt und läuft dann weiter.

Gruss
    Sailor
******************************
Man wird immer besser...

arnoaugustin

Zitat von: Sailor am 03 Februar 2016, 13:38:49
Hallo Arno

Das Polling wird mit Rudis "non-blocking-get" gemacht, das "get" wird mit Rudis "blocking-get" gemacht.
Soll heißen, beim Polling wird der Polling - Prozess (und der Rest von fhem) kurzeitig geblockt und läuft dann weiter.

Gruss
    Sailor

Was ist wenn das Polling gerade ein HTTP/GET macht und ich ein fhem get auf einen Wert?

arnoaugustin

#1151
Zitat von: Sailor am 03 Februar 2016, 13:34:27
Hallo Arno

Da wird ja kein neuer Timer aufgezogen, da vorher alle Timer geloescht werden (RemoveInternalTimer($hash))
Das mit dem DualCore waere schoen! Aber ich habe fhem auf einem RasPi II mit 4 Kernen laufen und fhem ist leider immer nur auf einem aktiv.

Ich habe mal den "RemoveInternalTimer" - Befehl weiter nach oben gesetzt. Vielleicht hilft das der ganzen Sache etwas.

Gruss
   Sailor

Hallo Sailor,

Beispiel:
fhem.cfg:
define myKM200 usw.
attr   myKM200 DoNotPoll

Sekunde 0:
  fhem ruft km200_Define auf, zieht Timer (jetzt+10,true) für km200_GetInitService auf,
  der dann 10 Sekunden wartet (wozu ist das gut? Hier wird FHEM im Hochlauf nur sinnlos blockiert)
  => fehm ist nach 10 Sekunden wieder dran und ruft km200_GetInitService auf
Sekunde 10:
  km200_GetInitService
  NonBlocking mit get callback=km200_ParseHttpResponseInit wird aufgerufen (Callback, irgendwann)
  FHEM u.U. gleich wieder dran.
  km200_Define wird verlassen.
  attr Befehl wird abgearbeitet => DoNotPoll
  Timer (jetzt+5+1,true) wartet (steht!) 6 Sekunden => km200_GetInitService
Sekunde 16:
  km200_GetInitService von Attr aus.
  NonBlocking get mit callback=km200_ParseHttpResponseInit wird aufgerufen (Callback, irgendwann)

Die "5" als Parameter verstehe ich bei den Timern auch nicht. 0 oder 1 wär mir da ja klar.
Aber so wie ich das sehe hängts davon ab wann der NonBlocking-Call zurückkehrt, ob dann GetInitService 2x läuft und dann Arrayelemente doppelt vorkommen und der DYNService-Timer 2x aufgezogen wird. Evtl. wird der Callback auch erst bedient, wenn die fhem.cfg komplett abgearbeitet ist. Ich weiß ja nicht, wie hier die Aktivitäten wechseln, aber wenn die Callbacks beide quasi gleichzeitig getriggert werden gibts Probleme. Außerdem ist das Verhalten nach dem Code ein anderes, ob ich nach dem Neustart das Device in der fhem.cfg anlege oder nachträglich, da der InternalTimer so wie der gesetzt wird einmal sychron und einmal asynchron zum Code läuft.
$hash->{status}{FlagInitRequest} wird in der einen Funktion zweimal auf true gesetzt und wenn alles gelesen ist auf false, aber nirgendwo abgefragt. Damit könnte man den doppelten Aufruf beim Init auch abfangen.

hier der Code mal aufs Wesentliche zusammengestrichen:
sub km200_Attr(@) {
...
elsif($a[2] eq "DoNotPoll") {
   ...
   RemoveInternalTimer($hash);
   @{$hash->{Secret}{KM200DYNSERVICES}} = "";
   $hash->{temp}{ServiceCounterDyn} = 0;
   InternalTimer(jetzt+polltimeout+1,"km200_GetInitService",$hash,5);
   ...
}


sub km200_Define($$)
{
  ...
  InternalTimer(jetzt+10, "km200_GetInitService", $hash, 5);
}

sub km200_GetInitService($)
{
   if ($ServiceCounterInit == 0)
      RemoveInternalTimer($hash);
   }
   HttpUtils_NonblockingGet(... callback   =>  \&km200_ParseHttpResponseInit)
}

sub km200_ParseHttpResponseInit($)
{
  ...
   if ($ServiceCounterInit < ($NumberInitServices-1))
   {
++$ServiceCounterInit;
km200_GetInitService($hash);
   } else {
        ...
InternalTimer(gettimeofday()+($hash->{INTERVALDYNVAL}), "km200_GetDynService", $hash, 0);
$hash->{temp}{ServiceCounterInit} = false;
  }
}

HarryHase

Kurze Zwischenfrage seit V65 ist in den internals die Modulversion nicht mehr sichtbar, hatte vorher 52, da war sie noch drin; Problem zwischen Tastatur und Stuhllehne?
Grüße hh

-----------------------

Sailor

Hallo Harry

Zitat von: HarryHase am 03 Februar 2016, 22:45:45
Kurze Zwischenfrage seit V65 ist in den internals die Modulversion nicht mehr sichtbar, hatte vorher 52, da war sie noch drin; Problem zwischen Tastatur und Stuhllehne?

Nein, das ist ein generelles Feature, das die Versionsnummern nunmehr vom SVN repository vorgegeben werden und nicht mehr fortlaufend sind.
Du musst jetzt den "version"-Befehl verwenden, um an die Versionsnummer zu kommen.

Aus diesem Grunde habe ich auch den ChangeLog gelöscht.

Gruß
    Sailor
******************************
Man wird immer besser...

Sailor

Hallo Arno

Zitat von: arnoaugustin am 03 Februar 2016, 17:09:23
Sekunde 0:
  fhem ruft km200_Define auf, zieht Timer (jetzt+10,true) für km200_GetInitService auf,
  der dann 10 Sekunden wartet (wozu ist das gut? Hier wird FHEM im Hochlauf nur sinnlos blockiert)

Fhem wird nicht blockiert... Der Timer bzw. GetInitService wird nur zeitverzögert gestartet.
Dies ist ein Erfahrungswert, da es zu Kommunikationsproblemen kommt, wenn ein Init gestartet wird sollte ein "grosses" fhem noch im hochfahren sein.

Nebenbei: Deine Reihenfolge ist nicht ganz korrekt. Der Timer ist ja gerade dafuer da, die Define bereits vorher zu verlassen zu koennen und den Timer im Hintergrund weiterschlafen zu lassen.
Also: Define wird hier schon verlassen

Zitat von: arnoaugustin am 03 Februar 2016, 17:09:23
Sekunde 10:
  km200_GetInitService
  NonBlocking mit get callback=km200_ParseHttpResponseInit wird aufgerufen (Callback, irgendwann)
  FHEM u.U. gleich wieder dran.

Callback wird aufgerufen sobald die km200 Kiste einen Wert zurückgegeben hat oder der Timeout erreicht ist.


Zitat von: arnoaugustin am 03 Februar 2016, 17:09:23
  attr Befehl wird abgearbeitet => DoNotPoll
  Timer (jetzt+5+1,true) wartet (steht!) 6 Sekunden => km200_GetInitService
Sekunde 16:
  km200_GetInitService von Attr aus.
  NonBlocking get mit callback=km200_ParseHttpResponseInit wird aufgerufen (Callback, irgendwann)



Der attr Befehl wird irgendwann ab der Sekunde 0+ abgearbeitet. Hoffentlich vor Ablauf der 10 Sekunden.
Dann kann der Timer vor dem ersten Init geloescht und neu gesetzt werden.


Zitat von: arnoaugustin am 03 Februar 2016, 17:09:23
Die "5" als Parameter verstehe ich bei den Timern auch nicht. 0 oder 1 wär mir da ja klar.

Manche Dinge sind eben Rudi-gegeben. Das muss man so nehmen wie es ist.

Gruß
   Sailor
******************************
Man wird immer besser...