Seite 3 von 3

Re: Umstieg von OH1

Verfasst: 2. Nov 2022 22:12
von uweu
Diese Meldung kommt, wenn man eine Gruppe von Werten anzeigt, in denen der erste Teil des Labels gleich ist, in meinem Fall Temperatur EG, Temperatur OG usw.:

Illegal argument in chart: Series name >Temperatur< has already been used. Use unique names for each series!!!

Das war früher nicht so...


Und das geht auch nicht mehr :

item alt (wird angezeigt):

Code: Alles auswählen

Number	DG_Norden_hoehe	"Nord Pos [%.1f %%]"		{knx="<5.001:10/0/50"}
thing neu:

Code: Alles auswählen

       Thing device aktR4_Abs "Rollos4 Abstell" [ 
         address="1/1/110",
         fetch=false,
         pingInterval=600,
         readInterval=0
      ]  {
            Type rollershutter         : ch1         "Dach Nord"    [ upDown="0/1/65",stopMove="0/1/165" ]
            Type contact               : ch1_auf     "Nord auf"     [ ga="<10/0/51" ]
            Type contact               : ch1_zu      "Nord zu"      [ ga="<10/0/52" ]
            Type number                : pos1        "Nord Pos"	    [ ga="<5.001:10/0/50" ]
         }
item neu (wird nicht angezeigt):

Code: Alles auswählen

Number	DG_Norden_hoehe	"Nord Pos [%.1f %%]"		{ channel="knx:device:bridge:aktR4_Abs:pos1"}

Re: Umstieg von OH1

Verfasst: 3. Nov 2022 08:54
von uweu
Ich bin echt am Verzweifeln, irgendwie läuft gefühlt nix mehr :?

Am Triton auf Komfort gestellt, kommt in OH an:

Code: Alles auswählen

2022-11-03 07:31:47.074 [INFO ] [openhab.event.ItemStateChangedEvent ] - Item 'BA_EG_WZ_Komfort' changed from OFF to ON
2022-11-03 07:31:47.076 [INFO ] [openhab.event.ItemStateChangedEvent ] - Item 'BA_EG_WZ_OH' changed from 2 to 1
2022-11-03 07:31:47.076 [INFO ] [openhab.event.ItemStateChangedEvent ] - Item 'PreBA_EG_WZ_OH' changed from 2 to 1
2022-11-03 07:31:48.333 [INFO ] [openhab.event.ItemStateChangedEvent ] - Item 'TempSoll_EG_WZ' changed from 16.0 to 18.0
2022-11-03 07:31:48.336 [INFO ] [openhab.event.ItemStateChangedEvent ] - Item 'TempStr_EG_WZ' changed from 16,0 °C / 19,9 °C to 18,0 °C / 19,9 °C
Am Triton auf Standby gestellt, kommt in OH an:

Code: Alles auswählen

2022-11-03 07:32:35.682 [INFO ] [openhab.event.ItemStateChangedEvent ] - Item 'BA_EG_WZ_Komfort' changed from ON to OFF
2022-11-03 07:32:35.685 [INFO ] [openhab.event.ItemStateChangedEvent ] - Item 'BA_EG_WZ_OH' changed from 1 to 2
2022-11-03 07:32:35.686 [INFO ] [openhab.event.ItemStateChangedEvent ] - Item 'PreBA_EG_WZ_OH' changed from 1 to 2
2022-11-03 07:32:36.776 [INFO ] [openhab.event.ItemStateChangedEvent ] - Item 'TempSoll_EG_WZ' changed from 18.0 to 16.0
2022-11-03 07:32:36.778 [INFO ] [openhab.event.ItemStateChangedEvent ] - Item 'TempStr_EG_WZ' changed from 18,0 °C / 19,9 °C to 16,0 °C / 19,9 °C
In Openhab auf Komfort gestellt, kommt am Bus nicht an:

Code: Alles auswählen

2022-11-03 07:34:56.966 [INFO ] [openhab.event.ItemCommandEvent      ] - Item 'BA_EG_WZ_OH' received command 1
2022-11-03 07:34:56.968 [INFO ] [openhab.event.ItemStateChangedEvent ] - Item 'BA_EG_WZ_OH' changed from 2 to 1
2022-11-03 07:34:56.971 [INFO ] [openhab.event.ItemStateChangedEvent ] - Item 'PreBA_EG_WZ_OH' changed from 2 to 1
2022-11-03 07:34:56.976 [INFO ] [openhab.event.ItemStateChangedEvent ] - Item 'BA_EG_WZ_Komfort' changed from OFF to ON
Thing:

Code: Alles auswählen

