Jump to content
  • Sign Up
Støtt hjemmeautomasjon.no!
  • 0

modbus2mqtt - Med eksempel for flexit


Question

Posted (edited)

Hei. 

 

Link til Github

 

Hardware brukt:

Flexit CI66

Usr-Tcp232-410S

 

Da jeg har flyttet inn i ny bolig med flexit og jeg ville styre dette via HS4 så har jeg laget et script i python som leser dataene som er satt opp i en separat fil via en modbusRTU/TCP konverter og sender det ut på MQTT. Det kan også motta kommander for å skrive, foreløpig kun til holding registers. Hvilke som kan skrives til defineres i konfigurasjonsfilen, da har man litt ekstra sikkerhet tilfelle noe galt skulle skje. Grunnen til at jeg har gjort det slik er at det krever minimalt med oppsett i toppsystemet. Feks i HS4 og mcsMQTT så oppdager den alle topicene selv og det er bare å trykke legg til, det kan i prinsippet gjøre at alle toppsystemer som støtter MQTT kan nå lese og skrive til modbus.

 

I scriptet er den en variabel som må endres og det er "config_file" som for øyeblikket ligger på linje 12. Den skal være til configfilen som er aktiv.

 

MQTT topic blir som følger "basetopic/{holding_registers/input_registers}/{register nummer}/{register navn}/s"  den siste "s" er for "status" når det skal skrives til modbus endres denne til "c".

 

MQTT settings er ganske selvforklarende

 

Modbus settings: 

server_adress: Adressen til modbusTCP serveren/konverteren

server_port: Porten som er brukt for tilkobling på serveren

unit_id: Normalt er den 1 men kommer til an på implementasjonen av modbus på serversiden

read_delay: Hvor lenge den venter mellom hver gang det leses oppgitt i 1/100. 50 = 500ms = 2Hz

 

Holding og input register:

