Hilfe benötigt: TCL/Regascript in Node-RED-Flow/Javascript umwandeln

Node-RED als CCU3/RaspberryMatic Addon, WebApp, HomeKit, ...

Moderator: Co-Administratoren

Garbsen
Beiträge: 295
Registriert: 12.07.2017, 21:08
Hat sich bedankt: 1 Mal
Danksagung erhalten: 14 Mal

Hilfe benötigt: TCL/Regascript in Node-RED-Flow/Javascript umwandeln

Beitrag von Garbsen » 04.12.2020, 17:19

Um meine Solvis-Heizungsanlage auszulesen, nutze ich bisher auf der CCU ein TCL-Script, dass den XML-File ausliest und anschließend aufteilt und die Ergebnisse umgewandelt CCU-Variablen zuweist.
Ich würde das gerne komplett in Redmatic übernehmen.
Das Auslesen des XML-Files habe ich hinbekommen.
<xml><data>AA5555AA056B11110F2201030086021002120133020301CF00E400230046012B006B017501C701C40964003102000000000000000000003700000000000000CC000000646464000000000000640000CF12C32400007608190E01010103040000000202020000CD30000075140C04159B00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000</data>
</xml>
Ich habe aber keine wirkliche Ahnung, wie ich das TCL-Script in Java umsetze.