Thing device TriRTR1_EG "Triton WZ" [ 
         address="",
         fetch=false,
         pingInterval=600,
         readInterval=0
      ]  {
            Type number                 : ist1      "Temperatur WZ"                      [ ga="<2/1/100" ]
            Type number                 : soll1     "SollTemp WZ"                        [ ga="<2/1/70" ]
            Type number                 : bsoll1    "BasisSoll WZ"                       [ ga="<2/1/60" ]
            Type switch                 : ba1       "Betriebsart Komfort"                [ ga="<2/0/10" ]
            Type switch                 : ba3       "Betriebsart Nacht"                  [ ga="<2/0/11" ]
            Type switch                 : ba4       "Betriebsart Frost"                  [ ga="<2/0/12" ]
         }
Item:

Code: Alles auswählen

String	TempStr_EG_WZ			"Soll/Ist WZ [%s]"		<heating>
Number	TempIst_EG_WZ			"WZ [%.1f °C]"			<heating>	(G_SollIst,G_IstTemp)	{ channel="knx:device:bridge:TriRTR1_EG:ist1" }
Number	TempSoll_EG_WZ			"WZ_Soll [%.1f °C]" 		<heating>	(G_SollIst,G_SollTemp)	{ channel="knx:device:bridge:TriRTR1_EG:soll1" }
Number	TempBSoll_EG_WZ			"Sollwert WZ [%.1f °C]"		<heating>	(G_BSollTemp)		{ channel="knx:device:bridge:TriRTR1_EG:bsoll1" }
Switch	BA_EG_WZ_Komfort		"Komfort"   			<heating>	(G_BA_Wz_KNX)	    	{ channel="knx:device:bridge:TriRTR1_EG:ba1" }
Switch	BA_EG_WZ_Nacht			"Nacht"		    		<heating>	(G_BA_Wz_KNX)	    	{ channel="knx:device:bridge:TriRTR1_EG:ba3" }
Switch	BA_EG_WZ_Frost			"Frost"		    		<heating>	(G_BA_Wz_KNX)	    	{ channel="knx:device:bridge:TriRTR1_EG:ba4" }
Number	BA_EG_WZ_OH		    	"Betriebsart WZ"		<betriebsart>	(G_BA_Wz_OH)
Number	PreBA_EG_WZ_OH		    "Betriebsart"			<betriebsart>	(G_BA_Wz_OH)
Rules:

Code: Alles auswählen

rule "Betriebsart EG WZ senden"
 when
    Item BA_EG_WZ_OH received command
 then
    var sendModus = 2
    if(receivedCommand instanceof Number)
        sendModus = receivedCommand as Number
    PreBA_EG_WZ_OH.postUpdate(sendModus)

    BA_EG_WZ_Komfort.postUpdate(OFF)
    BA_EG_WZ_Nacht.postUpdate(OFF)
    BA_EG_WZ_Frost.postUpdate(OFF)
    
    switch(sendModus) {
        case 1 : BA_EG_WZ_Komfort.postUpdate(ON)
        case 3 : BA_EG_WZ_Nacht.postUpdate(ON)
        case 4 : BA_EG_WZ_Frost.postUpdate(ON)
    }
end 

rule "Betriebsart EG WZ lesen"
 when
    Member of G_BA_Wz_KNX received update
 then
    var leseModus = 2
    if(BA_EG_WZ_Komfort.state == ON)    leseModus = 1
    else if(BA_EG_WZ_Nacht.state == ON) leseModus = 3
    else if(BA_EG_WZ_Frost.state == ON) leseModus = 4

    BA_EG_WZ_OH.postUpdate(leseModus)
    PreBA_EG_WZ_OH.postUpdate(leseModus)
end
In OH1 läuft es aber in beide Richtungen.
Was mach ich blos falsch???


Edit: könnte es evtl. mit diesem Fehler zu tun haben?
2022-11-03 08:11:41.742 [WARN ] [io.internal.handler.MiIoBasicHandler] - Database entry for model 'S552-00' cannot be found.

Re: Umstieg von OH1

Verfasst: 3. Nov 2022 14:19
von udo1toni
Die Meldung zum Label kann ich so ohne weiteres nicht nachvollziehen. Natürlich müssen sich die Label unterschieden, aber natürlich dürfen Teile des Labels auch gleich lauten. Für Gruppengraphen mussten sich die Labels aber schon immer voneinander unterscheiden, das hängt mit dem erzeugen der Legende zusammen. Eventuell ist das Wort "Temperatur" zu lang, wobei mir nicht bewusst wäre, dass es da Einschränkungen gäbe. Workaround wäre, die Label anzupassen :)

Ein Rollershutter Channel beinhaltet die Parameter upDown, stopMove und position, dafür braucht es keinen separaten number Channel.
Was sind das für Kontakte? Ein vollständiger Rollershuter (normaler Rollladen, keine Jalousie) sähe so aus:

