Ankündigung

Einklappen
Keine Ankündigung bisher.

LBS für Zehnder Comfoair CA350/550, Stork und baugleiche

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • felixj100
    antwortet
    Hi murelli146,

    Danke für den Tip aber ich glaube am Moxa liegt es nicht. Meine Settings sind wie folgt:

    moxa.JPG

    Da es meine erste Logik ist kann der Fehler auch in der Logik liegen. Das ist mein derzeitiger Test:

    logik.JPG

    Was mich wundert as im log gar keine Werte ankommen nur Debug Meldungen:

    Code:
    [TABLE="border: 0, cellpadding: 0, cellspacing: 0"]
    [TR]
    [TD]2017-03-01 21:07:00[/TD]
     			[TD]140292[/TD]
     			[TD]61477[/TD]
     			[TD]5[/TD]
     			[TD](ID302) Informational: Trigger Zyklus[/TD]
     		[/TR]
    [TR]
    [TD]2017-03-01 21:07:00[/TD]
     			[TD]140976[/TD]
     			[TD]61477[/TD]
     			[TD]6[/TD]
     			[TD](ID302) Debug: callExec E1[/TD]
     		[/TR]
    [TR]
    [TD]2017-03-01 21:07:00[/TD]
     			[TD]174917[/TD]
     			[TD]62442[/TD]
     			[TD]6[/TD]
     			[TD](ID302) Debug: Baustein startet - Trigger: E1[/TD]
     		[/TR]
    [TR]
    [TD]2017-03-01 21:07:00[/TD]
     			[TD]175225[/TD]
     			[TD]62442[/TD]
     			[TD]5[/TD]
     			[TD](ID302) Informational: socket_create() OK.[/TD]
     		[/TR]
    [TR]
    [TD]2017-03-01 21:07:00[/TD]
     			[TD]175374[/TD]
     			[TD]62442[/TD]
     			[TD]6[/TD]
     			[TD](ID302) Debug: Versuche, Moxa '192.168.101.53' auf Port '16011' zu verbinden ...[/TD]
     		[/TR]
    [TR]
    [TD]2017-03-01 21:07:00[/TD]
     			[TD]177954[/TD]
     			[TD]62442[/TD]
     			[TD]5[/TD]
     			[TD](ID302) Informational: socket_connect() OK.[/TD]
     		[/TR]
    [TR]
    [TD]2017-03-01 21:07:00[/TD]
     			[TD]178189[/TD]
     			[TD]62442[/TD]
     			[TD]6[/TD]
     			[TD](ID302) Debug: cmdSenden - Request: 00DD00[/TD]
     		[/TR]
    [TR]
    [TD]2017-03-01 21:07:00[/TD]
     			[TD]178299[/TD]
     			[TD]62442[/TD]
     			[TD]6[/TD]
     			[TD](ID302) Debug: String fuer die Berechnung der Checksumme: 00DD00AD[/TD]
     		[/TR]
    [TR]
    [TD]2017-03-01 21:07:00[/TD]
     			[TD]178414[/TD]
     			[TD]62442[/TD]
     			[TD]6[/TD]
     			[TD](ID302) Debug: Checksumme vor der Umwandlung: 394[/TD]
     		[/TR]
    [TR]
    [TD]2017-03-01 21:07:00[/TD]
     			[TD]178527[/TD]
     			[TD]62442[/TD]
     			[TD]6[/TD]
     			[TD](ID302) Debug: Checksumme vor der Kuerzung: 18A[LF][/TD]
     		[/TR]
    [TR]
    [TD]2017-03-01 21:07:00[/TD]
     			[TD]178631[/TD]
     			[TD]62442[/TD]
     			[TD]6[/TD]
     			[TD](ID302) Debug: Checksumme nach der Kuerzung: 8A[/TD]
     		[/TR]
    [TR]
    [TD]2017-03-01 21:07:00[/TD]
     			[TD]178730[/TD]
     			[TD]62442[/TD]
     			[TD]6[/TD]
     			[TD](ID302) Debug: Checksumme aus der Subroutine: 8A[/TD]
     		[/TR]
    [TR]
    [TD]2017-03-01 21:07:00[/TD]
     			[TD]206512[/TD]
     			[TD]62442[/TD]
     			[TD]6[/TD]
     			[TD](ID302) Debug: Exit 07070F[/TD]
     		[/TR]
    [TR]
    [TD]2017-03-01 21:07:00[/TD]
     			[TD]207801[/TD]
     			[TD]62442[/TD]
     			[TD]6[/TD]
     			[TD](ID302) Debug: ACK gesendet[/TD]
     		[/TR]
    [TR]
    [TD]2017-03-01 21:07:00[/TD]
     			[TD]209429[/TD]
     			[TD]62442[/TD]
     			[TD]6[/TD]
     			[TD](ID302) Debug: Erste 4 Byte des Datenpakets: 07F0[/TD]
     		[/TR]
    [TR]
    [TD]2017-03-01 21:07:00[/TD]
     			[TD]211086[/TD]
     			[TD]62442[/TD]
     			[TD]6[/TD]
     			[TD](ID302) Debug: String ohne 07F0 am Anfang: 00DD008A[/TD]
     		[/TR]
    [TR]
    [TD]2017-03-01 21:07:00[/TD]
     			[TD]211242[/TD]
     			[TD]62442[/TD]
     			[TD]6[/TD]
     			[TD](ID302) Debug: Checksumme gelesen: 8A[/TD]
     		[/TR]
    [TR]
    [TD]2017-03-01 21:07:00[/TD]
     			[TD]211347[/TD]
     			[TD]62442[/TD]
     			[TD]6[/TD]
     			[TD](ID302) Debug: Datenpaket ohne Checksumme: 00DD00[/TD]
     		[/TR]
    [TR]
    [TD]2017-03-01 21:07:00[/TD]
     			[TD]211448[/TD]
     			[TD]62442[/TD]
     			[TD]6[/TD]
     			[TD](ID302) Debug: String fuer die Berechnung der Checksumme: 00DD00AD[/TD]
     		[/TR]
    [TR]
    [TD]2017-03-01 21:07:00[/TD]
     			[TD]211555[/TD]
     			[TD]62442[/TD]
     			[TD]6[/TD]
     			[TD](ID302) Debug: Checksumme vor der Umwandlung: 394[/TD]
     		[/TR]
    [TR]
    [TD]2017-03-01 21:07:00[/TD]
     			[TD]211653[/TD]
     			[TD]62442[/TD]
     			[TD]6[/TD]
     			[TD](ID302) Debug: Checksumme vor der Kuerzung: 18A[LF][/TD]
     		[/TR]
    [TR]
    [TD]2017-03-01 21:07:00[/TD]
     			[TD]211751[/TD]
     			[TD]62442[/TD]
     			[TD]6[/TD]
     			[TD](ID302) Debug: Checksumme nach der Kuerzung: 8A[/TD]
     		[/TR]
    [TR]
    [TD]2017-03-01 21:07:00[/TD]
     			[TD]211848[/TD]
     			[TD]62442[/TD]
     			[TD]6[/TD]
     			[TD](ID302) Debug: Checksumme OK[/TD]
     		[/TR]
    [TR]
    [TD]2017-03-01 21:07:00[/TD]
     			[TD]211946[/TD]
     			[TD]62442[/TD]
     			[TD]6[/TD]
     			[TD](ID302) Debug: String vor 07 Bereinigung: 00DD00[/TD]
     		[/TR]
    [TR]
    [TD]2017-03-01 21:07:00[/TD]
     			[TD]212081[/TD]
     			[TD]62442[/TD]
     			[TD]6[/TD]
     			[TD](ID302) Debug: String nach 07 Bereinigung: 00DD00[/TD]
     		[/TR]
    [TR]
    [TD]2017-03-01 21:07:00[/TD]
     			[TD]212212[/TD]
     			[TD]62442[/TD]
     			[TD]6[/TD]
     			[TD](ID302) Debug: cmdSenden - Request: 00D100[/TD]
     		[/TR]
    [TR]
    [TD]2017-03-01 21:07:00[/TD]
     			[TD]212308[/TD]
     			[TD]62442[/TD]
     			[TD]6[/TD]
     			[TD](ID302) Debug: String fuer die Berechnung der Checksumme: 00D100AD[/TD]
     		[/TR]
    [TR]
    [TD]2017-03-01 21:07:00[/TD]
     			[TD]212409[/TD]
     			[TD]62442[/TD]
     			[TD]6[/TD]
     			[TD](ID302) Debug: Checksumme vor der Umwandlung: 382[/TD]
     		[/TR]
    [TR]
    [TD]2017-03-01 21:07:00[/TD]
     			[TD]212506[/TD]
     			[TD]62442[/TD]
     			[TD]6[/TD]
     			[TD](ID302) Debug: Checksumme vor der Kuerzung: 17E[LF][/TD]
     		[/TR]
    [TR]
    [TD]2017-03-01 21:07:00[/TD]
     			[TD]212603[/TD]
     			[TD]62442[/TD]
     			[TD]6[/TD]
     			[TD](ID302) Debug: Checksumme nach der Kuerzung: 7E[/TD]
     		[/TR]
    [TR]
    [TD]2017-03-01 21:07:00[/TD]
     			[TD]212698[/TD]
     			[TD]62442[/TD]
     			[TD]6[/TD]
     			[TD](ID302) Debug: Checksumme aus der Subroutine: 7E[/TD]
     		[/TR]
    [TR]
    [TD]2017-03-01 21:07:00[/TD]
     			[TD]237169[/TD]
     			[TD]62442[/TD]
     			[TD]6[/TD]
     			[TD](ID302) Debug: Exit 07070F[/TD]
     		[/TR]
    [TR]
    [TD]2017-03-01 21:07:00[/TD]
     			[TD]237369[/TD]
     			[TD]62442[/TD]
     			[TD]6[/TD]
     			[TD](ID302) Debug: ACK gesendet[/TD]
     		[/TR]
    [TR]
    [TD]2017-03-01 21:07:00[/TD]
     			[TD]237483[/TD]
     			[TD]62442[/TD]
     			[TD]6[/TD]
     			[TD](ID302) Debug: Erste 4 Byte des Datenpakets: 07F3[/TD]
     		[/TR]
    [TR]
    [TD]2017-03-01 21:07:00[/TD]
     			[TD]237588[/TD]
     			[TD]62442[/TD]
     			[TD]6[/TD]
     			[TD](ID302) Debug: reciv gekuerzt: F307F000D1007E[/TD]
     		[/TR]
    [TR]
    [TD]2017-03-01 21:07:00[/TD]
     			[TD]237690[/TD]
     			[TD]62442[/TD]
     			[TD]6[/TD]
     			[TD](ID302) Debug: reciv gekuerzt: 07F000D1007E[/TD]
     		[/TR]
    [TR]
    [TD]2017-03-01 21:07:00[/TD]
     			[TD]237793[/TD]
     			[TD]62442[/TD]
     			[TD]6[/TD]
     			[TD](ID302) Debug: String ohne 07F0 am Anfang: 00D1007E[/TD]
     		[/TR]
    [TR]
    [TD]2017-03-01 21:07:00[/TD]
     			[TD]237895[/TD]
     			[TD]62442[/TD]
     			[TD]6[/TD]
     			[TD](ID302) Debug: Checksumme gelesen: 7E[/TD]
     		[/TR]
    [TR]
    [TD]2017-03-01 21:07:00[/TD]
     			[TD]238017[/TD]
     			[TD]62442[/TD]
     			[TD]6[/TD]
     			[TD](ID302) Debug: Datenpaket ohne Checksumme: 00D100[/TD]
     		[/TR]
    [TR]
    [TD]2017-03-01 21:07:00[/TD]
     			[TD]238121[/TD]
     			[TD]62442[/TD]
     			[TD]6[/TD]
     			[TD](ID302) Debug: String fuer die Berechnung der Checksumme: 00D100AD[/TD]
     		[/TR]
    [TR]
    [TD]2017-03-01 21:07:00[/TD]
     			[TD]238221[/TD]
     			[TD]62442[/TD]
     			[TD]6[/TD]
     			[TD](ID302) Debug: Checksumme vor der Umwandlung: 382[/TD]
     		[/TR]
    [TR]
    [TD]2017-03-01 21:07:00[/TD]
     			[TD]238318[/TD]
     			[TD]62442[/TD]
     			[TD]6[/TD]
     			[TD](ID302) Debug: Checksumme vor der Kuerzung: 17E[LF][/TD]
     		[/TR]
    [TR]
    [TD]2017-03-01 21:07:00[/TD]
     			[TD]238434[/TD]
     			[TD]62442[/TD]
     			[TD]6[/TD]
     			[TD](ID302) Debug: Checksumme nach der Kuerzung: 7E[/TD]
     		[/TR]
    [TR]
    [TD]2017-03-01 21:07:00[/TD]
     			[TD]238528[/TD]
     			[TD]62442[/TD]
     			[TD]6[/TD]
     			[TD](ID302) Debug: Checksumme OK[/TD]
     		[/TR]
    [TR]
    [TD]2017-03-01 21:07:00[/TD]
     			[TD]238622[/TD]
     			[TD]62442[/TD]
     			[TD]6[/TD]
     			[TD](ID302) Debug: String vor 07 Bereinigung: 00D100[/TD]
     		[/TR]
    [TR]
    [TD]2017-03-01 21:07:00[/TD]
     			[TD]238720[/TD]
     			[TD]62442[/TD]
     			[TD]6[/TD]
     			[TD](ID302) Debug: String nach 07 Bereinigung: 00D100[/TD]
     		[/TR]
    [TR]
    [TD]2017-03-01 21:07:00[/TD]
     			[TD]238850[/TD]
     			[TD]62442[/TD]
     			[TD]6[/TD]
     			[TD](ID302) Debug: cmdSenden - Request: 00CD00[/TD]
     		[/TR]
    [TR]
    [TD]2017-03-01 21:07:00[/TD]
     			[TD]238970[/TD]
     			[TD]62442[/TD]
     			[TD]6[/TD]
     			[TD](ID302) Debug: String fuer die Berechnung der Checksumme: 00CD00AD[/TD]
     		[/TR]
    [TR]
    [TD]2017-03-01 21:07:00[/TD]
     			[TD]239068[/TD]
     			[TD]62442[/TD]
     			[TD]6[/TD]
     			[TD](ID302) Debug: Checksumme vor der Umwandlung: 378[/TD]
     		[/TR]
    [TR]
    [TD]2017-03-01 21:07:00[/TD]
     			[TD]239164[/TD]
     			[TD]62442[/TD]
     			[TD]6[/TD]
     			[TD](ID302) Debug: Checksumme vor der Kuerzung: 17A[LF][/TD]
     		[/TR]
    [TR]
    [TD]2017-03-01 21:07:00[/TD]
     			[TD]239258[/TD]
     			[TD]62442[/TD]
     			[TD]6[/TD]
     			[TD](ID302) Debug: Checksumme nach der Kuerzung: 7A[/TD]
     		[/TR]
    [TR]
    [TD]2017-03-01 21:07:00[/TD]
     			[TD]239377[/TD]
     			[TD]62442[/TD]
     			[TD]6[/TD]
     			[TD](ID302) Debug: Checksumme aus der Subroutine: 7A[/TD]
     		[/TR]
    [TR]
    [TD]2017-03-01 21:07:00[/TD]
     			[TD]266956[/TD]
     			[TD]62442[/TD]
     			[TD]6[/TD]
     			[TD](ID302) Debug: Exit 07070F[/TD]
     		[/TR]
    [TR]
    [TD]2017-03-01 21:07:00[/TD]
     			[TD]267138[/TD]
     			[TD]62442[/TD]
     			[TD]6[/TD]
     			[TD](ID302) Debug: ACK gesendet[/TD]
     		[/TR]
    [TR]
    [TD]2017-03-01 21:07:00[/TD]
     			[TD]267249[/TD]
     			[TD]62442[/TD]
     			[TD]6[/TD]
     			[TD](ID302) Debug: Erste 4 Byte des Datenpakets: 07F3[/TD]
     		[/TR]
    [TR]
    [TD]2017-03-01 21:07:00[/TD]
     			[TD]267357[/TD]
     			[TD]62442[/TD]
     			[TD]6[/TD]
     			[TD](ID302) Debug: reciv gekuerzt: F307F000CD007A[/TD]
     		[/TR]
    [TR]
    [TD]2017-03-01 21:07:00[/TD]
     			[TD]267457[/TD]
     			[TD]62442[/TD]
     			[TD]6[/TD]
     			[TD](ID302) Debug: reciv gekuerzt: 07F000CD007A[/TD]
     		[/TR]
    [TR]
    [TD]2017-03-01 21:07:00[/TD]
     			[TD]267556[/TD]
     			[TD]62442[/TD]
     			[TD]6[/TD]
     			[TD](ID302) Debug: String ohne 07F0 am Anfang: 00CD007A[/TD]
     		[/TR]
    [TR]
    [TD]2017-03-01 21:07:00[/TD]
     			[TD]267654[/TD]
     			[TD]62442[/TD]
     			[TD]6[/TD]
     			[TD](ID302) Debug: Checksumme gelesen: 7A[/TD]
     		[/TR]
    [TR]
    [TD]2017-03-01 21:07:00[/TD]
     			[TD]267760[/TD]
     			[TD]62442[/TD]
     			[TD]6[/TD]
     			[TD](ID302) Debug: Datenpaket ohne Checksumme: 00CD00[/TD]
     		[/TR]
    [TR]
    [TD]2017-03-01 21:07:00[/TD]
     			[TD]267858[/TD]
     			[TD]62442[/TD]
     			[TD]6[/TD]
     			[TD](ID302) Debug: String fuer die Berechnung der Checksumme: 00CD00AD[/TD]
     		[/TR]
    [TR]
    [TD]2017-03-01 21:07:00[/TD]
     			[TD]267957[/TD]
     			[TD]62442[/TD]
     			[TD]6[/TD]
     			[TD](ID302) Debug: Checksumme vor der Umwandlung: 378[/TD]
     		[/TR]
    [TR]
    [TD]2017-03-01 21:07:00[/TD]
     			[TD]268052[/TD]
     			[TD]62442[/TD]
     			[TD]6[/TD]
     			[TD](ID302) Debug: Checksumme vor der Kuerzung: 17A[LF][/TD]
     		[/TR]
    [TR]
    [TD]2017-03-01 21:07:00[/TD]
     			[TD]268146[/TD]
     			[TD]62442[/TD]
     			[TD]6[/TD]
     			[TD](ID302) Debug: Checksumme nach der Kuerzung: 7A[/TD]
     		[/TR]
    [TR]
    [TD]2017-03-01 21:07:00[/TD]
     			[TD]268240[/TD]
     			[TD]62442[/TD]
     			[TD]6[/TD]
     			[TD](ID302) Debug: Checksumme OK[/TD]
     		[/TR]
    [TR]
    [TD]2017-03-01 21:07:00[/TD]
     			[TD]268333[/TD]
     			[TD]62442[/TD]
     			[TD]6[/TD]
     			[TD](ID302) Debug: String vor 07 Bereinigung: 00CD00[/TD]
     		[/TR]
    [TR]
    [TD]2017-03-01 21:07:00[/TD]
     			[TD]268430[/TD]
     			[TD]62442[/TD]
     			[TD]6[/TD]
     			[TD](ID302) Debug: String nach 07 Bereinigung: 00CD00[/TD]
     		[/TR]
    [TR]
    [TD]2017-03-01 21:07:00[/TD]
     			[TD]268538[/TD]
     			[TD]62442[/TD]
     			[TD]6[/TD]
     			[TD](ID302) Debug: cmdSenden - Request: 000B00[/TD]
     		[/TR]
    [TR]
    [TD]2017-03-01 21:07:00[/TD]
     			[TD]268632[/TD]
     			[TD]62442[/TD]
     			[TD]6[/TD]
     			[TD](ID302) Debug: String fuer die Berechnung der Checksumme: 000B00AD[/TD]
     		[/TR]
    [TR]
    [TD]2017-03-01 21:07:00[/TD]
     			[TD]268754[/TD]
     			[TD]62442[/TD]
     			[TD]6[/TD]
     			[TD](ID302) Debug: Checksumme vor der Umwandlung: 184[/TD]
     		[/TR]
    [TR]
    [TD]2017-03-01 21:07:00[/TD]
     			[TD]268851[/TD]
     			[TD]62442[/TD]
     			[TD]6[/TD]
     			[TD](ID302) Debug: Checksumme vor der Kuerzung: B8[LF][/TD]
     		[/TR]
    [TR]
    [TD]2017-03-01 21:07:00[/TD]
     			[TD]268944[/TD]
     			[TD]62442[/TD]
     			[TD]6[/TD]
     			[TD](ID302) Debug: Checksumme nach der Kuerzung: B8[/TD]
     		[/TR]
    [TR]
    [TD]2017-03-01 21:07:00[/TD]
     			[TD]269038[/TD]
     			[TD]62442[/TD]
     			[TD]6[/TD]
     			[TD](ID302) Debug: Checksumme aus der Subroutine: B8[/TD]
     		[/TR]
    [TR]
    [TD]2017-03-01 21:07:00[/TD]
     			[TD]291497[/TD]
     			[TD]62442[/TD]
     			[TD]6[/TD]
     			[TD](ID302) Debug: Exit 07070F[/TD]
     		[/TR]
    [TR]
    [TD]2017-03-01 21:07:00[/TD]
     			[TD]291774[/TD]
     			[TD]62442[/TD]
     			[TD]6[/TD]
     			[TD](ID302) Debug: ACK gesendet[/TD]
     		[/TR]
    [TR]
    [TD]2017-03-01 21:07:00[/TD]
     			[TD]291902[/TD]
     			[TD]62442[/TD]
     			[TD]6[/TD]
     			[TD](ID302) Debug: Erste 4 Byte des Datenpakets: 07F3[/TD]
     		[/TR]
    [TR]
    [TD]2017-03-01 21:07:00[/TD]
     			[TD]292011[/TD]
     			[TD]62442[/TD]
     			[TD]6[/TD]
     			[TD](ID302) Debug: reciv gekuerzt: F307F0000B00B8[/TD]
     		[/TR]
    [TR]
    [TD]2017-03-01 21:07:00[/TD]
     			[TD]292114[/TD]
     			[TD]62442[/TD]
     			[TD]6[/TD]
     			[TD](ID302) Debug: reciv gekuerzt: 07F0000B00B8[/TD]
     		[/TR]
    [TR]
    [TD]2017-03-01 21:07:00[/TD]
     			[TD]292256[/TD]
     			[TD]62442[/TD]
     			[TD]6[/TD]
     			[TD](ID302) Debug: String ohne 07F0 am Anfang: 000B00B8[/TD]
     		[/TR]
    [TR]
    [TD]2017-03-01 21:07:00[/TD]
     			[TD]292361[/TD]
     			[TD]62442[/TD]
     			[TD]6[/TD]
     			[TD](ID302) Debug: Checksumme gelesen: B8[/TD]
     		[/TR]
    [TR]
    [TD]2017-03-01 21:07:00[/TD]
     			[TD]292459[/TD]
     			[TD]62442[/TD]
     			[TD]6[/TD]
     			[TD](ID302) Debug: Datenpaket ohne Checksumme: 000B00[/TD]
     		[/TR]
    [TR]
    [TD]2017-03-01 21:07:00[/TD]
     			[TD]292568[/TD]
     			[TD]62442[/TD]
     			[TD]6[/TD]
     			[TD](ID302) Debug: String fuer die Berechnung der Checksumme: 000B00AD[/TD]
     		[/TR]
    [TR]
    [TD]2017-03-01 21:07:00[/TD]
     			[TD]292674[/TD]
     			[TD]62442[/TD]
     			[TD]6[/TD]
     			[TD](ID302) Debug: Checksumme vor der Umwandlung: 184[/TD]
     		[/TR]
    [TR]
    [TD]2017-03-01 21:07:00[/TD]
     			[TD]292777[/TD]
     			[TD]62442[/TD]
     			[TD]6[/TD]
     			[TD](ID302) Debug: Checksumme vor der Kuerzung: B8[LF][/TD]
     		[/TR]
    [TR]
    [TD]2017-03-01 21:07:00[/TD]
     			[TD]292881[/TD]
     			[TD]62442[/TD]
     			[TD]6[/TD]
     			[TD](ID302) Debug: Checksumme nach der Kuerzung: B8[/TD]
     		[/TR]
    [TR]
    [TD]2017-03-01 21:07:00[/TD]
     			[TD]292980[/TD]
     			[TD]62442[/TD]
     			[TD]6[/TD]
     			[TD](ID302) Debug: Checksumme OK[/TD]
     		[/TR]
    [TR]
    [TD]2017-03-01 21:07:00[/TD]
     			[TD]293087[/TD]
     			[TD]62442[/TD]
     			[TD]6[/TD]
     			[TD](ID302) Debug: String vor 07 Bereinigung: 000B00[/TD]
     		[/TR]
    [TR]
    [TD]2017-03-01 21:07:00[/TD]
     			[TD]293186[/TD]
     			[TD]62442[/TD]
     			[TD]6[/TD]
     			[TD](ID302) Debug: String nach 07 Bereinigung: 000B00[/TD]
     		[/TR]
    [TR]
    [TD]2017-03-01 21:07:00[/TD]
     			[TD]293312[/TD]
     			[TD]62442[/TD]
     			[TD]6[/TD]
     			[TD](ID302) Debug: cmdSenden - Request: 000D00[/TD]
     		[/TR]
    [TR]
    [TD]2017-03-01 21:07:00[/TD]
     			[TD]293410[/TD]
     			[TD]62442[/TD]
     			[TD]6[/TD]
     			[TD](ID302) Debug: String fuer die Berechnung der Checksumme: 000D00AD[/TD]
     		[/TR]
    [TR]
    [TD]2017-03-01 21:07:00[/TD]
     			[TD]293509[/TD]
     			[TD]62442[/TD]
     			[TD]6[/TD]
     			[TD](ID302) Debug: Checksumme vor der Umwandlung: 186[/TD]
     		[/TR]
    [TR]
    [TD]2017-03-01 21:07:00[/TD]
     			[TD]293606[/TD]
     			[TD]62442[/TD]
     			[TD]6[/TD]
     			[TD](ID302) Debug: Checksumme vor der Kuerzung: BA[LF][/TD]
     		[/TR]
    [TR]
    [TD]2017-03-01 21:07:00[/TD]
     			[TD]293704[/TD]
     			[TD]62442[/TD]
     			[TD]6[/TD]
     			[TD](ID302) Debug: Checksumme nach der Kuerzung: BA[/TD]
     		[/TR]
    [TR]
    [TD]2017-03-01 21:07:00[/TD]
     			[TD]293998[/TD]
     			[TD]62442[/TD]
     			[TD]6[/TD]
     			[TD](ID302) Debug: Checksumme aus der Subroutine: BA[/TD]
     		[/TR]
    [TR]
    [TD]2017-03-01 21:07:00[/TD]
     			[TD]322143[/TD]
     			[TD]62442[/TD]
     			[TD]6[/TD]
     			[TD](ID302) Debug: Exit 07070F[/TD]
     		[/TR]
    [TR]
    [TD]2017-03-01 21:07:00[/TD]
     			[TD]322340[/TD]
     			[TD]62442[/TD]
     			[TD]6[/TD]
     			[TD](ID302) Debug: ACK gesendet[/TD]
     		[/TR]
    [TR]
    [TD]2017-03-01 21:07:00[/TD]
     			[TD]322457[/TD]
     			[TD]62442[/TD]
     			[TD]6[/TD]
     			[TD](ID302) Debug: Erste 4 Byte des Datenpakets: 07F3[/TD]
     		[/TR]
    [TR]
    [TD]2017-03-01 21:07:00[/TD]
     			[TD]322565[/TD]
     			[TD]62442[/TD]
     			[TD]6[/TD]
     			[TD](ID302) Debug: reciv gekuerzt: F307F0000D00BA[/TD]
     		[/TR]
    [TR]
    [TD]2017-03-01 21:07:00[/TD]
     			[TD]322670[/TD]
     			[TD]62442[/TD]
     			[TD]6[/TD]
     			[TD](ID302) Debug: reciv gekuerzt: 07F0000D00BA[/TD]
     		[/TR]
    [TR]
    [TD]2017-03-01 21:07:00[/TD]
     			[TD]322777[/TD]
     			[TD]62442[/TD]
     			[TD]6[/TD]
     			[TD](ID302) Debug: String ohne 07F0 am Anfang: 000D00BA[/TD]
     		[/TR]
    [TR]
    [TD]2017-03-01 21:07:00[/TD]
     			[TD]322881[/TD]
     			[TD]62442[/TD]
     			[TD]6[/TD]
     			[TD](ID302) Debug: Checksumme gelesen: BA[/TD]
     		[/TR]
    [TR]
    [TD]2017-03-01 21:07:00[/TD]
     			[TD]322998[/TD]
     			[TD]62442[/TD]
     			[TD]6[/TD]
     			[TD](ID302) Debug: Datenpaket ohne Checksumme: 000D00[/TD]
     		[/TR]
    [TR]
    [TD]2017-03-01 21:07:00[/TD]
     			[TD]323101[/TD]
     			[TD]62442[/TD]
     			[TD]6[/TD]
     			[TD](ID302) Debug: String fuer die Berechnung der Checksumme: 000D00AD[/TD]
     		[/TR]
    [TR]
    [TD]2017-03-01 21:07:00[/TD]
     			[TD]323209[/TD]
     			[TD]62442[/TD]
     			[TD]6[/TD]
     			[TD](ID302) Debug: Checksumme vor der Umwandlung: 186[/TD]
     		[/TR]
    [TR]
    [TD]2017-03-01 21:07:00[/TD]
     			[TD]323311[/TD]
     			[TD]62442[/TD]
     			[TD]6[/TD]
     			[TD](ID302) Debug: Checksumme vor der Kuerzung: BA[LF][/TD]
     		[/TR]
    [TR]
    [TD]2017-03-01 21:07:00[/TD]
     			[TD]323411[/TD]
     			[TD]62442[/TD]
     			[TD]6[/TD]
     			[TD](ID302) Debug: Checksumme nach der Kuerzung: BA[/TD]
     		[/TR]
    [TR]
    [TD]2017-03-01 21:07:00[/TD]
     			[TD]323513[/TD]
     			[TD]62442[/TD]
     			[TD]6[/TD]
     			[TD](ID302) Debug: Checksumme OK[/TD]
     		[/TR]
    [TR]
    [TD]2017-03-01 21:07:00[/TD]
     			[TD]323612[/TD]
     			[TD]62442[/TD]
     			[TD]6[/TD]
     			[TD](ID302) Debug: String vor 07 Bereinigung: 000D00[/TD]
     		[/TR]
    [TR]
    [TD]2017-03-01 21:07:00[/TD]
     			[TD]323714[/TD]
     			[TD]62442[/TD]
     			[TD]6[/TD]
     			[TD](ID302) Debug: String nach 07 Bereinigung: 000D00[/TD]
     		[/TR]
    [TR]
    [TD]2017-03-01 21:07:00[/TD]
     			[TD]323843[/TD]
     			[TD]62442[/TD]
     			[TD]6[/TD]
     			[TD](ID302) Debug: cmdSenden - Request: 00D900[/TD]
     		[/TR]
    [TR]
    [TD]2017-03-01 21:07:00[/TD]
     			[TD]323945[/TD]
     			[TD]62442[/TD]
     			[TD]6[/TD]
     			[TD](ID302) Debug: String fuer die Berechnung der Checksumme: 00D900AD[/TD]
     		[/TR]
    [TR]
    [TD]2017-03-01 21:07:00[/TD]
     			[TD]324063[/TD]
     			[TD]62442[/TD]
     			[TD]6[/TD]
     			[TD](ID302) Debug: Checksumme vor der Umwandlung: 390[/TD]
     		[/TR]
    [TR]
    [TD]2017-03-01 21:07:00[/TD]
     			[TD]324163[/TD]
     			[TD]62442[/TD]
     			[TD]6[/TD]
     			[TD](ID302) Debug: Checksumme vor der Kuerzung: 186[LF][/TD]
     		[/TR]
    [TR]
    [TD]2017-03-01 21:07:00[/TD]
     			[TD]324265[/TD]
     			[TD]62442[/TD]
     			[TD]6[/TD]
     			[TD](ID302) Debug: Checksumme nach der Kuerzung: 86[/TD]
     		[/TR]
    [TR]
    [TD]2017-03-01 21:07:00[/TD]
     			[TD]324366[/TD]
     			[TD]62442[/TD]
     			[TD]6[/TD]
     			[TD](ID302) Debug: Checksumme aus der Subroutine: 86[/TD]
     		[/TR]
    [TR]
    [TD]2017-03-01 21:07:00[/TD]
     			[TD]347995[/TD]
     			[TD]62442[/TD]
     			[TD]6[/TD]
     			[TD](ID302) Debug: Exit 07070F[/TD]
     		[/TR]
    [TR]
    [TD]2017-03-01 21:07:00[/TD]
     			[TD]348186[/TD]
     			[TD]62442[/TD]
     			[TD]6[/TD]
     			[TD](ID302) Debug: ACK gesendet[/TD]
     		[/TR]
    [TR]
    [TD]2017-03-01 21:07:00[/TD]
     			[TD]348340[/TD]
     			[TD]62442[/TD]
     			[TD]6[/TD]
     			[TD](ID302) Debug: Erste 4 Byte des Datenpakets: 07F3[/TD]
     		[/TR]
    [TR]
    [TD]2017-03-01 21:07:00[/TD]
     			[TD]348469[/TD]
     			[TD]62442[/TD]
     			[TD]6[/TD]
     			[TD](ID302) Debug: reciv gekuerzt: F307F000D90086[/TD]
     		[/TR]
    [TR]
    [TD]2017-03-01 21:07:00[/TD]
     			[TD]348568[/TD]
     			[TD]62442[/TD]
     			[TD]6[/TD]
     			[TD](ID302) Debug: reciv gekuerzt: 07F000D90086[/TD]
     		[/TR]
    [TR]
    [TD]2017-03-01 21:07:00[/TD]
     			[TD]348668[/TD]
     			[TD]62442[/TD]
     			[TD]6[/TD]
     			[TD](ID302) Debug: String ohne 07F0 am Anfang: 00D90086[/TD]
     		[/TR]
    [TR]
    [TD]2017-03-01 21:07:00[/TD]
     			[TD]348795[/TD]
     			[TD]62442[/TD]
     			[TD]6[/TD]
     			[TD](ID302) Debug: Checksumme gelesen: 86[/TD]
     		[/TR]
    [TR]
    [TD]2017-03-01 21:07:00[/TD]
     			[TD]348895[/TD]
     			[TD]62442[/TD]
     			[TD]6[/TD]
     			[TD](ID302) Debug: Datenpaket ohne Checksumme: 00D900[/TD]
     		[/TR]
    [TR]
    [TD]2017-03-01 21:07:00[/TD]
     			[TD]348992[/TD]
     			[TD]62442[/TD]
     			[TD]6[/TD]
     			[TD](ID302) Debug: String fuer die Berechnung der Checksumme: 00D900AD[/TD]
     		[/TR]
    [TR]
    [TD]2017-03-01 21:07:00[/TD]
     			[TD]349092[/TD]
     			[TD]62442[/TD]
     			[TD]6[/TD]
     			[TD](ID302) Debug: Checksumme vor der Umwandlung: 390[/TD]
     		[/TR]
    [TR]
    [TD]2017-03-01 21:07:00[/TD]
     			[TD]349206[/TD]
     			[TD]62442[/TD]
     			[TD]6[/TD]
     			[TD](ID302) Debug: Checksumme vor der Kuerzung: 186[LF][/TD]
     		[/TR]
    [TR]
    [TD]2017-03-01 21:07:00[/TD]
     			[TD]349340[/TD]
     			[TD]62442[/TD]
     			[TD]6[/TD]
     			[TD](ID302) Debug: Checksumme nach der Kuerzung: 86[/TD]
     		[/TR]
    [TR]
    [TD]2017-03-01 21:07:00[/TD]
     			[TD]349446[/TD]
     			[TD]62442[/TD]
     			[TD]6[/TD]
     			[TD](ID302) Debug: Checksumme OK[/TD]
     		[/TR]
    [TR]
    [TD]2017-03-01 21:07:00[/TD]
     			[TD]349575[/TD]
     			[TD]62442[/TD]
     			[TD]6[/TD]
     			[TD](ID302) Debug: String vor 07 Bereinigung: 00D900[/TD]
     		[/TR]
    [TR]
    [TD]2017-03-01 21:07:00[/TD]
     			[TD]349714[/TD]
     			[TD]62442[/TD]
     			[TD]6[/TD]
     			[TD](ID302) Debug: String nach 07 Bereinigung: 00D900[/TD]
     		[/TR]
    [TR]
    [TD]2017-03-01 21:07:00[/TD]
     			[TD]349858[/TD]
     			[TD]62442[/TD]
     			[TD]6[/TD]
     			[TD](ID302) Debug: cmdSenden - Request: 00E100[/TD]
     		[/TR]
    [TR]
    [TD]2017-03-01 21:07:00[/TD]
     			[TD]349957[/TD]
     			[TD]62442[/TD]
     			[TD]6[/TD]
     			[TD](ID302) Debug: String fuer die Berechnung der Checksumme: 00E100AD[/TD]
     		[/TR]
    [TR]
    [TD]2017-03-01 21:07:00[/TD]
     			[TD]350059[/TD]
     			[TD]62442[/TD]
     			[TD]6[/TD]
     			[TD](ID302) Debug: Checksumme vor der Umwandlung: 398[/TD]
     		[/TR]
    [TR]
    [TD]2017-03-01 21:07:00[/TD]
     			[TD]350157[/TD]
     			[TD]62442[/TD]
     			[TD]6[/TD]
     			[TD](ID302) Debug: Checksumme vor der Kuerzung: 18E[LF][/TD]
     		[/TR]
    [TR]
    [TD]2017-03-01 21:07:00[/TD]
     			[TD]350255[/TD]
     			[TD]62442[/TD]
     			[TD]6[/TD]
     			[TD](ID302) Debug: Checksumme nach der Kuerzung: 8E[/TD]
     		[/TR]
    [TR]
    [TD]2017-03-01 21:07:00[/TD]
     			[TD]350352[/TD]
     			[TD]62442[/TD]
     			[TD]6[/TD]
     			[TD](ID302) Debug: Checksumme aus der Subroutine: 8E[/TD]
     		[/TR]
    [TR]
    [TD]2017-03-01 21:07:00[/TD]
     			[TD]376754[/TD]
     			[TD]62442[/TD]
     			[TD]6[/TD]
     			[TD](ID302) Debug: Exit 07070F[/TD]
     		[/TR]
    [TR]
    [TD]2017-03-01 21:07:00[/TD]
     			[TD]377077[/TD]
     			[TD]62442[/TD]
     			[TD]6[/TD]
     			[TD](ID302) Debug: ACK gesendet[/TD]
     		[/TR]
    [TR]
    [TD]2017-03-01 21:07:00[/TD]
     			[TD]377242[/TD]
     			[TD]62442[/TD]
     			[TD]6[/TD]
     			[TD](ID302) Debug: Erste 4 Byte des Datenpakets: 07F3[/TD]
     		[/TR]
    [TR]
    [TD]2017-03-01 21:07:00[/TD]
     			[TD]377366[/TD]
     			[TD]62442[/TD]
     			[TD]6[/TD]
     			[TD](ID302) Debug: reciv gekuerzt: F307F000E1008E[/TD]
     		[/TR]
    [TR]
    [TD]2017-03-01 21:07:00[/TD]
     			[TD]377509[/TD]
     			[TD]62442[/TD]
     			[TD]6[/TD]
     			[TD](ID302) Debug: reciv gekuerzt: 07F000E1008E[/TD]
     		[/TR]
    [TR]
    [TD]2017-03-01 21:07:00[/TD]
     			[TD]377661[/TD]
     			[TD]62442[/TD]
     			[TD]6[/TD]
     			[TD](ID302) Debug: String ohne 07F0 am Anfang: 00E1008E[/TD]
     		[/TR]
    [TR]
    [TD]2017-03-01 21:07:00[/TD]
     			[TD]377787[/TD]
     			[TD]62442[/TD]
     			[TD]6[/TD]
     			[TD](ID302) Debug: Checksumme gelesen: 8E[/TD]
     		[/TR]
    [TR]
    [TD]2017-03-01 21:07:00[/TD]
     			[TD]377887[/TD]
     			[TD]62442[/TD]
     			[TD]6[/TD]
     			[TD](ID302) Debug: Datenpaket ohne Checksumme: 00E100[/TD]
     		[/TR]
    [TR]
    [TD]2017-03-01 21:07:00[/TD]
     			[TD]377988[/TD]
     			[TD]62442[/TD]
     			[TD]6[/TD]
     			[TD](ID302) Debug: String fuer die Berechnung der Checksumme: 00E100AD[/TD]
     		[/TR]
    [TR]
    [TD]2017-03-01 21:07:00[/TD]
     			[TD]378092[/TD]
     			[TD]62442[/TD]
     			[TD]6[/TD]
     			[TD](ID302) Debug: Checksumme vor der Umwandlung: 398[/TD]
     		[/TR]
    [TR]
    [TD]2017-03-01 21:07:00[/TD]
     			[TD]378190[/TD]
     			[TD]62442[/TD]
     			[TD]6[/TD]
     			[TD](ID302) Debug: Checksumme vor der Kuerzung: 18E[LF][/TD]
     		[/TR]
    [TR]
    [TD]2017-03-01 21:07:00[/TD]
     			[TD]378288[/TD]
     			[TD]62442[/TD]
     			[TD]6[/TD]
     			[TD](ID302) Debug: Checksumme nach der Kuerzung: 8E[/TD]
     		[/TR]
    [TR]
    [TD]2017-03-01 21:07:00[/TD]
     			[TD]378386[/TD]
     			[TD]62442[/TD]
     			[TD]6[/TD]
     			[TD](ID302) Debug: Checksumme OK[/TD]
     		[/TR]
    [TR]
    [TD]2017-03-01 21:07:00[/TD]
     			[TD]378484[/TD]
     			[TD]62442[/TD]
     			[TD]6[/TD]
     			[TD](ID302) Debug: String vor 07 Bereinigung: 00E100[/TD]
     		[/TR]
    [TR]
    [TD]2017-03-01 21:07:00[/TD]
     			[TD]378593[/TD]
     			[TD]62442[/TD]
     			[TD]6[/TD]
     			[TD](ID302) Debug: String nach 07 Bereinigung: 00E100[/TD]
     		[/TR]
    [TR]
    [TD]2017-03-01 21:07:00[/TD]
     			[TD]378703[/TD]
     			[TD]62442[/TD]
     			[TD]5[/TD]
     			[TD](ID302) Informational: ENDE zyklische Abfrage[/TD]
     		[/TR]
    [/TABLE]

    Da sollten doch eigentlich die Werte als Informational drinstehen oder liege ich da falsch?

    Gruß

    Felix

    Einen Kommentar schreiben:


  • murelli146
    antwortet
    Hallo felixj100 ,

    Anbei meine Einstellung von meinem USR-TCP-RS232

    USR TCP-RS232 Einstellung.PNG

    So funktioniert es bei mir.

    Schöne Grüße Gernot

    Einen Kommentar schreiben:


  • murelli146
    antwortet
    Servus,

    habe im Beitrag #50 den Code um EWT Temperatur erweitert.
    Wenn asto den Code übernimmt ist er im LBS-Download verfügbar.

    Einen Kommentar schreiben:


  • neci
    antwortet
    Könntet ihr bitte die Temperatur für EWT noch mit einbauen? -> siehe $t6

    if (strstr($reciv, "00D209") !== false) {#Wenn die Temperaturen empfangen wurden
    ....
    $t6 = substr($reciv, 18, 2);

    #Hier werden die Temperaturen "decodiert" damit sie einen Sinn ergeben
    ....
    $t6 = (hexdec($t6) / 2) - 20;

    Danke
    Wolfgang

    Einen Kommentar schreiben:


  • murelli146
    antwortet
    felixj100

    Hallo Felix,

    schau dir die Moxa Einstellung nochmal an. WG UDP > LBS TCP Protokoll

    Betreibe meinen IP RS232 Umsetzer als TCP-Server

    Gruß Gernot

    Einen Kommentar schreiben:


  • felixj100
    antwortet
    Hi Gernot,

    der Moxa hängt bei mir auf dem Rj45 Port. Mit dem WireGate Plugin konnte ich darüber Werte auslesen.

    Gruß Felix

    Einen Kommentar schreiben:


  • murelli146
    antwortet
    Ich habe jetzt endlich meine Wohnraumlüftung mit einem Prüfgerät von Testo einregeln können und konnte es nicht lassen den LBS zu erweitern.

    Die vermeintlich einfacheren Infoboxen habe ich entfernt und habe sie auf richtige Ausgänge gesplittet.
    Einen Eingang zum abrufen der Firmware habe ich auch hinzugefügt.
    Restlicher Changelog hab ich im Code angeführt.

    asto könntest du bitte den LBS als Update einpflegen hab den Code zum kopieren vorbereitet und versucht die Hilfe zu ergänzen.


    Update und Vorstellung des erweiterten LBS mit Screenshots von meiner KWL-Visu Seite.


    Aufbau der Visu:

    Comfoair.PNGTemperaturen.PNGBadWC Einstellung.PNGVorheizregister.PNGBetriebsstunden.PNGSetup.PNGWartung.PNG
    Beim Bad/WC bin ich noch beim experimentieren was besser funktioniert, Luft-feuchte oder meine Gulytemperaturfühler.


    Hier noch die Logiken dazu:

    Logik Comfoair.PNGLogik Datenarchive.PNGLogik Bad WC.PNG
    Neue Version des LBS:

    PHP-Code:
    ###[DEF]###
    [name        = Zehnder Comfoair CA350,550, Stork und baugleiche ]

    [e#1 TRIGGER     = Trigger ]
    [e#2 IMPORTANT     = SerialDevice/MoxaIP ]
    [e#3 TRIGGER     = Stufe ]
    [e#4 TRIGGER     = Komforttemp ]
    [e#5 TRIGGER     = Filter Reset ]
    [e#6 TRIGGER     = Fehler Reset ]
    [e#7 TRIGGER     = Firmware_Version #init=1 ]
    [e#9 OPTION     = LogLevel #init=3 ]
    [e#10 OPTION     = Schnittstellentyp #init=S ]
    [e#11 OPTION     = MoxaPort ]
    [e#13 TRIGGER     = set_ABL_0 ]
    [e#14 TRIGGER     = set_ABL_1 ]
    [e#15 TRIGGER     = set_ABL_2 ]
    [e#16 TRIGGER     = set_ZUL_0 ]
    [e#17 TRIGGER     = set_ZUL_1 ]
    [e#18 TRIGGER     = set_ZUL_2 ]
    [e#19 TRIGGER     = set_ABL_3 ]
    [e#20 TRIGGER     = set_ZUL_3 ]

    [a#1        = Betrieb_h_Filter ]
    [a#2        = Betrieb_h_Stufe_1 ]
    [a#3        = Betrieb_h_Stufe_2 ]
    [a#4        = Betrieb_h_Stufe_3 ]
    [a#5        = Betrieb_h_Stufe_4 ]
    [a#6        = Betrieb_h_Bypass_offen ]
    [a#7        = Komforttemp ]
    [a#8        = Aussenluft ]
    [a#9        = Zuluft ]
    [a#10        = Abluft ]
    [a#11        = Fortluft ]
    [a#12        = AKT_STUFE ]
    [a#13        = Stat_Vent_Zuluft ]
    [a#14        = Stat_Vent_Abluft ]
    [a#15        = RPM_Vent_Zuluft ]
    [a#16        = RPM_Vent_Abluft ]
    [a#17        = Bypass ]
    [a#18        = Akt_FehlerCode ]
    [a#19        = Filter_voll_1_0 ]
    [a#20        = Status_Text ]
    [a#21        = Frostschutz_0/1 ]
    [a#22        = Vorheizung_0/1 ]
    [a#23        = Frostklappe_0/1 ]
    [a#24        = Frost in min ]
    [a#25        = Frostsicherheitsstufe ]
    [a#26        = stat_ABL_0       ]
    [a#27        = stat_ABL_1       ]
    [a#28        = stat_ABL_2       ]
    [a#29        = stat_ZUL_0       ]
    [a#30        = stat_ZUL_1       ]
    [a#31        = stat_ZUL_2       ]
    [a#32        = stat_ABL_3       ]
    [a#33        = stat_ZUL_3       ]
    [a#34        = ZUL_Venilator_0/1]
    [a#35        = Betrieb_h_Frost ]
    [a#36        = Betrieb_h_Vorheizung ]
    [a#37        = Firmware_Version ]
    [a#38        = Erdwärmetauscher Temperatur]


    [v#101        = 0 ]

    ###[/DEF]###


    ###[HELP]###
    Der Baustein basiert auf:
    + http://www.see-solutions.de/sonstiges/Protokollbeschreibung_ComfoAir.pdf
    + https://knx-user-forum.de/forum/%C3%B6ffentlicher-bereich/knx-eib-forum/code-schnipsel/21895-comfoair-steuerung-%C3%BCber-rs232?p=881622#post881622

    <u><b>ACHTUNG!</b></u>
    Der Baustein sollte nicht parallel zu einer CC-Ease/-Luxe Bedieneinheit genutzt werden.
    Wenn Pakete von zwei Stellen an die Anlage gesendet werden kann es Kollisionen und Fehlfunktionen/Sch&auml;den kommen.
    Grunds&auml;tzlich gilt: Nutzung auf eigenes Risiko!!!

    <u><b>ACHTUNG!</b></u>
    Grunds&auml;tzlich gilt: Nutzung auf eigenes Risiko!!!

    <u><b>Vorbereitung</b></u>
    Die mitgelieferte Datei phpserial.php muss nach /usr/local/edomi/main/include/php kopiert werden.
    In E10 den Typ der Schnittstelle angeben S=seriell, M=Moxa
    In E2 das Device (z.B. /dev/ttyUSB0) der Seriellen-Schnittstelle oder die IP-Adresse vom Moxa angeben.
    In E11 ggf. den MoxaPort angeben
    In E9 ggf. den Debug-Level &auml;ndern.

    <u><b>Folgende Werte werden ausgelesen wenn E1 != ""</b></u>
    Betrieb_h_Filter: 3739h
    Betrieb_h_Stufe_1 (Abwesend): 846h
    Betrieb_h_Stufe_2: 20225h
    Betrieb_h_Stufe_3: 10557h
    Betrieb_h_Stufe_4: 2007h
    Betrieb_h_Bypass_offen: 7249h
    Komforttemp: 22 &deg;C
    Aussenluft:  8.5 &deg;C
    Zuluft:      18 &deg;C
    Abluft:      19.5 &deg;C
    Fortluft:    10.5 &deg;C
    AKT_STUFE: 2
    Status_Vent_Zuluft: 35 %
    Status_Vent_Abluft: 38 %
    RPM_Vent_Zuluft: 1154 U/min
    RPM_Vent_Abluft: 1236 U/min
    Bypass: 0 %
    Akt_Fehlercode: keiner
    Aktuell kein Fehler - Filter nicht voll
    Frostschutz 0/1
    Vorheizung 0/1
    Frostklappe 0/1
    Frost in Minuten
    Sicherheitsstufe
    Status Einstellungen L&uuml;fterstufen A26 - A33
    Status Zuluftventilator 0/1
    Betriebsstunden Frost h
    Betriebsstunden Vorheizung h


    <u><b>L&uuml;ftungs-Stufe setzen</b></u>
    E3 Wert 1-4

    <u><b>Komforttemperatur setzen</b></u>
    E4 Wert 15-25 in 0,5er Schritten

    <u><b>Reset Filter</b></u>
    E5 Wert ungleich 0

    <u><b>Reset Fehler</b></u>
    E6 Wert ungleich 0

    <u><b>FW abfrage</b></u>
    E7 Wert ungleich 0
    gibt Firmware am Ausgang A37 aus

    <u><b>LogLevel</b></u>
    0: Emergency
    1: Alert
    2: Critical
    3: Error
    4: Warning
    5: Informational
    6: Debug

    <hr/>
    <b><u>Changelog:</u></b>
    0.1:
    -initiale Version
    0.2:
    -Trigger f&uuml;r Stufe, Komforttemp. und Filter-/Fehler-Reset
    0.3:
    -Bugfix Kommunikations-Timeout beim Setzen von Werten
    0.4:
    -Option f&uuml;r Moxa-Schnittstelle
    -Komforttemperatur kann jetzt in 0.5 Schritten gesetzt werden
    0.5 by Gernot (murelli146):
       https://knx-user-forum.de/forum/projektforen/edomi/992693-lbs-f%C3%BCr-zehnder-comfoair-ca350-550-stork-und-baugleiche?p=1054778#post1054778
       -Bugfix Kommunikations-Timeouts
       -Bugfix Betriebsstundenz&auml;hler
       -M&ouml;glichkeit zur Einstellung der L&uuml;fterstufen
       -Ausgabe Status Vorheizregister
       -Infoboxen zur einfachen Statusausgabe

     0.6 by Gernot Klobucaric (murelli146):
       -Betriebsstundenausg&auml;nge erweitert um Frost- und Vorheizung (A26 - A34)
       -Ausg&auml;nge der einzelnen Stufeneinstellungen hinzugef&uuml;gt (A35,A36)
       -Frostschutz um Klappe, Frostminuten und Frostsicherheitsstufe erweitert(A23,A24,A25)
       -E7 triggert A37 Firmwareausgabe der Anlage
       -Infoboxen wieder entfernt (alle auf Ausg&auml;nge gelegt)
       -Debug von den erweiterten Ausge&auml;ngen nachgepflegt
       -Moxa bzw. TCP/IP RS232 Adapter funktioniert einwandfrei
       -E8 Erdw&auml;rmetauscher Temperatur hinzugefügt

    ###[/HELP]###


    ###[LBS]###
    <?
    function LB_LBSID($id) {
        if ($E=getLogicEingangDataAll($id)) {

                if($E[1]['refresh'] && $E[1]['value'] != "") {
                    logic_setVar($id,101,1);
                    LB_LBSID_debug($id,"Trigger Zyklus",5);
                } elseif($E[3]['refresh'] == 1) {
                    if (empty($E[3]['value'])) {
                    LB_LBSID_debug($id,"Stufenwert leer",3);
                    } else {
                    logic_setVar($id,101,3);
                    LB_LBSID_debug($id,"Trigger Stufe",5);
                    }

                } elseif ($E[4]['refresh'] == 1) {
                    if (empty($E[4]['value'])) {
                    LB_LBSID_debug($id,"Temperaturwert leer",3);
                    } else {
                        logic_setVar($id,101,4);
                    LB_LBSID_debug($id,"Trigger Temp",5);
                    }

                } elseif ($E[5]['refresh']==1 && $E[5]['value'] != 0) {
                    logic_setVar($id,101,5);
                    LB_LBSID_debug($id,"Trigger Filter",5);
                } elseif ($E[6]['refresh']==1 && $E[6]['value'] != 0) {
                    logic_setVar($id,101,6);
                    LB_LBSID_debug($id,"Trigger Fehler Reset",5);
                }
    //____________Einstellung_der_einzelnen_Stufen_über_E13_bis_E20________Gernot_09.02.2017______________________________________________________________
    elseif ($E[7]['refresh']==1 && $E[7]['value'] != 0) {
                    logic_setVar($id,101,7);
                    LB_LBSID_debug($id,"Trigger Firmwareausgabe",5);
                }
    elseif ($E[13]['refresh']==1 && $E[13]['value'] != 0) {
                    logic_setVar($id,101,13);
                    LB_LBSID_debug($id,"Set_ABL_ST_0",5);
                }
    elseif ($E[14]['refresh']==1 && $E[14]['value'] != 0) {
                    logic_setVar($id,101,14);
                    LB_LBSID_debug($id,"Set_ZUL_ST_0",5);
                }
    elseif ($E[15]['refresh']==1 && $E[15]['value'] != 0) {
                    logic_setVar($id,101,15);
                    LB_LBSID_debug($id,"Set_ABL_ST_1",5);
                }
    elseif ($E[16]['refresh']==1 && $E[16]['value'] != 0) {
                    logic_setVar($id,101,16);
                    LB_LBSID_debug($id,"Set_ZUL_ST_1",5);
                }
    elseif ($E[17]['refresh']==1 && $E[17]['value'] != 0) {
                    logic_setVar($id,101,17);
                    LB_LBSID_debug($id,"Set_ABL_ST_2",5);
                }
    elseif ($E[18]['refresh']==1 && $E[18]['value'] != 0) {
                    logic_setVar($id,101,18);
                    LB_LBSID_debug($id,"Set_ZUL_ST_2",5);
                }
    elseif ($E[19]['refresh']==1 && $E[19]['value'] != 0) {
                    logic_setVar($id,101,19);
                    LB_LBSID_debug($id,"Set_ABL_ST_3",5);
                }
    elseif ($E[20]['refresh']==1 && $E[20]['value'] != 0) {
                    logic_setVar($id,101,20);
                    LB_LBSID_debug($id,"Set_ZUL_ST_3",5);
                }
    //____________________________________________________________________________________________________________________________________________________

                $e = logic_getVar($id,101);
                if(in_array($e, array(1,3,4,5,6,7,13,14,15,16,17,18,19,20)) && getLogicElementStatus($id)==0){    //Erweitert um die Setup Eingänge Gernot
                    setLogicElementStatus($id,1);
                    LB_LBSID_debug($id,"callExec E".$e,6);
                    callLogicFunctionExec(LBSID,$id);                
                }
        }
    }

    function LB_LBSID_debug($id,$s,$l=6) {
        $a=array("Emergency","Alert","Critical","Error","Warning","Informational","Debug");
        $E=logic_getInputs($id);
        $DEBUG=$E[9]['value'];
        $l<=$DEBUG && writeToCustomLog("LBSLBSID",$l,"(ID$id) ".$a[$l].": ".$s);
    }

    ?>
    ###[/LBS]###


    ###[EXEC]###
    <?
    require(dirname(__FILE__)."/../../../../main/include/php/incl_lbsexec.php");
    set_time_limit(60);
    restore_error_handler();
    error_reporting(0);
    ini_set("display_errors", 0);
    sql_connect();

    #Quelle:
    #Idee und Konzeption:
    # Plugin zur Ansteuerung einer Zender ComfoAir
    # Version 1.6.9 15.07.2014 BETA
    # Copyright: swiss (http://knx-user-forum.de/members/swiss.html)
    # Aufbau moeglichst so, dass man unterhalb der Einstellungen nichts veraendern muss!
    # - Neu mit der Moeglichkeit zur Anbindung über einen Moxa NPort von Fechter65 (http://knx-user-forum.de/members/fechter65.html)
    # - Neustrukturierung des Codes von Fechter65 (http://knx-user-forum.de/members/fechter65.html)
    # - Besseres Fehlerhandling bei der Verarbeitung der Reuckmeldungen von swiss (http://knx-user-forum.de/members/swiss.html)
    # - Neu nun mit direktem abfragen der Stufe nach dem setzen und auswerten der Komforttemperatur von swiss (http://knx-user-forum.de/members/swiss.html)
    # - Neu mit der Möglichkeit die Ventilationsstufe direkt zu setzen von swiss (http://knx-user-forum.de/members/swiss.html)
    # - Neu mit der Möglichkeit die Ventilatorstufe für Zuluft und Abluft getrennt zu setzen (0% - 100%) von Netsrac80 (http://knx-user-forum.de/members/netsrac80.html)
    # - Korrektur Stufe direkt setzen. Senden / empfangen hat nun das gleiche Mapping 1=Auto, 2=Sufe1, 3=Stufe2, 4=Stufe3
    # - Neu mit Rückmeldung auf Lesetelegramme
    # - Bugfix: Themperatur wird nach dem Verstellen nicht direkt als Status zurückgegeben


    #Modifikation für Edomi by MSW
    # - Aufbau als Edomi LBS asto (http://knx-user-forum.de/members/asto.html)

    if ($E=getLogicEingangDataAll($id)) {
        $t = logic_getVar($id,101);
        debug($id,"Baustein startet - Trigger: E".$t,6);

        $connection = new stdClass;

        # den Schnittstellentyp festlegen
        if(!empty($E[10]['value'])){
               $connection->sType=$E[10]['value'];
            } else {
                debug($id,"Keinen Schnittstellen-Typ angegeben, Abbruch",0);
                finish();
            }

            #Pfad zur seriellen Schnittstelle oder dem Moxa:
        #$schnittstelle = '/dev/ttyUSB0';
        if(!empty($E[2]['value'])){
               $schnittstelle=$E[2]['value'];
            } else {
                debug($id,"Keine Schnittstelle angegeben, Abbruch",0);
                finish();
            }

        switch($connection->sType){
        case "S":
            #Einrichten der Seriellen Schnittstelle fuer die Kommunikation mit der ComfoAir
            include(dirname(__FILE__)."/../../../../main/include/php/phpserial.php");
            // Let's start the class
            debug($id,"PhpSerial: ".$schnittstelle." erstellen",6);
            $serial = new PhpSerial();

            // First we must specify the device. This works on both linux and windows (if
            // your linux serial device is /dev/ttyS0 for COM1, etc)
            $serial->deviceSet($schnittstelle);

            // We can change the baud rate, parity, length, stop bits, flow control
            $serial->confBaudRate(9600);
            $serial->confParity("none");
            $serial->confCharacterLength(8);
            $serial->confStopBits(1);
            $serial->confFlowControl("custom");

            if(! $serial->deviceOpen()){
              debug($id,"Schnittstelle: ".$schnittstelle." nicht geoeffnet",0);
              finish();
            }

            usleep(500);//delay

            $connection->target = $serial;

            debug($id,"Schnittstelle: ".$schnittstelle." erfolgreich geoeffnet",5);
            break;
        case "M":
            #Port am Moxa:
            if(!empty($E[11]['value'])){
               $port=$E[11]['value'];
            } else {
                debug($id,"Keinen MoxaPort angegeben, Abbruch",0);
                finish();
            }        

            /* Einen TCP/IP-Socket erzeugen. */
            $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
            if ($socket === false) {
                debug($id,"socket_create() fehlgeschlagen: Grund: " . socket_strerror(socket_last_error()) . ", Abbruch",0);
                finish();
            } else {
                debug($id,"socket_create() OK.",5);
            }

            debug($id,"Versuche, Moxa '".$schnittstelle."' auf Port '".$port."' zu verbinden ...",6);
            $result = socket_connect($socket, $schnittstelle, $port);
            if ($result === false) {
                debug($id,"socket_connect() fehlgeschlagen. Grund: ($result) " . socket_strerror(socket_last_error($socket)) . ", Abbruch",0);
                finish();
            } else {
                debug($id,"socket_connect() OK.",5);
            }

            $connection->target = $socket;        

            break;
        default:
            debug($id,"Kein passender Schnittstellen-Typ: '".$connection->sType."' angegeben!",0);
        }

        if ($t == 3) {
            if (empty($E[3]['value'])) {
            debug($id,"Stufenwert leer",3);
            } elseif ( (intval($E[3]['value']) >= 1) && (intval($E[3]['value']) <= 4) ) {
            $daten = "0099010".intval($E[3]['value']);
            debug($id,"Stufe setzen auf: ".intval($E[3]['value']),5);
            command_senden($id,$connection, $daten);
            }
            command_read($id,$connection, "00CD00");

        } elseif ($t == 4) {
            if (empty($E[4]['value'])) {
            debug($id,"Temperaturwert leer",3);
            } elseif ((intval($E[4]['value']) >= 15) && (intval($E[4]['value']) <= 25)) {
            $value = (float)str_replace(',', '.', $E[4]['value']);
            $value = round($value * 2) / 2;
            debug($id,"Komforttemperatur setzen auf: ".$value,5);

            #Rechne die Temperatur fuer die Co$
            $temphex = ($value + 20) * 2;
            # Mache einen HEX-Wert
            $temphex = sprintf("%x", $temphex);

            $daten = "00D301".$temphex;
            command_senden($id,$connection, $daten);
            }
            command_read($id,$connection, "00D100");

        } elseif ($t==5 && $E[5]['value'] != 0) {
            command_senden($id,$connection, "00DB0400000001");
            debug($id,"Filter wurde zurueckgesetzt",5);
            command_read($id,$connection, "00D900");

        } elseif ($t==6 && $E[6]['value'] != 0) {
            command_senden($id,$connection, "00DB0401000000");
            debug($id,"Fehlermeldung wurde zurueckgesetzt",5);
            command_read($id,$connection, "00D900");
        }
    //____________Firmware_über_E7_________________________________________Gernot_27.02.2017______________________________________________________________
         elseif ($t==7 && $E[7]['value'] != 0) {
            command_read($id,$connection, "006900");
        }
    //____________Einstellung_der_einzelnen_Stufen_über_E13_bis_E20________Gernot_09.02.2017______________________________________________________________
    elseif(in_array($t, array(13,14,15,16,17,18,19,20)))
    {
        $statusSTUFEN = command_senden($id,$connection, "00CD00");
        if (validateReturnString($id,$statusSTUFEN))
        {
            $Befehl = "00CF09";
            $statusSTUFEN = ''.substr($statusSTUFEN, 6, 12).substr($statusSTUFEN, 26, 4).'';
            switch($t)
            {
                case 13:    //ABL_0
                    if((intval($E[13]['value']) >= 15) && (intval($E[13]['value']) <= 97))
                    {
                        $value = strtoupper(str_pad(dechex($E[13]['value']), 2 ,'0', STR_PAD_LEFT)); //$E[13] > in hex > 2Stellig mit führender 0 links > Großbuchstaben
                        $daten=''.$value.substr($statusSTUFEN, 2, 14).'00';
                        command_senden($id,$connection, $Befehl.$daten);
                    }
                    break;

                case 14:    //ABL_1
                    if((intval($E[14]['value']) >= 16) && (intval($E[14]['value']) <= 98)){
                        $value = strtoupper(str_pad(dechex($E[14]['value']), 2 ,'0', STR_PAD_LEFT));
                        $daten=''.substr($statusSTUFEN, 0, 2).$value.substr($statusSTUFEN, 4, 12).'00';
                        command_senden($id,$connection, $Befehl.$daten);
                    }
                    break;

                case 15:    //ABL_2
                    if((intval($E[15]['value']) >= 17) && (intval($E[15]['value']) <= 99)){
                        $value = strtoupper(str_pad(dechex($E[15]['value']), 2 ,'0', STR_PAD_LEFT));
                        $daten=''.substr($statusSTUFEN, 0, 4).$value.substr($statusSTUFEN, 6, 10).'00';
                        command_senden($id,$connection, $Befehl.$daten);
                    }
                    break;

                case 16:    //ZUL_0
                    if((intval($E[16]['value']) >= 15) && (intval($E[16]['value']) <= 97)){
                        $value = strtoupper(str_pad(dechex($E[16]['value']), 2 ,'0', STR_PAD_LEFT));
                        $daten=''.substr($statusSTUFEN, 0, 6).$value.substr($statusSTUFEN, 8, 8).'00';
                        command_senden($id,$connection, $Befehl.$daten);
                    }
                    break;

                case 17:    //ZUL_1
                    if((intval($E[17]['value']) >= 16) && (intval($E[17]['value']) <= 98)){
                        $value = strtoupper(str_pad(dechex($E[17]['value']), 2 ,'0', STR_PAD_LEFT));
                        $daten=''.substr($statusSTUFEN, 0, 8).$value.substr($statusSTUFEN, 10, 6).'00';
                        command_senden($id,$connection, $Befehl.$daten);
                    }
                    break;

                case 18:    //ZUL_2
                    if((intval($E[18]['value']) >= 17) && (intval($E[18]['value']) <= 99)){
                        $value = strtoupper(str_pad(dechex($E[18]['value']), 2 ,'0', STR_PAD_LEFT));
                        $daten=''.substr($statusSTUFEN, 0, 10).$value.substr($statusSTUFEN, 12, 4).'00';
                        command_senden($id,$connection, $Befehl.$daten);
                    }
                    break;

                case 19:    //ABL_3
                    if((intval($E[19]['value']) >= 18) && (intval($E[19]['value']) <= 100)){
                        $value = strtoupper(str_pad(dechex($E[19]['value']), 2 ,'0', STR_PAD_LEFT));
                        $daten=''.substr($statusSTUFEN, 0, 12).$value.substr($statusSTUFEN, 14, 2).'00';
                        command_senden($id,$connection, $Befehl.$daten);
                    }
                    break;

                case 20:    //ZUL_3
                    if((intval($E[20]['value']) >= 18) && (intval($E[20]['value']) <= 100)){
                        $value = strtoupper(str_pad(dechex($E[20]['value']), 2 ,'0', STR_PAD_LEFT));
                        $daten=''.substr($statusSTUFEN, 0, 14).$value.'00';
                        command_senden($id,$connection, $Befehl.$daten);
                    }
                    break;

                default:
                    break;
            }
        command_read($id,$connection, "00CD00");
        }
    }
    //____________________________________________________________________________________________________________________________________________________
        else {
            command_readAll($id,$connection);
        }

        finish();
    }

    function command_read($id,$connection,$request){
        $return = command_senden($id,$connection, $request);
        if (validateReturnString($id,$return)) {
            getValuesOfString($id,$return);
        }
    }

    function command_readAll($id,$connection) {

        $daten = array();

        #Daten der Anlage abfragen
        $daten[] = "00DD00";

        #Temperaturen
        $daten[] = "00D100";

        #Ventilatorstufe
        $daten[] = "00CD00";

        #Status Ventilator
        $daten[] = "000B00";

        #Status Bypass
        $daten[] = "000D00";

        #Fehlercodes
        $daten[] = "00D900";

    //____________Erweiterung_für_Infoboxen________Gernot_09.02.2017______________________________________________________________________________________
        #Status Vorheizung
        $daten[] = "00E100";

        #Status Bootloader
    //    $daten[] = "006700";

        #Status Firmware
    //    $daten[] = "006900";

        #Status Analogwerte
    //    $daten[] = "009D00";
    //____________________________________________________________________________________________________________________________________________________
        foreach($daten as $request){
          command_read($id, $connection, $request);
        }

        debug($id,"ENDE zyklische Abfrage",5);
    }

    function validateReturnString($id, &$reciv) {

        $laenge;
        #Laenge des empfangenen Datenstrings nach dem kuerzen
        $checksum = 0;
        #Checksumme
        $rcv_checksum = "";

        #solange das Ende nicht 070F lautet
        while ((strlen($reciv) > 3) && (substr($reciv, (strlen($reciv) - 4), 4) != '070F')){
            debug($id,"String vor Kuerzung Ende: ". $reciv,6);
            $reciv = substr($reciv, 0, -2);
            #String um die letzten zwei Zeichen kuerzen
            debug($id,"String nach Kuerzung Ende: ". $reciv,6);
        }

        #Hier wird der empfangene String um Start- und Endbyte gekuerzt
        $laenge = strlen($reciv);
        #Laenge des Antworttelegramms ermitteln
        $reciv = substr($reciv, 0, ($laenge - 4));
        #Entferne 07F0 vom Ende

        if (substr($reciv, (strlen($reciv) - 4), 4) == '07F3') {
            $reciv = substr($reciv, 0, ($laenge - 4));
            debug($id,"String ohne 07F3: ". $reciv,6);
        }

        debug($id,"Erste 4 Byte des Datenpakets: ". (substr($reciv, 0, 4)),6);

        while ((strlen($reciv) > 3) && (substr($reciv, 0, 4)) != '07F0') {
            $reciv = substr($reciv, 2);
            #falls noch falsche Zeichen am Anfang des Strings enthalten sind, werden diese hier entfernt.
            debug($id,"reciv gekuerzt: ". $reciv,6);
        }

        $reciv = substr($reciv, 4);
        debug($id,"String ohne 07F0 am Anfang: ". $reciv,6);

        #Test einer Methode falls aussversehen mehrere Datenpakete auf einmal im Datenstring enthalten sind...
        if (stristr($reciv, "07F307F0") !== false) {
            $dataarray = preg_split("/07F307F0/i", $reciv);
            $reciv = $dataarray[0];
        }

        #Nun wird die Checksumme gelesen und aus dem Datenstring entfernt
        $checksum = 0;
        $checksum = substr($reciv, -2, 2);
        debug($id,"Checksumme gelesen: ". $checksum,6);

        $laenge = strlen($reciv);
        #Laenge des Antworttelegramms ermitteln
        $reciv = substr($reciv, 0, ($laenge - 2));
        debug($id,"Datenpaket ohne Checksumme: ". $reciv,6);

        #Hier wird die Subroutine für die Berechnung der Checksumme aufgerufen und das Ergebnis in $rcv_checksum zurueck gegeben
        $rcv_checksum = checksum_berechnen($id,$reciv);

        if ($rcv_checksum == $checksum) {
        debug($id,"Checksumme OK",6);    
        }
        #Hier werden die doppelten 07 aus dem Antwortstring entfernt.
        debug($id,"String vor 07 Bereinigung: ". $reciv,6);
        $reciv = preg_replace("/0707/", "07", $reciv);
        debug($id,"String nach 07 Bereinigung: ". $reciv,6);

        return $rcv_checksum == $checksum;

    }

    function command_senden($id, $connection, $data) {

        if (!is_object($connection) || empty($data) || !is_string($data)) {
            debug($id,"Fehler in command_senden Parametern, Abbruch",0);
            finish();
        }

        #Weitere Variablen die benoetigt werden

        #Serial Input = Empangener Datenstrom
        $sin = "";
        #Counter Input =  Länge des Datenpakets
        $cin = "";
        $reciv = "";
        $ack = pack("H*", "07F3");

        debug($id,"cmdSenden - Request: ". $data,6);

        $checksum = checksum_berechnen($id, $data);
        debug($id,"Checksumme aus der Subroutine: " . $checksum,6);

        $command = pack("H*", "07F0".$data.$checksum."070F");

        #Befehl an die ComfoAir senden
        if($connection->sType == "S"){
        $connection->target->sendMessage($command);
        }
        if($connection->sType == "M"){
        socket_write($connection->target, $command, strlen($command));    
        }


        /**
         * Hier ist eine Warteschleife für die Rueckmeldung eingebaut
         */
        $lastAccess = time();
        while (true) {

        if($connection->sType == "S"){
                $sin = $connection->target->readPort(45);
        }
        if($connection->sType == "M"){
    //        $sin = socket_read($connection->target, 45);                //auskommentiert von Gernot
            socket_recv($connection->target, $sin, 45, MSG_DONTWAIT);    //socket_recv verwendet
            }                                                            //socket_read block > (bug in einer while Schleife,kann nicht abgebrochen werden)

            $cin = strlen($sin);
            if ($cin > 0) {
                $sin = unpack("H*", $sin);
                $reciv .= strtoupper(array_shift($sin));

                //debug($id,$reciv,6);

                $lastAccess = time();
            }

            if ($reciv == "07F3") {
                debug($id,"Exit ACK only",6);
                break;
            }

            if (stristr($reciv, "070F") !== false) {
                if (substr($reciv, (strlen($reciv) - 6), 6) != '07070F') {
                    debug($id,"Exit 07070F",6);
                    break;
                }
            }

            if (time()-$lastAccess > 5) {
                debug($id,"Exit command_senden() timeout!",3);
                break;
            }
        usleep(200);
       }
        #ACK senden
            if($connection->sType == "S"){

                $sin = $connection->target->sendMessage($ack);
        }
        if($connection->sType == "M"){
            socket_write($connection->target, $ack, strlen($ack));    
           }


        debug($id,"ACK gesendet",6);

        if (empty($reciv)) {
            debug($id,"FEHLER: Keine Daten empfangen!",3);

            return null;
        }

        return $reciv;
    }

    function getValuesOfString($id,$reciv) {

        if (strstr($reciv, "00D209") !== false) {#Wenn die Temperaturen empfangen wurden
            $t1 = substr($reciv, 6, 2);
            $t2 = substr($reciv, 8, 2);
            $t3 = substr($reciv, 10, 2);
            $t4 = substr($reciv, 12, 2);
            $t5 = substr($reciv, 14, 2);
            $t6 = substr($reciv, 18, 2);

            #Hier werden die Temperaturen "decodiert" damit sie einen Sinn ergeben
            $t1 = (hexdec($t1) / 2) - 20;
            $t2 = (hexdec($t2) / 2) - 20;
            $t3 = (hexdec($t3) / 2) - 20;
            $t4 = (hexdec($t4) / 2) - 20;
            $t5 = (hexdec($t5) / 2) - 20;
            $t6 = (hexdec($t6) / 2) - 20;

        /*
        [a#7        = Komforttemp ]
        [a#8        = Aussenluft ]
        [a#9        = Zuluft ]
        [a#10        = Abluft ]
        [a#11        = Fortluft ]
        [a#38        = Erdwärmetauscher Temperatur]
        */

        logic_setOutput($id,7,$t1);
        debug($id,"Komforttemp: " . $t1 . " °C",5);

        logic_setOutput($id,8,$t2);
        debug($id,"Aussenluft:  " . $t2 . " °C",5);

        logic_setOutput($id,9,$t3);
        debug($id,"Zuluft:      " . $t3 . " °C",5);

        logic_setOutput($id,10,$t4);
        debug($id,"Abluft:      " . $t4 . " °C",5);

        logic_setOutput($id,11,$t5);
        debug($id,"Fortluft:    " . $t5 . " °C",5);

        logic_setOutput($id,38,$t6);
        debug($id,"Erdwärmetauscher Temperatur:    " . $t6 . " °C",5);

        }
    //__________Vorheizregister Status_____________Gernot_27.02.2017______________________________________________________________________________________
        elseif (strstr($reciv, "00E206") !== false) {
            $klappe = substr($reciv, 6, 2);
            $frostschutz = substr($reciv, 8, 2);
            $vorhzg = substr($reciv, 10, 2);
            $frost_minuten = substr($reciv, 12, 4);
            $frostsicherheit = substr($reciv, 16, 2);
        /*
        [a#21        = Frostschutz_0/1 ]
        [a#22        = Vorheizung_0/1 ]
        [a#23        = Klappe_0/1 ]
        [a#24        = Frost in min ]
        [a#25        = Frostsicherheitsstufe ]
        */

        logic_setOutput($id,21,hexdec($frostschutz));
        debug($id,"Status Frostschutz: " . hexdec($frostschutz) . " ",5);

        logic_setOutput($id,22,hexdec($vorhzg));
        debug($id,"Status Vorheizung: " . hexdec($vorhzg) . " ",5);

        logic_setOutput($id,23,hexdec($klappe));
        debug($id,"Status Frostschutz: " . hexdec($klappe) . " ",5);

        logic_setOutput($id,24,hexdec($frost_minuten));
        debug($id,"Status Vorheizung: " . hexdec($frost_minuten) . " ",5);

        logic_setOutput($id,25,hexdec($frostsicherheit));
        debug($id,"Status Frostschutz: " . hexdec($frostsicherheit) . " ",5);
        }
    //____________________________________________________________________________________________________________________________________________________
        elseif (strstr($reciv, "009814") !== false) {#Wenn die Sensordaten empfangen wurden
            $s1 = substr($reciv, 6, 2);
            $s2 = substr($reciv, 8, 2);  

            #Hier werden die Sensordaten "decodiert"
            $s1 = (hexdec($s1) / 2) - 20;
            $s2 = hexdec($s2);

            #print "Enthalpie Temp: " . $s1 . " °C\n";
            #print "Enthalpie Feuchte:  " . $s2 . " %\n";

        } elseif (strstr($reciv, "000C06") !== false) {#Wenn der Status fuer die Ventilatoren empfangen wurden
            $vent_zul = substr($reciv, 6, 2);
            $vent_abl = substr($reciv, 8, 2);
            $speed_zul = substr($reciv, 10, 4);
            $speed_abl = substr($reciv, 14, 4);

        /*

        [a#13        = Stat_Vent_Zuluft ]
        [a#14        = Stat_Vent_Abluft ]
        [a#15        = RPM_Vent_Zuluft ]
        [a#16        = RPM_Vent_Abluft ]

        */


        logic_setOutput($id,13,hexdec($vent_zul));
        debug($id,"Status Ventilator Zuluft: " . hexdec($vent_zul) . " %",5);

        logic_setOutput($id,14,hexdec($vent_abl));
        debug($id,"Status Ventilator Abluft: " . hexdec($vent_abl) . " %",5);

        logic_setOutput($id,15,intval(1875000 / hexdec($speed_zul)));
        debug($id,sprintf("Drehzahl Ventilator Zuluft: %d U/min", (1875000 / hexdec($speed_zul))),5);

        logic_setOutput($id,16,intval(1875000 / hexdec($speed_abl)));
        debug($id,sprintf("Drehzahl Ventilator Abluft: %d U/min", (1875000 / hexdec($speed_abl))),5);


        } elseif (strstr($reciv, "00CE0E") !== false) {#Wenn der Status der Ventilatorenstufe empfangen wurden
            $akt_stufe = substr($reciv, 22, 2);
        /*
        [a#12        = AKT_STUFE ]
        */

        logic_setOutput($id,12,hexdec($akt_stufe));
        debug($id,"AKT_STUFE: ". hexdec($akt_stufe),5);
    //__________Status_Lüfterstufeneinstellung_____________Gernot_16.02.2017______________________________________________________________________________

        /*
        [a#26        = stat_ABL_0       ]
        [a#27        = stat_ABL_1       ]
        [a#28        = stat_ABL_2       ]
        [a#29        = stat_ZUL_0       ]
        [a#30        = stat_ZUL_1       ]
        [a#31        = stat_ZUL_2       ]
        [a#32        = stat_ABL_3       ]
        [a#33        = stat_ZUL_3       ]
        [a#34        = ZUL_Venilator_0/1]
        */

        logic_setOutput($id,26,hexdec(substr($reciv, 6, 2)));
        debug($id,"Abluft Stufe 0 abwesend: " . hexdec(substr($reciv, 6, 2)) . "%",5);

        logic_setOutput($id,27,hexdec(substr($reciv, 8, 2)));
        debug($id,"Abluft Stufe 1: " . hexdec(substr($reciv, 8, 2)) . "%",5);

        logic_setOutput($id,28,hexdec(substr($reciv, 10, 2)));
        debug($id,"Abluft Stufe 2: " . hexdec(substr($reciv, 10, 2)) . "%",5);

        logic_setOutput($id,29,hexdec(substr($reciv, 12, 2)));
        debug($id,"Zuluft Stufe 0 abwesend: " . hexdec(substr($reciv, 12, 2)) . "%",5);

        logic_setOutput($id,30,hexdec(substr($reciv, 14, 2)));
        debug($id,"Zuluft Stufe 1: " . hexdec(substr($reciv, 14, 2)) . "%",5);

        logic_setOutput($id,31,hexdec(substr($reciv, 16, 2)));
        debug($id,"Zuluft Stufe 2: " . hexdec(substr($reciv, 16, 2)) . "%",5);

        logic_setOutput($id,32,hexdec(substr($reciv, 26, 2)));
        debug($id,"Abluft Stufe 3: " . hexdec(substr($reciv, 26, 2)) . "%",5);

        logic_setOutput($id,33,hexdec(substr($reciv, 28, 2)));
        debug($id,"Zuluft Stufe 3: " . hexdec(substr($reciv, 28, 2)) . "%",5);

        logic_setOutput($id,34,hexdec(substr($reciv, 24, 2)));
        debug($id,"Status Zuluft Ventilator: " . hexdec(substr($reciv, 24, 2)) . " ",5);

        }
    //____________________________________________________________________________________________________________________________________________________

        elseif (strstr($reciv, "000E04") !== false) {#Wenn der Status fuer die Bypassklappe empfangen wurden
            $bypass_prozent = substr($reciv, 6, 2);

        logic_setOutput($id,17,hexdec($bypass_prozent));
        debug($id,"Bypass: ". hexdec($bypass_prozent),5);

        /*
        [a#17        = Bypass ]
        */
        }
        elseif (strstr($reciv, "00DE14") !== false) {#Wenn die Rueckmeldung der Betriebsstunden empfangen wurden
        /*
        [a#1        = Betrieb_h_Filter ]
        [a#2        = Betrieb_h_Stufe_1 ]
        [a#3        = Betrieb_h_Stufe_2 ]
        [a#4        = Betrieb_h_Stufe_3 ]
        [a#5        = Betrieb_h_Stufe_4 ]
        [a#6        = Betrieb_h_Bypass_offen ]
        [a#35        = Betrieb_h_Frost ]
        [a#36        = Betrieb_h_Vorheizung ]
        */
    //_____Statusbox_Betriebsstunden____________________Gernot_16.02.2017_________________________________________________________________________________

        logic_setOutput($id,35,hexdec(substr($reciv, 24, 4)));
        debug($id,"Betriebsstunden Frost: ". hexdec(substr($reciv, 24, 4)) . "h",5);

        logic_setOutput($id,36,hexdec(substr($reciv, 28, 4)));
        debug($id,"Betriebsstunden Vorheizung: ". hexdec(substr($reciv, 28, 4)) . "h",5);

    //____________________________________________________________________________________________________________________________________________________

        logic_setOutput($id,2,hexdec(substr($reciv, 6, 6)));
        debug($id,"Betriebsstunden Stufe 0 (Abwesend): ". hexdec(substr($reciv, 6, 6)) . "h",5);

        logic_setOutput($id,3,hexdec(substr($reciv, 12, 6)));
        debug($id,"Betriebsstunden Stufe 1: ". hexdec(substr($reciv, 12, 6)) . "h",5);

        logic_setOutput($id,4,hexdec(substr($reciv, 18, 6)));
        debug($id,"Betriebsstunden Stufe 2: ". hexdec(substr($reciv, 18, 6)) . "h",5);

        debug($id,"Betriebsstunden Frost: ". hexdec(substr($reciv, 24, 4)) . "h",5);

        debug($id,"Betriebsstunden Vorheizung: ". hexdec(substr($reciv, 28, 4)) . "h",5);

        logic_setOutput($id,6,hexdec(substr($reciv, 32, 4)));
        debug($id,"Betriebsstunden Bypass offen: ". hexdec(substr($reciv, 32, 4)) . "h",5);

        logic_setOutput($id,1,hexdec(substr($reciv, 36, 4)));
        debug($id,"Betriebsstunden Filter: ". hexdec(substr($reciv, 36, 4)) . "h",5);

        logic_setOutput($id,5,hexdec(substr($reciv, 40, 6)));
        debug($id,"Betriebsstunden Stufe 3: ". hexdec(substr($reciv, 40, 6)) . "h",5);
        }
        elseif (strstr($reciv, "00DA11") !== false) {#Wenn die Rueckmeldung der Stoermeldungen empfangen wurde

            $fehlerAlo = substr($reciv, 6, 2);
            $fehlerAhi = substr($reciv, 30, 2);
            $fehlerE = substr($reciv, 8, 2);
            $fehlerFilter = substr($reciv, 22, 2);
            $fehlerEA = substr($reciv, 24, 2);
            $numAlo = '';
            $numAhi = '';
            $numE = '';
            $numEA = '';

            $numAlo .= sprintf('%08b', hexdec($fehlerAlo));
            $numAhi .= sprintf('%08b', hexdec($fehlerAhi));
            $numE .= sprintf('%08b', hexdec($fehlerE));
            $numEA .= sprintf('%08b', hexdec($fehlerAlo));

            $fehlerAlo = strrev($numAlo);
            #Wandle den Wert in Binaer und drehe die Reihenfolge um. z.B 0x02 = 00000010 = 010000000
            $fehlerAlo = strpos($fehlerAlo, '1') !== false ? strpos($fehlerAlo, '1') + 1 : 0;
            # Zaehle an welcher Stelle die 1 auftaucht (von links gelesen) z.B. 01000000 = INDEX 2 = Fehler2

            if ($fehlerAhi != '00') {
                $fehlerAhi = strpos(strrev($numAhi), '1') + 9;
            } else {
                $fehlerAhi = '';
            }

            $fehlerE = strpos(strrev($numE), '1') !== false ? strpos(strrev($numE), '1') + 1 : 0;
            $fehlerEA = strpos(strrev($numEA), '1') !== false ? strpos(strrev($numEA), '1') + 1 : 0;
            if ($fehlerAhi == 16) {
                $fehlerAhi = 0;
            }

        /*
        [a#18        = Akt_FehlerCode ]
        [a#19        = Filter_voll_1_0 ]
        [a#20        = Status_Text ]
        */

            if ($fehlerAlo > 0) {
                $aktFC = 'A' . $fehlerAlo;
            } elseif ($fehlerAhi != '') {
                $aktFC = 'A' . $fehlerAhi;
            } elseif ($fehlerE > 0) {
                $aktFC = 'E' . $fehlerE;
            } elseif ($fehlerEA > 0) {
                $aktFC = 'EA' . $fehlerEA;
            } else {
                $aktFC = '';
            }

            if (hexdec($fehlerFilter) > 0) {
            $filterFlag = 1;
            } else {
            $filterFlag = 0;
            }

        $statText = ($aktFC == '' ? 'Aktuell kein Fehler' : 'Fehler: '.$aktFC);
         $statText .= ' - '.($filterFlag == 0 ? 'Filter nicht voll' : 'Filter voll');

        logic_setOutput($id,18,$aktFC);
        debug($id,"FehlerCode: ".$aktFC,5);

        logic_setOutput($id,19,$filterFlag);
        debug($id,"Filter voll: ".$filterFlag,5);

        logic_setOutput($id,20,$statText);
        debug($id,"Status Text: ".$statText,5);
        }
    //____________Bootloader_Firmware_Analogwerte_______________________Gernot_16.02.2017_________________________________________________________________
    /*
    elseif (strstr($reciv, "00680D") !== false) {//Bootloader

    $InfoBox = '**************************
    *       Bootloader       *
    **************************
    Version        : '.hexdec(substr($reciv, 6, 2)).'.'.hexdec(substr($reciv, 8, 2)).'.'.hexdec(substr($reciv, 10, 2)).'
    Geräte Name    : '.substr($reciv, 12, 20).'';
        logic_setOutput($id,27,$InfoBox);
    }
    */
    elseif (strstr($reciv, "006A0D") !== false) {//Firmware

    $InfoBox = ''.hexdec(substr($reciv, 6, 2)).'.'.hexdec(substr($reciv, 8, 2)).'.'.hexdec(substr($reciv, 10, 2)).'';
    //Geräte Name    : '.substr($reciv, 12, 20).'

        logic_setOutput($id,37,$InfoBox);
    }
    /*
    elseif (strstr($reciv, "009E13") !== false) {//Analogwerte abrufen

    $InfoBox = 'Analog 1 Min. Einstellung (%)  : '.hexdec(substr($reciv, 12, 2)).'
    Analog 1 Max. Einstellung (%)  : '.hexdec(substr($reciv, 14, 2)).'
    Analog 1 Sollwert (%)          : '.hexdec(substr($reciv, 16, 2)).'
    Analog 2 Min. Einstellung (%)  : '.hexdec(substr($reciv, 18, 2)).'
    Analog 2 Max. Einstellung (%)  : '.hexdec(substr($reciv, 20, 2)).'
    Analog 2 Sollwert (%)          : '.hexdec(substr($reciv, 22, 2)).'
    Analog 3 Min. Einstellung (%)  : '.hexdec(substr($reciv, 24, 2)).'
    Analog 3 Max. Einstellung (%)  : '.hexdec(substr($reciv, 26, 2)).'
    Analog 3 Sollwert (%)          : '.hexdec(substr($reciv, 28, 2)).'
    Analog 4 Min. Einstellung (%)  : '.hexdec(substr($reciv, 30, 2)).'
    Analog 4 Max. Einstellung (%)  : '.hexdec(substr($reciv, 32, 2)).'
    Analog 4 Sollwert (%)          : '.hexdec(substr($reciv, 34, 2)).'
    Analog RF Min. Einstellung (%) : '.hexdec(substr($reciv, 36, 2)).'
    Analog RF Max. Einstellung (%) : '.hexdec(substr($reciv, 38, 2)).'
    Analog RF Sollwert (%)         : '.hexdec(substr($reciv, 40, 2)).'
    Priorität Regelung 1 = WochenP : '.hexdec(substr($reciv, 42, 2)).'
    ';
        logic_setOutput($id,29,$InfoBox);
    }
    */
    //____________________________________________________________________________________________________________________________________________________

    }

    function checksum_berechnen($id,$chk_datasum) {

        $rcv_checksum = 0;
        $i;
        $chk_datasum = $chk_datasum . "AD";
        #+173 fuer die Checksummenberechnung
       debug($id,"String fuer die Berechnung der Checksumme: ". $chk_datasum,6);

        $x07warschon = 0;
        #Hilfsvariable für die Checksummenberechnung
        $laenge = strlen($chk_datasum);
        for ($i = 0; $i < $laenge; $i++) {
            $wertstring = substr($chk_datasum, $i, 2);
            $wertbetrag = hexdec($wertstring);
            if ($wertbetrag == 7) {
                if ($x07warschon == 1) {
                    $x07warschon = 0;
                    $i++;
                    continue;
                } else {
                    $x07warschon = 1;
                }
            }
            $rcv_checksum += $wertbetrag;

            $i++;
        }


        debug($id,"Checksumme vor der Umwandlung: ". $rcv_checksum,6);

        $rcv_checksum = sprintf("%X\n", $rcv_checksum);
        #Mache aus Integer wieder HEX
        debug($id,"Checksumme vor der Kuerzung: ". $rcv_checksum,6);

        $rcv_checksum = substr($rcv_checksum, -3, 2);
        #Verwende nur die letzten beiden Stellen
        debug($id,"Checksumme nach der Kuerzung: ". $rcv_checksum,6);

        return $rcv_checksum;
    } #Ende checksum_berechnen

    function finish() {
        global $DEBUG,$id,$connection;

        if($connection->sType == "S"){
            $connection->target->deviceClose();
        }
        if($connection->sType == "M"){
            socket_shutdown($socket,2);
            socket_close($connection->target);
        }

        $DEBUG && debug($id,"Baustein beendet");
        logic_setVar($id,101,0);
        setLogicElementStatus($id,0);  
        sql_disconnect();

        exit();
    }

    function debug($id,$s,$l=6) {
        $a=array("Emergency","Alert","Critical","Error","Warning","Informational","Debug");
        $E=logic_getInputs($id);
        $DEBUG=$E[9]['value'];
        $l<=$DEBUG && writeToCustomLog("LBS19000680",$l,"(ID$id) ".$a[$l].": ".$s);
    }
    ?>
    ###[/EXEC]###
    Hoffe es hilft jemandem.

    Schöne Grüße
    Gernot
    Angehängte Dateien
    Zuletzt geändert von murelli146; 01.03.2017, 17:34. Grund: Code um Erdwärmetauscher Temperatur erweitert A38

    Einen Kommentar schreiben:


  • murelli146
    antwortet
    Wie hast du die Moxa mit der Platine verbunden ?
    Zuletzt geändert von murelli146; 28.02.2017, 20:31.

    Einen Kommentar schreiben:


  • felixj100
    antwortet
    Hallo zusammen,

    bin auch gerade dabei den Baustein zu testen. ich habe meine Comfoair per Moxa angeschlossen. Kommunikation funktioniert auch allerdings bekomme ich keine Daten. Hier ein Auszug aus dem Log:

    2017-02-28 18:59:00 105173 9504 5 (ID302) Informational: Trigger Zyklus
    2017-02-28 18:59:00 106095 9504 6 (ID302) Debug: callExec E1
    2017-02-28 18:59:00 156590 10871 6 (ID302) Debug: Baustein startet - Trigger: E1
    2017-02-28 18:59:00 156888 10871 5 (ID302) Informational: socket_create() OK.
    2017-02-28 18:59:00 157001 10871 6 (ID302) Debug: Versuche, Moxa '192.168.101.53' auf Port '16011' zu verbinden ...
    2017-02-28 18:59:00 158845 10871 5 (ID302) Informational: socket_connect() OK.
    2017-02-28 18:59:00 159006 10871 6 (ID302) Debug: cmdSenden - Request: 00DD00
    2017-02-28 18:59:00 159118 10871 6 (ID302) Debug: String fuer die Berechnung der Checksumme: 00DD00AD
    2017-02-28 18:59:00 159240 10871 6 (ID302) Debug: Checksumme vor der Umwandlung: 394
    2017-02-28 18:59:00 159348 10871 6 (ID302) Debug: Checksumme vor der Kuerzung: 18A[LF]
    2017-02-28 18:59:00 159454 10871 6 (ID302) Debug: Checksumme nach der Kuerzung: 8A
    2017-02-28 18:59:00 159569 10871 6 (ID302) Debug: Checksumme aus der Subroutine: 8A
    2017-02-28 18:59:00 190582 10871 6 (ID302) Debug: Exit 07070F
    2017-02-28 18:59:00 190907 10871 6 (ID302) Debug: ACK gesendet
    2017-02-28 18:59:00 191162 10871 6 (ID302) Debug: Erste 4 Byte des Datenpakets: 07F0
    2017-02-28 18:59:00 191401 10871 6 (ID302) Debug: String ohne 07F0 am Anfang: 00DD008A
    2017-02-28 18:59:00 191620 10871 6 (ID302) Debug: Checksumme gelesen: 8A
    2017-02-28 18:59:00 191832 10871 6 (ID302) Debug: Datenpaket ohne Checksumme: 00DD00
    2017-02-28 18:59:00 192039 10871 6 (ID302) Debug: String fuer die Berechnung der Checksumme: 00DD00AD
    2017-02-28 18:59:00 192255 10871 6 (ID302) Debug: Checksumme vor der Umwandlung: 394
    2017-02-28 18:59:00 192481 10871 6 (ID302) Debug: Checksumme vor der Kuerzung: 18A[LF]
    2017-02-28 18:59:00 192704 10871 6 (ID302) Debug: Checksumme nach der Kuerzung: 8A
    2017-02-28 18:59:00 192938 10871 6 (ID302) Debug: Checksumme OK
    2017-02-28 18:59:00 193137 10871 6 (ID302) Debug: String vor 07 Bereinigung: 00DD00
    2017-02-28 18:59:00 193396 10871 6 (ID302) Debug: String nach 07 Bereinigung: 00DD00
    2017-02-28 18:59:00 193627 10871 6 (ID302) Debug: cmdSenden - Request: 00D100
    2017-02-28 18:59:00 193828 10871 6 (ID302) Debug: String fuer die Berechnung der Checksumme: 00D100AD
    2017-02-28 18:59:00 194036 10871 6 (ID302) Debug: Checksumme vor der Umwandlung: 382
    2017-02-28 18:59:00 194238 10871 6 (ID302) Debug: Checksumme vor der Kuerzung: 17E[LF]
    2017-02-28 18:59:00 194458 10871 6 (ID302) Debug: Checksumme nach der Kuerzung: 7E
    2017-02-28 18:59:00 194657 10871 6 (ID302) Debug: Checksumme aus der Subroutine: 7E
    2017-02-28 18:59:00 226290 10871 6 (ID302) Debug: Exit 07070F
    2017-02-28 18:59:00 226613 10871 6 (ID302) Debug: ACK gesendet
    2017-02-28 18:59:00 226874 10871 6 (ID302) Debug: Erste 4 Byte des Datenpakets: 07F3
    2017-02-28 18:59:00 227114 10871 6 (ID302) Debug: reciv gekuerzt: F307F000D1007E
    2017-02-28 18:59:00 227334 10871 6 (ID302) Debug: reciv gekuerzt: 07F000D1007E
    2017-02-28 18:59:00 227545 10871 6 (ID302) Debug: String ohne 07F0 am Anfang: 00D1007E
    2017-02-28 18:59:00 227755 10871 6 (ID302) Debug: Checksumme gelesen: 7E
    2017-02-28 18:59:00 227962 10871 6 (ID302) Debug: Datenpaket ohne Checksumme: 00D100
    2017-02-28 18:59:00 228188 10871 6 (ID302) Debug: String fuer die Berechnung der Checksumme: 00D100AD
    2017-02-28 18:59:00 228442 10871 6 (ID302) Debug: Checksumme vor der Umwandlung: 382
    2017-02-28 18:59:00 228650 10871 6 (ID302) Debug: Checksumme vor der Kuerzung: 17E[LF]
    2017-02-28 18:59:00 228853 10871 6 (ID302) Debug: Checksumme nach der Kuerzung: 7E
    2017-02-28 18:59:00 229077 10871 6 (ID302) Debug: Checksumme OK
    2017-02-28 18:59:00 229281 10871 6 (ID302) Debug: String vor 07 Bereinigung: 00D100
    2017-02-28 18:59:00 229487 10871 6 (ID302) Debug: String nach 07 Bereinigung: 00D100
    2017-02-28 18:59:00 229708 10871 6 (ID302) Debug: cmdSenden - Request: 00CD00
    2017-02-28 18:59:00 229909 10871 6 (ID302) Debug: String fuer die Berechnung der Checksumme: 00CD00AD
    2017-02-28 18:59:00 230139 10871 6 (ID302) Debug: Checksumme vor der Umwandlung: 378
    2017-02-28 18:59:00 230344 10871 6 (ID302) Debug: Checksumme vor der Kuerzung: 17A[LF]
    2017-02-28 18:59:00 230549 10871 6 (ID302) Debug: Checksumme nach der Kuerzung: 7A
    2017-02-28 18:59:00 230781 10871 6 (ID302) Debug: Checksumme aus der Subroutine: 7A
    2017-02-28 18:59:00 265955 10871 6 (ID302) Debug: Exit 07070F
    2017-02-28 18:59:00 266294 10871 6 (ID302) Debug: ACK gesendet
    2017-02-28 18:59:00 266540 10871 6 (ID302) Debug: Erste 4 Byte des Datenpakets: 07F3
    2017-02-28 18:59:00 266783 10871 6 (ID302) Debug: reciv gekuerzt: F307F000CD007A
    2017-02-28 18:59:00 267050 10871 6 (ID302) Debug: reciv gekuerzt: 07F000CD007A
    2017-02-28 18:59:00 267299 10871 6 (ID302) Debug: String ohne 07F0 am Anfang: 00CD007A
    2017-02-28 18:59:00 267528 10871 6 (ID302) Debug: Checksumme gelesen: 7A
    2017-02-28 18:59:00 267746 10871 6 (ID302) Debug: Datenpaket ohne Checksumme: 00CD00
    2017-02-28 18:59:00 268013 10871 6 (ID302) Debug: String fuer die Berechnung der Checksumme: 00CD00AD
    2017-02-28 18:59:00 268317 10871 6 (ID302) Debug: Checksumme vor der Umwandlung: 378
    2017-02-28 18:59:00 268532 10871 6 (ID302) Debug: Checksumme vor der Kuerzung: 17A[LF]
    2017-02-28 18:59:00 268764 10871 6 (ID302) Debug: Checksumme nach der Kuerzung: 7A
    2017-02-28 18:59:00 268973 10871 6 (ID302) Debug: Checksumme OK
    2017-02-28 18:59:00 269176 10871 6 (ID302) Debug: String vor 07 Bereinigung: 00CD00
    2017-02-28 18:59:00 269382 10871 6 (ID302) Debug: String nach 07 Bereinigung: 00CD00
    2017-02-28 18:59:00 269604 10871 6 (ID302) Debug: cmdSenden - Request: 000B00
    2017-02-28 18:59:00 269826 10871 6 (ID302) Debug: String fuer die Berechnung der Checksumme: 000B00AD
    2017-02-28 18:59:00 270037 10871 6 (ID302) Debug: Checksumme vor der Umwandlung: 184
    2017-02-28 18:59:00 270467 10871 6 (ID302) Debug: Checksumme vor der Kuerzung: B8[LF]
    2017-02-28 18:59:00 270701 10871 6 (ID302) Debug: Checksumme nach der Kuerzung: B8
    2017-02-28 18:59:00 270906 10871 6 (ID302) Debug: Checksumme aus der Subroutine: B8
    2017-02-28 18:59:00 305615 10871 6 (ID302) Debug: Exit 07070F
    2017-02-28 18:59:00 305847 10871 6 (ID302) Debug: ACK gesendet
    2017-02-28 18:59:00 306001 10871 6 (ID302) Debug: Erste 4 Byte des Datenpakets: 07F3
    2017-02-28 18:59:00 306138 10871 6 (ID302) Debug: reciv gekuerzt: F307F0000B00B8
    2017-02-28 18:59:00 306271 10871 6 (ID302) Debug: reciv gekuerzt: 07F0000B00B8
    2017-02-28 18:59:00 306400 10871 6 (ID302) Debug: String ohne 07F0 am Anfang: 000B00B8
    2017-02-28 18:59:00 306541 10871 6 (ID302) Debug: Checksumme gelesen: B8
    2017-02-28 18:59:00 306668 10871 6 (ID302) Debug: Datenpaket ohne Checksumme: 000B00
    2017-02-28 18:59:00 306792 10871 6 (ID302) Debug: String fuer die Berechnung der Checksumme: 000B00AD
    2017-02-28 18:59:00 306922 10871 6 (ID302) Debug: Checksumme vor der Umwandlung: 184
    2017-02-28 18:59:00 307060 10871 6 (ID302) Debug: Checksumme vor der Kuerzung: B8[LF]
    2017-02-28 18:59:00 307183 10871 6 (ID302) Debug: Checksumme nach der Kuerzung: B8
    2017-02-28 18:59:00 307306 10871 6 (ID302) Debug: Checksumme OK
    2017-02-28 18:59:00 307437 10871 6 (ID302) Debug: String vor 07 Bereinigung: 000B00
    2017-02-28 18:59:00 307562 10871 6 (ID302) Debug: String nach 07 Bereinigung: 000B00
    2017-02-28 18:59:00 307699 10871 6 (ID302) Debug: cmdSenden - Request: 000D00
    2017-02-28 18:59:00 307821 10871 6 (ID302) Debug: String fuer die Berechnung der Checksumme: 000D00AD
    2017-02-28 18:59:00 307945 10871 6 (ID302) Debug: Checksumme vor der Umwandlung: 186
    2017-02-28 18:59:00 308067 10871 6 (ID302) Debug: Checksumme vor der Kuerzung: BA[LF]
    2017-02-28 18:59:00 308187 10871 6 (ID302) Debug: Checksumme nach der Kuerzung: BA
    2017-02-28 18:59:00 308306 10871 6 (ID302) Debug: Checksumme aus der Subroutine: BA
    2017-02-28 18:59:00 344495 10871 6 (ID302) Debug: Exit 07070F
    2017-02-28 18:59:00 344783 10871 6 (ID302) Debug: ACK gesendet
    2017-02-28 18:59:00 344938 10871 6 (ID302) Debug: Erste 4 Byte des Datenpakets: 07F3
    2017-02-28 18:59:00 345052 10871 6 (ID302) Debug: reciv gekuerzt: F307F0000D00BA
    2017-02-28 18:59:00 345166 10871 6 (ID302) Debug: reciv gekuerzt: 07F0000D00BA
    2017-02-28 18:59:00 345271 10871 6 (ID302) Debug: String ohne 07F0 am Anfang: 000D00BA
    2017-02-28 18:59:00 345375 10871 6 (ID302) Debug: Checksumme gelesen: BA
    2017-02-28 18:59:00 345474 10871 6 (ID302) Debug: Datenpaket ohne Checksumme: 000D00
    2017-02-28 18:59:00 345573 10871 6 (ID302) Debug: String fuer die Berechnung der Checksumme: 000D00AD
    2017-02-28 18:59:00 345678 10871 6 (ID302) Debug: Checksumme vor der Umwandlung: 186
    2017-02-28 18:59:00 345777 10871 6 (ID302) Debug: Checksumme vor der Kuerzung: BA[LF]
    2017-02-28 18:59:00 345875 10871 6 (ID302) Debug: Checksumme nach der Kuerzung: BA
    2017-02-28 18:59:00 345971 10871 6 (ID302) Debug: Checksumme OK
    2017-02-28 18:59:00 346066 10871 6 (ID302) Debug: String vor 07 Bereinigung: 000D00
    2017-02-28 18:59:00 346175 10871 6 (ID302) Debug: String nach 07 Bereinigung: 000D00
    2017-02-28 18:59:00 346440 10871 6 (ID302) Debug: cmdSenden - Request: 00D900
    2017-02-28 18:59:00 346566 10871 6 (ID302) Debug: String fuer die Berechnung der Checksumme: 00D900AD
    2017-02-28 18:59:00 346668 10871 6 (ID302) Debug: Checksumme vor der Umwandlung: 390
    2017-02-28 18:59:00 346765 10871 6 (ID302) Debug: Checksumme vor der Kuerzung: 186[LF]
    2017-02-28 18:59:00 346884 10871 6 (ID302) Debug: Checksumme nach der Kuerzung: 86
    2017-02-28 18:59:00 346978 10871 6 (ID302) Debug: Checksumme aus der Subroutine: 86
    2017-02-28 18:59:00 381021 10871 6 (ID302) Debug: Exit 07070F
    2017-02-28 18:59:00 381203 10871 6 (ID302) Debug: ACK gesendet
    2017-02-28 18:59:00 381336 10871 6 (ID302) Debug: Erste 4 Byte des Datenpakets: 07F3
    2017-02-28 18:59:00 381441 10871 6 (ID302) Debug: reciv gekuerzt: F307F000D90086
    2017-02-28 18:59:00 381539 10871 6 (ID302) Debug: reciv gekuerzt: 07F000D90086
    2017-02-28 18:59:00 381635 10871 6 (ID302) Debug: String ohne 07F0 am Anfang: 00D90086
    2017-02-28 18:59:00 381731 10871 6 (ID302) Debug: Checksumme gelesen: 86
    2017-02-28 18:59:00 381835 10871 6 (ID302) Debug: Datenpaket ohne Checksumme: 00D900
    2017-02-28 18:59:00 381931 10871 6 (ID302) Debug: String fuer die Berechnung der Checksumme: 00D900AD
    2017-02-28 18:59:00 382029 10871 6 (ID302) Debug: Checksumme vor der Umwandlung: 390
    2017-02-28 18:59:00 382121 10871 6 (ID302) Debug: Checksumme vor der Kuerzung: 186[LF]
    2017-02-28 18:59:00 382214 10871 6 (ID302) Debug: Checksumme nach der Kuerzung: 86
    2017-02-28 18:59:00 382339 10871 6 (ID302) Debug: Checksumme OK
    2017-02-28 18:59:00 382431 10871 6 (ID302) Debug: String vor 07 Bereinigung: 00D900
    2017-02-28 18:59:00 382524 10871 6 (ID302) Debug: String nach 07 Bereinigung: 00D900
    2017-02-28 18:59:00 382627 10871 6 (ID302) Debug: cmdSenden - Request: 00E100
    2017-02-28 18:59:00 382719 10871 6 (ID302) Debug: String fuer die Berechnung der Checksumme: 00E100AD
    2017-02-28 18:59:00 382822 10871 6 (ID302) Debug: Checksumme vor der Umwandlung: 398
    2017-02-28 18:59:00 382914 10871 6 (ID302) Debug: Checksumme vor der Kuerzung: 18E[LF]
    2017-02-28 18:59:00 383006 10871 6 (ID302) Debug: Checksumme nach der Kuerzung: 8E
    2017-02-28 18:59:00 383095 10871 6 (ID302) Debug: Checksumme aus der Subroutine: 8E
    2017-02-28 18:59:00 420686 10871 6 (ID302) Debug: Exit 07070F
    2017-02-28 18:59:00 420867 10871 6 (ID302) Debug: ACK gesendet
    2017-02-28 18:59:00 421017 10871 6 (ID302) Debug: Erste 4 Byte des Datenpakets: 07F3
    2017-02-28 18:59:00 421119 10871 6 (ID302) Debug: reciv gekuerzt: F307F000E1008E
    2017-02-28 18:59:00 421272 10871 6 (ID302) Debug: reciv gekuerzt: 07F000E1008E
    2017-02-28 18:59:00 421467 10871 6 (ID302) Debug: String ohne 07F0 am Anfang: 00E1008E
    2017-02-28 18:59:00 421581 10871 6 (ID302) Debug: Checksumme gelesen: 8E
    2017-02-28 18:59:00 421681 10871 6 (ID302) Debug: Datenpaket ohne Checksumme: 00E100
    2017-02-28 18:59:00 421781 10871 6 (ID302) Debug: String fuer die Berechnung der Checksumme: 00E100AD
    2017-02-28 18:59:00 421895 10871 6 (ID302) Debug: Checksumme vor der Umwandlung: 398
    2017-02-28 18:59:00 422022 10871 6 (ID302) Debug: Checksumme vor der Kuerzung: 18E[LF]
    2017-02-28 18:59:00 422120 10871 6 (ID302) Debug: Checksumme nach der Kuerzung: 8E
    2017-02-28 18:59:00 422214 10871 6 (ID302) Debug: Checksumme OK
    2017-02-28 18:59:00 422307 10871 6 (ID302) Debug: String vor 07 Bereinigung: 00E100
    2017-02-28 18:59:00 422403 10871 6 (ID302) Debug: String nach 07 Bereinigung: 00E100
    2017-02-28 18:59:00 422512 10871 5 (ID302) Informational: ENDE zyklische Abfrage
    Hat einer ne Idee?

    danke Gruß Felix

    Einen Kommentar schreiben:


  • Hantago
    antwortet
    Sehr schön, wieder was zum spielen...

    Vielen Dank allen Entwicklern!

    Was macht ihr so mit dem Baustein? Folgendes habe ich bisher umgesetzt:

    - Regelung über Luftfeuchtemessung im Bad, wobei die Lufteuchte erst nach ausgiebigem heißem Duschen relevant hochgeht.
    - Regelung per Strommessung am Kochfeld
    - Taste auf jedem Klo. 15min Stufe 4, dann 15min Stufe 3 und der Duft ist weg...


    Einen Kommentar schreiben:


  • asto
    antwortet
    Guten morgen und vielen Dank! Ich habe die Erweiterungen/Fixes grad in den Downloadbereich übernommen.

    Einen Kommentar schreiben:


  • mfd
    antwortet
    asto Können die ganzen Änderungen als neue Version in den Downloadbereich übernommen werden?
    Wäre schade, wenn das hier untergeht.

    Vielen Dank auch nochmals von meiner Seite an alle am LBS Beteiligten!

    Einen Kommentar schreiben:


  • murelli146
    antwortet
    Hier noch der gesamte mod LBS

    PHP-Code:
    ###[DEF]###
    [name        = Zehnder Comfoair CA350,550, Stork und baugleiche ]

    [e#1 TRIGGER     = Trigger ]
    [e#2 IMPORTANT     = SerialDevice/MoxaIP ]
    [e#3 TRIGGER     = Stufe ]
    [e#4 TRIGGER     = Komforttemp ]
    [e#5 TRIGGER     = Filter Reset ]
    [e#6 TRIGGER     = Fehler Reset ]
    [e#9 OPTION     = LogLevel #init=3 ]
    [e#10 OPTION     = Schnittstellentyp #init=S ]
    [e#11 OPTION     = MoxaPort ]
    [e#13 TRIGGER     = set_ABL_0 ]
    [e#14 TRIGGER     = set_ABL_1 ]
    [e#15 TRIGGER     = set_ABL_2 ]
    [e#16 TRIGGER     = set_ZUL_0 ]
    [e#17 TRIGGER     = set_ZUL_1 ]
    [e#18 TRIGGER     = set_ZUL_2 ]
    [e#19 TRIGGER     = set_ABL_3 ]
    [e#20 TRIGGER     = set_ZUL_3 ]

    [a#1        = Betrieb_h_Filter ]
    [a#2        = Betrieb_h_Stufe_1 ]
    [a#3        = Betrieb_h_Stufe_2 ]
    [a#4        = Betrieb_h_Stufe_3 ]
    [a#5        = Betrieb_h_Stufe_4 ]
    [a#6        = Betrieb_h_Bypass_offen ]
    [a#7        = Komforttemp ]
    [a#8        = Aussenluft ]
    [a#9        = Zuluft ]
    [a#10        = Abluft ]
    [a#11        = Fortluft ]
    [a#12        = AKT_STUFE ]
    [a#13        = Stat_Vent_Zuluft ]
    [a#14        = Stat_Vent_Abluft ]
    [a#15        = RPM_Vent_Zuluft ]
    [a#16        = RPM_Vent_Abluft ]
    [a#17        = Bypass ]
    [a#18        = Akt_FehlerCode ]
    [a#19        = Filter_voll_1_0 ]
    [a#20        = Status_Text ]
    [a#21        = Frostschutz ]
    [a#22        = Vorheizung ]
    [a#23        = Info_Vorheizregister ]
    [a#24        = Info_Lüfterstufen_set  ]
    [a#25        = Info_Betriebsstunden ]

    [v#101        = 0 ]

    ###[/DEF]###


    ###[HELP]###
    Der Baustein basiert auf:
    + http://www.see-solutions.de/sonstiges/Protokollbeschreibung_ComfoAir.pdf
    + https://knx-user-forum.de/forum/%C3%B6ffentlicher-bereich/knx-eib-forum/code-schnipsel/21895-comfoair-steuerung-%C3%BCber-rs232?p=881622#post881622

    <u><b>ACHTUNG!</b></u>
    Der Baustein sollte nicht parallel zu einer CC-Ease/-Luxe Bedieneinheit genutzt werden.
    Wenn Pakete von zwei Stellen an die Anlage gesendet werden kann es Kollisionen und Fehlfunktionen/Sch&auml;den kommen.
    Grunds&auml;tzlich gilt: Nutzung auf eigenes Risiko!!!

    <u><b>ACHTUNG!</b></u>
    Die Moxa-Schnittstelle ist bisher ungetestet.
    Grunds&auml;tzlich gilt: Nutzung auf eigenes Risiko!!!

    <u><b>Vorbereitung</b></u>
    Die mitgelieferte Datei phpserial.php muss nach /usr/local/edomi/main/include/php kopiert werden.
    In E10 den Typ der Schnittstelle angeben S=seriell, M=Moxa
    In E2 das Device (z.B. /dev/ttyUSB0) der Seriellen-Schnittstelle oder die IP-Adresse vom Moxa angeben.
    In E11 ggf. den MoxaPort angeben
    In E9 ggf. den Debug-Level &auml;ndern.

    <u><b>Folgende Werte werden ausgelesen wenn E1 != ""</b></u>
    Betrieb_h_Filter: 3739h
    Betrieb_h_Stufe_1 (Abwesend): 846h
    Betrieb_h_Stufe_2: 20225h
    Betrieb_h_Stufe_3: 10557h
    Betrieb_h_Stufe_4: 2007h
    Betrieb_h_Bypass_offen: 7249h
    Komforttemp: 22 °C
    Aussenluft:  8.5 °C
    Zuluft:      18 °C
    Abluft:      19.5 °C
    Fortluft:    10.5 °C
    AKT_STUFE: 2
    Status_Vent_Zuluft: 35 %
    Status_Vent_Abluft: 38 %
    RPM_Vent_Zuluft: 1154 U/min
    RPM_Vent_Abluft: 1236 U/min
    Bypass: 0 %
    Akt_Fehlercode: keiner
    Aktuell kein Fehler - Filter nicht voll

    <u><b>Lüftungs-Stufe setzen</b></u>
    E3 Wert 1-4

    <u><b>Komforttemperatur setzen</b></u>
    E4 Wert 15-25 in 0,5er Schritten

    <u><b>Reset Filter</b></u>
    E5 Wert ungleich 0

    <u><b>Reset Fehler</b></u>
    E6 Wert ungleich 0

    <u><b>LogLevel</b></u>
    0: Emergency
    1: Alert
    2: Critical
    3: Error
    4: Warning
    5: Informational
    6: Debug

    <hr/>
    <b><u>Changelog:</u></b>
    0.1:
    -initiale Version
    0.2:
    -Trigger f&uuml;r Stufe, Komforttemp. und Filter-/Fehler-Reset
    0.3:
    -Bugfix Kommunikations-Timeout beim Setzen von Werten
    0.4:
    -Option für Moxa-Schnittstelle
    -Komforttemperatur kann jetzt in 0.5 Schritten gesetzt werden

    ###[/HELP]###


    ###[LBS]###
    <?
    function LB_LBSID($id) {
        if ($E=getLogicEingangDataAll($id)) {

                if($E[1]['refresh'] && $E[1]['value'] != "") {
                    logic_setVar($id,101,1);
                    LB_LBSID_debug($id,"Trigger Zyklus",5);
                } elseif($E[3]['refresh'] == 1) {
                    if (empty($E[3]['value'])) {
                    LB_LBSID_debug($id,"Stufenwert leer",3);
                    } else {
                    logic_setVar($id,101,3);
                    LB_LBSID_debug($id,"Trigger Stufe",5);
                    }

                } elseif ($E[4]['refresh'] == 1) {
                    if (empty($E[4]['value'])) {
                    LB_LBSID_debug($id,"Temperaturwert leer",3);
                    } else {
                        logic_setVar($id,101,4);
                    LB_LBSID_debug($id,"Trigger Temp",5);
                    }

                } elseif ($E[5]['refresh']==1 && $E[5]['value'] != 0) {
                    logic_setVar($id,101,5);
                    LB_LBSID_debug($id,"Trigger Filter",5);
                } elseif ($E[6]['refresh']==1 && $E[6]['value'] != 0) {
                    logic_setVar($id,101,6);
                    LB_LBSID_debug($id,"Trigger Fehler Reset",5);
                }
    //____________Einstellung_der_einzelnen_Stufen_über_E13_bis_E20________Gernot_09.02.2017______________________________________________________________
    elseif ($E[13]['refresh']==1 && $E[13]['value'] != 0) {
                    logic_setVar($id,101,13);
                    LB_LBSID_debug($id,"Set_ABL_ST_0",5);
                }
    elseif ($E[14]['refresh']==1 && $E[14]['value'] != 0) {
                    logic_setVar($id,101,14);
                    LB_LBSID_debug($id,"Set_ZUL_ST_0",5);
                }
    elseif ($E[15]['refresh']==1 && $E[15]['value'] != 0) {
                    logic_setVar($id,101,15);
                    LB_LBSID_debug($id,"Set_ABL_ST_1",5);
                }
    elseif ($E[16]['refresh']==1 && $E[16]['value'] != 0) {
                    logic_setVar($id,101,16);
                    LB_LBSID_debug($id,"Set_ZUL_ST_1",5);
                }
    elseif ($E[17]['refresh']==1 && $E[17]['value'] != 0) {
                    logic_setVar($id,101,17);
                    LB_LBSID_debug($id,"Set_ABL_ST_2",5);
                }
    elseif ($E[18]['refresh']==1 && $E[18]['value'] != 0) {
                    logic_setVar($id,101,18);
                    LB_LBSID_debug($id,"Set_ZUL_ST_2",5);
                }
    elseif ($E[19]['refresh']==1 && $E[19]['value'] != 0) {
                    logic_setVar($id,101,19);
                    LB_LBSID_debug($id,"Set_ABL_ST_3",5);
                }
    elseif ($E[20]['refresh']==1 && $E[20]['value'] != 0) {
                    logic_setVar($id,101,20);
                    LB_LBSID_debug($id,"Set_ZUL_ST_3",5);
                }
    //____________________________________________________________________________________________________________________________________________________

                $e = logic_getVar($id,101);
                if(in_array($e, array(1,3,4,5,6,13,14,15,16,17,18,19,20)) && getLogicElementStatus($id)==0){    //Erweitert um die Setup Eingänge Gernot
                    setLogicElementStatus($id,1);
                    LB_LBSID_debug($id,"callExec E".$e,6);
                    callLogicFunctionExec(LBSID,$id);                
                }
        }
    }

    function LB_LBSID_debug($id,$s,$l=6) {
        $a=array("Emergency","Alert","Critical","Error","Warning","Informational","Debug");
        $E=logic_getInputs($id);
        $DEBUG=$E[9]['value'];
        $l<=$DEBUG && writeToCustomLog("LBSLBSID",$l,"(ID$id) ".$a[$l].": ".$s);
    }

    ?>
    ###[/LBS]###


    ###[EXEC]###
    <?
    require(dirname(__FILE__)."/../../../../main/include/php/incl_lbsexec.php");
    set_time_limit(60);
    restore_error_handler();
    error_reporting(0);
    ini_set("display_errors", 0);
    sql_connect();

    #Quelle:
    #Idee und Konzeption:
    # Plugin zur Ansteuerung einer Zender ComfoAir
    # Version 1.6.9 15.07.2014 BETA
    # Copyright: swiss (http://knx-user-forum.de/members/swiss.html)
    # Aufbau moeglichst so, dass man unterhalb der Einstellungen nichts veraendern muss!
    # - Neu mit der Moeglichkeit zur Anbindung über einen Moxa NPort von Fechter65 (http://knx-user-forum.de/members/fechter65.html)
    # - Neustrukturierung des Codes von Fechter65 (http://knx-user-forum.de/members/fechter65.html)
    # - Besseres Fehlerhandling bei der Verarbeitung der Reuckmeldungen von swiss (http://knx-user-forum.de/members/swiss.html)
    # - Neu nun mit direktem abfragen der Stufe nach dem setzen und auswerten der Komforttemperatur von swiss (http://knx-user-forum.de/members/swiss.html)
    # - Neu mit der Möglichkeit die Ventilationsstufe direkt zu setzen von swiss (http://knx-user-forum.de/members/swiss.html)
    # - Neu mit der Möglichkeit die Ventilatorstufe für Zuluft und Abluft getrennt zu setzen (0% - 100%) von Netsrac80 (http://knx-user-forum.de/members/netsrac80.html)
    # - Korrektur Stufe direkt setzen. Senden / empfangen hat nun das gleiche Mapping 1=Auto, 2=Sufe1, 3=Stufe2, 4=Stufe3
    # - Neu mit Rückmeldung auf Lesetelegramme
    # - Bugfix: Themperatur wird nach dem Verstellen nicht direkt als Status zurückgegeben

    #Modifikation für Edomi by MSW
    # - Aufbau als Edomi LBS asto (http://knx-user-forum.de/members/asto.html)

    if ($E=getLogicEingangDataAll($id)) {
        $t = logic_getVar($id,101);
        debug($id,"Baustein startet - Trigger: E".$t,6);

        $connection = new stdClass;

        # den Schnittstellentyp festlegen
        if(!empty($E[10]['value'])){
               $connection->sType=$E[10]['value'];
            } else {
                debug($id,"Keinen Schnittstellen-Typ angegeben, Abbruch",0);
                finish();
            }

            #Pfad zur seriellen Schnittstelle oder dem Moxa:
        #$schnittstelle = '/dev/ttyUSB0';
        if(!empty($E[2]['value'])){
               $schnittstelle=$E[2]['value'];
            } else {
                debug($id,"Keine Schnittstelle angegeben, Abbruch",0);
                finish();
            }

        switch($connection->sType){
        case "S":
            #Einrichten der Seriellen Schnittstelle fuer die Kommunikation mit der ComfoAir
            include(dirname(__FILE__)."/../../../../main/include/php/phpserial.php");
            // Let's start the class
            debug($id,"PhpSerial: ".$schnittstelle." erstellen",6);
            $serial = new PhpSerial();

            // First we must specify the device. This works on both linux and windows (if
            // your linux serial device is /dev/ttyS0 for COM1, etc)
            $serial->deviceSet($schnittstelle);

            // We can change the baud rate, parity, length, stop bits, flow control
            $serial->confBaudRate(9600);
            $serial->confParity("none");
            $serial->confCharacterLength(8);
            $serial->confStopBits(1);
            $serial->confFlowControl("custom");

            if(! $serial->deviceOpen()){
              debug($id,"Schnittstelle: ".$schnittstelle." nicht geoeffnet",0);
              finish();
            }

            usleep(500);//delay

            $connection->target = $serial;

            debug($id,"Schnittstelle: ".$schnittstelle." erfolgreich geoeffnet",5);
            break;
        case "M":
            #Port am Moxa:
            if(!empty($E[11]['value'])){
               $port=$E[11]['value'];
            } else {
                debug($id,"Keinen MoxaPort angegeben, Abbruch",0);
                finish();
            }        

            /* Einen TCP/IP-Socket erzeugen. */
            $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
            if ($socket === false) {
                debug($id,"socket_create() fehlgeschlagen: Grund: " . socket_strerror(socket_last_error()) . ", Abbruch",0);
                finish();
            } else {
                debug($id,"socket_create() OK.",5);
            }

            debug($id,"Versuche, Moxa '".$schnittstelle."' auf Port '".$port."' zu verbinden ...",6);
            $result = socket_connect($socket, $schnittstelle, $port);
            if ($result === false) {
                debug($id,"socket_connect() fehlgeschlagen. Grund: ($result) " . socket_strerror(socket_last_error($socket)) . ", Abbruch",0);
                finish();
            } else {
                debug($id,"socket_connect() OK.",5);
            }

            $connection->target = $socket;        

            break;
        default:
            debug($id,"Kein passender Schnittstellen-Typ: '".$connection->sType."' angegeben!",0);
        }

        if ($t == 3) {
            if (empty($E[3]['value'])) {
            debug($id,"Stufenwert leer",3);
            } elseif ( (intval($E[3]['value']) >= 1) && (intval($E[3]['value']) <= 4) ) {
            $daten = "0099010".intval($E[3]['value']);
            debug($id,"Stufe setzen auf: ".intval($E[3]['value']),5);
            command_senden($id,$connection, $daten);
            }
            command_read($id,$connection, "00CD00");

        } elseif ($t == 4) {
            if (empty($E[4]['value'])) {
            debug($id,"Temperaturwert leer",3);
            } elseif ((intval($E[4]['value']) >= 15) && (intval($E[4]['value']) <= 25)) {
            $value = (float)str_replace(',', '.', $E[4]['value']);
            $value = round($value * 2) / 2;
            debug($id,"Komforttemperatur setzen auf: ".$value,5);

            #Rechne die Temperatur fuer die Co$
            $temphex = ($value + 20) * 2;
            # Mache einen HEX-Wert
            $temphex = sprintf("%x", $temphex);

            $daten = "00D301".$temphex;
            command_senden($id,$connection, $daten);
            }
            command_read($id,$connection, "00D100");

        } elseif ($t==5 && $E[5]['value'] != 0) {
            command_senden($id,$connection, "00DB0400000001");
            debug($id,"Filter wurde zurueckgesetzt",5);
            command_read($id,$connection, "00D900");

        } elseif ($t==6 && $E[6]['value'] != 0) {
            command_senden($id,$connection, "00DB0401000000");
            debug($id,"Fehlermeldung wurde zurueckgesetzt",5);
            command_read($id,$connection, "00D900");
        }
    //____________Einstellung_der_einzelnen_Stufen_über_E13_bis_E20________Gernot_09.02.2017______________________________________________________________
    elseif(in_array($t, array(13,14,15,16,17,18,19,20)))
    {
        $statusSTUFEN = command_senden($id,$connection, "00CD00");
        if (validateReturnString($id,$statusSTUFEN))
        {
            $Befehl = "00CF09";
            $statusSTUFEN = ''.substr($statusSTUFEN, 6, 12).substr($statusSTUFEN, 26, 4).'';
            switch($t)
            {
                case 13:    //ABL_0
                    if((intval($E[13]['value']) >= 15) && (intval($E[13]['value']) <= 97))
                    {
                        $value = strtoupper(str_pad(dechex($E[13]['value']), 2 ,'0', STR_PAD_LEFT)); //$E[13] > in hex > 2Stellig mit führender 0 links > Großbuchstaben
                        $daten=''.$value.substr($statusSTUFEN, 2, 14).'00';
                        command_senden($id,$connection, $Befehl.$daten);
                    }
                    break;

                case 14:    //ABL_1
                    if((intval($E[14]['value']) >= 16) && (intval($E[14]['value']) <= 98)){
                        $value = strtoupper(str_pad(dechex($E[14]['value']), 2 ,'0', STR_PAD_LEFT));
                        $daten=''.substr($statusSTUFEN, 0, 2).$value.substr($statusSTUFEN, 4, 12).'00';
                        command_senden($id,$connection, $Befehl.$daten);
                    }
                    break;

                case 15:    //ABL_2
                    if((intval($E[15]['value']) >= 17) && (intval($E[15]['value']) <= 99)){
                        $value = strtoupper(str_pad(dechex($E[15]['value']), 2 ,'0', STR_PAD_LEFT));
                        $daten=''.substr($statusSTUFEN, 0, 4).$value.substr($statusSTUFEN, 6, 10).'00';
                        command_senden($id,$connection, $Befehl.$daten);
                    }
                    break;

                case 16:    //ZUL_0
                    if((intval($E[16]['value']) >= 15) && (intval($E[16]['value']) <= 97)){
                        $value = strtoupper(str_pad(dechex($E[16]['value']), 2 ,'0', STR_PAD_LEFT));
                        $daten=''.substr($statusSTUFEN, 0, 6).$value.substr($statusSTUFEN, 8, 8).'00';
                        command_senden($id,$connection, $Befehl.$daten);
                    }
                    break;

                case 17:    //ZUL_1
                    if((intval($E[17]['value']) >= 16) && (intval($E[17]['value']) <= 98)){
                        $value = strtoupper(str_pad(dechex($E[17]['value']), 2 ,'0', STR_PAD_LEFT));
                        $daten=''.substr($statusSTUFEN, 0, 8).$value.substr($statusSTUFEN, 10, 6).'00';
                        command_senden($id,$connection, $Befehl.$daten);
                    }
                    break;

                case 18:    //ZUL_2
                    if((intval($E[18]['value']) >= 17) && (intval($E[18]['value']) <= 99)){
                        $value = strtoupper(str_pad(dechex($E[18]['value']), 2 ,'0', STR_PAD_LEFT));
                        $daten=''.substr($statusSTUFEN, 0, 10).$value.substr($statusSTUFEN, 12, 4).'00';
                        command_senden($id,$connection, $Befehl.$daten);
                    }
                    break;

                case 19:    //ABL_3
                    if((intval($E[19]['value']) >= 18) && (intval($E[19]['value']) <= 100)){
                        $value = strtoupper(str_pad(dechex($E[19]['value']), 2 ,'0', STR_PAD_LEFT));
                        $daten=''.substr($statusSTUFEN, 0, 12).$value.substr($statusSTUFEN, 14, 2).'00';
                        command_senden($id,$connection, $Befehl.$daten);
                    }
                    break;

                case 20:    //ZUL_3
                    if((intval($E[20]['value']) >= 18) && (intval($E[20]['value']) <= 100)){
                        $value = strtoupper(str_pad(dechex($E[20]['value']), 2 ,'0', STR_PAD_LEFT));
                        $daten=''.substr($statusSTUFEN, 0, 14).$value.'00';
                        command_senden($id,$connection, $Befehl.$daten);
                    }
                    break;

                default:
                    break;
            }
        command_read($id,$connection, "00CD00");
        }
    }
    //____________________________________________________________________________________________________________________________________________________
        else {
            command_readAll($id,$connection);
        }

        finish();
    }

    function command_read($id,$connection,$request){
        $return = command_senden($id,$connection, $request);
        if (validateReturnString($id,$return)) {
            getValuesOfString($id,$return);
        }
    }

    function command_readAll($id,$connection) {

        $daten = array();

        #Daten der Anlage abfragen
        $daten[] = "00DD00";

        #Temperaturen
        $daten[] = "00D100";

        #Ventilatorstufe
        $daten[] = "00CD00";

        #Status Ventilator
        $daten[] = "000B00";

        #Status Bypass
        $daten[] = "000D00";

        #Fehlercodes
        $daten[] = "00D900";

    //____________Erweiterung_für_Infoboxen________Gernot_09.02.2017______________________________________________________________________________________
        #Status Vorheizung
        $daten[] = "00E100";

        #Status Bootloader
    //    $daten[] = "006700";

        #Status Firmware
    //    $daten[] = "006900";

        #Status Analogwerte
    //    $daten[] = "009D00";
    //____________________________________________________________________________________________________________________________________________________
        foreach($daten as $request){
          command_read($id, $connection, $request);
        }

        debug($id,"ENDE zyklische Abfrage",5);
    }

    function validateReturnString($id, &$reciv) {

        $laenge;
        #Laenge des empfangenen Datenstrings nach dem kuerzen
        $checksum = 0;
        #Checksumme
        $rcv_checksum = "";

        #solange das Ende nicht 070F lautet
        while ((strlen($reciv) > 3) && (substr($reciv, (strlen($reciv) - 4), 4) != '070F')){
            debug($id,"String vor Kuerzung Ende: ". $reciv,6);
            $reciv = substr($reciv, 0, -2);
            #String um die letzten zwei Zeichen kuerzen
            debug($id,"String nach Kuerzung Ende: ". $reciv,6);
        }

        #Hier wird der empfangene String um Start- und Endbyte gekuerzt
        $laenge = strlen($reciv);
        #Laenge des Antworttelegramms ermitteln
        $reciv = substr($reciv, 0, ($laenge - 4));
        #Entferne 07F0 vom Ende

        if (substr($reciv, (strlen($reciv) - 4), 4) == '07F3') {
            $reciv = substr($reciv, 0, ($laenge - 4));
            debug($id,"String ohne 07F3: ". $reciv,6);
        }

        debug($id,"Erste 4 Byte des Datenpakets: ". (substr($reciv, 0, 4)),6);

        while ((strlen($reciv) > 3) && (substr($reciv, 0, 4)) != '07F0') {
            $reciv = substr($reciv, 2);
            #falls noch falsche Zeichen am Anfang des Strings enthalten sind, werden diese hier entfernt.
            debug($id,"reciv gekuerzt: ". $reciv,6);
        }

        $reciv = substr($reciv, 4);
        debug($id,"String ohne 07F0 am Anfang: ". $reciv,6);

        #Test einer Methode falls aussversehen mehrere Datenpakete auf einmal im Datenstring enthalten sind...
        if (stristr($reciv, "07F307F0") !== false) {
            $dataarray = preg_split("/07F307F0/i", $reciv);
            $reciv = $dataarray[0];
        }

        #Nun wird die Checksumme gelesen und aus dem Datenstring entfernt
        $checksum = 0;
        $checksum = substr($reciv, -2, 2);
        debug($id,"Checksumme gelesen: ". $checksum,6);

        $laenge = strlen($reciv);
        #Laenge des Antworttelegramms ermitteln
        $reciv = substr($reciv, 0, ($laenge - 2));
        debug($id,"Datenpaket ohne Checksumme: ". $reciv,6);

        #Hier wird die Subroutine für die Berechnung der Checksumme aufgerufen und das Ergebnis in $rcv_checksum zurueck gegeben
        $rcv_checksum = checksum_berechnen($id,$reciv);

        if ($rcv_checksum == $checksum) {
        debug($id,"Checksumme OK",6);    
        }
        #Hier werden die doppelten 07 aus dem Antwortstring entfernt.
        debug($id,"String vor 07 Bereinigung: ". $reciv,6);
        $reciv = preg_replace("/0707/", "07", $reciv);
        debug($id,"String nach 07 Bereinigung: ". $reciv,6);

        return $rcv_checksum == $checksum;

    }

    function command_senden($id, $connection, $data) {

        if (!is_object($connection) || empty($data) || !is_string($data)) {
            debug($id,"Fehler in command_senden Parametern, Abbruch",0);
            finish();
        }

        #Weitere Variablen die benoetigt werden

        #Serial Input = Empangener Datenstrom
        $sin = "";
        #Counter Input =  Länge des Datenpakets
        $cin = "";
        $reciv = "";
        $ack = pack("H*", "07F3");

        debug($id,"cmdSenden - Request: ". $data,6);

        $checksum = checksum_berechnen($id, $data);
        debug($id,"Checksumme aus der Subroutine: " . $checksum,6);

        $command = pack("H*", "07F0".$data.$checksum."070F");

        #Befehl an die ComfoAir senden
        if($connection->sType == "S"){
        $connection->target->sendMessage($command);
        }
        if($connection->sType == "M"){
        socket_write($connection->target, $command, strlen($command));    
        }


        /**
         * Hier ist eine Warteschleife für die Rueckmeldung eingebaut
         */
        $lastAccess = time();
        while (true) {

        if($connection->sType == "S"){
                $sin = $connection->target->readPort(45);
        }
        if($connection->sType == "M"){
    //        $sin = socket_read($connection->target, 45);                //auskommentiert von Gernot
            socket_recv($connection->target, $sin, 45, MSG_DONTWAIT);    //socket_recv verwendet
            }                                                            //socket_read block > (bug in einer while Schleife,kann nicht abgebrochen werden)

            $cin = strlen($sin);
            if ($cin > 0) {
                $sin = unpack("H*", $sin);
                $reciv .= strtoupper(array_shift($sin));

                //debug($id,$reciv,6);

                $lastAccess = time();
            }

            if ($reciv == "07F3") {
                debug($id,"Exit ACK only",6);
                break;
            }

            if (stristr($reciv, "070F") !== false) {
                if (substr($reciv, (strlen($reciv) - 6), 6) != '07070F') {
                    debug($id,"Exit 07070F",6);
                    break;
                }
            }

            if (time()-$lastAccess > 5) {
                debug($id,"Exit command_senden() timeout!",3);
                break;
            }
        usleep(200);
       }
        #ACK senden
            if($connection->sType == "S"){

                $sin = $connection->target->sendMessage($ack);
        }
        if($connection->sType == "M"){
            socket_write($connection->target, $ack, strlen($ack));    
           }


        debug($id,"ACK gesendet",6);

        if (empty($reciv)) {
            debug($id,"FEHLER: Keine Daten empfangen!",3);

            return null;
        }

        return $reciv;
    }

    function getValuesOfString($id,$reciv) {

        if (strstr($reciv, "00D209") !== false) {#Wenn die Temperaturen empfangen wurden
            $t1 = substr($reciv, 6, 2);
            $t2 = substr($reciv, 8, 2);
            $t3 = substr($reciv, 10, 2);
            $t4 = substr($reciv, 12, 2);
            $t5 = substr($reciv, 14, 2);

            #Hier werden die Temperaturen "decodiert" damit sie einen Sinn ergeben
            $t1 = (hexdec($t1) / 2) - 20;
            $t2 = (hexdec($t2) / 2) - 20;
            $t3 = (hexdec($t3) / 2) - 20;
            $t4 = (hexdec($t4) / 2) - 20;
            $t5 = (hexdec($t5) / 2) - 20;

        /*
        [a#7        = Komforttemp ]
        [a#8        = Aussenluft ]
        [a#9        = Zuluft ]
        [a#10        = Abluft ]
        [a#11        = Fortluft ]
        */

        logic_setOutput($id,7,$t1);
        debug($id,"Komforttemp: " . $t1 . " °C",5);

        logic_setOutput($id,8,$t2);
        debug($id,"Aussenluft:  " . $t2 . " °C",5);

        logic_setOutput($id,9,$t3);
        debug($id,"Zuluft:      " . $t3 . " °C",5);

        logic_setOutput($id,10,$t4);
        debug($id,"Abluft:      " . $t4 . " °C",5);

        logic_setOutput($id,11,$t5);
        debug($id,"Fortluft:    " . $t5 . " °C",5);
        }
    //__________Vorheizregister Status_____________Gernot_16.02.2017______________________________________________________________________________________
        elseif (strstr($reciv, "00E206") !== false) {
            $klappe = substr($reciv, 6, 2);
            $frostschutz = substr($reciv, 8, 2);
            $vorhzg = substr($reciv, 10, 2);
            $frost_minuten = substr($reciv, 12, 4);
            $frostsicherheit = substr($reciv, 16, 2);
        /*
        [a#21        = Frostschutz ]
        [a#22        = Vorheizung ]
        */

        logic_setOutput($id,21,hexdec($frostschutz));
        debug($id,"Status Frostschutz: " . hexdec($frostschutz) . " ",5);

        logic_setOutput($id,22,hexdec($vorhzg));
        debug($id,"Status Vorheizung: " . hexdec($vorhzg) . " ",5);

    $InfoBox = 'Klappe                : '.hexdec($klappe).'
    Frostschutz            : '.hexdec($frostschutz).'
    Vorheizung            : '.hexdec($vorhzg).'
    Frostminuten        : '.hexdec($frost_minuten).'
    Frostsicherheit        : '.hexdec($frostsicherheit).'';

        logic_setOutput($id,23,$InfoBox);

        }
    //____________________________________________________________________________________________________________________________________________________
        elseif (strstr($reciv, "009814") !== false) {#Wenn die Sensordaten empfangen wurden
            $s1 = substr($reciv, 6, 2);
            $s2 = substr($reciv, 8, 2);  

            #Hier werden die Sensordaten "decodiert"
            $s1 = (hexdec($s1) / 2) - 20;
            $s2 = hexdec($s2);

            #print "Enthalpie Temp: " . $s1 . " °C\n";
            #print "Enthalpie Feuchte:  " . $s2 . " %\n";

        } elseif (strstr($reciv, "000C06") !== false) {#Wenn der Status fuer die Ventilatoren empfangen wurden
            $vent_zul = substr($reciv, 6, 2);
            $vent_abl = substr($reciv, 8, 2);
            $speed_zul = substr($reciv, 10, 4);
            $speed_abl = substr($reciv, 14, 4);

        /*

        [a#13        = Stat_Vent_Zuluft ]
        [a#14        = Stat_Vent_Abluft ]
        [a#15        = RPM_Vent_Zuluft ]
        [a#16        = RPM_Vent_Abluft ]

        */


        logic_setOutput($id,13,hexdec($vent_zul));
        debug($id,"Status Ventilator Zuluft: " . hexdec($vent_zul) . " %",5);

        logic_setOutput($id,14,hexdec($vent_abl));
        debug($id,"Status Ventilator Abluft: " . hexdec($vent_abl) . " %",5);

        logic_setOutput($id,15,intval(1875000 / hexdec($speed_zul)));
        debug($id,sprintf("Drehzahl Ventilator Zuluft: %d U/min", (1875000 / hexdec($speed_zul))),5);

        logic_setOutput($id,16,intval(1875000 / hexdec($speed_abl)));
        debug($id,sprintf("Drehzahl Ventilator Abluft: %d U/min", (1875000 / hexdec($speed_abl))),5);


        } elseif (strstr($reciv, "00CE0E") !== false) {#Wenn der Status der Ventilatorenstufe empfangen wurden
            $akt_stufe = substr($reciv, 22, 2);
        /*
        [a#12        = AKT_STUFE ]
        */

        logic_setOutput($id,12,hexdec($akt_stufe));
        debug($id,"AKT_STUFE: ". hexdec($akt_stufe),5);
    //__________Statusbox_Lüfterstufen_____________Gernot_16.02.2017______________________________________________________________________________________
    $InfoBox = 'Abluft Stufe 0 abwesend       : '.hexdec(substr($reciv, 6, 2)).'%
    Zuluft Stufe 0 abwesend        : '.hexdec(substr($reciv, 12, 2)).'%
    Abluft Stufe 1                : '.hexdec(substr($reciv, 8, 2)).'%
    Zuluft Stufe 1                : '.hexdec(substr($reciv, 14, 2)).'%
    Abluft Stufe 2                : '.hexdec(substr($reciv, 10, 2)).'%
    Zuluft Stufe 2                : '.hexdec(substr($reciv, 16, 2)).'%
    Abluft Stufe 3                : '.hexdec(substr($reciv, 26, 2)).'%
    Zuluft Stufe 3                : '.hexdec(substr($reciv, 28, 2)).'%
    Info:
    Abluft aktuell                : '.hexdec(substr($reciv, 18, 2)).'%
    Zuluft aktuell                : '.hexdec(substr($reciv, 20, 2)).'%
    Aktuelle Stufe                : '.hexdec(substr($reciv, 22, 2)).'
    Zuluft Ventilator 1=aktiv    : '.hexdec(substr($reciv, 24, 2)).'';

        logic_setOutput($id,24,$InfoBox);

        }
    //____________________________________________________________________________________________________________________________________________________
        elseif (strstr($reciv, "000E04") !== false) {#Wenn der Status fuer die Bypassklappe empfangen wurden
            $bypass_prozent = substr($reciv, 6, 2);

        logic_setOutput($id,17,hexdec($bypass_prozent));
        debug($id,"Bypass: ". hexdec($bypass_prozent),5);

        /*
        [a#17        = Bypass ]
        */
        }
        elseif (strstr($reciv, "00DE14") !== false) {#Wenn die Rueckmeldung der Betriebsstunden empfangen wurden
        /*
        [a#1        = Betrieb_h_Filter ]
        [a#2        = Betrieb_h_Stufe_1 ]
        [a#3        = Betrieb_h_Stufe_2 ]
        [a#4        = Betrieb_h_Stufe_3 ]
        [a#5        = Betrieb_h_Stufe_4 ]
        [a#6        = Betrieb_h_Bypass_offen ]
        */
    //_____Statusbox_Betriebsstunden____________________Gernot_16.02.2017_________________________________________________________________________________
    $BetribsstundenInfoBox = '
    Filter            : '.hexdec(substr($reciv, 36, 4)).'h
    Stufe Abwesend    : '.hexdec(substr($reciv, 6, 6)).'h
    Stufe 1            : '.hexdec(substr($reciv, 12, 6)).'h
    Stufe 2            : '.hexdec(substr($reciv, 18, 6)).'h
    Stufe 3            : '.hexdec(substr($reciv, 40, 6)).'h
    Frost            : '.hexdec(substr($reciv, 24, 4)).'h
    Vorheizung        : '.hexdec(substr($reciv, 28, 4)).'h
    Bypass            : '.hexdec(substr($reciv, 32, 4)).'h
    ';
        logic_setOutput($id,25,$BetribsstundenInfoBox);
    //____________________________________________________________________________________________________________________________________________________

        logic_setOutput($id,2,hexdec(substr($reciv, 6, 6)));
        debug($id,"Betriebsstunden Stufe 0 (Abwesend): ". hexdec(substr($reciv, 6, 6)) . "h",5);

        logic_setOutput($id,3,hexdec(substr($reciv, 12, 6)));
        debug($id,"Betriebsstunden Stufe 1: ". hexdec(substr($reciv, 12, 6)) . "h",5);

        logic_setOutput($id,4,hexdec(substr($reciv, 18, 6)));
        debug($id,"Betriebsstunden Stufe 2: ". hexdec(substr($reciv, 18, 6)) . "h",5);

        debug($id,"Betriebsstunden Frost: ". hexdec(substr($reciv, 24, 4)) . "h",5);

        debug($id,"Betriebsstunden Vorheizung: ". hexdec(substr($reciv, 28, 4)) . "h",5);

        logic_setOutput($id,6,hexdec(substr($reciv, 32, 4)));
        debug($id,"Betriebsstunden Bypass offen: ". hexdec(substr($reciv, 32, 4)) . "h",5);

        logic_setOutput($id,1,hexdec(substr($reciv, 36, 4)));
        debug($id,"Betriebsstunden Filter: ". hexdec(substr($reciv, 36, 4)) . "h",5);

        logic_setOutput($id,5,hexdec(substr($reciv, 40, 6)));
        debug($id,"Betriebsstunden Stufe 3: ". hexdec(substr($reciv, 40, 6)) . "h",5);
        }
        elseif (strstr($reciv, "00DA11") !== false) {#Wenn die Rueckmeldung der Stoermeldungen empfangen wurde

            $fehlerAlo = substr($reciv, 6, 2);
            $fehlerAhi = substr($reciv, 30, 2);
            $fehlerE = substr($reciv, 8, 2);
            $fehlerFilter = substr($reciv, 22, 2);
            $fehlerEA = substr($reciv, 24, 2);
            $numAlo = '';
            $numAhi = '';
            $numE = '';
            $numEA = '';

            $numAlo .= sprintf('%08b', hexdec($fehlerAlo));
            $numAhi .= sprintf('%08b', hexdec($fehlerAhi));
            $numE .= sprintf('%08b', hexdec($fehlerE));
            $numEA .= sprintf('%08b', hexdec($fehlerAlo));

            $fehlerAlo = strrev($numAlo);
            #Wandle den Wert in Binaer und drehe die Reihenfolge um. z.B 0x02 = 00000010 = 010000000
            $fehlerAlo = strpos($fehlerAlo, '1') !== false ? strpos($fehlerAlo, '1') + 1 : 0;
            # Zaehle an welcher Stelle die 1 auftaucht (von links gelesen) z.B. 01000000 = INDEX 2 = Fehler2

            if ($fehlerAhi != '00') {
                $fehlerAhi = strpos(strrev($numAhi), '1') + 9;
            } else {
                $fehlerAhi = '';
            }

            $fehlerE = strpos(strrev($numE), '1') !== false ? strpos(strrev($numE), '1') + 1 : 0;
            $fehlerEA = strpos(strrev($numEA), '1') !== false ? strpos(strrev($numEA), '1') + 1 : 0;
            if ($fehlerAhi == 16) {
                $fehlerAhi = 0;
            }

        /*
        [a#18        = Akt_FehlerCode ]
        [a#19        = Filter_voll_1_0 ]
        [a#20        = Status_Text ]
        */

            if ($fehlerAlo > 0) {
                $aktFC = 'A' . $fehlerAlo;
            } elseif ($fehlerAhi != '') {
                $aktFC = 'A' . $fehlerAhi;
            } elseif ($fehlerE > 0) {
                $aktFC = 'E' . $fehlerE;
            } elseif ($fehlerEA > 0) {
                $aktFC = 'EA' . $fehlerEA;
            } else {
                $aktFC = '';
            }

            if (hexdec($fehlerFilter) > 0) {
            $filterFlag = 1;
            } else {
            $filterFlag = 0;
            }

        $statText = ($aktFC == '' ? 'Aktuell kein Fehler' : 'Fehler: '.$aktFC);
         $statText .= ' - '.($filterFlag == 0 ? 'Filter nicht voll' : 'Filter voll');

        logic_setOutput($id,18,$aktFC);
        debug($id,"FehlerCode: ".$aktFC,5);

        logic_setOutput($id,19,$filterFlag);
        debug($id,"Filter voll: ".$filterFlag,5);

        logic_setOutput($id,20,$statText);
        debug($id,"Status Text: ".$statText,5);
        }
    //____________Bootloader_Firmware_Analogwerte_______________________Gernot_16.02.2017_________________________________________________________________
    /*
    elseif (strstr($reciv, "00680D") !== false) {//Bootloader

    $InfoBox = '**************************
    *       Bootloader       *
    **************************
    Version        : '.hexdec(substr($reciv, 6, 2)).'.'.hexdec(substr($reciv, 8, 2)).'.'.hexdec(substr($reciv, 10, 2)).'
    Geräte Name    : '.substr($reciv, 12, 20).'';
        logic_setOutput($id,27,$InfoBox);
    }

    elseif (strstr($reciv, "006A0D") !== false) {//Firmware

    $InfoBox = 'Version        : '.hexdec(substr($reciv, 6, 2)).'.'.hexdec(substr($reciv, 8, 2)).'.'.hexdec(substr($reciv, 10, 2)).'';
    //Geräte Name    : '.substr($reciv, 12, 20).'

        logic_setOutput($id,26,$InfoBox);
    }

    elseif (strstr($reciv, "009E13") !== false) {//Analogwerte abrufen

    $InfoBox = 'Analog 1 Min. Einstellung (%)  : '.hexdec(substr($reciv, 12, 2)).'
    Analog 1 Max. Einstellung (%)  : '.hexdec(substr($reciv, 14, 2)).'
    Analog 1 Sollwert (%)          : '.hexdec(substr($reciv, 16, 2)).'
    Analog 2 Min. Einstellung (%)  : '.hexdec(substr($reciv, 18, 2)).'
    Analog 2 Max. Einstellung (%)  : '.hexdec(substr($reciv, 20, 2)).'
    Analog 2 Sollwert (%)          : '.hexdec(substr($reciv, 22, 2)).'
    Analog 3 Min. Einstellung (%)  : '.hexdec(substr($reciv, 24, 2)).'
    Analog 3 Max. Einstellung (%)  : '.hexdec(substr($reciv, 26, 2)).'
    Analog 3 Sollwert (%)          : '.hexdec(substr($reciv, 28, 2)).'
    Analog 4 Min. Einstellung (%)  : '.hexdec(substr($reciv, 30, 2)).'
    Analog 4 Max. Einstellung (%)  : '.hexdec(substr($reciv, 32, 2)).'
    Analog 4 Sollwert (%)          : '.hexdec(substr($reciv, 34, 2)).'
    Analog RF Min. Einstellung (%) : '.hexdec(substr($reciv, 36, 2)).'
    Analog RF Max. Einstellung (%) : '.hexdec(substr($reciv, 38, 2)).'
    Analog RF Sollwert (%)         : '.hexdec(substr($reciv, 40, 2)).'
    Priorität Regelung 1 = WochenP : '.hexdec(substr($reciv, 42, 2)).'
    ';
        logic_setOutput($id,29,$InfoBox);
    }
    */
    //____________________________________________________________________________________________________________________________________________________

    }

    function checksum_berechnen($id,$chk_datasum) {

        $rcv_checksum = 0;
        $i;
        $chk_datasum = $chk_datasum . "AD";
        #+173 fuer die Checksummenberechnung
       debug($id,"String fuer die Berechnung der Checksumme: ". $chk_datasum,6);

        $x07warschon = 0;
        #Hilfsvariable für die Checksummenberechnung
        $laenge = strlen($chk_datasum);
        for ($i = 0; $i < $laenge; $i++) {
            $wertstring = substr($chk_datasum, $i, 2);
            $wertbetrag = hexdec($wertstring);
            if ($wertbetrag == 7) {
                if ($x07warschon == 1) {
                    $x07warschon = 0;
                    $i++;
                    continue;
                } else {
                    $x07warschon = 1;
                }
            }
            $rcv_checksum += $wertbetrag;

            $i++;
        }


        debug($id,"Checksumme vor der Umwandlung: ". $rcv_checksum,6);

        $rcv_checksum = sprintf("%X\n", $rcv_checksum);
        #Mache aus Integer wieder HEX
        debug($id,"Checksumme vor der Kuerzung: ". $rcv_checksum,6);

        $rcv_checksum = substr($rcv_checksum, -3, 2);
        #Verwende nur die letzten beiden Stellen
        debug($id,"Checksumme nach der Kuerzung: ". $rcv_checksum,6);

        return $rcv_checksum;
    } #Ende checksum_berechnen

    function finish() {
        global $DEBUG,$id,$connection;

        if($connection->sType == "S"){
            $connection->target->deviceClose();
        }
        if($connection->sType == "M"){
            socket_shutdown($socket,2);
            socket_close($connection->target);
        }

        $DEBUG && debug($id,"Baustein beendet");
        logic_setVar($id,101,0);
        setLogicElementStatus($id,0);  
        sql_disconnect();

        exit();
    }

    function debug($id,$s,$l=6) {
        $a=array("Emergency","Alert","Critical","Error","Warning","Informational","Debug");
        $E=logic_getInputs($id);
        $DEBUG=$E[9]['value'];
        $l<=$DEBUG && writeToCustomLog("LBS19000680",$l,"(ID$id) ".$a[$l].": ".$s);
    }
    ?>
    ###[/EXEC]###

    Einen Kommentar schreiben:


  • murelli146
    antwortet
    So, ich habe mich mal an dem Baustein versucht.

    Da ich keine Steuerung besitze und meine comfoair350 mal justieren wollte habe ich mir ein kleines Setup programmiert.
    Ein Vorheizregister ist auch vorhanden. Bei bedarf kann man die Codeschnipsel ja in die Download-Version übernehmen.
    Bei den Info Ausgängen habe ich Informationen gruppiert um sie einfacher in die Visu einbinden zu können. (Infoboxen)

    Folgende Ein- und Ausgänge sind hinzugekommen:

    PHP-Code:
    [e#13 TRIGGER     = ABL_0 ]
    [e#14 TRIGGER     = ABL_1 ]
    [e#15 TRIGGER     = ABL_2 ]
    [e#16 TRIGGER     = ZUL_0 ]
    [e#17 TRIGGER     = ZUL_1 ]
    [e#18 TRIGGER     = ZUL_2 ]
    [e#19 TRIGGER     = ABL_3 ]
    [e#20 TRIGGER     = ZUL_3 ]

    [a#21        = Frostschutz ]
    [a#22        = Vorheizung ]
    [a#23        = Info_Vorheizregister ]
    [a#24        = Info_Lüfterstufen_set  ]
    [a#25        = Info_Betriebsstunden ] 


    Der erweiterte LBS Teil:
    PHP-Code:
                } elseif ($E[6]['refresh']==&& $E[6]['value'] != 0) {
                    
    logic_setVar($id,101,6);
                    
    LB_LBSID_debug($id,"Trigger Fehler Reset",5);
                }
    //____________Einstellung_der_einzelnen_Stufen_über_E13_bis_E20________Gernot_09.02.2017___
    elseif ($E[13]['refresh']==&& $E[13]['value'] != 0) {
                    
    logic_setVar($id,101,13);
                    
    LB_LBSID_debug($id,"Set_ABL_ST_0",5);
                }
    elseif (
    $E[14]['refresh']==&& $E[14]['value'] != 0) {
                    
    logic_setVar($id,101,14);
                    
    LB_LBSID_debug($id,"Set_ZUL_ST_0",5);
                }
    elseif (
    $E[15]['refresh']==&& $E[15]['value'] != 0) {
                    
    logic_setVar($id,101,15);
                    
    LB_LBSID_debug($id,"Set_ABL_ST_1",5);
                }
    elseif (
    $E[16]['refresh']==&& $E[16]['value'] != 0) {
                    
    logic_setVar($id,101,16);
                    
    LB_LBSID_debug($id,"Set_ZUL_ST_1",5);
                }
    elseif (
    $E[17]['refresh']==&& $E[17]['value'] != 0) {
                    
    logic_setVar($id,101,17);
                    
    LB_LBSID_debug($id,"Set_ABL_ST_2",5);
                }
    elseif (
    $E[18]['refresh']==&& $E[18]['value'] != 0) {
                    
    logic_setVar($id,101,18);
                    
    LB_LBSID_debug($id,"Set_ZUL_ST_2",5);
                }
    elseif (
    $E[19]['refresh']==&& $E[19]['value'] != 0) {
                    
    logic_setVar($id,101,19);
                    
    LB_LBSID_debug($id,"Set_ABL_ST_3",5);
                }
    elseif (
    $E[20]['refresh']==&& $E[20]['value'] != 0) {
                    
    logic_setVar($id,101,20);
                    
    LB_LBSID_debug($id,"Set_ZUL_ST_3",5);
                }
    //_____________________________________________________________________________________

                
    $e logic_getVar($id,101);
                if(
    in_array($e, array(1,3,4,5,6,13,14,15,16,17,18,19,20)) && getLogicElementStatus($id)==0){    //Erweitert um die Setup Eingänge Gernot
                    
    setLogicElementStatus($id,1);
                    
    LB_LBSID_debug($id,"callExec E".$e,6);
                    
    callLogicFunctionExec(LBSID,$id);                
                } 

    Die Lüfterstufen Einstellung habe ich folgender maßen realisiert:
    Bei einer Werteingabe an den Eingängen 13-20 wird der LBS getriggert.
    In der Hauptschleife wird zuerst die aktuelle Einstellung gelesen, der angegebene Wert ersetzt und das gesamte Setup zurückgeschrieben.
    Zuletzt wird das aktuelle Setup nochmal gelesen und über die Infobox ausgegeben.
    PHP-Code:
    //____________Einstellung_der_einzelnen_Stufen_über_E13_bis_E20________Gernot_09.02.2017__
    elseif(in_array($t, array(13,14,15,16,17,18,19,20)))
    {
        
    $statusSTUFEN command_senden($id,$connection"00CD00");
        if (
    validateReturnString($id,$statusSTUFEN))
        {
            
    $Befehl "00CF09";
            
    $statusSTUFEN ''.substr($statusSTUFEN612).substr($statusSTUFEN264).'';
            switch(
    $t)
            {
                case 
    13:    //ABL_0
                    
    if((intval($E[13]['value']) >= 15) && (intval($E[13]['value']) <= 97))
                    {                          
    //$E[13] > in hex > 2Stellig mit führender 0 links > Großbuchstaben
                        
    $value strtoupper(str_pad(dechex($E[13]['value']), ,'0'STR_PAD_LEFT));
                        
    $daten=''.$value.substr($statusSTUFEN214).'00';
                        
    command_senden($id,$connection$Befehl.$daten);
                    }
                    break;

                case 
    14:    //ABL_1
                    
    if((intval($E[14]['value']) >= 16) && (intval($E[14]['value']) <= 98)){
                        
    $value strtoupper(str_pad(dechex($E[14]['value']), ,'0'STR_PAD_LEFT));
                        
    $daten=''.substr($statusSTUFEN02).$value.substr($statusSTUFEN412).'00';
                        
    command_senden($id,$connection$Befehl.$daten);
                    }
                    break;

                case 
    15:    //ABL_2
                    
    if((intval($E[15]['value']) >= 17) && (intval($E[15]['value']) <= 99)){
                        
    $value strtoupper(str_pad(dechex($E[15]['value']), ,'0'STR_PAD_LEFT));
                        
    $daten=''.substr($statusSTUFEN04).$value.substr($statusSTUFEN610).'00';
                        
    command_senden($id,$connection$Befehl.$daten);
                    }
                    break;

                case 
    16:    //ZUL_0
                    
    if((intval($E[16]['value']) >= 15) && (intval($E[16]['value']) <= 97)){
                        
    $value strtoupper(str_pad(dechex($E[16]['value']), ,'0'STR_PAD_LEFT));
                        
    $daten=''.substr($statusSTUFEN06).$value.substr($statusSTUFEN88).'00';
                        
    command_senden($id,$connection$Befehl.$daten);
                    }
                    break;

                case 
    17:    //ZUL_1
                    
    if((intval($E[17]['value']) >= 16) && (intval($E[17]['value']) <= 98)){
                        
    $value strtoupper(str_pad(dechex($E[17]['value']), ,'0'STR_PAD_LEFT));
                        
    $daten=''.substr($statusSTUFEN08).$value.substr($statusSTUFEN106).'00';
                        
    command_senden($id,$connection$Befehl.$daten);
                    }
                    break;

                case 
    18:    //ZUL_2
                    
    if((intval($E[18]['value']) >= 17) && (intval($E[18]['value']) <= 99)){
                        
    $value strtoupper(str_pad(dechex($E[18]['value']), ,'0'STR_PAD_LEFT));
                        
    $daten=''.substr($statusSTUFEN010).$value.substr($statusSTUFEN124).'00';
                        
    command_senden($id,$connection$Befehl.$daten);
                    }
                    break;

                case 
    19:    //ABL_3
                    
    if((intval($E[19]['value']) >= 18) && (intval($E[19]['value']) <= 100)){
                        
    $value strtoupper(str_pad(dechex($E[19]['value']), ,'0'STR_PAD_LEFT));
                        
    $daten=''.substr($statusSTUFEN012).$value.substr($statusSTUFEN142).'00';
                        
    command_senden($id,$connection$Befehl.$daten);
                    }
                    break;

                case 
    20:    //ZUL_3
                    
    if((intval($E[20]['value']) >= 18) && (intval($E[20]['value']) <= 100)){
                        
    $value strtoupper(str_pad(dechex($E[20]['value']), ,'0'STR_PAD_LEFT));
                        
    $daten=''.substr($statusSTUFEN014).$value.'00';
                        
    command_senden($id,$connection$Befehl.$daten);
                    }
                    break;

                default:
                    break;
            }
        
    command_read($id,$connection"00CD00");
        }


    Hier noch die Erweiterung fürs Vorheizregister und Infoboxen
    function command_readAll:
    PHP-Code:
    //____________Erweiterung_für_Infoboxen________Gernot_09.02.2017___
        #Status Vorheizung
        
    $daten[] = "00E100"
    function getValuesOfString:
    PHP-Code:
    //__________Vorheizregister Status_____________Gernot_16.02.2017____
        
    elseif (strstr($reciv"00E206") !== false) {
            
    $klappe substr($reciv62);
            
    $frostschutz substr($reciv82);
            
    $vorhzg substr($reciv102);
            
    $frost_minuten substr($reciv124);
            
    $frostsicherheit substr($reciv162);
        
    /*
        [a#21        = Frostschutz ]
        [a#22        = Vorheizung ]
        */

        
    logic_setOutput($id,21,hexdec($frostschutz));
        
    debug($id,"Status Frostschutz: " hexdec($frostschutz) . " ",5);

        
    logic_setOutput($id,22,hexdec($vorhzg));
        
    debug($id,"Status Vorheizung: " hexdec($vorhzg) . " ",5);

    $InfoBox 'Klappe                : '.hexdec($klappe).'
    Frostschutz            : '
    .hexdec($frostschutz).'
    Vorheizung            : '
    .hexdec($vorhzg).'
    Frostminuten        : '
    .hexdec($frost_minuten).'
    Frostsicherheit        : '
    .hexdec($frostsicherheit).'';

        
    logic_setOutput($id,23,$InfoBox);

        }
    elseif (
    strstr($reciv"00CE0E") !== false) {#Wenn der Status der Ventilatorenstufe empfangen wurden
            
    $akt_stufe substr($reciv222);
        
    /*
        [a#12        = AKT_STUFE ]
        */

        
    logic_setOutput($id,12,hexdec($akt_stufe));
        
    debug($id,"AKT_STUFE: "hexdec($akt_stufe),5);
    //__________Statusbox_Lüfterstufen_____________Gernot_16.02.2017______
    $InfoBox 'Abluft Stufe 0 abwesend       : '.hexdec(substr($reciv62)).'%
    Zuluft Stufe 0 abwesend       : '
    .hexdec(substr($reciv122)).'%
    Abluft Stufe 1                : '
    .hexdec(substr($reciv82)).'%
    Zuluft Stufe 1                : '
    .hexdec(substr($reciv142)).'%
    Abluft Stufe 2                : '
    .hexdec(substr($reciv102)).'%
    Zuluft Stufe 2                : '
    .hexdec(substr($reciv162)).'%
    Abluft Stufe 3                : '
    .hexdec(substr($reciv262)).'%
    Zuluft Stufe 3                : '
    .hexdec(substr($reciv282)).'%
    Info:
    Abluft aktuell                : '
    .hexdec(substr($reciv182)).'%
    Zuluft aktuell                : '
    .hexdec(substr($reciv202)).'%
    Aktuelle Stufe                : '
    .hexdec(substr($reciv222)).'
    Zuluft Ventilator 1=aktiv     : '
    .hexdec(substr($reciv242)).'';

        
    logic_setOutput($id,24,$InfoBox);

        } 
    PHP-Code:
    //_____Statusbox_Betriebsstunden____________________Gernot_16.02.2017______________
    $BetribsstundenInfoBox 'Filter        : '.hexdec(substr($reciv364)).'h
    Stufe Abwesend: '
    .hexdec(substr($reciv66)).'h
    Stufe 1       : '
    .hexdec(substr($reciv126)).'h
    Stufe 2       : '
    .hexdec(substr($reciv186)).'h
    Stufe 3       : '
    .hexdec(substr($reciv406)).'h
    Frost         : '
    .hexdec(substr($reciv244)).'h
    Vorheizung    : '
    .hexdec(substr($reciv284)).'h
    Bypass        : '
    .hexdec(substr($reciv324)).'h
    '
    ;
        
    logic_setOutput($id,25,$BetribsstundenInfoBox); 

    Zur Info: Hab einen Bug bei dem Betriebsstunden Zähler Stufe 1 gefunden.
    Der String war gleich geteilt wie Stufe 2. Habe Statt ($reciv, 6, 6) dann ($reciv, 12, 6) eingetragen.
    PHP-Code:
        logic_setOutput($id,2,hexdec(substr($reciv66)));
        
    debug($id,"Betriebsstunden Stufe 0 (Abwesend): "hexdec(substr($reciv66)) . "h",5);

        
    logic_setOutput($id,3,hexdec(substr($reciv126)));
        
    debug($id,"Betriebsstunden Stufe 1: "hexdec(substr($reciv126)) . "h",5);

        
    logic_setOutput($id,4,hexdec(substr($reciv186)));
        
    debug($id,"Betriebsstunden Stufe 2: "hexdec(substr($reciv186)) . "h",5); 



    Die Debugoption würde ich bei bedarf nachpflegen.
    Natürlich bin ich auch gerne behilflich wenn jemand so ein Setup braucht.
    Hoffe es hilft jemandem weiter. Für mich ist erstmal genug Wohnraumlüftung.


    Schöne Grüße
    Gernot

    Einen Kommentar schreiben:


  • asto
    antwortet
    Danke für die Rückmeldung! Ich werde deine Änderung in den Download-Bereich übernehmen. Vg Tobias

    Einen Kommentar schreiben:

Lädt...
X