Technische Alternative: C.M.I. - Control and Monitoring Interface

Hallo Thomas,

das funktioniert, danke!

Nur wenn ich mich über Symcon Connect auf das Webfront einwähle geht es nicht. Da kann das CMI nicht angesprochen werden. Hast du eine Idee?

Grüße
Dirk

Hallo Dirk,
das geht bei mir mit der z.B. eingebundenen Netzwerkkamera auch nicht. Das hängt so weit ich weis damit zusammen, dass die IP der C.M.I nur im lokalen Netzwerk und nicht im WAN im Zugriff ist.
Würde man die C.M.I über eine Portfreigabe im Internet verfügbar machen und diese URL in Symcon einfügen sollte das meines Wissens nach gehen. Dann geht natürlich die Geschichte mit der Sicherheit los…
Andere Möglichkeit ist, via VPN auf das lokale Netzwerk zuzugreifen, dann gehts auch wieder (Mach ich bei mir so.)
Mann kann wohl mit Apple Geräten ein VPN-Profil einrichten, das beim öffnen einer App automatisch die Verbindung aufbaut. Android weiß ich nicht.
Man möge mich bitte korrigieren :slight_smile:

Beste Grüße

Frank

Hallo,

ich arbeite nur local und nutze den Connect-Dienst noch nicht.
Das einzige Problem was ich noch nicht lösen konnte ist bei Aufruf der Webseite des CMI User und Passwort mit zu übergeben.
Wenn ich das im Webfront in der Form http://user:passwort@192.xx.xx.xx… eintrage öffnet sich die Seite nicht. Gleiche Adresse direkt im verschiedenen Browsern eingegeben funktioniert. Ohne user:passwort@ funktiert es. Es ist nur nervig nach Neustart immer wieder die Daten zu bestätigen.

Vieleicht hat einer eine Lösung dafür?

Thomas

Danke für das Curl Script hat mir gut weitergeholfen… und trotzdem hatte ich einen Hänger bei der Implementation… denn leider muss auch noch das cookie „canremote1“ angepasst werden an die Geräte ID (bei mir war dass dann canremote20 bzw. canremote30. Als ich dies dann nach vielen erfolglosen Versuchen und der Fehlersuche endlich kapiert hatte lief es.

Vielen Dank

Die 16x2 hat je 64 analoge und 64 digitale CAN Eingänge und Ausgänge. Die CMI kann alle CAN Ausgänge einlesen. Die CMI kann aber nur jeweils 32 anstatt 64 Werte auf auf den CAN-Bus senden. Habe eine Anfrage an TA gemacht, ob die Limitierung auf 32 Werte ein Fehler sei. Antwort: technische Limitierung.

Alternative kann man die Einbindung auch per CAN-BC2 mit KNX Modul machen. Dann kann man zwar auch nur 64 Werte zur UVR senden, aber man kann wählen ob analog oder digital. Wer also mehr als 32 analoge Werte zur UVR senden, will sollte auf KNX setzen.

Aktuell stelle ich meine UVR Einbindung auf das neue offizielle FHEM ModbusTCP Slave Modul um. Ich werde bei Gelegenheit mal ne Anleitung posten. Das neue Modul ist wesentlich performanter,

Generell rate ich mittlerweile von der CMI als Schnittstelle ab. Hab 4 offene Support Anfragen wegen Bugs auf der CMI. Werde wohl über kurz oder lang auf KNX umstellen

Hallo,

ich habe mal einen Tag geopfert und ein Skript gebastelt. Grund ist dass mir das auslesen der Regelungen alle Minuten zu wenig ist. Bei 3 CAN-Teilnehmer sind das dann alle 3 Minuten:mad:
Ausserdem möchte ich beim Schalten der Ausgänge eine sofortige Rückmeldung.

Ihr müsst nur im TA-Designer eine Seite erstellen und nacheinander zuerst die „Bezeichnung“ dann den „Wert“ hineinziehen.

$kat = 35449;									//	Kategorie in der die Variablen angelegt werden
$url = "http://Benutzer:Passwort@cmi/schematic_files/1.CGI?";		//	URL zur Schemaseite "http://Benutzer:Passwort@cmi/schematic_files/1.CGI?"
$log = true;															//	Die Var sollen geloggt werden
$archive = 58693;									//	ID Archive Handler
$profil_Ausgänge = "1611_Ausgang";										//	Integer
$profil_Eingänge = "Temperatur_Heizung";								//	Float

//	Mit dem TA-Designer muss der Reihe nach zuerst die Bezeichnung dann der Wert erstellt werden!
//	Welcher Eingang oder Ausgang zuerst erstellt wird ist völlig egal!
//	Für jede Seite muss ein eigenes Skript erstellt werden!
//	Variablen werden in der Kategorie $kat angelegt wenn sie noch nicht vorhanden sind!
//	Wenn §log auf true steht dann wird das Logging von allen Variablen eingeschalten!
//	Variablenprofile erstellen und oben eintragen!
//	Nach dem Ausführen alle Variableprofile und Aggregationstypen prüfen! 
//==============================================================================
//error_reporting(E_ERROR | E_WARNING | E_PARSE);
$curl = curl_init($url);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0);
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt($curl, CURLOPT_USERAGENT,'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.13) Gecko/20080311 Firefox/2.0.0.13');
$data = curl_exec($curl);