Code: Alles auswählen

       Thing device aktR4_Abs "Rollos4 Abstell" [ 
         address="1/1/110",
         fetch=false,
         pingInterval=600,
         readInterval=0
      ]  {
            Type rollershutter : ch1 "Dach Nord" [ upDown="0/1/65", stopMove="0/1/165", position="<10/0/50" ]
         }
Und passend dazu das Item:

Code: Alles auswählen

Rollershutter  DG_Norden_Roll "Rolll. Nord[%d %%]" { channel="knx:device:bridge:aktR4_Abs:ch1"}
Du kannst die Höhe jederzeit auch unabhängig in einem eigenen Widget anzeigen:

Code: Alles auswählen

Text item=DG_Norden_Roll label="Nord Pos [%d %%]"
aber gewöhnlich wird man die Höhe direkt im zugehörigen Widget zum Steuern des Ladens anzeigen (schon damit das Icon die Höhe dynamisch anzeigt).
Da der Wert eine Ganzzahl sein sollte, wäre die Formatierung über %d sinnvoller als %.1f.


Bezüglich der Umschaltung der Betriebsart von openHAB aus:

Ich habe das ja oben erwähnt, und das Stichwort Triton lässt mich ebenfalls aufhorchen...
postUpdate() wirkt grundsätzlich ausschließlich auf den Status eines Items und führt nicht dazu, dass dieser Status an den Bus geschickt wird.
sendCommand() wirkt grundsätzlich ausschließlich als Befehl und wird neben dem Trigger für die Rules auch an den Bus geschickt.
Das Standardverhalten von openHAB ist jedoch, aus einem sendCommand() den "wahrscheinlichsten" neuen Status des Items zu "schätzen" und umgehend ein passendes postUpdate() auszulösen.
Bei Systemen mit aktiver Rückmeldung des Status sollte man diese Funktion mittels Parameter autoupdate="false" unterbinden.

Du verwendest in Deiner Rule postUpdate() um das Gerät zu steuern, das hat unter openHAB1 so funktioniert, weil das knx1 Binding sich hier falsch verhalten hat.
Das knx2 (bzw. jetzt knx3) Binding verhält sich nun korrekt, das heißt, es wird grundsätzlich ausschließlich sendCommand() zum Bus weitergeleitet und im Gegenzug löst ein Telegramm vom Bus grundsätzlich ein postUpdate() auf das(die) verlinkte(n) Item(s) aus.

Ich habe oben das Wort "grundsätzlich" inflationär benutzt, was daran liegt, dass ich es im juristischen Sinne verwende. "Etwas ist im Grundsatz so", bedeutet, dass es mindestens eine Ausnahme von dieser Regel gibt. Das ist auch hier der Fall.

Das knx2(3) Binding bietet nämlich zusätzliche Channeltypen. Es gibt switch und switch-control, rollershutter und rollershutter-control, number und number-control usw.

Hintergrund ist, dass damit die Richtung der Kommunikation umgekehrt verläuft. Das bedeutet dann, Telegramme, die von openHAB empfangen werden, werden als sendCommand() an die verlinkten Items weitergegeben, umgekehrt sendet openHAB nun ausschließlich postUpdate() an den Bus.

ABER! Bitte setze jetzt nicht einfach switch-control Channel ein, so funktioniert das nämlich nicht. Der Punkt bei *-control Channels ist, dass man damit von knx aus Geräte steuern kann, die in openHAB eingebunden sind, und zwar ohne zusätzliche Rules. Typisches Beispiel wäre ein knx Wandtaster, mit dem man eine HUE Lampe ein- und ausschalten möchte.

Mit switch Channel: Die GA wird als Status gewertet, eine Rule in openHAB reagiert auf das Status Update und sendet ein sendCommand() gegen das HUE Item.
Eine weitere Rule kann dazu verwendet werden, dem knx Bus auf einer anderen GA mitzuteilen, dass die HUE Lampe eingeschaltet ist. Die Rule muss die Status Änderung der HUE auswerten und per sendCommand() an den entsprechenden Channel senden; eventuell wird man den Channel gar separat anlegen müssen, weil es sonst zu doppelten Updates kommt.

Mit switch-control Channel: Status-GA und Steuer-GA werden gemeinsam eingetragen, wobei die Status-GA (die in Richtung knx verwendet wird) als erste GA angegeben wird (knx Regel: nur die erste GA eines KO kann senden).
Der switch-control Channel wird mit dem selben Item verlinkt, welches auch mit der HUE-Lampe verlinkt ist. (dabei kann es sich ausdrücklich auch um ein Dimmer oder Color Item handeln). Ende.
Wenn openHAB den Tastendruck empfängt, wertet es den Tastendruck als Command und leitet dieses an alle verlinkten Items weiter. sendCommand() wird vom HUE Channel ausgewertet und an die Lampe weitergeleitet. Die HUE Lampe meldet die neue Helligkeit als neuen Status. postUpdate() wird vom knx switch-control Channel erkannt und an knx auf der ersten GA gesendet (OFF für Status 0, ON für jeden anderen Status).

