HI,
ok, dann gibt es hier eine kleine Anleitung. Doch vorab.
WARNUNG, dieses Script ist Alpha. Für etwaige Schäden übernehme ich keine Haftung.
Nachdem Du das ISM8 eingebaut hast, musst du via Webinterface deinen Server angeben. Das ganze nennt sich „Kommunikationspartner“, die IP Adresse ist die von deinem IPS und Port ist beliebig. Ich habe als Port 12004 benutzt. Wichtig ist, du musst nun die Wolf Anlage aus- und wiedereinschalten! Sonst passiert einfach gar nichts 
Zeitgleich schau mal nach, welche Firmware-Version deine Anlage hat, meine hat 1.50 (steht auf der ersten Seite des Webinterface) und meine Scripte sind darauf ausgelegt.
Das war es Heizungsseitig, nun widmen wir uns IPS. Erstell als erstes eine neue I/O-Instanz vom Typ „Server Socket“, den Damen kannst Du beliebig wählen, ich habe der Übersichtshalber „ISM8 Server Socket“ als Namen gewählt. Als Port nutzt Du 12004 oder deinen selbst gewählten Port den du in der ISM8 eingetragen hast.
Das ganze kann man nun testen, einfach auf „Debug“ im „Server Socket“ anwählen und warten. Am besten änderst Du manuell etwas an der Anlage bspw. „1x Warmwasser“ einschalten. Im Debug-Fenster siehst Du nun Änderungen die ca 5x gesendet werden bspw „06 20 F0 80 00 15 04 00 00 00 F0 06 00 C2 00 01 00 C2 03 01 01“ für Warmwasser.
In dem Fall ist die kommunikation mit der Anlage erfolgreich, lass das Debug Fenster ruhig noch auf, dann siehst Du am Ende was abläuft. Merk dir aber schonmal die Objekt-ID der Server-Socket Instanz.
Nun erstelllst Du eine Kategorie, von mir aus mit dem Namen „Wolf“ und erstellst darin ein Script mit dem Namen „_ISM8_DATAPOINTS“ dieser Name ist Wichtig!.
Folgenden Inhalt halt dieses Script
<?
$DP = array(
array("0","Gerät","Datenpunkt","Datenpunkttyp","Out","In","Einheit"),
array("1","Heizgerät 1","Störung","DPT_Switch","Out","-","-"),
array("2","Heizgerät 1","Betriebsart","DPT_HVACContrMode","Out","-","-"),
array("3","Heizgerät 1","Modulationsgrad / Brennerleistung","DPT_Scaling","Out","-","%"),
array("4","Heizgerät 1","Kesseltemperatur","DPT_Value_Temp","Out","-","°C"),
array("5","Heizgerät 1","Sammlertemperatur","DPT_Value_Temp","Out","-","°C"),
array("6","Heizgerät 1","Rücklauftemperatur","DPT_Value_Temp","Out","-","°C"),
array("7","Heizgerät 1","Warmwassertemperatur","DPT_Value_Temp","Out","-","°C"),
array("8","Heizgerät 1","Außentemperatur","DPT_Value_Temp","Out","-","°C"),
array("9","Heizgerät 1","Status Brenner / Flamme","DPT_Switch","Out","-","-"),
array("10","Heizgerät 1","Status Heizkreispumpe","DPT_Switch","Out","-","-"),
array("11","Heizgerät 1","Status Speicherladepumpe","DPT_Switch","Out","-","-"),
array("12","Heizgerät 1","Status 3-Wege-Umschaltventil","DPT_OpenClose","Out","-","-"),
array("13","Heizgerät 1","Anlagendruck","DPT_Value_Pres","Out","-","Pa"),
array("14","Heizgerät 2","Störung","DPT_Switch","Out","-","-"),
array("15","Heizgerät 2","Betriebsart","DPT_HVACContrMode","Out","-","-"),
array("16","Heizgerät 2","Modulationsgrad / Brennerleistung","DPT_Scaling","Out","-","%"),
array("17","Heizgerät 2","Kesseltemperatur","DPT_Value_Temp","Out","-","°C"),
array("18","Heizgerät 2","Sammlertemperatur","DPT_Value_Temp","Out","-","°C"),
array("19","Heizgerät 2","Rücklauftemperatur","DPT_Value_Temp","Out","-","°C"),
array("20","Heizgerät 2","Warmwassertemperatur","DPT_Value_Temp","Out","-","°C"),
array("21","Heizgerät 2","Außentemperatur","DPT_Value_Temp","Out","-","°C"),
array("22","Heizgerät 2","Status Brenner / Flamme","DPT_Switch","Out","-","-"),
array("23","Heizgerät 2","Status Heizkreispumpe","DPT_Switch","Out","-","-"),
array("24","Heizgerät 2","Status Speicherladepumpe","DPT_Switch","Out","-","-"),
array("25","Heizgerät 2","Status 3-Wege-Umschaltventil","DPT_OpenClose","Out","-","-"),
array("26","Heizgerät 2","Anlagendruck","DPT_Value_Pres","Out","-","Pa"),
array("27","Heizgerät 3","Störung","DPT_Switch","Out","-","-"),
array("28","Heizgerät 3","Betriebsart","DPT_HVACContrMode","Out","-","-"),
array("29","Heizgerät 3","Modulationsgrad / Brennerleistung","DPT_Scaling","Out","-","%"),
array("30","Heizgerät 3","Kesseltemperatur","DPT_Value_Temp","Out","-","°C"),
array("31","Heizgerät 3","Sammlertemperatur","DPT_Value_Temp","Out","-","°C"),
array("32","Heizgerät 3","Rücklauftemperatur","DPT_Value_Temp","Out","-","°C"),
array("33","Heizgerät 3","Warmwassertemperatur","DPT_Value_Temp","Out","-","°C"),
array("34","Heizgerät 3","Außentemperatur","DPT_Value_Temp","Out","-","°C"),
array("35","Heizgerät 3","Status Brenner / Flamme","DPT_Switch","Out","-","-"),
array("36","Heizgerät 3","Status Heizkreispumpe","DPT_Switch","Out","-","-"),
array("37","Heizgerät 3","Status Speicherladepumpe","DPT_Switch","Out","-","-"),
array("38","Heizgerät 3","Status 3-Wege-Umschaltventil","DPT_OpenClose","Out","-","-"),
array("39","Heizgerät 3","Anlagendruck","DPT_Value_Pres","Out","-","Pa"),
array("40","Heizgerät 4","Störung","DPT_Switch","Out","-","-"),
array("41","Heizgerät 4","Betriebsart","DPT_HVACContrMode","Out","-","-"),
array("42","Heizgerät 4","Modulationsgrad / Brennerleistung","DPT_Scaling","Out","-","%"),
array("43","Heizgerät 4","Kesseltemperatur","DPT_Value_Temp","Out","-","°C"),
array("44","Heizgerät 4","Sammlertemperatur","DPT_Value_Temp","Out","-","°C"),
array("45","Heizgerät 4","Rücklauftemperatur","DPT_Value_Temp","Out","-","°C"),
array("46","Heizgerät 4","Warmwassertemperatur","DPT_Value_Temp","Out","-","°C"),
array("47","Heizgerät 4","Außentemperatur","DPT_Value_Temp","Out","-","°C"),
array("48","Heizgerät 4","Status Brenner / Flamme","DPT_Switch","Out","-","-"),
array("49","Heizgerät 4","Status Heizkreispumpe","DPT_Switch","Out","-","-"),
array("50","Heizgerät 4","Status Speicherladepumpe","DPT_Switch","Out","-","-"),
array("51","Heizgerät 4","Status 3-Wege-Umschaltventil","DPT_OpenClose","Out","-","-"),
array("52","Heizgerät 4","Anlagendruck","DPT_Value_Pres","Out","-","Pa"),
array("53","BM-2 0","Störung","DPT_Switch","Out","-","-"),
array("54","BM-2 0","Außentemperatur","DPT_Value_Temp","Out","-","°C"),
array("55","BM-2 0","Raumtemperatur","DPT_Value_Temp","Out","-","°C"),
array("56","BM-2 0","Warmwassersolltemperatur","DPT_Value_Temp","Out","In","°C"),
array("57","BM-2 0","Programmwahl Heizkreis","DPT_HVACMode","Out","In","-"),
array("58","BM-2 0","Programmwahl Warmwasser","DPT_DHWMode","Out","In","-"),
array("59","BM-2 0","Heizkreis Zeitprogramm 1","DPT_Switch","Out","In","-"),
array("60","BM-2 0","Heizkreis Zeitprogramm 2","DPT_Switch","Out","In","-"),
array("61","BM-2 0","Heizkreis Zeitprogramm 3","DPT_Switch","Out","In","-"),
array("62","BM-2 0","Warmwasser Zeitprogramm 1","DPT_Switch","Out","In","-"),
array("63","BM-2 0","Warmwasser Zeitprogramm 2","DPT_Switch","Out","In","-"),
array("64","BM-2 0","Warmwasser Zeitprogramm 3","DPT_Switch","Out","In","-"),
array("65","BM-2 0","Sollwertkorrektur","DPT_Value_Tempd","Out","In","K"),
array("66","BM-2 0","Sparfaktor","DPT_Value_Tempd","Out","In","K"),
array("67","BM-2 1","Störung","DPT_Switch","Out","-","-"),
array("68","BM-2 1","Raumtemperatur","DPT_Value_Temp","Out","-","°C"),
array("69","BM-2 1","Warmwassersolltemperatur","DPT_Value_Temp","Out","In","°C"),
array("70","BM-2 1","Programmwahl Mischer","DPT_HVACMode","Out","In","-"),
array("71","BM-2 1","Programmwahl Warmwasser","DPT_DHWMode","Out","In","-"),
array("72","BM-2 1","Mischer Zeitprogramm 1","DPT_Switch","Out","In","-"),
array("73","BM-2 1","Mischer Zeitprogramm 2","DPT_Switch","Out","In","-"),
array("74","BM-2 1","Mischer Zeitprogramm 3","DPT_Switch","Out","In","-"),
array("75","BM-2 1","Warmwasser Zeitprogramm 1","DPT_Switch","Out","In","-"),
array("76","BM-2 1","Warmwasser Zeitprogramm 2","DPT_Switch","Out","In","-"),
array("77","BM-2 1","Warmwasser Zeitprogramm 3","DPT_Switch","Out","In","-"),
array("78","BM-2 1","Sollwertkorrektur","DPT_Value_Tempd","Out","In","K"),
array("79","BM-2 1","Sparfaktor","DPT_Value_Tempd","Out","In","K"),
array("80","BM-2 2","Störung","DPT_Switch","Out","-","-"),
array("81","BM-2 2","Raumtemperatur","DPT_Value_Temp","Out","-","°C"),
array("82","BM-2 2","Warmwassersolltemperatur","DPT_Value_Temp","Out","In","°C"),
array("83","BM-2 2","Programmwahl Mischer","DPT_HVACMode","Out","In","-"),
array("84","BM-2 2","Programmwahl Warmwasser","DPT_DHWMode","Out","In","-"),
array("85","BM-2 2","Mischer Zeitprogramm 1","DPT_Switch","Out","In","-"),
array("86","BM-2 2","Mischer Zeitprogramm 2","DPT_Switch","Out","In","-"),
array("87","BM-2 2","Mischer Zeitprogramm 3","DPT_Switch","Out","In","-"),
array("88","BM-2 2","Warmwasser Zeitprogramm 1","DPT_Switch","Out","In","-"),
array("89","BM-2 2","Warmwasser Zeitprogramm 2","DPT_Switch","Out","In","-"),
array("90","BM-2 2","Warmwasser Zeitprogramm 3","DPT_Switch","Out","In","-"),
array("91","BM-2 2","Sollwertkorrektur","DPT_Value_Tempd","Out","In","K"),
array("92","BM-2 2","Sparfaktor","DPT_Value_Tempd","Out","In","K"),
array("93","BM-2 3","Störung","DPT_Switch","Out","-","-"),
array("94","BM-2 3","Raumtemperatur","DPT_Value_Temp","Out","-","°C"),
array("95","BM-2 3","Warmwassersolltemperatur","DPT_Value_Temp","Out","In","°C"),
array("96","BM-2 3","Programmwahl Mischer","DPT_HVACMode","Out","In","-"),
array("97","BM-2 3","Programmwahl Warmwasser","DPT_DHWMode","Out","In","-"),
array("98","BM-2 3","Mischer Zeitprogramm 1","DPT_Switch","Out","In","-"),
array("99","BM-2 3","Mischer Zeitprogramm 2","DPT_Switch","Out","In","-"),
array("100","BM-2 3","Mischer Zeitprogramm 3","DPT_Switch","Out","In","-"),
array("101","BM-2 3","Warmwasser Zeitprogramm 1","DPT_Switch","Out","In","-"),
array("102","BM-2 3","Warmwasser Zeitprogramm 2","DPT_Switch","Out","In","-"),
array("103","BM-2 3","Warmwasser Zeitprogramm 3","DPT_Switch","Out","In","-"),
array("104","BM-2 3","Sollwertkorrektur","DPT_Value_Tempd","Out","In","K"),
array("105","BM-2 3","Sparfaktor","DPT_Value_Tempd","Out","In","K"),
array("106","Kaskadenmodul","Störung","DPT_Switch","Out","-","-"),
array("107","Kaskadenmodul","Sammlertemperatur","DPT_Value_Temp","Out","-","°C"),
array("108","Kaskadenmodul","Gesamtmodulationsgrad","DPT_Scaling","Out","-","%"),
array("109","Kaskadenmodul","Vorlauftemperatur Mischerkreis","DPT_Value_Temp","Out","-","°C"),
array("110","Kaskadenmodul","Status Mischerkreispumpe","DPT_Switch","Out","-","-"),
array("111","Kaskadenmodul","Status Ausgang A1","DPT_Enable","Out","-","-"),
array("112","Kaskadenmodul","Eingang E1","DPT_Value_Temp","Out","-","°C"),
array("113","Kaskadenmodul","Eingang E2","DPT_Value_Temp","Out","-","°C"),
array("114","Mischermodul 1","Störung","DPT_Switch","Out","-","-"),
array("115","Mischermodul 1","Warmwassertemperatur","DPT_Value_Temp","Out","-","°C"),
array("116","Mischermodul 1","Vorlauftemperatur Mischerkreis","DPT_Value_Temp","Out","-","°C"),
array("117","Mischermodul 1","Status Mischerkreispumpe","DPT_Switch","Out","-","-"),
array("118","Mischermodul 1","Status Ausgang A1","DPT_Enable","Out","-","-"),
array("119","Mischermodul 1","Eingang E1","DPT_Value_Temp","Out","-","°C"),
array("120","Mischermodul 1","Eingang E2","DPT_Value_Temp","Out","-","°C"),
array("121","Mischermodul 2","Störung","DPT_Switch","Out","-","-"),
array("122","Mischermodul 2","Warmwassertemperatur","DPT_Value_Temp","Out","-","°C"),
array("123","Mischermodul 2","Vorlauftemperatur Mischerkreis","DPT_Value_Temp","Out","-","°C"),
array("124","Mischermodul 2","Status Mischerkreispumpe","DPT_Switch","Out","-","-"),
array("125","Mischermodul 2","Status Ausgang A1","DPT_Enable","Out","-","-"),
array("126","Mischermodul 2","Eingang E1","DPT_Value_Temp","Out","-","°C"),
array("127","Mischermodul 2","Eingang E2","DPT_Value_Temp","Out","-","°C"),
array("128","Mischermodul 3","Störung","DPT_Switch","Out","-","-"),
array("129","Mischermodul 3","Warmwassertemperatur","DPT_Value_Temp","Out","-","°C"),
array("130","Mischermodul 3","Vorlauftemperatur Mischerkreis","DPT_Value_Temp","Out","-","°C"),
array("131","Mischermodul 3","Status Mischerkreispumpe","DPT_Switch","Out","-","-"),
array("132","Mischermodul 3","Status Ausgang A1","DPT_Enable","Out","-","-"),
array("133","Mischermodul 3","Eingang E1","DPT_Value_Temp","Out","-","°C"),
array("134","Mischermodul 3","Eingang E2","DPT_Value_Temp","Out","-","°C"),
array("135","Solarmodul","Störung","DPT_Switch","Out","-","-"),
array("136","Solarmodul","Warmwassertemperatur Solar 1","DPT_Value_Temp","Out","-","°C"),
array("137","Solarmodul","Temperatur Kollektor 1","DPT_Value_Temp","Out","-","°C"),
array("138","Solarmodul","Eingang E1","DPT_Value_Temp","Out","-","°C"),
array("139","Solarmodul","Eingang E2 (Durchfluss)","DPT_Value_Volume_Flow","Out","-","l/h"),
array("140","Solarmodul","Eingang E3","DPT_Value_Temp","Out","-","°C"),
array("141","Solarmodul","Status Solarkreispumpe SKP1","DPT_Switch","Out","-","-"),
array("142","Solarmodul","Status Ausgang A1","DPT_Enable","Out","-","-"),
array("143","Solarmodul","Status Ausgang A2","DPT_Enable","Out","-","-"),
array("144","Solarmodul","Status Ausgang A3","DPT_Enable","Out","-","-"),
array("145","Solarmodul","Status Ausgang A4","DPT_Enable","Out","-","-"),
array("146","Solarmodul","Durchfluss","DPT_Value_Volume_Flow","Out","-","l/h"),
array("147","Solarmodul","aktuelle Leistung","DPT_Power","Out","-","kW"),
array("148","CWL Excellent","Störung","DPT_Switch","Out","-","-"),
array("149","CWL Excellent","Programm","DPT_HVACMode","Out","In","-"),
array("150","CWL Excellent","Zeitprogramm 1","DPT_Switch","Out","In","-"),
array("151","CWL Excellent","Zeitprogramm 2","DPT_Switch","Out","In","-"),
array("152","CWL Excellent","Zeitprogramm 3","DPT_Switch","Out","In","-"),
array("153","CWL Excellent","Zeitweise Intensivlüftung AN/AUS","DPT_Switch","Out","In","-"),
array("154","CWL Excellent","Zeitweise Intensivlüftung Startdatum","DPT_Date","Out","In","-"),
array("155","CWL Excellent","Zeitweise Intensivlüftung Enddatum","DPT_Date","Out","In","-"),
array("156","CWL Excellent","Zeitweise Intensivlüftung Startzeit","DPT_TimeOfDay","Out","In","-"),
array("157","CWL Excellent","Zeitweise Intensivlüftung Endzeit","DPT_TimeOfDay","Out","In","-"),
array("158","CWL Excellent","Zeitweiser Feuchteschutz AN/AUS","DPT_Switch","Out","In","-"),
array("159","CWL Excellent","Zeitweiser Feuchteschutz Startdatum","DPT_Date","Out","In","-"),
array("160","CWL Excellent","Zeitweiser Feuchteschutz Enddatum","DPT_Date","Out","In","-"),
array("161","CWL Excellent","Zeitweiser Feuchteschutz Startzeit","DPT_TimeOfDay","Out","In","-"),
array("162","CWL Excellent","Zeitweiser Feuchteschutz Endzeit","DPT_TimeOfDay","Out","In","-"),
array("163","CWL Excellent","Lüftungsstufe","DPT_Scaling","Out","-","%"),
array("164","CWL Excellent","Ablufttemperatur","DPT_Value_Temp","Out","-","°C"),
array("165","CWL Excellent","Frischlufttemperatur","DPT_Value_Temp","Out","-","°C"),
array("166","CWL Excellent","Luftdurchsatz Zuluft","DPT_FlowRate_m3/h","Out","-","m³/h"),
array("167","CWL Excellent","Luftdurchsatz Abluft","DPT_FlowRate_m3/h","Out","-","m³/h"),
array("168","CWL Excellent","Bypass Initialisierung","DPT_Bool","Out","-","-"),
array("169","CWL Excellent","Bypass öffnet/offen","DPT_Bool","Out","-","-"),
array("170","CWL Excellent","Bypass schließt/geschlossen","DPT_Bool","Out","-","-"),
array("171","CWL Excellent","Bypass Fehler","DPT_Bool","Out","-","-"),
array("172","CWL Excellent","Frost Status: Initialisierung/Warte","DPT_Bool","Out","-","-"),
array("173","CWL Excellent","Frost Status: Kein Frost","DPT_Bool","Out","-","-"),
array("174","CWL Excellent","Frost Status: Vorwärmer","DPT_Bool","Out","-","-"),
array("175","CWL Excellent","Frost Status: Fehler/Unausgeglichen","DPT_Bool","Out","-","-"),
array("176","Heizgerät 1 (BWL-1-S)","Störung","DPT_Switch","Out","-","-"),
array("177","Heizgerät 1 (BWL-1-S)","Betriebsart","DPT_HVACContrMode","Out","-","-"),
array("178","Heizgerät 1 (BWL-1-S)","Heizleistung","DPT_Power","Out","-","kW"),
array("179","Heizgerät 1 (BWL-1-S)","Kühlleistung","DPT_Power","Out","-","kW"),
array("180","Heizgerät 1 (BWL-1-S)","Kesseltemperatur","DPT_Value_Temp","Out","-","°C"),
array("181","Heizgerät 1 (BWL-1-S)","Sammlertemperatur","DPT_Value_Temp","Out","-","°C"),
array("182","Heizgerät 1 (BWL-1-S)","Rücklauftemperatur","DPT_Value_Temp","Out","-","°C"),
array("183","Heizgerät 1 (BWL-1-S)","Warmwassertemperatur","DPT_Value_Temp","Out","-","°C"),
array("184","Heizgerät 1 (BWL-1-S)","Außentemperatur","DPT_Value_Temp","Out","-","°C"),
array("185","Heizgerät 1 (BWL-1-S)","Status Heizkreispumpe","DPT_Switch","Out","-","-"),
array("186","Heizgerät 1 (BWL-1-S)","Status Zubringer-/Heizkreispumpe","DPT_Switch","Out","-","-"),
array("187","Heizgerät 1 (BWL-1-S)","Status 3-Wege-Umschaltventil HZ/WW","DPT_OpenClose","Out","-","-"),
array("188","Heizgerät 1 (BWL-1-S)","Status 3-Wege-Umschaltventil HZ/K","DPT_OpenClose","Out","-","-"),
array("189","Heizgerät 1 (BWL-1-S)","Status E-Heizung","DPT_Switch","Out","-","-"),
array("190","Heizgerät 1 (BWL-1-S)","Anlagendruck","DPT_Value_Pres","Out","-","Pa"),
array("191","Heizgerät 1 (BWL-1-S)","Leistungsaufnahme","DPT_Power","Out","-","kW"),
array("192","CWL Excellent","Filterwarnung aktiv","DPT_Switch","Out","-","-"),
array("193","CWL Excellent","Filterwarnung zurücksetzen","DPT_Switch","Out","In","-"),
array("194","BM-2 0","1x Warmwasserladung","DPT_Switch","Out","In","-"),
array("195","Solarmodul","Tagesertrag","DPT_ActiveEnergy","Out","-","Wh"),
array("196","Solarmodul","Gesamtertrag","DPT_ActiveEnergy_kWh","Out","-","kWh"),
array("197","Heizgerät 1","Abgastemperatur","DPT_Value_Temp","Out","-","°C"),
array("198","Heizgerät 1","Leistungsvorgabe","DPT_Scaling","Out","In","%"),
array("199","Heizgerät 1","Kesselsolltemperaturvorgabe","DPT_Value_Temp","Out","In","°C"),
array("200","Heizgerät 2","Abgastemperatur","DPT_Value_Temp","Out","-","°C"),
array("201","Heizgerät 2","Leistungsvorgabe","DPT_Scaling","Out","In","%"),
array("202","Heizgerät 2","Kesselsolltemperaturvorgabe","DPT_Value_Temp","Out","In","°C"),
array("203","Heizgerät 3","Abgastemperatur","DPT_Value_Temp","Out","-","°C"),
array("204","Heizgerät 3","Leistungsvorgabe","DPT_Scaling","Out","In","%"),
array("205","Heizgerät 3","Kesselsolltemperaturvorgabe","DPT_Value_Temp","Out","In","°C"),
array("206","Heizgerät 4","Abgastemperatur","DPT_Value_Temp","Out","-","°C"),
array("207","Heizgerät 4","Leistungsvorgabe","DPT_Scaling","Out","In","%"),
array("208","Heizgerät 4","Kesselsolltemperaturvorgabe","DPT_Value_Temp","Out","In","°C"),
array("209","Kaskadenmodul","Gesamtmodulationsgradvorgabe","DPT_Scaling","Out","In","%"),
array("210","Kaskadenmodul","Sammlersolltemperaturvorgabe","DPT_Value_Temp","Out","In","°C")
);
?>
In der gleichen Kategorie legst Du nun ein Script mit dem Namen „_ISM8_FUNCTIONS“ an (auch hier ist der Name Wichtig!)
Update 17.05.18
<?
$SERVERSOCKET = 28041 /*[ISM8 Server Socket]*/;
// liest den HEX Wert, teilt diesen, macht wandelt in großbuchstaben um wenn vorhanden und packt diesen in ein Array
function _ISM8_READ_DATA_TO_ARRAY($HEX)
{
$HEX = unpack("H*" ,$HEX);
$HEX = explode(" ", (wordwrap((strtoupper($HEX[1])), 2, " ", true)));
return $HEX;
}
// nach jedem erhaltenem Wert, erwartet die Anlage eine Bestätigung.
function _ISM8_SEND_ACK($HEX)
{
global $SERVERSOCKET;
$HEADER = "$HEX[0]$HEX[1]$HEX[2]$HEX[3]";
$FRAMESIZE = "0011";
$CONNECTHEADER = "$HEX[6]$HEX[7]$HEX[8]$HEX[9]";
$OBJECTSERVER = "$HEX[10]86$HEX[12]$HEX[13]000000";
$ACK = pack("H*" ,"$HEADER$FRAMESIZE$CONNECTHEADER$OBJECTSERVER");
SSCK_SendText($SERVERSOCKET,$ACK);
return;
}
// Aktives auslesen aller Datenpunkte
function _ISM8_RELOAD_ALL_DATA()
{
global $SERVERSOCKET;
$HEX = pack("H*" ,"0620F080001604000000F0D0");
SSCK_SendText($SERVERSOCKET,$HEX);
return;
}
// Sobald man diese Funktion aufruft mit den Heizungstelegram als wert, wird das ganze als array aufgelöst.
// [DATAPOINT_ID] = Integer, der Wert kann dann in den Datenpunkten-Include gesucht werden
// [DATAPOINT_NAME] = Name des Datenpunkte
// [DATAPOINT_TYPE] = Datenpunkttyp
// [DATAPOINT_TYPE_VALUE]= Wert des Datenpunkttypes
// [DATAPOINT_VALUE] = Wert des Datenpunktes
// [DATAPOINT_OUT] = wenn Ausgabe = Out dann gibt es einen Ausgabewert
// [DATAPOINT_IN] = wenn Ausgabe = In dann nimmt dieser Datenpunkt auch Daten an.
// [DATAPOINT_UNIT] = wenn eine Ausgabe erfolgt, dann ist das die Einheit bspw % oder °C
// [DATAPOINT_IPS_TYPE ] = 0 =bool, 1 = integer , 2=Float, 3 = String
function _ISM8_READ_TELEGRAM($HEX)
{
GLOBAL $DP;
$FRAMESIZE = "$HEX[4] $HEX[5]";
$MAINSERVICE = "$HEX[10]";
$SUBSERVICE = "$HEX[11]";
$NUMBER_OF_DP = hexdec("$HEX[14] $HEX[15]");
$DATAPOINT_POS = "0";
$DATAPOINT_VALUE = "" ;
if ($MAINSERVICE == "F0" and $SUBSERVICE == "06"){
for( $i=1; $i <= $NUMBER_OF_DP; $i++ ){
$DATAPOINT_VALUE = "0";
$DATAPOINT_ID = $HEX["$DATAPOINT_POS" + 16].$HEX["$DATAPOINT_POS" + 17];
$DATAPOINT_CMD = $HEX["$DATAPOINT_POS" + 18];
$DATAPOINT_LENGTH = $HEX["$DATAPOINT_POS" + 19];
$DATAPOINT_ID_VAL = hexdec("$DATAPOINT_ID");
$DATAPOINT_CMD_VAL = hexdec("$DATAPOINT_CMD");
$DATAPOINT_LENGTH_VAL = hexdec("$DATAPOINT_LENGTH");
for( $n=0; $n <= $DATAPOINT_LENGTH_VAL -1; $n++ ){
$DATAPOINT_VALUE .= $HEX["$DATAPOINT_POS" + 20 + $n];
}
$DATAPOINT_VALUE_VAL = hexdec("$DATAPOINT_VALUE");
$DATAPOINT_TYPE = $DP[$DATAPOINT_ID_VAL][3];
$DATAPOINT_NAME = $DP[$DATAPOINT_ID_VAL][2];
$DATAPOINT_OUT = $DP[$DATAPOINT_ID_VAL][4];
$DATAPOINT_IN = $DP[$DATAPOINT_ID_VAL][5];
$DATAPOINT_UNIT = $DP[$DATAPOINT_ID_VAL][6];
$DATAPOINT_TYPE_VALUE = "";
$DATAPOINT_IPS_TYPE = "";
switch($DATAPOINT_TYPE)
{
case "DPT_Switch":
if ($DATAPOINT_VALUE_VAL == 0 ){ $DATAPOINT_TYPE_VALUE = "off";}elseif($DATAPOINT_VALUE_VAL == 1){ $DATAPOINT_TYPE_VALUE = "on";}
$DATAPOINT_IPS_TYPE = 0;
break;
case "DPT_Bool":
if ($DATAPOINT_VALUE_VAL == 0 ){ $DATAPOINT_TYPE_VALUE = "false";}elseif($DATAPOINT_VALUE_VAL == 1){ $DATAPOINT_TYPE_VALUE = "true";}
$DATAPOINT_IPS_TYPE = 0;
break;
case "DPT_Enable":
if ($DATAPOINT_VALUE_VAL == 0 ){ $DATAPOINT_TYPE_VALUE = "disable";}elseif($DATAPOINT_VALUE_VAL == 1){ $DATAPOINT_TYPE_VALUE = "enable";}
$DATAPOINT_IPS_TYPE = 0;
break;
case "DPT_OpenClose":
if ($DATAPOINT_VALUE_VAL == 0 ){ $DATAPOINT_TYPE_VALUE = "open";}elseif($DATAPOINT_VALUE_VAL == 1){ $DATAPOINT_TYPE_VALUE = "close";}
$DATAPOINT_IPS_TYPE = 0;
break;
case "DPT_Scaling":
$DATAPOINT_TYPE_VALUE = _ISM8_PDT_SCALING($DATAPOINT_VALUE_VAL);
$DATAPOINT_IPS_TYPE = 2;
break;
case "DPT_Value_Temp":
$DATAPOINT_TYPE_VALUE = _ISM8_PDT_KNX_FLOAT($DATAPOINT_VALUE_VAL);
$DATAPOINT_IPS_TYPE = 2;
break;
case "DPT_Value_Tempd":
$DATAPOINT_TYPE_VALUE = _ISM8_PDT_KNX_FLOAT($DATAPOINT_VALUE_VAL);
$DATAPOINT_IPS_TYPE = 2;
break;
case "DPT_Value_Pres":
$DATAPOINT_TYPE_VALUE = _ISM8_PDT_KNX_FLOAT($DATAPOINT_VALUE_VAL);
$DATAPOINT_IPS_TYPE = 2;
break;
case "DPT_Power":
$DATAPOINT_TYPE_VALUE = _ISM8_PDT_KNX_FLOAT($DATAPOINT_VALUE_VAL);
$DATAPOINT_IPS_TYPE = 2;
break;
case "DPT_TimeOfDay":
$DATAPOINT_IPS_TYPE = 3;
//
break;
case "DPT_Date":
$DATAPOINT_IPS_TYPE = 3;
//
break;
case "DPT_FlowRate_m3/h":
$DATAPOINT_IPS_TYPE = 2;
//
break;
case "DPT_HVACMode":
switch($DATAPOINT_VALUE_VAL)
{
case "0":
$DATAPOINT_TYPE_VALUE = 0; //"Auto"
break;
case "1":
$DATAPOINT_TYPE_VALUE = 1; //"Comfort"
break;
case "2":
$DATAPOINT_TYPE_VALUE = 2; //"Standby"
break;
case "3":
$DATAPOINT_TYPE_VALUE = 3; //"Economy"
break;
case "4":
$DATAPOINT_TYPE_VALUE = 4; //"Building Protection"
break;
}
$DATAPOINT_IPS_TYPE = 1;
break;
case "DPT_DHWMode":
switch($DATAPOINT_VALUE_VAL)
{
case "0":
$DATAPOINT_TYPE_VALUE = 0; //"Auto"
break;
case "1":
$DATAPOINT_TYPE_VALUE = 1; //"LegioProtect"
break;
case "2":
$DATAPOINT_TYPE_VALUE = 2; //"Normal"
break;
case "3":
$DATAPOINT_TYPE_VALUE = 3; //"Reduced"
break;
case "4":
$DATAPOINT_TYPE_VALUE = 4; //"Off/FrostProtect"
break;
}
$DATAPOINT_IPS_TYPE = 1;
break;
case "DPT_HVACContrMode":
switch($DATAPOINT_VALUE_VAL)
{
case "0":
$DATAPOINT_TYPE_VALUE = 0; //"Auto"
break;
case "1":
$DATAPOINT_TYPE_VALUE = 1; //"Heat"
break;
case "2":
$DATAPOINT_TYPE_VALUE = 2; //"Morning Warmup"
break;
case "3":
$DATAPOINT_TYPE_VALUE = 3; //"Cool"
break;
case "4":
$DATAPOINT_TYPE_VALUE = 4; //"Night Purge"
break;
case "5":
$DATAPOINT_TYPE_VALUE = 5; // "Precool"
break;
case "6":
$DATAPOINT_TYPE_VALUE = 6; // "Off"
break;
case "7":
$DATAPOINT_TYPE_VALUE = 7; // "Test"
break;
case "8":
$DATAPOINT_TYPE_VALUE = 8; // "Emergency Heat"
break;
case "9":
$DATAPOINT_TYPE_VALUE = 9; // "Fan Only"
break;
case "10":
$DATAPOINT_TYPE_VALUE = 10; // "Free Cool"
break;
case "11":
$DATAPOINT_TYPE_VALUE = 11; // "Ice"
break;
case "12":
$DATAPOINT_TYPE_VALUE = 12; // "Maximum Heating Mode"
break;
case "13":
$DATAPOINT_TYPE_VALUE = 13; //"Economic Heat/Cool Mode"
break;
case "14":
$DATAPOINT_TYPE_VALUE = 14; //"Dehumidifiation"
break;
case "15":
$DATAPOINT_TYPE_VALUE = 15; // "Calibration Mode"
break;
case "16":
$DATAPOINT_TYPE_VALUE = 16; //"Emergency Cool Mode"
break;
case "17":
$DATAPOINT_TYPE_VALUE = 17; //"Emergency Steam Mode"
break;
case "20":
$DATAPOINT_TYPE_VALUE = 20; //"NoDem"
break;
}
$DATAPOINT_IPS_TYPE = 1;
break;
case "DPT_ActiveEnergy":
$DATAPOINT_IPS_TYPE = 2;
//
break;
case "DPT_ActiveEnergy_kWh":
$DATAPOINT_IPS_TYPE = 2;
//
break;
case "DPT_Value_Volume_Flow":
$DATAPOINT_TYPE_VALUE = _ISM8_PDT_KNX_FLOAT($DATAPOINT_VALUE_VAL);
$DATAPOINT_IPS_TYPE = 2;
break;
}
// Die Datapoint Länge setzt sich zusammen aus Datapoint ID (2) Datapoint Kommado (1) und Länge (1)
$DATAPOINT_POS += 4 + "$DATAPOINT_LENGTH_VAL";
// Schreibe Array für die Ausgabe
$ReturnArray[] = array(
"DATAPOINT_ID" => "$DATAPOINT_ID_VAL",
"DATAPOINT_NAME" => "$DATAPOINT_NAME",
"DATAPOINT_TYPE" => "$DATAPOINT_TYPE",
"DATAPOINT_TYPE_VALUE" => "$DATAPOINT_TYPE_VALUE",
"DATAPOINT_VALUE" => "$DATAPOINT_VALUE_VAL",
"DATAPOINT_OUT" => "$DATAPOINT_OUT",
"DATAPOINT_IN" => "$DATAPOINT_IN",
"DATAPOINT_UNIT" => "$DATAPOINT_UNIT",
"DATAPOINT_IPS_TYPE" => "$DATAPOINT_IPS_TYPE"
);
}
return $ReturnArray;
}
}
function _ISM8_CREATE_VARIABLE_PROFILE($DATAPOINT_TYPE)
{
switch($DATAPOINT_TYPE)
{
case "DPT_Switch": // Bool (0)
IPS_CreateVariableProfile("_ISM8_$DATAPOINT_TYPE", 0);
IPS_SetVariableProfileAssociation("_ISM8_$DATAPOINT_TYPE", 1, "on", "", 0x00FF00);
IPS_SetVariableProfileAssociation("_ISM8_$DATAPOINT_TYPE", 0, "off", "", 0xFF0000);
break;
case "DPT_Bool": // Bool (0)
IPS_CreateVariableProfile("_ISM8_$DATAPOINT_TYPE", 0);
IPS_SetVariableProfileAssociation("_ISM8_$DATAPOINT_TYPE", 1, "true", "", 0x00FF00);
IPS_SetVariableProfileAssociation("_ISM8_$DATAPOINT_TYPE", 0, "false", "", 0xFF0000);
break;
case "DPT_Enable": // Bool (0)
IPS_CreateVariableProfile("_ISM8_$DATAPOINT_TYPE", 0);
IPS_SetVariableProfileAssociation("_ISM8_$DATAPOINT_TYPE", 1, "enable", "", 0x00FF00);
IPS_SetVariableProfileAssociation("_ISM8_$DATAPOINT_TYPE", 0, "disable", "", 0xFF0000);
break;
case "DPT_OpenClose": // Bool (0)
IPS_CreateVariableProfile("_ISM8_$DATAPOINT_TYPE", 0);
IPS_SetVariableProfileAssociation("_ISM8_$DATAPOINT_TYPE", 1, "close", "", 0x00FF00);
IPS_SetVariableProfileAssociation("_ISM8_$DATAPOINT_TYPE", 0, "open", "", 0xFF0000);
break;
case "DPT_Scaling": // Float (2)
IPS_CreateVariableProfile("_ISM8_$DATAPOINT_TYPE", 2);
IPS_SetVariableProfileText("_ISM8_$DATAPOINT_TYPE", "", "%");
IPS_SetVariableProfileValues("_ISM8_$DATAPOINT_TYPE", "", "", "1");
break;
case "DPT_Value_Temp": // Float (2)
IPS_CreateVariableProfile("_ISM8_$DATAPOINT_TYPE", 2);
IPS_SetVariableProfileText("_ISM8_$DATAPOINT_TYPE", "", "°C");
break;
case "DPT_Value_Tempd": // Float (2)
IPS_CreateVariableProfile("_ISM8_$DATAPOINT_TYPE", 2);
IPS_SetVariableProfileText("_ISM8_$DATAPOINT_TYPE", "", "K");
break;
case "DPT_Value_Pres": // Float (2)
IPS_CreateVariableProfile("_ISM8_$DATAPOINT_TYPE", 2);
IPS_SetVariableProfileText("_ISM8_$DATAPOINT_TYPE", "", "Pa");
break;
case "DPT_Power": // Float (2)
IPS_CreateVariableProfile("_ISM8_$DATAPOINT_TYPE", 2);
IPS_SetVariableProfileText("_ISM8_$DATAPOINT_TYPE", "", "kW");
break;
case "DPT_TimeOfDay": // String (3)
IPS_CreateVariableProfile("_ISM8_$DATAPOINT_TYPE", 3);
break;
case "DPT_Date": // String (3)
IPS_CreateVariableProfile("_ISM8_$DATAPOINT_TYPE", 3);
break;
case "DPT_FlowRate_m3/h": // Float (2)
IPS_CreateVariableProfile("_ISM8_$DATAPOINT_TYPE", 2);
IPS_SetVariableProfileText("_ISM8_$DATAPOINT_TYPE", "", "m3/h");
//
break;
case "DPT_HVACMode": // Integer (1)
IPS_CreateVariableProfile("_ISM8_$DATAPOINT_TYPE", 1);
IPS_SetVariableProfileAssociation("_ISM8_$DATAPOINT_TYPE", 0, "Auto", "", 0xFFFFFF);
IPS_SetVariableProfileAssociation("_ISM8_$DATAPOINT_TYPE", 1, "Comfort", "", 0xFFFFFF);
IPS_SetVariableProfileAssociation("_ISM8_$DATAPOINT_TYPE", 2, "Standby", "", 0xFFFFFF);
IPS_SetVariableProfileAssociation("_ISM8_$DATAPOINT_TYPE", 3, "Economy", "", 0xFFFFFF);
IPS_SetVariableProfileAssociation("_ISM8_$DATAPOINT_TYPE", 4, "Building Protection", "", 0xFFFFFF);
break;
case "DPT_DHWMode": // Integer (1)
IPS_CreateVariableProfile("_ISM8_$DATAPOINT_TYPE", 1);
IPS_SetVariableProfileAssociation("_ISM8_$DATAPOINT_TYPE", 0, "Auto", "", 0xFFFFFF);
IPS_SetVariableProfileAssociation("_ISM8_$DATAPOINT_TYPE", 1, "LegioProtect", "", 0xFFFFFF);
IPS_SetVariableProfileAssociation("_ISM8_$DATAPOINT_TYPE", 2, "Normal", "", 0xFFFFFF);
IPS_SetVariableProfileAssociation("_ISM8_$DATAPOINT_TYPE", 3, "Reduced", "", 0xFFFFFF);
IPS_SetVariableProfileAssociation("_ISM8_$DATAPOINT_TYPE", 4, "Off/Frost/Protect", "", 0xFFFFFF);
break;
case "DPT_HVACContrMode": // Integer (1)
IPS_CreateVariableProfile("_ISM8_$DATAPOINT_TYPE", 1);
IPS_SetVariableProfileAssociation("_ISM8_$DATAPOINT_TYPE", 0, "Auto", "", 0xFFFFFF);
IPS_SetVariableProfileAssociation("_ISM8_$DATAPOINT_TYPE", 1, "Heat", "", 0xFFFFFF);
IPS_SetVariableProfileAssociation("_ISM8_$DATAPOINT_TYPE", 2, "Morning Warmup", "", 0xFFFFFF);
IPS_SetVariableProfileAssociation("_ISM8_$DATAPOINT_TYPE", 3, "Cool", "", 0xFFFFFF);
IPS_SetVariableProfileAssociation("_ISM8_$DATAPOINT_TYPE", 4, "Night Purge", "", 0xFFFFFF);
IPS_SetVariableProfileAssociation("_ISM8_$DATAPOINT_TYPE", 5, "Precool", "", 0xFFFFFF);
IPS_SetVariableProfileAssociation("_ISM8_$DATAPOINT_TYPE", 6, "Off", "", 0xFFFFFF);
IPS_SetVariableProfileAssociation("_ISM8_$DATAPOINT_TYPE", 7, "Test", "", 0xFFFFFF);
IPS_SetVariableProfileAssociation("_ISM8_$DATAPOINT_TYPE", 8, "Emergency Heat", "", 0xFFFFFF);
IPS_SetVariableProfileAssociation("_ISM8_$DATAPOINT_TYPE", 9, "Fan Only", "", 0xFFFFFF);
IPS_SetVariableProfileAssociation("_ISM8_$DATAPOINT_TYPE", 10, "Free Cool", "", 0xFFFFFF);
IPS_SetVariableProfileAssociation("_ISM8_$DATAPOINT_TYPE", 11, "Ice", "", 0xFFFFFF);
IPS_SetVariableProfileAssociation("_ISM8_$DATAPOINT_TYPE", 12, "Maximum Heating Mode", "", 0xFFFFFF);
IPS_SetVariableProfileAssociation("_ISM8_$DATAPOINT_TYPE", 13, "Economic Heat/Cool Mode", "", 0xFFFFFF);
IPS_SetVariableProfileAssociation("_ISM8_$DATAPOINT_TYPE", 14, "Dehumidifiation", "", 0xFFFFFF);
IPS_SetVariableProfileAssociation("_ISM8_$DATAPOINT_TYPE", 15, "Calibration Mode", "", 0xFFFFFF);
IPS_SetVariableProfileAssociation("_ISM8_$DATAPOINT_TYPE", 16, "Emergency Cool Mode", "", 0xFFFFFF);
IPS_SetVariableProfileAssociation("_ISM8_$DATAPOINT_TYPE", 17, "Emergency Steam Mode", "", 0xFFFFFF);
IPS_SetVariableProfileAssociation("_ISM8_$DATAPOINT_TYPE", 20, "NoDem", "", 0xFFFFFF);
break;
case "DPT_ActiveEnergy": // Float (2)
IPS_CreateVariableProfile("_ISM8_$DATAPOINT_TYPE", 2);
IPS_SetVariableProfileText("_ISM8_$DATAPOINT_TYPE", "", "Wh");
break;
case "DPT_ActiveEnergy_kWh": // Float (2)
IPS_CreateVariableProfile("_ISM8_$DATAPOINT_TYPE", 2);
IPS_SetVariableProfileText("_ISM8_$DATAPOINT_TYPE", "", "kWh");
break;
case "DPT_Value_Volume_Flow": // Float (2)
IPS_CreateVariableProfile("_ISM8_$DATAPOINT_TYPE", 2);
IPS_SetVariableProfileText("_ISM8_$DATAPOINT_TYPE", "", "l/h");
break;
}
}
function _ISM8_CREATE_VARIABLE_INPUT_PROFILE($DATAPOINT_TYPE, $DATAPOINT_ID)
{
switch($DATAPOINT_TYPE)
{
case "DPT_Switch": // Bool (0)
// Profile für INPUT-ID 59-64/72-77/85-90/98-103/150-153/158/193/194/
IPS_CreateVariableProfile("_ISM8_IN_$DATAPOINT_TYPE", 0);
IPS_SetVariableProfileAssociation("_ISM8_IN_$DATAPOINT_TYPE", 1, "on", "", 0x00FF00);
IPS_SetVariableProfileAssociation("_ISM8_IN_$DATAPOINT_TYPE", 0, "off", "", 0xFF0000);
break;
case "DPT_Scaling": // Float (2)
// Profile für INPUT-ID 198/201/204/207/209
IPS_CreateVariableProfile("_ISM8_IN_$DATAPOINT_TYPE", 2);
IPS_SetVariableProfileText("_ISM8_IN_$DATAPOINT_TYPE", "", "%");
IPS_SetVariableProfileValues("_ISM8_IN_$DATAPOINT_TYPE", "", "", "1");
break;
case "DPT_Value_Temp": // Float (2)
// Profile für INPUT-ID 56/69/82/95/199/202205/208/210
IPS_CreateVariableProfile("_ISM8_IN_$DATAPOINT_TYPE", 2);
IPS_SetVariableProfileText("_ISM8_IN_$DATAPOINT_TYPE", "", "°C");
IPS_SetVariableProfileValues("_ISM8_IN_$DATAPOINT_TYPE", "20", "80", "1");
break;
case "DPT_Value_Tempd": // Float (2)
// Profile für Input-ID 65/78/91/104
if ($DATAPOINT_ID == 65 || $DATAPOINT_ID == 78 || $DATAPOINT_ID == 91 || $DATAPOINT_ID == 106)
{
IPS_CreateVariableProfile("_ISM8_IN_$DATAPOINT_TYPE", 2);
IPS_SetVariableProfileText("_ISM8_IN_$DATAPOINT_TYPE", "", "K");
IPS_SetVariableProfileValues("_ISM8_IN_$DATAPOINT_TYPE", "-4", "4", "0.5");
}
// Profile für Input-ID 66/79/92/105
if ($DATAPOINT_ID == 66 || $DATAPOINT_ID == 79 || $DATAPOINT_ID == 92 || $DATAPOINT_ID == 105)
{
IPS_CreateVariableProfile("_ISM8_IN2_$DATAPOINT_TYPE", 2);
IPS_SetVariableProfileText("_ISM8_IN2_$DATAPOINT_TYPE", "", "K");
IPS_SetVariableProfileValues("_ISM8_IN2_$DATAPOINT_TYPE", "0", "10", "0.5");
}
break;
case "DPT_HVACMode": // Integer (1)
// Profil für INPUT-ID 149
if ($DATAPOINT_ID == 149)
{
IPS_CreateVariableProfile("_ISM8_IN_$DATAPOINT_TYPE", 1);
IPS_SetVariableProfileAssociation("_ISM8_IN_$DATAPOINT_TYPE", 0, "Automatikbetrieb", "", 0xFFFFFF);
IPS_SetVariableProfileAssociation("_ISM8_IN_$DATAPOINT_TYPE", 1, "Nennlüftung", "", 0xFFFFFF);
IPS_SetVariableProfileAssociation("_ISM8_IN_$DATAPOINT_TYPE", 3, "Economy", "", 0xFFFFFF);
}
// Profil für INPUT-ID 57/70/83/96
if ($DATAPOINT_ID == 57 || $DATAPOINT_ID == 70 || $DATAPOINT_ID == 83 || $DATAPOINT_ID == 96)
{
IPS_CreateVariableProfile("_ISM8_IN2_$DATAPOINT_TYPE", 1);
IPS_SetVariableProfileAssociation("_ISM8_IN2_$DATAPOINT_TYPE", 0, "Automatikbetrieb", "", 0xFFFFFF);
IPS_SetVariableProfileAssociation("_ISM8_IN2_$DATAPOINT_TYPE", 1, "Heizbetrieb", "", 0xFFFFFF);
IPS_SetVariableProfileAssociation("_ISM8_IN2_$DATAPOINT_TYPE", 2, "Standby", "", 0xFFFFFF);
IPS_SetVariableProfileAssociation("_ISM8_IN2_$DATAPOINT_TYPE", 3, "Sparbetrieb", "", 0xFFFFFF);
}
break;
case "DPT_DHWMode": // Integer (1)
// Profile für INPUT-ID 58/71/84/97
IPS_CreateVariableProfile("_ISM8_IN_$DATAPOINT_TYPE", 1);
IPS_SetVariableProfileAssociation("_ISM8_IN_$DATAPOINT_TYPE", 0, "Automatikbetrieb", "", 0xFFFFFF);
IPS_SetVariableProfileAssociation("_ISM8_IN_$DATAPOINT_TYPE", 2, "Dauerbetrieb", "", 0xFFFFFF);
IPS_SetVariableProfileAssociation("_ISM8_IN_$DATAPOINT_TYPE", 4, "Standby", "", 0xFFFFFF);
break;
case "DPT_HVACContrMode": // Integer (1)
// Profile für INPUT-ID 2/15/28/41/ ACHTUNG!!!! hinter dem Befehl steht der Wert der an die Anlage gesendet werden MUSS!!
if ($DATAPOINT_ID == 2 || $DATAPOINT_ID == 15 || $DATAPOINT_ID == 28 || $DATAPOINT_ID == 41)
{
IPS_CreateVariableProfile("_ISM8_IN_$DATAPOINT_TYPE", 1);
IPS_SetVariableProfileAssociation("_ISM8_IN_$DATAPOINT_TYPE", 0, "Test", "", 0xFFFFFF); // 7
IPS_SetVariableProfileAssociation("_ISM8_IN_$DATAPOINT_TYPE", 1, "Start", "", 0xFFFFFF); // 1
IPS_SetVariableProfileAssociation("_ISM8_IN_$DATAPOINT_TYPE", 2, "Frost Heizkreis", "", 0xFFFFFF); // 11
IPS_SetVariableProfileAssociation("_ISM8_IN_$DATAPOINT_TYPE", 3, "Frost Warmwasser", "", 0xFFFFFF); // 11
IPS_SetVariableProfileAssociation("_ISM8_IN_$DATAPOINT_TYPE", 4, "Schornsteinfeger", "", 0xFFFFFF); // 0
IPS_SetVariableProfileAssociation("_ISM8_IN_$DATAPOINT_TYPE", 5, "Kombibetrieb", "", 0xFFFFFF); // 1
IPS_SetVariableProfileAssociation("_ISM8_IN_$DATAPOINT_TYPE", 6, "Parallelbetrieb", "", 0xFFFFFF); // 1
IPS_SetVariableProfileAssociation("_ISM8_IN_$DATAPOINT_TYPE", 7, "Warmwasserbetrieb", "", 0xFFFFFF); // 1
IPS_SetVariableProfileAssociation("_ISM8_IN_$DATAPOINT_TYPE", 8, "Warmwassernachlauf", "", 0xFFFFFF); // 1
IPS_SetVariableProfileAssociation("_ISM8_IN_$DATAPOINT_TYPE", 9, "Mindest-Kombizeit", "", 0xFFFFFF); // 1
IPS_SetVariableProfileAssociation("_ISM8_IN_$DATAPOINT_TYPE", 10, "Heizbetrieb", "", 0xFFFFFF); // 1
IPS_SetVariableProfileAssociation("_ISM8_IN_$DATAPOINT_TYPE", 11, "Nachlauf Heizkreispumpe", "", 0xFFFFFF); // 1
IPS_SetVariableProfileAssociation("_ISM8_IN_$DATAPOINT_TYPE", 12, "Frostschutz", "", 0xFFFFFF); // 11
IPS_SetVariableProfileAssociation("_ISM8_IN_$DATAPOINT_TYPE", 13, "Standby", "", 0xFFFFFF); // 6
IPS_SetVariableProfileAssociation("_ISM8_IN_$DATAPOINT_TYPE", 14, "Kaskadenbetrieb", "", 0xFFFFFF); // 1
IPS_SetVariableProfileAssociation("_ISM8_IN_$DATAPOINT_TYPE", 15, "GLT-Betrieb", "", 0xFFFFFF); // 7
IPS_SetVariableProfileAssociation("_ISM8_IN_$DATAPOINT_TYPE", 16, "Kalibration", "", 0xFFFFFF); // 15
IPS_SetVariableProfileAssociation("_ISM8_IN_$DATAPOINT_TYPE", 17, "Kalibration Heizbetrieb", "", 0xFFFFFF); // 15
IPS_SetVariableProfileAssociation("_ISM8_IN_$DATAPOINT_TYPE", 18, "Kalibration Warmwasserbetrieb", "", 0xFFFFFF); // 15
IPS_SetVariableProfileAssociation("_ISM8_IN_$DATAPOINT_TYPE", 19, "Kalibration Kombibetrieb", "", 0xFFFFFF); // 15
}
// Profile für INPUT-ID 178 ACHTUNG!!!! hinter dem Befehl steht der Wert der an die Anlage gesendet werden MUSS!!
if ($DATAPOINT_ID == 178)
{
IPS_CreateVariableProfile("_ISM8_IN2_$DATAPOINT_TYPE", 1);
IPS_SetVariableProfileAssociation("_ISM8_IN2_$DATAPOINT_TYPE", 0, "ODU Test", "", 0xFFFFFF); // 7
IPS_SetVariableProfileAssociation("_ISM8_IN2_$DATAPOINT_TYPE", 1, "Test", "", 0xFFFFFF); // 7
IPS_SetVariableProfileAssociation("_ISM8_IN2_$DATAPOINT_TYPE", 2, "Frostschutz HK", "", 0xFFFFFF); // 11
IPS_SetVariableProfileAssociation("_ISM8_IN2_$DATAPOINT_TYPE", 3, "Frostschutz Warmwasser", "", 0xFFFFFF); // 11
IPS_SetVariableProfileAssociation("_ISM8_IN2_$DATAPOINT_TYPE", 4, "Durchfluss gering", "", 0xFFFFFF); // 1
IPS_SetVariableProfileAssociation("_ISM8_IN2_$DATAPOINT_TYPE", 5, "Vorwärmung", "", 0xFFFFFF); // 2
IPS_SetVariableProfileAssociation("_ISM8_IN2_$DATAPOINT_TYPE", 6, "Abtaubetrieb", "", 0xFFFFFF); // 11
IPS_SetVariableProfileAssociation("_ISM8_IN2_$DATAPOINT_TYPE", 7, "Antilegionellenfunktion", "", 0xFFFFFF); // 0
IPS_SetVariableProfileAssociation("_ISM8_IN2_$DATAPOINT_TYPE", 8, "Warmwasserbetrieb", "", 0xFFFFFF); // 1
IPS_SetVariableProfileAssociation("_ISM8_IN2_$DATAPOINT_TYPE", 9, "WW-Nachlauf", "", 0xFFFFFF); // 1
IPS_SetVariableProfileAssociation("_ISM8_IN2_$DATAPOINT_TYPE", 10, "Heizbetrieb", "", 0xFFFFFF); // 1
IPS_SetVariableProfileAssociation("_ISM8_IN2_$DATAPOINT_TYPE", 11, "HZ-Nachlauf", "", 0xFFFFFF); // 1
IPS_SetVariableProfileAssociation("_ISM8_IN2_$DATAPOINT_TYPE", 12, "Aktive Kühlung", "", 0xFFFFFF); // 3
IPS_SetVariableProfileAssociation("_ISM8_IN2_$DATAPOINT_TYPE", 13, "Kaskade", "", 0xFFFFFF); // 1
IPS_SetVariableProfileAssociation("_ISM8_IN2_$DATAPOINT_TYPE", 14, "GLT", "", 0xFFFFFF); // 7
IPS_SetVariableProfileAssociation("_ISM8_IN2_$DATAPOINT_TYPE", 15, "Standby", "", 0xFFFFFF); // 6
IPS_SetVariableProfileAssociation("_ISM8_IN2_$DATAPOINT_TYPE", 16, "Pump down", "", 0xFFFFFF); // 3
}
break;
case "DPT_TimeOfDay": // String (3)
// Profile für INPUT-ID 156/157/161/162
IPS_CreateVariableProfile("_ISM8_IN_$DATAPOINT_TYPE", 3);
break;
case "DPT_Date": // String (3)
// Profile für INPUT-ID 154/155/159/160
IPS_CreateVariableProfile("_ISM8_IN_$DATAPOINT_TYPE", 3);
break;
}
}
function _ISM8_PDT_SCALING($HEX)
{
return round(($HEX & 0xff) * 100 / 255, 3);
}
function _ISM8_PDT_KNX_FLOAT($HEX, $RES=0.01)
{
$sign = ($HEX & 0x8000) >> 15; //0x8000 = 1000 0000 0000 0000 dieses Bit ist das Vorzeichen (-)
$exponent = ($HEX & 0x7800) >> 11; // 0x7800 = *0111 1000 0000 0000 diese bits sind für den exponeten.
$mantisse = $HEX & 0x07ff; // 0x07ff = *0000 0111 1111 1111 diese Bits stellen die Range dar
if ($sign != 0) {
$mantisse = -(~($mantisse - 1) & 0x07ff);
}
$value = (1 << $exponent) * $RES * $mantisse;
return $value;
}
function _ISM8_PDT_LONG($HEX)
{
return ($HEX > 2147483647 and $HEX - 2147483648 or $HEX);
}
function _ISM8_PDT_TIME($HEX)
{
$b1 = ($HEX & 0xff0000) >> 16;
$b2 = ($HEX & 0x00ff00) >> 8;
$b3 = ($HEX & 0x0000ff);
$weekday = ($b1 & 0xe0) >> 5;
//@weekdays = ["","Mo","Di","Mi","Do","Fr","Sa","So"];
$hour = $b1 & 0x1f;
$min = $b2 & 0x3f;
$sec = $b3 & 0x3f;
$value = sprintf("%s %d:%d:%d", $weekday, $hour, $min, $sec);
return $value;
}
function _ISM8_PDT_DATE($HEX)
{
$b1 = ($HEX & 0xff0000) >> 16;
$b2 = ($HEX & 0x00ff00) >> 8;
$b3 = ($HEX & 0x0000ff);
$day = $b1 & 0x1f;
$mon = $b2 & 0xf;
$year = $b3 & 0x7f;
if ($year < 90) {
$year += 2000; }
else {
$year += 1900;
}
$value = sprintf("%02d.%02d.%04d", $day, $mon, $year);
return $value;
}
function _ISM8_CREATE_VARIABLE($ID, $IDENT, $DPNAME, $TYPE, $SORTID=0, $PROFILE)
{
$VARID = @IPS_GetObjectIDByIdent($IDENT, $ID);
if($VARID === false)
{
$VARID = IPS_CreateVariable($TYPE);
IPS_SetParent($VARID, $ID);
IPS_SetName($VARID, $DPNAME);
IPS_SetIdent($VARID, $IDENT);
IPS_SetPosition($VARID, $SORTID);
IPS_SetVariableCustomProfile($VARID, "_ISM8_$PROFILE");
}
return $VARID;
}
function _ISM8_REVERSEBIT($BIT)
{
return strtr($BIT,[1,0]);
}
function _ISM8_DECBIN($DEC, $MAXBIT=16)
{
return str_pad(decbin($DEC), $MAXBIT, "0", STR_PAD_LEFT);
}
function _ISM8_PDT_KNX_FLOAT_DEC($DEC, $RES=0.01)
{
$val = $DEC / $RES;
$exp = 0;
while (!($val <= 2047 && $val >= -2048 ))
{
$val = $val / 2;
$exp++;
}
// wenn DEC negativ, dann bilde das zweier-Komplement
if ($DEC < 0)
{
$bin = _ISM8_DECBIN(-1 * $val, 11);
$bin = _ISM8_REVERSEBIT($bin);
$bin = decbin(bindec($bin) + 1);
$sign = 1;
}
else
{
$bin = _ISM8_DECBIN($val, 11);
$sign = 0;
}
$expbin = _ISM8_DECBIN($exp, 4);
$ret = dechex(bindec($sign.$expbin.$bin));
return $ret;
}
// Wandelt die mit IPS_GetVariableProfile ermittelte Daten in Namen um, wird in _ISM8_HELP_DATAPOINT
function _ISM8_IPS_GETVARIABLEPROFILENAME($TYPE){
switch($TYPE){
case "0":
$STATUS="Boolean";
break;
case "1":
$STATUS="Integer";
break;
case "2":
$STATUS="Float";
break;
case "3":
$STATUS="String";
break;
}
return $STATUS;
}
// ruft man die Funktion ohne Wert auf, gibt sie eine Liste mit Datenpunkte aus die Inputs akzeptieren
// ruft man die Funktion dann mit dem Wert des Datenpunktes auf, so gibt es weitere Informationen aus.
function _ISM8_HELP_DATAPOINT($DPID="help"){
global $DP;
if ("$DPID" == "help") {
echo "Hilfe: Folgende Datenpunkte nehmen Datem entgegen
";
foreach ($DP as $ID){
if ($ID[5] === "In") {
echo "".$ID[0]." ".$ID[1]." ".$ID[2]." ".$ID[3]."
";
}
}
}
else {
$ID = $DP[$DPID];
if ($ID[5] === "In") {
$CREATED_PROFILE_NAME = "_ISM8_$ID[3]";
$IPS_PROFILE = IPS_GetVariableProfile($CREATED_PROFILE_NAME);
$IPS_PROFILENAME = _ISM8_IPS_GETVARIABLEPROFILENAME($IPS_PROFILE['ProfileType']);
echo "Datenpunkt: ".$ID[0]."
Gerät: ".$ID[1]."
Datenpunkt: ".$ID[2]."
IPS Profilname:".$CREATED_PROFILE_NAME."
";
echo "Schrittweite min.: ".$IPS_PROFILE['MinValue']."
";
echo "Schrittweite max.: ".$IPS_PROFILE['MaxValue']."
";
echo "Schrittweite: ".$IPS_PROFILE['StepSize']."
";
echo "Anzahl Stellen: ".$IPS_PROFILE['Digits']."
";
echo "Prefix: ".$IPS_PROFILE['Prefix']."
";
echo "Suffix: ".$IPS_PROFILE['Suffix']."
";
echo "Profiltyp: $IPS_PROFILENAME
";
foreach ($IPS_PROFILE['Associations'] AS $id => $Name){
echo " Wert: $Name[Value] $Name[Name]
";
}
}
else { echo "Dieser Datenpunkt nimmt keine Inputs an"; }
}
}
?>
Die erste Variable namens „SERVERSOCKET“ musst du anpassen. Dort kommt die Objekt-ID deiner Anlage rein (die du dir oben merken solltest
)
Nun legst Du ein Script namens „Event Receiver“ mit folgendem Inhalt an.
<?
$FUNCTION_INC = IPS_GetScriptIDByName("_ISM8_FUNCTIONS", IPS_GetParent($_IPS['SELF']));
include("$FUNCTION_INC.ips.php");
$DATAPOINT_INC = IPS_GetScriptIDByName("_ISM8_DATAPOINTS", IPS_GetParent($_IPS['SELF']));
include("$DATAPOINT_INC.ips.php");
if($_IPS['SENDER'] == "RegisterVariable")
{
$HEX = _ISM8_READ_DATA_TO_ARRAY($_IPS['VALUE']);
// wenn Mainservice - Array 10 = F0 und Subservice - Array = 06, dann sende eine Antwort. Unterbleibt eine Antwort, sendet die ISM8 die Nachricht noch 5x.
if ($HEX[10] == "F0" and $HEX[11] == "06"){
_ISM8_SEND_ACK($HEX);
}
$TELEGRAM = _ISM8_READ_TELEGRAM($HEX);
foreach($TELEGRAM as $DTP){
$DTP_VALUE = $DTP['DATAPOINT_TYPE_VALUE'];
if ($DTP['DATAPOINT_IPS_TYPE'] == 0 ){
switch ($DTP['DATAPOINT_TYPE_VALUE'])
{
case "on";
case "enable" ;
case "true" ;
case "close";
$DTP_VALUE = true;
break;
case "off";
case "disable" ;
case "false" ;
case "open";
$DTP_VALUE = false;
break;
}
}
$DATAPOINT_TYPE = $DTP['DATAPOINT_TYPE'];
if (! IPS_VariableProfileExists("_ISM8_$DATAPOINT_TYPE"))
{
//echo "Profil existiert nicht!";
_ISM8_CREATE_VARIABLE_PROFILE($DATAPOINT_TYPE);
}
$IPS_IDENT = "DTP_".$DTP['DATAPOINT_ID'];
$IPS_NAME = $DTP['DATAPOINT_ID']."_".$DTP['DATAPOINT_NAME'];
SetValue(_ISM8_CREATE_VARIABLE($_IPS['SELF'], $IPS_IDENT, $IPS_NAME, $DTP['DATAPOINT_IPS_TYPE'], $DTP['DATAPOINT_ID'], $DTP['DATAPOINT_TYPE']), $DTP_VALUE);
}
}
?>
Jetzt legen wir eine „Register Variable“ an. Als Ziel nutzen wir unser Script „Event Receiver“ und als „übergeordnete Instanz“ unser „ISM8 Server Socket“.
Im Prinzup war es das. Sobald Daten ankommen, quittiert das Script „Event Receiver“ und die Daten kommen nicht min 5x an. Alle Vairablen werden automatisch angelegt, sowie alle Profile.
Initial würde ich aber ein Script namens „Get_all_Data“ anlegen.
<?
$FUNCTION_INC = IPS_GetScriptIDByName("_ISM8_FUNCTIONS", IPS_GetParent($_IPS['SELF']));
include("$FUNCTION_INC.ips.php");
$DATAPOINT_INC = IPS_GetScriptIDByName("_ISM8_DATAPOINTS", IPS_GetParent($_IPS['SELF']));
include("$DATAPOINT_INC.ips.php");
_ISM8_RELOAD_ALL_DATA();
?>
Dieses Script kannst Du nun ausführen, es wird ein Befehl an die ISM8 gesendet und alle Werte die Deine Anlage so besitzt werden zurückkgegeben.
Nun etwas Erklärung…
Die Anlage sendet immer 5x Daten es sei denn, diese werden nach dem ersten mal quittiert, dies übernimmt der „Event Receiver“. Daten Senden geht auch, das hast Du mit dem letzten Script „Get_all_Data“ schon gemacht.
Derzeit schreibe ich noch an drei Funktionen. Die eine schickt „Rohdaten“ an die Anlage (also fertige HEX Daten) und die andere prüft vorher, ob die Daten auch Valide sind.
Die letzte Funktion soll es erlauben, die Datenpunkt-ID anzugeben und den Wert mitzuliefern ohne das man die Daten hin und her rechnen muss (also Dezimal, Hex etc).
Ich habe noch als Problem das nach dem Senden der Daten nicht immer eine Rückmeldung kommt. Sende ich also an die Anlage bspw „1x Warmwasser“ über das Script, bekommst die Anlage das mit und die Temparatur steigt (was ich auch empfange) aber der Wert „1x Warmwasser“ wird eben nicht mehr mitgegeben. Ich muss über „_ISM8_RELOAD_ALL_DATA();“ die Werte neu Anfragen.
Anonsten fehlt mir nur Zeit 
Möchtest Du Testweise was senden, geht das am einfachsten, indem Du den Inhalt vom Script „Get_all_Data“ kopierst und die Function "_ISM8_RELOAD_ALL_DATA()
löscht. Füge stattdessen das hinzu
$HEX="HIER KOMMT DEIN HEX CODE REIN";
$HEX=str_replace(" ","",$HEX);
$PREP_TELEGRAM = pack("H*" ,"$HEX");
echo "SSCK_SendText($SERVERSOCKET,$PREP_TELEGRAM)";
Die Hexwerte kannst Du im Debug-Fenster „sammeln“ oder eben selber berechnen (wie, steht in der ISM8 Anleitung), die meisten Funktionen sind dafür aber da 
Das ganze ist leider nicht ganz trivial, das wirst Du merken wenn Du dir die Anleitung durchliest und dir meine Funktionen dafür anschaust…
Ich werde natürlich weiterhin an dem Script arbeiten und meine Erfolge hier rein bringen, aber ein Modul werde ich wohl nicht erstellen. Das Script hier ist schon kompliziert genug 
VIele Grüße
Kris
Update 17.05.18
Ich habe zwei Neue Funktionen in die _ISM8_FUNCTIONS eingefügt.
_ISM8_IPS_GETVARIABLEPROFILENAME() und wandelt die mit IPS_GetVariableProfile ermittelte Daten in Namen um, die wird in _ISM8_HELP_DATAPOINT aufgerufen
_ISM8_HELP_DATAPOINT() gibt ohne Wert eine Liste mit alen Datenpunkten auf, die Inputs akzeptieren. Gibt man als Wert die Datenpunktid ein, gibt es weitere Infos zu diesem Datenpunkt aus.
Viele Grüße