Code: Alles auswählen

  load tclrega.so

	# tcl-Script für Homematic CCU2
	# Auslesen der Daten der Solvis-Heizung
	# Autor: Wolfgang Roller
	# Stand: 14.04.2015

	# Zusammenfassung der todos:
	# 1) Im tcl-Skript (in der url) Solvisadresse ip-Adresse eintragen
	# 2) Die Url aus dem Skript erst im Browser testen, ob die korrekte Antwort geliefert wird
        #    http://solvisuser:password@ip_der_solvisremote/sc2_val.xml)
	#    Über die Seite ../sc2_val.xml werden die aktuellen Daten der Solvisheizung geliefert.
	# 3) Alle Variablen von Hand in der homematic definieren
	# 4) Im Addons-Verzeichnis ein Verzeichnis anlegen; hier: "solvis"
	# 5) Skript als .tcl in oben angelegtes Verzeichnis kopieren (per FTP-Client z.B. FileZilla)
	# 6) Periodischen Aufruf des Skripts (anhand Trigger) in der gewohnten Art anlegen.
	#    => Ein Programm welches einen Temperatur-Sensor abfragt und eine Systemvariable ansteuert. So erhälst du alle 120-180 Sekunden ein Intervall.
	#		Programm Inhalt:
	#		Wenn:
	#		Gerät - Temperatursensor - Wertebereich größer -20°C - auslösen auf Aktualisierung
	#		Dann:
	#		Systemvariable - Trigger - Wert: Trigger
	#    Statt deines Zeitmoduls nimmst du dann die Systemvariable "Trigger" und wählst dort "auslösen auf Aktualisierung".
	#    Empfehlung von ELV:
	#    kurze zyklische Auslöse-Intervalle sollten nach Möglichkeit vermieden werden.
        # Wir raten ebenfalls zur Antriggerung über die Aktualisierung von Temperatursensoren oder Helligkeitssensoren.
        # Somit entlasten Sie die Zentrale und erreichen ein zyklischen Auslösen der Programme und Scripte.

       	proc hexinzahl {x} {
		# procedure wandelt einstellige Hexadezimalzahl in Dezimalzahl um
		switch $x {
    			F {set x 15}
    			E {set x 14}
                	D {set x 13}
                	C {set x 12}
                	B {set x 11}
                	A {set x 10}
        		default {set x $x}
  			}
		return $x
		}
            
	proc wertergebnis {y} {
		# procedur liefert den Dezimalwert der eingelieferten zweizeichigen Hexadezimalzahl zurück.
		# hierbei werden die erten beiden Hex-Ziffernb mit den letzten beiden vertauscht.
		# procedur ruft zur Übersetzung einzahliger Hexadezimalzahlen die procedure hexinzahl () auf
		set ergebnis [expr (([hexinzahl [string index $y 2]] * 4096) + ([hexinzahl [string index $y 3]] * 256) + ([hexinzahl [string index $y 0]] * 16) + ([hexinzahl [string index $y 1]]))]
		return $ergebnis
		}
		
        proc ausein {x} {
		# procedur liefert den Dezimalwert der eingelieferten zweizeichigen Hexadezimalzahl zurück
		# procedur ruft zur Übersetzung einzahliger Hexadezimalzahlen die procedure hexinzahl () auf
		set ergebnis [expr ((([hexinzahl [string index $x 0]] * 16) + [hexinzahl [string index $x 1]]) / 20)]
		return $ergebnis
		}

	# Variablen:
        #
        # Header:				Pos  11 -  22
        # Uhrzeit:				Pos  23 -  28
        # Anlagentyp:				Pos  29 -  32 AtoH
        # Systemnummer:				Pos  33 -  36 AtoH
    	# S1v Solvis-Warmwasserpuffer		Pos  37 -  40 AtoH value/10 [°C]
        # S2v Solvis-Warmwassertemp		Pos  41 -  44 AtoH value/10 [°C]
	# S3v Solvis-Speicherreferenz		Pos  45 -  48 AtoH value/10 [°C]
        # S4v Solvis-Heizungspuffer_oben	Pos  49 -  52 AtoH value/10 [°C]
        # S5v Solar-Vorlauf			Pos  53 -  56
        # S6v Solar-Rücklauf			Pos  57 -  60
        # S7v Solar-Solardruck			Pos  61 -  64
        # S8v Solar-Kollektortemp		Pos  65 -  68 AtoH value/10 [°C]
        # S9v Solvis-Heizungspuffer_unten	Pos  69 -  72 AtoH value/10 [°C]
        # S10v Solvis-Außentemp			Pos  73 -  76 AtoH value/10 [°C]
        # S11v Solvis-Zirkulationstemp		Pos  77 -  80 AtoH value/10 [°C]
        # S12v Solvis-Heizungs-Vorlauftemp	Pos  81 -  84 AtoH value/10 [°C]
        # S13v Solvis-Heizungs-Vorlauftemp_HK2	Pos  85 -  88 AtoH value/10 [°C]
	# S14v unbelegt				Pos  89 -  92
        # S15v unbelegt				Pos  93 -  96
        # S16v Solvis-Heizungs-Vorlauftemp_HK3	Pos  97 - 100 AtoH value/10 [°C]
        # S18v Durchfluss			Pos 101 - 104 AtoH [l/h]
        # S17v Solar-Durchfluss			Pos 105 - 108 AtoH value/10 [l/h]
        # AnalogIn1				Pos 109 - 112
        # AnalogIn2				Pos 113 - 116
        # AnalogIn3				Pos 117 - 120
        # AnalogOut1				Pos 121 - 124
        # AnalogOut2				Pos 125 - 128
        # AnalogOut3				Pos 129 - 132
        # AnalogOut4				Pos 133 - 136
        # RF1 Raumfühler1			Pos 137 - 140 AtoH value/10 [°C]
        # (RF2 Raumfühler2			Pos 141 - 144 AtoH value/10 [°C])
        # (RF3 Raumfühler3			Pos 145 - 148 AtoH value/10 [°C])
        # A1v Solar-Zirkulationspumpe			Pos 141 - 142 0=AUS; 1=EIN
        # A2v Solvis-		Pos 143 - 144 0=AUS; 1=EIN
        # A3v Solvis-HK1-Pumpe 		Pos 145 - 146 0=AUS; 1=EIN
        # A4v Solvis-HK2-Pumpe		Pos 147 - 148 0=AUS; 1=EIN
        # A5v Solvis-HK3-Pumpe		Pos 149 - 150 0=AUS; 1=EIN
        # A6v Solvis-		Pos 151 - 152 0=AUS; 1=EIN
        # A7v unbelegt				Pos 153 - 154
        # A8v Solvis-HK1Misch_auf		Pos 155 - 156 0=AUS; 1=EIN
        # A9v Solvis-HK1Misch_zu		Pos 157 - 158 0=AUS; 1=EIN
        # A10v Solvis-HK2Misch_auf		Pos 159 - 160 0=AUS; 1=EIN
        # A11v Solvis-HK2Misch_zu		Pos 161 - 162 0=AUS; 1=EIN
        # A12v Solvis-Brenner			Pos 163 - 164 0=AUS; 1=EIN
        # A13v unbelegt				Pos 165 - 166
        # A14v Solvis-Entstörung		Pos 167 - 168 0=AUS; <>0=EIN
        # Werte überspringen			Pos 169 - 184
        # SEv Solarertrag			Pos 185 - 189 AtoH [kWh]
        # Werte überspringen 			Pos 190 - 219
        # SLv Solarleistung			Pos 220 - 223 AtoH value/10 [kW]
       
	# *** HIER die URL von Solvis-Remote eintragen
	
	set url http://xxxx:xxx@192.168.xxx.xx/sc2_val.xml
	exec /usr/bin/wget -q -O /usr/local/addons/solvis/solvisaktuell.xml $url

	# Öffnen der Datei und Zuordnung zur Variablemn $input
	set f [open "/usr/local/addons/solvis/solvisaktuell.xml"]
	set input [read $f]
	close $f

	# Verarbeitung
        
        
	set S1v [expr ([wertergebnis [string range $input 37 40]] + 0.1) /10 - 0.01]
        #S1v Solvis-Warmwasserpuffer
        
	set S2v [expr ([wertergebnis [string range $input 41 44]] + 0.1) /10 - 0.01]
        #S2v Solvis-Warmwassertemp
        
	set S3v [expr ([wertergebnis [string range $input 45 48]] + 0.1) /10 - 0.01]
        #S3v Solvis-Speicherreferenz
        
	set S4v [expr ([wertergebnis [string range $input 49 52]] + 0.1) /10 - 0.01]
        #S4v Solvis-Heizungspuffer_oben
        
	set S5v [expr ([wertergebnis [string range $input 53 56]] + 0.1) /10 - 0.01]
        #S5v Solar-Vorlauf2
        
	set S6v [expr ([wertergebnis [string range $input 57 60]] + 0.1) /10 - 0.01]
        #S6v Solar-Rücklauf
        
	set S7v [expr ([wertergebnis [string range $input 61 64]] + 0.1) /10 - 0.01]
        #S7v Solar-Vorlauf1
        
	set S8v [expr ([wertergebnis [string range $input 65 68]] + 0.1) /10 - 0.01]
        #S8v Solar-Kollektortemp
        
	set S9v [expr ([wertergebnis [string range $input 69 72]] + 0.1) /10 - 0.01]
        #S9v Solvis-Heizungspuffer_unten
        
	set S10v [expr ([wertergebnis [string range $input 73 76]] + 0.1) /10 - 0.01]
        #S10v Solvis-Außentemp
        
	set S11v [expr ([wertergebnis [string range $input 77 80]] + 0.1) /10 - 0.01]
        #S11v Solvis-Zirkulationstemp
        
	set S12v [expr ([wertergebnis [string range $input 81 84]] + 0.1) /10 - 0.01]
        #S12v Solvis-Heizungs-Vorlauftemp_HK1
        
    set S13v [expr ([wertergebnis [string range $input 85 88]] + 0.1) /10 - 0.01]
        #S13v Solvis-Heizungs-Vorlauftemp_HK2
        
	#set S14v [expr ([wertergebnis [string range $input 89 92]] + 0.1) /10 - 0.01]
        #unbenutzt
        
	set S15v [expr ([wertergebnis [string range $input 93 96]] + 0.1) /10 - 0.01]
        #Solvis-Kaltwassertemperatur: $S15v
        
	set S16v [expr ([wertergebnis [string range $input 97 100]] + 0.1) /10 - 0.01]
        #S16v Solvis-Heizungs-Vorlauftemp_HK3
	
	set S17v [wertergebnis [string range $input 105 108]]
        #S17v Solar-Durchfluss
        
    set S18v [wertergebnis [string range $input 101 104]]
        #S18v Solvis-Warmwasser_Durchfluss
        
	set AI1 [wertergebnis [string range $input 109 112]]
        #puts "AI1: $AI1 - ([string range $input 109 112])"
        
	set AI2 [wertergebnis [string range $input 113 116]]
        #puts "AI2: $AI2 - ([string range $input 113 116])"
        
	set AI3 [wertergebnis [string range $input 117 120]]
        #puts "AI3: $AI3 - ([string range $input 117 120])"
        
	set AO1 [wertergebnis [string range $input 121 124]]
        #AO1 Solvis-Brenner
        
	set AO2 [wertergebnis [string range $input 125 128]]
        #AO2 Solvis-Warmwasserpumpe
        
	set AO3 [wertergebnis [string range $input 129 132]]
        #puts "AO3 : $AO3 - ([string range $input 129 132])"
        
	set AO4 [wertergebnis [string range $input 133 136]]
        #puts "AO4: $AO4 - ([string range $input 133 136])"
        
	set RF1 [expr ([wertergebnis [string range $input 137 140]] + 0.1) /10 - 0.01]
        #puts "RF1 Raumfühler1: $RF1 - ([string range $input 137 140])"
        
	#set RF2 [expr ([wertergebnis [string range $input 141 144]] + 0.1) /10 - 0.01]
        #RF2 Raumfühler2
        
	#set RF3 [expr ([wertergebnis [string range $input 145 148]] + 0.1) /10 - 0.01]
        #RF3 Raumfühler3
        
	set A1v [ausein [string range $input 141 142]]
        #A1v Solvis-Zirkulationspumpe
        
        
	set A2v [ausein [string range $input 143 144]]
        #A2v unbenutzt
        
	set A3v [ausein [string range $input 145 146]]
        #A3v Solvis-HK1-Pumpe
        
	set A4v [ausein [string range $input 147 148]]
        #A4v Solvis-HK2-Pumpe
        
	set A5v [ausein [string range $input 149 150]]
        #A5v Solvis-HK3-Pumpe
        
	set A6v [ausein [string range $input 151 152]]
        #A6v HK3_Mischer_auf
        
	set A7v [ausein [string range $input 153 154]]
        #A7v HK3_Mischer_zu
        
	set A8v [ausein [string range $input 155 156]]
        #A8v HK1_Mischer_auf
        
	set A9v [ausein [string range $input 157 158]]
        #A9v HK1_Mischer_zu
        
	set A10v [ausein [string range $input 159 160]]
        #A10v HK2_Mischer_auf
        
	set A11v [ausein [string range $input 161 162]]
        #A11v HK2_Mischer_zu
        
	set A12v [ausein [string range $input 163 164]]
        #A12v Solvis-Brenner
        
	set A13v [ausein [string range $input 165 166]]
        #puts "A13v: $A13v - ([string range $input 165 166])"
        
	#set A14v [ausein [string range $input 167 168]]
        #A14v Solvis-Entstörung - nicht genutzt
        
	set SEv [wertergebnis [string range $input 185 188]]
        #puts "SEv Solarertrag: $SEv - ([string range $input 185 188])"
        
	set SLv [expr ([wertergebnis [string range $input 220 223]] + 0.1) /10 - 0.01]
        #SLv Solarthermie-Leistung
        
        set SLv1 [expr ([wertergebnis [string range $input 224 227]] + 0.1) /10 - 0.01]
        
         set SLv2 [expr ([wertergebnis [string range $input 228 231]] + 0.1) /10 - 0.01]
         
	 set SLv3 [expr ([wertergebnis [string range $input 232 235]] + 0.1) /10 - 0.01]
        
       

        # Umlaute korrigieren
	
        # set ReGaHss variables
        set rega_cmd ""
        append rega_cmd "dom.GetObject('Solvis-Warmwasserpuffer').State($S1v);"
        append rega_cmd "dom.GetObject('Solvis-Warmwassertemp').State($S2v);"
        append rega_cmd "dom.GetObject('Solvis-Speicherreferenz').State($S3v);"
        append rega_cmd "dom.GetObject('Solvis-Heizungspuffer_oben').State($S4v);"
        append rega_cmd "dom.GetObject('Solar-Vorlauf2').State($S5v);"
        append rega_cmd "dom.GetObject('Solar-Ruecklauf').State($S6v);"
        append rega_cmd "dom.GetObject('Solar-Vorlauf1').State($S7v);"
        append rega_cmd "dom.GetObject('Solar-Kollektortemp').State($S8v);"
        append rega_cmd "dom.GetObject('Solvis-Heizungspuffer_unten').State($S9v);"
        append rega_cmd "if ($S10v >100.0) {dom.GetObject('Solvis-Aussentemp').State($S10v - 6553.5);} else {dom.GetObject('Solvis-Aussentemp').State($S10v);}"
        #append rega_cmd "dom.GetObject('Solvis-Aussentemp').State($S10v);"
        append rega_cmd "dom.GetObject('Solvis-Zirkulationstemp').State($S11v);"
        append rega_cmd "dom.GetObject('Solvis-Heizungs-Vorlauftemp_HK1').State($S12v);"
        append rega_cmd "dom.GetObject('Solvis-Heizungs-Vorlauftemp_HK2').State($S13v);"
        #append rega_cmd "dom.GetObject('Solvis-Entstoerung').State($A14v);"
        append rega_cmd "dom.GetObject('Solvis-Kaltwassertemperatur').State($S15v);"
        append rega_cmd "dom.GetObject('Solvis-Heizungs-Vorlauftemp_HK3').State($S16v);"
        append rega_cmd "dom.GetObject('Solar-Durchfluss').State($S17v);"
        append rega_cmd "dom.GetObject('Solvis-Warmwasser_Durchfluss').State($S18v);"
        
        append rega_cmd "dom.GetObject('Solvis-RF3').State($RF1);"
        
       	append rega_cmd "dom.GetObject('Solar-Ertrag').State($SEv);"
        append rega_cmd "dom.GetObject('Solarthermie-Leistung').State($AI2);"
        
        append rega_cmd "dom.GetObject('Solvis-Zirkulationspumpe').State($A1v);"
        append rega_cmd "dom.GetObject('Solvis-HK1-Pumpe').State($A3v);"
        append rega_cmd "dom.GetObject('Solvis-HK2-Pumpe').State($A4v);"
        append rega_cmd "dom.GetObject('Solvis-HK3-Pumpe').State($A5v);"
        append rega_cmd "dom.GetObject('Solvis-HK3_Mischer_auf').State($A6v);"
        append rega_cmd "dom.GetObject('Solvis-HK3_Mischer_zu').State($A7v);"
        append rega_cmd "dom.GetObject('Solvis-HK1_Mischer_auf').State($A8v);"
        append rega_cmd "dom.GetObject('Solvis-HK1_Mischer_zu').State($A9v);"
        append rega_cmd "dom.GetObject('Solvis-HK2_Mischer_auf').State($A10v);"
        append rega_cmd "dom.GetObject('Solvis-HK2_Mischer_zu').State($A11v);"
        
        append rega_cmd "dom.GetObject('Solvis-Brenner').State($AO1);"
        append rega_cmd "dom.GetObject('Solvis-Warmwasserpumpe').State($AO2);"
        
        
        #Korrektur Variable Außentemperatur bei Werten unter null
        #var temp = dom.GetObject('Solvis-Aussentemp');
        #if (temp>=3276.8) {temp=temp - 6553.5;};
        #dom.GetObject('Solvis-Aussentemp').State(temp);
        

	rega_script $rega_cmd