Also die normalen Channel für alles, was in knx zuhause ist und entweder seinen Status an openHAB meldet oder von openHAB gesteuert wird.
Die *-control Channel für alles, was in openHAB zuhause ist und von knx gesteuert werden soll (oder wo in knx der Status ausgewertet werden soll).

Zum Beispiel Zeit/Datum:
Ein virtuelles knx Thing (also eines ohne echte Hardware auf knx-Seite), dort folgender Channel:

Code: Alles auswählen

Thing device Virtuell "virtuelle" [ ] {
    Type datetime-control       : wochenzeit "Zeit und Tag" [ ga="10.001:15/7/10" ]
}
Die GA 15/7/10 ist z.B. in allen RTR mit Display und Wochenschaltuhr als Zeitquelle hinterlegt.
Ein Thing für NTP:

Code: Alles auswählen

Thing ntp:ntp:home "Lokale Zeit" [hostname="1.de.pool.ntp.org",refreshInterval=120, refreshNtp=30, locale="de_DE", timeZone="Europe/Berlin"]
Alle zwei Minuten wird der Channel mit einer neuen Zeit beschrieben; jedes dreißigste Mal holt sich das ntp Binding zuvor die genaue Zeit vom angegebenen Server.
Ein Item:

Code: Alles auswählen

DateTime Buszeit "Zeit und Tag" {channel="knx:device:bridge:Virtuell:wochenzeit",channel="ntp:ntp:home:dateTime"}
Das funktionierte unter openHAB1 quasi genauso, allerdings nur durch einen Fehler in der Software :)

Re: Umstieg von OH1

Verfasst: 8. Nov 2022 12:31
von uweu
So, jetzt bin ich mal wieder dazu gekommen etwas an meinem OH zu basteln und mit einem einfachen ändern von postUpdate in sendCommand, läuft meine Betriebsart Rule jetzt. Vielen Dank dafür!

Re: Umstieg von OH1

Verfasst: 11. Nov 2022 23:06
von uweu
Das sind jetzt meine zwei Regeln für alle RTR, glaube so langsam wirds...

Code: Alles auswählen

rule "Betriebsart RTR senden"
 when
    Member of G_BA_OH  received command
 then
	logInfo("RTR_Betriebsart", "+++++++++ Trigger OH +++++++++ " + triggeringItem.name +" | "+ triggeringItem.state)

   val PreName = "Pre"+ triggeringItem.name.toString
   val BaseName = triggeringItem.name.split("_OH").get(0).toString
   val KomfItem = BaseName + "_KNX_Komf"
   val NachtItem = BaseName + "_KNX_Nacht"
   val FrostItem = BaseName + "_KNX_Frost"
   val PreItem = G_PreBA_OH.members.filter[ f | f.name.startsWith(PreName) ].head

   var Integer nMode = 2
   if(triggeringItem.state instanceof Number)  nMode = (triggeringItem.state as Number).intValue
   
   postUpdate(PreItem,nMode)
   sendCommand(KomfItem,"OFF")
   sendCommand(NachtItem,"OFF")
   sendCommand(FrostItem,"OFF")

   switch(nMode) {
      case 1 : sendCommand(KomfItem,"ON")
      case 3 : sendCommand(NachtItem,"ON")
      case 4 : sendCommand(FrostItem,"ON")
   }
end

Code: Alles auswählen

rule "Betriebsart RTR lesen"
 when
    Member of G_BA_KNX changed
 then
 	logInfo("RTR-Betriebsart", "+++++++++ TriggerKNX +++++++++ " + triggeringItem.name +" | "+ triggeringItem.state)
   var BaseName = triggeringItem.name.split("_KNX").get(0)
   var PreName = "Pre"+ BaseName +"_OH"
   var OHName = BaseName + "_OH"
   val PreItem = G_PreBA_OH.members.filter[ f | f.name.startsWith(PreName) ].head
   val OHItem = G_BA_OH.members.filter[ f | f.name.startsWith(OHName) ].head

   var nMode = 2
   if (triggeringItem.state == ON) {
      if(triggeringItem.name.split("_KNX").get(1) == "_Komf")       nMode = 1
      else if(triggeringItem.name.split("_KNX").get(1) == "_Nacht") nMode = 3
      else if(triggeringItem.name.split("_KNX").get(1) == "_Frost") nMode = 4
   }
   postUpdate(OHItem,nMode)
   postUpdate(PreItem,nMode)
end