Gå til innhold
  • Bli medlem
Støtt hjemmeautomasjon.no!

Programmere mot RFLink


Lazarus

Anbefalte innlegg

Da det er noe interesse for å utvikle plugins og bindings for RFLink til forskjelige systemer(Ref) så tenker jeg vi kunne samlet ressurser og kode slik at det blir lettere for alle.

 

Om RFLink protokollen:

RFLink enheten sender sting verdier mellom arduinoen og datamskinen i dette formatet:

20;ID=9999;Name;LABEL=data;

 

De forskjellige semikolon-separerte seksjonene består av

1. verdien 10 eller 20, der 10 betyr kommando fra server og 20 betyr mottatt fra RFLink.

2. er løpenummer for pakkesekvens. hexadesimal

3. Protokoll navn

4. Adresse

5. Verdier/kommandoer. Kan være flere verdier i en string

 

http://www.nemcon.nl/blog2/protref

 

Så langt har jeg kastet meg på https://github.com/cyrilcc/org.openhab.binding.rflink for utvikling av binding for OpenHAB.

 

Kjører i dag en rule(script) for å lese string fra COM, men vil gå over til binding snart.

 

Rule jeg bruker i dag:

Spoiler

import java.util.HashMap
import java.util.LinkedHashMap


var HashMap<String, SwitchItem> Devices

rule "RFLink startup"
when
	System started
then
	 Devices =
        newLinkedHashMap(
			"5A029A_00"			->	TestRF0,
			"5A029A_00_ALL"		->	TestRF0_All,
			"5A029A_01"			->	TestRF1,
			"5A029A_01_ALL"		->	TestRF1_All,
			"5A029A_01_COLOR"	->	TestRF1_Color,
			"5A029A_01_BRIGHT"	->	TestRF1_Bright,
			"5A029A_02"			->	TestRF2,
			"5A029A_02_ALL"		->	TestRF2_All,
			"5A029A_02_COLOR"	->	TestRF2_Color,
			"5A029A_02_BRIGHT"	->	TestRF2_Bright,
			"5A029A_03"			->	TestRF3,
			"5A029A_03_ALL"		->	TestRF3_All,
			"5A029A_03_COLOR"	->	TestRF3_Color,
			"5A029A_03_BRIGHT"	->	TestRF3_Bright,
			"5A029A_04"			->	TestRF4,
			"5A029A_04_ALL"		->	TestRF4_All,
			"5A029A_04_COLOR"	->	TestRF4_Color,
			"5A029A_04_BRIGHT"	->	TestRF4_Bright
		)
end

rule "RFLink"
when
	Item RFLink received update
then
	val String[] commandsArray = RFLink.state.toString().split(";")
	//var String Addr = commandsArray.get(0)
	//var String sequence = commandsArray.get(1)
	var String Protocol = commandsArray.get(2)
	if (Protocol=="MiLightv1"){
		var String ID = commandsArray.get(3).replace("ID=","")
		var String Switch = commandsArray.get(4).replace("SWITCH=","")
		var String RGB = commandsArray.get(5).replace("RGB=","")
		var String Command = commandsArray.get(6).replace("CMD=","")
		if(!Command.contains("ALL")){
			var String Commandtype = ""
			var String NewCommand = Command
			switch(Command) {
				case "COLOR": {
					Commandtype="_" + Command
					switch(RGB){
						case "FF00" : NewCommand="ON"
						case "0000" : NewCommand="OFF"
					}
				}
				case "BRIGHT": {
					Commandtype="_" + Command
					switch(RGB){
						case "00FF" : NewCommand="ON"
						case "0000" : NewCommand="OFF"
					}
				}
				case "ALLOFF":{
					Commandtype="_ALL"
					NewCommand=Command.replace("ALL","")
				}
				case "ALLON":{
					Commandtype="_ALL"
					NewCommand=Command.replace("ALL","")
				}
			}
			Command=NewCommand
			
			var SwitchItem Device = Devices.get(ID+"_"+Switch+Commandtype)
			sendCommand(Device, Command)
		}
	}
end

rule "Light_GF_Storage_Ceiling_RFLink"
when
	Item Light_GF_Storage_Ceiling received command
then
	if(receivedCommand==ON || receivedCommand == OFF){
		sendCommand(RFLink,"10;MiLightv1;5AFD8D;01;0000;"+receivedCommand.toString+";\r\n")
	}else{logInfo("LightGFStor",receivedCommand.toString)}
end
rule "Light_Outdoor_Frontdoor_RFLink"
when
	Item Light_Outdoor_Frontdoor received command
then
	if(receivedCommand==ON || receivedCommand == OFF){
		sendCommand(RFLink,"10;MiLightv1;5AFD8D;02;0000;ALL"+receivedCommand.toString+";\r\n")
	}else{logInfo("LightGFFront",receivedCommand.toString)}
end

 

Har tidligere benyttet denne koden for å kommunisere med serie enheter i .Net. Kanskje den kan komme til hjelp for de av dere som kjører Homeseer?

Spoiler

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO.Ports;
using System.Runtime.InteropServices;