if(curl_errno($curl)) // Error-Check
{
    echo 'Scraper error: ' . curl_error($curl);
    exit;
}
curl_close($curl);


	$data = trim($data);
	$data = str_replace(array("
", "\r", "
", "/a"), '', $data);  
 	$data = str_replace(array("div id=",">","/div","°C","<"),'',$data);
	$data = str_replace(',','.',$data);
	$data = str_replace(' ','',$data);
    $data = str_replace('ahref="','',$data);
 	$arr = explode('"',$data);
	//print_r ($arr);
	$count = count($arr);
	//echo $count."
";
 	///echo ($arr[1]);
	
	
//==============================================================================
	for ($i = 0; $i < $count ; $i++) 
    {
        if (preg_match('/^java/',$arr[$i]) == 1)                //Java wird entfernt
        {
            //echo $arr[$i]."
";
            unset($arr[$i]);
        }
    }
	
    $arr = array_values($arr);          //neu ordnen und lücken entfernen
    $count = count($arr);
	print_r ($arr);	
        
        for ($i = 1; $i < $count ; $i+=4) 
	{
		    //echo $arr[$i]."
";
			if (substr($arr[$i], 0, 3) == "pos")
			{
								
				if ($arr[$i+3] == "EIN" or $arr[$i+3] == "ON")
				{
					SetValue(CreateVariableByName($kat,$arr[$i+1] ,1, $profil_Ausgänge , $i , $log , $archive), 30);
					
				}
				
				elseif ($arr[$i+3] == "AUS" or $arr[$i+3] == "OFF")
				{
					SetValue(CreateVariableByName($kat, $arr[$i+1] ,1, $profil_Ausgänge , $i , $log , $archive), 0);
					
				}								
				
				elseif ( is_float($arr[$i+3]))          // Nur Floatwerte
				{
					SetValue(CreateVariableByName($kat, $arr[$i+1] ,2, $profil_Eingänge , $i , $log , $archive), $arr[$i+3]);
					
				}

                else                                // Rest Strings z.B. bei RAS
                {
                    //echo $arr[$i+3]."
";
                    SetValue(CreateVariableByName($kat, $arr[$i+1] ,3,"" , $i , $log , $archive), $arr[$i+3]);
                }	
			}
	
	
	
	  
	
	}
//==============================================================================
//0	Legt eine Variable vom Typ Boolean an
//1	Legt eine Variable vom Typ Integer an
//2	Legt eine Variable vom Typ Float an
//3	Legt eine Variable vom Typ String an
	
//SetValue(CreateVariableByName(26872, $arr[1],2, ""), $arr[2]);
//______________________________________________________________________________
	function CreateVariableByName($id, $name, $type, $profile = "", $pos = "" , $log , $archive)
    {
        
        $vid = @IPS_GetVariableIDByName($name, $id);			
        if($vid === false)
        {
            $vid = IPS_CreateVariable($type);
            IPS_SetParent($vid, $id);
            IPS_SetName($vid, $name);
            IPS_SetInfo($vid, "this variable was created by script #".$_IPS['SELF']);
            if($profile !== "") { IPS_SetVariableCustomProfile($vid, $profile); }
			if($pos !== "") { IPS_SetPosition($vid, $pos);}
			if($log) {AC_SetLoggingStatus($archive, $vid , true);
				IPS_ApplyChanges($archive);}
        }
        return $vid;
    }
?>

Rückmeldung und Kritik erwünscht :wink:

Da ich gerade am überlegen bin, wie eine UVR16x2 am stabilsten mit Symcon verbunden werden kann (lesend und schreibend), bin ich hier gelandet. predi ger many hat ja geschrieben, dass es am stabilsten über KNX geht.
Mich würde interessieren ob das jetzt stabil läuft und wie es umgesetzt wurde.

Mein Plan würde so aussehen:
UVR16x2 -<CAN>- CAN-BC2 mit KNX Modul -<KNX>- KNX IP Schnittstelle mit POE -<IP>- Symcon KNX Modul

Dazu hätte ich noch folgende Fragen

[ul]
[li]Brauche ich ein KNX Bus Netzteil wenn sonst keine KNX Komponenten am Bus betrieben werden?
[/li][li]Muss ich das IP KNX Gateway mit der ETS Software programmieren?
[/li][/ul]

Ich habe noch nie etwas mit KNX gemacht, deshalb diese Fragen.

lg Bernhard

Hallo Bernhard,

genau das habe ich auch vor, allerdings werde ich zusätzlich so weit es geht Homeatic durch KNX ersetzen.
Ich habe mir dazu bereits eine KNX Grundausstattung besorgt: KNX IP-Interface, Spannunsversorgung, Schaltaktor, Taster m. Display etc.
Meine ANFÄNGERerfahrung damit ist sehr, sehr gut. Ich hatte nach ca. 4 St. KNX Demo-Schaltkasten bauen, ETS und Symcon programmieren den Status der Waschmaschine auf dem Display des KNX Tasters, habe die im KNX-Taster gemessene Raumtemperatur in IPS-View und konnte via Siri Sprachsteuerung die KNX Aktoren schalten. :smiley:

Netzteil:
Ich verstehe das so, dass dein KNX IP Gateway über PoE mit Spannung versorgt wird. In der Gerätebeschreibung sollte stehen, ob damit auch der KNX-Bus versorgt wird. Aber

  • PoE: 36 - 57 VDC
  • KNX: 30 VDC + Drossel im Bus
    –> Daher vermute ich, dass das nicht geht, bzw. ein zusätzliches Netzteil notwendig ist. Das Can-BC2 KNX Modul ist ein Busankoppler der sich über den Bus mit Spannung versorgt, der elektrische Anschluss ist gemäß KNX (Seite 2 Zusatzanleitung KNX Modul) durchzuführen. Ohne Spannungsversorgung werden die sich nicht unterhalten wollen. -> Weis es jemand genauer?
    Ich nehem an, dass das IP-Gateway (integriert) genauso aufgebaut ist. Einmal der zertifizierte Busankoppler + die Herstellerspezifische Hardware die auch versorgt werden mag und (evtl. galvanisch getrennt?) miteinander kommunizieren. Es gibt Hersteller von KNX Produkten, da darf man gerne zwei Komponenten kaufen, einmal Busankoppler + spezifische Hardware (z.B. Koppler + Bewegungs- / Präsenzmelder zum aufstecken) Gibts bei Gira, Siemens etc. Die werden dann teilweise über das zweite Adernpaar des KNX-Busses mit 30V aus dem zweiten Anschluss (ohne Drossel) des KNX-Netzteils versorgt.

Gateway programmierung:
Sowol für das TA KNX-Modul, als auch auf Symcon Seite gibt es keine spezifische ETS-Software, bestimmt aber für das IP-Gateway. Grundsätzlich müssen für die Kommunikation Physikalische (PA)- und Gruppenaddressen (GA) definiert werden.
Für den Fall, dass es keine spezifische ETS Software gibt, kann man das auch auf Papier dokumentieren, einfacher ist es sicherlich in ETS.
Das Wichtigste ist sicherlich, dass das IP-Gateway eine physikalische Adresse zugewiesen bekommt. Ich denke, das wird nicht über die Weboberfläche (wenn vorhanden) des IP-Gateways gehen. Dazu musst du ja aber die ETS nicht kaufen, die Demoversion (ich meine bis zu 5 Geräte) langt, mit der habe ich bisher auch alles gemacht.

Ich habe den CAN-BC2 und das KNX Modul noch nicht hier, sonst würde ich gerne mehr berichten, ich finde schade dass auch hier wieder die Anzahl der zu übertragenden Werte relativ überschaubar ist, man muss notfalls mit weiteren CAN-BC2 m. KNX Modulen arbeiten.
Deine Zielkonstellation werde ich leider auch mit dem TA Modul nicht nachstellen können, da mein IP-Gateway über den Bus mit Spannung versorgt wird. Ich konnte ein Busch-Jäger Netzteil (640 mA) als Neuware für 85,- in der Bucht schießen. Preislich ist KNX ja teilweise schon echt (nach oben) abgefahren. In deinem Fall ist evtl. ein kleines, gebrauchtes Netzteil und ein IP-Interface mit Spannungsversorgung über den BUS eine Alternative.

Vielleicht ist ja noch ein KNX-Erfahrener hier der mitliest und mich korrigieren und aufschlauen mag :slight_smile:

Beste Grüße

Frank

Danke für die ausführliche Antwort.

zum Netzteil: Das Can-BC2 KNX Modul versorgt sich laut Hersteller vom CAN Bus der Technischen Alternative und benötigt kein Netzteil. Glaubst du, dass ich ein Netzteil brauche damit der KNX Bus überhaupt funktioniert, oder sollte es auch so funktionieren, da beide KNX Geräte sich anders versorgen?

ETS: Brauche ich nur zu Dokumentation? Das Gateway nimmt sich eine DHCP Adresse, diese kann ich ja statisch vergeben.

lg Bernhard

Hallo Bernhard,
das Modul (der Buskoppler) mag vom CAN-BC2 versorgt werden, nicht aber der KNX-Bus, der die besagten 30 VDC mit Drossel benötigt. Ich werde mir das Gerät bestellen und kann dann gerne mal am KNX-Bus messen, ob da eine Spannung anliegt. Wird aber ein paar Tage dauern.
KNX Geräte bestehen immer aus einem KNX-Koppler (30VDC + Drossel) und einem individuellen (Anzeigen-, Sensor-, etc.) Gerät. Meistens in einem Gehäuse untergebracht, meistens wird beides über den KNX-Bus mit Spannung versorgt, aber nicht immer. Umgekehrt habe ich das noch nicht gelesen, aber: -> wo sind die KNX Experten?

ETS / Programmierung:
So wie du bei den TA Geräten über die C.M.I oder TAPPS den Geräten eine eindeutige Knotennummer zur Identifikation innerhalb des CAN Busses gibst, so muss dass auch beim KNX-Bus passieren.
Für den CAN-BC2 vergibst du diese sogenannte physikalische Addresse über TAPPS.

Das IP-Gateway wird über die ETS und den Programmierknopf am Gateway addressiert. Das hat nichts mit der IP des Gateways zu tun. Folgende Analogie gilt:
KNX Gateway - IP <-> C.M.I. - IP
KNX Gateway - physikalische Addresse <-> C.M.I. - CAN Knotennummer

Ich gehe davon aus, dass das Gateway zwar einen Webserver hat auf dem du dich einloggen kannst, aber ob du dort auch die Physikalische Addresse vergeben kannst ist fraglich.
Die Physikalischen Addressen bei KNX sind über Bereich.Linie.Teilnehmer aufgebaut, z.B.
Bereich: 1 ,Linie: 1, Teilnehmer: 1
-> Physikalische Addresse lautet. 1.1.1
Alle Geräte die miteinander (ohne zusätzliche Hardware) kommunizieren sollen, müssen in diesem Fall im Addressbereich
1.1.x (x = 1-64) addressiert sein, sonst werden die Pakete in die Gruppenaddressen von den Geräten nicht ausgewertet.
In deinem Fall könnte das also so aussehen:
IP-Gateway: 1.1.1
CAN-BC2: 1.1.2

Die Frage bleibt: Welche physikalische Adresse hat das IP-Gateway im Auslieferungszustand? (Ich erwarte dass sie nicht gesetzt ist, das wird mittels ETS als eines der ersten Maßnahmen bei einem neuen KNX-Gerät gemacht).

Symcon muss keine physikalische Addresse vergeben werden, die lauscht über das Broadcasting auf dem Bus und reagiert auf die Gruppenaddressen über die die Geräte Befehel und Werte senden. (aufgebaut: Hauptgruppe/Mittelgruppe/Untergruppe), bzw. sendet auf Ihnen. Ist dir die Logik mit den Gruppenaddressen bekannt?

Beste Grüße
Frank

Hallo eeFrank,

in der Anleitung vom IP Gateway steht: „Bis zu 5 Tunneling Verbindungen sind gleichzeitig möglich, ab Werk ist 1 Tunneling Verbindung
vorkonfiguriert mit der physikalischen Adresse 15.15.250.“ Nutzt denn Symcon diese Tunneling Verbindug? Wenn ja bräuchte ich ja nichts mit ETS programmieren, oder?

Mal etwas anderes:
Hast du Erfahrung mit dem C.M.I. und der Steuerung über Modbus TCP mit Symcon? Läuft das Stabil? Ich möchte nur für jeweils 3 Heizkreise die Raum Soll und Ist Temperatur und ein Freigabesignal in die TA Steuerung schicken. Wenn ich zusätzlich noch die Außentemperatur von der TA Steuerung in Symcon bekommen würde wäre ich schon zufrieden. Ich glaube das wäre einfacher als einen KNX Bus aufzubauen nur für die Steuerung.

lg Bernhard

OK, die PA (physikalische Addresse) ist 15.15.250, das langt für eine Connection (-> für Symcon).
Dann sollte die PA vom CAN-BC2 auch in 15.15.x liegen. Ich dachte die Geräteaddressen gehen nur bis 64 (da maximal 64 Geräte pro Linie), geht aber bis 255 (gerade in der ETS noch mal nachgeschaut).

Ja, das ist viel einfacher (vor allem auch monetär). Ich habe einen Modbus Slave nach Predi Ger Many’s Anleitung aufgesetzt, d.h.

  • FHEM auf einer Raspy (gibts auch als Docker Container für NAS, falls vorhanden)
  • Kofiguration des Modbus in FHEM - das ist echte Fleißarbeit, ich habe das aber gleich komplett definiert
  • Anlegen der CAN Ein- / Ausgänge in der C.M.I.
  • Anlegen der relevanten Modbus Ein- /Ausgänge in der C.M.I.
  • Anlegen des Modbus Gateways und Instanzen.

siehe hier-> Howto: Technische Alternative per ModbusTCP über FHEM an Symcon anbinden

Für den Pi gibts auch Hutschinengehäuse und ein PoE Modul, läuft bei mir auch so. Das ganze kostet weniger als das KNX IP-Gateway

Die bekannten Nachteile sind die Aktualisierungsintervalle, aber bei deinem Anwendungsfall mit Temperaturen und Freigabe kommt es warscheinlich nicht auf Sekunden an.
Das ganze läuft bei mir sehr stabil, ich musste nur nach einer Netzwerkumstellung eingreifen und die IP-Adressen anpassen. Abgestürzt ist mir FHEM auf dem PI noch nie. Ich habe da aber auch keine große Last drauf, da ich vor allem Betriebsstunden, Wärmemengen-, Wasserzähler und eine kleinere Licht Steuerung (Außenbereich) darüber laufen habe. Also durchaus vergleichbar mit deinem Szenario.
Ich habe aber auch noch je Etage einen TA-Monitor über den die Familie einfach eingreifen kann. Durch die Umstellung auf KNX fliegen die jetzt aber raus. weswegen ich auf den CAN-BC2 mit KNX Modul umstellen werde.
Gerät ist bestellt, mal sehen ob ich am WE dazu komme das mal zu testen.

BG
Frank

Dann werde ich das wohl mit FHEM in einem Docker Container lösen. Symcon läuft hier ja auch in einem Container.

1000 Danke für alles.

Viel Erfolg bei deiner Umstellung.

Warum nicht einfach die Json-API oder CoE des CMI verwenden?

Gesendet von meinem LYA-L29 mit Tapatalk

Die JSON API wäre meine erste Wahl wenn diese schreibend funktionieren würde. Leider ist die aber nur lesend.
Gibt es denn eine Protokollbeschreibung oder gar eine PHP Bibliothek für CoE?

Also eine richtige Beschreibung oder eine PHP Klasse für CoE habe ich nicht nicht gefunden.

Was ich Dir aber sagen kann ist:
Gesendet werden immer 14 Bytes.
Analoge Werte werden in Gruppen zu jeweils 4 Werten gesendet.
Digitale Signale werden „theoretisch“ komplett in einem Paket versendet … „praktisch“ bin ich da noch am grübeln :confused:

bei digitalen Signalen:
Byte 0: Knotennummer
Byte 1: Gruppennummer = 0
Byte 2: Bit 0-7
Byte 3: Bit 8-15
Byte 4: und so weiter … „theoretisch“

bei analogen Signalen:
Byte 0: Knotennummer
Byte 1: Gruppennummer = 1, 2, 3 …
Byte 3+2: Wert 1
Byte 5+4: Wert 2
Byte 7+6: Wert 3
Byte 9+8: Wert 4
Byte 10: Typ von Wert 1
Byte 11: Typ von Wert 2
Byte 12: Typ von Wert 3
Byte 13: Typ von Wert 4

Man braucht:

[ul]
[li]einen UDP-Socket der auf Port 5441 lauscht
[/li][li]eine RegisterVariable
[/li][li]das Empfangsskript für die RegisterVariable
[/li][/ul]


if($_IPS['SENDER'] == "RegisterVariable"){

    $data = RegVar_GetBuffer($_IPS['INSTANCE']);
    $data .= $_IPS['VALUE'];

	$hex = bin2hex($data);
    $arr = str_split($hex, 2); 

	SetValue(41832, json_encode($arr));
}

if($_IPS['SENDER'] == "Execute"){
	$json = GetValue(41832);
    $data = json_decode($json, true);

    if(hexdec($data[1]) == 0){
        echo "Node: ".hexdec($data[0])." - digitale Signale
";
        echo "----------------------------
";
        for($b = 2; $b < 9; $b++){
            $bin = "";
            for($i = 0; $i <= 7; $i++) {
            $bin .= (hexdec($data[$b]) & (1 << $i)) ? "1" : "0";
            }
        echo $bin."
";
        }
    }
    else{
        echo "Node: ".hexdec($data[0])." - analoge Signale
";
        echo "---------------------------
";
        echo "Gruppe: ".hexdec($data[1])."
";
        echo "
";
        echo "Typ: ".hexdec($data[10])."
";
        echo " 01: ".hexdec($data[3].$data[2])."
";
        echo "
";
        echo "Typ: ".hexdec($data[11])."
";
        echo " 02: ".hexdec($data[5].$data[4])."
";
        echo "
";
        echo "Typ: ".hexdec($data[12])."
";
        echo " 03: ".hexdec($data[7].$data[6])."
";
        echo "
";
        echo "Typ: ".hexdec($data[13])."
";
        echo " 04: ".hexdec($data[9].$data[8])."
";
        echo "
";
    }
}

Beispiel:


20 02 0F 02 D2 00 6D 00 5E 00 08 01 01 34


Node: 32 - analoge Signale
----------------------------
Gruppe: 2

Typ: 8
 01: 527        entspricht: 52,7%

Typ: 1
 02: 210        entspricht: 21,0°C

Typ: 1
 03: 109        entspricht: 10,9°C

Typ: 52
 04: 94         entspricht: 9,4 g/m³


20 00 34 02 00 00 00 00 00 00 00 00 00 00


Node: 32 - digitale Signale
----------------------------
00101100
01000000
00000000
00000000
00000000
00000000
00000000
00000000

Damit habe ich angefangen rum zuspielen :cool:

Nun „bastl“ ich seit Monaten an einem Modul, aber irgendwie fehlt einfach die Zeit und der Antrieb da weiter zu machen :frowning:
Naja vielleicht hilft ja die kommende Heizperiode wieder in Schwung zu kommen …

Das schaut ja super aus.

Wie ist das wenn ein Knoten mehr als 4 CAN Ausgänge hat? Kann ich mir das so vorstellen:
Gruppe 1 Wert 1 => CAN 1
Gruppe 1 Wert 2 => CAN 2

Gruppe 2 Wert 1 => CAN 5

Hast du auch schon mal versucht Daten zu senden? Ich habe irgendwo gelesen, dass beim Senden alle Werte einer Gruppe gesendet werden müssen, da sonst die „fehlenden“ Werte im Regler auf 0 gesetzt werden. Kannst du das bestätigen?

Ich werde mir mal das CMI und den Regler bestellen und mich mit dem CoE versuchen. Falls das nicht funktioniert kann ich noch immer über den Modbus TCP gehen.

Wenn ich was mit CoE zusammenbringe kann ich auch sehr gerne ein Modul daraus machen, oder wir basteln zusammen eines.

Na das ist ja auch mal g…ut.
Ist der Aufbau mit Wirshark o.ä. ermittelt? Ich hab mir WS zwar mal angesehen, habe dann aber schnell kapituliert, die Einarbeitungsschwelle schien mir zu hoch.
Wenn ich da irgendwie mit Tests (würde mich auch noch mal mit WS auseinandersetzen) unterstützen kann, dann gerne.
Ich kann da relativ viel Ausprobieren, da ich eine UVR1611 habe die nur ein paar niedere Aufgaben erfüllt und wenn die Konfig mal zerschossen wäre, wärs nicht so schlimm.

Beste Grüße
Frank

Mit meiner Frage nach Wireshake habe ich mich ja nun vollkommen als DAU geouted, ich habe davon einfach keine Ahnung.
Mit den wunderbaren Infos / Skript von manni konnte ich folgendes heraus finden:

Analoge Werte:
War ja soweit schon erforscht. Der „Typ“ ist eine Kombination aus Einheit (kWh, Liter, Stunden,…) und einem dazu korrespondierenden Dezimalfaktor (1/ 0,1 /0,01,etc.). Sie werden immer in 4er Päckchen geschickt. Die möglichen Analogen Ausgänge [AA] mit Einheiten und Faktor habe ich mal über die C.M.I. variiert (man kann die original Einheiten übersteuern) und zwei Listen daraus gemacht. Es wird nur das Päckchen geschickt, für das in der C.M.I. ein aktualisierter Wert kommt, oder wenn der zyklische Intervall erreicht ist. Eine Gruppe wird nur gesendet wenn mindestens ein AA dafür definiert ist.
AA 1-4 = Gruppe 1
AA 5-8 = Gruppe 2
AA 9-12 = Gruppe 3
AA 13-16 = Gruppe 4

Digitale Werte:
Byte 3 + 4 enthalten die Informationen von allen 16 Digitalen Ausgängen [DA]. Die Auflösung im Skript ist korrekt, man braucht halt einfach nur Byte 3 und 4 nehmen. Die Restliche Bytes sind 0. Es werden immer alle 16 DA’s gesendet, auch wenn diese für den virtuellen Knoten in der C.M.I. nicht definiert / angelegt sind. Nicht definiert ist dann halt 0.
Ich konnte einen aktiven Schaltzustand damit sauber über die 16 Bits durch umkonfigurieren „wandern“ lassen.

!ACHTUNG! Entfernt man in der C.M.I. einen DA aus der Konfiguration, wird der letzte über den CAN-Bus gesendete Wert weiterhin gesendet. War der letzte Wert eines DA’s 1 (true), wird auf den CoE weiterhin munter eine 1 geschickt. Entfernt man also eine DA-Konfig im CoE, sollte die vorher eine 0 bekommen haben, sonst ist das Rätseln über den Schaltzustand groß. Die C.M.I. hat also einen (nicht flüchtigen, habe die C.M.I. auch mal neu gestartet) Speicher in dem Sie sich die letzten Schaltzustände aller jemals konfigurierten virtuellen Knoten und deren Schaltzustand merkt.

SKRIPT
Ich habe dazu das Skript von manni mal erweitert, so dass in Abhängigkeit vom DA/AA zunächst eine Dummy Instanz mit der Knotennummer angelegt wird. Darunter werden dann für die Analogen Werte in abhängigkeit der Gruppe Variablen angelegt.
Wird für einen Knoten ein digitaler Wert geschickt, werden 16 Variablen für die Schaltzustände erzeugt.

Wo Licht ist ist auch Schatten…
Ich habe mal einen virtuellen Knoten in der C.M.I. mit AA’s für alle Gruppe und 16 DA’s definiert. Den Schaltzustand eines Strömungsschalters (in Warmwasserleitung für die Zirkulationspumpe) konnte ich damit fast in Echtzeit in Symcon sehen (hatte die Blockierzeit noch auf 10 Sek. stehen).
AAAABER
Das ging etwa einen Tag gut, die DA’s spinnen jetzt aber bei mir. Obwohl in der C.M.I. im Can-Bus Eingang und im CoE Ausgang der Schaltzustand korrekt angezeit wird, wird irgend ein Käse (also falsche Schaltzustände für einige DA’s, nicht alle) gesendet :banghead:
Es wäre schön, wenn mal jemand das Skript bei sich testen würde. Weis jemand wie man die CoE Konfig in der C.M.I. resetten kann?
Ich habe den Eindruck, das hat sich bei mir „verschluckt“, da ich den Modbus und den UVR Konfigurator parallel laufen habe.

Gegenüber dem Skript von manni habe ich zwei zusätzliche String Variablen (also 3). In einer Variable (Zeile 102 u. 111) wird das CoE Telegramm vom UDP abgelegt (-> manni). Ich schreibe dann den digitalen Satz (Zeile 148) bzw. den analogen Datensatz (Zeile 151) dann noch mal weg. Damit ist immer ein Analoger bzw. Digtaler Satz da, mit dem man Testen kann (Zeile 109-111 ein-/auskommentieren)


<?php

$debug = false;

$typ = Array(
0 => "na ", /* dimensionslos*/
1 => "°C", /* Temperatur */
2 => "W/m²", /* Solarstrahlung */
3 => "l/h", /* Durchfluss l pro h */
4 => "Sek", /* Sekunden */
5 => "Min", /* Minuten */
6 => "Min",
7 => "l/Pulse",
8 => "%",
9 => "na", /* unbekannt */
10 => "kW", /* Leistung KW */
11 => "MWh", /* Wärmemenge kWh */
12 => "kWh", /* Wärmemenge MWh */
13 => "V", /* Spannung */
14 => "mA", /* Stromstärke mA */
15 => "Std", /* Stunden */
16 => "Tage", /* Tage */
17 => "Imp", /* Anzahl Impulse */
18 => "kO", /* Widerstand */
19 => "l", /* Liter */
20 => "km/h", /* Geschwindigkeit km/h */
21 => "na", /* unbekannt */
22 => "l/min", /* Durchlfluss l/min */
23 => "bar", /* Druck bar */
24 => " ", /* Arbeitszahl */
28 => "m³", /* Kubikmeter */
35 => "l/d", /* Durchfluss l/d */
36 => "m/s", /* Geschwindigkeit m/s */
37 => "m³/min", /* Durchfluss m³/min */
38 => "m³/h", /* Durchfluss m³/h */
39 => "m³/d", /* Durchfluss m³/d */
50 => "€", /* Euro */
51 => "$", /* Dollar */
52 => "g/m²", /* absolute Feuchte */
53 => " ", /* dimensionslos 0,5 */
58 => " ", /* dimensionslos 0,1 */
63 => "A", /* Stromstärke A */
65 => "mbar", /* Druck mbar */
66 => "Pascal", /* Druck Pascal */
);

$factor = Array(
0 => "1", /* unbekannt */
1 => "0.1", /* "°C OK",*/
2 => "1", /* Solarstrahlung */
3 => "1", /* Durchfluss l pro h */
4 => "1", /* Sekunden */
5 => "1", /* Minuten */
6 => "1", /* Tage   */
7 => "1", /* "l/Pulse",*/
8 => "0.1", /* Prozent */
9 => "1", /* na */
10 => "0.1", /* Leistung KW */
11 => "0.1", /* "Wärmemenge kWh ,*/
12 => "0.1", /* Wärmemenge MWh */
13 => "0.01", /* Spannung */
14 => "0.1", /* Stromstärke mA */
15 => "1", /* Stunden */
16 => "1", /* "d",*/
17 => "1", /* Anzahl Impulse */
18 => "0.01", /* Widerstand */
19 => "1", /* Liter */
20 => "1", /* Geschwindigkeit km/h */
21 => "1", /* unbekannt */
22 => "1", /* Durchlfluss l/min */
23 => "0.01", /* Druck bar */
24 => "0.01", /* Arbeitszal */
28 => "1", /* Kubikmeter */
35 => "1", /* Durchfluss l/d */
36 => "1", /* Geschwindigkeit m/s */
37 => "1", /* Durchfluss m³/min */
38 => "1", /* Durchfluss m³/h */
39 => "1", /* Durchfluss m³/d */
50 => "0.01", /* Euro */
51 => "1", /* Dollar */
52 => "0.1", /* absolute Feuchte */
53 => "0.00001", /* dimensionslos ,5 */
58 => "0.1", /* dimensionslos ,1 */
63 => "0.1", /* Stromstärke A */
65 => "0.1", /* Druck mbar */
66 => "1", /* Druck Pascal */
);

$ParentID = IPS_GetParent($_IPS['SELF']);

if($_IPS['SENDER'] == "RegisterVariable"){

    $data = RegVar_GetBuffer($_IPS['INSTANCE']);
    $data .= $_IPS['VALUE'];

    $hex = bin2hex($data);
    $arr = str_split($hex, 2); 
    
    //echo $hex.'/n';
    //print_r ($arr);

    SetValue(19624, json_encode($arr));
}


 // if($_IPS['SENDER'] == "Execute"){ /* auskommentiert, damit es immer läuft */

    // zum debuggen, aktueller, letzter digitaler oder analoger Wert für die Verarbeitung auswählen
    //$json = GetValue(18015); /* digitale Werte */
    //$json = GetValue(49504); /* analoge Werte */
    $json = GetValue(19624); /* aktueller Wert */

    $data = json_decode($json, true);
    
    if(hexdec($data[1]) == 0){
        echo "Node: ".hexdec($data[0])." - digitale Signale
";
        echo "----------------------------
";
        $device_uid = hexdec($data[0]);
        // Dummy Instance ID ermitteln, wenn nicht vorhanden, dann erstellen mit Knotennummer
        $DeviceID = GetInstID($ParentID, $device_uid, $device_uid);        
        //echo "No2: ".hexdec($data[2])."
";
        //echo "No3: ".hexdec($data[3])."
";
        $bin2 = "";
        for($b = 2; $b < 4; $b++){
            $bin = "";
            for($i = 0; $i <= 7; $i++) {
            $bin .= (hexdec($data[$b]) & (1 << $i)) ? "1" : "0";
            }

        $bin2 = $bin2.$bin;
        }

        $dig = str_split($bin2, 1);
        for ($d = 0; $d < 16; $d++){
            // VariablenID ermitteln, wenn nicht vorhanden, dann erstellen
            $DA=$d+1;
            $VarID=GetVarID($DeviceID, 'DA'.$DA,0); /* Digital Ausgang */
            IPS_SetPosition($VarID, 160+10*$DA);
            //echo $dig[$d];
            // Variablenwert aktualisieren, wenn unterschiedlich
            if (GetValue($VarID) != $dig[$d])
            {
            SetValue($VarID, $dig[$d]); /* Die Variable wird separat dupliziert für "nur digitale Werte */
            } // Varwert aktualisieren ENDE
            }
        
        print_r($dig);
        SetValue(18015, $json);
    }
    else{
        SetValue(49504, $json); /* Die Variable wird separat dupliziert für "nur analoge Werte */
        echo "Node: ".hexdec($data[0])." - analoge Signale
";
        $device_uid = hexdec($data[0]);
        // Dummy Instance ID ermitteln, wenn nicht vorhanden, dann erstellen mit Knotennummer
        $DeviceID = GetInstID($ParentID, $device_uid, $device_uid);

        echo "---------------------------
";
        echo "Gruppe: ".hexdec($data[1])."
";
        for($i = 0; $i <= 3; $i++) {
            $out=4*hexdec($data[1])-3+$i;
            //echo 'AA'.$out."
";

        // VariablenID ermitteln, wenn nicht vorhanden, dann erstellen
        $VarID=GetVarID($DeviceID, 'AA'.$out,2); /* Analog Ausgang */
        IPS_SetPosition($VarID, 10*$out);
        $fac="";
        // Variablenwert aktualisieren, wenn unterschiedlich
        $num1 = $i*2+3; //-> 3, 5, 7, 9: 1tes Byte
        $num2 = $num1-1; //-> 2, 4, 6, 8: 2test Byte
        $num3 = $i+10; //-> 10, 11, 12, 13: Datentyp Byte
         $fac=$factor[hexdec($data[$num3])];
         //echo "Faktor: ".$num3." - ".$fac." - ".hexdec($data[$num3])." - ";
        //echo $typ[hexdec($data[$num3])]."
";
        echo hexdec($data[$num1].$data[$num2])." ".$typ[hexdec($data[$num3])]." - ".$fac." - ". hexdec($data[$num1].$data[$num2])*$factor[$num3]."
";
       
        //echo $num3.": ".$fac."
";

        //if (GetValue($VarID) != floatval(hexdec($data[$num1].$data[$num2])*$factor[$num3]))
        if (GetValue($VarID) != floatval(hexdec($data[$num1].$data[$num2])*$fac))
         {
            SetValue($VarID, floatval(hexdec($data[$num1].$data[$num2])*$fac));
         } // aktualisierung Ende 

            }
//*******************************************************************************************************************  
//  SENDETEST          
//         ["2c","01","85","01","0d","00","6d","22","09","00","13","0c","0b","0c"] Knoten 44
//            $tohex = "2c0185010d006d220900130c0b0c";
//            $tobin = hex2bin($tohex);
//            echo $tobin;
//            USCK_SendText(42775, $tobin); /* an den UDP Socket übergeben*/
//*******************************************************************************************************************

if ($debug == true){
        echo "
";
        echo "Typ: ".hexdec($data[10])."
";
        echo " 01: ".hexdec($data[3].$data[2])."
";
        echo "
";
        echo "Typ: ".hexdec($data[11])."
";
        echo " 02: ".hexdec($data[5].$data[4])."
";
        echo "
";
        echo "Typ: ".hexdec($data[12])."
";
        echo " 03: ".hexdec($data[7].$data[6])."
";
        echo "
";
        echo "Typ: ".hexdec($data[13])."
";
        echo " 04: ".hexdec($data[9].$data[8])."
";
        echo "
";
        }
        
    }
//}  /* hier auskommentieren für permanente Splittung*/



  // **************************************************************************
   // Hilfsfunktionen
   // **************************************************************************

   // Diese Funktion dient zum Ermitteln einer Variablen-ID anhand des Ident
   // Wenn die Variable nicht existiert, wird sie angelegt
   function GetVarID($parentid, $ident, $vartyp)
   {
       $varid = @IPS_GetObjectIDByIdent($ident, $parentid);
      if ($varid === false)
      {
         $ScriptID = $_IPS['SELF'];
            $varid = IPS_CreateVariable($vartyp);
            IPS_SetParent($varid, $parentid);
            IPS_SetIdent($varid, $ident);
            IPS_SetName($varid, $ident);
            IPS_SetInfo($varid, "This Variable was created by Script #$ScriptID");
           // IPS_SetVariableCustomProfile($varid, "~String");
      }
      return $varid;
   }

   // Diese Funktion dient zum Ermitteln einer Dummy Instanz-ID anhand des Ident
   // Wenn die Dummy Instanz nicht existiert, wird sie angelegt
   function GetInstID($parentid, $ident, $name)
   {
       $ObjektID = @IPS_GetObjectIDByIdent($ident, $parentid);
      if ($ObjektID === false)
      {
         $ScriptID = $_IPS['SELF'];
            $ObjektID = IPS_CreateInstance("{485D0419-BE97-4548-AA9C-C083EB82E61E}"); //Dummy Instance erstellen
           IPS_SetParent ($ObjektID, $parentid);   // Dummy Instance verschieben
           IPS_SetName ($ObjektID, $name);  //Dummy Instance umbenennen
            IPS_SetInfo ($ObjektID, "This Instance was created by Script #$ScriptID");
            IPS_SetIdent ($ObjektID, $ident);
      }
      return $ObjektID;
  }  
?>

Bitte nicht über die chaotische Programmierung schimpfen, ich hab’s nie gelernt und es ist ja auch noch im Suchen/Finden Status.
Wie kann man das „hübscher“ mit den zwei Arrays machen? Beides in ein Feld und dann auseinander schneiden?

Daten senden
klappt :smiley: . Die Doku von TA ist an dieser Stelle ja mehr als spärlich. In einem auskommentierten Block am Ende (185 - 190) habe ich das mal exemplarisch gemacht. Einfach einen Datensatz genommen, den ich empfangen habe, die virtuelle Knotennummer geändert (Knoten 44 = 2c) und USCK_SendText auf den CoE geschickt.
Dann passiert nach einigen Sekunden in der C.M.I folgendes:

  1. Es taucht ein neues CAN Gerät auf ->
    CoE_Knoten44_CAN_Übersicht.png

  2. Im Status unter CoE tauchen die übermittelten Werte auf ->
    CoE_Knoten44-Status.png

  3. Man bekommt in einem Can Gerät (hier Knoten 2) unter Netzwerkeingang bei der Auswahl des virtuellen Knotens und des entsprechenden Ausgangs nach dem erneuten senden aus Symcon den Wert angezeigt. ->
    CoE_Knoten2-AE01_K44.png

:smiley:

Also noch mal die Bitte, das zu testen, um Erfahrung vor allem mit den digitalen Ausgängen zu bekommen (vielleicht ist da auch noch ein Bug bei TA). Am besten alles (Register Variable, 3 String Variablen und Skript) in einer neuen Kategorie einrichten und laufen lassen.

EDITH sagt: Fehler im Code gefunden und korrigiert, DA’s kommen jetzt wieder korrekt

OFFEN

  • Benutzerdefinierte Einheiten, wie kommen die an
  • Überprüfung der bisher aufgenommenen Einheiten / Faktorisierung und vervollständigung

Umgebung
C.M.I. Firmware 1.35.2
Symcon: Latest stable auf Symbox

1 „Gefällt mir“

Sehr interessanter Thread zum Thema technischer Alternative und Auswerten der Werte.

Ich habe gestern auch mein C.M.I angeschlossen, soweit steht der BUS und CAN-mäßig ist alles erfolgreich verbunden.
Habe mir jetzt das Modul für die technischen Alternative, Modell 16x2 installiert bzw. konfiguriert.

In IP-Symcon sehe ich alle Ein- und Ausgänge bzw. fast alle.
Bei den Ausgängen werden mir nur 4 Ausgänge von Insgesamt 6 angezeigt.
Allerdings handelt es sich bei den 2 (eigentlich 4) Ausgängen die nicht angezeigt werden um Ausgangspaare die in ich in TAPPS2 Konfiguriert habe. Diese werden genutzt für die Ansteuerung der Mischer.

Die Ausgänge sehen bei mir wie folgt aus:
Ausgang 1: Ausgangspaar Mischer 1 (zusammen mit 2)
Ausgang 2: Ausgangspaar Mischer 1 (zusammen mit 1)
Ausgang 3: Ausgangspaar Mischer 2 (zusammen mit 4)
Ausgang 4 :Ausgangspaar Mischer 2 (zusammen mit 3)
Ausgang 5: -----
Ausgang 6: Pumpe
Ausgang 7: Pumpe
Ausgang 8: Warmwasser pumpe
Ausgang 9: Brenner

Ausgänge 6 - 9 kann ich in IP-Symcon sehen nach dem auslesen, aber die beiden Ausgangspaare für die Ausgänge 1 - 4 nicht.
Wie sieht es bei euch aus, seht ihr auch angelegte Ausgangspaare wenn ihr bei euch auslest? Bzw. gibt es etwas zu beachten?