Kann mich hier jemand „zum Jagen tragen“? Ich würde gerne die einzelnen Werte direkt in eine global.Variable eintragen

Danke vorab für jeden Tipp.
K-H
Zuletzt geändert von hobbyquaker am 05.12.2020, 12:28, insgesamt 1-mal geändert.
Grund: Überschrift präzisiert/korrigiert
512 Kanäle in 101 Geräten und 145 CUxD-Kanäle in 19 CUxD-Geräten:
--------------------------------------------
http://www.eq-3.de/service/downloads.html
Tips und Tricks für Anfänger: viewtopic.php?t=22801
Programmlogik: viewtopic.php?f=31&t=4251
Webui-Handbuch: https://www.eq-3.de/Downloads/eq3/downl ... h_eQ-3.pdf
Script und Linksammlung: viewtopic.php?f=26&t=27907

ptweety
Beiträge: 522
Registriert: 07.01.2017, 16:48
System: Alternative CCU (auf Basis OCCU)
Hat sich bedankt: 48 Mal
Danksagung erhalten: 66 Mal

Re: Hilfe benötigt: TCL in Java umwandeln

Beitrag von ptweety » 04.12.2020, 23:06

Keine Ahnung, ob die Werte so passen, aber versuche mal damit den Anfang zu machen:

Code: Alles auswählen

[{"id":"fb4d81b2.8261a","type":"inject","z":"3f23c98c.dbb316","name":"","props":[{"p":"payload"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"<xml><data>AA5555AA056B11110F2201030086021002120133020301CF00E400230046012B006B017501C701C40964003102000000000000000000003700000000000000CC000000646464000000000000640000CF12C32400007608190E01010103040000000202020000CD30000075140C04159B00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000</data> </xml>","payloadType":"str","x":240,"y":220,"wires":[["cb384001.908f"]]},{"id":"7956ba6e.5a14a4","type":"debug","z":"3f23c98c.dbb316","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"true","targetType":"full","statusVal":"","statusType":"auto","x":790,"y":220,"wires":[]},{"id":"cb384001.908f","type":"xml","z":"3f23c98c.dbb316","name":"","property":"payload","attr":"","chr":"","x":410,"y":220,"wires":[["638ad98e.132a78"]]},{"id":"638ad98e.132a78","type":"change","z":"3f23c98c.dbb316","name":"","rules":[{"t":"set","p":"payload.start","pt":"msg","to":"$parseInteger($string(\"0x\"&$substring(payload.xml.data[0],0,10)),'0')","tot":"jsonata"},{"t":"set","p":"payload.header","pt":"msg","to":"$parseInteger($string(\"0x\"&$substring(payload.xml.data[0],11,12)),'0')","tot":"jsonata"},{"t":"set","p":"payload.uhrzeit","pt":"msg","to":"$fromMillis($parseInteger($string(\"0x\"&$substring(payload.xml.data[0],23,6)),'0'),'[h01]:[m01]')","tot":"jsonata"},{"t":"set","p":"payload.anlagentyp","pt":"msg","to":"$parseInteger($string(\"0x\"&$substring(payload.xml.data[0],29,4)),'0')","tot":"jsonata"},{"t":"set","p":"payload.systemnummer","pt":"msg","to":"$parseInteger($string(\"0x\"&$substring(payload.xml.data[0],33,4)),'0')","tot":"jsonata"},{"t":"set","p":"payload.s1v","pt":"msg","to":"$parseInteger($string(\"0x\"&$substring(payload.xml.data[0],37,4)),'0')","tot":"jsonata"},{"t":"set","p":"payload.s2v","pt":"msg","to":"$parseInteger($string(\"0x\"&$substring(payload.xml.data[0],41,4)),'0')","tot":"jsonata"},{"t":"set","p":"payload.s3v","pt":"msg","to":"$parseInteger($string(\"0x\"&$substring(payload.xml.data[0],45,4)),'0')","tot":"jsonata"},{"t":"set","p":"payload.s4v","pt":"msg","to":"$parseInteger($string(\"0x\"&$substring(payload.xml.data[0],49,4)),'0')","tot":"jsonata"}],"action":"","property":"","from":"","to":"","reg":false,"x":600,"y":220,"wires":[["7956ba6e.5a14a4"]]}]

Garbsen
Beiträge: 295
Registriert: 12.07.2017, 21:08
Hat sich bedankt: 1 Mal
Danksagung erhalten: 14 Mal

Re: Hilfe benötigt: TCL/Regascript in Node-RED-Flow/Javascript umwandeln

Beitrag von Garbsen » 07.12.2020, 18:41

Zunächst danke und sorry für die späte Antwort, hatte vergessen mich benachrichtigen zu lassen.
Ich schaue mir das mal an und gucke, wie es passt.
Nochmals danke
512 Kanäle in 101 Geräten und 145 CUxD-Kanäle in 19 CUxD-Geräten:
--------------------------------------------
http://www.eq-3.de/service/downloads.html
Tips und Tricks für Anfänger: viewtopic.php?t=22801
Programmlogik: viewtopic.php?f=31&t=4251
Webui-Handbuch: https://www.eq-3.de/Downloads/eq3/downl ... h_eQ-3.pdf
Script und Linksammlung: viewtopic.php?f=26&t=27907

Garbsen
Beiträge: 295
Registriert: 12.07.2017, 21:08
Hat sich bedankt: 1 Mal
Danksagung erhalten: 14 Mal

Re: Hilfe benötigt: TCL in Java umwandeln

Beitrag von Garbsen » 07.12.2020, 20:12

ptweety hat geschrieben:
04.12.2020, 23:06
Keine Ahnung, ob die Werte so passen, aber versuche mal damit den Anfang zu machen:

Code: Alles auswählen

[{"id":"fb4d81b2.8261a","type":"inject","z":"3f23c98c.dbb316","name":"","props":[{"p":"payload"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"<xml><data>AA5555AA056B11110F2201030086021002120133020301CF00E400230046012B006B017501C701C40964003102000000000000000000003700000000000000CC000000646464000000000000640000CF12C32400007608190E01010103040000000202020000CD30000075140C04159B00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000</data> </xml>","payloadType":"str","x":240,"y":220,"wires":[["cb384001.908f"]]},{"id":"7956ba6e.5a14a4","type":"debug","z":"3f23c98c.dbb316","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"true","targetType":"full","statusVal":"","statusType":"auto","x":790,"y":220,"wires":[]},{"id":"cb384001.908f","type":"xml","z":"3f23c98c.dbb316","name":"","property":"payload","attr":"","chr":"","x":410,"y":220,"wires":[["638ad98e.132a78"]]},{"id":"638ad98e.132a78","type":"change","z":"3f23c98c.dbb316","name":"","rules":[{"t":"set","p":"payload.start","pt":"msg","to":"$parseInteger($string(\"0x\"&$substring(payload.xml.data[0],0,10)),'0')","tot":"jsonata"},{"t":"set","p":"payload.header","pt":"msg","to":"$parseInteger($string(\"0x\"&$substring(payload.xml.data[0],11,12)),'0')","tot":"jsonata"},{"t":"set","p":"payload.uhrzeit","pt":"msg","to":"$fromMillis($parseInteger($string(\"0x\"&$substring(payload.xml.data[0],23,6)),'0'),'[h01]:[m01]')","tot":"jsonata"},{"t":"set","p":"payload.anlagentyp","pt":"msg","to":"$parseInteger($string(\"0x\"&$substring(payload.xml.data[0],29,4)),'0')","tot":"jsonata"},{"t":"set","p":"payload.systemnummer","pt":"msg","to":"$parseInteger($string(\"0x\"&$substring(payload.xml.data[0],33,4)),'0')","tot":"jsonata"},{"t":"set","p":"payload.s1v","pt":"msg","to":"$parseInteger($string(\"0x\"&$substring(payload.xml.data[0],37,4)),'0')","tot":"jsonata"},{"t":"set","p":"payload.s2v","pt":"msg","to":"$parseInteger($string(\"0x\"&$substring(payload.xml.data[0],41,4)),'0')","tot":"jsonata"},{"t":"set","p":"payload.s3v","pt":"msg","to":"$parseInteger($string(\"0x\"&$substring(payload.xml.data[0],45,4)),'0')","tot":"jsonata"},{"t":"set","p":"payload.s4v","pt":"msg","to":"$parseInteger($string(\"0x\"&$substring(payload.xml.data[0],49,4)),'0')","tot":"jsonata"}],"action":"","property":"","from":"","to":"","reg":false,"x":600,"y":220,"wires":[["7956ba6e.5a14a4"]]}]
Hallo

Nochmals Danke, auch wenn es so noch nicht passt, hat es mich vorangebracht.
Problem ist, dass die vierstelligen hex-Zahlen nicht in der Form 1234 sondern erst nach Tausch zu 3412 umgewandelt werden dürfen.
Diesen Tausch der Poaitionen würde ich am liebsten in ein function machen. Ich dachte, dass deine parseInteger Formel aus dem change Node auch in eine Funktion funktionieren würde, das schaffe ich aber nicht. Weißt Du, wie ich innerhalb einer function Node hex in Dezimal umwandle?
512 Kanäle in 101 Geräten und 145 CUxD-Kanäle in 19 CUxD-Geräten:
--------------------------------------------
http://www.eq-3.de/service/downloads.html
Tips und Tricks für Anfänger: viewtopic.php?t=22801
Programmlogik: viewtopic.php?f=31&t=4251
Webui-Handbuch: https://www.eq-3.de/Downloads/eq3/downl ... h_eQ-3.pdf
Script und Linksammlung: viewtopic.php?f=26&t=27907

ptweety
Beiträge: 522
Registriert: 07.01.2017, 16:48
System: Alternative CCU (auf Basis OCCU)
Hat sich bedankt: 48 Mal
Danksagung erhalten: 66 Mal

Re: Hilfe benötigt: TCL/Regascript in Node-RED-Flow/Javascript umwandeln

Beitrag von ptweety » 08.12.2020, 10:09

Ok, jetzt mal mit einem etwas anderen Ansatz. Ich hoffe, dass du die Logik hier einfach nachvollziehen kannst.

Code: Alles auswählen

[{"id":"fb4d81b2.8261a","type":"inject","z":"7bf7e46b.d251a4","name":"","props":[{"p":"payload"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"<xml><data>AA5555AA056B11110F2201030086021002120133020301CF00E400230046012B006B017501C701C40964003102000000000000000000003700000000000000CC000000646464000000000000640000CF12C32400007608190E01010103040000000202020000CD30000075140C04159B00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000</data> </xml>","payloadType":"str","x":320,"y":220,"wires":[["cb384001.908f"]]},{"id":"7956ba6e.5a14a4","type":"debug","z":"7bf7e46b.d251a4","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"true","targetType":"full","statusVal":"","statusType":"auto","x":870,"y":220,"wires":[]},{"id":"cb384001.908f","type":"xml","z":"7bf7e46b.d251a4","name":"","property":"payload","attr":"","chr":"","x":490,"y":220,"wires":[["638ad98e.132a78"]]},{"id":"638ad98e.132a78","type":"change","z":"7bf7e46b.d251a4","name":"","rules":[{"t":"set","p":"payload.xmldata1","pt":"msg","to":"$match($substring(payload.xml.data[0],36,152),/.{1,2}/).(\t    {\t        \"index\": $.index + 37,\t        \"match\": $.match,\t        \"number\": (\"0x\"&$.match).$parseInteger($,'0')     \t    } \t)","tot":"jsonata"},{"t":"set","p":"payload.xmldata2","pt":"msg","to":"$match($substring(payload.xml.data[0],220,16),/.{1,2}/).(\t    {\t        \"index\": $.index + 220,\t        \"match\": $.match,\t        \"number\": (\"0x\"&$.match).$parseInteger($,'0')     \t    } \t)","tot":"jsonata"},{"t":"set","p":"payload.result","pt":"msg","to":"(\t    $a := payload.xmldata1;\t    $b := payload.xmldata2;\t\t    $wertergebnis := function($x, $y) { $y.number * 100 + $x.number };\t    $ausein := function($x) { $x.number / 20 };\t\t    {\t\t        \"s1v\": $wertergebnis($a[index=37], $a[index=39])/10,\t        \"s2v\": $wertergebnis($a[index=41], $a[index=43])/10,\t        \"s3v\": $wertergebnis($a[index=45], $a[index=47])/10,\t        \"s4v\": $wertergebnis($a[index=49], $a[index=51])/10,\t        \"s5v\": $wertergebnis($a[index=53], $a[index=55])/10,\t        \"s6v\": $wertergebnis($a[index=57], $a[index=59])/10,\t        \"s7v\": $wertergebnis($a[index=61], $a[index=63])/10,\t        \"s8v\": $wertergebnis($a[index=65], $a[index=67])/10,\t        \"s9v\": $wertergebnis($a[index=69], $a[index=71])/10,\t        \"s10v\": $wertergebnis($a[index=73], $a[index=75])/10,\t        \"s11v\": $wertergebnis($a[index=77], $a[index=79])/10,\t        \"s12v\": $wertergebnis($a[index=81], $a[index=83])/10,\t        \"s13v\": $wertergebnis($a[index=85], $a[index=87])/10,\t        \"s14v\": $wertergebnis($a[index=89], $a[index=91])/10,\t        \"s15v\": $wertergebnis($a[index=93], $a[index=95])/10,\t        \"s16v\": $wertergebnis($a[index=97], $a[index=99])/10,\t        \"s17v\": $wertergebnis($a[index=105], $a[index=107]),\t        \"s18v\": $wertergebnis($a[index=101], $a[index=103]),\t        \"ai1\": $wertergebnis($a[index=109], $a[index=111]),\t        \"ai2\": $wertergebnis($a[index=113], $a[index=115]),\t        \"ai3\": $wertergebnis($a[index=117], $a[index=119]),\t        \"ao1\": $wertergebnis($a[index=121], $a[index=123]),\t        \"ao2\": $wertergebnis($a[index=125], $a[index=127]),\t        \"ao3\": $wertergebnis($a[index=129], $a[index=131]),\t        \"ao4\": $wertergebnis($a[index=133], $a[index=135]),\t        \"rf1\": $wertergebnis($a[index=137], $a[index=139])/10,\t        /* \"rf2\": $wertergebnis($a[index=141], $a[index=143])/10, */\t        /* \"rf3\": $wertergebnis($a[index=145], $a[index=147])/10, */\t        \"a1v\": $ausein($a[index=141]),\t        \"a2v\": $ausein($a[index=143]),\t        \"a3v\": $ausein($a[index=145]),\t        \"a4v\": $ausein($a[index=147]),\t        \"a5v\": $ausein($a[index=149]),\t        \"a6v\": $ausein($a[index=151]),\t        \"a7v\": $ausein($a[index=153]),\t        \"a8v\": $ausein($a[index=155]),\t        \"a9v\": $ausein($a[index=157]),\t        \"a10v\": $ausein($a[index=159]),\t        \"a11v\": $ausein($a[index=161]),\t        \"a12v\": $ausein($a[index=163]),\t        \"a13v\": $ausein($a[index=165]),\t        /* \"a14v\": $ausein($a[index=167]), */\t        \"sev\": $wertergebnis($a[index=185], $a[index=187])/10,\t        \"slv\": $wertergebnis($b[index=220], $b[index=222])/10,\t        \"slv1\": $wertergebnis($b[index=224], $b[index=226])/10,\t        \"slv2\": $wertergebnis($b[index=228], $b[index=230])/10,\t        \"slv3\": $wertergebnis($b[index=232], $b[index=234])/10\t    }\t)","tot":"jsonata"},{"t":"set","p":"payload.result2","pt":"msg","to":"(\t    $a := payload.xmldata1;\t    $b := payload.xmldata2;\t\t    $wertergebnis := function($x, $y) { $y.number * 100 + $x.number };\t    $ausein := function($x) { $x.number / 20 };\t\t    {\t        \"sv\" : {\t            \"s1v\": $wertergebnis($a[index=37], $a[index=39])/10,\t            \"s2v\": $wertergebnis($a[index=41], $a[index=43])/10,\t            \"s3v\": $wertergebnis($a[index=45], $a[index=47])/10,\t            \"s4v\": $wertergebnis($a[index=49], $a[index=51])/10,\t            \"s5v\": $wertergebnis($a[index=53], $a[index=55])/10,\t            \"s6v\": $wertergebnis($a[index=57], $a[index=59])/10,\t            \"s7v\": $wertergebnis($a[index=61], $a[index=63])/10,\t            \"s8v\": $wertergebnis($a[index=65], $a[index=67])/10,\t            \"s9v\": $wertergebnis($a[index=69], $a[index=71])/10,\t            \"s10v\": $wertergebnis($a[index=73], $a[index=75])/10,\t            \"s11v\": $wertergebnis($a[index=77], $a[index=79])/10,\t            \"s12v\": $wertergebnis($a[index=81], $a[index=83])/10,\t            \"s13v\": $wertergebnis($a[index=85], $a[index=87])/10,\t            \"s14v\": $wertergebnis($a[index=89], $a[index=91])/10,\t            \"s15v\": $wertergebnis($a[index=93], $a[index=95])/10,\t            \"s16v\": $wertergebnis($a[index=97], $a[index=99])/10,\t            \"s17v\": $wertergebnis($a[index=105], $a[index=107]),\t            \"s18v\": $wertergebnis($a[index=101], $a[index=103])\t        }, \"ai\": {\t            \"ai1\": $wertergebnis($a[index=109], $a[index=111]),\t            \"ai2\": $wertergebnis($a[index=113], $a[index=115]),\t            \"ai3\": $wertergebnis($a[index=117], $a[index=119])\t        }, \"ao\": {\t            \"ao1\": $wertergebnis($a[index=121], $a[index=123]),\t            \"ao2\": $wertergebnis($a[index=125], $a[index=127]),\t            \"ao3\": $wertergebnis($a[index=129], $a[index=131]),\t            \"ao4\": $wertergebnis($a[index=133], $a[index=135])\t        }, \"rf\": {\t            \"rf1\": $wertergebnis($a[index=137], $a[index=139])/10\t            /* \"rf2\": $wertergebnis($a[index=141], $a[index=143])/10, */\t            /* \"rf3\": $wertergebnis($a[index=145], $a[index=147])/10, */\t        }, \"av\": {\t            \"a1v\": $ausein($a[index=141]),\t            \"a2v\": $ausein($a[index=143]),\t            \"a3v\": $ausein($a[index=145]),\t            \"a4v\": $ausein($a[index=147]),\t            \"a5v\": $ausein($a[index=149]),\t            \"a6v\": $ausein($a[index=151]),\t            \"a7v\": $ausein($a[index=153]),\t            \"a8v\": $ausein($a[index=155]),\t            \"a9v\": $ausein($a[index=157]),\t            \"a10v\": $ausein($a[index=159]),\t            \"a11v\": $ausein($a[index=161]),\t            \"a12v\": $ausein($a[index=163]),\t            \"a13v\": $ausein($a[index=165])\t            /* \"a14v\": $ausein($a[index=167]), */\t        },\t        \"sev\": $wertergebnis($a[index=185], $a[index=187])/10,\t        \"slv\": $wertergebnis($b[index=220], $b[index=222])/10,\t        \"slv1\": $wertergebnis($b[index=224], $b[index=226])/10,\t        \"slv2\": $wertergebnis($b[index=228], $b[index=230])/10,\t        \"slv3\": $wertergebnis($b[index=232], $b[index=234])/10\t    }\t)","tot":"jsonata"}],"action":"","property":"","from":"","to":"","reg":false,"x":680,"y":220,"wires":[["7956ba6e.5a14a4"]]}]

Garbsen
Beiträge: 295
Registriert: 12.07.2017, 21:08
Hat sich bedankt: 1 Mal
Danksagung erhalten: 14 Mal

Re: Hilfe benötigt: TCL/Regascript in Node-RED-Flow/Javascript umwandeln

Beitrag von Garbsen » 08.12.2020, 11:01

Hallo ptweety

Ja, ich steige langsam dahinter. Du hast Dir da wirklich viel Arbeit für mich gemacht, danke.
Die Werte stimmen so grundsätzlich, allerdings habe ich jetzt rausgefunden, das ich alle Index um jeweils 10 reduzieren muss. Das TCL Script zählt offenbar den Header <xml><data> , beginnend bei 0 mit, deswegen sind alle folgenden Zuordnungen um 10 zu hoch.
Ich habe das jetzt bei einzelnen Datenpunkten in der Formel payload.result entsprechend verändert und mit der Anlage abgeglichen, so passt es.
Muss ich das bei allen Datenpunkten in payload.result und payload.result2 anpassen oder kann man in den Formeln für xmldata und xmldata2 die Werte verändern?
Du siehst, ich bin nicht gerade fit in diesen Programmierdingen, sondern versuche mir Dinge mittels copy/Paste abzukupfern und anzueignen;-)
Mühsam, aber mit solch kompetenter Hilfe auch möglich.

Ich selber hatte mir schon einen function Node geschrieben, bei dem ich das Herausschreiben der richtigen hex-Zahl mittels substring geschafft habe.

Code: Alles auswählen

 [{"id":"7286cf9b.6bcc98","type":"function","z":"84bb5a61.537d8","name":"Außentemperatur Solvis","func":"var Anfang = 62;\nvar Ende = 66;\n\nstring = msg.payload;\nstring0 = string.substring(Anfang,Ende);\nstring1 = string.substring(Anfang,Anfang+1);\nstring2 = string.substring(Anfang+1,Anfang+2);\nstring3 = string.substring(Anfang+2,Anfang+3);\nstring4 = string.substring(Anfang+3,Anfang+4);\nstring5 = string3 + string4 + string1 + string2\n\nErgebnis = string5\n\ntopic = \"Außentemperatur\"\n\n\nmsg5={payload:Ergebnis,topic:topic}\nreturn [[msg5]]\n","outputs":1,"noerr":0,"initialize":"","finalize":"","x":1070,"y":1480,"wires":[["4c82f3e2.7e8364"]]}]
Das umwandeln in dez mache ich dann in einer change Node

Code: Alles auswählen

 [{"id":"4c82f3e2.7e8364","type":"change","z":"84bb5a61.537d8","name":"","rules":[{"t":"set","p":"payload","pt":"msg","to":"$parseInteger($string(\"0x\" & msg.payload),'0')","tot":"jsonata"},{"t":"set","p":"topic","pt":"msg","to":"topic","tot":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":1320,"y":1400,"wires":[["2990b48b.25d284"]]}]
Deine Array Methode ist da natürlich „schlanker“, trotzdem, weißt Du, wie ich das umwandeln hex/dez in meiner function Node einbauen könnte? Ich habe mehrere Formelversuche ausprobiert, aber noch nicht geschafft eine funktionierende Formel zu finden.
Beste Grüße
K-H
512 Kanäle in 101 Geräten und 145 CUxD-Kanäle in 19 CUxD-Geräten:
--------------------------------------------
http://www.eq-3.de/service/downloads.html
Tips und Tricks für Anfänger: viewtopic.php?t=22801
Programmlogik: viewtopic.php?f=31&t=4251
Webui-Handbuch: https://www.eq-3.de/Downloads/eq3/downl ... h_eQ-3.pdf
Script und Linksammlung: viewtopic.php?f=26&t=27907

ptweety
Beiträge: 522
Registriert: 07.01.2017, 16:48
System: Alternative CCU (auf Basis OCCU)
Hat sich bedankt: 48 Mal
Danksagung erhalten: 66 Mal

Re: Hilfe benötigt: TCL/Regascript in Node-RED-Flow/Javascript umwandeln

Beitrag von ptweety » 08.12.2020, 13:49

Naja,
ich glaube ich erschieße dich gerade etwas mit der Komplexität. Daher gerne einen Schritt zurück.

Code: Alles auswählen

parseInt( hex, 16 );
wandelt die hexadezimal codierte Zeichenkette hex zur Basis 16 in eine Ganzzahl (Integer) um.

Wenn du eine Zeichenkette aus zwei Hex-Werten hast; also etwa 2B00, dann bekommst du 4300 raus.

Jetzt kannst du die Zeichenkette in gleich lange Teilstücke zerlegen und in ein Array verpacken

Code: Alles auswählen

hex.match(/.{1,2}/g)
Dabei wird mit match nach Treffern in hex gesucht. Mit Hilfe eines regulären Ausdrucks /.{1,2}/ ist ein Treffer immer genau zwei beliebige Zeichen lang. Das g macht die Suche global und bricht nicht nach dem ersten Treffer schon ab.

Nach dem Zerlegen kommt das Umwandeln.

Code: Alles auswählen

hex.match(/.{1,2}/g).map(x => parseInt(x, 16));
Mit map wird auf jedes Element x in einem Array eine Funktion parseInt(x,16) angewendet.

Wenn also hex = 2B00, dann kommt ein Array [ 43, 0 ] raus.


Das kannst du natürlich auch auf längere Zeichenketten anwenden (sonst würde sich der Aufwand kaum lohnen:

Code: Alles auswählen

let xml = msg.payload.xml.data[0];

let a = xml
        .substring(36, 36 + 152)
        .match(/.{1,2}/g)
        .map(x => parseInt(x, 16));
let b = xml
        .substring(220, 220 + 16)
        .match(/.{1,2}/g)
        .map(x => parseInt(x, 16));

msg.xmldata1 = a;
msg.xmldata2 = b;

return msg;

Garbsen
Beiträge: 295
Registriert: 12.07.2017, 21:08
Hat sich bedankt: 1 Mal
Danksagung erhalten: 14 Mal

Re: Hilfe benötigt: TCL/Regascript in Node-RED-Flow/Javascript umwandeln

Beitrag von Garbsen » 08.12.2020, 15:43

ptweety hat geschrieben:
08.12.2020, 13:49
Naja,
ich glaube ich erschieße dich gerade etwas mit der Komplexität. Daher gerne einen Schritt zurück.

Code: Alles auswählen

parseInt( hex, 16 );
wandelt die hexadezimal codierte Zeichenkette hex zur Basis 16 in eine Ganzzahl (Integer) um.
Komplexität ist schon ok, bin ja (hoffentlich) lernfähig - zumindest willig ;-)

Wobei diese parseInt(hex,16) genau die Formel war, die mir (bei meiner Lösung) fehlte.
Ich glaube ich bleibe erstmal zumindest bei meiner Lösung mit einer Function und substrings, das Ganze werde ich noch in eine Schleife packen (hoffe ich zumindest). Vorteil für mich: ich kann das derzeit einfacher nachvollziehen und hoffe daher es auch später noch nachvollziehen zu können. Aber die Benutzung von arrays muss ich mir auch unbedingt mal näher ansehen und ein paar erste Schritte damit machen. Erscheint mir auf jeden Fall eleganter im Ansatz.
Aber so habe ich dann schon das nächste „Projekt“, man muss ja geistig beweglich bleiben ;-))
Im Moment erstmal Danke, ich werde dann man - wenn ich fertig bin - hier meinen Ansatz posten. Zwar ist die Solvis-Ben Max Heizung nicht allzu verbreitet, aber vielleicht findet sich ja jemand, der es benötigen kann.
Gruß
K-H
512 Kanäle in 101 Geräten und 145 CUxD-Kanäle in 19 CUxD-Geräten:
--------------------------------------------
http://www.eq-3.de/service/downloads.html
Tips und Tricks für Anfänger: viewtopic.php?t=22801
Programmlogik: viewtopic.php?f=31&t=4251
Webui-Handbuch: https://www.eq-3.de/Downloads/eq3/downl ... h_eQ-3.pdf
Script und Linksammlung: viewtopic.php?f=26&t=27907

Axel37
Beiträge: 10
Registriert: 16.02.2022, 00:07
System: CCU
Hat sich bedankt: 1 Mal
Kontaktdaten:

Re: Hilfe benötigt: TCL/Regascript in Node-RED-Flow/Javascript umwandeln

Beitrag von Axel37 » 16.02.2022, 01:34

Zwar ist die Solvis-Ben Max Heizung nicht allzu verbreitet, aber vielleicht findet sich ja jemand, der es benötigen kann.
Ich habe auch gerade (2021) eine bekommen und nach anfänglichem Finetuning läufts rund.
Übrigens kann man ganz easy auf die Daten der SC2/3 zugreifen und zwar über den Modbus aber nur per Lan-Kabel, nicht über Wlan (monatl Absturz). Leider sind die Speicherstellen noch nicht ganz vollständig aber ich habe es in Braunschweig angeschoben. Wer nähere Infos möchte, einfach Mail oder PN
Ausserdem haben wir ein Modul erstellt um usable Speicherstellen in einem System automatisch festzulegen und zu speichern.
Die XML-Geschichte ist irgendwie von hinten durch die Brust ins Auge :lol: zumal nicht live ich nutze eine Pollzeit von 1min.

2022-02-16.png
domotic, ips. hm, hmip, shelly

Axel37
Beiträge: 10
Registriert: 16.02.2022, 00:07
System: CCU
Hat sich bedankt: 1 Mal
Kontaktdaten:

Re: Hilfe benötigt: TCL/Regascript in Node-RED-Flow/Javascript umwandeln

Beitrag von Axel37 » 20.09.2022, 09:13

Hab gerad eine Benachrichtigung vom Frank erhalten, finde diese aber nicht mehr !
Frank, bitte melde dich ! :D :D
domotic, ips. hm, hmip, shelly

Antworten

Zurück zu „RedMatic“