namespace ConsoleApplication1
{

    class PortDataReceived
    {
        static SerialPort mySerialPort;
        public static void Main()
        {
            handler = new ConsoleEventDelegate(ConsoleEventCallback);
            SetConsoleCtrlHandler(handler, true);
            mySerialPort = new SerialPort("COM15");

            mySerialPort.BaudRate = 9600;
            mySerialPort.Parity = Parity.None;
            mySerialPort.StopBits = StopBits.One;
            mySerialPort.DataBits = 8;
            mySerialPort.Handshake = Handshake.None;
            mySerialPort.RtsEnable = true;

            mySerialPort.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler);

            mySerialPort.Open();

            while (true)
            {
                mySerialPort.WriteLine(Console.ReadLine());
            }
        }
        private static void DataReceivedHandler(
                            object sender,
                            SerialDataReceivedEventArgs e)
        {
            SerialPort sp = (SerialPort)sender;
            string indata = sp.ReadExisting();
            Console.Write("Data Received:");
            Console.WriteLine(indata);
        }
        static bool ConsoleEventCallback(int eventType)
        {
            if (eventType == 2)
            {
                mySerialPort.Close();
            }
            return false;
        }
        static ConsoleEventDelegate handler;   // Keeps it from getting garbage collected
                                               // Pinvoke
        private delegate bool ConsoleEventDelegate(int eventType);
        [DllImport("kernel32.dll", SetLastError = true)]
        private static extern bool SetConsoleCtrlHandler(ConsoleEventDelegate callback, bool add);
    }
}

 

  • Like 1
Lenke til kommentar
Del på andre sider

I første omgang begynner jeg med avlesning via ser2net. Jeg klarte enkelt å koble meg til for å lese. 

Men samtidig ser jeg fordelen av å inkludere com tilkobling selv om det er mer utfordrende. 

 

For å være "ekkel' så kommer jeg til å bruke C# ikke vb.Net. Men det viktigste er vel å klare å få til noe. 

 

Lenke til kommentar
Del på andre sider

10 timer siden, Moskus skrev:

Er det veldig, veldig lett å gjøre dette over IP istedenfor seriel-porter? 1f60c.png

Ser2net og liknende metoder bruker en socket til socket metode som skal la seg bruke på en enkel måte. Du kobler da til via TCP på rett port, og deretter bruker den tilkoblingen på samme måte som om det var serieporten.

 

Du må fortsatt via en Raspberry Pi ettersom at RFLink ikke støtter å kjøres over nett direkte...

Lenke til kommentar
Del på andre sider

2 timer siden, Lazarus skrev:

Du må fortsatt via en Raspberry Pi ettersom at RFLink ikke støtter å kjøres over nett direkte...

Ah. Det var det som var håpet. Et enkelt ethernet-shield, og så tur-og-kjør. Oh well...

 

9 timer siden, Guahtdim skrev:

For å være "ekkel' så kommer jeg til å bruke C# ikke vb.Net. Men det viktigste er vel å klare å få til noe. 

Nå er jo C# og VB.net skremmende litt. Bare litt forskjellig syntaks, og å gjøre det ene eller det andre spiller jo ikke så stor rolle. :) 

Lenke til kommentar
Del på andre sider

Igår fikk jeg testet en liten kodesnutt for å koble seg opp mot Usb/Com port. Siden jeg glemte å sette opp stopp bit i starten så kom det bare "skwomph", men etter å ha fått satt opp alle com parametre riktig så dukket det opp forståelig info om enheter.

 

Så langt har jeg fått sett at jeg har mulighet til å lese både over nettverk og seriellport.

 

Så nå starter jobben. Først må jeg sette meg inn i plugins for homeseer. Lese litt dokumentasjon, kursene til Moskus og tråle Homeseer fora etter info og tips. Ett av mine første spørsmål så fort jeg får tilgang er å spørre ang. utviklingsmiljø. Jeg ser for meg å gjøre en egen installasjon på ett vm for å kunne leke litt.

Lenke til kommentar
Del på andre sider

1 time siden, Guahtdim skrev:

Så langt har jeg fått sett at jeg har mulighet til å lese både over nettverk og seriellport.

Hvordan? Via ser2net og en RPI? Det er min forståelse at RFLink ikke støtter Ethernet shield.

Eller har du endret koden til RFLink?

Lenke til kommentar
Del på andre sider

32 minutter siden, Guahtdim skrev:

Beklager at jeg ikke har vært mer spesifikk, men Ser2net og RPI.

 

Hum... nå håpet jeg på en stornyhet om at de støttet Ethernet shield eller NodeMCU... jaja lov å håpe ?

Lenke til kommentar
Del på andre sider

Driver og roter rundt med kildekoden til Moskus. Begynner såvidt å skjønne litt, men sliter litt med at jeg synes ting var litt smartere i Domoticz (iallefall når man skal legge til ett termometer og man har 20 av de). Litt tøff overgang og ikke ha en device-liste man plukker fra for så å legge til (snakker her om RFXCom i Homeseer som jeg kikker litt på for inspirasjon). F.eks. hvis man har føler/termometer med fuktighetsmåler i Domoticz så tar den inn alle funksjoner, mens i Homeseer så går man inn og plukker en og en. Ville det ikke vært mer naturlig å ta alt som en enhet? Eller er det jeg som er så nybegynner at jeg ikke skjønner opplegget.

 