"holding_registers":{ 
	"0":{ Register nummer
		"name":"Supply_Air_Speed_1", Navn som brukes i MQTT topic
		"writeable":"True", True = kan skrives til fra MQTT, brukes kun i holding registers. Scriptet vil kun subscribe til topics hvor denne er "True"
		"size":"16", 16 = 16 bit = 1 register & 32 = 32 bit = 2 register
		"unit":"%", Foreløpig ikke brukt til noe
		"scaling":"1", Skalering. Verdien vil multipliseres med denne verdien før den sendes på MQTT. Og motsatt når den blir sendt fra MQTT til modbus
		"signed":"True" Om verdien er en "int" = True, uint = "False"
	},

 

Ting som foreløpig mangler:

- Kunne skrive 32bit verdier og dele disse opp til 16bit og skrive til hvert register

- Lese Discrete inputs

- Lese coils

- Skrive coils

 

Hvordan det ser ut i HS4 hos meg:

image.thumb.png.0f23dc6a4d517e30d3d9437429026400.png

 

Eksempel konfig for flexit CI66

{
	"mqtt_settings":{
	"server_adress":"adress",
	"server_port":"1883",
	"server_user":"username",
	"server_password":"password",
	"basetopic":"82/ventilasjon/"
},
"modbus_settings":{
	"server_adress":"adress",
	"server_port":"26",
	"unit_id":"1",
	"read_delay":"50"
},
"unit_details":{
	"type":"Flexit_CI66",
	"name":"ventilasjon"
},
"holding_registers":{
	"0":{
		"name":"Supply_Air_Speed_1",
		"writeable":"True",
		"size":"16",
		"unit":"%",
		"scaling":"1",
		"signed":"True"
	},
	"1":{
		"name":"Supply_Air_Speed_2",
		"writeable":"True",
		"size":"16",
		"unit":"%",
		"scaling":"1",
		"signed":"True"
	},
	"2":{
		"name":"Supply_Air_Speed_3",
		"writeable":"True",
		"size":"16",
		"unit":"%",
		"scaling":"1",
		"signed":"True"
	},
	"3":{
		"name":"Supply_Air_Speed_4",
		"writeable":"True",
		"size":"16",
		"scaling":"1",
		"signed":"True"
	},
	"4":{
		"name":"Extract_Air_Speed_1",
		"writeable":"True",
		"size":"16",
		"unit":"%",
		"scaling":"1",
		"signed":"True"
	},
	"5":{
		"name":"Extract_Air_Speed_2",
		"writeable":"True",
		"size":"16",
		"unit":"%",
		"scaling":"1",
		"signed":"True"
	},
	"6":{
		"name":"Extract_Air_Speed_3",
		"writeable":"True",
		"size":"16",
		"unit":"%",
		"scaling":"1",
		"signed":"True"
	},
	"7":{
		"name":"Extract_Air_Speed_4",
		"writeable":"True",
		"size":"16",
		"scaling":"1",
		"signed":"True"
	},
	"8":{
		"name":"Set_Air_Temperature",
		"writeable":"True",
		"size":"16",
		"unit":"°C",
		"scaling":"10",
		"signed":"True"
	},
	"9":{
		"name":"Supply_Air_Min_Temp",
		"writeable":"True",
		"size":"16",
		"unit":"°C",
		"scaling":"10",
		"signed":"True"
	},
	"10":{
		"name":"Supply_Air_Max_Temp",
		"writeable":"True",
		"size":"16",
		"unit":"°C",
		"scaling":"10",
		"signed":"True"
	},
	"11":{
		"name":"Cooling_Outdoor_Air_Min_temp",
		"writeable":"True",
		"size":"16",
		"unit":"°C",
		"scaling":"10",
		"signed":"True"
	},
	"12":{
		"name":"Forced_Vent_Speed",
		"writeable":"True",
		"size":"16",
		"scaling":"1",
		"signed":"True"
	},
	"13":{
		"name":"Forced Vent_Time",
		"writeable":"True",
		"size":"16",
		"unit":"min",
		"scaling":"1",
		"signed":"True"
	},
	"14":{
		"name":"Air_Regulation_Type",
		"writeable":"True",
		"size":"16",
		"unit":"bool",
		"scaling":"1",
		"signed":"True"
	},
	"15":{
		"name":"Cooling_Active",
		"writeable":"True",
		"size":"16",
		"unit":"bool",
		"scaling":"1",
		"signed":"True"
	},
	"16":{
		"name":"Forced_Ventilation",
		"writeable":"True",
		"size":"16",
		"unit":"bool",
		"scaling":"1",
		"signed":"True"
	},
	"17":{
		"name":"Set_Air_Speed",
		"writeable":"True",
		"size":"16",
		"scaling":"1",
		"signed":"True"
	},
	"18":{
		"name":"Time",
		"writeable":"False",
		"size":"32",
		"unit":"s",
		"scaling":"1",
		"signed":"False"
	},
	"21":{
		"name":"Fire_Smoke_Mode",
		"writeable":"True",
		"size":"16",
		"scaling":"1",
		"signed":"True"
	}
},
"input_registers":{
	"6":{
		"name":"Time_1",
		"writeable":"False",
		"size":"32",
		"signed":"False"
	},
	"8":{
		"name":"Filter_Time",
		"writeable":"False",
		"size":"16",
		"signed":"False"
	},
	"9":{
		"name":"Supply_Air_temp",
		"writeable":"False",
		"size":"16",
		"unit":"°C",
		"scaling":"10",
		"signed":"True"
	},
	"10":{
		"name":"Extract_Air_temp",
		"writeable":"False",
		"size":"16",
		"unit":"°C",
		"scaling":"10",
		"signed":"True"
	},
	"11":{
		"name":"Outdoor_Air_temp",
		"writeable":"False",
		"size":"16",
		"unit":"°C",
		"scaling":"10",
		"signed":"True"
	},
	"14":{
		"name":"Heat_Exchanger",
		"writeable":"False",
		"size":"16",
		"unit":"%",
		"signed":"False"
	},
	"17":{
		"name":"Operational_Time",
		"writeable":"False",
		"size":"16",
		"unit":"%",
		"signed":"False"
	},
	"26":{
		"name":"Rotor_Alarm",
		"writeable":"False",
		"size":"16",
		"signed":"False"
	},
	"27":{
		"name":"Filter_Alarm",
		"writeable":"False",
		"size":"16",
		"signed":"False"
	},
	"28":{
		"name":"Heating_Active",
		"writeable":"False",
		"size":"16",
		"signed":"False"
	},
	"32":{
		"name":"Speed_1_counter",
		"writeable":"False",
		"size":"32",
		"signed":"False"
	},
	"34":{
		"name":"Speed_2_counter",
		"writeable":"False",
		"size":"32",
		"signed":"False"
	},
	"36":{
		"name":"Speed_3_counter",
		"writeable":"False",
		"size":"32",
		"signed":"False"
	},
	"42":{
		"name":"Total_run_counter",
		"writeable":"False",
		"size":"32",
		"signed":"False"
	},
	"47":{
		"name":"Actual_set_air_temperature",
		"writeable":"False",
		"size":"16",
		"scaling":"10",
		"signed":"True"
	},
	"48":{
		"name":"Actual_set_air_speed",
		"writeable":"False",
		"size":"16",
		"signed":"True"
	}

}
}

 

Edited by Christoffer
La til bilder

0 answers to this question

Recommended Posts

There have been no answers to this question yet

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.