<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de">
	<id>http://wiki.fhem.de/w/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Topos</id>
	<title>FHEMWiki - Benutzerbeiträge [de]</title>
	<link rel="self" type="application/atom+xml" href="http://wiki.fhem.de/w/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Topos"/>
	<link rel="alternate" type="text/html" href="http://wiki.fhem.de/wiki/Spezial:Beitr%C3%A4ge/Topos"/>
	<updated>2026-04-13T10:04:54Z</updated>
	<subtitle>Benutzerbeiträge</subtitle>
	<generator>MediaWiki 1.43.6</generator>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Webasto_Next&amp;diff=40194</id>
		<title>Webasto Next</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Webasto_Next&amp;diff=40194"/>
		<updated>2025-05-29T08:54:00Z</updated>

		<summary type="html">&lt;p&gt;Topos: /* 1- und 3-phasiges Laden */ Hinweis bei Steuerung über Ladeleistung ergänzt&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Die Wallbox Webasto Next kann per LAN oder WLAN über das Modebus-Protokoll ausgelesen und gesteuert werden. Sie liest den Batteriestand des E-Autos nicht aus. Dies könnte aber über spezielle Hardware wie den [https://www.meatpi.com/products/wican MeatPi WiCAN-OBD-C3 Adapter] oder passende E-Auto-App-Abfragen und FHEM-Module erfolgen.&lt;br /&gt;
&lt;br /&gt;
Hier eine mögliche Konfiguration:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
define WebastoNext ModbusAttr 1 3 [IP-Addresse]:502 TCP&lt;br /&gt;
attr WebastoNext alias Wallbox&lt;br /&gt;
attr WebastoNext icon wallbox&lt;br /&gt;
attr WebastoNext stateFormat Charge_Point_State_TXT&amp;lt;br&amp;gt;Cable_State_TXT&amp;lt;br&amp;gt;Charge_State_TXT: Charge_Active_Power W&lt;br /&gt;
attr WebastoNext event-on-update-reading .*&lt;br /&gt;
attr WebastoNext DbLogExclude .*&lt;br /&gt;
attr WebastoNext DbLogInclude Charge_Active_Power:600&lt;br /&gt;
attr WebastoNext oldreadings Cable_State&lt;br /&gt;
attr WebastoNext obj-i1000-poll 1&lt;br /&gt;
attr WebastoNext obj-i1000-reading Charge_Point_State&lt;br /&gt;
attr WebastoNext obj-i1000-type unsigned short big&lt;br /&gt;
attr WebastoNext obj-i1001-poll 1&lt;br /&gt;
attr WebastoNext obj-i1001-reading Charge_State&lt;br /&gt;
attr WebastoNext obj-i1001-type unsigned short big&lt;br /&gt;
attr WebastoNext obj-i1004-poll 1&lt;br /&gt;
attr WebastoNext obj-i1004-reading Cable_State&lt;br /&gt;
attr WebastoNext obj-i1004-type unsigned short big&lt;br /&gt;
attr WebastoNext obj-i1006-poll 1&lt;br /&gt;
attr WebastoNext obj-i1006-reading Error_Code&lt;br /&gt;
attr WebastoNext obj-i1006-type unsigned short big&lt;br /&gt;
attr WebastoNext obj-i1008-poll 1&lt;br /&gt;
attr WebastoNext obj-i1008-reading Charge_Active_Current_L1&lt;br /&gt;
attr WebastoNext obj-i1008-type unsigned short big&lt;br /&gt;
attr WebastoNext obj-i1008-expr $val/1000&lt;br /&gt;
attr WebastoNext obj-i1010-poll 1&lt;br /&gt;
attr WebastoNext obj-i1010-reading Charge_Active_Current_L2&lt;br /&gt;
attr WebastoNext obj-i1010-type unsigned short big&lt;br /&gt;
attr WebastoNext obj-i1010-expr $val/1000&lt;br /&gt;
attr WebastoNext obj-i1012-poll 1&lt;br /&gt;
attr WebastoNext obj-i1012-reading Charge_Active_Current_L3&lt;br /&gt;
attr WebastoNext obj-i1012-type unsigned short big&lt;br /&gt;
attr WebastoNext obj-i1012-expr $val/1000&lt;br /&gt;
attr WebastoNext obj-i1020-poll 1&lt;br /&gt;
attr WebastoNext obj-i1020-reading Charge_Active_Power&lt;br /&gt;
attr WebastoNext obj-i1020-type unsigned long big&lt;br /&gt;
attr WebastoNext obj-i1024-reading Charge_Active_Power_L1&lt;br /&gt;
attr WebastoNext obj-i1024-poll 1&lt;br /&gt;
attr WebastoNext obj-i1024-type unsigned long big&lt;br /&gt;
attr WebastoNext obj-i1028-reading Charge_Active_Power_L2&lt;br /&gt;
attr WebastoNext obj-i1028-poll 1&lt;br /&gt;
attr WebastoNext obj-i1028-type unsigned long big&lt;br /&gt;
attr WebastoNext obj-i1032-reading Charge_Active_Power_L3&lt;br /&gt;
attr WebastoNext obj-i1032-poll 1&lt;br /&gt;
attr WebastoNext obj-i1032-type unsigned long big&lt;br /&gt;
attr WebastoNext obj-i1036-reading Energy_Meter&lt;br /&gt;
attr WebastoNext obj-i1036-poll 1&lt;br /&gt;
attr WebastoNext obj-i1036-type unsigned long big&lt;br /&gt;
attr WebastoNext obj-i1036-expr $val/1000&lt;br /&gt;
&lt;br /&gt;
attr WebastoNext obj-i1102-reading Min_Current&lt;br /&gt;
attr WebastoNext obj-i1102-poll 1&lt;br /&gt;
attr WebastoNext obj-i1102-type unsigned short big&lt;br /&gt;
attr WebastoNext obj-i1108-reading EV_Max_Current&lt;br /&gt;
attr WebastoNext obj-i1108-poll 1&lt;br /&gt;
attr WebastoNext obj-i1108-type unsigned short big&lt;br /&gt;
attr WebastoNext obj-i1502-reading Charged_Energy&lt;br /&gt;
attr WebastoNext obj-i1502-poll 1&lt;br /&gt;
attr WebastoNext obj-i1502-type unsigned short big&lt;br /&gt;
attr WebastoNext obj-i1502-expr $val/1000&lt;br /&gt;
attr WebastoNext obj-i1504-reading Charging_Start_Time&lt;br /&gt;
attr WebastoNext obj-i1504-poll 1&lt;br /&gt;
attr WebastoNext obj-i1504-type unsigned long big&lt;br /&gt;
attr WebastoNext obj-i1508-reading Charging_Time&lt;br /&gt;
attr WebastoNext obj-i1508-poll 1&lt;br /&gt;
attr WebastoNext obj-i1508-type unsigned long big&lt;br /&gt;
attr WebastoNext obj-i1512-reading Charging_End_Time&lt;br /&gt;
attr WebastoNext obj-i1512-poll 1&lt;br /&gt;
attr WebastoNext obj-i1512-type unsigned long big&lt;br /&gt;
attr WebastoNext obj-i1620-reading Smart_Vehicle_Detected&lt;br /&gt;
attr WebastoNext obj-i1620-poll 1&lt;br /&gt;
attr WebastoNext obj-i1620-type unsigned short big&lt;br /&gt;
&lt;br /&gt;
attr WebastoNext obj-h2000-reading Safe_Current&lt;br /&gt;
attr WebastoNext obj-h2000-poll 1&lt;br /&gt;
attr WebastoNext obj-h2000-polldelay 600&lt;br /&gt;
attr WebastoNext obj-h2000-type unsigned short big&lt;br /&gt;
attr WebastoNext obj-h2000-set 1&lt;br /&gt;
attr WebastoNext obj-h2000-min 0&lt;br /&gt;
attr WebastoNext obj-h2000-max 16&lt;br /&gt;
&lt;br /&gt;
attr WebastoNext obj-h2002-reading Com_Timeout&lt;br /&gt;
attr WebastoNext obj-h2002-poll 1&lt;br /&gt;
attr WebastoNext obj-h2002-polldelay x199&lt;br /&gt;
attr WebastoNext obj-h2002-type unsigned short big&lt;br /&gt;
attr WebastoNext obj-h2002-set 1&lt;br /&gt;
&lt;br /&gt;
attr WebastoNext obj-h5000-reading Charge_Power_Set&lt;br /&gt;
attr WebastoNext obj-h5000-poll 0&lt;br /&gt;
attr WebastoNext obj-h5000-type unsigned long big&lt;br /&gt;
attr WebastoNext obj-h5000-set 1&lt;br /&gt;
&lt;br /&gt;
attr WebastoNext obj-h5004-reading Charge_Current_Set&lt;br /&gt;
attr WebastoNext obj-h5004-poll 0&lt;br /&gt;
attr WebastoNext obj-h5004-type signed short big&lt;br /&gt;
attr WebastoNext obj-h5004-set 1&lt;br /&gt;
attr WebastoNext obj-h5004-min 0&lt;br /&gt;
attr WebastoNext obj-h5004-max 16&lt;br /&gt;
&lt;br /&gt;
attr WebastoNext obj-h5006-reading Start_Cancel&lt;br /&gt;
attr WebastoNext obj-h5006-poll 0&lt;br /&gt;
attr WebastoNext obj-h5006-type unsigned short big&lt;br /&gt;
attr WebastoNext obj-h5006-set 1&lt;br /&gt;
attr WebastoNext obj-h5006-min 0&lt;br /&gt;
attr WebastoNext obj-h5006-max 2&lt;br /&gt;
attr WebastoNext obj-h5006-hint 0,1,2&lt;br /&gt;
&lt;br /&gt;
attr WebastoNext obj-h6000-reading Life_Bit&lt;br /&gt;
attr WebastoNext obj-h6000-poll 1&lt;br /&gt;
attr WebastoNext obj-h6000-type unsigned short big&lt;br /&gt;
attr WebastoNext obj-h6000-set 1&lt;br /&gt;
&lt;br /&gt;
attr WebastoNext userReadings \&lt;br /&gt;
Charge_Point_State_TXT:Charge_Point_State\b.* {my $val = ReadingsVal (&amp;quot;WebastoNext&amp;quot;,&amp;quot;Charge_Point_State&amp;quot;, 0);; if ($val == 0) {return &amp;quot;no vehicle attached (EVSE available, EVSE unavailable)&amp;quot;} elsif ($val == 1) {return &amp;quot;vehicle attached, no permission (preparing)&amp;quot;} elsif ($val == 3) {return &amp;quot;charging&amp;quot;} elsif ($val == 4) {return &amp;quot;charging paused (suspending EVSE, suspending EV, finishing)&amp;quot;} elsif ($val == 7) {return &amp;quot;charging error&amp;quot;} elsif ($val == 8) {return &amp;quot;charging station reserved&amp;quot;} else { return $val .&amp;quot; undefined&amp;quot; };;},\&lt;br /&gt;
Cable_State_TXT:Cable_State\b.* {my $val = ReadingsVal (&amp;quot;WebastoNext&amp;quot;,&amp;quot;Cable_State&amp;quot;, 0);; if ($val == 0) {return &amp;quot;no cable attached&amp;quot;} elsif ($val == 1) {return &amp;quot;cable attached (no car attached)&amp;quot;} elsif ($val == 2) {return &amp;quot;cable attached (car attached)&amp;quot;} elsif ($val == 3) {return &amp;quot;cable attached (car attached) + lock active&amp;quot;} else { return $val .&amp;quot; undefined&amp;quot; };;}, \&lt;br /&gt;
Charge_State_TXT:Charge_State\b.* {my $val = ReadingsVal (&amp;quot;WebastoNext&amp;quot;,&amp;quot;Charge_State&amp;quot;, 0);; if ($val == 0) {return &amp;quot;idle&amp;quot;} elsif ($val == 1) {return &amp;quot;charging&amp;quot;} else { return $val .&amp;quot; undefined&amp;quot; };;},\&lt;br /&gt;
Error_Code_TXT:Error_Code\b.* {\&lt;br /&gt;
  my $val=&amp;quot; - &amp;quot;;; my $error=ReadingsVal ($NAME,&amp;quot;Error_Code&amp;quot;, 0);;\&lt;br /&gt;
  $val.=&amp;quot;Power switch failure (relay welded) - &amp;quot; if ($error &amp;amp; 1) == 1;;\&lt;br /&gt;
  $val.=&amp;quot;Internal error (error internal aux voltage) - &amp;quot; if ($error &amp;amp; 2) == 2;;\&lt;br /&gt;
  $val.=&amp;quot;EV control pilot voltage out of standard range - &amp;quot; if ($error &amp;amp; 4) == 4;;\&lt;br /&gt;
  $val.=&amp;quot;Overvoltage - &amp;quot; if ($error &amp;amp; 8) == 8;;\&lt;br /&gt;
  $val.=&amp;quot;Undervoltage - &amp;quot; if ($error &amp;amp; 16) == 16;;\&lt;br /&gt;
  $val.=&amp;quot;Overcurrent - &amp;quot; if ($error &amp;amp; 32) == 32;;\&lt;br /&gt;
  $val.=&amp;quot;Error VAC/frequency - &amp;quot; if ($error &amp;amp; 64) == 64;;\&lt;br /&gt;
  $val.=&amp;quot;Ground failure - &amp;quot; if ($error &amp;amp; 128) == 128;;\&lt;br /&gt;
  $val.=&amp;quot;Internal error (residual current monitor self test) - &amp;quot; if ($error &amp;amp; 256) == 256;;\&lt;br /&gt;
  $val.=&amp;quot;High temperature - &amp;quot; if ($error &amp;amp; 512) == 512;;\&lt;br /&gt;
  $val.=&amp;quot;Proximity pilot error - &amp;quot; if ($error &amp;amp; 1024) == 1024;;\&lt;br /&gt;
  $val.=&amp;quot;Shutter error - &amp;quot; if ($error &amp;amp; 2048) == 2048;;\&lt;br /&gt;
  $val.=&amp;quot;Installation phase check - &amp;quot; if ($error &amp;amp; 4096) == 4096;;\&lt;br /&gt;
  $val.=&amp;quot;PWR internal error - &amp;quot; if ($error &amp;amp; 8192) == 8192;;\&lt;br /&gt;
  $val.=&amp;quot;EV negative control pilot - &amp;quot; if ($error &amp;amp; 16384) == 16384;;\&lt;br /&gt;
  $val.=&amp;quot;External error - residual DC current detected (vehicle) - &amp;quot; if ($error &amp;amp; 32768) == 32768;;\&lt;br /&gt;
  return $val;;}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Steuerung ===&lt;br /&gt;
Das Register Charge_Power_Set wird nur berücksichtigt, wenn Charge_Current_Set auf 0 gesetzt ist. Mindestladestromstärke ist 6 A bzw. 4.200 W 3~ oder 1.400 W 1~.&lt;br /&gt;
&lt;br /&gt;
Die Wallbox reagiert nur dann auf die Steuerung, wenn ein regelmäßiges Keep-Alive-Bit gesetzt wird. Ansonsten wird der Lademodus mit dem Wert &amp;quot;Safe_Current&amp;quot; gestartet.&amp;lt;syntaxhighlight lang=&amp;quot;cfg&amp;quot;&amp;gt;&lt;br /&gt;
define WebastoNext_KeepAlive at +*00:00:30 set WebastoNext Life_Bit 1&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Gestartet wird der Ladvorgang mit &amp;quot;set WebastoNext Start_Cancel 1&amp;quot;. Gestoppt wird mit &amp;quot;set WebastoNext Start_Cancel 2&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== 1- und 3-phasiges Laden ===&lt;br /&gt;
Die Wallbox kann sowohl 1- als auch 3-phasig laden. Allerdings kann sie zwischen den beiden Lademodi nicht dynamisch umschalten, sondern muss eigentlich in der jeweiligen elektrischen Konfiguration neu gestartet werden.&lt;br /&gt;
&lt;br /&gt;
Wenn die Wallbox allerdings im 1-phasigen Modus gestartet wurde, kann sie durch Zu- oder Abschalten der Phasen L2 und L3 zwischen ein- und dreiphasigem Laden wechseln. Besonders wichtig ist hierbei, dass dies &#039;&#039;&#039;nicht während des Ladevorganges&#039;&#039;&#039; erfolgen sollte. Zudem wird dann auf der Webseite der Wallbox ein Fehler angezeigt. Ein Steuerung des Ladevorgang über die Stromstärke ist in diesem Modus unverändert möglich. Beim &#039;&#039;&#039;Steuern über die Leistung&#039;&#039;&#039;, geht die Wallbox anscheinend nach wie vor von nur 1-phasigem Laden aus und kommuniziert dadurch die 3-fache Stromstärke ans Auto. D .h. wenn man diesen &amp;quot;Phasen-Umschalt-Bug&amp;quot; nutzen will, darf nur ein Drittel der gewünschten Leistung angegeben werden.&lt;br /&gt;
&lt;br /&gt;
Die Phasen können z.B. mit zwei (stromsparenden) Stromstoßrelais an- und abgeschaltet werden. Konkret wird die Wallbox komplett stromlos geschaltet und dann nur mit Phase L1 oder zusätzlich mit den Phase L2 und L3 neu gestartet. Die Wallbox braucht etwa 3 Minuten um wieder hoch zu fahren und wertet dabei die anstehenden Phasen aus. Ein Wegschalten von Phasen nach dem 3-phasigem Hochfahren führt zu einer Fehlermeldung und die Wallbox reagiert nicht mehr.&lt;br /&gt;
[[Kategorie:Wallboxen]]&lt;br /&gt;
[[Kategorie:Elektromobilität]]&lt;br /&gt;
__INHALTSVERZEICHNIS_ERZWINGEN__&lt;br /&gt;
__INDEXIEREN__&lt;/div&gt;</summary>
		<author><name>Topos</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Webasto_Next&amp;diff=40183</id>
		<title>Webasto Next</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Webasto_Next&amp;diff=40183"/>
		<updated>2025-05-27T17:27:39Z</updated>

		<summary type="html">&lt;p&gt;Topos: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Die Wallbox Webasto Next kann per LAN oder WLAN über das Modebus-Protokoll ausgelesen und gesteuert werden. Sie liest den Batteriestand des E-Autos nicht aus. Dies könnte aber über spezielle Hardware wie den [https://www.meatpi.com/products/wican MeatPi WiCAN-OBD-C3 Adapter] oder passende E-Auto-App-Abfragen und FHEM-Module erfolgen.&lt;br /&gt;
&lt;br /&gt;
Hier eine mögliche Konfiguration:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
define WebastoNext ModbusAttr 1 3 [IP-Addresse]:502 TCP&lt;br /&gt;
attr WebastoNext alias Wallbox&lt;br /&gt;
attr WebastoNext icon wallbox&lt;br /&gt;
attr WebastoNext stateFormat Charge_Point_State_TXT&amp;lt;br&amp;gt;Cable_State_TXT&amp;lt;br&amp;gt;Charge_State_TXT: Charge_Active_Power W&lt;br /&gt;
attr WebastoNext event-on-update-reading .*&lt;br /&gt;
attr WebastoNext DbLogExclude .*&lt;br /&gt;
attr WebastoNext DbLogInclude Charge_Active_Power:600&lt;br /&gt;
attr WebastoNext oldreadings Cable_State&lt;br /&gt;
attr WebastoNext obj-i1000-poll 1&lt;br /&gt;
attr WebastoNext obj-i1000-reading Charge_Point_State&lt;br /&gt;
attr WebastoNext obj-i1000-type unsigned short big&lt;br /&gt;
attr WebastoNext obj-i1001-poll 1&lt;br /&gt;
attr WebastoNext obj-i1001-reading Charge_State&lt;br /&gt;
attr WebastoNext obj-i1001-type unsigned short big&lt;br /&gt;
attr WebastoNext obj-i1004-poll 1&lt;br /&gt;
attr WebastoNext obj-i1004-reading Cable_State&lt;br /&gt;
attr WebastoNext obj-i1004-type unsigned short big&lt;br /&gt;
attr WebastoNext obj-i1006-poll 1&lt;br /&gt;
attr WebastoNext obj-i1006-reading Error_Code&lt;br /&gt;
attr WebastoNext obj-i1006-type unsigned short big&lt;br /&gt;
attr WebastoNext obj-i1008-poll 1&lt;br /&gt;
attr WebastoNext obj-i1008-reading Charge_Active_Current_L1&lt;br /&gt;
attr WebastoNext obj-i1008-type unsigned short big&lt;br /&gt;
attr WebastoNext obj-i1008-expr $val/1000&lt;br /&gt;
attr WebastoNext obj-i1010-poll 1&lt;br /&gt;
attr WebastoNext obj-i1010-reading Charge_Active_Current_L2&lt;br /&gt;
attr WebastoNext obj-i1010-type unsigned short big&lt;br /&gt;
attr WebastoNext obj-i1010-expr $val/1000&lt;br /&gt;
attr WebastoNext obj-i1012-poll 1&lt;br /&gt;
attr WebastoNext obj-i1012-reading Charge_Active_Current_L3&lt;br /&gt;
attr WebastoNext obj-i1012-type unsigned short big&lt;br /&gt;
attr WebastoNext obj-i1012-expr $val/1000&lt;br /&gt;
attr WebastoNext obj-i1020-poll 1&lt;br /&gt;
attr WebastoNext obj-i1020-reading Charge_Active_Power&lt;br /&gt;
attr WebastoNext obj-i1020-type unsigned long big&lt;br /&gt;
attr WebastoNext obj-i1024-reading Charge_Active_Power_L1&lt;br /&gt;
attr WebastoNext obj-i1024-poll 1&lt;br /&gt;
attr WebastoNext obj-i1024-type unsigned long big&lt;br /&gt;
attr WebastoNext obj-i1028-reading Charge_Active_Power_L2&lt;br /&gt;
attr WebastoNext obj-i1028-poll 1&lt;br /&gt;
attr WebastoNext obj-i1028-type unsigned long big&lt;br /&gt;
attr WebastoNext obj-i1032-reading Charge_Active_Power_L3&lt;br /&gt;
attr WebastoNext obj-i1032-poll 1&lt;br /&gt;
attr WebastoNext obj-i1032-type unsigned long big&lt;br /&gt;
attr WebastoNext obj-i1036-reading Energy_Meter&lt;br /&gt;
attr WebastoNext obj-i1036-poll 1&lt;br /&gt;
attr WebastoNext obj-i1036-type unsigned long big&lt;br /&gt;
attr WebastoNext obj-i1036-expr $val/1000&lt;br /&gt;
&lt;br /&gt;
attr WebastoNext obj-i1102-reading Min_Current&lt;br /&gt;
attr WebastoNext obj-i1102-poll 1&lt;br /&gt;
attr WebastoNext obj-i1102-type unsigned short big&lt;br /&gt;
attr WebastoNext obj-i1108-reading EV_Max_Current&lt;br /&gt;
attr WebastoNext obj-i1108-poll 1&lt;br /&gt;
attr WebastoNext obj-i1108-type unsigned short big&lt;br /&gt;
attr WebastoNext obj-i1502-reading Charged_Energy&lt;br /&gt;
attr WebastoNext obj-i1502-poll 1&lt;br /&gt;
attr WebastoNext obj-i1502-type unsigned short big&lt;br /&gt;
attr WebastoNext obj-i1502-expr $val/1000&lt;br /&gt;
attr WebastoNext obj-i1504-reading Charging_Start_Time&lt;br /&gt;
attr WebastoNext obj-i1504-poll 1&lt;br /&gt;
attr WebastoNext obj-i1504-type unsigned long big&lt;br /&gt;
attr WebastoNext obj-i1508-reading Charging_Time&lt;br /&gt;
attr WebastoNext obj-i1508-poll 1&lt;br /&gt;
attr WebastoNext obj-i1508-type unsigned long big&lt;br /&gt;
attr WebastoNext obj-i1512-reading Charging_End_Time&lt;br /&gt;
attr WebastoNext obj-i1512-poll 1&lt;br /&gt;
attr WebastoNext obj-i1512-type unsigned long big&lt;br /&gt;
attr WebastoNext obj-i1620-reading Smart_Vehicle_Detected&lt;br /&gt;
attr WebastoNext obj-i1620-poll 1&lt;br /&gt;
attr WebastoNext obj-i1620-type unsigned short big&lt;br /&gt;
&lt;br /&gt;
attr WebastoNext obj-h2000-reading Safe_Current&lt;br /&gt;
attr WebastoNext obj-h2000-poll 1&lt;br /&gt;
attr WebastoNext obj-h2000-polldelay 600&lt;br /&gt;
attr WebastoNext obj-h2000-type unsigned short big&lt;br /&gt;
attr WebastoNext obj-h2000-set 1&lt;br /&gt;
attr WebastoNext obj-h2000-min 0&lt;br /&gt;
attr WebastoNext obj-h2000-max 16&lt;br /&gt;
&lt;br /&gt;
attr WebastoNext obj-h2002-reading Com_Timeout&lt;br /&gt;
attr WebastoNext obj-h2002-poll 1&lt;br /&gt;
attr WebastoNext obj-h2002-polldelay x199&lt;br /&gt;
attr WebastoNext obj-h2002-type unsigned short big&lt;br /&gt;
attr WebastoNext obj-h2002-set 1&lt;br /&gt;
&lt;br /&gt;
attr WebastoNext obj-h5000-reading Charge_Power_Set&lt;br /&gt;
attr WebastoNext obj-h5000-poll 0&lt;br /&gt;
attr WebastoNext obj-h5000-type unsigned long big&lt;br /&gt;
attr WebastoNext obj-h5000-set 1&lt;br /&gt;
&lt;br /&gt;
attr WebastoNext obj-h5004-reading Charge_Current_Set&lt;br /&gt;
attr WebastoNext obj-h5004-poll 0&lt;br /&gt;
attr WebastoNext obj-h5004-type signed short big&lt;br /&gt;
attr WebastoNext obj-h5004-set 1&lt;br /&gt;
attr WebastoNext obj-h5004-min 0&lt;br /&gt;
attr WebastoNext obj-h5004-max 16&lt;br /&gt;
&lt;br /&gt;
attr WebastoNext obj-h5006-reading Start_Cancel&lt;br /&gt;
attr WebastoNext obj-h5006-poll 0&lt;br /&gt;
attr WebastoNext obj-h5006-type unsigned short big&lt;br /&gt;
attr WebastoNext obj-h5006-set 1&lt;br /&gt;
attr WebastoNext obj-h5006-min 0&lt;br /&gt;
attr WebastoNext obj-h5006-max 2&lt;br /&gt;
attr WebastoNext obj-h5006-hint 0,1,2&lt;br /&gt;
&lt;br /&gt;
attr WebastoNext obj-h6000-reading Life_Bit&lt;br /&gt;
attr WebastoNext obj-h6000-poll 1&lt;br /&gt;
attr WebastoNext obj-h6000-type unsigned short big&lt;br /&gt;
attr WebastoNext obj-h6000-set 1&lt;br /&gt;
&lt;br /&gt;
attr WebastoNext userReadings \&lt;br /&gt;
Charge_Point_State_TXT:Charge_Point_State\b.* {my $val = ReadingsVal (&amp;quot;WebastoNext&amp;quot;,&amp;quot;Charge_Point_State&amp;quot;, 0);; if ($val == 0) {return &amp;quot;no vehicle attached (EVSE available, EVSE unavailable)&amp;quot;} elsif ($val == 1) {return &amp;quot;vehicle attached, no permission (preparing)&amp;quot;} elsif ($val == 3) {return &amp;quot;charging&amp;quot;} elsif ($val == 4) {return &amp;quot;charging paused (suspending EVSE, suspending EV, finishing)&amp;quot;} elsif ($val == 7) {return &amp;quot;charging error&amp;quot;} elsif ($val == 8) {return &amp;quot;charging station reserved&amp;quot;} else { return $val .&amp;quot; undefined&amp;quot; };;},\&lt;br /&gt;
Cable_State_TXT:Cable_State\b.* {my $val = ReadingsVal (&amp;quot;WebastoNext&amp;quot;,&amp;quot;Cable_State&amp;quot;, 0);; if ($val == 0) {return &amp;quot;no cable attached&amp;quot;} elsif ($val == 1) {return &amp;quot;cable attached (no car attached)&amp;quot;} elsif ($val == 2) {return &amp;quot;cable attached (car attached)&amp;quot;} elsif ($val == 3) {return &amp;quot;cable attached (car attached) + lock active&amp;quot;} else { return $val .&amp;quot; undefined&amp;quot; };;}, \&lt;br /&gt;
Charge_State_TXT:Charge_State\b.* {my $val = ReadingsVal (&amp;quot;WebastoNext&amp;quot;,&amp;quot;Charge_State&amp;quot;, 0);; if ($val == 0) {return &amp;quot;idle&amp;quot;} elsif ($val == 1) {return &amp;quot;charging&amp;quot;} else { return $val .&amp;quot; undefined&amp;quot; };;},\&lt;br /&gt;
Error_Code_TXT:Error_Code\b.* {\&lt;br /&gt;
  my $val=&amp;quot; - &amp;quot;;; my $error=ReadingsVal ($NAME,&amp;quot;Error_Code&amp;quot;, 0);;\&lt;br /&gt;
  $val.=&amp;quot;Power switch failure (relay welded) - &amp;quot; if ($error &amp;amp; 1) == 1;;\&lt;br /&gt;
  $val.=&amp;quot;Internal error (error internal aux voltage) - &amp;quot; if ($error &amp;amp; 2) == 2;;\&lt;br /&gt;
  $val.=&amp;quot;EV control pilot voltage out of standard range - &amp;quot; if ($error &amp;amp; 4) == 4;;\&lt;br /&gt;
  $val.=&amp;quot;Overvoltage - &amp;quot; if ($error &amp;amp; 8) == 8;;\&lt;br /&gt;
  $val.=&amp;quot;Undervoltage - &amp;quot; if ($error &amp;amp; 16) == 16;;\&lt;br /&gt;
  $val.=&amp;quot;Overcurrent - &amp;quot; if ($error &amp;amp; 32) == 32;;\&lt;br /&gt;
  $val.=&amp;quot;Error VAC/frequency - &amp;quot; if ($error &amp;amp; 64) == 64;;\&lt;br /&gt;
  $val.=&amp;quot;Ground failure - &amp;quot; if ($error &amp;amp; 128) == 128;;\&lt;br /&gt;
  $val.=&amp;quot;Internal error (residual current monitor self test) - &amp;quot; if ($error &amp;amp; 256) == 256;;\&lt;br /&gt;
  $val.=&amp;quot;High temperature - &amp;quot; if ($error &amp;amp; 512) == 512;;\&lt;br /&gt;
  $val.=&amp;quot;Proximity pilot error - &amp;quot; if ($error &amp;amp; 1024) == 1024;;\&lt;br /&gt;
  $val.=&amp;quot;Shutter error - &amp;quot; if ($error &amp;amp; 2048) == 2048;;\&lt;br /&gt;
  $val.=&amp;quot;Installation phase check - &amp;quot; if ($error &amp;amp; 4096) == 4096;;\&lt;br /&gt;
  $val.=&amp;quot;PWR internal error - &amp;quot; if ($error &amp;amp; 8192) == 8192;;\&lt;br /&gt;
  $val.=&amp;quot;EV negative control pilot - &amp;quot; if ($error &amp;amp; 16384) == 16384;;\&lt;br /&gt;
  $val.=&amp;quot;External error - residual DC current detected (vehicle) - &amp;quot; if ($error &amp;amp; 32768) == 32768;;\&lt;br /&gt;
  return $val;;}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Steuerung ===&lt;br /&gt;
Das Register Charge_Power_Set wird nur berücksichtigt, wenn Charge_Current_Set auf 0 gesetzt ist. Mindestladestromstärke ist 6 A bzw. 4.200 W 3~ oder 1.400 W 1~.&lt;br /&gt;
&lt;br /&gt;
Die Wallbox reagiert nur dann auf die Steuerung, wenn ein regelmäßiges Keep-Alive-Bit gesetzt wird. Ansonsten wird der Lademodus mit dem Wert &amp;quot;Safe_Current&amp;quot; gestartet.&amp;lt;syntaxhighlight lang=&amp;quot;cfg&amp;quot;&amp;gt;&lt;br /&gt;
define WebastoNext_KeepAlive at +*00:00:30 set WebastoNext Life_Bit 1&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Gestartet wird der Ladvorgang mit &amp;quot;set WebastoNext Start_Cancel 1&amp;quot;. Gestoppt wird mit &amp;quot;set WebastoNext Start_Cancel 2&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== 1- und 3-phasiges Laden ===&lt;br /&gt;
Die Wallbox kann sowohl 1- als auch 3-phasig laden. Allerdings kann sie zwischen den beiden Lademodi nicht dynamisch umschalten, sondern muss eigentlich in der jeweiligen elektrischen Konfiguration neu gestartet werden. Wenn die Wallbox allerdings im 1-phasigen Modus gestartet wurde, kann sie durch Zu- oder Abschalten der Phasen L2 und L3 zwischen ein- und dreiphasigem Laden wechseln. Absolut wichtig ist hierbei jedoch, dass dies &#039;&#039;&#039;nicht während des Ladevorganges&#039;&#039;&#039; erfolgen darf. Zudem wird dann auf der Webseite der Wallbox ein Fehler angezeigt.&lt;br /&gt;
&lt;br /&gt;
Die Phasen können z.B. mit zwei (stromsparenden) Stromstoßrelais an- und abgeschaltet werden. Konkret wird die Wallbox komplett stromlos geschaltet und dann nur mit Phase L1 oder zusätzlich mit den Phase L2 und L3 neu gestartet. Die Wallbox braucht etwa 3 Minuten um wieder hoch zu fahren und wertet dabei die anstehenden Phasen aus. Ein Wegschalten von Phasen nach dem 3-phasigem Hochfahren führt zu einer Fehlermeldung und die Wallbox reagiert nicht mehr.&lt;br /&gt;
[[Kategorie:Wallboxen]]&lt;br /&gt;
[[Kategorie:Elektromobilität]]&lt;br /&gt;
__INHALTSVERZEICHNIS_ERZWINGEN__&lt;br /&gt;
__INDEXIEREN__&lt;/div&gt;</summary>
		<author><name>Topos</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Webasto_Next&amp;diff=40178</id>
		<title>Webasto Next</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Webasto_Next&amp;diff=40178"/>
		<updated>2025-05-24T16:42:01Z</updated>

		<summary type="html">&lt;p&gt;Topos: /* 1- und 3-phasiges Laden */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Die Wallbox Webasto Next kann per LAN oder WLAN über das Modebus-Protokoll ausgelesen und gesteuert werden. Sie liest den Batteriestand des E-Autos nicht aus. Dies könnte aber über spezielle Hardware wie den [https://www.meatpi.com/products/wican MeatPi WiCAN-OBD-C3 Adapter] oder passende E-Auto-App-Abfragen und FHEM-Module erfolgen.&lt;br /&gt;
&lt;br /&gt;
Hier eine mögliche Konfiguration:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Perl&amp;quot;&amp;gt;&lt;br /&gt;
define WebastoNext ModbusAttr 1 3 [IP-Addresse]:502 TCP&lt;br /&gt;
attr WebastoNext alias Wallbox&lt;br /&gt;
attr WebastoNext icon wallbox&lt;br /&gt;
attr WebastoNext stateFormat Charge_Point_State_TXT&amp;lt;br&amp;gt;Cable_State_TXT&amp;lt;br&amp;gt;Charge_State_TXT: Charge_Active_Power W&lt;br /&gt;
attr WebastoNext event-on-update-reading .*&lt;br /&gt;
attr WebastoNext DbLogExclude .*&lt;br /&gt;
attr WebastoNext DbLogInclude Charge_Active_Power:600&lt;br /&gt;
attr WebastoNext oldreadings Cable_State&lt;br /&gt;
attr WebastoNext obj-i1000-poll 1&lt;br /&gt;
attr WebastoNext obj-i1000-reading Charge_Point_State&lt;br /&gt;
attr WebastoNext obj-i1000-type unsigned short big&lt;br /&gt;
attr WebastoNext obj-i1001-poll 1&lt;br /&gt;
attr WebastoNext obj-i1001-reading Charge_State&lt;br /&gt;
attr WebastoNext obj-i1001-type unsigned short big&lt;br /&gt;
attr WebastoNext obj-i1004-poll 1&lt;br /&gt;
attr WebastoNext obj-i1004-reading Cable_State&lt;br /&gt;
attr WebastoNext obj-i1004-type unsigned short big&lt;br /&gt;
attr WebastoNext obj-i1006-poll 1&lt;br /&gt;
attr WebastoNext obj-i1006-reading Error_Code&lt;br /&gt;
attr WebastoNext obj-i1006-type unsigned short big&lt;br /&gt;
attr WebastoNext obj-i1008-poll 1&lt;br /&gt;
attr WebastoNext obj-i1008-reading Charge_Active_Current_L1&lt;br /&gt;
attr WebastoNext obj-i1008-type unsigned short big&lt;br /&gt;
attr WebastoNext obj-i1008-expr $val/1000&lt;br /&gt;
attr WebastoNext obj-i1010-poll 1&lt;br /&gt;
attr WebastoNext obj-i1010-reading Charge_Active_Current_L2&lt;br /&gt;
attr WebastoNext obj-i1010-type unsigned short big&lt;br /&gt;
attr WebastoNext obj-i1010-expr $val/1000&lt;br /&gt;
attr WebastoNext obj-i1012-poll 1&lt;br /&gt;
attr WebastoNext obj-i1012-reading Charge_Active_Current_L3&lt;br /&gt;
attr WebastoNext obj-i1012-type unsigned short big&lt;br /&gt;
attr WebastoNext obj-i1012-expr $val/1000&lt;br /&gt;
attr WebastoNext obj-i1020-poll 1&lt;br /&gt;
attr WebastoNext obj-i1020-reading Charge_Active_Power&lt;br /&gt;
attr WebastoNext obj-i1020-type unsigned long big&lt;br /&gt;
attr WebastoNext obj-i1024-reading Charge_Active_Power_L1&lt;br /&gt;
attr WebastoNext obj-i1024-poll 1&lt;br /&gt;
attr WebastoNext obj-i1024-type unsigned long big&lt;br /&gt;
attr WebastoNext obj-i1028-reading Charge_Active_Power_L2&lt;br /&gt;
attr WebastoNext obj-i1028-poll 1&lt;br /&gt;
attr WebastoNext obj-i1028-type unsigned long big&lt;br /&gt;
attr WebastoNext obj-i1032-reading Charge_Active_Power_L3&lt;br /&gt;
attr WebastoNext obj-i1032-poll 1&lt;br /&gt;
attr WebastoNext obj-i1032-type unsigned long big&lt;br /&gt;
attr WebastoNext obj-i1036-reading Energy_Meter&lt;br /&gt;
attr WebastoNext obj-i1036-poll 1&lt;br /&gt;
attr WebastoNext obj-i1036-type unsigned long big&lt;br /&gt;
attr WebastoNext obj-i1036-expr $val/1000&lt;br /&gt;
&lt;br /&gt;
attr WebastoNext obj-i1102-reading Min_Current&lt;br /&gt;
attr WebastoNext obj-i1102-poll 1&lt;br /&gt;
attr WebastoNext obj-i1102-type unsigned short big&lt;br /&gt;
attr WebastoNext obj-i1108-reading EV_Max_Current&lt;br /&gt;
attr WebastoNext obj-i1108-poll 1&lt;br /&gt;
attr WebastoNext obj-i1108-type unsigned short big&lt;br /&gt;
attr WebastoNext obj-i1502-reading Charged_Energy&lt;br /&gt;
attr WebastoNext obj-i1502-poll 1&lt;br /&gt;
attr WebastoNext obj-i1502-type unsigned short big&lt;br /&gt;
attr WebastoNext obj-i1502-expr $val/1000&lt;br /&gt;
attr WebastoNext obj-i1504-reading Charging_Start_Time&lt;br /&gt;
attr WebastoNext obj-i1504-poll 1&lt;br /&gt;
attr WebastoNext obj-i1504-type unsigned long big&lt;br /&gt;
attr WebastoNext obj-i1508-reading Charging_Time&lt;br /&gt;
attr WebastoNext obj-i1508-poll 1&lt;br /&gt;
attr WebastoNext obj-i1508-type unsigned long big&lt;br /&gt;
attr WebastoNext obj-i1512-reading Charging_End_Time&lt;br /&gt;
attr WebastoNext obj-i1512-poll 1&lt;br /&gt;
attr WebastoNext obj-i1512-type unsigned long big&lt;br /&gt;
attr WebastoNext obj-i1620-reading Smart_Vehicle_Detected&lt;br /&gt;
attr WebastoNext obj-i1620-poll 1&lt;br /&gt;
attr WebastoNext obj-i1620-type unsigned short big&lt;br /&gt;
&lt;br /&gt;
attr WebastoNext obj-h2000-reading Safe_Current&lt;br /&gt;
attr WebastoNext obj-h2000-poll 1&lt;br /&gt;
attr WebastoNext obj-h2000-polldelay 600&lt;br /&gt;
attr WebastoNext obj-h2000-type unsigned short big&lt;br /&gt;
attr WebastoNext obj-h2000-set 1&lt;br /&gt;
attr WebastoNext obj-h2000-min 0&lt;br /&gt;
attr WebastoNext obj-h2000-max 16&lt;br /&gt;
&lt;br /&gt;
attr WebastoNext obj-h2002-reading Com_Timeout&lt;br /&gt;
attr WebastoNext obj-h2002-poll 1&lt;br /&gt;
attr WebastoNext obj-h2002-polldelay x199&lt;br /&gt;
attr WebastoNext obj-h2002-type unsigned short big&lt;br /&gt;
attr WebastoNext obj-h2002-set 1&lt;br /&gt;
&lt;br /&gt;
attr WebastoNext obj-h5000-reading Charge_Power_Set&lt;br /&gt;
attr WebastoNext obj-h5000-poll 0&lt;br /&gt;
attr WebastoNext obj-h5000-type unsigned long big&lt;br /&gt;
attr WebastoNext obj-h5000-set 1&lt;br /&gt;
&lt;br /&gt;
attr WebastoNext obj-h5004-reading Charge_Current_Set&lt;br /&gt;
attr WebastoNext obj-h5004-poll 0&lt;br /&gt;
attr WebastoNext obj-h5004-type signed short big&lt;br /&gt;
attr WebastoNext obj-h5004-set 1&lt;br /&gt;
attr WebastoNext obj-h5004-min 0&lt;br /&gt;
attr WebastoNext obj-h5004-max 16&lt;br /&gt;
&lt;br /&gt;
attr WebastoNext obj-h5006-reading Start_Cancel&lt;br /&gt;
attr WebastoNext obj-h5006-poll 0&lt;br /&gt;
attr WebastoNext obj-h5006-type unsigned short big&lt;br /&gt;
attr WebastoNext obj-h5006-set 1&lt;br /&gt;
attr WebastoNext obj-h5006-min 0&lt;br /&gt;
attr WebastoNext obj-h5006-max 2&lt;br /&gt;
attr WebastoNext obj-h5006-hint 0,1,2&lt;br /&gt;
&lt;br /&gt;
attr WebastoNext obj-h6000-reading Life_Bit&lt;br /&gt;
attr WebastoNext obj-h6000-poll 1&lt;br /&gt;
attr WebastoNext obj-h6000-type unsigned short big&lt;br /&gt;
attr WebastoNext obj-h6000-set 1&lt;br /&gt;
&lt;br /&gt;
attr WebastoNext userReadings \&lt;br /&gt;
Charge_Point_State_TXT:Charge_Point_State\b.* {my $val = ReadingsVal (&amp;quot;WebastoNext&amp;quot;,&amp;quot;Charge_Point_State&amp;quot;, 0);; if ($val == 0) {return &amp;quot;no vehicle attached (EVSE available, EVSE unavailable)&amp;quot;} elsif ($val == 1) {return &amp;quot;vehicle attached, no permission (preparing)&amp;quot;} elsif ($val == 3) {return &amp;quot;charging&amp;quot;} elsif ($val == 4) {return &amp;quot;charging paused (suspending EVSE, suspending EV, finishing)&amp;quot;} elsif ($val == 7) {return &amp;quot;charging error&amp;quot;} elsif ($val == 8) {return &amp;quot;charging station reserved&amp;quot;} else { return $val .&amp;quot; undefined&amp;quot; };;},\&lt;br /&gt;
Cable_State_TXT:Cable_State\b.* {my $val = ReadingsVal (&amp;quot;WebastoNext&amp;quot;,&amp;quot;Cable_State&amp;quot;, 0);; if ($val == 0) {return &amp;quot;no cable attached&amp;quot;} elsif ($val == 1) {return &amp;quot;cable attached (no car attached)&amp;quot;} elsif ($val == 2) {return &amp;quot;cable attached (car attached)&amp;quot;} elsif ($val == 3) {return &amp;quot;cable attached (car attached) + lock active&amp;quot;} else { return $val .&amp;quot; undefined&amp;quot; };;}, \&lt;br /&gt;
Charge_State_TXT:Charge_State\b.* {my $val = ReadingsVal (&amp;quot;WebastoNext&amp;quot;,&amp;quot;Charge_State&amp;quot;, 0);; if ($val == 0) {return &amp;quot;idle&amp;quot;} elsif ($val == 1) {return &amp;quot;charging&amp;quot;} else { return $val .&amp;quot; undefined&amp;quot; };;}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Steuerung ===&lt;br /&gt;
Das Register Charge_Power_Set wird nur berücksichtigt, wenn Charge_Current_Set auf 0 gesetzt ist. Mindestladestromstärke ist 6 A bzw. 4.200 W 3~ oder 1.400 W 1~.&lt;br /&gt;
&lt;br /&gt;
Die Wallbox reagiert nur dann auf die Steuerung, wenn ein regelmäßiges Keep-Alive-Bit gesetzt wird. Ansonsten wird der Lademodus mit dem Wert &amp;quot;Safe_Current&amp;quot; gestartet.&amp;lt;syntaxhighlight lang=&amp;quot;cfg&amp;quot;&amp;gt;&lt;br /&gt;
define WebastoNext_KeepAlive at +*00:00:30 set WebastoNext Life_Bit 1&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Gestartet wird der Ladvorgang mit &amp;quot;set WebastoNext Start_Cancel 1&amp;quot;. Gestoppt wird mit &amp;quot;set WebastoNext Start_Cancel 2&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== 1- und 3-phasiges Laden ===&lt;br /&gt;
Die Wallbox kann sowohl 1- als auch 3-phasig laden. Allerdings kann sie zwischen den beiden Lademodi nicht dynamisch umschalten, sondern muss eigentlich in der jeweiligen elektrischen Konfiguration neu gestartet werden. Wenn die Wallbox allerdings im 1-phasigen Modus gestartet wurde, kann sie durch Zu- oder Abschalten der Phasen L2 und L3 zwischen ein- und dreiphasigem Laden wechseln. Absolut wichtig ist hierbei jedoch, dass dies &#039;&#039;&#039;nicht während des Ladevorganges&#039;&#039;&#039; erfolgen darf. Zudem wird dann auf der Webseite der Wallbox ein Fehler angezeigt.&lt;br /&gt;
&lt;br /&gt;
Die Phasen können z.B. mit zwei (stromsparenden) Stromstoßrelais an- und abgeschaltet werden. Konkret wird die Wallbox komplett stromlos geschaltet und dann nur mit Phase L1 oder zusätzlich mit den Phase L2 und L3 neu gestartet. Die Wallbox braucht etwa 3 Minuten um wieder hoch zu fahren und wertet dabei die anstehenden Phasen aus. Ein Wegschalten von Phasen nach dem 3-phasigem Hochfahren führt zu einer Fehlermeldung und die Wallbox reagiert nicht mehr.&lt;br /&gt;
[[Kategorie:Wallboxen]]&lt;br /&gt;
[[Kategorie:Elektromobilität]]&lt;br /&gt;
__INHALTSVERZEICHNIS_ERZWINGEN__&lt;br /&gt;
__INDEXIEREN__&lt;/div&gt;</summary>
		<author><name>Topos</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Webasto_Next&amp;diff=40177</id>
		<title>Webasto Next</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Webasto_Next&amp;diff=40177"/>
		<updated>2025-05-24T16:41:18Z</updated>

		<summary type="html">&lt;p&gt;Topos: /* 1- und 3-phasiges Laden */ Umschalten ohne Neustart ergänzt&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Die Wallbox Webasto Next kann per LAN oder WLAN über das Modebus-Protokoll ausgelesen und gesteuert werden. Sie liest den Batteriestand des E-Autos nicht aus. Dies könnte aber über spezielle Hardware wie den [https://www.meatpi.com/products/wican MeatPi WiCAN-OBD-C3 Adapter] oder passende E-Auto-App-Abfragen und FHEM-Module erfolgen.&lt;br /&gt;
&lt;br /&gt;
Hier eine mögliche Konfiguration:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Perl&amp;quot;&amp;gt;&lt;br /&gt;
define WebastoNext ModbusAttr 1 3 [IP-Addresse]:502 TCP&lt;br /&gt;
attr WebastoNext alias Wallbox&lt;br /&gt;
attr WebastoNext icon wallbox&lt;br /&gt;
attr WebastoNext stateFormat Charge_Point_State_TXT&amp;lt;br&amp;gt;Cable_State_TXT&amp;lt;br&amp;gt;Charge_State_TXT: Charge_Active_Power W&lt;br /&gt;
attr WebastoNext event-on-update-reading .*&lt;br /&gt;
attr WebastoNext DbLogExclude .*&lt;br /&gt;
attr WebastoNext DbLogInclude Charge_Active_Power:600&lt;br /&gt;
attr WebastoNext oldreadings Cable_State&lt;br /&gt;
attr WebastoNext obj-i1000-poll 1&lt;br /&gt;
attr WebastoNext obj-i1000-reading Charge_Point_State&lt;br /&gt;
attr WebastoNext obj-i1000-type unsigned short big&lt;br /&gt;
attr WebastoNext obj-i1001-poll 1&lt;br /&gt;
attr WebastoNext obj-i1001-reading Charge_State&lt;br /&gt;
attr WebastoNext obj-i1001-type unsigned short big&lt;br /&gt;
attr WebastoNext obj-i1004-poll 1&lt;br /&gt;
attr WebastoNext obj-i1004-reading Cable_State&lt;br /&gt;
attr WebastoNext obj-i1004-type unsigned short big&lt;br /&gt;
attr WebastoNext obj-i1006-poll 1&lt;br /&gt;
attr WebastoNext obj-i1006-reading Error_Code&lt;br /&gt;
attr WebastoNext obj-i1006-type unsigned short big&lt;br /&gt;
attr WebastoNext obj-i1008-poll 1&lt;br /&gt;
attr WebastoNext obj-i1008-reading Charge_Active_Current_L1&lt;br /&gt;
attr WebastoNext obj-i1008-type unsigned short big&lt;br /&gt;
attr WebastoNext obj-i1008-expr $val/1000&lt;br /&gt;
attr WebastoNext obj-i1010-poll 1&lt;br /&gt;
attr WebastoNext obj-i1010-reading Charge_Active_Current_L2&lt;br /&gt;
attr WebastoNext obj-i1010-type unsigned short big&lt;br /&gt;
attr WebastoNext obj-i1010-expr $val/1000&lt;br /&gt;
attr WebastoNext obj-i1012-poll 1&lt;br /&gt;
attr WebastoNext obj-i1012-reading Charge_Active_Current_L3&lt;br /&gt;
attr WebastoNext obj-i1012-type unsigned short big&lt;br /&gt;
attr WebastoNext obj-i1012-expr $val/1000&lt;br /&gt;
attr WebastoNext obj-i1020-poll 1&lt;br /&gt;
attr WebastoNext obj-i1020-reading Charge_Active_Power&lt;br /&gt;
attr WebastoNext obj-i1020-type unsigned long big&lt;br /&gt;
attr WebastoNext obj-i1024-reading Charge_Active_Power_L1&lt;br /&gt;
attr WebastoNext obj-i1024-poll 1&lt;br /&gt;
attr WebastoNext obj-i1024-type unsigned long big&lt;br /&gt;
attr WebastoNext obj-i1028-reading Charge_Active_Power_L2&lt;br /&gt;
attr WebastoNext obj-i1028-poll 1&lt;br /&gt;
attr WebastoNext obj-i1028-type unsigned long big&lt;br /&gt;
attr WebastoNext obj-i1032-reading Charge_Active_Power_L3&lt;br /&gt;
attr WebastoNext obj-i1032-poll 1&lt;br /&gt;
attr WebastoNext obj-i1032-type unsigned long big&lt;br /&gt;
attr WebastoNext obj-i1036-reading Energy_Meter&lt;br /&gt;
attr WebastoNext obj-i1036-poll 1&lt;br /&gt;
attr WebastoNext obj-i1036-type unsigned long big&lt;br /&gt;
attr WebastoNext obj-i1036-expr $val/1000&lt;br /&gt;
&lt;br /&gt;
attr WebastoNext obj-i1102-reading Min_Current&lt;br /&gt;
attr WebastoNext obj-i1102-poll 1&lt;br /&gt;
attr WebastoNext obj-i1102-type unsigned short big&lt;br /&gt;
attr WebastoNext obj-i1108-reading EV_Max_Current&lt;br /&gt;
attr WebastoNext obj-i1108-poll 1&lt;br /&gt;
attr WebastoNext obj-i1108-type unsigned short big&lt;br /&gt;
attr WebastoNext obj-i1502-reading Charged_Energy&lt;br /&gt;
attr WebastoNext obj-i1502-poll 1&lt;br /&gt;
attr WebastoNext obj-i1502-type unsigned short big&lt;br /&gt;
attr WebastoNext obj-i1502-expr $val/1000&lt;br /&gt;
attr WebastoNext obj-i1504-reading Charging_Start_Time&lt;br /&gt;
attr WebastoNext obj-i1504-poll 1&lt;br /&gt;
attr WebastoNext obj-i1504-type unsigned long big&lt;br /&gt;
attr WebastoNext obj-i1508-reading Charging_Time&lt;br /&gt;
attr WebastoNext obj-i1508-poll 1&lt;br /&gt;
attr WebastoNext obj-i1508-type unsigned long big&lt;br /&gt;
attr WebastoNext obj-i1512-reading Charging_End_Time&lt;br /&gt;
attr WebastoNext obj-i1512-poll 1&lt;br /&gt;
attr WebastoNext obj-i1512-type unsigned long big&lt;br /&gt;
attr WebastoNext obj-i1620-reading Smart_Vehicle_Detected&lt;br /&gt;
attr WebastoNext obj-i1620-poll 1&lt;br /&gt;
attr WebastoNext obj-i1620-type unsigned short big&lt;br /&gt;
&lt;br /&gt;
attr WebastoNext obj-h2000-reading Safe_Current&lt;br /&gt;
attr WebastoNext obj-h2000-poll 1&lt;br /&gt;
attr WebastoNext obj-h2000-polldelay 600&lt;br /&gt;
attr WebastoNext obj-h2000-type unsigned short big&lt;br /&gt;
attr WebastoNext obj-h2000-set 1&lt;br /&gt;
attr WebastoNext obj-h2000-min 0&lt;br /&gt;
attr WebastoNext obj-h2000-max 16&lt;br /&gt;
&lt;br /&gt;
attr WebastoNext obj-h2002-reading Com_Timeout&lt;br /&gt;
attr WebastoNext obj-h2002-poll 1&lt;br /&gt;
attr WebastoNext obj-h2002-polldelay x199&lt;br /&gt;
attr WebastoNext obj-h2002-type unsigned short big&lt;br /&gt;
attr WebastoNext obj-h2002-set 1&lt;br /&gt;
&lt;br /&gt;
attr WebastoNext obj-h5000-reading Charge_Power_Set&lt;br /&gt;
attr WebastoNext obj-h5000-poll 0&lt;br /&gt;
attr WebastoNext obj-h5000-type unsigned long big&lt;br /&gt;
attr WebastoNext obj-h5000-set 1&lt;br /&gt;
&lt;br /&gt;
attr WebastoNext obj-h5004-reading Charge_Current_Set&lt;br /&gt;
attr WebastoNext obj-h5004-poll 0&lt;br /&gt;
attr WebastoNext obj-h5004-type signed short big&lt;br /&gt;
attr WebastoNext obj-h5004-set 1&lt;br /&gt;
attr WebastoNext obj-h5004-min 0&lt;br /&gt;
attr WebastoNext obj-h5004-max 16&lt;br /&gt;
&lt;br /&gt;
attr WebastoNext obj-h5006-reading Start_Cancel&lt;br /&gt;
attr WebastoNext obj-h5006-poll 0&lt;br /&gt;
attr WebastoNext obj-h5006-type unsigned short big&lt;br /&gt;
attr WebastoNext obj-h5006-set 1&lt;br /&gt;
attr WebastoNext obj-h5006-min 0&lt;br /&gt;
attr WebastoNext obj-h5006-max 2&lt;br /&gt;
attr WebastoNext obj-h5006-hint 0,1,2&lt;br /&gt;
&lt;br /&gt;
attr WebastoNext obj-h6000-reading Life_Bit&lt;br /&gt;
attr WebastoNext obj-h6000-poll 1&lt;br /&gt;
attr WebastoNext obj-h6000-type unsigned short big&lt;br /&gt;
attr WebastoNext obj-h6000-set 1&lt;br /&gt;
&lt;br /&gt;
attr WebastoNext userReadings \&lt;br /&gt;
Charge_Point_State_TXT:Charge_Point_State\b.* {my $val = ReadingsVal (&amp;quot;WebastoNext&amp;quot;,&amp;quot;Charge_Point_State&amp;quot;, 0);; if ($val == 0) {return &amp;quot;no vehicle attached (EVSE available, EVSE unavailable)&amp;quot;} elsif ($val == 1) {return &amp;quot;vehicle attached, no permission (preparing)&amp;quot;} elsif ($val == 3) {return &amp;quot;charging&amp;quot;} elsif ($val == 4) {return &amp;quot;charging paused (suspending EVSE, suspending EV, finishing)&amp;quot;} elsif ($val == 7) {return &amp;quot;charging error&amp;quot;} elsif ($val == 8) {return &amp;quot;charging station reserved&amp;quot;} else { return $val .&amp;quot; undefined&amp;quot; };;},\&lt;br /&gt;
Cable_State_TXT:Cable_State\b.* {my $val = ReadingsVal (&amp;quot;WebastoNext&amp;quot;,&amp;quot;Cable_State&amp;quot;, 0);; if ($val == 0) {return &amp;quot;no cable attached&amp;quot;} elsif ($val == 1) {return &amp;quot;cable attached (no car attached)&amp;quot;} elsif ($val == 2) {return &amp;quot;cable attached (car attached)&amp;quot;} elsif ($val == 3) {return &amp;quot;cable attached (car attached) + lock active&amp;quot;} else { return $val .&amp;quot; undefined&amp;quot; };;}, \&lt;br /&gt;
Charge_State_TXT:Charge_State\b.* {my $val = ReadingsVal (&amp;quot;WebastoNext&amp;quot;,&amp;quot;Charge_State&amp;quot;, 0);; if ($val == 0) {return &amp;quot;idle&amp;quot;} elsif ($val == 1) {return &amp;quot;charging&amp;quot;} else { return $val .&amp;quot; undefined&amp;quot; };;}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Steuerung ===&lt;br /&gt;
Das Register Charge_Power_Set wird nur berücksichtigt, wenn Charge_Current_Set auf 0 gesetzt ist. Mindestladestromstärke ist 6 A bzw. 4.200 W 3~ oder 1.400 W 1~.&lt;br /&gt;
&lt;br /&gt;
Die Wallbox reagiert nur dann auf die Steuerung, wenn ein regelmäßiges Keep-Alive-Bit gesetzt wird. Ansonsten wird der Lademodus mit dem Wert &amp;quot;Safe_Current&amp;quot; gestartet.&amp;lt;syntaxhighlight lang=&amp;quot;cfg&amp;quot;&amp;gt;&lt;br /&gt;
define WebastoNext_KeepAlive at +*00:00:30 set WebastoNext Life_Bit 1&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Gestartet wird der Ladvorgang mit &amp;quot;set WebastoNext Start_Cancel 1&amp;quot;. Gestoppt wird mit &amp;quot;set WebastoNext Start_Cancel 2&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== 1- und 3-phasiges Laden ===&lt;br /&gt;
Die Wallbox kann sowohl 1- als auch 3-phasig laden. Allerdings kann sie zwischen den beiden Lademodi nicht dynamisch umschalten, sondern muss eigentlich in der jeweiligen elektrischen Konfiguration neu gestartet werden. Wenn die Wallbox allerdings im 1-phasigen Modus gestartet wurde, kann sie durch Zu- oder Abschalten der beiden anderen Phasen zwischen ein- und dreiphasigem Laden wechseln. Absolut wichtig ist hierbei jedoch, dass dies &#039;&#039;&#039;nicht während des Ladevorganges&#039;&#039;&#039; erfolgen darf. Zudem wird dann auf der Webseite der Wallbox ein Fehler angezeigt.&lt;br /&gt;
&lt;br /&gt;
Die Phasen können z.B. mit zwei (stromsparenden) Stromstoßrelais an- und abgeschaltet werden. Konkret wird die Wallbox komplett stromlos geschaltet und dann nur mit Phase L1 oder zusätzlich mit den Phase L2 und L3 neu gestartet. Die Wallbox braucht etwa 3 Minuten um wieder hoch zu fahren und wertet dabei die anstehenden Phasen aus. Ein Wegschalten von Phasen nach dem 3-phasigem Hochfahren führt zu einer Fehlermeldung und die Wallbox reagiert nicht mehr.&lt;br /&gt;
[[Kategorie:Wallboxen]]&lt;br /&gt;
[[Kategorie:Elektromobilität]]&lt;br /&gt;
__INHALTSVERZEICHNIS_ERZWINGEN__&lt;br /&gt;
__INDEXIEREN__&lt;/div&gt;</summary>
		<author><name>Topos</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Webasto_Next&amp;diff=40123</id>
		<title>Webasto Next</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Webasto_Next&amp;diff=40123"/>
		<updated>2025-04-28T05:49:12Z</updated>

		<summary type="html">&lt;p&gt;Topos: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Die Wallbox Webasto Next kann per LAN oder WLAN über das Modebus-Protokoll ausgelesen und gesteuert werden. Sie liest den Batteriestand des E-Autos nicht aus. Dies könnte aber über spezielle Hardware wie den [https://www.meatpi.com/products/wican MeatPi WiCAN-OBD-C3 Adapter] oder passende E-Auto-App-Abfragen und FHEM-Module erfolgen.&lt;br /&gt;
&lt;br /&gt;
Hier eine mögliche Konfiguration:&amp;lt;syntaxhighlight lang=&amp;quot;cfg&amp;quot;&amp;gt;&lt;br /&gt;
define WebastoNext ModbusAttr 1 3 [IP-Addresse]:502 TCP&lt;br /&gt;
attr WebastoNext alias Wallbox&lt;br /&gt;
attr WebastoNext icon wallbox&lt;br /&gt;
attr WebastoNext stateFormat Charge_Point_State_TXT&amp;lt;br&amp;gt;Cable_State_TXT&amp;lt;br&amp;gt;Charge_State_TXT: Charge_Active_Power W&lt;br /&gt;
attr WebastoNext event-on-update-reading .*&lt;br /&gt;
attr WebastoNext DbLogExclude .*&lt;br /&gt;
attr WebastoNext DbLogInclude Charge_Active_Power:600&lt;br /&gt;
attr WebastoNext oldreadings Cable_State&lt;br /&gt;
attr WebastoNext obj-i1000-poll 1&lt;br /&gt;
attr WebastoNext obj-i1000-reading Charge_Point_State&lt;br /&gt;
attr WebastoNext obj-i1000-type unsigned short big&lt;br /&gt;
attr WebastoNext obj-i1001-poll 1&lt;br /&gt;
attr WebastoNext obj-i1001-reading Charge_State&lt;br /&gt;
attr WebastoNext obj-i1001-type unsigned short big&lt;br /&gt;
attr WebastoNext obj-i1004-poll 1&lt;br /&gt;
attr WebastoNext obj-i1004-reading Cable_State&lt;br /&gt;
attr WebastoNext obj-i1004-type unsigned short big&lt;br /&gt;
attr WebastoNext obj-i1006-poll 1&lt;br /&gt;
attr WebastoNext obj-i1006-reading Error_Code&lt;br /&gt;
attr WebastoNext obj-i1006-type unsigned short big&lt;br /&gt;
attr WebastoNext obj-i1008-poll 1&lt;br /&gt;
attr WebastoNext obj-i1008-reading Charge_Active_Current_L1&lt;br /&gt;
attr WebastoNext obj-i1008-type unsigned short big&lt;br /&gt;
attr WebastoNext obj-i1008-expr $val/1000&lt;br /&gt;
attr WebastoNext obj-i1010-poll 1&lt;br /&gt;
attr WebastoNext obj-i1010-reading Charge_Active_Current_L2&lt;br /&gt;
attr WebastoNext obj-i1010-type unsigned short big&lt;br /&gt;
attr WebastoNext obj-i1010-expr $val/1000&lt;br /&gt;
attr WebastoNext obj-i1012-poll 1&lt;br /&gt;
attr WebastoNext obj-i1012-reading Charge_Active_Current_L3&lt;br /&gt;
attr WebastoNext obj-i1012-type unsigned short big&lt;br /&gt;
attr WebastoNext obj-i1012-expr $val/1000&lt;br /&gt;
attr WebastoNext obj-i1020-poll 1&lt;br /&gt;
attr WebastoNext obj-i1020-reading Charge_Active_Power&lt;br /&gt;
attr WebastoNext obj-i1020-type unsigned long big&lt;br /&gt;
attr WebastoNext obj-i1024-reading Charge_Active_Power_L1&lt;br /&gt;
attr WebastoNext obj-i1024-poll 1&lt;br /&gt;
attr WebastoNext obj-i1024-type unsigned long big&lt;br /&gt;
attr WebastoNext obj-i1028-reading Charge_Active_Power_L2&lt;br /&gt;
attr WebastoNext obj-i1028-poll 1&lt;br /&gt;
attr WebastoNext obj-i1028-type unsigned long big&lt;br /&gt;
attr WebastoNext obj-i1032-reading Charge_Active_Power_L3&lt;br /&gt;
attr WebastoNext obj-i1032-poll 1&lt;br /&gt;
attr WebastoNext obj-i1032-type unsigned long big&lt;br /&gt;
attr WebastoNext obj-i1036-reading Energy_Meter&lt;br /&gt;
attr WebastoNext obj-i1036-poll 1&lt;br /&gt;
attr WebastoNext obj-i1036-type unsigned long big&lt;br /&gt;
attr WebastoNext obj-i1036-expr $val/1000&lt;br /&gt;
&lt;br /&gt;
attr WebastoNext obj-i1102-reading Min_Current&lt;br /&gt;
attr WebastoNext obj-i1102-poll 1&lt;br /&gt;
attr WebastoNext obj-i1102-type unsigned short big&lt;br /&gt;
attr WebastoNext obj-i1108-reading EV_Max_Current&lt;br /&gt;
attr WebastoNext obj-i1108-poll 1&lt;br /&gt;
attr WebastoNext obj-i1108-type unsigned short big&lt;br /&gt;
attr WebastoNext obj-i1502-reading Charged_Energy&lt;br /&gt;
attr WebastoNext obj-i1502-poll 1&lt;br /&gt;
attr WebastoNext obj-i1502-type unsigned short big&lt;br /&gt;
attr WebastoNext obj-i1502-expr $val/1000&lt;br /&gt;
attr WebastoNext obj-i1504-reading Charging_Start_Time&lt;br /&gt;
attr WebastoNext obj-i1504-poll 1&lt;br /&gt;
attr WebastoNext obj-i1504-type unsigned long big&lt;br /&gt;
attr WebastoNext obj-i1508-reading Charging_Time&lt;br /&gt;
attr WebastoNext obj-i1508-poll 1&lt;br /&gt;
attr WebastoNext obj-i1508-type unsigned long big&lt;br /&gt;
attr WebastoNext obj-i1512-reading Charging_End_Time&lt;br /&gt;
attr WebastoNext obj-i1512-poll 1&lt;br /&gt;
attr WebastoNext obj-i1512-type unsigned long big&lt;br /&gt;
attr WebastoNext obj-i1620-reading Smart_Vehicle_Detected&lt;br /&gt;
attr WebastoNext obj-i1620-poll 1&lt;br /&gt;
attr WebastoNext obj-i1620-type unsigned short big&lt;br /&gt;
&lt;br /&gt;
attr WebastoNext obj-h2000-reading Safe_Current&lt;br /&gt;
attr WebastoNext obj-h2000-poll 1&lt;br /&gt;
attr WebastoNext obj-h2000-polldelay 600&lt;br /&gt;
attr WebastoNext obj-h2000-type unsigned short big&lt;br /&gt;
attr WebastoNext obj-h2000-set 1&lt;br /&gt;
attr WebastoNext obj-h2000-min 0&lt;br /&gt;
attr WebastoNext obj-h2000-max 16&lt;br /&gt;
&lt;br /&gt;
attr WebastoNext obj-h2002-reading Com_Timeout&lt;br /&gt;
attr WebastoNext obj-h2002-poll 1&lt;br /&gt;
attr WebastoNext obj-h2002-polldelay x199&lt;br /&gt;
attr WebastoNext obj-h2002-type unsigned short big&lt;br /&gt;
attr WebastoNext obj-h2002-set 1&lt;br /&gt;
&lt;br /&gt;
attr WebastoNext obj-h5000-reading Charge_Power_Set&lt;br /&gt;
attr WebastoNext obj-h5000-poll 0&lt;br /&gt;
attr WebastoNext obj-h5000-type unsigned long big&lt;br /&gt;
attr WebastoNext obj-h5000-set 1&lt;br /&gt;
&lt;br /&gt;
attr WebastoNext obj-h5004-reading Charge_Current_Set&lt;br /&gt;
attr WebastoNext obj-h5004-poll 0&lt;br /&gt;
attr WebastoNext obj-h5004-type signed short big&lt;br /&gt;
attr WebastoNext obj-h5004-set 1&lt;br /&gt;
attr WebastoNext obj-h5004-min 0&lt;br /&gt;
attr WebastoNext obj-h5004-max 16&lt;br /&gt;
&lt;br /&gt;
attr WebastoNext obj-h5006-reading Start_Cancel&lt;br /&gt;
attr WebastoNext obj-h5006-poll 0&lt;br /&gt;
attr WebastoNext obj-h5006-type unsigned short big&lt;br /&gt;
attr WebastoNext obj-h5006-set 1&lt;br /&gt;
attr WebastoNext obj-h5006-min 0&lt;br /&gt;
attr WebastoNext obj-h5006-max 2&lt;br /&gt;
attr WebastoNext obj-h5006-hint 0,1,2&lt;br /&gt;
&lt;br /&gt;
attr WebastoNext obj-h6000-reading Life_Bit&lt;br /&gt;
attr WebastoNext obj-h6000-poll 1&lt;br /&gt;
attr WebastoNext obj-h6000-type unsigned short big&lt;br /&gt;
attr WebastoNext obj-h6000-set 1&lt;br /&gt;
&lt;br /&gt;
attr WebastoNext userReadings \&lt;br /&gt;
Charge_Point_State_TXT:Charge_Point_State\b.* {my $val = ReadingsVal (&amp;quot;WebastoNext&amp;quot;,&amp;quot;Charge_Point_State&amp;quot;, 0);; if ($val == 0) {return &amp;quot;no vehicle attached (EVSE available, EVSE unavailable)&amp;quot;} elsif ($val == 1) {return &amp;quot;vehicle attached, no permission (preparing)&amp;quot;} elsif ($val == 3) {return &amp;quot;charging&amp;quot;} elsif ($val == 4) {return &amp;quot;charging paused (suspending EVSE, suspending EV, finishing)&amp;quot;} elsif ($val == 7) {return &amp;quot;charging error&amp;quot;} elsif ($val == 8) {return &amp;quot;charging station reserved&amp;quot;} else { return $val .&amp;quot; undefined&amp;quot; };;},\&lt;br /&gt;
Cable_State_TXT:Cable_State\b.* {my $val = ReadingsVal (&amp;quot;WebastoNext&amp;quot;,&amp;quot;Cable_State&amp;quot;, 0);; if ($val == 0) {return &amp;quot;no cable attached&amp;quot;} elsif ($val == 1) {return &amp;quot;cable attached (no car attached)&amp;quot;} elsif ($val == 2) {return &amp;quot;cable attached (car attached)&amp;quot;} elsif ($val == 3) {return &amp;quot;cable attached (car attached) + lock active&amp;quot;} else { return $val .&amp;quot; undefined&amp;quot; };;}, \&lt;br /&gt;
Charge_State_TXT:Charge_State\b.* {my $val = ReadingsVal (&amp;quot;WebastoNext&amp;quot;,&amp;quot;Charge_State&amp;quot;, 0);; if ($val == 0) {return &amp;quot;idle&amp;quot;} elsif ($val == 1) {return &amp;quot;charging&amp;quot;} else { return $val .&amp;quot; undefined&amp;quot; };;}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Steuerung ===&lt;br /&gt;
Das Register Charge_Power_Set wird nur berücksichtigt, wenn Charge_Current_Set auf 0 gesetzt ist. Mindestladestromstärke ist 6 A bzw. 4.200 W 3~ oder 1.400 W 1~.&lt;br /&gt;
&lt;br /&gt;
Die Wallbox reagiert nur dann auf die Steuerung, wenn ein regelmäßiges Keep-Alive-Bit gesetzt wird. Ansonsten wird der Lademodus mit dem Wert &amp;quot;Safe_Current&amp;quot; gestartet.&amp;lt;syntaxhighlight lang=&amp;quot;cfg&amp;quot;&amp;gt;&lt;br /&gt;
define WebastoNext_KeepAlive at +*00:00:30 set WebastoNext Life_Bit 1&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Gestartet wird der Ladvorgang mit &amp;quot;set WebastoNext Start_Cancel 1&amp;quot;. Gestoppt wird mit &amp;quot;set WebastoNext Start_Cancel 2&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== 1- und 3-phasiges Laden ===&lt;br /&gt;
Die Wallbox kann sowohl 1- als auch 3-phasig laden. Allerdings kann sie zwischen den beiden Lademodi nicht dynamisch umschalten, sondern muss in der jeweiligen elektrischen Konfiguration neu gestartet werden.&lt;br /&gt;
&lt;br /&gt;
Die Phasen können z.B. mit zwei (stromsparenden) Stromstoßrelais an- und abgeschaltet werden. Konkret wird die Wallbox komplett stromlos geschaltet und dann nur mit Phase L1 oder zusätzlich mit den Phase L2 und L3 neu gestartet. Die Wallbox braucht etwa 3 Minuten um wieder hoch zu fahren und wertet dabei die anstehenden Phasen aus. Ein Zu- oder Wegschalten von Phasen nach dem Hochfahren führt zu einer Fehlermeldung und die Wallbox reagiert nicht mehr.&lt;br /&gt;
[[Kategorie:Wallboxen]]&lt;br /&gt;
[[Kategorie:Elektromobilität]]&lt;br /&gt;
__INHALTSVERZEICHNIS_ERZWINGEN__&lt;br /&gt;
__INDEXIEREN__&lt;/div&gt;</summary>
		<author><name>Topos</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Webasto_Next&amp;diff=40122</id>
		<title>Webasto Next</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Webasto_Next&amp;diff=40122"/>
		<updated>2025-04-28T05:48:40Z</updated>

		<summary type="html">&lt;p&gt;Topos: Batteriestand wird nicht ausgelesen.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Die Wallbox Webasto Next kann per LAN oder WLAN über das Modebus-Protokoll ausgelesen und gesteuert werden. Sie liest den Batteriestand des E-Autos nicht aus. Dies könnte aber über spezielle Hardware wie den [https://www.meatpi.com/products/wican MeatPi WiCAN-OBD-C3 Adapter] oder passende E-Auto-App-Abfrage und FHEM-Module erfolgen.&lt;br /&gt;
&lt;br /&gt;
Hier eine mögliche Konfiguration:&amp;lt;syntaxhighlight lang=&amp;quot;cfg&amp;quot;&amp;gt;&lt;br /&gt;
define WebastoNext ModbusAttr 1 3 [IP-Addresse]:502 TCP&lt;br /&gt;
attr WebastoNext alias Wallbox&lt;br /&gt;
attr WebastoNext icon wallbox&lt;br /&gt;
attr WebastoNext stateFormat Charge_Point_State_TXT&amp;lt;br&amp;gt;Cable_State_TXT&amp;lt;br&amp;gt;Charge_State_TXT: Charge_Active_Power W&lt;br /&gt;
attr WebastoNext event-on-update-reading .*&lt;br /&gt;
attr WebastoNext DbLogExclude .*&lt;br /&gt;
attr WebastoNext DbLogInclude Charge_Active_Power:600&lt;br /&gt;
attr WebastoNext oldreadings Cable_State&lt;br /&gt;
attr WebastoNext obj-i1000-poll 1&lt;br /&gt;
attr WebastoNext obj-i1000-reading Charge_Point_State&lt;br /&gt;
attr WebastoNext obj-i1000-type unsigned short big&lt;br /&gt;
attr WebastoNext obj-i1001-poll 1&lt;br /&gt;
attr WebastoNext obj-i1001-reading Charge_State&lt;br /&gt;
attr WebastoNext obj-i1001-type unsigned short big&lt;br /&gt;
attr WebastoNext obj-i1004-poll 1&lt;br /&gt;
attr WebastoNext obj-i1004-reading Cable_State&lt;br /&gt;
attr WebastoNext obj-i1004-type unsigned short big&lt;br /&gt;
attr WebastoNext obj-i1006-poll 1&lt;br /&gt;
attr WebastoNext obj-i1006-reading Error_Code&lt;br /&gt;
attr WebastoNext obj-i1006-type unsigned short big&lt;br /&gt;
attr WebastoNext obj-i1008-poll 1&lt;br /&gt;
attr WebastoNext obj-i1008-reading Charge_Active_Current_L1&lt;br /&gt;
attr WebastoNext obj-i1008-type unsigned short big&lt;br /&gt;
attr WebastoNext obj-i1008-expr $val/1000&lt;br /&gt;
attr WebastoNext obj-i1010-poll 1&lt;br /&gt;
attr WebastoNext obj-i1010-reading Charge_Active_Current_L2&lt;br /&gt;
attr WebastoNext obj-i1010-type unsigned short big&lt;br /&gt;
attr WebastoNext obj-i1010-expr $val/1000&lt;br /&gt;
attr WebastoNext obj-i1012-poll 1&lt;br /&gt;
attr WebastoNext obj-i1012-reading Charge_Active_Current_L3&lt;br /&gt;
attr WebastoNext obj-i1012-type unsigned short big&lt;br /&gt;
attr WebastoNext obj-i1012-expr $val/1000&lt;br /&gt;
attr WebastoNext obj-i1020-poll 1&lt;br /&gt;
attr WebastoNext obj-i1020-reading Charge_Active_Power&lt;br /&gt;
attr WebastoNext obj-i1020-type unsigned long big&lt;br /&gt;
attr WebastoNext obj-i1024-reading Charge_Active_Power_L1&lt;br /&gt;
attr WebastoNext obj-i1024-poll 1&lt;br /&gt;
attr WebastoNext obj-i1024-type unsigned long big&lt;br /&gt;
attr WebastoNext obj-i1028-reading Charge_Active_Power_L2&lt;br /&gt;
attr WebastoNext obj-i1028-poll 1&lt;br /&gt;
attr WebastoNext obj-i1028-type unsigned long big&lt;br /&gt;
attr WebastoNext obj-i1032-reading Charge_Active_Power_L3&lt;br /&gt;
attr WebastoNext obj-i1032-poll 1&lt;br /&gt;
attr WebastoNext obj-i1032-type unsigned long big&lt;br /&gt;
attr WebastoNext obj-i1036-reading Energy_Meter&lt;br /&gt;
attr WebastoNext obj-i1036-poll 1&lt;br /&gt;
attr WebastoNext obj-i1036-type unsigned long big&lt;br /&gt;
attr WebastoNext obj-i1036-expr $val/1000&lt;br /&gt;
&lt;br /&gt;
attr WebastoNext obj-i1102-reading Min_Current&lt;br /&gt;
attr WebastoNext obj-i1102-poll 1&lt;br /&gt;
attr WebastoNext obj-i1102-type unsigned short big&lt;br /&gt;
attr WebastoNext obj-i1108-reading EV_Max_Current&lt;br /&gt;
attr WebastoNext obj-i1108-poll 1&lt;br /&gt;
attr WebastoNext obj-i1108-type unsigned short big&lt;br /&gt;
attr WebastoNext obj-i1502-reading Charged_Energy&lt;br /&gt;
attr WebastoNext obj-i1502-poll 1&lt;br /&gt;
attr WebastoNext obj-i1502-type unsigned short big&lt;br /&gt;
attr WebastoNext obj-i1502-expr $val/1000&lt;br /&gt;
attr WebastoNext obj-i1504-reading Charging_Start_Time&lt;br /&gt;
attr WebastoNext obj-i1504-poll 1&lt;br /&gt;
attr WebastoNext obj-i1504-type unsigned long big&lt;br /&gt;
attr WebastoNext obj-i1508-reading Charging_Time&lt;br /&gt;
attr WebastoNext obj-i1508-poll 1&lt;br /&gt;
attr WebastoNext obj-i1508-type unsigned long big&lt;br /&gt;
attr WebastoNext obj-i1512-reading Charging_End_Time&lt;br /&gt;
attr WebastoNext obj-i1512-poll 1&lt;br /&gt;
attr WebastoNext obj-i1512-type unsigned long big&lt;br /&gt;
attr WebastoNext obj-i1620-reading Smart_Vehicle_Detected&lt;br /&gt;
attr WebastoNext obj-i1620-poll 1&lt;br /&gt;
attr WebastoNext obj-i1620-type unsigned short big&lt;br /&gt;
&lt;br /&gt;
attr WebastoNext obj-h2000-reading Safe_Current&lt;br /&gt;
attr WebastoNext obj-h2000-poll 1&lt;br /&gt;
attr WebastoNext obj-h2000-polldelay 600&lt;br /&gt;
attr WebastoNext obj-h2000-type unsigned short big&lt;br /&gt;
attr WebastoNext obj-h2000-set 1&lt;br /&gt;
attr WebastoNext obj-h2000-min 0&lt;br /&gt;
attr WebastoNext obj-h2000-max 16&lt;br /&gt;
&lt;br /&gt;
attr WebastoNext obj-h2002-reading Com_Timeout&lt;br /&gt;
attr WebastoNext obj-h2002-poll 1&lt;br /&gt;
attr WebastoNext obj-h2002-polldelay x199&lt;br /&gt;
attr WebastoNext obj-h2002-type unsigned short big&lt;br /&gt;
attr WebastoNext obj-h2002-set 1&lt;br /&gt;
&lt;br /&gt;
attr WebastoNext obj-h5000-reading Charge_Power_Set&lt;br /&gt;
attr WebastoNext obj-h5000-poll 0&lt;br /&gt;
attr WebastoNext obj-h5000-type unsigned long big&lt;br /&gt;
attr WebastoNext obj-h5000-set 1&lt;br /&gt;
&lt;br /&gt;
attr WebastoNext obj-h5004-reading Charge_Current_Set&lt;br /&gt;
attr WebastoNext obj-h5004-poll 0&lt;br /&gt;
attr WebastoNext obj-h5004-type signed short big&lt;br /&gt;
attr WebastoNext obj-h5004-set 1&lt;br /&gt;
attr WebastoNext obj-h5004-min 0&lt;br /&gt;
attr WebastoNext obj-h5004-max 16&lt;br /&gt;
&lt;br /&gt;
attr WebastoNext obj-h5006-reading Start_Cancel&lt;br /&gt;
attr WebastoNext obj-h5006-poll 0&lt;br /&gt;
attr WebastoNext obj-h5006-type unsigned short big&lt;br /&gt;
attr WebastoNext obj-h5006-set 1&lt;br /&gt;
attr WebastoNext obj-h5006-min 0&lt;br /&gt;
attr WebastoNext obj-h5006-max 2&lt;br /&gt;
attr WebastoNext obj-h5006-hint 0,1,2&lt;br /&gt;
&lt;br /&gt;
attr WebastoNext obj-h6000-reading Life_Bit&lt;br /&gt;
attr WebastoNext obj-h6000-poll 1&lt;br /&gt;
attr WebastoNext obj-h6000-type unsigned short big&lt;br /&gt;
attr WebastoNext obj-h6000-set 1&lt;br /&gt;
&lt;br /&gt;
attr WebastoNext userReadings \&lt;br /&gt;
Charge_Point_State_TXT:Charge_Point_State\b.* {my $val = ReadingsVal (&amp;quot;WebastoNext&amp;quot;,&amp;quot;Charge_Point_State&amp;quot;, 0);; if ($val == 0) {return &amp;quot;no vehicle attached (EVSE available, EVSE unavailable)&amp;quot;} elsif ($val == 1) {return &amp;quot;vehicle attached, no permission (preparing)&amp;quot;} elsif ($val == 3) {return &amp;quot;charging&amp;quot;} elsif ($val == 4) {return &amp;quot;charging paused (suspending EVSE, suspending EV, finishing)&amp;quot;} elsif ($val == 7) {return &amp;quot;charging error&amp;quot;} elsif ($val == 8) {return &amp;quot;charging station reserved&amp;quot;} else { return $val .&amp;quot; undefined&amp;quot; };;},\&lt;br /&gt;
Cable_State_TXT:Cable_State\b.* {my $val = ReadingsVal (&amp;quot;WebastoNext&amp;quot;,&amp;quot;Cable_State&amp;quot;, 0);; if ($val == 0) {return &amp;quot;no cable attached&amp;quot;} elsif ($val == 1) {return &amp;quot;cable attached (no car attached)&amp;quot;} elsif ($val == 2) {return &amp;quot;cable attached (car attached)&amp;quot;} elsif ($val == 3) {return &amp;quot;cable attached (car attached) + lock active&amp;quot;} else { return $val .&amp;quot; undefined&amp;quot; };;}, \&lt;br /&gt;
Charge_State_TXT:Charge_State\b.* {my $val = ReadingsVal (&amp;quot;WebastoNext&amp;quot;,&amp;quot;Charge_State&amp;quot;, 0);; if ($val == 0) {return &amp;quot;idle&amp;quot;} elsif ($val == 1) {return &amp;quot;charging&amp;quot;} else { return $val .&amp;quot; undefined&amp;quot; };;}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Steuerung ===&lt;br /&gt;
Das Register Charge_Power_Set wird nur berücksichtigt, wenn Charge_Current_Set auf 0 gesetzt ist. Mindestladestromstärke ist 6 A bzw. 4.200 W 3~ oder 1.400 W 1~.&lt;br /&gt;
&lt;br /&gt;
Die Wallbox reagiert nur dann auf die Steuerung, wenn ein regelmäßiges Keep-Alive-Bit gesetzt wird. Ansonsten wird der Lademodus mit dem Wert &amp;quot;Safe_Current&amp;quot; gestartet.&amp;lt;syntaxhighlight lang=&amp;quot;cfg&amp;quot;&amp;gt;&lt;br /&gt;
define WebastoNext_KeepAlive at +*00:00:30 set WebastoNext Life_Bit 1&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Gestartet wird der Ladvorgang mit &amp;quot;set WebastoNext Start_Cancel 1&amp;quot;. Gestoppt wird mit &amp;quot;set WebastoNext Start_Cancel 2&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== 1- und 3-phasiges Laden ===&lt;br /&gt;
Die Wallbox kann sowohl 1- als auch 3-phasig laden. Allerdings kann sie zwischen den beiden Lademodi nicht dynamisch umschalten, sondern muss in der jeweiligen elektrischen Konfiguration neu gestartet werden.&lt;br /&gt;
&lt;br /&gt;
Die Phasen können z.B. mit zwei (stromsparenden) Stromstoßrelais an- und abgeschaltet werden. Konkret wird die Wallbox komplett stromlos geschaltet und dann nur mit Phase L1 oder zusätzlich mit den Phase L2 und L3 neu gestartet. Die Wallbox braucht etwa 3 Minuten um wieder hoch zu fahren und wertet dabei die anstehenden Phasen aus. Ein Zu- oder Wegschalten von Phasen nach dem Hochfahren führt zu einer Fehlermeldung und die Wallbox reagiert nicht mehr.&lt;br /&gt;
[[Kategorie:Wallboxen]]&lt;br /&gt;
[[Kategorie:Elektromobilität]]&lt;br /&gt;
__INHALTSVERZEICHNIS_ERZWINGEN__&lt;br /&gt;
__INDEXIEREN__&lt;/div&gt;</summary>
		<author><name>Topos</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Webasto_Next&amp;diff=40121</id>
		<title>Webasto Next</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Webasto_Next&amp;diff=40121"/>
		<updated>2025-04-28T05:43:22Z</updated>

		<summary type="html">&lt;p&gt;Topos: /* Steuerung */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Die Wallbox Webasto Next kann per LAN oder WLAN über das Modebus-Protokoll ausgelesen und gesteuert werden.&lt;br /&gt;
&lt;br /&gt;
Hier eine mögliche Konfiguration:&amp;lt;syntaxhighlight lang=&amp;quot;cfg&amp;quot;&amp;gt;&lt;br /&gt;
define WebastoNext ModbusAttr 1 3 [IP-Addresse]:502 TCP&lt;br /&gt;
attr WebastoNext alias Wallbox&lt;br /&gt;
attr WebastoNext icon wallbox&lt;br /&gt;
attr WebastoNext stateFormat Charge_Point_State_TXT&amp;lt;br&amp;gt;Cable_State_TXT&amp;lt;br&amp;gt;Charge_State_TXT: Charge_Active_Power W&lt;br /&gt;
attr WebastoNext event-on-update-reading .*&lt;br /&gt;
attr WebastoNext DbLogExclude .*&lt;br /&gt;
attr WebastoNext DbLogInclude Charge_Active_Power:600&lt;br /&gt;
attr WebastoNext oldreadings Cable_State&lt;br /&gt;
attr WebastoNext obj-i1000-poll 1&lt;br /&gt;
attr WebastoNext obj-i1000-reading Charge_Point_State&lt;br /&gt;
attr WebastoNext obj-i1000-type unsigned short big&lt;br /&gt;
attr WebastoNext obj-i1001-poll 1&lt;br /&gt;
attr WebastoNext obj-i1001-reading Charge_State&lt;br /&gt;
attr WebastoNext obj-i1001-type unsigned short big&lt;br /&gt;
attr WebastoNext obj-i1004-poll 1&lt;br /&gt;
attr WebastoNext obj-i1004-reading Cable_State&lt;br /&gt;
attr WebastoNext obj-i1004-type unsigned short big&lt;br /&gt;
attr WebastoNext obj-i1006-poll 1&lt;br /&gt;
attr WebastoNext obj-i1006-reading Error_Code&lt;br /&gt;
attr WebastoNext obj-i1006-type unsigned short big&lt;br /&gt;
attr WebastoNext obj-i1008-poll 1&lt;br /&gt;
attr WebastoNext obj-i1008-reading Charge_Active_Current_L1&lt;br /&gt;
attr WebastoNext obj-i1008-type unsigned short big&lt;br /&gt;
attr WebastoNext obj-i1008-expr $val/1000&lt;br /&gt;
attr WebastoNext obj-i1010-poll 1&lt;br /&gt;
attr WebastoNext obj-i1010-reading Charge_Active_Current_L2&lt;br /&gt;
attr WebastoNext obj-i1010-type unsigned short big&lt;br /&gt;
attr WebastoNext obj-i1010-expr $val/1000&lt;br /&gt;
attr WebastoNext obj-i1012-poll 1&lt;br /&gt;
attr WebastoNext obj-i1012-reading Charge_Active_Current_L3&lt;br /&gt;
attr WebastoNext obj-i1012-type unsigned short big&lt;br /&gt;
attr WebastoNext obj-i1012-expr $val/1000&lt;br /&gt;
attr WebastoNext obj-i1020-poll 1&lt;br /&gt;
attr WebastoNext obj-i1020-reading Charge_Active_Power&lt;br /&gt;
attr WebastoNext obj-i1020-type unsigned long big&lt;br /&gt;
attr WebastoNext obj-i1024-reading Charge_Active_Power_L1&lt;br /&gt;
attr WebastoNext obj-i1024-poll 1&lt;br /&gt;
attr WebastoNext obj-i1024-type unsigned long big&lt;br /&gt;
attr WebastoNext obj-i1028-reading Charge_Active_Power_L2&lt;br /&gt;
attr WebastoNext obj-i1028-poll 1&lt;br /&gt;
attr WebastoNext obj-i1028-type unsigned long big&lt;br /&gt;
attr WebastoNext obj-i1032-reading Charge_Active_Power_L3&lt;br /&gt;
attr WebastoNext obj-i1032-poll 1&lt;br /&gt;
attr WebastoNext obj-i1032-type unsigned long big&lt;br /&gt;
attr WebastoNext obj-i1036-reading Energy_Meter&lt;br /&gt;
attr WebastoNext obj-i1036-poll 1&lt;br /&gt;
attr WebastoNext obj-i1036-type unsigned long big&lt;br /&gt;
attr WebastoNext obj-i1036-expr $val/1000&lt;br /&gt;
&lt;br /&gt;
attr WebastoNext obj-i1102-reading Min_Current&lt;br /&gt;
attr WebastoNext obj-i1102-poll 1&lt;br /&gt;
attr WebastoNext obj-i1102-type unsigned short big&lt;br /&gt;
attr WebastoNext obj-i1108-reading EV_Max_Current&lt;br /&gt;
attr WebastoNext obj-i1108-poll 1&lt;br /&gt;
attr WebastoNext obj-i1108-type unsigned short big&lt;br /&gt;
attr WebastoNext obj-i1502-reading Charged_Energy&lt;br /&gt;
attr WebastoNext obj-i1502-poll 1&lt;br /&gt;
attr WebastoNext obj-i1502-type unsigned short big&lt;br /&gt;
attr WebastoNext obj-i1502-expr $val/1000&lt;br /&gt;
attr WebastoNext obj-i1504-reading Charging_Start_Time&lt;br /&gt;
attr WebastoNext obj-i1504-poll 1&lt;br /&gt;
attr WebastoNext obj-i1504-type unsigned long big&lt;br /&gt;
attr WebastoNext obj-i1508-reading Charging_Time&lt;br /&gt;
attr WebastoNext obj-i1508-poll 1&lt;br /&gt;
attr WebastoNext obj-i1508-type unsigned long big&lt;br /&gt;
attr WebastoNext obj-i1512-reading Charging_End_Time&lt;br /&gt;
attr WebastoNext obj-i1512-poll 1&lt;br /&gt;
attr WebastoNext obj-i1512-type unsigned long big&lt;br /&gt;
attr WebastoNext obj-i1620-reading Smart_Vehicle_Detected&lt;br /&gt;
attr WebastoNext obj-i1620-poll 1&lt;br /&gt;
attr WebastoNext obj-i1620-type unsigned short big&lt;br /&gt;
&lt;br /&gt;
attr WebastoNext obj-h2000-reading Safe_Current&lt;br /&gt;
attr WebastoNext obj-h2000-poll 1&lt;br /&gt;
attr WebastoNext obj-h2000-polldelay 600&lt;br /&gt;
attr WebastoNext obj-h2000-type unsigned short big&lt;br /&gt;
attr WebastoNext obj-h2000-set 1&lt;br /&gt;
attr WebastoNext obj-h2000-min 0&lt;br /&gt;
attr WebastoNext obj-h2000-max 16&lt;br /&gt;
&lt;br /&gt;
attr WebastoNext obj-h2002-reading Com_Timeout&lt;br /&gt;
attr WebastoNext obj-h2002-poll 1&lt;br /&gt;
attr WebastoNext obj-h2002-polldelay x199&lt;br /&gt;
attr WebastoNext obj-h2002-type unsigned short big&lt;br /&gt;
attr WebastoNext obj-h2002-set 1&lt;br /&gt;
&lt;br /&gt;
attr WebastoNext obj-h5000-reading Charge_Power_Set&lt;br /&gt;
attr WebastoNext obj-h5000-poll 0&lt;br /&gt;
attr WebastoNext obj-h5000-type unsigned long big&lt;br /&gt;
attr WebastoNext obj-h5000-set 1&lt;br /&gt;
&lt;br /&gt;
attr WebastoNext obj-h5004-reading Charge_Current_Set&lt;br /&gt;
attr WebastoNext obj-h5004-poll 0&lt;br /&gt;
attr WebastoNext obj-h5004-type signed short big&lt;br /&gt;
attr WebastoNext obj-h5004-set 1&lt;br /&gt;
attr WebastoNext obj-h5004-min 0&lt;br /&gt;
attr WebastoNext obj-h5004-max 16&lt;br /&gt;
&lt;br /&gt;
attr WebastoNext obj-h5006-reading Start_Cancel&lt;br /&gt;
attr WebastoNext obj-h5006-poll 0&lt;br /&gt;
attr WebastoNext obj-h5006-type unsigned short big&lt;br /&gt;
attr WebastoNext obj-h5006-set 1&lt;br /&gt;
attr WebastoNext obj-h5006-min 0&lt;br /&gt;
attr WebastoNext obj-h5006-max 2&lt;br /&gt;
attr WebastoNext obj-h5006-hint 0,1,2&lt;br /&gt;
&lt;br /&gt;
attr WebastoNext obj-h6000-reading Life_Bit&lt;br /&gt;
attr WebastoNext obj-h6000-poll 1&lt;br /&gt;
attr WebastoNext obj-h6000-type unsigned short big&lt;br /&gt;
attr WebastoNext obj-h6000-set 1&lt;br /&gt;
&lt;br /&gt;
attr WebastoNext userReadings \&lt;br /&gt;
Charge_Point_State_TXT:Charge_Point_State\b.* {my $val = ReadingsVal (&amp;quot;WebastoNext&amp;quot;,&amp;quot;Charge_Point_State&amp;quot;, 0);; if ($val == 0) {return &amp;quot;no vehicle attached (EVSE available, EVSE unavailable)&amp;quot;} elsif ($val == 1) {return &amp;quot;vehicle attached, no permission (preparing)&amp;quot;} elsif ($val == 3) {return &amp;quot;charging&amp;quot;} elsif ($val == 4) {return &amp;quot;charging paused (suspending EVSE, suspending EV, finishing)&amp;quot;} elsif ($val == 7) {return &amp;quot;charging error&amp;quot;} elsif ($val == 8) {return &amp;quot;charging station reserved&amp;quot;} else { return $val .&amp;quot; undefined&amp;quot; };;},\&lt;br /&gt;
Cable_State_TXT:Cable_State\b.* {my $val = ReadingsVal (&amp;quot;WebastoNext&amp;quot;,&amp;quot;Cable_State&amp;quot;, 0);; if ($val == 0) {return &amp;quot;no cable attached&amp;quot;} elsif ($val == 1) {return &amp;quot;cable attached (no car attached)&amp;quot;} elsif ($val == 2) {return &amp;quot;cable attached (car attached)&amp;quot;} elsif ($val == 3) {return &amp;quot;cable attached (car attached) + lock active&amp;quot;} else { return $val .&amp;quot; undefined&amp;quot; };;}, \&lt;br /&gt;
Charge_State_TXT:Charge_State\b.* {my $val = ReadingsVal (&amp;quot;WebastoNext&amp;quot;,&amp;quot;Charge_State&amp;quot;, 0);; if ($val == 0) {return &amp;quot;idle&amp;quot;} elsif ($val == 1) {return &amp;quot;charging&amp;quot;} else { return $val .&amp;quot; undefined&amp;quot; };;}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Steuerung ===&lt;br /&gt;
Das Register Charge_Power_Set wird nur berücksichtigt, wenn Charge_Current_Set auf 0 gesetzt ist. Mindestladestromstärke ist 6 A bzw. 4.200 W 3~ oder 1.400 W 1~.&lt;br /&gt;
&lt;br /&gt;
Die Wallbox reagiert nur dann auf die Steuerung, wenn ein regelmäßiges Keep-Alive-Bit gesetzt wird. Ansonsten wird der Lademodus mit dem Wert &amp;quot;Safe_Current&amp;quot; gestartet.&amp;lt;syntaxhighlight lang=&amp;quot;cfg&amp;quot;&amp;gt;&lt;br /&gt;
define WebastoNext_KeepAlive at +*00:00:30 set WebastoNext Life_Bit 1&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Gestartet wird der Ladvorgang mit &amp;quot;set WebastoNext Start_Cancel 1&amp;quot;. Gestoppt wird mit &amp;quot;set WebastoNext Start_Cancel 2&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== 1- und 3-phasiges Laden ===&lt;br /&gt;
Die Wallbox kann sowohl 1- als auch 3-phasig laden. Allerdings kann sie zwischen den beiden Lademodi nicht dynamisch umschalten, sondern muss in der jeweiligen elektrischen Konfiguration neu gestartet werden.&lt;br /&gt;
&lt;br /&gt;
Die Phasen können z.B. mit zwei (stromsparenden) Stromstoßrelais an- und abgeschaltet werden. Konkret wird die Wallbox komplett stromlos geschaltet und dann nur mit Phase L1 oder zusätzlich mit den Phase L2 und L3 neu gestartet. Die Wallbox braucht etwa 3 Minuten um wieder hoch zu fahren und wertet dabei die anstehenden Phasen aus. Ein Zu- oder Wegschalten von Phasen nach dem Hochfahren führt zu einer Fehlermeldung und die Wallbox reagiert nicht mehr.&lt;br /&gt;
[[Kategorie:Wallboxen]]&lt;br /&gt;
[[Kategorie:Elektromobilität]]&lt;br /&gt;
__INHALTSVERZEICHNIS_ERZWINGEN__&lt;br /&gt;
__INDEXIEREN__&lt;/div&gt;</summary>
		<author><name>Topos</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Webasto_Next&amp;diff=40120</id>
		<title>Webasto Next</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Webasto_Next&amp;diff=40120"/>
		<updated>2025-04-28T05:42:24Z</updated>

		<summary type="html">&lt;p&gt;Topos: /* 1- und 3-phasiges Laden */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Die Wallbox Webasto Next kann per LAN oder WLAN über das Modebus-Protokoll ausgelesen und gesteuert werden.&lt;br /&gt;
&lt;br /&gt;
Hier eine mögliche Konfiguration:&amp;lt;syntaxhighlight lang=&amp;quot;cfg&amp;quot;&amp;gt;&lt;br /&gt;
define WebastoNext ModbusAttr 1 3 [IP-Addresse]:502 TCP&lt;br /&gt;
attr WebastoNext alias Wallbox&lt;br /&gt;
attr WebastoNext icon wallbox&lt;br /&gt;
attr WebastoNext stateFormat Charge_Point_State_TXT&amp;lt;br&amp;gt;Cable_State_TXT&amp;lt;br&amp;gt;Charge_State_TXT: Charge_Active_Power W&lt;br /&gt;
attr WebastoNext event-on-update-reading .*&lt;br /&gt;
attr WebastoNext DbLogExclude .*&lt;br /&gt;
attr WebastoNext DbLogInclude Charge_Active_Power:600&lt;br /&gt;
attr WebastoNext oldreadings Cable_State&lt;br /&gt;
attr WebastoNext obj-i1000-poll 1&lt;br /&gt;
attr WebastoNext obj-i1000-reading Charge_Point_State&lt;br /&gt;
attr WebastoNext obj-i1000-type unsigned short big&lt;br /&gt;
attr WebastoNext obj-i1001-poll 1&lt;br /&gt;
attr WebastoNext obj-i1001-reading Charge_State&lt;br /&gt;
attr WebastoNext obj-i1001-type unsigned short big&lt;br /&gt;
attr WebastoNext obj-i1004-poll 1&lt;br /&gt;
attr WebastoNext obj-i1004-reading Cable_State&lt;br /&gt;
attr WebastoNext obj-i1004-type unsigned short big&lt;br /&gt;
attr WebastoNext obj-i1006-poll 1&lt;br /&gt;
attr WebastoNext obj-i1006-reading Error_Code&lt;br /&gt;
attr WebastoNext obj-i1006-type unsigned short big&lt;br /&gt;
attr WebastoNext obj-i1008-poll 1&lt;br /&gt;
attr WebastoNext obj-i1008-reading Charge_Active_Current_L1&lt;br /&gt;
attr WebastoNext obj-i1008-type unsigned short big&lt;br /&gt;
attr WebastoNext obj-i1008-expr $val/1000&lt;br /&gt;
attr WebastoNext obj-i1010-poll 1&lt;br /&gt;
attr WebastoNext obj-i1010-reading Charge_Active_Current_L2&lt;br /&gt;
attr WebastoNext obj-i1010-type unsigned short big&lt;br /&gt;
attr WebastoNext obj-i1010-expr $val/1000&lt;br /&gt;
attr WebastoNext obj-i1012-poll 1&lt;br /&gt;
attr WebastoNext obj-i1012-reading Charge_Active_Current_L3&lt;br /&gt;
attr WebastoNext obj-i1012-type unsigned short big&lt;br /&gt;
attr WebastoNext obj-i1012-expr $val/1000&lt;br /&gt;
attr WebastoNext obj-i1020-poll 1&lt;br /&gt;
attr WebastoNext obj-i1020-reading Charge_Active_Power&lt;br /&gt;
attr WebastoNext obj-i1020-type unsigned long big&lt;br /&gt;
attr WebastoNext obj-i1024-reading Charge_Active_Power_L1&lt;br /&gt;
attr WebastoNext obj-i1024-poll 1&lt;br /&gt;
attr WebastoNext obj-i1024-type unsigned long big&lt;br /&gt;
attr WebastoNext obj-i1028-reading Charge_Active_Power_L2&lt;br /&gt;
attr WebastoNext obj-i1028-poll 1&lt;br /&gt;
attr WebastoNext obj-i1028-type unsigned long big&lt;br /&gt;
attr WebastoNext obj-i1032-reading Charge_Active_Power_L3&lt;br /&gt;
attr WebastoNext obj-i1032-poll 1&lt;br /&gt;
attr WebastoNext obj-i1032-type unsigned long big&lt;br /&gt;
attr WebastoNext obj-i1036-reading Energy_Meter&lt;br /&gt;
attr WebastoNext obj-i1036-poll 1&lt;br /&gt;
attr WebastoNext obj-i1036-type unsigned long big&lt;br /&gt;
attr WebastoNext obj-i1036-expr $val/1000&lt;br /&gt;
&lt;br /&gt;
attr WebastoNext obj-i1102-reading Min_Current&lt;br /&gt;
attr WebastoNext obj-i1102-poll 1&lt;br /&gt;
attr WebastoNext obj-i1102-type unsigned short big&lt;br /&gt;
attr WebastoNext obj-i1108-reading EV_Max_Current&lt;br /&gt;
attr WebastoNext obj-i1108-poll 1&lt;br /&gt;
attr WebastoNext obj-i1108-type unsigned short big&lt;br /&gt;
attr WebastoNext obj-i1502-reading Charged_Energy&lt;br /&gt;
attr WebastoNext obj-i1502-poll 1&lt;br /&gt;
attr WebastoNext obj-i1502-type unsigned short big&lt;br /&gt;
attr WebastoNext obj-i1502-expr $val/1000&lt;br /&gt;
attr WebastoNext obj-i1504-reading Charging_Start_Time&lt;br /&gt;
attr WebastoNext obj-i1504-poll 1&lt;br /&gt;
attr WebastoNext obj-i1504-type unsigned long big&lt;br /&gt;
attr WebastoNext obj-i1508-reading Charging_Time&lt;br /&gt;
attr WebastoNext obj-i1508-poll 1&lt;br /&gt;
attr WebastoNext obj-i1508-type unsigned long big&lt;br /&gt;
attr WebastoNext obj-i1512-reading Charging_End_Time&lt;br /&gt;
attr WebastoNext obj-i1512-poll 1&lt;br /&gt;
attr WebastoNext obj-i1512-type unsigned long big&lt;br /&gt;
attr WebastoNext obj-i1620-reading Smart_Vehicle_Detected&lt;br /&gt;
attr WebastoNext obj-i1620-poll 1&lt;br /&gt;
attr WebastoNext obj-i1620-type unsigned short big&lt;br /&gt;
&lt;br /&gt;
attr WebastoNext obj-h2000-reading Safe_Current&lt;br /&gt;
attr WebastoNext obj-h2000-poll 1&lt;br /&gt;
attr WebastoNext obj-h2000-polldelay 600&lt;br /&gt;
attr WebastoNext obj-h2000-type unsigned short big&lt;br /&gt;
attr WebastoNext obj-h2000-set 1&lt;br /&gt;
attr WebastoNext obj-h2000-min 0&lt;br /&gt;
attr WebastoNext obj-h2000-max 16&lt;br /&gt;
&lt;br /&gt;
attr WebastoNext obj-h2002-reading Com_Timeout&lt;br /&gt;
attr WebastoNext obj-h2002-poll 1&lt;br /&gt;
attr WebastoNext obj-h2002-polldelay x199&lt;br /&gt;
attr WebastoNext obj-h2002-type unsigned short big&lt;br /&gt;
attr WebastoNext obj-h2002-set 1&lt;br /&gt;
&lt;br /&gt;
attr WebastoNext obj-h5000-reading Charge_Power_Set&lt;br /&gt;
attr WebastoNext obj-h5000-poll 0&lt;br /&gt;
attr WebastoNext obj-h5000-type unsigned long big&lt;br /&gt;
attr WebastoNext obj-h5000-set 1&lt;br /&gt;
&lt;br /&gt;
attr WebastoNext obj-h5004-reading Charge_Current_Set&lt;br /&gt;
attr WebastoNext obj-h5004-poll 0&lt;br /&gt;
attr WebastoNext obj-h5004-type signed short big&lt;br /&gt;
attr WebastoNext obj-h5004-set 1&lt;br /&gt;
attr WebastoNext obj-h5004-min 0&lt;br /&gt;
attr WebastoNext obj-h5004-max 16&lt;br /&gt;
&lt;br /&gt;
attr WebastoNext obj-h5006-reading Start_Cancel&lt;br /&gt;
attr WebastoNext obj-h5006-poll 0&lt;br /&gt;
attr WebastoNext obj-h5006-type unsigned short big&lt;br /&gt;
attr WebastoNext obj-h5006-set 1&lt;br /&gt;
attr WebastoNext obj-h5006-min 0&lt;br /&gt;
attr WebastoNext obj-h5006-max 2&lt;br /&gt;
attr WebastoNext obj-h5006-hint 0,1,2&lt;br /&gt;
&lt;br /&gt;
attr WebastoNext obj-h6000-reading Life_Bit&lt;br /&gt;
attr WebastoNext obj-h6000-poll 1&lt;br /&gt;
attr WebastoNext obj-h6000-type unsigned short big&lt;br /&gt;
attr WebastoNext obj-h6000-set 1&lt;br /&gt;
&lt;br /&gt;
attr WebastoNext userReadings \&lt;br /&gt;
Charge_Point_State_TXT:Charge_Point_State\b.* {my $val = ReadingsVal (&amp;quot;WebastoNext&amp;quot;,&amp;quot;Charge_Point_State&amp;quot;, 0);; if ($val == 0) {return &amp;quot;no vehicle attached (EVSE available, EVSE unavailable)&amp;quot;} elsif ($val == 1) {return &amp;quot;vehicle attached, no permission (preparing)&amp;quot;} elsif ($val == 3) {return &amp;quot;charging&amp;quot;} elsif ($val == 4) {return &amp;quot;charging paused (suspending EVSE, suspending EV, finishing)&amp;quot;} elsif ($val == 7) {return &amp;quot;charging error&amp;quot;} elsif ($val == 8) {return &amp;quot;charging station reserved&amp;quot;} else { return $val .&amp;quot; undefined&amp;quot; };;},\&lt;br /&gt;
Cable_State_TXT:Cable_State\b.* {my $val = ReadingsVal (&amp;quot;WebastoNext&amp;quot;,&amp;quot;Cable_State&amp;quot;, 0);; if ($val == 0) {return &amp;quot;no cable attached&amp;quot;} elsif ($val == 1) {return &amp;quot;cable attached (no car attached)&amp;quot;} elsif ($val == 2) {return &amp;quot;cable attached (car attached)&amp;quot;} elsif ($val == 3) {return &amp;quot;cable attached (car attached) + lock active&amp;quot;} else { return $val .&amp;quot; undefined&amp;quot; };;}, \&lt;br /&gt;
Charge_State_TXT:Charge_State\b.* {my $val = ReadingsVal (&amp;quot;WebastoNext&amp;quot;,&amp;quot;Charge_State&amp;quot;, 0);; if ($val == 0) {return &amp;quot;idle&amp;quot;} elsif ($val == 1) {return &amp;quot;charging&amp;quot;} else { return $val .&amp;quot; undefined&amp;quot; };;}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Steuerung ===&lt;br /&gt;
Das Register Charge_Power_Set wird nur berücksichtigt, wenn Charge_Current_Set auf 0 gesetzt ist. Mindestladestromstärke ist 6 A bzw. 4200 W.&lt;br /&gt;
&lt;br /&gt;
Die Wallbox reagiert nur dann auf die Steuerung, wenn ein regelmäßiges Keep-Alive-Bit gesetzt wird. Ansonsten wird der Lademodus mit dem Wert &amp;quot;Safe_Current&amp;quot; gestartet.&amp;lt;syntaxhighlight lang=&amp;quot;cfg&amp;quot;&amp;gt;&lt;br /&gt;
define WebastoNext_KeepAlive at +*00:00:30 set WebastoNext Life_Bit 1&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Gestartet wird der Ladvorgang mit &amp;quot;set WebastoNext Start_Cancel 1&amp;quot;. Gestoppt wird mit &amp;quot;set WebastoNext Start_Cancel 2&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== 1- und 3-phasiges Laden ===&lt;br /&gt;
Die Wallbox kann sowohl 1- als auch 3-phasig laden. Allerdings kann sie zwischen den beiden Lademodi nicht dynamisch umschalten, sondern muss in der jeweiligen elektrischen Konfiguration neu gestartet werden.&lt;br /&gt;
&lt;br /&gt;
Die Phasen können z.B. mit zwei (stromsparenden) Stromstoßrelais an- und abgeschaltet werden. Konkret wird die Wallbox komplett stromlos geschaltet und dann nur mit Phase L1 oder zusätzlich mit den Phase L2 und L3 neu gestartet. Die Wallbox braucht etwa 3 Minuten um wieder hoch zu fahren und wertet dabei die anstehenden Phasen aus. Ein Zu- oder Wegschalten von Phasen nach dem Hochfahren führt zu einer Fehlermeldung und die Wallbox reagiert nicht mehr.&lt;br /&gt;
[[Kategorie:Wallboxen]]&lt;br /&gt;
[[Kategorie:Elektromobilität]]&lt;br /&gt;
__INHALTSVERZEICHNIS_ERZWINGEN__&lt;br /&gt;
__INDEXIEREN__&lt;/div&gt;</summary>
		<author><name>Topos</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Webasto_Next&amp;diff=40119</id>
		<title>Webasto Next</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Webasto_Next&amp;diff=40119"/>
		<updated>2025-04-28T05:42:07Z</updated>

		<summary type="html">&lt;p&gt;Topos: /* 1- und 3-phasiges Laden */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Die Wallbox Webasto Next kann per LAN oder WLAN über das Modebus-Protokoll ausgelesen und gesteuert werden.&lt;br /&gt;
&lt;br /&gt;
Hier eine mögliche Konfiguration:&amp;lt;syntaxhighlight lang=&amp;quot;cfg&amp;quot;&amp;gt;&lt;br /&gt;
define WebastoNext ModbusAttr 1 3 [IP-Addresse]:502 TCP&lt;br /&gt;
attr WebastoNext alias Wallbox&lt;br /&gt;
attr WebastoNext icon wallbox&lt;br /&gt;
attr WebastoNext stateFormat Charge_Point_State_TXT&amp;lt;br&amp;gt;Cable_State_TXT&amp;lt;br&amp;gt;Charge_State_TXT: Charge_Active_Power W&lt;br /&gt;
attr WebastoNext event-on-update-reading .*&lt;br /&gt;
attr WebastoNext DbLogExclude .*&lt;br /&gt;
attr WebastoNext DbLogInclude Charge_Active_Power:600&lt;br /&gt;
attr WebastoNext oldreadings Cable_State&lt;br /&gt;
attr WebastoNext obj-i1000-poll 1&lt;br /&gt;
attr WebastoNext obj-i1000-reading Charge_Point_State&lt;br /&gt;
attr WebastoNext obj-i1000-type unsigned short big&lt;br /&gt;
attr WebastoNext obj-i1001-poll 1&lt;br /&gt;
attr WebastoNext obj-i1001-reading Charge_State&lt;br /&gt;
attr WebastoNext obj-i1001-type unsigned short big&lt;br /&gt;
attr WebastoNext obj-i1004-poll 1&lt;br /&gt;
attr WebastoNext obj-i1004-reading Cable_State&lt;br /&gt;
attr WebastoNext obj-i1004-type unsigned short big&lt;br /&gt;
attr WebastoNext obj-i1006-poll 1&lt;br /&gt;
attr WebastoNext obj-i1006-reading Error_Code&lt;br /&gt;
attr WebastoNext obj-i1006-type unsigned short big&lt;br /&gt;
attr WebastoNext obj-i1008-poll 1&lt;br /&gt;
attr WebastoNext obj-i1008-reading Charge_Active_Current_L1&lt;br /&gt;
attr WebastoNext obj-i1008-type unsigned short big&lt;br /&gt;
attr WebastoNext obj-i1008-expr $val/1000&lt;br /&gt;
attr WebastoNext obj-i1010-poll 1&lt;br /&gt;
attr WebastoNext obj-i1010-reading Charge_Active_Current_L2&lt;br /&gt;
attr WebastoNext obj-i1010-type unsigned short big&lt;br /&gt;
attr WebastoNext obj-i1010-expr $val/1000&lt;br /&gt;
attr WebastoNext obj-i1012-poll 1&lt;br /&gt;
attr WebastoNext obj-i1012-reading Charge_Active_Current_L3&lt;br /&gt;
attr WebastoNext obj-i1012-type unsigned short big&lt;br /&gt;
attr WebastoNext obj-i1012-expr $val/1000&lt;br /&gt;
attr WebastoNext obj-i1020-poll 1&lt;br /&gt;
attr WebastoNext obj-i1020-reading Charge_Active_Power&lt;br /&gt;
attr WebastoNext obj-i1020-type unsigned long big&lt;br /&gt;
attr WebastoNext obj-i1024-reading Charge_Active_Power_L1&lt;br /&gt;
attr WebastoNext obj-i1024-poll 1&lt;br /&gt;
attr WebastoNext obj-i1024-type unsigned long big&lt;br /&gt;
attr WebastoNext obj-i1028-reading Charge_Active_Power_L2&lt;br /&gt;
attr WebastoNext obj-i1028-poll 1&lt;br /&gt;
attr WebastoNext obj-i1028-type unsigned long big&lt;br /&gt;
attr WebastoNext obj-i1032-reading Charge_Active_Power_L3&lt;br /&gt;
attr WebastoNext obj-i1032-poll 1&lt;br /&gt;
attr WebastoNext obj-i1032-type unsigned long big&lt;br /&gt;
attr WebastoNext obj-i1036-reading Energy_Meter&lt;br /&gt;
attr WebastoNext obj-i1036-poll 1&lt;br /&gt;
attr WebastoNext obj-i1036-type unsigned long big&lt;br /&gt;
attr WebastoNext obj-i1036-expr $val/1000&lt;br /&gt;
&lt;br /&gt;
attr WebastoNext obj-i1102-reading Min_Current&lt;br /&gt;
attr WebastoNext obj-i1102-poll 1&lt;br /&gt;
attr WebastoNext obj-i1102-type unsigned short big&lt;br /&gt;
attr WebastoNext obj-i1108-reading EV_Max_Current&lt;br /&gt;
attr WebastoNext obj-i1108-poll 1&lt;br /&gt;
attr WebastoNext obj-i1108-type unsigned short big&lt;br /&gt;
attr WebastoNext obj-i1502-reading Charged_Energy&lt;br /&gt;
attr WebastoNext obj-i1502-poll 1&lt;br /&gt;
attr WebastoNext obj-i1502-type unsigned short big&lt;br /&gt;
attr WebastoNext obj-i1502-expr $val/1000&lt;br /&gt;
attr WebastoNext obj-i1504-reading Charging_Start_Time&lt;br /&gt;
attr WebastoNext obj-i1504-poll 1&lt;br /&gt;
attr WebastoNext obj-i1504-type unsigned long big&lt;br /&gt;
attr WebastoNext obj-i1508-reading Charging_Time&lt;br /&gt;
attr WebastoNext obj-i1508-poll 1&lt;br /&gt;
attr WebastoNext obj-i1508-type unsigned long big&lt;br /&gt;
attr WebastoNext obj-i1512-reading Charging_End_Time&lt;br /&gt;
attr WebastoNext obj-i1512-poll 1&lt;br /&gt;
attr WebastoNext obj-i1512-type unsigned long big&lt;br /&gt;
attr WebastoNext obj-i1620-reading Smart_Vehicle_Detected&lt;br /&gt;
attr WebastoNext obj-i1620-poll 1&lt;br /&gt;
attr WebastoNext obj-i1620-type unsigned short big&lt;br /&gt;
&lt;br /&gt;
attr WebastoNext obj-h2000-reading Safe_Current&lt;br /&gt;
attr WebastoNext obj-h2000-poll 1&lt;br /&gt;
attr WebastoNext obj-h2000-polldelay 600&lt;br /&gt;
attr WebastoNext obj-h2000-type unsigned short big&lt;br /&gt;
attr WebastoNext obj-h2000-set 1&lt;br /&gt;
attr WebastoNext obj-h2000-min 0&lt;br /&gt;
attr WebastoNext obj-h2000-max 16&lt;br /&gt;
&lt;br /&gt;
attr WebastoNext obj-h2002-reading Com_Timeout&lt;br /&gt;
attr WebastoNext obj-h2002-poll 1&lt;br /&gt;
attr WebastoNext obj-h2002-polldelay x199&lt;br /&gt;
attr WebastoNext obj-h2002-type unsigned short big&lt;br /&gt;
attr WebastoNext obj-h2002-set 1&lt;br /&gt;
&lt;br /&gt;
attr WebastoNext obj-h5000-reading Charge_Power_Set&lt;br /&gt;
attr WebastoNext obj-h5000-poll 0&lt;br /&gt;
attr WebastoNext obj-h5000-type unsigned long big&lt;br /&gt;
attr WebastoNext obj-h5000-set 1&lt;br /&gt;
&lt;br /&gt;
attr WebastoNext obj-h5004-reading Charge_Current_Set&lt;br /&gt;
attr WebastoNext obj-h5004-poll 0&lt;br /&gt;
attr WebastoNext obj-h5004-type signed short big&lt;br /&gt;
attr WebastoNext obj-h5004-set 1&lt;br /&gt;
attr WebastoNext obj-h5004-min 0&lt;br /&gt;
attr WebastoNext obj-h5004-max 16&lt;br /&gt;
&lt;br /&gt;
attr WebastoNext obj-h5006-reading Start_Cancel&lt;br /&gt;
attr WebastoNext obj-h5006-poll 0&lt;br /&gt;
attr WebastoNext obj-h5006-type unsigned short big&lt;br /&gt;
attr WebastoNext obj-h5006-set 1&lt;br /&gt;
attr WebastoNext obj-h5006-min 0&lt;br /&gt;
attr WebastoNext obj-h5006-max 2&lt;br /&gt;
attr WebastoNext obj-h5006-hint 0,1,2&lt;br /&gt;
&lt;br /&gt;
attr WebastoNext obj-h6000-reading Life_Bit&lt;br /&gt;
attr WebastoNext obj-h6000-poll 1&lt;br /&gt;
attr WebastoNext obj-h6000-type unsigned short big&lt;br /&gt;
attr WebastoNext obj-h6000-set 1&lt;br /&gt;
&lt;br /&gt;
attr WebastoNext userReadings \&lt;br /&gt;
Charge_Point_State_TXT:Charge_Point_State\b.* {my $val = ReadingsVal (&amp;quot;WebastoNext&amp;quot;,&amp;quot;Charge_Point_State&amp;quot;, 0);; if ($val == 0) {return &amp;quot;no vehicle attached (EVSE available, EVSE unavailable)&amp;quot;} elsif ($val == 1) {return &amp;quot;vehicle attached, no permission (preparing)&amp;quot;} elsif ($val == 3) {return &amp;quot;charging&amp;quot;} elsif ($val == 4) {return &amp;quot;charging paused (suspending EVSE, suspending EV, finishing)&amp;quot;} elsif ($val == 7) {return &amp;quot;charging error&amp;quot;} elsif ($val == 8) {return &amp;quot;charging station reserved&amp;quot;} else { return $val .&amp;quot; undefined&amp;quot; };;},\&lt;br /&gt;
Cable_State_TXT:Cable_State\b.* {my $val = ReadingsVal (&amp;quot;WebastoNext&amp;quot;,&amp;quot;Cable_State&amp;quot;, 0);; if ($val == 0) {return &amp;quot;no cable attached&amp;quot;} elsif ($val == 1) {return &amp;quot;cable attached (no car attached)&amp;quot;} elsif ($val == 2) {return &amp;quot;cable attached (car attached)&amp;quot;} elsif ($val == 3) {return &amp;quot;cable attached (car attached) + lock active&amp;quot;} else { return $val .&amp;quot; undefined&amp;quot; };;}, \&lt;br /&gt;
Charge_State_TXT:Charge_State\b.* {my $val = ReadingsVal (&amp;quot;WebastoNext&amp;quot;,&amp;quot;Charge_State&amp;quot;, 0);; if ($val == 0) {return &amp;quot;idle&amp;quot;} elsif ($val == 1) {return &amp;quot;charging&amp;quot;} else { return $val .&amp;quot; undefined&amp;quot; };;}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Steuerung ===&lt;br /&gt;
Das Register Charge_Power_Set wird nur berücksichtigt, wenn Charge_Current_Set auf 0 gesetzt ist. Mindestladestromstärke ist 6 A bzw. 4200 W.&lt;br /&gt;
&lt;br /&gt;
Die Wallbox reagiert nur dann auf die Steuerung, wenn ein regelmäßiges Keep-Alive-Bit gesetzt wird. Ansonsten wird der Lademodus mit dem Wert &amp;quot;Safe_Current&amp;quot; gestartet.&amp;lt;syntaxhighlight lang=&amp;quot;cfg&amp;quot;&amp;gt;&lt;br /&gt;
define WebastoNext_KeepAlive at +*00:00:30 set WebastoNext Life_Bit 1&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Gestartet wird der Ladvorgang mit &amp;quot;set WebastoNext Start_Cancel 1&amp;quot;. Gestoppt wird mit &amp;quot;set WebastoNext Start_Cancel 2&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== 1- und 3-phasiges Laden ===&lt;br /&gt;
Die Wallbox kann sowohl 1- als auch 3-phasig Laden. Allerdings kann sie zwischen den beiden Lademodi nicht dynamisch umschalten, sondern muss in der jeweiligen elektrischen Konfiguration neu gestartet werden.&lt;br /&gt;
&lt;br /&gt;
Die Phasen können z.B. mit zwei (stromsparenden) Stromstoßrelais an- und abgeschaltet werden. Konkret wird die Wallbox komplett stromlos geschaltet und dann nur mit Phase L1 oder zusätzlich mit den Phase L2 und L3 neu gestartet. Die Wallbox braucht etwa 3 Minuten um wieder hoch zu fahren und wertet dabei die anstehenden Phasen aus. Ein Zu- oder Wegschalten von Phasen nach dem Hochfahren führt zu einer Fehlermeldung und die Wallbox reagiert nicht mehr.&lt;br /&gt;
[[Kategorie:Wallboxen]]&lt;br /&gt;
[[Kategorie:Elektromobilität]]&lt;br /&gt;
__INHALTSVERZEICHNIS_ERZWINGEN__&lt;br /&gt;
__INDEXIEREN__&lt;/div&gt;</summary>
		<author><name>Topos</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Webasto_Next&amp;diff=40118</id>
		<title>Webasto Next</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Webasto_Next&amp;diff=40118"/>
		<updated>2025-04-28T05:41:37Z</updated>

		<summary type="html">&lt;p&gt;Topos: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Die Wallbox Webasto Next kann per LAN oder WLAN über das Modebus-Protokoll ausgelesen und gesteuert werden.&lt;br /&gt;
&lt;br /&gt;
Hier eine mögliche Konfiguration:&amp;lt;syntaxhighlight lang=&amp;quot;cfg&amp;quot;&amp;gt;&lt;br /&gt;
define WebastoNext ModbusAttr 1 3 [IP-Addresse]:502 TCP&lt;br /&gt;
attr WebastoNext alias Wallbox&lt;br /&gt;
attr WebastoNext icon wallbox&lt;br /&gt;
attr WebastoNext stateFormat Charge_Point_State_TXT&amp;lt;br&amp;gt;Cable_State_TXT&amp;lt;br&amp;gt;Charge_State_TXT: Charge_Active_Power W&lt;br /&gt;
attr WebastoNext event-on-update-reading .*&lt;br /&gt;
attr WebastoNext DbLogExclude .*&lt;br /&gt;
attr WebastoNext DbLogInclude Charge_Active_Power:600&lt;br /&gt;
attr WebastoNext oldreadings Cable_State&lt;br /&gt;
attr WebastoNext obj-i1000-poll 1&lt;br /&gt;
attr WebastoNext obj-i1000-reading Charge_Point_State&lt;br /&gt;
attr WebastoNext obj-i1000-type unsigned short big&lt;br /&gt;
attr WebastoNext obj-i1001-poll 1&lt;br /&gt;
attr WebastoNext obj-i1001-reading Charge_State&lt;br /&gt;
attr WebastoNext obj-i1001-type unsigned short big&lt;br /&gt;
attr WebastoNext obj-i1004-poll 1&lt;br /&gt;
attr WebastoNext obj-i1004-reading Cable_State&lt;br /&gt;
attr WebastoNext obj-i1004-type unsigned short big&lt;br /&gt;
attr WebastoNext obj-i1006-poll 1&lt;br /&gt;
attr WebastoNext obj-i1006-reading Error_Code&lt;br /&gt;
attr WebastoNext obj-i1006-type unsigned short big&lt;br /&gt;
attr WebastoNext obj-i1008-poll 1&lt;br /&gt;
attr WebastoNext obj-i1008-reading Charge_Active_Current_L1&lt;br /&gt;
attr WebastoNext obj-i1008-type unsigned short big&lt;br /&gt;
attr WebastoNext obj-i1008-expr $val/1000&lt;br /&gt;
attr WebastoNext obj-i1010-poll 1&lt;br /&gt;
attr WebastoNext obj-i1010-reading Charge_Active_Current_L2&lt;br /&gt;
attr WebastoNext obj-i1010-type unsigned short big&lt;br /&gt;
attr WebastoNext obj-i1010-expr $val/1000&lt;br /&gt;
attr WebastoNext obj-i1012-poll 1&lt;br /&gt;
attr WebastoNext obj-i1012-reading Charge_Active_Current_L3&lt;br /&gt;
attr WebastoNext obj-i1012-type unsigned short big&lt;br /&gt;
attr WebastoNext obj-i1012-expr $val/1000&lt;br /&gt;
attr WebastoNext obj-i1020-poll 1&lt;br /&gt;
attr WebastoNext obj-i1020-reading Charge_Active_Power&lt;br /&gt;
attr WebastoNext obj-i1020-type unsigned long big&lt;br /&gt;
attr WebastoNext obj-i1024-reading Charge_Active_Power_L1&lt;br /&gt;
attr WebastoNext obj-i1024-poll 1&lt;br /&gt;
attr WebastoNext obj-i1024-type unsigned long big&lt;br /&gt;
attr WebastoNext obj-i1028-reading Charge_Active_Power_L2&lt;br /&gt;
attr WebastoNext obj-i1028-poll 1&lt;br /&gt;
attr WebastoNext obj-i1028-type unsigned long big&lt;br /&gt;
attr WebastoNext obj-i1032-reading Charge_Active_Power_L3&lt;br /&gt;
attr WebastoNext obj-i1032-poll 1&lt;br /&gt;
attr WebastoNext obj-i1032-type unsigned long big&lt;br /&gt;
attr WebastoNext obj-i1036-reading Energy_Meter&lt;br /&gt;
attr WebastoNext obj-i1036-poll 1&lt;br /&gt;
attr WebastoNext obj-i1036-type unsigned long big&lt;br /&gt;
attr WebastoNext obj-i1036-expr $val/1000&lt;br /&gt;
&lt;br /&gt;
attr WebastoNext obj-i1102-reading Min_Current&lt;br /&gt;
attr WebastoNext obj-i1102-poll 1&lt;br /&gt;
attr WebastoNext obj-i1102-type unsigned short big&lt;br /&gt;
attr WebastoNext obj-i1108-reading EV_Max_Current&lt;br /&gt;
attr WebastoNext obj-i1108-poll 1&lt;br /&gt;
attr WebastoNext obj-i1108-type unsigned short big&lt;br /&gt;
attr WebastoNext obj-i1502-reading Charged_Energy&lt;br /&gt;
attr WebastoNext obj-i1502-poll 1&lt;br /&gt;
attr WebastoNext obj-i1502-type unsigned short big&lt;br /&gt;
attr WebastoNext obj-i1502-expr $val/1000&lt;br /&gt;
attr WebastoNext obj-i1504-reading Charging_Start_Time&lt;br /&gt;
attr WebastoNext obj-i1504-poll 1&lt;br /&gt;
attr WebastoNext obj-i1504-type unsigned long big&lt;br /&gt;
attr WebastoNext obj-i1508-reading Charging_Time&lt;br /&gt;
attr WebastoNext obj-i1508-poll 1&lt;br /&gt;
attr WebastoNext obj-i1508-type unsigned long big&lt;br /&gt;
attr WebastoNext obj-i1512-reading Charging_End_Time&lt;br /&gt;
attr WebastoNext obj-i1512-poll 1&lt;br /&gt;
attr WebastoNext obj-i1512-type unsigned long big&lt;br /&gt;
attr WebastoNext obj-i1620-reading Smart_Vehicle_Detected&lt;br /&gt;
attr WebastoNext obj-i1620-poll 1&lt;br /&gt;
attr WebastoNext obj-i1620-type unsigned short big&lt;br /&gt;
&lt;br /&gt;
attr WebastoNext obj-h2000-reading Safe_Current&lt;br /&gt;
attr WebastoNext obj-h2000-poll 1&lt;br /&gt;
attr WebastoNext obj-h2000-polldelay 600&lt;br /&gt;
attr WebastoNext obj-h2000-type unsigned short big&lt;br /&gt;
attr WebastoNext obj-h2000-set 1&lt;br /&gt;
attr WebastoNext obj-h2000-min 0&lt;br /&gt;
attr WebastoNext obj-h2000-max 16&lt;br /&gt;
&lt;br /&gt;
attr WebastoNext obj-h2002-reading Com_Timeout&lt;br /&gt;
attr WebastoNext obj-h2002-poll 1&lt;br /&gt;
attr WebastoNext obj-h2002-polldelay x199&lt;br /&gt;
attr WebastoNext obj-h2002-type unsigned short big&lt;br /&gt;
attr WebastoNext obj-h2002-set 1&lt;br /&gt;
&lt;br /&gt;
attr WebastoNext obj-h5000-reading Charge_Power_Set&lt;br /&gt;
attr WebastoNext obj-h5000-poll 0&lt;br /&gt;
attr WebastoNext obj-h5000-type unsigned long big&lt;br /&gt;
attr WebastoNext obj-h5000-set 1&lt;br /&gt;
&lt;br /&gt;
attr WebastoNext obj-h5004-reading Charge_Current_Set&lt;br /&gt;
attr WebastoNext obj-h5004-poll 0&lt;br /&gt;
attr WebastoNext obj-h5004-type signed short big&lt;br /&gt;
attr WebastoNext obj-h5004-set 1&lt;br /&gt;
attr WebastoNext obj-h5004-min 0&lt;br /&gt;
attr WebastoNext obj-h5004-max 16&lt;br /&gt;
&lt;br /&gt;
attr WebastoNext obj-h5006-reading Start_Cancel&lt;br /&gt;
attr WebastoNext obj-h5006-poll 0&lt;br /&gt;
attr WebastoNext obj-h5006-type unsigned short big&lt;br /&gt;
attr WebastoNext obj-h5006-set 1&lt;br /&gt;
attr WebastoNext obj-h5006-min 0&lt;br /&gt;
attr WebastoNext obj-h5006-max 2&lt;br /&gt;
attr WebastoNext obj-h5006-hint 0,1,2&lt;br /&gt;
&lt;br /&gt;
attr WebastoNext obj-h6000-reading Life_Bit&lt;br /&gt;
attr WebastoNext obj-h6000-poll 1&lt;br /&gt;
attr WebastoNext obj-h6000-type unsigned short big&lt;br /&gt;
attr WebastoNext obj-h6000-set 1&lt;br /&gt;
&lt;br /&gt;
attr WebastoNext userReadings \&lt;br /&gt;
Charge_Point_State_TXT:Charge_Point_State\b.* {my $val = ReadingsVal (&amp;quot;WebastoNext&amp;quot;,&amp;quot;Charge_Point_State&amp;quot;, 0);; if ($val == 0) {return &amp;quot;no vehicle attached (EVSE available, EVSE unavailable)&amp;quot;} elsif ($val == 1) {return &amp;quot;vehicle attached, no permission (preparing)&amp;quot;} elsif ($val == 3) {return &amp;quot;charging&amp;quot;} elsif ($val == 4) {return &amp;quot;charging paused (suspending EVSE, suspending EV, finishing)&amp;quot;} elsif ($val == 7) {return &amp;quot;charging error&amp;quot;} elsif ($val == 8) {return &amp;quot;charging station reserved&amp;quot;} else { return $val .&amp;quot; undefined&amp;quot; };;},\&lt;br /&gt;
Cable_State_TXT:Cable_State\b.* {my $val = ReadingsVal (&amp;quot;WebastoNext&amp;quot;,&amp;quot;Cable_State&amp;quot;, 0);; if ($val == 0) {return &amp;quot;no cable attached&amp;quot;} elsif ($val == 1) {return &amp;quot;cable attached (no car attached)&amp;quot;} elsif ($val == 2) {return &amp;quot;cable attached (car attached)&amp;quot;} elsif ($val == 3) {return &amp;quot;cable attached (car attached) + lock active&amp;quot;} else { return $val .&amp;quot; undefined&amp;quot; };;}, \&lt;br /&gt;
Charge_State_TXT:Charge_State\b.* {my $val = ReadingsVal (&amp;quot;WebastoNext&amp;quot;,&amp;quot;Charge_State&amp;quot;, 0);; if ($val == 0) {return &amp;quot;idle&amp;quot;} elsif ($val == 1) {return &amp;quot;charging&amp;quot;} else { return $val .&amp;quot; undefined&amp;quot; };;}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Steuerung ===&lt;br /&gt;
Das Register Charge_Power_Set wird nur berücksichtigt, wenn Charge_Current_Set auf 0 gesetzt ist. Mindestladestromstärke ist 6 A bzw. 4200 W.&lt;br /&gt;
&lt;br /&gt;
Die Wallbox reagiert nur dann auf die Steuerung, wenn ein regelmäßiges Keep-Alive-Bit gesetzt wird. Ansonsten wird der Lademodus mit dem Wert &amp;quot;Safe_Current&amp;quot; gestartet.&amp;lt;syntaxhighlight lang=&amp;quot;cfg&amp;quot;&amp;gt;&lt;br /&gt;
define WebastoNext_KeepAlive at +*00:00:30 set WebastoNext Life_Bit 1&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Gestartet wird der Ladvorgang mit &amp;quot;set WebastoNext Start_Cancel 1&amp;quot;. Gestoppt wird mit &amp;quot;set WebastoNext Start_Cancel 2&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== 1- und 3-phases Laden ===&lt;br /&gt;
Die Wallbox kann sowohl 1- als auch 3-phasig Laden. Allerdings kann sie zwischen den beiden Lademodi nicht dynamisch umschalten, sondern muss in der jeweiligen elektrischen Konfiguration neu gestartet werden.&lt;br /&gt;
&lt;br /&gt;
Die Phasen können z.B. mit zwei (stromsparenden) Stromstoßrelais an- und abgeschaltet werden. Konkret wird die Wallbox komplett stromlos geschaltet und dann nur mit Phase L1 oder zusätzlich mit den Phase L2 und L3 neu gestartet. Die Wallbox braucht etwa 3 Minuten um wieder hoch zu fahren und wertet dabei die anstehenden Phasen aus. Ein Zu- oder Wegschalten von Phasen nach dem Hochfahren führt zu einer Fehlermeldung und die Wallbox reagiert nicht mehr.&lt;br /&gt;
[[Kategorie:Wallboxen]]&lt;br /&gt;
[[Kategorie:Elektromobilität]]&lt;br /&gt;
__INHALTSVERZEICHNIS_ERZWINGEN__&lt;br /&gt;
__INDEXIEREN__&lt;/div&gt;</summary>
		<author><name>Topos</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Webasto_Next&amp;diff=40117</id>
		<title>Webasto Next</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Webasto_Next&amp;diff=40117"/>
		<updated>2025-04-28T05:40:48Z</updated>

		<summary type="html">&lt;p&gt;Topos: 1- und 3-phasiges Laden&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Die Wallbox Webasto Next kann per LAN oder WLAN über das Modebus-Protokoll ausgelesen und gesteuert werden.&lt;br /&gt;
&lt;br /&gt;
Hier eine mögliche Konfiguration:&amp;lt;syntaxhighlight lang=&amp;quot;cfg&amp;quot;&amp;gt;&lt;br /&gt;
define WebastoNext ModbusAttr 1 3 [IP-Addresse]:502 TCP&lt;br /&gt;
attr WebastoNext alias Wallbox&lt;br /&gt;
attr WebastoNext icon wallbox&lt;br /&gt;
attr WebastoNext stateFormat Charge_Point_State_TXT&amp;lt;br&amp;gt;Cable_State_TXT&amp;lt;br&amp;gt;Charge_State_TXT: Charge_Active_Power W&lt;br /&gt;
attr WebastoNext event-on-update-reading .*&lt;br /&gt;
attr WebastoNext DbLogExclude .*&lt;br /&gt;
attr WebastoNext DbLogInclude Charge_Active_Power:600&lt;br /&gt;
attr WebastoNext oldreadings Cable_State&lt;br /&gt;
attr WebastoNext obj-i1000-poll 1&lt;br /&gt;
attr WebastoNext obj-i1000-reading Charge_Point_State&lt;br /&gt;
attr WebastoNext obj-i1000-type unsigned short big&lt;br /&gt;
attr WebastoNext obj-i1001-poll 1&lt;br /&gt;
attr WebastoNext obj-i1001-reading Charge_State&lt;br /&gt;
attr WebastoNext obj-i1001-type unsigned short big&lt;br /&gt;
attr WebastoNext obj-i1004-poll 1&lt;br /&gt;
attr WebastoNext obj-i1004-reading Cable_State&lt;br /&gt;
attr WebastoNext obj-i1004-type unsigned short big&lt;br /&gt;
attr WebastoNext obj-i1006-poll 1&lt;br /&gt;
attr WebastoNext obj-i1006-reading Error_Code&lt;br /&gt;
attr WebastoNext obj-i1006-type unsigned short big&lt;br /&gt;
attr WebastoNext obj-i1008-poll 1&lt;br /&gt;
attr WebastoNext obj-i1008-reading Charge_Active_Current_L1&lt;br /&gt;
attr WebastoNext obj-i1008-type unsigned short big&lt;br /&gt;
attr WebastoNext obj-i1008-expr $val/1000&lt;br /&gt;
attr WebastoNext obj-i1010-poll 1&lt;br /&gt;
attr WebastoNext obj-i1010-reading Charge_Active_Current_L2&lt;br /&gt;
attr WebastoNext obj-i1010-type unsigned short big&lt;br /&gt;
attr WebastoNext obj-i1010-expr $val/1000&lt;br /&gt;
attr WebastoNext obj-i1012-poll 1&lt;br /&gt;
attr WebastoNext obj-i1012-reading Charge_Active_Current_L3&lt;br /&gt;
attr WebastoNext obj-i1012-type unsigned short big&lt;br /&gt;
attr WebastoNext obj-i1012-expr $val/1000&lt;br /&gt;
attr WebastoNext obj-i1020-poll 1&lt;br /&gt;
attr WebastoNext obj-i1020-reading Charge_Active_Power&lt;br /&gt;
attr WebastoNext obj-i1020-type unsigned long big&lt;br /&gt;
attr WebastoNext obj-i1024-reading Charge_Active_Power_L1&lt;br /&gt;
attr WebastoNext obj-i1024-poll 1&lt;br /&gt;
attr WebastoNext obj-i1024-type unsigned long big&lt;br /&gt;
attr WebastoNext obj-i1028-reading Charge_Active_Power_L2&lt;br /&gt;
attr WebastoNext obj-i1028-poll 1&lt;br /&gt;
attr WebastoNext obj-i1028-type unsigned long big&lt;br /&gt;
attr WebastoNext obj-i1032-reading Charge_Active_Power_L3&lt;br /&gt;
attr WebastoNext obj-i1032-poll 1&lt;br /&gt;
attr WebastoNext obj-i1032-type unsigned long big&lt;br /&gt;
attr WebastoNext obj-i1036-reading Energy_Meter&lt;br /&gt;
attr WebastoNext obj-i1036-poll 1&lt;br /&gt;
attr WebastoNext obj-i1036-type unsigned long big&lt;br /&gt;
attr WebastoNext obj-i1036-expr $val/1000&lt;br /&gt;
&lt;br /&gt;
attr WebastoNext obj-i1102-reading Min_Current&lt;br /&gt;
attr WebastoNext obj-i1102-poll 1&lt;br /&gt;
attr WebastoNext obj-i1102-type unsigned short big&lt;br /&gt;
attr WebastoNext obj-i1108-reading EV_Max_Current&lt;br /&gt;
attr WebastoNext obj-i1108-poll 1&lt;br /&gt;
attr WebastoNext obj-i1108-type unsigned short big&lt;br /&gt;
attr WebastoNext obj-i1502-reading Charged_Energy&lt;br /&gt;
attr WebastoNext obj-i1502-poll 1&lt;br /&gt;
attr WebastoNext obj-i1502-type unsigned short big&lt;br /&gt;
attr WebastoNext obj-i1502-expr $val/1000&lt;br /&gt;
attr WebastoNext obj-i1504-reading Charging_Start_Time&lt;br /&gt;
attr WebastoNext obj-i1504-poll 1&lt;br /&gt;
attr WebastoNext obj-i1504-type unsigned long big&lt;br /&gt;
attr WebastoNext obj-i1508-reading Charging_Time&lt;br /&gt;
attr WebastoNext obj-i1508-poll 1&lt;br /&gt;
attr WebastoNext obj-i1508-type unsigned long big&lt;br /&gt;
attr WebastoNext obj-i1512-reading Charging_End_Time&lt;br /&gt;
attr WebastoNext obj-i1512-poll 1&lt;br /&gt;
attr WebastoNext obj-i1512-type unsigned long big&lt;br /&gt;
attr WebastoNext obj-i1620-reading Smart_Vehicle_Detected&lt;br /&gt;
attr WebastoNext obj-i1620-poll 1&lt;br /&gt;
attr WebastoNext obj-i1620-type unsigned short big&lt;br /&gt;
&lt;br /&gt;
attr WebastoNext obj-h2000-reading Safe_Current&lt;br /&gt;
attr WebastoNext obj-h2000-poll 1&lt;br /&gt;
attr WebastoNext obj-h2000-polldelay 600&lt;br /&gt;
attr WebastoNext obj-h2000-type unsigned short big&lt;br /&gt;
attr WebastoNext obj-h2000-set 1&lt;br /&gt;
attr WebastoNext obj-h2000-min 0&lt;br /&gt;
attr WebastoNext obj-h2000-max 16&lt;br /&gt;
&lt;br /&gt;
attr WebastoNext obj-h2002-reading Com_Timeout&lt;br /&gt;
attr WebastoNext obj-h2002-poll 1&lt;br /&gt;
attr WebastoNext obj-h2002-polldelay x199&lt;br /&gt;
attr WebastoNext obj-h2002-type unsigned short big&lt;br /&gt;
attr WebastoNext obj-h2002-set 1&lt;br /&gt;
&lt;br /&gt;
attr WebastoNext obj-h5000-reading Charge_Power_Set&lt;br /&gt;
attr WebastoNext obj-h5000-poll 0&lt;br /&gt;
attr WebastoNext obj-h5000-type unsigned long big&lt;br /&gt;
attr WebastoNext obj-h5000-set 1&lt;br /&gt;
&lt;br /&gt;
attr WebastoNext obj-h5004-reading Charge_Current_Set&lt;br /&gt;
attr WebastoNext obj-h5004-poll 0&lt;br /&gt;
attr WebastoNext obj-h5004-type signed short big&lt;br /&gt;
attr WebastoNext obj-h5004-set 1&lt;br /&gt;
attr WebastoNext obj-h5004-min 0&lt;br /&gt;
attr WebastoNext obj-h5004-max 16&lt;br /&gt;
&lt;br /&gt;
attr WebastoNext obj-h5006-reading Start_Cancel&lt;br /&gt;
attr WebastoNext obj-h5006-poll 0&lt;br /&gt;
attr WebastoNext obj-h5006-type unsigned short big&lt;br /&gt;
attr WebastoNext obj-h5006-set 1&lt;br /&gt;
attr WebastoNext obj-h5006-min 0&lt;br /&gt;
attr WebastoNext obj-h5006-max 2&lt;br /&gt;
attr WebastoNext obj-h5006-hint 0,1,2&lt;br /&gt;
&lt;br /&gt;
attr WebastoNext obj-h6000-reading Life_Bit&lt;br /&gt;
attr WebastoNext obj-h6000-poll 1&lt;br /&gt;
attr WebastoNext obj-h6000-type unsigned short big&lt;br /&gt;
attr WebastoNext obj-h6000-set 1&lt;br /&gt;
&lt;br /&gt;
attr WebastoNext userReadings \&lt;br /&gt;
Charge_Point_State_TXT:Charge_Point_State\b.* {my $val = ReadingsVal (&amp;quot;WebastoNext&amp;quot;,&amp;quot;Charge_Point_State&amp;quot;, 0);; if ($val == 0) {return &amp;quot;no vehicle attached (EVSE available, EVSE unavailable)&amp;quot;} elsif ($val == 1) {return &amp;quot;vehicle attached, no permission (preparing)&amp;quot;} elsif ($val == 3) {return &amp;quot;charging&amp;quot;} elsif ($val == 4) {return &amp;quot;charging paused (suspending EVSE, suspending EV, finishing)&amp;quot;} elsif ($val == 7) {return &amp;quot;charging error&amp;quot;} elsif ($val == 8) {return &amp;quot;charging station reserved&amp;quot;} else { return $val .&amp;quot; undefined&amp;quot; };;},\&lt;br /&gt;
Cable_State_TXT:Cable_State\b.* {my $val = ReadingsVal (&amp;quot;WebastoNext&amp;quot;,&amp;quot;Cable_State&amp;quot;, 0);; if ($val == 0) {return &amp;quot;no cable attached&amp;quot;} elsif ($val == 1) {return &amp;quot;cable attached (no car attached)&amp;quot;} elsif ($val == 2) {return &amp;quot;cable attached (car attached)&amp;quot;} elsif ($val == 3) {return &amp;quot;cable attached (car attached) + lock active&amp;quot;} else { return $val .&amp;quot; undefined&amp;quot; };;}, \&lt;br /&gt;
Charge_State_TXT:Charge_State\b.* {my $val = ReadingsVal (&amp;quot;WebastoNext&amp;quot;,&amp;quot;Charge_State&amp;quot;, 0);; if ($val == 0) {return &amp;quot;idle&amp;quot;} elsif ($val == 1) {return &amp;quot;charging&amp;quot;} else { return $val .&amp;quot; undefined&amp;quot; };;}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Steuerung ===&lt;br /&gt;
Das Register Charge_Power_Set wird nur berücksichtigt, wenn Charge_Current_Set auf 0 gesetzt ist. Mindestladestromstärke ist 6 A bzw. 4200 W.&lt;br /&gt;
&lt;br /&gt;
Die Wallbox reagiert nur dann auf die Steuerung, wenn ein regelmäßiges Keep-Alive-Bit gesetzt wird. Ansonsten wird der Lademodus mit dem Wert &amp;quot;Safe_Current&amp;quot; gestartet.&amp;lt;syntaxhighlight lang=&amp;quot;cfg&amp;quot;&amp;gt;&lt;br /&gt;
define WebastoNext_KeepAlive at +*00:00:30 set WebastoNext Life_Bit 1&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Gestartet wird der Ladvorgang mit &amp;quot;set WebastoNext Start_Cancel 1&amp;quot;. Gestoppt wird mit &amp;quot;set WebastoNext Start_Cancel 2&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== 1- und 3-phases Laden ===&lt;br /&gt;
Die Wallbox kann sowohl 1- als auch 3-phasig Laden. Allerdings kann sie zwischen den beiden Lademodi nicht dynamisch umschalten, sondern muss in der jeweiligen elektrischen Konfiguration neu gestartet werden.&lt;br /&gt;
&lt;br /&gt;
Die Phasen können z.B. mit zwei (stromsparenden) Stromstoßrelais an- und abgeschaltet werden. Konkret wird die Wallbox komplett stromlos geschaltet und dann nur mit Phase L1 oder zusätzlich mit den Phase L2 und L3 neu gestartet. Die Wallbox braucht etwa 3 Minuten um wieder hoch zu fahren und wertet dabei die anstehenden Phasen aus. Ein Zu- oder Wegschalten von Phasen nach dem Hochfahren führt zu einer Fehlermeldung und die Wallbox reagiert nicht mehr.&lt;br /&gt;
[[Kategorie:Wallboxen]]&lt;br /&gt;
[[Kategorie:Elektromobilität]]&lt;br /&gt;
__INHALTSVERZEICHNIS_ERZWINGEN__&lt;/div&gt;</summary>
		<author><name>Topos</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Ora_Funky_Cat&amp;diff=39913</id>
		<title>Ora Funky Cat</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Ora_Funky_Cat&amp;diff=39913"/>
		<updated>2025-02-07T15:03:12Z</updated>

		<summary type="html">&lt;p&gt;Topos: /* Beispielhafte Einrichtung des WiCAN im Ora Funky Cat als MQTT2-Device */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Auf dieser Seite wird die Einbindung des E-Autos [https://www.ora-motor.de/ Ora Funky Cat] von GWM (Great Wall Motor aus China) in FHEM über die OBD2-Serviceschnittestelle erläutert.&lt;br /&gt;
&lt;br /&gt;
Benötigte Hardware: [https://www.meatpi.com/products/wican MeatPi WiCAN-OBD-C3 Adapter]&lt;br /&gt;
&lt;br /&gt;
Der WiCAN wird in die OBD2-Serviceschnittestelle (rechts neben Sicherungsfach unterhalb Lenkrad) gesteckt. Am besten über ein Verlängerungskabel oder indem man den OBD2-Stecker aus der Halterung drückt und mit dem WiCAN ins Sicherungsfach legt. &lt;br /&gt;
&lt;br /&gt;
Der WiCAN kommuniziert über den CAN-Bus des Fahrzeuges mit den Steuergeräten (ECU, Electronic Control Unit) im Ora und kann sich über WLAN mit eine MQTT-Server verbinden. Näheres in obigem Link. Bei der WiCAN-Konfiguration muss das CAN-Protokoll &amp;quot;slcan&amp;quot; ausgewählt werden. Die Kommunikation erfolgt über den Eintrag &#039;&#039;can/tx&#039;&#039; und &#039;&#039;can/rx&#039;&#039; des WiCAN auf dem MQTT-Server. Bitte nicht vergessen, den automatischen Standby-Modus anzuschalten, ansonsten leert sich mit der Zeit die Fahrzeugbatterie.&lt;br /&gt;
&lt;br /&gt;
Die Integration eines MQTT-Servers in FHEM wird [[MQTT|&#039;&#039;&#039;hier&#039;&#039;&#039;]] erklärt. &lt;br /&gt;
&lt;br /&gt;
Ist das Auto eingeschaltet und der Adapter gesteckt, dann können über FHEM einige Fahrzeugdaten abgefragt werden. Weiter unten eine beispielhafte Einrichtung eines entsprechenden MQTT2-Devices. &lt;br /&gt;
&lt;br /&gt;
=== Readings ===&lt;br /&gt;
Die folgenden Werte werden mit unterer Beispielkonfiguration aus den Steuergeräten VCU (Vehicle Control Unit, ECU CAN-ID: 1930, Response CAN-ID: 1994) und BMSv2 (Batterie Management System, ECU CAN-ID: 1931, Response CAN-ID: 1995) ausgelesen:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Mileage:&#039;&#039;&#039; km-Stand - Abfrage über &amp;quot;set wican read_Mileage&amp;quot;&lt;br /&gt;
* &#039;&#039;&#039;SoC&#039;&#039;&#039;: Netto-Ladezustand Hochvolt-Antriebsbatterie in %  - Abfrage über &amp;quot;set wican read_SoC&amp;quot;&lt;br /&gt;
* &#039;&#039;&#039;TrueSoC&#039;&#039;&#039;: Brutto-Ladezustand Hochvolt-Antriebsbatterie in %  - Abfrage über &amp;quot;set wican read_TrueSoC&amp;quot;&lt;br /&gt;
* &#039;&#039;&#039;SoE&#039;&#039;&#039;: Ladezustand Hochvolt-Antriebsbatterie in kW - Abfrage über &amp;quot;set wican read_SoE&amp;quot;&lt;br /&gt;
* &#039;&#039;&#039;SoH&#039;&#039;&#039;: Gesundheitszustand der Hochvolt-Antriebsbatterie in % - Abfrage über &amp;quot;set wican read_SoH&amp;quot;&lt;br /&gt;
* &#039;&#039;&#039;OperatingVoltage&#039;&#039;&#039;: Spannung Niedervolt-Fahrzeugbatterie in V - Abfrage über &amp;quot;set wican read_OperatingVoltage&amp;quot;&lt;br /&gt;
* &#039;&#039;&#039;BatteryVoltage&#039;&#039;&#039;: Spannung Hochvolt-Antriebsbatterie in V - Abfrage über &amp;quot;set wican read_BatteryVoltage&amp;quot;&lt;br /&gt;
* &#039;&#039;&#039;TotalCharge&#039;&#039;&#039;: Durch die Batterie aufgenommene Stromleistung in Ah (inklusive Rekuperation während des Fahrens) - Abfrage über &amp;quot;set wican read_Total Charge&amp;quot; Die Multiplikation mit 4&amp;amp;nbsp;kV scheint die hinzugefügte HV-Batterieleistung abzüglich der Ladeverluste zu ergeben.&lt;br /&gt;
* &#039;&#039;&#039;TotalDischarge&#039;&#039;&#039;: Von der Hochvolt-Batterie abgezogene Stromleistung in Ah - Abfrage über &amp;quot;set wican read_TotalDischarge&amp;quot; Die Multiplikation mit 4&amp;amp;nbsp;kV scheint die abgerufene HV-Batterieleistung zu ergeben.&lt;br /&gt;
&lt;br /&gt;
Das erste Auslesen kann über ein notify angestossen werden, sobald der WiCAN den Status &amp;quot;online&amp;quot; hat.&amp;lt;syntaxhighlight lang=&amp;quot;cfg&amp;quot;&amp;gt;&lt;br /&gt;
define wican_online notify wican:status:.online set wican read_SoC;; sleep 1;; set wican read_TrueSoC;; sleep 1;; set wican read_Mileage;; sleep 1;; set wican read_OpVoltage;; sleep 1;; set wican read_SoH;; sleep 1;; set wican read_TotalCharge;; sleep 1;; set wican read_TotalDischarge;; sleep 1;; set wican read_BatteryVoltage;; sleep 1;; set wican read_SoE&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Die weiteren Abfrage können über einen Timer erfolgen Der Timer kann mit einem notify ein- und wieder ausgeschaltet werden.&amp;lt;syntaxhighlight lang=&amp;quot;cfg&amp;quot;&amp;gt;&lt;br /&gt;
define wican_check at +*00:01:00 set wican read_SoC;; sleep 1;; set wican read_TrueSoC;; sleep 1;; set wican read_Mileage;; sleep 1;; set wican read_OpVoltage;; sleep 1;; set wican read_SoH;; sleep 1;; set wican read_TotalCharge;; sleep 1;; set wican read_TotalDischarge;; sleep 1;; set wican read_BatteryVoltage;; sleep 1;; set wican read_SoE&lt;br /&gt;
&lt;br /&gt;
define wican_check_active notify wican:status:.online set wican_check active&lt;br /&gt;
&lt;br /&gt;
define wican_check_inactive notify wican:status:.offline set wican_check inactive&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Beispielhafte Einrichtung des WiCAN im Ora Funky Cat als MQTT2-Device ===&lt;br /&gt;
Ab der WiCAN [https://github.com/meatpiHQ/wican-fw/releases Firmware] v2.98 (13. April 2024) kann die Benennung des Eintrages im MQTT-Server frei gewählt werden. Die untere Konfiguration geht von folgender Benennung aus: &lt;br /&gt;
&lt;br /&gt;
* TX Topic: &#039;&#039;wican/ora/can/tx&#039;&#039;&lt;br /&gt;
* RX Topic: &#039;&#039;wican/ora/can/rx&#039;&#039;&lt;br /&gt;
* Status Topic: &#039;&#039;wican/ora/can/status&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cfg&amp;quot;&amp;gt;&lt;br /&gt;
define wican MQTT2_DEVICE&lt;br /&gt;
attr wican alias Ora&lt;br /&gt;
attr wican stateFormat B: SoC% M: Mileage km (status)&lt;br /&gt;
attr wican event-on-change-reading status&lt;br /&gt;
attr wican event-on-update-reading frame_1_data_6,SoC&lt;br /&gt;
attr wican DbLogExclude .*&lt;br /&gt;
attr wican DbLogInclude SoC:3600&lt;br /&gt;
attr wican readingList wican/ora/can/status:.* {json2nameValue($EVENT)}\&lt;br /&gt;
 wican/ora/can/rx:.* {json2nameValue($EVENT)}&lt;br /&gt;
attr wican setList read_SoC:noArg wican/ora/can/tx {&amp;quot;bus&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;tx&amp;quot;,&amp;quot;ts&amp;quot;:49539,&amp;quot;frame&amp;quot;:[{&amp;quot;id&amp;quot;:1931,&amp;quot;dlc&amp;quot;:8,&amp;quot;rtr&amp;quot;:false,&amp;quot;extd&amp;quot;:false,&amp;quot;data&amp;quot;:[3,34,32,80,170,170,170,170]}]}\&lt;br /&gt;
read_TrueSoC:noArg wican/ora/can/tx {&amp;quot;bus&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;tx&amp;quot;,&amp;quot;ts&amp;quot;:27825,&amp;quot;frame&amp;quot;:[{&amp;quot;id&amp;quot;:1931,&amp;quot;dlc&amp;quot;:8,&amp;quot;rtr&amp;quot;:false,&amp;quot;extd&amp;quot;:false,&amp;quot;data&amp;quot;:[3,34,3,8,170,170,170,170]}]}\&lt;br /&gt;
read_SoH:noArg wican/ora/can/tx {&amp;quot;bus&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;tx&amp;quot;,&amp;quot;ts&amp;quot;:12016,&amp;quot;frame&amp;quot;:[{&amp;quot;id&amp;quot;:1931,&amp;quot;dlc&amp;quot;:8,&amp;quot;rtr&amp;quot;:false,&amp;quot;extd&amp;quot;:false,&amp;quot;data&amp;quot;:[3,34,32,81,170,170,170,170]}]}\&lt;br /&gt;
read_SoE:noArg wican/ora/can/tx {&amp;quot;bus&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;tx&amp;quot;,&amp;quot;ts&amp;quot;:17777,&amp;quot;frame&amp;quot;:[{&amp;quot;id&amp;quot;:1930,&amp;quot;dlc&amp;quot;:8,&amp;quot;rtr&amp;quot;:false,&amp;quot;extd&amp;quot;:false,&amp;quot;data&amp;quot;:[3,34,208,98,170,170,170,170]}]}\&lt;br /&gt;
read_OpVoltage:noArg wican/ora/can/tx {&amp;quot;bus&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;tx&amp;quot;,&amp;quot;ts&amp;quot;:17645,&amp;quot;frame&amp;quot;:[{&amp;quot;id&amp;quot;:1931,&amp;quot;dlc&amp;quot;:8,&amp;quot;rtr&amp;quot;:false,&amp;quot;extd&amp;quot;:false,&amp;quot;data&amp;quot;:[3,34,208,3,170,170,170,170]}]}\&lt;br /&gt;
read_Mileage:noArg wican/ora/can/tx {&amp;quot;bus&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;tx&amp;quot;,&amp;quot;ts&amp;quot;:35674,&amp;quot;frame&amp;quot;:[{&amp;quot;id&amp;quot;:1931,&amp;quot;dlc&amp;quot;:8,&amp;quot;rtr&amp;quot;:false,&amp;quot;extd&amp;quot;:false,&amp;quot;data&amp;quot;:[3,34,208,4,170,170,170,170]}]}\&lt;br /&gt;
read_TotalCharge:noArg wican/ora/can/tx {&amp;quot;bus&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;tx&amp;quot;,&amp;quot;ts&amp;quot;:28695,&amp;quot;frame&amp;quot;:[{&amp;quot;id&amp;quot;:1931,&amp;quot;dlc&amp;quot;:8,&amp;quot;rtr&amp;quot;:false,&amp;quot;extd&amp;quot;:false,&amp;quot;data&amp;quot;:[3,34,33,113,170,170,170,170]}]}\&lt;br /&gt;
read_TotalDischarge:noArg wican/ora/can/tx {&amp;quot;bus&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;tx&amp;quot;,&amp;quot;ts&amp;quot;:28695,&amp;quot;frame&amp;quot;:[{&amp;quot;id&amp;quot;:1931,&amp;quot;dlc&amp;quot;:8,&amp;quot;rtr&amp;quot;:false,&amp;quot;extd&amp;quot;:false,&amp;quot;data&amp;quot;:[3,34,33,114,170,170,170,170]}]}\&lt;br /&gt;
read_BatteryVoltage:noArg wican/ora/can/tx {&amp;quot;bus&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;tx&amp;quot;,&amp;quot;ts&amp;quot;:58591,&amp;quot;frame&amp;quot;:[{&amp;quot;id&amp;quot;:1931,&amp;quot;dlc&amp;quot;:8,&amp;quot;rtr&amp;quot;:false,&amp;quot;extd&amp;quot;:false,&amp;quot;data&amp;quot;:[3,34,32,3,170,170,170,170]}]}&lt;br /&gt;
attr wican userReadings SoC:frame_1_data_6:.* {\&lt;br /&gt;
	if (ReadingsNum($NAME, &#039;frame_1_id&#039;, 0) == 1995 and ReadingsNum($NAME, &#039;frame_1_data_1&#039;, 0)  == 5 and ReadingsNum($NAME, &#039;frame_1_data_2&#039;, 0)  == 98\&lt;br /&gt;
      and ReadingsNum($NAME, &#039;frame_1_data_3&#039;, 0)  == 32 and ReadingsNum($NAME, &#039;frame_1_data_4&#039;, 0)  == 80 ) {\&lt;br /&gt;
		return (ReadingsNum($NAME, &#039;frame_1_data_5&#039;, 0) * 256+ReadingsNum($NAME, &#039;frame_1_data_6&#039;, 0))/10.0\&lt;br /&gt;
	} else {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;SoC&#039;, 0)\&lt;br /&gt;
	}\&lt;br /&gt;
},\&lt;br /&gt;
SoH:frame_1_data_6:.* {\&lt;br /&gt;
	if (ReadingsNum($NAME, &#039;frame_1_id&#039;, 0) == 1995 and ReadingsNum($NAME, &#039;frame_1_data_1&#039;, 0)  == 5 and ReadingsNum($NAME, &#039;frame_1_data_2&#039;, 0)  == 98\&lt;br /&gt;
      and ReadingsNum($NAME, &#039;frame_1_data_3&#039;, 0)  == 32 and ReadingsNum($NAME, &#039;frame_1_data_4&#039;, 0)  == 81 ) {\&lt;br /&gt;
		return (ReadingsNum($NAME, &#039;frame_1_data_5&#039;, 0) * 256 + ReadingsNum($NAME, &#039;frame_1_data_6&#039;, 0))/10.0\&lt;br /&gt;
	} else {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;SoH&#039;, 0)\&lt;br /&gt;
	}\&lt;br /&gt;
},\&lt;br /&gt;
TrueSoC:frame_1_data_6:.* {\&lt;br /&gt;
	if (ReadingsNum($NAME, &#039;frame_1_id&#039;, 0) == 1995 and ReadingsNum($NAME, &#039;frame_1_data_3&#039;, 0)  == 3) {\&lt;br /&gt;
		return (ReadingsNum($NAME, &#039;frame_1_data_5&#039;, 0) * 256 + ReadingsNum($NAME, &#039;frame_1_data_6&#039;, 0))/10.0\&lt;br /&gt;
	} else {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;TrueSoC&#039;, 0)\&lt;br /&gt;
	}\&lt;br /&gt;
},\&lt;br /&gt;
Mileage:frame_1_data_6:.* {\&lt;br /&gt;
	if (ReadingsNum($NAME, &#039;frame_1_id&#039;, 0) == 1995 and ReadingsNum($NAME, &#039;frame_1_data_1&#039;, 0)  == 6 and ReadingsNum($NAME, &#039;frame_1_data_2&#039;, 0)  == 98\&lt;br /&gt;
      and ReadingsNum($NAME, &#039;frame_1_data_3&#039;, 0)  == 208 ) {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;frame_1_data_5&#039;, 0) * 65536 + ReadingsNum($NAME, &#039;frame_1_data_6&#039;, 0) * 256 + ReadingsNum($NAME, &#039;frame_1_data_7&#039;, 0)\&lt;br /&gt;
	} else {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;Mileage&#039;, 0)\&lt;br /&gt;
	}\&lt;br /&gt;
},\&lt;br /&gt;
OperatingVoltage:frame_1_data_6:.* {\&lt;br /&gt;
	if (ReadingsNum($NAME, &#039;frame_1_id&#039;, 0) == 1995 and ReadingsNum($NAME, &#039;frame_1_data_1&#039;, 0)  == 4 and ReadingsNum($NAME, &#039;frame_1_data_2&#039;, 0)  == 98\&lt;br /&gt;
      and ReadingsNum($NAME, &#039;frame_1_data_3&#039;, 0)  == 208 ) {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;frame_1_data_5&#039;, 0) /10.0\&lt;br /&gt;
	} else {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;OperatingVoltage&#039;, 0)\&lt;br /&gt;
	}\&lt;br /&gt;
},\&lt;br /&gt;
TotalCharge:frame_1_data_6:.* {\&lt;br /&gt;
	if (ReadingsNum($NAME, &#039;frame_1_id&#039;, 0) == 1995 and ReadingsNum($NAME, &#039;frame_1_data_1&#039;, 0)  == 7 and ReadingsNum($NAME, &#039;frame_1_data_2&#039;, 0)  == 98\&lt;br /&gt;
      and ReadingsNum($NAME, &#039;frame_1_data_3&#039;, 0)  == 33 and ReadingsNum($NAME, &#039;frame_1_data_4&#039;, 0)  == 113 ) {\&lt;br /&gt;
		return round( 2 * ReadingsNum($NAME, &#039;frame_1_data_7&#039;, 0) + ReadingsNum($NAME, &#039;frame_1_data_8&#039;, 0) / 128 , 0)\&lt;br /&gt;
	} else {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;TotalCharge&#039;, 0)\&lt;br /&gt;
	}\&lt;br /&gt;
},\&lt;br /&gt;
TotalDischarge:frame_1_data_6:.* {\&lt;br /&gt;
	if (ReadingsNum($NAME, &#039;frame_1_id&#039;, 0) == 1995 and ReadingsNum($NAME, &#039;frame_1_data_1&#039;, 0)  == 7 and ReadingsNum($NAME, &#039;frame_1_data_2&#039;, 0)  == 98\&lt;br /&gt;
  and ReadingsNum($NAME, &#039;frame_1_data_3&#039;, 0)  == 33 and ReadingsNum($NAME, &#039;frame_1_data_4&#039;, 0)  == 114 ) {\&lt;br /&gt;
		return round( 2 * ReadingsNum($NAME, &#039;frame_1_data_7&#039;, 0) + ReadingsNum($NAME, &#039;frame_1_data_8&#039;, 0) / 128 , 0)\&lt;br /&gt;
	} else {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;TotalDischarge&#039;, 0)\&lt;br /&gt;
	}\&lt;br /&gt;
},\&lt;br /&gt;
BatteryVoltage:frame_1_data_6:.* {\&lt;br /&gt;
	if (ReadingsNum($NAME, &#039;frame_1_id&#039;, 0) == 1995 and ReadingsNum($NAME, &#039;frame_1_data_1&#039;, 0)  == 16 and ReadingsNum($NAME, &#039;frame_1_data_2&#039;, 0)  == 9\&lt;br /&gt;
      and ReadingsNum($NAME, &#039;frame_1_data_3&#039;, 0)  == 98 and ReadingsNum($NAME, &#039;frame_1_data_4&#039;, 0)  == 32 ) {\&lt;br /&gt;
		return ( 256 * ReadingsNum($NAME, &#039;frame_1_data_6&#039;, 0) + ReadingsNum($NAME, &#039;frame_1_data_7&#039;, 0)) / 10.0 \&lt;br /&gt;
	} else {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;BatteryVoltage&#039;, 0)\&lt;br /&gt;
	}\&lt;br /&gt;
},\&lt;br /&gt;
SoE:frame_1_data_6:.* {\&lt;br /&gt;
	if (ReadingsNum($NAME, &#039;frame_1_id&#039;, 0) == 1994 and ReadingsNum($NAME, &#039;frame_1_data_1&#039;, 0)  == 7 and ReadingsNum($NAME, &#039;frame_1_data_2&#039;, 0)  == 98\&lt;br /&gt;
      and ReadingsNum($NAME, &#039;frame_1_data_3&#039;, 0)  == 208 and ReadingsNum($NAME, &#039;frame_1_data_4&#039;, 0)  == 98 ) {\&lt;br /&gt;
		return (256*ReadingsNum($NAME, &#039;frame_1_data_7&#039;, 0)+ReadingsNum($NAME, &#039;frame_1_data_8&#039;, 0)) / 10.0 \&lt;br /&gt;
	} else {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;SoE&#039;, 0)\&lt;br /&gt;
	}\&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Elektromobilität]]&lt;/div&gt;</summary>
		<author><name>Topos</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Ora_Funky_Cat&amp;diff=39606</id>
		<title>Ora Funky Cat</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Ora_Funky_Cat&amp;diff=39606"/>
		<updated>2024-10-18T19:41:15Z</updated>

		<summary type="html">&lt;p&gt;Topos: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Auf dieser Seite wird die Einbindung des E-Autos [https://www.ora-motor.de/ Ora Funky Cat] von GWM (Great Wall Motor aus China) in FHEM über die OBD2-Serviceschnittestelle erläutert.&lt;br /&gt;
&lt;br /&gt;
Benötigte Hardware: [https://www.meatpi.com/products/wican MeatPi WiCAN-OBD-C3 Adapter]&lt;br /&gt;
&lt;br /&gt;
Der WiCAN wird in die OBD2-Serviceschnittestelle (rechts neben Sicherungsfach unterhalb Lenkrad) gesteckt. Am besten über ein Verlängerungskabel oder indem man den OBD2-Stecker aus der Halterung drückt und mit dem WiCAN ins Sicherungsfach legt. &lt;br /&gt;
&lt;br /&gt;
Der WiCAN kommuniziert über den CAN-Bus des Fahrzeuges mit den Steuergeräten (ECU, Electronic Control Unit) im Ora und kann sich über WLAN mit eine MQTT-Server verbinden. Näheres in obigem Link. Bei der WiCAN-Konfiguration muss das CAN-Protokoll &amp;quot;slcan&amp;quot; ausgewählt werden. Die Kommunikation erfolgt über den Eintrag &#039;&#039;can/tx&#039;&#039; und &#039;&#039;can/rx&#039;&#039; des WiCAN auf dem MQTT-Server. Bitte nicht vergessen, den automatischen Standby-Modus anzuschalten, ansonsten leert sich mit der Zeit die Fahrzeugbatterie.&lt;br /&gt;
&lt;br /&gt;
Die Integration eines MQTT-Servers in FHEM wird [[MQTT|&#039;&#039;&#039;hier&#039;&#039;&#039;]] erklärt. &lt;br /&gt;
&lt;br /&gt;
Ist das Auto eingeschaltet und der Adapter gesteckt, dann können über FHEM einige Fahrzeugdaten abgefragt werden. Weiter unten eine beispielhafte Einrichtung eines entsprechenden MQTT2-Devices. &lt;br /&gt;
&lt;br /&gt;
=== Readings ===&lt;br /&gt;
Die folgenden Werte werden mit unterer Beispielkonfiguration aus den Steuergeräten VCU (Vehicle Control Unit, ECU CAN-ID: 1930, Response CAN-ID: 1994) und BMSv2 (Batterie Management System, ECU CAN-ID: 1931, Response CAN-ID: 1995) ausgelesen:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Mileage:&#039;&#039;&#039; km-Stand - Abfrage über &amp;quot;set wican read_Mileage&amp;quot;&lt;br /&gt;
* &#039;&#039;&#039;SoC&#039;&#039;&#039;: Netto-Ladezustand Hochvolt-Antriebsbatterie in %  - Abfrage über &amp;quot;set wican read_SoC&amp;quot;&lt;br /&gt;
* &#039;&#039;&#039;TrueSoC&#039;&#039;&#039;: Brutto-Ladezustand Hochvolt-Antriebsbatterie in %  - Abfrage über &amp;quot;set wican read_TrueSoC&amp;quot;&lt;br /&gt;
* &#039;&#039;&#039;SoE&#039;&#039;&#039;: Ladezustand Hochvolt-Antriebsbatterie in kW - Abfrage über &amp;quot;set wican read_SoE&amp;quot;&lt;br /&gt;
* &#039;&#039;&#039;SoH&#039;&#039;&#039;: Gesundheitszustand der Hochvolt-Antriebsbatterie in % - Abfrage über &amp;quot;set wican read_SoH&amp;quot;&lt;br /&gt;
* &#039;&#039;&#039;OperatingVoltage&#039;&#039;&#039;: Spannung Niedervolt-Fahrzeugbatterie in V - Abfrage über &amp;quot;set wican read_OperatingVoltage&amp;quot;&lt;br /&gt;
* &#039;&#039;&#039;BatteryVoltage&#039;&#039;&#039;: Spannung Hochvolt-Antriebsbatterie in V - Abfrage über &amp;quot;set wican read_BatteryVoltage&amp;quot;&lt;br /&gt;
* &#039;&#039;&#039;TotalCharge&#039;&#039;&#039;: Durch die Batterie aufgenommene Stromleistung in Ah (inklusive Rekuperation während des Fahrens) - Abfrage über &amp;quot;set wican read_Total Charge&amp;quot; Die Multiplikation mit 4&amp;amp;nbsp;kV scheint die hinzugefügte HV-Batterieleistung abzüglich der Ladeverluste zu ergeben.&lt;br /&gt;
* &#039;&#039;&#039;TotalDischarge&#039;&#039;&#039;: Von der Hochvolt-Batterie abgezogene Stromleistung in Ah - Abfrage über &amp;quot;set wican read_TotalDischarge&amp;quot; Die Multiplikation mit 4&amp;amp;nbsp;kV scheint die abgerufene HV-Batterieleistung zu ergeben.&lt;br /&gt;
&lt;br /&gt;
Das erste Auslesen kann über ein notify angestossen werden, sobald der WiCAN den Status &amp;quot;online&amp;quot; hat.&amp;lt;syntaxhighlight lang=&amp;quot;cfg&amp;quot;&amp;gt;&lt;br /&gt;
define wican_online notify wican:status:.online set wican read_SoC;; sleep 1;; set wican read_TrueSoC;; sleep 1;; set wican read_Mileage;; sleep 1;; set wican read_OpVoltage;; sleep 1;; set wican read_SoH;; sleep 1;; set wican read_TotalCharge;; sleep 1;; set wican read_TotalDischarge;; sleep 1;; set wican read_BatteryVoltage;; sleep 1;; set wican read_SoE&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Die weiteren Abfrage können über einen Timer erfolgen Der Timer kann mit einem notify ein- und wieder ausgeschaltet werden.&amp;lt;syntaxhighlight lang=&amp;quot;cfg&amp;quot;&amp;gt;&lt;br /&gt;
define wican_check at +*00:01:00 set wican read_SoC;; sleep 1;; set wican read_TrueSoC;; sleep 1;; set wican read_Mileage;; sleep 1;; set wican read_OpVoltage;; sleep 1;; set wican read_SoH;; sleep 1;; set wican read_TotalCharge;; sleep 1;; set wican read_TotalDischarge;; sleep 1;; set wican read_BatteryVoltage;; sleep 1;; set wican read_SoE&lt;br /&gt;
&lt;br /&gt;
define wican_check_active notify wican:status:.online set wican_check active&lt;br /&gt;
&lt;br /&gt;
define wican_check_inactive notify wican:status:.offline set wican_check inactive&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Beispielhafte Einrichtung des WiCAN im Ora Funky Cat als MQTT2-Device ===&lt;br /&gt;
Ab der WiCAN [https://github.com/meatpiHQ/wican-fw/releases Firmware] v2.98 (13. April 2024) kann die Benennung des Eintrages im MQTT-Server frei gewählt werden. Die untere Konfiguration geht von folgender Benennung aus: &lt;br /&gt;
&lt;br /&gt;
* TX Topic: &#039;&#039;wican/ora/can/tx&#039;&#039;&lt;br /&gt;
* RX Topic: &#039;&#039;wican/ora/can/tx&#039;&#039;&lt;br /&gt;
* Status Topic: &#039;&#039;wican/ora/can/status&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cfg&amp;quot;&amp;gt;&lt;br /&gt;
define wican MQTT2_DEVICE&lt;br /&gt;
attr wican alias Ora&lt;br /&gt;
attr wican stateFormat B: SoC% M: Mileage km (status)&lt;br /&gt;
attr wican event-on-change-reading status&lt;br /&gt;
attr wican event-on-update-reading frame_1_data_6,SoC&lt;br /&gt;
attr wican DbLogExclude .*&lt;br /&gt;
attr wican DbLogInclude SoC:3600&lt;br /&gt;
attr wican readingList wican/ora/can/status:.* {json2nameValue($EVENT)}\&lt;br /&gt;
 wican/ora/can/rx:.* {json2nameValue($EVENT)}&lt;br /&gt;
attr wican setList read_SoC:noArg wican/ora/can/tx {&amp;quot;bus&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;tx&amp;quot;,&amp;quot;ts&amp;quot;:49539,&amp;quot;frame&amp;quot;:[{&amp;quot;id&amp;quot;:1931,&amp;quot;dlc&amp;quot;:8,&amp;quot;rtr&amp;quot;:false,&amp;quot;extd&amp;quot;:false,&amp;quot;data&amp;quot;:[3,34,32,80,170,170,170,170]}]}\&lt;br /&gt;
read_TrueSoC:noArg wican/ora/can/tx {&amp;quot;bus&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;tx&amp;quot;,&amp;quot;ts&amp;quot;:27825,&amp;quot;frame&amp;quot;:[{&amp;quot;id&amp;quot;:1931,&amp;quot;dlc&amp;quot;:8,&amp;quot;rtr&amp;quot;:false,&amp;quot;extd&amp;quot;:false,&amp;quot;data&amp;quot;:[3,34,3,8,170,170,170,170]}]}\&lt;br /&gt;
read_SoH:noArg wican/ora/can/tx {&amp;quot;bus&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;tx&amp;quot;,&amp;quot;ts&amp;quot;:12016,&amp;quot;frame&amp;quot;:[{&amp;quot;id&amp;quot;:1931,&amp;quot;dlc&amp;quot;:8,&amp;quot;rtr&amp;quot;:false,&amp;quot;extd&amp;quot;:false,&amp;quot;data&amp;quot;:[3,34,32,81,170,170,170,170]}]}\&lt;br /&gt;
read_SoE:noArg wican/ora/can/tx {&amp;quot;bus&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;tx&amp;quot;,&amp;quot;ts&amp;quot;:17777,&amp;quot;frame&amp;quot;:[{&amp;quot;id&amp;quot;:1930,&amp;quot;dlc&amp;quot;:8,&amp;quot;rtr&amp;quot;:false,&amp;quot;extd&amp;quot;:false,&amp;quot;data&amp;quot;:[3,34,208,98,170,170,170,170]}]}\&lt;br /&gt;
read_OpVoltage:noArg wican/ora/can/tx {&amp;quot;bus&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;tx&amp;quot;,&amp;quot;ts&amp;quot;:17645,&amp;quot;frame&amp;quot;:[{&amp;quot;id&amp;quot;:1931,&amp;quot;dlc&amp;quot;:8,&amp;quot;rtr&amp;quot;:false,&amp;quot;extd&amp;quot;:false,&amp;quot;data&amp;quot;:[3,34,208,3,170,170,170,170]}]}\&lt;br /&gt;
read_Mileage:noArg wican/ora/can/tx {&amp;quot;bus&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;tx&amp;quot;,&amp;quot;ts&amp;quot;:35674,&amp;quot;frame&amp;quot;:[{&amp;quot;id&amp;quot;:1931,&amp;quot;dlc&amp;quot;:8,&amp;quot;rtr&amp;quot;:false,&amp;quot;extd&amp;quot;:false,&amp;quot;data&amp;quot;:[3,34,208,4,170,170,170,170]}]}\&lt;br /&gt;
read_TotalCharge:noArg wican/ora/can/tx {&amp;quot;bus&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;tx&amp;quot;,&amp;quot;ts&amp;quot;:28695,&amp;quot;frame&amp;quot;:[{&amp;quot;id&amp;quot;:1931,&amp;quot;dlc&amp;quot;:8,&amp;quot;rtr&amp;quot;:false,&amp;quot;extd&amp;quot;:false,&amp;quot;data&amp;quot;:[3,34,33,113,170,170,170,170]}]}\&lt;br /&gt;
read_TotalDischarge:noArg wican/ora/can/tx {&amp;quot;bus&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;tx&amp;quot;,&amp;quot;ts&amp;quot;:28695,&amp;quot;frame&amp;quot;:[{&amp;quot;id&amp;quot;:1931,&amp;quot;dlc&amp;quot;:8,&amp;quot;rtr&amp;quot;:false,&amp;quot;extd&amp;quot;:false,&amp;quot;data&amp;quot;:[3,34,33,114,170,170,170,170]}]}\&lt;br /&gt;
read_BatteryVoltage:noArg wican/ora/can/tx {&amp;quot;bus&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;tx&amp;quot;,&amp;quot;ts&amp;quot;:58591,&amp;quot;frame&amp;quot;:[{&amp;quot;id&amp;quot;:1931,&amp;quot;dlc&amp;quot;:8,&amp;quot;rtr&amp;quot;:false,&amp;quot;extd&amp;quot;:false,&amp;quot;data&amp;quot;:[3,34,32,3,170,170,170,170]}]}&lt;br /&gt;
attr wican userReadings SoC:frame_1_data_6:.* {\&lt;br /&gt;
	if (ReadingsNum($NAME, &#039;frame_1_id&#039;, 0) == 1995 and ReadingsNum($NAME, &#039;frame_1_data_1&#039;, 0)  == 5 and ReadingsNum($NAME, &#039;frame_1_data_2&#039;, 0)  == 98\&lt;br /&gt;
      and ReadingsNum($NAME, &#039;frame_1_data_3&#039;, 0)  == 32 and ReadingsNum($NAME, &#039;frame_1_data_4&#039;, 0)  == 80 ) {\&lt;br /&gt;
		return (ReadingsNum($NAME, &#039;frame_1_data_5&#039;, 0) * 256+ReadingsNum($NAME, &#039;frame_1_data_6&#039;, 0))/10.0\&lt;br /&gt;
	} else {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;SoC&#039;, 0)\&lt;br /&gt;
	}\&lt;br /&gt;
},\&lt;br /&gt;
SoH:frame_1_data_6:.* {\&lt;br /&gt;
	if (ReadingsNum($NAME, &#039;frame_1_id&#039;, 0) == 1995 and ReadingsNum($NAME, &#039;frame_1_data_1&#039;, 0)  == 5 and ReadingsNum($NAME, &#039;frame_1_data_2&#039;, 0)  == 98\&lt;br /&gt;
      and ReadingsNum($NAME, &#039;frame_1_data_3&#039;, 0)  == 32 and ReadingsNum($NAME, &#039;frame_1_data_4&#039;, 0)  == 81 ) {\&lt;br /&gt;
		return (ReadingsNum($NAME, &#039;frame_1_data_5&#039;, 0) * 256 + ReadingsNum($NAME, &#039;frame_1_data_6&#039;, 0))/10.0\&lt;br /&gt;
	} else {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;SoH&#039;, 0)\&lt;br /&gt;
	}\&lt;br /&gt;
},\&lt;br /&gt;
TrueSoC:frame_1_data_6:.* {\&lt;br /&gt;
	if (ReadingsNum($NAME, &#039;frame_1_id&#039;, 0) == 1995 and ReadingsNum($NAME, &#039;frame_1_data_3&#039;, 0)  == 3) {\&lt;br /&gt;
		return (ReadingsNum($NAME, &#039;frame_1_data_5&#039;, 0) * 256 + ReadingsNum($NAME, &#039;frame_1_data_6&#039;, 0))/10.0\&lt;br /&gt;
	} else {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;TrueSoC&#039;, 0)\&lt;br /&gt;
	}\&lt;br /&gt;
},\&lt;br /&gt;
Mileage:frame_1_data_6:.* {\&lt;br /&gt;
	if (ReadingsNum($NAME, &#039;frame_1_id&#039;, 0) == 1995 and ReadingsNum($NAME, &#039;frame_1_data_1&#039;, 0)  == 6 and ReadingsNum($NAME, &#039;frame_1_data_2&#039;, 0)  == 98\&lt;br /&gt;
      and ReadingsNum($NAME, &#039;frame_1_data_3&#039;, 0)  == 208 ) {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;frame_1_data_5&#039;, 0) * 65536 + ReadingsNum($NAME, &#039;frame_1_data_6&#039;, 0) * 256 + ReadingsNum($NAME, &#039;frame_1_data_7&#039;, 0)\&lt;br /&gt;
	} else {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;Mileage&#039;, 0)\&lt;br /&gt;
	}\&lt;br /&gt;
},\&lt;br /&gt;
OperatingVoltage:frame_1_data_6:.* {\&lt;br /&gt;
	if (ReadingsNum($NAME, &#039;frame_1_id&#039;, 0) == 1995 and ReadingsNum($NAME, &#039;frame_1_data_1&#039;, 0)  == 4 and ReadingsNum($NAME, &#039;frame_1_data_2&#039;, 0)  == 98\&lt;br /&gt;
      and ReadingsNum($NAME, &#039;frame_1_data_3&#039;, 0)  == 208 ) {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;frame_1_data_5&#039;, 0) /10.0\&lt;br /&gt;
	} else {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;OperatingVoltage&#039;, 0)\&lt;br /&gt;
	}\&lt;br /&gt;
},\&lt;br /&gt;
TotalCharge:frame_1_data_6:.* {\&lt;br /&gt;
	if (ReadingsNum($NAME, &#039;frame_1_id&#039;, 0) == 1995 and ReadingsNum($NAME, &#039;frame_1_data_1&#039;, 0)  == 7 and ReadingsNum($NAME, &#039;frame_1_data_2&#039;, 0)  == 98\&lt;br /&gt;
      and ReadingsNum($NAME, &#039;frame_1_data_3&#039;, 0)  == 33 and ReadingsNum($NAME, &#039;frame_1_data_4&#039;, 0)  == 113 ) {\&lt;br /&gt;
		return round( 2 * ReadingsNum($NAME, &#039;frame_1_data_7&#039;, 0) + ReadingsNum($NAME, &#039;frame_1_data_8&#039;, 0) / 128 , 0)\&lt;br /&gt;
	} else {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;TotalCharge&#039;, 0)\&lt;br /&gt;
	}\&lt;br /&gt;
},\&lt;br /&gt;
TotalDischarge:frame_1_data_6:.* {\&lt;br /&gt;
	if (ReadingsNum($NAME, &#039;frame_1_id&#039;, 0) == 1995 and ReadingsNum($NAME, &#039;frame_1_data_1&#039;, 0)  == 7 and ReadingsNum($NAME, &#039;frame_1_data_2&#039;, 0)  == 98\&lt;br /&gt;
  and ReadingsNum($NAME, &#039;frame_1_data_3&#039;, 0)  == 33 and ReadingsNum($NAME, &#039;frame_1_data_4&#039;, 0)  == 114 ) {\&lt;br /&gt;
		return round( 2 * ReadingsNum($NAME, &#039;frame_1_data_7&#039;, 0) + ReadingsNum($NAME, &#039;frame_1_data_8&#039;, 0) / 128 , 0)\&lt;br /&gt;
	} else {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;TotalDischarge&#039;, 0)\&lt;br /&gt;
	}\&lt;br /&gt;
},\&lt;br /&gt;
BatteryVoltage:frame_1_data_6:.* {\&lt;br /&gt;
	if (ReadingsNum($NAME, &#039;frame_1_id&#039;, 0) == 1995 and ReadingsNum($NAME, &#039;frame_1_data_1&#039;, 0)  == 16 and ReadingsNum($NAME, &#039;frame_1_data_2&#039;, 0)  == 9\&lt;br /&gt;
      and ReadingsNum($NAME, &#039;frame_1_data_3&#039;, 0)  == 98 and ReadingsNum($NAME, &#039;frame_1_data_4&#039;, 0)  == 32 ) {\&lt;br /&gt;
		return ( 256 * ReadingsNum($NAME, &#039;frame_1_data_6&#039;, 0) + ReadingsNum($NAME, &#039;frame_1_data_7&#039;, 0)) / 10.0 \&lt;br /&gt;
	} else {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;BatteryVoltage&#039;, 0)\&lt;br /&gt;
	}\&lt;br /&gt;
},\&lt;br /&gt;
SoE:frame_1_data_6:.* {\&lt;br /&gt;
	if (ReadingsNum($NAME, &#039;frame_1_id&#039;, 0) == 1994 and ReadingsNum($NAME, &#039;frame_1_data_1&#039;, 0)  == 7 and ReadingsNum($NAME, &#039;frame_1_data_2&#039;, 0)  == 98\&lt;br /&gt;
      and ReadingsNum($NAME, &#039;frame_1_data_3&#039;, 0)  == 208 and ReadingsNum($NAME, &#039;frame_1_data_4&#039;, 0)  == 98 ) {\&lt;br /&gt;
		return (256*ReadingsNum($NAME, &#039;frame_1_data_7&#039;, 0)+ReadingsNum($NAME, &#039;frame_1_data_8&#039;, 0)) / 10.0 \&lt;br /&gt;
	} else {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;SoE&#039;, 0)\&lt;br /&gt;
	}\&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Elektromobilität]]&lt;/div&gt;</summary>
		<author><name>Topos</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Luxtronik_2.0&amp;diff=39602</id>
		<title>Luxtronik 2.0</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Luxtronik_2.0&amp;diff=39602"/>
		<updated>2024-10-10T20:47:28Z</updated>

		<summary type="html">&lt;p&gt;Topos: /* Frostschutz und Heizgrenze */ Leerzeichen von °C entfernt&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Modul&lt;br /&gt;
|Name=LUXTRONIK2&lt;br /&gt;
|ModPurpose=Anbindung der Heizungssteuerung Luxtronik 2.0&lt;br /&gt;
|ModType=d&lt;br /&gt;
&amp;lt;!-- |ModCategory= (noch?) nicht verwendet --&amp;gt;&lt;br /&gt;
|ModCmdRef=LUXTRONIK2&lt;br /&gt;
|ModForumArea=Sonstiges&lt;br /&gt;
|ModTechName=23_LUXTRONIK2.pm&lt;br /&gt;
|ModOwner=[http://forum.fhem.de/index.php?action=pm;sa=send;u=5432 tupol]&lt;br /&gt;
}}&lt;br /&gt;
Die Luxtronik 2.0 ist eine Heizungssteuerung der Firma Alpha InnoTec AIT, die in Wärmepumpen von Alpha InnoTec, Buderus (Logamatic HMC20, HMC20 Z), CTA All-In-One (Aeroplus), Elco, Nibe (AP-AW10), Roth (ThermoAura®, ThermoTerra), Novelan (WPR NET) und Wolf Heiztechnik (BWL/BWS) verbaut ist.&lt;br /&gt;
Sie besitzt einen Ethernet (RJ45) Anschluss, so dass sie direkt in lokale Netzwerke (LAN) integriert werden kann.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ein detailierte Anleitung zum energiesparenden Betrieb einer Luft-Wasser-Wärmepumpe mit Fußbodenheizung findet man auf [[Effizienter Betrieb einer Fußbodenheizung mit Luft-Wasser-Wärmepumpe (Fallbeispiel)|&#039;&#039;&#039;dieser&#039;&#039;&#039; Wiki-Seite]]&lt;br /&gt;
&lt;br /&gt;
== Hinweise zum Betrieb mit FHEM ==&lt;br /&gt;
Definition in fhem.cfg:&lt;br /&gt;
&lt;br /&gt;
 define &amp;lt;name&amp;gt; &#039;&#039;&#039;LUXTRONIK2&#039;&#039;&#039; &amp;lt;IP-Adresse[:Port]&amp;gt; [Abfrageinterval]&lt;br /&gt;
&lt;br /&gt;
Die Angabe der Portnummer ist optional. Bei einigen Firmware-Versionen sollte der Port 8889 angegeben werden.&lt;br /&gt;
&lt;br /&gt;
Weiter in der {{Link2CmdRef|Lang=de|Anker=LUXTRONIK2}}.&lt;br /&gt;
&lt;br /&gt;
=== Zusätzliche Perl-Module ===&lt;br /&gt;
Das FHEM-Modul benutzt das CPAN-Modul &amp;quot;net::Telnet&amp;quot;. Dieses ist standardmäßig installiert. Wenn nicht muss es nachinstalliert werden. Unter Debian z.B. mit&lt;br /&gt;
 sudo apt-get install libnet-telnet-perl&lt;br /&gt;
&lt;br /&gt;
=== Hard- und Firmwareversionen ===&lt;br /&gt;
Die Luxtronik 2.1 ähnelt der Version 2.0 stark, besitzt aber eine andere Hardware und Firmware-Versionsnummer. &lt;br /&gt;
&lt;br /&gt;
Bei Steuerungen mit den Firmware-Versionen 2.xx, 3.xx und 4.xx existiert kein Telnet-Zugang. Eine automatische Korrektur der Systemzeit ist dadurch nicht möglich.&lt;br /&gt;
&lt;br /&gt;
Das Modul nutzt die nicht öffentlich dokumentierte Schnittstelle des über einen Internetbrowser aufrufbaren Java-Programmes der Steuerung (Port 8888 oder 8889). Aufgrund der Java-Einschränkungen neuerer Internet-Browser hat die Steuerung seit der Firmware-Version x.81 auch eine Schnittstelle für ein Java-Script (Port 8214). Dies ermöglicht die Bedienung mit neueren Browsern hat aber geringere Auslese- und Einstell-Möglichkeiten. Das Modul nutzt diese Schnittstelle (derzeit) nicht.&lt;br /&gt;
&lt;br /&gt;
Neue Firmware-Versionen sind gewöhnlich abwärtskompatibel und sollten nicht zu Einschränkungen bei dem Modul führen. Bei Firmware-Versionen &amp;gt;x.81 wurde jedoch berichtet, dass über die Java-Schnittstelle nicht mehr alle Informationen übertragen werden.&lt;br /&gt;
&lt;br /&gt;
== Erläuterung der Readings ==&lt;br /&gt;
=== Allgemeine Wärmepumpenwerte ===&lt;br /&gt;
* &#039;&#039;&#039;ambientTemperature&#039;&#039;&#039; - Temperatur des Außensensors in °C&lt;br /&gt;
* &#039;&#039;&#039;averageAmbientTemperature&#039;&#039;&#039; - Gemittelte Außentemperatur in °C (für Heizgrenze im Sommer, siehe [[#Frostschutz_und_Heizgrenze|Frostschutz und Heizgrenze]])&lt;br /&gt;
* &#039;&#039;&#039;bivalentLevel&#039;&#039;&#039; - Bivalenzstufe, siehe [[#Bivalenter_Betrieb|Bivalenter Betrieb]]&lt;br /&gt;
* &#039;&#039;&#039;COP&#039;&#039;&#039; - Coefficient Of Performance, Wirkungsgrad der Wärmepumpe (Leistungszahl ε). Eine Leistungszahl von z.B. 4,2 bedeutet, dass von der eingesetzten elektrischen Leistung des Kompressors das 4,2- fache an Wärmeleistung bereitgestellt wird. Anders formuliert, kann mit dieser Wärmepumpe aus einem Kilowatt elektrischer Leistung 4,2 kW Wärmeleistung zur Verfügung gestellt werden. &#039;&#039;Bei der Berechnung des COPs wird die elektrische Leistung aus dem Attribut &amp;quot;heatPumpElectricalPowerWatt&amp;quot; benutzt.&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;delayDeviceTimeCalc&#039;&#039;&#039; - Abweichung Gerätesystemzeit zur FHEM-Zeit. Dieser kann bis zu 2 s in der Vergangenheit liegen. Höhere Werte weisen auf eine ungenaue Systemzeit in der Steuerung hin.&lt;br /&gt;
* &#039;&#039;&#039;deviceTimeCalc&#039;&#039;&#039; - Beim Abrufen der Gerätewerte wird von der Luxtronik-Steuerung auch der Zeitpunkt der internen Ermittlung übergeben.&lt;br /&gt;
* &#039;&#039;&#039;durationFetchReadings&#039;&#039;&#039; - Dauer (in s) des Abrufes der Gerätewerte von der Steuerung&lt;br /&gt;
* &#039;&#039;&#039;flowRate&#039;&#039;&#039; - Durchfluss in l/h&lt;br /&gt;
* &#039;&#039;&#039;flowTemperature&#039;&#039;&#039; - Vorlauftemperatur in °C, normalerweise direkt hinter der Heizungsumwälzpumpe gemessen und &#039;&#039;&#039;vor&#039;&#039;&#039; einer eventuell installierten Heizpatrone&lt;br /&gt;
* &#039;&#039;&#039;heatSourceIN&#039;&#039;&#039; - Wärmequelle Eingangstemperatur in °C&lt;br /&gt;
* &#039;&#039;&#039;heatSourceOUT&#039;&#039;&#039; - Wärmequelle Ausgangstemperatur in °C (sitzt bei Luft-Wasser-WPs aber im Verdampfer)&lt;br /&gt;
* &#039;&#039;&#039;hotGasTemperature&#039;&#039;&#039; - Heißgastemperatur in °C, Temperatur, die hinter dem Kompressor der Wärmepumpe anfällt&lt;br /&gt;
* opStateHeatPump1...3&lt;br /&gt;
* &#039;&#039;&#039;returnTemperature&#039;&#039;&#039; - Rücklauftemperatur in °C, normalerweise vor dem Eingang zum Wärmetauscher des Verdichterkreislaufes gemessen&lt;br /&gt;
* &#039;&#039;&#039;thermalPower&#039;&#039;&#039; - aktuelle Heizleistung der WP in kW, berechnet aus Durchfluss und Differenz von Vor- und Rücklauftemperatur, also ohne Heizpatrone etc.&lt;br /&gt;
&lt;br /&gt;
=== Luft-Wasser-Wärmepumpen ===&lt;br /&gt;
* &#039;&#039;&#039;heatSourceDefrostAirEnd&#039;&#039;&#039; - Luft-Ausgangstemperatur in °C bei der die Luftabtauung des Verdampfers beendet wird&lt;br /&gt;
* &#039;&#039;&#039;heatSourceDefrostAirThreshold&#039;&#039;&#039; - Luft-Eingangstemperatur in °C oberhalb der der Verdampfer (energiesparend) mit Luft abgetaut wird&lt;br /&gt;
* &#039;&#039;&#039;heatSourceDefrostLast&#039;&#039;&#039; - Dauer sowie Umgebungs- und Luft-Eingangs-Temperaturen zum Beginn und am Ende der letzten Abtauung&lt;br /&gt;
* &#039;&#039;&#039;heatSourceDefrostLastTimeout&#039;&#039;&#039; - Umgebungs- und Wärmequellen-Temperaturen bei denen die Luftabtauung die maximale Dauer überschritten hat.&lt;br /&gt;
* &#039;&#039;&#039;heatSourceDefrostTimer&#039;&#039;&#039; - Ablaufzeit in Sekunden bis zur nächsten Abtauung des Verdampfers&lt;br /&gt;
&lt;br /&gt;
=== Heizung ===&lt;br /&gt;
* &#039;&#039;&#039;heatingCurveEndPoint&#039;&#039;&#039; - Endpunkt der Heizkurve in °C bei -20°C Außentemperatur&lt;br /&gt;
* &#039;&#039;&#039;heatingCurveOffset&#039;&#039;&#039; - Parallelversatz der Heizkurve&lt;br /&gt;
* &#039;&#039;&#039;heatingSystemCircPumpDeaerate&#039;&#039;&#039; - Entlüftungsmodus der Heizkreisumwälzpumpe (wird zum gezielten Einschalten der Pumpe durch FHEM genutzt)&lt;br /&gt;
* &#039;&#039;&#039;heatingLimit&#039;&#039;&#039; - Heizgrenze wird ausgewertet (on, off)&lt;br /&gt;
* &#039;&#039;&#039;mixer1FlowTemperature&#039;&#039;&#039; - Vorlauftemperatur am Mischkreis 1 in °C&lt;br /&gt;
* &#039;&#039;&#039;mixer1TargetTemperature&#039;&#039;&#039; - Sollwert Vorlauftemperatur am Mischkreis 1 in °C&lt;br /&gt;
* &#039;&#039;&#039;mixer2FlowTemperature&#039;&#039;&#039; - Vorlauftemperatur am Mischkreis 2 in °C&lt;br /&gt;
* &#039;&#039;&#039;mixer2TargetTemperature&#039;&#039;&#039; - Sollwert Vorlauftemperatur am Mischkreis 2 in °C&lt;br /&gt;
* &#039;&#039;&#039;mixer3FlowTemperature&#039;&#039;&#039; - Vorlauftemperatur am Mischkreis 3 in °C&lt;br /&gt;
* &#039;&#039;&#039;mixer3TargetTemperature&#039;&#039;&#039; - Sollwert Vorlauftemperatur am Mischkreis 3 in °C&lt;br /&gt;
* &#039;&#039;&#039;opModeHeating&#039;&#039;&#039; - Betriebsmodus der Heizung (Aus, Automatik, Zusatzheizung, Party, Ferien)&lt;br /&gt;
* &#039;&#039;&#039;opStateHeating&#039;&#039;&#039; - Status der Heizung (Aus, Normal, Abgesenkt, Heizgrenze, Frostschutz)&lt;br /&gt;
* &#039;&#039;&#039;returnTemperatureHeating&#039;&#039;&#039; - aktuelle oder letzte valide Rücklauftemperatur des Heizungskreislaufes in °C. Durch die Speicherung kann auch bei stehender Zirkulationspumpe oder während der Warmwasserbereitung auf die letzte valide Rücklauf-Temperatur des Heizkreislaufes zurückgegriffen werden.&lt;br /&gt;
* &#039;&#039;&#039;returnTemperatureHyst&#039;&#039;&#039; - Regel-Hysterese in K der Rücklauf-Solltemperatur&lt;br /&gt;
* &#039;&#039;&#039;returnTemperatureSetBack&#039;&#039;&#039; - Schnellverstellung in K der Rücklauf-Solltemperatur&lt;br /&gt;
* &#039;&#039;&#039;returnTemperatureTarget&#039;&#039;&#039; - Sollwert Rücklauftemperatur in °C (wird durch Heizkurve und Außensensor bestimmt, kann über in der Steuerung eingegebene Zeiten und auch manuell gezielt abgesenkt)&lt;br /&gt;
* &#039;&#039;&#039;thresholdHeatingLimit&#039;&#039;&#039; - Heizgrenze in °C, &#039;&#039;&#039;über&#039;&#039;&#039;schreitet die gemittelte Außentemperatur diesen Wert, wird nicht mehr geheizt&lt;br /&gt;
* &#039;&#039;&#039;thresholdTemperatureSetBack&#039;&#039;&#039; - &#039;&#039;&#039;unter&#039;&#039;&#039;schreitet die Außentemperatur diesen Wert (°C), wird die Rücklauf-Solltemperatur nicht mehr (zeitgesteuert) abgesenkt&lt;br /&gt;
&lt;br /&gt;
=== Warmwasserbereitung ===&lt;br /&gt;
* &#039;&#039;&#039;hotWaterCircPumpDeaerate&#039;&#039;&#039; - Entlüftungsmodus der Zirkulationspumpe (zum gezielten Einschalten der Zirkulationspumpe durch FHEM)&lt;br /&gt;
* &#039;&#039;&#039;hotWaterTemperature&#039;&#039;&#039; - aktuelle Warmwasser-Boiler-Temperatur in °C (Achtung, die Temperatur im Boiler ist sehr unterschiedliche, es wird also nur die Temperatur am Sensor angezeigt. Typischerweise sackt die Temperaturkurve beim Aufheizen des Boilers etwas ab, weil es durch den Wärmeeintrag zu Strömungen kommt.)&lt;br /&gt;
* &#039;&#039;&#039;hotWaterTemperatureTarget&#039;&#039;&#039; - obere Solltemperatur des Boilers in °C&lt;br /&gt;
* &#039;&#039;&#039;opModeHotWater&#039;&#039;&#039; - Betriebsmodus der Warmwasserbereitung (Aus, Automatik, Zusatzheizung, Party, Ferien)&lt;br /&gt;
* &#039;&#039;&#039;opStateHotWater&#039;&#039;&#039; - Status der Warmwasserbereitung (Aus, Aufheizen, Temp. OK, Sperrzeit)&lt;br /&gt;
&lt;br /&gt;
=== Solarthermie ===&lt;br /&gt;
* solarBufferTemperature - in °C&lt;br /&gt;
* solarCollectorTemperature - in °C&lt;br /&gt;
&lt;br /&gt;
=== Lüftung ===&lt;br /&gt;
* &#039;&#039;&#039;opModeVentilation&#039;&#039;&#039; - Betriebsmodus der Lüftung (Aus, Automatik, Party, Feuchteschutz)&lt;br /&gt;
* &#039;&#039;&#039;ventSupplyAirTemperature&#039;&#039;&#039; - Zulufttemperatur in °C&lt;br /&gt;
* &#039;&#039;&#039;ventExhaustAirTemperature&#039;&#039;&#039; - Ablufttemperatur in °C&lt;br /&gt;
&lt;br /&gt;
=== Zähler ===&lt;br /&gt;
* &#039;&#039;&#039;counterHeatQHeating&#039;&#039;&#039; - von der Wärmepumpe produzierte Wärmemenge (kWh) zur Heizung&amp;lt;br&amp;gt;(nur bei vorhandenem Wärmemengenzähler und ohne Wärmeeintrag durch zweite Wärmequelle wie z.B. Heizstäbe)&lt;br /&gt;
* &#039;&#039;&#039;counterHeatQHotWater&#039;&#039;&#039; - von der Wärmepumpe produzierte Wärmemenge (kWh) zur Warmwasserbereitung&amp;lt;br&amp;gt;(nur bei vorhandenem Wärmemengenzähler und ohne Wärmeeintrag durch zweite Wärmequelle wie z.B. Heizstäbe)&lt;br /&gt;
* &#039;&#039;&#039;counterHeatQTotal&#039;&#039;&#039; - von der Wärmepumpe produzierte Wärmemenge (kWh) insgesam&amp;lt;br&amp;gt;(nur bei vorhandenem Wärmemengenzähler und ohne Wärmeeintrag durch zweite Wärmequelle wie z.B. Heizstäbe)&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;counterHours2ndHeatSource1&#039;&#039;&#039; - Betriebsstunden der zweite Wärmequelle (normalerweise elektrische Heizstäbe) &lt;br /&gt;
* &#039;&#039;&#039;counterHoursHeatPump&#039;&#039;&#039; - Betriebsstunden des Wärmepumpenkompressors &lt;br /&gt;
* &#039;&#039;&#039;counterHoursHeating&#039;&#039;&#039; - Betriebsstunden des Wärmepumpenkompressors die zur Heizung benutzt wurden&lt;br /&gt;
* &#039;&#039;&#039;counterHoursHotWater&#039;&#039;&#039; - Betriebsstunden des Wärmepumpenkompressors die zur Warmwasserbereitung benutzt wurden&lt;br /&gt;
&lt;br /&gt;
=== Ein- und Ausgänge ===&lt;br /&gt;
* compressor1...2&lt;br /&gt;
* &#039;&#039;&#039;heatingSystemCircPump&#039;&#039;&#039; - Heizungs-Umlaufpumpe in der Wärmepumpe (normaler Weise für das Heizungssystem) (HUP)&lt;br /&gt;
* &#039;&#039;&#039;heatingSystemCircPumpVoltage&#039;&#039;&#039; - Regelspannung an der Heizungs-Umlaufpumpe in der Wärmepumpe (zur Steuerung der Pumpen-Drehzahl)&lt;br /&gt;
* &#039;&#039;&#039;heatSourceMotor&#039;&#039;&#039; - Motor des Ventilators, der Brunnen- oder der Solepumpe (je nach WP-Typ) (Ventil-BOSUP)&lt;br /&gt;
* &#039;&#039;&#039;hotWaterCircPumpExtern&#039;&#039;&#039; - Zirkulationspumpe im Warmwasserstrang des Hauses (wenn genutzt) (ZIP)&lt;br /&gt;
* &#039;&#039;&#039;hotWaterSwitchingValve&#039;&#039;&#039; - Ventil zur Umschaltung auf die Heizspirale im Boiler (BUP)&lt;br /&gt;
* 2ndHeatSource1...3&lt;br /&gt;
* &#039;&#039;&#039;solarPump&#039;&#039;&#039; - Pumpe der Solarthermie (SLP)&lt;br /&gt;
&lt;br /&gt;
=== userHeatpumpValues ===&lt;br /&gt;
==== RAW Daten ====&lt;br /&gt;
Die Seite der [http://www.loxwiki.eu/pages/viewpage.action?pageId=18219334 &#039;&#039;&#039;Java-Schnittstelle&#039;&#039;&#039;] enthält auch eine Liste der Betriebsdaten (sog. berechnete Werte) die man mit &#039;&#039;get &amp;lt;device&amp;gt; rawdate&#039;&#039; anzeigen und mit dem Attribut &#039;&#039;userHeatpumpValues&#039;&#039; zum Gerät hinzufügen kann.&lt;br /&gt;
Die RAW Daten werden mit get &amp;lt;device&amp;gt; rawdata ausgelesen. Jeder Wert hat hierbei eine Nummer, die mit dem Attribut userHeatpumpValues zusätzlich als reading bereitgestellt werden kann.&lt;br /&gt;
==== userHeatpumpValues Syntax ====&lt;br /&gt;
Die bei den Raw Daten ausgewählte Nummer und der frei gewählte reading Name wird dann wie folgt eingetragen.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Perl&amp;quot;&amp;gt;&lt;br /&gt;
get &amp;lt;device&amp;gt; rawdata&lt;br /&gt;
attr &amp;lt;device&amp;gt; userHeatpumpValues [rawdata_Nummer] [Wunschnamen],[rawdata_Nummer] [Wunschnamen],[rawdata_Nummer] [Wunschnamen]  &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Sonstiges ===&lt;br /&gt;
* Firmware&lt;br /&gt;
* &#039;&#039;&#039;typeSerial&#039;&#039;&#039; - Baujahr/Monat-Lfd.Hexadezimalnummer&lt;br /&gt;
* &#039;&#039;&#039;typeHeatpump&#039;&#039;&#039; - Modell der Wärmepumpe&lt;br /&gt;
**ERC&lt;br /&gt;
**HMD 2&lt;br /&gt;
**KLW&lt;br /&gt;
**KSW&lt;br /&gt;
**L1A&lt;br /&gt;
**L1A407&lt;br /&gt;
**L1AREV&lt;br /&gt;
**L1H&lt;br /&gt;
**L1I&lt;br /&gt;
**L1I407&lt;br /&gt;
**L1S&lt;br /&gt;
**L2A&lt;br /&gt;
**L2A407&lt;br /&gt;
**L2AREV&lt;br /&gt;
**L2G&lt;br /&gt;
**L2G404&lt;br /&gt;
**L2G407&lt;br /&gt;
**L2H&lt;br /&gt;
**L2I&lt;br /&gt;
**L2I407&lt;br /&gt;
**LD2AG&lt;br /&gt;
**LD5&lt;br /&gt;
**LD5 (230V)&lt;br /&gt;
**LD5 REV&lt;br /&gt;
**LD5 REV 230V&lt;br /&gt;
**LD7&lt;br /&gt;
**LD7 (230 V)&lt;br /&gt;
**LD7 REV&lt;br /&gt;
**LD7 REV 230V&lt;br /&gt;
**LD9&lt;br /&gt;
**LD9 REV 230V&lt;br /&gt;
**LW SEC&lt;br /&gt;
**LWC&lt;br /&gt;
**&#039;&#039;&#039;LWC407&#039;&#039;&#039; - Kompakte Luft/Wasser-Wärmepumpe zur Innenaufstellung&lt;br /&gt;
**LWDV90      Duale Luft/Wasser-Wärmepumpe invertergeführt zur Außenaufstellung&lt;br /&gt;
**LWDV91-1/3  Duale Luft/Wasser-Wärmepumpe invertergeführt zur Außenaufstellung&lt;br /&gt;
**MSW 10&lt;br /&gt;
**MSW 10S&lt;br /&gt;
**MSW 12&lt;br /&gt;
**MSW 13S&lt;br /&gt;
**MSW 14&lt;br /&gt;
**MSW 16S&lt;br /&gt;
**MSW 17&lt;br /&gt;
**MSW 19&lt;br /&gt;
**MSW 23&lt;br /&gt;
**MSW 26&lt;br /&gt;
**MSW 30&lt;br /&gt;
**MSW 4&lt;br /&gt;
**MSW 4S&lt;br /&gt;
**MSW 6 - Sole/Wasser-Wärmepumpe&lt;br /&gt;
**MSW 6S&lt;br /&gt;
**MSW 8&lt;br /&gt;
**MSW 8S&lt;br /&gt;
**MSW2-6S&lt;br /&gt;
**MSW3-12&lt;br /&gt;
**MSW3-12S&lt;br /&gt;
**MSW4-1676&lt;br /&gt;
**SW 291&lt;br /&gt;
**SW 29_56&lt;br /&gt;
**SW 37_45&lt;br /&gt;
**SW 58_69&lt;br /&gt;
**SW1 - ?? Sole/Wasser-Wärmepumpe&lt;br /&gt;
**SW2&lt;br /&gt;
**SWC -  ?? kompakte Sole/Wasser-Wärmepumpe&lt;br /&gt;
**WW1 - ?? Wasser/Wasser-Wärmepumpe&lt;br /&gt;
**WW2&lt;br /&gt;
**WWB_20 - ?? Wasser/Wasser-Booster zur dezentralen Trinkwassererwärmung&lt;br /&gt;
**WWC1 - ?? kompakte Wasser/Wasser-Wärmepumpe&lt;br /&gt;
**WWC2&lt;br /&gt;
**WZS - ??? Sole/Wasser Wärmezentrale&lt;br /&gt;
**WZW&lt;br /&gt;
**WZWD&lt;br /&gt;
&lt;br /&gt;
== Tipps zum ökonomischen Betrieb ==&lt;br /&gt;
Grundlage eines ökonomischen Betriebs einer Wärmepumpe ist in erster Linie ein guter hydraulischer Abgleich der Heizwasserverteilung und eine genaue Einstellung der Heizkurve. Beides ist sowohl von den Bedürfnissen und dem Nutzungsverhalten der Bewohner als auch von der Dämmung des Hauses abhängig.&lt;br /&gt;
&lt;br /&gt;
Insbesondere für Wärmepumpen, die &#039;&#039;&#039;nicht&#039;&#039;&#039; über einen leistungsgeregelten Verdichter verfügen, gibt es den interessanten Ansatz, die Einzelraumregler (ERR) und das Überströmventil der Wärmepumpe komplett ausser Betrieb zu nehmen und damit alle Heizkreise als ein &amp;quot;Heizkörper&amp;quot; zu betrachten. Diverse Foreneinträge (z.B. [http://www.haustechnikdialog.de/Forum/t/142011/Einstellungen-Alpha-Innotec-LWC80]) erzählen von bedeutenden Einsparungen durch Absenken der Solltemperatur und Wärmepumpen-freundlichen Betriebszyklen (lange Taktzeiten) und gehen auch detailiert auf durch die Luxtronik2 betriebene Wärmepumpen ein.&lt;br /&gt;
&lt;br /&gt;
Ein detailierte Anleitung zum energiesparenden Betrieb einer Wärmepumpe findet man auf der folgenden Wiki-Seite:&amp;lt;br&amp;gt;&lt;br /&gt;
[[Effizienter Betrieb einer Fußbodenheizung mit Luft-Wasser-Wärmepumpe (Fallbeispiel)]]&lt;br /&gt;
&lt;br /&gt;
=== Sperrzeiten ===&lt;br /&gt;
Die Luxtronik 2.0 erlaubt es, sich mit Hilfe von Sperrzeiten an zeitabhängige Strompreise anzupassen. Die Uhr der Steuerung geht jedoch sehr ungenau. Durch Setzen des Attributes &amp;quot;autoSynchClock&amp;quot; wird die Uhr der Steuerung regelmäßig mit der FHEM-Zeit abgeglichen. Die Funktion muss über das Attribut &amp;quot;allowSetParameter&amp;quot; freigegeben werden.&lt;br /&gt;
 attr &amp;lt;device&amp;gt; allowSetParameter 1&lt;br /&gt;
 attr &amp;lt;device&amp;gt; autoSynchClock 10&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Dies funktioniert nicht bei der Steuerungen Luxtronik 2.1 und bei der Firmware 2.xx, 3.xx oder 4.xx.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==Abschätzung des elektrischen Verbrauches==&lt;br /&gt;
Über die Attribute &amp;quot;heatPumpElectricalPowerWatt&amp;quot;, &amp;quot;heatPumpElectricalPowerFactor&amp;quot; und &amp;quot;heatRodElectricalPowerWatt&amp;quot; wird der elektrische Verbrauch während der Wärmeerzeugungen (Kompressormotor, Motor(en) der Wärmequelle) und der Heizstäbe festgelegt. Ist zudem das Attribute &amp;quot;doStatistics&amp;quot; auf 1 und der Werte &amp;quot;activeTariff&amp;quot; auf einen Wert zwischen 1 und 9 gesetzt, so berechnet das Modul anhand der Betriebsstunden automatisch den elektrischen Verbrauch innerhalb des angegebenen Stromtarifes.&lt;br /&gt;
&lt;br /&gt;
Normalerweise wird eine Wärmepumpe mit einem zeitabhängigen Stromtarif betrieben (Doppeltarifzähler). Hierbei muss der Werte &amp;quot;activeTariff&amp;quot; zum jeweiligen Zeitpunkt über ein FHEM-Script gesetzt werden.&lt;br /&gt;
Beispiel:&lt;br /&gt;
 define Strom_HT_W at *06:00 { if ( $wday != 0 ) {fhem( &amp;quot;set Heizung activeTariff 1&amp;quot; );;} }&lt;br /&gt;
 define Strom_NT_W at *22:00 set Heizung activeTariff 2&lt;br /&gt;
 define Strom_NT_Sa at *13:00 { if ( $wday == 6 ) {fhem( &amp;quot;set Heizung activeTariff 2&amp;quot; );;} }&lt;br /&gt;
&lt;br /&gt;
==Verhalten der Steuerung Luxtronik 2.0==&lt;br /&gt;
Leider ist die Beschreibung des Steuerungsverhaltens in den Bedienungsanleitungen meist sehr oberflächlich gehalten. Die folgenden Erläuterungen benutzen die Abkürzungen (fett) der Webapplikation der Steuerung.&amp;lt;br&amp;gt; &lt;br /&gt;
Das notwendige Verständnis der Prozesstechnik einer Wärmepumpe erhält man z.B. auf den folgenden Seiten: [http://www.energie-experten.org/heizung/waermepumpe/technik/ www.energie-experten.org/heizung/waermepumpe/technik/]&lt;br /&gt;
&lt;br /&gt;
===Abtauung des Verdampfers (Luftwärmetauschers) bei Luft-Wasser-Wärmepumpen===&lt;br /&gt;
Wird die Luft im Verdampfer unter den Taupunkt abgekühlt, so kommt es zur Ansammlung von Feuchtigkeit an den Bauteilen des Verdampfer. Liegt dabei die Temperatur an den Lamellen unter 0 °C (bzw. die Ausströmtemperatur der Luft knapp darüber) so vereist der Verdampfer. Diese Eisschicht wächst kontinuierlich und verschlechtert extrem die Wärmeübertragung aus der Luft in den Verdichterkreislauf.&lt;br /&gt;
&lt;br /&gt;
Aus diesem Grund wird bei einer Außentemperatur unter 15°C der Verdampfer zyklisch abgetaut. Das Abtauen startet nach dem Ende der &#039;&#039;&#039;Ablaufzeit Abtauen&#039;&#039;&#039; (&#039;&#039;heatSourceDefrostTimer&#039;&#039;) des Verdichters. &lt;br /&gt;
Der Startwert der &#039;&#039;Ablaufzeit Abtauen&#039;&#039; liegt im Bereich &#039;&#039;&#039;Abtzyk min&#039;&#039;&#039; und &#039;&#039;&#039;Abtzyk max&#039;&#039;&#039; und wird bei Kreisumkehr (s.u.) nach jedem Abtauvorgang anhand der dafür benötigten Zeit neu bestimmt.&lt;br /&gt;
&lt;br /&gt;
Bei Außentemperaturen zwischen 10°C und 15°C muss der Verdichter außerdem kontinuierlich 40 Minuten gelaufen sein. Während des Stillstandes des Verdichters wird bei &#039;&#039;Wärmequelle-Ein&#039;&#039; (&#039;&#039;heatSourceIN&#039;&#039;) oberhalb &#039;&#039;T-Luftabt.&#039;&#039; (&#039;&#039;heatSourceDefrostAirThreshold&#039;&#039;) die &#039;&#039;Ablaufzeit Abtauen&#039;&#039; (&#039;&#039;heatSourceDefrostTimer&#039;&#039;) wieder kontinuierlich (1s pro min) bis zum Wert &#039;&#039;&#039;Abtzyk min&#039;&#039;&#039; erhöht.&lt;br /&gt;
&lt;br /&gt;
[[Datei:Luxtronik2-Luftabtauung.png|miniatur|Temperaturverlauf bei Luftabtauung&amp;lt;br&amp;gt;(roter Pfeil)]]&lt;br /&gt;
Es gibt zwei Möglichkeiten des Abtauens:&lt;br /&gt;
# &#039;&#039;&#039;Luftabtauung: &#039;&#039;&#039; nur oberhalb des Gefrierpunktes, etwas langsamer aber energiesparend&lt;br /&gt;
#: Die Luftabtauung wird nur gestartet, wenn zu Beginn des Abtauens die Temperatur &#039;&#039;&#039;Wärmequelle-Ein&#039;&#039;&#039; (&#039;&#039;heatSourceIN&#039;&#039;) oberhalb der Temperatur &#039;&#039;&#039;T-Luftabt.&#039;&#039;&#039; (&#039;&#039;heatSourceDefrostAirThreshold&#039;&#039;) liegt. Dann wird der Verdichter abgeschaltet und nur noch der Ventilator (&#039;&#039;heatSourceMotor&#039;&#039;) betrieben, um die Eisschicht mit der durchströmenden Luft abzutauen. Dabei steigt die Austrittstemperatur &#039;&#039;&#039;Wärmequelle-Aus&#039;&#039;&#039; (&#039;&#039;heatSourceOUT&#039;&#039;) bis auf ca. 0°C und das geschmolzene Eis beginnt abzulaufen. Ist der größte Teil des Eises geschmolzen, so steigt die Austrittstemperatur wieder. Die Luftabtauung wird beendet, wenn die &#039;&#039;Schaltspielsperre nach Verdichterstop&#039;&#039; (5 min) abgelaufen ist &amp;lt;u&amp;gt;und&amp;lt;/u&amp;gt; die Temperatur &#039;&#039;&#039;Wärmequelle-Aus&#039;&#039;&#039; (&#039;&#039;heatSourceOUT&#039;&#039;) den Wert &#039;&#039;&#039;T-LABT-Ende&#039;&#039;&#039; (&#039;&#039;heatSourceDefrostAirEnd&#039;&#039;) erreicht hat oder wenn die Zeitbegrenzung &#039;&#039;&#039;Luft-Abt. max&#039;&#039;&#039; überschritten wird. Bei Überschreitung der Zeitbegrenzung wird per &#039;&#039;Kreisumkehr&#039;&#039; weiter abgetaut. Nach dem Ende der Luftabtauung wird die &#039;&#039;&#039;Ablaufzeit Abtauen&#039;&#039;&#039; (&#039;&#039;heatSourceDefrostTimer&#039;&#039;) auf den Wert &#039;&#039;&#039;Abtzyk min&#039;&#039;&#039; gesetzt.&lt;br /&gt;
&lt;br /&gt;
#  &#039;&#039;&#039;Kreisumkehr:&#039;&#039;&#039; schnell und energieintensiv&lt;br /&gt;
#: Bei der Kreisumkehr wird der Ventilator (&#039;&#039;heatSourceMotor&#039;&#039;) abgeschaltet und der Verdichter weiter betrieben. Über ein Vierwegeventil (Ausgang &#039;&#039;&#039;AV-Abtauventil&#039;&#039;&#039;) wird der Verdichterkreislauf so umgekehrt, dass dem Heizwasserkreislauf Wärme entzogen und der Verdampfer aufgeheizt wird. Nach 10 Minuten oder beim Ansprechen des Abtauendepressostaten (Eingang &#039;&#039;&#039;ASD&#039;&#039;&#039;) wird der Abtauvorgang beendet.&lt;br /&gt;
#: Vor dem Start des Abtauens erfolgt eine s. g. Durchflussüberwachung. Dabei wird geheizt und die Steuerung prüft, ob der Heizkreislauf genügend Durchfluss hat, um die nötige Wärmemenge für den Abtauvorgang zu Verfügung zu stellen. Die Durchflussüberwachung dauert 8 Minuten. In dieser Zeitspanne ist das erwärmte Wasser zumeist auch durch den Heizungskreislauf gewandert, steht wieder am Vorlauf an und wird dann durch den Abtauvergang wieder abgekühlt. Bei einer Außentemperatur über 5 °C oder einer Rücklauftemperatur über 40 °C wird die Durchflussüberwachung auf zwei Minuten gekürzt.&lt;br /&gt;
&lt;br /&gt;
Kommt die Wärmepumpe vor dem Start der Luftabtauung zum Stehen, so taut der Verdampfer durch die Plusgrade der Umgebung auch von ganz allein ab, diese ist an der Temperatur &#039;&#039;Wärmequelle-Aus&#039;&#039; zu erkennen, wird von der Luxtronik aber leider nicht berücksichtigt. &lt;br /&gt;
&lt;br /&gt;
Der Sensor &#039;&#039;Wärmequelle-Ein&#039;&#039; sitzt im Zuluftkanal in der Nähe des Verdampfers. Der Sensor &#039;&#039;Wärmequelle-Aus&#039;&#039; sitzt direkt &#039;&#039;&#039;im&#039;&#039;&#039; Verdampfer, misst also nicht die tatsächliche Lufttemperatur.&lt;br /&gt;
&lt;br /&gt;
===Bivalenter Betrieb===&lt;br /&gt;
* &#039;&#039;&#039;Bivalenz Stufe&#039;&#039;&#039;&lt;br /&gt;
*: Damit wird über die HRM- und HRW-Zeit das Zuschalten weiterer Wärmequellen gesteuert:&lt;br /&gt;
*:: Stufe 1 = ein Verdichter darf laufen (Bei zwei Verdichtern werden diese in Abhängigkeit der &#039;&#039;&#039;Impulse Verdichter 1/2&#039;&#039;&#039; abwechselnd verwendet.)&lt;br /&gt;
*:: Stufe 2 = zwei Verdichter dürfen laufen, sofern die Außentemperatur den Wert &#039;&#039;&#039;Freig. 2.VD&#039;&#039;&#039; unterschritten hat. Statt dem 2. Verdichter kann auch eine parallel betriebene Wärmepumpe freigegeben werden.&lt;br /&gt;
*:: Stufe 3 = zusätzlicher Wärmeerzeuger 1 (&#039;&#039;&#039;ZWE 1&#039;&#039;&#039;, z.B. Heizstäbe oder Kessel) darf mitlaufen, sofern die Außentemperatur den Wert &#039;&#039;&#039;Freig. ZWE&#039;&#039;&#039; unterschritten hat&lt;br /&gt;
*:: Stufe 4 = zusätzlicher Wärmeerzeuger 2 (&#039;&#039;&#039;ZWE 2&#039;&#039;&#039;, z.B. Heizstäbe) darf mitlaufen, sofern die Außentemperatur den Wert &#039;&#039;&#039;Freig. ZWE&#039;&#039;&#039; unterschritten hat&lt;br /&gt;
*: Wenn die Rücklauftemperatur die Rücklauf-Solltemperatur und die maximale Rücklauferhöhung &#039;&#039;&#039;TR Erh max&#039;&#039;&#039; überschreitet, werden sofort alle Wärmeerzeuger abgeschaltet und die Bivalenzstufe 1 gesetzt.&lt;br /&gt;
*: Wenn in der Heizung die maximale Vorlauftemperatur &#039;&#039;&#039;Vorlauf max.&#039;&#039;&#039; überschritten wird, dann wird sofort ein Kompressor ausgeschalten und die Bivalenzstufe um den Wert 1 reduziert.&lt;br /&gt;
*: Bei der Warmwassererzeugung wird der zusätzliche Wärmeerzeuger erst nach der Zeit &#039;&#039;&#039;WW+WP max&#039;&#039;&#039; freigegeben.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;HRM-Zeit&#039;&#039;&#039; - Heizungsregler Mehr-Zeit&lt;br /&gt;
*: Die Zeit beginnt zu zählen, wenn die Wärmepumpe heizt und sich die Rücklauftemperatur &#039;&#039;&#039;unterhalb&#039;&#039;&#039; des Einschaltkriteriums (&#039;&#039;&#039;Rückl.Soll&#039;&#039;&#039; - &#039;&#039;&#039;Hyterese HR&#039;&#039;&#039;) befindet.&lt;br /&gt;
*: Überschreitet diese Zeit einen bestimmten Wert, so wird in die nächst höhere &#039;&#039;Bivalenzstufe&#039;&#039; geschaltet, um zusätzliche Wärmeerzeuger zu aktiviert.&lt;br /&gt;
*: Die Bivalenzstufe 2 (zwei Verdichter) wird nach der &#039;&#039;&#039;HR Zeit&#039;&#039;&#039; (Standard 25 min) erreicht.&lt;br /&gt;
*: Die Bivalenzstufe 3 (ZWE 1) wird nach der Zeit &#039;&#039;&#039;Freig. ZWE&#039;&#039;&#039; (Standard 60 min) erreicht.&lt;br /&gt;
*: Die Bivalenzstufe 4 (ZWE 2) wird nach 120 min erreicht.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;HRW-Zeit&#039;&#039;&#039; - Heizungsregler Weniger-Zeit&lt;br /&gt;
*: Die Zeit beginnt zu zählen, wenn die Wärmepumpe heizt und sich die Rücklauftemperatur &#039;&#039;&#039;oberhalb&#039;&#039;&#039; des Ausschaltkriteriums (&#039;&#039;&#039;Rückl.Soll&#039;&#039;&#039; + &#039;&#039;&#039;Hyterese HR&#039;&#039;&#039;) befindet. &lt;br /&gt;
*: Überschreitet diese Zeit einen bestimmten Wert (jeweils 15 min), so wird in die nächst niedrigere &#039;&#039;Bivalenzstufe&#039;&#039; geschaltet, um zusätzliche Wärmeerzeuger wieder zu deaktivieren.&lt;br /&gt;
&lt;br /&gt;
===Automatische Sperren===&lt;br /&gt;
* &#039;&#039;&#039;SSP-Zeit&#039;&#039;&#039; - Ablaufzeit der Schaltspielsperre (SSP)&lt;br /&gt;
*: Es gibt zwei SSP-Ablaufzeit. Sie verzögern das erneute Starten des Verdichters für:&lt;br /&gt;
*:: 20 min ab letztem &#039;&#039;&#039;Ein&#039;&#039;&#039;schaltzeitpunkt des Verdichters, um die Belastung des Stromnetzes durch den erhöhten Anlaufstrom zu reduzieren.&lt;br /&gt;
*:: 5 min ab letztem &#039;&#039;&#039;Aus&#039;&#039;&#039;schaltzeitpunkt des Verdichters, um den Verdichterkreislauf zu schonen.&lt;br /&gt;
*: Das heisst, der Verdichter startet frühestens 20 min nach dem letzten Start, resp. 5 min nach dem letzten Stop. Es gibt also maximal 3 Anläufe pro Stunde.&lt;br /&gt;
&lt;br /&gt;
===Heizkurve===&lt;br /&gt;
Die Heizkurve lässt sich über zwei Parameter einstellen&lt;br /&gt;
* Eine Veränderung des Heizkurven-Endpunktes (HKE) verändert die Steigung der Kurve indem es die Rücklauf-Solltemperatur &#039;&#039;rlSoll&#039;&#039; bei tiefen Temperaturen festlegt.&lt;br /&gt;
* Die Parallelverschiebung (PVS) des Heizkurven-Fusspunktes hebt oder senkt die komplette Kurve und verändert dabei auch die Steigung geringfügig.&lt;br /&gt;
* Bei einer &amp;quot;neutralen&amp;quot; Parallelverschiebung von 20°C wird bei -20°C Außentemperatur der Heizkurvenendpunkt als &#039;&#039;rlSoll&#039;&#039; eingestellt.&lt;br /&gt;
: Bei 20°C Außentemperatur liegt &#039;&#039;rlSoll&#039;&#039; auf dem Heizkurven-Fusspunkt von 20°C.&lt;br /&gt;
: Eine Erhöhung des Fusspunktes um 1°C erhöht auch &#039;&#039;rlSoll&#039;&#039; bei -20°C um 1°C.&lt;br /&gt;
&lt;br /&gt;
Die Rücklauf-Solltemperatur &#039;&#039;rlSoll&#039;&#039; wird von der Steuerung in Abhängigkeit von der Außentemperatur wie folgt berechnet:&lt;br /&gt;
: rlSoll (Aussentemp) = PVS + (HKE - 20) * (PVS - Aussentemp) / (20 - (Aussentemp - PVS) / 2)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
Bei einer &amp;quot;neutralen&amp;quot; Parallelverschiebung von 20°C und einem Heizkurvenendpunkt von 30°C lautet der vereinfacht Term:&lt;br /&gt;
: rlSoll (Aussentemp) = 20 + 20 * (Aussentemp - 20) / (Aussentemp - 60)&lt;br /&gt;
D.h. rlSoll (20°C) = 20°C und rlSoll (-20°C) = 30°C&lt;br /&gt;
&lt;br /&gt;
===Frostschutz und Heizgrenze===&lt;br /&gt;
Ist die &#039;&#039;&#039;Heizgrenze&#039;&#039;&#039; eingeschaltet, so schaltet die Steuerung in den Frostschutz-Modus (=Sommermodus), sobald die &#039;&#039;&#039;Mitteltemperatur&#039;&#039;&#039; (&#039;&#039;averageAmbientTemperature&#039;&#039;) die Heizgrenze (&#039;&#039;thresholdHeatingLimit&#039;&#039;) um 0,2 K überschreitet. Dabei wird die Rücklaufsolltemperatur (&#039;&#039;returnTemperatureTarget&#039;&#039;) auf die &#039;&#039;&#039;Min.Rückl.Solltemp.&#039;&#039;&#039; (z.B. 15°C) absenkt.&lt;br /&gt;
Bei Luft-Wasser-Wärmepumpen wird die Rücklaufsolltemperatur auf 20°C angehoben, sobald die &#039;&#039;&#039;Außentemperatur&#039;&#039;&#039; (&#039;&#039;ambientTemperature&#039;&#039;) 10°C unterschreitet.&amp;lt;br&amp;gt;&lt;br /&gt;
Die &#039;&#039;Mitteltemperatur&#039;&#039; ist laut Handbuch der Durchschnitt der Außentemperatur der letzten 24 Stunden. Tatsächlich wird sie aber einmal pro Stunde aus einem reduzierten Mittelwert der letzten 11 Stunden gebildet.&lt;br /&gt;
&lt;br /&gt;
Beim Unterschreiten der Solltemperatur startet der Heizvorgang (Frostschutz).&lt;br /&gt;
&lt;br /&gt;
Empfehlung für die Heizgrenze:&lt;br /&gt;
* Altbau: 15°C&lt;br /&gt;
* Neubau: 12°C&lt;br /&gt;
* Passivhaus: 10°C&lt;br /&gt;
&lt;br /&gt;
===Pumpenoptimierung===&lt;br /&gt;
Der Stromverbrauch einer durchgängig laufenden normalen Heizungsumwälzpumpe beträgt mehrere kWh pro Tag. Damit kann er in der Übergangszeit sogar im Bereich des Stromverbrauches des Verdichters liegen (z.B. 5 kWh/Tag). Durch den Einsatz engergiesparender Pumpen kann man ihn reduzieren. Die Funktion &#039;&#039;&#039;Pumpenoptimierung&#039;&#039;&#039; ist eine zusätzliche Möglichkeit, um durch bedarfsgesteuertes Abschalten der Heizungsumwälzpumpe Strom zu sparen.&lt;br /&gt;
&lt;br /&gt;
Es gibt verschiedene Stufen:&lt;br /&gt;
# Liegt die Rücklauftemperatur 30 Minuten nach Ende des Heizvorganges noch über dem Sollwert (ohne Hysterese), so wird die Heizungspumpe für 30 min abgeschaltet. &lt;br /&gt;
# Liegt die Rücklauftemperatur nach Ende des Heizvorganges für die Dauer der &#039;&#039;&#039;Pumpenoptim.Zeit&#039;&#039;&#039; oberhalb des  Sollwertes, so wird die Heizungspumpe abgeschaltet. Danach wird alle 30 Minuten wieder für 5 Minuten eingeschaltet, um die aktuelle Rücklauftemperatur des Heizungskreislaufes zu ermitteln. Liegt die Rücklauftemperatur nach den 5 Minuten unterhalb des Sollwertes so läuft die Heizungspumpe wieder dauerhaft.&lt;br /&gt;
# Sobald die Außentemperatur über der Rücklauf-Solltemperatur liegt, wird die Heizungspumpe dauerhaft abgeschaltet. Um ein Festsitzen der Pumpe zu vermeiden, wird sie alle 150 Stunden für eine Minute wieder eingeschaltet.&lt;br /&gt;
&lt;br /&gt;
Die Pumpenoptimierung läuft nicht bei Außentemperaturen unter +1,0°C, um das Einfrieren von außen-aufgestellten Anlagen zu verhindern. Während der EVU-Sperre steht auch die Heizungsumwälzpumpe. Nach deren Ende läuft die Heizungsumwälzpumpe erst 5 Minuten ehe die Rücklauftemperatur ausgewertet wird.&lt;br /&gt;
&lt;br /&gt;
Die Pumpenoptimierungszeit sollte möglichst klein gewählt werden, wenn eine Fussbodenheizung ohne Einzelraumregler betrieben wird und Räume unterschiedliche Temperaturen haben sollen, da sonst nach Abschalten der Wärmepumpe die wärmeren Räume schneller abkühlen und dabei die kälteren aufheizen.&lt;br /&gt;
&lt;br /&gt;
==Firmware==&lt;br /&gt;
=== Firmware Bugs und Eigentümlichkeiten===&lt;br /&gt;
- bitte mit eigenen Beobachtungen ergänzen -&lt;br /&gt;
&lt;br /&gt;
Lfd-Nr. 1&amp;lt;br&amp;gt;&lt;br /&gt;
Die Warmwassererwärmung führt zu einer starken Erhöhung der Temperatur im Heizkreislauf-Wärmetauscher der Wärmepumpe. Nach dem Zurückschalten auf den Heizungsbetrieb, speist der Puffer bis zur Abkühlung erstmal mit einer sehr hohen Temperatur in den Heizungskreislauf ein und verfälscht dadurch die Rücklauftemperatur stark. Die Heizungspumpe läuft zwar 2 Minuten nach aber in dieser Zeit wird die überhöhte Wärmetauschertemperatur nicht abgebaut. Bei eingeschalteter Pumpenoptimierung führt dies zu zu einer Zwangspause von entweder 30 Minuten oder bis der Temperaturfühler an der Rücklaufleitung durch den normalen Wärmeverlust unterhalb der Solltemperatur abgekühlt ist.&lt;br /&gt;
&lt;br /&gt;
Lfd-Nr. 2&amp;lt;br&amp;gt;&lt;br /&gt;
Über das Webinterface kann man teilweise keine Ferienzeit von wenigen Tagen auswählen. Wurde in den aktuelleren Firmwareversionen behoben.&lt;br /&gt;
&lt;br /&gt;
Lfd-Nr. 3&amp;lt;br&amp;gt;&lt;br /&gt;
Mittlere Außentemperatur wird nicht über die letzten 24 h bestimmt.&lt;br /&gt;
&lt;br /&gt;
Lfd-Nr. 4 (Luft-Wasser-Wärmepumpen)&amp;lt;br&amp;gt;&lt;br /&gt;
Die Berücksichtigung der Natur-Luftabtauung (ohne Ventilator) von 1s/1min ist viel zu gering. Das müßte höher sein.&lt;br /&gt;
&lt;br /&gt;
Lfd-Nr. 5 (Luft-Wasser-Wärmepumpen)&amp;lt;br&amp;gt;&lt;br /&gt;
Nach dem Heizungstakt könnte problemlos ein Luftabtauen erfolgen, damit für den nächsten Heizungstakt wieder an abgetauter Verdampfer zu Verfügung steht.&lt;br /&gt;
&lt;br /&gt;
Lfd-Nr. 6 (Luft-Wasser-Wärmepumpen)&amp;lt;br&amp;gt;&lt;br /&gt;
Nach einer Luftabtauung wird der Heiztakt nicht zu Ende geführt, sondern erst wieder beim Unterschreiten der unteren Hysterese gestartet. Dadurch bleibt die Rücklauftemperatur eventuell dauerhaft unterhalb der Solltemperatur und die Raumtemperatur sinkt mit der Zeit ab.&lt;br /&gt;
&lt;br /&gt;
Lfd-Nr. 7 (Luft-Wasser-Wärmepumpen)&amp;lt;br&amp;gt;&lt;br /&gt;
Fällt das Kreisumlaufabtauen auf das Ende des Heizzykluses so startet die Wärmepumpe nicht erneut. Der auf über 30°C erhitzte Wärmetauscher erwärmt nun die Luft in der Wärmepumpe. Bei Erreichen wird der Luftabtaugrenze wird der Ablauftimer auf den Mindestwert gesetzt und verliert die beim Kreisumkehr-Abtauen automatisch bestimmte höhere Ablaufzeit (meist in der Nähe der Maximalzeit).&lt;br /&gt;
&lt;br /&gt;
Lfd-Nr. 8 (Luft-Wasser-Wärmepumpen)&amp;lt;br&amp;gt;&lt;br /&gt;
Fällt das Kreisumlaufabtauen auf das Ende des Heizzykluses so startet die Wärmepumpe erstmal nicht erneut. Durch die Kreisumkehr wurde jedoch ein Schub kalten Wassers im Heizungskreislauf gefangen. Dieser führt dann sehr schnell zu einem Absinken der Rücklauftemperatur und zu einem Neustart der Wärmepumpe.&lt;br /&gt;
&lt;br /&gt;
Lfd-Nr. 9 (Luft-Wasser-Wärmepumpen)&amp;lt;br&amp;gt;&lt;br /&gt;
Das &amp;quot;natürliche&amp;quot; Abtauen wird nicht erkannt. Kommte die Wärmepumpe vor dem Ende der Abtauablaufzeit zum Stehen, so taut der Verdampfer bei positiven Umgebungstemperaturen von ganz alleine ab. Dies kann man Problemlos an der Temperatur &#039;&#039;Wärmequelle Aus&#039;&#039; erkennen, da diese durch die Schmelzenthalphie solange bei 0°C bleibt bis der Verdamper abtaut ist. Dann steigt sie auf die Höhe der Außentemperatur.&lt;br /&gt;
&lt;br /&gt;
Lfd-Nr. 10 (Luft-Wasser-Wärmepumpen)&amp;lt;br&amp;gt;&lt;br /&gt;
Während des Abtauens durch Kreisumlauf wird dem Heizungskreislauf Wärme entzogen. Der Wärmemengen-Zähler zählt jedoch nicht rückwärts. Deshalb ist die von der Wärmepumpe ins Heizsystem eingebrachte Wärmemenge nicht korrekt. Tatsächlich wird ca. 5 % weniger Energie eingebracht und die Arbeitszahl ist ebenfalls ca. 5 % niedriger.&lt;br /&gt;
&lt;br /&gt;
=== Nützliche Links ===&lt;br /&gt;
==== aktuelle Firmware ====&lt;br /&gt;
Die aktuelle Firmware gibt es [https://www.heatpump24.com/DownloadArea.php?layout=1 &#039;&#039;&#039;hier&#039;&#039;&#039;]&lt;br /&gt;
==== Status Codes ====&lt;br /&gt;
Hier gibt es eine Seite mit einer ausführlichen Liste von [https://www.loxwiki.eu/pages/viewpage.action?pageId=18219334 &#039;&#039;&#039;Status Codes&#039;&#039;&#039;]&lt;br /&gt;
==== Java-Schnittstelle ====&lt;br /&gt;
Eine Beschreibung der Java-Schnittstelle gibt es [http://www.loxwiki.eu/pages/viewpage.action?pageId=18219334 &#039;&#039;&#039;hier&#039;&#039;&#039;].&lt;br /&gt;
[[Kategorie:Other Components]]&lt;br /&gt;
[[Kategorie:Heizungssteuerung]]&lt;/div&gt;</summary>
		<author><name>Topos</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Ora_Funky_Cat&amp;diff=39367</id>
		<title>Ora Funky Cat</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Ora_Funky_Cat&amp;diff=39367"/>
		<updated>2024-06-14T19:31:26Z</updated>

		<summary type="html">&lt;p&gt;Topos: /* Readings */ TrueSoc Beschreibung&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Auf dieser Seite wird die Einbindung des E-Autos [https://www.ora-motor.de/ Ora Funky Cat] von GWM (Great Wall Motor aus China) in FHEM über die OBD2-Serviceschnittestelle erläutert.&lt;br /&gt;
&lt;br /&gt;
Benötigte Hardware: [https://www.meatpi.com/products/wican MeatPi WiCAN-OBD-C3 Adapter]&lt;br /&gt;
&lt;br /&gt;
Der WiCAN wird in die OBD2-Serviceschnittestelle (rechts neben Sicherungsfach unterhalb Lenkrad) gesteckt. Am besten über ein Verlängerungskabel oder indem man den OBD2-Stecker aus der Halterung drückt und mit dem WiCAN ins Sicherungsfach legt. &lt;br /&gt;
&lt;br /&gt;
Der WiCAN kommuniziert über den CAN-Bus des Fahrzeuges mit den Steuergeräten (ECU, Eletronic Control Unit) im Ora und kann sich über WLAN mit eine MQTT-Server verbinden. Näheres im obigen Link. Bei der WiCAN-Konfiguration mus das CAN-Protokoll &amp;quot;slcan&amp;quot; ausgewählt werden. Die Kommunikation erfolgt über den Eintrag &#039;&#039;can/tx&#039;&#039; und &#039;&#039;can/rx&#039;&#039; des WiCAN auf dem MQTT-Server. Bitte nicht vergessen, den automatischen Standby-Modus anzuschalten, ansonsten leert sich mit der Zeit die Fahrzeugbatterie.&lt;br /&gt;
&lt;br /&gt;
Die Integration eines MQTT-Servers in FHEM wird [[MQTT|&#039;&#039;&#039;hier&#039;&#039;&#039;]] erklärt. &lt;br /&gt;
&lt;br /&gt;
Ist das Auto eingeschaltet und der Adapter gesteckt, dann können über FHEM einige Fahrzeugdaten abgefragt werden. Weiter unten eine beispielhafte EInrichtung eines MQTT2-Devices. &lt;br /&gt;
&lt;br /&gt;
=== Readings ===&lt;br /&gt;
Die folgenden Werte werden mit unterer Beispielkonfiguration aus den Steuergeräten VCU (Vehicle Control Unit, ECU CAN-ID: 1930, Response CAN-ID: 1994) und BMSv2 (Batterie Management System, ECU CAN-ID: 1931, Response CAN-ID: 1995) ausgelesen:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Mileage:&#039;&#039;&#039; km-Stand - Abfrage über &amp;quot;set wican read_Mileage&amp;quot;&lt;br /&gt;
* &#039;&#039;&#039;SoC&#039;&#039;&#039;: Netto-Ladezustand Hochvolt-Antriebsbatterie in %  - Abfrage über &amp;quot;set wican read_SoC&amp;quot;&lt;br /&gt;
* &#039;&#039;&#039;TrueSoC&#039;&#039;&#039;: Brutto-Ladezustand Hochvolt-Antriebsbatterie in %  - Abfrage über &amp;quot;set wican read_TrueSoC&amp;quot;&lt;br /&gt;
* &#039;&#039;&#039;SoE&#039;&#039;&#039;: Ladezustand Hochvolt-Antriebsbatterie in kW - Abfrage über &amp;quot;set wican read_SoE&amp;quot;&lt;br /&gt;
* &#039;&#039;&#039;SoH&#039;&#039;&#039;: Gesundheitszustand der Hochvolt-Antriebsbatterie in % - Abfrage über &amp;quot;set wican read_SoH&amp;quot;&lt;br /&gt;
* &#039;&#039;&#039;OperatingVoltage&#039;&#039;&#039;: Spannung Niedervolt-Fahrzeugbatterie in V - Abfrage über &amp;quot;set wican read_OperatingVoltage&amp;quot;&lt;br /&gt;
* &#039;&#039;&#039;BatteryVoltage&#039;&#039;&#039;: Spannung Hochvolt-Antriebsbatterie in V - Abfrage über &amp;quot;set wican read_BatteryVoltage&amp;quot;&lt;br /&gt;
* &#039;&#039;&#039;TotalCharge&#039;&#039;&#039;: Durch die Batterie aufgenommene Stromleistung in Ah (inklusive Rekuperation während des Fahrens) - Abfrage über &amp;quot;set wican read_Total Charge&amp;quot; Die Multiplikation mit 4&amp;amp;nbsp;kV scheint die hinzugefügte HV-Batterieleistung abzüglich der Ladeverluste zu ergeben.&lt;br /&gt;
* &#039;&#039;&#039;TotalDischarge&#039;&#039;&#039;: Von der Hochvolt-Batterie abgezogene Stromleistung in Ah - Abfrage über &amp;quot;set wican read_TotalDischarge&amp;quot; Die Multiplikation mit 4&amp;amp;nbsp;kV scheint die abgerufene HV-Batterieleistung zu ergeben.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Das erste Auslesen kann über ein notify angestossen werden, sobald der WiCAN den Status &amp;quot;online&amp;quot; hat. &amp;lt;syntaxhighlight lang=&amp;quot;cfg&amp;quot;&amp;gt;&lt;br /&gt;
define wican_online notify wican:status:.online set wican read_SoC;; sleep 1;; set wican read_TrueSoC;; sleep 1;; set wican read_Mileage;; sleep 1;; set wican read_OpVoltage;; sleep 1;; set wican read_SoH;; sleep 1;; set wican read_TotalCharge;; sleep 1;; set wican read_TotalDischarge;; sleep 1;; set wican read_BatteryVoltage;; sleep 1;; set wican read_SoE&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Die weiteren Abfrage können über einen Timer erfolgen Der Timer kann mit einem notify ein- und wieder ausgeschaltet werden.&amp;lt;syntaxhighlight lang=&amp;quot;cfg&amp;quot;&amp;gt;&lt;br /&gt;
define wican_check at +*00:01:00 set wican read_SoC;; sleep 1;; set wican read_TrueSoC;; sleep 1;; set wican read_Mileage;; sleep 1;; set wican read_OpVoltage;; sleep 1;; set wican read_SoH;; sleep 1;; set wican read_TotalCharge;; sleep 1;; set wican read_TotalDischarge;; sleep 1;; set wican read_BatteryVoltage;; sleep 1;; set wican read_SoE&lt;br /&gt;
&lt;br /&gt;
define wican_check_active notify wican:status:.online set wican_check active&lt;br /&gt;
&lt;br /&gt;
define wican_check_inactive notify wican:status:.offline set wican_check inactive&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Beispielhafte Einrichtung des WiCAN im Ora Funky Cat als MQTT2-Device ===&lt;br /&gt;
Ab der WiCAN [https://github.com/meatpiHQ/wican-fw/releases Firmware] v2.98 (13. April 2024) kann die Benennung des Eintrages im MQTT-Server frei gewählt werden. Die untere Konfiguration geht von folgender Benennung aus: &lt;br /&gt;
&lt;br /&gt;
* TX Topic: &#039;&#039;wican/ora/can/tx&#039;&#039;&lt;br /&gt;
* RX Topic: &#039;&#039;wican/ora/can/tx&#039;&#039;&lt;br /&gt;
* Status Topic: &#039;&#039;wican/ora/can/status&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cfg&amp;quot;&amp;gt;&lt;br /&gt;
define wican MQTT2_DEVICE&lt;br /&gt;
attr wican alias Ora&lt;br /&gt;
attr wican stateFormat B: SoC% M: Mileage km (status)&lt;br /&gt;
attr wican event-on-change-reading status&lt;br /&gt;
attr wican event-on-update-reading frame_1_data_6,SoC&lt;br /&gt;
attr wican DbLogExclude .*&lt;br /&gt;
attr wican DbLogInclude SoC:3600&lt;br /&gt;
attr wican readingList wican/ora/can/status:.* {json2nameValue($EVENT)}\&lt;br /&gt;
 wican/ora/can/rx:.* {json2nameValue($EVENT)}&lt;br /&gt;
attr wican setList read_SoC:noArg wican/ora/can/tx {&amp;quot;bus&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;tx&amp;quot;,&amp;quot;ts&amp;quot;:49539,&amp;quot;frame&amp;quot;:[{&amp;quot;id&amp;quot;:1931,&amp;quot;dlc&amp;quot;:8,&amp;quot;rtr&amp;quot;:false,&amp;quot;extd&amp;quot;:false,&amp;quot;data&amp;quot;:[3,34,32,80,170,170,170,170]}]}\&lt;br /&gt;
read_TrueSoC:noArg wican/ora/can/tx {&amp;quot;bus&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;tx&amp;quot;,&amp;quot;ts&amp;quot;:27825,&amp;quot;frame&amp;quot;:[{&amp;quot;id&amp;quot;:1931,&amp;quot;dlc&amp;quot;:8,&amp;quot;rtr&amp;quot;:false,&amp;quot;extd&amp;quot;:false,&amp;quot;data&amp;quot;:[3,34,3,8,170,170,170,170]}]}\&lt;br /&gt;
read_SoH:noArg wican/ora/can/tx {&amp;quot;bus&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;tx&amp;quot;,&amp;quot;ts&amp;quot;:12016,&amp;quot;frame&amp;quot;:[{&amp;quot;id&amp;quot;:1931,&amp;quot;dlc&amp;quot;:8,&amp;quot;rtr&amp;quot;:false,&amp;quot;extd&amp;quot;:false,&amp;quot;data&amp;quot;:[3,34,32,81,170,170,170,170]}]}\&lt;br /&gt;
read_SoE:noArg wican/ora/can/tx {&amp;quot;bus&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;tx&amp;quot;,&amp;quot;ts&amp;quot;:17777,&amp;quot;frame&amp;quot;:[{&amp;quot;id&amp;quot;:1930,&amp;quot;dlc&amp;quot;:8,&amp;quot;rtr&amp;quot;:false,&amp;quot;extd&amp;quot;:false,&amp;quot;data&amp;quot;:[3,34,208,98,170,170,170,170]}]}\&lt;br /&gt;
read_OpVoltage:noArg wican/ora/can/tx {&amp;quot;bus&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;tx&amp;quot;,&amp;quot;ts&amp;quot;:17645,&amp;quot;frame&amp;quot;:[{&amp;quot;id&amp;quot;:1931,&amp;quot;dlc&amp;quot;:8,&amp;quot;rtr&amp;quot;:false,&amp;quot;extd&amp;quot;:false,&amp;quot;data&amp;quot;:[3,34,208,3,170,170,170,170]}]}\&lt;br /&gt;
read_Mileage:noArg wican/ora/can/tx {&amp;quot;bus&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;tx&amp;quot;,&amp;quot;ts&amp;quot;:35674,&amp;quot;frame&amp;quot;:[{&amp;quot;id&amp;quot;:1931,&amp;quot;dlc&amp;quot;:8,&amp;quot;rtr&amp;quot;:false,&amp;quot;extd&amp;quot;:false,&amp;quot;data&amp;quot;:[3,34,208,4,170,170,170,170]}]}\&lt;br /&gt;
read_TotalCharge:noArg wican/ora/can/tx {&amp;quot;bus&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;tx&amp;quot;,&amp;quot;ts&amp;quot;:28695,&amp;quot;frame&amp;quot;:[{&amp;quot;id&amp;quot;:1931,&amp;quot;dlc&amp;quot;:8,&amp;quot;rtr&amp;quot;:false,&amp;quot;extd&amp;quot;:false,&amp;quot;data&amp;quot;:[3,34,33,113,170,170,170,170]}]}\&lt;br /&gt;
read_TotalDischarge:noArg wican/ora/can/tx {&amp;quot;bus&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;tx&amp;quot;,&amp;quot;ts&amp;quot;:28695,&amp;quot;frame&amp;quot;:[{&amp;quot;id&amp;quot;:1931,&amp;quot;dlc&amp;quot;:8,&amp;quot;rtr&amp;quot;:false,&amp;quot;extd&amp;quot;:false,&amp;quot;data&amp;quot;:[3,34,33,114,170,170,170,170]}]}\&lt;br /&gt;
read_BatteryVoltage:noArg wican/ora/can/tx {&amp;quot;bus&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;tx&amp;quot;,&amp;quot;ts&amp;quot;:58591,&amp;quot;frame&amp;quot;:[{&amp;quot;id&amp;quot;:1931,&amp;quot;dlc&amp;quot;:8,&amp;quot;rtr&amp;quot;:false,&amp;quot;extd&amp;quot;:false,&amp;quot;data&amp;quot;:[3,34,32,3,170,170,170,170]}]}&lt;br /&gt;
attr wican userReadings SoC:frame_1_data_6:.* {\&lt;br /&gt;
	if (ReadingsNum($NAME, &#039;frame_1_id&#039;, 0) == 1995 and ReadingsNum($NAME, &#039;frame_1_data_1&#039;, 0)  == 5 and ReadingsNum($NAME, &#039;frame_1_data_2&#039;, 0)  == 98\&lt;br /&gt;
      and ReadingsNum($NAME, &#039;frame_1_data_3&#039;, 0)  == 32 and ReadingsNum($NAME, &#039;frame_1_data_4&#039;, 0)  == 80 ) {\&lt;br /&gt;
		return (ReadingsNum($NAME, &#039;frame_1_data_5&#039;, 0) * 256+ReadingsNum($NAME, &#039;frame_1_data_6&#039;, 0))/10.0\&lt;br /&gt;
	} else {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;SoC&#039;, 0)\&lt;br /&gt;
	}\&lt;br /&gt;
},\&lt;br /&gt;
SoH:frame_1_data_6:.* {\&lt;br /&gt;
	if (ReadingsNum($NAME, &#039;frame_1_id&#039;, 0) == 1995 and ReadingsNum($NAME, &#039;frame_1_data_1&#039;, 0)  == 5 and ReadingsNum($NAME, &#039;frame_1_data_2&#039;, 0)  == 98\&lt;br /&gt;
      and ReadingsNum($NAME, &#039;frame_1_data_3&#039;, 0)  == 32 and ReadingsNum($NAME, &#039;frame_1_data_4&#039;, 0)  == 81 ) {\&lt;br /&gt;
		return (ReadingsNum($NAME, &#039;frame_1_data_5&#039;, 0) * 256 + ReadingsNum($NAME, &#039;frame_1_data_6&#039;, 0))/10.0\&lt;br /&gt;
	} else {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;SoH&#039;, 0)\&lt;br /&gt;
	}\&lt;br /&gt;
},\&lt;br /&gt;
TrueSoC:frame_1_data_6:.* {\&lt;br /&gt;
	if (ReadingsNum($NAME, &#039;frame_1_id&#039;, 0) == 1995 and ReadingsNum($NAME, &#039;frame_1_data_3&#039;, 0)  == 3) {\&lt;br /&gt;
		return (ReadingsNum($NAME, &#039;frame_1_data_5&#039;, 0) * 256 + ReadingsNum($NAME, &#039;frame_1_data_6&#039;, 0))/10.0\&lt;br /&gt;
	} else {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;TrueSoC&#039;, 0)\&lt;br /&gt;
	}\&lt;br /&gt;
},\&lt;br /&gt;
Mileage:frame_1_data_6:.* {\&lt;br /&gt;
	if (ReadingsNum($NAME, &#039;frame_1_id&#039;, 0) == 1995 and ReadingsNum($NAME, &#039;frame_1_data_1&#039;, 0)  == 6 and ReadingsNum($NAME, &#039;frame_1_data_2&#039;, 0)  == 98\&lt;br /&gt;
      and ReadingsNum($NAME, &#039;frame_1_data_3&#039;, 0)  == 208 ) {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;frame_1_data_5&#039;, 0) * 65536 + ReadingsNum($NAME, &#039;frame_1_data_6&#039;, 0) * 256 + ReadingsNum($NAME, &#039;frame_1_data_7&#039;, 0)\&lt;br /&gt;
	} else {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;Mileage&#039;, 0)\&lt;br /&gt;
	}\&lt;br /&gt;
},\&lt;br /&gt;
OperatingVoltage:frame_1_data_6:.* {\&lt;br /&gt;
	if (ReadingsNum($NAME, &#039;frame_1_id&#039;, 0) == 1995 and ReadingsNum($NAME, &#039;frame_1_data_1&#039;, 0)  == 4 and ReadingsNum($NAME, &#039;frame_1_data_2&#039;, 0)  == 98\&lt;br /&gt;
      and ReadingsNum($NAME, &#039;frame_1_data_3&#039;, 0)  == 208 ) {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;frame_1_data_5&#039;, 0) /10.0\&lt;br /&gt;
	} else {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;OperatingVoltage&#039;, 0)\&lt;br /&gt;
	}\&lt;br /&gt;
},\&lt;br /&gt;
TotalCharge:frame_1_data_6:.* {\&lt;br /&gt;
	if (ReadingsNum($NAME, &#039;frame_1_id&#039;, 0) == 1995 and ReadingsNum($NAME, &#039;frame_1_data_1&#039;, 0)  == 7 and ReadingsNum($NAME, &#039;frame_1_data_2&#039;, 0)  == 98\&lt;br /&gt;
      and ReadingsNum($NAME, &#039;frame_1_data_3&#039;, 0)  == 33 and ReadingsNum($NAME, &#039;frame_1_data_4&#039;, 0)  == 113 ) {\&lt;br /&gt;
		return round( 2 * ReadingsNum($NAME, &#039;frame_1_data_7&#039;, 0) + ReadingsNum($NAME, &#039;frame_1_data_8&#039;, 0) / 128 , 0)\&lt;br /&gt;
	} else {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;TotalCharge&#039;, 0)\&lt;br /&gt;
	}\&lt;br /&gt;
},\&lt;br /&gt;
TotalDischarge:frame_1_data_6:.* {\&lt;br /&gt;
	if (ReadingsNum($NAME, &#039;frame_1_id&#039;, 0) == 1995 and ReadingsNum($NAME, &#039;frame_1_data_1&#039;, 0)  == 7 and ReadingsNum($NAME, &#039;frame_1_data_2&#039;, 0)  == 98\&lt;br /&gt;
  and ReadingsNum($NAME, &#039;frame_1_data_3&#039;, 0)  == 33 and ReadingsNum($NAME, &#039;frame_1_data_4&#039;, 0)  == 114 ) {\&lt;br /&gt;
		return round( 2 * ReadingsNum($NAME, &#039;frame_1_data_7&#039;, 0) + ReadingsNum($NAME, &#039;frame_1_data_8&#039;, 0) / 128 , 0)\&lt;br /&gt;
	} else {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;TotalDischarge&#039;, 0)\&lt;br /&gt;
	}\&lt;br /&gt;
},\&lt;br /&gt;
BatteryVoltage:frame_1_data_6:.* {\&lt;br /&gt;
	if (ReadingsNum($NAME, &#039;frame_1_id&#039;, 0) == 1995 and ReadingsNum($NAME, &#039;frame_1_data_1&#039;, 0)  == 16 and ReadingsNum($NAME, &#039;frame_1_data_2&#039;, 0)  == 9\&lt;br /&gt;
      and ReadingsNum($NAME, &#039;frame_1_data_3&#039;, 0)  == 98 and ReadingsNum($NAME, &#039;frame_1_data_4&#039;, 0)  == 32 ) {\&lt;br /&gt;
		return ( 256 * ReadingsNum($NAME, &#039;frame_1_data_6&#039;, 0) + ReadingsNum($NAME, &#039;frame_1_data_7&#039;, 0)) / 10.0 \&lt;br /&gt;
	} else {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;BatteryVoltage&#039;, 0)\&lt;br /&gt;
	}\&lt;br /&gt;
},\&lt;br /&gt;
SoE:frame_1_data_6:.* {\&lt;br /&gt;
	if (ReadingsNum($NAME, &#039;frame_1_id&#039;, 0) == 1994 and ReadingsNum($NAME, &#039;frame_1_data_1&#039;, 0)  == 7 and ReadingsNum($NAME, &#039;frame_1_data_2&#039;, 0)  == 98\&lt;br /&gt;
      and ReadingsNum($NAME, &#039;frame_1_data_3&#039;, 0)  == 208 and ReadingsNum($NAME, &#039;frame_1_data_4&#039;, 0)  == 98 ) {\&lt;br /&gt;
		return (256*ReadingsNum($NAME, &#039;frame_1_data_7&#039;, 0)+ReadingsNum($NAME, &#039;frame_1_data_8&#039;, 0)) / 10.0 \&lt;br /&gt;
	} else {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;SoE&#039;, 0)\&lt;br /&gt;
	}\&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Elektromobilität]]&lt;/div&gt;</summary>
		<author><name>Topos</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Ora_Funky_Cat&amp;diff=39327</id>
		<title>Ora Funky Cat</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Ora_Funky_Cat&amp;diff=39327"/>
		<updated>2024-05-08T06:13:45Z</updated>

		<summary type="html">&lt;p&gt;Topos: /* Readings */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Auf dieser Seite wird die Einbindung des E-Autos [https://www.ora-motor.de/ Ora Funky Cat] von GWM (Great Wall Motor aus China) in FHEM über die OBD2-Serviceschnittestelle erläutert.&lt;br /&gt;
&lt;br /&gt;
Benötigte Hardware: [https://www.meatpi.com/products/wican MeatPi WiCAN-OBD-C3 Adapter]&lt;br /&gt;
&lt;br /&gt;
Der WiCAN wird in die OBD2-Serviceschnittestelle (rechts neben Sicherungsfach unterhalb Lenkrad) gesteckt. Am besten über ein Verlängerungskabel oder indem man den OBD2-Stecker aus der Halterung drückt und mit dem WiCAN ins Sicherungsfach legt. &lt;br /&gt;
&lt;br /&gt;
Der WiCAN kommuniziert über den CAN-Bus des Fahrzeuges mit den Steuergeräten (ECU, Eletronic Control Unit) im Ora und kann sich über WLAN mit eine MQTT-Server verbinden. Näheres im obigen Link. Bei der WiCAN-Konfiguration mus das CAN-Protokoll &amp;quot;slcan&amp;quot; ausgewählt werden. Die Kommunikation erfolgt über den Eintrag &#039;&#039;can/tx&#039;&#039; und &#039;&#039;can/rx&#039;&#039; des WiCAN auf dem MQTT-Server. Bitte nicht vergessen, den automatischen Standby-Modus anzuschalten, ansonsten leert sich mit der Zeit die Fahrzeugbatterie.&lt;br /&gt;
&lt;br /&gt;
Die Integration eines MQTT-Servers in FHEM wird [[MQTT|&#039;&#039;&#039;hier&#039;&#039;&#039;]] erklärt. &lt;br /&gt;
&lt;br /&gt;
Ist das Auto eingeschaltet und der Adapter gesteckt, dann können über FHEM einige Fahrzeugdaten abgefragt werden. Weiter unten eine beispielhafte EInrichtung eines MQTT2-Devices. &lt;br /&gt;
&lt;br /&gt;
=== Readings ===&lt;br /&gt;
Die folgenden Werte werden mit unterer Beispielkonfiguration aus den Steuergeräten VCU (Vehicle Control Unit, ECU CAN-ID: 1930, Response CAN-ID: 1994) und BMSv2 (Batterie Management System, ECU CAN-ID: 1931, Response CAN-ID: 1995) ausgelesen:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Mileage:&#039;&#039;&#039; km-Stand - Abfrage über &amp;quot;set wican read_Mileage&amp;quot;&lt;br /&gt;
* &#039;&#039;&#039;SoC&#039;&#039;&#039;: Ladezustand Hochvolt-Antriebsbatterie in %  - Abfrage über &amp;quot;set wican read_SoC&amp;quot;&lt;br /&gt;
* &#039;&#039;&#039;TrueSoC&#039;&#039;&#039;: ein zweiter Wert. Hintergrund ist unbekannt - Abfrage über &amp;quot;set wican read_TrueSoC&amp;quot;&lt;br /&gt;
* &#039;&#039;&#039;SoE&#039;&#039;&#039;: Ladezustand Hochvolt-Antriebsbatterie in kW - Abfrage über &amp;quot;set wican read_SoE&amp;quot;&lt;br /&gt;
* &#039;&#039;&#039;SoH&#039;&#039;&#039;: Gesundheitszustand der Hochvolt-Antriebsbatterie in % - Abfrage über &amp;quot;set wican read_SoH&amp;quot;&lt;br /&gt;
* &#039;&#039;&#039;OperatingVoltage&#039;&#039;&#039;: Spannung Niedervolt-Fahrzeugbatterie in V - Abfrage über &amp;quot;set wican read_OperatingVoltage&amp;quot;&lt;br /&gt;
* &#039;&#039;&#039;BatteryVoltage&#039;&#039;&#039;: Spannung Hochvolt-Antriebsbatterie in V - Abfrage über &amp;quot;set wican read_BatteryVoltage&amp;quot;&lt;br /&gt;
* &#039;&#039;&#039;TotalCharge&#039;&#039;&#039;: Durch die Batterie aufgenommene Stromleistung in Ah (inklusive Rekuperation während des Fahrens) - Abfrage über &amp;quot;set wican read_Total Charge&amp;quot; Die Multiplikation mit 4&amp;amp;nbsp;kV scheint die hinzugefügte HV-Batterieleistung abzüglich der Ladeverluste zu ergeben.&lt;br /&gt;
* &#039;&#039;&#039;TotalDischarge&#039;&#039;&#039;: Von der Hochvolt-Batterie abgezogene Stromleistung in Ah - Abfrage über &amp;quot;set wican read_TotalDischarge&amp;quot; Die Multiplikation mit 4&amp;amp;nbsp;kV scheint die abgerufene HV-Batterieleistung zu ergeben.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Das erste Auslesen kann über ein notify angestossen werden, sobald der WiCAN den Status &amp;quot;online&amp;quot; hat. &amp;lt;syntaxhighlight lang=&amp;quot;cfg&amp;quot;&amp;gt;&lt;br /&gt;
define wican_online notify wican:status:.online set wican read_SoC;; sleep 1;; set wican read_TrueSoC;; sleep 1;; set wican read_Mileage;; sleep 1;; set wican read_OpVoltage;; sleep 1;; set wican read_SoH;; sleep 1;; set wican read_TotalCharge;; sleep 1;; set wican read_TotalDischarge;; sleep 1;; set wican read_BatteryVoltage;; sleep 1;; set wican read_SoE&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Die weiteren Abfrage können über einen Timer erfolgen Der Timer kann mit einem notify ein- und wieder ausgeschaltet werden.&amp;lt;syntaxhighlight lang=&amp;quot;cfg&amp;quot;&amp;gt;&lt;br /&gt;
define wican_check at +*00:01:00 set wican read_SoC;; sleep 1;; set wican read_TrueSoC;; sleep 1;; set wican read_Mileage;; sleep 1;; set wican read_OpVoltage;; sleep 1;; set wican read_SoH;; sleep 1;; set wican read_TotalCharge;; sleep 1;; set wican read_TotalDischarge;; sleep 1;; set wican read_BatteryVoltage;; sleep 1;; set wican read_SoE&lt;br /&gt;
&lt;br /&gt;
define wican_check_active notify wican:status:.online set wican_check active&lt;br /&gt;
&lt;br /&gt;
define wican_check_inactive notify wican:status:.offline set wican_check inactive&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Beispielhafte Einrichtung des WiCAN im Ora Funky Cat als MQTT2-Device ===&lt;br /&gt;
Ab der WiCAN [https://github.com/meatpiHQ/wican-fw/releases Firmware] v2.98 (13. April 2024) kann die Benennung des Eintrages im MQTT-Server frei gewählt werden. Die untere Konfiguration geht von folgender Benennung aus: &lt;br /&gt;
&lt;br /&gt;
* TX Topic: &#039;&#039;wican/ora/can/tx&#039;&#039;&lt;br /&gt;
* RX Topic: &#039;&#039;wican/ora/can/tx&#039;&#039;&lt;br /&gt;
* Status Topic: &#039;&#039;wican/ora/can/status&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cfg&amp;quot;&amp;gt;&lt;br /&gt;
define wican MQTT2_DEVICE&lt;br /&gt;
attr wican alias Ora&lt;br /&gt;
attr wican stateFormat B: SoC% M: Mileage km (status)&lt;br /&gt;
attr wican event-on-change-reading status&lt;br /&gt;
attr wican event-on-update-reading frame_1_data_6,SoC&lt;br /&gt;
attr wican DbLogExclude .*&lt;br /&gt;
attr wican DbLogInclude SoC:3600&lt;br /&gt;
attr wican readingList wican/ora/can/status:.* {json2nameValue($EVENT)}\&lt;br /&gt;
 wican/ora/can/rx:.* {json2nameValue($EVENT)}&lt;br /&gt;
attr wican setList read_SoC:noArg wican/ora/can/tx {&amp;quot;bus&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;tx&amp;quot;,&amp;quot;ts&amp;quot;:49539,&amp;quot;frame&amp;quot;:[{&amp;quot;id&amp;quot;:1931,&amp;quot;dlc&amp;quot;:8,&amp;quot;rtr&amp;quot;:false,&amp;quot;extd&amp;quot;:false,&amp;quot;data&amp;quot;:[3,34,32,80,170,170,170,170]}]}\&lt;br /&gt;
read_TrueSoC:noArg wican/ora/can/tx {&amp;quot;bus&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;tx&amp;quot;,&amp;quot;ts&amp;quot;:27825,&amp;quot;frame&amp;quot;:[{&amp;quot;id&amp;quot;:1931,&amp;quot;dlc&amp;quot;:8,&amp;quot;rtr&amp;quot;:false,&amp;quot;extd&amp;quot;:false,&amp;quot;data&amp;quot;:[3,34,3,8,170,170,170,170]}]}\&lt;br /&gt;
read_SoH:noArg wican/ora/can/tx {&amp;quot;bus&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;tx&amp;quot;,&amp;quot;ts&amp;quot;:12016,&amp;quot;frame&amp;quot;:[{&amp;quot;id&amp;quot;:1931,&amp;quot;dlc&amp;quot;:8,&amp;quot;rtr&amp;quot;:false,&amp;quot;extd&amp;quot;:false,&amp;quot;data&amp;quot;:[3,34,32,81,170,170,170,170]}]}\&lt;br /&gt;
read_SoE:noArg wican/ora/can/tx {&amp;quot;bus&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;tx&amp;quot;,&amp;quot;ts&amp;quot;:17777,&amp;quot;frame&amp;quot;:[{&amp;quot;id&amp;quot;:1930,&amp;quot;dlc&amp;quot;:8,&amp;quot;rtr&amp;quot;:false,&amp;quot;extd&amp;quot;:false,&amp;quot;data&amp;quot;:[3,34,208,98,170,170,170,170]}]}\&lt;br /&gt;
read_OpVoltage:noArg wican/ora/can/tx {&amp;quot;bus&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;tx&amp;quot;,&amp;quot;ts&amp;quot;:17645,&amp;quot;frame&amp;quot;:[{&amp;quot;id&amp;quot;:1931,&amp;quot;dlc&amp;quot;:8,&amp;quot;rtr&amp;quot;:false,&amp;quot;extd&amp;quot;:false,&amp;quot;data&amp;quot;:[3,34,208,3,170,170,170,170]}]}\&lt;br /&gt;
read_Mileage:noArg wican/ora/can/tx {&amp;quot;bus&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;tx&amp;quot;,&amp;quot;ts&amp;quot;:35674,&amp;quot;frame&amp;quot;:[{&amp;quot;id&amp;quot;:1931,&amp;quot;dlc&amp;quot;:8,&amp;quot;rtr&amp;quot;:false,&amp;quot;extd&amp;quot;:false,&amp;quot;data&amp;quot;:[3,34,208,4,170,170,170,170]}]}\&lt;br /&gt;
read_TotalCharge:noArg wican/ora/can/tx {&amp;quot;bus&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;tx&amp;quot;,&amp;quot;ts&amp;quot;:28695,&amp;quot;frame&amp;quot;:[{&amp;quot;id&amp;quot;:1931,&amp;quot;dlc&amp;quot;:8,&amp;quot;rtr&amp;quot;:false,&amp;quot;extd&amp;quot;:false,&amp;quot;data&amp;quot;:[3,34,33,113,170,170,170,170]}]}\&lt;br /&gt;
read_TotalDischarge:noArg wican/ora/can/tx {&amp;quot;bus&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;tx&amp;quot;,&amp;quot;ts&amp;quot;:28695,&amp;quot;frame&amp;quot;:[{&amp;quot;id&amp;quot;:1931,&amp;quot;dlc&amp;quot;:8,&amp;quot;rtr&amp;quot;:false,&amp;quot;extd&amp;quot;:false,&amp;quot;data&amp;quot;:[3,34,33,114,170,170,170,170]}]}\&lt;br /&gt;
read_BatteryVoltage:noArg wican/ora/can/tx {&amp;quot;bus&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;tx&amp;quot;,&amp;quot;ts&amp;quot;:58591,&amp;quot;frame&amp;quot;:[{&amp;quot;id&amp;quot;:1931,&amp;quot;dlc&amp;quot;:8,&amp;quot;rtr&amp;quot;:false,&amp;quot;extd&amp;quot;:false,&amp;quot;data&amp;quot;:[3,34,32,3,170,170,170,170]}]}&lt;br /&gt;
attr wican userReadings SoC:frame_1_data_6:.* {\&lt;br /&gt;
	if (ReadingsNum($NAME, &#039;frame_1_id&#039;, 0) == 1995 and ReadingsNum($NAME, &#039;frame_1_data_1&#039;, 0)  == 5 and ReadingsNum($NAME, &#039;frame_1_data_2&#039;, 0)  == 98\&lt;br /&gt;
      and ReadingsNum($NAME, &#039;frame_1_data_3&#039;, 0)  == 32 and ReadingsNum($NAME, &#039;frame_1_data_4&#039;, 0)  == 80 ) {\&lt;br /&gt;
		return (ReadingsNum($NAME, &#039;frame_1_data_5&#039;, 0) * 256+ReadingsNum($NAME, &#039;frame_1_data_6&#039;, 0))/10.0\&lt;br /&gt;
	} else {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;SoC&#039;, 0)\&lt;br /&gt;
	}\&lt;br /&gt;
},\&lt;br /&gt;
SoH:frame_1_data_6:.* {\&lt;br /&gt;
	if (ReadingsNum($NAME, &#039;frame_1_id&#039;, 0) == 1995 and ReadingsNum($NAME, &#039;frame_1_data_1&#039;, 0)  == 5 and ReadingsNum($NAME, &#039;frame_1_data_2&#039;, 0)  == 98\&lt;br /&gt;
      and ReadingsNum($NAME, &#039;frame_1_data_3&#039;, 0)  == 32 and ReadingsNum($NAME, &#039;frame_1_data_4&#039;, 0)  == 81 ) {\&lt;br /&gt;
		return (ReadingsNum($NAME, &#039;frame_1_data_5&#039;, 0) * 256 + ReadingsNum($NAME, &#039;frame_1_data_6&#039;, 0))/10.0\&lt;br /&gt;
	} else {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;SoH&#039;, 0)\&lt;br /&gt;
	}\&lt;br /&gt;
},\&lt;br /&gt;
TrueSoC:frame_1_data_6:.* {\&lt;br /&gt;
	if (ReadingsNum($NAME, &#039;frame_1_id&#039;, 0) == 1995 and ReadingsNum($NAME, &#039;frame_1_data_3&#039;, 0)  == 3) {\&lt;br /&gt;
		return (ReadingsNum($NAME, &#039;frame_1_data_5&#039;, 0) * 256 + ReadingsNum($NAME, &#039;frame_1_data_6&#039;, 0))/10.0\&lt;br /&gt;
	} else {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;TrueSoC&#039;, 0)\&lt;br /&gt;
	}\&lt;br /&gt;
},\&lt;br /&gt;
Mileage:frame_1_data_6:.* {\&lt;br /&gt;
	if (ReadingsNum($NAME, &#039;frame_1_id&#039;, 0) == 1995 and ReadingsNum($NAME, &#039;frame_1_data_1&#039;, 0)  == 6 and ReadingsNum($NAME, &#039;frame_1_data_2&#039;, 0)  == 98\&lt;br /&gt;
      and ReadingsNum($NAME, &#039;frame_1_data_3&#039;, 0)  == 208 ) {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;frame_1_data_5&#039;, 0) * 65536 + ReadingsNum($NAME, &#039;frame_1_data_6&#039;, 0) * 256 + ReadingsNum($NAME, &#039;frame_1_data_7&#039;, 0)\&lt;br /&gt;
	} else {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;Mileage&#039;, 0)\&lt;br /&gt;
	}\&lt;br /&gt;
},\&lt;br /&gt;
OperatingVoltage:frame_1_data_6:.* {\&lt;br /&gt;
	if (ReadingsNum($NAME, &#039;frame_1_id&#039;, 0) == 1995 and ReadingsNum($NAME, &#039;frame_1_data_1&#039;, 0)  == 4 and ReadingsNum($NAME, &#039;frame_1_data_2&#039;, 0)  == 98\&lt;br /&gt;
      and ReadingsNum($NAME, &#039;frame_1_data_3&#039;, 0)  == 208 ) {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;frame_1_data_5&#039;, 0) /10.0\&lt;br /&gt;
	} else {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;OperatingVoltage&#039;, 0)\&lt;br /&gt;
	}\&lt;br /&gt;
},\&lt;br /&gt;
TotalCharge:frame_1_data_6:.* {\&lt;br /&gt;
	if (ReadingsNum($NAME, &#039;frame_1_id&#039;, 0) == 1995 and ReadingsNum($NAME, &#039;frame_1_data_1&#039;, 0)  == 7 and ReadingsNum($NAME, &#039;frame_1_data_2&#039;, 0)  == 98\&lt;br /&gt;
      and ReadingsNum($NAME, &#039;frame_1_data_3&#039;, 0)  == 33 and ReadingsNum($NAME, &#039;frame_1_data_4&#039;, 0)  == 113 ) {\&lt;br /&gt;
		return round( 2 * ReadingsNum($NAME, &#039;frame_1_data_7&#039;, 0) + ReadingsNum($NAME, &#039;frame_1_data_8&#039;, 0) / 128 , 0)\&lt;br /&gt;
	} else {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;TotalCharge&#039;, 0)\&lt;br /&gt;
	}\&lt;br /&gt;
},\&lt;br /&gt;
TotalDischarge:frame_1_data_6:.* {\&lt;br /&gt;
	if (ReadingsNum($NAME, &#039;frame_1_id&#039;, 0) == 1995 and ReadingsNum($NAME, &#039;frame_1_data_1&#039;, 0)  == 7 and ReadingsNum($NAME, &#039;frame_1_data_2&#039;, 0)  == 98\&lt;br /&gt;
  and ReadingsNum($NAME, &#039;frame_1_data_3&#039;, 0)  == 33 and ReadingsNum($NAME, &#039;frame_1_data_4&#039;, 0)  == 114 ) {\&lt;br /&gt;
		return round( 2 * ReadingsNum($NAME, &#039;frame_1_data_7&#039;, 0) + ReadingsNum($NAME, &#039;frame_1_data_8&#039;, 0) / 128 , 0)\&lt;br /&gt;
	} else {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;TotalDischarge&#039;, 0)\&lt;br /&gt;
	}\&lt;br /&gt;
},\&lt;br /&gt;
BatteryVoltage:frame_1_data_6:.* {\&lt;br /&gt;
	if (ReadingsNum($NAME, &#039;frame_1_id&#039;, 0) == 1995 and ReadingsNum($NAME, &#039;frame_1_data_1&#039;, 0)  == 16 and ReadingsNum($NAME, &#039;frame_1_data_2&#039;, 0)  == 9\&lt;br /&gt;
      and ReadingsNum($NAME, &#039;frame_1_data_3&#039;, 0)  == 98 and ReadingsNum($NAME, &#039;frame_1_data_4&#039;, 0)  == 32 ) {\&lt;br /&gt;
		return ( 256 * ReadingsNum($NAME, &#039;frame_1_data_6&#039;, 0) + ReadingsNum($NAME, &#039;frame_1_data_7&#039;, 0)) / 10.0 \&lt;br /&gt;
	} else {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;BatteryVoltage&#039;, 0)\&lt;br /&gt;
	}\&lt;br /&gt;
},\&lt;br /&gt;
SoE:frame_1_data_6:.* {\&lt;br /&gt;
	if (ReadingsNum($NAME, &#039;frame_1_id&#039;, 0) == 1994 and ReadingsNum($NAME, &#039;frame_1_data_1&#039;, 0)  == 7 and ReadingsNum($NAME, &#039;frame_1_data_2&#039;, 0)  == 98\&lt;br /&gt;
      and ReadingsNum($NAME, &#039;frame_1_data_3&#039;, 0)  == 208 and ReadingsNum($NAME, &#039;frame_1_data_4&#039;, 0)  == 98 ) {\&lt;br /&gt;
		return (256*ReadingsNum($NAME, &#039;frame_1_data_7&#039;, 0)+ReadingsNum($NAME, &#039;frame_1_data_8&#039;, 0)) / 10.0 \&lt;br /&gt;
	} else {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;SoE&#039;, 0)\&lt;br /&gt;
	}\&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Elektromobilität]]&lt;/div&gt;</summary>
		<author><name>Topos</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Ora_Funky_Cat&amp;diff=39326</id>
		<title>Ora Funky Cat</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Ora_Funky_Cat&amp;diff=39326"/>
		<updated>2024-05-08T06:12:11Z</updated>

		<summary type="html">&lt;p&gt;Topos: /* Readings */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Auf dieser Seite wird die Einbindung des E-Autos [https://www.ora-motor.de/ Ora Funky Cat] von GWM (Great Wall Motor aus China) in FHEM über die OBD2-Serviceschnittestelle erläutert.&lt;br /&gt;
&lt;br /&gt;
Benötigte Hardware: [https://www.meatpi.com/products/wican MeatPi WiCAN-OBD-C3 Adapter]&lt;br /&gt;
&lt;br /&gt;
Der WiCAN wird in die OBD2-Serviceschnittestelle (rechts neben Sicherungsfach unterhalb Lenkrad) gesteckt. Am besten über ein Verlängerungskabel oder indem man den OBD2-Stecker aus der Halterung drückt und mit dem WiCAN ins Sicherungsfach legt. &lt;br /&gt;
&lt;br /&gt;
Der WiCAN kommuniziert über den CAN-Bus des Fahrzeuges mit den Steuergeräten (ECU, Eletronic Control Unit) im Ora und kann sich über WLAN mit eine MQTT-Server verbinden. Näheres im obigen Link. Bei der WiCAN-Konfiguration mus das CAN-Protokoll &amp;quot;slcan&amp;quot; ausgewählt werden. Die Kommunikation erfolgt über den Eintrag &#039;&#039;can/tx&#039;&#039; und &#039;&#039;can/rx&#039;&#039; des WiCAN auf dem MQTT-Server. Bitte nicht vergessen, den automatischen Standby-Modus anzuschalten, ansonsten leert sich mit der Zeit die Fahrzeugbatterie.&lt;br /&gt;
&lt;br /&gt;
Die Integration eines MQTT-Servers in FHEM wird [[MQTT|&#039;&#039;&#039;hier&#039;&#039;&#039;]] erklärt. &lt;br /&gt;
&lt;br /&gt;
Ist das Auto eingeschaltet und der Adapter gesteckt, dann können über FHEM einige Fahrzeugdaten abgefragt werden. Weiter unten eine beispielhafte EInrichtung eines MQTT2-Devices. &lt;br /&gt;
&lt;br /&gt;
=== Readings ===&lt;br /&gt;
Die folgenden Werte werden mit unterer Beispielkonfiguration aus den Steuergeräten VCU (Vehicle Control Unit, ECU CAN-ID: 1930, Response CAN-ID: 1994) und BMSv2 (Batterie Management System, ECU CAN-ID: 1931, Response CAN-ID: 1995) ausgelesen:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Mileage:&#039;&#039;&#039; km-Stand - Abfrage über &amp;quot;set wican read_Mileage&amp;quot;&lt;br /&gt;
* &#039;&#039;&#039;SoC&#039;&#039;&#039;: Ladezustand Hochvolt-Antriebsbatterie in %  - Abfrage über &amp;quot;set wican read_SoC&amp;quot;&lt;br /&gt;
* &#039;&#039;&#039;TrueSoC&#039;&#039;&#039;: ein zweiter Wert. Hintergrund ist unbekannt - Abfrage über &amp;quot;set wican read_TrueSoC&amp;quot;&lt;br /&gt;
* &#039;&#039;&#039;SoE&#039;&#039;&#039;: Ladezustand Hochvolt-Antriebsbatterie in kW - Abfrage über &amp;quot;set wican read_SoE&amp;quot;&lt;br /&gt;
* &#039;&#039;&#039;SoH&#039;&#039;&#039;: Gesundheitszustand der Hochvolt-Antriebsbatterie in % - Abfrage über &amp;quot;set wican read_SoH&amp;quot;&lt;br /&gt;
* &#039;&#039;&#039;OperatingVoltage&#039;&#039;&#039;: Spannung Niedervolt-Fahrzeugbatterie in V - Abfrage über &amp;quot;set wican read_OperatingVoltage&amp;quot;&lt;br /&gt;
* &#039;&#039;&#039;BatteryVoltage&#039;&#039;&#039;: Spannung Hochvolt-Antriebsbatterie in V - Abfrage über &amp;quot;set wican read_BatteryVoltage&amp;quot;&lt;br /&gt;
* &#039;&#039;&#039;TotalCharge&#039;&#039;&#039;: Durch die Batterie aufgenommene Stromleistung in Ah (inklusive Rekuperation während des Fahrens) - Abfrage über &amp;quot;set wican read_Total Charge&amp;quot; Die Multiplikation mit 4&amp;amp;nbsp;kV scheint die hinzugefügte elektrische Leistung zu ergeben.&lt;br /&gt;
* &#039;&#039;&#039;TotalDischarge&#039;&#039;&#039;: Von der Hochvolt-Batterie abgezogene Stromleistung in Ah - Abfrage über &amp;quot;set wican read_TotalDischarge&amp;quot; Die Multiplikation mit 4&amp;amp;nbsp;kV scheint die abgerufene elektrische Leistung zu ergeben.&lt;br /&gt;
&lt;br /&gt;
Das erste Auslesen kann über ein notify angestossen werden, sobald der WiCAN den Status &amp;quot;online&amp;quot; hat. &amp;lt;syntaxhighlight lang=&amp;quot;cfg&amp;quot;&amp;gt;&lt;br /&gt;
define wican_online notify wican:status:.online set wican read_SoC;; sleep 1;; set wican read_TrueSoC;; sleep 1;; set wican read_Mileage;; sleep 1;; set wican read_OpVoltage;; sleep 1;; set wican read_SoH;; sleep 1;; set wican read_TotalCharge;; sleep 1;; set wican read_TotalDischarge;; sleep 1;; set wican read_BatteryVoltage;; sleep 1;; set wican read_SoE&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Die weiteren Abfrage können über einen Timer erfolgen Der Timer kann mit einem notify ein- und wieder ausgeschaltet werden.&amp;lt;syntaxhighlight lang=&amp;quot;cfg&amp;quot;&amp;gt;&lt;br /&gt;
define wican_check at +*00:01:00 set wican read_SoC;; sleep 1;; set wican read_TrueSoC;; sleep 1;; set wican read_Mileage;; sleep 1;; set wican read_OpVoltage;; sleep 1;; set wican read_SoH;; sleep 1;; set wican read_TotalCharge;; sleep 1;; set wican read_TotalDischarge;; sleep 1;; set wican read_BatteryVoltage;; sleep 1;; set wican read_SoE&lt;br /&gt;
&lt;br /&gt;
define wican_check_active notify wican:status:.online set wican_check active&lt;br /&gt;
&lt;br /&gt;
define wican_check_inactive notify wican:status:.offline set wican_check inactive&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Beispielhafte Einrichtung des WiCAN im Ora Funky Cat als MQTT2-Device ===&lt;br /&gt;
Ab der WiCAN [https://github.com/meatpiHQ/wican-fw/releases Firmware] v2.98 (13. April 2024) kann die Benennung des Eintrages im MQTT-Server frei gewählt werden. Die untere Konfiguration geht von folgender Benennung aus: &lt;br /&gt;
&lt;br /&gt;
* TX Topic: &#039;&#039;wican/ora/can/tx&#039;&#039;&lt;br /&gt;
* RX Topic: &#039;&#039;wican/ora/can/tx&#039;&#039;&lt;br /&gt;
* Status Topic: &#039;&#039;wican/ora/can/status&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cfg&amp;quot;&amp;gt;&lt;br /&gt;
define wican MQTT2_DEVICE&lt;br /&gt;
attr wican alias Ora&lt;br /&gt;
attr wican stateFormat B: SoC% M: Mileage km (status)&lt;br /&gt;
attr wican event-on-change-reading status&lt;br /&gt;
attr wican event-on-update-reading frame_1_data_6,SoC&lt;br /&gt;
attr wican DbLogExclude .*&lt;br /&gt;
attr wican DbLogInclude SoC:3600&lt;br /&gt;
attr wican readingList wican/ora/can/status:.* {json2nameValue($EVENT)}\&lt;br /&gt;
 wican/ora/can/rx:.* {json2nameValue($EVENT)}&lt;br /&gt;
attr wican setList read_SoC:noArg wican/ora/can/tx {&amp;quot;bus&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;tx&amp;quot;,&amp;quot;ts&amp;quot;:49539,&amp;quot;frame&amp;quot;:[{&amp;quot;id&amp;quot;:1931,&amp;quot;dlc&amp;quot;:8,&amp;quot;rtr&amp;quot;:false,&amp;quot;extd&amp;quot;:false,&amp;quot;data&amp;quot;:[3,34,32,80,170,170,170,170]}]}\&lt;br /&gt;
read_TrueSoC:noArg wican/ora/can/tx {&amp;quot;bus&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;tx&amp;quot;,&amp;quot;ts&amp;quot;:27825,&amp;quot;frame&amp;quot;:[{&amp;quot;id&amp;quot;:1931,&amp;quot;dlc&amp;quot;:8,&amp;quot;rtr&amp;quot;:false,&amp;quot;extd&amp;quot;:false,&amp;quot;data&amp;quot;:[3,34,3,8,170,170,170,170]}]}\&lt;br /&gt;
read_SoH:noArg wican/ora/can/tx {&amp;quot;bus&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;tx&amp;quot;,&amp;quot;ts&amp;quot;:12016,&amp;quot;frame&amp;quot;:[{&amp;quot;id&amp;quot;:1931,&amp;quot;dlc&amp;quot;:8,&amp;quot;rtr&amp;quot;:false,&amp;quot;extd&amp;quot;:false,&amp;quot;data&amp;quot;:[3,34,32,81,170,170,170,170]}]}\&lt;br /&gt;
read_SoE:noArg wican/ora/can/tx {&amp;quot;bus&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;tx&amp;quot;,&amp;quot;ts&amp;quot;:17777,&amp;quot;frame&amp;quot;:[{&amp;quot;id&amp;quot;:1930,&amp;quot;dlc&amp;quot;:8,&amp;quot;rtr&amp;quot;:false,&amp;quot;extd&amp;quot;:false,&amp;quot;data&amp;quot;:[3,34,208,98,170,170,170,170]}]}\&lt;br /&gt;
read_OpVoltage:noArg wican/ora/can/tx {&amp;quot;bus&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;tx&amp;quot;,&amp;quot;ts&amp;quot;:17645,&amp;quot;frame&amp;quot;:[{&amp;quot;id&amp;quot;:1931,&amp;quot;dlc&amp;quot;:8,&amp;quot;rtr&amp;quot;:false,&amp;quot;extd&amp;quot;:false,&amp;quot;data&amp;quot;:[3,34,208,3,170,170,170,170]}]}\&lt;br /&gt;
read_Mileage:noArg wican/ora/can/tx {&amp;quot;bus&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;tx&amp;quot;,&amp;quot;ts&amp;quot;:35674,&amp;quot;frame&amp;quot;:[{&amp;quot;id&amp;quot;:1931,&amp;quot;dlc&amp;quot;:8,&amp;quot;rtr&amp;quot;:false,&amp;quot;extd&amp;quot;:false,&amp;quot;data&amp;quot;:[3,34,208,4,170,170,170,170]}]}\&lt;br /&gt;
read_TotalCharge:noArg wican/ora/can/tx {&amp;quot;bus&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;tx&amp;quot;,&amp;quot;ts&amp;quot;:28695,&amp;quot;frame&amp;quot;:[{&amp;quot;id&amp;quot;:1931,&amp;quot;dlc&amp;quot;:8,&amp;quot;rtr&amp;quot;:false,&amp;quot;extd&amp;quot;:false,&amp;quot;data&amp;quot;:[3,34,33,113,170,170,170,170]}]}\&lt;br /&gt;
read_TotalDischarge:noArg wican/ora/can/tx {&amp;quot;bus&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;tx&amp;quot;,&amp;quot;ts&amp;quot;:28695,&amp;quot;frame&amp;quot;:[{&amp;quot;id&amp;quot;:1931,&amp;quot;dlc&amp;quot;:8,&amp;quot;rtr&amp;quot;:false,&amp;quot;extd&amp;quot;:false,&amp;quot;data&amp;quot;:[3,34,33,114,170,170,170,170]}]}\&lt;br /&gt;
read_BatteryVoltage:noArg wican/ora/can/tx {&amp;quot;bus&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;tx&amp;quot;,&amp;quot;ts&amp;quot;:58591,&amp;quot;frame&amp;quot;:[{&amp;quot;id&amp;quot;:1931,&amp;quot;dlc&amp;quot;:8,&amp;quot;rtr&amp;quot;:false,&amp;quot;extd&amp;quot;:false,&amp;quot;data&amp;quot;:[3,34,32,3,170,170,170,170]}]}&lt;br /&gt;
attr wican userReadings SoC:frame_1_data_6:.* {\&lt;br /&gt;
	if (ReadingsNum($NAME, &#039;frame_1_id&#039;, 0) == 1995 and ReadingsNum($NAME, &#039;frame_1_data_1&#039;, 0)  == 5 and ReadingsNum($NAME, &#039;frame_1_data_2&#039;, 0)  == 98\&lt;br /&gt;
      and ReadingsNum($NAME, &#039;frame_1_data_3&#039;, 0)  == 32 and ReadingsNum($NAME, &#039;frame_1_data_4&#039;, 0)  == 80 ) {\&lt;br /&gt;
		return (ReadingsNum($NAME, &#039;frame_1_data_5&#039;, 0) * 256+ReadingsNum($NAME, &#039;frame_1_data_6&#039;, 0))/10.0\&lt;br /&gt;
	} else {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;SoC&#039;, 0)\&lt;br /&gt;
	}\&lt;br /&gt;
},\&lt;br /&gt;
SoH:frame_1_data_6:.* {\&lt;br /&gt;
	if (ReadingsNum($NAME, &#039;frame_1_id&#039;, 0) == 1995 and ReadingsNum($NAME, &#039;frame_1_data_1&#039;, 0)  == 5 and ReadingsNum($NAME, &#039;frame_1_data_2&#039;, 0)  == 98\&lt;br /&gt;
      and ReadingsNum($NAME, &#039;frame_1_data_3&#039;, 0)  == 32 and ReadingsNum($NAME, &#039;frame_1_data_4&#039;, 0)  == 81 ) {\&lt;br /&gt;
		return (ReadingsNum($NAME, &#039;frame_1_data_5&#039;, 0) * 256 + ReadingsNum($NAME, &#039;frame_1_data_6&#039;, 0))/10.0\&lt;br /&gt;
	} else {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;SoH&#039;, 0)\&lt;br /&gt;
	}\&lt;br /&gt;
},\&lt;br /&gt;
TrueSoC:frame_1_data_6:.* {\&lt;br /&gt;
	if (ReadingsNum($NAME, &#039;frame_1_id&#039;, 0) == 1995 and ReadingsNum($NAME, &#039;frame_1_data_3&#039;, 0)  == 3) {\&lt;br /&gt;
		return (ReadingsNum($NAME, &#039;frame_1_data_5&#039;, 0) * 256 + ReadingsNum($NAME, &#039;frame_1_data_6&#039;, 0))/10.0\&lt;br /&gt;
	} else {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;TrueSoC&#039;, 0)\&lt;br /&gt;
	}\&lt;br /&gt;
},\&lt;br /&gt;
Mileage:frame_1_data_6:.* {\&lt;br /&gt;
	if (ReadingsNum($NAME, &#039;frame_1_id&#039;, 0) == 1995 and ReadingsNum($NAME, &#039;frame_1_data_1&#039;, 0)  == 6 and ReadingsNum($NAME, &#039;frame_1_data_2&#039;, 0)  == 98\&lt;br /&gt;
      and ReadingsNum($NAME, &#039;frame_1_data_3&#039;, 0)  == 208 ) {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;frame_1_data_5&#039;, 0) * 65536 + ReadingsNum($NAME, &#039;frame_1_data_6&#039;, 0) * 256 + ReadingsNum($NAME, &#039;frame_1_data_7&#039;, 0)\&lt;br /&gt;
	} else {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;Mileage&#039;, 0)\&lt;br /&gt;
	}\&lt;br /&gt;
},\&lt;br /&gt;
OperatingVoltage:frame_1_data_6:.* {\&lt;br /&gt;
	if (ReadingsNum($NAME, &#039;frame_1_id&#039;, 0) == 1995 and ReadingsNum($NAME, &#039;frame_1_data_1&#039;, 0)  == 4 and ReadingsNum($NAME, &#039;frame_1_data_2&#039;, 0)  == 98\&lt;br /&gt;
      and ReadingsNum($NAME, &#039;frame_1_data_3&#039;, 0)  == 208 ) {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;frame_1_data_5&#039;, 0) /10.0\&lt;br /&gt;
	} else {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;OperatingVoltage&#039;, 0)\&lt;br /&gt;
	}\&lt;br /&gt;
},\&lt;br /&gt;
TotalCharge:frame_1_data_6:.* {\&lt;br /&gt;
	if (ReadingsNum($NAME, &#039;frame_1_id&#039;, 0) == 1995 and ReadingsNum($NAME, &#039;frame_1_data_1&#039;, 0)  == 7 and ReadingsNum($NAME, &#039;frame_1_data_2&#039;, 0)  == 98\&lt;br /&gt;
      and ReadingsNum($NAME, &#039;frame_1_data_3&#039;, 0)  == 33 and ReadingsNum($NAME, &#039;frame_1_data_4&#039;, 0)  == 113 ) {\&lt;br /&gt;
		return round( 2 * ReadingsNum($NAME, &#039;frame_1_data_7&#039;, 0) + ReadingsNum($NAME, &#039;frame_1_data_8&#039;, 0) / 128 , 0)\&lt;br /&gt;
	} else {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;TotalCharge&#039;, 0)\&lt;br /&gt;
	}\&lt;br /&gt;
},\&lt;br /&gt;
TotalDischarge:frame_1_data_6:.* {\&lt;br /&gt;
	if (ReadingsNum($NAME, &#039;frame_1_id&#039;, 0) == 1995 and ReadingsNum($NAME, &#039;frame_1_data_1&#039;, 0)  == 7 and ReadingsNum($NAME, &#039;frame_1_data_2&#039;, 0)  == 98\&lt;br /&gt;
  and ReadingsNum($NAME, &#039;frame_1_data_3&#039;, 0)  == 33 and ReadingsNum($NAME, &#039;frame_1_data_4&#039;, 0)  == 114 ) {\&lt;br /&gt;
		return round( 2 * ReadingsNum($NAME, &#039;frame_1_data_7&#039;, 0) + ReadingsNum($NAME, &#039;frame_1_data_8&#039;, 0) / 128 , 0)\&lt;br /&gt;
	} else {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;TotalDischarge&#039;, 0)\&lt;br /&gt;
	}\&lt;br /&gt;
},\&lt;br /&gt;
BatteryVoltage:frame_1_data_6:.* {\&lt;br /&gt;
	if (ReadingsNum($NAME, &#039;frame_1_id&#039;, 0) == 1995 and ReadingsNum($NAME, &#039;frame_1_data_1&#039;, 0)  == 16 and ReadingsNum($NAME, &#039;frame_1_data_2&#039;, 0)  == 9\&lt;br /&gt;
      and ReadingsNum($NAME, &#039;frame_1_data_3&#039;, 0)  == 98 and ReadingsNum($NAME, &#039;frame_1_data_4&#039;, 0)  == 32 ) {\&lt;br /&gt;
		return ( 256 * ReadingsNum($NAME, &#039;frame_1_data_6&#039;, 0) + ReadingsNum($NAME, &#039;frame_1_data_7&#039;, 0)) / 10.0 \&lt;br /&gt;
	} else {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;BatteryVoltage&#039;, 0)\&lt;br /&gt;
	}\&lt;br /&gt;
},\&lt;br /&gt;
SoE:frame_1_data_6:.* {\&lt;br /&gt;
	if (ReadingsNum($NAME, &#039;frame_1_id&#039;, 0) == 1994 and ReadingsNum($NAME, &#039;frame_1_data_1&#039;, 0)  == 7 and ReadingsNum($NAME, &#039;frame_1_data_2&#039;, 0)  == 98\&lt;br /&gt;
      and ReadingsNum($NAME, &#039;frame_1_data_3&#039;, 0)  == 208 and ReadingsNum($NAME, &#039;frame_1_data_4&#039;, 0)  == 98 ) {\&lt;br /&gt;
		return (256*ReadingsNum($NAME, &#039;frame_1_data_7&#039;, 0)+ReadingsNum($NAME, &#039;frame_1_data_8&#039;, 0)) / 10.0 \&lt;br /&gt;
	} else {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;SoE&#039;, 0)\&lt;br /&gt;
	}\&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Elektromobilität]]&lt;/div&gt;</summary>
		<author><name>Topos</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Ora_Funky_Cat&amp;diff=39271</id>
		<title>Ora Funky Cat</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Ora_Funky_Cat&amp;diff=39271"/>
		<updated>2024-04-21T11:59:32Z</updated>

		<summary type="html">&lt;p&gt;Topos: /* Beispielhafte Einrichtung des WiCAN im Ora Funky Cat als MQTT2-Device */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Auf dieser Seite wird die Einbindung des E-Autos [https://www.ora-motor.de/ Ora Funky Cat] von GWM (Great Wall Motor aus China) in FHEM über die OBD2-Serviceschnittestelle erläutert.&lt;br /&gt;
&lt;br /&gt;
Benötigte Hardware: [https://www.meatpi.com/products/wican MeatPi WiCAN-OBD-C3 Adapter]&lt;br /&gt;
&lt;br /&gt;
Der WiCAN wird in die OBD2-Serviceschnittestelle (rechts neben Sicherungsfach unterhalb Lenkrad) gesteckt. Am besten über ein Verlängerungskabel oder indem man den OBD2-Stecker aus der Halterung drückt und mit dem WiCAN ins Sicherungsfach legt. &lt;br /&gt;
&lt;br /&gt;
Der WiCAN kommuniziert über den CAN-Bus des Fahrzeuges mit den Steuergeräten (ECU, Eletronic Control Unit) im Ora und kann sich über WLAN mit eine MQTT-Server verbinden. Näheres im obigen Link. Bei der WiCAN-Konfiguration mus das CAN-Protokoll &amp;quot;slcan&amp;quot; ausgewählt werden. Die Kommunikation erfolgt über den Eintrag &#039;&#039;can/tx&#039;&#039; und &#039;&#039;can/rx&#039;&#039; des WiCAN auf dem MQTT-Server. Bitte nicht vergessen, den automatischen Standby-Modus anzuschalten, ansonsten leert sich mit der Zeit die Fahrzeugbatterie.&lt;br /&gt;
&lt;br /&gt;
Die Integration eines MQTT-Servers in FHEM wird [[MQTT|&#039;&#039;&#039;hier&#039;&#039;&#039;]] erklärt. &lt;br /&gt;
&lt;br /&gt;
Ist das Auto eingeschaltet und der Adapter gesteckt, dann können über FHEM einige Fahrzeugdaten abgefragt werden. Weiter unten eine beispielhafte EInrichtung eines MQTT2-Devices. &lt;br /&gt;
&lt;br /&gt;
=== Readings ===&lt;br /&gt;
Die folgenden Werte werden mit unterer Beispielkonfiguration aus den Steuergeräten VCU (Vehicle Control Unit, ECU CAN-ID: 1930, Response CAN-ID: 1994) und BMSv2 (Batterie Management System, ECU CAN-ID: 1931, Response CAN-ID: 1995) ausgelesen:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Mileage:&#039;&#039;&#039; km-Stand - Abfrage über &amp;quot;set wican read_Mileage&amp;quot;&lt;br /&gt;
* &#039;&#039;&#039;SoC&#039;&#039;&#039;: Ladezustand Hochvolt-Antriebsbatterie in %  - Abfrage über &amp;quot;set wican read_SoC&amp;quot;&lt;br /&gt;
* &#039;&#039;&#039;TrueSoC&#039;&#039;&#039;: ein zweiter Wert. Hintergrund ist unbekannt - Abfrage über &amp;quot;set wican read_TrueSoC&amp;quot;&lt;br /&gt;
* &#039;&#039;&#039;SoE&#039;&#039;&#039;: Ladezustand Hochvolt-Antriebsbatterie in kW - Abfrage über &amp;quot;set wican read_SoE&amp;quot;&lt;br /&gt;
* &#039;&#039;&#039;SoH&#039;&#039;&#039;: Gesundheitszustand der Hochvolt-Antriebsbatterie in % - Abfrage über &amp;quot;set wican read_SoH&amp;quot;&lt;br /&gt;
* &#039;&#039;&#039;OperatingVoltage&#039;&#039;&#039;: Spannung Niedervolt-Fahrzeugbatterie in V - Abfrage über &amp;quot;set wican read_OperatingVoltage&amp;quot;&lt;br /&gt;
* &#039;&#039;&#039;BatteryVoltage&#039;&#039;&#039;: Spannung Hochvolt-Antriebsbatterie in V - Abfrage über &amp;quot;set wican read_BatteryVoltage&amp;quot;&lt;br /&gt;
* &#039;&#039;&#039;TotalCharge&#039;&#039;&#039;: Durch die Batterie aufgenommene Stromleistung in Ah (inklusive Rekuperation während des Fahrens) - Abfrage über &amp;quot;set wican read_Total Charge&amp;quot; Die Multiplikation mit 5 kV scheint die hinzugefügte elektrische Leistung zu ergeben.&lt;br /&gt;
* &#039;&#039;&#039;TotalDischarge&#039;&#039;&#039;: Von der Hochvolt-Batterie abgezogene Stromleistung in Ah - Abfrage über &amp;quot;set wican read_TotalDischarge&amp;quot; Die Multiplikation mit 5 kV scheint die abgerufene elektrische Leistung zu ergeben.&lt;br /&gt;
Das erste Auslesen kann über ein notify angestossen werden, sobald der WiCAN den Status &amp;quot;online&amp;quot; hat. &amp;lt;syntaxhighlight lang=&amp;quot;cfg&amp;quot;&amp;gt;&lt;br /&gt;
define wican_online notify wican:status:.online set wican read_SoC;; sleep 1;; set wican read_TrueSoC;; sleep 1;; set wican read_Mileage;; sleep 1;; set wican read_OpVoltage;; sleep 1;; set wican read_SoH;; sleep 1;; set wican read_TotalCharge;; sleep 1;; set wican read_TotalDischarge;; sleep 1;; set wican read_BatteryVoltage;; sleep 1;; set wican read_SoE&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Die weiteren Abfrage können über einen Timer erfolgen Der Timer kann mit einem notify ein- und wieder ausgeschaltet werden.&amp;lt;syntaxhighlight lang=&amp;quot;cfg&amp;quot;&amp;gt;&lt;br /&gt;
define wican_check at +*00:01:00 set wican read_SoC;; sleep 1;; set wican read_TrueSoC;; sleep 1;; set wican read_Mileage;; sleep 1;; set wican read_OpVoltage;; sleep 1;; set wican read_SoH;; sleep 1;; set wican read_TotalCharge;; sleep 1;; set wican read_TotalDischarge;; sleep 1;; set wican read_BatteryVoltage;; sleep 1;; set wican read_SoE&lt;br /&gt;
&lt;br /&gt;
define wican_check_active notify wican:status:.online set wican_check active&lt;br /&gt;
&lt;br /&gt;
define wican_check_inactive notify wican:status:.offline set wican_check inactive&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Beispielhafte Einrichtung des WiCAN im Ora Funky Cat als MQTT2-Device ===&lt;br /&gt;
Ab der WiCAN [https://github.com/meatpiHQ/wican-fw/releases Firmware] v2.98 (13. April 2024) kann die Benennung des Eintrages im MQTT-Server frei gewählt werden. Die untere Konfiguration geht von folgender Benennung aus: &lt;br /&gt;
&lt;br /&gt;
* TX Topic: &#039;&#039;wican/ora/can/tx&#039;&#039;&lt;br /&gt;
* RX Topic: &#039;&#039;wican/ora/can/tx&#039;&#039;&lt;br /&gt;
* Status Topic: &#039;&#039;wican/ora/can/status&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cfg&amp;quot;&amp;gt;&lt;br /&gt;
define wican MQTT2_DEVICE&lt;br /&gt;
attr wican alias Ora&lt;br /&gt;
attr wican stateFormat B: SoC% M: Mileage km (status)&lt;br /&gt;
attr wican event-on-change-reading status&lt;br /&gt;
attr wican event-on-update-reading frame_1_data_6,SoC&lt;br /&gt;
attr wican DbLogExclude .*&lt;br /&gt;
attr wican DbLogInclude SoC:3600&lt;br /&gt;
attr wican readingList wican/ora/can/status:.* {json2nameValue($EVENT)}\&lt;br /&gt;
 wican/ora/can/rx:.* {json2nameValue($EVENT)}&lt;br /&gt;
attr wican setList read_SoC:noArg wican/ora/can/tx {&amp;quot;bus&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;tx&amp;quot;,&amp;quot;ts&amp;quot;:49539,&amp;quot;frame&amp;quot;:[{&amp;quot;id&amp;quot;:1931,&amp;quot;dlc&amp;quot;:8,&amp;quot;rtr&amp;quot;:false,&amp;quot;extd&amp;quot;:false,&amp;quot;data&amp;quot;:[3,34,32,80,170,170,170,170]}]}\&lt;br /&gt;
read_TrueSoC:noArg wican/ora/can/tx {&amp;quot;bus&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;tx&amp;quot;,&amp;quot;ts&amp;quot;:27825,&amp;quot;frame&amp;quot;:[{&amp;quot;id&amp;quot;:1931,&amp;quot;dlc&amp;quot;:8,&amp;quot;rtr&amp;quot;:false,&amp;quot;extd&amp;quot;:false,&amp;quot;data&amp;quot;:[3,34,3,8,170,170,170,170]}]}\&lt;br /&gt;
read_SoH:noArg wican/ora/can/tx {&amp;quot;bus&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;tx&amp;quot;,&amp;quot;ts&amp;quot;:12016,&amp;quot;frame&amp;quot;:[{&amp;quot;id&amp;quot;:1931,&amp;quot;dlc&amp;quot;:8,&amp;quot;rtr&amp;quot;:false,&amp;quot;extd&amp;quot;:false,&amp;quot;data&amp;quot;:[3,34,32,81,170,170,170,170]}]}\&lt;br /&gt;
read_SoE:noArg wican/ora/can/tx {&amp;quot;bus&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;tx&amp;quot;,&amp;quot;ts&amp;quot;:17777,&amp;quot;frame&amp;quot;:[{&amp;quot;id&amp;quot;:1930,&amp;quot;dlc&amp;quot;:8,&amp;quot;rtr&amp;quot;:false,&amp;quot;extd&amp;quot;:false,&amp;quot;data&amp;quot;:[3,34,208,98,170,170,170,170]}]}\&lt;br /&gt;
read_OpVoltage:noArg wican/ora/can/tx {&amp;quot;bus&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;tx&amp;quot;,&amp;quot;ts&amp;quot;:17645,&amp;quot;frame&amp;quot;:[{&amp;quot;id&amp;quot;:1931,&amp;quot;dlc&amp;quot;:8,&amp;quot;rtr&amp;quot;:false,&amp;quot;extd&amp;quot;:false,&amp;quot;data&amp;quot;:[3,34,208,3,170,170,170,170]}]}\&lt;br /&gt;
read_Mileage:noArg wican/ora/can/tx {&amp;quot;bus&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;tx&amp;quot;,&amp;quot;ts&amp;quot;:35674,&amp;quot;frame&amp;quot;:[{&amp;quot;id&amp;quot;:1931,&amp;quot;dlc&amp;quot;:8,&amp;quot;rtr&amp;quot;:false,&amp;quot;extd&amp;quot;:false,&amp;quot;data&amp;quot;:[3,34,208,4,170,170,170,170]}]}\&lt;br /&gt;
read_TotalCharge:noArg wican/ora/can/tx {&amp;quot;bus&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;tx&amp;quot;,&amp;quot;ts&amp;quot;:28695,&amp;quot;frame&amp;quot;:[{&amp;quot;id&amp;quot;:1931,&amp;quot;dlc&amp;quot;:8,&amp;quot;rtr&amp;quot;:false,&amp;quot;extd&amp;quot;:false,&amp;quot;data&amp;quot;:[3,34,33,113,170,170,170,170]}]}\&lt;br /&gt;
read_TotalDischarge:noArg wican/ora/can/tx {&amp;quot;bus&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;tx&amp;quot;,&amp;quot;ts&amp;quot;:28695,&amp;quot;frame&amp;quot;:[{&amp;quot;id&amp;quot;:1931,&amp;quot;dlc&amp;quot;:8,&amp;quot;rtr&amp;quot;:false,&amp;quot;extd&amp;quot;:false,&amp;quot;data&amp;quot;:[3,34,33,114,170,170,170,170]}]}\&lt;br /&gt;
read_BatteryVoltage:noArg wican/ora/can/tx {&amp;quot;bus&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;tx&amp;quot;,&amp;quot;ts&amp;quot;:58591,&amp;quot;frame&amp;quot;:[{&amp;quot;id&amp;quot;:1931,&amp;quot;dlc&amp;quot;:8,&amp;quot;rtr&amp;quot;:false,&amp;quot;extd&amp;quot;:false,&amp;quot;data&amp;quot;:[3,34,32,3,170,170,170,170]}]}&lt;br /&gt;
attr wican userReadings SoC:frame_1_data_6:.* {\&lt;br /&gt;
	if (ReadingsNum($NAME, &#039;frame_1_id&#039;, 0) == 1995 and ReadingsNum($NAME, &#039;frame_1_data_1&#039;, 0)  == 5 and ReadingsNum($NAME, &#039;frame_1_data_2&#039;, 0)  == 98\&lt;br /&gt;
      and ReadingsNum($NAME, &#039;frame_1_data_3&#039;, 0)  == 32 and ReadingsNum($NAME, &#039;frame_1_data_4&#039;, 0)  == 80 ) {\&lt;br /&gt;
		return (ReadingsNum($NAME, &#039;frame_1_data_5&#039;, 0) * 256+ReadingsNum($NAME, &#039;frame_1_data_6&#039;, 0))/10.0\&lt;br /&gt;
	} else {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;SoC&#039;, 0)\&lt;br /&gt;
	}\&lt;br /&gt;
},\&lt;br /&gt;
SoH:frame_1_data_6:.* {\&lt;br /&gt;
	if (ReadingsNum($NAME, &#039;frame_1_id&#039;, 0) == 1995 and ReadingsNum($NAME, &#039;frame_1_data_1&#039;, 0)  == 5 and ReadingsNum($NAME, &#039;frame_1_data_2&#039;, 0)  == 98\&lt;br /&gt;
      and ReadingsNum($NAME, &#039;frame_1_data_3&#039;, 0)  == 32 and ReadingsNum($NAME, &#039;frame_1_data_4&#039;, 0)  == 81 ) {\&lt;br /&gt;
		return (ReadingsNum($NAME, &#039;frame_1_data_5&#039;, 0) * 256 + ReadingsNum($NAME, &#039;frame_1_data_6&#039;, 0))/10.0\&lt;br /&gt;
	} else {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;SoH&#039;, 0)\&lt;br /&gt;
	}\&lt;br /&gt;
},\&lt;br /&gt;
TrueSoC:frame_1_data_6:.* {\&lt;br /&gt;
	if (ReadingsNum($NAME, &#039;frame_1_id&#039;, 0) == 1995 and ReadingsNum($NAME, &#039;frame_1_data_3&#039;, 0)  == 3) {\&lt;br /&gt;
		return (ReadingsNum($NAME, &#039;frame_1_data_5&#039;, 0) * 256 + ReadingsNum($NAME, &#039;frame_1_data_6&#039;, 0))/10.0\&lt;br /&gt;
	} else {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;TrueSoC&#039;, 0)\&lt;br /&gt;
	}\&lt;br /&gt;
},\&lt;br /&gt;
Mileage:frame_1_data_6:.* {\&lt;br /&gt;
	if (ReadingsNum($NAME, &#039;frame_1_id&#039;, 0) == 1995 and ReadingsNum($NAME, &#039;frame_1_data_1&#039;, 0)  == 6 and ReadingsNum($NAME, &#039;frame_1_data_2&#039;, 0)  == 98\&lt;br /&gt;
      and ReadingsNum($NAME, &#039;frame_1_data_3&#039;, 0)  == 208 ) {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;frame_1_data_5&#039;, 0) * 65536 + ReadingsNum($NAME, &#039;frame_1_data_6&#039;, 0) * 256 + ReadingsNum($NAME, &#039;frame_1_data_7&#039;, 0)\&lt;br /&gt;
	} else {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;Mileage&#039;, 0)\&lt;br /&gt;
	}\&lt;br /&gt;
},\&lt;br /&gt;
OperatingVoltage:frame_1_data_6:.* {\&lt;br /&gt;
	if (ReadingsNum($NAME, &#039;frame_1_id&#039;, 0) == 1995 and ReadingsNum($NAME, &#039;frame_1_data_1&#039;, 0)  == 4 and ReadingsNum($NAME, &#039;frame_1_data_2&#039;, 0)  == 98\&lt;br /&gt;
      and ReadingsNum($NAME, &#039;frame_1_data_3&#039;, 0)  == 208 ) {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;frame_1_data_5&#039;, 0) /10.0\&lt;br /&gt;
	} else {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;OperatingVoltage&#039;, 0)\&lt;br /&gt;
	}\&lt;br /&gt;
},\&lt;br /&gt;
TotalCharge:frame_1_data_6:.* {\&lt;br /&gt;
	if (ReadingsNum($NAME, &#039;frame_1_id&#039;, 0) == 1995 and ReadingsNum($NAME, &#039;frame_1_data_1&#039;, 0)  == 7 and ReadingsNum($NAME, &#039;frame_1_data_2&#039;, 0)  == 98\&lt;br /&gt;
      and ReadingsNum($NAME, &#039;frame_1_data_3&#039;, 0)  == 33 and ReadingsNum($NAME, &#039;frame_1_data_4&#039;, 0)  == 113 ) {\&lt;br /&gt;
		return round( 2 * ReadingsNum($NAME, &#039;frame_1_data_7&#039;, 0) + ReadingsNum($NAME, &#039;frame_1_data_8&#039;, 0) / 128 , 0)\&lt;br /&gt;
	} else {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;TotalCharge&#039;, 0)\&lt;br /&gt;
	}\&lt;br /&gt;
},\&lt;br /&gt;
TotalDischarge:frame_1_data_6:.* {\&lt;br /&gt;
	if (ReadingsNum($NAME, &#039;frame_1_id&#039;, 0) == 1995 and ReadingsNum($NAME, &#039;frame_1_data_1&#039;, 0)  == 7 and ReadingsNum($NAME, &#039;frame_1_data_2&#039;, 0)  == 98\&lt;br /&gt;
  and ReadingsNum($NAME, &#039;frame_1_data_3&#039;, 0)  == 33 and ReadingsNum($NAME, &#039;frame_1_data_4&#039;, 0)  == 114 ) {\&lt;br /&gt;
		return round( 2 * ReadingsNum($NAME, &#039;frame_1_data_7&#039;, 0) + ReadingsNum($NAME, &#039;frame_1_data_8&#039;, 0) / 128 , 0)\&lt;br /&gt;
	} else {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;TotalDischarge&#039;, 0)\&lt;br /&gt;
	}\&lt;br /&gt;
},\&lt;br /&gt;
BatteryVoltage:frame_1_data_6:.* {\&lt;br /&gt;
	if (ReadingsNum($NAME, &#039;frame_1_id&#039;, 0) == 1995 and ReadingsNum($NAME, &#039;frame_1_data_1&#039;, 0)  == 16 and ReadingsNum($NAME, &#039;frame_1_data_2&#039;, 0)  == 9\&lt;br /&gt;
      and ReadingsNum($NAME, &#039;frame_1_data_3&#039;, 0)  == 98 and ReadingsNum($NAME, &#039;frame_1_data_4&#039;, 0)  == 32 ) {\&lt;br /&gt;
		return ( 256 * ReadingsNum($NAME, &#039;frame_1_data_6&#039;, 0) + ReadingsNum($NAME, &#039;frame_1_data_7&#039;, 0)) / 10.0 \&lt;br /&gt;
	} else {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;BatteryVoltage&#039;, 0)\&lt;br /&gt;
	}\&lt;br /&gt;
},\&lt;br /&gt;
SoE:frame_1_data_6:.* {\&lt;br /&gt;
	if (ReadingsNum($NAME, &#039;frame_1_id&#039;, 0) == 1994 and ReadingsNum($NAME, &#039;frame_1_data_1&#039;, 0)  == 7 and ReadingsNum($NAME, &#039;frame_1_data_2&#039;, 0)  == 98\&lt;br /&gt;
      and ReadingsNum($NAME, &#039;frame_1_data_3&#039;, 0)  == 208 and ReadingsNum($NAME, &#039;frame_1_data_4&#039;, 0)  == 98 ) {\&lt;br /&gt;
		return (256*ReadingsNum($NAME, &#039;frame_1_data_7&#039;, 0)+ReadingsNum($NAME, &#039;frame_1_data_8&#039;, 0)) / 10.0 \&lt;br /&gt;
	} else {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;SoE&#039;, 0)\&lt;br /&gt;
	}\&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Elektromobilität]]&lt;/div&gt;</summary>
		<author><name>Topos</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Ora_Funky_Cat&amp;diff=39270</id>
		<title>Ora Funky Cat</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Ora_Funky_Cat&amp;diff=39270"/>
		<updated>2024-04-21T11:48:37Z</updated>

		<summary type="html">&lt;p&gt;Topos: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Auf dieser Seite wird die Einbindung des E-Autos [https://www.ora-motor.de/ Ora Funky Cat] von GWM (Great Wall Motor aus China) in FHEM über die OBD2-Serviceschnittestelle erläutert.&lt;br /&gt;
&lt;br /&gt;
Benötigte Hardware: [https://www.meatpi.com/products/wican MeatPi WiCAN-OBD-C3 Adapter]&lt;br /&gt;
&lt;br /&gt;
Der WiCAN wird in die OBD2-Serviceschnittestelle (rechts neben Sicherungsfach unterhalb Lenkrad) gesteckt. Am besten über ein Verlängerungskabel oder indem man den OBD2-Stecker aus der Halterung drückt und mit dem WiCAN ins Sicherungsfach legt. &lt;br /&gt;
&lt;br /&gt;
Der WiCAN kommuniziert über den CAN-Bus des Fahrzeuges mit den Steuergeräten (ECU, Eletronic Control Unit) im Ora und kann sich über WLAN mit eine MQTT-Server verbinden. Näheres im obigen Link. Bei der WiCAN-Konfiguration mus das CAN-Protokoll &amp;quot;slcan&amp;quot; ausgewählt werden. Die Kommunikation erfolgt über den Eintrag &#039;&#039;can/tx&#039;&#039; und &#039;&#039;can/rx&#039;&#039; des WiCAN auf dem MQTT-Server. Bitte nicht vergessen, den automatischen Standby-Modus anzuschalten, ansonsten leert sich mit der Zeit die Fahrzeugbatterie.&lt;br /&gt;
&lt;br /&gt;
Die Integration eines MQTT-Servers in FHEM wird [[MQTT|&#039;&#039;&#039;hier&#039;&#039;&#039;]] erklärt. &lt;br /&gt;
&lt;br /&gt;
Ist das Auto eingeschaltet und der Adapter gesteckt, dann können über FHEM einige Fahrzeugdaten abgefragt werden. Weiter unten eine beispielhafte EInrichtung eines MQTT2-Devices. &lt;br /&gt;
&lt;br /&gt;
=== Readings ===&lt;br /&gt;
Die folgenden Werte werden mit unterer Beispielkonfiguration aus den Steuergeräten VCU (Vehicle Control Unit, ECU CAN-ID: 1930, Response CAN-ID: 1994) und BMSv2 (Batterie Management System, ECU CAN-ID: 1931, Response CAN-ID: 1995) ausgelesen:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Mileage:&#039;&#039;&#039; km-Stand - Abfrage über &amp;quot;set wican read_Mileage&amp;quot;&lt;br /&gt;
* &#039;&#039;&#039;SoC&#039;&#039;&#039;: Ladezustand Hochvolt-Antriebsbatterie in %  - Abfrage über &amp;quot;set wican read_SoC&amp;quot;&lt;br /&gt;
* &#039;&#039;&#039;TrueSoC&#039;&#039;&#039;: ein zweiter Wert. Hintergrund ist unbekannt - Abfrage über &amp;quot;set wican read_TrueSoC&amp;quot;&lt;br /&gt;
* &#039;&#039;&#039;SoE&#039;&#039;&#039;: Ladezustand Hochvolt-Antriebsbatterie in kW - Abfrage über &amp;quot;set wican read_SoE&amp;quot;&lt;br /&gt;
* &#039;&#039;&#039;SoH&#039;&#039;&#039;: Gesundheitszustand der Hochvolt-Antriebsbatterie in % - Abfrage über &amp;quot;set wican read_SoH&amp;quot;&lt;br /&gt;
* &#039;&#039;&#039;OperatingVoltage&#039;&#039;&#039;: Spannung Niedervolt-Fahrzeugbatterie in V - Abfrage über &amp;quot;set wican read_OperatingVoltage&amp;quot;&lt;br /&gt;
* &#039;&#039;&#039;BatteryVoltage&#039;&#039;&#039;: Spannung Hochvolt-Antriebsbatterie in V - Abfrage über &amp;quot;set wican read_BatteryVoltage&amp;quot;&lt;br /&gt;
* &#039;&#039;&#039;TotalCharge&#039;&#039;&#039;: Durch die Batterie aufgenommene Stromleistung in Ah (inklusive Rekuperation während des Fahrens) - Abfrage über &amp;quot;set wican read_Total Charge&amp;quot; Die Multiplikation mit 5 kV scheint die hinzugefügte elektrische Leistung zu ergeben.&lt;br /&gt;
* &#039;&#039;&#039;TotalDischarge&#039;&#039;&#039;: Von der Hochvolt-Batterie abgezogene Stromleistung in Ah - Abfrage über &amp;quot;set wican read_TotalDischarge&amp;quot; Die Multiplikation mit 5 kV scheint die abgerufene elektrische Leistung zu ergeben.&lt;br /&gt;
Das erste Auslesen kann über ein notify angestossen werden, sobald der WiCAN den Status &amp;quot;online&amp;quot; hat. &amp;lt;syntaxhighlight lang=&amp;quot;cfg&amp;quot;&amp;gt;&lt;br /&gt;
define wican_online notify wican:status:.online set wican read_SoC;; sleep 1;; set wican read_TrueSoC;; sleep 1;; set wican read_Mileage;; sleep 1;; set wican read_OpVoltage;; sleep 1;; set wican read_SoH;; sleep 1;; set wican read_TotalCharge;; sleep 1;; set wican read_TotalDischarge;; sleep 1;; set wican read_BatteryVoltage;; sleep 1;; set wican read_SoE&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Die weiteren Abfrage können über einen Timer erfolgen Der Timer kann mit einem notify ein- und wieder ausgeschaltet werden.&amp;lt;syntaxhighlight lang=&amp;quot;cfg&amp;quot;&amp;gt;&lt;br /&gt;
define wican_check at +*00:01:00 set wican read_SoC;; sleep 1;; set wican read_TrueSoC;; sleep 1;; set wican read_Mileage;; sleep 1;; set wican read_OpVoltage;; sleep 1;; set wican read_SoH;; sleep 1;; set wican read_TotalCharge;; sleep 1;; set wican read_TotalDischarge;; sleep 1;; set wican read_BatteryVoltage;; sleep 1;; set wican read_SoE&lt;br /&gt;
&lt;br /&gt;
define wican_check_active notify wican:status:.online set wican_check active&lt;br /&gt;
&lt;br /&gt;
define wican_check_inactive notify wican:status:.offline set wican_check inactive&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Beispielhafte Einrichtung des WiCAN im Ora Funky Cat als MQTT2-Device ===&lt;br /&gt;
Ab der WiCAN [https://github.com/meatpiHQ/wican-fw/releases Firmware] v2.98 (13. April 2024) kann die Benennung des Eintrages im MQTT-Server frei gewählt werden. Die untere Konfiguration geht von folgender Benennung aus: &lt;br /&gt;
&lt;br /&gt;
* TX Topic: &#039;&#039;wican/ora/can/tx&#039;&#039;&lt;br /&gt;
* RX Topic: &#039;&#039;wican/ora/can/tx&#039;&#039;&lt;br /&gt;
* Status Topic: &#039;&#039;wican/ora/can/status&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cfg&amp;quot;&amp;gt;&lt;br /&gt;
define wican MQTT2_DEVICE&lt;br /&gt;
attr wican alias Ora&lt;br /&gt;
attr wican stateFormat B: SoC% M: Mileage km (status)&lt;br /&gt;
attr wican event-on-change-reading status&lt;br /&gt;
attr wican event-on-update-reading frame_1_data_6,SoC&lt;br /&gt;
attr wican DbLogExclude .*&lt;br /&gt;
attr wican DbLogInclude SoC:3600&lt;br /&gt;
attr wican readingList wican/ora/can/status:.* {json2nameValue($EVENT)}\&lt;br /&gt;
 wican/ora/can/rx:.* {json2nameValue($EVENT)}&lt;br /&gt;
attr wican setList read_SoC:noArg wican/ora/can/tx {&amp;quot;bus&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;tx&amp;quot;,&amp;quot;ts&amp;quot;:49539,&amp;quot;frame&amp;quot;:[{&amp;quot;id&amp;quot;:1931,&amp;quot;dlc&amp;quot;:8,&amp;quot;rtr&amp;quot;:false,&amp;quot;extd&amp;quot;:false,&amp;quot;data&amp;quot;:[3,34,32,80,170,170,170,170]}]}\&lt;br /&gt;
read_TrueSoC:noArg wican/ora/can/tx {&amp;quot;bus&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;tx&amp;quot;,&amp;quot;ts&amp;quot;:27825,&amp;quot;frame&amp;quot;:[{&amp;quot;id&amp;quot;:1931,&amp;quot;dlc&amp;quot;:8,&amp;quot;rtr&amp;quot;:false,&amp;quot;extd&amp;quot;:false,&amp;quot;data&amp;quot;:[3,34,3,8,170,170,170,170]}]}\&lt;br /&gt;
read_SoH:noArg wican/ora/can/tx {&amp;quot;bus&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;tx&amp;quot;,&amp;quot;ts&amp;quot;:12016,&amp;quot;frame&amp;quot;:[{&amp;quot;id&amp;quot;:1931,&amp;quot;dlc&amp;quot;:8,&amp;quot;rtr&amp;quot;:false,&amp;quot;extd&amp;quot;:false,&amp;quot;data&amp;quot;:[3,34,32,81,170,170,170,170]}]}\&lt;br /&gt;
read_SoE:noArg wican/ora/can/tx {&amp;quot;bus&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;tx&amp;quot;,&amp;quot;ts&amp;quot;:17777,&amp;quot;frame&amp;quot;:[{&amp;quot;id&amp;quot;:1930,&amp;quot;dlc&amp;quot;:8,&amp;quot;rtr&amp;quot;:false,&amp;quot;extd&amp;quot;:false,&amp;quot;data&amp;quot;:[3,34,208,98,170,170,170,170]}]}\&lt;br /&gt;
read_OpVoltage:noArg wican/ora/can/tx {&amp;quot;bus&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;tx&amp;quot;,&amp;quot;ts&amp;quot;:17645,&amp;quot;frame&amp;quot;:[{&amp;quot;id&amp;quot;:1931,&amp;quot;dlc&amp;quot;:8,&amp;quot;rtr&amp;quot;:false,&amp;quot;extd&amp;quot;:false,&amp;quot;data&amp;quot;:[3,34,208,3,170,170,170,170]}]}\&lt;br /&gt;
read_Mileage:noArg wican/ora/can/tx {&amp;quot;bus&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;tx&amp;quot;,&amp;quot;ts&amp;quot;:35674,&amp;quot;frame&amp;quot;:[{&amp;quot;id&amp;quot;:1931,&amp;quot;dlc&amp;quot;:8,&amp;quot;rtr&amp;quot;:false,&amp;quot;extd&amp;quot;:false,&amp;quot;data&amp;quot;:[3,34,208,4,170,170,170,170]}]}\&lt;br /&gt;
read_TotalCharge:noArg wican/ora/can/tx {&amp;quot;bus&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;tx&amp;quot;,&amp;quot;ts&amp;quot;:28695,&amp;quot;frame&amp;quot;:[{&amp;quot;id&amp;quot;:1931,&amp;quot;dlc&amp;quot;:8,&amp;quot;rtr&amp;quot;:false,&amp;quot;extd&amp;quot;:false,&amp;quot;data&amp;quot;:[3,34,33,113,170,170,170,170]}]}\&lt;br /&gt;
read_TotalDischarge:noArg wican/ora/can/tx {&amp;quot;bus&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;tx&amp;quot;,&amp;quot;ts&amp;quot;:28695,&amp;quot;frame&amp;quot;:[{&amp;quot;id&amp;quot;:1931,&amp;quot;dlc&amp;quot;:8,&amp;quot;rtr&amp;quot;:false,&amp;quot;extd&amp;quot;:false,&amp;quot;data&amp;quot;:[3,34,33,114,170,170,170,170]}]}\&lt;br /&gt;
read_BatteryVoltage:noArg wican/ora/can/tx {&amp;quot;bus&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;tx&amp;quot;,&amp;quot;ts&amp;quot;:58591,&amp;quot;frame&amp;quot;:[{&amp;quot;id&amp;quot;:1931,&amp;quot;dlc&amp;quot;:8,&amp;quot;rtr&amp;quot;:false,&amp;quot;extd&amp;quot;:false,&amp;quot;data&amp;quot;:[3,34,32,3,170,170,170,170]}]}&lt;br /&gt;
attr wican userReadings SoC:frame_1_data_6:.* {\&lt;br /&gt;
	if (ReadingsNum($NAME, &#039;frame_1_id&#039;, 0) == 1995 and ReadingsNum($NAME, &#039;frame_1_data_1&#039;, 0)  == 5 and ReadingsNum($NAME, &#039;frame_1_data_2&#039;, 0)  == 98\&lt;br /&gt;
      and ReadingsNum($NAME, &#039;frame_1_data_3&#039;, 0)  == 32 and ReadingsNum($NAME, &#039;frame_1_data_4&#039;, 0)  == 80 ) {\&lt;br /&gt;
		return (ReadingsNum($NAME, &#039;frame_1_data_5&#039;, 0) * 256+ReadingsNum($NAME, &#039;frame_1_data_6&#039;, 0))/10.0\&lt;br /&gt;
	} else {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;SoC&#039;, 0)\&lt;br /&gt;
	}\&lt;br /&gt;
},\&lt;br /&gt;
SoH:frame_1_data_6:.* {\&lt;br /&gt;
	if (ReadingsNum($NAME, &#039;frame_1_id&#039;, 0) == 1995 and ReadingsNum($NAME, &#039;frame_1_data_1&#039;, 0)  == 5 and ReadingsNum($NAME, &#039;frame_1_data_2&#039;, 0)  == 98\&lt;br /&gt;
      and ReadingsNum($NAME, &#039;frame_1_data_3&#039;, 0)  == 32 and ReadingsNum($NAME, &#039;frame_1_data_4&#039;, 0)  == 81 ) {\&lt;br /&gt;
		return (ReadingsNum($NAME, &#039;frame_1_data_5&#039;, 0) * 256 + ReadingsNum($NAME, &#039;frame_1_data_6&#039;, 0))/10.0\&lt;br /&gt;
	} else {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;SoH&#039;, 0)\&lt;br /&gt;
	}\&lt;br /&gt;
},\&lt;br /&gt;
TrueSoC:frame_1_data_6:.* {\&lt;br /&gt;
	if (ReadingsNum($NAME, &#039;frame_1_id&#039;, 0) == 1995 and ReadingsNum($NAME, &#039;frame_1_data_3&#039;, 0)  == 3) {\&lt;br /&gt;
		return (ReadingsNum($NAME, &#039;frame_1_data_5&#039;, 0) * 256 + ReadingsNum($NAME, &#039;frame_1_data_6&#039;, 0))/10.0\&lt;br /&gt;
	} else {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;TrueSoC&#039;, 0)\&lt;br /&gt;
	}\&lt;br /&gt;
},\&lt;br /&gt;
Mileage:frame_1_data_6:.* {\&lt;br /&gt;
	if (ReadingsNum($NAME, &#039;frame_1_id&#039;, 0) == 1995 and ReadingsNum($NAME, &#039;frame_1_data_1&#039;, 0)  == 6 and ReadingsNum($NAME, &#039;frame_1_data_2&#039;, 0)  == 98\&lt;br /&gt;
      and ReadingsNum($NAME, &#039;frame_1_data_3&#039;, 0)  == 208 ) {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;frame_1_data_6&#039;, 0) * 256 + ReadingsNum($NAME, &#039;frame_1_data_7&#039;, 0)\&lt;br /&gt;
	} else {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;Mileage&#039;, 0)\&lt;br /&gt;
	}\&lt;br /&gt;
},\&lt;br /&gt;
OperatingVoltage:frame_1_data_6:.* {\&lt;br /&gt;
	if (ReadingsNum($NAME, &#039;frame_1_id&#039;, 0) == 1995 and ReadingsNum($NAME, &#039;frame_1_data_1&#039;, 0)  == 4 and ReadingsNum($NAME, &#039;frame_1_data_2&#039;, 0)  == 98\&lt;br /&gt;
      and ReadingsNum($NAME, &#039;frame_1_data_3&#039;, 0)  == 208 ) {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;frame_1_data_5&#039;, 0) /10.0\&lt;br /&gt;
	} else {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;OperatingVoltage&#039;, 0)\&lt;br /&gt;
	}\&lt;br /&gt;
},\&lt;br /&gt;
TotalCharge:frame_1_data_6:.* {\&lt;br /&gt;
	if (ReadingsNum($NAME, &#039;frame_1_id&#039;, 0) == 1995 and ReadingsNum($NAME, &#039;frame_1_data_1&#039;, 0)  == 7 and ReadingsNum($NAME, &#039;frame_1_data_2&#039;, 0)  == 98\&lt;br /&gt;
      and ReadingsNum($NAME, &#039;frame_1_data_3&#039;, 0)  == 33 and ReadingsNum($NAME, &#039;frame_1_data_4&#039;, 0)  == 113 ) {\&lt;br /&gt;
		return round( 2 * ReadingsNum($NAME, &#039;frame_1_data_7&#039;, 0) + ReadingsNum($NAME, &#039;frame_1_data_8&#039;, 0) / 128 , 0)\&lt;br /&gt;
	} else {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;TotalCharge&#039;, 0)\&lt;br /&gt;
	}\&lt;br /&gt;
},\&lt;br /&gt;
TotalDischarge:frame_1_data_6:.* {\&lt;br /&gt;
	if (ReadingsNum($NAME, &#039;frame_1_id&#039;, 0) == 1995 and ReadingsNum($NAME, &#039;frame_1_data_1&#039;, 0)  == 7 and ReadingsNum($NAME, &#039;frame_1_data_2&#039;, 0)  == 98\&lt;br /&gt;
  and ReadingsNum($NAME, &#039;frame_1_data_3&#039;, 0)  == 33 and ReadingsNum($NAME, &#039;frame_1_data_4&#039;, 0)  == 114 ) {\&lt;br /&gt;
		return round( 2 * ReadingsNum($NAME, &#039;frame_1_data_7&#039;, 0) + ReadingsNum($NAME, &#039;frame_1_data_8&#039;, 0) / 128 , 0)\&lt;br /&gt;
	} else {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;TotalDischarge&#039;, 0)\&lt;br /&gt;
	}\&lt;br /&gt;
},\&lt;br /&gt;
BatteryVoltage:frame_1_data_6:.* {\&lt;br /&gt;
	if (ReadingsNum($NAME, &#039;frame_1_id&#039;, 0) == 1995 and ReadingsNum($NAME, &#039;frame_1_data_1&#039;, 0)  == 16 and ReadingsNum($NAME, &#039;frame_1_data_2&#039;, 0)  == 9\&lt;br /&gt;
      and ReadingsNum($NAME, &#039;frame_1_data_3&#039;, 0)  == 98 and ReadingsNum($NAME, &#039;frame_1_data_4&#039;, 0)  == 32 ) {\&lt;br /&gt;
		return ( 256 * ReadingsNum($NAME, &#039;frame_1_data_6&#039;, 0) + ReadingsNum($NAME, &#039;frame_1_data_7&#039;, 0)) / 10.0 \&lt;br /&gt;
	} else {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;BatteryVoltage&#039;, 0)\&lt;br /&gt;
	}\&lt;br /&gt;
},\&lt;br /&gt;
SoE:frame_1_data_6:.* {\&lt;br /&gt;
	if (ReadingsNum($NAME, &#039;frame_1_id&#039;, 0) == 1994 and ReadingsNum($NAME, &#039;frame_1_data_1&#039;, 0)  == 7 and ReadingsNum($NAME, &#039;frame_1_data_2&#039;, 0)  == 98\&lt;br /&gt;
      and ReadingsNum($NAME, &#039;frame_1_data_3&#039;, 0)  == 208 and ReadingsNum($NAME, &#039;frame_1_data_4&#039;, 0)  == 98 ) {\&lt;br /&gt;
		return (256*ReadingsNum($NAME, &#039;frame_1_data_7&#039;, 0)+ReadingsNum($NAME, &#039;frame_1_data_8&#039;, 0)) / 10.0 \&lt;br /&gt;
	} else {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;SoE&#039;, 0)\&lt;br /&gt;
	}\&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Elektromobilität]]&lt;/div&gt;</summary>
		<author><name>Topos</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Ora_Funky_Cat&amp;diff=39269</id>
		<title>Ora Funky Cat</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Ora_Funky_Cat&amp;diff=39269"/>
		<updated>2024-04-21T11:35:40Z</updated>

		<summary type="html">&lt;p&gt;Topos: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Auf dieser Seite wird die Einbindung des E-Autos [https://www.ora-motor.de/ Ora Funky Cat] von GWM (Great Wall Motor aus China) in FHEM über die OBD2-Serviceschnittestelle erläutert.&lt;br /&gt;
&lt;br /&gt;
Benötigte Hardware: [https://www.meatpi.com/products/wican MeatPi WiCAN-OBD-C3 Adapter]&lt;br /&gt;
&lt;br /&gt;
Der WiCAN wird in die OBD2-Serviceschnittestelle (rechts neben Sicherungsfach unterhalb Lenkrad) gesteckt. Am besten über ein Verlängerungskabel oder indem man den OBD2-Stecker aus der Halterung drückt und mit dem WiCAN ins Sicherungsfach legt. &lt;br /&gt;
&lt;br /&gt;
Der WiCAN kommuniziert über den CAN-Bus des Fahrzeuges mit den Steuergeräten (ECU, Eletronic Control Unit) im Ora und kann sich über WLAN mit eine MQTT-Server verbinden. Näheres im obigen Link. Bei der WiCAN-Konfiguration mus das CAN-Protokoll &amp;quot;slcan&amp;quot; ausgewählt werden. Die Kommunikation erfolgt über den Eintrag &#039;&#039;can/tx&#039;&#039; und &#039;&#039;can/rx&#039;&#039; des WiCAN auf dem MQTT-Server. Bitte nicht vergessen, den automatischen Standby-Modus anzuschalten, ansonsten leert sich mit der Zeit die Fahrzeugbatterie.&lt;br /&gt;
&lt;br /&gt;
Die Integration eines MQTT-Servers in FHEM wird [[MQTT|&#039;&#039;&#039;hier&#039;&#039;&#039;]] erklärt. &lt;br /&gt;
&lt;br /&gt;
Ist das Auto eingeschaltet und der Adapter gesteckt, dann können über FHEM einige Fahrzeugdaten abgefragt werden. Weiter unten eine beispielhafte EInrichtung eines MQTT2-Devices. &lt;br /&gt;
&lt;br /&gt;
=== Readings ===&lt;br /&gt;
Die folgenden Werte werden mit unterer Beispielkonfiguration aus den Steuergeräten VCU (Vehicle Control Unit, ECU CAN-ID: 1930, Message CAN-ID: 1994) und BMSv2 (Batterie Management System, ECU CAN-ID: 1931, Message CAN-ID: 1995) ausgelesen:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Mileage:&#039;&#039;&#039; km-Stand - Abfrage über &amp;quot;set wican read_Mileage&amp;quot;&lt;br /&gt;
* &#039;&#039;&#039;SoC&#039;&#039;&#039;: Ladezustand Hochvolt-Antriebsbatterie in %  - Abfrage über &amp;quot;set wican read_SoC&amp;quot;&lt;br /&gt;
* &#039;&#039;&#039;TrueSoC&#039;&#039;&#039;: ein zweiter Wert. Hintergrund ist unbekannt - Abfrage über &amp;quot;set wican read_TrueSoC&amp;quot;&lt;br /&gt;
* &#039;&#039;&#039;SoE&#039;&#039;&#039;: Ladezustand Hochvolt-Antriebsbatterie in kW - Abfrage über &amp;quot;set wican read_SoE&amp;quot;&lt;br /&gt;
* &#039;&#039;&#039;SoH&#039;&#039;&#039;: Gesundheitszustand der Hochvolt-Antriebsbatterie in % - Abfrage über &amp;quot;set wican read_SoH&amp;quot;&lt;br /&gt;
* &#039;&#039;&#039;OperatingVoltage&#039;&#039;&#039;: Spannung Niedervolt-Fahrzeugbatterie in V - Abfrage über &amp;quot;set wican read_OperatingVoltage&amp;quot;&lt;br /&gt;
* &#039;&#039;&#039;BatteryVoltage&#039;&#039;&#039;: Spannung Hochvolt-Antriebsbatterie in V - Abfrage über &amp;quot;set wican read_BatteryVoltage&amp;quot;&lt;br /&gt;
* &#039;&#039;&#039;TotalCharge&#039;&#039;&#039;: Durch die Batterie aufgenommene Stromleistung in Ah (inklusive Rekuperation während des Fahrens) - Abfrage über &amp;quot;set wican read_Total Charge&amp;quot; Die Multiplikation mit 5 kV scheint die hinzugefügte elektrische Leistung zu ergeben.&lt;br /&gt;
* &#039;&#039;&#039;TotalDischarge&#039;&#039;&#039;: Von der Hochvolt-Batterie abgezogene Stromleistung in Ah - Abfrage über &amp;quot;set wican read_TotalDischarge&amp;quot; Die Multiplikation mit 5 kV scheint die abgerufene elektrische Leistung zu ergeben.&lt;br /&gt;
Das erste Auslesen kann über ein notify angestossen werden, sobald der WiCAN den Status &amp;quot;online&amp;quot; hat. &amp;lt;syntaxhighlight lang=&amp;quot;cfg&amp;quot;&amp;gt;&lt;br /&gt;
define wican_online notify wican:status:.online set wican read_SoC;; sleep 1;; set wican read_TrueSoC;; sleep 1;; set wican read_Mileage;; sleep 1;; set wican read_OpVoltage;; sleep 1;; set wican read_SoH;; sleep 1;; set wican read_TotalCharge;; sleep 1;; set wican read_TotalDischarge;; sleep 1;; set wican read_BatteryVoltage;; sleep 1;; set wican read_SoE&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Die weiteren Abfrage können über einen Timer erfolgen Der Timer kann mit einem notify ein- und wieder ausgeschaltet werden.&amp;lt;syntaxhighlight lang=&amp;quot;cfg&amp;quot;&amp;gt;&lt;br /&gt;
define wican_check at +*00:01:00 set wican read_SoC;; sleep 1;; set wican read_TrueSoC;; sleep 1;; set wican read_Mileage;; sleep 1;; set wican read_OpVoltage;; sleep 1;; set wican read_SoH;; sleep 1;; set wican read_TotalCharge;; sleep 1;; set wican read_TotalDischarge;; sleep 1;; set wican read_BatteryVoltage;; sleep 1;; set wican read_SoE&lt;br /&gt;
&lt;br /&gt;
define wican_check_active notify wican:status:.online set wican_check active&lt;br /&gt;
&lt;br /&gt;
define wican_check_inactive notify wican:status:.offline set wican_check inactive&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Beispielhafte Einrichtung des WiCAN im Ora Funky Cat als MQTT2-Device ===&lt;br /&gt;
Ab der WiCAN [https://github.com/meatpiHQ/wican-fw/releases Firmware] v2.98 (13. April 2024) kann die Benennung des Eintrages im MQTT-Server frei gewählt werden. Die untere Konfiguration geht von folgender Benennung aus: &lt;br /&gt;
&lt;br /&gt;
* TX Topic: &#039;&#039;wican/ora/can/tx&#039;&#039;&lt;br /&gt;
* RX Topic: &#039;&#039;wican/ora/can/tx&#039;&#039;&lt;br /&gt;
* Status Topic: &#039;&#039;wican/ora/can/status&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cfg&amp;quot;&amp;gt;&lt;br /&gt;
define wican MQTT2_DEVICE&lt;br /&gt;
attr wican alias Ora&lt;br /&gt;
attr wican stateFormat B: SoC% M: Mileage km (status)&lt;br /&gt;
attr wican event-on-change-reading status&lt;br /&gt;
attr wican event-on-update-reading frame_1_data_6,SoC&lt;br /&gt;
attr wican DbLogExclude .*&lt;br /&gt;
attr wican DbLogInclude SoC:3600&lt;br /&gt;
attr wican readingList wican/ora/can/status:.* {json2nameValue($EVENT)}\&lt;br /&gt;
 wican/ora/can/rx:.* {json2nameValue($EVENT)}&lt;br /&gt;
attr wican setList read_SoC:noArg wican/ora/can/tx {&amp;quot;bus&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;tx&amp;quot;,&amp;quot;ts&amp;quot;:49539,&amp;quot;frame&amp;quot;:[{&amp;quot;id&amp;quot;:1931,&amp;quot;dlc&amp;quot;:8,&amp;quot;rtr&amp;quot;:false,&amp;quot;extd&amp;quot;:false,&amp;quot;data&amp;quot;:[3,34,32,80,170,170,170,170]}]}\&lt;br /&gt;
read_TrueSoC:noArg wican/ora/can/tx {&amp;quot;bus&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;tx&amp;quot;,&amp;quot;ts&amp;quot;:27825,&amp;quot;frame&amp;quot;:[{&amp;quot;id&amp;quot;:1931,&amp;quot;dlc&amp;quot;:8,&amp;quot;rtr&amp;quot;:false,&amp;quot;extd&amp;quot;:false,&amp;quot;data&amp;quot;:[3,34,3,8,170,170,170,170]}]}\&lt;br /&gt;
read_SoH:noArg wican/ora/can/tx {&amp;quot;bus&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;tx&amp;quot;,&amp;quot;ts&amp;quot;:12016,&amp;quot;frame&amp;quot;:[{&amp;quot;id&amp;quot;:1931,&amp;quot;dlc&amp;quot;:8,&amp;quot;rtr&amp;quot;:false,&amp;quot;extd&amp;quot;:false,&amp;quot;data&amp;quot;:[3,34,32,81,170,170,170,170]}]}\&lt;br /&gt;
read_SoE:noArg wican/ora/can/tx {&amp;quot;bus&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;tx&amp;quot;,&amp;quot;ts&amp;quot;:17777,&amp;quot;frame&amp;quot;:[{&amp;quot;id&amp;quot;:1930,&amp;quot;dlc&amp;quot;:8,&amp;quot;rtr&amp;quot;:false,&amp;quot;extd&amp;quot;:false,&amp;quot;data&amp;quot;:[3,34,208,98,170,170,170,170]}]}\&lt;br /&gt;
read_OpVoltage:noArg wican/ora/can/tx {&amp;quot;bus&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;tx&amp;quot;,&amp;quot;ts&amp;quot;:17645,&amp;quot;frame&amp;quot;:[{&amp;quot;id&amp;quot;:1931,&amp;quot;dlc&amp;quot;:8,&amp;quot;rtr&amp;quot;:false,&amp;quot;extd&amp;quot;:false,&amp;quot;data&amp;quot;:[3,34,208,3,170,170,170,170]}]}\&lt;br /&gt;
read_Mileage:noArg wican/ora/can/tx {&amp;quot;bus&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;tx&amp;quot;,&amp;quot;ts&amp;quot;:35674,&amp;quot;frame&amp;quot;:[{&amp;quot;id&amp;quot;:1931,&amp;quot;dlc&amp;quot;:8,&amp;quot;rtr&amp;quot;:false,&amp;quot;extd&amp;quot;:false,&amp;quot;data&amp;quot;:[3,34,208,4,170,170,170,170]}]}\&lt;br /&gt;
read_TotalCharge:noArg wican/ora/can/tx {&amp;quot;bus&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;tx&amp;quot;,&amp;quot;ts&amp;quot;:28695,&amp;quot;frame&amp;quot;:[{&amp;quot;id&amp;quot;:1931,&amp;quot;dlc&amp;quot;:8,&amp;quot;rtr&amp;quot;:false,&amp;quot;extd&amp;quot;:false,&amp;quot;data&amp;quot;:[3,34,33,113,170,170,170,170]}]}\&lt;br /&gt;
read_TotalDischarge:noArg wican/ora/can/tx {&amp;quot;bus&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;tx&amp;quot;,&amp;quot;ts&amp;quot;:28695,&amp;quot;frame&amp;quot;:[{&amp;quot;id&amp;quot;:1931,&amp;quot;dlc&amp;quot;:8,&amp;quot;rtr&amp;quot;:false,&amp;quot;extd&amp;quot;:false,&amp;quot;data&amp;quot;:[3,34,33,114,170,170,170,170]}]}\&lt;br /&gt;
read_BatteryVoltage:noArg wican/ora/can/tx {&amp;quot;bus&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;tx&amp;quot;,&amp;quot;ts&amp;quot;:58591,&amp;quot;frame&amp;quot;:[{&amp;quot;id&amp;quot;:1931,&amp;quot;dlc&amp;quot;:8,&amp;quot;rtr&amp;quot;:false,&amp;quot;extd&amp;quot;:false,&amp;quot;data&amp;quot;:[3,34,32,3,170,170,170,170]}]}&lt;br /&gt;
attr wican userReadings SoC:frame_1_data_6:.* {\&lt;br /&gt;
	if (ReadingsNum($NAME, &#039;frame_1_id&#039;, 0) == 1995 and ReadingsNum($NAME, &#039;frame_1_data_1&#039;, 0)  == 5 and ReadingsNum($NAME, &#039;frame_1_data_2&#039;, 0)  == 98\&lt;br /&gt;
      and ReadingsNum($NAME, &#039;frame_1_data_3&#039;, 0)  == 32 and ReadingsNum($NAME, &#039;frame_1_data_4&#039;, 0)  == 80 ) {\&lt;br /&gt;
		return (ReadingsNum($NAME, &#039;frame_1_data_5&#039;, 0) * 256+ReadingsNum($NAME, &#039;frame_1_data_6&#039;, 0))/10.0\&lt;br /&gt;
	} else {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;SoC&#039;, 0)\&lt;br /&gt;
	}\&lt;br /&gt;
},\&lt;br /&gt;
SoH:frame_1_data_6:.* {\&lt;br /&gt;
	if (ReadingsNum($NAME, &#039;frame_1_id&#039;, 0) == 1995 and ReadingsNum($NAME, &#039;frame_1_data_1&#039;, 0)  == 5 and ReadingsNum($NAME, &#039;frame_1_data_2&#039;, 0)  == 98\&lt;br /&gt;
      and ReadingsNum($NAME, &#039;frame_1_data_3&#039;, 0)  == 32 and ReadingsNum($NAME, &#039;frame_1_data_4&#039;, 0)  == 81 ) {\&lt;br /&gt;
		return (ReadingsNum($NAME, &#039;frame_1_data_5&#039;, 0) * 256 + ReadingsNum($NAME, &#039;frame_1_data_6&#039;, 0))/10.0\&lt;br /&gt;
	} else {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;SoH&#039;, 0)\&lt;br /&gt;
	}\&lt;br /&gt;
},\&lt;br /&gt;
TrueSoC:frame_1_data_6:.* {\&lt;br /&gt;
	if (ReadingsNum($NAME, &#039;frame_1_id&#039;, 0) == 1995 and ReadingsNum($NAME, &#039;frame_1_data_3&#039;, 0)  == 3) {\&lt;br /&gt;
		return (ReadingsNum($NAME, &#039;frame_1_data_5&#039;, 0) * 256 + ReadingsNum($NAME, &#039;frame_1_data_6&#039;, 0))/10.0\&lt;br /&gt;
	} else {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;TrueSoC&#039;, 0)\&lt;br /&gt;
	}\&lt;br /&gt;
},\&lt;br /&gt;
Mileage:frame_1_data_6:.* {\&lt;br /&gt;
	if (ReadingsNum($NAME, &#039;frame_1_id&#039;, 0) == 1995 and ReadingsNum($NAME, &#039;frame_1_data_1&#039;, 0)  == 6 and ReadingsNum($NAME, &#039;frame_1_data_2&#039;, 0)  == 98\&lt;br /&gt;
      and ReadingsNum($NAME, &#039;frame_1_data_3&#039;, 0)  == 208 ) {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;frame_1_data_6&#039;, 0) * 256 + ReadingsNum($NAME, &#039;frame_1_data_7&#039;, 0)\&lt;br /&gt;
	} else {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;Mileage&#039;, 0)\&lt;br /&gt;
	}\&lt;br /&gt;
},\&lt;br /&gt;
OperatingVoltage:frame_1_data_6:.* {\&lt;br /&gt;
	if (ReadingsNum($NAME, &#039;frame_1_id&#039;, 0) == 1995 and ReadingsNum($NAME, &#039;frame_1_data_1&#039;, 0)  == 4 and ReadingsNum($NAME, &#039;frame_1_data_2&#039;, 0)  == 98\&lt;br /&gt;
      and ReadingsNum($NAME, &#039;frame_1_data_3&#039;, 0)  == 208 ) {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;frame_1_data_5&#039;, 0) /10.0\&lt;br /&gt;
	} else {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;OperatingVoltage&#039;, 0)\&lt;br /&gt;
	}\&lt;br /&gt;
},\&lt;br /&gt;
TotalCharge:frame_1_data_6:.* {\&lt;br /&gt;
	if (ReadingsNum($NAME, &#039;frame_1_id&#039;, 0) == 1995 and ReadingsNum($NAME, &#039;frame_1_data_1&#039;, 0)  == 7 and ReadingsNum($NAME, &#039;frame_1_data_2&#039;, 0)  == 98\&lt;br /&gt;
      and ReadingsNum($NAME, &#039;frame_1_data_3&#039;, 0)  == 33 and ReadingsNum($NAME, &#039;frame_1_data_4&#039;, 0)  == 113 ) {\&lt;br /&gt;
		return round( 2 * ReadingsNum($NAME, &#039;frame_1_data_7&#039;, 0) + ReadingsNum($NAME, &#039;frame_1_data_8&#039;, 0) / 128 , 0)\&lt;br /&gt;
	} else {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;TotalCharge&#039;, 0)\&lt;br /&gt;
	}\&lt;br /&gt;
},\&lt;br /&gt;
TotalDischarge:frame_1_data_6:.* {\&lt;br /&gt;
	if (ReadingsNum($NAME, &#039;frame_1_id&#039;, 0) == 1995 and ReadingsNum($NAME, &#039;frame_1_data_1&#039;, 0)  == 7 and ReadingsNum($NAME, &#039;frame_1_data_2&#039;, 0)  == 98\&lt;br /&gt;
  and ReadingsNum($NAME, &#039;frame_1_data_3&#039;, 0)  == 33 and ReadingsNum($NAME, &#039;frame_1_data_4&#039;, 0)  == 114 ) {\&lt;br /&gt;
		return round( 2 * ReadingsNum($NAME, &#039;frame_1_data_7&#039;, 0) + ReadingsNum($NAME, &#039;frame_1_data_8&#039;, 0) / 128 , 0)\&lt;br /&gt;
	} else {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;TotalDischarge&#039;, 0)\&lt;br /&gt;
	}\&lt;br /&gt;
},\&lt;br /&gt;
BatteryVoltage:frame_1_data_6:.* {\&lt;br /&gt;
	if (ReadingsNum($NAME, &#039;frame_1_id&#039;, 0) == 1995 and ReadingsNum($NAME, &#039;frame_1_data_1&#039;, 0)  == 16 and ReadingsNum($NAME, &#039;frame_1_data_2&#039;, 0)  == 9\&lt;br /&gt;
      and ReadingsNum($NAME, &#039;frame_1_data_3&#039;, 0)  == 98 and ReadingsNum($NAME, &#039;frame_1_data_4&#039;, 0)  == 32 ) {\&lt;br /&gt;
		return ( 256 * ReadingsNum($NAME, &#039;frame_1_data_6&#039;, 0) + ReadingsNum($NAME, &#039;frame_1_data_7&#039;, 0)) / 10.0 \&lt;br /&gt;
	} else {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;BatteryVoltage&#039;, 0)\&lt;br /&gt;
	}\&lt;br /&gt;
},\&lt;br /&gt;
SoE:frame_1_data_6:.* {\&lt;br /&gt;
	if (ReadingsNum($NAME, &#039;frame_1_id&#039;, 0) == 1994 and ReadingsNum($NAME, &#039;frame_1_data_1&#039;, 0)  == 7 and ReadingsNum($NAME, &#039;frame_1_data_2&#039;, 0)  == 98\&lt;br /&gt;
      and ReadingsNum($NAME, &#039;frame_1_data_3&#039;, 0)  == 208 and ReadingsNum($NAME, &#039;frame_1_data_4&#039;, 0)  == 98 ) {\&lt;br /&gt;
		return (256*ReadingsNum($NAME, &#039;frame_1_data_7&#039;, 0)+ReadingsNum($NAME, &#039;frame_1_data_8&#039;, 0)) / 10.0 \&lt;br /&gt;
	} else {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;SoE&#039;, 0)\&lt;br /&gt;
	}\&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Elektromobilität]]&lt;/div&gt;</summary>
		<author><name>Topos</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Ora_Funky_Cat&amp;diff=39268</id>
		<title>Ora Funky Cat</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Ora_Funky_Cat&amp;diff=39268"/>
		<updated>2024-04-21T11:21:33Z</updated>

		<summary type="html">&lt;p&gt;Topos: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Auf dieser Seite wird die Einbindung des E-Autos [https://www.ora-motor.de/ Ora Funky Cat] von GWM (Great Wall Motor aus China) in FHEM über die OBD2-Serviceschnittestelle erläutert.&lt;br /&gt;
&lt;br /&gt;
Benötigte Hardware: [https://www.meatpi.com/products/wican MeatPi WiCAN-OBD-C3 Adapter]&lt;br /&gt;
&lt;br /&gt;
Der WiCAN wird in die OBD2-Serviceschnittestelle (rechts neben Sicherungsfach unterhalb Lenkrad) gesteckt. Am besten über ein Verlängerungskabel oder indem man den OBD2-Stecker aus der Halterung drückt und mit dem WiCAN ins Sicherungsfach legt. &lt;br /&gt;
&lt;br /&gt;
Der WiCAN kommuniziert über den CAN-Bus des Fahrzeuges mit den Steuergeräten im Ora und kann sich über WLAN mit eine MQTT-Server verbinden. Näheres im obigen Link. Bei der WiCAN-Konfiguration mus das CAN-Protokoll &amp;quot;slcan&amp;quot; ausgewählt werden. Die Kommunikation erfolgt über den Eintrag &#039;&#039;can/tx&#039;&#039; und &#039;&#039;can/rx&#039;&#039; des WiCAN auf dem MQTT-Server. Bitte nicht vergessen, den automatischen Standby-Modus anzuschalten, ansonsten leert sich mit der Zeit die Fahrzeugbatterie.&lt;br /&gt;
&lt;br /&gt;
Die Integration eines MQTT-Servers in FHEM wird [[MQTT|&#039;&#039;&#039;hier&#039;&#039;&#039;]] erklärt. &lt;br /&gt;
&lt;br /&gt;
Ist das Auto eingeschaltet und der Adapter gesteckt, dann können über FHEM einige Fahrzeugdaten abgefragt werden. Weiter unten eine beispielhafte EInrichtung eines MQTT2-Devices. &lt;br /&gt;
&lt;br /&gt;
=== Readings ===&lt;br /&gt;
Die folgenden Werte werden mit unterer Beispielkonfiguration aus den Steuergeräten VCU (Vehicle Control Unit) und BMSv2 (Batterie Management System) ausgelesen:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Mileage:&#039;&#039;&#039; km-Stand - Abfrage über &amp;quot;set wican read_Mileage&amp;quot;&lt;br /&gt;
* &#039;&#039;&#039;SoC&#039;&#039;&#039;: Ladezustand Hochvolt-Antriebsbatterie in %  - Abfrage über &amp;quot;set wican read_SoC&amp;quot;&lt;br /&gt;
* &#039;&#039;&#039;TrueSoC&#039;&#039;&#039;: ein zweiter Wert. Hintergrund ist unbekannt - Abfrage über &amp;quot;set wican read_TrueSoC&amp;quot;&lt;br /&gt;
* &#039;&#039;&#039;SoE&#039;&#039;&#039;: Ladezustand Hochvolt-Antriebsbatterie in kW - Abfrage über &amp;quot;set wican read_SoE&amp;quot;&lt;br /&gt;
* &#039;&#039;&#039;SoH&#039;&#039;&#039;: Gesundheitszustand der Hochvolt-Antriebsbatterie in % - Abfrage über &amp;quot;set wican read_SoH&amp;quot;&lt;br /&gt;
* &#039;&#039;&#039;OperatingVoltage&#039;&#039;&#039;: Spannung Niedervolt-Fahrzeugbatterie in V - Abfrage über &amp;quot;set wican read_OperatingVoltage&amp;quot;&lt;br /&gt;
* &#039;&#039;&#039;BatteryVoltage&#039;&#039;&#039;: Spannung Hochvolt-Antriebsbatterie in V - Abfrage über &amp;quot;set wican read_BatteryVoltage&amp;quot;&lt;br /&gt;
* &#039;&#039;&#039;TotalCharge&#039;&#039;&#039;: Durch die Batterie aufgenommene Stromleistung in Ah (inklusive Rekuperation während des Fahrens) - Abfrage über &amp;quot;set wican read_Total Charge&amp;quot; Die Multiplikation mit 5 kV scheint die hinzugefügte elektrische Leistung zu ergeben.&lt;br /&gt;
* &#039;&#039;&#039;TotalDischarge&#039;&#039;&#039;: Von der Hochvolt-Batterie abgezogene Stromleistung in Ah - Abfrage über &amp;quot;set wican read_TotalDischarge&amp;quot; Die Multiplikation mit 5 kV scheint die abgerufene elektrische Leistung zu ergeben.&lt;br /&gt;
Das erste Auslesen kann über ein notify angestossen werden, sobald der WiCAN den Status &amp;quot;online&amp;quot; hat. &amp;lt;syntaxhighlight lang=&amp;quot;cfg&amp;quot;&amp;gt;&lt;br /&gt;
define wican_online notify wican:status:.online set wican read_SoC;; sleep 1;; set wican read_TrueSoC;; sleep 1;; set wican read_Mileage;; sleep 1;; set wican read_OpVoltage;; sleep 1;; set wican read_SoH;; sleep 1;; set wican read_TotalCharge;; sleep 1;; set wican read_TotalDischarge;; sleep 1;; set wican read_BatteryVoltage;; sleep 1;; set wican read_SoE&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Die weiteren Abfrage können über einen Timer erfolgen Der Timer kann mit einem notify ein- und wieder ausgeschaltet werden.&amp;lt;syntaxhighlight lang=&amp;quot;cfg&amp;quot;&amp;gt;&lt;br /&gt;
define wican_check at +*00:01:00 set wican read_SoC;; sleep 1;; set wican read_TrueSoC;; sleep 1;; set wican read_Mileage;; sleep 1;; set wican read_OpVoltage;; sleep 1;; set wican read_SoH;; sleep 1;; set wican read_TotalCharge;; sleep 1;; set wican read_TotalDischarge;; sleep 1;; set wican read_BatteryVoltage;; sleep 1;; set wican read_SoE&lt;br /&gt;
&lt;br /&gt;
define wican_check_active notify wican:status:.online set wican_check active&lt;br /&gt;
&lt;br /&gt;
define wican_check_inactive notify wican:status:.offline set wican_check inactive&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Beispielhafte Einrichtung des WiCAN im Ora Funky Cat als MQTT2-Device ===&lt;br /&gt;
Ab der WiCAN [https://github.com/meatpiHQ/wican-fw/releases Firmware] v2.98 (13. April 2024) kann die Benennung des Eintrages im MQTT-Server frei gewählt werden. Die untere Konfiguration geht von folgender Benennung aus: &lt;br /&gt;
&lt;br /&gt;
* TX Topic: &#039;&#039;wican/ora/can/tx&#039;&#039;&lt;br /&gt;
* RX Topic: &#039;&#039;wican/ora/can/tx&#039;&#039;&lt;br /&gt;
* Status Topic: &#039;&#039;wican/ora/can/status&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cfg&amp;quot;&amp;gt;&lt;br /&gt;
define wican MQTT2_DEVICE&lt;br /&gt;
attr wican alias Ora&lt;br /&gt;
attr wican stateFormat B: SoC% M: Mileage km (status)&lt;br /&gt;
attr wican event-on-change-reading status&lt;br /&gt;
attr wican event-on-update-reading frame_1_data_6,SoC&lt;br /&gt;
attr wican DbLogExclude .*&lt;br /&gt;
attr wican DbLogInclude SoC:3600&lt;br /&gt;
attr wican readingList wican/ora/can/status:.* {json2nameValue($EVENT)}\&lt;br /&gt;
 wican/ora/can/rx:.* {json2nameValue($EVENT)}&lt;br /&gt;
attr wican setList read_SoC:noArg wican/ora/can/tx {&amp;quot;bus&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;tx&amp;quot;,&amp;quot;ts&amp;quot;:49539,&amp;quot;frame&amp;quot;:[{&amp;quot;id&amp;quot;:1931,&amp;quot;dlc&amp;quot;:8,&amp;quot;rtr&amp;quot;:false,&amp;quot;extd&amp;quot;:false,&amp;quot;data&amp;quot;:[3,34,32,80,170,170,170,170]}]}\&lt;br /&gt;
read_TrueSoC:noArg wican/ora/can/tx {&amp;quot;bus&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;tx&amp;quot;,&amp;quot;ts&amp;quot;:27825,&amp;quot;frame&amp;quot;:[{&amp;quot;id&amp;quot;:1931,&amp;quot;dlc&amp;quot;:8,&amp;quot;rtr&amp;quot;:false,&amp;quot;extd&amp;quot;:false,&amp;quot;data&amp;quot;:[3,34,3,8,170,170,170,170]}]}\&lt;br /&gt;
read_SoH:noArg wican/ora/can/tx {&amp;quot;bus&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;tx&amp;quot;,&amp;quot;ts&amp;quot;:12016,&amp;quot;frame&amp;quot;:[{&amp;quot;id&amp;quot;:1931,&amp;quot;dlc&amp;quot;:8,&amp;quot;rtr&amp;quot;:false,&amp;quot;extd&amp;quot;:false,&amp;quot;data&amp;quot;:[3,34,32,81,170,170,170,170]}]}\&lt;br /&gt;
read_SoE:noArg wican/ora/can/tx {&amp;quot;bus&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;tx&amp;quot;,&amp;quot;ts&amp;quot;:17777,&amp;quot;frame&amp;quot;:[{&amp;quot;id&amp;quot;:1930,&amp;quot;dlc&amp;quot;:8,&amp;quot;rtr&amp;quot;:false,&amp;quot;extd&amp;quot;:false,&amp;quot;data&amp;quot;:[3,34,208,98,170,170,170,170]}]}\&lt;br /&gt;
read_OpVoltage:noArg wican/ora/can/tx {&amp;quot;bus&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;tx&amp;quot;,&amp;quot;ts&amp;quot;:17645,&amp;quot;frame&amp;quot;:[{&amp;quot;id&amp;quot;:1931,&amp;quot;dlc&amp;quot;:8,&amp;quot;rtr&amp;quot;:false,&amp;quot;extd&amp;quot;:false,&amp;quot;data&amp;quot;:[3,34,208,3,170,170,170,170]}]}\&lt;br /&gt;
read_Mileage:noArg wican/ora/can/tx {&amp;quot;bus&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;tx&amp;quot;,&amp;quot;ts&amp;quot;:35674,&amp;quot;frame&amp;quot;:[{&amp;quot;id&amp;quot;:1931,&amp;quot;dlc&amp;quot;:8,&amp;quot;rtr&amp;quot;:false,&amp;quot;extd&amp;quot;:false,&amp;quot;data&amp;quot;:[3,34,208,4,170,170,170,170]}]}\&lt;br /&gt;
read_TotalCharge:noArg wican/ora/can/tx {&amp;quot;bus&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;tx&amp;quot;,&amp;quot;ts&amp;quot;:28695,&amp;quot;frame&amp;quot;:[{&amp;quot;id&amp;quot;:1931,&amp;quot;dlc&amp;quot;:8,&amp;quot;rtr&amp;quot;:false,&amp;quot;extd&amp;quot;:false,&amp;quot;data&amp;quot;:[3,34,33,113,170,170,170,170]}]}\&lt;br /&gt;
read_TotalDischarge:noArg wican/ora/can/tx {&amp;quot;bus&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;tx&amp;quot;,&amp;quot;ts&amp;quot;:28695,&amp;quot;frame&amp;quot;:[{&amp;quot;id&amp;quot;:1931,&amp;quot;dlc&amp;quot;:8,&amp;quot;rtr&amp;quot;:false,&amp;quot;extd&amp;quot;:false,&amp;quot;data&amp;quot;:[3,34,33,114,170,170,170,170]}]}\&lt;br /&gt;
read_BatteryVoltage:noArg wican/ora/can/tx {&amp;quot;bus&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;tx&amp;quot;,&amp;quot;ts&amp;quot;:58591,&amp;quot;frame&amp;quot;:[{&amp;quot;id&amp;quot;:1931,&amp;quot;dlc&amp;quot;:8,&amp;quot;rtr&amp;quot;:false,&amp;quot;extd&amp;quot;:false,&amp;quot;data&amp;quot;:[3,34,32,3,170,170,170,170]}]}&lt;br /&gt;
attr wican userReadings SoC:frame_1_data_6:.* {\&lt;br /&gt;
	if (ReadingsNum($NAME, &#039;frame_1_id&#039;, 0) == 1995 and ReadingsNum($NAME, &#039;frame_1_data_1&#039;, 0)  == 5 and ReadingsNum($NAME, &#039;frame_1_data_2&#039;, 0)  == 98\&lt;br /&gt;
      and ReadingsNum($NAME, &#039;frame_1_data_3&#039;, 0)  == 32 and ReadingsNum($NAME, &#039;frame_1_data_4&#039;, 0)  == 80 ) {\&lt;br /&gt;
		return (ReadingsNum($NAME, &#039;frame_1_data_5&#039;, 0) * 256+ReadingsNum($NAME, &#039;frame_1_data_6&#039;, 0))/10.0\&lt;br /&gt;
	} else {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;SoC&#039;, 0)\&lt;br /&gt;
	}\&lt;br /&gt;
},\&lt;br /&gt;
SoH:frame_1_data_6:.* {\&lt;br /&gt;
	if (ReadingsNum($NAME, &#039;frame_1_id&#039;, 0) == 1995 and ReadingsNum($NAME, &#039;frame_1_data_1&#039;, 0)  == 5 and ReadingsNum($NAME, &#039;frame_1_data_2&#039;, 0)  == 98\&lt;br /&gt;
      and ReadingsNum($NAME, &#039;frame_1_data_3&#039;, 0)  == 32 and ReadingsNum($NAME, &#039;frame_1_data_4&#039;, 0)  == 81 ) {\&lt;br /&gt;
		return (ReadingsNum($NAME, &#039;frame_1_data_5&#039;, 0) * 256 + ReadingsNum($NAME, &#039;frame_1_data_6&#039;, 0))/10.0\&lt;br /&gt;
	} else {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;SoH&#039;, 0)\&lt;br /&gt;
	}\&lt;br /&gt;
},\&lt;br /&gt;
TrueSoC:frame_1_data_6:.* {\&lt;br /&gt;
	if (ReadingsNum($NAME, &#039;frame_1_id&#039;, 0) == 1995 and ReadingsNum($NAME, &#039;frame_1_data_3&#039;, 0)  == 3) {\&lt;br /&gt;
		return (ReadingsNum($NAME, &#039;frame_1_data_5&#039;, 0) * 256 + ReadingsNum($NAME, &#039;frame_1_data_6&#039;, 0))/10.0\&lt;br /&gt;
	} else {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;TrueSoC&#039;, 0)\&lt;br /&gt;
	}\&lt;br /&gt;
},\&lt;br /&gt;
Mileage:frame_1_data_6:.* {\&lt;br /&gt;
	if (ReadingsNum($NAME, &#039;frame_1_id&#039;, 0) == 1995 and ReadingsNum($NAME, &#039;frame_1_data_1&#039;, 0)  == 6 and ReadingsNum($NAME, &#039;frame_1_data_2&#039;, 0)  == 98\&lt;br /&gt;
      and ReadingsNum($NAME, &#039;frame_1_data_3&#039;, 0)  == 208 ) {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;frame_1_data_6&#039;, 0) * 256 + ReadingsNum($NAME, &#039;frame_1_data_7&#039;, 0)\&lt;br /&gt;
	} else {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;Mileage&#039;, 0)\&lt;br /&gt;
	}\&lt;br /&gt;
},\&lt;br /&gt;
OperatingVoltage:frame_1_data_6:.* {\&lt;br /&gt;
	if (ReadingsNum($NAME, &#039;frame_1_id&#039;, 0) == 1995 and ReadingsNum($NAME, &#039;frame_1_data_1&#039;, 0)  == 4 and ReadingsNum($NAME, &#039;frame_1_data_2&#039;, 0)  == 98\&lt;br /&gt;
      and ReadingsNum($NAME, &#039;frame_1_data_3&#039;, 0)  == 208 ) {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;frame_1_data_5&#039;, 0) /10.0\&lt;br /&gt;
	} else {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;OperatingVoltage&#039;, 0)\&lt;br /&gt;
	}\&lt;br /&gt;
},\&lt;br /&gt;
TotalCharge:frame_1_data_6:.* {\&lt;br /&gt;
	if (ReadingsNum($NAME, &#039;frame_1_id&#039;, 0) == 1995 and ReadingsNum($NAME, &#039;frame_1_data_1&#039;, 0)  == 7 and ReadingsNum($NAME, &#039;frame_1_data_2&#039;, 0)  == 98\&lt;br /&gt;
      and ReadingsNum($NAME, &#039;frame_1_data_3&#039;, 0)  == 33 and ReadingsNum($NAME, &#039;frame_1_data_4&#039;, 0)  == 113 ) {\&lt;br /&gt;
		return round( 2 * ReadingsNum($NAME, &#039;frame_1_data_7&#039;, 0) + ReadingsNum($NAME, &#039;frame_1_data_8&#039;, 0) / 128 , 0)\&lt;br /&gt;
	} else {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;TotalCharge&#039;, 0)\&lt;br /&gt;
	}\&lt;br /&gt;
},\&lt;br /&gt;
TotalDischarge:frame_1_data_6:.* {\&lt;br /&gt;
	if (ReadingsNum($NAME, &#039;frame_1_id&#039;, 0) == 1995 and ReadingsNum($NAME, &#039;frame_1_data_1&#039;, 0)  == 7 and ReadingsNum($NAME, &#039;frame_1_data_2&#039;, 0)  == 98\&lt;br /&gt;
  and ReadingsNum($NAME, &#039;frame_1_data_3&#039;, 0)  == 33 and ReadingsNum($NAME, &#039;frame_1_data_4&#039;, 0)  == 114 ) {\&lt;br /&gt;
		return round( 2 * ReadingsNum($NAME, &#039;frame_1_data_7&#039;, 0) + ReadingsNum($NAME, &#039;frame_1_data_8&#039;, 0) / 128 , 0)\&lt;br /&gt;
	} else {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;TotalDischarge&#039;, 0)\&lt;br /&gt;
	}\&lt;br /&gt;
},\&lt;br /&gt;
BatteryVoltage:frame_1_data_6:.* {\&lt;br /&gt;
	if (ReadingsNum($NAME, &#039;frame_1_id&#039;, 0) == 1995 and ReadingsNum($NAME, &#039;frame_1_data_1&#039;, 0)  == 16 and ReadingsNum($NAME, &#039;frame_1_data_2&#039;, 0)  == 9\&lt;br /&gt;
      and ReadingsNum($NAME, &#039;frame_1_data_3&#039;, 0)  == 98 and ReadingsNum($NAME, &#039;frame_1_data_4&#039;, 0)  == 32 ) {\&lt;br /&gt;
		return ( 256 * ReadingsNum($NAME, &#039;frame_1_data_6&#039;, 0) + ReadingsNum($NAME, &#039;frame_1_data_7&#039;, 0)) / 10.0 \&lt;br /&gt;
	} else {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;BatteryVoltage&#039;, 0)\&lt;br /&gt;
	}\&lt;br /&gt;
},\&lt;br /&gt;
SoE:frame_1_data_6:.* {\&lt;br /&gt;
	if (ReadingsNum($NAME, &#039;frame_1_id&#039;, 0) == 1994 and ReadingsNum($NAME, &#039;frame_1_data_1&#039;, 0)  == 7 and ReadingsNum($NAME, &#039;frame_1_data_2&#039;, 0)  == 98\&lt;br /&gt;
      and ReadingsNum($NAME, &#039;frame_1_data_3&#039;, 0)  == 208 and ReadingsNum($NAME, &#039;frame_1_data_4&#039;, 0)  == 98 ) {\&lt;br /&gt;
		return (256*ReadingsNum($NAME, &#039;frame_1_data_7&#039;, 0)+ReadingsNum($NAME, &#039;frame_1_data_8&#039;, 0)) / 10.0 \&lt;br /&gt;
	} else {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;SoE&#039;, 0)\&lt;br /&gt;
	}\&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Elektromobilität]]&lt;/div&gt;</summary>
		<author><name>Topos</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Ora_Funky_Cat&amp;diff=39267</id>
		<title>Ora Funky Cat</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Ora_Funky_Cat&amp;diff=39267"/>
		<updated>2024-04-21T11:18:27Z</updated>

		<summary type="html">&lt;p&gt;Topos: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Auf dieser Seite wird die Einbindung des E-Autos [https://www.ora-motor.de/ Ora Funky Cat] von GWM (Great Wall Motor aus China) in FHEM über die OBD2-Serviceschnittestelle erläutert.&lt;br /&gt;
&lt;br /&gt;
Benötigte Hardware: [https://www.meatpi.com/products/wican MeatPi WiCAN-OBD-C3 Adapter]&lt;br /&gt;
&lt;br /&gt;
Der WiCAN wird in die OBD2-Serviceschnittestelle (rechts neben Sicherungsfach unterhalb Lenkrad) gesteckt. Am besten über ein Verlängerungskabel oder indem man den OBD2-Stecker aus der Halterung drückt und mit dem WiCAN ins Sicherungsfach legt. &lt;br /&gt;
&lt;br /&gt;
Der WiCAN kommuniziert über den CAN-Bus des Fahrzeuges mit den Steuergeräten im Ora und kann sich über WLAN mit eine MQTT-Server verbinden. Näheres im obigen Link. Bei der WiCAN-Konfiguration mus das CAN-Protokoll &amp;quot;slcan&amp;quot; ausgewählt werden. Die Kommunikation erfolgt über den Eintrag &#039;&#039;can/tx&#039;&#039; und &#039;&#039;can/rx&#039;&#039; des WiCAN auf dem MQTT-Server. Bitte nicht vergessen, den automatischen Standby-Modus anzuschalten, ansonsten leert sich mit der Zeit die Fahrzeugbatterie.&lt;br /&gt;
&lt;br /&gt;
Die Integration eines MQTT-Servers in FHEM wird [[MQTT|&#039;&#039;&#039;hier&#039;&#039;&#039;]] erklärt. &lt;br /&gt;
&lt;br /&gt;
Ist das Auto eingeschaltet und der Adapter gesteckt, dann können über FHEM einige Fahrzeugdaten abgefragt werden. Weiter unten eine beispielhafte EInrichtung eines MQTT2-Devices. &lt;br /&gt;
&lt;br /&gt;
=== Readings ===&lt;br /&gt;
Die folgenden Werte werden mit unterer Beispielkonfiguration ausgelesen:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Mileage:&#039;&#039;&#039; km-Stand - Abfrage über &amp;quot;set wican read_Mileage&amp;quot;&lt;br /&gt;
* &#039;&#039;&#039;SoC&#039;&#039;&#039;: Ladezustand Hochvolt-Antriebsbatterie in %  - Abfrage über &amp;quot;set wican read_SoC&amp;quot;&lt;br /&gt;
* &#039;&#039;&#039;TrueSoC&#039;&#039;&#039;: ein zweiter Wert. Hintergrund ist unbekannt - Abfrage über &amp;quot;set wican read_TrueSoC&amp;quot;&lt;br /&gt;
* &#039;&#039;&#039;SoE&#039;&#039;&#039;: Ladezustand Hochvolt-Antriebsbatterie in kW - Abfrage über &amp;quot;set wican read_SoE&amp;quot;&lt;br /&gt;
* &#039;&#039;&#039;SoH&#039;&#039;&#039;: Gesundheitszustand der Hochvolt-Antriebsbatterie in % - Abfrage über &amp;quot;set wican read_SoH&amp;quot;&lt;br /&gt;
* &#039;&#039;&#039;OperatingVoltage&#039;&#039;&#039;: Spannung Niedervolt-Fahrzeugbatterie in V - Abfrage über &amp;quot;set wican read_OperatingVoltage&amp;quot;&lt;br /&gt;
* &#039;&#039;&#039;BatteryVoltage&#039;&#039;&#039;: Spannung Hochvolt-Antriebsbatterie in V - Abfrage über &amp;quot;set wican read_BatteryVoltage&amp;quot;&lt;br /&gt;
* &#039;&#039;&#039;TotalCharge&#039;&#039;&#039;: Durch die Batterie aufgenommene Stromleistung in Ah (inklusive Rekuperation während des Fahrens) - Abfrage über &amp;quot;set wican read_Total Charge&amp;quot; Die Multiplikation mit 5 kV scheint die hinzugefügte elektrische Leistung zu ergeben.&lt;br /&gt;
* &#039;&#039;&#039;TotalDischarge&#039;&#039;&#039;: Von der Hochvolt-Batterie abgezogene Stromleistung in Ah - Abfrage über &amp;quot;set wican read_TotalDischarge&amp;quot; Die Multiplikation mit 5 kV scheint die abgerufene elektrische Leistung zu ergeben.&lt;br /&gt;
Das erste Auslesen kann über ein notify angestossen werden, sobald der WiCAN den Status &amp;quot;online&amp;quot; hat. &amp;lt;syntaxhighlight lang=&amp;quot;cfg&amp;quot;&amp;gt;&lt;br /&gt;
define wican_online notify wican:status:.online set wican read_SoC;; sleep 1;; set wican read_TrueSoC;; sleep 1;; set wican read_Mileage;; sleep 1;; set wican read_OpVoltage;; sleep 1;; set wican read_SoH;; sleep 1;; set wican read_TotalCharge;; sleep 1;; set wican read_TotalDischarge;; sleep 1;; set wican read_BatteryVoltage;; sleep 1;; set wican read_SoE&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Die weiteren Abfrage können über einen Timer erfolgen Der Timer kann mit einem notify ein- und wieder ausgeschaltet werden.&amp;lt;syntaxhighlight lang=&amp;quot;cfg&amp;quot;&amp;gt;&lt;br /&gt;
define wican_check at +*00:01:00 set wican read_SoC;; sleep 1;; set wican read_TrueSoC;; sleep 1;; set wican read_Mileage;; sleep 1;; set wican read_OpVoltage;; sleep 1;; set wican read_SoH;; sleep 1;; set wican read_TotalCharge;; sleep 1;; set wican read_TotalDischarge;; sleep 1;; set wican read_BatteryVoltage;; sleep 1;; set wican read_SoE&lt;br /&gt;
&lt;br /&gt;
define wican_check_active notify wican:status:.online set wican_check active&lt;br /&gt;
&lt;br /&gt;
define wican_check_inactive notify wican:status:.offline set wican_check inactive&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Beispielhafte Einrichtung des WiCAN im Ora Funky Cat als MQTT2-Device ===&lt;br /&gt;
Ab der WiCAN [https://github.com/meatpiHQ/wican-fw/releases Firmware] v2.98 (13. April 2024) kann die Benennung des Eintrages im MQTT-Server frei gewählt werden. Die untere Konfiguration geht von folgender Benennung aus: &lt;br /&gt;
&lt;br /&gt;
* TX Topic: &#039;&#039;wican/ora/can/tx&#039;&#039;&lt;br /&gt;
* RX Topic: &#039;&#039;wican/ora/can/tx&#039;&#039;&lt;br /&gt;
* Status Topic: &#039;&#039;wican/ora/can/status&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cfg&amp;quot;&amp;gt;&lt;br /&gt;
define wican MQTT2_DEVICE&lt;br /&gt;
attr wican alias Ora&lt;br /&gt;
attr wican stateFormat B: SoC% M: Mileage km (status)&lt;br /&gt;
attr wican event-on-change-reading status&lt;br /&gt;
attr wican event-on-update-reading frame_1_data_6,SoC&lt;br /&gt;
attr wican DbLogExclude .*&lt;br /&gt;
attr wican DbLogInclude SoC:3600&lt;br /&gt;
attr wican readingList wican/ora/can/status:.* {json2nameValue($EVENT)}\&lt;br /&gt;
 wican/ora/can/rx:.* {json2nameValue($EVENT)}&lt;br /&gt;
attr wican setList read_SoC:noArg wican/ora/can/tx {&amp;quot;bus&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;tx&amp;quot;,&amp;quot;ts&amp;quot;:49539,&amp;quot;frame&amp;quot;:[{&amp;quot;id&amp;quot;:1931,&amp;quot;dlc&amp;quot;:8,&amp;quot;rtr&amp;quot;:false,&amp;quot;extd&amp;quot;:false,&amp;quot;data&amp;quot;:[3,34,32,80,170,170,170,170]}]}\&lt;br /&gt;
read_TrueSoC:noArg wican/ora/can/tx {&amp;quot;bus&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;tx&amp;quot;,&amp;quot;ts&amp;quot;:27825,&amp;quot;frame&amp;quot;:[{&amp;quot;id&amp;quot;:1931,&amp;quot;dlc&amp;quot;:8,&amp;quot;rtr&amp;quot;:false,&amp;quot;extd&amp;quot;:false,&amp;quot;data&amp;quot;:[3,34,3,8,170,170,170,170]}]}\&lt;br /&gt;
read_SoH:noArg wican/ora/can/tx {&amp;quot;bus&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;tx&amp;quot;,&amp;quot;ts&amp;quot;:12016,&amp;quot;frame&amp;quot;:[{&amp;quot;id&amp;quot;:1931,&amp;quot;dlc&amp;quot;:8,&amp;quot;rtr&amp;quot;:false,&amp;quot;extd&amp;quot;:false,&amp;quot;data&amp;quot;:[3,34,32,81,170,170,170,170]}]}\&lt;br /&gt;
read_SoE:noArg wican/ora/can/tx {&amp;quot;bus&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;tx&amp;quot;,&amp;quot;ts&amp;quot;:17777,&amp;quot;frame&amp;quot;:[{&amp;quot;id&amp;quot;:1930,&amp;quot;dlc&amp;quot;:8,&amp;quot;rtr&amp;quot;:false,&amp;quot;extd&amp;quot;:false,&amp;quot;data&amp;quot;:[3,34,208,98,170,170,170,170]}]}\&lt;br /&gt;
read_OpVoltage:noArg wican/ora/can/tx {&amp;quot;bus&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;tx&amp;quot;,&amp;quot;ts&amp;quot;:17645,&amp;quot;frame&amp;quot;:[{&amp;quot;id&amp;quot;:1931,&amp;quot;dlc&amp;quot;:8,&amp;quot;rtr&amp;quot;:false,&amp;quot;extd&amp;quot;:false,&amp;quot;data&amp;quot;:[3,34,208,3,170,170,170,170]}]}\&lt;br /&gt;
read_Mileage:noArg wican/ora/can/tx {&amp;quot;bus&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;tx&amp;quot;,&amp;quot;ts&amp;quot;:35674,&amp;quot;frame&amp;quot;:[{&amp;quot;id&amp;quot;:1931,&amp;quot;dlc&amp;quot;:8,&amp;quot;rtr&amp;quot;:false,&amp;quot;extd&amp;quot;:false,&amp;quot;data&amp;quot;:[3,34,208,4,170,170,170,170]}]}\&lt;br /&gt;
read_TotalCharge:noArg wican/ora/can/tx {&amp;quot;bus&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;tx&amp;quot;,&amp;quot;ts&amp;quot;:28695,&amp;quot;frame&amp;quot;:[{&amp;quot;id&amp;quot;:1931,&amp;quot;dlc&amp;quot;:8,&amp;quot;rtr&amp;quot;:false,&amp;quot;extd&amp;quot;:false,&amp;quot;data&amp;quot;:[3,34,33,113,170,170,170,170]}]}\&lt;br /&gt;
read_TotalDischarge:noArg wican/ora/can/tx {&amp;quot;bus&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;tx&amp;quot;,&amp;quot;ts&amp;quot;:28695,&amp;quot;frame&amp;quot;:[{&amp;quot;id&amp;quot;:1931,&amp;quot;dlc&amp;quot;:8,&amp;quot;rtr&amp;quot;:false,&amp;quot;extd&amp;quot;:false,&amp;quot;data&amp;quot;:[3,34,33,114,170,170,170,170]}]}\&lt;br /&gt;
read_BatteryVoltage:noArg wican/ora/can/tx {&amp;quot;bus&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;tx&amp;quot;,&amp;quot;ts&amp;quot;:58591,&amp;quot;frame&amp;quot;:[{&amp;quot;id&amp;quot;:1931,&amp;quot;dlc&amp;quot;:8,&amp;quot;rtr&amp;quot;:false,&amp;quot;extd&amp;quot;:false,&amp;quot;data&amp;quot;:[3,34,32,3,170,170,170,170]}]}&lt;br /&gt;
attr wican userReadings SoC:frame_1_data_6:.* {\&lt;br /&gt;
	if (ReadingsNum($NAME, &#039;frame_1_id&#039;, 0) == 1995 and ReadingsNum($NAME, &#039;frame_1_data_1&#039;, 0)  == 5 and ReadingsNum($NAME, &#039;frame_1_data_2&#039;, 0)  == 98\&lt;br /&gt;
      and ReadingsNum($NAME, &#039;frame_1_data_3&#039;, 0)  == 32 and ReadingsNum($NAME, &#039;frame_1_data_4&#039;, 0)  == 80 ) {\&lt;br /&gt;
		return (ReadingsNum($NAME, &#039;frame_1_data_5&#039;, 0) * 256+ReadingsNum($NAME, &#039;frame_1_data_6&#039;, 0))/10.0\&lt;br /&gt;
	} else {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;SoC&#039;, 0)\&lt;br /&gt;
	}\&lt;br /&gt;
},\&lt;br /&gt;
SoH:frame_1_data_6:.* {\&lt;br /&gt;
	if (ReadingsNum($NAME, &#039;frame_1_id&#039;, 0) == 1995 and ReadingsNum($NAME, &#039;frame_1_data_1&#039;, 0)  == 5 and ReadingsNum($NAME, &#039;frame_1_data_2&#039;, 0)  == 98\&lt;br /&gt;
      and ReadingsNum($NAME, &#039;frame_1_data_3&#039;, 0)  == 32 and ReadingsNum($NAME, &#039;frame_1_data_4&#039;, 0)  == 81 ) {\&lt;br /&gt;
		return (ReadingsNum($NAME, &#039;frame_1_data_5&#039;, 0) * 256 + ReadingsNum($NAME, &#039;frame_1_data_6&#039;, 0))/10.0\&lt;br /&gt;
	} else {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;SoH&#039;, 0)\&lt;br /&gt;
	}\&lt;br /&gt;
},\&lt;br /&gt;
TrueSoC:frame_1_data_6:.* {\&lt;br /&gt;
	if (ReadingsNum($NAME, &#039;frame_1_id&#039;, 0) == 1995 and ReadingsNum($NAME, &#039;frame_1_data_3&#039;, 0)  == 3) {\&lt;br /&gt;
		return (ReadingsNum($NAME, &#039;frame_1_data_5&#039;, 0) * 256 + ReadingsNum($NAME, &#039;frame_1_data_6&#039;, 0))/10.0\&lt;br /&gt;
	} else {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;TrueSoC&#039;, 0)\&lt;br /&gt;
	}\&lt;br /&gt;
},\&lt;br /&gt;
Mileage:frame_1_data_6:.* {\&lt;br /&gt;
	if (ReadingsNum($NAME, &#039;frame_1_id&#039;, 0) == 1995 and ReadingsNum($NAME, &#039;frame_1_data_1&#039;, 0)  == 6 and ReadingsNum($NAME, &#039;frame_1_data_2&#039;, 0)  == 98\&lt;br /&gt;
      and ReadingsNum($NAME, &#039;frame_1_data_3&#039;, 0)  == 208 ) {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;frame_1_data_6&#039;, 0) * 256 + ReadingsNum($NAME, &#039;frame_1_data_7&#039;, 0)\&lt;br /&gt;
	} else {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;Mileage&#039;, 0)\&lt;br /&gt;
	}\&lt;br /&gt;
},\&lt;br /&gt;
OperatingVoltage:frame_1_data_6:.* {\&lt;br /&gt;
	if (ReadingsNum($NAME, &#039;frame_1_id&#039;, 0) == 1995 and ReadingsNum($NAME, &#039;frame_1_data_1&#039;, 0)  == 4 and ReadingsNum($NAME, &#039;frame_1_data_2&#039;, 0)  == 98\&lt;br /&gt;
      and ReadingsNum($NAME, &#039;frame_1_data_3&#039;, 0)  == 208 ) {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;frame_1_data_5&#039;, 0) /10.0\&lt;br /&gt;
	} else {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;OperatingVoltage&#039;, 0)\&lt;br /&gt;
	}\&lt;br /&gt;
},\&lt;br /&gt;
TotalCharge:frame_1_data_6:.* {\&lt;br /&gt;
	if (ReadingsNum($NAME, &#039;frame_1_id&#039;, 0) == 1995 and ReadingsNum($NAME, &#039;frame_1_data_1&#039;, 0)  == 7 and ReadingsNum($NAME, &#039;frame_1_data_2&#039;, 0)  == 98\&lt;br /&gt;
      and ReadingsNum($NAME, &#039;frame_1_data_3&#039;, 0)  == 33 and ReadingsNum($NAME, &#039;frame_1_data_4&#039;, 0)  == 113 ) {\&lt;br /&gt;
		return round( 2 * ReadingsNum($NAME, &#039;frame_1_data_7&#039;, 0) + ReadingsNum($NAME, &#039;frame_1_data_8&#039;, 0) / 128 , 0)\&lt;br /&gt;
	} else {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;TotalCharge&#039;, 0)\&lt;br /&gt;
	}\&lt;br /&gt;
},\&lt;br /&gt;
TotalDischarge:frame_1_data_6:.* {\&lt;br /&gt;
	if (ReadingsNum($NAME, &#039;frame_1_id&#039;, 0) == 1995 and ReadingsNum($NAME, &#039;frame_1_data_1&#039;, 0)  == 7 and ReadingsNum($NAME, &#039;frame_1_data_2&#039;, 0)  == 98\&lt;br /&gt;
  and ReadingsNum($NAME, &#039;frame_1_data_3&#039;, 0)  == 33 and ReadingsNum($NAME, &#039;frame_1_data_4&#039;, 0)  == 114 ) {\&lt;br /&gt;
		return round( 2 * ReadingsNum($NAME, &#039;frame_1_data_7&#039;, 0) + ReadingsNum($NAME, &#039;frame_1_data_8&#039;, 0) / 128 , 0)\&lt;br /&gt;
	} else {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;TotalDischarge&#039;, 0)\&lt;br /&gt;
	}\&lt;br /&gt;
},\&lt;br /&gt;
BatteryVoltage:frame_1_data_6:.* {\&lt;br /&gt;
	if (ReadingsNum($NAME, &#039;frame_1_id&#039;, 0) == 1995 and ReadingsNum($NAME, &#039;frame_1_data_1&#039;, 0)  == 16 and ReadingsNum($NAME, &#039;frame_1_data_2&#039;, 0)  == 9\&lt;br /&gt;
      and ReadingsNum($NAME, &#039;frame_1_data_3&#039;, 0)  == 98 and ReadingsNum($NAME, &#039;frame_1_data_4&#039;, 0)  == 32 ) {\&lt;br /&gt;
		return ( 256 * ReadingsNum($NAME, &#039;frame_1_data_6&#039;, 0) + ReadingsNum($NAME, &#039;frame_1_data_7&#039;, 0)) / 10.0 \&lt;br /&gt;
	} else {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;BatteryVoltage&#039;, 0)\&lt;br /&gt;
	}\&lt;br /&gt;
},\&lt;br /&gt;
SoE:frame_1_data_6:.* {\&lt;br /&gt;
	if (ReadingsNum($NAME, &#039;frame_1_id&#039;, 0) == 1994 and ReadingsNum($NAME, &#039;frame_1_data_1&#039;, 0)  == 7 and ReadingsNum($NAME, &#039;frame_1_data_2&#039;, 0)  == 98\&lt;br /&gt;
      and ReadingsNum($NAME, &#039;frame_1_data_3&#039;, 0)  == 208 and ReadingsNum($NAME, &#039;frame_1_data_4&#039;, 0)  == 98 ) {\&lt;br /&gt;
		return (256*ReadingsNum($NAME, &#039;frame_1_data_7&#039;, 0)+ReadingsNum($NAME, &#039;frame_1_data_8&#039;, 0)) / 10.0 \&lt;br /&gt;
	} else {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;SoE&#039;, 0)\&lt;br /&gt;
	}\&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Elektromobilität]]&lt;/div&gt;</summary>
		<author><name>Topos</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Ora_Funky_Cat&amp;diff=39266</id>
		<title>Ora Funky Cat</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Ora_Funky_Cat&amp;diff=39266"/>
		<updated>2024-04-21T11:12:29Z</updated>

		<summary type="html">&lt;p&gt;Topos: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Auf dieser Seite wird die Einbindung des E-Autos [https://www.ora-motor.de/ Ora Funky Cat] von GWM (Great Wall Motor aus China) in FHEM über die OBD2-Serviceschnittestelle erläutert.&lt;br /&gt;
&lt;br /&gt;
Benötigte Hardware: [https://www.meatpi.com/products/wican MeatPi WiCAN-OBD-C3 Dongle]&lt;br /&gt;
&lt;br /&gt;
Der WiCAN wird in die OBD2-Serviceschnittestelle (rechts neben Sicherungsfach unterhalb Lenkrad) gesteckt. Am besten über ein Verlängerungskabel oder indem man den OBD2-Stecker aus der Halterung drückt und mit dem WiCAN ins Sicherungsfach legt. &lt;br /&gt;
&lt;br /&gt;
Der WiCAN kann sich über WLAN mit eine MQTT-Server verbinden. Näheres im obigen Link. Als CAN-Protokoll &amp;quot;slcan&amp;quot; auswählen. Die Kommunikation erfolgt über den Eintrag &#039;&#039;can/tx&#039;&#039; und &#039;&#039;can/rx&#039;&#039; des WiCAN auf dem MQTT-Server. Bitte nicht vergessen, den automatischen Standby-Modus anzuschalten, ansonsten leert sich mit der Zeit die Fahrzeugbatterie.&lt;br /&gt;
&lt;br /&gt;
Die Integration eines MQTT-Servers in FHEM wird [[MQTT|&#039;&#039;&#039;hier&#039;&#039;&#039;]] erklärt. &lt;br /&gt;
&lt;br /&gt;
Ist das Auto eingeschaltet und der Dongle gesteckt, dann können über FHEM Fahrzeugwerte abgefragt werden. Weiter unten eine beispielhafte EInrichtung eines MQTT2-Devices. &lt;br /&gt;
&lt;br /&gt;
=== Readings ===&lt;br /&gt;
Die folgenden Werte werden mit unterer Beispielkonfiguration ausgelesen:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Mileage:&#039;&#039;&#039; km-Stand - Abfrage über &amp;quot;set wican read_Mileage&amp;quot;&lt;br /&gt;
* &#039;&#039;&#039;SoC&#039;&#039;&#039;: Ladezustand Hochvolt-Antriebsbatterie in %  - Abfrage über &amp;quot;set wican read_SoC&amp;quot;&lt;br /&gt;
* &#039;&#039;&#039;TrueSoC&#039;&#039;&#039;: ein zweiter Wert. Hintergrund ist unbekannt - Abfrage über &amp;quot;set wican read_TrueSoC&amp;quot;&lt;br /&gt;
* &#039;&#039;&#039;SoE&#039;&#039;&#039;: Ladezustand Hochvolt-Antriebsbatterie in kW - Abfrage über &amp;quot;set wican read_SoE&amp;quot;&lt;br /&gt;
* &#039;&#039;&#039;SoH&#039;&#039;&#039;: Gesundheitszustand der Hochvolt-Antriebsbatterie in % - Abfrage über &amp;quot;set wican read_SoH&amp;quot;&lt;br /&gt;
* &#039;&#039;&#039;OperatingVoltage&#039;&#039;&#039;: Spannung Niedervolt-Fahrzeugbatterie in V - Abfrage über &amp;quot;set wican read_OperatingVoltage&amp;quot;&lt;br /&gt;
* &#039;&#039;&#039;BatteryVoltage&#039;&#039;&#039;: Spannung Hochvolt-Antriebsbatterie in V - Abfrage über &amp;quot;set wican read_BatteryVoltage&amp;quot;&lt;br /&gt;
* &#039;&#039;&#039;TotalCharge&#039;&#039;&#039;: Durch die Batterie aufgenommene Stromleistung in Ah (inklusive Rekuperation während des Fahrens) - Abfrage über &amp;quot;set wican read_Total Charge&amp;quot; Die Multiplikation mit 5 kV scheint die hinzugefügte elektrische Leistung zu ergeben.&lt;br /&gt;
* &#039;&#039;&#039;TotalDischarge&#039;&#039;&#039;: Von der Hochvolt-Batterie abgezogene Stromleistung in Ah - Abfrage über &amp;quot;set wican read_TotalDischarge&amp;quot; Die Multiplikation mit 5 kV scheint die abgerufene elektrische Leistung zu ergeben.&lt;br /&gt;
Das erste Auslesen kann über ein notify angestossen werden, sobald der WiCAN den Status &amp;quot;online&amp;quot; hat. &amp;lt;syntaxhighlight lang=&amp;quot;cfg&amp;quot;&amp;gt;&lt;br /&gt;
define wican_online notify wican:status:.online set wican read_SoC;; sleep 1;; set wican read_TrueSoC;; sleep 1;; set wican read_Mileage;; sleep 1;; set wican read_OpVoltage;; sleep 1;; set wican read_SoH;; sleep 1;; set wican read_TotalCharge;; sleep 1;; set wican read_TotalDischarge;; sleep 1;; set wican read_BatteryVoltage;; sleep 1;; set wican read_SoE&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Die weiteren Abfrage können über einen Timer erfolgen Der Timer kann mit einem notify ein- und wieder ausgeschaltet werden.&amp;lt;syntaxhighlight lang=&amp;quot;cfg&amp;quot;&amp;gt;&lt;br /&gt;
define wican_check at +*00:01:00 set wican read_SoC;; sleep 1;; set wican read_TrueSoC;; sleep 1;; set wican read_Mileage;; sleep 1;; set wican read_OpVoltage;; sleep 1;; set wican read_SoH;; sleep 1;; set wican read_TotalCharge;; sleep 1;; set wican read_TotalDischarge;; sleep 1;; set wican read_BatteryVoltage;; sleep 1;; set wican read_SoE&lt;br /&gt;
&lt;br /&gt;
define wican_check_active notify wican:status:.online set wican_check active&lt;br /&gt;
&lt;br /&gt;
define wican_check_inactive notify wican:status:.offline set wican_check inactive&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Beispielhafte Einrichtung des WiCAN im Ora Funky Cat als MQTT2-Device ===&lt;br /&gt;
Ab der WiCAN [https://github.com/meatpiHQ/wican-fw/releases Firmware] v2.98 (13. April 2024) kann die Benennung des Eintrages im MQTT-Server frei gewählt werden. Die untere Konfiguration geht von folgender Benennung aus: &lt;br /&gt;
&lt;br /&gt;
* TX Topic: &#039;&#039;wican/ora/can/tx&#039;&#039;&lt;br /&gt;
* RX Topic: &#039;&#039;wican/ora/can/tx&#039;&#039;&lt;br /&gt;
* Status Topic: &#039;&#039;wican/ora/can/status&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cfg&amp;quot;&amp;gt;&lt;br /&gt;
define wican MQTT2_DEVICE&lt;br /&gt;
attr wican alias Ora&lt;br /&gt;
attr wican stateFormat B: SoC% M: Mileage km (status)&lt;br /&gt;
attr wican event-on-change-reading status&lt;br /&gt;
attr wican event-on-update-reading frame_1_data_6,SoC&lt;br /&gt;
attr wican DbLogExclude .*&lt;br /&gt;
attr wican DbLogInclude SoC:3600&lt;br /&gt;
attr wican readingList wican/ora/can/status:.* {json2nameValue($EVENT)}\&lt;br /&gt;
 wican/ora/can/rx:.* {json2nameValue($EVENT)}&lt;br /&gt;
attr wican setList read_SoC:noArg wican/ora/can/tx {&amp;quot;bus&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;tx&amp;quot;,&amp;quot;ts&amp;quot;:49539,&amp;quot;frame&amp;quot;:[{&amp;quot;id&amp;quot;:1931,&amp;quot;dlc&amp;quot;:8,&amp;quot;rtr&amp;quot;:false,&amp;quot;extd&amp;quot;:false,&amp;quot;data&amp;quot;:[3,34,32,80,170,170,170,170]}]}\&lt;br /&gt;
read_TrueSoC:noArg wican/ora/can/tx {&amp;quot;bus&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;tx&amp;quot;,&amp;quot;ts&amp;quot;:27825,&amp;quot;frame&amp;quot;:[{&amp;quot;id&amp;quot;:1931,&amp;quot;dlc&amp;quot;:8,&amp;quot;rtr&amp;quot;:false,&amp;quot;extd&amp;quot;:false,&amp;quot;data&amp;quot;:[3,34,3,8,170,170,170,170]}]}\&lt;br /&gt;
read_SoH:noArg wican/ora/can/tx {&amp;quot;bus&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;tx&amp;quot;,&amp;quot;ts&amp;quot;:12016,&amp;quot;frame&amp;quot;:[{&amp;quot;id&amp;quot;:1931,&amp;quot;dlc&amp;quot;:8,&amp;quot;rtr&amp;quot;:false,&amp;quot;extd&amp;quot;:false,&amp;quot;data&amp;quot;:[3,34,32,81,170,170,170,170]}]}\&lt;br /&gt;
read_SoE:noArg wican/ora/can/tx {&amp;quot;bus&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;tx&amp;quot;,&amp;quot;ts&amp;quot;:17777,&amp;quot;frame&amp;quot;:[{&amp;quot;id&amp;quot;:1930,&amp;quot;dlc&amp;quot;:8,&amp;quot;rtr&amp;quot;:false,&amp;quot;extd&amp;quot;:false,&amp;quot;data&amp;quot;:[3,34,208,98,170,170,170,170]}]}\&lt;br /&gt;
read_OpVoltage:noArg wican/ora/can/tx {&amp;quot;bus&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;tx&amp;quot;,&amp;quot;ts&amp;quot;:17645,&amp;quot;frame&amp;quot;:[{&amp;quot;id&amp;quot;:1931,&amp;quot;dlc&amp;quot;:8,&amp;quot;rtr&amp;quot;:false,&amp;quot;extd&amp;quot;:false,&amp;quot;data&amp;quot;:[3,34,208,3,170,170,170,170]}]}\&lt;br /&gt;
read_Mileage:noArg wican/ora/can/tx {&amp;quot;bus&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;tx&amp;quot;,&amp;quot;ts&amp;quot;:35674,&amp;quot;frame&amp;quot;:[{&amp;quot;id&amp;quot;:1931,&amp;quot;dlc&amp;quot;:8,&amp;quot;rtr&amp;quot;:false,&amp;quot;extd&amp;quot;:false,&amp;quot;data&amp;quot;:[3,34,208,4,170,170,170,170]}]}\&lt;br /&gt;
read_TotalCharge:noArg wican/ora/can/tx {&amp;quot;bus&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;tx&amp;quot;,&amp;quot;ts&amp;quot;:28695,&amp;quot;frame&amp;quot;:[{&amp;quot;id&amp;quot;:1931,&amp;quot;dlc&amp;quot;:8,&amp;quot;rtr&amp;quot;:false,&amp;quot;extd&amp;quot;:false,&amp;quot;data&amp;quot;:[3,34,33,113,170,170,170,170]}]}\&lt;br /&gt;
read_TotalDischarge:noArg wican/ora/can/tx {&amp;quot;bus&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;tx&amp;quot;,&amp;quot;ts&amp;quot;:28695,&amp;quot;frame&amp;quot;:[{&amp;quot;id&amp;quot;:1931,&amp;quot;dlc&amp;quot;:8,&amp;quot;rtr&amp;quot;:false,&amp;quot;extd&amp;quot;:false,&amp;quot;data&amp;quot;:[3,34,33,114,170,170,170,170]}]}\&lt;br /&gt;
read_BatteryVoltage:noArg wican/ora/can/tx {&amp;quot;bus&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;tx&amp;quot;,&amp;quot;ts&amp;quot;:58591,&amp;quot;frame&amp;quot;:[{&amp;quot;id&amp;quot;:1931,&amp;quot;dlc&amp;quot;:8,&amp;quot;rtr&amp;quot;:false,&amp;quot;extd&amp;quot;:false,&amp;quot;data&amp;quot;:[3,34,32,3,170,170,170,170]}]}&lt;br /&gt;
attr wican userReadings SoC:frame_1_data_6:.* {\&lt;br /&gt;
	if (ReadingsNum($NAME, &#039;frame_1_id&#039;, 0) == 1995 and ReadingsNum($NAME, &#039;frame_1_data_1&#039;, 0)  == 5 and ReadingsNum($NAME, &#039;frame_1_data_2&#039;, 0)  == 98\&lt;br /&gt;
      and ReadingsNum($NAME, &#039;frame_1_data_3&#039;, 0)  == 32 and ReadingsNum($NAME, &#039;frame_1_data_4&#039;, 0)  == 80 ) {\&lt;br /&gt;
		return (ReadingsNum($NAME, &#039;frame_1_data_5&#039;, 0) * 256+ReadingsNum($NAME, &#039;frame_1_data_6&#039;, 0))/10.0\&lt;br /&gt;
	} else {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;SoC&#039;, 0)\&lt;br /&gt;
	}\&lt;br /&gt;
},\&lt;br /&gt;
SoH:frame_1_data_6:.* {\&lt;br /&gt;
	if (ReadingsNum($NAME, &#039;frame_1_id&#039;, 0) == 1995 and ReadingsNum($NAME, &#039;frame_1_data_1&#039;, 0)  == 5 and ReadingsNum($NAME, &#039;frame_1_data_2&#039;, 0)  == 98\&lt;br /&gt;
      and ReadingsNum($NAME, &#039;frame_1_data_3&#039;, 0)  == 32 and ReadingsNum($NAME, &#039;frame_1_data_4&#039;, 0)  == 81 ) {\&lt;br /&gt;
		return (ReadingsNum($NAME, &#039;frame_1_data_5&#039;, 0) * 256 + ReadingsNum($NAME, &#039;frame_1_data_6&#039;, 0))/10.0\&lt;br /&gt;
	} else {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;SoH&#039;, 0)\&lt;br /&gt;
	}\&lt;br /&gt;
},\&lt;br /&gt;
TrueSoC:frame_1_data_6:.* {\&lt;br /&gt;
	if (ReadingsNum($NAME, &#039;frame_1_id&#039;, 0) == 1995 and ReadingsNum($NAME, &#039;frame_1_data_3&#039;, 0)  == 3) {\&lt;br /&gt;
		return (ReadingsNum($NAME, &#039;frame_1_data_5&#039;, 0) * 256 + ReadingsNum($NAME, &#039;frame_1_data_6&#039;, 0))/10.0\&lt;br /&gt;
	} else {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;TrueSoC&#039;, 0)\&lt;br /&gt;
	}\&lt;br /&gt;
},\&lt;br /&gt;
Mileage:frame_1_data_6:.* {\&lt;br /&gt;
	if (ReadingsNum($NAME, &#039;frame_1_id&#039;, 0) == 1995 and ReadingsNum($NAME, &#039;frame_1_data_1&#039;, 0)  == 6 and ReadingsNum($NAME, &#039;frame_1_data_2&#039;, 0)  == 98\&lt;br /&gt;
      and ReadingsNum($NAME, &#039;frame_1_data_3&#039;, 0)  == 208 ) {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;frame_1_data_6&#039;, 0) * 256 + ReadingsNum($NAME, &#039;frame_1_data_7&#039;, 0)\&lt;br /&gt;
	} else {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;Mileage&#039;, 0)\&lt;br /&gt;
	}\&lt;br /&gt;
},\&lt;br /&gt;
OperatingVoltage:frame_1_data_6:.* {\&lt;br /&gt;
	if (ReadingsNum($NAME, &#039;frame_1_id&#039;, 0) == 1995 and ReadingsNum($NAME, &#039;frame_1_data_1&#039;, 0)  == 4 and ReadingsNum($NAME, &#039;frame_1_data_2&#039;, 0)  == 98\&lt;br /&gt;
      and ReadingsNum($NAME, &#039;frame_1_data_3&#039;, 0)  == 208 ) {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;frame_1_data_5&#039;, 0) /10.0\&lt;br /&gt;
	} else {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;OperatingVoltage&#039;, 0)\&lt;br /&gt;
	}\&lt;br /&gt;
},\&lt;br /&gt;
TotalCharge:frame_1_data_6:.* {\&lt;br /&gt;
	if (ReadingsNum($NAME, &#039;frame_1_id&#039;, 0) == 1995 and ReadingsNum($NAME, &#039;frame_1_data_1&#039;, 0)  == 7 and ReadingsNum($NAME, &#039;frame_1_data_2&#039;, 0)  == 98\&lt;br /&gt;
      and ReadingsNum($NAME, &#039;frame_1_data_3&#039;, 0)  == 33 and ReadingsNum($NAME, &#039;frame_1_data_4&#039;, 0)  == 113 ) {\&lt;br /&gt;
		return round( 2 * ReadingsNum($NAME, &#039;frame_1_data_7&#039;, 0) + ReadingsNum($NAME, &#039;frame_1_data_8&#039;, 0) / 128 , 0)\&lt;br /&gt;
	} else {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;TotalCharge&#039;, 0)\&lt;br /&gt;
	}\&lt;br /&gt;
},\&lt;br /&gt;
TotalDischarge:frame_1_data_6:.* {\&lt;br /&gt;
	if (ReadingsNum($NAME, &#039;frame_1_id&#039;, 0) == 1995 and ReadingsNum($NAME, &#039;frame_1_data_1&#039;, 0)  == 7 and ReadingsNum($NAME, &#039;frame_1_data_2&#039;, 0)  == 98\&lt;br /&gt;
  and ReadingsNum($NAME, &#039;frame_1_data_3&#039;, 0)  == 33 and ReadingsNum($NAME, &#039;frame_1_data_4&#039;, 0)  == 114 ) {\&lt;br /&gt;
		return round( 2 * ReadingsNum($NAME, &#039;frame_1_data_7&#039;, 0) + ReadingsNum($NAME, &#039;frame_1_data_8&#039;, 0) / 128 , 0)\&lt;br /&gt;
	} else {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;TotalDischarge&#039;, 0)\&lt;br /&gt;
	}\&lt;br /&gt;
},\&lt;br /&gt;
BatteryVoltage:frame_1_data_6:.* {\&lt;br /&gt;
	if (ReadingsNum($NAME, &#039;frame_1_id&#039;, 0) == 1995 and ReadingsNum($NAME, &#039;frame_1_data_1&#039;, 0)  == 16 and ReadingsNum($NAME, &#039;frame_1_data_2&#039;, 0)  == 9\&lt;br /&gt;
      and ReadingsNum($NAME, &#039;frame_1_data_3&#039;, 0)  == 98 and ReadingsNum($NAME, &#039;frame_1_data_4&#039;, 0)  == 32 ) {\&lt;br /&gt;
		return ( 256 * ReadingsNum($NAME, &#039;frame_1_data_6&#039;, 0) + ReadingsNum($NAME, &#039;frame_1_data_7&#039;, 0)) / 10.0 \&lt;br /&gt;
	} else {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;BatteryVoltage&#039;, 0)\&lt;br /&gt;
	}\&lt;br /&gt;
},\&lt;br /&gt;
SoE:frame_1_data_6:.* {\&lt;br /&gt;
	if (ReadingsNum($NAME, &#039;frame_1_id&#039;, 0) == 1994 and ReadingsNum($NAME, &#039;frame_1_data_1&#039;, 0)  == 7 and ReadingsNum($NAME, &#039;frame_1_data_2&#039;, 0)  == 98\&lt;br /&gt;
      and ReadingsNum($NAME, &#039;frame_1_data_3&#039;, 0)  == 208 and ReadingsNum($NAME, &#039;frame_1_data_4&#039;, 0)  == 98 ) {\&lt;br /&gt;
		return (256*ReadingsNum($NAME, &#039;frame_1_data_7&#039;, 0)+ReadingsNum($NAME, &#039;frame_1_data_8&#039;, 0)) / 10.0 \&lt;br /&gt;
	} else {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;SoE&#039;, 0)\&lt;br /&gt;
	}\&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Elektromobilität]]&lt;/div&gt;</summary>
		<author><name>Topos</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Ora_Funky_Cat&amp;diff=39265</id>
		<title>Ora Funky Cat</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Ora_Funky_Cat&amp;diff=39265"/>
		<updated>2024-04-21T11:10:41Z</updated>

		<summary type="html">&lt;p&gt;Topos: /* Beispielhafte Einrichtung des WiCAN im Ora Funky Cat als MQTT2-Device */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Auf dieser Seite wird die Einbindung des E-Autos [https://www.ora-motor.de/ Ora Funky Cat] von GWM (Great Wall Motors aus China) in FHEM über die OBD2-Serviceschnittestelle erläutert.&lt;br /&gt;
&lt;br /&gt;
Benötigte Hardware: [https://www.meatpi.com/products/wican MeatPi WiCAN-OBD-C3 Dongle]&lt;br /&gt;
&lt;br /&gt;
Der WiCAN wird in die OBD2-Serviceschnittestelle (rechts neben Sicherungsfach unterhalb Lenkrad) gesteckt. Am besten über ein Verlängerungskabel oder indem man den OBD2-Stecker aus der Halterung drückt und mit dem WiCAN ins Sicherungsfach legt. &lt;br /&gt;
&lt;br /&gt;
Der WiCAN kann sich über WLAN mit eine MQTT-Server verbinden. Näheres im obigen Link. Als CAN-Protokoll &amp;quot;slcan&amp;quot; auswählen. Die Kommunikation erfolgt über den Eintrag &#039;&#039;can/tx&#039;&#039; und &#039;&#039;can/rx&#039;&#039; des WiCAN auf dem MQTT-Server. Bitte nicht vergessen, den automatischen Standby-Modus anzuschalten, ansonsten leert sich mit der Zeit die Fahrzeugbatterie.&lt;br /&gt;
&lt;br /&gt;
Die Integration eines MQTT-Servers in FHEM wird [[MQTT|&#039;&#039;&#039;hier&#039;&#039;&#039;]] erklärt. &lt;br /&gt;
&lt;br /&gt;
Ist das Auto eingeschaltet und der Dongle gesteckt, dann können über FHEM Fahrzeugwerte abgefragt werden. Weiter unten eine beispielhafte EInrichtung eines MQTT2-Devices. &lt;br /&gt;
&lt;br /&gt;
=== Readings ===&lt;br /&gt;
Die folgenden Werte werden mit unterer Beispielkonfiguration ausgelesen:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Mileage:&#039;&#039;&#039; km-Stand - Abfrage über &amp;quot;set wican read_Mileage&amp;quot;&lt;br /&gt;
* &#039;&#039;&#039;SoC&#039;&#039;&#039;: Ladezustand Hochvolt-Antriebsbatterie in %  - Abfrage über &amp;quot;set wican read_SoC&amp;quot;&lt;br /&gt;
* &#039;&#039;&#039;TrueSoC&#039;&#039;&#039;: ein zweiter Wert. Hintergrund ist unbekannt - Abfrage über &amp;quot;set wican read_TrueSoC&amp;quot;&lt;br /&gt;
* &#039;&#039;&#039;SoE&#039;&#039;&#039;: Ladezustand Hochvolt-Antriebsbatterie in kW - Abfrage über &amp;quot;set wican read_SoE&amp;quot;&lt;br /&gt;
* &#039;&#039;&#039;SoH&#039;&#039;&#039;: Gesundheitszustand der Hochvolt-Antriebsbatterie in % - Abfrage über &amp;quot;set wican read_SoH&amp;quot;&lt;br /&gt;
* &#039;&#039;&#039;OperatingVoltage&#039;&#039;&#039;: Spannung Niedervolt-Fahrzeugbatterie in V - Abfrage über &amp;quot;set wican read_OperatingVoltage&amp;quot;&lt;br /&gt;
* &#039;&#039;&#039;BatteryVoltage&#039;&#039;&#039;: Spannung Hochvolt-Antriebsbatterie in V - Abfrage über &amp;quot;set wican read_BatteryVoltage&amp;quot;&lt;br /&gt;
* &#039;&#039;&#039;TotalCharge&#039;&#039;&#039;: Durch die Batterie aufgenommene Stromleistung in Ah (inklusive Rekuperation während des Fahrens) - Abfrage über &amp;quot;set wican read_Total Charge&amp;quot; Die Multiplikation mit 5 kV scheint die hinzugefügte elektrische Leistung zu ergeben.&lt;br /&gt;
* &#039;&#039;&#039;TotalDischarge&#039;&#039;&#039;: Von der Hochvolt-Batterie abgezogene Stromleistung in Ah - Abfrage über &amp;quot;set wican read_TotalDischarge&amp;quot; Die Multiplikation mit 5 kV scheint die abgerufene elektrische Leistung zu ergeben.&lt;br /&gt;
Das erste Auslesen kann über ein notify angestossen werden, sobald der WiCAN den Status &amp;quot;online&amp;quot; hat. &amp;lt;syntaxhighlight lang=&amp;quot;cfg&amp;quot;&amp;gt;&lt;br /&gt;
define wican_online notify wican:status:.online set wican read_SoC;; sleep 1;; set wican read_TrueSoC;; sleep 1;; set wican read_Mileage;; sleep 1;; set wican read_OpVoltage;; sleep 1;; set wican read_SoH;; sleep 1;; set wican read_TotalCharge;; sleep 1;; set wican read_TotalDischarge;; sleep 1;; set wican read_BatteryVoltage;; sleep 1;; set wican read_SoE&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Die weiteren Abfrage können über einen Timer erfolgen Der Timer kann mit einem notify ein- und wieder ausgeschaltet werden.&amp;lt;syntaxhighlight lang=&amp;quot;cfg&amp;quot;&amp;gt;&lt;br /&gt;
define wican_check at +*00:01:00 set wican read_SoC;; sleep 1;; set wican read_TrueSoC;; sleep 1;; set wican read_Mileage;; sleep 1;; set wican read_OpVoltage;; sleep 1;; set wican read_SoH;; sleep 1;; set wican read_TotalCharge;; sleep 1;; set wican read_TotalDischarge;; sleep 1;; set wican read_BatteryVoltage;; sleep 1;; set wican read_SoE&lt;br /&gt;
&lt;br /&gt;
define wican_check_active notify wican:status:.online set wican_check active&lt;br /&gt;
&lt;br /&gt;
define wican_check_inactive notify wican:status:.offline set wican_check inactive&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Beispielhafte Einrichtung des WiCAN im Ora Funky Cat als MQTT2-Device ===&lt;br /&gt;
Ab der WiCAN [https://github.com/meatpiHQ/wican-fw/releases Firmware] v2.98 (13. April 2024) kann die Benennung des Eintrages im MQTT-Server frei gewählt werden. Die untere Konfiguration geht von folgender Benennung aus: &lt;br /&gt;
&lt;br /&gt;
* TX Topic: &#039;&#039;wican/ora/can/tx&#039;&#039;&lt;br /&gt;
* RX Topic: &#039;&#039;wican/ora/can/tx&#039;&#039;&lt;br /&gt;
* Status Topic: &#039;&#039;wican/ora/can/status&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cfg&amp;quot;&amp;gt;&lt;br /&gt;
define wican MQTT2_DEVICE&lt;br /&gt;
attr wican alias Ora&lt;br /&gt;
attr wican stateFormat B: SoC% M: Mileage km (status)&lt;br /&gt;
attr wican event-on-change-reading status&lt;br /&gt;
attr wican event-on-update-reading frame_1_data_6,SoC&lt;br /&gt;
attr wican DbLogExclude .*&lt;br /&gt;
attr wican DbLogInclude SoC:3600&lt;br /&gt;
attr wican readingList wican/ora/can/status:.* {json2nameValue($EVENT)}\&lt;br /&gt;
 wican/ora/can/rx:.* {json2nameValue($EVENT)}&lt;br /&gt;
attr wican setList read_SoC:noArg wican/ora/can/tx {&amp;quot;bus&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;tx&amp;quot;,&amp;quot;ts&amp;quot;:49539,&amp;quot;frame&amp;quot;:[{&amp;quot;id&amp;quot;:1931,&amp;quot;dlc&amp;quot;:8,&amp;quot;rtr&amp;quot;:false,&amp;quot;extd&amp;quot;:false,&amp;quot;data&amp;quot;:[3,34,32,80,170,170,170,170]}]}\&lt;br /&gt;
read_TrueSoC:noArg wican/ora/can/tx {&amp;quot;bus&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;tx&amp;quot;,&amp;quot;ts&amp;quot;:27825,&amp;quot;frame&amp;quot;:[{&amp;quot;id&amp;quot;:1931,&amp;quot;dlc&amp;quot;:8,&amp;quot;rtr&amp;quot;:false,&amp;quot;extd&amp;quot;:false,&amp;quot;data&amp;quot;:[3,34,3,8,170,170,170,170]}]}\&lt;br /&gt;
read_SoH:noArg wican/ora/can/tx {&amp;quot;bus&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;tx&amp;quot;,&amp;quot;ts&amp;quot;:12016,&amp;quot;frame&amp;quot;:[{&amp;quot;id&amp;quot;:1931,&amp;quot;dlc&amp;quot;:8,&amp;quot;rtr&amp;quot;:false,&amp;quot;extd&amp;quot;:false,&amp;quot;data&amp;quot;:[3,34,32,81,170,170,170,170]}]}\&lt;br /&gt;
read_SoE:noArg wican/ora/can/tx {&amp;quot;bus&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;tx&amp;quot;,&amp;quot;ts&amp;quot;:17777,&amp;quot;frame&amp;quot;:[{&amp;quot;id&amp;quot;:1930,&amp;quot;dlc&amp;quot;:8,&amp;quot;rtr&amp;quot;:false,&amp;quot;extd&amp;quot;:false,&amp;quot;data&amp;quot;:[3,34,208,98,170,170,170,170]}]}\&lt;br /&gt;
read_OpVoltage:noArg wican/ora/can/tx {&amp;quot;bus&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;tx&amp;quot;,&amp;quot;ts&amp;quot;:17645,&amp;quot;frame&amp;quot;:[{&amp;quot;id&amp;quot;:1931,&amp;quot;dlc&amp;quot;:8,&amp;quot;rtr&amp;quot;:false,&amp;quot;extd&amp;quot;:false,&amp;quot;data&amp;quot;:[3,34,208,3,170,170,170,170]}]}\&lt;br /&gt;
read_Mileage:noArg wican/ora/can/tx {&amp;quot;bus&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;tx&amp;quot;,&amp;quot;ts&amp;quot;:35674,&amp;quot;frame&amp;quot;:[{&amp;quot;id&amp;quot;:1931,&amp;quot;dlc&amp;quot;:8,&amp;quot;rtr&amp;quot;:false,&amp;quot;extd&amp;quot;:false,&amp;quot;data&amp;quot;:[3,34,208,4,170,170,170,170]}]}\&lt;br /&gt;
read_TotalCharge:noArg wican/ora/can/tx {&amp;quot;bus&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;tx&amp;quot;,&amp;quot;ts&amp;quot;:28695,&amp;quot;frame&amp;quot;:[{&amp;quot;id&amp;quot;:1931,&amp;quot;dlc&amp;quot;:8,&amp;quot;rtr&amp;quot;:false,&amp;quot;extd&amp;quot;:false,&amp;quot;data&amp;quot;:[3,34,33,113,170,170,170,170]}]}\&lt;br /&gt;
read_TotalDischarge:noArg wican/ora/can/tx {&amp;quot;bus&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;tx&amp;quot;,&amp;quot;ts&amp;quot;:28695,&amp;quot;frame&amp;quot;:[{&amp;quot;id&amp;quot;:1931,&amp;quot;dlc&amp;quot;:8,&amp;quot;rtr&amp;quot;:false,&amp;quot;extd&amp;quot;:false,&amp;quot;data&amp;quot;:[3,34,33,114,170,170,170,170]}]}\&lt;br /&gt;
read_BatteryVoltage:noArg wican/ora/can/tx {&amp;quot;bus&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;tx&amp;quot;,&amp;quot;ts&amp;quot;:58591,&amp;quot;frame&amp;quot;:[{&amp;quot;id&amp;quot;:1931,&amp;quot;dlc&amp;quot;:8,&amp;quot;rtr&amp;quot;:false,&amp;quot;extd&amp;quot;:false,&amp;quot;data&amp;quot;:[3,34,32,3,170,170,170,170]}]}&lt;br /&gt;
attr wican userReadings SoC:frame_1_data_6:.* {\&lt;br /&gt;
	if (ReadingsNum($NAME, &#039;frame_1_id&#039;, 0) == 1995 and ReadingsNum($NAME, &#039;frame_1_data_1&#039;, 0)  == 5 and ReadingsNum($NAME, &#039;frame_1_data_2&#039;, 0)  == 98\&lt;br /&gt;
      and ReadingsNum($NAME, &#039;frame_1_data_3&#039;, 0)  == 32 and ReadingsNum($NAME, &#039;frame_1_data_4&#039;, 0)  == 80 ) {\&lt;br /&gt;
		return (ReadingsNum($NAME, &#039;frame_1_data_5&#039;, 0) * 256+ReadingsNum($NAME, &#039;frame_1_data_6&#039;, 0))/10.0\&lt;br /&gt;
	} else {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;SoC&#039;, 0)\&lt;br /&gt;
	}\&lt;br /&gt;
},\&lt;br /&gt;
SoH:frame_1_data_6:.* {\&lt;br /&gt;
	if (ReadingsNum($NAME, &#039;frame_1_id&#039;, 0) == 1995 and ReadingsNum($NAME, &#039;frame_1_data_1&#039;, 0)  == 5 and ReadingsNum($NAME, &#039;frame_1_data_2&#039;, 0)  == 98\&lt;br /&gt;
      and ReadingsNum($NAME, &#039;frame_1_data_3&#039;, 0)  == 32 and ReadingsNum($NAME, &#039;frame_1_data_4&#039;, 0)  == 81 ) {\&lt;br /&gt;
		return (ReadingsNum($NAME, &#039;frame_1_data_5&#039;, 0) * 256 + ReadingsNum($NAME, &#039;frame_1_data_6&#039;, 0))/10.0\&lt;br /&gt;
	} else {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;SoH&#039;, 0)\&lt;br /&gt;
	}\&lt;br /&gt;
},\&lt;br /&gt;
TrueSoC:frame_1_data_6:.* {\&lt;br /&gt;
	if (ReadingsNum($NAME, &#039;frame_1_id&#039;, 0) == 1995 and ReadingsNum($NAME, &#039;frame_1_data_3&#039;, 0)  == 3) {\&lt;br /&gt;
		return (ReadingsNum($NAME, &#039;frame_1_data_5&#039;, 0) * 256 + ReadingsNum($NAME, &#039;frame_1_data_6&#039;, 0))/10.0\&lt;br /&gt;
	} else {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;TrueSoC&#039;, 0)\&lt;br /&gt;
	}\&lt;br /&gt;
},\&lt;br /&gt;
Mileage:frame_1_data_6:.* {\&lt;br /&gt;
	if (ReadingsNum($NAME, &#039;frame_1_id&#039;, 0) == 1995 and ReadingsNum($NAME, &#039;frame_1_data_1&#039;, 0)  == 6 and ReadingsNum($NAME, &#039;frame_1_data_2&#039;, 0)  == 98\&lt;br /&gt;
      and ReadingsNum($NAME, &#039;frame_1_data_3&#039;, 0)  == 208 ) {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;frame_1_data_6&#039;, 0) * 256 + ReadingsNum($NAME, &#039;frame_1_data_7&#039;, 0)\&lt;br /&gt;
	} else {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;Mileage&#039;, 0)\&lt;br /&gt;
	}\&lt;br /&gt;
},\&lt;br /&gt;
OperatingVoltage:frame_1_data_6:.* {\&lt;br /&gt;
	if (ReadingsNum($NAME, &#039;frame_1_id&#039;, 0) == 1995 and ReadingsNum($NAME, &#039;frame_1_data_1&#039;, 0)  == 4 and ReadingsNum($NAME, &#039;frame_1_data_2&#039;, 0)  == 98\&lt;br /&gt;
      and ReadingsNum($NAME, &#039;frame_1_data_3&#039;, 0)  == 208 ) {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;frame_1_data_5&#039;, 0) /10.0\&lt;br /&gt;
	} else {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;OperatingVoltage&#039;, 0)\&lt;br /&gt;
	}\&lt;br /&gt;
},\&lt;br /&gt;
TotalCharge:frame_1_data_6:.* {\&lt;br /&gt;
	if (ReadingsNum($NAME, &#039;frame_1_id&#039;, 0) == 1995 and ReadingsNum($NAME, &#039;frame_1_data_1&#039;, 0)  == 7 and ReadingsNum($NAME, &#039;frame_1_data_2&#039;, 0)  == 98\&lt;br /&gt;
      and ReadingsNum($NAME, &#039;frame_1_data_3&#039;, 0)  == 33 and ReadingsNum($NAME, &#039;frame_1_data_4&#039;, 0)  == 113 ) {\&lt;br /&gt;
		return round( 2 * ReadingsNum($NAME, &#039;frame_1_data_7&#039;, 0) + ReadingsNum($NAME, &#039;frame_1_data_8&#039;, 0) / 128 , 0)\&lt;br /&gt;
	} else {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;TotalCharge&#039;, 0)\&lt;br /&gt;
	}\&lt;br /&gt;
},\&lt;br /&gt;
TotalDischarge:frame_1_data_6:.* {\&lt;br /&gt;
	if (ReadingsNum($NAME, &#039;frame_1_id&#039;, 0) == 1995 and ReadingsNum($NAME, &#039;frame_1_data_1&#039;, 0)  == 7 and ReadingsNum($NAME, &#039;frame_1_data_2&#039;, 0)  == 98\&lt;br /&gt;
  and ReadingsNum($NAME, &#039;frame_1_data_3&#039;, 0)  == 33 and ReadingsNum($NAME, &#039;frame_1_data_4&#039;, 0)  == 114 ) {\&lt;br /&gt;
		return round( 2 * ReadingsNum($NAME, &#039;frame_1_data_7&#039;, 0) + ReadingsNum($NAME, &#039;frame_1_data_8&#039;, 0) / 128 , 0)\&lt;br /&gt;
	} else {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;TotalDischarge&#039;, 0)\&lt;br /&gt;
	}\&lt;br /&gt;
},\&lt;br /&gt;
BatteryVoltage:frame_1_data_6:.* {\&lt;br /&gt;
	if (ReadingsNum($NAME, &#039;frame_1_id&#039;, 0) == 1995 and ReadingsNum($NAME, &#039;frame_1_data_1&#039;, 0)  == 16 and ReadingsNum($NAME, &#039;frame_1_data_2&#039;, 0)  == 9\&lt;br /&gt;
      and ReadingsNum($NAME, &#039;frame_1_data_3&#039;, 0)  == 98 and ReadingsNum($NAME, &#039;frame_1_data_4&#039;, 0)  == 32 ) {\&lt;br /&gt;
		return ( 256 * ReadingsNum($NAME, &#039;frame_1_data_6&#039;, 0) + ReadingsNum($NAME, &#039;frame_1_data_7&#039;, 0)) / 10.0 \&lt;br /&gt;
	} else {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;BatteryVoltage&#039;, 0)\&lt;br /&gt;
	}\&lt;br /&gt;
},\&lt;br /&gt;
SoE:frame_1_data_6:.* {\&lt;br /&gt;
	if (ReadingsNum($NAME, &#039;frame_1_id&#039;, 0) == 1994 and ReadingsNum($NAME, &#039;frame_1_data_1&#039;, 0)  == 7 and ReadingsNum($NAME, &#039;frame_1_data_2&#039;, 0)  == 98\&lt;br /&gt;
      and ReadingsNum($NAME, &#039;frame_1_data_3&#039;, 0)  == 208 and ReadingsNum($NAME, &#039;frame_1_data_4&#039;, 0)  == 98 ) {\&lt;br /&gt;
		return (256*ReadingsNum($NAME, &#039;frame_1_data_7&#039;, 0)+ReadingsNum($NAME, &#039;frame_1_data_8&#039;, 0)) / 10.0 \&lt;br /&gt;
	} else {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;SoE&#039;, 0)\&lt;br /&gt;
	}\&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Elektromobilität]]&lt;/div&gt;</summary>
		<author><name>Topos</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Ora_Funky_Cat&amp;diff=39264</id>
		<title>Ora Funky Cat</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Ora_Funky_Cat&amp;diff=39264"/>
		<updated>2024-04-21T10:59:53Z</updated>

		<summary type="html">&lt;p&gt;Topos: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Auf dieser Seite wird die Einbindung des E-Autos [https://www.ora-motor.de/ Ora Funky Cat] von GWM (Great Wall Motors aus China) in FHEM über die OBD2-Serviceschnittestelle erläutert.&lt;br /&gt;
&lt;br /&gt;
Benötigte Hardware: [https://www.meatpi.com/products/wican MeatPi WiCAN-OBD-C3 Dongle]&lt;br /&gt;
&lt;br /&gt;
Der WiCAN wird in die OBD2-Serviceschnittestelle (rechts neben Sicherungsfach unterhalb Lenkrad) gesteckt. Am besten über ein Verlängerungskabel oder indem man den OBD2-Stecker aus der Halterung drückt und mit dem WiCAN ins Sicherungsfach legt. &lt;br /&gt;
&lt;br /&gt;
Der WiCAN kann sich über WLAN mit eine MQTT-Server verbinden. Näheres im obigen Link. Als CAN-Protokoll &amp;quot;slcan&amp;quot; auswählen. Die Kommunikation erfolgt über den Eintrag &#039;&#039;can/tx&#039;&#039; und &#039;&#039;can/rx&#039;&#039; des WiCAN auf dem MQTT-Server. Bitte nicht vergessen, den automatischen Standby-Modus anzuschalten, ansonsten leert sich mit der Zeit die Fahrzeugbatterie.&lt;br /&gt;
&lt;br /&gt;
Die Integration eines MQTT-Servers in FHEM wird [[MQTT|&#039;&#039;&#039;hier&#039;&#039;&#039;]] erklärt. &lt;br /&gt;
&lt;br /&gt;
Ist das Auto eingeschaltet und der Dongle gesteckt, dann können über FHEM Fahrzeugwerte abgefragt werden. Weiter unten eine beispielhafte EInrichtung eines MQTT2-Devices. &lt;br /&gt;
&lt;br /&gt;
=== Readings ===&lt;br /&gt;
Die folgenden Werte werden mit unterer Beispielkonfiguration ausgelesen:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Mileage:&#039;&#039;&#039; km-Stand - Abfrage über &amp;quot;set wican read_Mileage&amp;quot;&lt;br /&gt;
* &#039;&#039;&#039;SoC&#039;&#039;&#039;: Ladezustand Hochvolt-Antriebsbatterie in %  - Abfrage über &amp;quot;set wican read_SoC&amp;quot;&lt;br /&gt;
* &#039;&#039;&#039;TrueSoC&#039;&#039;&#039;: ein zweiter Wert. Hintergrund ist unbekannt - Abfrage über &amp;quot;set wican read_TrueSoC&amp;quot;&lt;br /&gt;
* &#039;&#039;&#039;SoE&#039;&#039;&#039;: Ladezustand Hochvolt-Antriebsbatterie in kW - Abfrage über &amp;quot;set wican read_SoE&amp;quot;&lt;br /&gt;
* &#039;&#039;&#039;SoH&#039;&#039;&#039;: Gesundheitszustand der Hochvolt-Antriebsbatterie in % - Abfrage über &amp;quot;set wican read_SoH&amp;quot;&lt;br /&gt;
* &#039;&#039;&#039;OperatingVoltage&#039;&#039;&#039;: Spannung Niedervolt-Fahrzeugbatterie in V - Abfrage über &amp;quot;set wican read_OperatingVoltage&amp;quot;&lt;br /&gt;
* &#039;&#039;&#039;BatteryVoltage&#039;&#039;&#039;: Spannung Hochvolt-Antriebsbatterie in V - Abfrage über &amp;quot;set wican read_BatteryVoltage&amp;quot;&lt;br /&gt;
* &#039;&#039;&#039;TotalCharge&#039;&#039;&#039;: Durch die Batterie aufgenommene Stromleistung in Ah (inklusive Rekuperation während des Fahrens) - Abfrage über &amp;quot;set wican read_Total Charge&amp;quot; Die Multiplikation mit 5 kV scheint die hinzugefügte elektrische Leistung zu ergeben.&lt;br /&gt;
* &#039;&#039;&#039;TotalDischarge&#039;&#039;&#039;: Von der Hochvolt-Batterie abgezogene Stromleistung in Ah - Abfrage über &amp;quot;set wican read_TotalDischarge&amp;quot; Die Multiplikation mit 5 kV scheint die abgerufene elektrische Leistung zu ergeben.&lt;br /&gt;
Das erste Auslesen kann über ein notify angestossen werden, sobald der WiCAN den Status &amp;quot;online&amp;quot; hat. &amp;lt;syntaxhighlight lang=&amp;quot;cfg&amp;quot;&amp;gt;&lt;br /&gt;
define wican_online notify wican:status:.online set wican read_SoC;; sleep 1;; set wican read_TrueSoC;; sleep 1;; set wican read_Mileage;; sleep 1;; set wican read_OpVoltage;; sleep 1;; set wican read_SoH;; sleep 1;; set wican read_TotalCharge;; sleep 1;; set wican read_TotalDischarge;; sleep 1;; set wican read_BatteryVoltage;; sleep 1;; set wican read_SoE&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Die weiteren Abfrage können über einen Timer erfolgen Der Timer kann mit einem notify ein- und wieder ausgeschaltet werden.&amp;lt;syntaxhighlight lang=&amp;quot;cfg&amp;quot;&amp;gt;&lt;br /&gt;
define wican_check at +*00:01:00 set wican read_SoC;; sleep 1;; set wican read_TrueSoC;; sleep 1;; set wican read_Mileage;; sleep 1;; set wican read_OpVoltage;; sleep 1;; set wican read_SoH;; sleep 1;; set wican read_TotalCharge;; sleep 1;; set wican read_TotalDischarge;; sleep 1;; set wican read_BatteryVoltage;; sleep 1;; set wican read_SoE&lt;br /&gt;
&lt;br /&gt;
define wican_check_active notify wican:status:.online set wican_check active&lt;br /&gt;
&lt;br /&gt;
define wican_check_inactive notify wican:status:.offline set wican_check inactive&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Beispielhafte Einrichtung des WiCAN im Ora Funky Cat als MQTT2-Device ===&lt;br /&gt;
Ab der WiCAN Firmware v2.98 (13. April 2024) kann die Benennung des Eintrages im MQTT-Server frei gewählt werden. Die untere Konfiguration geht von folgender Benennung aus: &lt;br /&gt;
&lt;br /&gt;
* TX Topic: &#039;&#039;wican/ora/can/tx&#039;&#039;&lt;br /&gt;
* RX Topic: &#039;&#039;wican/ora/can/tx&#039;&#039;&lt;br /&gt;
* Status Topic: &#039;&#039;wican/ora/can/status&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cfg&amp;quot;&amp;gt;&lt;br /&gt;
define wican MQTT2_DEVICE&lt;br /&gt;
attr wican alias Ora&lt;br /&gt;
attr wican stateFormat B: SoC% M: Mileage km (status)&lt;br /&gt;
attr wican event-on-change-reading status&lt;br /&gt;
attr wican event-on-update-reading frame_1_data_6,SoC&lt;br /&gt;
attr wican DbLogExclude .*&lt;br /&gt;
attr wican DbLogInclude SoC:3600&lt;br /&gt;
attr wican readingList wican/ora/can/status:.* {json2nameValue($EVENT)}\&lt;br /&gt;
 wican/ora/can/rx:.* {json2nameValue($EVENT)}&lt;br /&gt;
attr wican setList read_SoC:noArg wican/ora/can/tx {&amp;quot;bus&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;tx&amp;quot;,&amp;quot;ts&amp;quot;:49539,&amp;quot;frame&amp;quot;:[{&amp;quot;id&amp;quot;:1931,&amp;quot;dlc&amp;quot;:8,&amp;quot;rtr&amp;quot;:false,&amp;quot;extd&amp;quot;:false,&amp;quot;data&amp;quot;:[3,34,32,80,170,170,170,170]}]}\&lt;br /&gt;
read_TrueSoC:noArg wican/ora/can/tx {&amp;quot;bus&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;tx&amp;quot;,&amp;quot;ts&amp;quot;:27825,&amp;quot;frame&amp;quot;:[{&amp;quot;id&amp;quot;:1931,&amp;quot;dlc&amp;quot;:8,&amp;quot;rtr&amp;quot;:false,&amp;quot;extd&amp;quot;:false,&amp;quot;data&amp;quot;:[3,34,3,8,170,170,170,170]}]}\&lt;br /&gt;
read_SoH:noArg wican/ora/can/tx {&amp;quot;bus&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;tx&amp;quot;,&amp;quot;ts&amp;quot;:12016,&amp;quot;frame&amp;quot;:[{&amp;quot;id&amp;quot;:1931,&amp;quot;dlc&amp;quot;:8,&amp;quot;rtr&amp;quot;:false,&amp;quot;extd&amp;quot;:false,&amp;quot;data&amp;quot;:[3,34,32,81,170,170,170,170]}]}\&lt;br /&gt;
read_SoE:noArg wican/ora/can/tx {&amp;quot;bus&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;tx&amp;quot;,&amp;quot;ts&amp;quot;:17777,&amp;quot;frame&amp;quot;:[{&amp;quot;id&amp;quot;:1930,&amp;quot;dlc&amp;quot;:8,&amp;quot;rtr&amp;quot;:false,&amp;quot;extd&amp;quot;:false,&amp;quot;data&amp;quot;:[3,34,208,98,170,170,170,170]}]}\&lt;br /&gt;
read_OpVoltage:noArg wican/ora/can/tx {&amp;quot;bus&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;tx&amp;quot;,&amp;quot;ts&amp;quot;:17645,&amp;quot;frame&amp;quot;:[{&amp;quot;id&amp;quot;:1931,&amp;quot;dlc&amp;quot;:8,&amp;quot;rtr&amp;quot;:false,&amp;quot;extd&amp;quot;:false,&amp;quot;data&amp;quot;:[3,34,208,3,170,170,170,170]}]}\&lt;br /&gt;
read_Mileage:noArg wican/ora/can/tx {&amp;quot;bus&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;tx&amp;quot;,&amp;quot;ts&amp;quot;:35674,&amp;quot;frame&amp;quot;:[{&amp;quot;id&amp;quot;:1931,&amp;quot;dlc&amp;quot;:8,&amp;quot;rtr&amp;quot;:false,&amp;quot;extd&amp;quot;:false,&amp;quot;data&amp;quot;:[3,34,208,4,170,170,170,170]}]}\&lt;br /&gt;
read_TotalCharge:noArg wican/ora/can/tx {&amp;quot;bus&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;tx&amp;quot;,&amp;quot;ts&amp;quot;:28695,&amp;quot;frame&amp;quot;:[{&amp;quot;id&amp;quot;:1931,&amp;quot;dlc&amp;quot;:8,&amp;quot;rtr&amp;quot;:false,&amp;quot;extd&amp;quot;:false,&amp;quot;data&amp;quot;:[3,34,33,113,170,170,170,170]}]}\&lt;br /&gt;
read_TotalDischarge:noArg wican/ora/can/tx {&amp;quot;bus&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;tx&amp;quot;,&amp;quot;ts&amp;quot;:28695,&amp;quot;frame&amp;quot;:[{&amp;quot;id&amp;quot;:1931,&amp;quot;dlc&amp;quot;:8,&amp;quot;rtr&amp;quot;:false,&amp;quot;extd&amp;quot;:false,&amp;quot;data&amp;quot;:[3,34,33,114,170,170,170,170]}]}\&lt;br /&gt;
read_BatteryVoltage:noArg wican/ora/can/tx {&amp;quot;bus&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;tx&amp;quot;,&amp;quot;ts&amp;quot;:58591,&amp;quot;frame&amp;quot;:[{&amp;quot;id&amp;quot;:1931,&amp;quot;dlc&amp;quot;:8,&amp;quot;rtr&amp;quot;:false,&amp;quot;extd&amp;quot;:false,&amp;quot;data&amp;quot;:[3,34,32,3,170,170,170,170]}]}&lt;br /&gt;
attr wican userReadings SoC:frame_1_data_6:.* {\&lt;br /&gt;
	if (ReadingsNum($NAME, &#039;frame_1_id&#039;, 0) == 1995 and ReadingsNum($NAME, &#039;frame_1_data_1&#039;, 0)  == 5 and ReadingsNum($NAME, &#039;frame_1_data_2&#039;, 0)  == 98\&lt;br /&gt;
      and ReadingsNum($NAME, &#039;frame_1_data_3&#039;, 0)  == 32 and ReadingsNum($NAME, &#039;frame_1_data_4&#039;, 0)  == 80 ) {\&lt;br /&gt;
		return (ReadingsNum($NAME, &#039;frame_1_data_5&#039;, 0) * 256+ReadingsNum($NAME, &#039;frame_1_data_6&#039;, 0))/10.0\&lt;br /&gt;
	} else {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;SoC&#039;, 0)\&lt;br /&gt;
	}\&lt;br /&gt;
},\&lt;br /&gt;
SoH:frame_1_data_6:.* {\&lt;br /&gt;
	if (ReadingsNum($NAME, &#039;frame_1_id&#039;, 0) == 1995 and ReadingsNum($NAME, &#039;frame_1_data_1&#039;, 0)  == 5 and ReadingsNum($NAME, &#039;frame_1_data_2&#039;, 0)  == 98\&lt;br /&gt;
      and ReadingsNum($NAME, &#039;frame_1_data_3&#039;, 0)  == 32 and ReadingsNum($NAME, &#039;frame_1_data_4&#039;, 0)  == 81 ) {\&lt;br /&gt;
		return (ReadingsNum($NAME, &#039;frame_1_data_5&#039;, 0) * 256 + ReadingsNum($NAME, &#039;frame_1_data_6&#039;, 0))/10.0\&lt;br /&gt;
	} else {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;SoH&#039;, 0)\&lt;br /&gt;
	}\&lt;br /&gt;
},\&lt;br /&gt;
TrueSoC:frame_1_data_6:.* {\&lt;br /&gt;
	if (ReadingsNum($NAME, &#039;frame_1_id&#039;, 0) == 1995 and ReadingsNum($NAME, &#039;frame_1_data_3&#039;, 0)  == 3) {\&lt;br /&gt;
		return (ReadingsNum($NAME, &#039;frame_1_data_5&#039;, 0) * 256 + ReadingsNum($NAME, &#039;frame_1_data_6&#039;, 0))/10.0\&lt;br /&gt;
	} else {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;TrueSoC&#039;, 0)\&lt;br /&gt;
	}\&lt;br /&gt;
},\&lt;br /&gt;
Mileage:frame_1_data_6:.* {\&lt;br /&gt;
	if (ReadingsNum($NAME, &#039;frame_1_id&#039;, 0) == 1995 and ReadingsNum($NAME, &#039;frame_1_data_1&#039;, 0)  == 6 and ReadingsNum($NAME, &#039;frame_1_data_2&#039;, 0)  == 98\&lt;br /&gt;
      and ReadingsNum($NAME, &#039;frame_1_data_3&#039;, 0)  == 208 ) {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;frame_1_data_6&#039;, 0) * 256 + ReadingsNum($NAME, &#039;frame_1_data_7&#039;, 0)\&lt;br /&gt;
	} else {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;Mileage&#039;, 0)\&lt;br /&gt;
	}\&lt;br /&gt;
},\&lt;br /&gt;
OperatingVoltage:frame_1_data_6:.* {\&lt;br /&gt;
	if (ReadingsNum($NAME, &#039;frame_1_id&#039;, 0) == 1995 and ReadingsNum($NAME, &#039;frame_1_data_1&#039;, 0)  == 4 and ReadingsNum($NAME, &#039;frame_1_data_2&#039;, 0)  == 98\&lt;br /&gt;
      and ReadingsNum($NAME, &#039;frame_1_data_3&#039;, 0)  == 208 ) {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;frame_1_data_5&#039;, 0) /10.0\&lt;br /&gt;
	} else {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;OperatingVoltage&#039;, 0)\&lt;br /&gt;
	}\&lt;br /&gt;
},\&lt;br /&gt;
TotalCharge:frame_1_data_6:.* {\&lt;br /&gt;
	if (ReadingsNum($NAME, &#039;frame_1_id&#039;, 0) == 1995 and ReadingsNum($NAME, &#039;frame_1_data_1&#039;, 0)  == 7 and ReadingsNum($NAME, &#039;frame_1_data_2&#039;, 0)  == 98\&lt;br /&gt;
      and ReadingsNum($NAME, &#039;frame_1_data_3&#039;, 0)  == 33 and ReadingsNum($NAME, &#039;frame_1_data_4&#039;, 0)  == 113 ) {\&lt;br /&gt;
		return round( 2 * ReadingsNum($NAME, &#039;frame_1_data_7&#039;, 0) + ReadingsNum($NAME, &#039;frame_1_data_8&#039;, 0) / 128 , 0)\&lt;br /&gt;
	} else {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;TotalCharge&#039;, 0)\&lt;br /&gt;
	}\&lt;br /&gt;
},\&lt;br /&gt;
TotalDischarge:frame_1_data_6:.* {\&lt;br /&gt;
	if (ReadingsNum($NAME, &#039;frame_1_id&#039;, 0) == 1995 and ReadingsNum($NAME, &#039;frame_1_data_1&#039;, 0)  == 7 and ReadingsNum($NAME, &#039;frame_1_data_2&#039;, 0)  == 98\&lt;br /&gt;
  and ReadingsNum($NAME, &#039;frame_1_data_3&#039;, 0)  == 33 and ReadingsNum($NAME, &#039;frame_1_data_4&#039;, 0)  == 114 ) {\&lt;br /&gt;
		return round( 2 * ReadingsNum($NAME, &#039;frame_1_data_7&#039;, 0) + ReadingsNum($NAME, &#039;frame_1_data_8&#039;, 0) / 128 , 0)\&lt;br /&gt;
	} else {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;TotalDischarge&#039;, 0)\&lt;br /&gt;
	}\&lt;br /&gt;
},\&lt;br /&gt;
BatteryVoltage:frame_1_data_6:.* {\&lt;br /&gt;
	if (ReadingsNum($NAME, &#039;frame_1_id&#039;, 0) == 1995 and ReadingsNum($NAME, &#039;frame_1_data_1&#039;, 0)  == 16 and ReadingsNum($NAME, &#039;frame_1_data_2&#039;, 0)  == 9\&lt;br /&gt;
      and ReadingsNum($NAME, &#039;frame_1_data_3&#039;, 0)  == 98 and ReadingsNum($NAME, &#039;frame_1_data_4&#039;, 0)  == 32 ) {\&lt;br /&gt;
		return ( 256 * ReadingsNum($NAME, &#039;frame_1_data_6&#039;, 0) + ReadingsNum($NAME, &#039;frame_1_data_7&#039;, 0)) / 10.0 \&lt;br /&gt;
	} else {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;BatteryVoltage&#039;, 0)\&lt;br /&gt;
	}\&lt;br /&gt;
},\&lt;br /&gt;
SoE:frame_1_data_6:.* {\&lt;br /&gt;
	if (ReadingsNum($NAME, &#039;frame_1_id&#039;, 0) == 1994 and ReadingsNum($NAME, &#039;frame_1_data_1&#039;, 0)  == 7 and ReadingsNum($NAME, &#039;frame_1_data_2&#039;, 0)  == 98\&lt;br /&gt;
      and ReadingsNum($NAME, &#039;frame_1_data_3&#039;, 0)  == 208 and ReadingsNum($NAME, &#039;frame_1_data_4&#039;, 0)  == 98 ) {\&lt;br /&gt;
		return (256*ReadingsNum($NAME, &#039;frame_1_data_7&#039;, 0)+ReadingsNum($NAME, &#039;frame_1_data_8&#039;, 0)) / 10.0 \&lt;br /&gt;
	} else {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;SoE&#039;, 0)\&lt;br /&gt;
	}\&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Elektromobilität]]&lt;/div&gt;</summary>
		<author><name>Topos</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Ora_Funky_Cat&amp;diff=39263</id>
		<title>Ora Funky Cat</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Ora_Funky_Cat&amp;diff=39263"/>
		<updated>2024-04-21T10:58:14Z</updated>

		<summary type="html">&lt;p&gt;Topos: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Auf dieser Seite wird die Einbindung des E-Autos [https://www.ora-motor.de/ Ora Funky Cat] von GWM (Great Wall Motors aus China) in FHEM über die OBD2-Serviceschnittestelle erläutert.&lt;br /&gt;
&lt;br /&gt;
Benötigte Hardware: [https://www.meatpi.com/products/wican MeatPi WiCAN-OBD-C3 Dongle]&lt;br /&gt;
&lt;br /&gt;
Der WiCAN wird in die OBD2-Serviceschnittestelle (rechts neben Sicherungsfach unterhalb Lenkrad) gesteckt. Am besten über ein Verlängerungskabel oder indem man den OBD2-Stecker aus der Halterung drückt und mit dem WiCAN ins Sicherungsfach legt. &lt;br /&gt;
&lt;br /&gt;
Der WiCAN kann sich über WLAN mit eine MQTT-Server verbinden. Näheres im obigen Link. Als CAN-Protokoll &amp;quot;slcan&amp;quot; auswählen. Die Kommunikation erfolgt über den Eintrag &#039;&#039;can/tx&#039;&#039; und &#039;&#039;can/rx&#039;&#039; des WiCAN auf dem MQTT-Server. Bitte nicht vergessen, den automatischen Standby-Modus anzuschalten, ansonsten leert sich mit der Zeit die Fahrzeugbatterie.&lt;br /&gt;
&lt;br /&gt;
Die Integration eines MQTT-Servers in FHEM wird [[MQTT|&#039;&#039;&#039;hier&#039;&#039;&#039;]] erklärt. &lt;br /&gt;
&lt;br /&gt;
Ist das Auto eingeschaltet und der Dongle gesteckt, dann können über FHEM Fahrzeugwerte abgefragt werden. Weiter unten eine beispielhafte EInrichtung eines MQTT2-Devices. &lt;br /&gt;
&lt;br /&gt;
=== Readings ===&lt;br /&gt;
Die folgenden Werte werden mit unterer Beispielkonfiguration ausgelesen:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Mileage:&#039;&#039;&#039; km-Stand - Abfrage über &amp;quot;set wican read_Mileage&amp;quot;&lt;br /&gt;
* &#039;&#039;&#039;SoC&#039;&#039;&#039;: Ladezustand Hochvolt-Antriebsbatterie in %  - Abfrage über &amp;quot;set wican read_SoC&amp;quot;&lt;br /&gt;
* &#039;&#039;&#039;TrueSoC&#039;&#039;&#039;: ein zweiter Wert. Hintergrund ist unbekannt - Abfrage über &amp;quot;set wican read_TrueSoC&amp;quot;&lt;br /&gt;
* &#039;&#039;&#039;SoE&#039;&#039;&#039;: Ladezustand Hochvolt-Antriebsbatterie in kW - Abfrage über &amp;quot;set wican read_SoE&amp;quot;&lt;br /&gt;
* &#039;&#039;&#039;SoH&#039;&#039;&#039;: Gesundheitszustand der Hochvolt-Antriebsbatterie in % - Abfrage über &amp;quot;set wican read_SoH&amp;quot;&lt;br /&gt;
* &#039;&#039;&#039;OperatingVoltage&#039;&#039;&#039;: Spannung Niedervolt-Fahrzeugbatterie in V - Abfrage über &amp;quot;set wican read_OperatingVoltage&amp;quot;&lt;br /&gt;
* &#039;&#039;&#039;BatteryVoltage&#039;&#039;&#039;: Spannung Hochvolt-Antriebsbatterie in V - Abfrage über &amp;quot;set wican read_BatteryVoltage&amp;quot;&lt;br /&gt;
* &#039;&#039;&#039;TotalCharge&#039;&#039;&#039;: Durch die Batterie aufgenommene Stromleistung in Ah (inklusive Rekuperation während des Fahrens) - Abfrage über &amp;quot;set wican read_Total Charge&amp;quot; Die Multiplikation mit 5 kV scheint die hinzugefügte elektrische Leistung zu ergeben.&lt;br /&gt;
* &#039;&#039;&#039;TotalDischarge&#039;&#039;&#039;: Von der Hochvolt-Batterie abgezogene Stromleistung in Ah - Abfrage über &amp;quot;set wican read_TotalDischarge&amp;quot; Die Multiplikation mit 5 kV scheint die abgerufene elektrische Leistung zu ergeben.&lt;br /&gt;
Das erste Auslesen kann über ein notify angestossen werden, sobald der WiCAN den Status &amp;quot;online&amp;quot; hat. &amp;lt;syntaxhighlight lang=&amp;quot;cfg&amp;quot;&amp;gt;&lt;br /&gt;
define wican_online notify wican:status:.online set wican read_SoC;; sleep 1;; set wican read_TrueSoC;; sleep 1;; set wican read_Mileage;; sleep 1;; set wican read_OpVoltage;; sleep 1;; set wican read_SoH;; sleep 1;; set wican read_TotalCharge;; sleep 1;; set wican read_TotalDischarge;; sleep 1;; set wican read_BatteryVoltage;; sleep 1;; set wican read_SoE&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Die weiteren Abfrage können über einen Timer erfolgen Der Timer kann mit einem notify ein- und wieder ausgeschaltet werden.&amp;lt;syntaxhighlight lang=&amp;quot;cfg&amp;quot;&amp;gt;&lt;br /&gt;
define wican_check at +*00:01:00 set wican read_SoC;; sleep 1;; set wican read_TrueSoC;; sleep 1;; set wican read_Mileage;; sleep 1;; set wican read_OpVoltage;; sleep 1;; set wican read_SoH;; sleep 1;; set wican read_TotalCharge;; sleep 1;; set wican read_TotalDischarge;; sleep 1;; set wican read_BatteryVoltage;; sleep 1;; set wican read_SoE&lt;br /&gt;
&lt;br /&gt;
define wican_check_active notify wican:status:.online set wican_check active&lt;br /&gt;
&lt;br /&gt;
define wican_check_inactive notify wican:status:.offline set wican_check inactive&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Beispielhafte Einrichtung des WiCAN im Ora Funky Cat als MQTT2-Device ===&lt;br /&gt;
Ab der WiCAN Firmware 2.98 (April 2024) kann die Benennung des Eintrages im MQTT-Server frei gewählt werden. Die untere Konfiguration geht von folgender Benennung aus: &lt;br /&gt;
&lt;br /&gt;
* TX Topic: &#039;&#039;wican/ora/can/tx&#039;&#039;&lt;br /&gt;
* RX Topic: &#039;&#039;wican/ora/can/tx&#039;&#039;&lt;br /&gt;
* Status Topic: &#039;&#039;wican/ora/can/status&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cfg&amp;quot;&amp;gt;&lt;br /&gt;
define wican MQTT2_DEVICE&lt;br /&gt;
attr wican alias Ora&lt;br /&gt;
attr wican stateFormat B: SoC% M: Mileage km (status)&lt;br /&gt;
attr wican event-on-change-reading status&lt;br /&gt;
attr wican event-on-update-reading frame_1_data_6,SoC&lt;br /&gt;
attr wican DbLogExclude .*&lt;br /&gt;
attr wican DbLogInclude SoC:3600&lt;br /&gt;
attr wican readingList wican/ora/can/status:.* {json2nameValue($EVENT)}\&lt;br /&gt;
 wican/ora/can/rx:.* {json2nameValue($EVENT)}&lt;br /&gt;
attr wican setList read_SoC:noArg wican/ora/can/tx {&amp;quot;bus&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;tx&amp;quot;,&amp;quot;ts&amp;quot;:49539,&amp;quot;frame&amp;quot;:[{&amp;quot;id&amp;quot;:1931,&amp;quot;dlc&amp;quot;:8,&amp;quot;rtr&amp;quot;:false,&amp;quot;extd&amp;quot;:false,&amp;quot;data&amp;quot;:[3,34,32,80,170,170,170,170]}]}\&lt;br /&gt;
read_TrueSoC:noArg wican/ora/can/tx {&amp;quot;bus&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;tx&amp;quot;,&amp;quot;ts&amp;quot;:27825,&amp;quot;frame&amp;quot;:[{&amp;quot;id&amp;quot;:1931,&amp;quot;dlc&amp;quot;:8,&amp;quot;rtr&amp;quot;:false,&amp;quot;extd&amp;quot;:false,&amp;quot;data&amp;quot;:[3,34,3,8,170,170,170,170]}]}\&lt;br /&gt;
read_SoH:noArg wican/ora/can/tx {&amp;quot;bus&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;tx&amp;quot;,&amp;quot;ts&amp;quot;:12016,&amp;quot;frame&amp;quot;:[{&amp;quot;id&amp;quot;:1931,&amp;quot;dlc&amp;quot;:8,&amp;quot;rtr&amp;quot;:false,&amp;quot;extd&amp;quot;:false,&amp;quot;data&amp;quot;:[3,34,32,81,170,170,170,170]}]}\&lt;br /&gt;
read_SoE:noArg wican/ora/can/tx {&amp;quot;bus&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;tx&amp;quot;,&amp;quot;ts&amp;quot;:17777,&amp;quot;frame&amp;quot;:[{&amp;quot;id&amp;quot;:1930,&amp;quot;dlc&amp;quot;:8,&amp;quot;rtr&amp;quot;:false,&amp;quot;extd&amp;quot;:false,&amp;quot;data&amp;quot;:[3,34,208,98,170,170,170,170]}]}\&lt;br /&gt;
read_OpVoltage:noArg wican/ora/can/tx {&amp;quot;bus&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;tx&amp;quot;,&amp;quot;ts&amp;quot;:17645,&amp;quot;frame&amp;quot;:[{&amp;quot;id&amp;quot;:1931,&amp;quot;dlc&amp;quot;:8,&amp;quot;rtr&amp;quot;:false,&amp;quot;extd&amp;quot;:false,&amp;quot;data&amp;quot;:[3,34,208,3,170,170,170,170]}]}\&lt;br /&gt;
read_Mileage:noArg wican/ora/can/tx {&amp;quot;bus&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;tx&amp;quot;,&amp;quot;ts&amp;quot;:35674,&amp;quot;frame&amp;quot;:[{&amp;quot;id&amp;quot;:1931,&amp;quot;dlc&amp;quot;:8,&amp;quot;rtr&amp;quot;:false,&amp;quot;extd&amp;quot;:false,&amp;quot;data&amp;quot;:[3,34,208,4,170,170,170,170]}]}\&lt;br /&gt;
read_TotalCharge:noArg wican/ora/can/tx {&amp;quot;bus&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;tx&amp;quot;,&amp;quot;ts&amp;quot;:28695,&amp;quot;frame&amp;quot;:[{&amp;quot;id&amp;quot;:1931,&amp;quot;dlc&amp;quot;:8,&amp;quot;rtr&amp;quot;:false,&amp;quot;extd&amp;quot;:false,&amp;quot;data&amp;quot;:[3,34,33,113,170,170,170,170]}]}\&lt;br /&gt;
read_TotalDischarge:noArg wican/ora/can/tx {&amp;quot;bus&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;tx&amp;quot;,&amp;quot;ts&amp;quot;:28695,&amp;quot;frame&amp;quot;:[{&amp;quot;id&amp;quot;:1931,&amp;quot;dlc&amp;quot;:8,&amp;quot;rtr&amp;quot;:false,&amp;quot;extd&amp;quot;:false,&amp;quot;data&amp;quot;:[3,34,33,114,170,170,170,170]}]}\&lt;br /&gt;
read_BatteryVoltage:noArg wican/ora/can/tx {&amp;quot;bus&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;tx&amp;quot;,&amp;quot;ts&amp;quot;:58591,&amp;quot;frame&amp;quot;:[{&amp;quot;id&amp;quot;:1931,&amp;quot;dlc&amp;quot;:8,&amp;quot;rtr&amp;quot;:false,&amp;quot;extd&amp;quot;:false,&amp;quot;data&amp;quot;:[3,34,32,3,170,170,170,170]}]}&lt;br /&gt;
attr wican userReadings SoC:frame_1_data_6:.* {\&lt;br /&gt;
	if (ReadingsNum($NAME, &#039;frame_1_id&#039;, 0) == 1995 and ReadingsNum($NAME, &#039;frame_1_data_1&#039;, 0)  == 5 and ReadingsNum($NAME, &#039;frame_1_data_2&#039;, 0)  == 98\&lt;br /&gt;
      and ReadingsNum($NAME, &#039;frame_1_data_3&#039;, 0)  == 32 and ReadingsNum($NAME, &#039;frame_1_data_4&#039;, 0)  == 80 ) {\&lt;br /&gt;
		return (ReadingsNum($NAME, &#039;frame_1_data_5&#039;, 0) * 256+ReadingsNum($NAME, &#039;frame_1_data_6&#039;, 0))/10.0\&lt;br /&gt;
	} else {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;SoC&#039;, 0)\&lt;br /&gt;
	}\&lt;br /&gt;
},\&lt;br /&gt;
SoH:frame_1_data_6:.* {\&lt;br /&gt;
	if (ReadingsNum($NAME, &#039;frame_1_id&#039;, 0) == 1995 and ReadingsNum($NAME, &#039;frame_1_data_1&#039;, 0)  == 5 and ReadingsNum($NAME, &#039;frame_1_data_2&#039;, 0)  == 98\&lt;br /&gt;
      and ReadingsNum($NAME, &#039;frame_1_data_3&#039;, 0)  == 32 and ReadingsNum($NAME, &#039;frame_1_data_4&#039;, 0)  == 81 ) {\&lt;br /&gt;
		return (ReadingsNum($NAME, &#039;frame_1_data_5&#039;, 0) * 256 + ReadingsNum($NAME, &#039;frame_1_data_6&#039;, 0))/10.0\&lt;br /&gt;
	} else {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;SoH&#039;, 0)\&lt;br /&gt;
	}\&lt;br /&gt;
},\&lt;br /&gt;
TrueSoC:frame_1_data_6:.* {\&lt;br /&gt;
	if (ReadingsNum($NAME, &#039;frame_1_id&#039;, 0) == 1995 and ReadingsNum($NAME, &#039;frame_1_data_3&#039;, 0)  == 3) {\&lt;br /&gt;
		return (ReadingsNum($NAME, &#039;frame_1_data_5&#039;, 0) * 256 + ReadingsNum($NAME, &#039;frame_1_data_6&#039;, 0))/10.0\&lt;br /&gt;
	} else {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;TrueSoC&#039;, 0)\&lt;br /&gt;
	}\&lt;br /&gt;
},\&lt;br /&gt;
Mileage:frame_1_data_6:.* {\&lt;br /&gt;
	if (ReadingsNum($NAME, &#039;frame_1_id&#039;, 0) == 1995 and ReadingsNum($NAME, &#039;frame_1_data_1&#039;, 0)  == 6 and ReadingsNum($NAME, &#039;frame_1_data_2&#039;, 0)  == 98\&lt;br /&gt;
      and ReadingsNum($NAME, &#039;frame_1_data_3&#039;, 0)  == 208 ) {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;frame_1_data_6&#039;, 0) * 256 + ReadingsNum($NAME, &#039;frame_1_data_7&#039;, 0)\&lt;br /&gt;
	} else {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;Mileage&#039;, 0)\&lt;br /&gt;
	}\&lt;br /&gt;
},\&lt;br /&gt;
OperatingVoltage:frame_1_data_6:.* {\&lt;br /&gt;
	if (ReadingsNum($NAME, &#039;frame_1_id&#039;, 0) == 1995 and ReadingsNum($NAME, &#039;frame_1_data_1&#039;, 0)  == 4 and ReadingsNum($NAME, &#039;frame_1_data_2&#039;, 0)  == 98\&lt;br /&gt;
      and ReadingsNum($NAME, &#039;frame_1_data_3&#039;, 0)  == 208 ) {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;frame_1_data_5&#039;, 0) /10.0\&lt;br /&gt;
	} else {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;OperatingVoltage&#039;, 0)\&lt;br /&gt;
	}\&lt;br /&gt;
},\&lt;br /&gt;
TotalCharge:frame_1_data_6:.* {\&lt;br /&gt;
	if (ReadingsNum($NAME, &#039;frame_1_id&#039;, 0) == 1995 and ReadingsNum($NAME, &#039;frame_1_data_1&#039;, 0)  == 7 and ReadingsNum($NAME, &#039;frame_1_data_2&#039;, 0)  == 98\&lt;br /&gt;
      and ReadingsNum($NAME, &#039;frame_1_data_3&#039;, 0)  == 33 and ReadingsNum($NAME, &#039;frame_1_data_4&#039;, 0)  == 113 ) {\&lt;br /&gt;
		return round( 2 * ReadingsNum($NAME, &#039;frame_1_data_7&#039;, 0) + ReadingsNum($NAME, &#039;frame_1_data_8&#039;, 0) / 128 , 0)\&lt;br /&gt;
	} else {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;TotalCharge&#039;, 0)\&lt;br /&gt;
	}\&lt;br /&gt;
},\&lt;br /&gt;
TotalDischarge:frame_1_data_6:.* {\&lt;br /&gt;
	if (ReadingsNum($NAME, &#039;frame_1_id&#039;, 0) == 1995 and ReadingsNum($NAME, &#039;frame_1_data_1&#039;, 0)  == 7 and ReadingsNum($NAME, &#039;frame_1_data_2&#039;, 0)  == 98\&lt;br /&gt;
  and ReadingsNum($NAME, &#039;frame_1_data_3&#039;, 0)  == 33 and ReadingsNum($NAME, &#039;frame_1_data_4&#039;, 0)  == 114 ) {\&lt;br /&gt;
		return round( 2 * ReadingsNum($NAME, &#039;frame_1_data_7&#039;, 0) + ReadingsNum($NAME, &#039;frame_1_data_8&#039;, 0) / 128 , 0)\&lt;br /&gt;
	} else {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;TotalDischarge&#039;, 0)\&lt;br /&gt;
	}\&lt;br /&gt;
},\&lt;br /&gt;
BatteryVoltage:frame_1_data_6:.* {\&lt;br /&gt;
	if (ReadingsNum($NAME, &#039;frame_1_id&#039;, 0) == 1995 and ReadingsNum($NAME, &#039;frame_1_data_1&#039;, 0)  == 16 and ReadingsNum($NAME, &#039;frame_1_data_2&#039;, 0)  == 9\&lt;br /&gt;
      and ReadingsNum($NAME, &#039;frame_1_data_3&#039;, 0)  == 98 and ReadingsNum($NAME, &#039;frame_1_data_4&#039;, 0)  == 32 ) {\&lt;br /&gt;
		return ( 256 * ReadingsNum($NAME, &#039;frame_1_data_6&#039;, 0) + ReadingsNum($NAME, &#039;frame_1_data_7&#039;, 0)) / 10.0 \&lt;br /&gt;
	} else {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;BatteryVoltage&#039;, 0)\&lt;br /&gt;
	}\&lt;br /&gt;
},\&lt;br /&gt;
SoE:frame_1_data_6:.* {\&lt;br /&gt;
	if (ReadingsNum($NAME, &#039;frame_1_id&#039;, 0) == 1994 and ReadingsNum($NAME, &#039;frame_1_data_1&#039;, 0)  == 7 and ReadingsNum($NAME, &#039;frame_1_data_2&#039;, 0)  == 98\&lt;br /&gt;
      and ReadingsNum($NAME, &#039;frame_1_data_3&#039;, 0)  == 208 and ReadingsNum($NAME, &#039;frame_1_data_4&#039;, 0)  == 98 ) {\&lt;br /&gt;
		return (256*ReadingsNum($NAME, &#039;frame_1_data_7&#039;, 0)+ReadingsNum($NAME, &#039;frame_1_data_8&#039;, 0)) / 10.0 \&lt;br /&gt;
	} else {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;SoE&#039;, 0)\&lt;br /&gt;
	}\&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Elektromobilität]]&lt;/div&gt;</summary>
		<author><name>Topos</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Ora_Funky_Cat&amp;diff=39262</id>
		<title>Ora Funky Cat</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Ora_Funky_Cat&amp;diff=39262"/>
		<updated>2024-04-21T10:56:54Z</updated>

		<summary type="html">&lt;p&gt;Topos: /* Beispielhafte Einrichtung des WiCAN im Ora Funky Cat als MQTT2-Device */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Auf dieser Seite wird die Einbindung des E-Autos [https://www.ora-motor.de/ Ora Funky Cat] von GWM (Great Wall Motors aus China) in FHEM über die OBD2-Serviceschnittestelle erläutert.&lt;br /&gt;
&lt;br /&gt;
Benötigte Hardware: [https://www.meatpi.com/products/wican MeatPi WiCAN-OBD-C3 Dongle]&lt;br /&gt;
&lt;br /&gt;
Der WiCAN wird in die OBD2-Serviceschnittestelle (rechts neben Sicherungsfach unterhalb Lenkrad) gesteckt. Am besten über ein Verlängerungskabel oder indem man den OBD2-Stecker aus der Halterung drückt und mit dem WiCAN ins Sicherungsfach legt. &lt;br /&gt;
&lt;br /&gt;
Der WiCAN kann sich über WLAN mit eine MQTT-Server verbinden. Näheres im obigen Link. Als Protokoll &amp;quot;slcan&amp;quot; auswählen. Die Kommunikation erfolgt über den Eintrag &#039;&#039;can/tx&#039;&#039; und &#039;&#039;can/rx&#039;&#039; des WiCAN auf dem MQTT-Server. Bitte nicht vergessen, den automatischen Standby-Modus anzuschalten, ansonsten leert sich mit der Zeit die Fahrzeugbatterie.&lt;br /&gt;
&lt;br /&gt;
Die Integration eines MQTT-Servers in FHEM wird [[MQTT|&#039;&#039;&#039;hier&#039;&#039;&#039;]] erklärt. &lt;br /&gt;
&lt;br /&gt;
Ist das Auto eingeschaltet und der Dongle gesteckt, dann können über FHEM Fahrzeugwerte abgefragt werden. Weiter unten eine beispielhafte EInrichtung eines MQTT2-Devices. &lt;br /&gt;
&lt;br /&gt;
=== Readings ===&lt;br /&gt;
Die folgenden Werte werden mit unterer Beispielkonfiguration ausgelesen:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Mileage:&#039;&#039;&#039; km-Stand - Abfrage über &amp;quot;set wican read_Mileage&amp;quot;&lt;br /&gt;
* &#039;&#039;&#039;SoC&#039;&#039;&#039;: Ladezustand Hochvolt-Antriebsbatterie in %  - Abfrage über &amp;quot;set wican read_SoC&amp;quot;&lt;br /&gt;
* &#039;&#039;&#039;TrueSoC&#039;&#039;&#039;: ein zweiter Wert. Hintergrund ist unbekannt - Abfrage über &amp;quot;set wican read_TrueSoC&amp;quot;&lt;br /&gt;
* &#039;&#039;&#039;SoE&#039;&#039;&#039;: Ladezustand Hochvolt-Antriebsbatterie in kW - Abfrage über &amp;quot;set wican read_SoE&amp;quot;&lt;br /&gt;
* &#039;&#039;&#039;SoH&#039;&#039;&#039;: Gesundheitszustand der Hochvolt-Antriebsbatterie in % - Abfrage über &amp;quot;set wican read_SoH&amp;quot;&lt;br /&gt;
* &#039;&#039;&#039;OperatingVoltage&#039;&#039;&#039;: Spannung Niedervolt-Fahrzeugbatterie in V - Abfrage über &amp;quot;set wican read_OperatingVoltage&amp;quot;&lt;br /&gt;
* &#039;&#039;&#039;BatteryVoltage&#039;&#039;&#039;: Spannung Hochvolt-Antriebsbatterie in V - Abfrage über &amp;quot;set wican read_BatteryVoltage&amp;quot;&lt;br /&gt;
* &#039;&#039;&#039;TotalCharge&#039;&#039;&#039;: Durch die Batterie aufgenommene Stromleistung in Ah (inklusive Rekuperation während des Fahrens) - Abfrage über &amp;quot;set wican read_Total Charge&amp;quot; Die Multiplikation mit 5 kV scheint die hinzugefügte elektrische Leistung zu ergeben.&lt;br /&gt;
* &#039;&#039;&#039;TotalDischarge&#039;&#039;&#039;: Von der Hochvolt-Batterie abgezogene Stromleistung in Ah - Abfrage über &amp;quot;set wican read_TotalDischarge&amp;quot; Die Multiplikation mit 5 kV scheint die abgerufene elektrische Leistung zu ergeben.&lt;br /&gt;
Das erste Auslesen kann über ein notify angestossen werden, sobald der WiCAN den Status &amp;quot;online&amp;quot; hat. &amp;lt;syntaxhighlight lang=&amp;quot;cfg&amp;quot;&amp;gt;&lt;br /&gt;
define wican_online notify wican:status:.online set wican read_SoC;; sleep 1;; set wican read_TrueSoC;; sleep 1;; set wican read_Mileage;; sleep 1;; set wican read_OpVoltage;; sleep 1;; set wican read_SoH;; sleep 1;; set wican read_TotalCharge;; sleep 1;; set wican read_TotalDischarge;; sleep 1;; set wican read_BatteryVoltage;; sleep 1;; set wican read_SoE&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Die weiteren Abfrage können über einen Timer erfolgen Der Timer kann mit einem notify ein- und wieder ausgeschaltet werden.&amp;lt;syntaxhighlight lang=&amp;quot;cfg&amp;quot;&amp;gt;&lt;br /&gt;
define wican_check at +*00:01:00 set wican read_SoC;; sleep 1;; set wican read_TrueSoC;; sleep 1;; set wican read_Mileage;; sleep 1;; set wican read_OpVoltage;; sleep 1;; set wican read_SoH;; sleep 1;; set wican read_TotalCharge;; sleep 1;; set wican read_TotalDischarge;; sleep 1;; set wican read_BatteryVoltage;; sleep 1;; set wican read_SoE&lt;br /&gt;
&lt;br /&gt;
define wican_check_active notify wican:status:.online set wican_check active&lt;br /&gt;
&lt;br /&gt;
define wican_check_inactive notify wican:status:.offline set wican_check inactive&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Beispielhafte Einrichtung des WiCAN im Ora Funky Cat als MQTT2-Device ===&lt;br /&gt;
Ab der WiCAN Firmware 2.98 (April 2024) kann die Benennung des Eintrages im MQTT-Server frei gewählt werden. Die untere Konfiguration geht von folgender Benennung aus: &lt;br /&gt;
&lt;br /&gt;
* TX Topic: &#039;&#039;wican/ora/can/tx&#039;&#039;&lt;br /&gt;
* RX Topic: &#039;&#039;wican/ora/can/tx&#039;&#039;&lt;br /&gt;
* Status Topic: &#039;&#039;wican/ora/can/status&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cfg&amp;quot;&amp;gt;&lt;br /&gt;
define wican MQTT2_DEVICE&lt;br /&gt;
attr wican alias Ora&lt;br /&gt;
attr wican stateFormat B: SoC% M: Mileage km (status)&lt;br /&gt;
attr wican event-on-change-reading status&lt;br /&gt;
attr wican event-on-update-reading frame_1_data_6,SoC&lt;br /&gt;
attr wican DbLogExclude .*&lt;br /&gt;
attr wican DbLogInclude SoC:3600&lt;br /&gt;
attr wican readingList wican/ora/can/status:.* {json2nameValue($EVENT)}\&lt;br /&gt;
 wican/ora/can/rx:.* {json2nameValue($EVENT)}&lt;br /&gt;
attr wican setList read_SoC:noArg wican/ora/can/tx {&amp;quot;bus&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;tx&amp;quot;,&amp;quot;ts&amp;quot;:49539,&amp;quot;frame&amp;quot;:[{&amp;quot;id&amp;quot;:1931,&amp;quot;dlc&amp;quot;:8,&amp;quot;rtr&amp;quot;:false,&amp;quot;extd&amp;quot;:false,&amp;quot;data&amp;quot;:[3,34,32,80,170,170,170,170]}]}\&lt;br /&gt;
read_TrueSoC:noArg wican/ora/can/tx {&amp;quot;bus&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;tx&amp;quot;,&amp;quot;ts&amp;quot;:27825,&amp;quot;frame&amp;quot;:[{&amp;quot;id&amp;quot;:1931,&amp;quot;dlc&amp;quot;:8,&amp;quot;rtr&amp;quot;:false,&amp;quot;extd&amp;quot;:false,&amp;quot;data&amp;quot;:[3,34,3,8,170,170,170,170]}]}\&lt;br /&gt;
read_SoH:noArg wican/ora/can/tx {&amp;quot;bus&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;tx&amp;quot;,&amp;quot;ts&amp;quot;:12016,&amp;quot;frame&amp;quot;:[{&amp;quot;id&amp;quot;:1931,&amp;quot;dlc&amp;quot;:8,&amp;quot;rtr&amp;quot;:false,&amp;quot;extd&amp;quot;:false,&amp;quot;data&amp;quot;:[3,34,32,81,170,170,170,170]}]}\&lt;br /&gt;
read_SoE:noArg wican/ora/can/tx {&amp;quot;bus&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;tx&amp;quot;,&amp;quot;ts&amp;quot;:17777,&amp;quot;frame&amp;quot;:[{&amp;quot;id&amp;quot;:1930,&amp;quot;dlc&amp;quot;:8,&amp;quot;rtr&amp;quot;:false,&amp;quot;extd&amp;quot;:false,&amp;quot;data&amp;quot;:[3,34,208,98,170,170,170,170]}]}\&lt;br /&gt;
read_OpVoltage:noArg wican/ora/can/tx {&amp;quot;bus&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;tx&amp;quot;,&amp;quot;ts&amp;quot;:17645,&amp;quot;frame&amp;quot;:[{&amp;quot;id&amp;quot;:1931,&amp;quot;dlc&amp;quot;:8,&amp;quot;rtr&amp;quot;:false,&amp;quot;extd&amp;quot;:false,&amp;quot;data&amp;quot;:[3,34,208,3,170,170,170,170]}]}\&lt;br /&gt;
read_Mileage:noArg wican/ora/can/tx {&amp;quot;bus&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;tx&amp;quot;,&amp;quot;ts&amp;quot;:35674,&amp;quot;frame&amp;quot;:[{&amp;quot;id&amp;quot;:1931,&amp;quot;dlc&amp;quot;:8,&amp;quot;rtr&amp;quot;:false,&amp;quot;extd&amp;quot;:false,&amp;quot;data&amp;quot;:[3,34,208,4,170,170,170,170]}]}\&lt;br /&gt;
read_TotalCharge:noArg wican/ora/can/tx {&amp;quot;bus&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;tx&amp;quot;,&amp;quot;ts&amp;quot;:28695,&amp;quot;frame&amp;quot;:[{&amp;quot;id&amp;quot;:1931,&amp;quot;dlc&amp;quot;:8,&amp;quot;rtr&amp;quot;:false,&amp;quot;extd&amp;quot;:false,&amp;quot;data&amp;quot;:[3,34,33,113,170,170,170,170]}]}\&lt;br /&gt;
read_TotalDischarge:noArg wican/ora/can/tx {&amp;quot;bus&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;tx&amp;quot;,&amp;quot;ts&amp;quot;:28695,&amp;quot;frame&amp;quot;:[{&amp;quot;id&amp;quot;:1931,&amp;quot;dlc&amp;quot;:8,&amp;quot;rtr&amp;quot;:false,&amp;quot;extd&amp;quot;:false,&amp;quot;data&amp;quot;:[3,34,33,114,170,170,170,170]}]}\&lt;br /&gt;
read_BatteryVoltage:noArg wican/ora/can/tx {&amp;quot;bus&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;tx&amp;quot;,&amp;quot;ts&amp;quot;:58591,&amp;quot;frame&amp;quot;:[{&amp;quot;id&amp;quot;:1931,&amp;quot;dlc&amp;quot;:8,&amp;quot;rtr&amp;quot;:false,&amp;quot;extd&amp;quot;:false,&amp;quot;data&amp;quot;:[3,34,32,3,170,170,170,170]}]}&lt;br /&gt;
attr wican userReadings SoC:frame_1_data_6:.* {\&lt;br /&gt;
	if (ReadingsNum($NAME, &#039;frame_1_id&#039;, 0) == 1995 and ReadingsNum($NAME, &#039;frame_1_data_1&#039;, 0)  == 5 and ReadingsNum($NAME, &#039;frame_1_data_2&#039;, 0)  == 98\&lt;br /&gt;
      and ReadingsNum($NAME, &#039;frame_1_data_3&#039;, 0)  == 32 and ReadingsNum($NAME, &#039;frame_1_data_4&#039;, 0)  == 80 ) {\&lt;br /&gt;
		return (ReadingsNum($NAME, &#039;frame_1_data_5&#039;, 0) * 256+ReadingsNum($NAME, &#039;frame_1_data_6&#039;, 0))/10.0\&lt;br /&gt;
	} else {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;SoC&#039;, 0)\&lt;br /&gt;
	}\&lt;br /&gt;
},\&lt;br /&gt;
SoH:frame_1_data_6:.* {\&lt;br /&gt;
	if (ReadingsNum($NAME, &#039;frame_1_id&#039;, 0) == 1995 and ReadingsNum($NAME, &#039;frame_1_data_1&#039;, 0)  == 5 and ReadingsNum($NAME, &#039;frame_1_data_2&#039;, 0)  == 98\&lt;br /&gt;
      and ReadingsNum($NAME, &#039;frame_1_data_3&#039;, 0)  == 32 and ReadingsNum($NAME, &#039;frame_1_data_4&#039;, 0)  == 81 ) {\&lt;br /&gt;
		return (ReadingsNum($NAME, &#039;frame_1_data_5&#039;, 0) * 256 + ReadingsNum($NAME, &#039;frame_1_data_6&#039;, 0))/10.0\&lt;br /&gt;
	} else {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;SoH&#039;, 0)\&lt;br /&gt;
	}\&lt;br /&gt;
},\&lt;br /&gt;
TrueSoC:frame_1_data_6:.* {\&lt;br /&gt;
	if (ReadingsNum($NAME, &#039;frame_1_id&#039;, 0) == 1995 and ReadingsNum($NAME, &#039;frame_1_data_3&#039;, 0)  == 3) {\&lt;br /&gt;
		return (ReadingsNum($NAME, &#039;frame_1_data_5&#039;, 0) * 256 + ReadingsNum($NAME, &#039;frame_1_data_6&#039;, 0))/10.0\&lt;br /&gt;
	} else {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;TrueSoC&#039;, 0)\&lt;br /&gt;
	}\&lt;br /&gt;
},\&lt;br /&gt;
Mileage:frame_1_data_6:.* {\&lt;br /&gt;
	if (ReadingsNum($NAME, &#039;frame_1_id&#039;, 0) == 1995 and ReadingsNum($NAME, &#039;frame_1_data_1&#039;, 0)  == 6 and ReadingsNum($NAME, &#039;frame_1_data_2&#039;, 0)  == 98\&lt;br /&gt;
      and ReadingsNum($NAME, &#039;frame_1_data_3&#039;, 0)  == 208 ) {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;frame_1_data_6&#039;, 0) * 256 + ReadingsNum($NAME, &#039;frame_1_data_7&#039;, 0)\&lt;br /&gt;
	} else {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;Mileage&#039;, 0)\&lt;br /&gt;
	}\&lt;br /&gt;
},\&lt;br /&gt;
OperatingVoltage:frame_1_data_6:.* {\&lt;br /&gt;
	if (ReadingsNum($NAME, &#039;frame_1_id&#039;, 0) == 1995 and ReadingsNum($NAME, &#039;frame_1_data_1&#039;, 0)  == 4 and ReadingsNum($NAME, &#039;frame_1_data_2&#039;, 0)  == 98\&lt;br /&gt;
      and ReadingsNum($NAME, &#039;frame_1_data_3&#039;, 0)  == 208 ) {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;frame_1_data_5&#039;, 0) /10.0\&lt;br /&gt;
	} else {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;OperatingVoltage&#039;, 0)\&lt;br /&gt;
	}\&lt;br /&gt;
},\&lt;br /&gt;
TotalCharge:frame_1_data_6:.* {\&lt;br /&gt;
	if (ReadingsNum($NAME, &#039;frame_1_id&#039;, 0) == 1995 and ReadingsNum($NAME, &#039;frame_1_data_1&#039;, 0)  == 7 and ReadingsNum($NAME, &#039;frame_1_data_2&#039;, 0)  == 98\&lt;br /&gt;
      and ReadingsNum($NAME, &#039;frame_1_data_3&#039;, 0)  == 33 and ReadingsNum($NAME, &#039;frame_1_data_4&#039;, 0)  == 113 ) {\&lt;br /&gt;
		return round( 2 * ReadingsNum($NAME, &#039;frame_1_data_7&#039;, 0) + ReadingsNum($NAME, &#039;frame_1_data_8&#039;, 0) / 128 , 0)\&lt;br /&gt;
	} else {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;TotalCharge&#039;, 0)\&lt;br /&gt;
	}\&lt;br /&gt;
},\&lt;br /&gt;
TotalDischarge:frame_1_data_6:.* {\&lt;br /&gt;
	if (ReadingsNum($NAME, &#039;frame_1_id&#039;, 0) == 1995 and ReadingsNum($NAME, &#039;frame_1_data_1&#039;, 0)  == 7 and ReadingsNum($NAME, &#039;frame_1_data_2&#039;, 0)  == 98\&lt;br /&gt;
  and ReadingsNum($NAME, &#039;frame_1_data_3&#039;, 0)  == 33 and ReadingsNum($NAME, &#039;frame_1_data_4&#039;, 0)  == 114 ) {\&lt;br /&gt;
		return round( 2 * ReadingsNum($NAME, &#039;frame_1_data_7&#039;, 0) + ReadingsNum($NAME, &#039;frame_1_data_8&#039;, 0) / 128 , 0)\&lt;br /&gt;
	} else {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;TotalDischarge&#039;, 0)\&lt;br /&gt;
	}\&lt;br /&gt;
},\&lt;br /&gt;
BatteryVoltage:frame_1_data_6:.* {\&lt;br /&gt;
	if (ReadingsNum($NAME, &#039;frame_1_id&#039;, 0) == 1995 and ReadingsNum($NAME, &#039;frame_1_data_1&#039;, 0)  == 16 and ReadingsNum($NAME, &#039;frame_1_data_2&#039;, 0)  == 9\&lt;br /&gt;
      and ReadingsNum($NAME, &#039;frame_1_data_3&#039;, 0)  == 98 and ReadingsNum($NAME, &#039;frame_1_data_4&#039;, 0)  == 32 ) {\&lt;br /&gt;
		return ( 256 * ReadingsNum($NAME, &#039;frame_1_data_6&#039;, 0) + ReadingsNum($NAME, &#039;frame_1_data_7&#039;, 0)) / 10.0 \&lt;br /&gt;
	} else {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;BatteryVoltage&#039;, 0)\&lt;br /&gt;
	}\&lt;br /&gt;
},\&lt;br /&gt;
SoE:frame_1_data_6:.* {\&lt;br /&gt;
	if (ReadingsNum($NAME, &#039;frame_1_id&#039;, 0) == 1994 and ReadingsNum($NAME, &#039;frame_1_data_1&#039;, 0)  == 7 and ReadingsNum($NAME, &#039;frame_1_data_2&#039;, 0)  == 98\&lt;br /&gt;
      and ReadingsNum($NAME, &#039;frame_1_data_3&#039;, 0)  == 208 and ReadingsNum($NAME, &#039;frame_1_data_4&#039;, 0)  == 98 ) {\&lt;br /&gt;
		return (256*ReadingsNum($NAME, &#039;frame_1_data_7&#039;, 0)+ReadingsNum($NAME, &#039;frame_1_data_8&#039;, 0)) / 10.0 \&lt;br /&gt;
	} else {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;SoE&#039;, 0)\&lt;br /&gt;
	}\&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Elektromobilität]]&lt;/div&gt;</summary>
		<author><name>Topos</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Ora_Funky_Cat&amp;diff=39261</id>
		<title>Ora Funky Cat</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Ora_Funky_Cat&amp;diff=39261"/>
		<updated>2024-04-21T09:52:46Z</updated>

		<summary type="html">&lt;p&gt;Topos: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Auf dieser Seite wird die Einbindung des E-Autos [https://www.ora-motor.de/ Ora Funky Cat] von GWM (Great Wall Motors aus China) in FHEM über die OBD2-Serviceschnittestelle erläutert.&lt;br /&gt;
&lt;br /&gt;
Benötigte Hardware: [https://www.meatpi.com/products/wican MeatPi WiCAN-OBD-C3 Dongle]&lt;br /&gt;
&lt;br /&gt;
Der WiCAN wird in die OBD2-Serviceschnittestelle (rechts neben Sicherungsfach unterhalb Lenkrad) gesteckt. Am besten über ein Verlängerungskabel oder indem man den OBD2-Stecker aus der Halterung drückt und mit dem WiCAN ins Sicherungsfach legt. &lt;br /&gt;
&lt;br /&gt;
Der WiCAN kann sich über WLAN mit eine MQTT-Server verbinden. Näheres im obigen Link. Als Protokoll &amp;quot;slcan&amp;quot; auswählen. Die Kommunikation erfolgt über den Eintrag &#039;&#039;can/tx&#039;&#039; und &#039;&#039;can/rx&#039;&#039; des WiCAN auf dem MQTT-Server. Bitte nicht vergessen, den automatischen Standby-Modus anzuschalten, ansonsten leert sich mit der Zeit die Fahrzeugbatterie.&lt;br /&gt;
&lt;br /&gt;
Die Integration eines MQTT-Servers in FHEM wird [[MQTT|&#039;&#039;&#039;hier&#039;&#039;&#039;]] erklärt. &lt;br /&gt;
&lt;br /&gt;
Ist das Auto eingeschaltet und der Dongle gesteckt, dann können über FHEM Fahrzeugwerte abgefragt werden. Weiter unten eine beispielhafte EInrichtung eines MQTT2-Devices. &lt;br /&gt;
&lt;br /&gt;
=== Readings ===&lt;br /&gt;
Die folgenden Werte werden mit unterer Beispielkonfiguration ausgelesen:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Mileage:&#039;&#039;&#039; km-Stand - Abfrage über &amp;quot;set wican read_Mileage&amp;quot;&lt;br /&gt;
* &#039;&#039;&#039;SoC&#039;&#039;&#039;: Ladezustand Hochvolt-Antriebsbatterie in %  - Abfrage über &amp;quot;set wican read_SoC&amp;quot;&lt;br /&gt;
* &#039;&#039;&#039;TrueSoC&#039;&#039;&#039;: ein zweiter Wert. Hintergrund ist unbekannt - Abfrage über &amp;quot;set wican read_TrueSoC&amp;quot;&lt;br /&gt;
* &#039;&#039;&#039;SoE&#039;&#039;&#039;: Ladezustand Hochvolt-Antriebsbatterie in kW - Abfrage über &amp;quot;set wican read_SoE&amp;quot;&lt;br /&gt;
* &#039;&#039;&#039;SoH&#039;&#039;&#039;: Gesundheitszustand der Hochvolt-Antriebsbatterie in % - Abfrage über &amp;quot;set wican read_SoH&amp;quot;&lt;br /&gt;
* &#039;&#039;&#039;OperatingVoltage&#039;&#039;&#039;: Spannung Niedervolt-Fahrzeugbatterie in V - Abfrage über &amp;quot;set wican read_OperatingVoltage&amp;quot;&lt;br /&gt;
* &#039;&#039;&#039;BatteryVoltage&#039;&#039;&#039;: Spannung Hochvolt-Antriebsbatterie in V - Abfrage über &amp;quot;set wican read_BatteryVoltage&amp;quot;&lt;br /&gt;
* &#039;&#039;&#039;TotalCharge&#039;&#039;&#039;: Durch die Batterie aufgenommene Stromleistung in Ah (inklusive Rekuperation während des Fahrens) - Abfrage über &amp;quot;set wican read_Total Charge&amp;quot; Die Multiplikation mit 5 kV scheint die hinzugefügte elektrische Leistung zu ergeben.&lt;br /&gt;
* &#039;&#039;&#039;TotalDischarge&#039;&#039;&#039;: Von der Hochvolt-Batterie abgezogene Stromleistung in Ah - Abfrage über &amp;quot;set wican read_TotalDischarge&amp;quot; Die Multiplikation mit 5 kV scheint die abgerufene elektrische Leistung zu ergeben.&lt;br /&gt;
Das erste Auslesen kann über ein notify angestossen werden, sobald der WiCAN den Status &amp;quot;online&amp;quot; hat. &amp;lt;syntaxhighlight lang=&amp;quot;cfg&amp;quot;&amp;gt;&lt;br /&gt;
define wican_online notify wican:status:.online set wican read_SoC;; sleep 1;; set wican read_TrueSoC;; sleep 1;; set wican read_Mileage;; sleep 1;; set wican read_OpVoltage;; sleep 1;; set wican read_SoH;; sleep 1;; set wican read_TotalCharge;; sleep 1;; set wican read_TotalDischarge;; sleep 1;; set wican read_BatteryVoltage;; sleep 1;; set wican read_SoE&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Die weiteren Abfrage können über einen Timer erfolgen Der Timer kann mit einem notify ein- und wieder ausgeschaltet werden.&amp;lt;syntaxhighlight lang=&amp;quot;cfg&amp;quot;&amp;gt;&lt;br /&gt;
define wican_check at +*00:01:00 set wican read_SoC;; sleep 1;; set wican read_TrueSoC;; sleep 1;; set wican read_Mileage;; sleep 1;; set wican read_OpVoltage;; sleep 1;; set wican read_SoH;; sleep 1;; set wican read_TotalCharge;; sleep 1;; set wican read_TotalDischarge;; sleep 1;; set wican read_BatteryVoltage;; sleep 1;; set wican read_SoE&lt;br /&gt;
&lt;br /&gt;
define wican_check_active notify wican:status:.online set wican_check active&lt;br /&gt;
&lt;br /&gt;
define wican_check_inactive notify wican:status:.offline set wican_check inactive&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Beispielhafte Einrichtung des WiCAN im Ora Funky Cat als MQTT2-Device ===&lt;br /&gt;
Der Ausdruck &amp;quot;XXXXXXXX&amp;quot; muss durch die Identnummer des WiCAN ersetzt werden. &amp;lt;syntaxhighlight lang=&amp;quot;cfg&amp;quot;&amp;gt;&lt;br /&gt;
define wican MQTT2_DEVICE&lt;br /&gt;
attr wican alias Ora&lt;br /&gt;
attr wican stateFormat B: SoC% M: Mileage km (status)&lt;br /&gt;
attr wican event-on-change-reading status&lt;br /&gt;
attr wican event-on-update-reading frame_1_data_6,SoC&lt;br /&gt;
attr wican DbLogExclude .*&lt;br /&gt;
attr wican DbLogInclude SoC:3600&lt;br /&gt;
attr wican readingList wican/XXXXXXXX/status:.* {json2nameValue($EVENT)}\&lt;br /&gt;
 wican/XXXXXXXX/can/rx:.* {json2nameValue($EVENT)}&lt;br /&gt;
attr wican setList read_SoC:noArg wican/XXXXXXXX/can/tx {&amp;quot;bus&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;tx&amp;quot;,&amp;quot;ts&amp;quot;:49539,&amp;quot;frame&amp;quot;:[{&amp;quot;id&amp;quot;:1931,&amp;quot;dlc&amp;quot;:8,&amp;quot;rtr&amp;quot;:false,&amp;quot;extd&amp;quot;:false,&amp;quot;data&amp;quot;:[3,34,32,80,170,170,170,170]}]}\&lt;br /&gt;
read_TrueSoC:noArg wican/XXXXXXXX/can/tx {&amp;quot;bus&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;tx&amp;quot;,&amp;quot;ts&amp;quot;:27825,&amp;quot;frame&amp;quot;:[{&amp;quot;id&amp;quot;:1931,&amp;quot;dlc&amp;quot;:8,&amp;quot;rtr&amp;quot;:false,&amp;quot;extd&amp;quot;:false,&amp;quot;data&amp;quot;:[3,34,3,8,170,170,170,170]}]}\&lt;br /&gt;
read_SoH:noArg wican/XXXXXXXX/can/tx {&amp;quot;bus&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;tx&amp;quot;,&amp;quot;ts&amp;quot;:12016,&amp;quot;frame&amp;quot;:[{&amp;quot;id&amp;quot;:1931,&amp;quot;dlc&amp;quot;:8,&amp;quot;rtr&amp;quot;:false,&amp;quot;extd&amp;quot;:false,&amp;quot;data&amp;quot;:[3,34,32,81,170,170,170,170]}]}\&lt;br /&gt;
read_SoE:noArg wican/XXXXXXXX/can/tx {&amp;quot;bus&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;tx&amp;quot;,&amp;quot;ts&amp;quot;:17777,&amp;quot;frame&amp;quot;:[{&amp;quot;id&amp;quot;:1930,&amp;quot;dlc&amp;quot;:8,&amp;quot;rtr&amp;quot;:false,&amp;quot;extd&amp;quot;:false,&amp;quot;data&amp;quot;:[3,34,208,98,170,170,170,170]}]}\&lt;br /&gt;
read_OpVoltage:noArg wican/XXXXXXXX/can/tx {&amp;quot;bus&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;tx&amp;quot;,&amp;quot;ts&amp;quot;:17645,&amp;quot;frame&amp;quot;:[{&amp;quot;id&amp;quot;:1931,&amp;quot;dlc&amp;quot;:8,&amp;quot;rtr&amp;quot;:false,&amp;quot;extd&amp;quot;:false,&amp;quot;data&amp;quot;:[3,34,208,3,170,170,170,170]}]}\&lt;br /&gt;
read_Mileage:noArg wican/XXXXXXXX/can/tx {&amp;quot;bus&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;tx&amp;quot;,&amp;quot;ts&amp;quot;:35674,&amp;quot;frame&amp;quot;:[{&amp;quot;id&amp;quot;:1931,&amp;quot;dlc&amp;quot;:8,&amp;quot;rtr&amp;quot;:false,&amp;quot;extd&amp;quot;:false,&amp;quot;data&amp;quot;:[3,34,208,4,170,170,170,170]}]}\&lt;br /&gt;
read_TotalCharge:noArg wican/XXXXXXXX/can/tx {&amp;quot;bus&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;tx&amp;quot;,&amp;quot;ts&amp;quot;:28695,&amp;quot;frame&amp;quot;:[{&amp;quot;id&amp;quot;:1931,&amp;quot;dlc&amp;quot;:8,&amp;quot;rtr&amp;quot;:false,&amp;quot;extd&amp;quot;:false,&amp;quot;data&amp;quot;:[3,34,33,113,170,170,170,170]}]}\&lt;br /&gt;
read_TotalDischarge:noArg wican/XXXXXXXX/can/tx {&amp;quot;bus&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;tx&amp;quot;,&amp;quot;ts&amp;quot;:28695,&amp;quot;frame&amp;quot;:[{&amp;quot;id&amp;quot;:1931,&amp;quot;dlc&amp;quot;:8,&amp;quot;rtr&amp;quot;:false,&amp;quot;extd&amp;quot;:false,&amp;quot;data&amp;quot;:[3,34,33,114,170,170,170,170]}]}\&lt;br /&gt;
read_BatteryVoltage:noArg wican/XXXXXXXX/can/tx {&amp;quot;bus&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;tx&amp;quot;,&amp;quot;ts&amp;quot;:58591,&amp;quot;frame&amp;quot;:[{&amp;quot;id&amp;quot;:1931,&amp;quot;dlc&amp;quot;:8,&amp;quot;rtr&amp;quot;:false,&amp;quot;extd&amp;quot;:false,&amp;quot;data&amp;quot;:[3,34,32,3,170,170,170,170]}]}&lt;br /&gt;
attr wican userReadings SoC:frame_1_data_6:.* {\&lt;br /&gt;
	if (ReadingsNum($NAME, &#039;frame_1_id&#039;, 0) == 1995 and ReadingsNum($NAME, &#039;frame_1_data_1&#039;, 0)  == 5 and ReadingsNum($NAME, &#039;frame_1_data_2&#039;, 0)  == 98\&lt;br /&gt;
      and ReadingsNum($NAME, &#039;frame_1_data_3&#039;, 0)  == 32 and ReadingsNum($NAME, &#039;frame_1_data_4&#039;, 0)  == 80 ) {\&lt;br /&gt;
		return (ReadingsNum($NAME, &#039;frame_1_data_5&#039;, 0) * 256+ReadingsNum($NAME, &#039;frame_1_data_6&#039;, 0))/10.0\&lt;br /&gt;
	} else {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;SoC&#039;, 0)\&lt;br /&gt;
	}\&lt;br /&gt;
},\&lt;br /&gt;
SoH:frame_1_data_6:.* {\&lt;br /&gt;
	if (ReadingsNum($NAME, &#039;frame_1_id&#039;, 0) == 1995 and ReadingsNum($NAME, &#039;frame_1_data_1&#039;, 0)  == 5 and ReadingsNum($NAME, &#039;frame_1_data_2&#039;, 0)  == 98\&lt;br /&gt;
      and ReadingsNum($NAME, &#039;frame_1_data_3&#039;, 0)  == 32 and ReadingsNum($NAME, &#039;frame_1_data_4&#039;, 0)  == 81 ) {\&lt;br /&gt;
		return (ReadingsNum($NAME, &#039;frame_1_data_5&#039;, 0) * 256 + ReadingsNum($NAME, &#039;frame_1_data_6&#039;, 0))/10.0\&lt;br /&gt;
	} else {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;SoH&#039;, 0)\&lt;br /&gt;
	}\&lt;br /&gt;
},\&lt;br /&gt;
TrueSoC:frame_1_data_6:.* {\&lt;br /&gt;
	if (ReadingsNum($NAME, &#039;frame_1_id&#039;, 0) == 1995 and ReadingsNum($NAME, &#039;frame_1_data_3&#039;, 0)  == 3) {\&lt;br /&gt;
		return (ReadingsNum($NAME, &#039;frame_1_data_5&#039;, 0) * 256 + ReadingsNum($NAME, &#039;frame_1_data_6&#039;, 0))/10.0\&lt;br /&gt;
	} else {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;TrueSoC&#039;, 0)\&lt;br /&gt;
	}\&lt;br /&gt;
},\&lt;br /&gt;
Mileage:frame_1_data_6:.* {\&lt;br /&gt;
	if (ReadingsNum($NAME, &#039;frame_1_id&#039;, 0) == 1995 and ReadingsNum($NAME, &#039;frame_1_data_1&#039;, 0)  == 6 and ReadingsNum($NAME, &#039;frame_1_data_2&#039;, 0)  == 98\&lt;br /&gt;
      and ReadingsNum($NAME, &#039;frame_1_data_3&#039;, 0)  == 208 ) {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;frame_1_data_6&#039;, 0) * 256 + ReadingsNum($NAME, &#039;frame_1_data_7&#039;, 0)\&lt;br /&gt;
	} else {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;Mileage&#039;, 0)\&lt;br /&gt;
	}\&lt;br /&gt;
},\&lt;br /&gt;
OperatingVoltage:frame_1_data_6:.* {\&lt;br /&gt;
	if (ReadingsNum($NAME, &#039;frame_1_id&#039;, 0) == 1995 and ReadingsNum($NAME, &#039;frame_1_data_1&#039;, 0)  == 4 and ReadingsNum($NAME, &#039;frame_1_data_2&#039;, 0)  == 98\&lt;br /&gt;
      and ReadingsNum($NAME, &#039;frame_1_data_3&#039;, 0)  == 208 ) {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;frame_1_data_5&#039;, 0) /10.0\&lt;br /&gt;
	} else {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;OperatingVoltage&#039;, 0)\&lt;br /&gt;
	}\&lt;br /&gt;
},\&lt;br /&gt;
TotalCharge:frame_1_data_6:.* {\&lt;br /&gt;
	if (ReadingsNum($NAME, &#039;frame_1_id&#039;, 0) == 1995 and ReadingsNum($NAME, &#039;frame_1_data_1&#039;, 0)  == 7 and ReadingsNum($NAME, &#039;frame_1_data_2&#039;, 0)  == 98\&lt;br /&gt;
      and ReadingsNum($NAME, &#039;frame_1_data_3&#039;, 0)  == 33 and ReadingsNum($NAME, &#039;frame_1_data_4&#039;, 0)  == 113 ) {\&lt;br /&gt;
		return round( 2 * ReadingsNum($NAME, &#039;frame_1_data_7&#039;, 0) + ReadingsNum($NAME, &#039;frame_1_data_8&#039;, 0) / 128 , 0)\&lt;br /&gt;
	} else {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;TotalCharge&#039;, 0)\&lt;br /&gt;
	}\&lt;br /&gt;
},\&lt;br /&gt;
TotalDischarge:frame_1_data_6:.* {\&lt;br /&gt;
	if (ReadingsNum($NAME, &#039;frame_1_id&#039;, 0) == 1995 and ReadingsNum($NAME, &#039;frame_1_data_1&#039;, 0)  == 7 and ReadingsNum($NAME, &#039;frame_1_data_2&#039;, 0)  == 98\&lt;br /&gt;
  and ReadingsNum($NAME, &#039;frame_1_data_3&#039;, 0)  == 33 and ReadingsNum($NAME, &#039;frame_1_data_4&#039;, 0)  == 114 ) {\&lt;br /&gt;
		return round( 2 * ReadingsNum($NAME, &#039;frame_1_data_7&#039;, 0) + ReadingsNum($NAME, &#039;frame_1_data_8&#039;, 0) / 128 , 0)\&lt;br /&gt;
	} else {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;TotalDischarge&#039;, 0)\&lt;br /&gt;
	}\&lt;br /&gt;
},\&lt;br /&gt;
BatteryVoltage:frame_1_data_6:.* {\&lt;br /&gt;
	if (ReadingsNum($NAME, &#039;frame_1_id&#039;, 0) == 1995 and ReadingsNum($NAME, &#039;frame_1_data_1&#039;, 0)  == 16 and ReadingsNum($NAME, &#039;frame_1_data_2&#039;, 0)  == 9\&lt;br /&gt;
      and ReadingsNum($NAME, &#039;frame_1_data_3&#039;, 0)  == 98 and ReadingsNum($NAME, &#039;frame_1_data_4&#039;, 0)  == 32 ) {\&lt;br /&gt;
		return ( 256 * ReadingsNum($NAME, &#039;frame_1_data_6&#039;, 0) + ReadingsNum($NAME, &#039;frame_1_data_7&#039;, 0)) / 10.0 \&lt;br /&gt;
	} else {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;BatteryVoltage&#039;, 0)\&lt;br /&gt;
	}\&lt;br /&gt;
},\&lt;br /&gt;
SoE:frame_1_data_6:.* {\&lt;br /&gt;
	if (ReadingsNum($NAME, &#039;frame_1_id&#039;, 0) == 1994 and ReadingsNum($NAME, &#039;frame_1_data_1&#039;, 0)  == 7 and ReadingsNum($NAME, &#039;frame_1_data_2&#039;, 0)  == 98\&lt;br /&gt;
      and ReadingsNum($NAME, &#039;frame_1_data_3&#039;, 0)  == 208 and ReadingsNum($NAME, &#039;frame_1_data_4&#039;, 0)  == 98 ) {\&lt;br /&gt;
		return (256*ReadingsNum($NAME, &#039;frame_1_data_7&#039;, 0)+ReadingsNum($NAME, &#039;frame_1_data_8&#039;, 0)) / 10.0 \&lt;br /&gt;
	} else {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;SoE&#039;, 0)\&lt;br /&gt;
	}\&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Elektromobilität]]&lt;/div&gt;</summary>
		<author><name>Topos</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Ora_Funky_Cat&amp;diff=39260</id>
		<title>Ora Funky Cat</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Ora_Funky_Cat&amp;diff=39260"/>
		<updated>2024-04-21T09:49:43Z</updated>

		<summary type="html">&lt;p&gt;Topos: Timer zur regelmäßigen Abfrage&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Auf dieser Seite wird die Einbindung des E-Autos [https://www.ora-motor.de/ Ora Funky Cat] von GWM (Great Wall Motors aus China) in FHEM über die OBD2-Serviceschnittestelle erläutert.&lt;br /&gt;
&lt;br /&gt;
Benötigte Hardware: [https://www.meatpi.com/products/wican MeatPi WiCAN-OBD-C3 Dongle]&lt;br /&gt;
&lt;br /&gt;
Der WiCAN wird in die ODB2-Serviceschnittestelle (neben Sicherungsfach unterhalb Lenkrad) gesteckt. Am besten über ein Verlängerungskabel oder indem man den OBD2-Stecker aus der Halterung drückt und mit dem WiCAN ins Sicherungsfach legt. &lt;br /&gt;
&lt;br /&gt;
Der WiCAN kann sich über WLAN mit eine MQTT-Server verbinden. Näheres im obigen Link. Als Protokoll &amp;quot;slcan&amp;quot; auswählen.Die Kommunikation erfolgt über den Eintrag &#039;&#039;can/tx&#039;&#039; und &#039;&#039;can/rx&#039;&#039; des WiCAN auf dem MQTT-Server. Bitte nicht vergessen, den automatischen Standby-Modus anzuschalten, ansonsten leert sich mit der Zeit die Fahrzeugbatterie.&lt;br /&gt;
&lt;br /&gt;
Die Integration eines MQTT-Servers in FHEM wird [[MQTT|&#039;&#039;&#039;hier&#039;&#039;&#039;]] erklärt. &lt;br /&gt;
&lt;br /&gt;
Ist das Auto eingeschalten und der Dongle gesteckt, dann können über FHEM Fahrzeugwerte abgefragt werden. Weiter unten eine beispielhafte EInrichtung eines MQTT2-Devices. &lt;br /&gt;
&lt;br /&gt;
=== Readings ===&lt;br /&gt;
Die folgenden Werte werden mit unterer Beispielkonfiguration ausgelesen:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Mileage:&#039;&#039;&#039; km-Stand - Abfrage über &amp;quot;set wican read_Mileage&amp;quot;&lt;br /&gt;
* &#039;&#039;&#039;SoC&#039;&#039;&#039;: Ladezustand Hochvolt-Antriebsbatterie in %  - Abfrage über &amp;quot;set wican read_SoC&amp;quot;&lt;br /&gt;
* &#039;&#039;&#039;TrueSoC&#039;&#039;&#039;: ein zweiter Wert. Hintergrund ist unbekannt - Abfrage über &amp;quot;set wican read_TrueSoC&amp;quot;&lt;br /&gt;
* &#039;&#039;&#039;SoE&#039;&#039;&#039;: Ladezustand Hochvolt-Antriebsbatterie in kW - Abfrage über &amp;quot;set wican read_SoE&amp;quot;&lt;br /&gt;
* &#039;&#039;&#039;SoH&#039;&#039;&#039;: Gesundheitszustand der Hochvolt-Antriebsbatterie in % - Abfrage über &amp;quot;set wican read_SoH&amp;quot;&lt;br /&gt;
* &#039;&#039;&#039;OperatingVoltage&#039;&#039;&#039;: Spannung Niedervolt-Fahrzeugbatterie in V - Abfrage über &amp;quot;set wican read_OperatingVoltage&amp;quot;&lt;br /&gt;
* &#039;&#039;&#039;BatteryVoltage&#039;&#039;&#039;: Spannung Hochvolt-Antriebsbatterie in V - Abfrage über &amp;quot;set wican read_BatteryVoltage&amp;quot;&lt;br /&gt;
* &#039;&#039;&#039;TotalCharge&#039;&#039;&#039;: Durch die Batterie aufgenommene Stromleistung in Ah (inklusive Rekuperation während des Fahrens) - Abfrage über &amp;quot;set wican read_Total Charge&amp;quot; Die Multiplikation mit 5 kV scheint die hinzugefügte elektrische Leistung zu ergeben.&lt;br /&gt;
* &#039;&#039;&#039;TotalDischarge&#039;&#039;&#039;: Von der Hochvolt-Batterie abgezogene Stromleistung in Ah - Abfrage über &amp;quot;set wican read_TotalDischarge&amp;quot; Die Multiplikation mit 5 kV scheint die abgerufene elektrische Leistung zu ergeben.&lt;br /&gt;
Das erste Auslesen kann über ein notify angestossen werden, sobald der WiCAN den Status &amp;quot;online&amp;quot; hat. &amp;lt;syntaxhighlight lang=&amp;quot;cfg&amp;quot;&amp;gt;&lt;br /&gt;
define wican_online notify wican:status:.online set wican read_SoC;; sleep 1;; set wican read_TrueSoC;; sleep 1;; set wican read_Mileage;; sleep 1;; set wican read_OpVoltage;; sleep 1;; set wican read_SoH;; sleep 1;; set wican read_TotalCharge;; sleep 1;; set wican read_TotalDischarge;; sleep 1;; set wican read_BatteryVoltage;; sleep 1;; set wican read_SoE&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Die weiteren Abfrage können über einen Timer erfolgen Der Timer kann mit einem notify ein- und wieder ausgeschaltet werden.&amp;lt;syntaxhighlight lang=&amp;quot;cfg&amp;quot;&amp;gt;&lt;br /&gt;
define wican_check at +*00:01:00 set wican read_SoC;; sleep 1;; set wican read_TrueSoC;; sleep 1;; set wican read_Mileage;; sleep 1;; set wican read_OpVoltage;; sleep 1;; set wican read_SoH;; sleep 1;; set wican read_TotalCharge;; sleep 1;; set wican read_TotalDischarge;; sleep 1;; set wican read_BatteryVoltage;; sleep 1;; set wican read_SoE&lt;br /&gt;
&lt;br /&gt;
define wican_check_active notify wican:status:.online set wican_check active&lt;br /&gt;
&lt;br /&gt;
define wican_check_inactive notify wican:status:.offline set wican_check inactive&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Beispielhafte Einrichtung des WiCAN im Ora Funky Cat als MQTT2-Device ===&lt;br /&gt;
Der Ausdruck &amp;quot;XXXXXXXX&amp;quot; muss durch die Identnummer des WiCAN ersetzt werden. &amp;lt;syntaxhighlight lang=&amp;quot;cfg&amp;quot;&amp;gt;&lt;br /&gt;
define wican MQTT2_DEVICE&lt;br /&gt;
attr wican alias Ora&lt;br /&gt;
attr wican stateFormat B: SoC% M: Mileage km (status)&lt;br /&gt;
attr wican event-on-change-reading status&lt;br /&gt;
attr wican event-on-update-reading frame_1_data_6,SoC&lt;br /&gt;
attr wican DbLogExclude .*&lt;br /&gt;
attr wican DbLogInclude SoC:3600&lt;br /&gt;
attr wican readingList wican/XXXXXXXX/status:.* {json2nameValue($EVENT)}\&lt;br /&gt;
 wican/XXXXXXXX/can/rx:.* {json2nameValue($EVENT)}&lt;br /&gt;
attr wican setList read_SoC:noArg wican/XXXXXXXX/can/tx {&amp;quot;bus&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;tx&amp;quot;,&amp;quot;ts&amp;quot;:49539,&amp;quot;frame&amp;quot;:[{&amp;quot;id&amp;quot;:1931,&amp;quot;dlc&amp;quot;:8,&amp;quot;rtr&amp;quot;:false,&amp;quot;extd&amp;quot;:false,&amp;quot;data&amp;quot;:[3,34,32,80,170,170,170,170]}]}\&lt;br /&gt;
read_TrueSoC:noArg wican/XXXXXXXX/can/tx {&amp;quot;bus&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;tx&amp;quot;,&amp;quot;ts&amp;quot;:27825,&amp;quot;frame&amp;quot;:[{&amp;quot;id&amp;quot;:1931,&amp;quot;dlc&amp;quot;:8,&amp;quot;rtr&amp;quot;:false,&amp;quot;extd&amp;quot;:false,&amp;quot;data&amp;quot;:[3,34,3,8,170,170,170,170]}]}\&lt;br /&gt;
read_SoH:noArg wican/XXXXXXXX/can/tx {&amp;quot;bus&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;tx&amp;quot;,&amp;quot;ts&amp;quot;:12016,&amp;quot;frame&amp;quot;:[{&amp;quot;id&amp;quot;:1931,&amp;quot;dlc&amp;quot;:8,&amp;quot;rtr&amp;quot;:false,&amp;quot;extd&amp;quot;:false,&amp;quot;data&amp;quot;:[3,34,32,81,170,170,170,170]}]}\&lt;br /&gt;
read_SoE:noArg wican/XXXXXXXX/can/tx {&amp;quot;bus&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;tx&amp;quot;,&amp;quot;ts&amp;quot;:17777,&amp;quot;frame&amp;quot;:[{&amp;quot;id&amp;quot;:1930,&amp;quot;dlc&amp;quot;:8,&amp;quot;rtr&amp;quot;:false,&amp;quot;extd&amp;quot;:false,&amp;quot;data&amp;quot;:[3,34,208,98,170,170,170,170]}]}\&lt;br /&gt;
read_OpVoltage:noArg wican/XXXXXXXX/can/tx {&amp;quot;bus&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;tx&amp;quot;,&amp;quot;ts&amp;quot;:17645,&amp;quot;frame&amp;quot;:[{&amp;quot;id&amp;quot;:1931,&amp;quot;dlc&amp;quot;:8,&amp;quot;rtr&amp;quot;:false,&amp;quot;extd&amp;quot;:false,&amp;quot;data&amp;quot;:[3,34,208,3,170,170,170,170]}]}\&lt;br /&gt;
read_Mileage:noArg wican/XXXXXXXX/can/tx {&amp;quot;bus&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;tx&amp;quot;,&amp;quot;ts&amp;quot;:35674,&amp;quot;frame&amp;quot;:[{&amp;quot;id&amp;quot;:1931,&amp;quot;dlc&amp;quot;:8,&amp;quot;rtr&amp;quot;:false,&amp;quot;extd&amp;quot;:false,&amp;quot;data&amp;quot;:[3,34,208,4,170,170,170,170]}]}\&lt;br /&gt;
read_TotalCharge:noArg wican/XXXXXXXX/can/tx {&amp;quot;bus&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;tx&amp;quot;,&amp;quot;ts&amp;quot;:28695,&amp;quot;frame&amp;quot;:[{&amp;quot;id&amp;quot;:1931,&amp;quot;dlc&amp;quot;:8,&amp;quot;rtr&amp;quot;:false,&amp;quot;extd&amp;quot;:false,&amp;quot;data&amp;quot;:[3,34,33,113,170,170,170,170]}]}\&lt;br /&gt;
read_TotalDischarge:noArg wican/XXXXXXXX/can/tx {&amp;quot;bus&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;tx&amp;quot;,&amp;quot;ts&amp;quot;:28695,&amp;quot;frame&amp;quot;:[{&amp;quot;id&amp;quot;:1931,&amp;quot;dlc&amp;quot;:8,&amp;quot;rtr&amp;quot;:false,&amp;quot;extd&amp;quot;:false,&amp;quot;data&amp;quot;:[3,34,33,114,170,170,170,170]}]}\&lt;br /&gt;
read_BatteryVoltage:noArg wican/XXXXXXXX/can/tx {&amp;quot;bus&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;tx&amp;quot;,&amp;quot;ts&amp;quot;:58591,&amp;quot;frame&amp;quot;:[{&amp;quot;id&amp;quot;:1931,&amp;quot;dlc&amp;quot;:8,&amp;quot;rtr&amp;quot;:false,&amp;quot;extd&amp;quot;:false,&amp;quot;data&amp;quot;:[3,34,32,3,170,170,170,170]}]}&lt;br /&gt;
attr wican userReadings SoC:frame_1_data_6:.* {\&lt;br /&gt;
	if (ReadingsNum($NAME, &#039;frame_1_id&#039;, 0) == 1995 and ReadingsNum($NAME, &#039;frame_1_data_1&#039;, 0)  == 5 and ReadingsNum($NAME, &#039;frame_1_data_2&#039;, 0)  == 98\&lt;br /&gt;
      and ReadingsNum($NAME, &#039;frame_1_data_3&#039;, 0)  == 32 and ReadingsNum($NAME, &#039;frame_1_data_4&#039;, 0)  == 80 ) {\&lt;br /&gt;
		return (ReadingsNum($NAME, &#039;frame_1_data_5&#039;, 0) * 256+ReadingsNum($NAME, &#039;frame_1_data_6&#039;, 0))/10.0\&lt;br /&gt;
	} else {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;SoC&#039;, 0)\&lt;br /&gt;
	}\&lt;br /&gt;
},\&lt;br /&gt;
SoH:frame_1_data_6:.* {\&lt;br /&gt;
	if (ReadingsNum($NAME, &#039;frame_1_id&#039;, 0) == 1995 and ReadingsNum($NAME, &#039;frame_1_data_1&#039;, 0)  == 5 and ReadingsNum($NAME, &#039;frame_1_data_2&#039;, 0)  == 98\&lt;br /&gt;
      and ReadingsNum($NAME, &#039;frame_1_data_3&#039;, 0)  == 32 and ReadingsNum($NAME, &#039;frame_1_data_4&#039;, 0)  == 81 ) {\&lt;br /&gt;
		return (ReadingsNum($NAME, &#039;frame_1_data_5&#039;, 0) * 256 + ReadingsNum($NAME, &#039;frame_1_data_6&#039;, 0))/10.0\&lt;br /&gt;
	} else {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;SoH&#039;, 0)\&lt;br /&gt;
	}\&lt;br /&gt;
},\&lt;br /&gt;
TrueSoC:frame_1_data_6:.* {\&lt;br /&gt;
	if (ReadingsNum($NAME, &#039;frame_1_id&#039;, 0) == 1995 and ReadingsNum($NAME, &#039;frame_1_data_3&#039;, 0)  == 3) {\&lt;br /&gt;
		return (ReadingsNum($NAME, &#039;frame_1_data_5&#039;, 0) * 256 + ReadingsNum($NAME, &#039;frame_1_data_6&#039;, 0))/10.0\&lt;br /&gt;
	} else {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;TrueSoC&#039;, 0)\&lt;br /&gt;
	}\&lt;br /&gt;
},\&lt;br /&gt;
Mileage:frame_1_data_6:.* {\&lt;br /&gt;
	if (ReadingsNum($NAME, &#039;frame_1_id&#039;, 0) == 1995 and ReadingsNum($NAME, &#039;frame_1_data_1&#039;, 0)  == 6 and ReadingsNum($NAME, &#039;frame_1_data_2&#039;, 0)  == 98\&lt;br /&gt;
      and ReadingsNum($NAME, &#039;frame_1_data_3&#039;, 0)  == 208 ) {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;frame_1_data_6&#039;, 0) * 256 + ReadingsNum($NAME, &#039;frame_1_data_7&#039;, 0)\&lt;br /&gt;
	} else {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;Mileage&#039;, 0)\&lt;br /&gt;
	}\&lt;br /&gt;
},\&lt;br /&gt;
OperatingVoltage:frame_1_data_6:.* {\&lt;br /&gt;
	if (ReadingsNum($NAME, &#039;frame_1_id&#039;, 0) == 1995 and ReadingsNum($NAME, &#039;frame_1_data_1&#039;, 0)  == 4 and ReadingsNum($NAME, &#039;frame_1_data_2&#039;, 0)  == 98\&lt;br /&gt;
      and ReadingsNum($NAME, &#039;frame_1_data_3&#039;, 0)  == 208 ) {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;frame_1_data_5&#039;, 0) /10.0\&lt;br /&gt;
	} else {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;OperatingVoltage&#039;, 0)\&lt;br /&gt;
	}\&lt;br /&gt;
},\&lt;br /&gt;
TotalCharge:frame_1_data_6:.* {\&lt;br /&gt;
	if (ReadingsNum($NAME, &#039;frame_1_id&#039;, 0) == 1995 and ReadingsNum($NAME, &#039;frame_1_data_1&#039;, 0)  == 7 and ReadingsNum($NAME, &#039;frame_1_data_2&#039;, 0)  == 98\&lt;br /&gt;
      and ReadingsNum($NAME, &#039;frame_1_data_3&#039;, 0)  == 33 and ReadingsNum($NAME, &#039;frame_1_data_4&#039;, 0)  == 113 ) {\&lt;br /&gt;
		return round( 2 * ReadingsNum($NAME, &#039;frame_1_data_7&#039;, 0) + ReadingsNum($NAME, &#039;frame_1_data_8&#039;, 0) / 128 , 0)\&lt;br /&gt;
	} else {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;TotalCharge&#039;, 0)\&lt;br /&gt;
	}\&lt;br /&gt;
},\&lt;br /&gt;
TotalDischarge:frame_1_data_6:.* {\&lt;br /&gt;
	if (ReadingsNum($NAME, &#039;frame_1_id&#039;, 0) == 1995 and ReadingsNum($NAME, &#039;frame_1_data_1&#039;, 0)  == 7 and ReadingsNum($NAME, &#039;frame_1_data_2&#039;, 0)  == 98\&lt;br /&gt;
  and ReadingsNum($NAME, &#039;frame_1_data_3&#039;, 0)  == 33 and ReadingsNum($NAME, &#039;frame_1_data_4&#039;, 0)  == 114 ) {\&lt;br /&gt;
		return round( 2 * ReadingsNum($NAME, &#039;frame_1_data_7&#039;, 0) + ReadingsNum($NAME, &#039;frame_1_data_8&#039;, 0) / 128 , 0)\&lt;br /&gt;
	} else {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;TotalDischarge&#039;, 0)\&lt;br /&gt;
	}\&lt;br /&gt;
},\&lt;br /&gt;
BatteryVoltage:frame_1_data_6:.* {\&lt;br /&gt;
	if (ReadingsNum($NAME, &#039;frame_1_id&#039;, 0) == 1995 and ReadingsNum($NAME, &#039;frame_1_data_1&#039;, 0)  == 16 and ReadingsNum($NAME, &#039;frame_1_data_2&#039;, 0)  == 9\&lt;br /&gt;
      and ReadingsNum($NAME, &#039;frame_1_data_3&#039;, 0)  == 98 and ReadingsNum($NAME, &#039;frame_1_data_4&#039;, 0)  == 32 ) {\&lt;br /&gt;
		return ( 256 * ReadingsNum($NAME, &#039;frame_1_data_6&#039;, 0) + ReadingsNum($NAME, &#039;frame_1_data_7&#039;, 0)) / 10.0 \&lt;br /&gt;
	} else {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;BatteryVoltage&#039;, 0)\&lt;br /&gt;
	}\&lt;br /&gt;
},\&lt;br /&gt;
SoE:frame_1_data_6:.* {\&lt;br /&gt;
	if (ReadingsNum($NAME, &#039;frame_1_id&#039;, 0) == 1994 and ReadingsNum($NAME, &#039;frame_1_data_1&#039;, 0)  == 7 and ReadingsNum($NAME, &#039;frame_1_data_2&#039;, 0)  == 98\&lt;br /&gt;
      and ReadingsNum($NAME, &#039;frame_1_data_3&#039;, 0)  == 208 and ReadingsNum($NAME, &#039;frame_1_data_4&#039;, 0)  == 98 ) {\&lt;br /&gt;
		return (256*ReadingsNum($NAME, &#039;frame_1_data_7&#039;, 0)+ReadingsNum($NAME, &#039;frame_1_data_8&#039;, 0)) / 10.0 \&lt;br /&gt;
	} else {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;SoE&#039;, 0)\&lt;br /&gt;
	}\&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Elektromobilität]]&lt;/div&gt;</summary>
		<author><name>Topos</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Ora_Funky_Cat&amp;diff=39259</id>
		<title>Ora Funky Cat</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Ora_Funky_Cat&amp;diff=39259"/>
		<updated>2024-04-20T20:31:47Z</updated>

		<summary type="html">&lt;p&gt;Topos: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Auf dieser Seite wird die Einbindung des E-Autos [https://www.ora-motor.de/ Ora Funky Cat] von GWM (Great Wall Motors aus China) in FHEM über die ODB2-Serviceschnittestelle erläutert.&lt;br /&gt;
&lt;br /&gt;
Benötigte Hardware: [https://www.meatpi.com/products/wican MeatPi WiCAN-OBD-C3 Dongle]&lt;br /&gt;
&lt;br /&gt;
Der WiCAN wird in die ODB2-Serviceschnittestelle (neben Sicherungsfach unterhalb Lenkrad) gesteckt. Am besten über ein Verlängerungskabel oder indem man den ODB2-Stecker aus der Halterung drückt und mit dem WiCAN ins SIcherungsfach legt. &lt;br /&gt;
&lt;br /&gt;
Der WiCAN kann sich über WLAN mit eine MQTT-Server verbinden. Näheres im obigen Link. Als Protokoll &amp;quot;slcan&amp;quot; auswählen.Die Kommunikation erfolgt über den Eintrag can/tx und can/rx des WiCAN auf dem MQTT-Server. Bitte nicht vergessen, den automatischen Standby-Modus anzuschalten, ansonsten leert sich mit der Zeit die Fahrzeugbatterie.&lt;br /&gt;
&lt;br /&gt;
Die Integration eines MQTT-Servers in FHEM wird [[MQTT|hier]] erklärt. &lt;br /&gt;
&lt;br /&gt;
Ist das Auto eingeschalten und der Dongle gesteckt, dann können über FHEM Fahrzeugwerte abgefragt werden. Weiter unten eine beispielhafte EInrichtung eine MQTT-Devices. &lt;br /&gt;
&lt;br /&gt;
=== Readings ===&lt;br /&gt;
Die folgenden Werte werden mit unterer Beispielkonfiguration ausgelesen:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Mileage:&#039;&#039;&#039; km-Stand - Abfrage über &amp;quot;set wican read_Mileage&amp;quot;&lt;br /&gt;
* &#039;&#039;&#039;SoC&#039;&#039;&#039;: Ladezustand Hochvolt-Antriebsbatterie in %  - Abfrage über &amp;quot;set wican read_SoC&amp;quot;&lt;br /&gt;
* &#039;&#039;&#039;TrueSoC&#039;&#039;&#039;: ein zweiter Wert. Hintergrund ist unbekannt - Abfrage über &amp;quot;set wican read_TrueSoC&amp;quot;&lt;br /&gt;
* &#039;&#039;&#039;SoE&#039;&#039;&#039;: Ladezustand Hochvolt-Antriebsbatterie in kW - Abfrage über &amp;quot;set wican read_SoE&amp;quot;&lt;br /&gt;
* &#039;&#039;&#039;SoH&#039;&#039;&#039;: Gesundheitszustand der Hochvolt-Antriebsbatterie in % - Abfrage über &amp;quot;set wican read_SoH&amp;quot;&lt;br /&gt;
* &#039;&#039;&#039;OperatingVoltage&#039;&#039;&#039;: Spannung Niedervolt-Fahrzeugbatterie in V - Abfrage über &amp;quot;set wican read_OperatingVoltage&amp;quot;&lt;br /&gt;
* &#039;&#039;&#039;BatteryVoltage&#039;&#039;&#039;: Spannung Hochvolt-Antriebsbatterie in V - Abfrage über &amp;quot;set wican read_BatteryVoltage&amp;quot;&lt;br /&gt;
* &#039;&#039;&#039;TotalCharge&#039;&#039;&#039;: Durch die Batterie aufgenommene Stromleistung in Ah (inklusive Rekuperation während des Fahrens) - Abfrage über &amp;quot;set wican read_Total Charge&amp;quot; Die Multiplikation mit 5 kV scheint die hinzugefügte elektrische Leistung zu ergeben.&lt;br /&gt;
* &#039;&#039;&#039;TotalDischarge&#039;&#039;&#039;: Von der Hochvolt-Batterie abgezogene Stromleistung in Ah - Abfrage über &amp;quot;set wican read_TotalDischarge&amp;quot; Die Multiplikation mit 5 kV scheint die abgerufene elektrische Leistung zu ergeben&lt;br /&gt;
Das Auslesen kann über ein notify angestossen werden, sobald der WiCAN den Status &amp;quot;online&amp;quot; hat.&amp;lt;syntaxhighlight lang=&amp;quot;cfg&amp;quot;&amp;gt;&lt;br /&gt;
define wican_online notify wican:status:.online set wican read_SoC;; sleep 1;; set wican read_TrueSoC;; sleep 1;; set wican read_Mileage;; sleep 1;; set wican read_OpVoltage;; sleep 1;; set wican read_SoH;; sleep 1;; set wican read_TotalCharge;; sleep 1;; set wican read_TotalDischarge;; sleep 1;; set wican read_BatteryVoltage;; sleep 1;; set wican read_SoE&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Beispielhafte Einrichtung des WiCAN im Ora Funky Cat als MQTT2-Device ===&lt;br /&gt;
Der Ausdruck &amp;quot;XXXXXXXX&amp;quot; muss durch die Identnummer des WiCAN ersetzt werden. &amp;lt;syntaxhighlight lang=&amp;quot;cfg&amp;quot;&amp;gt;&lt;br /&gt;
define wican MQTT2_DEVICE&lt;br /&gt;
attr wican alias Ora&lt;br /&gt;
attr wican stateFormat B: SoC% M: Mileage km (status)&lt;br /&gt;
attr wican event-on-change-reading status&lt;br /&gt;
attr wican event-on-update-reading frame_1_data_6,SoC&lt;br /&gt;
attr wican DbLogExclude .*&lt;br /&gt;
attr wican DbLogInclude SoC:3600&lt;br /&gt;
attr wican readingList wican/XXXXXXXX/status:.* {json2nameValue($EVENT)}\&lt;br /&gt;
 wican/XXXXXXXX/can/rx:.* {json2nameValue($EVENT)}&lt;br /&gt;
attr wican setList read_SoC:noArg wican/XXXXXXXX/can/tx {&amp;quot;bus&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;tx&amp;quot;,&amp;quot;ts&amp;quot;:49539,&amp;quot;frame&amp;quot;:[{&amp;quot;id&amp;quot;:1931,&amp;quot;dlc&amp;quot;:8,&amp;quot;rtr&amp;quot;:false,&amp;quot;extd&amp;quot;:false,&amp;quot;data&amp;quot;:[3,34,32,80,170,170,170,170]}]}\&lt;br /&gt;
read_TrueSoC:noArg wican/XXXXXXXX/can/tx {&amp;quot;bus&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;tx&amp;quot;,&amp;quot;ts&amp;quot;:27825,&amp;quot;frame&amp;quot;:[{&amp;quot;id&amp;quot;:1931,&amp;quot;dlc&amp;quot;:8,&amp;quot;rtr&amp;quot;:false,&amp;quot;extd&amp;quot;:false,&amp;quot;data&amp;quot;:[3,34,3,8,170,170,170,170]}]}\&lt;br /&gt;
read_SoH:noArg wican/XXXXXXXX/can/tx {&amp;quot;bus&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;tx&amp;quot;,&amp;quot;ts&amp;quot;:12016,&amp;quot;frame&amp;quot;:[{&amp;quot;id&amp;quot;:1931,&amp;quot;dlc&amp;quot;:8,&amp;quot;rtr&amp;quot;:false,&amp;quot;extd&amp;quot;:false,&amp;quot;data&amp;quot;:[3,34,32,81,170,170,170,170]}]}\&lt;br /&gt;
read_SoE:noArg wican/XXXXXXXX/can/tx {&amp;quot;bus&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;tx&amp;quot;,&amp;quot;ts&amp;quot;:17777,&amp;quot;frame&amp;quot;:[{&amp;quot;id&amp;quot;:1930,&amp;quot;dlc&amp;quot;:8,&amp;quot;rtr&amp;quot;:false,&amp;quot;extd&amp;quot;:false,&amp;quot;data&amp;quot;:[3,34,208,98,170,170,170,170]}]}\&lt;br /&gt;
read_OpVoltage:noArg wican/XXXXXXXX/can/tx {&amp;quot;bus&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;tx&amp;quot;,&amp;quot;ts&amp;quot;:17645,&amp;quot;frame&amp;quot;:[{&amp;quot;id&amp;quot;:1931,&amp;quot;dlc&amp;quot;:8,&amp;quot;rtr&amp;quot;:false,&amp;quot;extd&amp;quot;:false,&amp;quot;data&amp;quot;:[3,34,208,3,170,170,170,170]}]}\&lt;br /&gt;
read_Mileage:noArg wican/XXXXXXXX/can/tx {&amp;quot;bus&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;tx&amp;quot;,&amp;quot;ts&amp;quot;:35674,&amp;quot;frame&amp;quot;:[{&amp;quot;id&amp;quot;:1931,&amp;quot;dlc&amp;quot;:8,&amp;quot;rtr&amp;quot;:false,&amp;quot;extd&amp;quot;:false,&amp;quot;data&amp;quot;:[3,34,208,4,170,170,170,170]}]}\&lt;br /&gt;
read_TotalCharge:noArg wican/XXXXXXXX/can/tx {&amp;quot;bus&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;tx&amp;quot;,&amp;quot;ts&amp;quot;:28695,&amp;quot;frame&amp;quot;:[{&amp;quot;id&amp;quot;:1931,&amp;quot;dlc&amp;quot;:8,&amp;quot;rtr&amp;quot;:false,&amp;quot;extd&amp;quot;:false,&amp;quot;data&amp;quot;:[3,34,33,113,170,170,170,170]}]}\&lt;br /&gt;
read_TotalDischarge:noArg wican/XXXXXXXX/can/tx {&amp;quot;bus&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;tx&amp;quot;,&amp;quot;ts&amp;quot;:28695,&amp;quot;frame&amp;quot;:[{&amp;quot;id&amp;quot;:1931,&amp;quot;dlc&amp;quot;:8,&amp;quot;rtr&amp;quot;:false,&amp;quot;extd&amp;quot;:false,&amp;quot;data&amp;quot;:[3,34,33,114,170,170,170,170]}]}\&lt;br /&gt;
read_BatteryVoltage:noArg wican/XXXXXXXX/can/tx {&amp;quot;bus&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;tx&amp;quot;,&amp;quot;ts&amp;quot;:58591,&amp;quot;frame&amp;quot;:[{&amp;quot;id&amp;quot;:1931,&amp;quot;dlc&amp;quot;:8,&amp;quot;rtr&amp;quot;:false,&amp;quot;extd&amp;quot;:false,&amp;quot;data&amp;quot;:[3,34,32,3,170,170,170,170]}]}&lt;br /&gt;
attr wican userReadings SoC:frame_1_data_6:.* {\&lt;br /&gt;
	if (ReadingsNum($NAME, &#039;frame_1_id&#039;, 0) == 1995 and ReadingsNum($NAME, &#039;frame_1_data_1&#039;, 0)  == 5 and ReadingsNum($NAME, &#039;frame_1_data_2&#039;, 0)  == 98\&lt;br /&gt;
      and ReadingsNum($NAME, &#039;frame_1_data_3&#039;, 0)  == 32 and ReadingsNum($NAME, &#039;frame_1_data_4&#039;, 0)  == 80 ) {\&lt;br /&gt;
		return (ReadingsNum($NAME, &#039;frame_1_data_5&#039;, 0) * 256+ReadingsNum($NAME, &#039;frame_1_data_6&#039;, 0))/10.0\&lt;br /&gt;
	} else {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;SoC&#039;, 0)\&lt;br /&gt;
	}\&lt;br /&gt;
},\&lt;br /&gt;
SoH:frame_1_data_6:.* {\&lt;br /&gt;
	if (ReadingsNum($NAME, &#039;frame_1_id&#039;, 0) == 1995 and ReadingsNum($NAME, &#039;frame_1_data_1&#039;, 0)  == 5 and ReadingsNum($NAME, &#039;frame_1_data_2&#039;, 0)  == 98\&lt;br /&gt;
      and ReadingsNum($NAME, &#039;frame_1_data_3&#039;, 0)  == 32 and ReadingsNum($NAME, &#039;frame_1_data_4&#039;, 0)  == 81 ) {\&lt;br /&gt;
		return (ReadingsNum($NAME, &#039;frame_1_data_5&#039;, 0) * 256 + ReadingsNum($NAME, &#039;frame_1_data_6&#039;, 0))/10.0\&lt;br /&gt;
	} else {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;SoH&#039;, 0)\&lt;br /&gt;
	}\&lt;br /&gt;
},\&lt;br /&gt;
TrueSoC:frame_1_data_6:.* {\&lt;br /&gt;
	if (ReadingsNum($NAME, &#039;frame_1_id&#039;, 0) == 1995 and ReadingsNum($NAME, &#039;frame_1_data_3&#039;, 0)  == 3) {\&lt;br /&gt;
		return (ReadingsNum($NAME, &#039;frame_1_data_5&#039;, 0) * 256 + ReadingsNum($NAME, &#039;frame_1_data_6&#039;, 0))/10.0\&lt;br /&gt;
	} else {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;TrueSoC&#039;, 0)\&lt;br /&gt;
	}\&lt;br /&gt;
},\&lt;br /&gt;
Mileage:frame_1_data_6:.* {\&lt;br /&gt;
	if (ReadingsNum($NAME, &#039;frame_1_id&#039;, 0) == 1995 and ReadingsNum($NAME, &#039;frame_1_data_1&#039;, 0)  == 6 and ReadingsNum($NAME, &#039;frame_1_data_2&#039;, 0)  == 98\&lt;br /&gt;
      and ReadingsNum($NAME, &#039;frame_1_data_3&#039;, 0)  == 208 ) {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;frame_1_data_6&#039;, 0) * 256 + ReadingsNum($NAME, &#039;frame_1_data_7&#039;, 0)\&lt;br /&gt;
	} else {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;Mileage&#039;, 0)\&lt;br /&gt;
	}\&lt;br /&gt;
},\&lt;br /&gt;
OperatingVoltage:frame_1_data_6:.* {\&lt;br /&gt;
	if (ReadingsNum($NAME, &#039;frame_1_id&#039;, 0) == 1995 and ReadingsNum($NAME, &#039;frame_1_data_1&#039;, 0)  == 4 and ReadingsNum($NAME, &#039;frame_1_data_2&#039;, 0)  == 98\&lt;br /&gt;
      and ReadingsNum($NAME, &#039;frame_1_data_3&#039;, 0)  == 208 ) {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;frame_1_data_5&#039;, 0) /10.0\&lt;br /&gt;
	} else {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;OperatingVoltage&#039;, 0)\&lt;br /&gt;
	}\&lt;br /&gt;
},\&lt;br /&gt;
TotalCharge:frame_1_data_6:.* {\&lt;br /&gt;
	if (ReadingsNum($NAME, &#039;frame_1_id&#039;, 0) == 1995 and ReadingsNum($NAME, &#039;frame_1_data_1&#039;, 0)  == 7 and ReadingsNum($NAME, &#039;frame_1_data_2&#039;, 0)  == 98\&lt;br /&gt;
      and ReadingsNum($NAME, &#039;frame_1_data_3&#039;, 0)  == 33 and ReadingsNum($NAME, &#039;frame_1_data_4&#039;, 0)  == 113 ) {\&lt;br /&gt;
		return round( 2 * ReadingsNum($NAME, &#039;frame_1_data_7&#039;, 0) + ReadingsNum($NAME, &#039;frame_1_data_8&#039;, 0) / 128 , 0)\&lt;br /&gt;
	} else {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;TotalCharge&#039;, 0)\&lt;br /&gt;
	}\&lt;br /&gt;
},\&lt;br /&gt;
TotalDischarge:frame_1_data_6:.* {\&lt;br /&gt;
	if (ReadingsNum($NAME, &#039;frame_1_id&#039;, 0) == 1995 and ReadingsNum($NAME, &#039;frame_1_data_1&#039;, 0)  == 7 and ReadingsNum($NAME, &#039;frame_1_data_2&#039;, 0)  == 98\&lt;br /&gt;
  and ReadingsNum($NAME, &#039;frame_1_data_3&#039;, 0)  == 33 and ReadingsNum($NAME, &#039;frame_1_data_4&#039;, 0)  == 114 ) {\&lt;br /&gt;
		return round( 2 * ReadingsNum($NAME, &#039;frame_1_data_7&#039;, 0) + ReadingsNum($NAME, &#039;frame_1_data_8&#039;, 0) / 128 , 0)\&lt;br /&gt;
	} else {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;TotalDischarge&#039;, 0)\&lt;br /&gt;
	}\&lt;br /&gt;
},\&lt;br /&gt;
BatteryVoltage:frame_1_data_6:.* {\&lt;br /&gt;
	if (ReadingsNum($NAME, &#039;frame_1_id&#039;, 0) == 1995 and ReadingsNum($NAME, &#039;frame_1_data_1&#039;, 0)  == 16 and ReadingsNum($NAME, &#039;frame_1_data_2&#039;, 0)  == 9\&lt;br /&gt;
      and ReadingsNum($NAME, &#039;frame_1_data_3&#039;, 0)  == 98 and ReadingsNum($NAME, &#039;frame_1_data_4&#039;, 0)  == 32 ) {\&lt;br /&gt;
		return ( 256 * ReadingsNum($NAME, &#039;frame_1_data_6&#039;, 0) + ReadingsNum($NAME, &#039;frame_1_data_7&#039;, 0)) / 10.0 \&lt;br /&gt;
	} else {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;BatteryVoltage&#039;, 0)\&lt;br /&gt;
	}\&lt;br /&gt;
},\&lt;br /&gt;
SoE:frame_1_data_6:.* {\&lt;br /&gt;
	if (ReadingsNum($NAME, &#039;frame_1_id&#039;, 0) == 1994 and ReadingsNum($NAME, &#039;frame_1_data_1&#039;, 0)  == 7 and ReadingsNum($NAME, &#039;frame_1_data_2&#039;, 0)  == 98\&lt;br /&gt;
      and ReadingsNum($NAME, &#039;frame_1_data_3&#039;, 0)  == 208 and ReadingsNum($NAME, &#039;frame_1_data_4&#039;, 0)  == 98 ) {\&lt;br /&gt;
		return (256*ReadingsNum($NAME, &#039;frame_1_data_7&#039;, 0)+ReadingsNum($NAME, &#039;frame_1_data_8&#039;, 0)) / 10.0 \&lt;br /&gt;
	} else {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;SoE&#039;, 0)\&lt;br /&gt;
	}\&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Elektromobilität]]&lt;/div&gt;</summary>
		<author><name>Topos</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Ora_Funky_Cat&amp;diff=39258</id>
		<title>Ora Funky Cat</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Ora_Funky_Cat&amp;diff=39258"/>
		<updated>2024-04-20T20:29:58Z</updated>

		<summary type="html">&lt;p&gt;Topos: /* Readings */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Auf dieser Seite wird die Einbindung des E-Autos [https://www.ora-motor.de/ Ora Funky Cat] von GWM (Great Wall Motors aus China) in FHEM über die ODB2-Serviceschnittestelle erläutert.&lt;br /&gt;
&lt;br /&gt;
Benötigte Hardware: [https://www.meatpi.com/products/wican MeatPi WiCAN-OBD-C3 Dongle]&lt;br /&gt;
&lt;br /&gt;
Der WiCAN wird in die ODB2-Serviceschnittestelle (neben Sicherungsfach unterhalb Lenkrad) gesteckt. Am besten über ein Verlängerungskabel oder indem man den ODB2-Stecker aus der Halterung drückt und mit dem WiCAN ins SIcherungsfach legt. &lt;br /&gt;
&lt;br /&gt;
Der WiCAN kann sich über WLAN mit eine MQTT-Server verbinden. Näheres in obigem Link. Als Protokoll &amp;quot;slcan&amp;quot; auswählen.Die Kommunikation erfolgt über den Eintrag can/tx und can/rx des WiCAN auf dem MQTT-Server. Bitte nicht vergessen, den automatischen Standby-Modus anzuschalten, ansonsten leert sich mit der Zeit die Fahrzeugbatterie.&lt;br /&gt;
&lt;br /&gt;
Die Integration eines MQTT-Servers in FHEM wird [[MQTT|hier]] erklärt. &lt;br /&gt;
&lt;br /&gt;
Ist das Auto eingeschalten und der Dongle gesteckt, dann können über FHEM Fahrzeugwerte abgefragt werden. Weiter unten eine beispielhafte EInrichtung eine MQTT-Devices. &lt;br /&gt;
&lt;br /&gt;
=== Readings ===&lt;br /&gt;
Die folgenden Werte werden mit unterer Beispielkonfiguration ausgelesen:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Mileage:&#039;&#039;&#039; km-Stand - Abfrage über &amp;quot;set wican read_Mileage&amp;quot;&lt;br /&gt;
* &#039;&#039;&#039;SoC&#039;&#039;&#039;: Ladezustand Hochvolt-Antriebsbatterie in %  - Abfrage über &amp;quot;set wican read_SoC&amp;quot;&lt;br /&gt;
* &#039;&#039;&#039;TrueSoC&#039;&#039;&#039;: ein zweiter Wert. Hintergrund ist unbekannt - Abfrage über &amp;quot;set wican read_TrueSoC&amp;quot;&lt;br /&gt;
* &#039;&#039;&#039;SoE&#039;&#039;&#039;: Ladezustand Hochvolt-Antriebsbatterie in kW - Abfrage über &amp;quot;set wican read_SoE&amp;quot;&lt;br /&gt;
* &#039;&#039;&#039;SoH&#039;&#039;&#039;: Gesundheitszustand der Hochvolt-Antriebsbatterie in % - Abfrage über &amp;quot;set wican read_SoH&amp;quot;&lt;br /&gt;
* &#039;&#039;&#039;OperatingVoltage&#039;&#039;&#039;: Spannung Niedervolt-Fahrzeugbatterie in V - Abfrage über &amp;quot;set wican read_OperatingVoltage&amp;quot;&lt;br /&gt;
* &#039;&#039;&#039;BatteryVoltage&#039;&#039;&#039;: Spannung Hochvolt-Antriebsbatterie in V - Abfrage über &amp;quot;set wican read_BatteryVoltage&amp;quot;&lt;br /&gt;
* &#039;&#039;&#039;TotalCharge&#039;&#039;&#039;: Durch die Batterie aufgenommene Stromleistung in Ah (inklusive Rekuperation während des Fahrens) - Abfrage über &amp;quot;set wican read_Total Charge&amp;quot; Die Multiplikation mit 5 kV scheint die hinzugefügte elektrische Leistung zu ergeben.&lt;br /&gt;
* &#039;&#039;&#039;TotalDischarge&#039;&#039;&#039;: Von der Hochvolt-Batterie abgezogene Stromleistung in Ah - Abfrage über &amp;quot;set wican read_TotalDischarge&amp;quot; Die Multiplikation mit 5 kV scheint die abgerufene elektrische Leistung zu ergeben&lt;br /&gt;
Das Auslesen kann über ein notify angestossen werden, sobald der WiCAN den Status &amp;quot;online&amp;quot; hat.&amp;lt;syntaxhighlight lang=&amp;quot;cfg&amp;quot;&amp;gt;&lt;br /&gt;
define wican_online notify wican:status:.online set wican read_SoC;; sleep 1;; set wican read_TrueSoC;; sleep 1;; set wican read_Mileage;; sleep 1;; set wican read_OpVoltage;; sleep 1;; set wican read_SoH;; sleep 1;; set wican read_TotalCharge;; sleep 1;; set wican read_TotalDischarge;; sleep 1;; set wican read_BatteryVoltage;; sleep 1;; set wican read_SoE&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Beispielhafte Einrichtung des WiCAN im Ora Funky Cat als MQTT2-Device ===&lt;br /&gt;
Der Ausdruck &amp;quot;XXXXXXXX&amp;quot; muss durch die Identnummer des WiCAN ersetzt werden. &amp;lt;syntaxhighlight lang=&amp;quot;cfg&amp;quot;&amp;gt;&lt;br /&gt;
define wican MQTT2_DEVICE&lt;br /&gt;
attr wican alias Ora&lt;br /&gt;
attr wican stateFormat B: SoC% M: Mileage km (status)&lt;br /&gt;
attr wican event-on-change-reading status&lt;br /&gt;
attr wican event-on-update-reading frame_1_data_6,SoC&lt;br /&gt;
attr wican DbLogExclude .*&lt;br /&gt;
attr wican DbLogInclude SoC:3600&lt;br /&gt;
attr wican readingList wican/XXXXXXXX/status:.* {json2nameValue($EVENT)}\&lt;br /&gt;
 wican/XXXXXXXX/can/rx:.* {json2nameValue($EVENT)}&lt;br /&gt;
attr wican setList read_SoC:noArg wican/XXXXXXXX/can/tx {&amp;quot;bus&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;tx&amp;quot;,&amp;quot;ts&amp;quot;:49539,&amp;quot;frame&amp;quot;:[{&amp;quot;id&amp;quot;:1931,&amp;quot;dlc&amp;quot;:8,&amp;quot;rtr&amp;quot;:false,&amp;quot;extd&amp;quot;:false,&amp;quot;data&amp;quot;:[3,34,32,80,170,170,170,170]}]}\&lt;br /&gt;
read_TrueSoC:noArg wican/XXXXXXXX/can/tx {&amp;quot;bus&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;tx&amp;quot;,&amp;quot;ts&amp;quot;:27825,&amp;quot;frame&amp;quot;:[{&amp;quot;id&amp;quot;:1931,&amp;quot;dlc&amp;quot;:8,&amp;quot;rtr&amp;quot;:false,&amp;quot;extd&amp;quot;:false,&amp;quot;data&amp;quot;:[3,34,3,8,170,170,170,170]}]}\&lt;br /&gt;
read_SoH:noArg wican/XXXXXXXX/can/tx {&amp;quot;bus&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;tx&amp;quot;,&amp;quot;ts&amp;quot;:12016,&amp;quot;frame&amp;quot;:[{&amp;quot;id&amp;quot;:1931,&amp;quot;dlc&amp;quot;:8,&amp;quot;rtr&amp;quot;:false,&amp;quot;extd&amp;quot;:false,&amp;quot;data&amp;quot;:[3,34,32,81,170,170,170,170]}]}\&lt;br /&gt;
read_SoE:noArg wican/XXXXXXXX/can/tx {&amp;quot;bus&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;tx&amp;quot;,&amp;quot;ts&amp;quot;:17777,&amp;quot;frame&amp;quot;:[{&amp;quot;id&amp;quot;:1930,&amp;quot;dlc&amp;quot;:8,&amp;quot;rtr&amp;quot;:false,&amp;quot;extd&amp;quot;:false,&amp;quot;data&amp;quot;:[3,34,208,98,170,170,170,170]}]}\&lt;br /&gt;
read_OpVoltage:noArg wican/XXXXXXXX/can/tx {&amp;quot;bus&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;tx&amp;quot;,&amp;quot;ts&amp;quot;:17645,&amp;quot;frame&amp;quot;:[{&amp;quot;id&amp;quot;:1931,&amp;quot;dlc&amp;quot;:8,&amp;quot;rtr&amp;quot;:false,&amp;quot;extd&amp;quot;:false,&amp;quot;data&amp;quot;:[3,34,208,3,170,170,170,170]}]}\&lt;br /&gt;
read_Mileage:noArg wican/XXXXXXXX/can/tx {&amp;quot;bus&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;tx&amp;quot;,&amp;quot;ts&amp;quot;:35674,&amp;quot;frame&amp;quot;:[{&amp;quot;id&amp;quot;:1931,&amp;quot;dlc&amp;quot;:8,&amp;quot;rtr&amp;quot;:false,&amp;quot;extd&amp;quot;:false,&amp;quot;data&amp;quot;:[3,34,208,4,170,170,170,170]}]}\&lt;br /&gt;
read_TotalCharge:noArg wican/XXXXXXXX/can/tx {&amp;quot;bus&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;tx&amp;quot;,&amp;quot;ts&amp;quot;:28695,&amp;quot;frame&amp;quot;:[{&amp;quot;id&amp;quot;:1931,&amp;quot;dlc&amp;quot;:8,&amp;quot;rtr&amp;quot;:false,&amp;quot;extd&amp;quot;:false,&amp;quot;data&amp;quot;:[3,34,33,113,170,170,170,170]}]}\&lt;br /&gt;
read_TotalDischarge:noArg wican/XXXXXXXX/can/tx {&amp;quot;bus&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;tx&amp;quot;,&amp;quot;ts&amp;quot;:28695,&amp;quot;frame&amp;quot;:[{&amp;quot;id&amp;quot;:1931,&amp;quot;dlc&amp;quot;:8,&amp;quot;rtr&amp;quot;:false,&amp;quot;extd&amp;quot;:false,&amp;quot;data&amp;quot;:[3,34,33,114,170,170,170,170]}]}\&lt;br /&gt;
read_BatteryVoltage:noArg wican/XXXXXXXX/can/tx {&amp;quot;bus&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;tx&amp;quot;,&amp;quot;ts&amp;quot;:58591,&amp;quot;frame&amp;quot;:[{&amp;quot;id&amp;quot;:1931,&amp;quot;dlc&amp;quot;:8,&amp;quot;rtr&amp;quot;:false,&amp;quot;extd&amp;quot;:false,&amp;quot;data&amp;quot;:[3,34,32,3,170,170,170,170]}]}&lt;br /&gt;
attr wican userReadings SoC:frame_1_data_6:.* {\&lt;br /&gt;
	if (ReadingsNum($NAME, &#039;frame_1_id&#039;, 0) == 1995 and ReadingsNum($NAME, &#039;frame_1_data_1&#039;, 0)  == 5 and ReadingsNum($NAME, &#039;frame_1_data_2&#039;, 0)  == 98\&lt;br /&gt;
      and ReadingsNum($NAME, &#039;frame_1_data_3&#039;, 0)  == 32 and ReadingsNum($NAME, &#039;frame_1_data_4&#039;, 0)  == 80 ) {\&lt;br /&gt;
		return (ReadingsNum($NAME, &#039;frame_1_data_5&#039;, 0) * 256+ReadingsNum($NAME, &#039;frame_1_data_6&#039;, 0))/10.0\&lt;br /&gt;
	} else {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;SoC&#039;, 0)\&lt;br /&gt;
	}\&lt;br /&gt;
},\&lt;br /&gt;
SoH:frame_1_data_6:.* {\&lt;br /&gt;
	if (ReadingsNum($NAME, &#039;frame_1_id&#039;, 0) == 1995 and ReadingsNum($NAME, &#039;frame_1_data_1&#039;, 0)  == 5 and ReadingsNum($NAME, &#039;frame_1_data_2&#039;, 0)  == 98\&lt;br /&gt;
      and ReadingsNum($NAME, &#039;frame_1_data_3&#039;, 0)  == 32 and ReadingsNum($NAME, &#039;frame_1_data_4&#039;, 0)  == 81 ) {\&lt;br /&gt;
		return (ReadingsNum($NAME, &#039;frame_1_data_5&#039;, 0) * 256 + ReadingsNum($NAME, &#039;frame_1_data_6&#039;, 0))/10.0\&lt;br /&gt;
	} else {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;SoH&#039;, 0)\&lt;br /&gt;
	}\&lt;br /&gt;
},\&lt;br /&gt;
TrueSoC:frame_1_data_6:.* {\&lt;br /&gt;
	if (ReadingsNum($NAME, &#039;frame_1_id&#039;, 0) == 1995 and ReadingsNum($NAME, &#039;frame_1_data_3&#039;, 0)  == 3) {\&lt;br /&gt;
		return (ReadingsNum($NAME, &#039;frame_1_data_5&#039;, 0) * 256 + ReadingsNum($NAME, &#039;frame_1_data_6&#039;, 0))/10.0\&lt;br /&gt;
	} else {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;TrueSoC&#039;, 0)\&lt;br /&gt;
	}\&lt;br /&gt;
},\&lt;br /&gt;
Mileage:frame_1_data_6:.* {\&lt;br /&gt;
	if (ReadingsNum($NAME, &#039;frame_1_id&#039;, 0) == 1995 and ReadingsNum($NAME, &#039;frame_1_data_1&#039;, 0)  == 6 and ReadingsNum($NAME, &#039;frame_1_data_2&#039;, 0)  == 98\&lt;br /&gt;
      and ReadingsNum($NAME, &#039;frame_1_data_3&#039;, 0)  == 208 ) {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;frame_1_data_6&#039;, 0) * 256 + ReadingsNum($NAME, &#039;frame_1_data_7&#039;, 0)\&lt;br /&gt;
	} else {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;Mileage&#039;, 0)\&lt;br /&gt;
	}\&lt;br /&gt;
},\&lt;br /&gt;
OperatingVoltage:frame_1_data_6:.* {\&lt;br /&gt;
	if (ReadingsNum($NAME, &#039;frame_1_id&#039;, 0) == 1995 and ReadingsNum($NAME, &#039;frame_1_data_1&#039;, 0)  == 4 and ReadingsNum($NAME, &#039;frame_1_data_2&#039;, 0)  == 98\&lt;br /&gt;
      and ReadingsNum($NAME, &#039;frame_1_data_3&#039;, 0)  == 208 ) {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;frame_1_data_5&#039;, 0) /10.0\&lt;br /&gt;
	} else {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;OperatingVoltage&#039;, 0)\&lt;br /&gt;
	}\&lt;br /&gt;
},\&lt;br /&gt;
TotalCharge:frame_1_data_6:.* {\&lt;br /&gt;
	if (ReadingsNum($NAME, &#039;frame_1_id&#039;, 0) == 1995 and ReadingsNum($NAME, &#039;frame_1_data_1&#039;, 0)  == 7 and ReadingsNum($NAME, &#039;frame_1_data_2&#039;, 0)  == 98\&lt;br /&gt;
      and ReadingsNum($NAME, &#039;frame_1_data_3&#039;, 0)  == 33 and ReadingsNum($NAME, &#039;frame_1_data_4&#039;, 0)  == 113 ) {\&lt;br /&gt;
		return round( 2 * ReadingsNum($NAME, &#039;frame_1_data_7&#039;, 0) + ReadingsNum($NAME, &#039;frame_1_data_8&#039;, 0) / 128 , 0)\&lt;br /&gt;
	} else {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;TotalCharge&#039;, 0)\&lt;br /&gt;
	}\&lt;br /&gt;
},\&lt;br /&gt;
TotalDischarge:frame_1_data_6:.* {\&lt;br /&gt;
	if (ReadingsNum($NAME, &#039;frame_1_id&#039;, 0) == 1995 and ReadingsNum($NAME, &#039;frame_1_data_1&#039;, 0)  == 7 and ReadingsNum($NAME, &#039;frame_1_data_2&#039;, 0)  == 98\&lt;br /&gt;
  and ReadingsNum($NAME, &#039;frame_1_data_3&#039;, 0)  == 33 and ReadingsNum($NAME, &#039;frame_1_data_4&#039;, 0)  == 114 ) {\&lt;br /&gt;
		return round( 2 * ReadingsNum($NAME, &#039;frame_1_data_7&#039;, 0) + ReadingsNum($NAME, &#039;frame_1_data_8&#039;, 0) / 128 , 0)\&lt;br /&gt;
	} else {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;TotalDischarge&#039;, 0)\&lt;br /&gt;
	}\&lt;br /&gt;
},\&lt;br /&gt;
BatteryVoltage:frame_1_data_6:.* {\&lt;br /&gt;
	if (ReadingsNum($NAME, &#039;frame_1_id&#039;, 0) == 1995 and ReadingsNum($NAME, &#039;frame_1_data_1&#039;, 0)  == 16 and ReadingsNum($NAME, &#039;frame_1_data_2&#039;, 0)  == 9\&lt;br /&gt;
      and ReadingsNum($NAME, &#039;frame_1_data_3&#039;, 0)  == 98 and ReadingsNum($NAME, &#039;frame_1_data_4&#039;, 0)  == 32 ) {\&lt;br /&gt;
		return ( 256 * ReadingsNum($NAME, &#039;frame_1_data_6&#039;, 0) + ReadingsNum($NAME, &#039;frame_1_data_7&#039;, 0)) / 10.0 \&lt;br /&gt;
	} else {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;BatteryVoltage&#039;, 0)\&lt;br /&gt;
	}\&lt;br /&gt;
},\&lt;br /&gt;
SoE:frame_1_data_6:.* {\&lt;br /&gt;
	if (ReadingsNum($NAME, &#039;frame_1_id&#039;, 0) == 1994 and ReadingsNum($NAME, &#039;frame_1_data_1&#039;, 0)  == 7 and ReadingsNum($NAME, &#039;frame_1_data_2&#039;, 0)  == 98\&lt;br /&gt;
      and ReadingsNum($NAME, &#039;frame_1_data_3&#039;, 0)  == 208 and ReadingsNum($NAME, &#039;frame_1_data_4&#039;, 0)  == 98 ) {\&lt;br /&gt;
		return (256*ReadingsNum($NAME, &#039;frame_1_data_7&#039;, 0)+ReadingsNum($NAME, &#039;frame_1_data_8&#039;, 0)) / 10.0 \&lt;br /&gt;
	} else {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;SoE&#039;, 0)\&lt;br /&gt;
	}\&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Elektromobilität]]&lt;/div&gt;</summary>
		<author><name>Topos</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Ora_Funky_Cat&amp;diff=39257</id>
		<title>Ora Funky Cat</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Ora_Funky_Cat&amp;diff=39257"/>
		<updated>2024-04-20T20:27:31Z</updated>

		<summary type="html">&lt;p&gt;Topos: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Auf dieser Seite wird die Einbindung des E-Autos [https://www.ora-motor.de/ Ora Funky Cat] von GWM (Great Wall Motors aus China) in FHEM über die ODB2-Serviceschnittestelle erläutert.&lt;br /&gt;
&lt;br /&gt;
Benötigte Hardware: [https://www.meatpi.com/products/wican MeatPi WiCAN-OBD-C3 Dongle]&lt;br /&gt;
&lt;br /&gt;
Der WiCAN wird in die ODB2-Serviceschnittestelle (neben Sicherungsfach unterhalb Lenkrad) gesteckt. Am besten über ein Verlängerungskabel oder indem man den ODB2-Stecker aus der Halterung drückt und mit dem WiCAN ins SIcherungsfach legt. &lt;br /&gt;
&lt;br /&gt;
Der WiCAN kann sich über WLAN mit eine MQTT-Server verbinden. Näheres in obigem Link. Als Protokoll &amp;quot;slcan&amp;quot; auswählen.Die Kommunikation erfolgt über den Eintrag can/tx und can/rx des WiCAN auf dem MQTT-Server. Bitte nicht vergessen, den automatischen Standby-Modus anzuschalten, ansonsten leert sich mit der Zeit die Fahrzeugbatterie.&lt;br /&gt;
&lt;br /&gt;
Die Integration eines MQTT-Servers in FHEM wird [[MQTT|hier]] erklärt. &lt;br /&gt;
&lt;br /&gt;
Ist das Auto eingeschalten und der Dongle gesteckt, dann können über FHEM Fahrzeugwerte abgefragt werden. Weiter unten eine beispielhafte EInrichtung eine MQTT-Devices. &lt;br /&gt;
&lt;br /&gt;
=== Readings ===&lt;br /&gt;
Die folgenden Werte werden mit unterer Beispielkonfiguration ausgelesen:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Mileage:&#039;&#039;&#039; km-Stand - Abfrage über &amp;quot;set wican read_Mileage&amp;quot;&lt;br /&gt;
* &#039;&#039;&#039;SoC&#039;&#039;&#039;: Ladezustand Hochvolt-Antriebsbatterie in %  - Abfrage über &amp;quot;set wican read_SoC&amp;quot;&lt;br /&gt;
* &#039;&#039;&#039;TrueSoC&#039;&#039;&#039;: ein zweiter Wert. Hintergrund ist unbekannt - Abfrage über &amp;quot;set wican read_TrueSoC&amp;quot;&lt;br /&gt;
* &#039;&#039;&#039;SoE&#039;&#039;&#039;: Ladezustand Hochvolt-Antriebsbatterie in kW - Abfrage über &amp;quot;set wican read_SoE&amp;quot;&lt;br /&gt;
* &#039;&#039;&#039;SoH&#039;&#039;&#039;: Gesundheitszustand der Hochvolt-Antriebsbatterie in % - Abfrage über &amp;quot;set wican read_SoH&amp;quot;&lt;br /&gt;
* &#039;&#039;&#039;OperatingVoltage&#039;&#039;&#039;: Spannung Niedervolt-Fahrzeugbatterie in V - Abfrage über &amp;quot;set wican read_OperatingVoltage&amp;quot;&lt;br /&gt;
* &#039;&#039;&#039;BatteryVoltage&#039;&#039;&#039;: Spannung Hochvolt-Antriebsbatterie in V - Abfrage über &amp;quot;set wican read_BatteryVoltage&amp;quot;&lt;br /&gt;
* &#039;&#039;&#039;TotalCharge&#039;&#039;&#039;: Durch die Batterie aufgenommene Stromleistung in Ah (inklusive Rekuperation während des Fahrens) - Abfrage über &amp;quot;set wican read_Total Charge&amp;quot; Die Multiplikation mit 5 kV scheint die hinzugefügte elektrische Leistung zu ergeben.&lt;br /&gt;
* &#039;&#039;&#039;TotalDischarge&#039;&#039;&#039;: Von der Hochvolt-Batterie abgezogene Stromleistung in Ah - Abfrage über &amp;quot;set wican read_TotalDischarge&amp;quot; Die Multiplikation mit 5 kV scheint die abgerufene elektrische Leistung zu ergeben&lt;br /&gt;
&lt;br /&gt;
=== Beispielhafte Einrichtung des WiCAN im Ora Funky Cat als MQTT2-Device ===&lt;br /&gt;
Der Ausdruck &amp;quot;XXXXXXXX&amp;quot; muss durch die Identnummer des WiCAN ersetzt werden. &amp;lt;syntaxhighlight lang=&amp;quot;cfg&amp;quot;&amp;gt;&lt;br /&gt;
define wican MQTT2_DEVICE&lt;br /&gt;
attr wican alias Ora&lt;br /&gt;
attr wican stateFormat B: SoC% M: Mileage km (status)&lt;br /&gt;
attr wican event-on-change-reading status&lt;br /&gt;
attr wican event-on-update-reading frame_1_data_6,SoC&lt;br /&gt;
attr wican DbLogExclude .*&lt;br /&gt;
attr wican DbLogInclude SoC:3600&lt;br /&gt;
attr wican readingList wican/XXXXXXXX/status:.* {json2nameValue($EVENT)}\&lt;br /&gt;
 wican/XXXXXXXX/can/rx:.* {json2nameValue($EVENT)}&lt;br /&gt;
attr wican setList read_SoC:noArg wican/XXXXXXXX/can/tx {&amp;quot;bus&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;tx&amp;quot;,&amp;quot;ts&amp;quot;:49539,&amp;quot;frame&amp;quot;:[{&amp;quot;id&amp;quot;:1931,&amp;quot;dlc&amp;quot;:8,&amp;quot;rtr&amp;quot;:false,&amp;quot;extd&amp;quot;:false,&amp;quot;data&amp;quot;:[3,34,32,80,170,170,170,170]}]}\&lt;br /&gt;
read_TrueSoC:noArg wican/XXXXXXXX/can/tx {&amp;quot;bus&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;tx&amp;quot;,&amp;quot;ts&amp;quot;:27825,&amp;quot;frame&amp;quot;:[{&amp;quot;id&amp;quot;:1931,&amp;quot;dlc&amp;quot;:8,&amp;quot;rtr&amp;quot;:false,&amp;quot;extd&amp;quot;:false,&amp;quot;data&amp;quot;:[3,34,3,8,170,170,170,170]}]}\&lt;br /&gt;
read_SoH:noArg wican/XXXXXXXX/can/tx {&amp;quot;bus&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;tx&amp;quot;,&amp;quot;ts&amp;quot;:12016,&amp;quot;frame&amp;quot;:[{&amp;quot;id&amp;quot;:1931,&amp;quot;dlc&amp;quot;:8,&amp;quot;rtr&amp;quot;:false,&amp;quot;extd&amp;quot;:false,&amp;quot;data&amp;quot;:[3,34,32,81,170,170,170,170]}]}\&lt;br /&gt;
read_SoE:noArg wican/XXXXXXXX/can/tx {&amp;quot;bus&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;tx&amp;quot;,&amp;quot;ts&amp;quot;:17777,&amp;quot;frame&amp;quot;:[{&amp;quot;id&amp;quot;:1930,&amp;quot;dlc&amp;quot;:8,&amp;quot;rtr&amp;quot;:false,&amp;quot;extd&amp;quot;:false,&amp;quot;data&amp;quot;:[3,34,208,98,170,170,170,170]}]}\&lt;br /&gt;
read_OpVoltage:noArg wican/XXXXXXXX/can/tx {&amp;quot;bus&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;tx&amp;quot;,&amp;quot;ts&amp;quot;:17645,&amp;quot;frame&amp;quot;:[{&amp;quot;id&amp;quot;:1931,&amp;quot;dlc&amp;quot;:8,&amp;quot;rtr&amp;quot;:false,&amp;quot;extd&amp;quot;:false,&amp;quot;data&amp;quot;:[3,34,208,3,170,170,170,170]}]}\&lt;br /&gt;
read_Mileage:noArg wican/XXXXXXXX/can/tx {&amp;quot;bus&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;tx&amp;quot;,&amp;quot;ts&amp;quot;:35674,&amp;quot;frame&amp;quot;:[{&amp;quot;id&amp;quot;:1931,&amp;quot;dlc&amp;quot;:8,&amp;quot;rtr&amp;quot;:false,&amp;quot;extd&amp;quot;:false,&amp;quot;data&amp;quot;:[3,34,208,4,170,170,170,170]}]}\&lt;br /&gt;
read_TotalCharge:noArg wican/XXXXXXXX/can/tx {&amp;quot;bus&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;tx&amp;quot;,&amp;quot;ts&amp;quot;:28695,&amp;quot;frame&amp;quot;:[{&amp;quot;id&amp;quot;:1931,&amp;quot;dlc&amp;quot;:8,&amp;quot;rtr&amp;quot;:false,&amp;quot;extd&amp;quot;:false,&amp;quot;data&amp;quot;:[3,34,33,113,170,170,170,170]}]}\&lt;br /&gt;
read_TotalDischarge:noArg wican/XXXXXXXX/can/tx {&amp;quot;bus&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;tx&amp;quot;,&amp;quot;ts&amp;quot;:28695,&amp;quot;frame&amp;quot;:[{&amp;quot;id&amp;quot;:1931,&amp;quot;dlc&amp;quot;:8,&amp;quot;rtr&amp;quot;:false,&amp;quot;extd&amp;quot;:false,&amp;quot;data&amp;quot;:[3,34,33,114,170,170,170,170]}]}\&lt;br /&gt;
read_BatteryVoltage:noArg wican/XXXXXXXX/can/tx {&amp;quot;bus&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;tx&amp;quot;,&amp;quot;ts&amp;quot;:58591,&amp;quot;frame&amp;quot;:[{&amp;quot;id&amp;quot;:1931,&amp;quot;dlc&amp;quot;:8,&amp;quot;rtr&amp;quot;:false,&amp;quot;extd&amp;quot;:false,&amp;quot;data&amp;quot;:[3,34,32,3,170,170,170,170]}]}&lt;br /&gt;
attr wican userReadings SoC:frame_1_data_6:.* {\&lt;br /&gt;
	if (ReadingsNum($NAME, &#039;frame_1_id&#039;, 0) == 1995 and ReadingsNum($NAME, &#039;frame_1_data_1&#039;, 0)  == 5 and ReadingsNum($NAME, &#039;frame_1_data_2&#039;, 0)  == 98\&lt;br /&gt;
      and ReadingsNum($NAME, &#039;frame_1_data_3&#039;, 0)  == 32 and ReadingsNum($NAME, &#039;frame_1_data_4&#039;, 0)  == 80 ) {\&lt;br /&gt;
		return (ReadingsNum($NAME, &#039;frame_1_data_5&#039;, 0) * 256+ReadingsNum($NAME, &#039;frame_1_data_6&#039;, 0))/10.0\&lt;br /&gt;
	} else {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;SoC&#039;, 0)\&lt;br /&gt;
	}\&lt;br /&gt;
},\&lt;br /&gt;
SoH:frame_1_data_6:.* {\&lt;br /&gt;
	if (ReadingsNum($NAME, &#039;frame_1_id&#039;, 0) == 1995 and ReadingsNum($NAME, &#039;frame_1_data_1&#039;, 0)  == 5 and ReadingsNum($NAME, &#039;frame_1_data_2&#039;, 0)  == 98\&lt;br /&gt;
      and ReadingsNum($NAME, &#039;frame_1_data_3&#039;, 0)  == 32 and ReadingsNum($NAME, &#039;frame_1_data_4&#039;, 0)  == 81 ) {\&lt;br /&gt;
		return (ReadingsNum($NAME, &#039;frame_1_data_5&#039;, 0) * 256 + ReadingsNum($NAME, &#039;frame_1_data_6&#039;, 0))/10.0\&lt;br /&gt;
	} else {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;SoH&#039;, 0)\&lt;br /&gt;
	}\&lt;br /&gt;
},\&lt;br /&gt;
TrueSoC:frame_1_data_6:.* {\&lt;br /&gt;
	if (ReadingsNum($NAME, &#039;frame_1_id&#039;, 0) == 1995 and ReadingsNum($NAME, &#039;frame_1_data_3&#039;, 0)  == 3) {\&lt;br /&gt;
		return (ReadingsNum($NAME, &#039;frame_1_data_5&#039;, 0) * 256 + ReadingsNum($NAME, &#039;frame_1_data_6&#039;, 0))/10.0\&lt;br /&gt;
	} else {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;TrueSoC&#039;, 0)\&lt;br /&gt;
	}\&lt;br /&gt;
},\&lt;br /&gt;
Mileage:frame_1_data_6:.* {\&lt;br /&gt;
	if (ReadingsNum($NAME, &#039;frame_1_id&#039;, 0) == 1995 and ReadingsNum($NAME, &#039;frame_1_data_1&#039;, 0)  == 6 and ReadingsNum($NAME, &#039;frame_1_data_2&#039;, 0)  == 98\&lt;br /&gt;
      and ReadingsNum($NAME, &#039;frame_1_data_3&#039;, 0)  == 208 ) {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;frame_1_data_6&#039;, 0) * 256 + ReadingsNum($NAME, &#039;frame_1_data_7&#039;, 0)\&lt;br /&gt;
	} else {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;Mileage&#039;, 0)\&lt;br /&gt;
	}\&lt;br /&gt;
},\&lt;br /&gt;
OperatingVoltage:frame_1_data_6:.* {\&lt;br /&gt;
	if (ReadingsNum($NAME, &#039;frame_1_id&#039;, 0) == 1995 and ReadingsNum($NAME, &#039;frame_1_data_1&#039;, 0)  == 4 and ReadingsNum($NAME, &#039;frame_1_data_2&#039;, 0)  == 98\&lt;br /&gt;
      and ReadingsNum($NAME, &#039;frame_1_data_3&#039;, 0)  == 208 ) {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;frame_1_data_5&#039;, 0) /10.0\&lt;br /&gt;
	} else {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;OperatingVoltage&#039;, 0)\&lt;br /&gt;
	}\&lt;br /&gt;
},\&lt;br /&gt;
TotalCharge:frame_1_data_6:.* {\&lt;br /&gt;
	if (ReadingsNum($NAME, &#039;frame_1_id&#039;, 0) == 1995 and ReadingsNum($NAME, &#039;frame_1_data_1&#039;, 0)  == 7 and ReadingsNum($NAME, &#039;frame_1_data_2&#039;, 0)  == 98\&lt;br /&gt;
      and ReadingsNum($NAME, &#039;frame_1_data_3&#039;, 0)  == 33 and ReadingsNum($NAME, &#039;frame_1_data_4&#039;, 0)  == 113 ) {\&lt;br /&gt;
		return round( 2 * ReadingsNum($NAME, &#039;frame_1_data_7&#039;, 0) + ReadingsNum($NAME, &#039;frame_1_data_8&#039;, 0) / 128 , 0)\&lt;br /&gt;
	} else {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;TotalCharge&#039;, 0)\&lt;br /&gt;
	}\&lt;br /&gt;
},\&lt;br /&gt;
TotalDischarge:frame_1_data_6:.* {\&lt;br /&gt;
	if (ReadingsNum($NAME, &#039;frame_1_id&#039;, 0) == 1995 and ReadingsNum($NAME, &#039;frame_1_data_1&#039;, 0)  == 7 and ReadingsNum($NAME, &#039;frame_1_data_2&#039;, 0)  == 98\&lt;br /&gt;
  and ReadingsNum($NAME, &#039;frame_1_data_3&#039;, 0)  == 33 and ReadingsNum($NAME, &#039;frame_1_data_4&#039;, 0)  == 114 ) {\&lt;br /&gt;
		return round( 2 * ReadingsNum($NAME, &#039;frame_1_data_7&#039;, 0) + ReadingsNum($NAME, &#039;frame_1_data_8&#039;, 0) / 128 , 0)\&lt;br /&gt;
	} else {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;TotalDischarge&#039;, 0)\&lt;br /&gt;
	}\&lt;br /&gt;
},\&lt;br /&gt;
BatteryVoltage:frame_1_data_6:.* {\&lt;br /&gt;
	if (ReadingsNum($NAME, &#039;frame_1_id&#039;, 0) == 1995 and ReadingsNum($NAME, &#039;frame_1_data_1&#039;, 0)  == 16 and ReadingsNum($NAME, &#039;frame_1_data_2&#039;, 0)  == 9\&lt;br /&gt;
      and ReadingsNum($NAME, &#039;frame_1_data_3&#039;, 0)  == 98 and ReadingsNum($NAME, &#039;frame_1_data_4&#039;, 0)  == 32 ) {\&lt;br /&gt;
		return ( 256 * ReadingsNum($NAME, &#039;frame_1_data_6&#039;, 0) + ReadingsNum($NAME, &#039;frame_1_data_7&#039;, 0)) / 10.0 \&lt;br /&gt;
	} else {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;BatteryVoltage&#039;, 0)\&lt;br /&gt;
	}\&lt;br /&gt;
},\&lt;br /&gt;
SoE:frame_1_data_6:.* {\&lt;br /&gt;
	if (ReadingsNum($NAME, &#039;frame_1_id&#039;, 0) == 1994 and ReadingsNum($NAME, &#039;frame_1_data_1&#039;, 0)  == 7 and ReadingsNum($NAME, &#039;frame_1_data_2&#039;, 0)  == 98\&lt;br /&gt;
      and ReadingsNum($NAME, &#039;frame_1_data_3&#039;, 0)  == 208 and ReadingsNum($NAME, &#039;frame_1_data_4&#039;, 0)  == 98 ) {\&lt;br /&gt;
		return (256*ReadingsNum($NAME, &#039;frame_1_data_7&#039;, 0)+ReadingsNum($NAME, &#039;frame_1_data_8&#039;, 0)) / 10.0 \&lt;br /&gt;
	} else {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;SoE&#039;, 0)\&lt;br /&gt;
	}\&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Elektromobilität]]&lt;/div&gt;</summary>
		<author><name>Topos</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Ora_Funky_Cat&amp;diff=39256</id>
		<title>Ora Funky Cat</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Ora_Funky_Cat&amp;diff=39256"/>
		<updated>2024-04-20T20:26:59Z</updated>

		<summary type="html">&lt;p&gt;Topos: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Auf dieser Seite wird die Einbindung des E-Autos [https://www.ora-motor.de/ Ora Funky Cat] von GWM (Great Wall Motors aus China) in FHEM über die ODB2-Serviceschnittestelle erläutert.&lt;br /&gt;
&lt;br /&gt;
Benötigte Hardware: [https://www.meatpi.com/products/wican MeatPi WiCAN-OBD-C3 Dongle]&lt;br /&gt;
&lt;br /&gt;
Der WiCAN kann sich über WLAN mit eine MQTT-Server verbinden. Näheres in obigem Link. Als Protokoll &amp;quot;slcan&amp;quot; auswählen.Die Kommunikation erfolgt über den Eintrag can/tx und can/rx des WiCAN auf dem MQTT-Server. Bitte nicht vergessen, den automatischen Standby-Modus anzuschalten, ansonsten leert sich mit der Zeit die Fahrzeugbatterie. &lt;br /&gt;
&lt;br /&gt;
Der WiCAN wird in die ODB2-Serviceschnittestelle (neben Sicherungsfach unterhalb Lenkrad) gesteckt. Am besten über ein Verlängerungskabel oder indem man den ODB2-Stecker aus der Halterung drückt und mit dem WiCAN ins SIcherungsfach legt. &lt;br /&gt;
&lt;br /&gt;
Die Integration eines MQTT-Servers in FHEM wird [[MQTT|hier]] erklärt.&lt;br /&gt;
&lt;br /&gt;
Ist das Auto eingeschalten und der Dongle gesteckt, dann können über FHEM Fahrzeugwerte abgefragt werden. Weiter unten eine beispielhafte EInrichtung eine MQTT-Devices. &lt;br /&gt;
&lt;br /&gt;
=== Readings ===&lt;br /&gt;
Die folgenden Werte werden mit unterer Beispielkonfiguration ausgelesen:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Mileage:&#039;&#039;&#039; km-Stand - Abfrage über &amp;quot;set wican read_Mileage&amp;quot;&lt;br /&gt;
* &#039;&#039;&#039;SoC&#039;&#039;&#039;: Ladezustand Hochvolt-Antriebsbatterie in %  - Abfrage über &amp;quot;set wican read_SoC&amp;quot;&lt;br /&gt;
* &#039;&#039;&#039;TrueSoC&#039;&#039;&#039;: ein zweiter Wert. Hintergrund ist unbekannt - Abfrage über &amp;quot;set wican read_TrueSoC&amp;quot;&lt;br /&gt;
* &#039;&#039;&#039;SoE&#039;&#039;&#039;: Ladezustand Hochvolt-Antriebsbatterie in kW - Abfrage über &amp;quot;set wican read_SoE&amp;quot;&lt;br /&gt;
* &#039;&#039;&#039;SoH&#039;&#039;&#039;: Gesundheitszustand der Hochvolt-Antriebsbatterie in % - Abfrage über &amp;quot;set wican read_SoH&amp;quot;&lt;br /&gt;
* &#039;&#039;&#039;OperatingVoltage&#039;&#039;&#039;: Spannung Niedervolt-Fahrzeugbatterie in V - Abfrage über &amp;quot;set wican read_OperatingVoltage&amp;quot;&lt;br /&gt;
* &#039;&#039;&#039;BatteryVoltage&#039;&#039;&#039;: Spannung Hochvolt-Antriebsbatterie in V - Abfrage über &amp;quot;set wican read_BatteryVoltage&amp;quot;&lt;br /&gt;
* &#039;&#039;&#039;TotalCharge&#039;&#039;&#039;: Durch die Batterie aufgenommene Stromleistung in Ah (inklusive Rekuperation während des Fahrens) - Abfrage über &amp;quot;set wican read_Total Charge&amp;quot; Die Multiplikation mit 5 kV scheint die hinzugefügte elektrische Leistung zu ergeben.&lt;br /&gt;
* &#039;&#039;&#039;TotalDischarge&#039;&#039;&#039;: Von der Hochvolt-Batterie abgezogene Stromleistung in Ah - Abfrage über &amp;quot;set wican read_TotalDischarge&amp;quot; Die Multiplikation mit 5 kV scheint die abgerufene elektrische Leistung zu ergeben&lt;br /&gt;
&lt;br /&gt;
=== Beispielhafte Einrichtung des WiCAN im Ora Funky Cat als MQTT2-Device ===&lt;br /&gt;
Der Ausdruck &amp;quot;XXXXXXXX&amp;quot; muss durch die Identnummer des WiCAN ersetzt werden. &amp;lt;syntaxhighlight lang=&amp;quot;cfg&amp;quot;&amp;gt;&lt;br /&gt;
define wican MQTT2_DEVICE&lt;br /&gt;
attr wican alias Ora&lt;br /&gt;
attr wican stateFormat B: SoC% M: Mileage km (status)&lt;br /&gt;
attr wican event-on-change-reading status&lt;br /&gt;
attr wican event-on-update-reading frame_1_data_6,SoC&lt;br /&gt;
attr wican DbLogExclude .*&lt;br /&gt;
attr wican DbLogInclude SoC:3600&lt;br /&gt;
attr wican readingList wican/XXXXXXXX/status:.* {json2nameValue($EVENT)}\&lt;br /&gt;
 wican/XXXXXXXX/can/rx:.* {json2nameValue($EVENT)}&lt;br /&gt;
attr wican setList read_SoC:noArg wican/XXXXXXXX/can/tx {&amp;quot;bus&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;tx&amp;quot;,&amp;quot;ts&amp;quot;:49539,&amp;quot;frame&amp;quot;:[{&amp;quot;id&amp;quot;:1931,&amp;quot;dlc&amp;quot;:8,&amp;quot;rtr&amp;quot;:false,&amp;quot;extd&amp;quot;:false,&amp;quot;data&amp;quot;:[3,34,32,80,170,170,170,170]}]}\&lt;br /&gt;
read_TrueSoC:noArg wican/XXXXXXXX/can/tx {&amp;quot;bus&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;tx&amp;quot;,&amp;quot;ts&amp;quot;:27825,&amp;quot;frame&amp;quot;:[{&amp;quot;id&amp;quot;:1931,&amp;quot;dlc&amp;quot;:8,&amp;quot;rtr&amp;quot;:false,&amp;quot;extd&amp;quot;:false,&amp;quot;data&amp;quot;:[3,34,3,8,170,170,170,170]}]}\&lt;br /&gt;
read_SoH:noArg wican/XXXXXXXX/can/tx {&amp;quot;bus&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;tx&amp;quot;,&amp;quot;ts&amp;quot;:12016,&amp;quot;frame&amp;quot;:[{&amp;quot;id&amp;quot;:1931,&amp;quot;dlc&amp;quot;:8,&amp;quot;rtr&amp;quot;:false,&amp;quot;extd&amp;quot;:false,&amp;quot;data&amp;quot;:[3,34,32,81,170,170,170,170]}]}\&lt;br /&gt;
read_SoE:noArg wican/XXXXXXXX/can/tx {&amp;quot;bus&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;tx&amp;quot;,&amp;quot;ts&amp;quot;:17777,&amp;quot;frame&amp;quot;:[{&amp;quot;id&amp;quot;:1930,&amp;quot;dlc&amp;quot;:8,&amp;quot;rtr&amp;quot;:false,&amp;quot;extd&amp;quot;:false,&amp;quot;data&amp;quot;:[3,34,208,98,170,170,170,170]}]}\&lt;br /&gt;
read_OpVoltage:noArg wican/XXXXXXXX/can/tx {&amp;quot;bus&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;tx&amp;quot;,&amp;quot;ts&amp;quot;:17645,&amp;quot;frame&amp;quot;:[{&amp;quot;id&amp;quot;:1931,&amp;quot;dlc&amp;quot;:8,&amp;quot;rtr&amp;quot;:false,&amp;quot;extd&amp;quot;:false,&amp;quot;data&amp;quot;:[3,34,208,3,170,170,170,170]}]}\&lt;br /&gt;
read_Mileage:noArg wican/XXXXXXXX/can/tx {&amp;quot;bus&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;tx&amp;quot;,&amp;quot;ts&amp;quot;:35674,&amp;quot;frame&amp;quot;:[{&amp;quot;id&amp;quot;:1931,&amp;quot;dlc&amp;quot;:8,&amp;quot;rtr&amp;quot;:false,&amp;quot;extd&amp;quot;:false,&amp;quot;data&amp;quot;:[3,34,208,4,170,170,170,170]}]}\&lt;br /&gt;
read_TotalCharge:noArg wican/XXXXXXXX/can/tx {&amp;quot;bus&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;tx&amp;quot;,&amp;quot;ts&amp;quot;:28695,&amp;quot;frame&amp;quot;:[{&amp;quot;id&amp;quot;:1931,&amp;quot;dlc&amp;quot;:8,&amp;quot;rtr&amp;quot;:false,&amp;quot;extd&amp;quot;:false,&amp;quot;data&amp;quot;:[3,34,33,113,170,170,170,170]}]}\&lt;br /&gt;
read_TotalDischarge:noArg wican/XXXXXXXX/can/tx {&amp;quot;bus&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;tx&amp;quot;,&amp;quot;ts&amp;quot;:28695,&amp;quot;frame&amp;quot;:[{&amp;quot;id&amp;quot;:1931,&amp;quot;dlc&amp;quot;:8,&amp;quot;rtr&amp;quot;:false,&amp;quot;extd&amp;quot;:false,&amp;quot;data&amp;quot;:[3,34,33,114,170,170,170,170]}]}\&lt;br /&gt;
read_BatteryVoltage:noArg wican/XXXXXXXX/can/tx {&amp;quot;bus&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;tx&amp;quot;,&amp;quot;ts&amp;quot;:58591,&amp;quot;frame&amp;quot;:[{&amp;quot;id&amp;quot;:1931,&amp;quot;dlc&amp;quot;:8,&amp;quot;rtr&amp;quot;:false,&amp;quot;extd&amp;quot;:false,&amp;quot;data&amp;quot;:[3,34,32,3,170,170,170,170]}]}&lt;br /&gt;
attr wican userReadings SoC:frame_1_data_6:.* {\&lt;br /&gt;
	if (ReadingsNum($NAME, &#039;frame_1_id&#039;, 0) == 1995 and ReadingsNum($NAME, &#039;frame_1_data_1&#039;, 0)  == 5 and ReadingsNum($NAME, &#039;frame_1_data_2&#039;, 0)  == 98\&lt;br /&gt;
      and ReadingsNum($NAME, &#039;frame_1_data_3&#039;, 0)  == 32 and ReadingsNum($NAME, &#039;frame_1_data_4&#039;, 0)  == 80 ) {\&lt;br /&gt;
		return (ReadingsNum($NAME, &#039;frame_1_data_5&#039;, 0) * 256+ReadingsNum($NAME, &#039;frame_1_data_6&#039;, 0))/10.0\&lt;br /&gt;
	} else {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;SoC&#039;, 0)\&lt;br /&gt;
	}\&lt;br /&gt;
},\&lt;br /&gt;
SoH:frame_1_data_6:.* {\&lt;br /&gt;
	if (ReadingsNum($NAME, &#039;frame_1_id&#039;, 0) == 1995 and ReadingsNum($NAME, &#039;frame_1_data_1&#039;, 0)  == 5 and ReadingsNum($NAME, &#039;frame_1_data_2&#039;, 0)  == 98\&lt;br /&gt;
      and ReadingsNum($NAME, &#039;frame_1_data_3&#039;, 0)  == 32 and ReadingsNum($NAME, &#039;frame_1_data_4&#039;, 0)  == 81 ) {\&lt;br /&gt;
		return (ReadingsNum($NAME, &#039;frame_1_data_5&#039;, 0) * 256 + ReadingsNum($NAME, &#039;frame_1_data_6&#039;, 0))/10.0\&lt;br /&gt;
	} else {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;SoH&#039;, 0)\&lt;br /&gt;
	}\&lt;br /&gt;
},\&lt;br /&gt;
TrueSoC:frame_1_data_6:.* {\&lt;br /&gt;
	if (ReadingsNum($NAME, &#039;frame_1_id&#039;, 0) == 1995 and ReadingsNum($NAME, &#039;frame_1_data_3&#039;, 0)  == 3) {\&lt;br /&gt;
		return (ReadingsNum($NAME, &#039;frame_1_data_5&#039;, 0) * 256 + ReadingsNum($NAME, &#039;frame_1_data_6&#039;, 0))/10.0\&lt;br /&gt;
	} else {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;TrueSoC&#039;, 0)\&lt;br /&gt;
	}\&lt;br /&gt;
},\&lt;br /&gt;
Mileage:frame_1_data_6:.* {\&lt;br /&gt;
	if (ReadingsNum($NAME, &#039;frame_1_id&#039;, 0) == 1995 and ReadingsNum($NAME, &#039;frame_1_data_1&#039;, 0)  == 6 and ReadingsNum($NAME, &#039;frame_1_data_2&#039;, 0)  == 98\&lt;br /&gt;
      and ReadingsNum($NAME, &#039;frame_1_data_3&#039;, 0)  == 208 ) {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;frame_1_data_6&#039;, 0) * 256 + ReadingsNum($NAME, &#039;frame_1_data_7&#039;, 0)\&lt;br /&gt;
	} else {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;Mileage&#039;, 0)\&lt;br /&gt;
	}\&lt;br /&gt;
},\&lt;br /&gt;
OperatingVoltage:frame_1_data_6:.* {\&lt;br /&gt;
	if (ReadingsNum($NAME, &#039;frame_1_id&#039;, 0) == 1995 and ReadingsNum($NAME, &#039;frame_1_data_1&#039;, 0)  == 4 and ReadingsNum($NAME, &#039;frame_1_data_2&#039;, 0)  == 98\&lt;br /&gt;
      and ReadingsNum($NAME, &#039;frame_1_data_3&#039;, 0)  == 208 ) {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;frame_1_data_5&#039;, 0) /10.0\&lt;br /&gt;
	} else {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;OperatingVoltage&#039;, 0)\&lt;br /&gt;
	}\&lt;br /&gt;
},\&lt;br /&gt;
TotalCharge:frame_1_data_6:.* {\&lt;br /&gt;
	if (ReadingsNum($NAME, &#039;frame_1_id&#039;, 0) == 1995 and ReadingsNum($NAME, &#039;frame_1_data_1&#039;, 0)  == 7 and ReadingsNum($NAME, &#039;frame_1_data_2&#039;, 0)  == 98\&lt;br /&gt;
      and ReadingsNum($NAME, &#039;frame_1_data_3&#039;, 0)  == 33 and ReadingsNum($NAME, &#039;frame_1_data_4&#039;, 0)  == 113 ) {\&lt;br /&gt;
		return round( 2 * ReadingsNum($NAME, &#039;frame_1_data_7&#039;, 0) + ReadingsNum($NAME, &#039;frame_1_data_8&#039;, 0) / 128 , 0)\&lt;br /&gt;
	} else {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;TotalCharge&#039;, 0)\&lt;br /&gt;
	}\&lt;br /&gt;
},\&lt;br /&gt;
TotalDischarge:frame_1_data_6:.* {\&lt;br /&gt;
	if (ReadingsNum($NAME, &#039;frame_1_id&#039;, 0) == 1995 and ReadingsNum($NAME, &#039;frame_1_data_1&#039;, 0)  == 7 and ReadingsNum($NAME, &#039;frame_1_data_2&#039;, 0)  == 98\&lt;br /&gt;
  and ReadingsNum($NAME, &#039;frame_1_data_3&#039;, 0)  == 33 and ReadingsNum($NAME, &#039;frame_1_data_4&#039;, 0)  == 114 ) {\&lt;br /&gt;
		return round( 2 * ReadingsNum($NAME, &#039;frame_1_data_7&#039;, 0) + ReadingsNum($NAME, &#039;frame_1_data_8&#039;, 0) / 128 , 0)\&lt;br /&gt;
	} else {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;TotalDischarge&#039;, 0)\&lt;br /&gt;
	}\&lt;br /&gt;
},\&lt;br /&gt;
BatteryVoltage:frame_1_data_6:.* {\&lt;br /&gt;
	if (ReadingsNum($NAME, &#039;frame_1_id&#039;, 0) == 1995 and ReadingsNum($NAME, &#039;frame_1_data_1&#039;, 0)  == 16 and ReadingsNum($NAME, &#039;frame_1_data_2&#039;, 0)  == 9\&lt;br /&gt;
      and ReadingsNum($NAME, &#039;frame_1_data_3&#039;, 0)  == 98 and ReadingsNum($NAME, &#039;frame_1_data_4&#039;, 0)  == 32 ) {\&lt;br /&gt;
		return ( 256 * ReadingsNum($NAME, &#039;frame_1_data_6&#039;, 0) + ReadingsNum($NAME, &#039;frame_1_data_7&#039;, 0)) / 10.0 \&lt;br /&gt;
	} else {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;BatteryVoltage&#039;, 0)\&lt;br /&gt;
	}\&lt;br /&gt;
},\&lt;br /&gt;
SoE:frame_1_data_6:.* {\&lt;br /&gt;
	if (ReadingsNum($NAME, &#039;frame_1_id&#039;, 0) == 1994 and ReadingsNum($NAME, &#039;frame_1_data_1&#039;, 0)  == 7 and ReadingsNum($NAME, &#039;frame_1_data_2&#039;, 0)  == 98\&lt;br /&gt;
      and ReadingsNum($NAME, &#039;frame_1_data_3&#039;, 0)  == 208 and ReadingsNum($NAME, &#039;frame_1_data_4&#039;, 0)  == 98 ) {\&lt;br /&gt;
		return (256*ReadingsNum($NAME, &#039;frame_1_data_7&#039;, 0)+ReadingsNum($NAME, &#039;frame_1_data_8&#039;, 0)) / 10.0 \&lt;br /&gt;
	} else {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;SoE&#039;, 0)\&lt;br /&gt;
	}\&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Elektromobilität]]&lt;/div&gt;</summary>
		<author><name>Topos</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Ora_Funky_Cat&amp;diff=39255</id>
		<title>Ora Funky Cat</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Ora_Funky_Cat&amp;diff=39255"/>
		<updated>2024-04-20T20:26:39Z</updated>

		<summary type="html">&lt;p&gt;Topos: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Auf dieser Seite wird die Einbindung des E-Autos [https://www.ora-motor.de/ Ora Funky Cat] von GWM (Great Wall Motors aus China) in FHEM über die ODB2-Serviceschnittestelle erläutert.&lt;br /&gt;
&lt;br /&gt;
Benötigte Hardware: [https://www.meatpi.com/products/wican MeatPi WiCAN-OBD-C3 Dongle]&lt;br /&gt;
&lt;br /&gt;
Der WiCAN kann sich über WLAN mit eine MQTT-Server verbinden. Näheres in obigem Link. Als Protokoll &amp;quot;slcan&amp;quot; auswählen.Die Kommunikation erfolgt über den Eintrag can/tx und can/rx des WiCAN auf dem MQTT-Server. Nicht vergessen den automatischen Standby-Modus anzuschalten, ansonsten leert sich mit der Zeit die Fahrzeugbatterie. &lt;br /&gt;
&lt;br /&gt;
Der WiCAN wird in die ODB2-Serviceschnittestelle (neben Sicherungsfach unterhalb Lenkrad) gesteckt. Am besten über ein Verlängerungskabel oder indem man den ODB2-Stecker aus der Halterung drückt und mit dem WiCAN ins SIcherungsfach legt. &lt;br /&gt;
&lt;br /&gt;
Die Integration eines MQTT-Servers in FHEM wird [[MQTT|hier]] erklärt.&lt;br /&gt;
&lt;br /&gt;
Ist das Auto eingeschalten und der Dongle gesteckt, dann können über FHEM Fahrzeugwerte abgefragt werden. Weiter unten eine beispielhafte EInrichtung eine MQTT-Devices. &lt;br /&gt;
&lt;br /&gt;
=== Readings ===&lt;br /&gt;
Die folgenden Werte werden mit unterer Beispielkonfiguration ausgelesen:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Mileage:&#039;&#039;&#039; km-Stand - Abfrage über &amp;quot;set wican read_Mileage&amp;quot;&lt;br /&gt;
* &#039;&#039;&#039;SoC&#039;&#039;&#039;: Ladezustand Hochvolt-Antriebsbatterie in %  - Abfrage über &amp;quot;set wican read_SoC&amp;quot;&lt;br /&gt;
* &#039;&#039;&#039;TrueSoC&#039;&#039;&#039;: ein zweiter Wert. Hintergrund ist unbekannt - Abfrage über &amp;quot;set wican read_TrueSoC&amp;quot;&lt;br /&gt;
* &#039;&#039;&#039;SoE&#039;&#039;&#039;: Ladezustand Hochvolt-Antriebsbatterie in kW - Abfrage über &amp;quot;set wican read_SoE&amp;quot;&lt;br /&gt;
* &#039;&#039;&#039;SoH&#039;&#039;&#039;: Gesundheitszustand der Hochvolt-Antriebsbatterie in % - Abfrage über &amp;quot;set wican read_SoH&amp;quot;&lt;br /&gt;
* &#039;&#039;&#039;OperatingVoltage&#039;&#039;&#039;: Spannung Niedervolt-Fahrzeugbatterie in V - Abfrage über &amp;quot;set wican read_OperatingVoltage&amp;quot;&lt;br /&gt;
* &#039;&#039;&#039;BatteryVoltage&#039;&#039;&#039;: Spannung Hochvolt-Antriebsbatterie in V - Abfrage über &amp;quot;set wican read_BatteryVoltage&amp;quot;&lt;br /&gt;
* &#039;&#039;&#039;TotalCharge&#039;&#039;&#039;: Durch die Batterie aufgenommene Stromleistung in Ah (inklusive Rekuperation während des Fahrens) - Abfrage über &amp;quot;set wican read_Total Charge&amp;quot; Die Multiplikation mit 5 kV scheint die hinzugefügte elektrische Leistung zu ergeben.&lt;br /&gt;
* &#039;&#039;&#039;TotalDischarge&#039;&#039;&#039;: Von der Hochvolt-Batterie abgezogene Stromleistung in Ah - Abfrage über &amp;quot;set wican read_TotalDischarge&amp;quot; Die Multiplikation mit 5 kV scheint die abgerufene elektrische Leistung zu ergeben&lt;br /&gt;
&lt;br /&gt;
=== Beispielhafte Einrichtung des WiCAN im Ora Funky Cat als MQTT2-Device ===&lt;br /&gt;
Der Ausdruck &amp;quot;XXXXXXXX&amp;quot; muss durch die Identnummer des WiCAN ersetzt werden. &amp;lt;syntaxhighlight lang=&amp;quot;cfg&amp;quot;&amp;gt;&lt;br /&gt;
define wican MQTT2_DEVICE&lt;br /&gt;
attr wican alias Ora&lt;br /&gt;
attr wican stateFormat B: SoC% M: Mileage km (status)&lt;br /&gt;
attr wican event-on-change-reading status&lt;br /&gt;
attr wican event-on-update-reading frame_1_data_6,SoC&lt;br /&gt;
attr wican DbLogExclude .*&lt;br /&gt;
attr wican DbLogInclude SoC:3600&lt;br /&gt;
attr wican readingList wican/XXXXXXXX/status:.* {json2nameValue($EVENT)}\&lt;br /&gt;
 wican/XXXXXXXX/can/rx:.* {json2nameValue($EVENT)}&lt;br /&gt;
attr wican setList read_SoC:noArg wican/XXXXXXXX/can/tx {&amp;quot;bus&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;tx&amp;quot;,&amp;quot;ts&amp;quot;:49539,&amp;quot;frame&amp;quot;:[{&amp;quot;id&amp;quot;:1931,&amp;quot;dlc&amp;quot;:8,&amp;quot;rtr&amp;quot;:false,&amp;quot;extd&amp;quot;:false,&amp;quot;data&amp;quot;:[3,34,32,80,170,170,170,170]}]}\&lt;br /&gt;
read_TrueSoC:noArg wican/XXXXXXXX/can/tx {&amp;quot;bus&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;tx&amp;quot;,&amp;quot;ts&amp;quot;:27825,&amp;quot;frame&amp;quot;:[{&amp;quot;id&amp;quot;:1931,&amp;quot;dlc&amp;quot;:8,&amp;quot;rtr&amp;quot;:false,&amp;quot;extd&amp;quot;:false,&amp;quot;data&amp;quot;:[3,34,3,8,170,170,170,170]}]}\&lt;br /&gt;
read_SoH:noArg wican/XXXXXXXX/can/tx {&amp;quot;bus&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;tx&amp;quot;,&amp;quot;ts&amp;quot;:12016,&amp;quot;frame&amp;quot;:[{&amp;quot;id&amp;quot;:1931,&amp;quot;dlc&amp;quot;:8,&amp;quot;rtr&amp;quot;:false,&amp;quot;extd&amp;quot;:false,&amp;quot;data&amp;quot;:[3,34,32,81,170,170,170,170]}]}\&lt;br /&gt;
read_SoE:noArg wican/XXXXXXXX/can/tx {&amp;quot;bus&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;tx&amp;quot;,&amp;quot;ts&amp;quot;:17777,&amp;quot;frame&amp;quot;:[{&amp;quot;id&amp;quot;:1930,&amp;quot;dlc&amp;quot;:8,&amp;quot;rtr&amp;quot;:false,&amp;quot;extd&amp;quot;:false,&amp;quot;data&amp;quot;:[3,34,208,98,170,170,170,170]}]}\&lt;br /&gt;
read_OpVoltage:noArg wican/XXXXXXXX/can/tx {&amp;quot;bus&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;tx&amp;quot;,&amp;quot;ts&amp;quot;:17645,&amp;quot;frame&amp;quot;:[{&amp;quot;id&amp;quot;:1931,&amp;quot;dlc&amp;quot;:8,&amp;quot;rtr&amp;quot;:false,&amp;quot;extd&amp;quot;:false,&amp;quot;data&amp;quot;:[3,34,208,3,170,170,170,170]}]}\&lt;br /&gt;
read_Mileage:noArg wican/XXXXXXXX/can/tx {&amp;quot;bus&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;tx&amp;quot;,&amp;quot;ts&amp;quot;:35674,&amp;quot;frame&amp;quot;:[{&amp;quot;id&amp;quot;:1931,&amp;quot;dlc&amp;quot;:8,&amp;quot;rtr&amp;quot;:false,&amp;quot;extd&amp;quot;:false,&amp;quot;data&amp;quot;:[3,34,208,4,170,170,170,170]}]}\&lt;br /&gt;
read_TotalCharge:noArg wican/XXXXXXXX/can/tx {&amp;quot;bus&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;tx&amp;quot;,&amp;quot;ts&amp;quot;:28695,&amp;quot;frame&amp;quot;:[{&amp;quot;id&amp;quot;:1931,&amp;quot;dlc&amp;quot;:8,&amp;quot;rtr&amp;quot;:false,&amp;quot;extd&amp;quot;:false,&amp;quot;data&amp;quot;:[3,34,33,113,170,170,170,170]}]}\&lt;br /&gt;
read_TotalDischarge:noArg wican/XXXXXXXX/can/tx {&amp;quot;bus&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;tx&amp;quot;,&amp;quot;ts&amp;quot;:28695,&amp;quot;frame&amp;quot;:[{&amp;quot;id&amp;quot;:1931,&amp;quot;dlc&amp;quot;:8,&amp;quot;rtr&amp;quot;:false,&amp;quot;extd&amp;quot;:false,&amp;quot;data&amp;quot;:[3,34,33,114,170,170,170,170]}]}\&lt;br /&gt;
read_BatteryVoltage:noArg wican/XXXXXXXX/can/tx {&amp;quot;bus&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;tx&amp;quot;,&amp;quot;ts&amp;quot;:58591,&amp;quot;frame&amp;quot;:[{&amp;quot;id&amp;quot;:1931,&amp;quot;dlc&amp;quot;:8,&amp;quot;rtr&amp;quot;:false,&amp;quot;extd&amp;quot;:false,&amp;quot;data&amp;quot;:[3,34,32,3,170,170,170,170]}]}&lt;br /&gt;
attr wican userReadings SoC:frame_1_data_6:.* {\&lt;br /&gt;
	if (ReadingsNum($NAME, &#039;frame_1_id&#039;, 0) == 1995 and ReadingsNum($NAME, &#039;frame_1_data_1&#039;, 0)  == 5 and ReadingsNum($NAME, &#039;frame_1_data_2&#039;, 0)  == 98\&lt;br /&gt;
      and ReadingsNum($NAME, &#039;frame_1_data_3&#039;, 0)  == 32 and ReadingsNum($NAME, &#039;frame_1_data_4&#039;, 0)  == 80 ) {\&lt;br /&gt;
		return (ReadingsNum($NAME, &#039;frame_1_data_5&#039;, 0) * 256+ReadingsNum($NAME, &#039;frame_1_data_6&#039;, 0))/10.0\&lt;br /&gt;
	} else {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;SoC&#039;, 0)\&lt;br /&gt;
	}\&lt;br /&gt;
},\&lt;br /&gt;
SoH:frame_1_data_6:.* {\&lt;br /&gt;
	if (ReadingsNum($NAME, &#039;frame_1_id&#039;, 0) == 1995 and ReadingsNum($NAME, &#039;frame_1_data_1&#039;, 0)  == 5 and ReadingsNum($NAME, &#039;frame_1_data_2&#039;, 0)  == 98\&lt;br /&gt;
      and ReadingsNum($NAME, &#039;frame_1_data_3&#039;, 0)  == 32 and ReadingsNum($NAME, &#039;frame_1_data_4&#039;, 0)  == 81 ) {\&lt;br /&gt;
		return (ReadingsNum($NAME, &#039;frame_1_data_5&#039;, 0) * 256 + ReadingsNum($NAME, &#039;frame_1_data_6&#039;, 0))/10.0\&lt;br /&gt;
	} else {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;SoH&#039;, 0)\&lt;br /&gt;
	}\&lt;br /&gt;
},\&lt;br /&gt;
TrueSoC:frame_1_data_6:.* {\&lt;br /&gt;
	if (ReadingsNum($NAME, &#039;frame_1_id&#039;, 0) == 1995 and ReadingsNum($NAME, &#039;frame_1_data_3&#039;, 0)  == 3) {\&lt;br /&gt;
		return (ReadingsNum($NAME, &#039;frame_1_data_5&#039;, 0) * 256 + ReadingsNum($NAME, &#039;frame_1_data_6&#039;, 0))/10.0\&lt;br /&gt;
	} else {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;TrueSoC&#039;, 0)\&lt;br /&gt;
	}\&lt;br /&gt;
},\&lt;br /&gt;
Mileage:frame_1_data_6:.* {\&lt;br /&gt;
	if (ReadingsNum($NAME, &#039;frame_1_id&#039;, 0) == 1995 and ReadingsNum($NAME, &#039;frame_1_data_1&#039;, 0)  == 6 and ReadingsNum($NAME, &#039;frame_1_data_2&#039;, 0)  == 98\&lt;br /&gt;
      and ReadingsNum($NAME, &#039;frame_1_data_3&#039;, 0)  == 208 ) {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;frame_1_data_6&#039;, 0) * 256 + ReadingsNum($NAME, &#039;frame_1_data_7&#039;, 0)\&lt;br /&gt;
	} else {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;Mileage&#039;, 0)\&lt;br /&gt;
	}\&lt;br /&gt;
},\&lt;br /&gt;
OperatingVoltage:frame_1_data_6:.* {\&lt;br /&gt;
	if (ReadingsNum($NAME, &#039;frame_1_id&#039;, 0) == 1995 and ReadingsNum($NAME, &#039;frame_1_data_1&#039;, 0)  == 4 and ReadingsNum($NAME, &#039;frame_1_data_2&#039;, 0)  == 98\&lt;br /&gt;
      and ReadingsNum($NAME, &#039;frame_1_data_3&#039;, 0)  == 208 ) {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;frame_1_data_5&#039;, 0) /10.0\&lt;br /&gt;
	} else {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;OperatingVoltage&#039;, 0)\&lt;br /&gt;
	}\&lt;br /&gt;
},\&lt;br /&gt;
TotalCharge:frame_1_data_6:.* {\&lt;br /&gt;
	if (ReadingsNum($NAME, &#039;frame_1_id&#039;, 0) == 1995 and ReadingsNum($NAME, &#039;frame_1_data_1&#039;, 0)  == 7 and ReadingsNum($NAME, &#039;frame_1_data_2&#039;, 0)  == 98\&lt;br /&gt;
      and ReadingsNum($NAME, &#039;frame_1_data_3&#039;, 0)  == 33 and ReadingsNum($NAME, &#039;frame_1_data_4&#039;, 0)  == 113 ) {\&lt;br /&gt;
		return round( 2 * ReadingsNum($NAME, &#039;frame_1_data_7&#039;, 0) + ReadingsNum($NAME, &#039;frame_1_data_8&#039;, 0) / 128 , 0)\&lt;br /&gt;
	} else {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;TotalCharge&#039;, 0)\&lt;br /&gt;
	}\&lt;br /&gt;
},\&lt;br /&gt;
TotalDischarge:frame_1_data_6:.* {\&lt;br /&gt;
	if (ReadingsNum($NAME, &#039;frame_1_id&#039;, 0) == 1995 and ReadingsNum($NAME, &#039;frame_1_data_1&#039;, 0)  == 7 and ReadingsNum($NAME, &#039;frame_1_data_2&#039;, 0)  == 98\&lt;br /&gt;
  and ReadingsNum($NAME, &#039;frame_1_data_3&#039;, 0)  == 33 and ReadingsNum($NAME, &#039;frame_1_data_4&#039;, 0)  == 114 ) {\&lt;br /&gt;
		return round( 2 * ReadingsNum($NAME, &#039;frame_1_data_7&#039;, 0) + ReadingsNum($NAME, &#039;frame_1_data_8&#039;, 0) / 128 , 0)\&lt;br /&gt;
	} else {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;TotalDischarge&#039;, 0)\&lt;br /&gt;
	}\&lt;br /&gt;
},\&lt;br /&gt;
BatteryVoltage:frame_1_data_6:.* {\&lt;br /&gt;
	if (ReadingsNum($NAME, &#039;frame_1_id&#039;, 0) == 1995 and ReadingsNum($NAME, &#039;frame_1_data_1&#039;, 0)  == 16 and ReadingsNum($NAME, &#039;frame_1_data_2&#039;, 0)  == 9\&lt;br /&gt;
      and ReadingsNum($NAME, &#039;frame_1_data_3&#039;, 0)  == 98 and ReadingsNum($NAME, &#039;frame_1_data_4&#039;, 0)  == 32 ) {\&lt;br /&gt;
		return ( 256 * ReadingsNum($NAME, &#039;frame_1_data_6&#039;, 0) + ReadingsNum($NAME, &#039;frame_1_data_7&#039;, 0)) / 10.0 \&lt;br /&gt;
	} else {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;BatteryVoltage&#039;, 0)\&lt;br /&gt;
	}\&lt;br /&gt;
},\&lt;br /&gt;
SoE:frame_1_data_6:.* {\&lt;br /&gt;
	if (ReadingsNum($NAME, &#039;frame_1_id&#039;, 0) == 1994 and ReadingsNum($NAME, &#039;frame_1_data_1&#039;, 0)  == 7 and ReadingsNum($NAME, &#039;frame_1_data_2&#039;, 0)  == 98\&lt;br /&gt;
      and ReadingsNum($NAME, &#039;frame_1_data_3&#039;, 0)  == 208 and ReadingsNum($NAME, &#039;frame_1_data_4&#039;, 0)  == 98 ) {\&lt;br /&gt;
		return (256*ReadingsNum($NAME, &#039;frame_1_data_7&#039;, 0)+ReadingsNum($NAME, &#039;frame_1_data_8&#039;, 0)) / 10.0 \&lt;br /&gt;
	} else {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;SoE&#039;, 0)\&lt;br /&gt;
	}\&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Elektromobilität]]&lt;/div&gt;</summary>
		<author><name>Topos</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Webasto_Next&amp;diff=39254</id>
		<title>Webasto Next</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Webasto_Next&amp;diff=39254"/>
		<updated>2024-04-20T20:21:32Z</updated>

		<summary type="html">&lt;p&gt;Topos: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Die Wallbox Webasto Next kann per LAN oder WLAN über das Modebus-Protokoll ausgelesen und gesteuert werden.&lt;br /&gt;
&lt;br /&gt;
Hier eine mögliche Konfiguration:&amp;lt;syntaxhighlight lang=&amp;quot;cfg&amp;quot;&amp;gt;&lt;br /&gt;
define WebastoNext ModbusAttr 1 3 [IP-Addresse]:502 TCP&lt;br /&gt;
attr WebastoNext alias Wallbox&lt;br /&gt;
attr WebastoNext icon wallbox&lt;br /&gt;
attr WebastoNext stateFormat Charge_Point_State_TXT&amp;lt;br&amp;gt;Cable_State_TXT&amp;lt;br&amp;gt;Charge_State_TXT: Charge_Active_Power W&lt;br /&gt;
attr WebastoNext event-on-update-reading .*&lt;br /&gt;
attr WebastoNext DbLogExclude .*&lt;br /&gt;
attr WebastoNext DbLogInclude Charge_Active_Power:600&lt;br /&gt;
attr WebastoNext oldreadings Cable_State&lt;br /&gt;
attr WebastoNext obj-i1000-poll 1&lt;br /&gt;
attr WebastoNext obj-i1000-reading Charge_Point_State&lt;br /&gt;
attr WebastoNext obj-i1000-type unsigned short big&lt;br /&gt;
attr WebastoNext obj-i1001-poll 1&lt;br /&gt;
attr WebastoNext obj-i1001-reading Charge_State&lt;br /&gt;
attr WebastoNext obj-i1001-type unsigned short big&lt;br /&gt;
attr WebastoNext obj-i1004-poll 1&lt;br /&gt;
attr WebastoNext obj-i1004-reading Cable_State&lt;br /&gt;
attr WebastoNext obj-i1004-type unsigned short big&lt;br /&gt;
attr WebastoNext obj-i1006-poll 1&lt;br /&gt;
attr WebastoNext obj-i1006-reading Error_Code&lt;br /&gt;
attr WebastoNext obj-i1006-type unsigned short big&lt;br /&gt;
attr WebastoNext obj-i1008-poll 1&lt;br /&gt;
attr WebastoNext obj-i1008-reading Charge_Active_Current_L1&lt;br /&gt;
attr WebastoNext obj-i1008-type unsigned short big&lt;br /&gt;
attr WebastoNext obj-i1008-expr $val/1000&lt;br /&gt;
attr WebastoNext obj-i1010-poll 1&lt;br /&gt;
attr WebastoNext obj-i1010-reading Charge_Active_Current_L2&lt;br /&gt;
attr WebastoNext obj-i1010-type unsigned short big&lt;br /&gt;
attr WebastoNext obj-i1010-expr $val/1000&lt;br /&gt;
attr WebastoNext obj-i1012-poll 1&lt;br /&gt;
attr WebastoNext obj-i1012-reading Charge_Active_Current_L3&lt;br /&gt;
attr WebastoNext obj-i1012-type unsigned short big&lt;br /&gt;
attr WebastoNext obj-i1012-expr $val/1000&lt;br /&gt;
attr WebastoNext obj-i1020-poll 1&lt;br /&gt;
attr WebastoNext obj-i1020-reading Charge_Active_Power&lt;br /&gt;
attr WebastoNext obj-i1020-type unsigned long big&lt;br /&gt;
attr WebastoNext obj-i1024-reading Charge_Active_Power_L1&lt;br /&gt;
attr WebastoNext obj-i1024-poll 1&lt;br /&gt;
attr WebastoNext obj-i1024-type unsigned long big&lt;br /&gt;
attr WebastoNext obj-i1028-reading Charge_Active_Power_L2&lt;br /&gt;
attr WebastoNext obj-i1028-poll 1&lt;br /&gt;
attr WebastoNext obj-i1028-type unsigned long big&lt;br /&gt;
attr WebastoNext obj-i1032-reading Charge_Active_Power_L3&lt;br /&gt;
attr WebastoNext obj-i1032-poll 1&lt;br /&gt;
attr WebastoNext obj-i1032-type unsigned long big&lt;br /&gt;
attr WebastoNext obj-i1036-reading Energy_Meter&lt;br /&gt;
attr WebastoNext obj-i1036-poll 1&lt;br /&gt;
attr WebastoNext obj-i1036-type unsigned long big&lt;br /&gt;
attr WebastoNext obj-i1036-expr $val/1000&lt;br /&gt;
&lt;br /&gt;
attr WebastoNext obj-i1102-reading Min_Current&lt;br /&gt;
attr WebastoNext obj-i1102-poll 1&lt;br /&gt;
attr WebastoNext obj-i1102-type unsigned short big&lt;br /&gt;
attr WebastoNext obj-i1108-reading EV_Max_Current&lt;br /&gt;
attr WebastoNext obj-i1108-poll 1&lt;br /&gt;
attr WebastoNext obj-i1108-type unsigned short big&lt;br /&gt;
attr WebastoNext obj-i1502-reading Charged_Energy&lt;br /&gt;
attr WebastoNext obj-i1502-poll 1&lt;br /&gt;
attr WebastoNext obj-i1502-type unsigned short big&lt;br /&gt;
attr WebastoNext obj-i1502-expr $val/1000&lt;br /&gt;
attr WebastoNext obj-i1504-reading Charging_Start_Time&lt;br /&gt;
attr WebastoNext obj-i1504-poll 1&lt;br /&gt;
attr WebastoNext obj-i1504-type unsigned long big&lt;br /&gt;
attr WebastoNext obj-i1508-reading Charging_Time&lt;br /&gt;
attr WebastoNext obj-i1508-poll 1&lt;br /&gt;
attr WebastoNext obj-i1508-type unsigned long big&lt;br /&gt;
attr WebastoNext obj-i1512-reading Charging_End_Time&lt;br /&gt;
attr WebastoNext obj-i1512-poll 1&lt;br /&gt;
attr WebastoNext obj-i1512-type unsigned long big&lt;br /&gt;
attr WebastoNext obj-i1620-reading Smart_Vehicle_Detected&lt;br /&gt;
attr WebastoNext obj-i1620-poll 1&lt;br /&gt;
attr WebastoNext obj-i1620-type unsigned short big&lt;br /&gt;
&lt;br /&gt;
attr WebastoNext obj-h2000-reading Safe_Current&lt;br /&gt;
attr WebastoNext obj-h2000-poll 1&lt;br /&gt;
attr WebastoNext obj-h2000-polldelay 600&lt;br /&gt;
attr WebastoNext obj-h2000-type unsigned short big&lt;br /&gt;
attr WebastoNext obj-h2000-set 1&lt;br /&gt;
attr WebastoNext obj-h2000-min 0&lt;br /&gt;
attr WebastoNext obj-h2000-max 16&lt;br /&gt;
&lt;br /&gt;
attr WebastoNext obj-h2002-reading Com_Timeout&lt;br /&gt;
attr WebastoNext obj-h2002-poll 1&lt;br /&gt;
attr WebastoNext obj-h2002-polldelay x199&lt;br /&gt;
attr WebastoNext obj-h2002-type unsigned short big&lt;br /&gt;
attr WebastoNext obj-h2002-set 1&lt;br /&gt;
&lt;br /&gt;
attr WebastoNext obj-h5000-reading Charge_Power_Set&lt;br /&gt;
attr WebastoNext obj-h5000-poll 0&lt;br /&gt;
attr WebastoNext obj-h5000-type unsigned long big&lt;br /&gt;
attr WebastoNext obj-h5000-set 1&lt;br /&gt;
&lt;br /&gt;
attr WebastoNext obj-h5004-reading Charge_Current_Set&lt;br /&gt;
attr WebastoNext obj-h5004-poll 0&lt;br /&gt;
attr WebastoNext obj-h5004-type signed short big&lt;br /&gt;
attr WebastoNext obj-h5004-set 1&lt;br /&gt;
attr WebastoNext obj-h5004-min 0&lt;br /&gt;
attr WebastoNext obj-h5004-max 16&lt;br /&gt;
&lt;br /&gt;
attr WebastoNext obj-h5006-reading Start_Cancel&lt;br /&gt;
attr WebastoNext obj-h5006-poll 0&lt;br /&gt;
attr WebastoNext obj-h5006-type unsigned short big&lt;br /&gt;
attr WebastoNext obj-h5006-set 1&lt;br /&gt;
attr WebastoNext obj-h5006-min 0&lt;br /&gt;
attr WebastoNext obj-h5006-max 2&lt;br /&gt;
attr WebastoNext obj-h5006-hint 0,1,2&lt;br /&gt;
&lt;br /&gt;
attr WebastoNext obj-h6000-reading Life_Bit&lt;br /&gt;
attr WebastoNext obj-h6000-poll 1&lt;br /&gt;
attr WebastoNext obj-h6000-type unsigned short big&lt;br /&gt;
attr WebastoNext obj-h6000-set 1&lt;br /&gt;
&lt;br /&gt;
attr WebastoNext userReadings \&lt;br /&gt;
Charge_Point_State_TXT:Charge_Point_State\b.* {my $val = ReadingsVal (&amp;quot;WebastoNext&amp;quot;,&amp;quot;Charge_Point_State&amp;quot;, 0);; if ($val == 0) {return &amp;quot;no vehicle attached (EVSE available, EVSE unavailable)&amp;quot;} elsif ($val == 1) {return &amp;quot;vehicle attached, no permission (preparing)&amp;quot;} elsif ($val == 3) {return &amp;quot;charging&amp;quot;} elsif ($val == 4) {return &amp;quot;charging paused (suspending EVSE, suspending EV, finishing)&amp;quot;} elsif ($val == 7) {return &amp;quot;charging error&amp;quot;} elsif ($val == 8) {return &amp;quot;charging station reserved&amp;quot;} else { return $val .&amp;quot; undefined&amp;quot; };;},\&lt;br /&gt;
Cable_State_TXT:Cable_State\b.* {my $val = ReadingsVal (&amp;quot;WebastoNext&amp;quot;,&amp;quot;Cable_State&amp;quot;, 0);; if ($val == 0) {return &amp;quot;no cable attached&amp;quot;} elsif ($val == 1) {return &amp;quot;cable attached (no car attached)&amp;quot;} elsif ($val == 2) {return &amp;quot;cable attached (car attached)&amp;quot;} elsif ($val == 3) {return &amp;quot;cable attached (car attached) + lock active&amp;quot;} else { return $val .&amp;quot; undefined&amp;quot; };;}, \&lt;br /&gt;
Charge_State_TXT:Charge_State\b.* {my $val = ReadingsVal (&amp;quot;WebastoNext&amp;quot;,&amp;quot;Charge_State&amp;quot;, 0);; if ($val == 0) {return &amp;quot;idle&amp;quot;} elsif ($val == 1) {return &amp;quot;charging&amp;quot;} else { return $val .&amp;quot; undefined&amp;quot; };;}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Steuerung ===&lt;br /&gt;
Das Register Charge_Power_Set wird nur berücksichtigt, wenn Charge_Current_Set auf 0 gesetzt ist. Mindestladestromstärke ist 6 A bzw. 4200 W.&lt;br /&gt;
&lt;br /&gt;
Die Wallbox reagiert nur dann auf die Steuerung, wenn ein regelmäßiges Keep-Alive-Bit gesetzt wird. Ansonsten wird der Lademodus mit dem Wert &amp;quot;Safe_Current&amp;quot; gestartet.&amp;lt;syntaxhighlight lang=&amp;quot;cfg&amp;quot;&amp;gt;&lt;br /&gt;
define WebastoNext_KeepAlive at +*00:00:30 set WebastoNext Life_Bit 1&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Gestartet wird der Ladvorgang mit &amp;quot;set WebastoNext Start_Cancel 1&amp;quot;. Gestoppt wird mit &amp;quot;set WebastoNext Start_Cancel 2&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Wallboxen]]&lt;br /&gt;
[[Kategorie:Elektromobilität]]&lt;/div&gt;</summary>
		<author><name>Topos</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Ora_Funky_Cat&amp;diff=39253</id>
		<title>Ora Funky Cat</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Ora_Funky_Cat&amp;diff=39253"/>
		<updated>2024-04-20T20:20:48Z</updated>

		<summary type="html">&lt;p&gt;Topos: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Auf dieser Seite wird die EInbindung des E-Autos [https://www.ora-motor.de/ Ora Funky Cat] von GWM (Great Wall Motors aus China) in FHEM über die ODB2-Serviceschnittestelle erläutert.&lt;br /&gt;
&lt;br /&gt;
Benötigte Hardware: [https://www.meatpi.com/products/wican MeatPi WiCAN-OBD-C3 Dongle]&lt;br /&gt;
&lt;br /&gt;
Der WiCAN kann sich über WLAN mit eine MQTT-Server verbinden. Näheres in obigem Link. Er wird in die ODB2-Serviceschnittestelle (neben Sicherungsfach unterhalb Lenkrad) gesteckt. Am besten über ein Verlängerungskabel oder indem man den Stecker aus der Halterung drückt und den WiCAN ins SIcherungsfach legt. &lt;br /&gt;
&lt;br /&gt;
Die Integration eines MQTT-Servers in FHEM wird [[MQTT|hier]] erklärt.&lt;br /&gt;
&lt;br /&gt;
Ist das Auto eingeschalten und der Dongle gesteckt, dann können über FHEM Fahrzeugwerte abgefragt werden. Weiter unten eine beispielhafte EInrichtung eine MQTT-Devices. &lt;br /&gt;
&lt;br /&gt;
=== Readings ===&lt;br /&gt;
Die folgenden Werte werden mit unterer Beispielkonfiguration ausgelesen:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Mileage:&#039;&#039;&#039; km-Stand - Abfrage über &amp;quot;set wican read_Mileage&amp;quot;&lt;br /&gt;
* &#039;&#039;&#039;SoC&#039;&#039;&#039;: Ladezustand Hochvolt-Antriebsbatterie in %  - Abfrage über &amp;quot;set wican read_SoC&amp;quot;&lt;br /&gt;
* &#039;&#039;&#039;TrueSoC&#039;&#039;&#039;: ein zweiter Wert. Hintergrund ist unbekannt - Abfrage über &amp;quot;set wican read_TrueSoC&amp;quot;&lt;br /&gt;
* &#039;&#039;&#039;SoE&#039;&#039;&#039;: Ladezustand Hochvolt-Antriebsbatterie in kW - Abfrage über &amp;quot;set wican read_SoE&amp;quot;&lt;br /&gt;
* &#039;&#039;&#039;SoH&#039;&#039;&#039;: Gesundheitszustand der Hochvolt-Antriebsbatterie in % - Abfrage über &amp;quot;set wican read_SoH&amp;quot;&lt;br /&gt;
* &#039;&#039;&#039;OperatingVoltage&#039;&#039;&#039;: Spannung Niedervolt-Fahrzeugbatterie in V - Abfrage über &amp;quot;set wican read_OperatingVoltage&amp;quot;&lt;br /&gt;
* &#039;&#039;&#039;BatteryVoltage&#039;&#039;&#039;: Spannung Hochvolt-Antriebsbatterie in V - Abfrage über &amp;quot;set wican read_BatteryVoltage&amp;quot;&lt;br /&gt;
* &#039;&#039;&#039;TotalCharge&#039;&#039;&#039;: Durch die Batterie aufgenommene Stromleistung in Ah (inklusive Rekuperation während des Fahrens) - Abfrage über &amp;quot;set wican read_Total Charge&amp;quot; Die Multiplikation mit 5 kV scheint die hinzugefügte elektrische Leistung zu ergeben.&lt;br /&gt;
* &#039;&#039;&#039;TotalDischarge&#039;&#039;&#039;: Von der Hochvolt-Batterie abgezogene Stromleistung in Ah - Abfrage über &amp;quot;set wican read_TotalDischarge&amp;quot; Die Multiplikation mit 5 kV scheint die abgerufene elektrische Leistung zu ergeben&lt;br /&gt;
&lt;br /&gt;
=== Beispielhafte Einrichtung des WiCAN im Ora Funky Cat als MQTT2-Device ===&lt;br /&gt;
Der Ausdruck &amp;quot;XXXXXXXX&amp;quot; muss durch die Identnummer des WiCAN ersetzt werden. &amp;lt;syntaxhighlight lang=&amp;quot;cfg&amp;quot;&amp;gt;&lt;br /&gt;
define wican MQTT2_DEVICE&lt;br /&gt;
attr wican alias Ora&lt;br /&gt;
attr wican stateFormat B: SoC% M: Mileage km (status)&lt;br /&gt;
attr wican event-on-change-reading status&lt;br /&gt;
attr wican event-on-update-reading frame_1_data_6,SoC&lt;br /&gt;
attr wican DbLogExclude .*&lt;br /&gt;
attr wican DbLogInclude SoC:3600&lt;br /&gt;
attr wican readingList wican/XXXXXXXX/status:.* {json2nameValue($EVENT)}\&lt;br /&gt;
 wican/XXXXXXXX/can/rx:.* {json2nameValue($EVENT)}&lt;br /&gt;
attr wican setList read_SoC:noArg wican/XXXXXXXX/can/tx {&amp;quot;bus&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;tx&amp;quot;,&amp;quot;ts&amp;quot;:49539,&amp;quot;frame&amp;quot;:[{&amp;quot;id&amp;quot;:1931,&amp;quot;dlc&amp;quot;:8,&amp;quot;rtr&amp;quot;:false,&amp;quot;extd&amp;quot;:false,&amp;quot;data&amp;quot;:[3,34,32,80,170,170,170,170]}]}\&lt;br /&gt;
read_TrueSoC:noArg wican/XXXXXXXX/can/tx {&amp;quot;bus&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;tx&amp;quot;,&amp;quot;ts&amp;quot;:27825,&amp;quot;frame&amp;quot;:[{&amp;quot;id&amp;quot;:1931,&amp;quot;dlc&amp;quot;:8,&amp;quot;rtr&amp;quot;:false,&amp;quot;extd&amp;quot;:false,&amp;quot;data&amp;quot;:[3,34,3,8,170,170,170,170]}]}\&lt;br /&gt;
read_SoH:noArg wican/XXXXXXXX/can/tx {&amp;quot;bus&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;tx&amp;quot;,&amp;quot;ts&amp;quot;:12016,&amp;quot;frame&amp;quot;:[{&amp;quot;id&amp;quot;:1931,&amp;quot;dlc&amp;quot;:8,&amp;quot;rtr&amp;quot;:false,&amp;quot;extd&amp;quot;:false,&amp;quot;data&amp;quot;:[3,34,32,81,170,170,170,170]}]}\&lt;br /&gt;
read_SoE:noArg wican/XXXXXXXX/can/tx {&amp;quot;bus&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;tx&amp;quot;,&amp;quot;ts&amp;quot;:17777,&amp;quot;frame&amp;quot;:[{&amp;quot;id&amp;quot;:1930,&amp;quot;dlc&amp;quot;:8,&amp;quot;rtr&amp;quot;:false,&amp;quot;extd&amp;quot;:false,&amp;quot;data&amp;quot;:[3,34,208,98,170,170,170,170]}]}\&lt;br /&gt;
read_OpVoltage:noArg wican/XXXXXXXX/can/tx {&amp;quot;bus&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;tx&amp;quot;,&amp;quot;ts&amp;quot;:17645,&amp;quot;frame&amp;quot;:[{&amp;quot;id&amp;quot;:1931,&amp;quot;dlc&amp;quot;:8,&amp;quot;rtr&amp;quot;:false,&amp;quot;extd&amp;quot;:false,&amp;quot;data&amp;quot;:[3,34,208,3,170,170,170,170]}]}\&lt;br /&gt;
read_Mileage:noArg wican/XXXXXXXX/can/tx {&amp;quot;bus&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;tx&amp;quot;,&amp;quot;ts&amp;quot;:35674,&amp;quot;frame&amp;quot;:[{&amp;quot;id&amp;quot;:1931,&amp;quot;dlc&amp;quot;:8,&amp;quot;rtr&amp;quot;:false,&amp;quot;extd&amp;quot;:false,&amp;quot;data&amp;quot;:[3,34,208,4,170,170,170,170]}]}\&lt;br /&gt;
read_TotalCharge:noArg wican/XXXXXXXX/can/tx {&amp;quot;bus&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;tx&amp;quot;,&amp;quot;ts&amp;quot;:28695,&amp;quot;frame&amp;quot;:[{&amp;quot;id&amp;quot;:1931,&amp;quot;dlc&amp;quot;:8,&amp;quot;rtr&amp;quot;:false,&amp;quot;extd&amp;quot;:false,&amp;quot;data&amp;quot;:[3,34,33,113,170,170,170,170]}]}\&lt;br /&gt;
read_TotalDischarge:noArg wican/XXXXXXXX/can/tx {&amp;quot;bus&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;tx&amp;quot;,&amp;quot;ts&amp;quot;:28695,&amp;quot;frame&amp;quot;:[{&amp;quot;id&amp;quot;:1931,&amp;quot;dlc&amp;quot;:8,&amp;quot;rtr&amp;quot;:false,&amp;quot;extd&amp;quot;:false,&amp;quot;data&amp;quot;:[3,34,33,114,170,170,170,170]}]}\&lt;br /&gt;
read_BatteryVoltage:noArg wican/XXXXXXXX/can/tx {&amp;quot;bus&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;tx&amp;quot;,&amp;quot;ts&amp;quot;:58591,&amp;quot;frame&amp;quot;:[{&amp;quot;id&amp;quot;:1931,&amp;quot;dlc&amp;quot;:8,&amp;quot;rtr&amp;quot;:false,&amp;quot;extd&amp;quot;:false,&amp;quot;data&amp;quot;:[3,34,32,3,170,170,170,170]}]}&lt;br /&gt;
attr wican userReadings SoC:frame_1_data_6:.* {\&lt;br /&gt;
	if (ReadingsNum($NAME, &#039;frame_1_id&#039;, 0) == 1995 and ReadingsNum($NAME, &#039;frame_1_data_1&#039;, 0)  == 5 and ReadingsNum($NAME, &#039;frame_1_data_2&#039;, 0)  == 98\&lt;br /&gt;
      and ReadingsNum($NAME, &#039;frame_1_data_3&#039;, 0)  == 32 and ReadingsNum($NAME, &#039;frame_1_data_4&#039;, 0)  == 80 ) {\&lt;br /&gt;
		return (ReadingsNum($NAME, &#039;frame_1_data_5&#039;, 0) * 256+ReadingsNum($NAME, &#039;frame_1_data_6&#039;, 0))/10.0\&lt;br /&gt;
	} else {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;SoC&#039;, 0)\&lt;br /&gt;
	}\&lt;br /&gt;
},\&lt;br /&gt;
SoH:frame_1_data_6:.* {\&lt;br /&gt;
	if (ReadingsNum($NAME, &#039;frame_1_id&#039;, 0) == 1995 and ReadingsNum($NAME, &#039;frame_1_data_1&#039;, 0)  == 5 and ReadingsNum($NAME, &#039;frame_1_data_2&#039;, 0)  == 98\&lt;br /&gt;
      and ReadingsNum($NAME, &#039;frame_1_data_3&#039;, 0)  == 32 and ReadingsNum($NAME, &#039;frame_1_data_4&#039;, 0)  == 81 ) {\&lt;br /&gt;
		return (ReadingsNum($NAME, &#039;frame_1_data_5&#039;, 0) * 256 + ReadingsNum($NAME, &#039;frame_1_data_6&#039;, 0))/10.0\&lt;br /&gt;
	} else {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;SoH&#039;, 0)\&lt;br /&gt;
	}\&lt;br /&gt;
},\&lt;br /&gt;
TrueSoC:frame_1_data_6:.* {\&lt;br /&gt;
	if (ReadingsNum($NAME, &#039;frame_1_id&#039;, 0) == 1995 and ReadingsNum($NAME, &#039;frame_1_data_3&#039;, 0)  == 3) {\&lt;br /&gt;
		return (ReadingsNum($NAME, &#039;frame_1_data_5&#039;, 0) * 256 + ReadingsNum($NAME, &#039;frame_1_data_6&#039;, 0))/10.0\&lt;br /&gt;
	} else {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;TrueSoC&#039;, 0)\&lt;br /&gt;
	}\&lt;br /&gt;
},\&lt;br /&gt;
Mileage:frame_1_data_6:.* {\&lt;br /&gt;
	if (ReadingsNum($NAME, &#039;frame_1_id&#039;, 0) == 1995 and ReadingsNum($NAME, &#039;frame_1_data_1&#039;, 0)  == 6 and ReadingsNum($NAME, &#039;frame_1_data_2&#039;, 0)  == 98\&lt;br /&gt;
      and ReadingsNum($NAME, &#039;frame_1_data_3&#039;, 0)  == 208 ) {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;frame_1_data_6&#039;, 0) * 256 + ReadingsNum($NAME, &#039;frame_1_data_7&#039;, 0)\&lt;br /&gt;
	} else {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;Mileage&#039;, 0)\&lt;br /&gt;
	}\&lt;br /&gt;
},\&lt;br /&gt;
OperatingVoltage:frame_1_data_6:.* {\&lt;br /&gt;
	if (ReadingsNum($NAME, &#039;frame_1_id&#039;, 0) == 1995 and ReadingsNum($NAME, &#039;frame_1_data_1&#039;, 0)  == 4 and ReadingsNum($NAME, &#039;frame_1_data_2&#039;, 0)  == 98\&lt;br /&gt;
      and ReadingsNum($NAME, &#039;frame_1_data_3&#039;, 0)  == 208 ) {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;frame_1_data_5&#039;, 0) /10.0\&lt;br /&gt;
	} else {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;OperatingVoltage&#039;, 0)\&lt;br /&gt;
	}\&lt;br /&gt;
},\&lt;br /&gt;
TotalCharge:frame_1_data_6:.* {\&lt;br /&gt;
	if (ReadingsNum($NAME, &#039;frame_1_id&#039;, 0) == 1995 and ReadingsNum($NAME, &#039;frame_1_data_1&#039;, 0)  == 7 and ReadingsNum($NAME, &#039;frame_1_data_2&#039;, 0)  == 98\&lt;br /&gt;
      and ReadingsNum($NAME, &#039;frame_1_data_3&#039;, 0)  == 33 and ReadingsNum($NAME, &#039;frame_1_data_4&#039;, 0)  == 113 ) {\&lt;br /&gt;
		return round( 2 * ReadingsNum($NAME, &#039;frame_1_data_7&#039;, 0) + ReadingsNum($NAME, &#039;frame_1_data_8&#039;, 0) / 128 , 0)\&lt;br /&gt;
	} else {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;TotalCharge&#039;, 0)\&lt;br /&gt;
	}\&lt;br /&gt;
},\&lt;br /&gt;
TotalDischarge:frame_1_data_6:.* {\&lt;br /&gt;
	if (ReadingsNum($NAME, &#039;frame_1_id&#039;, 0) == 1995 and ReadingsNum($NAME, &#039;frame_1_data_1&#039;, 0)  == 7 and ReadingsNum($NAME, &#039;frame_1_data_2&#039;, 0)  == 98\&lt;br /&gt;
  and ReadingsNum($NAME, &#039;frame_1_data_3&#039;, 0)  == 33 and ReadingsNum($NAME, &#039;frame_1_data_4&#039;, 0)  == 114 ) {\&lt;br /&gt;
		return round( 2 * ReadingsNum($NAME, &#039;frame_1_data_7&#039;, 0) + ReadingsNum($NAME, &#039;frame_1_data_8&#039;, 0) / 128 , 0)\&lt;br /&gt;
	} else {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;TotalDischarge&#039;, 0)\&lt;br /&gt;
	}\&lt;br /&gt;
},\&lt;br /&gt;
BatteryVoltage:frame_1_data_6:.* {\&lt;br /&gt;
	if (ReadingsNum($NAME, &#039;frame_1_id&#039;, 0) == 1995 and ReadingsNum($NAME, &#039;frame_1_data_1&#039;, 0)  == 16 and ReadingsNum($NAME, &#039;frame_1_data_2&#039;, 0)  == 9\&lt;br /&gt;
      and ReadingsNum($NAME, &#039;frame_1_data_3&#039;, 0)  == 98 and ReadingsNum($NAME, &#039;frame_1_data_4&#039;, 0)  == 32 ) {\&lt;br /&gt;
		return ( 256 * ReadingsNum($NAME, &#039;frame_1_data_6&#039;, 0) + ReadingsNum($NAME, &#039;frame_1_data_7&#039;, 0)) / 10.0 \&lt;br /&gt;
	} else {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;BatteryVoltage&#039;, 0)\&lt;br /&gt;
	}\&lt;br /&gt;
},\&lt;br /&gt;
SoE:frame_1_data_6:.* {\&lt;br /&gt;
	if (ReadingsNum($NAME, &#039;frame_1_id&#039;, 0) == 1994 and ReadingsNum($NAME, &#039;frame_1_data_1&#039;, 0)  == 7 and ReadingsNum($NAME, &#039;frame_1_data_2&#039;, 0)  == 98\&lt;br /&gt;
      and ReadingsNum($NAME, &#039;frame_1_data_3&#039;, 0)  == 208 and ReadingsNum($NAME, &#039;frame_1_data_4&#039;, 0)  == 98 ) {\&lt;br /&gt;
		return (256*ReadingsNum($NAME, &#039;frame_1_data_7&#039;, 0)+ReadingsNum($NAME, &#039;frame_1_data_8&#039;, 0)) / 10.0 \&lt;br /&gt;
	} else {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;SoE&#039;, 0)\&lt;br /&gt;
	}\&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Elektromobilität]]&lt;/div&gt;</summary>
		<author><name>Topos</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Ora_Funky_Cat&amp;diff=39252</id>
		<title>Ora Funky Cat</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Ora_Funky_Cat&amp;diff=39252"/>
		<updated>2024-04-20T20:18:23Z</updated>

		<summary type="html">&lt;p&gt;Topos: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Auf dieser Seite wird die EInbindung des E-Autos [https://www.ora-motor.de/ Ora Funky Cat] von GWM (Great Wall Motors aus China) in FHEM über die ODB2-Serviceschnittestelle erläutert.&lt;br /&gt;
&lt;br /&gt;
Benötigte Hardware: [https://www.meatpi.com/products/wican MeatPi WiCAN-OBD-C3 Dongle]&lt;br /&gt;
&lt;br /&gt;
Der WiCAN kann sich über WLAN mit eine MQTT-Server verbinden. Näheres in obigem Link. Er wird in die ODB2-Serviceschnittestelle (neben Sicherungsfach unterhalb Lenkrad) gesteckt. Am besten über ein Verlängerungskabel oder indem man den Stecker aus der Halterung drückt und den WiCAN ins SIcherungsfach legt. &lt;br /&gt;
&lt;br /&gt;
Die Integration eines MQTT-Servers in FHEM wird [[MQTT|hier]] erklärt.&lt;br /&gt;
&lt;br /&gt;
Ist das Auto eingeschalten und der Dongle gesteckt, dann können über FHEM Fahrzeugwerte abgefragt werden. Weiter unten eine beispielhafte EInrichtung eine MQTT-Devices. &lt;br /&gt;
&lt;br /&gt;
=== Readings ===&lt;br /&gt;
Die folgenden Werte werden mit unterer Beispielkonfiguration ausgelesen:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Mileage:&#039;&#039;&#039; km-Stand - Abfrage über &amp;quot;set wican read_Mileage&amp;quot;&lt;br /&gt;
* &#039;&#039;&#039;SoC&#039;&#039;&#039;: Ladezustand Hochvolt-Antriebsbatterie in %  - Abfrage über &amp;quot;set wican read_SoC&amp;quot;&lt;br /&gt;
* &#039;&#039;&#039;TrueSoC&#039;&#039;&#039;: ein zweiter Wert. Hintergrund ist unbekannt - Abfrage über &amp;quot;set wican read_TrueSoC&amp;quot;&lt;br /&gt;
* &#039;&#039;&#039;SoE&#039;&#039;&#039;: Ladezustand Hochvolt-Antriebsbatterie in kW - Abfrage über &amp;quot;set wican read_SoE&amp;quot;&lt;br /&gt;
* &#039;&#039;&#039;SoH&#039;&#039;&#039;: Gesundheitszustand der Hochvolt-Antriebsbatterie in % - Abfrage über &amp;quot;set wican read_SoH&amp;quot;&lt;br /&gt;
* &#039;&#039;&#039;OperatingVoltage&#039;&#039;&#039;: Spannung Niedervolt-Fahrzeugbatterie in V - Abfrage über &amp;quot;set wican read_OperatingVoltage&amp;quot;&lt;br /&gt;
* &#039;&#039;&#039;BatteryVoltage&#039;&#039;&#039;: Spannung Hochvolt-Antriebsbatterie in V - Abfrage über &amp;quot;set wican read_BatteryVoltage&amp;quot;&lt;br /&gt;
* &#039;&#039;&#039;TotalCharge&#039;&#039;&#039;: Durch die Batterie aufgenommene Stromleistung in Ah (inklusive Rekuperation während des Fahrens) - Abfrage über &amp;quot;set wican read_Total Charge&amp;quot; Die Multiplikation mit 5 kV scheint die hinzugefügte elektrische Leistung zu ergeben.&lt;br /&gt;
* &#039;&#039;&#039;TotalDischarge&#039;&#039;&#039;: Von der Hochvolt-Batterie abgezogene Stromleistung in Ah - Abfrage über &amp;quot;set wican read_TotalDischarge&amp;quot; Die Multiplikation mit 5 kV scheint die abgerufene elektrische Leistung zu ergeben&lt;br /&gt;
&lt;br /&gt;
=== Beispielhafte Einrichtung des WiCAN im Ora Funky Cat als MQTT2-Device ===&lt;br /&gt;
Der Ausdruck &amp;quot;XXXXXXXX&amp;quot; muss durch die Identnummer des WiCAN ersetzt werden. &amp;lt;syntaxhighlight lang=&amp;quot;cfg&amp;quot;&amp;gt;&lt;br /&gt;
define wican MQTT2_DEVICE&lt;br /&gt;
attr wican alias Ora&lt;br /&gt;
attr wican stateFormat B: SoC% M: Mileage km (status)&lt;br /&gt;
attr wican event-on-change-reading status&lt;br /&gt;
attr wican event-on-update-reading frame_1_data_6,SoC&lt;br /&gt;
attr wican DbLogExclude .*&lt;br /&gt;
attr wican DbLogInclude SoC:3600&lt;br /&gt;
attr wican readingList wican/XXXXXXXX/status:.* {json2nameValue($EVENT)}\&lt;br /&gt;
 wican/XXXXXXXX/can/rx:.* {json2nameValue($EVENT)}&lt;br /&gt;
attr wican setList read_SoC:noArg wican/XXXXXXXX/can/tx {&amp;quot;bus&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;tx&amp;quot;,&amp;quot;ts&amp;quot;:49539,&amp;quot;frame&amp;quot;:[{&amp;quot;id&amp;quot;:1931,&amp;quot;dlc&amp;quot;:8,&amp;quot;rtr&amp;quot;:false,&amp;quot;extd&amp;quot;:false,&amp;quot;data&amp;quot;:[3,34,32,80,170,170,170,170]}]}\&lt;br /&gt;
read_TrueSoC:noArg wican/XXXXXXXX/can/tx {&amp;quot;bus&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;tx&amp;quot;,&amp;quot;ts&amp;quot;:27825,&amp;quot;frame&amp;quot;:[{&amp;quot;id&amp;quot;:1931,&amp;quot;dlc&amp;quot;:8,&amp;quot;rtr&amp;quot;:false,&amp;quot;extd&amp;quot;:false,&amp;quot;data&amp;quot;:[3,34,3,8,170,170,170,170]}]}\&lt;br /&gt;
read_SoH:noArg wican/XXXXXXXX/can/tx {&amp;quot;bus&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;tx&amp;quot;,&amp;quot;ts&amp;quot;:12016,&amp;quot;frame&amp;quot;:[{&amp;quot;id&amp;quot;:1931,&amp;quot;dlc&amp;quot;:8,&amp;quot;rtr&amp;quot;:false,&amp;quot;extd&amp;quot;:false,&amp;quot;data&amp;quot;:[3,34,32,81,170,170,170,170]}]}\&lt;br /&gt;
read_SoE:noArg wican/XXXXXXXX/can/tx {&amp;quot;bus&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;tx&amp;quot;,&amp;quot;ts&amp;quot;:17777,&amp;quot;frame&amp;quot;:[{&amp;quot;id&amp;quot;:1930,&amp;quot;dlc&amp;quot;:8,&amp;quot;rtr&amp;quot;:false,&amp;quot;extd&amp;quot;:false,&amp;quot;data&amp;quot;:[3,34,208,98,170,170,170,170]}]}\&lt;br /&gt;
read_OpVoltage:noArg wican/XXXXXXXX/can/tx {&amp;quot;bus&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;tx&amp;quot;,&amp;quot;ts&amp;quot;:17645,&amp;quot;frame&amp;quot;:[{&amp;quot;id&amp;quot;:1931,&amp;quot;dlc&amp;quot;:8,&amp;quot;rtr&amp;quot;:false,&amp;quot;extd&amp;quot;:false,&amp;quot;data&amp;quot;:[3,34,208,3,170,170,170,170]}]}\&lt;br /&gt;
read_Mileage:noArg wican/XXXXXXXX/can/tx {&amp;quot;bus&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;tx&amp;quot;,&amp;quot;ts&amp;quot;:35674,&amp;quot;frame&amp;quot;:[{&amp;quot;id&amp;quot;:1931,&amp;quot;dlc&amp;quot;:8,&amp;quot;rtr&amp;quot;:false,&amp;quot;extd&amp;quot;:false,&amp;quot;data&amp;quot;:[3,34,208,4,170,170,170,170]}]}\&lt;br /&gt;
read_TotalCharge:noArg wican/XXXXXXXX/can/tx {&amp;quot;bus&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;tx&amp;quot;,&amp;quot;ts&amp;quot;:28695,&amp;quot;frame&amp;quot;:[{&amp;quot;id&amp;quot;:1931,&amp;quot;dlc&amp;quot;:8,&amp;quot;rtr&amp;quot;:false,&amp;quot;extd&amp;quot;:false,&amp;quot;data&amp;quot;:[3,34,33,113,170,170,170,170]}]}\&lt;br /&gt;
read_TotalDischarge:noArg wican/XXXXXXXX/can/tx {&amp;quot;bus&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;tx&amp;quot;,&amp;quot;ts&amp;quot;:28695,&amp;quot;frame&amp;quot;:[{&amp;quot;id&amp;quot;:1931,&amp;quot;dlc&amp;quot;:8,&amp;quot;rtr&amp;quot;:false,&amp;quot;extd&amp;quot;:false,&amp;quot;data&amp;quot;:[3,34,33,114,170,170,170,170]}]}\&lt;br /&gt;
read_BatteryVoltage:noArg wican/XXXXXXXX/can/tx {&amp;quot;bus&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;tx&amp;quot;,&amp;quot;ts&amp;quot;:58591,&amp;quot;frame&amp;quot;:[{&amp;quot;id&amp;quot;:1931,&amp;quot;dlc&amp;quot;:8,&amp;quot;rtr&amp;quot;:false,&amp;quot;extd&amp;quot;:false,&amp;quot;data&amp;quot;:[3,34,32,3,170,170,170,170]}]}&lt;br /&gt;
attr wican userReadings SoC:frame_1_data_6:.* {\&lt;br /&gt;
	if (ReadingsNum($NAME, &#039;frame_1_id&#039;, 0) == 1995 and ReadingsNum($NAME, &#039;frame_1_data_1&#039;, 0)  == 5 and ReadingsNum($NAME, &#039;frame_1_data_2&#039;, 0)  == 98\&lt;br /&gt;
      and ReadingsNum($NAME, &#039;frame_1_data_3&#039;, 0)  == 32 and ReadingsNum($NAME, &#039;frame_1_data_4&#039;, 0)  == 80 ) {\&lt;br /&gt;
		return (ReadingsNum($NAME, &#039;frame_1_data_5&#039;, 0) * 256+ReadingsNum($NAME, &#039;frame_1_data_6&#039;, 0))/10.0\&lt;br /&gt;
	} else {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;SoC&#039;, 0)\&lt;br /&gt;
	}\&lt;br /&gt;
},\&lt;br /&gt;
SoH:frame_1_data_6:.* {\&lt;br /&gt;
	if (ReadingsNum($NAME, &#039;frame_1_id&#039;, 0) == 1995 and ReadingsNum($NAME, &#039;frame_1_data_1&#039;, 0)  == 5 and ReadingsNum($NAME, &#039;frame_1_data_2&#039;, 0)  == 98\&lt;br /&gt;
      and ReadingsNum($NAME, &#039;frame_1_data_3&#039;, 0)  == 32 and ReadingsNum($NAME, &#039;frame_1_data_4&#039;, 0)  == 81 ) {\&lt;br /&gt;
		return (ReadingsNum($NAME, &#039;frame_1_data_5&#039;, 0) * 256 + ReadingsNum($NAME, &#039;frame_1_data_6&#039;, 0))/10.0\&lt;br /&gt;
	} else {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;SoH&#039;, 0)\&lt;br /&gt;
	}\&lt;br /&gt;
},\&lt;br /&gt;
TrueSoC:frame_1_data_6:.* {\&lt;br /&gt;
	if (ReadingsNum($NAME, &#039;frame_1_id&#039;, 0) == 1995 and ReadingsNum($NAME, &#039;frame_1_data_3&#039;, 0)  == 3) {\&lt;br /&gt;
		return (ReadingsNum($NAME, &#039;frame_1_data_5&#039;, 0) * 256 + ReadingsNum($NAME, &#039;frame_1_data_6&#039;, 0))/10.0\&lt;br /&gt;
	} else {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;TrueSoC&#039;, 0)\&lt;br /&gt;
	}\&lt;br /&gt;
},\&lt;br /&gt;
Mileage:frame_1_data_6:.* {\&lt;br /&gt;
	if (ReadingsNum($NAME, &#039;frame_1_id&#039;, 0) == 1995 and ReadingsNum($NAME, &#039;frame_1_data_1&#039;, 0)  == 6 and ReadingsNum($NAME, &#039;frame_1_data_2&#039;, 0)  == 98\&lt;br /&gt;
      and ReadingsNum($NAME, &#039;frame_1_data_3&#039;, 0)  == 208 ) {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;frame_1_data_6&#039;, 0) * 256 + ReadingsNum($NAME, &#039;frame_1_data_7&#039;, 0)\&lt;br /&gt;
	} else {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;Mileage&#039;, 0)\&lt;br /&gt;
	}\&lt;br /&gt;
},\&lt;br /&gt;
OperatingVoltage:frame_1_data_6:.* {\&lt;br /&gt;
	if (ReadingsNum($NAME, &#039;frame_1_id&#039;, 0) == 1995 and ReadingsNum($NAME, &#039;frame_1_data_1&#039;, 0)  == 4 and ReadingsNum($NAME, &#039;frame_1_data_2&#039;, 0)  == 98\&lt;br /&gt;
      and ReadingsNum($NAME, &#039;frame_1_data_3&#039;, 0)  == 208 ) {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;frame_1_data_5&#039;, 0) /10.0\&lt;br /&gt;
	} else {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;OperatingVoltage&#039;, 0)\&lt;br /&gt;
	}\&lt;br /&gt;
},\&lt;br /&gt;
TotalCharge:frame_1_data_6:.* {\&lt;br /&gt;
	if (ReadingsNum($NAME, &#039;frame_1_id&#039;, 0) == 1995 and ReadingsNum($NAME, &#039;frame_1_data_1&#039;, 0)  == 7 and ReadingsNum($NAME, &#039;frame_1_data_2&#039;, 0)  == 98\&lt;br /&gt;
      and ReadingsNum($NAME, &#039;frame_1_data_3&#039;, 0)  == 33 and ReadingsNum($NAME, &#039;frame_1_data_4&#039;, 0)  == 113 ) {\&lt;br /&gt;
		return round( 2 * ReadingsNum($NAME, &#039;frame_1_data_7&#039;, 0) + ReadingsNum($NAME, &#039;frame_1_data_8&#039;, 0) / 128 , 0)\&lt;br /&gt;
	} else {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;TotalCharge&#039;, 0)\&lt;br /&gt;
	}\&lt;br /&gt;
},\&lt;br /&gt;
TotalDischarge:frame_1_data_6:.* {\&lt;br /&gt;
	if (ReadingsNum($NAME, &#039;frame_1_id&#039;, 0) == 1995 and ReadingsNum($NAME, &#039;frame_1_data_1&#039;, 0)  == 7 and ReadingsNum($NAME, &#039;frame_1_data_2&#039;, 0)  == 98\&lt;br /&gt;
  and ReadingsNum($NAME, &#039;frame_1_data_3&#039;, 0)  == 33 and ReadingsNum($NAME, &#039;frame_1_data_4&#039;, 0)  == 114 ) {\&lt;br /&gt;
		return round( 2 * ReadingsNum($NAME, &#039;frame_1_data_7&#039;, 0) + ReadingsNum($NAME, &#039;frame_1_data_8&#039;, 0) / 128 , 0)\&lt;br /&gt;
	} else {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;TotalDischarge&#039;, 0)\&lt;br /&gt;
	}\&lt;br /&gt;
},\&lt;br /&gt;
BatteryVoltage:frame_1_data_6:.* {\&lt;br /&gt;
	if (ReadingsNum($NAME, &#039;frame_1_id&#039;, 0) == 1995 and ReadingsNum($NAME, &#039;frame_1_data_1&#039;, 0)  == 16 and ReadingsNum($NAME, &#039;frame_1_data_2&#039;, 0)  == 9\&lt;br /&gt;
      and ReadingsNum($NAME, &#039;frame_1_data_3&#039;, 0)  == 98 and ReadingsNum($NAME, &#039;frame_1_data_4&#039;, 0)  == 32 ) {\&lt;br /&gt;
		return ( 256 * ReadingsNum($NAME, &#039;frame_1_data_6&#039;, 0) + ReadingsNum($NAME, &#039;frame_1_data_7&#039;, 0)) / 10.0 \&lt;br /&gt;
	} else {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;BatteryVoltage&#039;, 0)\&lt;br /&gt;
	}\&lt;br /&gt;
},\&lt;br /&gt;
SoE:frame_1_data_6:.* {\&lt;br /&gt;
	if (ReadingsNum($NAME, &#039;frame_1_id&#039;, 0) == 1994 and ReadingsNum($NAME, &#039;frame_1_data_1&#039;, 0)  == 7 and ReadingsNum($NAME, &#039;frame_1_data_2&#039;, 0)  == 98\&lt;br /&gt;
      and ReadingsNum($NAME, &#039;frame_1_data_3&#039;, 0)  == 208 and ReadingsNum($NAME, &#039;frame_1_data_4&#039;, 0)  == 98 ) {\&lt;br /&gt;
		return (256*ReadingsNum($NAME, &#039;frame_1_data_7&#039;, 0)+ReadingsNum($NAME, &#039;frame_1_data_8&#039;, 0)) / 10.0 \&lt;br /&gt;
	} else {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;SoE&#039;, 0)\&lt;br /&gt;
	}\&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Topos</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Ora_Funky_Cat&amp;diff=39251</id>
		<title>Ora Funky Cat</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Ora_Funky_Cat&amp;diff=39251"/>
		<updated>2024-04-20T20:15:11Z</updated>

		<summary type="html">&lt;p&gt;Topos: Anzeigewerte ergänzt&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Auf dieser Seite wird die EInbindung des E-Autos [https://www.ora-motor.de/ Ora Funky Cat] von GWM (Great Wall Motors aus China) in FHEM über die ODB2-Serviceschnittestelle erläutert.&lt;br /&gt;
&lt;br /&gt;
Benötigte Hardware: [https://www.meatpi.com/products/wican MeatPi WiCAN-OBD-C3 Dongle]&lt;br /&gt;
&lt;br /&gt;
Der WiCAN kann sich über WLAN mit eine MQTT-Server verbinden. Näheres in obigem Link. Er wird in die ODB2-Serviceschnittestelle (neben Sicherungsfach unterhalb Lenkrad) gesteckt. Am besten über ein Verlängerungskabel oder indem man den Stecker aus der Halterung drückt und den WiCAN ins SIcherungsfach legt. &lt;br /&gt;
&lt;br /&gt;
Die Integration eines MQTT-Servers in FHEM wird [[MQTT|hier]] erklärt.&lt;br /&gt;
&lt;br /&gt;
Ist das Auto eingeschalten und der Dongle gesteckt dann könne über FHEM Fahrzeugwerte abgefragt werden. Hier eine beispielhafte EInrichtung eine MQTT-Devices. Der Ausdruck &amp;quot;XXXXXXXX&amp;quot; muss durch die Identnummer des WiCAN ersetzt werden. Die folgenden Werte werden ausgelesen:&lt;br /&gt;
&lt;br /&gt;
* Mileage: km-Stand - Abfrage über &amp;quot;set wican read_Mileage&amp;quot;&lt;br /&gt;
* SoC: Ladezustand Hochvolt-Antriebsbatterie in %  - Abfrage über &amp;quot;set wican read_SoC&amp;quot;&lt;br /&gt;
* TrueSoC: ein zweiter Wert. Hintergrund ist unbekannt - Abfrage über &amp;quot;set wican read_TrueSoC&amp;quot;&lt;br /&gt;
* SoE: Ladezustand Hochvolt-Antriebsbatterie in kW - Abfrage über &amp;quot;set wican read_SoE&amp;quot;&lt;br /&gt;
* SoH: Gesundheitszustand der Hochvolt-Antriebsbatterie in % - Abfrage über &amp;quot;set wican read_SoH&amp;quot;&lt;br /&gt;
* OperatingVoltage: Spannung Niedervolt-Fahrzeugbatterie in V - Abfrage über &amp;quot;set wican read_OperatingVoltage&amp;quot;&lt;br /&gt;
* BatteryVoltage: Spannung Hochvolt-Antriebsbatterie in V - Abfrage über &amp;quot;set wican read_BatteryVoltage&amp;quot;&lt;br /&gt;
* TotalCharge: Durch die Batterie aufgenommene Stromleistung in Ah (inklusive Rekuperation während des Fahrens) - Abfrage über &amp;quot;set wican read_Total Charge&amp;quot; Die Multiplikation mit 5 kV scheint die hinzugefügte elektrische Leistung zu ergeben.&lt;br /&gt;
* TotalDischarge: Von der Hochvolt-Batterie abgezogene Stromleistung in Ah - Abfrage über &amp;quot;set wican read_TotalDischarge&amp;quot; Die Multiplikation mit 5 kV scheint die abgerufene elektrische Leistung zu ergeben&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cfg&amp;quot;&amp;gt;&lt;br /&gt;
define wican MQTT2_DEVICE&lt;br /&gt;
attr wican alias Ora&lt;br /&gt;
attr wican stateFormat B: SoC% M: Mileage km (status)&lt;br /&gt;
attr wican event-on-change-reading status&lt;br /&gt;
attr wican event-on-update-reading frame_1_data_6,SoC&lt;br /&gt;
attr wican DbLogExclude .*&lt;br /&gt;
attr wican DbLogInclude SoC:3600&lt;br /&gt;
attr wican readingList wican/XXXXXXXX/status:.* {json2nameValue($EVENT)}\&lt;br /&gt;
 wican/XXXXXXXX/can/rx:.* {json2nameValue($EVENT)}&lt;br /&gt;
attr wican setList read_SoC:noArg wican/XXXXXXXX/can/tx {&amp;quot;bus&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;tx&amp;quot;,&amp;quot;ts&amp;quot;:49539,&amp;quot;frame&amp;quot;:[{&amp;quot;id&amp;quot;:1931,&amp;quot;dlc&amp;quot;:8,&amp;quot;rtr&amp;quot;:false,&amp;quot;extd&amp;quot;:false,&amp;quot;data&amp;quot;:[3,34,32,80,170,170,170,170]}]}\&lt;br /&gt;
read_TrueSoC:noArg wican/XXXXXXXX/can/tx {&amp;quot;bus&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;tx&amp;quot;,&amp;quot;ts&amp;quot;:27825,&amp;quot;frame&amp;quot;:[{&amp;quot;id&amp;quot;:1931,&amp;quot;dlc&amp;quot;:8,&amp;quot;rtr&amp;quot;:false,&amp;quot;extd&amp;quot;:false,&amp;quot;data&amp;quot;:[3,34,3,8,170,170,170,170]}]}\&lt;br /&gt;
read_SoH:noArg wican/XXXXXXXX/can/tx {&amp;quot;bus&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;tx&amp;quot;,&amp;quot;ts&amp;quot;:12016,&amp;quot;frame&amp;quot;:[{&amp;quot;id&amp;quot;:1931,&amp;quot;dlc&amp;quot;:8,&amp;quot;rtr&amp;quot;:false,&amp;quot;extd&amp;quot;:false,&amp;quot;data&amp;quot;:[3,34,32,81,170,170,170,170]}]}\&lt;br /&gt;
read_SoE:noArg wican/XXXXXXXX/can/tx {&amp;quot;bus&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;tx&amp;quot;,&amp;quot;ts&amp;quot;:17777,&amp;quot;frame&amp;quot;:[{&amp;quot;id&amp;quot;:1930,&amp;quot;dlc&amp;quot;:8,&amp;quot;rtr&amp;quot;:false,&amp;quot;extd&amp;quot;:false,&amp;quot;data&amp;quot;:[3,34,208,98,170,170,170,170]}]}\&lt;br /&gt;
read_OpVoltage:noArg wican/XXXXXXXX/can/tx {&amp;quot;bus&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;tx&amp;quot;,&amp;quot;ts&amp;quot;:17645,&amp;quot;frame&amp;quot;:[{&amp;quot;id&amp;quot;:1931,&amp;quot;dlc&amp;quot;:8,&amp;quot;rtr&amp;quot;:false,&amp;quot;extd&amp;quot;:false,&amp;quot;data&amp;quot;:[3,34,208,3,170,170,170,170]}]}\&lt;br /&gt;
read_Mileage:noArg wican/XXXXXXXX/can/tx {&amp;quot;bus&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;tx&amp;quot;,&amp;quot;ts&amp;quot;:35674,&amp;quot;frame&amp;quot;:[{&amp;quot;id&amp;quot;:1931,&amp;quot;dlc&amp;quot;:8,&amp;quot;rtr&amp;quot;:false,&amp;quot;extd&amp;quot;:false,&amp;quot;data&amp;quot;:[3,34,208,4,170,170,170,170]}]}\&lt;br /&gt;
read_TotalCharge:noArg wican/XXXXXXXX/can/tx {&amp;quot;bus&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;tx&amp;quot;,&amp;quot;ts&amp;quot;:28695,&amp;quot;frame&amp;quot;:[{&amp;quot;id&amp;quot;:1931,&amp;quot;dlc&amp;quot;:8,&amp;quot;rtr&amp;quot;:false,&amp;quot;extd&amp;quot;:false,&amp;quot;data&amp;quot;:[3,34,33,113,170,170,170,170]}]}\&lt;br /&gt;
read_TotalDischarge:noArg wican/XXXXXXXX/can/tx {&amp;quot;bus&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;tx&amp;quot;,&amp;quot;ts&amp;quot;:28695,&amp;quot;frame&amp;quot;:[{&amp;quot;id&amp;quot;:1931,&amp;quot;dlc&amp;quot;:8,&amp;quot;rtr&amp;quot;:false,&amp;quot;extd&amp;quot;:false,&amp;quot;data&amp;quot;:[3,34,33,114,170,170,170,170]}]}\&lt;br /&gt;
read_BatteryVoltage:noArg wican/XXXXXXXX/can/tx {&amp;quot;bus&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;tx&amp;quot;,&amp;quot;ts&amp;quot;:58591,&amp;quot;frame&amp;quot;:[{&amp;quot;id&amp;quot;:1931,&amp;quot;dlc&amp;quot;:8,&amp;quot;rtr&amp;quot;:false,&amp;quot;extd&amp;quot;:false,&amp;quot;data&amp;quot;:[3,34,32,3,170,170,170,170]}]}&lt;br /&gt;
attr wican userReadings SoC:frame_1_data_6:.* {\&lt;br /&gt;
	if (ReadingsNum($NAME, &#039;frame_1_id&#039;, 0) == 1995 and ReadingsNum($NAME, &#039;frame_1_data_1&#039;, 0)  == 5 and ReadingsNum($NAME, &#039;frame_1_data_2&#039;, 0)  == 98\&lt;br /&gt;
      and ReadingsNum($NAME, &#039;frame_1_data_3&#039;, 0)  == 32 and ReadingsNum($NAME, &#039;frame_1_data_4&#039;, 0)  == 80 ) {\&lt;br /&gt;
		return (ReadingsNum($NAME, &#039;frame_1_data_5&#039;, 0) * 256+ReadingsNum($NAME, &#039;frame_1_data_6&#039;, 0))/10.0\&lt;br /&gt;
	} else {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;SoC&#039;, 0)\&lt;br /&gt;
	}\&lt;br /&gt;
},\&lt;br /&gt;
SoH:frame_1_data_6:.* {\&lt;br /&gt;
	if (ReadingsNum($NAME, &#039;frame_1_id&#039;, 0) == 1995 and ReadingsNum($NAME, &#039;frame_1_data_1&#039;, 0)  == 5 and ReadingsNum($NAME, &#039;frame_1_data_2&#039;, 0)  == 98\&lt;br /&gt;
      and ReadingsNum($NAME, &#039;frame_1_data_3&#039;, 0)  == 32 and ReadingsNum($NAME, &#039;frame_1_data_4&#039;, 0)  == 81 ) {\&lt;br /&gt;
		return (ReadingsNum($NAME, &#039;frame_1_data_5&#039;, 0) * 256 + ReadingsNum($NAME, &#039;frame_1_data_6&#039;, 0))/10.0\&lt;br /&gt;
	} else {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;SoH&#039;, 0)\&lt;br /&gt;
	}\&lt;br /&gt;
},\&lt;br /&gt;
TrueSoC:frame_1_data_6:.* {\&lt;br /&gt;
	if (ReadingsNum($NAME, &#039;frame_1_id&#039;, 0) == 1995 and ReadingsNum($NAME, &#039;frame_1_data_3&#039;, 0)  == 3) {\&lt;br /&gt;
		return (ReadingsNum($NAME, &#039;frame_1_data_5&#039;, 0) * 256 + ReadingsNum($NAME, &#039;frame_1_data_6&#039;, 0))/10.0\&lt;br /&gt;
	} else {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;TrueSoC&#039;, 0)\&lt;br /&gt;
	}\&lt;br /&gt;
},\&lt;br /&gt;
Mileage:frame_1_data_6:.* {\&lt;br /&gt;
	if (ReadingsNum($NAME, &#039;frame_1_id&#039;, 0) == 1995 and ReadingsNum($NAME, &#039;frame_1_data_1&#039;, 0)  == 6 and ReadingsNum($NAME, &#039;frame_1_data_2&#039;, 0)  == 98\&lt;br /&gt;
      and ReadingsNum($NAME, &#039;frame_1_data_3&#039;, 0)  == 208 ) {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;frame_1_data_6&#039;, 0) * 256 + ReadingsNum($NAME, &#039;frame_1_data_7&#039;, 0)\&lt;br /&gt;
	} else {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;Mileage&#039;, 0)\&lt;br /&gt;
	}\&lt;br /&gt;
},\&lt;br /&gt;
OperatingVoltage:frame_1_data_6:.* {\&lt;br /&gt;
	if (ReadingsNum($NAME, &#039;frame_1_id&#039;, 0) == 1995 and ReadingsNum($NAME, &#039;frame_1_data_1&#039;, 0)  == 4 and ReadingsNum($NAME, &#039;frame_1_data_2&#039;, 0)  == 98\&lt;br /&gt;
      and ReadingsNum($NAME, &#039;frame_1_data_3&#039;, 0)  == 208 ) {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;frame_1_data_5&#039;, 0) /10.0\&lt;br /&gt;
	} else {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;OperatingVoltage&#039;, 0)\&lt;br /&gt;
	}\&lt;br /&gt;
},\&lt;br /&gt;
TotalCharge:frame_1_data_6:.* {\&lt;br /&gt;
	if (ReadingsNum($NAME, &#039;frame_1_id&#039;, 0) == 1995 and ReadingsNum($NAME, &#039;frame_1_data_1&#039;, 0)  == 7 and ReadingsNum($NAME, &#039;frame_1_data_2&#039;, 0)  == 98\&lt;br /&gt;
      and ReadingsNum($NAME, &#039;frame_1_data_3&#039;, 0)  == 33 and ReadingsNum($NAME, &#039;frame_1_data_4&#039;, 0)  == 113 ) {\&lt;br /&gt;
		return round( 2 * ReadingsNum($NAME, &#039;frame_1_data_7&#039;, 0) + ReadingsNum($NAME, &#039;frame_1_data_8&#039;, 0) / 128 , 0)\&lt;br /&gt;
	} else {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;TotalCharge&#039;, 0)\&lt;br /&gt;
	}\&lt;br /&gt;
},\&lt;br /&gt;
TotalDischarge:frame_1_data_6:.* {\&lt;br /&gt;
	if (ReadingsNum($NAME, &#039;frame_1_id&#039;, 0) == 1995 and ReadingsNum($NAME, &#039;frame_1_data_1&#039;, 0)  == 7 and ReadingsNum($NAME, &#039;frame_1_data_2&#039;, 0)  == 98\&lt;br /&gt;
  and ReadingsNum($NAME, &#039;frame_1_data_3&#039;, 0)  == 33 and ReadingsNum($NAME, &#039;frame_1_data_4&#039;, 0)  == 114 ) {\&lt;br /&gt;
		return round( 2 * ReadingsNum($NAME, &#039;frame_1_data_7&#039;, 0) + ReadingsNum($NAME, &#039;frame_1_data_8&#039;, 0) / 128 , 0)\&lt;br /&gt;
	} else {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;TotalDischarge&#039;, 0)\&lt;br /&gt;
	}\&lt;br /&gt;
},\&lt;br /&gt;
BatteryVoltage:frame_1_data_6:.* {\&lt;br /&gt;
	if (ReadingsNum($NAME, &#039;frame_1_id&#039;, 0) == 1995 and ReadingsNum($NAME, &#039;frame_1_data_1&#039;, 0)  == 16 and ReadingsNum($NAME, &#039;frame_1_data_2&#039;, 0)  == 9\&lt;br /&gt;
      and ReadingsNum($NAME, &#039;frame_1_data_3&#039;, 0)  == 98 and ReadingsNum($NAME, &#039;frame_1_data_4&#039;, 0)  == 32 ) {\&lt;br /&gt;
		return ( 256 * ReadingsNum($NAME, &#039;frame_1_data_6&#039;, 0) + ReadingsNum($NAME, &#039;frame_1_data_7&#039;, 0)) / 10.0 \&lt;br /&gt;
	} else {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;BatteryVoltage&#039;, 0)\&lt;br /&gt;
	}\&lt;br /&gt;
},\&lt;br /&gt;
SoE:frame_1_data_6:.* {\&lt;br /&gt;
	if (ReadingsNum($NAME, &#039;frame_1_id&#039;, 0) == 1994 and ReadingsNum($NAME, &#039;frame_1_data_1&#039;, 0)  == 7 and ReadingsNum($NAME, &#039;frame_1_data_2&#039;, 0)  == 98\&lt;br /&gt;
      and ReadingsNum($NAME, &#039;frame_1_data_3&#039;, 0)  == 208 and ReadingsNum($NAME, &#039;frame_1_data_4&#039;, 0)  == 98 ) {\&lt;br /&gt;
		return (256*ReadingsNum($NAME, &#039;frame_1_data_7&#039;, 0)+ReadingsNum($NAME, &#039;frame_1_data_8&#039;, 0)) / 10.0 \&lt;br /&gt;
	} else {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;SoE&#039;, 0)\&lt;br /&gt;
	}\&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Topos</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Ora_Funky_Cat&amp;diff=39250</id>
		<title>Ora Funky Cat</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Ora_Funky_Cat&amp;diff=39250"/>
		<updated>2024-04-20T20:00:25Z</updated>

		<summary type="html">&lt;p&gt;Topos: Neue Seite für die Einbindung des E-Autos Ora Funky Cat in FHEM angelegt&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Auf dieser Seite wird die EInbindung des E-Autos [https://www.ora-motor.de/ Ora Funky Cat] von GWM (Great Wall Motors aus China) in FHEM über die ODB2-Serviceschnittestelle erläutert.&lt;br /&gt;
&lt;br /&gt;
Benötigte Hardware: [https://www.meatpi.com/products/wican MeatPi WiCAN-OBD-C3 Dongle]&lt;br /&gt;
&lt;br /&gt;
Der WiCAN wird in die ODB2-Serviceschnittestelle (neben Sicherungsfach unterhalb Lenkrad) gesteckt. Er kann sich über WLAN mit eine MQTT-Server verbinden.&lt;br /&gt;
&lt;br /&gt;
Die Integration eines MQTT-Servers in FHEM wird [[MQTT|hier]] erklärt.&lt;br /&gt;
&lt;br /&gt;
Ist das Auto eingeschalten und der Dongle gesteckt dann könne über FHEM Fahrzeugwerte abgefragt werden. Hier eine beispielhafte EInrichtung eine MQTT-Devices. Der Ausdruck &amp;quot;XXXXXXXX&amp;quot; muss durch die Identnummer des WiCAN ersetzt werden&amp;lt;syntaxhighlight lang=&amp;quot;cfg&amp;quot;&amp;gt;&lt;br /&gt;
define wican MQTT2_DEVICE&lt;br /&gt;
attr wican alias Ora&lt;br /&gt;
attr wican stateFormat B: SoC% M: Mileage km (status)&lt;br /&gt;
attr wican event-on-change-reading status&lt;br /&gt;
attr wican event-on-update-reading frame_1_data_6,SoC&lt;br /&gt;
attr wican DbLogExclude .*&lt;br /&gt;
attr wican DbLogInclude SoC:3600&lt;br /&gt;
attr wican readingList wican/XXXXXXXX/status:.* {json2nameValue($EVENT)}\&lt;br /&gt;
 wican/XXXXXXXX/can/rx:.* {json2nameValue($EVENT)}&lt;br /&gt;
attr wican setList read_SoC:noArg wican/XXXXXXXX/can/tx {&amp;quot;bus&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;tx&amp;quot;,&amp;quot;ts&amp;quot;:49539,&amp;quot;frame&amp;quot;:[{&amp;quot;id&amp;quot;:1931,&amp;quot;dlc&amp;quot;:8,&amp;quot;rtr&amp;quot;:false,&amp;quot;extd&amp;quot;:false,&amp;quot;data&amp;quot;:[3,34,32,80,170,170,170,170]}]}\&lt;br /&gt;
read_TrueSoC:noArg wican/XXXXXXXX/can/tx {&amp;quot;bus&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;tx&amp;quot;,&amp;quot;ts&amp;quot;:27825,&amp;quot;frame&amp;quot;:[{&amp;quot;id&amp;quot;:1931,&amp;quot;dlc&amp;quot;:8,&amp;quot;rtr&amp;quot;:false,&amp;quot;extd&amp;quot;:false,&amp;quot;data&amp;quot;:[3,34,3,8,170,170,170,170]}]}\&lt;br /&gt;
read_SoH:noArg wican/XXXXXXXX/can/tx {&amp;quot;bus&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;tx&amp;quot;,&amp;quot;ts&amp;quot;:12016,&amp;quot;frame&amp;quot;:[{&amp;quot;id&amp;quot;:1931,&amp;quot;dlc&amp;quot;:8,&amp;quot;rtr&amp;quot;:false,&amp;quot;extd&amp;quot;:false,&amp;quot;data&amp;quot;:[3,34,32,81,170,170,170,170]}]}\&lt;br /&gt;
read_SoE:noArg wican/XXXXXXXX/can/tx {&amp;quot;bus&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;tx&amp;quot;,&amp;quot;ts&amp;quot;:17777,&amp;quot;frame&amp;quot;:[{&amp;quot;id&amp;quot;:1930,&amp;quot;dlc&amp;quot;:8,&amp;quot;rtr&amp;quot;:false,&amp;quot;extd&amp;quot;:false,&amp;quot;data&amp;quot;:[3,34,208,98,170,170,170,170]}]}\&lt;br /&gt;
read_OpVoltage:noArg wican/XXXXXXXX/can/tx {&amp;quot;bus&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;tx&amp;quot;,&amp;quot;ts&amp;quot;:17645,&amp;quot;frame&amp;quot;:[{&amp;quot;id&amp;quot;:1931,&amp;quot;dlc&amp;quot;:8,&amp;quot;rtr&amp;quot;:false,&amp;quot;extd&amp;quot;:false,&amp;quot;data&amp;quot;:[3,34,208,3,170,170,170,170]}]}\&lt;br /&gt;
read_Mileage:noArg wican/XXXXXXXX/can/tx {&amp;quot;bus&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;tx&amp;quot;,&amp;quot;ts&amp;quot;:35674,&amp;quot;frame&amp;quot;:[{&amp;quot;id&amp;quot;:1931,&amp;quot;dlc&amp;quot;:8,&amp;quot;rtr&amp;quot;:false,&amp;quot;extd&amp;quot;:false,&amp;quot;data&amp;quot;:[3,34,208,4,170,170,170,170]}]}\&lt;br /&gt;
read_TotalCharge:noArg wican/XXXXXXXX/can/tx {&amp;quot;bus&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;tx&amp;quot;,&amp;quot;ts&amp;quot;:28695,&amp;quot;frame&amp;quot;:[{&amp;quot;id&amp;quot;:1931,&amp;quot;dlc&amp;quot;:8,&amp;quot;rtr&amp;quot;:false,&amp;quot;extd&amp;quot;:false,&amp;quot;data&amp;quot;:[3,34,33,113,170,170,170,170]}]}\&lt;br /&gt;
read_TotalDischarge:noArg wican/XXXXXXXX/can/tx {&amp;quot;bus&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;tx&amp;quot;,&amp;quot;ts&amp;quot;:28695,&amp;quot;frame&amp;quot;:[{&amp;quot;id&amp;quot;:1931,&amp;quot;dlc&amp;quot;:8,&amp;quot;rtr&amp;quot;:false,&amp;quot;extd&amp;quot;:false,&amp;quot;data&amp;quot;:[3,34,33,114,170,170,170,170]}]}\&lt;br /&gt;
read_BatteryVoltage:noArg wican/XXXXXXXX/can/tx {&amp;quot;bus&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;tx&amp;quot;,&amp;quot;ts&amp;quot;:58591,&amp;quot;frame&amp;quot;:[{&amp;quot;id&amp;quot;:1931,&amp;quot;dlc&amp;quot;:8,&amp;quot;rtr&amp;quot;:false,&amp;quot;extd&amp;quot;:false,&amp;quot;data&amp;quot;:[3,34,32,3,170,170,170,170]}]}&lt;br /&gt;
attr wican userReadings SoC:frame_1_data_6:.* {\&lt;br /&gt;
	if (ReadingsNum($NAME, &#039;frame_1_id&#039;, 0) == 1995 and ReadingsNum($NAME, &#039;frame_1_data_1&#039;, 0)  == 5 and ReadingsNum($NAME, &#039;frame_1_data_2&#039;, 0)  == 98\&lt;br /&gt;
      and ReadingsNum($NAME, &#039;frame_1_data_3&#039;, 0)  == 32 and ReadingsNum($NAME, &#039;frame_1_data_4&#039;, 0)  == 80 ) {\&lt;br /&gt;
		return (ReadingsNum($NAME, &#039;frame_1_data_5&#039;, 0) * 256+ReadingsNum($NAME, &#039;frame_1_data_6&#039;, 0))/10.0\&lt;br /&gt;
	} else {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;SoC&#039;, 0)\&lt;br /&gt;
	}\&lt;br /&gt;
},\&lt;br /&gt;
SoH:frame_1_data_6:.* {\&lt;br /&gt;
	if (ReadingsNum($NAME, &#039;frame_1_id&#039;, 0) == 1995 and ReadingsNum($NAME, &#039;frame_1_data_1&#039;, 0)  == 5 and ReadingsNum($NAME, &#039;frame_1_data_2&#039;, 0)  == 98\&lt;br /&gt;
      and ReadingsNum($NAME, &#039;frame_1_data_3&#039;, 0)  == 32 and ReadingsNum($NAME, &#039;frame_1_data_4&#039;, 0)  == 81 ) {\&lt;br /&gt;
		return (ReadingsNum($NAME, &#039;frame_1_data_5&#039;, 0) * 256 + ReadingsNum($NAME, &#039;frame_1_data_6&#039;, 0))/10.0\&lt;br /&gt;
	} else {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;SoH&#039;, 0)\&lt;br /&gt;
	}\&lt;br /&gt;
},\&lt;br /&gt;
TrueSoC:frame_1_data_6:.* {\&lt;br /&gt;
	if (ReadingsNum($NAME, &#039;frame_1_id&#039;, 0) == 1995 and ReadingsNum($NAME, &#039;frame_1_data_3&#039;, 0)  == 3) {\&lt;br /&gt;
		return (ReadingsNum($NAME, &#039;frame_1_data_5&#039;, 0) * 256 + ReadingsNum($NAME, &#039;frame_1_data_6&#039;, 0))/10.0\&lt;br /&gt;
	} else {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;TrueSoC&#039;, 0)\&lt;br /&gt;
	}\&lt;br /&gt;
},\&lt;br /&gt;
Mileage:frame_1_data_6:.* {\&lt;br /&gt;
	if (ReadingsNum($NAME, &#039;frame_1_id&#039;, 0) == 1995 and ReadingsNum($NAME, &#039;frame_1_data_1&#039;, 0)  == 6 and ReadingsNum($NAME, &#039;frame_1_data_2&#039;, 0)  == 98\&lt;br /&gt;
      and ReadingsNum($NAME, &#039;frame_1_data_3&#039;, 0)  == 208 ) {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;frame_1_data_6&#039;, 0) * 256 + ReadingsNum($NAME, &#039;frame_1_data_7&#039;, 0)\&lt;br /&gt;
	} else {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;Mileage&#039;, 0)\&lt;br /&gt;
	}\&lt;br /&gt;
},\&lt;br /&gt;
OperatingVoltage:frame_1_data_6:.* {\&lt;br /&gt;
	if (ReadingsNum($NAME, &#039;frame_1_id&#039;, 0) == 1995 and ReadingsNum($NAME, &#039;frame_1_data_1&#039;, 0)  == 4 and ReadingsNum($NAME, &#039;frame_1_data_2&#039;, 0)  == 98\&lt;br /&gt;
      and ReadingsNum($NAME, &#039;frame_1_data_3&#039;, 0)  == 208 ) {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;frame_1_data_5&#039;, 0) /10.0\&lt;br /&gt;
	} else {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;OperatingVoltage&#039;, 0)\&lt;br /&gt;
	}\&lt;br /&gt;
},\&lt;br /&gt;
TotalCharge:frame_1_data_6:.* {\&lt;br /&gt;
	if (ReadingsNum($NAME, &#039;frame_1_id&#039;, 0) == 1995 and ReadingsNum($NAME, &#039;frame_1_data_1&#039;, 0)  == 7 and ReadingsNum($NAME, &#039;frame_1_data_2&#039;, 0)  == 98\&lt;br /&gt;
      and ReadingsNum($NAME, &#039;frame_1_data_3&#039;, 0)  == 33 and ReadingsNum($NAME, &#039;frame_1_data_4&#039;, 0)  == 113 ) {\&lt;br /&gt;
		return round( 5000 * ( 2 * ReadingsNum($NAME, &#039;frame_1_data_7&#039;, 0) + ReadingsNum($NAME, &#039;frame_1_data_8&#039;, 0) / 128) , 0)\&lt;br /&gt;
	} else {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;TotalCharge&#039;, 0)\&lt;br /&gt;
	}\&lt;br /&gt;
},\&lt;br /&gt;
TotalDischarge:frame_1_data_6:.* {\&lt;br /&gt;
	if (ReadingsNum($NAME, &#039;frame_1_id&#039;, 0) == 1995 and ReadingsNum($NAME, &#039;frame_1_data_1&#039;, 0)  == 7 and ReadingsNum($NAME, &#039;frame_1_data_2&#039;, 0)  == 98\&lt;br /&gt;
  and ReadingsNum($NAME, &#039;frame_1_data_3&#039;, 0)  == 33 and ReadingsNum($NAME, &#039;frame_1_data_4&#039;, 0)  == 114 ) {\&lt;br /&gt;
		return round( 5000 * ( 2 * ReadingsNum($NAME, &#039;frame_1_data_7&#039;, 0) + ReadingsNum($NAME, &#039;frame_1_data_8&#039;, 0) / 128) , 0)\&lt;br /&gt;
	} else {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;TotalDischarge&#039;, 0)\&lt;br /&gt;
	}\&lt;br /&gt;
},\&lt;br /&gt;
BatteryVoltage:frame_1_data_6:.* {\&lt;br /&gt;
	if (ReadingsNum($NAME, &#039;frame_1_id&#039;, 0) == 1995 and ReadingsNum($NAME, &#039;frame_1_data_1&#039;, 0)  == 16 and ReadingsNum($NAME, &#039;frame_1_data_2&#039;, 0)  == 9\&lt;br /&gt;
      and ReadingsNum($NAME, &#039;frame_1_data_3&#039;, 0)  == 98 and ReadingsNum($NAME, &#039;frame_1_data_4&#039;, 0)  == 32 ) {\&lt;br /&gt;
		return ( 256 * ReadingsNum($NAME, &#039;frame_1_data_6&#039;, 0) + ReadingsNum($NAME, &#039;frame_1_data_7&#039;, 0)) / 10.0 \&lt;br /&gt;
	} else {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;BatteryVoltage&#039;, 0)\&lt;br /&gt;
	}\&lt;br /&gt;
},\&lt;br /&gt;
SoE:frame_1_data_6:.* {\&lt;br /&gt;
	if (ReadingsNum($NAME, &#039;frame_1_id&#039;, 0) == 1994 and ReadingsNum($NAME, &#039;frame_1_data_1&#039;, 0)  == 7 and ReadingsNum($NAME, &#039;frame_1_data_2&#039;, 0)  == 98\&lt;br /&gt;
      and ReadingsNum($NAME, &#039;frame_1_data_3&#039;, 0)  == 208 and ReadingsNum($NAME, &#039;frame_1_data_4&#039;, 0)  == 98 ) {\&lt;br /&gt;
		return (256*ReadingsNum($NAME, &#039;frame_1_data_7&#039;, 0)+ReadingsNum($NAME, &#039;frame_1_data_8&#039;, 0)) / 10.0 \&lt;br /&gt;
	} else {\&lt;br /&gt;
		return ReadingsNum($NAME, &#039;SoE&#039;, 0)\&lt;br /&gt;
	}\&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Topos</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Webasto_Next&amp;diff=39230</id>
		<title>Webasto Next</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Webasto_Next&amp;diff=39230"/>
		<updated>2024-04-14T17:47:39Z</updated>

		<summary type="html">&lt;p&gt;Topos: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Die Wallbox Webasto Next kann per LAN oder WLAN über das Modebus-Protokoll ausgelesen und gesteuert werden.&lt;br /&gt;
&lt;br /&gt;
Hier eine mögliche Konfiguration:&amp;lt;syntaxhighlight lang=&amp;quot;cfg&amp;quot;&amp;gt;&lt;br /&gt;
define WebastoNext ModbusAttr 1 3 [IP-Addresse]:502 TCP&lt;br /&gt;
attr WebastoNext alias Wallbox&lt;br /&gt;
attr WebastoNext icon wallbox&lt;br /&gt;
attr WebastoNext stateFormat Charge_Point_State_TXT&amp;lt;br&amp;gt;Cable_State_TXT&amp;lt;br&amp;gt;Charge_State_TXT: Charge_Active_Power W&lt;br /&gt;
attr WebastoNext event-on-update-reading .*&lt;br /&gt;
attr WebastoNext DbLogExclude .*&lt;br /&gt;
attr WebastoNext DbLogInclude Charge_Active_Power:600&lt;br /&gt;
attr WebastoNext oldreadings Cable_State&lt;br /&gt;
attr WebastoNext obj-i1000-poll 1&lt;br /&gt;
attr WebastoNext obj-i1000-reading Charge_Point_State&lt;br /&gt;
attr WebastoNext obj-i1000-type unsigned short big&lt;br /&gt;
attr WebastoNext obj-i1001-poll 1&lt;br /&gt;
attr WebastoNext obj-i1001-reading Charge_State&lt;br /&gt;
attr WebastoNext obj-i1001-type unsigned short big&lt;br /&gt;
attr WebastoNext obj-i1004-poll 1&lt;br /&gt;
attr WebastoNext obj-i1004-reading Cable_State&lt;br /&gt;
attr WebastoNext obj-i1004-type unsigned short big&lt;br /&gt;
attr WebastoNext obj-i1006-poll 1&lt;br /&gt;
attr WebastoNext obj-i1006-reading Error_Code&lt;br /&gt;
attr WebastoNext obj-i1006-type unsigned short big&lt;br /&gt;
attr WebastoNext obj-i1008-poll 1&lt;br /&gt;
attr WebastoNext obj-i1008-reading Charge_Active_Current_L1&lt;br /&gt;
attr WebastoNext obj-i1008-type unsigned short big&lt;br /&gt;
attr WebastoNext obj-i1008-expr $val/1000&lt;br /&gt;
attr WebastoNext obj-i1010-poll 1&lt;br /&gt;
attr WebastoNext obj-i1010-reading Charge_Active_Current_L2&lt;br /&gt;
attr WebastoNext obj-i1010-type unsigned short big&lt;br /&gt;
attr WebastoNext obj-i1010-expr $val/1000&lt;br /&gt;
attr WebastoNext obj-i1012-poll 1&lt;br /&gt;
attr WebastoNext obj-i1012-reading Charge_Active_Current_L3&lt;br /&gt;
attr WebastoNext obj-i1012-type unsigned short big&lt;br /&gt;
attr WebastoNext obj-i1012-expr $val/1000&lt;br /&gt;
attr WebastoNext obj-i1020-poll 1&lt;br /&gt;
attr WebastoNext obj-i1020-reading Charge_Active_Power&lt;br /&gt;
attr WebastoNext obj-i1020-type unsigned long big&lt;br /&gt;
attr WebastoNext obj-i1024-reading Charge_Active_Power_L1&lt;br /&gt;
attr WebastoNext obj-i1024-poll 1&lt;br /&gt;
attr WebastoNext obj-i1024-type unsigned long big&lt;br /&gt;
attr WebastoNext obj-i1028-reading Charge_Active_Power_L2&lt;br /&gt;
attr WebastoNext obj-i1028-poll 1&lt;br /&gt;
attr WebastoNext obj-i1028-type unsigned long big&lt;br /&gt;
attr WebastoNext obj-i1032-reading Charge_Active_Power_L3&lt;br /&gt;
attr WebastoNext obj-i1032-poll 1&lt;br /&gt;
attr WebastoNext obj-i1032-type unsigned long big&lt;br /&gt;
attr WebastoNext obj-i1036-reading Energy_Meter&lt;br /&gt;
attr WebastoNext obj-i1036-poll 1&lt;br /&gt;
attr WebastoNext obj-i1036-type unsigned long big&lt;br /&gt;
attr WebastoNext obj-i1036-expr $val/1000&lt;br /&gt;
&lt;br /&gt;
attr WebastoNext obj-i1102-reading Min_Current&lt;br /&gt;
attr WebastoNext obj-i1102-poll 1&lt;br /&gt;
attr WebastoNext obj-i1102-type unsigned short big&lt;br /&gt;
attr WebastoNext obj-i1108-reading EV_Max_Current&lt;br /&gt;
attr WebastoNext obj-i1108-poll 1&lt;br /&gt;
attr WebastoNext obj-i1108-type unsigned short big&lt;br /&gt;
attr WebastoNext obj-i1502-reading Charged_Energy&lt;br /&gt;
attr WebastoNext obj-i1502-poll 1&lt;br /&gt;
attr WebastoNext obj-i1502-type unsigned short big&lt;br /&gt;
attr WebastoNext obj-i1502-expr $val/1000&lt;br /&gt;
attr WebastoNext obj-i1504-reading Charging_Start_Time&lt;br /&gt;
attr WebastoNext obj-i1504-poll 1&lt;br /&gt;
attr WebastoNext obj-i1504-type unsigned long big&lt;br /&gt;
attr WebastoNext obj-i1508-reading Charging_Time&lt;br /&gt;
attr WebastoNext obj-i1508-poll 1&lt;br /&gt;
attr WebastoNext obj-i1508-type unsigned long big&lt;br /&gt;
attr WebastoNext obj-i1512-reading Charging_End_Time&lt;br /&gt;
attr WebastoNext obj-i1512-poll 1&lt;br /&gt;
attr WebastoNext obj-i1512-type unsigned long big&lt;br /&gt;
attr WebastoNext obj-i1620-reading Smart_Vehicle_Detected&lt;br /&gt;
attr WebastoNext obj-i1620-poll 1&lt;br /&gt;
attr WebastoNext obj-i1620-type unsigned short big&lt;br /&gt;
&lt;br /&gt;
attr WebastoNext obj-h2000-reading Safe_Current&lt;br /&gt;
attr WebastoNext obj-h2000-poll 1&lt;br /&gt;
attr WebastoNext obj-h2000-polldelay 600&lt;br /&gt;
attr WebastoNext obj-h2000-type unsigned short big&lt;br /&gt;
attr WebastoNext obj-h2000-set 1&lt;br /&gt;
attr WebastoNext obj-h2000-min 0&lt;br /&gt;
attr WebastoNext obj-h2000-max 16&lt;br /&gt;
&lt;br /&gt;
attr WebastoNext obj-h2002-reading Com_Timeout&lt;br /&gt;
attr WebastoNext obj-h2002-poll 1&lt;br /&gt;
attr WebastoNext obj-h2002-polldelay x199&lt;br /&gt;
attr WebastoNext obj-h2002-type unsigned short big&lt;br /&gt;
attr WebastoNext obj-h2002-set 1&lt;br /&gt;
&lt;br /&gt;
attr WebastoNext obj-h5000-reading Charge_Power_Set&lt;br /&gt;
attr WebastoNext obj-h5000-poll 0&lt;br /&gt;
attr WebastoNext obj-h5000-type unsigned long big&lt;br /&gt;
attr WebastoNext obj-h5000-set 1&lt;br /&gt;
&lt;br /&gt;
attr WebastoNext obj-h5004-reading Charge_Current_Set&lt;br /&gt;
attr WebastoNext obj-h5004-poll 0&lt;br /&gt;
attr WebastoNext obj-h5004-type signed short big&lt;br /&gt;
attr WebastoNext obj-h5004-set 1&lt;br /&gt;
attr WebastoNext obj-h5004-min 0&lt;br /&gt;
attr WebastoNext obj-h5004-max 16&lt;br /&gt;
&lt;br /&gt;
attr WebastoNext obj-h5006-reading Start_Cancel&lt;br /&gt;
attr WebastoNext obj-h5006-poll 0&lt;br /&gt;
attr WebastoNext obj-h5006-type unsigned short big&lt;br /&gt;
attr WebastoNext obj-h5006-set 1&lt;br /&gt;
attr WebastoNext obj-h5006-min 0&lt;br /&gt;
attr WebastoNext obj-h5006-max 2&lt;br /&gt;
attr WebastoNext obj-h5006-hint 0,1,2&lt;br /&gt;
&lt;br /&gt;
attr WebastoNext obj-h6000-reading Life_Bit&lt;br /&gt;
attr WebastoNext obj-h6000-poll 1&lt;br /&gt;
attr WebastoNext obj-h6000-type unsigned short big&lt;br /&gt;
attr WebastoNext obj-h6000-set 1&lt;br /&gt;
&lt;br /&gt;
attr WebastoNext userReadings \&lt;br /&gt;
Charge_Point_State_TXT:Charge_Point_State\b.* {my $val = ReadingsVal (&amp;quot;WebastoNext&amp;quot;,&amp;quot;Charge_Point_State&amp;quot;, 0);; if ($val == 0) {return &amp;quot;no vehicle attached (EVSE available, EVSE unavailable)&amp;quot;} elsif ($val == 1) {return &amp;quot;vehicle attached, no permission (preparing)&amp;quot;} elsif ($val == 3) {return &amp;quot;charging&amp;quot;} elsif ($val == 4) {return &amp;quot;charging paused (suspending EVSE, suspending EV, finishing)&amp;quot;} elsif ($val == 7) {return &amp;quot;charging error&amp;quot;} elsif ($val == 8) {return &amp;quot;charging station reserved&amp;quot;} else { return $val .&amp;quot; undefined&amp;quot; };;},\&lt;br /&gt;
Cable_State_TXT:Cable_State\b.* {my $val = ReadingsVal (&amp;quot;WebastoNext&amp;quot;,&amp;quot;Cable_State&amp;quot;, 0);; if ($val == 0) {return &amp;quot;no cable attached&amp;quot;} elsif ($val == 1) {return &amp;quot;cable attached (no car attached)&amp;quot;} elsif ($val == 2) {return &amp;quot;cable attached (car attached)&amp;quot;} elsif ($val == 3) {return &amp;quot;cable attached (car attached) + lock active&amp;quot;} else { return $val .&amp;quot; undefined&amp;quot; };;}, \&lt;br /&gt;
Charge_State_TXT:Charge_State\b.* {my $val = ReadingsVal (&amp;quot;WebastoNext&amp;quot;,&amp;quot;Charge_State&amp;quot;, 0);; if ($val == 0) {return &amp;quot;idle&amp;quot;} elsif ($val == 1) {return &amp;quot;charging&amp;quot;} else { return $val .&amp;quot; undefined&amp;quot; };;}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Steuerung ===&lt;br /&gt;
Das Register Charge_Power_Set wird nur berücksichtigt, wenn Charge_Current_Set auf 0 gesetzt ist. Mindestladestromstärke ist 6 A bzw. 4200 W.&lt;br /&gt;
&lt;br /&gt;
Die Wallbox reagiert nur dann auf die Steuerung, wenn ein regelmäßiges Keep-Alive-Bit gesetzt wird. Ansonsten wird der Lademodus mit dem Wert &amp;quot;Safe_Current&amp;quot; gestartet.&amp;lt;syntaxhighlight lang=&amp;quot;cfg&amp;quot;&amp;gt;&lt;br /&gt;
define WebastoNext_KeepAlive at +*00:00:30 set WebastoNext Life_Bit 1&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Gestartet wird der Ladvorgang mit &amp;quot;set WebastoNext Start_Cancel 1&amp;quot;. Gestoppt wird mit &amp;quot;set WebastoNext Start_Cancel 2&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Wallboxen]]&lt;/div&gt;</summary>
		<author><name>Topos</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Webasto_Next&amp;diff=39229</id>
		<title>Webasto Next</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Webasto_Next&amp;diff=39229"/>
		<updated>2024-04-14T17:46:50Z</updated>

		<summary type="html">&lt;p&gt;Topos: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Die Wallbox Webasto Next kann per LAN oder WLAN über das Modebus-Protokoll ausgelesen und gesteuert werden.&lt;br /&gt;
&lt;br /&gt;
Hier eine mögliche Konfiguration:&amp;lt;syntaxhighlight lang=&amp;quot;cfg&amp;quot;&amp;gt;&lt;br /&gt;
define WebastoNext ModbusAttr 1 3 [IP-Addresse]:502 TCP&lt;br /&gt;
attr WebastoNext alias Wallbox&lt;br /&gt;
attr WebastoNext icon wallbox&lt;br /&gt;
attr WebastoNext stateFormat Charge_Point_State_TXT&amp;lt;br&amp;gt;Cable_State_TXT&amp;lt;br&amp;gt;Charge_State_TXT: Charge_Active_Power W&lt;br /&gt;
attr WebastoNext event-on-update-reading .*&lt;br /&gt;
attr WebastoNext DbLogExclude .*&lt;br /&gt;
attr WebastoNext DbLogInclude Charge_Active_Power:600,HEMS_PV.*:300,HEMS_State:300&lt;br /&gt;
attr WebastoNext oldreadings Cable_State&lt;br /&gt;
attr WebastoNext obj-i1000-poll 1&lt;br /&gt;
attr WebastoNext obj-i1000-reading Charge_Point_State&lt;br /&gt;
attr WebastoNext obj-i1000-type unsigned short big&lt;br /&gt;
attr WebastoNext obj-i1001-poll 1&lt;br /&gt;
attr WebastoNext obj-i1001-reading Charge_State&lt;br /&gt;
attr WebastoNext obj-i1001-type unsigned short big&lt;br /&gt;
attr WebastoNext obj-i1004-poll 1&lt;br /&gt;
attr WebastoNext obj-i1004-reading Cable_State&lt;br /&gt;
attr WebastoNext obj-i1004-type unsigned short big&lt;br /&gt;
attr WebastoNext obj-i1006-poll 1&lt;br /&gt;
attr WebastoNext obj-i1006-reading Error_Code&lt;br /&gt;
attr WebastoNext obj-i1006-type unsigned short big&lt;br /&gt;
attr WebastoNext obj-i1008-poll 1&lt;br /&gt;
attr WebastoNext obj-i1008-reading Charge_Active_Current_L1&lt;br /&gt;
attr WebastoNext obj-i1008-type unsigned short big&lt;br /&gt;
attr WebastoNext obj-i1008-expr $val/1000&lt;br /&gt;
attr WebastoNext obj-i1010-poll 1&lt;br /&gt;
attr WebastoNext obj-i1010-reading Charge_Active_Current_L2&lt;br /&gt;
attr WebastoNext obj-i1010-type unsigned short big&lt;br /&gt;
attr WebastoNext obj-i1010-expr $val/1000&lt;br /&gt;
attr WebastoNext obj-i1012-poll 1&lt;br /&gt;
attr WebastoNext obj-i1012-reading Charge_Active_Current_L3&lt;br /&gt;
attr WebastoNext obj-i1012-type unsigned short big&lt;br /&gt;
attr WebastoNext obj-i1012-expr $val/1000&lt;br /&gt;
attr WebastoNext obj-i1020-poll 1&lt;br /&gt;
attr WebastoNext obj-i1020-reading Charge_Active_Power&lt;br /&gt;
attr WebastoNext obj-i1020-type unsigned long big&lt;br /&gt;
attr WebastoNext obj-i1024-reading Charge_Active_Power_L1&lt;br /&gt;
attr WebastoNext obj-i1024-poll 1&lt;br /&gt;
attr WebastoNext obj-i1024-type unsigned long big&lt;br /&gt;
attr WebastoNext obj-i1028-reading Charge_Active_Power_L2&lt;br /&gt;
attr WebastoNext obj-i1028-poll 1&lt;br /&gt;
attr WebastoNext obj-i1028-type unsigned long big&lt;br /&gt;
attr WebastoNext obj-i1032-reading Charge_Active_Power_L3&lt;br /&gt;
attr WebastoNext obj-i1032-poll 1&lt;br /&gt;
attr WebastoNext obj-i1032-type unsigned long big&lt;br /&gt;
attr WebastoNext obj-i1036-reading Energy_Meter&lt;br /&gt;
attr WebastoNext obj-i1036-poll 1&lt;br /&gt;
attr WebastoNext obj-i1036-type unsigned long big&lt;br /&gt;
attr WebastoNext obj-i1036-expr $val/1000&lt;br /&gt;
&lt;br /&gt;
attr WebastoNext obj-i1102-reading Min_Current&lt;br /&gt;
attr WebastoNext obj-i1102-poll 1&lt;br /&gt;
attr WebastoNext obj-i1102-type unsigned short big&lt;br /&gt;
attr WebastoNext obj-i1108-reading EV_Max_Current&lt;br /&gt;
attr WebastoNext obj-i1108-poll 1&lt;br /&gt;
attr WebastoNext obj-i1108-type unsigned short big&lt;br /&gt;
attr WebastoNext obj-i1502-reading Charged_Energy&lt;br /&gt;
attr WebastoNext obj-i1502-poll 1&lt;br /&gt;
attr WebastoNext obj-i1502-type unsigned short big&lt;br /&gt;
attr WebastoNext obj-i1502-expr $val/1000&lt;br /&gt;
attr WebastoNext obj-i1504-reading Charging_Start_Time&lt;br /&gt;
attr WebastoNext obj-i1504-poll 1&lt;br /&gt;
attr WebastoNext obj-i1504-type unsigned long big&lt;br /&gt;
attr WebastoNext obj-i1508-reading Charging_Time&lt;br /&gt;
attr WebastoNext obj-i1508-poll 1&lt;br /&gt;
attr WebastoNext obj-i1508-type unsigned long big&lt;br /&gt;
attr WebastoNext obj-i1512-reading Charging_End_Time&lt;br /&gt;
attr WebastoNext obj-i1512-poll 1&lt;br /&gt;
attr WebastoNext obj-i1512-type unsigned long big&lt;br /&gt;
attr WebastoNext obj-i1620-reading Smart_Vehicle_Detected&lt;br /&gt;
attr WebastoNext obj-i1620-poll 1&lt;br /&gt;
attr WebastoNext obj-i1620-type unsigned short big&lt;br /&gt;
&lt;br /&gt;
attr WebastoNext obj-h2000-reading Safe_Current&lt;br /&gt;
attr WebastoNext obj-h2000-poll 1&lt;br /&gt;
attr WebastoNext obj-h2000-polldelay 600&lt;br /&gt;
attr WebastoNext obj-h2000-type unsigned short big&lt;br /&gt;
attr WebastoNext obj-h2000-set 1&lt;br /&gt;
attr WebastoNext obj-h2000-min 0&lt;br /&gt;
attr WebastoNext obj-h2000-max 16&lt;br /&gt;
&lt;br /&gt;
attr WebastoNext obj-h2002-reading Com_Timeout&lt;br /&gt;
attr WebastoNext obj-h2002-poll 1&lt;br /&gt;
attr WebastoNext obj-h2002-polldelay x199&lt;br /&gt;
attr WebastoNext obj-h2002-type unsigned short big&lt;br /&gt;
attr WebastoNext obj-h2002-set 1&lt;br /&gt;
&lt;br /&gt;
attr WebastoNext obj-h5000-reading Charge_Power_Set&lt;br /&gt;
attr WebastoNext obj-h5000-poll 0&lt;br /&gt;
attr WebastoNext obj-h5000-type unsigned long big&lt;br /&gt;
attr WebastoNext obj-h5000-set 1&lt;br /&gt;
&lt;br /&gt;
attr WebastoNext obj-h5004-reading Charge_Current_Set&lt;br /&gt;
attr WebastoNext obj-h5004-poll 0&lt;br /&gt;
attr WebastoNext obj-h5004-type signed short big&lt;br /&gt;
attr WebastoNext obj-h5004-set 1&lt;br /&gt;
attr WebastoNext obj-h5004-min 0&lt;br /&gt;
attr WebastoNext obj-h5004-max 16&lt;br /&gt;
&lt;br /&gt;
attr WebastoNext obj-h5006-reading Start_Cancel&lt;br /&gt;
attr WebastoNext obj-h5006-poll 0&lt;br /&gt;
attr WebastoNext obj-h5006-type unsigned short big&lt;br /&gt;
attr WebastoNext obj-h5006-set 1&lt;br /&gt;
attr WebastoNext obj-h5006-min 0&lt;br /&gt;
attr WebastoNext obj-h5006-max 2&lt;br /&gt;
attr WebastoNext obj-h5006-hint 0,1,2&lt;br /&gt;
&lt;br /&gt;
attr WebastoNext obj-h6000-reading Life_Bit&lt;br /&gt;
attr WebastoNext obj-h6000-poll 1&lt;br /&gt;
attr WebastoNext obj-h6000-type unsigned short big&lt;br /&gt;
attr WebastoNext obj-h6000-set 1&lt;br /&gt;
&lt;br /&gt;
attr WebastoNext userReadings \&lt;br /&gt;
Charge_Point_State_TXT:Charge_Point_State\b.* {my $val = ReadingsVal (&amp;quot;WebastoNext&amp;quot;,&amp;quot;Charge_Point_State&amp;quot;, 0);; if ($val == 0) {return &amp;quot;no vehicle attached (EVSE available, EVSE unavailable)&amp;quot;} elsif ($val == 1) {return &amp;quot;vehicle attached, no permission (preparing)&amp;quot;} elsif ($val == 3) {return &amp;quot;charging&amp;quot;} elsif ($val == 4) {return &amp;quot;charging paused (suspending EVSE, suspending EV, finishing)&amp;quot;} elsif ($val == 7) {return &amp;quot;charging error&amp;quot;} elsif ($val == 8) {return &amp;quot;charging station reserved&amp;quot;} else { return $val .&amp;quot; undefined&amp;quot; };;},\&lt;br /&gt;
Cable_State_TXT:Cable_State\b.* {my $val = ReadingsVal (&amp;quot;WebastoNext&amp;quot;,&amp;quot;Cable_State&amp;quot;, 0);; if ($val == 0) {return &amp;quot;no cable attached&amp;quot;} elsif ($val == 1) {return &amp;quot;cable attached (no car attached)&amp;quot;} elsif ($val == 2) {return &amp;quot;cable attached (car attached)&amp;quot;} elsif ($val == 3) {return &amp;quot;cable attached (car attached) + lock active&amp;quot;} else { return $val .&amp;quot; undefined&amp;quot; };;}, \&lt;br /&gt;
Charge_State_TXT:Charge_State\b.* {my $val = ReadingsVal (&amp;quot;WebastoNext&amp;quot;,&amp;quot;Charge_State&amp;quot;, 0);; if ($val == 0) {return &amp;quot;idle&amp;quot;} elsif ($val == 1) {return &amp;quot;charging&amp;quot;} else { return $val .&amp;quot; undefined&amp;quot; };;}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Steuerung ===&lt;br /&gt;
Das Register Charge_Power_Set wird nur berücksichtigt, wenn Charge_Current_Set auf 0 gesetzt ist. Mindestladestromstärke ist 6 A bzw. 4200 W.&lt;br /&gt;
&lt;br /&gt;
Die Wallbox reagiert nur dann auf die Steuerung, wenn ein regelmäßiges Keep-Alive-Bit gesetzt wird. Ansonsten wird der Lademodus mit dem Wert &amp;quot;Safe_Current&amp;quot; gestartet.&amp;lt;syntaxhighlight lang=&amp;quot;cfg&amp;quot;&amp;gt;&lt;br /&gt;
define WebastoNext_KeepAlive at +*00:00:30 set WebastoNext Life_Bit 1&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Gestartet wird der Ladvorgang mit &amp;quot;set WebastoNext Start_Cancel 1&amp;quot;. Gestoppt wird mit &amp;quot;set WebastoNext Start_Cancel 2&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Wallboxen]]&lt;/div&gt;</summary>
		<author><name>Topos</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Webasto_Next&amp;diff=39228</id>
		<title>Webasto Next</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Webasto_Next&amp;diff=39228"/>
		<updated>2024-04-14T17:46:21Z</updated>

		<summary type="html">&lt;p&gt;Topos: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Die Wallbox Webasto Next kann per LAN oder WLAN über das Modebus-Protokoll ausgelesen und gesteuert und gesteuert werden.&lt;br /&gt;
&lt;br /&gt;
Hier eine mögliche Konfiguration:&amp;lt;syntaxhighlight lang=&amp;quot;cfg&amp;quot;&amp;gt;&lt;br /&gt;
define WebastoNext ModbusAttr 1 3 [IP-Addresse]:502 TCP&lt;br /&gt;
attr WebastoNext alias Wallbox&lt;br /&gt;
attr WebastoNext icon wallbox&lt;br /&gt;
attr WebastoNext stateFormat Charge_Point_State_TXT&amp;lt;br&amp;gt;Cable_State_TXT&amp;lt;br&amp;gt;Charge_State_TXT: Charge_Active_Power W&lt;br /&gt;
attr WebastoNext event-on-update-reading .*&lt;br /&gt;
attr WebastoNext DbLogExclude .*&lt;br /&gt;
attr WebastoNext DbLogInclude Charge_Active_Power:600,HEMS_PV.*:300,HEMS_State:300&lt;br /&gt;
attr WebastoNext oldreadings Cable_State&lt;br /&gt;
attr WebastoNext obj-i1000-poll 1&lt;br /&gt;
attr WebastoNext obj-i1000-reading Charge_Point_State&lt;br /&gt;
attr WebastoNext obj-i1000-type unsigned short big&lt;br /&gt;
attr WebastoNext obj-i1001-poll 1&lt;br /&gt;
attr WebastoNext obj-i1001-reading Charge_State&lt;br /&gt;
attr WebastoNext obj-i1001-type unsigned short big&lt;br /&gt;
attr WebastoNext obj-i1004-poll 1&lt;br /&gt;
attr WebastoNext obj-i1004-reading Cable_State&lt;br /&gt;
attr WebastoNext obj-i1004-type unsigned short big&lt;br /&gt;
attr WebastoNext obj-i1006-poll 1&lt;br /&gt;
attr WebastoNext obj-i1006-reading Error_Code&lt;br /&gt;
attr WebastoNext obj-i1006-type unsigned short big&lt;br /&gt;
attr WebastoNext obj-i1008-poll 1&lt;br /&gt;
attr WebastoNext obj-i1008-reading Charge_Active_Current_L1&lt;br /&gt;
attr WebastoNext obj-i1008-type unsigned short big&lt;br /&gt;
attr WebastoNext obj-i1008-expr $val/1000&lt;br /&gt;
attr WebastoNext obj-i1010-poll 1&lt;br /&gt;
attr WebastoNext obj-i1010-reading Charge_Active_Current_L2&lt;br /&gt;
attr WebastoNext obj-i1010-type unsigned short big&lt;br /&gt;
attr WebastoNext obj-i1010-expr $val/1000&lt;br /&gt;
attr WebastoNext obj-i1012-poll 1&lt;br /&gt;
attr WebastoNext obj-i1012-reading Charge_Active_Current_L3&lt;br /&gt;
attr WebastoNext obj-i1012-type unsigned short big&lt;br /&gt;
attr WebastoNext obj-i1012-expr $val/1000&lt;br /&gt;
attr WebastoNext obj-i1020-poll 1&lt;br /&gt;
attr WebastoNext obj-i1020-reading Charge_Active_Power&lt;br /&gt;
attr WebastoNext obj-i1020-type unsigned long big&lt;br /&gt;
attr WebastoNext obj-i1024-reading Charge_Active_Power_L1&lt;br /&gt;
attr WebastoNext obj-i1024-poll 1&lt;br /&gt;
attr WebastoNext obj-i1024-type unsigned long big&lt;br /&gt;
attr WebastoNext obj-i1028-reading Charge_Active_Power_L2&lt;br /&gt;
attr WebastoNext obj-i1028-poll 1&lt;br /&gt;
attr WebastoNext obj-i1028-type unsigned long big&lt;br /&gt;
attr WebastoNext obj-i1032-reading Charge_Active_Power_L3&lt;br /&gt;
attr WebastoNext obj-i1032-poll 1&lt;br /&gt;
attr WebastoNext obj-i1032-type unsigned long big&lt;br /&gt;
attr WebastoNext obj-i1036-reading Energy_Meter&lt;br /&gt;
attr WebastoNext obj-i1036-poll 1&lt;br /&gt;
attr WebastoNext obj-i1036-type unsigned long big&lt;br /&gt;
attr WebastoNext obj-i1036-expr $val/1000&lt;br /&gt;
&lt;br /&gt;
attr WebastoNext obj-i1102-reading Min_Current&lt;br /&gt;
attr WebastoNext obj-i1102-poll 1&lt;br /&gt;
attr WebastoNext obj-i1102-type unsigned short big&lt;br /&gt;
attr WebastoNext obj-i1108-reading EV_Max_Current&lt;br /&gt;
attr WebastoNext obj-i1108-poll 1&lt;br /&gt;
attr WebastoNext obj-i1108-type unsigned short big&lt;br /&gt;
attr WebastoNext obj-i1502-reading Charged_Energy&lt;br /&gt;
attr WebastoNext obj-i1502-poll 1&lt;br /&gt;
attr WebastoNext obj-i1502-type unsigned short big&lt;br /&gt;
attr WebastoNext obj-i1502-expr $val/1000&lt;br /&gt;
attr WebastoNext obj-i1504-reading Charging_Start_Time&lt;br /&gt;
attr WebastoNext obj-i1504-poll 1&lt;br /&gt;
attr WebastoNext obj-i1504-type unsigned long big&lt;br /&gt;
attr WebastoNext obj-i1508-reading Charging_Time&lt;br /&gt;
attr WebastoNext obj-i1508-poll 1&lt;br /&gt;
attr WebastoNext obj-i1508-type unsigned long big&lt;br /&gt;
attr WebastoNext obj-i1512-reading Charging_End_Time&lt;br /&gt;
attr WebastoNext obj-i1512-poll 1&lt;br /&gt;
attr WebastoNext obj-i1512-type unsigned long big&lt;br /&gt;
attr WebastoNext obj-i1620-reading Smart_Vehicle_Detected&lt;br /&gt;
attr WebastoNext obj-i1620-poll 1&lt;br /&gt;
attr WebastoNext obj-i1620-type unsigned short big&lt;br /&gt;
&lt;br /&gt;
attr WebastoNext obj-h2000-reading Safe_Current&lt;br /&gt;
attr WebastoNext obj-h2000-poll 1&lt;br /&gt;
attr WebastoNext obj-h2000-polldelay 600&lt;br /&gt;
attr WebastoNext obj-h2000-type unsigned short big&lt;br /&gt;
attr WebastoNext obj-h2000-set 1&lt;br /&gt;
attr WebastoNext obj-h2000-min 0&lt;br /&gt;
attr WebastoNext obj-h2000-max 16&lt;br /&gt;
&lt;br /&gt;
attr WebastoNext obj-h2002-reading Com_Timeout&lt;br /&gt;
attr WebastoNext obj-h2002-poll 1&lt;br /&gt;
attr WebastoNext obj-h2002-polldelay x199&lt;br /&gt;
attr WebastoNext obj-h2002-type unsigned short big&lt;br /&gt;
attr WebastoNext obj-h2002-set 1&lt;br /&gt;
&lt;br /&gt;
attr WebastoNext obj-h5000-reading Charge_Power_Set&lt;br /&gt;
attr WebastoNext obj-h5000-poll 0&lt;br /&gt;
attr WebastoNext obj-h5000-type unsigned long big&lt;br /&gt;
attr WebastoNext obj-h5000-set 1&lt;br /&gt;
&lt;br /&gt;
attr WebastoNext obj-h5004-reading Charge_Current_Set&lt;br /&gt;
attr WebastoNext obj-h5004-poll 0&lt;br /&gt;
attr WebastoNext obj-h5004-type signed short big&lt;br /&gt;
attr WebastoNext obj-h5004-set 1&lt;br /&gt;
attr WebastoNext obj-h5004-min 0&lt;br /&gt;
attr WebastoNext obj-h5004-max 16&lt;br /&gt;
&lt;br /&gt;
attr WebastoNext obj-h5006-reading Start_Cancel&lt;br /&gt;
attr WebastoNext obj-h5006-poll 0&lt;br /&gt;
attr WebastoNext obj-h5006-type unsigned short big&lt;br /&gt;
attr WebastoNext obj-h5006-set 1&lt;br /&gt;
attr WebastoNext obj-h5006-min 0&lt;br /&gt;
attr WebastoNext obj-h5006-max 2&lt;br /&gt;
attr WebastoNext obj-h5006-hint 0,1,2&lt;br /&gt;
&lt;br /&gt;
attr WebastoNext obj-h6000-reading Life_Bit&lt;br /&gt;
attr WebastoNext obj-h6000-poll 1&lt;br /&gt;
attr WebastoNext obj-h6000-type unsigned short big&lt;br /&gt;
attr WebastoNext obj-h6000-set 1&lt;br /&gt;
&lt;br /&gt;
attr WebastoNext userReadings \&lt;br /&gt;
Charge_Point_State_TXT:Charge_Point_State\b.* {my $val = ReadingsVal (&amp;quot;WebastoNext&amp;quot;,&amp;quot;Charge_Point_State&amp;quot;, 0);; if ($val == 0) {return &amp;quot;no vehicle attached (EVSE available, EVSE unavailable)&amp;quot;} elsif ($val == 1) {return &amp;quot;vehicle attached, no permission (preparing)&amp;quot;} elsif ($val == 3) {return &amp;quot;charging&amp;quot;} elsif ($val == 4) {return &amp;quot;charging paused (suspending EVSE, suspending EV, finishing)&amp;quot;} elsif ($val == 7) {return &amp;quot;charging error&amp;quot;} elsif ($val == 8) {return &amp;quot;charging station reserved&amp;quot;} else { return $val .&amp;quot; undefined&amp;quot; };;},\&lt;br /&gt;
Cable_State_TXT:Cable_State\b.* {my $val = ReadingsVal (&amp;quot;WebastoNext&amp;quot;,&amp;quot;Cable_State&amp;quot;, 0);; if ($val == 0) {return &amp;quot;no cable attached&amp;quot;} elsif ($val == 1) {return &amp;quot;cable attached (no car attached)&amp;quot;} elsif ($val == 2) {return &amp;quot;cable attached (car attached)&amp;quot;} elsif ($val == 3) {return &amp;quot;cable attached (car attached) + lock active&amp;quot;} else { return $val .&amp;quot; undefined&amp;quot; };;}, \&lt;br /&gt;
Charge_State_TXT:Charge_State\b.* {my $val = ReadingsVal (&amp;quot;WebastoNext&amp;quot;,&amp;quot;Charge_State&amp;quot;, 0);; if ($val == 0) {return &amp;quot;idle&amp;quot;} elsif ($val == 1) {return &amp;quot;charging&amp;quot;} else { return $val .&amp;quot; undefined&amp;quot; };;}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Steuerung ===&lt;br /&gt;
Das Register Charge_Power_Set wird nur berücksichtigt, wenn Charge_Current_Set auf 0 gesetzt ist. Mindestladestromstärke ist 6 A bzw. 4200 W.&lt;br /&gt;
&lt;br /&gt;
Die Wallbox reagiert nur dann auf die Steuerung, wenn ein regelmäßiges Keep-Alive-Bit gesetzt wird. Ansonsten wird der Lademodus mit dem Wert &amp;quot;Safe_Current&amp;quot; gestartet.&amp;lt;syntaxhighlight lang=&amp;quot;cfg&amp;quot;&amp;gt;&lt;br /&gt;
define WebastoNext_KeepAlive at +*00:00:30 set WebastoNext Life_Bit 1&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Gestartet wird der Ladvorgang mit &amp;quot;set WebastoNext Start_Cancel 1&amp;quot;. Gestoppt wird mit &amp;quot;set WebastoNext Start_Cancel 2&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Wallboxen]]&lt;/div&gt;</summary>
		<author><name>Topos</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Webasto_Next&amp;diff=39227</id>
		<title>Webasto Next</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Webasto_Next&amp;diff=39227"/>
		<updated>2024-04-14T17:45:19Z</updated>

		<summary type="html">&lt;p&gt;Topos: Code hinzugefügt&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Die Wallbox Webasto Next kann per LAN oder WLAN über das Modebus-Protokoll ausgelesen und gesteuert und gesteuert werden.&lt;br /&gt;
&lt;br /&gt;
Hier eine mögliche Konfiguration:&amp;lt;syntaxhighlight lang=&amp;quot;cfg&amp;quot;&amp;gt;&lt;br /&gt;
define WebastoNext ModbusAttr 1 3 [IP-Addresse]:502 TCP&lt;br /&gt;
attr WebastoNext alias Wallbox&lt;br /&gt;
attr WebastoNext icon wallbox&lt;br /&gt;
attr WebastoNext stateFormat Charge_Point_State_TXT&amp;lt;br&amp;gt;Cable_State_TXT&amp;lt;br&amp;gt;Charge_State_TXT: Charge_Active_Power W&lt;br /&gt;
attr WebastoNext event-on-update-reading .*&lt;br /&gt;
attr WebastoNext DbLogExclude .*&lt;br /&gt;
attr WebastoNext DbLogInclude Charge_Active_Power:600,HEMS_PV.*:300,HEMS_State:300&lt;br /&gt;
attr WebastoNext oldreadings Cable_State&lt;br /&gt;
attr WebastoNext obj-i1000-poll 1&lt;br /&gt;
attr WebastoNext obj-i1000-reading Charge_Point_State&lt;br /&gt;
attr WebastoNext obj-i1000-type unsigned short big&lt;br /&gt;
attr WebastoNext obj-i1001-poll 1&lt;br /&gt;
attr WebastoNext obj-i1001-reading Charge_State&lt;br /&gt;
attr WebastoNext obj-i1001-type unsigned short big&lt;br /&gt;
attr WebastoNext obj-i1004-poll 1&lt;br /&gt;
attr WebastoNext obj-i1004-reading Cable_State&lt;br /&gt;
attr WebastoNext obj-i1004-type unsigned short big&lt;br /&gt;
attr WebastoNext obj-i1006-poll 1&lt;br /&gt;
attr WebastoNext obj-i1006-reading Error_Code&lt;br /&gt;
attr WebastoNext obj-i1006-type unsigned short big&lt;br /&gt;
attr WebastoNext obj-i1008-poll 1&lt;br /&gt;
attr WebastoNext obj-i1008-reading Charge_Active_Current_L1&lt;br /&gt;
attr WebastoNext obj-i1008-type unsigned short big&lt;br /&gt;
attr WebastoNext obj-i1008-expr $val/1000&lt;br /&gt;
attr WebastoNext obj-i1010-poll 1&lt;br /&gt;
attr WebastoNext obj-i1010-reading Charge_Active_Current_L2&lt;br /&gt;
attr WebastoNext obj-i1010-type unsigned short big&lt;br /&gt;
attr WebastoNext obj-i1010-expr $val/1000&lt;br /&gt;
attr WebastoNext obj-i1012-poll 1&lt;br /&gt;
attr WebastoNext obj-i1012-reading Charge_Active_Current_L3&lt;br /&gt;
attr WebastoNext obj-i1012-type unsigned short big&lt;br /&gt;
attr WebastoNext obj-i1012-expr $val/1000&lt;br /&gt;
attr WebastoNext obj-i1020-poll 1&lt;br /&gt;
attr WebastoNext obj-i1020-reading Charge_Active_Power&lt;br /&gt;
attr WebastoNext obj-i1020-type unsigned long big&lt;br /&gt;
attr WebastoNext obj-i1024-reading Charge_Active_Power_L1&lt;br /&gt;
attr WebastoNext obj-i1024-poll 1&lt;br /&gt;
attr WebastoNext obj-i1024-type unsigned long big&lt;br /&gt;
attr WebastoNext obj-i1028-reading Charge_Active_Power_L2&lt;br /&gt;
attr WebastoNext obj-i1028-poll 1&lt;br /&gt;
attr WebastoNext obj-i1028-type unsigned long big&lt;br /&gt;
attr WebastoNext obj-i1032-reading Charge_Active_Power_L3&lt;br /&gt;
attr WebastoNext obj-i1032-poll 1&lt;br /&gt;
attr WebastoNext obj-i1032-type unsigned long big&lt;br /&gt;
attr WebastoNext obj-i1036-reading Energy_Meter&lt;br /&gt;
attr WebastoNext obj-i1036-poll 1&lt;br /&gt;
attr WebastoNext obj-i1036-type unsigned long big&lt;br /&gt;
attr WebastoNext obj-i1036-expr $val/1000&lt;br /&gt;
&lt;br /&gt;
attr WebastoNext obj-i1102-reading Min_Current&lt;br /&gt;
attr WebastoNext obj-i1102-poll 1&lt;br /&gt;
attr WebastoNext obj-i1102-type unsigned short big&lt;br /&gt;
attr WebastoNext obj-i1108-reading EV_Max_Current&lt;br /&gt;
attr WebastoNext obj-i1108-poll 1&lt;br /&gt;
attr WebastoNext obj-i1108-type unsigned short big&lt;br /&gt;
attr WebastoNext obj-i1502-reading Charged_Energy&lt;br /&gt;
attr WebastoNext obj-i1502-poll 1&lt;br /&gt;
attr WebastoNext obj-i1502-type unsigned short big&lt;br /&gt;
attr WebastoNext obj-i1502-expr $val/1000&lt;br /&gt;
attr WebastoNext obj-i1504-reading Charging_Start_Time&lt;br /&gt;
attr WebastoNext obj-i1504-poll 1&lt;br /&gt;
attr WebastoNext obj-i1504-type unsigned long big&lt;br /&gt;
attr WebastoNext obj-i1508-reading Charging_Time&lt;br /&gt;
attr WebastoNext obj-i1508-poll 1&lt;br /&gt;
attr WebastoNext obj-i1508-type unsigned long big&lt;br /&gt;
attr WebastoNext obj-i1512-reading Charging_End_Time&lt;br /&gt;
attr WebastoNext obj-i1512-poll 1&lt;br /&gt;
attr WebastoNext obj-i1512-type unsigned long big&lt;br /&gt;
attr WebastoNext obj-i1620-reading Smart_Vehicle_Detected&lt;br /&gt;
attr WebastoNext obj-i1620-poll 1&lt;br /&gt;
attr WebastoNext obj-i1620-type unsigned short big&lt;br /&gt;
&lt;br /&gt;
attr WebastoNext obj-h2000-reading Safe_Current&lt;br /&gt;
attr WebastoNext obj-h2000-poll 1&lt;br /&gt;
attr WebastoNext obj-h2000-polldelay 600&lt;br /&gt;
attr WebastoNext obj-h2000-type unsigned short big&lt;br /&gt;
attr WebastoNext obj-h2000-set 1&lt;br /&gt;
attr WebastoNext obj-h2000-min 0&lt;br /&gt;
attr WebastoNext obj-h2000-max 16&lt;br /&gt;
&lt;br /&gt;
attr WebastoNext obj-h2002-reading Com_Timeout&lt;br /&gt;
attr WebastoNext obj-h2002-poll 1&lt;br /&gt;
attr WebastoNext obj-h2002-polldelay x199&lt;br /&gt;
attr WebastoNext obj-h2002-type unsigned short big&lt;br /&gt;
attr WebastoNext obj-h2002-set 1&lt;br /&gt;
&lt;br /&gt;
attr WebastoNext obj-h5000-reading Charge_Power_Set&lt;br /&gt;
attr WebastoNext obj-h5000-poll 0&lt;br /&gt;
attr WebastoNext obj-h5000-type unsigned long big&lt;br /&gt;
attr WebastoNext obj-h5000-set 1&lt;br /&gt;
&lt;br /&gt;
attr WebastoNext obj-h5004-reading Charge_Current_Set&lt;br /&gt;
attr WebastoNext obj-h5004-poll 0&lt;br /&gt;
attr WebastoNext obj-h5004-type signed short big&lt;br /&gt;
attr WebastoNext obj-h5004-set 1&lt;br /&gt;
attr WebastoNext obj-h5004-min 0&lt;br /&gt;
attr WebastoNext obj-h5004-max 16&lt;br /&gt;
&lt;br /&gt;
attr WebastoNext obj-h5006-reading Start_Cancel&lt;br /&gt;
attr WebastoNext obj-h5006-poll 0&lt;br /&gt;
attr WebastoNext obj-h5006-type unsigned short big&lt;br /&gt;
attr WebastoNext obj-h5006-set 1&lt;br /&gt;
attr WebastoNext obj-h5006-min 0&lt;br /&gt;
attr WebastoNext obj-h5006-max 2&lt;br /&gt;
attr WebastoNext obj-h5006-hint 0,1,2&lt;br /&gt;
&lt;br /&gt;
attr WebastoNext obj-h6000-reading Life_Bit&lt;br /&gt;
attr WebastoNext obj-h6000-poll 1&lt;br /&gt;
attr WebastoNext obj-h6000-type unsigned short big&lt;br /&gt;
attr WebastoNext obj-h6000-set 1&lt;br /&gt;
&lt;br /&gt;
attr WebastoNext userReadings \&lt;br /&gt;
Charge_Point_State_TXT:Charge_Point_State\b.* {my $val = ReadingsVal (&amp;quot;WebastoNext&amp;quot;,&amp;quot;Charge_Point_State&amp;quot;, 0);; if ($val == 0) {return &amp;quot;no vehicle attached (EVSE available, EVSE unavailable)&amp;quot;} elsif ($val == 1) {return &amp;quot;vehicle attached, no permission (preparing)&amp;quot;} elsif ($val == 3) {return &amp;quot;charging&amp;quot;} elsif ($val == 4) {return &amp;quot;charging paused (suspending EVSE, suspending EV, finishing)&amp;quot;} elsif ($val == 7) {return &amp;quot;charging error&amp;quot;} elsif ($val == 8) {return &amp;quot;charging station reserved&amp;quot;} else { return $val .&amp;quot; undefined&amp;quot; };;},\&lt;br /&gt;
Cable_State_TXT:Cable_State\b.* {my $val = ReadingsVal (&amp;quot;WebastoNext&amp;quot;,&amp;quot;Cable_State&amp;quot;, 0);; if ($val == 0) {return &amp;quot;no cable attached&amp;quot;} elsif ($val == 1) {return &amp;quot;cable attached (no car attached)&amp;quot;} elsif ($val == 2) {return &amp;quot;cable attached (car attached)&amp;quot;} elsif ($val == 3) {return &amp;quot;cable attached (car attached) + lock active&amp;quot;} else { return $val .&amp;quot; undefined&amp;quot; };;}, \&lt;br /&gt;
Charge_State_TXT:Charge_State\b.* {my $val = ReadingsVal (&amp;quot;WebastoNext&amp;quot;,&amp;quot;Charge_State&amp;quot;, 0);; if ($val == 0) {return &amp;quot;idle&amp;quot;} elsif ($val == 1) {return &amp;quot;charging&amp;quot;} else { return $val .&amp;quot; undefined&amp;quot; };;}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Steuerung ===&lt;br /&gt;
Das Register Charge_Power_Set wird nur berücksichtigt, wenn Charge_Current_Set auf 0 gesetzt ist. Mindestladestromstärke ist 6 A bzw. 4200 W.&lt;br /&gt;
&lt;br /&gt;
Die Wallbox reagiert nur dann auf die Steuerung, wenn ein regelmäßiges Keep-Alive-Bit gesetzt wird. Ansonsten wird der Lademodus mit dem Wert &amp;quot;Safe_Current&amp;quot; gestartet.&amp;lt;syntaxhighlight lang=&amp;quot;cfg&amp;quot;&amp;gt;&lt;br /&gt;
define WebastoNext_KeepAlive at +*00:00:30 set WebastoNext Life_Bit 1&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Gestartet wird der Ladvorgang mit &amp;quot;set WebastoNext Start_Cancel 1&amp;quot;. Gestoppt wird mit &amp;quot;set WebastoNext Start_Cancel 2&amp;quot;.&lt;/div&gt;</summary>
		<author><name>Topos</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Webasto_Next&amp;diff=39226</id>
		<title>Webasto Next</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Webasto_Next&amp;diff=39226"/>
		<updated>2024-04-14T17:35:59Z</updated>

		<summary type="html">&lt;p&gt;Topos: Anlegen&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Die Wallbox Webasto Next kann per LAN oder WLAN über das Modebus-Protokoll ausgelesen und gesteuert und gesteuert werden.&lt;br /&gt;
&lt;br /&gt;
Hier eine mögliche Konfiguration&lt;/div&gt;</summary>
		<author><name>Topos</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Luxtronik_2.0&amp;diff=30195</id>
		<title>Luxtronik 2.0</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Luxtronik_2.0&amp;diff=30195"/>
		<updated>2019-04-19T16:30:42Z</updated>

		<summary type="html">&lt;p&gt;Topos: /* Nützliche Links */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Modul&lt;br /&gt;
|Name=LUXTRONIK2&lt;br /&gt;
|ModPurpose=Anbindung der Heizungssteuerung Luxtronik 2.0&lt;br /&gt;
|ModType=d&lt;br /&gt;
&amp;lt;!-- |ModCategory= (noch?) nicht verwendet --&amp;gt;&lt;br /&gt;
|ModCmdRef=LUXTRONIK2&lt;br /&gt;
|ModForumArea=Sonstiges&lt;br /&gt;
|ModTechName=23_LUXTRONIK2.pm&lt;br /&gt;
|ModOwner=[http://forum.fhem.de/index.php?action=pm;sa=send;u=5432 tupol]&lt;br /&gt;
}}&lt;br /&gt;
Die Luxtronik 2.0 ist eine Heizungssteuerung der Firma Alpha InnoTec AIT, die in Wärmepumpen von Alpha InnoTec, Buderus (Logamatic HMC20, HMC20 Z), CTA All-In-One (Aeroplus), Elco, Nibe (AP-AW10), Roth (ThermoAura®, ThermoTerra), Novelan (WPR NET) und Wolf Heiztechnik (BWL/BWS) verbaut ist.&lt;br /&gt;
Sie besitzt einen Ethernet (RJ45) Anschluss, so dass sie direkt in lokale Netzwerke (LAN) integriert werden kann.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ein detailierte Anleitung zum energiesparenden Betrieb einer Luft-Wasser-Wärmepumpe mit Fußbodenheizung findet man auf [[Effizienter Betrieb einer Fußbodenheizung mit Luft-Wasser-Wärmepumpe (Fallbeispiel)|&#039;&#039;&#039;dieser&#039;&#039;&#039; Wiki-Seite]]&lt;br /&gt;
&lt;br /&gt;
== Hinweise zum Betrieb mit FHEM ==&lt;br /&gt;
Definition in fhem.cfg:&lt;br /&gt;
&lt;br /&gt;
 define &amp;lt;name&amp;gt; &#039;&#039;&#039;LUXTRONIK2&#039;&#039;&#039; &amp;lt;IP-Adresse[:Port]&amp;gt; [Abfrageinterval]&lt;br /&gt;
&lt;br /&gt;
Die Angabe der Portnummer ist optional. Bei einigen Firmware-Versionen sollte der Port 8889 angegeben werden.&lt;br /&gt;
&lt;br /&gt;
Weiter in der {{Link2CmdRef|Lang=de|Anker=LUXTRONIK2}}.&lt;br /&gt;
&lt;br /&gt;
=== Zusätzliche Perl-Module ===&lt;br /&gt;
Das FHEM-Modul benutzt das CPAN-Modul &amp;quot;net::Telnet&amp;quot;. Dieses ist standardmäßig installiert. Wenn nicht muss es nachinstalliert werden. Unter Debian z.B. mit&lt;br /&gt;
 sudo apt-get install libnet-telnet-perl&lt;br /&gt;
&lt;br /&gt;
=== Hard- und Firmwareversionen ===&lt;br /&gt;
Die Luxtronik 2.1 ähnelt der Version 2.0 stark, besitzt aber eine andere Hardware und Firmware-Versionsnummer. &lt;br /&gt;
&lt;br /&gt;
Bei Steuerungen mit den Firmware-Versionen 2.xx, 3.xx und 4.xx existiert kein Telnet-Zugang. Eine automatische Korrektur der Systemzeit ist dadurch nicht möglich.&lt;br /&gt;
&lt;br /&gt;
Das Modul nutzt die nicht öffentlich dokumentierte Schnittstelle des über einen Internetbrowser aufrufbaren Java-Programmes der Steuerung (Port 8888 oder 8889). Aufgrund der Java-Einschränkungen neuerer Internet-Browser hat die Steuerung seit der Firmware-Version x.81 auch eine Schnittstelle für ein Java-Script (Port 8214). Dies ermöglicht die Bedienung mit neueren Browsern hat aber geringere Auslese- und Einstell-Möglichkeiten. Das Modul nutzt diese Schnittstelle (derzeit) nicht.&lt;br /&gt;
&lt;br /&gt;
Neue Firmware-Versionen sind gewöhnlich abwärtskompatibel und sollten nicht zu Einschränkungen bei dem Modul führen. Bei Firmware-Versionen &amp;gt;x.81 wurde jedoch berichtet, dass über die Java-Schnittstelle nicht mehr alle Informationen übertragen werden.&lt;br /&gt;
&lt;br /&gt;
== Erläuterung der Readings ==&lt;br /&gt;
===Allgemeine Wärmepumpenwerte===&lt;br /&gt;
* &#039;&#039;&#039;ambientTemperature&#039;&#039;&#039; - Temperatur des Außensensors in °C&lt;br /&gt;
* &#039;&#039;&#039;averageAmbientTemperature&#039;&#039;&#039; - Gemittelte Außentemperatur in °C (für Heizgrenze im Sommer, siehe [[#Frostschutz_und_Heizgrenze|Frostschutz und Heizgrenze]])&lt;br /&gt;
* &#039;&#039;&#039;bivalentLevel&#039;&#039;&#039; - Bivalenzstufe, siehe [[#Bivalenter_Betrieb|Bivalenter Betrieb]]&lt;br /&gt;
* &#039;&#039;&#039;COP&#039;&#039;&#039; - Coefficient Of Performance, Wirkungsgrad der Wärmepumpe (Leistungszahl ε). Eine Leistungszahl von z.B. 4,2 bedeutet, dass von der eingesetzten elektrischen Leistung des Kompressors das 4,2- fache an Wärmeleistung bereitgestellt wird. Anders formuliert, kann mit dieser Wärmepumpe aus einem Kilowatt elektrischer Leistung 4,2 kW Wärmeleistung zur Verfügung gestellt werden. &#039;&#039;Bei der Berechnung des COPs wird die elektrische Leistung aus dem Attribut &amp;quot;heatPumpElectricalPowerWatt&amp;quot; benutzt.&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;delayDeviceTimeCalc&#039;&#039;&#039; - Abweichung Gerätesystemzeit zur FHEM-Zeit. Dieser kann bis zu 2 s in der Vergangenheit liegen. Höhere Werte weisen auf eine ungenaue Systemzeit in der Steuerung hin.&lt;br /&gt;
* &#039;&#039;&#039;deviceTimeCalc&#039;&#039;&#039; - Beim Abrufen der Gerätewerte wird von der Luxtronik-Steuerung auch der Zeitpunkt der internen Ermittlung übergeben.&lt;br /&gt;
* &#039;&#039;&#039;durationFetchReadings&#039;&#039;&#039; - Dauer (in s) des Abrufes der Gerätewerte von der Steuerung&lt;br /&gt;
* &#039;&#039;&#039;flowRate&#039;&#039;&#039; - Durchfluss in l/h&lt;br /&gt;
* &#039;&#039;&#039;flowTemperature&#039;&#039;&#039; - Vorlauftemperatur in °C, normalerweise direkt hinter der Heizungsumwälzpumpe gemessen und &#039;&#039;&#039;vor&#039;&#039;&#039; einer eventuell installierten Heizpatrone&lt;br /&gt;
* &#039;&#039;&#039;heatSourceIN&#039;&#039;&#039; - Wärmequelle Eingangstemperatur in °C&lt;br /&gt;
* &#039;&#039;&#039;heatSourceOUT&#039;&#039;&#039; - Wärmequelle Ausgangstemperatur in °C (sitzt bei Luft-Wasser-WPs aber im Verdampfer)&lt;br /&gt;
* &#039;&#039;&#039;hotGasTemperature&#039;&#039;&#039; - Heißgastemperatur in °C, Temperatur, die hinter dem Kompressor der Wärmepumpe anfällt&lt;br /&gt;
* opStateHeatPump1...3&lt;br /&gt;
* &#039;&#039;&#039;returnTemperature&#039;&#039;&#039; - Rücklauftemperatur in °C, normalerweise vor dem Eingang zum Wärmetauscher des Verdichterkreislaufes gemessen&lt;br /&gt;
* &#039;&#039;&#039;thermalPower&#039;&#039;&#039; - aktuelle Heizleistung der WP in kW, berechnet aus Durchfluss und Differenz von Vor- und Rücklauftemperatur, also ohne Heizpatrone etc.&lt;br /&gt;
&lt;br /&gt;
=== Luft-Wasser-Wärmepumpen ===&lt;br /&gt;
* &#039;&#039;&#039;heatSourceDefrostAirEnd&#039;&#039;&#039; - Luft-Ausgangstemperatur in °C bei der die Luftabtauung des Verdampfers beendet wird&lt;br /&gt;
* &#039;&#039;&#039;heatSourceDefrostAirThreshold&#039;&#039;&#039; - Luft-Eingangstemperatur in °C oberhalb der der Verdampfer (energiesparend) mit Luft abgetaut wird&lt;br /&gt;
* &#039;&#039;&#039;heatSourceDefrostLast&#039;&#039;&#039; - Dauer sowie Umgebungs- und Luft-Eingangs-Temperaturen zum Beginn und am Ende der letzten Abtauung&lt;br /&gt;
* &#039;&#039;&#039;heatSourceDefrostLastTimeout&#039;&#039;&#039; - Umgebungs- und Wärmequellen-Temperaturen bei denen die Luftabtauung die maximale Dauer überschritten hat.&lt;br /&gt;
* &#039;&#039;&#039;heatSourceDefrostTimer&#039;&#039;&#039; - Ablaufzeit in Sekunden bis zur nächsten Abtauung des Verdampfers&lt;br /&gt;
&lt;br /&gt;
=== Heizung ===&lt;br /&gt;
* &#039;&#039;&#039;heatingCurveEndPoint&#039;&#039;&#039; - Endpunkt der Heizkurve in °C bei -20°C Außentemperatur&lt;br /&gt;
* &#039;&#039;&#039;heatingCurveOffset&#039;&#039;&#039; - Parallelversatz der Heizkurve&lt;br /&gt;
* &#039;&#039;&#039;heatingSystemCircPumpDeaerate&#039;&#039;&#039; - Entlüftungsmodus der Heizkreisumwälzpumpe (wird zum gezielten Einschalten der Pumpe durch FHEM genutzt)&lt;br /&gt;
* &#039;&#039;&#039;heatingLimit&#039;&#039;&#039; - Heizgrenze wird ausgewertet (on, off)&lt;br /&gt;
* &#039;&#039;&#039;mixer1FlowTemperature&#039;&#039;&#039; - Vorlauftemperatur am Mischkreis 1 in °C&lt;br /&gt;
* &#039;&#039;&#039;mixer1TargetTemperature&#039;&#039;&#039; - Sollwert Vorlauftemperatur am Mischkreis 1 in °C&lt;br /&gt;
* &#039;&#039;&#039;mixer2FlowTemperature&#039;&#039;&#039; - Vorlauftemperatur am Mischkreis 2 in °C&lt;br /&gt;
* &#039;&#039;&#039;mixer2TargetTemperature&#039;&#039;&#039; - Sollwert Vorlauftemperatur am Mischkreis 2 in °C&lt;br /&gt;
* &#039;&#039;&#039;mixer3FlowTemperature&#039;&#039;&#039; - Vorlauftemperatur am Mischkreis 3 in °C&lt;br /&gt;
* &#039;&#039;&#039;mixer3TargetTemperature&#039;&#039;&#039; - Sollwert Vorlauftemperatur am Mischkreis 3 in °C&lt;br /&gt;
* &#039;&#039;&#039;opModeHeating&#039;&#039;&#039; - Betriebsmodus der Heizung (Aus, Automatik, Zusatzheizung, Party, Ferien)&lt;br /&gt;
* &#039;&#039;&#039;opStateHeating&#039;&#039;&#039; - Status der Heizung (Aus, Normal, Abgesenkt, Heizgrenze, Frostschutz)&lt;br /&gt;
* &#039;&#039;&#039;returnTemperatureHeating&#039;&#039;&#039; - aktuelle oder letzte valide Rücklauftemperatur des Heizungskreislaufes in °C. Durch die Speicherung kann auch bei stehender Zirkulationspumpe oder während der Warmwasserbereitung auf die letzte valide Rücklauf-Temperatur des Heizkreislaufes zurückgegriffen werden.&lt;br /&gt;
* &#039;&#039;&#039;returnTemperatureHyst&#039;&#039;&#039; - Regel-Hysterese in K der Rücklauf-Solltemperatur&lt;br /&gt;
* &#039;&#039;&#039;returnTemperatureSetBack&#039;&#039;&#039; - Schnellverstellung in K der Rücklauf-Solltemperatur&lt;br /&gt;
* &#039;&#039;&#039;returnTemperatureTarget&#039;&#039;&#039; - Sollwert Rücklauftemperatur in °C (wird durch Heizkurve und Außensensor bestimmt, kann über in der Steuerung eingegebene Zeiten und auch manuell gezielt abgesenkt)&lt;br /&gt;
* &#039;&#039;&#039;thresholdHeatingLimit&#039;&#039;&#039; - Heizgrenze in °C, &#039;&#039;&#039;über&#039;&#039;&#039;schreitet die gemittelte Außentemperatur diesen Wert, wird nicht mehr geheizt&lt;br /&gt;
* &#039;&#039;&#039;thresholdTemperatureSetBack&#039;&#039;&#039; - &#039;&#039;&#039;unter&#039;&#039;&#039;schreitet die Außentemperatur diesen Wert (°C), wird die Rücklauf-Solltemperatur nicht mehr (zeitgesteuert) abgesenkt&lt;br /&gt;
&lt;br /&gt;
=== Warmwasserbereitung ===&lt;br /&gt;
* &#039;&#039;&#039;hotWaterCircPumpDeaerate&#039;&#039;&#039; - Entlüftungsmodus der Zirkulationspumpe (zum gezielten Einschalten der Zirkulationspumpe durch FHEM)&lt;br /&gt;
* &#039;&#039;&#039;hotWaterTemperature&#039;&#039;&#039; - aktuelle Warmwasser-Boiler-Temperatur in °C (Achtung, die Temperatur im Boiler ist sehr unterschiedliche, es wird also nur die Temperatur am Sensor angezeigt. Typischerweise sackt die Temperaturkurve beim Aufheizen des Boilers etwas ab, weil es durch den Wärmeeintrag zu Strömungen kommt.)&lt;br /&gt;
* &#039;&#039;&#039;hotWaterTemperatureTarget&#039;&#039;&#039; - obere Solltemperatur des Boilers in °C&lt;br /&gt;
* &#039;&#039;&#039;opModeHotWater&#039;&#039;&#039; - Betriebsmodus der Warmwasserbereitung (Aus, Automatik, Zusatzheizung, Party, Ferien)&lt;br /&gt;
* &#039;&#039;&#039;opStateHotWater&#039;&#039;&#039; - Status der Warmwasserbereitung (Aus, Aufheizen, Temp. OK, Sperrzeit)&lt;br /&gt;
&lt;br /&gt;
=== Solarthermie ===&lt;br /&gt;
* solarBufferTemperature - in °C&lt;br /&gt;
* solarCollectorTemperature - in °C&lt;br /&gt;
&lt;br /&gt;
=== Lüftung ===&lt;br /&gt;
* &#039;&#039;&#039;opModeVentilation&#039;&#039;&#039; - Betriebsmodus der Lüftung (Aus, Automatik, Party, Feuchteschutz)&lt;br /&gt;
* &#039;&#039;&#039;ventSupplyAirTemperature&#039;&#039;&#039; - Zulufttemperatur in °C&lt;br /&gt;
* &#039;&#039;&#039;ventExhaustAirTemperature&#039;&#039;&#039; - Ablufttemperatur in °C&lt;br /&gt;
&lt;br /&gt;
=== Zähler ===&lt;br /&gt;
* &#039;&#039;&#039;counterHeatQHeating&#039;&#039;&#039; - von der Wärmepumpe produzierte Wärmemenge (kWh) zur Heizung&amp;lt;br&amp;gt;(nur bei vorhandenem Wärmemengenzähler und ohne Wärmeeintrag durch zweite Wärmequelle wie z.B. Heizstäbe)&lt;br /&gt;
* &#039;&#039;&#039;counterHeatQHotWater&#039;&#039;&#039; - von der Wärmepumpe produzierte Wärmemenge (kWh) zur Warmwasserbereitung&amp;lt;br&amp;gt;(nur bei vorhandenem Wärmemengenzähler und ohne Wärmeeintrag durch zweite Wärmequelle wie z.B. Heizstäbe)&lt;br /&gt;
* &#039;&#039;&#039;counterHeatQTotal&#039;&#039;&#039; - von der Wärmepumpe produzierte Wärmemenge (kWh) insgesam&amp;lt;br&amp;gt;(nur bei vorhandenem Wärmemengenzähler und ohne Wärmeeintrag durch zweite Wärmequelle wie z.B. Heizstäbe)&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;counterHours2ndHeatSource1&#039;&#039;&#039; - Betriebsstunden der zweite Wärmequelle (normalerweise elektrische Heizstäbe) &lt;br /&gt;
* &#039;&#039;&#039;counterHoursHeatPump&#039;&#039;&#039; - Betriebsstunden des Wärmepumpenkompressors &lt;br /&gt;
* &#039;&#039;&#039;counterHoursHeating&#039;&#039;&#039; - Betriebsstunden des Wärmepumpenkompressors die zur Heizung benutzt wurden&lt;br /&gt;
* &#039;&#039;&#039;counterHoursHotWater&#039;&#039;&#039; - Betriebsstunden des Wärmepumpenkompressors die zur Warmwasserbereitung benutzt wurden&lt;br /&gt;
&lt;br /&gt;
=== Ein- und Ausgänge ===&lt;br /&gt;
* compressor1...2&lt;br /&gt;
* &#039;&#039;&#039;heatingSystemCircPump&#039;&#039;&#039; - Heizungs-Umlaufpumpe in der Wärmepumpe (normaler Weise für das Heizungssystem) (HUP)&lt;br /&gt;
* &#039;&#039;&#039;heatingSystemCircPumpVoltage&#039;&#039;&#039; - Regelspannung an der Heizungs-Umlaufpumpe in der Wärmepumpe (zur Steuerung der Pumpen-Drehzahl)&lt;br /&gt;
* &#039;&#039;&#039;heatSourceMotor&#039;&#039;&#039; - Motor des Ventilators, der Brunnen- oder der Solepumpe (je nach WP-Typ) (Ventil-BOSUP)&lt;br /&gt;
* &#039;&#039;&#039;hotWaterCircPumpExtern&#039;&#039;&#039; - Zirkulationspumpe im Warmwasserstrang des Hauses (wenn genutzt) (ZIP)&lt;br /&gt;
* &#039;&#039;&#039;hotWaterSwitchingValve&#039;&#039;&#039; - Ventil zur Umschaltung auf die Heizspirale im Boiler (BUP)&lt;br /&gt;
* 2ndHeatSource1...3&lt;br /&gt;
* &#039;&#039;&#039;solarPump&#039;&#039;&#039; - Pumpe der Solarthermie (SLP)&lt;br /&gt;
&lt;br /&gt;
=== Sonstiges ===&lt;br /&gt;
* Firmware&lt;br /&gt;
* &#039;&#039;&#039;typeSerial&#039;&#039;&#039; - Baujahr/Monat-Lfd.Hexadezimalnummer&lt;br /&gt;
* &#039;&#039;&#039;typeHeatpump&#039;&#039;&#039; - Modell der Wärmepumpe&lt;br /&gt;
**ERC&lt;br /&gt;
**HMD 2&lt;br /&gt;
**KLW&lt;br /&gt;
**KSW&lt;br /&gt;
**L1A&lt;br /&gt;
**L1A407&lt;br /&gt;
**L1AREV&lt;br /&gt;
**L1H&lt;br /&gt;
**L1I&lt;br /&gt;
**L1I407&lt;br /&gt;
**L1S&lt;br /&gt;
**L2A&lt;br /&gt;
**L2A407&lt;br /&gt;
**L2AREV&lt;br /&gt;
**L2G&lt;br /&gt;
**L2G404&lt;br /&gt;
**L2G407&lt;br /&gt;
**L2H&lt;br /&gt;
**L2I&lt;br /&gt;
**L2I407&lt;br /&gt;
**LD2AG&lt;br /&gt;
**LD5&lt;br /&gt;
**LD5 (230V)&lt;br /&gt;
**LD5 REV&lt;br /&gt;
**LD5 REV 230V&lt;br /&gt;
**LD7&lt;br /&gt;
**LD7 (230 V)&lt;br /&gt;
**LD7 REV&lt;br /&gt;
**LD7 REV 230V&lt;br /&gt;
**LD9&lt;br /&gt;
**LD9 REV 230V&lt;br /&gt;
**LW SEC&lt;br /&gt;
**LWC&lt;br /&gt;
**&#039;&#039;&#039;LWC407&#039;&#039;&#039; - Kompakte Luft/Wasser-Wärmepumpe zur Innenaufstellung&lt;br /&gt;
**LWD90V - ??  Duale Luft/Wasser-Wärmepumpe invertergeführt zur Außenaufstellung&lt;br /&gt;
**MSW 10&lt;br /&gt;
**MSW 10S&lt;br /&gt;
**MSW 12&lt;br /&gt;
**MSW 13S&lt;br /&gt;
**MSW 14&lt;br /&gt;
**MSW 16S&lt;br /&gt;
**MSW 17&lt;br /&gt;
**MSW 19&lt;br /&gt;
**MSW 23&lt;br /&gt;
**MSW 26&lt;br /&gt;
**MSW 30&lt;br /&gt;
**MSW 4&lt;br /&gt;
**MSW 4S&lt;br /&gt;
**MSW 6 - Sole/Wasser-Wärmepumpe&lt;br /&gt;
**MSW 6S&lt;br /&gt;
**MSW 8&lt;br /&gt;
**MSW 8S&lt;br /&gt;
**MSW2-6S&lt;br /&gt;
**MSW3-12&lt;br /&gt;
**MSW3-12S&lt;br /&gt;
**MSW4-1676&lt;br /&gt;
**SW 291&lt;br /&gt;
**SW 29_56&lt;br /&gt;
**SW 37_45&lt;br /&gt;
**SW 58_69&lt;br /&gt;
**SW1 - ?? Sole/Wasser-Wärmepumpe&lt;br /&gt;
**SW2&lt;br /&gt;
**SWC -  ?? kompakte Sole/Wasser-Wärmepumpe&lt;br /&gt;
**WW1 - ?? Wasser/Wasser-Wärmepumpe&lt;br /&gt;
**WW2&lt;br /&gt;
**WWB_20 - ?? Wasser/Wasser-Booster zur dezentralen Trinkwassererwärmung&lt;br /&gt;
**WWC1 - ?? kompakte Wasser/Wasser-Wärmepumpe&lt;br /&gt;
**WWC2&lt;br /&gt;
**WZS - ??? Sole/Wasser Wärmezentrale&lt;br /&gt;
**WZW&lt;br /&gt;
**WZWD&lt;br /&gt;
&lt;br /&gt;
== Tipps zum ökonomischen Betrieb ==&lt;br /&gt;
Grundlage eines ökonomischen Betriebs einer Wärmepumpe ist in erster Linie ein guter hydraulischer Abgleich der Heizwasserverteilung und eine genaue Einstellung der Heizkurve. Beides ist sowohl von den Bedürfnissen und dem Nutzungsverhalten der Bewohner als auch von der Dämmung des Hauses abhängig.&lt;br /&gt;
&lt;br /&gt;
Insbesondere für Wärmepumpen, die &#039;&#039;&#039;nicht&#039;&#039;&#039; über einen leistungsgeregelten Verdichter verfügen, gibt es den interessanten Ansatz, die Einzelraumregler (ERR) und das Überströmventil der Wärmepumpe komplett ausser Betrieb zu nehmen und damit alle Heizkreise als ein &amp;quot;Heizkörper&amp;quot; zu betrachten. Diverse Foreneinträge (z.B. [http://www.haustechnikdialog.de/Forum/t/142011/Einstellungen-Alpha-Innotec-LWC80]) erzählen von bedeutenden Einsparungen durch Absenken der Solltemperatur und Wärmepumpen-freundlichen Betriebszyklen (lange Taktzeiten) und gehen auch detailiert auf durch die Luxtronik2 betriebene Wärmepumpen ein.&lt;br /&gt;
&lt;br /&gt;
Ein detailierte Anleitung zum energiesparenden Betrieb einer Wärmepumpe findet man auf der folgenden Wiki-Seite:&amp;lt;br&amp;gt;&lt;br /&gt;
[[Effizienter Betrieb einer Fußbodenheizung mit Luft-Wasser-Wärmepumpe (Fallbeispiel)]]&lt;br /&gt;
&lt;br /&gt;
=== Sperrzeiten ===&lt;br /&gt;
Die Luxtronik 2.0 erlaubt es, sich mit Hilfe von Sperrzeiten an zeitabhängige Strompreise anzupassen. Die Uhr der Steuerung geht jedoch sehr ungenau. Durch Setzen des Attributes &amp;quot;autoSynchClock&amp;quot; wird die Uhr der Steuerung regelmäßig mit der FHEM-Zeit abgeglichen. Die Funktion muss über das Attribut &amp;quot;allowSetParameter&amp;quot; freigegeben werden.&lt;br /&gt;
 attr &amp;lt;device&amp;gt; allowSetParameter 1&lt;br /&gt;
 attr &amp;lt;device&amp;gt; autoSynchClock 10&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Dies funktioniert nicht bei der Steuerungen Luxtronik 2.1 und bei der Firmware 2.xx, 3.xx oder 4.xx.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==Abschätzung des elektrischen Verbrauches==&lt;br /&gt;
Über die Attribute &amp;quot;heatPumpElectricalPowerWatt&amp;quot;, &amp;quot;heatPumpElectricalPowerFactor&amp;quot; und &amp;quot;heatRodElectricalPowerWatt&amp;quot; wird der elektrische Verbrauch während der Wärmeerzeugungen (Kompressormotor, Motor(en) der Wärmequelle) und der Heizstäbe festgelegt. Ist zudem das Attribute &amp;quot;doStatistics&amp;quot; auf 1 und der Werte &amp;quot;activeTariff&amp;quot; auf einen Wert zwischen 1 und 9 gesetzt, so berechnet das Modul anhand der Betriebsstunden automatisch den elektrischen Verbrauch innerhalb des angegebenen Stromtarifes.&lt;br /&gt;
&lt;br /&gt;
Normalerweise wird eine Wärmepumpe mit einem zeitabhängigen Stromtarif betrieben (Doppeltarifzähler). Hierbei muss der Werte &amp;quot;activeTariff&amp;quot; zum jeweiligen Zeitpunkt über ein FHEM-Script gesetzt werden.&lt;br /&gt;
Beispiel:&lt;br /&gt;
 define Strom_HT_W at *06:00 { if ( $wday != 0 ) {fhem( &amp;quot;set Heizung activeTariff 1&amp;quot; );;} }&lt;br /&gt;
 define Strom_NT_W at *22:00 set Heizung activeTariff 2&lt;br /&gt;
 define Strom_NT_Sa at *13:00 { if ( $wday == 6 ) {fhem( &amp;quot;set Heizung activeTariff 2&amp;quot; );;} }&lt;br /&gt;
&lt;br /&gt;
==Verhalten der Steuerung Luxtronik 2.0==&lt;br /&gt;
Leider ist die Beschreibung des Steuerungsverhaltens in den Bedienungsanleitungen meist sehr oberflächlich gehalten. Die folgenden Erläuterungen benutzen die Abkürzungen (fett) der Webapplikation der Steuerung.&amp;lt;br&amp;gt; &lt;br /&gt;
Das notwendige Verständnis der Prozesstechnik einer Wärmepumpe erhält man z.B. auf den folgenden Seiten: [http://www.energie-experten.org/heizung/waermepumpe/technik/ www.energie-experten.org/heizung/waermepumpe/technik/]&lt;br /&gt;
&lt;br /&gt;
===Abtauung des Verdampfers (Luftwärmetauschers) bei Luft-Wasser-Wärmepumpen===&lt;br /&gt;
Wird die Luft im Verdampfer unter den Taupunkt abgekühlt, so kommt es zur Ansammlung von Feuchtigkeit an den Bauteilen des Verdampfer. Liegt dabei die Temperatur an den Lamellen unter 0 °C (bzw. die Ausströmtemperatur der Luft knapp darüber) so vereist der Verdampfer. Diese Eisschicht wächst kontinuierlich und verschlechtert extrem die Wärmeübertragung aus der Luft in den Verdichterkreislauf.&lt;br /&gt;
&lt;br /&gt;
Aus diesem Grund wird bei einer Außentemperatur unter 15°C der Verdampfer zyklisch abgetaut. Das Abtauen startet nach dem Ende der &#039;&#039;&#039;Ablaufzeit Abtauen&#039;&#039;&#039; (&#039;&#039;heatSourceDefrostTimer&#039;&#039;) des Verdichters. &lt;br /&gt;
Der Startwert der &#039;&#039;Ablaufzeit Abtauen&#039;&#039; liegt im Bereich &#039;&#039;&#039;Abtzyk min&#039;&#039;&#039; und &#039;&#039;&#039;Abtzyk max&#039;&#039;&#039; und wird bei Kreisumkehr (s.u.) nach jedem Abtauvorgang anhand der dafür benötigten Zeit neu bestimmt.&lt;br /&gt;
&lt;br /&gt;
Bei Außentemperaturen zwischen 10°C und 15°C muss der Verdichter außerdem kontinuierlich 40 Minuten gelaufen sein. Während des Stillstandes des Verdichters wird bei &#039;&#039;Wärmequelle-Ein&#039;&#039; (&#039;&#039;heatSourceIN&#039;&#039;) oberhalb &#039;&#039;T-Luftabt.&#039;&#039; (&#039;&#039;heatSourceDefrostAirThreshold&#039;&#039;) die &#039;&#039;Ablaufzeit Abtauen&#039;&#039; (&#039;&#039;heatSourceDefrostTimer&#039;&#039;) wieder kontinuierlich (1s pro min) bis zum Wert &#039;&#039;&#039;Abtzyk min&#039;&#039;&#039; erhöht.&lt;br /&gt;
&lt;br /&gt;
[[Datei:Luxtronik2-Luftabtauung.png|miniatur|Temperaturverlauf bei Luftabtauung&amp;lt;br&amp;gt;(roter Pfeil)]]&lt;br /&gt;
Es gibt zwei Möglichkeiten des Abtauens:&lt;br /&gt;
# &#039;&#039;&#039;Luftabtauung: &#039;&#039;&#039; nur oberhalb des Gefrierpunktes, etwas langsamer aber energiesparend&lt;br /&gt;
#: Die Luftabtauung wird nur gestartet, wenn zu Beginn des Abtauens die Temperatur &#039;&#039;&#039;Wärmequelle-Ein&#039;&#039;&#039; (&#039;&#039;heatSourceIN&#039;&#039;) oberhalb der Temperatur &#039;&#039;&#039;T-Luftabt.&#039;&#039;&#039; (&#039;&#039;heatSourceDefrostAirThreshold&#039;&#039;) liegt. Dann wird der Verdichter abgeschaltet und nur noch der Ventilator (&#039;&#039;heatSourceMotor&#039;&#039;) betrieben, um die Eisschicht mit der durchströmenden Luft abzutauen. Dabei steigt die Austrittstemperatur &#039;&#039;&#039;Wärmequelle-Aus&#039;&#039;&#039; (&#039;&#039;heatSourceOUT&#039;&#039;) bis auf ca. 0°C und das geschmolzene Eis beginnt abzulaufen. Ist der größte Teil des Eises geschmolzen, so steigt die Austrittstemperatur wieder. Die Luftabtauung wird beendet, wenn die &#039;&#039;Schaltspielsperre nach Verdichterstop&#039;&#039; (5 min) abgelaufen ist &amp;lt;u&amp;gt;und&amp;lt;/u&amp;gt; die Temperatur &#039;&#039;&#039;Wärmequelle-Aus&#039;&#039;&#039; (&#039;&#039;heatSourceOUT&#039;&#039;) den Wert &#039;&#039;&#039;T-LABT-Ende&#039;&#039;&#039; (&#039;&#039;heatSourceDefrostAirEnd&#039;&#039;) erreicht hat oder wenn die Zeitbegrenzung &#039;&#039;&#039;Luft-Abt. max&#039;&#039;&#039; überschritten wird. Bei Überschreitung der Zeitbegrenzung wird per &#039;&#039;Kreisumkehr&#039;&#039; weiter abgetaut. Nach dem Ende der Luftabtauung wird die &#039;&#039;&#039;Ablaufzeit Abtauen&#039;&#039;&#039; (&#039;&#039;heatSourceDefrostTimer&#039;&#039;) auf den Wert &#039;&#039;&#039;Abtzyk min&#039;&#039;&#039; gesetzt.&lt;br /&gt;
&lt;br /&gt;
#  &#039;&#039;&#039;Kreisumkehr:&#039;&#039;&#039; schnell und energieintensiv&lt;br /&gt;
#: Bei der Kreisumkehr wird der Ventilator (&#039;&#039;heatSourceMotor&#039;&#039;) abgeschaltet und der Verdichter weiter betrieben. Über ein Vierwegeventil (Ausgang &#039;&#039;&#039;AV-Abtauventil&#039;&#039;&#039;) wird der Verdichterkreislauf so umgekehrt, dass dem Heizwasserkreislauf Wärme entzogen und der Verdampfer aufgeheizt wird. Nach 10 Minuten oder beim Ansprechen des Abtauendepressostaten (Eingang &#039;&#039;&#039;ASD&#039;&#039;&#039;) wird der Abtauvorgang beendet.&lt;br /&gt;
#: Vor dem Start des Abtauens erfolgt eine s. g. Durchflussüberwachung. Dabei wird geheizt und die Steuerung prüft, ob der Heizkreislauf genügend Durchfluss hat, um die nötige Wärmemenge für den Abtauvorgang zu Verfügung zu stellen. Die Durchflussüberwachung dauert 8 Minuten. In dieser Zeitspanne ist das erwärmte Wasser zumeist auch durch den Heizungskreislauf gewandert, steht wieder am Vorlauf an und wird dann durch den Abtauvergang wieder abgekühlt. Bei einer Außentemperatur über 5 °C oder einer Rücklauftemperatur über 40 °C wird die Durchflussüberwachung auf zwei Minuten gekürzt.&lt;br /&gt;
&lt;br /&gt;
Kommt die Wärmepumpe vor dem Start der Luftabtauung zum Stehen, so taut der Verdampfer durch die Plusgrade der Umgebung auch von ganz allein ab, diese ist an der Temperatur &#039;&#039;Wärmequelle-Aus&#039;&#039; zu erkennen, wird von der Luxtronik aber leider nicht berücksichtigt. &lt;br /&gt;
&lt;br /&gt;
Der Sensor &#039;&#039;Wärmequelle-Ein&#039;&#039; sitzt im Zuluftkanal in der Nähe des Verdampfers. Der Sensor &#039;&#039;Wärmequelle-Aus&#039;&#039; sitzt direkt &#039;&#039;&#039;im&#039;&#039;&#039; Verdampfer, misst also nicht die tatsächliche Lufttemperatur.&lt;br /&gt;
&lt;br /&gt;
===Bivalenter Betrieb===&lt;br /&gt;
* &#039;&#039;&#039;Bivalenz Stufe&#039;&#039;&#039;&lt;br /&gt;
*: Damit wird über die HRM- und HRW-Zeit das Zuschalten weiterer Wärmequellen gesteuert:&lt;br /&gt;
*:: Stufe 1 = ein Verdichter darf laufen (Bei zwei Verdichtern werden diese in Abhängigkeit der &#039;&#039;&#039;Impulse Verdichter 1/2&#039;&#039;&#039; abwechselnd verwendet.)&lt;br /&gt;
*:: Stufe 2 = zwei Verdichter dürfen laufen, sofern die Außentemperatur den Wert &#039;&#039;&#039;Freig. 2.VD&#039;&#039;&#039; unterschritten hat. Statt dem 2. Verdichter kann auch eine parallel betriebene Wärmepumpe freigegeben werden.&lt;br /&gt;
*:: Stufe 3 = zusätzlicher Wärmeerzeuger 1 (&#039;&#039;&#039;ZWE 1&#039;&#039;&#039;, z.B. Heizstäbe oder Kessel) darf mitlaufen, sofern die Außentemperatur den Wert &#039;&#039;&#039;Freig. ZWE&#039;&#039;&#039; unterschritten hat&lt;br /&gt;
*:: Stufe 4 = zusätzlicher Wärmeerzeuger 2 (&#039;&#039;&#039;ZWE 2&#039;&#039;&#039;, z.B. Heizstäbe) darf mitlaufen, sofern die Außentemperatur den Wert &#039;&#039;&#039;Freig. ZWE&#039;&#039;&#039; unterschritten hat&lt;br /&gt;
*: Wenn die Rücklauftemperatur die Rücklauf-Solltemperatur und die maximale Rücklauferhöhung &#039;&#039;&#039;TR Erh max&#039;&#039;&#039; überschreitet, werden sofort alle Wärmeerzeuger abgeschaltet und die Bivalenzstufe 1 gesetzt.&lt;br /&gt;
*: Wenn in der Heizung die maximale Vorlauftemperatur &#039;&#039;&#039;Vorlauf max.&#039;&#039;&#039; überschritten wird, dann wird sofort ein Kompressor ausgeschalten und die Bivalenzstufe um den Wert 1 reduziert.&lt;br /&gt;
*: Bei der Warmwassererzeugung wird der zusätzliche Wärmeerzeuger erst nach der Zeit &#039;&#039;&#039;WW+WP max&#039;&#039;&#039; freigegeben.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;HRM-Zeit&#039;&#039;&#039; - Heizungsregler Mehr-Zeit&lt;br /&gt;
*: Die Zeit beginnt zu zählen, wenn die Wärmepumpe heizt und sich die Rücklauftemperatur &#039;&#039;&#039;unterhalb&#039;&#039;&#039; des Einschaltkriteriums (&#039;&#039;&#039;Rückl.Soll&#039;&#039;&#039; - &#039;&#039;&#039;Hyterese HR&#039;&#039;&#039;) befindet.&lt;br /&gt;
*: Überschreitet diese Zeit einen bestimmten Wert, so wird in die nächst höhere &#039;&#039;Bivalenzstufe&#039;&#039; geschaltet, um zusätzliche Wärmeerzeuger zu aktiviert.&lt;br /&gt;
*: Die Bivalenzstufe 2 (zwei Verdichter) wird nach der &#039;&#039;&#039;HR Zeit&#039;&#039;&#039; (Standard 25 min) erreicht.&lt;br /&gt;
*: Die Bivalenzstufe 3 (ZWE 1) wird nach der Zeit &#039;&#039;&#039;Freig. ZWE&#039;&#039;&#039; (Standard 60 min) erreicht.&lt;br /&gt;
*: Die Bivalenzstufe 4 (ZWE 2) wird nach 120 min erreicht.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;HRW-Zeit&#039;&#039;&#039; - Heizungsregler Weniger-Zeit&lt;br /&gt;
*: Die Zeit beginnt zu zählen, wenn die Wärmepumpe heizt und sich die Rücklauftemperatur &#039;&#039;&#039;oberhalb&#039;&#039;&#039; des Ausschaltkriteriums (&#039;&#039;&#039;Rückl.Soll&#039;&#039;&#039; + &#039;&#039;&#039;Hyterese HR&#039;&#039;&#039;) befindet. &lt;br /&gt;
*: Überschreitet diese Zeit einen bestimmten Wert (jeweils 15 min), so wird in die nächst niedrigere &#039;&#039;Bivalenzstufe&#039;&#039; geschaltet, um zusätzliche Wärmeerzeuger wieder zu deaktivieren.&lt;br /&gt;
&lt;br /&gt;
===Automatische Sperren===&lt;br /&gt;
* &#039;&#039;&#039;SSP-Zeit&#039;&#039;&#039; - Ablaufzeit der Schaltspielsperre (SSP)&lt;br /&gt;
*: Es gibt zwei SSP-Ablaufzeit. Sie verzögern das erneute Starten des Verdichters für:&lt;br /&gt;
*:: 20 min ab letztem &#039;&#039;&#039;Ein&#039;&#039;&#039;schaltzeitpunkt des Verdichters, um die Belastung des Stromnetzes durch den erhöhten Anlaufstrom zu reduzieren.&lt;br /&gt;
*:: 5 min ab letztem &#039;&#039;&#039;Aus&#039;&#039;&#039;schaltzeitpunkt des Verdichters, um den Verdichterkreislauf zu schonen.&lt;br /&gt;
*: Das heisst, der Verdichter startet frühestens 20 min nach dem letzten Start, resp. 5 min nach dem letzten Stop. Es gibt also maximal 3 Anläufe pro Stunde.&lt;br /&gt;
&lt;br /&gt;
===Heizkurve===&lt;br /&gt;
Die Heizkurve lässt sich über zwei Parameter einstellen&lt;br /&gt;
* Eine Veränderung des Heizkurven-Endpunktes (HKE) verändert die Steigung der Kurve indem es die Rücklauf-Solltemperatur &#039;&#039;rlSoll&#039;&#039; bei tiefen Temperaturen festlegt.&lt;br /&gt;
* Die Parallelverschiebung (PVS) des Heizkurven-Fusspunktes hebt oder senkt die komplette Kurve und verändert dabei auch die Steigung geringfügig.&lt;br /&gt;
* Bei einer &amp;quot;neutralen&amp;quot; Parallelverschiebung von 20°C wird bei -20°C Außentemperatur der Heizkurvenendpunkt als &#039;&#039;rlSoll&#039;&#039; eingestellt.&lt;br /&gt;
: Bei 20°C Außentemperatur liegt &#039;&#039;rlSoll&#039;&#039; auf dem Heizkurven-Fusspunkt von 20°C.&lt;br /&gt;
: Eine Erhöhung des Fusspunktes um 1°C erhöht auch &#039;&#039;rlSoll&#039;&#039; bei -20°C um 1°C.&lt;br /&gt;
&lt;br /&gt;
Die Rücklauf-Solltemperatur &#039;&#039;rlSoll&#039;&#039; wird von der Steuerung in Abhängigkeit von der Außentemperatur wie folgt berechnet:&lt;br /&gt;
: rlSoll (Aussentemp) = PVS + (HKE - 20) * (PVS - Aussentemp) / (20 - (Aussentemp - PVS) / 2)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
Bei einer &amp;quot;neutralen&amp;quot; Parallelverschiebung von 20°C und einem Heizkurvenendpunkt von 30°C lautet der vereinfacht Term:&lt;br /&gt;
: rlSoll (Aussentemp) = 20 + 20 * (Aussentemp - 20) / (Aussentemp - 60)&lt;br /&gt;
D.h. rlSoll (20°C) = 20°C und rlSoll (-20°C) = 30°C&lt;br /&gt;
&lt;br /&gt;
===Frostschutz und Heizgrenze===&lt;br /&gt;
Ist die &#039;&#039;&#039;Heizgrenze&#039;&#039;&#039; eingeschaltet, so schaltet die Steuerung in den Frostschutz-Modus (=Sommermodus), sobald die &#039;&#039;&#039;Mitteltemperatur&#039;&#039;&#039; (&#039;&#039;averageAmbientTemperature&#039;&#039;) die Heizgrenze (&#039;&#039;thresholdHeatingLimit&#039;&#039;) um 0,2 K überschreitet. Dabei wird die Rücklaufsolltemperatur (&#039;&#039;returnTemperatureTarget&#039;&#039;) auf die &#039;&#039;&#039;Min.Rückl.Solltemp.&#039;&#039;&#039; (z.B. 15&amp;amp;nbsp;°C) absenkt.&lt;br /&gt;
Bei Luft-Wasser-Wärmepumpen wird die Rücklaufsolltemperatur auf 20 °C angehoben, sobald die &#039;&#039;&#039;Außentemperatur&#039;&#039;&#039; (&#039;&#039;ambientTemperature&#039;&#039;) 10&amp;amp;nbsp;°C unterschreitet.&amp;lt;br&amp;gt;&lt;br /&gt;
Die &#039;&#039;Mitteltemperatur&#039;&#039; ist laut Handbuch der Durchschnitt der Außentemperatur der letzten 24 Stunden. Tatsächlich wird sie aber einmal pro Stunde aus einem reduzierten Mittelwert der letzten 11 Stunden gebildet.&lt;br /&gt;
&lt;br /&gt;
Beim Unterschreiten der Solltemperatur startet der Heizvorgang (Frostschutz).&lt;br /&gt;
&lt;br /&gt;
Empfehlung für die Heizgrenze:&lt;br /&gt;
* Altbau: 15°C&lt;br /&gt;
* Neubau: 12°C&lt;br /&gt;
* Passivhaus: 10°C&lt;br /&gt;
&lt;br /&gt;
===Pumpenoptimierung===&lt;br /&gt;
Der Stromverbrauch einer durchgängig laufenden normalen Heizungsumwälzpumpe beträgt mehrere kWh pro Tag. Damit kann er in der Übergangszeit sogar im Bereich des Stromverbrauches des Verdichters liegen (z.B. 5 kWh/Tag). Durch den Einsatz engergiesparender Pumpen kann man ihn reduzieren. Die Funktion &#039;&#039;&#039;Pumpenoptimierung&#039;&#039;&#039; ist eine zusätzliche Möglichkeit, um durch bedarfsgesteuertes Abschalten der Heizungsumwälzpumpe Strom zu sparen.&lt;br /&gt;
&lt;br /&gt;
Es gibt verschiedene Stufen:&lt;br /&gt;
# Liegt die Rücklauftemperatur 30 Minuten nach Ende des Heizvorganges noch über dem Sollwert (ohne Hysterese), so wird die Heizungspumpe für 30 min abgeschaltet. &lt;br /&gt;
# Liegt die Rücklauftemperatur nach Ende des Heizvorganges für die Dauer der &#039;&#039;&#039;Pumpenoptim.Zeit&#039;&#039;&#039; oberhalb des  Sollwertes, so wird die Heizungspumpe abgeschaltet. Danach wird alle 30 Minuten wieder für 5 Minuten eingeschaltet, um die aktuelle Rücklauftemperatur des Heizungskreislaufes zu ermitteln. Liegt die Rücklauftemperatur nach den 5 Minuten unterhalb des Sollwertes so läuft die Heizungspumpe wieder dauerhaft.&lt;br /&gt;
# Sobald die Außentemperatur über der Rücklauf-Solltemperatur liegt, wird die Heizungspumpe dauerhaft abgeschaltet. Um ein Festsitzen der Pumpe zu vermeiden, wird sie alle 150 Stunden für eine Minute wieder eingeschaltet.&lt;br /&gt;
&lt;br /&gt;
Die Pumpenoptimierung läuft nicht bei Außentemperaturen unter +1,0°C, um das Einfrieren von außen-aufgestellten Anlagen zu verhindern. Während der EVU-Sperre steht auch die Heizungsumwälzpumpe. Nach deren Ende läuft die Heizungsumwälzpumpe erst 5 Minuten ehe die Rücklauftemperatur ausgewertet wird.&lt;br /&gt;
&lt;br /&gt;
Die Pumpenoptimierungszeit sollte möglichst klein gewählt werden, wenn eine Fussbodenheizung ohne Einzelraumregler betrieben wird und Räume unterschiedliche Temperaturen haben sollen, da sonst nach Abschalten der Wärmepumpe die wärmeren Räume schneller abkühlen und dabei die kälteren aufheizen.&lt;br /&gt;
&lt;br /&gt;
==Firmware==&lt;br /&gt;
=== Firmware Bugs und Eigentümlichkeiten===&lt;br /&gt;
- bitte mit eigenen Beobachtungen ergänzen -&lt;br /&gt;
&lt;br /&gt;
Lfd-Nr. 1&amp;lt;br&amp;gt;&lt;br /&gt;
Die Warmwassererwärmung führt zu einer starken Erhöhung der Temperatur im Heizkreislauf-Wärmetauscher der Wärmepumpe. Nach dem Zurückschalten auf den Heizungsbetrieb, speist der Puffer bis zur Abkühlung erstmal mit einer sehr hohen Temperatur in den Heizungskreislauf ein und verfälscht dadurch die Rücklauftemperatur stark. Die Heizungspumpe läuft zwar 2 Minuten nach aber in dieser Zeit wird die überhöhte Wärmetauschertemperatur nicht abgebaut. Bei eingeschalteter Pumpenoptimierung führt dies zu zu einer Zwangspause von entweder 30 Minuten oder bis der Temperaturfühler an der Rücklaufleitung durch den normalen Wärmeverlust unterhalb der Solltemperatur abgekühlt ist.&lt;br /&gt;
&lt;br /&gt;
Lfd-Nr. 2&amp;lt;br&amp;gt;&lt;br /&gt;
Über das Webinterface kann man teilweise keine Ferienzeit von wenigen Tagen auswählen. Wurde in den aktuelleren Firmwareversionen behoben.&lt;br /&gt;
&lt;br /&gt;
Lfd-Nr. 3&amp;lt;br&amp;gt;&lt;br /&gt;
Mittlere Außentemperatur wird nicht über die letzten 24 h bestimmt.&lt;br /&gt;
&lt;br /&gt;
Lfd-Nr. 4 (Luft-Wasser-Wärmepumpen)&amp;lt;br&amp;gt;&lt;br /&gt;
Die Berücksichtigung der Natur-Luftabtauung (ohne Ventilator) von 1s/1min ist viel zu gering. Das müßte höher sein.&lt;br /&gt;
&lt;br /&gt;
Lfd-Nr. 5 (Luft-Wasser-Wärmepumpen)&amp;lt;br&amp;gt;&lt;br /&gt;
Nach dem Heizungstakt könnte problemlos ein Luftabtauen erfolgen, damit für den nächsten Heizungstakt wieder an abgetauter Verdampfer zu Verfügung steht.&lt;br /&gt;
&lt;br /&gt;
Lfd-Nr. 6 (Luft-Wasser-Wärmepumpen)&amp;lt;br&amp;gt;&lt;br /&gt;
Nach einer Luftabtauung wird der Heiztakt nicht zu Ende geführt, sondern erst wieder beim Unterschreiten der unteren Hysterese gestartet. Dadurch bleibt die Rücklauftemperatur eventuell dauerhaft unterhalb der Solltemperatur und die Raumtemperatur sinkt mit der Zeit ab.&lt;br /&gt;
&lt;br /&gt;
Lfd-Nr. 7 (Luft-Wasser-Wärmepumpen)&amp;lt;br&amp;gt;&lt;br /&gt;
Fällt das Kreisumlaufabtauen auf das Ende des Heizzykluses so startet die Wärmepumpe nicht erneut. Der auf über 30°C erhitzte Wärmetauscher erwärmt nun die Luft in der Wärmepumpe. Bei Erreichen wird der Luftabtaugrenze wird der Ablauftimer auf den Mindestwert gesetzt und verliert die beim Kreisumkehr-Abtauen automatisch bestimmte höhere Ablaufzeit (meist in der Nähe der Maximalzeit).&lt;br /&gt;
&lt;br /&gt;
Lfd-Nr. 8 (Luft-Wasser-Wärmepumpen)&amp;lt;br&amp;gt;&lt;br /&gt;
Fällt das Kreisumlaufabtauen auf das Ende des Heizzykluses so startet die Wärmepumpe erstmal nicht erneut. Durch die Kreisumkehr wurde jedoch ein Schub kalten Wassers im Heizungskreislauf gefangen. Dieser führt dann sehr schnell zu einem Absinken der Rücklauftemperatur und zu einem Neustart der Wärmepumpe.&lt;br /&gt;
&lt;br /&gt;
Lfd-Nr. 9 (Luft-Wasser-Wärmepumpen)&amp;lt;br&amp;gt;&lt;br /&gt;
Das &amp;quot;natürliche&amp;quot; Abtauen wird nicht erkannt. Kommte die Wärmepumpe vor dem Ende der Abtauablaufzeit zum Stehen, so taut der Verdampfer bei positiven Umgebungstemperaturen von ganz alleine ab. Dies kann man Problemlos an der Temperatur &#039;&#039;Wärmequelle Aus&#039;&#039; erkennen, da diese durch die Schmelzenthalphie solange bei 0°C bleibt bis der Verdamper abtaut ist. Dann steigt sie auf die Höhe der Außentemperatur.&lt;br /&gt;
&lt;br /&gt;
Lfd-Nr. 10 (Luft-Wasser-Wärmepumpen)&amp;lt;br&amp;gt;&lt;br /&gt;
Während des Abtauens durch Kreisumlauf wird dem Heizungskreislauf Wärme entzogen. Der Wärmemengen-Zähler zählt jedoch nicht rückwärts. Deshalb ist die von der Wärmepumpe ins Heizsystem eingebrachte Wärmemenge nicht korrekt. Tatsächlich wird ca. 5 % weniger Energie eingebracht und die Arbeitszahl ist ebenfalls ca. 5 % niedriger.&lt;br /&gt;
&lt;br /&gt;
=== Nützliche Links ===&lt;br /&gt;
Die aktuelle Firmware gibt es [https://www.heatpump24.com/DownloadArea.php?layout=1 hier]&lt;br /&gt;
&lt;br /&gt;
Eine Beschreibung der Java-Schnittstelle gibt es [http://www.loxwiki.eu/pages/viewpage.action?pageId=18219334 &#039;&#039;&#039;hier&#039;&#039;&#039;]. Die Seite enthält auch eine Liste der Betriebsdaten (sog. berechnete Werte) die man mit &#039;&#039;get &amp;lt;device&amp;gt; rawdate&#039;&#039; anzeigen und mit dem Attribut &#039;&#039;userHeatpumpValues&#039;&#039; zum Gerät hinzufügen kann.&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Other Components]]&lt;br /&gt;
[[Kategorie:Heizungssteuerung]]&lt;/div&gt;</summary>
		<author><name>Topos</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=FRITZBOX&amp;diff=28171</id>
		<title>FRITZBOX</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=FRITZBOX&amp;diff=28171"/>
		<updated>2018-10-27T13:11:39Z</updated>

		<summary type="html">&lt;p&gt;Topos: /* Fehler nach Firmware Update */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Modul&lt;br /&gt;
|ModPurpose=Steuerung einer Fritz!Box über FHEM &lt;br /&gt;
|ModType=d&lt;br /&gt;
|ModForumArea=FRITZ!Box&lt;br /&gt;
|ModTechName=72_FRITZBOX.pm&lt;br /&gt;
|ModOwner=tupol/Topos ({{Link2FU|5432|Forum}} / [[Benutzer Diskussion:Topos|Wiki]])}}&lt;br /&gt;
&lt;br /&gt;
Das Modul [[FRITZBOX]] ermöglicht die Steuerung einer [[AVM Fritz!Box]] und von AVM FRITZ!WLAN Repeatern durch FHEM . An Fritzboxen können sowohl Geräte abgefragt werden, auf denen FHEM selbst läuft (lokaler Modus), als auch entfernte (externe) Geräte.&lt;br /&gt;
&lt;br /&gt;
== Voraussetzungen ==&lt;br /&gt;
=== Remote-Zugang ===&lt;br /&gt;
Für den Remote-Zugang müssen die Module JSON:XS, LWP und SOAP::Lite installiert sein; auf einem [[Raspberry Pi]] oder unter Ubuntu z.&amp;amp;nbsp;B. mit dem Befehl&lt;br /&gt;
:&amp;lt;code&amp;gt;sudo apt-get install libjson-perl libwww-perl libsoap-lite-perl libjson-xs-perl&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Teilweise ist derzeit zusätzlich die Installation der telnet Libraries erforderlich, auch wenn der Telnet-Zugang nicht genutzt werden soll. Siehe dazu den nachfolgenden Abschnitt.&lt;br /&gt;
&lt;br /&gt;
=== Telnet ===&lt;br /&gt;
Das Modul basierte ursprünglich auf dem Zugriff auf die Fritzbox per Telnet. Ab FRITZ!OS 6.2x baut AVM den abgekündigten Telnet-Zugang sowie die webcm-Schnittstelle sukzessive zurück bzw. hat dies, je nach Firmware, schon ganz abgestellt (siehe {{Link2Forum|Topic=38586|LinkText=dieses Forenthema}}). Der zukunftssichere Zugriff auf die Fritzbox sollte also per TR-064 erfolgen. Der Vollständigkeit halber und für ältere Firmwareversionen: &lt;br /&gt;
&lt;br /&gt;
# Wer den Zugang per Telnet (noch) nutzen (kann und) möchte, muss dies zuerst freischalten. Üblicherweise durch Eingabe von #96*7* an einem direkt an der entsprechenden FritzBox angeschlosssenen Telefon&lt;br /&gt;
# Auf dem System, auf dem FHEM  läuft ([[Systemübersicht#Server|Server]]) muss Telnet installiert sein; auf einem [[Raspberry Pi]] und unter Ubuntu z.&amp;amp;nbsp;B. mit dem Befehl&lt;br /&gt;
::&amp;lt;code&amp;gt;sudo apt-get install libnet-telnet-perl&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Installation ==&lt;br /&gt;
=== Erste Schritte ===&lt;br /&gt;
Zur Erstinstallation reicht ein einfaches &amp;lt;code&amp;gt;define FritzBox FRITZBOX&amp;lt;/code&amp;gt;, dieses Modul funktioniert lokal (FHEM auf Fritzbox) sowie per Fernzugriff (FHEM auf einem anderen Server im Netz, siehe nächsten Schritt).&lt;br /&gt;
&lt;br /&gt;
==== TR-064: Modul FRITZBOX für Zugriff auf einem externen Server einrichten ====&lt;br /&gt;
Für den Fernzugriff über TR-064 auf eine oder mehrere Fritzboxen und/oder einen FRITZ!WLAN Repeater sind die folgenden Schritte nötig (für jedes Gerät):&lt;br /&gt;
&lt;br /&gt;
Fritzbox definieren:&lt;br /&gt;
:&amp;lt;code&amp;gt;define FritzBox FRITZBOX&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wenn die Fritzbox nicht unter &amp;lt;nowiki&amp;gt;http://fritz.box&amp;lt;/nowiki&amp;gt; erreichbar ist, IP im define setzen:&lt;br /&gt;
:&amp;lt;code&amp;gt;define FritzBox FRITZBOX 192.168.168.168&amp;lt;/code&amp;gt;&lt;br /&gt;
192.168.168.168 dabei natürlich durch die passende IP ersetzen... Alternativ kann statt der IP auch der Hostname eingegeben werden.&lt;br /&gt;
&lt;br /&gt;
Wenn (&#039;&#039;&#039;und nur wenn&#039;&#039;&#039;) das Login auf der Benutzeroberfläche der FritzBox mit User und Passwort (und nicht nur per Passwort) geschieht, den User konfigurieren:&lt;br /&gt;
:&amp;lt;code&amp;gt;attr FritzBox boxUser &#039;&#039;Benutzername&#039;&#039; &amp;lt;/code&amp;gt;&lt;br /&gt;
In der Fritzbox muss dann auch &amp;quot;Anmeldung mit FRITZ!Box-Benutzernamen und Kennwort&amp;quot; ausgewählt sein.&lt;br /&gt;
&lt;br /&gt;
Passwort konfigurieren:&lt;br /&gt;
:&amp;lt;code&amp;gt;set FritzBox password &#039;&#039;Passwort&#039;&#039;&amp;lt;/code&amp;gt;  - legt das zugehörige Passwort fest (nur einmal --&amp;gt; gehört nicht in die cfg-Datei) &lt;br /&gt;
&lt;br /&gt;
Manuelle TR-064 Kommandos erlauben (Das Auslesen der Readings per TR-064 funktioniert auch ohne dieses Attribut.):&lt;br /&gt;
:&amp;lt;code&amp;gt;attr FritzBox allowTR064Command 1&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Telnet: Modul FRITZBOX für Zugriff auf einem externen Server einrichten ====&lt;br /&gt;
[[Datei:Screenshot_FritzBox_TelnetUser.png|mini|300px|rechts|Anlegen des Attributs telnetUser]]&lt;br /&gt;
Bei Fernzugriff über Telnet sind weitere Schritte nötig:&lt;br /&gt;
# Telnet auf der Fritzbox freischalten (Tastenkombination #96*7* am angeschlossenen Telefon (auch FritzFon)&lt;br /&gt;
# TelnetUser definieren (wie im Screenshot gezeigt)&lt;br /&gt;
# Passwort zum Benutzer auf der Fritzbox definieren&lt;br /&gt;
&lt;br /&gt;
[[Datei:Screenshot_FritzBox_Passwort.png|mini|300px|rechts|Passwort definieren]]&lt;br /&gt;
&lt;br /&gt;
(bitte die Buttons {{Taste|set}} und {{Taste|attr}} bei der Definition der jeweiligen Einträge nicht vergessen)&lt;br /&gt;
&lt;br /&gt;
Wer stattdessen lieber das [[Konfiguration|Befehl-Eingabefeld]] verwendet:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;define FritzBox FRITZBOX&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;attr FritzBox telnetUser &#039;&#039;Benutzername&#039;&#039; &amp;lt;/code&amp;gt; - legt den Benutzer fest&lt;br /&gt;
:&amp;lt;code&amp;gt;set FritzBox password &#039;&#039;Passwort&#039;&#039; &amp;lt;/code&amp;gt; - legt das zugehörige Passwort fest&lt;br /&gt;
&lt;br /&gt;
Wer keinen User konfiguriert hat, kann das Feld &amp;quot;telnetUser&amp;quot; leer lassen.&lt;br /&gt;
&lt;br /&gt;
Wer sicher gehen möchte, dass auch tatsächlich Telnet und nicht andere Zugriffe benutzt werden, sollte außerdem noch setzen:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;attr FritzBox forceTelnetConnection 1&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== mögliche Fehlermeldungen ===&lt;br /&gt;
Sollte schon bei &amp;lt;code&amp;gt;define FritzBox FRITZBOX&amp;lt;/code&amp;gt; die Fehlermeldung kommen, dass dieses Modul nicht existiert, dann bitte prüfen, ob FHEM  auf dem aktuellen Stand ist und ggf. [[Update|aktualisieren]].&lt;br /&gt;
&lt;br /&gt;
Kommt jetzt bei der erneuten Definition die Fehlermeldung &amp;lt;code&amp;gt;Error: Perl modul Net::Telnet is missing on this system&amp;lt;/code&amp;gt; bitte wie oben schon erwähnt den Befehl &lt;br /&gt;
:&amp;lt;code&amp;gt;sudo apt-get install libnet-telnet-perl&amp;lt;/code&amp;gt; &lt;br /&gt;
direkt per Telnet/SSH auf dem FHEM-Server ausführen und neu starten.&lt;br /&gt;
Sollte alles geklappt haben, seht ihr nun eure Fritzbox und könnt diverse Einstellungen manuell vornehmen und/oder automatisch vornehmen lassen.&lt;br /&gt;
&lt;br /&gt;
== Anwendung ==&lt;br /&gt;
=== Define ===&lt;br /&gt;
Siehe  {{Link2CmdRef|Lang=de|Anker=FRITZBOXdefine}}&lt;br /&gt;
&lt;br /&gt;
=== Attribute ===&lt;br /&gt;
Siehe {{Link2CmdRef|Lang=de|Anker=FRITZBOXattr}}&lt;br /&gt;
&lt;br /&gt;
=== TR-064 ===&lt;br /&gt;
Die offizielle Programmier-Schnittstelle der Fritz!Box läuft über das Protokoll TR-064.&lt;br /&gt;
&lt;br /&gt;
mit dem Attribute&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;attr &amp;lt;device&amp;gt; allowTR064Command 1&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
kann man den Befehl&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;get &amp;lt;device&amp;gt; tr064Command &amp;lt;service&amp;gt; &amp;lt;control&amp;gt; &amp;lt;action&amp;gt; [[parameterName1 parameterValue1] ...]&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
freischalten und damit auf diese Schnittstelle zugreifen.&lt;br /&gt;
&lt;br /&gt;
AVM hat die Schnittstellenbeschreibung unter [http://avm.de/service/schnittstellen/] veröffentlicht. Diese wird jedoch nur sehr sporadisch gepflegt.&amp;lt;br&amp;gt;&lt;br /&gt;
Ein besserer Einstiegspunkt befindet sich auf der Box unter http://fritz.box:49000/tr64desc.xml.&amp;lt;br&amp;gt;&lt;br /&gt;
Die möglichen TR-064-Aktionen kann man auch über den Befehl &amp;lt;code&amp;gt;get &amp;lt;device&amp;gt; tr064ServiceList&amp;lt;/code&amp;gt; auslesen.&lt;br /&gt;
&lt;br /&gt;
Folgende Service und Controls existieren (für den get-Befehl &#039;&#039;tr064Command&#039;&#039; werden nur die fett formatierten Wörter benötigt)&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!serviceType!!controlURL!!XML!!Dokument bei AVM&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;urn:dslforum-org:service:&amp;lt;/nowiki&amp;gt;&#039;&#039;&#039;DeviceInfo:1&#039;&#039;&#039;||/upnp/control/&#039;&#039;&#039;deviceinfo&#039;&#039;&#039;||[http://fritz.box:49000/deviceinfoSCPD.xml deviceinfoSCPD.xml]||[http://avm.de/fileadmin/user_upload/Global/Service/Schnittstellen/deviceinfoSCPD.pdf deviceinfoSCPD.pdf]&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;urn:dslforum-org:service:&amp;lt;/nowiki&amp;gt;&#039;&#039;&#039;DeviceConfig:1&#039;&#039;&#039;||/upnp/control/&#039;&#039;&#039;deviceconfig&#039;&#039;&#039;||[http://fritz.box:49000/deviceconfigSCPD.xml deviceconfigSCPD.xml]||[http://avm.de/fileadmin/user_upload/Global/Service/Schnittstellen/deviceconfigSCPD.pdf deviceconfigSCPD.pdf]&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;urn:dslforum-org:service:&amp;lt;/nowiki&amp;gt;&#039;&#039;&#039;Layer3Forwarding:1&#039;&#039;&#039;||/upnp/control/&#039;&#039;&#039;layer3forwarding&#039;&#039;&#039;||[http://fritz.box:49000//layer3forwardingSCPD.xml layer3forwardingSCPD.xml]||[http://avm.de/fileadmin/user_upload/Global/Service/Schnittstellen/layer3forwardingSCPD.pdf layer3forwardingSCPD.pdf]&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;urn:dslforum-org:service:&amp;lt;/nowiki&amp;gt;&#039;&#039;&#039;LANConfigSecurity:1&#039;&#039;&#039;||/upnp/control/&#039;&#039;&#039;lanconfigsecurity&#039;&#039;&#039;||[http://fritz.box:49000//lanconfigsecuritySCPD.xml lanconfigsecuritySCPD.xml]||[http://avm.de/fileadmin/user_upload/Global/Service/Schnittstellen/lanconfigsecuritySCPD.pdf lanconfigsecuritySCPD.pdf]&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;urn:dslforum-org:service:&amp;lt;/nowiki&amp;gt;&#039;&#039;&#039;ManagementServer:1&#039;&#039;&#039;||/upnp/control/&#039;&#039;&#039;mgmsrv&#039;&#039;&#039;||[http://fritz.box:49000//mgmsrvSCPD.xml mgmsrvSCPD.xml]||[http://avm.de/fileadmin/user_upload/Global/Service/Schnittstellen/mgmsrvSCPD.pdf mgmsrvSCPD.pdf]&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;urn:dslforum-org:service:&amp;lt;/nowiki&amp;gt;&#039;&#039;&#039;Time:1&#039;&#039;&#039;||/upnp/control/&#039;&#039;&#039;time&#039;&#039;&#039;||[http://fritz.box:49000//timeSCPD.xml timeSCPD.xml]||[http://avm.de/fileadmin/user_upload/Global/Service/Schnittstellen/timeSCPD.pdf timeSCPD.pdf]&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;urn:dslforum-org:service:&amp;lt;/nowiki&amp;gt;&#039;&#039;&#039;UserInterface:1&#039;&#039;&#039;||/upnp/control/&#039;&#039;&#039;userif&#039;&#039;&#039;||[http://fritz.box:49000//userifSCPD.xml userifSCPD.xml]||[http://avm.de/fileadmin/user_upload/Global/Service/Schnittstellen/userifSCPD.pdf userifSCPD.pdf]&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;urn:dslforum-org:service:&amp;lt;/nowiki&amp;gt;&#039;&#039;&#039;X_VoIP:1&#039;&#039;&#039;||/upnp/control/&#039;&#039;&#039;x_voip&#039;&#039;&#039;||[http://fritz.box:49000//x_voipSCPD.xml x_voipSCPD.xml]||[http://avm.de/fileadmin/user_upload/Global/Service/Schnittstellen/x_voipSCPD.pdf x_voipSCPD.pdf]&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;urn:dslforum-org:service:&amp;lt;/nowiki&amp;gt;&#039;&#039;&#039;X_AVM-DE_Storage:1&#039;&#039;&#039;||/upnp/control/&#039;&#039;&#039;x_storage&#039;&#039;&#039;||[http://fritz.box:49000//x_storageSCPD.xml x_storageSCPD.xml]||[http://avm.de/fileadmin/user_upload/Global/Service/Schnittstellen/x_storageSCPD.pdf x_storageSCPD.pdf]&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;urn:dslforum-org:service:&amp;lt;/nowiki&amp;gt;&#039;&#039;&#039;X_AVM-DE_OnTel:1&#039;&#039;&#039;||/upnp/control/&#039;&#039;&#039;x_contact&#039;&#039;&#039;||[http://fritz.box:49000//x_contactSCPD.xml x_contactSCPD.xml]||[http://avm.de/fileadmin/user_upload/Global/Service/Schnittstellen/x_contactSCPD.pdf x_contactSCPD.pdf]&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;urn:dslforum-org:service:&amp;lt;/nowiki&amp;gt;&#039;&#039;&#039;X_AVM-DE_WebDAVClient:1&#039;&#039;&#039;||/upnp/control/&#039;&#039;&#039;x_webdav&#039;&#039;&#039;||[http://fritz.box:49000//x_webdavSCPD.xml x_webdavSCPD.xml]||[http://avm.de/fileadmin/user_upload/Global/Service/Schnittstellen/x_webdavSCPD.pdf x_webdavSCPD.pdf]&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;urn:dslforum-org:service:&amp;lt;/nowiki&amp;gt;&#039;&#039;&#039;X_AVM-DE_UPnP:1&#039;&#039;&#039;||/upnp/control/&#039;&#039;&#039;x_upnp&#039;&#039;&#039;||[http://fritz.box:49000//x_upnpSCPD.xml x_upnpSCPD.xml]||[http://avm.de/fileadmin/user_upload/Global/Service/Schnittstellen/x_upnp.pdf x_upnp.pdf]&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;urn:dslforum-org:service:&amp;lt;/nowiki&amp;gt;&#039;&#039;&#039;X_AVM-DE_RemoteAccess:1&#039;&#039;&#039;||/upnp/control/&#039;&#039;&#039;x_remote&#039;&#039;&#039;||[http://fritz.box:49000/x_remoteSCPD.xml x_remoteSCPD.xml]||[http://avm.de/fileadmin/user_upload/Global/Service/Schnittstellen/x_remoteSCPD.pdf x_remoteSCPD.pdf]&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;urn:dslforum-org:service:&amp;lt;/nowiki&amp;gt;&#039;&#039;&#039;X_AVM-DE_MyFritz:1&#039;&#039;&#039;||/upnp/control/&#039;&#039;&#039;x_myfritz&#039;&#039;&#039;||[http://fritz.box:49000/x_myfritzSCPD.xml x_myfritzSCPD.xml]||[http://avm.de/fileadmin/user_upload/Global/Service/Schnittstellen/x_myfritzSCPD.pdf x_myfritzSCPD.pdf]&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;urn:dslforum-org:service:&amp;lt;/nowiki&amp;gt;&#039;&#039;&#039;X_AVM-DE_TAM:1&#039;&#039;&#039;||/upnp/control/&#039;&#039;&#039;x_tam&#039;&#039;&#039;||[http://fritz.box:49000/x_tamSCPD.xml x_tamSCPD.xml]||[http://avm.de/fileadmin/user_upload/Global/Service/Schnittstellen/x_tam.pdf x_tam.pdf]&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;urn:dslforum-org:service:&amp;lt;/nowiki&amp;gt;&#039;&#039;&#039;X_AVM-DE_AppSetup:1&#039;&#039;&#039;||/upnp/control/&#039;&#039;&#039;x_appsetup&#039;&#039;&#039;||[http://fritz.box:49000/x_homeautoSCPD.xml x_homeautoSCPD.xml]||[http://avm.de/fileadmin/user_upload/Global/Service/Schnittstellen/x_appsetupSCPD.pdf x_appsetupSCPD.pdf]&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;urn:dslforum-org:service:&amp;lt;/nowiki&amp;gt;&#039;&#039;&#039;X_AVM-DE_Homeauto:1&#039;&#039;&#039;||/upnp/control/&#039;&#039;&#039;x_homeauto&#039;&#039;&#039;||[http://fritz.box:49000/x_homeautoSCPD.xml x_homeautoSCPD.xml]||[http://avm.de/fileadmin/user_upload/Global/Service/Schnittstellen/x_homeautoSCPD.pdf x_homeautoSCPD.pdf]&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;urn:dslforum-org:service:&amp;lt;/nowiki&amp;gt;&#039;&#039;&#039;WLANConfiguration:1&#039;&#039;&#039;||/upnp/control/&#039;&#039;&#039;wlanconfig1&#039;&#039;&#039;||[http://fritz.box:49000/wlanconfigSCPD.xml wlanconfigSCPD.xml]||[http://avm.de/fileadmin/user_upload/Global/Service/Schnittstellen/wlanconfigSCPD.pdf wlanconfigSCPD.pdf]&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;urn:dslforum-org:service:&amp;lt;/nowiki&amp;gt;&#039;&#039;&#039;WLANConfiguration:2&#039;&#039;&#039;||/upnp/control/&#039;&#039;&#039;wlanconfig2&#039;&#039;&#039;||[http://fritz.box:49000/wlanconfigSCPD.xml wlanconfigSCPD.xml]||[http://avm.de/fileadmin/user_upload/Global/Service/Schnittstellen/wlanconfigSCPD.pdf wlanconfigSCPD.pdf]&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;urn:dslforum-org:service:&amp;lt;/nowiki&amp;gt;&#039;&#039;&#039;WLANConfiguration:3&#039;&#039;&#039;||/upnp/control/&#039;&#039;&#039;wlanconfig3&#039;&#039;&#039;||[http://fritz.box:49000/wlanconfigSCPD.xml wlanconfigSCPD.xml]||[http://avm.de/fileadmin/user_upload/Global/Service/Schnittstellen/wlanconfigSCPD.pdf wlanconfigSCPD.pdf]&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;urn:dslforum-org:service:&amp;lt;/nowiki&amp;gt;&#039;&#039;&#039;Hosts:1&#039;&#039;&#039;||/upnp/control/&#039;&#039;&#039;hosts&#039;&#039;&#039;||[http://fritz.box:49000/hostsSCPD.xml hostsSCPD.xml]||[http://avm.de/fileadmin/user_upload/Global/Service/Schnittstellen/hostsSCPD.pdf hostsSCPD.pdf]&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;urn:dslforum-org:service:&amp;lt;/nowiki&amp;gt;&#039;&#039;&#039;LANEthernetInterfaceConfig:1&#039;&#039;&#039;||/upnp/control/&#039;&#039;&#039;lanethernetifcfg&#039;&#039;&#039;||[http://fritz.box:49000/lanifconfigSCPD.xml lanifconfigSCPD.xml]||[http://avm.de/fileadmin/user_upload/Global/Service/Schnittstellen/lanifconfigSCPD.pdf lanifconfigSCPD.pdf]&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;urn:dslforum-org:service:&amp;lt;/nowiki&amp;gt;&#039;&#039;&#039;LANHostConfigManagement:1&#039;&#039;&#039;||/upnp/control/&#039;&#039;&#039;lanhostconfigmgm&#039;&#039;&#039;||[http://fritz.box:49000/lanhostconfigmgmSCPD.xml lanhostconfigmgmSCPD.xml]||[http://avm.de/fileadmin/user_upload/Global/Service/Schnittstellen/lanhostconfigmgmSCPD.pdf lanhostconfigmgmSCPD.pdf]&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;urn:dslforum-org:service:&amp;lt;/nowiki&amp;gt;&#039;&#039;&#039;WANCommonInterfaceConfig:1&#039;&#039;&#039;||/upnp/control/&#039;&#039;&#039;wancommonifconfig1&#039;&#039;&#039;||[http://fritz.box:49000/wancommonifconfigSCPD.xml wancommonifconfigSCPD.xml]||[http://avm.de/fileadmin/user_upload/Global/Service/Schnittstellen/wancommonifconfigSCPD.pdf wancommonifconfigSCPD.pdf]&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;urn:dslforum-org:service:&amp;lt;/nowiki&amp;gt;&#039;&#039;&#039;WANDSLInterfaceConfig:1&#039;&#039;&#039;||/upnp/control/&#039;&#039;&#039;wandslifconfig1&#039;&#039;&#039;||[http://fritz.box:49000/wandslifconfigSCPD.xml wandslifconfigSCPD.xml]||[http://avm.de/fileadmin/user_upload/Global/Service/Schnittstellen/wandslifconfigSCPD.pdf wandslifconfigSCPD.pdf]&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;urn:dslforum-org:service:&amp;lt;/nowiki&amp;gt;&#039;&#039;&#039;WANDSLLinkConfig:1&#039;&#039;&#039;||/upnp/control/&#039;&#039;&#039;wandsllinkconfig1&#039;&#039;&#039;||[http://fritz.box:49000/wandsllinkconfigSCPD.xml wandsllinkconfigSCPD.xml]||[http://avm.de/fileadmin/user_upload/Global/Service/Schnittstellen/wandsllinkconfigSCPD.pdf wandsllinkconfigSCPD.pdf]&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;urn:dslforum-org:service:&amp;lt;/nowiki&amp;gt;&#039;&#039;&#039;WANEthernetLinkConfig:1&#039;&#039;&#039;||/upnp/control/&#039;&#039;&#039;wanethlinkconfig1&#039;&#039;&#039;||[http://fritz.box:49000/wanethlinkconfigSCPD.xml wanethlinkconfigSCPD.xml]||[http://avm.de/fileadmin/user_upload/Global/Service/Schnittstellen/wanethlinkconfigSCPD.pdf wanethlinkconfigSCPD.pdf]&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;urn:dslforum-org:service:&amp;lt;/nowiki&amp;gt;&#039;&#039;&#039;WANPPPConnection:1&#039;&#039;&#039;||/upnp/control/&#039;&#039;&#039;wanpppconn1&#039;&#039;&#039;||[http://fritz.box:49000/wanpppconnSCPD.xml wanpppconnSCPD.xml]||[http://avm.de/fileadmin/user_upload/Global/Service/Schnittstellen/wanpppconnSCPD.pdf wanpppconnSCPD.pdf]&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;urn:dslforum-org:service:&amp;lt;/nowiki&amp;gt;&#039;&#039;&#039;WANIPConnection:1&#039;&#039;&#039;||/upnp/control/&#039;&#039;&#039;wanipconnection1&#039;&#039;&#039;||[http://fritz.box:49000/wanipconnSCPD.xml wanipconnSCPD.xml]||[http://avm.de/fileadmin/user_upload/Global/Service/Schnittstellen/wanipconnSCPD.pdf wanipconnSCPD.pdf]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Status-Symbol ===&lt;br /&gt;
&amp;lt;code&amp;gt;attr &amp;lt;device&amp;gt; devStateIcon .*on.*off:WLAN_on_gWLAN_off .*on.*on.*:WLAN_on_gWLAN_on WLAN..off.*:WLAN_off&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Im Verzeichnis www/images/default müssen die passenden Dateien &amp;quot;WLAN_on_gWLAN_off.png&amp;quot;, &amp;quot;WLAN_on_gWLAN_on.png&amp;quot; und &amp;quot;WLAN_off.png&amp;quot; liegen. Wenn die PNGs fehlen, können sie {{Link2Forum|Topic=29725|Message=318113|LinkText=hier}} heruntergeladen werden.&lt;br /&gt;
&lt;br /&gt;
== Anwendungsbeispiele ==&lt;br /&gt;
[[Datei:Screenshot_FritzBox1.png|mini|300px|rechts|FRITZBOX Gerät auf der FHEM  Oberfläche]]&lt;br /&gt;
Sollte alles geklappt haben, seht ihr nun unter &amp;quot;Unsortiert&amp;quot; den im nebenstehenden Screenshot gezeigten Eintrag für das &amp;quot;Gerät&amp;quot; (hier mit dem Icon &amp;quot;it_router&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
=== TR-064 Beispiele ===&lt;br /&gt;
*Box Reboot: &amp;lt;code&amp;gt;get &amp;lt;device&amp;gt; tr064Command DeviceConfig:1 deviceconfig Reboot&amp;lt;/code&amp;gt;&lt;br /&gt;
*Internet Reconnect: &amp;lt;code&amp;gt;get &amp;lt;device&amp;gt; tr064Command WANIPConnection:1 wanipconnection1 ForceTermination&amp;lt;/code&amp;gt;&lt;br /&gt;
*Daten eines Smart-Home-Gerätes auslesen: &amp;lt;code&amp;gt;get &amp;lt;device&amp;gt; tr064Command X_AVM-DE_Homeauto:1 x_homeauto GetGenericDeviceInfos NewIndex 0&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Klingel- und Sprachausgabe per TR-064 ===&lt;br /&gt;
Das geht derzeit nicht, da entsprechende Kommandos per TR-064 nicht verfügbar sind. Da Telnet sukzessive abgestellt wird, sollten sich Interessenten per Feature-Request an AVM wenden, wie {{Link2Forum|Topic=38586|LinkText=hier}} beschrieben.&lt;br /&gt;
&lt;br /&gt;
Eine Alternative um Telefone klingeln zu lassen, ist die Nutzung des [[SIP-Client]]s.&lt;br /&gt;
&lt;br /&gt;
=== Anwesenheitserkennung per regelmäßiger Abfrage über das PRESENCE Modul ===&lt;br /&gt;
Fritzboxen und die FRITZ!WLAN Repeater speichern den Status angemeldeter Geräte. Dieser Status lässt sich mittels des FRITZBOX Moduls über Readings abfragen, die das Format mac_AA_AA_AA_AA_AA_AA haben und die MAC-Adressen der jeweils angemeldeten Geräte (AA:AA:AA:AA:AA:AA) enthalten. Das Reading existiert, wenn das Gerät angemeldet ist. Wenn das Gerät abgemeldet ist, existiert es nicht mehr. Es gibt auch noch den Zwischenstatus &amp;quot;inactive&amp;quot;, der anscheinend gesetzt wird, bevor das Reading gelöscht wird.&lt;br /&gt;
&lt;br /&gt;
Mit Hilfe des [[PRESENCE]] Moduls (vgl. [[Anwesenheitserkennung]]) kann man auf diese Weise den Anwesenheitsstatus abfragen. Anregungen dazu gibt es im zugehörigen {{Link2Forum|Topic=39433|LinkText=Forenthread}} zur Anwesenheitserkennung und in [http://heinz-otto.blogspot.de/2015/07/die-zeiten-andern-sich.html diesem  Blogpost]. Auf dieser Basis könnte eine einfache Implementierung zum Beispiel so aussehen:&lt;br /&gt;
&lt;br /&gt;
Funktion in [[99_myUtils anlegen|99_myUtils]]:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&#039;perl&#039;&amp;gt;sub checkFritzMACpresent($$) {&lt;br /&gt;
  # Benötigt: Name der zu testenden Fritzbox ($Device),&lt;br /&gt;
  #           zu suchende MAC ($MAC), &lt;br /&gt;
  # Rückgabe: 1 = Gerät gefunden&lt;br /&gt;
  #           0 = Gerät nicht gefunden&lt;br /&gt;
  my ($Device, $MAC) = @_;&lt;br /&gt;
  my $Status = 0;&lt;br /&gt;
  $MAC =~ tr/:/_/;&lt;br /&gt;
  $MAC = &amp;quot;mac_&amp;quot;.uc($MAC);&lt;br /&gt;
  my $StatusFritz = ReadingsVal($Device, $MAC, &amp;quot;weg&amp;quot;);&lt;br /&gt;
  if ($StatusFritz eq &amp;quot;weg&amp;quot;) {&lt;br /&gt;
    Log 1, (&amp;quot;checkFritzMACpresent ($Device): $MAC nicht gefunden, abwesend.&amp;quot;);&lt;br /&gt;
    $Status = 0;&lt;br /&gt;
  } elsif ($StatusFritz eq &amp;quot;inactive&amp;quot;) {&lt;br /&gt;
    Log 1, (&amp;quot;checkFritzMACpresent ($Device): $MAC ist &amp;gt;inactive&amp;lt;, also abwesend.&amp;quot;);&lt;br /&gt;
    $Status = 0;&lt;br /&gt;
  } else {&lt;br /&gt;
    # Reading existiert, Rückgabewert ist nicht &amp;quot;inactive&amp;quot;, also ist das Gerät per WLAN angemeldet.&lt;br /&gt;
    Log 4, (&amp;quot;checkFritzMACpresent ($Device): $MAC gefunden, Gerät heißt &amp;gt;$StatusFritz&amp;lt;.&amp;quot;);&lt;br /&gt;
    $Status = 1;&lt;br /&gt;
  }&lt;br /&gt;
  return $Status&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nutzung dieser Funktion mit dem PRESENCE Modul definieren:&lt;br /&gt;
:&amp;lt;code&amp;gt;define &amp;lt;Name&amp;gt; PRESENCE function {checkFritzMACpresent(&amp;quot;Fritzbox&amp;quot;,&amp;quot;AA:BB:CC:DD:EE:FF&amp;quot;)}  60 60&amp;lt;/code&amp;gt;&lt;br /&gt;
wobei&lt;br /&gt;
*&amp;lt;Name&amp;gt; ein beliebig zu wählender Name für die PRESENCE-Funktion ist,&lt;br /&gt;
*Fritzbox der Name ist, mit dem ihr die abzufragende Fritzbox als FRITZBOX definiert habt,&lt;br /&gt;
*AA:BB:CC:DD:EE:FF die MAC-Adresse des gesuchten Geräts ist.&lt;br /&gt;
* &amp;quot;60 60&amp;quot; sagt, dass der Anwesenheitsstatus im 60-Sekunden-Takt abgefragt wird. Das macht natürlich nur Sinn, wenn ihr mit &amp;lt;code&amp;gt;attr Fritzbox INTERVAL 60&amp;lt;/code&amp;gt; den Abfrageinterval bei der Fritzbox auch entsprechend hochgesetzt habt. Der Standard ist 300.&lt;br /&gt;
* &amp;quot;Log 1&amp;quot; führt immer zum Loggen. Das ist zum Einrichten praktisch, ohne dass man gleich für das ganze Modul oder ganz FHEM &amp;lt;code&amp;gt;attr &amp;lt;device&amp;gt; verbose 5&amp;lt;/code&amp;gt; setzen muss. Wenn es läuft, können die &amp;quot;Log 1&amp;quot;-Zeilen gelöscht, auskommentiert (# an den Zeilenanfang) oder in &amp;quot;Log 5&amp;quot; geändert werden.&lt;br /&gt;
&lt;br /&gt;
=== Anwesenheitserkennung über mehrere Fritzboxen oder AVM Repeater und Fritzbox ===&lt;br /&gt;
Existiert ein AVM Repeater im Netzwerk, kann der als eigenständiges Gerät mit FRITZBOX definiert werden. WLAN Geräte an der Fritzbox werden in der Instanz der Fritzbox gelistet und WLAN Geräte am Repeater in der Repeater Instanz. Um trotzdem die Anwesenheit im Netzwerk einfach zu erkennen, muss die Subroutine in 99_myUtils.pm abgewandelt werden.&lt;br /&gt;
&lt;br /&gt;
Existiert eine zweite Fritzbox im Accesspointmodus, werden die WLAN Geräte im Netzwerk alle in der Hauptfritzbox an einem LAN Anschluss gelistet. D.h. man sieht an der Hauptfritzbox nicht, dass sie im WLAN sind. Eine zweite Instanz mit dem FRITZBOX Modul muss wegen der Anwesenheitserkennung nicht gemacht werden. Die folgende Routine kann aber universell eingesetzt werden, unabhängig von der Anzahl der FRITZBOX Instanzen. Wer mitloggen will, kann das analog zur obigen Routine einbauen&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&#039;perl&#039;&amp;gt;sub checkAllFritzMACpresent($) {&lt;br /&gt;
  # Benötigt: nur die zu suchende MAC ($MAC), &lt;br /&gt;
  # Es werden alle Instanzen vom Type FRITZBOX abgefragt&lt;br /&gt;
  #&lt;br /&gt;
  # Rückgabe: 1 = Gerät gefunden&lt;br /&gt;
  #           0 = Gerät nicht gefunden&lt;br /&gt;
  my ($MAC) = @_;&lt;br /&gt;
  # Wird in keiner Instanz die MAC Adresse gefunden bleibt der Status 0&lt;br /&gt;
  my $Status = 0;&lt;br /&gt;
  $MAC =~ tr/:/_/;&lt;br /&gt;
  $MAC = &amp;quot;mac_&amp;quot;.uc($MAC);&lt;br /&gt;
  my @FBS = devspec2array(&amp;quot;TYPE=FRITZBOX&amp;quot;);&lt;br /&gt;
    foreach( @FBS ) {&lt;br /&gt;
		my $StatusFritz = ReadingsVal($_, $MAC, &amp;quot;weg&amp;quot;);&lt;br /&gt;
		if ($StatusFritz eq &amp;quot;weg&amp;quot;) {&lt;br /&gt;
		} elsif ($StatusFritz eq &amp;quot;inactive&amp;quot;) {&lt;br /&gt;
		} else {&lt;br /&gt;
		  # Reading existiert, Rückgabewert ist nicht &amp;quot;inactive&amp;quot;, also ist das Gerät am Netzwerk angemeldet.&lt;br /&gt;
		  $Status = 1;&lt;br /&gt;
		}&lt;br /&gt;
    }&lt;br /&gt;
  return $Status&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Da hiermit nach allen Instanzen mit dem TYPE=FRITZBOX durchsucht wird, braucht der Name der Fritzbox nicht angegeben werden.&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;define &amp;lt;Name&amp;gt; PRESENCE function {checkAllFritzMACpresent(&amp;quot;AA:BB:CC:DD:EE:FF&amp;quot;)}  60 60&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Abfrage auf einen bestimmten Status kann einfach erweitert werden, ist aber immer vom Entwicklunsgstand der Fritzbox Firmware und des FRITZBOX Moduls abhängig. Eventuell erreicht man bessere Reaktionszeiten auf Abwesenheit  durch diesen Zusatz:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&#039;perl&#039;&amp;gt;my $StatusFritz = ReadingsVal($_, $MAC, &amp;quot;weg&amp;quot;);&lt;br /&gt;
		if ($StatusFritz eq &amp;quot;weg&amp;quot;) {&lt;br /&gt;
		} elsif ($StatusFritz eq &amp;quot;inactive&amp;quot;) {&lt;br /&gt;
		} elsif ($StatusFritz =~ /(.*)s, 0/) { &lt;br /&gt;
                # Dieser Zweig testet auf &amp;quot;&amp;lt;geraetename&amp;gt; (WLAN, 0 / 0 Mbit/s, 0)&amp;quot;&lt;br /&gt;
		} else {&lt;br /&gt;
		  $Status = 1;&lt;br /&gt;
		}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Weitere Hinweise zu komplexeren Abfragen mehrere Boxen auf einmal etc. findet ihr auch im diesem {{Link2Forum|Topic=39433|LinkText=Forenthread}}.&lt;br /&gt;
&lt;br /&gt;
=== Anwesenheitserkennung per Notify ===&lt;br /&gt;
Der von Fritzboxen und Fritz!WLAN Repeatern gespeicherte Status zum Status angemeldeter Geräte lässt sich (statt per PRESENCE, s.o.) auch per [[notify]] anfragen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;define &amp;lt;Name&amp;gt; notify Fritzbox:mac_AA_BB_CC_DD_EE_FF:.* {&lt;br /&gt;
  if (ReadingsVal(&amp;quot;Fritzbox&amp;quot;, &amp;quot;mac_AA_BB_CC_DD_EE_FF&amp;quot;, &amp;quot;inactive&amp;quot;) eq &amp;quot;inactive&amp;quot;) &lt;br /&gt;
  {&lt;br /&gt;
    fhem(&amp;quot;set anwesend_smartphone absent&amp;quot;);&lt;br /&gt;
  } &lt;br /&gt;
  else &lt;br /&gt;
  {&lt;br /&gt;
    fhem(&amp;quot;set anwesend_smartphone present&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hinweise:&lt;br /&gt;
* &amp;lt;code&amp;gt;fhem(&amp;quot;set anwesend_smartphone absent&amp;quot;);&amp;lt;/code&amp;gt; ist nur ein Beispiel, das einen Dummy auf den Status &amp;quot;absent&amp;quot; bzw. &amp;quot;present&amp;quot; setzt. Man kann hier natürlich auch gleich entsprechende Aktionen durchführen. Wer das Beispiel übernehmen möchte, sollte den Dummy vorher definieren (&amp;lt;code&amp;gt;define anwesend_smartphone dummy&amp;lt;/code&amp;gt;).&lt;br /&gt;
* mac_AA_BB_CC_DD_EE_FF ist die MAC-Adresse des gesuchten Geräts.&lt;br /&gt;
* &amp;quot;Fritzbox&amp;quot; ist der Name, unter dem die Fritzbox als FRITZBOX-Modul definiert wurde.&lt;br /&gt;
* Das Notify funktioniert, weil Geräte, wenn sie sich abgemeldet haben, erst den Status &amp;quot;inactive&amp;quot; erhalten. Ist das Gerät ganz abgemeldet, verschwindet das mac_.*-Reading. Dabei löst das Notify nicht mehr aus. Da das mac-.*-Reading aber vorher auf &amp;quot;inactive&amp;quot; stand, wurde die Abwesend-Aktion schon ausgeführt.&lt;br /&gt;
* Damit der Notify nicht andauernd losgeht, sollte man mittels &amp;lt;code&amp;gt;attr Fritzbox [[event-on-change-reading]] mac_AA_BB_CC_DD_EE_FF&amp;lt;/code&amp;gt; Events nur auslösen, wenn sich der Status des Gerätes ändert. Will man mehrere Geräte abfragen, sollte man &amp;lt;code&amp;gt;attr Fritzbox event-on-change-reading mac_AA_BB_CC_DD_EE_FF,mac_GG_HH_II_JJ_KK_LL&amp;lt;/code&amp;gt; setzen, damit bei der Änderung jedes Readings ein Event ausgelöst wird.&lt;br /&gt;
&lt;br /&gt;
=== Vergleich Anwesenheitserkennung PRESENCE/Notify ===&lt;br /&gt;
Die Anwesenheitserkennung per regelmäßiger PRESENCE-Abfrage hat den Vorteil, dass sie im Turnus der regelmäßigen Abfragen immer einen aktuellen Status produziert. Sie hat dafür den Nachteil, dass die PRESENCE-Funktionen regelmäßig abgearbeitet werden müssen, auch wenn sich gar nichts ändert. Außerdem aktualisiert sich der Status nicht sofort, sondern erst bei der nächsten regelmäßigen Abfrage. Durch häufiges Abfragen kann dieser Nachteil verringert werden (bei entsprechend höherer Systemlast).&lt;br /&gt;
&lt;br /&gt;
Die Anwesenheitserkennung per Notify hat den Vorteil, dass ein sich ändernder Status sofort abgebildet wird. Ändert sich kein Status, werden keine Routinen ausgeführt, was die Systemlast gering hält. Der Nachteil ist, dass - z.B. nach einem Systemstart - die entsprechende Aktion erst bei einer Änderung des Status ausgeführt wird. D.h. ist das zu testende Gerät anwesend, wird dann FHEM beendet, das Gerät entfernt und FHEM wieder gestartet, ist der Status in FHEM immer noch &amp;quot;anwesend&amp;quot;. Da das Reading für das Gerät nicht existiert, wird darauf auch erst wieder ein Notify ausgeführt, wenn sich der Status des Geräts wieder ändert, d.h. es wieder ankommt. Bis dahin ist der Status im System falsch. &lt;br /&gt;
Der Nachteil des Notify kann verringert werden, wenn man statt &amp;lt;code&amp;gt;attr Fritzbox event-on-change-reading mac_AA_BB_CC_DD_EE_FF&amp;lt;/code&amp;gt; ein &amp;lt;code&amp;gt;attr Fritzbox [[event-on-update-reading]] mac_AA_BB_CC_DD_EE_FF&amp;lt;/code&amp;gt; setzt. Das erhöht allerdings die Systemlast und funktioniert auch nur für den Status &amp;quot;anwesend&amp;quot;. Bei &amp;quot;abwesend&amp;quot; ist kein Reading vorhanden, so dass auch event-on-update-reading nicht ausgeführt wird.&lt;br /&gt;
Eine weitere Möglichkeit, den Nachteil der Notify-Methode auszugleichen, ist, die Statusabfrage beim Systemstart einmal manuell auszuführen, durch ein notify auf &amp;quot;GLOBAL:initialized&amp;quot;:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
global:INITIALIZED {&lt;br /&gt;
  Reset_Variables;&lt;br /&gt;
  if (ReadingsVal(&amp;quot;Fritzbox&amp;quot;, &amp;quot;mac_AA_BB_CC_DD_EE_FF&amp;quot;, &amp;quot;inactive&amp;quot;) eq &amp;quot;inactive&amp;quot;) {&lt;br /&gt;
    fhem(&amp;quot;set anwesend_smartphone absent&amp;quot;);&lt;br /&gt;
  } else {&lt;br /&gt;
    fhem(&amp;quot;set anwesend_smartphone present&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Das hilft allerdings nur beim Systemstart. Nicht, wenn FHEM aufgrund irgendwelcher Hänger eine Aktualisierung des Status verpasst hat.&lt;br /&gt;
&lt;br /&gt;
=== userReadings per &#039;&#039;get tr064Command&#039;&#039; oder &#039;&#039;get luaQuery&#039;&#039; ===&lt;br /&gt;
Um dem Gerätewert &amp;lt;userReadingName&amp;gt; den Wert von &amp;lt;VariabelName&amp;gt; aus der Rückgabe des get-Befehls &#039;&#039;tr064Command&#039;&#039; oder &#039;&#039;luaQuery&#039;&#039; zuzuordnen&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
attr &amp;lt;device&amp;gt; userReadings &amp;lt;userReadingName&amp;gt; {my $resp=fhem(&amp;quot;get &amp;lt;device&amp;gt; tr064Command &amp;lt;service&amp;gt; &amp;lt;control&amp;gt; &amp;lt;action&amp;gt; [[&amp;lt;argName1&amp;gt; &amp;lt;argValue1&amp;gt;] ...]&amp;quot;,1);;$resp =~/\&#039;&amp;lt;VariabelName&amp;gt;\&#039; =&amp;gt; &#039;(.*)&#039;/;;return $1;;}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Beispielsweise&lt;br /&gt;
&amp;lt;pre&amp;gt;attr Fritzbox userReadings urMobilteil_1 {my $resp=fhem(&amp;quot;get Fritzbox tr064Command X_AVM-DE_OnTel:1 x_contact GetDECTHandsetInfo NewDectID 1&amp;quot;,1);;$resp =~/&#039;NewHandsetName&#039; =&amp;gt; &#039;(.*)&#039;/;;return $1;;},&lt;br /&gt;
        urDownstreamDSLRate {my $resp=fhem(&amp;quot;get Fritzbox tr064Command WANDSLInterfaceConfig:1 wandslifconfig1 GetInfo&amp;quot;,1);;$resp =~/&#039;NewDownstreamCurrRate&#039; =&amp;gt; &#039;(.*)&#039;/;;return $1;;},&lt;br /&gt;
        urUpstreamDSLRate {my $resp=fhem(&amp;quot;get Fritzbox tr064Command WANDSLInterfaceConfig:1 wandslifconfig1 GetInfo&amp;quot;,1);;$resp =~/&#039;NewUpstreamCurrRate&#039; =&amp;gt; &#039;(.*)&#039;/;;return $1;;}&amp;lt;/pre&amp;gt;&lt;br /&gt;
oder bei einzelnen Werte über &#039;&#039;get luaQuery&#039;&#039;&amp;lt;pre&amp;gt;attr Fritzbox userReadings sip1_connect {my $resp=fhem(&amp;quot;get Fritzbox luaQuery sip:settings/sip1/connect&amp;quot;,1);;$resp =~/([0-9])$/;;return $1;;}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Klingelton-Einstellung und Abspielen von Sprachnachrichten bei Fritz!OS-Versionen &amp;gt;6.24 ===&lt;br /&gt;
Wenn die Fritzbox weder die Telnet- noch die webcmd-Schnittstelle hat, kann der Klingelton der Fritz!Fons nicht mehr verstellt und auch keine Sprachnachricht über ein Fritz!Fon ausgegeben werden.&lt;br /&gt;
&lt;br /&gt;
Es gibt eine Behelfslösung über das Attribut &#039;&#039;useGuiHack&#039;&#039;. Dadurch wird eine Eingabe in die WebGUI der Fritzbox simuliert. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ACHTUNG&#039;&#039;&#039;: Vor allem nach einem Update der FritzBox kann es durch dieses Attribut zu ungewolltem Verstellen von Werten in der Fritzbox kommen.&lt;br /&gt;
&lt;br /&gt;
Bei Verwendung der ring-Parameter &amp;quot;play:&amp;quot; und &amp;quot;say:&amp;quot; wird die abzuspielende URL in die M3U-Datei, die unter dem Internal &#039;&#039;M3U_LOCAL&#039;&#039; steht, eingetragen.&amp;lt;br&amp;gt; &lt;br /&gt;
Standardmäßig wird versucht, diese Datei im image-Verzeichnis von FHEM abzulegen. Diese kann dann vom Fritz!Fon über [[FHEMWEB]] abgespielt werden (IP-Freigaben beachten). Direkt nach dem ersten Anlegen der m3u-Datei kennt [[FHEMWEB]] diese noch nicht, daher bitte entweder &#039;&#039;set &amp;lt;webdevice&amp;gt; rereadicons&#039;&#039; ausführen oder FHEM neu starten.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Aufgrund der Beschränkungen von [[FHEMWEB]] oder auch bei Authentifizierungsanforderungen ist es empfehlenswert, die Datei über das Attribute &#039;&#039;m3uFileLocal&#039;&#039; selber vorzugeben. Am besten auf einem Webserver, der auf dem FHEM-Server läuft und dessen Seiten-Verzeichnis durch FHEM beschreibbar ist.&amp;lt;br&amp;gt;&lt;br /&gt;
Beispiel: &amp;lt;code&amp;gt;attr Fritzbox m3uFileLocal /var/www/mp3/Fritzbox.m3u&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In dem Radioeintrag &#039;&#039;FHEM&#039;&#039; muss dann &#039;&#039;&#039;auf der FritzBox&#039;&#039;&#039;, die &#039;&#039;&#039;Web&#039;&#039;&#039;-Adresse der entsprechenden Datei eingetragen werden. Dieser Sender sollte zu Testzwecken dann auch einmal am Fritz!Fon von Hand gestartet werden.&amp;lt;br&amp;gt;&lt;br /&gt;
Das Modul versucht, beim Start die einzutragende Radio-URL im image-Verzeichnis selber zu ermitteln (IP-Freigabe beachten). Gelingt dies, so steht diese im Internal &#039;&#039;M3U_URL&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Ring auf mehreren Telefonen gleichzeitig ===&lt;br /&gt;
&lt;br /&gt;
Damit mehrere Telefone per ring gleichzeitig Klingel, muss in der Fritzbox eine Rufgruppe definiert werden.&lt;br /&gt;
Sollte eine Türsprechanlage schon in Benutzung sein, kann die eventuell hierfür bereits eingerichtete Gruppe verwendet werden.&lt;br /&gt;
Das anlegen der Gruppe erfolgt wie in folgender AVM Anleitung erledigt werden. [http://http://avm.de/service/fritzbox/fritzbox-7390/wissensdatenbank/publication/show/1148_Interne-Rufgruppe-in-FRITZ-Box-einrichten-Gruppenruf/ AVM Interne Rufgruppe anlegen]&lt;br /&gt;
&lt;br /&gt;
Es muss eine Kurzwahl bei der Gruppe zwingend hinterlegt sein.&lt;br /&gt;
Danach kann mit folgendem Beispiel Code gearbeitet werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;set FritzBox ring 791 15 show:Türklingel&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Name des Devices, Rufgruppen Nummer, Länge und gezeigter Text auf das gewünschte anpassen.&lt;br /&gt;
&lt;br /&gt;
== Bekannte Probleme / Fehlersuche ==&lt;br /&gt;
=== Fehler nach Firmware Update ===&lt;br /&gt;
Typischer Fehler ist hier &amp;quot;Error: 403 Forbidden&amp;quot;. &lt;br /&gt;
Nach einem Firmwareupdate der Fritzbox am besten auch FHEM neu starten.&lt;br /&gt;
&lt;br /&gt;
=== Modul bleibt im Status &amp;quot;Check APIs&amp;quot; hängen===&lt;br /&gt;
Im Log steht die Meldung: &amp;quot;Error: Timeout when reading Fritz!Box data.&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Mögliche Ursache: Nutzung des FHEM-Befehls [[FHEM_Command_Beispiele#rereadcfg|rereadcfg]]. Dieser verträgt sich nicht mit dem Modul &amp;quot;blocking.pm&amp;quot;, das für parallel laufende FHEM-Prozesse genutzt wird.&lt;br /&gt;
&lt;br /&gt;
Abhilfe schafft ein Neustart &amp;lt;code&amp;gt;shutdown restart&amp;lt;/code&amp;gt; oder das Einfügen eines zusätzlichen, lokalen Telnet-Ports z.B. durch &amp;lt;code&amp;gt;define tPortLocal telnet 7073&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Nachtschaltung Doppel-WLAN ===&lt;br /&gt;
Beim Abschalten des WLAN über das Modul wird (über TR064) zuerst das 2.4 GHz und dann das 5 GHz WLAN ausgeschaltet. Bei der gleichzeitigen Nutzung der WLAN-Nachtschaltung (Anschalten über das Fritz!OS) wird dann jedoch nur noch das 5 GHz WLAN wieder angeschaltet. Die Box interpretiert den TR064-Befehl anscheinend als ein komplettes Abwählen des 2.4 GHz WLAN.&lt;br /&gt;
&lt;br /&gt;
Abhilfe schafft hier nur ein notify auf das 5 GHz WLAN mit einem nachträglichem Anschalten des 2.4 GHz WLAN.&lt;br /&gt;
&lt;br /&gt;
Alternativ kann das Ausschalten des WLANs nicht direkt über TR064-Kommandos, sondern über einen indirekten Weg erfolgen: über TR064 ein set call abzusetzen und hier den Tastencode zum Ausschalten des WLANs einzugeben, bei einer FritzBox 7490 wäre dies z. B. #96*0*. &lt;br /&gt;
Schaltet man über diese Methode das WLAN aus, kann es über die Nachtschaltung wieder automatisch auf beiden Frequenzen angeschaltet werden.&lt;br /&gt;
&lt;br /&gt;
=== Kabelboxen ===&lt;br /&gt;
Bei Fritz!Boxen für den Kabelanschluss (z.B. Kabel Deutschland) scheint neben Telnet auch die TR064-API nicht zu funktionieren. Vermutlich wurde die API von AVM auf Betreiberwunsch deaktiviert, da man sonst Dinge ändern kann, die das gesamte Kabelnetz stören können.&lt;br /&gt;
&lt;br /&gt;
Zumindest für Unitymedia und einer FRITZ!Box 6490 Cable (lgi) mit FRITZ!OS:06.50 funktioniert TR064. &lt;br /&gt;
&lt;br /&gt;
Eine Rufumleitung bei Abwesenheit (Modul PRESENCE) funktioniert mit einer vorher eingerichten Telefonnummer wie folgt: &lt;br /&gt;
&amp;lt;code&amp;gt;define Rufumleitung DOIF ([Anwesenheit.dum:state] eq &amp;quot;off&amp;quot;) (set FritzBox6490 diversity 1 on) DOELSEIF ([Anwesenheit.dum:state] eq &amp;quot;on&amp;quot;) (set FritzBox6490 diversity 1 off)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Wenn&#039;s nicht klingelt ===&lt;br /&gt;
Das Klingeln erfolgt über die Wählhilfe. Eventuell muss über die Weboberfläche der Fritz!Box ein anderer Port eingestellt werden. Der aktuelle steht in &amp;quot;box_stdDialPort&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== TR064-Transport-Error: 500 Can&#039;t connect to ...:49443 (certificate verify failed) ===&lt;br /&gt;
Eventuell hilft es, die Perl Module Net::HTTPS, Net::SSL und IO::Socket::SSL zu aktualisieren.&lt;br /&gt;
&lt;br /&gt;
=== &amp;quot;Error: Old SID not valid anymore.&amp;quot; nach Erlauben von IPv6 auf der Fritzbox ===&lt;br /&gt;
Ohne hier den genauen Grund zu kennen - es hilft die Angabe der IPv4-Adresse: also statt &amp;lt;code&amp;gt;define FritzBox FRITZBOX&amp;lt;/code&amp;gt; dann &amp;lt;code&amp;gt;define FritzBox FRITZBOX &amp;lt;IP&amp;gt;&amp;lt;/code&amp;gt; (z.B. &amp;lt;code&amp;gt;define FritzBox FRITZBOX 192.168.10.1&amp;lt;/code&amp;gt;), so dass das Modul nicht über IPv6 geht.&lt;br /&gt;
&lt;br /&gt;
=== &amp;quot;Didn&#039;t get a session ID&amp;quot; ===&lt;br /&gt;
Bei gleichzeitiger Nutzung anderer Modul für die Fritzbox (z.B. {{Link2CmdRef|Anker=FBAHAHTTP|Lang=en|Label=FBAHAHTTP}}) muss der Zugang über Benutzername und Password erfolgen.&amp;lt;br&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;attr &amp;lt;DEVICE&amp;gt; boxUser &amp;lt;USER&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
Da das FRITZBOX-Modul eine inoffizielle Schnittstelle benutzt, muss dann auch der normale Zugang zur Box auf &amp;quot;Benutzername und Password&amp;quot; eingestellt sein.&amp;lt;bR&amp;gt;&lt;br /&gt;
In der Firmware 6.92 wird der Zugang über die Menüs &amp;quot;System&amp;quot;-&amp;gt;&amp;quot;Fritz!Box-Benutzer&amp;quot;-&amp;gt;&amp;quot;Anmeldung im Heimnetz&amp;quot; eingestellt.&lt;br /&gt;
&lt;br /&gt;
Oft wird aber auch ein falsches oder gar kein Passwort gesetzt.&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;set &amp;lt;DEVICE&amp;gt; password &amp;lt;PASSWORD&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===  TR064-Error 401:invalid action ===&lt;br /&gt;
Eventuell ist auf der Fritzbox ein Benutzer gesetzt und im Modul nicht korrekt angegeben bzw. mit falschen Rechten versehen (attribut boxUser).&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* {{Link2Forum|Topic=29725|LinkText=Forenthread}} zu diesem Modul&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:FritzBox]] &lt;br /&gt;
&amp;lt;!-- (Modulkategorie wird automatisch gesetzt) --&amp;gt;&lt;/div&gt;</summary>
		<author><name>Topos</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=TelegramBot&amp;diff=28138</id>
		<title>TelegramBot</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=TelegramBot&amp;diff=28138"/>
		<updated>2018-10-21T15:39:31Z</updated>

		<summary type="html">&lt;p&gt;Topos: /* Hinweise zum Betrieb mit FHEM */ Versenden einer ersten Nachricht an den Bot erklärt.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Modul&lt;br /&gt;
|ModPurpose=Senden und Empfangen von Nachrichten (Text und Fotos) mit dem freien Messagingdienst Telegram&lt;br /&gt;
|ModType=d&lt;br /&gt;
|ModForumArea=Unterstützende Dienste&lt;br /&gt;
|ModFTopic=38328&lt;br /&gt;
|ModTechName=[https://github.com/viegener/Telegram-fhem/blob/master/50_TelegramBot.pm 50_TelegramBot.pm]&lt;br /&gt;
|ModOwner=[[Benutzer:Viegener|Viegener]] ({{Link2FU|12772|Forum}} / [[Benutzer Diskussion:Viegener|Wiki]])}}&lt;br /&gt;
&lt;br /&gt;
Das [[TelegramBot]]-Modul ermöglicht das Senden und Empfangen von Nachrichten über den Telegram-instant messaging Dienst (https://telegram.org/). &lt;br /&gt;
Es entsteht eine Möglichkeit Benachrichtungen aus FHEM zu versenden, zum Beispiel Alarmmeldungen.&lt;br /&gt;
Ausserdem können auch Kommandos über Telegram an FHEM gesendet werden um Steuerungsbefehle in FHEM auszulösen.&lt;br /&gt;
&lt;br /&gt;
Das TelegramBot-Modul benötigt keine Zusatzsoftware auf dem FHEM-Server (anders als die Variante [[Telegram]]), sondern verwendet das [https://core.telegram.org/bots/api TelegramBot-API] über https-Aufrufe. Es muss jedoch das [http://www.fhemwiki.de/wiki/Raspberry_Pi#N.C3.BCtzliche_Zusatzpakete perl JSON modul] installiert sein. &lt;br /&gt;
&lt;br /&gt;
== Über Telegram Instant Messaging ==&lt;br /&gt;
Telegram-IDs und Versand/Empfang von Nachrichten sind kostenfrei. &lt;br /&gt;
Clients sind für gängige Smartphonesysteme erhältlich (iOS iPhone und Tablet, Android, Windows Phone) und &lt;br /&gt;
können auch aus dem WebBrowser verwendet werden. &lt;br /&gt;
Es gibt auch einen Kommandozeilen-Client für Linux, der die Grundlage dieses Moduls darstellt. &lt;br /&gt;
Mehrfachanmeldungen, auch parallel mit verschiedenen Geräten (z.B. Tablet und Smartphone), sind möglich.&lt;br /&gt;
Gruppenchats und Chats mit End-2-End-Verschlüsselung werden ebenfalls unterstützt.&lt;br /&gt;
&lt;br /&gt;
Für die Unterstützung von &#039;&#039;WhatsApp&#039;&#039; siehe Modul [[yowsup]].&lt;br /&gt;
&lt;br /&gt;
== Features ==&lt;br /&gt;
Unterstützt werden:&lt;br /&gt;
&lt;br /&gt;
* Versand von Textnachrichten &lt;br /&gt;
* Versand und Empfang von Bildern/Audio/etc &lt;br /&gt;
* Empfang von Textnachrichten von beliebigen Kontakten&lt;br /&gt;
* Kommandos in FHEM über Telegram-Nachrichten von aussen auslösen&lt;br /&gt;
* Ergebnisse der Kommandos zusenden lassen&lt;br /&gt;
&lt;br /&gt;
Eine detaillierte Beschreibung des Moduls ist im FHEM Forum und in der (englischen) Dokumentation zum Modul in der {{Link2CmdRef|Anker=TelegramBot}} und in diesem  {{Link2Forum|Topic=38328|LinkText=Diskussionsthread}} zu finden. Seit Oktober 2015 wird das Modul offiziell über FHEM-Update verteilt.&lt;br /&gt;
&lt;br /&gt;
Die jeweils aktuellste Entwicklungs-Version des Moduls ist in Github [https://github.com/viegener/Telegram-fhem/blob/master/50_TelegramBot.pm 50_TelegramBot.pm] verfügbar.&lt;br /&gt;
&lt;br /&gt;
== Hinweise zum Betrieb mit FHEM ==&lt;br /&gt;
{{Randnotiz|RNTyp=Info|RNText=Achtung: Dieses Authtoken ist die einzige Authentifizierung für den Bot und sollte deshalb nicht aus der Hand gegeben werden. Die verwendeten Urls sind deshalb auch in den Log-Files nicht enthalten, da diese das Authtoken in Klartext enthalten. Auch im Forum sollte dieses Token nicht aufgenommen werden.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Für die Anlage eines TelegramBot Devices in FHEM ist ein Authtoken erforderlich. Dieses Token wird über Anlegen eines neuen Bots im [https://core.telegram.org/bots#botfather BotFather] erzeugt. Dafür muss der BotFather mit einem Telegram-Client kontaktiert werden. Dort mit dem Telegram-Befehl &amp;lt;code&amp;gt;/newbot&amp;lt;/code&amp;gt; einen neuen Bot anlegen und mit einem Namen versehen. Hinweis: Die Namen für Bots müssen auf &amp;quot;Bot&amp;quot; enden.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das Anlegen eines TelegramBot devices erfolgt durch die Angabe dieses Tokens:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;define &amp;amp;lt;name&amp;amp;gt; TelegramBot  &amp;amp;lt;token&amp;amp;gt; &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Beispiel: &amp;lt;code&amp;gt;define teleBot TelegramBot 110201543:AAHdqTcvCH1vGWJxfSeofSAs0K5PALDsaw&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Das Empfangen von Nachrichten (polling) erfordert die Einstellung des Attributes&#039;&#039;&#039; &lt;br /&gt;
&amp;lt;code&amp;gt;pollingTimeout&amp;lt;/code&amp;gt; &#039;&#039;&#039;auf einen Wert der grösser als Null ist. Beim Wert 0 oder ohne Setzen des Attributes findet kein Polling und damit auch kein Empfang statt.&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
Beispiel: &amp;lt;code&amp;gt;attr teleBot pollingTimeout 120&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Der TelegramBot kann erst dann Nachrichten an einen telegram user schicken, wenn dieser zuerst an den telegram bot eine Nachricht gesendet hat.&#039;&#039;&#039;&lt;br /&gt;
Dafür muss man in seinem Telegram-Client den Kontakt @botName suchen und dann eine Nachricht darn versenden.&lt;br /&gt;
&lt;br /&gt;
{{Randnotiz|RNTyp=Info|RNText=TelegramBot setzt eine aktuelle Version von FHEM voraus, insbesondere Versionen weit vor der Umstellung auf 5.7 (also vor Herbst 2015) können mit einem TelegramBot-Modul nicht funktionieren, da insbesondere das HTTPSRV-Modul dann veraltet ist. Am besten auch den TelegramBot über den offiziellen Update mit dem Rest von FHEM installieren/aktualisieren.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Registrierung eines neuen Bot ==&lt;br /&gt;
Zur Registrierung wird ein funktionierender Telegram-Client (egal ob Web, App oder Programm)benötigt. Hier wird ein Chat zum BotFather gestartet und der Befehl /newbot gesendet. Nun fragt der BotFather die benötigten Angaben ab und liefert am Ende des Dialogs die Informationen für den neuen Bot.&lt;br /&gt;
Hier ein Beispiel, wie so ein Chat aussehen könnte:&lt;br /&gt;
&amp;lt;pre&amp;gt;Client: &lt;br /&gt;
/newbot&lt;br /&gt;
----------------&lt;br /&gt;
BotFather:&lt;br /&gt;
Alright, a new bot. How are we going to call it? Please choose a name for your bot. &lt;br /&gt;
----------------&lt;br /&gt;
Client: &lt;br /&gt;
Mein Name &lt;br /&gt;
----------------&lt;br /&gt;
BotFather: &lt;br /&gt;
Good. Now let&#039;s choose a username for your bot. It must end in `bot`. Like this, for example: TetrisBot or tetris_bot.&lt;br /&gt;
----------------&lt;br /&gt;
Client: &lt;br /&gt;
fhem_bot&lt;br /&gt;
----------------&lt;br /&gt;
BotFather: &lt;br /&gt;
Sorry, this username is already taken. Think of something different.&lt;br /&gt;
----------------&lt;br /&gt;
Client: &lt;br /&gt;
fhem1234_bot&lt;br /&gt;
----------------&lt;br /&gt;
BotFather: &lt;br /&gt;
Done! Congratulations on your new bot.&lt;br /&gt;
You will find it at telegram.me/fhem1234_bot.&lt;br /&gt;
You can now add a description, about section and profile picture for your bot, see /help for a list of commands.&lt;br /&gt;
----------------&lt;br /&gt;
Use this token to access the HTTP API:&lt;br /&gt;
1234567890:AbCdefgHIJklmnOPQRst-uvwxyz &lt;br /&gt;
&lt;br /&gt;
For a description of the Bot API, see this page: https://core.telegram.org/bots/api &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Um einen Chat an einen &amp;quot;Contact&amp;quot; versenden zu können, muss zuerst in Contacts (bei Readings) ein Kontakt auftauchen. Wenn man sich zum allerersten Mal bei Telegram angemeldet hat, gibt es noch keinen Chat mit irgendjemanden. Man muss sich zuerstmal selbst eine Nachricht im Smartphone zusenden, dann taucht unter Readings der Eintrag Contacts auf. Erst dann kann man eine Nachricht mit @msgPeerId (das ist Ziffernfolge des Contacts ) oder mit @msgPeer (das ist der Name nach dem Doppelpunkt) vom TelegramBot auf sein Smartphone senden.&lt;br /&gt;
&lt;br /&gt;
== Tipps ==&lt;br /&gt;
&lt;br /&gt;
=== Privacyeinstellungen ===&lt;br /&gt;
&lt;br /&gt;
Damit der TelegramBot auch Meldungen in Gruppen sieht, müssen über den BotFather die Privacy-Einstellungen geändert werden.&amp;lt;br&amp;gt;Beispielchat:&amp;lt;pre&amp;gt;Client:&lt;br /&gt;
/setprivacy&lt;br /&gt;
----------------&lt;br /&gt;
BotFather:&lt;br /&gt;
Choose a bot to change group messages settings.&lt;br /&gt;
----------------&lt;br /&gt;
Client:&lt;br /&gt;
@fhem1234_bot&lt;br /&gt;
----------------&lt;br /&gt;
BotFather:&lt;br /&gt;
&#039;Enable&#039; - your bot will only receive messages that either start with the &#039;/&#039; symbol or mention the bot by username.&lt;br /&gt;
&#039;Disable&#039; - your bot will receive all messages that people send to groups.&lt;br /&gt;
Current status is: ENABLED&lt;br /&gt;
----------------&lt;br /&gt;
Client:&lt;br /&gt;
Disable&lt;br /&gt;
----------------&lt;br /&gt;
BotFather:&lt;br /&gt;
Success! The new status is: DISABLED. /help&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Kontakte ===&lt;br /&gt;
&lt;br /&gt;
Der Bot merkt sich die bereits bekannten Kontakte im Reading &amp;lt;code&amp;gt;Contacts&amp;lt;/code&amp;gt;. Dabei werden die einzelnen Kontakte jeweils als 3-teilige Einträge bestehend aus UserID, Vor- und Nachname des Benutzers (mit _ verbunden) und dem Username (mit vorangestelltem @). &lt;br /&gt;
&lt;br /&gt;
Beispiel: &amp;lt;code&amp;gt;123456:Ralf_Mustermann:@ralf&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Verschiedene Einträge werden durch Leerzeichen getrennt.&lt;br /&gt;
&lt;br /&gt;
Man kann die Kontakte auch manuell überschreiben (z.B. wenn das Reading fehlerhaft oder verloren sein sollte). Dazu gibt es den Set-Befehl &amp;lt;code&amp;gt;replaceContacts&amp;lt;/code&amp;gt;. Dieser nimmt die Kontakte ebenfalls in der gleichen Form wie oben beschrieben entgegen.&lt;br /&gt;
&lt;br /&gt;
Die Kontaktliste wird ansonsten nur durch den Empfang von Nachrichten erweitert, da es im TelegramBot-API keine Möglichkeit gibt Kontaktdaten von Telegram abzufragen (siehe auch pollingTimeout)&lt;br /&gt;
&lt;br /&gt;
=== Reset ===&lt;br /&gt;
&lt;br /&gt;
Es ist möglich den Bot im laufenden Betrieb zurückzusetzen (Set-Befehl &amp;lt;code&amp;gt;reset&amp;lt;/code&amp;gt;). Dabei werden noch nicht abgeschlossene Übetragungen entfernt und die internen Zustände des Devices zurückgesetzt. &lt;br /&gt;
&lt;br /&gt;
=== Gruppen ===&lt;br /&gt;
&lt;br /&gt;
Um eine Nachricht von FHEM an eine Gruppe zu senden, muss der BOT in die Gruppe aufgenommen werden. Nach dem Senden einer Nachricht an die Gruppe kann im Modul die Gruppen-ID ermittelt werden und zum Senden von Nachrichten verwendet werden. Wenn die Privacy-Einstellungen nicht auf &#039;Disabled&#039; gesetzt wurden, muss die Nachricht mit einem Slash (/) beginnen.&lt;br /&gt;
&lt;br /&gt;
==== Supergroups / Supergruppen ====&lt;br /&gt;
&lt;br /&gt;
Auch die neuen Supergruppen werden mit dem Bot unterstützt, es ist allerdings zu beachten, dass bei der Umwandlung einer Gruppe in eine Supergruppe eine neue ID in den Kontakten von Telegram vergeben wird. Wenn man also wie empfohlen IDs zur Identifikation von Benutzern einsetzt, muss entsprechend angepasst werden.&lt;br /&gt;
&lt;br /&gt;
== Beispielszenarien ==&lt;br /&gt;
&lt;br /&gt;
=== Benachrichtigungen über Ereignisse ===&lt;br /&gt;
&lt;br /&gt;
Das einfachste Szenario für die Integration von Messaging-Diensten mit FHEM ist zur Benachrichtigung über Ereignisse. Diese Funktion kann zum Beispiel verwendet werden, um über einen erfolgten Neustart von FHEM zu informieren:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;define notify_fhem_reload notify global:INITIALIZED set telebotdevice message fhem newly started - just now !&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In diesem Beispiel wird der Nachrichtentext &amp;quot;fhem newly started - just now !&amp;quot; an den als default eingestellten Kontakt (Attribut: defaultPeer) gesendet, sobald FHEM neu gestartet wurde. Natürlich kann man auch beliebige andere Benachrichtigungen einführen.&lt;br /&gt;
&lt;br /&gt;
=== Versand von Bildern ===&lt;br /&gt;
&lt;br /&gt;
Es ist auch möglich Bilder auf dem FHEM-Server, die zum Beispiel von einer Kamera oder einem Wettermodul stammen über Telegram zu versenden. So wäre es z.B. möglich jeweils morgens die aktuelle Wetterkarte zu erhalten.&lt;br /&gt;
&lt;br /&gt;
ACHTUNG: TelegramBot verwendet das HTTPUtils-Modul zur Kommunikation mit dem TelegramBot-API. Erst mit der Version, die seit 22.10.2015 &lt;br /&gt;
([r9576] HttpUtils.pm: Async write for POST Requests {{Link2Forum|Topic=41583|LinkText=FHEM-Forum}}) verteilt wird, erlaubt auch den Transfer grösserer Bilder. Die Grenze liegt ansonsten bei ca. 14kb auf Raspberries (Plattformspezifische Grenze).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;define notify_fhem_reload notify wetter:report set telebotdevice sendImage /opt/fhem/wetter.jpg&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bei Erreichen des entsprechenden Status am Wetter-Modul wird ein Image über Telegram versendet. Hier sind lokale Pfade (relativ zu fhem) oder absolute Pfade wie oben möglich.&lt;br /&gt;
&lt;br /&gt;
=== Versand von SVG-Plots ===&lt;br /&gt;
&lt;br /&gt;
SVG-Plots können mit dem Befehl &lt;br /&gt;
&amp;lt;code&amp;gt;cmdSend [ @&amp;lt;peer1&amp;gt; ... @&amp;lt;peerN&amp;gt; ] &amp;lt;fhem command&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
verschickt werden.&lt;br /&gt;
&lt;br /&gt;
Das angegebene FHEM-Kommando wird ausgeführt und das Ergebnis an die angegebenen Peers bzw. den Standard-Peer verschickt.&lt;br /&gt;
&lt;br /&gt;
Mit dem folgenden Befehl wird der SVG-Plot SVG_FileLog_Aussen an den Standard-Peer geschickt: &lt;br /&gt;
&amp;lt;code&amp;gt;set mein_telegramBot cmdSend { plotAsPng(&#039;SVG_FileLog_Aussen&#039;) }&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nach &amp;lt;code&amp;gt;define cmd_sendTelegramSVG cmdalias TGSVG .* AS set mein_telegramBot cmdSend { plotAsPng(&amp;quot;$EVENT&amp;quot;) }&amp;lt;/code&amp;gt;&lt;br /&gt;
kann man mit einem kurzen &lt;br /&gt;
&amp;lt;code&amp;gt;TGSVG SVG_Garten&amp;lt;/code&amp;gt;&lt;br /&gt;
ein beliebiges SVG über die Kommandozeile per Telegram versenden.&lt;br /&gt;
&lt;br /&gt;
Um das SVG nun noch mit einem Text zu versehen, muss eine Textnachricht dazu gesendet werden, was sich am einfachsten durch das Ausführen eines FHEM-Befehls auf Perl-Ebene realisieren lässt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;{fhem &amp;quot;set mein_telegramBot message Bildbeschreibung;; set mein_telegramBot cmdSend { plotAsPng(&#039;mein_SVG&#039;) }&amp;quot; }&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Hinweis:&#039;&#039;&#039; früher wurde zum Verschicken von Plots auch die interne Funktion TelegramBot_ExecuteCommand verwendet; mit dem Update Ende Februar 2017 hat diese Funktion einen zusätzlichen Parameter erhalten und lautet nun &lt;br /&gt;
&amp;lt;code&amp;gt;TelegramBot_ExecuteCommand($defs{&amp;quot;mein_telegramBot&amp;quot;}, meine_ZielID, undef, &#039;{plotAsPng(&amp;quot;mein_SVG&amp;quot;)}&#039;);&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Voraussetzungen für den Versand von SVG-Plots ====&lt;br /&gt;
Es muss das Modul libimage-librsvg-perl installiert sein:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;sudo apt-get install libimage-librsvg-perl&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Evtl. sind weitere Module erforderlich:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;sudo apt-get install libgd-graph-perl&lt;br /&gt;
&lt;br /&gt;
sudo apt-get install libgd-text-perl&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Empfang von Bildern oder ähnlichem ===&lt;br /&gt;
&lt;br /&gt;
Beim Empfang von Bildern wird zuerst nur eine ID vom Telegram-Server empfangen, diese befindet sich im Reading &amp;lt;code&amp;gt;msgFileId&amp;lt;/code&amp;gt; angelegt (&amp;lt;code&amp;gt;123456:xxxxxxxxxxxxxxxxxxxxxxx-xxxxxxxx&amp;lt;/code&amp;gt;) und im Reading &amp;lt;code&amp;gt;msgText&amp;lt;/code&amp;gt; steht dann so etwas wie&lt;br /&gt;
&amp;lt;code&amp;gt;received photo # Size: 107701&amp;lt;/code&amp;gt;&lt;br /&gt;
	&lt;br /&gt;
Über das Get-Kommando &amp;lt;code&amp;gt;urlForFile&amp;lt;/code&amp;gt; mit der ID aus dem msgFileId Reading lässt sich dann daraus ein URL ableiten, der dann zur eigentlichen Datei führt: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;https://api.telegram.org/file/bot123456:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/photo/file_25.jpg&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Versand von Emojis (Smileys) ===&lt;br /&gt;
&lt;br /&gt;
Es ist auch möglich Emojis mit den (Text-)Nachrichten zu versenden. Die entsprechenden (Unicode-)Zeichen werden einfach direkt mit in den Text der Nachricht aufgenommen. Um das zu vereinfachen kann man das einfach per Copy und Paste von dieser Seite &lt;br /&gt;
&lt;br /&gt;
http://apps.timwhitlock.info/emoji/tables/unicode (Spalte &amp;quot;Native&amp;quot;) &lt;br /&gt;
&lt;br /&gt;
übernehmen und mit der Nachricht verschicken. &lt;br /&gt;
&lt;br /&gt;
Die Emojis können auch empfangen werden und werden so auch in FHEM / FHEMWeb angezeigt. Plattformspezifische (z.B. von iOS oder Android) Emojis werden dabei nicht unterstützt (gerade mit iOS sind viele neue farbige Emojis hinzugekommen, die wohl leider nur auf Apple-devices funktionieren).&lt;br /&gt;
&lt;br /&gt;
=== Kommandos auslösen ===&lt;br /&gt;
&lt;br /&gt;
Ein wichtiges Szenario ist die Möglichkeit Kommandos in FHEM ausführen zu können, ohne einen Zugang durch die Firewall einrichten zu müssen. Dazu ist die Definition eines Schlüsselwortes (Attribut: &amp;quot;cmdKeyword&amp;quot;)erforderlich, mit dem man die Nachrichten beginnen muss, damit der TelegramBot die Kommandos erkennt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;attr telebotdevice cmdKeyword doit&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Somit kann man dann durch Nachrichten die mit &amp;quot;doit&amp;quot; beginnen Kommandos an FHEM senden, die ähnlich wie im Kommandoeingabefeld von FHEMweb dann von FHEM ausgeführt werden. Das Ergebnis der Ausführung wird zurück an den Sender (und an den definierten defaultPeer) geschickt.&lt;br /&gt;
&lt;br /&gt;
Somit können nicht nur Aktionen angestossen werden, sondern auch Infos abgefragt werden.&lt;br /&gt;
&lt;br /&gt;
Beispiele&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;doit set schalter on&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;doit list telegrambot&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Randnotiz|RNTyp=Warn|RNText=Achtung: Bei den Kommandos sollten man unbedingt das Attribut &amp;quot;cmdRestrictedPeer&amp;quot; setzen, damit nicht jeder Kommandos auf dem FHEM-Server ausführen kann. Dazu sollten die BenutzerIDs der erlaubten Benutzer (durch Leerzeichen getrennt angeben). Da Benutzernamen selber vergeben werden und nicht unbedingt eindeutig sind, sollten hier auch NUR BenutzerIDs verwendet werden.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== Favoriten für Kommandos anlegen ====&lt;br /&gt;
&lt;br /&gt;
Grundidee bei den Favoriten ist, dass man lange Befehle, die man häufig braucht auf &amp;quot;Kurzwahl&amp;quot; legt.&lt;br /&gt;
&lt;br /&gt;
Beispiel-Kommandos wie z.B. &amp;lt;code&amp;gt;set TYPE=ROLLADEN pos 100&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;set TYPE=ROLLADEN pos 0&amp;lt;/code&amp;gt;, die man immer wieder braucht. Um nicht jedes mal dieses Kommando eintippen zu müssen auf dem Smartphone, kann man auch dafür Favoriten anlegen.&lt;br /&gt;
&lt;br /&gt;
Dazu gibt man erst mal die beiden Kommandos getrennt durch Semikolon im Attribut favorites an:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;attr telegrambotdevice favorites set TYPE=ROLLADEN pos 100;set TYPE=ROLLADEN pos 0&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Um die Favorites jetzt ausführen zu können braucht man noch ein Schlüsselwort dafür.&lt;br /&gt;
Nehmen wir mal an man möchte die Favoriten mit &amp;lt;code&amp;gt;/short&amp;lt;/code&amp;gt; ausführen können. Dazu muss dann das Attribut &amp;quot;cmdFavorites&amp;quot; setzen&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;attr telegrambotdevice cmdFavorites /short&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wenn man nun im Telegram Client &lt;br /&gt;
&amp;lt;code&amp;gt;/short 1&amp;lt;/code&amp;gt; an den Bot schickt führt der Bot den ersten Favoriten aus und das Ergebnis der Ausführung wird zurückgeschickt.&lt;br /&gt;
&lt;br /&gt;
Ausserdem kann man im Telegram Client &lt;br /&gt;
&amp;lt;code&amp;gt;/short&amp;lt;/code&amp;gt; an den Bot schicken, dann antwortet der Bot mit&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Favorites&lt;br /&gt;
&lt;br /&gt;
/short1 = set TYPE=ROLLADEN pos 100&lt;br /&gt;
&lt;br /&gt;
/short2 = set TYPE=ROLLADEN pos 0&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Antworten werden als Schaltflächen dargestellt (Telegram inline Keyboard) und können am Mobile-Client direkt angeklickt werden um sie auszuführen.&lt;br /&gt;
Um die Beschriftung der Schaltflächen zu optimieren, können die Befehle im Attribut favorites mit Beschreibungen versehen werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;/[Rollaeden zu ]=set TYPE=ROLLADEN pos 100;/[Rollaeden auf]=set TYPE=ROLLADEN pos 0&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nun antwortet der Bot auf das Schlüsselwort für die Favoriten mit:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Favorites&lt;br /&gt;
&lt;br /&gt;
/short1 = Rollaeden zu&lt;br /&gt;
&lt;br /&gt;
/short2 = Rollaeden auf&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* Github Repository für die Telegram-FHEM Entwicklung: https://github.com/viegener/Telegram-fhem&lt;br /&gt;
* Infos zum Telegram BotFather: https://core.telegram.org/bots#botfather&lt;br /&gt;
&lt;br /&gt;
* Source code für das 50_TelegramBot.pm-Modul: https://github.com/viegener/Telegram-fhem/blob/master/50_TelegramBot.pm&lt;br /&gt;
&lt;br /&gt;
* Forum-Thread in dem das Modul vorgestellt wurde {{Link2Forum|Topic=38328|LinkText=FHEM-Forum}}&lt;br /&gt;
* Telegram messaging system https://telegram.org/&lt;br /&gt;
* TelegramBot API https://core.telegram.org/bots/api&lt;/div&gt;</summary>
		<author><name>Topos</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=TelegramBot&amp;diff=28137</id>
		<title>TelegramBot</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=TelegramBot&amp;diff=28137"/>
		<updated>2018-10-21T15:25:56Z</updated>

		<summary type="html">&lt;p&gt;Topos: /* Hinweise zum Betrieb mit FHEM */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Modul&lt;br /&gt;
|ModPurpose=Senden und Empfangen von Nachrichten (Text und Fotos) mit dem freien Messagingdienst Telegram&lt;br /&gt;
|ModType=d&lt;br /&gt;
|ModForumArea=Unterstützende Dienste&lt;br /&gt;
|ModFTopic=38328&lt;br /&gt;
|ModTechName=[https://github.com/viegener/Telegram-fhem/blob/master/50_TelegramBot.pm 50_TelegramBot.pm]&lt;br /&gt;
|ModOwner=[[Benutzer:Viegener|Viegener]] ({{Link2FU|12772|Forum}} / [[Benutzer Diskussion:Viegener|Wiki]])}}&lt;br /&gt;
&lt;br /&gt;
Das [[TelegramBot]]-Modul ermöglicht das Senden und Empfangen von Nachrichten über den Telegram-instant messaging Dienst (https://telegram.org/). &lt;br /&gt;
Es entsteht eine Möglichkeit Benachrichtungen aus FHEM zu versenden, zum Beispiel Alarmmeldungen.&lt;br /&gt;
Ausserdem können auch Kommandos über Telegram an FHEM gesendet werden um Steuerungsbefehle in FHEM auszulösen.&lt;br /&gt;
&lt;br /&gt;
Das TelegramBot-Modul benötigt keine Zusatzsoftware auf dem FHEM-Server (anders als die Variante [[Telegram]]), sondern verwendet das [https://core.telegram.org/bots/api TelegramBot-API] über https-Aufrufe. Es muss jedoch das [http://www.fhemwiki.de/wiki/Raspberry_Pi#N.C3.BCtzliche_Zusatzpakete perl JSON modul] installiert sein. &lt;br /&gt;
&lt;br /&gt;
== Über Telegram Instant Messaging ==&lt;br /&gt;
Telegram-IDs und Versand/Empfang von Nachrichten sind kostenfrei. &lt;br /&gt;
Clients sind für gängige Smartphonesysteme erhältlich (iOS iPhone und Tablet, Android, Windows Phone) und &lt;br /&gt;
können auch aus dem WebBrowser verwendet werden. &lt;br /&gt;
Es gibt auch einen Kommandozeilen-Client für Linux, der die Grundlage dieses Moduls darstellt. &lt;br /&gt;
Mehrfachanmeldungen, auch parallel mit verschiedenen Geräten (z.B. Tablet und Smartphone), sind möglich.&lt;br /&gt;
Gruppenchats und Chats mit End-2-End-Verschlüsselung werden ebenfalls unterstützt.&lt;br /&gt;
&lt;br /&gt;
Für die Unterstützung von &#039;&#039;WhatsApp&#039;&#039; siehe Modul [[yowsup]].&lt;br /&gt;
&lt;br /&gt;
== Features ==&lt;br /&gt;
Unterstützt werden:&lt;br /&gt;
&lt;br /&gt;
* Versand von Textnachrichten &lt;br /&gt;
* Versand und Empfang von Bildern/Audio/etc &lt;br /&gt;
* Empfang von Textnachrichten von beliebigen Kontakten&lt;br /&gt;
* Kommandos in FHEM über Telegram-Nachrichten von aussen auslösen&lt;br /&gt;
* Ergebnisse der Kommandos zusenden lassen&lt;br /&gt;
&lt;br /&gt;
Eine detaillierte Beschreibung des Moduls ist im FHEM Forum und in der (englischen) Dokumentation zum Modul in der {{Link2CmdRef|Anker=TelegramBot}} und in diesem  {{Link2Forum|Topic=38328|LinkText=Diskussionsthread}} zu finden. Seit Oktober 2015 wird das Modul offiziell über FHEM-Update verteilt.&lt;br /&gt;
&lt;br /&gt;
Die jeweils aktuellste Entwicklungs-Version des Moduls ist in Github [https://github.com/viegener/Telegram-fhem/blob/master/50_TelegramBot.pm 50_TelegramBot.pm] verfügbar.&lt;br /&gt;
&lt;br /&gt;
== Hinweise zum Betrieb mit FHEM ==&lt;br /&gt;
{{Randnotiz|RNTyp=Info|RNText=Achtung: Dieses Authtoken ist die einzige Authentifizierung für den Bot und sollte deshalb nicht aus der Hand gegeben werden. Die verwendeten Urls sind deshalb auch in den Log-Files nicht enthalten, da diese das Authtoken in Klartext enthalten. Auch im Forum sollte dieses Token nicht aufgenommen werden.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Für die Anlage eines TelegramBot Devices in FHEM ist ein Authtoken erforderlich. Dieses Token wird über Anlegen eines neuen Bots im [https://core.telegram.org/bots#botfather BotFather] erzeugt. Dafür muss der BotFather mit einem Telegram-Client kontaktiert werden. Dort mit dem Telegram-Befehl &amp;lt;code&amp;gt;/newbot&amp;lt;/code&amp;gt; einen neuen Bot anlegen und mit einem Namen versehen. Hinweis: Die Namen für Bots müssen auf &amp;quot;Bot&amp;quot; enden.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das Anlegen eines TelegramBot devices erfolgt durch die Angabe dieses Tokens:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;define &amp;amp;lt;name&amp;amp;gt; TelegramBot  &amp;amp;lt;token&amp;amp;gt; &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Beispiel: &amp;lt;code&amp;gt;define teleBot TelegramBot 110201543:AAHdqTcvCH1vGWJxfSeofSAs0K5PALDsaw&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Das Empfangen von Nachrichten (polling) erfordert die Einstellung des Attributes&#039;&#039;&#039; &lt;br /&gt;
&amp;lt;code&amp;gt;pollingTimeout&amp;lt;/code&amp;gt; &#039;&#039;&#039;auf einen Wert der grösser als Null ist. Beim Wert 0 oder ohne Setzen des Attributes findet kein Polling und damit auch kein Empfang statt.&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
Beispiel: &amp;lt;code&amp;gt;attr teleBot pollingTimeout 120&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Der TelegramBot kann erst dann Nachrichten an einen telegram user schicken, wenn dieser zuerst an den telegram bot eine Nachricht gesendet hat.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{{Randnotiz|RNTyp=Info|RNText=TelegramBot setzt eine aktuelle Version von FHEM voraus, insbesondere Versionen weit vor der Umstellung auf 5.7 (also vor Herbst 2015) können mit einem TelegramBot-Modul nicht funktionieren, da insbesondere das HTTPSRV-Modul dann veraltet ist. Am besten auch den TelegramBot über den offiziellen Update mit dem Rest von FHEM installieren/aktualisieren.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Registrierung eines neuen Bot ==&lt;br /&gt;
Zur Registrierung wird ein funktionierender Telegram-Client (egal ob Web, App oder Programm)benötigt. Hier wird ein Chat zum BotFather gestartet und der Befehl /newbot gesendet. Nun fragt der BotFather die benötigten Angaben ab und liefert am Ende des Dialogs die Informationen für den neuen Bot.&lt;br /&gt;
Hier ein Beispiel, wie so ein Chat aussehen könnte:&lt;br /&gt;
&amp;lt;pre&amp;gt;Client: &lt;br /&gt;
/newbot&lt;br /&gt;
----------------&lt;br /&gt;
BotFather:&lt;br /&gt;
Alright, a new bot. How are we going to call it? Please choose a name for your bot. &lt;br /&gt;
----------------&lt;br /&gt;
Client: &lt;br /&gt;
Mein Name &lt;br /&gt;
----------------&lt;br /&gt;
BotFather: &lt;br /&gt;
Good. Now let&#039;s choose a username for your bot. It must end in `bot`. Like this, for example: TetrisBot or tetris_bot.&lt;br /&gt;
----------------&lt;br /&gt;
Client: &lt;br /&gt;
fhem_bot&lt;br /&gt;
----------------&lt;br /&gt;
BotFather: &lt;br /&gt;
Sorry, this username is already taken. Think of something different.&lt;br /&gt;
----------------&lt;br /&gt;
Client: &lt;br /&gt;
fhem1234_bot&lt;br /&gt;
----------------&lt;br /&gt;
BotFather: &lt;br /&gt;
Done! Congratulations on your new bot.&lt;br /&gt;
You will find it at telegram.me/fhem1234_bot.&lt;br /&gt;
You can now add a description, about section and profile picture for your bot, see /help for a list of commands.&lt;br /&gt;
----------------&lt;br /&gt;
Use this token to access the HTTP API:&lt;br /&gt;
1234567890:AbCdefgHIJklmnOPQRst-uvwxyz &lt;br /&gt;
&lt;br /&gt;
For a description of the Bot API, see this page: https://core.telegram.org/bots/api &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Um einen Chat an einen &amp;quot;Contact&amp;quot; versenden zu können, muss zuerst in Contacts (bei Readings) ein Kontakt auftauchen. Wenn man sich zum allerersten Mal bei Telegram angemeldet hat, gibt es noch keinen Chat mit irgendjemanden. Man muss sich zuerstmal selbst eine Nachricht im Smartphone zusenden, dann taucht unter Readings der Eintrag Contacts auf. Erst dann kann man eine Nachricht mit @msgPeerId (das ist Ziffernfolge des Contacts ) oder mit @msgPeer (das ist der Name nach dem Doppelpunkt) vom TelegramBot auf sein Smartphone senden.&lt;br /&gt;
&lt;br /&gt;
== Tipps ==&lt;br /&gt;
&lt;br /&gt;
=== Privacyeinstellungen ===&lt;br /&gt;
&lt;br /&gt;
Damit der TelegramBot auch Meldungen in Gruppen sieht, müssen über den BotFather die Privacy-Einstellungen geändert werden.&amp;lt;br&amp;gt;Beispielchat:&amp;lt;pre&amp;gt;Client:&lt;br /&gt;
/setprivacy&lt;br /&gt;
----------------&lt;br /&gt;
BotFather:&lt;br /&gt;
Choose a bot to change group messages settings.&lt;br /&gt;
----------------&lt;br /&gt;
Client:&lt;br /&gt;
@fhem1234_bot&lt;br /&gt;
----------------&lt;br /&gt;
BotFather:&lt;br /&gt;
&#039;Enable&#039; - your bot will only receive messages that either start with the &#039;/&#039; symbol or mention the bot by username.&lt;br /&gt;
&#039;Disable&#039; - your bot will receive all messages that people send to groups.&lt;br /&gt;
Current status is: ENABLED&lt;br /&gt;
----------------&lt;br /&gt;
Client:&lt;br /&gt;
Disable&lt;br /&gt;
----------------&lt;br /&gt;
BotFather:&lt;br /&gt;
Success! The new status is: DISABLED. /help&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Kontakte ===&lt;br /&gt;
&lt;br /&gt;
Der Bot merkt sich die bereits bekannten Kontakte im Reading &amp;lt;code&amp;gt;Contacts&amp;lt;/code&amp;gt;. Dabei werden die einzelnen Kontakte jeweils als 3-teilige Einträge bestehend aus UserID, Vor- und Nachname des Benutzers (mit _ verbunden) und dem Username (mit vorangestelltem @). &lt;br /&gt;
&lt;br /&gt;
Beispiel: &amp;lt;code&amp;gt;123456:Ralf_Mustermann:@ralf&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Verschiedene Einträge werden durch Leerzeichen getrennt.&lt;br /&gt;
&lt;br /&gt;
Man kann die Kontakte auch manuell überschreiben (z.B. wenn das Reading fehlerhaft oder verloren sein sollte). Dazu gibt es den Set-Befehl &amp;lt;code&amp;gt;replaceContacts&amp;lt;/code&amp;gt;. Dieser nimmt die Kontakte ebenfalls in der gleichen Form wie oben beschrieben entgegen.&lt;br /&gt;
&lt;br /&gt;
Die Kontaktliste wird ansonsten nur durch den Empfang von Nachrichten erweitert, da es im TelegramBot-API keine Möglichkeit gibt Kontaktdaten von Telegram abzufragen (siehe auch pollingTimeout)&lt;br /&gt;
&lt;br /&gt;
=== Reset ===&lt;br /&gt;
&lt;br /&gt;
Es ist möglich den Bot im laufenden Betrieb zurückzusetzen (Set-Befehl &amp;lt;code&amp;gt;reset&amp;lt;/code&amp;gt;). Dabei werden noch nicht abgeschlossene Übetragungen entfernt und die internen Zustände des Devices zurückgesetzt. &lt;br /&gt;
&lt;br /&gt;
=== Gruppen ===&lt;br /&gt;
&lt;br /&gt;
Um eine Nachricht von FHEM an eine Gruppe zu senden, muss der BOT in die Gruppe aufgenommen werden. Nach dem Senden einer Nachricht an die Gruppe kann im Modul die Gruppen-ID ermittelt werden und zum Senden von Nachrichten verwendet werden. Wenn die Privacy-Einstellungen nicht auf &#039;Disabled&#039; gesetzt wurden, muss die Nachricht mit einem Slash (/) beginnen.&lt;br /&gt;
&lt;br /&gt;
==== Supergroups / Supergruppen ====&lt;br /&gt;
&lt;br /&gt;
Auch die neuen Supergruppen werden mit dem Bot unterstützt, es ist allerdings zu beachten, dass bei der Umwandlung einer Gruppe in eine Supergruppe eine neue ID in den Kontakten von Telegram vergeben wird. Wenn man also wie empfohlen IDs zur Identifikation von Benutzern einsetzt, muss entsprechend angepasst werden.&lt;br /&gt;
&lt;br /&gt;
== Beispielszenarien ==&lt;br /&gt;
&lt;br /&gt;
=== Benachrichtigungen über Ereignisse ===&lt;br /&gt;
&lt;br /&gt;
Das einfachste Szenario für die Integration von Messaging-Diensten mit FHEM ist zur Benachrichtigung über Ereignisse. Diese Funktion kann zum Beispiel verwendet werden, um über einen erfolgten Neustart von FHEM zu informieren:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;define notify_fhem_reload notify global:INITIALIZED set telebotdevice message fhem newly started - just now !&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In diesem Beispiel wird der Nachrichtentext &amp;quot;fhem newly started - just now !&amp;quot; an den als default eingestellten Kontakt (Attribut: defaultPeer) gesendet, sobald FHEM neu gestartet wurde. Natürlich kann man auch beliebige andere Benachrichtigungen einführen.&lt;br /&gt;
&lt;br /&gt;
=== Versand von Bildern ===&lt;br /&gt;
&lt;br /&gt;
Es ist auch möglich Bilder auf dem FHEM-Server, die zum Beispiel von einer Kamera oder einem Wettermodul stammen über Telegram zu versenden. So wäre es z.B. möglich jeweils morgens die aktuelle Wetterkarte zu erhalten.&lt;br /&gt;
&lt;br /&gt;
ACHTUNG: TelegramBot verwendet das HTTPUtils-Modul zur Kommunikation mit dem TelegramBot-API. Erst mit der Version, die seit 22.10.2015 &lt;br /&gt;
([r9576] HttpUtils.pm: Async write for POST Requests {{Link2Forum|Topic=41583|LinkText=FHEM-Forum}}) verteilt wird, erlaubt auch den Transfer grösserer Bilder. Die Grenze liegt ansonsten bei ca. 14kb auf Raspberries (Plattformspezifische Grenze).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;define notify_fhem_reload notify wetter:report set telebotdevice sendImage /opt/fhem/wetter.jpg&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bei Erreichen des entsprechenden Status am Wetter-Modul wird ein Image über Telegram versendet. Hier sind lokale Pfade (relativ zu fhem) oder absolute Pfade wie oben möglich.&lt;br /&gt;
&lt;br /&gt;
=== Versand von SVG-Plots ===&lt;br /&gt;
&lt;br /&gt;
SVG-Plots können mit dem Befehl &lt;br /&gt;
&amp;lt;code&amp;gt;cmdSend [ @&amp;lt;peer1&amp;gt; ... @&amp;lt;peerN&amp;gt; ] &amp;lt;fhem command&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
verschickt werden.&lt;br /&gt;
&lt;br /&gt;
Das angegebene FHEM-Kommando wird ausgeführt und das Ergebnis an die angegebenen Peers bzw. den Standard-Peer verschickt.&lt;br /&gt;
&lt;br /&gt;
Mit dem folgenden Befehl wird der SVG-Plot SVG_FileLog_Aussen an den Standard-Peer geschickt: &lt;br /&gt;
&amp;lt;code&amp;gt;set mein_telegramBot cmdSend { plotAsPng(&#039;SVG_FileLog_Aussen&#039;) }&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nach &amp;lt;code&amp;gt;define cmd_sendTelegramSVG cmdalias TGSVG .* AS set mein_telegramBot cmdSend { plotAsPng(&amp;quot;$EVENT&amp;quot;) }&amp;lt;/code&amp;gt;&lt;br /&gt;
kann man mit einem kurzen &lt;br /&gt;
&amp;lt;code&amp;gt;TGSVG SVG_Garten&amp;lt;/code&amp;gt;&lt;br /&gt;
ein beliebiges SVG über die Kommandozeile per Telegram versenden.&lt;br /&gt;
&lt;br /&gt;
Um das SVG nun noch mit einem Text zu versehen, muss eine Textnachricht dazu gesendet werden, was sich am einfachsten durch das Ausführen eines FHEM-Befehls auf Perl-Ebene realisieren lässt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;{fhem &amp;quot;set mein_telegramBot message Bildbeschreibung;; set mein_telegramBot cmdSend { plotAsPng(&#039;mein_SVG&#039;) }&amp;quot; }&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Hinweis:&#039;&#039;&#039; früher wurde zum Verschicken von Plots auch die interne Funktion TelegramBot_ExecuteCommand verwendet; mit dem Update Ende Februar 2017 hat diese Funktion einen zusätzlichen Parameter erhalten und lautet nun &lt;br /&gt;
&amp;lt;code&amp;gt;TelegramBot_ExecuteCommand($defs{&amp;quot;mein_telegramBot&amp;quot;}, meine_ZielID, undef, &#039;{plotAsPng(&amp;quot;mein_SVG&amp;quot;)}&#039;);&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Voraussetzungen für den Versand von SVG-Plots ====&lt;br /&gt;
Es muss das Modul libimage-librsvg-perl installiert sein:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;sudo apt-get install libimage-librsvg-perl&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Evtl. sind weitere Module erforderlich:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;sudo apt-get install libgd-graph-perl&lt;br /&gt;
&lt;br /&gt;
sudo apt-get install libgd-text-perl&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Empfang von Bildern oder ähnlichem ===&lt;br /&gt;
&lt;br /&gt;
Beim Empfang von Bildern wird zuerst nur eine ID vom Telegram-Server empfangen, diese befindet sich im Reading &amp;lt;code&amp;gt;msgFileId&amp;lt;/code&amp;gt; angelegt (&amp;lt;code&amp;gt;123456:xxxxxxxxxxxxxxxxxxxxxxx-xxxxxxxx&amp;lt;/code&amp;gt;) und im Reading &amp;lt;code&amp;gt;msgText&amp;lt;/code&amp;gt; steht dann so etwas wie&lt;br /&gt;
&amp;lt;code&amp;gt;received photo # Size: 107701&amp;lt;/code&amp;gt;&lt;br /&gt;
	&lt;br /&gt;
Über das Get-Kommando &amp;lt;code&amp;gt;urlForFile&amp;lt;/code&amp;gt; mit der ID aus dem msgFileId Reading lässt sich dann daraus ein URL ableiten, der dann zur eigentlichen Datei führt: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;https://api.telegram.org/file/bot123456:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/photo/file_25.jpg&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Versand von Emojis (Smileys) ===&lt;br /&gt;
&lt;br /&gt;
Es ist auch möglich Emojis mit den (Text-)Nachrichten zu versenden. Die entsprechenden (Unicode-)Zeichen werden einfach direkt mit in den Text der Nachricht aufgenommen. Um das zu vereinfachen kann man das einfach per Copy und Paste von dieser Seite &lt;br /&gt;
&lt;br /&gt;
http://apps.timwhitlock.info/emoji/tables/unicode (Spalte &amp;quot;Native&amp;quot;) &lt;br /&gt;
&lt;br /&gt;
übernehmen und mit der Nachricht verschicken. &lt;br /&gt;
&lt;br /&gt;
Die Emojis können auch empfangen werden und werden so auch in FHEM / FHEMWeb angezeigt. Plattformspezifische (z.B. von iOS oder Android) Emojis werden dabei nicht unterstützt (gerade mit iOS sind viele neue farbige Emojis hinzugekommen, die wohl leider nur auf Apple-devices funktionieren).&lt;br /&gt;
&lt;br /&gt;
=== Kommandos auslösen ===&lt;br /&gt;
&lt;br /&gt;
Ein wichtiges Szenario ist die Möglichkeit Kommandos in FHEM ausführen zu können, ohne einen Zugang durch die Firewall einrichten zu müssen. Dazu ist die Definition eines Schlüsselwortes (Attribut: &amp;quot;cmdKeyword&amp;quot;)erforderlich, mit dem man die Nachrichten beginnen muss, damit der TelegramBot die Kommandos erkennt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;attr telebotdevice cmdKeyword doit&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Somit kann man dann durch Nachrichten die mit &amp;quot;doit&amp;quot; beginnen Kommandos an FHEM senden, die ähnlich wie im Kommandoeingabefeld von FHEMweb dann von FHEM ausgeführt werden. Das Ergebnis der Ausführung wird zurück an den Sender (und an den definierten defaultPeer) geschickt.&lt;br /&gt;
&lt;br /&gt;
Somit können nicht nur Aktionen angestossen werden, sondern auch Infos abgefragt werden.&lt;br /&gt;
&lt;br /&gt;
Beispiele&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;doit set schalter on&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;doit list telegrambot&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Randnotiz|RNTyp=Warn|RNText=Achtung: Bei den Kommandos sollten man unbedingt das Attribut &amp;quot;cmdRestrictedPeer&amp;quot; setzen, damit nicht jeder Kommandos auf dem FHEM-Server ausführen kann. Dazu sollten die BenutzerIDs der erlaubten Benutzer (durch Leerzeichen getrennt angeben). Da Benutzernamen selber vergeben werden und nicht unbedingt eindeutig sind, sollten hier auch NUR BenutzerIDs verwendet werden.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== Favoriten für Kommandos anlegen ====&lt;br /&gt;
&lt;br /&gt;
Grundidee bei den Favoriten ist, dass man lange Befehle, die man häufig braucht auf &amp;quot;Kurzwahl&amp;quot; legt.&lt;br /&gt;
&lt;br /&gt;
Beispiel-Kommandos wie z.B. &amp;lt;code&amp;gt;set TYPE=ROLLADEN pos 100&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;set TYPE=ROLLADEN pos 0&amp;lt;/code&amp;gt;, die man immer wieder braucht. Um nicht jedes mal dieses Kommando eintippen zu müssen auf dem Smartphone, kann man auch dafür Favoriten anlegen.&lt;br /&gt;
&lt;br /&gt;
Dazu gibt man erst mal die beiden Kommandos getrennt durch Semikolon im Attribut favorites an:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;attr telegrambotdevice favorites set TYPE=ROLLADEN pos 100;set TYPE=ROLLADEN pos 0&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Um die Favorites jetzt ausführen zu können braucht man noch ein Schlüsselwort dafür.&lt;br /&gt;
Nehmen wir mal an man möchte die Favoriten mit &amp;lt;code&amp;gt;/short&amp;lt;/code&amp;gt; ausführen können. Dazu muss dann das Attribut &amp;quot;cmdFavorites&amp;quot; setzen&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;attr telegrambotdevice cmdFavorites /short&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wenn man nun im Telegram Client &lt;br /&gt;
&amp;lt;code&amp;gt;/short 1&amp;lt;/code&amp;gt; an den Bot schickt führt der Bot den ersten Favoriten aus und das Ergebnis der Ausführung wird zurückgeschickt.&lt;br /&gt;
&lt;br /&gt;
Ausserdem kann man im Telegram Client &lt;br /&gt;
&amp;lt;code&amp;gt;/short&amp;lt;/code&amp;gt; an den Bot schicken, dann antwortet der Bot mit&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Favorites&lt;br /&gt;
&lt;br /&gt;
/short1 = set TYPE=ROLLADEN pos 100&lt;br /&gt;
&lt;br /&gt;
/short2 = set TYPE=ROLLADEN pos 0&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Antworten werden als Schaltflächen dargestellt (Telegram inline Keyboard) und können am Mobile-Client direkt angeklickt werden um sie auszuführen.&lt;br /&gt;
Um die Beschriftung der Schaltflächen zu optimieren, können die Befehle im Attribut favorites mit Beschreibungen versehen werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;/[Rollaeden zu ]=set TYPE=ROLLADEN pos 100;/[Rollaeden auf]=set TYPE=ROLLADEN pos 0&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nun antwortet der Bot auf das Schlüsselwort für die Favoriten mit:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Favorites&lt;br /&gt;
&lt;br /&gt;
/short1 = Rollaeden zu&lt;br /&gt;
&lt;br /&gt;
/short2 = Rollaeden auf&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* Github Repository für die Telegram-FHEM Entwicklung: https://github.com/viegener/Telegram-fhem&lt;br /&gt;
* Infos zum Telegram BotFather: https://core.telegram.org/bots#botfather&lt;br /&gt;
&lt;br /&gt;
* Source code für das 50_TelegramBot.pm-Modul: https://github.com/viegener/Telegram-fhem/blob/master/50_TelegramBot.pm&lt;br /&gt;
&lt;br /&gt;
* Forum-Thread in dem das Modul vorgestellt wurde {{Link2Forum|Topic=38328|LinkText=FHEM-Forum}}&lt;br /&gt;
* Telegram messaging system https://telegram.org/&lt;br /&gt;
* TelegramBot API https://core.telegram.org/bots/api&lt;/div&gt;</summary>
		<author><name>Topos</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Effizienter_Betrieb_einer_Fu%C3%9Fbodenheizung_mit_Luft-Wasser-W%C3%A4rmepumpe_(Fallbeispiel)&amp;diff=27757</id>
		<title>Effizienter Betrieb einer Fußbodenheizung mit Luft-Wasser-Wärmepumpe (Fallbeispiel)</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Effizienter_Betrieb_einer_Fu%C3%9Fbodenheizung_mit_Luft-Wasser-W%C3%A4rmepumpe_(Fallbeispiel)&amp;diff=27757"/>
		<updated>2018-08-26T12:29:51Z</updated>

		<summary type="html">&lt;p&gt;Topos: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Dieses Fallbeispiel nutzt das FHEM-Modul LUXTRONIK2 für eine Novelan LIC8E Wärmepumpe (kompakte Luft-Wasser-Wärmepumpe, 8kW (A2/W35), Monobloc, Innenaufstellung, &#039;&#039;&#039;nicht modulierend&#039;&#039;&#039;). Das FHEM-Modul und die zugehörige Steuerung Luxtronik 2.0 wird auf [[Luxtronik_2.0 | &#039;&#039;&#039;dieser&#039;&#039;&#039; WIKI Seite]] beschrieben. Es ist ratsam, diese zuvor zu lesen.&lt;br /&gt;
&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
Die folgenden Punkte sind für den ökonomischen Betrieb einer Luft-Wasser-Wärmepumpe ausschlaggebend:&lt;br /&gt;
# Niedrige (Soll-)Temperaturen im Heizsystem. Je geringer die Differenz zur Außentemperatur, um so weniger muss die Wärmepumpe das Kältemittel komprimieren und um so niedriger ist der prozessbedingte Energieverlust (Prozessarbeit).&lt;br /&gt;
# Für die Warmwasserbereitung: Ausnutzung der Tageszeiten mit warmen Außentemperaturen und Vermeidung des Kältetiefs zum Sonnenaufgang.&lt;br /&gt;
# Nutzung der Luftabtauung, anstatt Abtauung durch Kreisumkehr.&lt;br /&gt;
# Vermeidung von ständigen Kompressorstarts und kurzen Laufzeiten.&lt;br /&gt;
&lt;br /&gt;
Grundlage jeder Optimierung ist dabei ein guter hydraulischer und thermischer Abgleich der Heizwasserverteilung und eine genaue Einstellung der Heizkurve, welche die Solltemperatur anhand der Außentemperatur ermittelt. Beides ist sowohl von den Bedürfnissen und dem Nutzungsverhalten der Bewohner als auch von der Dämmung des Hauses abhängig. &lt;br /&gt;
&lt;br /&gt;
Bei Wärmepumpen, die &#039;&#039;&#039;nicht&#039;&#039;&#039; über einen leistungsgeregelten Verdichter verfügen, kann man zusätzlich die Einzelraumregler (ERR) und das Überströmventil der Wärmepumpe außer Betrieb nehmen und damit alle Heizkreise als ein „Heizkörper“ betreiben. Die Temperaturregelung erfolgt in diesem Fall allein durch die Solltemperatur und teilweise auch durch das „Selbstregelverhalten“ einer Fußbodenheizung. Diverse Foreneinträge (z.B. [http://www.haustechnikdialog.de/Forum/t/142011/Einstellungen-Alpha-Innotec-LWC80]) erzählen von bedeutenden Einsparungen durch Absenken der Solltemperatur und Wärmepumpen-freundlichen Betriebszyklen (lange Taktzeiten).&lt;br /&gt;
&lt;br /&gt;
== Grundeinstellung des Heizungssystems ==&lt;br /&gt;
=== Hydraulischer Abgleich einer Fußbodenheizung ===&lt;br /&gt;
Sowohl der hydraulische als auch der thermische Abgleich erfolgen durch die Einstellung der Drosselventile an den Heizungsverteilern. In einem ersten Schritte, dem hydraulischen Abgleich, stellt man die Drosselventile so ein, dass das Wasser in allen Heizkreisen die gleiche Durchlaufzeit hat. Der längste Kreislauf wird am wenigsten gedrosselt. Die Durchflüsse der anderen Heizkreise werden mit Hilfe der Drosseln im gleichen Verhältnis wie die Längen eingestellt. D.h. 90% Länge = 90% Durchfluss, halbe Länge = halber Durchfluss, etc. Üblicherweise entspricht diese Einstellung der Vorgabe durch den Heizungsplaner. Man kann sich jedoch auch empirisch an die richtige Einstellung herantasten.&lt;br /&gt;
&lt;br /&gt;
Für den Abgleich werden alle Stellantriebe von den Ventilen entfernt, so dass sie komplett offen sind. Die Heizungspumpe muss natürlich laufen. Wenn Heizkreise den erforderlichen Durchfluss nicht erreichen, z.B. weil sie weiter entfernt, in einem höheren Stockwerk liegen, dann wird der Durchlauf der anderen Heizkreise gedrosselt. Eventuell muss auch die Heizungspumpe schneller laufen. Die meisten Wärmepumpen haben einen minimalen, optimalen und maximal Durchfluss. Der optimale Durchfluss  ist der energiesparenste für die Wärmepumpe selbst. Die Spreizung zwischen Rück- und Vorlauf in der Wärmepumpe liegt dann meist zwischen 5-9 K.&lt;br /&gt;
&lt;br /&gt;
Fehlen an den Drosseln entsprechende Durchflussanzeigen kann man auch die Umdrehungen der Drossel zählen. Hierbei ist eine zusätzliche Überprüfen der Durchlaufzeiten mit einem Infrarot-Thermometer am Heizungsverteiler sinnvoll. Man erzeugt durch den Start der Wärmepumpe oder der Heizungspumpe einen „Heißwasserfront“ und misst für jeden Heizkreis die Zeit, die es braucht, bis diese Front den Heizkreis durchwandert hat und es zu einer merklichen Temperaturerhöhung am Ende des Heizkreises kommt. Diese Durchlauf-Zeit sollte für alle Heizkreise gleich sein.&lt;br /&gt;
&lt;br /&gt;
=== Thermischer Abgleich  ===&lt;br /&gt;
Der hydraulische Abgleich ist nur der erste Schritt. Abgesehen davon, das nicht alles so gebaut wie geplant wird, gibt es Zimmer, in denen dauerhaft eine höhere oder niedrigere Temperatur gewünscht ist (Bad, Schlafzimmer). Zudem ist der Wärmeverlust jedes Zimmers unterschiedlich und von vielen Einflussfaktoren abhängig - insbesondere der Lage im Gebäude und im Gelände. Dies kann nur sehr begrenzt während der Heizungsplanung berücksichtigt werden.&lt;br /&gt;
&lt;br /&gt;
Für den Abgleich sollten in jedem Zimmer Thermometer installiert und über längere Zeit (am besten elektronisch) der Temperaturverlauf aufgezeichnet werden. Ziel ist es, durch eine schrittweise Öffnung oder Schließung einzelner Drosseln in allen Zimmer möglichst gleiche (oder gleich höhere oder niedrigere) Temperaturen zu erreichen. Je nach Ausgangslage dauert das mehrere Wochen. Die Stellantriebe dürfen weiterhin nicht in Betrieb sein.&lt;br /&gt;
&lt;br /&gt;
Wichtig!!! Beim hydraulischem und thermischem Abgleich des Heizungssytems werden die Temperaturunterschiede zwischen den Zimmern vermindert oder auch korrekt eingestellt. Die Einstellung der tatsächlichen Zimmertemperaturen erfolgt über die Heizkurve.&lt;br /&gt;
&lt;br /&gt;
=== Einstellung der Heizkurve ===&lt;br /&gt;
Parallel zum thermischen Abgleich erfolgt die Einstellung der [[Luxtronik 2.0#Heizkurve|Heizkurve]]. Bei Wärmepumpen erfolgt die Heizungsregelung gewöhnlich über die Rücklauftemperatur. Deren Solltemperatur wird von der Steuerung über die Außentemperatur mit Hilfe einer Formel mit zwei einstellbaren Konstanten, der Heizkurve bzw. Heizkennlinie, ermittelt. Das LUXTRONIK2-Modul in FHEM kann bei der exakten Berechnung der Konstanten unterstützten.&lt;br /&gt;
&lt;br /&gt;
Dafür muss bei einer tiefen und bei einer höheren Außentemperatur (z. B. -7°C und +7°C) die korrekte Solltemperatur ermittelt werden, die zu der gewünschten Innentemperatur führt. Ideal sind bewölkte, windarme Tage an denen nur die Außentemperatur auf das Gebäude wirkt. Wenn es zudem nur geringe Temperaturänderungen zwischen Tag und Nacht gibt, zusätzliche Wärmequellen (Kochen, Fönen, Besucher, etc.) im Gebäude vermieden werden und dies auch über mehrere Tage anhält, dann hat man gute Chancen genau die richtige Solltemperatur zu ermitteln, die &#039;&#039;&#039;gerade noch&#039;&#039;&#039; zur Beheizung des Hauses &#039;&#039;&#039;ausreicht&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Auch hier fängt man mit der bereits existierenden Einstellung der Heizkurve an. Es darf keine Nachtabsenkung eingestellt sein. Am besten macht man sich eine Tabelle, in der man die jeweilige Außentemperatur, die sich einstellende Solltemperatur und die Innentemperatur der Räume aufnimmt. Je nach Innentemperatur hat man entweder die optimale Solltemperatur gefunden oder man kann ihre tatsächliche Höhe zumindest etwas besser abschätzen.&lt;br /&gt;
&lt;br /&gt;
Kurzfristig Heben und Senken lässt sich die Solltemperatur durch die Direktabsenkung oder -erhöhung am Gerät oder in FHEM durch den Befehl&lt;br /&gt;
 set &amp;lt;device&amp;gt; &#039;&#039;&#039;returnTemperatureSetBack&#039;&#039;&#039; &#039;&#039;Temperatur&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Das LUXTRONIK2-Modul berechnet die korrekten Parameter (Konstanten) der Heizkurve über den Befehl&lt;br /&gt;
 get &amp;lt;device&amp;gt; &#039;&#039;&#039;heatingCurveParameter&#039;&#039;&#039; &#039;&#039;Aussentemp1 Solltemp1 Aussentemp2 Solltemp2&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Die beiden Außentemperaturen müssen möglichst weit auseinander liegen. Der Befehl ermittelt die neuen Heizkurvenparameter &#039;&#039;heatingCurveEndPoint&#039;&#039; und &#039;&#039;heatingCurveOffset&#039;&#039; und zeigt auch an, welche Solltemperaturen derzeit bei den beiden Außentemperaturen eingestellt werden. Die neuen Heizkurvenparameter setzt man dann am besten auch durch FHEM, da das Modul eine Genauigkeit von 0.1 zuläßt. Direkt an der Steuerung können die Parameter nur in 0.5er Schritten einstellt werden.&lt;br /&gt;
&lt;br /&gt;
== Dauerhaftes Entfernen der Einzelraumregler (ERR) bei nicht leistungsgeregelten Wärmepumpen==&lt;br /&gt;
&lt;br /&gt;
Ein Betrieb von nicht leistungsgeregelten, taktenden Wärmepumpen zusammen mit ERR ist vom Regelverhalten her sehr problematisch.&lt;br /&gt;
&lt;br /&gt;
Taktende Wärmepumpen können im Gegensatz zu [https://www.energie-experten.org/heizung/waermepumpe/betrieb/modulation.html drehzahlgeregelten Wärmepumpen] nur ihre volle Heizleistung abgeben und keine Zwischenwerte. Sie erfordern einen hohen Mindestdurchfluss im Wärmetauscher (Verflüssiger), ansonsten wird der Kältemittelkreislauf zu heiß und die Wärmepumpe schaltet mit einem Hochdruckfehler ab. Die Wärmepumpe verfügt deshalb im Heizkreislauf über einen Pufferspeicher und ein druckgeregeltes Überströmventil, welches das Heizwasserverteilsystem umgehen und den Vorlauf direkt mit dem Rücklauf verbinden kann. Dadurch ist der Mindestdurchfluss im Wärmetauscher immer sichergestellt.&lt;br /&gt;
&lt;br /&gt;
Dieser Aufbau ist jedoch alles andere als optimal. Haben im Normalbetrieb der Heizung mehrere ERR ihren Heizkreis abgesperrt (gewünschte Zimmertemperatur erreicht) so unterschreitet der Durchfluss über das Heizungssystem relativ schnell den Mindestwert. In diesem Fall öffnet das Überströmventil. Ein Teil des (warmen) Heizwassers strömt direkt vom Vorlauf zum Rücklauf und vermischt sich dort mit dem (kalten) Rücklauf aus den noch offenen Heizkreisen. Dadurch kommt es aber ungewollt zu einer schnellen Erhöhung der Rücklauftemperatur. Die Wärmepumpe arbeitet in einem thermischen Kurzschluss und erwärmt hauptsächlich ihren Pufferspeicher. Die gemischte Rücklauftemperatur erreicht schnell den Sollwert und die Wärmepumpe schaltet ab, obwohl aus den offenen Heizkreisen noch kaltes Wasser zurückströmt und die entsprechenden Zimmer noch kalt sind. Sobald die Wärmepumpe steht, fällt die Rücklauftemperatur schnell ab, da die offenen Heizkreise und der durchströmte Estrich noch nicht die Solltemperatur erreicht haben sondern nur der Pufferspeicher im Gerät.&lt;br /&gt;
&lt;br /&gt;
Als Folge kommt es zu &#039;&#039;&#039;wiederholtem kurzen Anspringen der Wärmepumpe und darauffolgenden systembedingten Pausen&#039;&#039;&#039; (das EVU erlaubt max. 3 Starts pro Stunde) ohne das einige Räume je ihre gewünschte Temperatur erreichen. Klagt man sein Leid dem Heizungsmonteur, so erhöht der meist einfach den Sollwert der Rücklauftemperatur mit dem Ergebnis, dass sich nichts ändert, die Wärmepumpe durch die vielen Starts schneller verschleißt und die Stromrechnung durch den ineffizienten Betrieb schnell doppelt so hoch ist, wie ursprünglich geplant.&lt;br /&gt;
&lt;br /&gt;
Während der Phase der Grundeinstellung wird die Heizung ohne die Stellantriebe bzw. ohne ERR betrieben und es sind immer die gesamten Heizkreisläufe in Betrieb. Bei einem korrekt abgeglichenen und ausgelegten Heizsytem sind die Heizzyklen der Wärmepumpe sehr lang, meist mehrere Stunden. Die Rücklauftemperatur in der Wärmepumpe steigt nur langsam an und fällt nach Ende des Heizzyklus auch nur langsam wieder ab, da immer der gesamte Estrich im Haus aufgeheizt wird und diese Wärme lange speichert. Dies ist die optimale Betriebsform einer Wärmepumpe.&lt;br /&gt;
&lt;br /&gt;
Bei nicht leistungsgeregelten, taktenden Wärmepumpen ist es deshalb empfehlenswert, die ERR von mindestens 2/3 aller Heizkreise dauerhaft außer Betrieb zu nehmen. Wenn dadurch der Mindestdurchfluss sichergestellt werden kann, kann man das Überströmventil auch komplett schließen. Es ist zumeist etwas undicht und verschlechtert damit die Effektivität des Heizsystems. Normalerweise kann man dadurch nichts beschädigen, da die Wärmepumpe im Fehlerfall einen Hochdruckfehler auslöst und stehen bleibt. Auch der Pufferspeicher ist nun eigentlich überflüssig, da die Heizung nicht mehr im thermischen Kurzschluss betrieben wird.&lt;br /&gt;
&lt;br /&gt;
=== Geändertes Regelverhalten bei Betrieb ohne ERR ===&lt;br /&gt;
Durch den Wegfall der ERR kann die Regelung nicht mehr gezielt auf die Aufheizung einzelner Zimmer, z.B. durch Sonneneinstrahlung, reagieren.&lt;br /&gt;
&lt;br /&gt;
Eine Fußbodenheizung dämpft diese Temperaturunterschiede jedoch bereits durch ihr physikalisches Wirkprinzip. Die Wärmeabgabe eines Heizkörpers wird durch den Temperaturunterschied zwischen Heizkörper (hier der Fußboden) und Raumluft bestimmt. Aufgrund der geringen Vorlauftemperaturen wird bei einer Fußbodenheizung dieser Temperaturunterschied auch maßgeblich durch die Raumtemperatur beeinflußt. Die Fußbodenheizung in wärmeren Räumen gibt merklich weniger Wärme ab als in kalten Räumen. Das System reguliert sich also teilweise selbst. Dieser Effekt ist um so größer, je niedriger die Vorlauftemperaturen sind.&lt;br /&gt;
&lt;br /&gt;
Prinzipiell können in &#039;&#039;&#039;wenigen&#039;&#039;&#039; einzelnen Räumen aber durchaus die ERR in Betrieb bleiben.&lt;br /&gt;
&lt;br /&gt;
AIT bietet auch die Raumbedieneinheit RBE und den Raumfernsteller RFV an, welche direkt an die Luxtronik-Steuerung angeschlossen werden. Diese messen den Abstand der Zimmertemperatur zur gewünschten Solltemperatur und heben oder senken dann über einen Faktor den Sollwert der Rücklauftemperatur in der Wärmepumpe. &lt;br /&gt;
&lt;br /&gt;
In FHEM kann man dies natürlich auch ohne teure Hardware tun. Zudem können die Zimmertemperaturen mehrerer Räume berücksichtigt werden. Man ermittelt dafür jeweils den Abstand (Delta) der aktuellen zur gewünschten Zimmertemperatur, multipliziert diesen mit einem Faktor (üblicherweise zwischen 1 und 5) und verändert die Rücklaufsolltemperatur um diesen Wert mit Hilfe des Befehls:&lt;br /&gt;
 set &amp;lt;device&amp;gt; &#039;&#039;&#039;returnTemperatureSetBack&#039;&#039;&#039; &#039;&#039;Temperaturunterschied&#039;&#039;&lt;br /&gt;
Der Befehl läßt Werte von -5 K bis +5 K zu. Die Berechnung des Stellwertes muss nicht linear über einen Faktor erfolgen, auch eine quadratische Formel ist möglich. Der Stellwert von -5 K kann dann z.B. bereits bei einer Abweichung von +1 K erreicht werden.&lt;br /&gt;
 $setBack = -int( 10 * ( ($deltaTemp*1.45+1)**2 - 1 ) + 0.5 ) / 10;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| Temperaturabweichung&lt;br /&gt;
| +0.1&lt;br /&gt;
| +0.2&lt;br /&gt;
| +0.3&lt;br /&gt;
| +0.4&lt;br /&gt;
| +0.5&lt;br /&gt;
| +0.6&lt;br /&gt;
| +0.7&lt;br /&gt;
| +0.8&lt;br /&gt;
| +0.9&lt;br /&gt;
| +1.0&lt;br /&gt;
|-&lt;br /&gt;
| Stellwert&lt;br /&gt;
| -0.3&lt;br /&gt;
| -0.7&lt;br /&gt;
| -1.1&lt;br /&gt;
| -1.5&lt;br /&gt;
| -2.0&lt;br /&gt;
| -2.5&lt;br /&gt;
| -3.1&lt;br /&gt;
| -3.7&lt;br /&gt;
| -4.3&lt;br /&gt;
| -5.0&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Wenn eine Fussbodenheizung ohne ERR betrieben wird und Räume unterschiedliche Temperaturen haben sollen, dann sollte zudem die [[Luxtronik_2.0#Pumpenoptimierung|Pumpenoptimierungszeit]] möglichst klein gewählt werden, da sonst nach Abschalten der Wärmepumpe die wärmeren Räume schneller abkühlen und dabei die kälteren aufheizen.&lt;br /&gt;
&lt;br /&gt;
== Optimierung der Luftabtauung ==&lt;br /&gt;
Der Verdampfer einer Luft-Wasser-Wärmepumpe muss bei niedrigen Außentemperaturen regelmäßig abgetaut werden. [[Luxtronik 2.0#Abtauung des Verdampfers (Luftwärmetauschers) bei Luft-Wasser-Wärmepumpen|(näheres hier)]] Dies erfolgt entweder energiesparend durch die Umgebungsluft oder die Abtau-Energie wird über eine Kreislaufumkehr dem Heizungssystem entnommen und vermindert damit die Energieeffizienz des Systems um ca. 5%.&lt;br /&gt;
&lt;br /&gt;
[[Datei:Luxtronik2-Luftabtauung.png|miniatur|Temperaturverlauf bei einer Luftabtauung&amp;lt;br&amp;gt;(roter Pfeil)]] ‎&lt;br /&gt;
=== Wahl des Temperaturbereiches ===&lt;br /&gt;
Die Luftabtauung wird über zwei Kennwerte gesteuert. Der Wert &#039;&#039;heatSourceDefrostAirThreshold&#039;&#039; definiert den Wert der Luft-Eingangstemperatur oberhalb der mit Luft abgetaut wird. Der Wert &#039;&#039;heatSourceDefrostAirEnd&#039;&#039; definiert die Luft-Ausgangstemperatur bei der der Verdampfer als abgetaut gilt und die Luftabtauung beendet wird. Diese Werte schwanken bei jedem Wärmepumpentyp, sind werksseitig meist aber auf 7°C und 6°C eingestellt. Dies nutzt nicht den tatsächlich verfügbaren Bereich für die Luftabtauung. Zudem liegen die Werte zu nah beieinander. Sinnvolle Wert sind jedoch stark von der Einbausituation abhängig und müssen empirisch bestimmt werden.&lt;br /&gt;
&lt;br /&gt;
Um sicher zu gehen, dass die Steuerung die korrekten Temperaturen mißt, sollte zuerst kontrolliert werden, dass der Sensor zur Bestimmung der Luft-Eingangstemperatur auch tatsächlich im Luftstrom sitzt und nicht bei der Montage hinter eine Verkleidung oder Isolierung gerutscht ist.&lt;br /&gt;
&lt;br /&gt;
Aufgrund der Ungenauigkeit der Sensoren sollte der Wert &#039;&#039;heatSourceDefrostAirEnd&#039;&#039; immer deutlich unter dem Wert &#039;&#039;heatSourceDefrostAirThreshold&#039;&#039; und im ausreichenden Abstand zum Gefrierpunkt 0°C liegen. Der Abstand 1 K braucht nur geringfügig verändert zu werden. Der Abtand zum Gefrierpunkt kann dagegen auch knapp über +1°C liegen. Als praktikabel haben sich zum Beispiel die Werte&lt;br /&gt;
* &#039;&#039;heatSourceDefrostAirThreshold = 2.7°C&#039;&#039; und&lt;br /&gt;
* &#039;&#039;heatSourceDefrostAirEnd = 1.3°C&#039;&#039;&lt;br /&gt;
und, an der Steuerung, eine Erhöhung der Zeitbegrenzung &#039;&#039;Luft-Abt. max&#039;&#039; auf 25 min erwiesen.&lt;br /&gt;
&lt;br /&gt;
Wichtig!!! Diese Werte müssen empirisch ermittelt werden. Der Abtauvorgang ist erst beendet, wenn aus dem Entwässerungsschlauch am Verdampfer kein Wasser mehr fließt und die Luft-Ausgangstemperatur steil ansteigt. Liegt der &#039;&#039;heatSourceDefrostAirThreshold&#039;&#039; zu niedrig, dann erreicht die Wärmepumpe nicht mehr die Temperatur &#039;&#039;heatSourceDefrostAirEnd&#039;&#039;. Die Luftabtauung wird dann nach einem Timeout abgebrochen und eine Abtauung durch Kreislaufumkehr durchgeführt. Der Start der Luftabtauung war für diesen Fall ineffizient und sollte vermieden werden.&lt;br /&gt;
&lt;br /&gt;
Der letzte Abtauvorgang wird im Wert &#039;&#039;heatSourceDefrostLast&#039;&#039; festgehalten. Die letzte abgebrochene Luftabtauung im Wert &#039;&#039;heatSourceDefrostLastTimeout&#039;&#039;. Beide Werte sollten genutzt werden, um die korrekte Funktion der Luftabtauung bei den eingestellten Werten zu überprüfen.&lt;br /&gt;
&lt;br /&gt;
=== Heizzyklen im Bereich der Luftabtauung ===&lt;br /&gt;
Die Firmware der Luxtronik 2.0 hat eine unerfreuliche Eigenheit. Nach einer Luftabtauung wird der Heiztakt nicht zu Ende geführt, sondern erst wieder beim Unterschreiten der unteren Hysterese gestartet. Dadurch bleibt die Rücklauftemperatur eventuell dauerhaft unterhalb der Solltemperatur der Heizkurve, anstatt um sie im Hystereseband zu schwanken. Bei leichten Plusgraden im Außenbereich ist dadurch die Raumtemperatur immer etwas zu kühl.&lt;br /&gt;
&lt;br /&gt;
Optimal für die Wärmepumpe wäre es, wenn ein Heizzyklus bei höheren Außentemperaturen der Länge eines Abtauzyklus (45 min) entspricht. Dies kann man durch eine exakte Einstellung der Hysterese &#039;&#039;returnTemperatureHyst&#039;&#039; erreichen. Sie sollte so gewählt sein, dass sie am unteren Ende der Luftabtauung (z. B. 5°C) möglichst komplett durchfahren wird, bevor der Heizzyklus durch die Luftabtauung unterbrochen wird.&lt;br /&gt;
&lt;br /&gt;
Bei höheren Außentemperaturen erreicht die Rücklauftemperatur dann aber zu schnell den oberen Grenzwert. Zwischen 10°C und 15°C läuft die Heizung deshalb mindestens 40 min. Wenn unterhalb 10°C aber auf dem Abtautimer &#039;&#039;heatSourceDefrostTimer&#039;&#039; ein kleiner Restwert bleibt, dann führt dies beim nächsten Heizzyklus zum vorzeitigen Abbruch. Im zweiten Heizzyklus erreicht die Rücklauftemperatur dadurch nie den oberen Grenzwert. Eventuell sinkt sogar die Raumtemperatur.&lt;br /&gt;
&lt;br /&gt;
[[Datei:Luxtronik2-Verlängerung_des_Heizzykluses.png|miniatur|Verlängerung des Heizzykluses durch Anheben der Solltemperatur bis zum Start der Luftabtauung&amp;lt;br&amp;gt;&lt;br /&gt;
Grün = Vorlauftemperatur, Blau = Rücklauftemperatur, Gelb = Solltemperatur mit Hystereseband]]&lt;br /&gt;
Dieser Eigenheit läßt sich mit FHEM ausgleichen. Dafür hebt man im ersten Heizzyklus rechtzeitig vor dem Erreichen des oberen Grenzwertes die Solltemperatur um 0,5 K an (&#039;&#039;returnTemperatureSetBack&#039;&#039;) und wartet, bis der Abtautimer &#039;&#039;heatSourceDefrostTimer&#039;&#039; abgelaufen ist und die Luftabtauung beginnt. Die Wärmepumpe startet dadurch immer mit einen vollen Abtautimer. Die Anzahl der Starts wird minimiert. Die Temperatur wird auch im Bereich der Luftabtauung komplett durch die Heizkurve bestimmt.&lt;br /&gt;
&lt;br /&gt;
== Warmwasserbereitung bei Luft-Wasser-Wärmepumpen ==&lt;br /&gt;
Die Kosten der Warmwasserbereitung durch Luft-Wasser-Wärmepumpen hängen von zwei Faktoren ab:&lt;br /&gt;
# den Energiekosten: Bei Zweitarifzählern ist der Strom im Nebentarif (z.B. Mo-Fr von 22:00 - 06:00, Sa ab 13:00 und den ganzen So) billiger als im Haupttarif.&lt;br /&gt;
# der Lufttemperatur: Die Heizleistung der Wärmepumpe steigt bei höherer Lufttemperatur trotz konstantem Stromverbrauchs.&amp;lt;br&amp;gt;Die Außentemperatur erreicht ihr Maximum an einem sonnigen &#039;&#039;&#039;Durchschnittstag&#039;&#039;&#039; gegen 15:00 Uhr. Ihr Minimum hat sie kurz vor Sonnenaufgang.&lt;br /&gt;
Das FHEM Modul erlaubt es, durch zeitweises Anheben der Solltemperatur ein Aufheizen des Boilers auszulösen.&lt;br /&gt;
 set &amp;lt;device&amp;gt; &#039;&#039;&#039;hotWaterTemperaturTarget&#039;&#039;&#039; 50&lt;br /&gt;
Es gilt nun, den kostengünstigsten Zeitpunkt für diesen Vorgang zu bestimmen. Die nachfolgenden Ausführungen setzen voraus, dass Aufgrund der Boilerisolierung und der Boilergrösse nur ein- oder zweimal pro Tag aufgeheizt werden muss. Zur Vereinfachung wird die Abhängigkeit der Wärmeverluste von der Boilertemperatur vernachlässigt.&lt;br /&gt;
&lt;br /&gt;
Bei den aktuellen Wärmepumpentarifen ist der Strom des Haupttarifes etwa 17&amp;amp;nbsp;% teurer als der des Nebentarifes. Es liegt also nahe, den Boiler in der Woche zu Beginn des Nebentarifes gleich für die nächsten 24&amp;amp;nbsp;h aufzuheizen, weil dann die Außentemperatur höher ist und man dann am billigsten und effizientesten die entsprechende Wärme produziert.&lt;br /&gt;
 # Sollwert 5&amp;amp;nbsp;K über Standardwert setzen&lt;br /&gt;
  define Boilertemperatur_hoch at *22:05:00 {\&lt;br /&gt;
   if ($we != 1) { fhem (&amp;quot;set WP hotWaterTemperaturTarget 47&amp;quot;);; }\&lt;br /&gt;
  }&lt;br /&gt;
 # Sollwert auf Standwert zurücksetzen&lt;br /&gt;
  define Boilertemperatur_normal at *23:00:00 set WP hotWaterTemperaturTarget 42&lt;br /&gt;
&lt;br /&gt;
=== Detailliertere Berücksichtigung der Temperaturabhängigkeit===&lt;br /&gt;
&lt;br /&gt;
Damit die Warmwasserbereitung vor 6 Uhr nicht startet, muss die Warmwassertemperatur um 22&amp;amp;nbsp;Uhr eigentlich nur ausreichend hoch über der Auslöseschwelle liegen. Bei einer Auslöseschwelle von 40&amp;amp;nbsp;°C und einem Wärmeverlust (&#039;&#039;statBoilerGradientCoolDownMin&#039;&#039;) von 0,25&amp;amp;nbsp;K/h sind dies z.B. 42&amp;amp;nbsp;°C. Beträgt die Solltemperatur-Hysterese 2&amp;amp;nbsp;K, so muss um 22 Uhr die Solltemperatur kurzzeitig auf 44&amp;amp;nbsp;&amp;amp;deg;C angehoben werden bzw. eigentlich nur 2&amp;amp;nbsp;K oberhalb der aktueller Warmwassertemperatur.&lt;br /&gt;
&lt;br /&gt;
Die obigen 47 °C machen zudem nur Sinn, wenn tagsüber die Effektivitätsverbesserung durch die höheren Außentemperaturen den höheren Strompreis nicht wieder ausgleicht. Zudem muss berücksichtigt werden, dass sich bei höherer Vorlauftemperatur auch die Leistungsaufnahme der Wärmepumpe und damit ihre Arbeitszahl ändert. Diese Veränderung beträgt üblicherweise 2&amp;amp;nbsp;%/K.&amp;lt;br&amp;gt;&lt;br /&gt;
Geht man von einer durchschnittlichen Erhöhung der Vorlauftemperatur von 4 K aus, so erhält man dadurch eine Verschlechterung der Arbeitszahl um 8&amp;amp;nbsp;%. Das heißt, die 17&amp;amp;nbsp;% Preisunterschied müssen um den Effektivitätsverlust von 8&amp;amp;nbsp;% korrigiert werden (1,17/1,08=1,08). In unserem Fall reicht also die Temperaturdifferenz aus, die zu einer 8&amp;amp;nbsp;% höheren Heizleistung führt.&lt;br /&gt;
&lt;br /&gt;
Die ungefähre, theoretische Temperaturabhängigkeit der Heizleistung erhält man am schnellsten aus den Grafiken der Betriebsanleitung der Wärmepumpe. Empirisch und genauer lassen sich die Wert durch Loggen der Werte &#039;&#039;thermalPower&#039;&#039; oder besser &#039;&#039;statThermalPowerBoiler&#039;&#039; bestimmen. Liest man die Log-Datei in ein Tabellenkalkulationsprogramm (MS Excel, OO Calc), kann man mit diesem auch gleich eine Regressionsgrade berechnen. Auf diesem Wege erhält man für jede Temperaturdifferenz die prozentuale Änderung der Heizleistung. Nehmen wir an, sie beträgt für 8&amp;amp;nbsp;% 4&amp;amp;nbsp;K.&lt;br /&gt;
&lt;br /&gt;
Über das {{Link2CmdRef|Lang=de|Anker=Weather|Label=Wettermodul}} von FHEM kann man nun Mo-Fr um 22:00 die aktuelle Außentemperatur &#039;&#039;ambientTemperature&#039;&#039; mit der maximalen Außentemperatur des nächsten Tages vergleichen. Rechnen wir noch eine Sicherheit von 2 K hinzu, dann kann man z.B. festlegen, dass ab 5 K Temperaturunterschied und jeden Samstag der Boiler nur noch so weit aufgeheizt wird, dass er bis 06:00 nicht mehr auslöst. &lt;br /&gt;
 define Boilertemperatur_hoch at *22:05:00 {\&lt;br /&gt;
   my $delta = ReadingsVal(&amp;quot;Wetter&amp;quot;,&amp;quot;fc2_high_c&amp;quot;,0) - ReadingsVal(&amp;quot;Heizung&amp;quot;,&amp;quot;ambientTemperature&amp;quot;,0);;\&lt;br /&gt;
   if ($delta &amp;gt;=5.0 || $wday == 6) {\&lt;br /&gt;
     my $newTemp = int(ReadingsVal(&amp;quot;Heizung&amp;quot;,&amp;quot;hotWaterTemperature&amp;quot;,42)*2+5)/2;;\&lt;br /&gt;
     if ($newTemp&amp;lt;42.0) {$newTemp = 42;;}\&lt;br /&gt;
     if ($newTemp&amp;gt;44.0) {$newTemp = 44;;}\&lt;br /&gt;
     fhem( &amp;quot;set Heizung hotWaterTemperatureTarget $newTemp&amp;quot; );;\&lt;br /&gt;
   }\&lt;br /&gt;
   else { fhem( &amp;quot;set Heizung hotWaterTemperatureTarget 47&amp;quot; );; }\&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Mit Hilfe der Sperrzeitensteuerung der Luxtronik 2.0 kann man die nächste, zweite Aufheizung dann erst wieder um 15:00 erlauben, da dann Aufgrund der hohen Außentemperaturen der Strompreisunterschied mehr als ausgeglichen wird. Natürlich kann das Aufheizen auch hier durch ein gezieltes Anheben der Solltemperatur erreicht werden (z.B. am Wochenende).&lt;br /&gt;
 define Boilertemperatur_WE_Hoch at *15:00:00 {\&lt;br /&gt;
    if ($we == 1) {fhem( &amp;quot;set Heizung hotWaterTemperatureTarget 47&amp;quot; );; }\&lt;br /&gt;
 }&lt;br /&gt;
 define Boilertemperatur_WE_Normal at *16:00:00 {\&lt;br /&gt;
    if ( ReadingsVal(&amp;quot;Heizung&amp;quot;,&amp;quot;hotWaterTemperatureTarget&amp;quot;, 42 ) != 42.0 ) {fhem (&amp;quot;set Heizung hotWaterTemperatureTarget 42&amp;quot;);;}\&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
== Nachtabsenkung und Heizstäbe (ZWE) ==&lt;br /&gt;
Ein Absenken der Solltemperatur macht bei Fußbodenheizungen nur sehr begrenzt Sinn, da der Estrich in der Regel mehrere Stunden braucht, um abzukühlen oder um wieder auf Solltemperatur zu kommen. Bei einer Absenkung über Nacht startet die Wiederaufheizung zudem zum kältesten Zeitpunkt des Tages (Sonnenaufgang) und, bei zeitabhängigen Stromtarifen, in der teuren HT-Zeit. In Summe führt dies zumeist zu Mehrausgaben.&lt;br /&gt;
&lt;br /&gt;
Insbesonders in Kälteperioden kann eine Absenkung bei [[Luxtronik_2.0#Bivalenter Betrieb|bivalent betriebenen]] Wärmepumpen auch zum unnötigen Ansprechen der Heizstäbe führen, da der Aufheizvorgang meist unterhalb des Hysteresebandes der Solltemperatur startet und die Wärmepumpe es nicht schaft, die untere Grenztemperatur innerhalb von 60 min zu erreichen. Deshalb sollten in FHEM zu schnelle und starke Änderungen der Solltemperatur bei tiefen Außentemperaturen vermieden werden. Nutzt man die Absenkungsfunktion der Luxtronik-Steuerung, so sollte der Grenzwert &#039;&#039;&#039;&amp;quot;Absenk. bis&amp;quot;&#039;&#039;&#039; nicht zu tief eingestellt werden.&lt;br /&gt;
&lt;br /&gt;
Vermeidet man Absenkungen oder zu starke Sollwertänderungen, dann benötigt man die Heizstäbe nur bei wirklich tiefen Außentemperaturen, wenn der Wärmeverlust des Gebäudes nahe an der verbleibenden Heizleistung der Wärmepumpe liegt (Abtauung und EVU-Sperren berücksichtigen). Diese Temperatur läßt sich empirisch bestimmen und stellt dann auch das Minimum des Steuerungskennwertes &#039;&#039;&#039;&amp;quot;Freig. ZWE&amp;quot;&#039;&#039;&#039; dar. Während der Bestimmung des Wertes sollte es nicht zu einem zusätzlichen Wärmeeintrag ins Gebäude kommen (Sonneneinstrahlung, Kochen, etc.).&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* [https://www.energie-experten.org/heizung/waermepumpe.html www.energie-experten.org/Wärmepumpe] - Gute Erläuterung der technischen Hintergründe einer Wärmepumpe&lt;br /&gt;
* [[Luxtronik_2.0 | FHEM Modul der Steuerung Luxtronik 2.0]]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:HOWTOS]]&lt;br /&gt;
[[Kategorie:Heizungssteuerung]]&lt;/div&gt;</summary>
		<author><name>Topos</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Luxtronik_2.0&amp;diff=26399</id>
		<title>Luxtronik 2.0</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Luxtronik_2.0&amp;diff=26399"/>
		<updated>2018-04-10T20:31:38Z</updated>

		<summary type="html">&lt;p&gt;Topos: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Modul&lt;br /&gt;
|Name=LUXTRONIK2&lt;br /&gt;
|ModPurpose=Anbindung der Heizungssteuerung Luxtronik 2.0&lt;br /&gt;
|ModType=d&lt;br /&gt;
&amp;lt;!-- |ModCategory= (noch?) nicht verwendet --&amp;gt;&lt;br /&gt;
|ModCmdRef=LUXTRONIK2&lt;br /&gt;
|ModForumArea=Sonstiges&lt;br /&gt;
|ModTechName=23_LUXTRONIK2.pm&lt;br /&gt;
|ModOwner=[http://forum.fhem.de/index.php?action=pm;sa=send;u=5432 tupol]&lt;br /&gt;
}}&lt;br /&gt;
Die Luxtronik 2.0 ist eine Heizungssteuerung der Firma Alpha InnoTec AIT, die in Wärmepumpen von Alpha InnoTec, Buderus (Logamatic HMC20, HMC20 Z), CTA All-In-One (Aeroplus), Elco, Nibe (AP-AW10), Roth (ThermoAura®, ThermoTerra), Novelan (WPR NET) und Wolf Heiztechnik (BWL/BWS) verbaut ist.&lt;br /&gt;
Sie besitzt einen Ethernet (RJ45) Anschluss, so dass sie direkt in lokale Netzwerke (LAN) integriert werden kann.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ein detailierte Anleitung zum energiesparenden Betrieb einer Luft-Wasser-Wärmepumpe mit Fußbodenheizung findet man auf [[Effizienter Betrieb einer Fußbodenheizung mit Luft-Wasser-Wärmepumpe (Fallbeispiel)|&#039;&#039;&#039;dieser&#039;&#039;&#039; Wiki-Seite]]&lt;br /&gt;
&lt;br /&gt;
== Hinweise zum Betrieb mit FHEM ==&lt;br /&gt;
Definition in fhem.cfg:&lt;br /&gt;
&lt;br /&gt;
 define &amp;lt;name&amp;gt; &#039;&#039;&#039;LUXTRONIK2&#039;&#039;&#039; &amp;lt;IP-Adresse[:Port]&amp;gt; [Abfrageinterval]&lt;br /&gt;
&lt;br /&gt;
Die Angabe der Portnummer ist optional. Bei einigen Firmware-Versionen sollte der Port 8889 angegeben werden.&lt;br /&gt;
&lt;br /&gt;
Weiter in der {{Link2CmdRef|Lang=de|Anker=LUXTRONIK2}}.&lt;br /&gt;
&lt;br /&gt;
=== Zusätzliche Perl-Module ===&lt;br /&gt;
Das FHEM-Modul benutzt das CPAN-Modul &amp;quot;net::Telnet&amp;quot;. Dieses ist standardmäßig installiert. Wenn nicht muss es nachinstalliert werden. Unter Debian z.B. mit&lt;br /&gt;
 sudo apt-get install libnet-telnet-perl&lt;br /&gt;
&lt;br /&gt;
=== Hard- und Firmwareversionen ===&lt;br /&gt;
Die Luxtronik 2.1 ähnelt der Version 2.0 stark, besitzt aber eine andere Hardware und Firmware-Versionsnummer. &lt;br /&gt;
&lt;br /&gt;
Bei Steuerungen mit den Firmware-Versionen 2.xx, 3.xx und 4.xx existiert kein Telnet-Zugang. Eine automatische Korrektur der Systemzeit ist dadurch nicht möglich.&lt;br /&gt;
&lt;br /&gt;
Das Modul nutzt die nicht öffentlich dokumentierte Schnittstelle des über einen Internetbrowser aufrufbaren Java-Programmes der Steuerung (Port 8888 oder 8889). Aufgrund der Java-Einschränkungen neuerer Internet-Browser hat die Steuerung seit der Firmware-Version x.81 auch eine Schnittstelle für ein Java-Script (Port 8214). Dies ermöglicht die Bedienung mit neueren Browsern hat aber geringere Auslese- und Einstell-Möglichkeiten. Das Modul nutzt diese Schnittstelle (derzeit) nicht.&lt;br /&gt;
&lt;br /&gt;
Neue Firmware-Versionen sind gewöhnlich abwärtskompatibel und sollten nicht zu Einschränkungen bei dem Modul führen. Bei Firmware-Versionen &amp;gt;x.81 wurde jedoch berichtet, dass über die Java-Schnittstelle nicht mehr alle Informationen übertragen werden.&lt;br /&gt;
&lt;br /&gt;
== Erläuterung der Readings ==&lt;br /&gt;
===Allgemeine Wärmepumpenwerte===&lt;br /&gt;
* &#039;&#039;&#039;ambientTemperature&#039;&#039;&#039; - Temperatur des Außensensors in °C&lt;br /&gt;
* &#039;&#039;&#039;averageAmbientTemperature&#039;&#039;&#039; - Gemittelte Außentemperatur in °C (für Heizgrenze im Sommer, siehe [[#Frostschutz_und_Heizgrenze|Frostschutz und Heizgrenze]])&lt;br /&gt;
* &#039;&#039;&#039;bivalentLevel&#039;&#039;&#039; - Bivalenzstufe, siehe [[#Bivalenter_Betrieb|Bivalenter Betrieb]]&lt;br /&gt;
* &#039;&#039;&#039;COP&#039;&#039;&#039; - Coefficient Of Performance, Wirkungsgrad der Wärmepumpe (Leistungszahl ε). Eine Leistungszahl von z.B. 4,2 bedeutet, dass von der eingesetzten elektrischen Leistung des Kompressors das 4,2- fache an Wärmeleistung bereitgestellt wird. Anders formuliert, kann mit dieser Wärmepumpe aus einem Kilowatt elektrischer Leistung 4,2 kW Wärmeleistung zur Verfügung gestellt werden. &#039;&#039;Bei der Berechnung des COPs wird die elektrische Leistung aus dem Attribut &amp;quot;heatPumpElectricalPowerWatt&amp;quot; benutzt.&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;delayDeviceTimeCalc&#039;&#039;&#039; - Abweichung Gerätesystemzeit zur FHEM-Zeit. Dieser kann bis zu 2 s in der Vergangenheit liegen. Höhere Werte weisen auf eine ungenaue Systemzeit in der Steuerung hin.&lt;br /&gt;
* &#039;&#039;&#039;deviceTimeCalc&#039;&#039;&#039; - Beim Abrufen der Gerätewerte wird von der Luxtronik-Steuerung auch der Zeitpunkt der internen Ermittlung übergeben.&lt;br /&gt;
* &#039;&#039;&#039;durationFetchReadings&#039;&#039;&#039; - Dauer (in s) des Abrufes der Gerätewerte von der Steuerung&lt;br /&gt;
* &#039;&#039;&#039;flowRate&#039;&#039;&#039; - Durchfluss in l/h&lt;br /&gt;
* &#039;&#039;&#039;flowTemperature&#039;&#039;&#039; - Vorlauftemperatur in °C, normalerweise direkt hinter der Heizungsumwälzpumpe gemessen und &#039;&#039;&#039;vor&#039;&#039;&#039; einer eventuell installierten Heizpatrone&lt;br /&gt;
* &#039;&#039;&#039;heatSourceIN&#039;&#039;&#039; - Wärmequelle Eingangstemperatur in °C&lt;br /&gt;
* &#039;&#039;&#039;heatSourceOUT&#039;&#039;&#039; - Wärmequelle Ausgangstemperatur in °C (sitzt bei Luft-Wasser-WPs aber im Verdampfer)&lt;br /&gt;
* &#039;&#039;&#039;hotGasTemperature&#039;&#039;&#039; - Heißgastemperatur in °C, Temperatur, die hinter dem Kompressor der Wärmepumpe anfällt&lt;br /&gt;
* opStateHeatPump1...3&lt;br /&gt;
* &#039;&#039;&#039;returnTemperature&#039;&#039;&#039; - Rücklauftemperatur in °C, normalerweise vor dem Eingang zum Wärmetauscher des Verdichterkreislaufes gemessen&lt;br /&gt;
* &#039;&#039;&#039;thermalPower&#039;&#039;&#039; - aktuelle Heizleistung der WP in kW, berechnet aus Durchfluss und Differenz von Vor- und Rücklauftemperatur, also ohne Heizpatrone etc.&lt;br /&gt;
&lt;br /&gt;
=== Luft-Wasser-Wärmepumpen ===&lt;br /&gt;
* &#039;&#039;&#039;heatSourceDefrostAirEnd&#039;&#039;&#039; - Luft-Ausgangstemperatur in °C bei der die Luftabtauung des Verdampfers beendet wird&lt;br /&gt;
* &#039;&#039;&#039;heatSourceDefrostAirThreshold&#039;&#039;&#039; - Luft-Eingangstemperatur in °C oberhalb der der Verdampfer (energiesparend) mit Luft abgetaut wird&lt;br /&gt;
* &#039;&#039;&#039;heatSourceDefrostLast&#039;&#039;&#039; - Dauer sowie Umgebungs- und Luft-Eingangs-Temperaturen zum Beginn und am Ende der letzten Abtauung&lt;br /&gt;
* &#039;&#039;&#039;heatSourceDefrostLastTimeout&#039;&#039;&#039; - Umgebungs- und Wärmequellen-Temperaturen bei denen die Luftabtauung die maximale Dauer überschritten hat.&lt;br /&gt;
* &#039;&#039;&#039;heatSourceDefrostTimer&#039;&#039;&#039; - Ablaufzeit in Sekunden bis zur nächsten Abtauung des Verdampfers&lt;br /&gt;
&lt;br /&gt;
=== Heizung ===&lt;br /&gt;
* &#039;&#039;&#039;heatingCurveEndPoint&#039;&#039;&#039; - Endpunkt der Heizkurve in °C bei -20°C Außentemperatur&lt;br /&gt;
* &#039;&#039;&#039;heatingCurveOffset&#039;&#039;&#039; - Parallelversatz der Heizkurve&lt;br /&gt;
* &#039;&#039;&#039;heatingSystemCircPumpDeaerate&#039;&#039;&#039; - Entlüftungsmodus der Heizkreisumwälzpumpe (wird zum gezielten Einschalten der Pumpe durch FHEM genutzt)&lt;br /&gt;
* &#039;&#039;&#039;heatingLimit&#039;&#039;&#039; - Heizgrenze wird ausgewertet (on, off)&lt;br /&gt;
* &#039;&#039;&#039;mixer1FlowTemperature&#039;&#039;&#039; - Vorlauftemperatur am Mischkreis 1 in °C&lt;br /&gt;
* &#039;&#039;&#039;mixer1TargetTemperature&#039;&#039;&#039; - Sollwert Vorlauftemperatur am Mischkreis 1 in °C&lt;br /&gt;
* &#039;&#039;&#039;mixer2FlowTemperature&#039;&#039;&#039; - Vorlauftemperatur am Mischkreis 2 in °C&lt;br /&gt;
* &#039;&#039;&#039;mixer2TargetTemperature&#039;&#039;&#039; - Sollwert Vorlauftemperatur am Mischkreis 2 in °C&lt;br /&gt;
* &#039;&#039;&#039;mixer3FlowTemperature&#039;&#039;&#039; - Vorlauftemperatur am Mischkreis 3 in °C&lt;br /&gt;
* &#039;&#039;&#039;mixer3TargetTemperature&#039;&#039;&#039; - Sollwert Vorlauftemperatur am Mischkreis 3 in °C&lt;br /&gt;
* &#039;&#039;&#039;opModeHeating&#039;&#039;&#039; - Betriebsmodus der Heizung (Aus, Automatik, Zusatzheizung, Party, Ferien)&lt;br /&gt;
* &#039;&#039;&#039;opStateHeating&#039;&#039;&#039; - Status der Heizung (Aus, Normal, Abgesenkt, Heizgrenze, Frostschutz)&lt;br /&gt;
* &#039;&#039;&#039;returnTemperatureHeating&#039;&#039;&#039; - aktuelle oder letzte valide Rücklauftemperatur des Heizungskreislaufes in °C. Durch die Speicherung kann auch bei stehender Zirkulationspumpe oder während der Warmwasserbereitung auf die letzte valide Rücklauf-Temperatur des Heizkreislaufes zurückgegriffen werden.&lt;br /&gt;
* &#039;&#039;&#039;returnTemperatureHyst&#039;&#039;&#039; - Regel-Hysterese in K der Rücklauf-Solltemperatur&lt;br /&gt;
* &#039;&#039;&#039;returnTemperatureSetBack&#039;&#039;&#039; - Schnellverstellung in K der Rücklauf-Solltemperatur&lt;br /&gt;
* &#039;&#039;&#039;returnTemperatureTarget&#039;&#039;&#039; - Sollwert Rücklauftemperatur in °C (wird durch Heizkurve und Außensensor bestimmt, kann über in der Steuerung eingegebene Zeiten und auch manuell gezielt abgesenkt)&lt;br /&gt;
* &#039;&#039;&#039;thresholdHeatingLimit&#039;&#039;&#039; - Heizgrenze in °C, &#039;&#039;&#039;über&#039;&#039;&#039;schreitet die gemittelte Außentemperatur diesen Wert, wird nicht mehr geheizt&lt;br /&gt;
* &#039;&#039;&#039;thresholdTemperatureSetBack&#039;&#039;&#039; - &#039;&#039;&#039;unter&#039;&#039;&#039;schreitet die Außentemperatur diesen Wert (°C), wird die Rücklauf-Solltemperatur nicht mehr (zeitgesteuert) abgesenkt&lt;br /&gt;
&lt;br /&gt;
=== Warmwasserbereitung ===&lt;br /&gt;
* &#039;&#039;&#039;hotWaterCircPumpDeaerate&#039;&#039;&#039; - Entlüftungsmodus der Zirkulationspumpe (zum gezielten Einschalten der Zirkulationspumpe durch FHEM)&lt;br /&gt;
* &#039;&#039;&#039;hotWaterTemperature&#039;&#039;&#039; - aktuelle Warmwasser-Boiler-Temperatur in °C (Achtung, die Temperatur im Boiler ist sehr unterschiedliche, es wird also nur die Temperatur am Sensor angezeigt. Typischerweise sackt die Temperaturkurve beim Aufheizen des Boilers etwas ab, weil es durch den Wärmeeintrag zu Strömungen kommt.)&lt;br /&gt;
* &#039;&#039;&#039;hotWaterTemperatureTarget&#039;&#039;&#039; - obere Solltemperatur des Boilers in °C&lt;br /&gt;
* &#039;&#039;&#039;opModeHotWater&#039;&#039;&#039; - Betriebsmodus der Warmwasserbereitung (Aus, Automatik, Zusatzheizung, Party, Ferien)&lt;br /&gt;
* &#039;&#039;&#039;opStateHotWater&#039;&#039;&#039; - Status der Warmwasserbereitung (Aus, Aufheizen, Temp. OK, Sperrzeit)&lt;br /&gt;
&lt;br /&gt;
=== Solarthermie ===&lt;br /&gt;
* solarBufferTemperature - in °C&lt;br /&gt;
* solarCollectorTemperature - in °C&lt;br /&gt;
&lt;br /&gt;
=== Lüftung ===&lt;br /&gt;
* &#039;&#039;&#039;opModeVentilation&#039;&#039;&#039; - Betriebsmodus der Lüftung (Aus, Automatik, Party, Feuchteschutz)&lt;br /&gt;
* &#039;&#039;&#039;ventSupplyAirTemperature&#039;&#039;&#039; - Zulufttemperatur in °C&lt;br /&gt;
* &#039;&#039;&#039;ventExhaustAirTemperature&#039;&#039;&#039; - Ablufttemperatur in °C&lt;br /&gt;
&lt;br /&gt;
=== Zähler ===&lt;br /&gt;
* &#039;&#039;&#039;counterHeatQHeating&#039;&#039;&#039; - von der Wärmepumpe produzierte Wärmemenge (kWh) zur Heizung&amp;lt;br&amp;gt;(nur bei vorhandenem Wärmemengenzähler und ohne Wärmeeintrag durch zweite Wärmequelle wie z.B. Heizstäbe)&lt;br /&gt;
* &#039;&#039;&#039;counterHeatQHotWater&#039;&#039;&#039; - von der Wärmepumpe produzierte Wärmemenge (kWh) zur Warmwasserbereitung&amp;lt;br&amp;gt;(nur bei vorhandenem Wärmemengenzähler und ohne Wärmeeintrag durch zweite Wärmequelle wie z.B. Heizstäbe)&lt;br /&gt;
* &#039;&#039;&#039;counterHeatQTotal&#039;&#039;&#039; - von der Wärmepumpe produzierte Wärmemenge (kWh) insgesam&amp;lt;br&amp;gt;(nur bei vorhandenem Wärmemengenzähler und ohne Wärmeeintrag durch zweite Wärmequelle wie z.B. Heizstäbe)&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;counterHours2ndHeatSource1&#039;&#039;&#039; - Betriebsstunden der zweite Wärmequelle (normalerweise elektrische Heizstäbe) &lt;br /&gt;
* &#039;&#039;&#039;counterHoursHeatPump&#039;&#039;&#039; - Betriebsstunden des Wärmepumpenkompressors &lt;br /&gt;
* &#039;&#039;&#039;counterHoursHeating&#039;&#039;&#039; - Betriebsstunden des Wärmepumpenkompressors die zur Heizung benutzt wurden&lt;br /&gt;
* &#039;&#039;&#039;counterHoursHotWater&#039;&#039;&#039; - Betriebsstunden des Wärmepumpenkompressors die zur Warmwasserbereitung benutzt wurden&lt;br /&gt;
&lt;br /&gt;
=== Ein- und Ausgänge ===&lt;br /&gt;
* compressor1...2&lt;br /&gt;
* &#039;&#039;&#039;heatingSystemCircPump&#039;&#039;&#039; - Heizungs-Umlaufpumpe in der Wärmepumpe (normaler Weise für das Heizungssystem) (HUP)&lt;br /&gt;
* &#039;&#039;&#039;heatingSystemCircPumpVoltage&#039;&#039;&#039; - Regelspannung an der Heizungs-Umlaufpumpe in der Wärmepumpe (zur Steuerung der Pumpen-Drehzahl)&lt;br /&gt;
* &#039;&#039;&#039;heatSourceMotor&#039;&#039;&#039; - Motor des Ventilators, der Brunnen- oder der Solepumpe (je nach WP-Typ) (Ventil-BOSUP)&lt;br /&gt;
* &#039;&#039;&#039;hotWaterCircPumpExtern&#039;&#039;&#039; - Zirkulationspumpe im Warmwasserstrang des Hauses (wenn genutzt) (ZIP)&lt;br /&gt;
* &#039;&#039;&#039;hotWaterSwitchingValve&#039;&#039;&#039; - Ventil zur Umschaltung auf die Heizspirale im Boiler (BUP)&lt;br /&gt;
* 2ndHeatSource1...3&lt;br /&gt;
* &#039;&#039;&#039;solarPump&#039;&#039;&#039; - Pumpe der Solarthermie (SLP)&lt;br /&gt;
&lt;br /&gt;
=== Sonstiges ===&lt;br /&gt;
* Firmware&lt;br /&gt;
* &#039;&#039;&#039;typeSerial&#039;&#039;&#039; - Baujahr/Monat-Lfd.Hexadezimalnummer&lt;br /&gt;
* &#039;&#039;&#039;typeHeatpump&#039;&#039;&#039; - Modell der Wärmepumpe&lt;br /&gt;
**ERC&lt;br /&gt;
**HMD 2&lt;br /&gt;
**KLW&lt;br /&gt;
**KSW&lt;br /&gt;
**L1A&lt;br /&gt;
**L1A407&lt;br /&gt;
**L1AREV&lt;br /&gt;
**L1H&lt;br /&gt;
**L1I&lt;br /&gt;
**L1I407&lt;br /&gt;
**L1S&lt;br /&gt;
**L2A&lt;br /&gt;
**L2A407&lt;br /&gt;
**L2AREV&lt;br /&gt;
**L2G&lt;br /&gt;
**L2G404&lt;br /&gt;
**L2G407&lt;br /&gt;
**L2H&lt;br /&gt;
**L2I&lt;br /&gt;
**L2I407&lt;br /&gt;
**LD2AG&lt;br /&gt;
**LD5&lt;br /&gt;
**LD5 (230V)&lt;br /&gt;
**LD5 REV&lt;br /&gt;
**LD5 REV 230V&lt;br /&gt;
**LD7&lt;br /&gt;
**LD7 (230 V)&lt;br /&gt;
**LD7 REV&lt;br /&gt;
**LD7 REV 230V&lt;br /&gt;
**LD9&lt;br /&gt;
**LD9 REV 230V&lt;br /&gt;
**LW SEC&lt;br /&gt;
**LWC&lt;br /&gt;
**&#039;&#039;&#039;LWC407&#039;&#039;&#039; - Kompakte Luft/Wasser-Wärmepumpe zur Innenaufstellung&lt;br /&gt;
**LWD90V - ??  Duale Luft/Wasser-Wärmepumpe invertergeführt zur Außenaufstellung&lt;br /&gt;
**MSW 10&lt;br /&gt;
**MSW 10S&lt;br /&gt;
**MSW 12&lt;br /&gt;
**MSW 13S&lt;br /&gt;
**MSW 14&lt;br /&gt;
**MSW 16S&lt;br /&gt;
**MSW 17&lt;br /&gt;
**MSW 19&lt;br /&gt;
**MSW 23&lt;br /&gt;
**MSW 26&lt;br /&gt;
**MSW 30&lt;br /&gt;
**MSW 4&lt;br /&gt;
**MSW 4S&lt;br /&gt;
**MSW 6 - Sole/Wasser-Wärmepumpe&lt;br /&gt;
**MSW 6S&lt;br /&gt;
**MSW 8&lt;br /&gt;
**MSW 8S&lt;br /&gt;
**MSW2-6S&lt;br /&gt;
**MSW3-12&lt;br /&gt;
**MSW3-12S&lt;br /&gt;
**MSW4-1676&lt;br /&gt;
**SW 291&lt;br /&gt;
**SW 29_56&lt;br /&gt;
**SW 37_45&lt;br /&gt;
**SW 58_69&lt;br /&gt;
**SW1 - ?? Sole/Wasser-Wärmepumpe&lt;br /&gt;
**SW2&lt;br /&gt;
**SWC -  ?? kompakte Sole/Wasser-Wärmepumpe&lt;br /&gt;
**WW1 - ?? Wasser/Wasser-Wärmepumpe&lt;br /&gt;
**WW2&lt;br /&gt;
**WWB_20 - ?? Wasser/Wasser-Booster zur dezentralen Trinkwassererwärmung&lt;br /&gt;
**WWC1 - ?? kompakte Wasser/Wasser-Wärmepumpe&lt;br /&gt;
**WWC2&lt;br /&gt;
**WZS - ??? Sole/Wasser Wärmezentrale&lt;br /&gt;
**WZW&lt;br /&gt;
**WZWD&lt;br /&gt;
&lt;br /&gt;
== Tipps zum ökonomischen Betrieb ==&lt;br /&gt;
Grundlage eines ökonomischen Betriebs einer Wärmepumpe ist in erster Linie ein guter hydraulischer Abgleich der Heizwasserverteilung und eine genaue Einstellung der Heizkurve. Beides ist sowohl von den Bedürfnissen und dem Nutzungsverhalten der Bewohner als auch von der Dämmung des Hauses abhängig.&lt;br /&gt;
&lt;br /&gt;
Insbesondere für Wärmepumpen, die &#039;&#039;&#039;nicht&#039;&#039;&#039; über einen leistungsgeregelten Verdichter verfügen, gibt es den interessanten Ansatz, die Einzelraumregler (ERR) und das Überströmventil der Wärmepumpe komplett ausser Betrieb zu nehmen und damit alle Heizkreise als ein &amp;quot;Heizkörper&amp;quot; zu betrachten. Diverse Foreneinträge (z.B. [http://www.haustechnikdialog.de/Forum/t/142011/Einstellungen-Alpha-Innotec-LWC80]) erzählen von bedeutenden Einsparungen durch Absenken der Solltemperatur und Wärmepumpen-freundlichen Betriebszyklen (lange Taktzeiten) und gehen auch detailiert auf durch die Luxtronik2 betriebene Wärmepumpen ein.&lt;br /&gt;
&lt;br /&gt;
Ein detailierte Anleitung zum energiesparenden Betrieb einer Wärmepumpe findet man auf der folgenden Wiki-Seite:&amp;lt;br&amp;gt;&lt;br /&gt;
[[Effizienter Betrieb einer Fußbodenheizung mit Luft-Wasser-Wärmepumpe (Fallbeispiel)]]&lt;br /&gt;
&lt;br /&gt;
=== Sperrzeiten ===&lt;br /&gt;
Die Luxtronik 2.0 erlaubt es, sich mit Hilfe von Sperrzeiten an zeitabhängige Strompreise anzupassen. Die Uhr der Steuerung geht jedoch sehr ungenau. Durch Setzen des Attributes &amp;quot;autoSynchClock&amp;quot; wird die Uhr der Steuerung regelmäßig mit der FHEM-Zeit abgeglichen. Die Funktion muss über das Attribut &amp;quot;allowSetParameter&amp;quot; freigegeben werden.&lt;br /&gt;
 attr &amp;lt;device&amp;gt; allowSetParameter 1&lt;br /&gt;
 attr &amp;lt;device&amp;gt; autoSynchClock 10&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Dies funktioniert nicht bei der Steuerungen Luxtronik 2.1 und bei der Firmware 2.xx, 3.xx oder 4.xx.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==Abschätzung des elektrischen Verbrauches==&lt;br /&gt;
Über die Attribute &amp;quot;heatPumpElectricalPowerWatt&amp;quot;, &amp;quot;heatPumpElectricalPowerFactor&amp;quot; und &amp;quot;heatRodElectricalPowerWatt&amp;quot; wird der elektrische Verbrauch während der Wärmeerzeugungen (Kompressormotor, Motor(en) der Wärmequelle) und der Heizstäbe festgelegt. Ist zudem das Attribute &amp;quot;doStatistics&amp;quot; auf 1 und der Werte &amp;quot;activeTariff&amp;quot; auf einen Wert zwischen 1 und 9 gesetzt, so berechnet das Modul anhand der Betriebsstunden automatisch den elektrischen Verbrauch innerhalb des angegebenen Stromtarifes.&lt;br /&gt;
&lt;br /&gt;
Normalerweise wird eine Wärmepumpe mit einem zeitabhängigen Stromtarif betrieben (Doppeltarifzähler). Hierbei muss der Werte &amp;quot;activeTariff&amp;quot; zum jeweiligen Zeitpunkt über ein FHEM-Script gesetzt werden.&lt;br /&gt;
Beispiel:&lt;br /&gt;
 define Strom_HT_W at *06:00 { if ( $wday != 0 ) {fhem( &amp;quot;set Heizung activeTariff 1&amp;quot; );;} }&lt;br /&gt;
 define Strom_NT_W at *22:00 set Heizung activeTariff 2&lt;br /&gt;
 define Strom_NT_Sa at *13:00 { if ( $wday == 6 ) {fhem( &amp;quot;set Heizung activeTariff 2&amp;quot; );;} }&lt;br /&gt;
&lt;br /&gt;
==Verhalten der Steuerung Luxtronik 2.0==&lt;br /&gt;
Leider ist die Beschreibung des Steuerungsverhaltens in den Bedienungsanleitungen meist sehr oberflächlich gehalten. Die folgenden Erläuterungen benutzen die Abkürzungen (fett) der Webapplikation der Steuerung.&amp;lt;br&amp;gt; &lt;br /&gt;
Das notwendige Verständnis der Prozesstechnik einer Wärmepumpe erhält man z.B. auf den folgenden Seiten: [http://www.energie-experten.org/heizung/waermepumpe/technik/ www.energie-experten.org/heizung/waermepumpe/technik/]&lt;br /&gt;
&lt;br /&gt;
===Abtauung des Verdampfers (Luftwärmetauschers) bei Luft-Wasser-Wärmepumpen===&lt;br /&gt;
Wird die Luft im Verdampfer unter den Taupunkt abgekühlt, so kommt es zur Ansammlung von Feuchtigkeit an den Bauteilen des Verdampfer. Liegt dabei die Temperatur an den Lamellen unter 0 °C (bzw. die Ausströmtemperatur der Luft knapp darüber) so vereist der Verdampfer. Diese Eisschicht wächst kontinuierlich und verschlechtert extrem die Wärmeübertragung aus der Luft in den Verdichterkreislauf.&lt;br /&gt;
&lt;br /&gt;
Aus diesem Grund wird bei einer Außentemperatur unter 15°C der Verdampfer zyklisch abgetaut. Das Abtauen startet nach dem Ende der &#039;&#039;&#039;Ablaufzeit Abtauen&#039;&#039;&#039; (&#039;&#039;heatSourceDefrostTimer&#039;&#039;) des Verdichters. &lt;br /&gt;
Der Startwert der &#039;&#039;Ablaufzeit Abtauen&#039;&#039; liegt im Bereich &#039;&#039;&#039;Abtzyk min&#039;&#039;&#039; und &#039;&#039;&#039;Abtzyk max&#039;&#039;&#039; und wird bei Kreisumkehr (s.u.) nach jedem Abtauvorgang anhand der dafür benötigten Zeit neu bestimmt.&lt;br /&gt;
&lt;br /&gt;
Bei Außentemperaturen zwischen 10°C und 15°C muss der Verdichter außerdem kontinuierlich 40 Minuten gelaufen sein. Während des Stillstandes des Verdichters wird bei &#039;&#039;Wärmequelle-Ein&#039;&#039; (&#039;&#039;heatSourceIN&#039;&#039;) oberhalb &#039;&#039;T-Luftabt.&#039;&#039; (&#039;&#039;heatSourceDefrostAirThreshold&#039;&#039;) die &#039;&#039;Ablaufzeit Abtauen&#039;&#039; (&#039;&#039;heatSourceDefrostTimer&#039;&#039;) wieder kontinuierlich (1s pro min) bis zum Wert &#039;&#039;&#039;Abtzyk min&#039;&#039;&#039; erhöht.&lt;br /&gt;
&lt;br /&gt;
[[Datei:Luxtronik2-Luftabtauung.png|miniatur|Temperaturverlauf bei Luftabtauung&amp;lt;br&amp;gt;(roter Pfeil)]]&lt;br /&gt;
Es gibt zwei Möglichkeiten des Abtauens:&lt;br /&gt;
# &#039;&#039;&#039;Luftabtauung: &#039;&#039;&#039; nur oberhalb des Gefrierpunktes, etwas langsamer aber energiesparend&lt;br /&gt;
#: Die Luftabtauung wird nur gestartet, wenn zu Beginn des Abtauens die Temperatur &#039;&#039;&#039;Wärmequelle-Ein&#039;&#039;&#039; (&#039;&#039;heatSourceIN&#039;&#039;) oberhalb der Temperatur &#039;&#039;&#039;T-Luftabt.&#039;&#039;&#039; (&#039;&#039;heatSourceDefrostAirThreshold&#039;&#039;) liegt. Dann wird der Verdichter abgeschaltet und nur noch der Ventilator (&#039;&#039;heatSourceMotor&#039;&#039;) betrieben, um die Eisschicht mit der durchströmenden Luft abzutauen. Dabei steigt die Austrittstemperatur &#039;&#039;&#039;Wärmequelle-Aus&#039;&#039;&#039; (&#039;&#039;heatSourceOUT&#039;&#039;) bis auf ca. 0°C und das geschmolzene Eis beginnt abzulaufen. Ist der größte Teil des Eises geschmolzen, so steigt die Austrittstemperatur wieder. Die Luftabtauung wird beendet, wenn die &#039;&#039;Schaltspielsperre nach Verdichterstop&#039;&#039; (5 min) abgelaufen ist &amp;lt;u&amp;gt;und&amp;lt;/u&amp;gt; die Temperatur &#039;&#039;&#039;Wärmequelle-Aus&#039;&#039;&#039; (&#039;&#039;heatSourceOUT&#039;&#039;) den Wert &#039;&#039;&#039;T-LABT-Ende&#039;&#039;&#039; (&#039;&#039;heatSourceDefrostAirEnd&#039;&#039;) erreicht hat oder wenn die Zeitbegrenzung &#039;&#039;&#039;Luft-Abt. max&#039;&#039;&#039; überschritten wird. Bei Überschreitung der Zeitbegrenzung wird per &#039;&#039;Kreisumkehr&#039;&#039; weiter abgetaut. Nach dem Ende der Luftabtauung wird die &#039;&#039;&#039;Ablaufzeit Abtauen&#039;&#039;&#039; (&#039;&#039;heatSourceDefrostTimer&#039;&#039;) auf den Wert &#039;&#039;&#039;Abtzyk min&#039;&#039;&#039; gesetzt.&lt;br /&gt;
&lt;br /&gt;
#  &#039;&#039;&#039;Kreisumkehr:&#039;&#039;&#039; schnell und energieintensiv&lt;br /&gt;
#: Bei der Kreisumkehr wird der Ventilator (&#039;&#039;heatSourceMotor&#039;&#039;) abgeschaltet und der Verdichter weiter betrieben. Über ein Vierwegeventil (Ausgang &#039;&#039;&#039;AV-Abtauventil&#039;&#039;&#039;) wird der Verdichterkreislauf so umgekehrt, dass dem Heizwasserkreislauf Wärme entzogen und der Verdampfer aufgeheizt wird. Nach 10 Minuten oder beim Ansprechen des Abtauendepressostaten (Eingang &#039;&#039;&#039;ASD&#039;&#039;&#039;) wird der Abtauvorgang beendet.&lt;br /&gt;
#: Vor dem Start des Abtauens erfolgt eine s. g. Durchflussüberwachung. Dabei wird geheizt und die Steuerung prüft, ob der Heizkreislauf genügend Durchfluss hat, um die nötige Wärmemenge für den Abtauvorgang zu Verfügung zu stellen. Die Durchflussüberwachung dauert 8 Minuten. In dieser Zeitspanne ist das erwärmte Wasser zumeist auch durch den Heizungskreislauf gewandert, steht wieder am Vorlauf an und wird dann durch den Abtauvergang wieder abgekühlt. Bei einer Außentemperatur über 5 °C oder einer Rücklauftemperatur über 40 °C wird die Durchflussüberwachung auf zwei Minuten gekürzt.&lt;br /&gt;
&lt;br /&gt;
Kommt die Wärmepumpe vor dem Start der Luftabtauung zum Stehen, so taut der Verdampfer durch die Plusgrade der Umgebung auch von ganz allein ab, diese ist an der Temperatur &#039;&#039;Wärmequelle-Aus&#039;&#039; zu erkennen, wird von der Luxtronik aber leider nicht berücksichtigt. &lt;br /&gt;
&lt;br /&gt;
Der Sensor &#039;&#039;Wärmequelle-Ein&#039;&#039; sitzt im Zuluftkanal in der Nähe des Verdampfers. Der Sensor &#039;&#039;Wärmequelle-Aus&#039;&#039; sitzt direkt &#039;&#039;&#039;im&#039;&#039;&#039; Verdampfer, misst also nicht die tatsächliche Lufttemperatur.&lt;br /&gt;
&lt;br /&gt;
===Bivalenter Betrieb===&lt;br /&gt;
* &#039;&#039;&#039;Bivalenz Stufe&#039;&#039;&#039;&lt;br /&gt;
*: Damit wird über die HRM- und HRW-Zeit das Zuschalten weiterer Wärmequellen gesteuert:&lt;br /&gt;
*:: Stufe 1 = ein Verdichter darf laufen (Bei zwei Verdichtern werden diese in Abhängigkeit der &#039;&#039;&#039;Impulse Verdichter 1/2&#039;&#039;&#039; abwechselnd verwendet.)&lt;br /&gt;
*:: Stufe 2 = zwei Verdichter dürfen laufen, sofern die Außentemperatur den Wert &#039;&#039;&#039;Freig. 2.VD&#039;&#039;&#039; unterschritten hat. Statt dem 2. Verdichter kann auch eine parallel betriebene Wärmepumpe freigegeben werden.&lt;br /&gt;
*:: Stufe 3 = zusätzlicher Wärmeerzeuger 1 (&#039;&#039;&#039;ZWE 1&#039;&#039;&#039;, z.B. Heizstäbe oder Kessel) darf mitlaufen, sofern die Außentemperatur den Wert &#039;&#039;&#039;Freig. ZWE&#039;&#039;&#039; unterschritten hat&lt;br /&gt;
*:: Stufe 4 = zusätzlicher Wärmeerzeuger 2 (&#039;&#039;&#039;ZWE 2&#039;&#039;&#039;, z.B. Heizstäbe) darf mitlaufen, sofern die Außentemperatur den Wert &#039;&#039;&#039;Freig. ZWE&#039;&#039;&#039; unterschritten hat&lt;br /&gt;
*: Wenn die Rücklauftemperatur die Rücklauf-Solltemperatur und die maximale Rücklauferhöhung &#039;&#039;&#039;TR Erh max&#039;&#039;&#039; überschreitet, werden sofort alle Wärmeerzeuger abgeschaltet und die Bivalenzstufe 1 gesetzt.&lt;br /&gt;
*: Wenn in der Heizung die maximale Vorlauftemperatur &#039;&#039;&#039;Vorlauf max.&#039;&#039;&#039; überschritten wird, dann wird sofort ein Kompressor ausgeschalten und die Bivalenzstufe um den Wert 1 reduziert.&lt;br /&gt;
*: Bei der Warmwassererzeugung wird der zusätzliche Wärmeerzeuger erst nach der Zeit &#039;&#039;&#039;WW+WP max&#039;&#039;&#039; freigegeben.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;HRM-Zeit&#039;&#039;&#039; - Heizungsregler Mehr-Zeit&lt;br /&gt;
*: Die Zeit beginnt zu zählen, wenn die Wärmepumpe heizt und sich die Rücklauftemperatur &#039;&#039;&#039;unterhalb&#039;&#039;&#039; des Einschaltkriteriums (&#039;&#039;&#039;Rückl.Soll&#039;&#039;&#039; - &#039;&#039;&#039;Hyterese HR&#039;&#039;&#039;) befindet.&lt;br /&gt;
*: Überschreitet diese Zeit einen bestimmten Wert, so wird in die nächst höhere &#039;&#039;Bivalenzstufe&#039;&#039; geschaltet, um zusätzliche Wärmeerzeuger zu aktiviert.&lt;br /&gt;
*: Die Bivalenzstufe 2 (zwei Verdichter) wird nach der &#039;&#039;&#039;HR Zeit&#039;&#039;&#039; (Standard 25 min) erreicht.&lt;br /&gt;
*: Die Bivalenzstufe 3 (ZWE 1) wird nach der Zeit &#039;&#039;&#039;Freig. ZWE&#039;&#039;&#039; (Standard 60 min) erreicht.&lt;br /&gt;
*: Die Bivalenzstufe 4 (ZWE 2) wird nach 120 min erreicht.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;HRW-Zeit&#039;&#039;&#039; - Heizungsregler Weniger-Zeit&lt;br /&gt;
*: Die Zeit beginnt zu zählen, wenn die Wärmepumpe heizt und sich die Rücklauftemperatur &#039;&#039;&#039;oberhalb&#039;&#039;&#039; des Ausschaltkriteriums (&#039;&#039;&#039;Rückl.Soll&#039;&#039;&#039; + &#039;&#039;&#039;Hyterese HR&#039;&#039;&#039;) befindet. &lt;br /&gt;
*: Überschreitet diese Zeit einen bestimmten Wert (jeweils 15 min), so wird in die nächst niedrigere &#039;&#039;Bivalenzstufe&#039;&#039; geschaltet, um zusätzliche Wärmeerzeuger wieder zu deaktivieren.&lt;br /&gt;
&lt;br /&gt;
===Automatische Sperren===&lt;br /&gt;
* &#039;&#039;&#039;SSP-Zeit&#039;&#039;&#039; - Ablaufzeit der Schaltspielsperre (SSP)&lt;br /&gt;
*: Es gibt zwei SSP-Ablaufzeit. Sie verzögern das erneute Starten des Verdichters für:&lt;br /&gt;
*:: 20 min ab letztem &#039;&#039;&#039;Ein&#039;&#039;&#039;schaltzeitpunkt des Verdichters, um die Belastung des Stromnetzes durch den erhöhten Anlaufstrom zu reduzieren.&lt;br /&gt;
*:: 5 min ab letztem &#039;&#039;&#039;Aus&#039;&#039;&#039;schaltzeitpunkt des Verdichters, um den Verdichterkreislauf zu schonen.&lt;br /&gt;
*: Das heisst, der Verdichter startet frühestens 20 min nach dem letzten Start, resp. 5 min nach dem letzten Stop. Es gibt also maximal 3 Anläufe pro Stunde.&lt;br /&gt;
&lt;br /&gt;
===Heizkurve===&lt;br /&gt;
Die Heizkurve lässt sich über zwei Parameter einstellen&lt;br /&gt;
* Eine Veränderung des Heizkurven-Endpunktes (HKE) verändert die Steigung der Kurve indem es die Rücklauf-Solltemperatur &#039;&#039;rlSoll&#039;&#039; bei tiefen Temperaturen festlegt.&lt;br /&gt;
* Die Parallelverschiebung (PVS) des Heizkurven-Fusspunktes hebt oder senkt die komplette Kurve und verändert dabei auch die Steigung geringfügig.&lt;br /&gt;
* Bei einer &amp;quot;neutralen&amp;quot; Parallelverschiebung von 20°C wird bei -20°C Außentemperatur der Heizkurvenendpunkt als &#039;&#039;rlSoll&#039;&#039; eingestellt.&lt;br /&gt;
: Bei 20°C Außentemperatur liegt &#039;&#039;rlSoll&#039;&#039; auf dem Heizkurven-Fusspunkt von 20°C.&lt;br /&gt;
: Eine Erhöhung des Fusspunktes um 1°C erhöht auch &#039;&#039;rlSoll&#039;&#039; bei -20°C um 1°C.&lt;br /&gt;
&lt;br /&gt;
Die Rücklauf-Solltemperatur &#039;&#039;rlSoll&#039;&#039; wird von der Steuerung in Abhängigkeit von der Außentemperatur wie folgt berechnet:&lt;br /&gt;
: rlSoll (Aussentemp) = PVS + (HKE - 20) * (PVS - Aussentemp) / (20 - (Aussentemp - PVS) / 2)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beispiel&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
Bei einer &amp;quot;neutralen&amp;quot; Parallelverschiebung von 20°C und einem Heizkurvenendpunkt von 30°C lautet der vereinfacht Term:&lt;br /&gt;
: rlSoll (Aussentemp) = 20 + 20 * (Aussentemp - 20) / (Aussentemp - 60)&lt;br /&gt;
D.h. rlSoll (20°C) = 20°C und rlSoll (-20°C) = 30°C&lt;br /&gt;
&lt;br /&gt;
===Frostschutz und Heizgrenze===&lt;br /&gt;
Ist die &#039;&#039;&#039;Heizgrenze&#039;&#039;&#039; eingeschaltet, so schaltet die Steuerung in den Frostschutz-Modus (=Sommermodus), sobald die &#039;&#039;&#039;Mitteltemperatur&#039;&#039;&#039; (&#039;&#039;averageAmbientTemperature&#039;&#039;) die Heizgrenze (&#039;&#039;thresholdHeatingLimit&#039;&#039;) um 0,2 K überschreitet. Dabei wird die Rücklaufsolltemperatur (&#039;&#039;returnTemperatureTarget&#039;&#039;) auf die &#039;&#039;&#039;Min.Rückl.Solltemp.&#039;&#039;&#039; (z.B. 15&amp;amp;nbsp;°C) absenkt.&lt;br /&gt;
Bei Luft-Wasser-Wärmepumpen wird die Rücklaufsolltemperatur auf 20 °C angehoben, sobald die &#039;&#039;&#039;Außentemperatur&#039;&#039;&#039; (&#039;&#039;ambientTemperature&#039;&#039;) 10&amp;amp;nbsp;°C unterschreitet.&amp;lt;br&amp;gt;&lt;br /&gt;
Die &#039;&#039;Mitteltemperatur&#039;&#039; ist laut Handbuch der Durchschnitt der Außentemperatur der letzten 24 Stunden. Tatsächlich wird sie aber einmal pro Stunde aus einem reduzierten Mittelwert der letzten 11 Stunden gebildet.&lt;br /&gt;
&lt;br /&gt;
Beim Unterschreiten der Solltemperatur startet der Heizvorgang (Frostschutz).&lt;br /&gt;
&lt;br /&gt;
Empfehlung für die Heizgrenze:&lt;br /&gt;
* Altbau: 15°C&lt;br /&gt;
* Neubau: 12°C&lt;br /&gt;
* Passivhaus: 10°C&lt;br /&gt;
&lt;br /&gt;
===Pumpenoptimierung===&lt;br /&gt;
Der Stromverbrauch einer durchgängig laufenden normalen Heizungsumwälzpumpe beträgt mehrere kWh pro Tag. Damit kann er in der Übergangszeit sogar im Bereich des Stromverbrauches des Verdichters liegen (z.B. 5 kWh/Tag). Durch den Einsatz engergiesparender Pumpen kann man ihn reduzieren. Die Funktion &#039;&#039;&#039;Pumpenoptimierung&#039;&#039;&#039; ist eine zusätzliche Möglichkeit, um durch bedarfsgesteuertes Abschalten der Heizungsumwälzpumpe Strom zu sparen.&lt;br /&gt;
&lt;br /&gt;
Es gibt verschiedene Stufen:&lt;br /&gt;
# Liegt die Rücklauftemperatur 30 Minuten nach Ende des Heizvorganges noch über dem Sollwert (ohne Hysterese), so wird die Heizungspumpe für 30 min abgeschaltet. &lt;br /&gt;
# Liegt die Rücklauftemperatur nach Ende des Heizvorganges für die Dauer der &#039;&#039;&#039;Pumpenoptim.Zeit&#039;&#039;&#039; oberhalb des  Sollwertes, so wird die Heizungspumpe abgeschaltet. Danach wird alle 30 Minuten wieder für 5 Minuten eingeschaltet, um die aktuelle Rücklauftemperatur des Heizungskreislaufes zu ermitteln. Liegt die Rücklauftemperatur nach den 5 Minuten unterhalb des Sollwertes so läuft die Heizungspumpe wieder dauerhaft.&lt;br /&gt;
# Sobald die Außentemperatur über der Rücklauf-Solltemperatur liegt, wird die Heizungspumpe dauerhaft abgeschaltet. Um ein Festsitzen der Pumpe zu vermeiden, wird sie alle 150 Stunden für eine Minute wieder eingeschaltet.&lt;br /&gt;
&lt;br /&gt;
Die Pumpenoptimierung läuft nicht bei Außentemperaturen unter +1,0°C, um das Einfrieren von außen-aufgestellten Anlagen zu verhindern. Während der EVU-Sperre steht auch die Heizungsumwälzpumpe. Nach deren Ende läuft die Heizungsumwälzpumpe erst 5 Minuten ehe die Rücklauftemperatur ausgewertet wird.&lt;br /&gt;
&lt;br /&gt;
Die Pumpenoptimierungszeit sollte möglichst klein gewählt werden, wenn eine Fussbodenheizung ohne Einzelraumregler betrieben wird und Räume unterschiedliche Temperaturen haben sollen, da sonst nach Abschalten der Wärmepumpe die wärmeren Räume schneller abkühlen und dabei die kälteren aufheizen.&lt;br /&gt;
&lt;br /&gt;
==Firmware==&lt;br /&gt;
=== Firmware Bugs und Eigentümlichkeiten===&lt;br /&gt;
- bitte mit eigenen Beobachtungen ergänzen -&lt;br /&gt;
&lt;br /&gt;
Lfd-Nr. 1&amp;lt;br&amp;gt;&lt;br /&gt;
Die Warmwassererwärmung führt zu einer starken Erhöhung der Temperatur im Heizkreislauf-Wärmetauscher der Wärmepumpe. Nach dem Zurückschalten auf den Heizungsbetrieb, speist der Puffer bis zur Abkühlung erstmal mit einer sehr hohen Temperatur in den Heizungskreislauf ein und verfälscht dadurch die Rücklauftemperatur stark. Die Heizungspumpe läuft zwar 2 Minuten nach aber in dieser Zeit wird die überhöhte Wärmetauschertemperatur nicht abgebaut. Bei eingeschalteter Pumpenoptimierung führt dies zu zu einer Zwangspause von entweder 30 Minuten oder bis der Temperaturfühler an der Rücklaufleitung durch den normalen Wärmeverlust unterhalb der Solltemperatur abgekühlt ist.&lt;br /&gt;
&lt;br /&gt;
Lfd-Nr. 2&amp;lt;br&amp;gt;&lt;br /&gt;
Über das Webinterface kann man teilweise keine Ferienzeit von wenigen Tagen auswählen. Wurde in den aktuelleren Firmwareversionen behoben.&lt;br /&gt;
&lt;br /&gt;
Lfd-Nr. 3&amp;lt;br&amp;gt;&lt;br /&gt;
Mittlere Außentemperatur wird nicht über die letzten 24 h bestimmt.&lt;br /&gt;
&lt;br /&gt;
Lfd-Nr. 4 (Luft-Wasser-Wärmepumpen)&amp;lt;br&amp;gt;&lt;br /&gt;
Die Berücksichtigung der Natur-Luftabtauung (ohne Ventilator) von 1s/1min ist viel zu gering. Das müßte höher sein.&lt;br /&gt;
&lt;br /&gt;
Lfd-Nr. 5 (Luft-Wasser-Wärmepumpen)&amp;lt;br&amp;gt;&lt;br /&gt;
Nach dem Heizungstakt könnte problemlos ein Luftabtauen erfolgen, damit für den nächsten Heizungstakt wieder an abgetauter Verdampfer zu Verfügung steht.&lt;br /&gt;
&lt;br /&gt;
Lfd-Nr. 6 (Luft-Wasser-Wärmepumpen)&amp;lt;br&amp;gt;&lt;br /&gt;
Nach einer Luftabtauung wird der Heiztakt nicht zu Ende geführt, sondern erst wieder beim Unterschreiten der unteren Hysterese gestartet. Dadurch bleibt die Rücklauftemperatur eventuell dauerhaft unterhalb der Solltemperatur und die Raumtemperatur sinkt mit der Zeit ab.&lt;br /&gt;
&lt;br /&gt;
Lfd-Nr. 7 (Luft-Wasser-Wärmepumpen)&amp;lt;br&amp;gt;&lt;br /&gt;
Fällt das Kreisumlaufabtauen auf das Ende des Heizzykluses so startet die Wärmepumpe nicht erneut. Der auf über 30°C erhitzte Wärmetauscher erwärmt nun die Luft in der Wärmepumpe. Bei Erreichen wird der Luftabtaugrenze wird der Ablauftimer auf den Mindestwert gesetzt und verliert die beim Kreisumkehr-Abtauen automatisch bestimmte höhere Ablaufzeit (meist in der Nähe der Maximalzeit).&lt;br /&gt;
&lt;br /&gt;
Lfd-Nr. 8 (Luft-Wasser-Wärmepumpen)&amp;lt;br&amp;gt;&lt;br /&gt;
Fällt das Kreisumlaufabtauen auf das Ende des Heizzykluses so startet die Wärmepumpe erstmal nicht erneut. Durch die Kreisumkehr wurde jedoch ein Schub kalten Wassers im Heizungskreislauf gefangen. Dieser führt dann sehr schnell zu einem Absinken der Rücklauftemperatur und zu einem Neustart der Wärmepumpe.&lt;br /&gt;
&lt;br /&gt;
Lfd-Nr. 9 (Luft-Wasser-Wärmepumpen)&amp;lt;br&amp;gt;&lt;br /&gt;
Das &amp;quot;natürliche&amp;quot; Abtauen wird nicht erkannt. Kommte die Wärmepumpe vor dem Ende der Abtauablaufzeit zum Stehen, so taut der Verdampfer bei positiven Umgebungstemperaturen von ganz alleine ab. Dies kann man Problemlos an der Temperatur &#039;&#039;Wärmequelle Aus&#039;&#039; erkennen, da diese durch die Schmelzenthalphie solange bei 0°C bleibt bis der Verdamper abtaut ist. Dann steigt sie auf die Höhe der Außentemperatur.&lt;br /&gt;
&lt;br /&gt;
Lfd-Nr. 10 (Luft-Wasser-Wärmepumpen)&amp;lt;br&amp;gt;&lt;br /&gt;
Während des Abtauens durch Kreisumlauf wird dem Heizungskreislauf Wärme entzogen. Der Wärmemengen-Zähler zählt jedoch nicht rückwärts. Deshalb ist die von der Wärmepumpe ins Heizsystem eingebrachte Wärmemenge nicht korrekt. Tatsächlich wird ca. 5 % weniger Energie eingebracht und die Arbeitszahl ist ebenfalls ca. 5 % niedriger.&lt;br /&gt;
&lt;br /&gt;
=== Nützliche Links ===&lt;br /&gt;
Die aktuelle Firmware gibt es [http://www.heatpump24.de/kontoeinst_104.php?layout=1 hier]&lt;br /&gt;
&lt;br /&gt;
Eine Beschreibung der Java-Schnittstelle gibt es [http://www.loxwiki.eu/pages/viewpage.action?pageId=18219334 &#039;&#039;&#039;hier&#039;&#039;&#039;]. Die Seite enthält auch eine Liste der Betriebsdaten (sog. berechnete Werte) die man mit &#039;&#039;get &amp;lt;device&amp;gt; rawdate&#039;&#039; anzeigen und mit dem Attribut &#039;&#039;userHeatpumpValues&#039;&#039; zum Gerät hinzufügen kann.&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Other Components]]&lt;br /&gt;
[[Kategorie:Heizungssteuerung]]&lt;/div&gt;</summary>
		<author><name>Topos</name></author>
	</entry>
</feed>