Men ting ruller sakte men sikker forover. Problemet er at man har veldig begrenset med tid til utvikling. Det blir mest på toget til og fra jobb hvor innsatsen ikke blir effektiv. 

Lenke til kommentar
Del på andre sider

3 timer siden, Guahtdim skrev:

Ville det ikke vært mer naturlig å ta alt som en enhet? Eller er det jeg som er så nybegynner at jeg ikke skjønner opplegget.

Du kan jo velge, i praksis kan du jo skrive hva du vil som devicestring.

Men det er enklere å håndtere flere "devicer" i HomeSeer enn hvis de er samlet. Se litt på parent og child-devicer, det er mulig å gruppere dem (noe Bert i RFXCOM dessverre ikke har gjort). :) 

Lenke til kommentar
Del på andre sider

Den 11.5.2017 klokken 13.17, Moskus skrev:

Se litt på parent og child-devicer, det er mulig å gruppere dem (noe Bert i RFXCOM dessverre ikke har gjort). :) 

 

Jeg har nå lagt til en temperatur sensor og en luftfuktighets sensor som er i samme fysiske boks, hvordan kan jeg gruppere disse sammen til 2 child under en parent i HS3?

De er lagt til via RFXCOM-puginen.

Lenke til kommentar
Del på andre sider

13 hours ago, Ruud said:

 

Jeg har nå lagt til en temperatur sensor og en luftfuktighets sensor som er i samme fysiske boks, hvordan kan jeg gruppere disse sammen til 2 child under en parent i HS3?

De er lagt til via RFXCOM-puginen.

Jeg er nybegynner selv når det kommer til RfxCom så jeg er ikke sikker på hvordan man kan samle dette. Mulig @Moskus har ett godt svar på dette?

Lenke til kommentar
Del på andre sider

  • 2 uker senere...

En liten statusrapport:

Driver og ser på noe plugin-templates for C# etter å ha nesten oversatt deler av @Moskus sitt prosjekt. Jeg føler jeg begynner å få kontroll, men det er fortsatt ett langt stykke fram til å ha noe kjørende som kan presenteres.

 

Men jeg blir litt skuffet over hva jeg har fått i Homeseer siden jeg for tiden kjører Domoticz (jeg har ikke orket å flytte over enda).

Domoticz koster ingenting og gir deg følgende ut av boksen:

  • Støtte for RfxCom (må kjøpes som plugin hos Homeseer)
  • Støtte for RFLink (finnes ikke for Homeseer)
  • Historie alle enheter(må kjøpes som plugin hos Homeseer)
  • Grafer for alle enheter(må kjøpes som plugin hos Homeseer)
  • Kjører som service (funker ikke for Homeseer?)

Mulig det er mer også. Det eneste som gjør at jeg ikke angrer kjøpet av Homeseer er at det snakker ett av språkene mine (C#). Mulig jeg oppdager mer positive ting med Homeseer når jeg får brukt litt mer tid på det.

Lenke til kommentar
Del på andre sider

En fyr har faktisk laget en template. Så fort man skjønner at -r <ip-adresse> må brukes hvis du kjører remote så går det feiende fort å komme opp med en default tom plugin i C#.

Fra tråden https://forums.homeseer.com/showthread.php?t=178122

https://marketplace.visualstudio.com/items?itemName=thealexdresko.HomeSeerTemplates-18379 - template

I tillegg er de nødvendige dll-er laget som en nuget pakke.

 

Han kjører ett powershell script for å fikse noe greier (gadd ikke sette meg inn i det) som man bør fjerne hvis man kjører remote. Editer csproj-filen og kommenter ut

<!--

<Target Name="AfterBuild">
    <Exec Command="powershell -file &quot;$(ProjectDir)fix-output.ps1&quot; -configuration $(ConfigurationName) -executionpolicy Unrestricted -NonInteractive" />
  </Target>

-->

Lenke til kommentar
Del på andre sider

Bli med i samtalen

Du kan publisere innhold nå og registrere deg senere. Hvis du har en konto, logg inn nå for å poste med kontoen din.

Gjest
Skriv svar til emnet...

×   Du har limt inn tekst med formatering.   Lim inn uten formatering i stedet

  Du kan kun bruke opp til 75 smilefjes.

×   Lenken din har blitt bygget inn på siden automatisk.   Vis som en ordinær lenke i stedet

×   Tidligere tekst har blitt gjenopprettet.   Tøm tekstverktøy

×   Du kan ikke lime inn bilder direkte. Last opp eller legg inn bilder fra URL.

×
×
  • Opprett ny...

Viktig informasjon

Vi har plassert informasjonskapsler/cookies på din enhet for å gjøre denne siden bedre. Du kan justere dine innstillinger for informasjonskapsler, ellers vil vi anta at dette er ok for deg.