Programmation PureBasic et domotique Velbus
Programmation PureBasic et domotique Velbus
Bonjour à tous,
je pense m'essayer à la domotique et j'ai choisi la marque Velbus (le fabricant est Velleman, pour ceux qui sont adeptes du fer à souder et des kits électroniques).
En gros, les modules sont plus ou moins autonomes mais ne savent pas gérer les conditions (et parfois même les états si plusieurs boutons contrôlent le même module (lampe)).
Avec un PC, Velbus founit une DLL d'analyse et de contrôle de trame du bus... alors à tout hasard : est-ce que quelqu'un du forum PureBasic aurait déjà joué avec ?
Les modules : http://www.velbus.eu/professionals/pricelist/
Le forum Velbus : http://forum.velleman.be/viewforum.php?f=13
Librairie .net (2.0) : http://forum.velleman.be/viewtopic.php?f=13&t=383
je pense m'essayer à la domotique et j'ai choisi la marque Velbus (le fabricant est Velleman, pour ceux qui sont adeptes du fer à souder et des kits électroniques).
En gros, les modules sont plus ou moins autonomes mais ne savent pas gérer les conditions (et parfois même les états si plusieurs boutons contrôlent le même module (lampe)).
Avec un PC, Velbus founit une DLL d'analyse et de contrôle de trame du bus... alors à tout hasard : est-ce que quelqu'un du forum PureBasic aurait déjà joué avec ?
Les modules : http://www.velbus.eu/professionals/pricelist/
Le forum Velbus : http://forum.velleman.be/viewforum.php?f=13
Librairie .net (2.0) : http://forum.velleman.be/viewtopic.php?f=13&t=383
Purebasic 5.30 full sous Windows XP (x86) et Win7 (64 bits), Linux Debian. Orientation réseaux, domotique
http://golfy.olympe.in/Teo-Tea/
http://golfy.olympe.in/Teo-Tea/
- Progi1984
- Messages : 2659
- Inscription : mar. 14/déc./2004 13:56
- Localisation : France > Rennes
- Contact :
Tu auras plus de chance de faire ou d'avoir un wrapper si la dll est utilisable en C. .net étant une plate forme spéciale.
Librairies & Applications : https://www.purebasic.fr/french/viewtop ... f=8&t=6220
Site Web : https://rootslabs.net
Site Web : https://rootslabs.net
C'est quoi un "wrapper" ?
Purebasic 5.30 full sous Windows XP (x86) et Win7 (64 bits), Linux Debian. Orientation réseaux, domotique
http://golfy.olympe.in/Teo-Tea/
http://golfy.olympe.in/Teo-Tea/
- Progi1984
- Messages : 2659
- Inscription : mar. 14/déc./2004 13:56
- Localisation : France > Rennes
- Contact :
Un wrapper est un fichier d'include PureBasic permettant d'appeler facilement une DLL.
Librairies & Applications : https://www.purebasic.fr/french/viewtop ... f=8&t=6220
Site Web : https://rootslabs.net
Site Web : https://rootslabs.net
D'accord... ça ressemble à quoi ? as-tu un exemple d'une DLL et du fichier include associé pour que je puisse créer celui de la DLL Velbus ?
Est-ce compliqué ?
Merci.
Edit: j'ai également essayé une recherche sur le forum avec le mot "wrapper" mais je ne peux pas dire que cela m'ait bien aidé...
Est-ce compliqué ?
Merci.
Edit: j'ai également essayé une recherche sur le forum avec le mot "wrapper" mais je ne peux pas dire que cela m'ait bien aidé...

Purebasic 5.30 full sous Windows XP (x86) et Win7 (64 bits), Linux Debian. Orientation réseaux, domotique
http://golfy.olympe.in/Teo-Tea/
http://golfy.olympe.in/Teo-Tea/
- Progi1984
- Messages : 2659
- Inscription : mar. 14/déc./2004 13:56
- Localisation : France > Rennes
- Contact :
Bien sur, regarde sur ce site pour voir à quoi ca ressemble : http://code.google.com/p/rwrappers/ pas mal de wrappers de ma création (pour la plupart)Golfy a écrit :D'accord... ça ressemble à quoi ? as-tu un exemple d'une DLL et du fichier include associé pour que je puisse créer celui de la DLL Velbus ?
Est-ce compliqué ?
Merci.
Edit: j'ai également essayé une recherche sur le forum avec le mot "wrapper" mais je ne peux pas dire que cela m'ait bien aidé...
As tu un header (.h) en C pour préparer l'import de la DLL ?
Compliqué, non, mais mieux vaut avoir un niveau avancé de PureBasic...
Librairies & Applications : https://www.purebasic.fr/french/viewtop ... f=8&t=6220
Site Web : https://rootslabs.net
Site Web : https://rootslabs.net
Bonjour,
Le choix de Velleman pour choix du matériel semble avoir été murement réfléchi, néanmoins, dans le même ordre d'idées, Fred a partagé un code pour les modules X10 :
http://forums.purebasic.com/english/vie ... hp?t=10575
Bon courage !
Cordialement.
Le choix de Velleman pour choix du matériel semble avoir été murement réfléchi, néanmoins, dans le même ordre d'idées, Fred a partagé un code pour les modules X10 :
http://forums.purebasic.com/english/vie ... hp?t=10575
Bon courage !
Cordialement.
Un code en Visual Basic donne ceci :
Qu'est-ce que cela peut donner en PureBasic ?
Dois-je utiliser l'instruction OpenLibrary(0, "xxxxx.dll") ?
Code : Tout sélectionner
Private Sub VelbusSerialBus_PacketReceived(ByVal source As System.Object, ByVal args As Velleman.Velbus.BusPacketIoEventArgs) Handles VelbusSerialBus.PacketReceived
Dim IncommingData As String
IncommingData = "Start = " & (Hex(args.Packet.STX) + Chr(13))
IncommingData = IncommingData & "Address = " & (Hex(args.Packet.Address) & Chr(13))
IncommingData = IncommingData & "Priority = " & (Hex(args.Packet.Priority) & Chr(13))
IncommingData = IncommingData & "RTR = " & (args.Packet.Rtr) & Chr(13)
IncommingData = IncommingData & "Size = " & (args.Packet.Size) & Chr(13)
IncommingData = IncommingData & "Cmd = " & (args.Packet.Command) & Chr(13)
IncommingData = IncommingData & "ETX = " & (Hex(args.Packet.ETX) & Chr(13))
IncommingData = IncommingData & "Has Cmd = " & (args.Packet.HasCommand)
MsgBox(IncommingData) 'show me the packet
End Sub
Dois-je utiliser l'instruction OpenLibrary(0, "xxxxx.dll") ?
Purebasic 5.30 full sous Windows XP (x86) et Win7 (64 bits), Linux Debian. Orientation réseaux, domotique
http://golfy.olympe.in/Teo-Tea/
http://golfy.olympe.in/Teo-Tea/
Merci Delta69,delta69 a écrit :Bonjour,
Le choix de Velleman pour choix du matériel semble avoir été murement réfléchi, néanmoins, dans le même ordre d'idées, Fred a partagé un code pour les modules X10 :
http://forums.purebasic.com/english/vie ... hp?t=10575
Bon courage !
Cordialement.
si je peux faire un travail similaire, je le ferais partager à l'ensemble de la communauté (Purebasic pour les sources et tous les autres pour les EXE)





Pour Velbus, ils n'ont pas encore beaucoup de modules mais c'est une norme filaire (bus) qui semble un peu plus robuste que la norme X10 (plutôt américaine)... qui semble atteindre ses limites (je crois qu'il doit y avoir une évolution de protocole en cours).
Ceci étant, Velbus permet d'émettre un ordre (gestion de priorité sur le bus) et d'avoir un retour de l'actionneur (ex: action en cours, etc.)
Purebasic 5.30 full sous Windows XP (x86) et Win7 (64 bits), Linux Debian. Orientation réseaux, domotique
http://golfy.olympe.in/Teo-Tea/
http://golfy.olympe.in/Teo-Tea/
Help ? ! ?Golfy a écrit :Un code en Visual Basic donne ceci :
Qu'est-ce que cela peut donner en PureBasic ?Code : Tout sélectionner
Private Sub VelbusSerialBus_PacketReceived(ByVal source As System.Object, ByVal args As Velleman.Velbus.BusPacketIoEventArgs) Handles VelbusSerialBus.PacketReceived Dim IncommingData As String IncommingData = "Start = " & (Hex(args.Packet.STX) + Chr(13)) IncommingData = IncommingData & "Address = " & (Hex(args.Packet.Address) & Chr(13)) IncommingData = IncommingData & "Priority = " & (Hex(args.Packet.Priority) & Chr(13)) IncommingData = IncommingData & "RTR = " & (args.Packet.Rtr) & Chr(13) IncommingData = IncommingData & "Size = " & (args.Packet.Size) & Chr(13) IncommingData = IncommingData & "Cmd = " & (args.Packet.Command) & Chr(13) IncommingData = IncommingData & "ETX = " & (Hex(args.Packet.ETX) & Chr(13)) IncommingData = IncommingData & "Has Cmd = " & (args.Packet.HasCommand) MsgBox(IncommingData) 'show me the packet End Sub
Dois-je utiliser l'instruction OpenLibrary(0, "xxxxx.dll") ?

Purebasic 5.30 full sous Windows XP (x86) et Win7 (64 bits), Linux Debian. Orientation réseaux, domotique
http://golfy.olympe.in/Teo-Tea/
http://golfy.olympe.in/Teo-Tea/
J'ai également un exemple en .NET
Mais...
je ne sais toujours pas comment transformer cela pour en faire une librairie en Purebasic.
Code : Tout sélectionner
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using Velleman.Velbus;
namespace DemoAsync
{
public partial class MainForm : Form
{
/* Create a new SerialBus instance */
private SerialBus m_Bus = new SerialBus();
public MainForm()
{
InitializeComponent();
m_Bus.PacketReceived += new BusPacketIoEventHandler(PacketReceived);
m_Bus.PacketSent += new BusPacketIoEventHandler(PacketSent);
}
private void btnConnect_Click(object sender, EventArgs e)
{
/* Connect to the specified port */
m_Bus.PortName = cbPort.Text;
m_Bus.Open();
}
private void btnDisconnect_Click(object sender, EventArgs e)
{
/* Close the port */
m_Bus.Close();
}
private void btnScan_Click(object sender, EventArgs e)
{
/* Send out module type request to each possible address. These
* packets are useful for scanning purposes, since modules will react
* to them. */
Packet packet = new Packet(); // no databytes, default address
packet.Priority = PacketPriority.Low; // low priority
packet.Rtr = true; // rtr must be enabled
for (int i = 0x02; i <= 0xFF; i++)
{
// loop over all possible addresses
// and send out our scan packet
packet.Address = (byte)i;
m_Bus.Send(packet);
}
}
private void WriteLog(string msg)
{
/* Since the input/output operations for asynchronous IO occur on
* a secundary thread, we need to synchronize it with our GUI thread.
* This is the same method as if you would use the SerialPort component */
if (lstLog.InvokeRequired)
lstLog.BeginInvoke(new MethodInvoker(delegate() { WriteLog(msg); }));
else
lstLog.Items.Add(msg);
}
private void PacketReceived(object source, BusPacketIoEventArgs args)
{
// Log read operation
WriteLog(String.Format("Packet received from address {0}", args.Packet.Address));
}
public void PacketSent(object source, BusPacketIoEventArgs args)
{
// Log write operation
WriteLog(String.Format("Packet sent to address {0}", args.Packet.Address));
}
private void MainForm_FormClosed(object sender, FormClosedEventArgs e)
{
m_Bus.Close(); // Be sure to clean up
}
}
}

Purebasic 5.30 full sous Windows XP (x86) et Win7 (64 bits), Linux Debian. Orientation réseaux, domotique
http://golfy.olympe.in/Teo-Tea/
http://golfy.olympe.in/Teo-Tea/
Salut,
.Net est assez particulier, une solution serait de créer un Activex (tuto ici), le wrapper rendra publique les fonctions dont tu as besoin (et que tu auras créé pour l'occasion), c'est ça, un wrapper.
A utiliser avec Comate pour que ça fonctionne facilement avec PureBasic.
.Net est assez particulier, une solution serait de créer un Activex (tuto ici), le wrapper rendra publique les fonctions dont tu as besoin (et que tu auras créé pour l'occasion), c'est ça, un wrapper.
A utiliser avec Comate pour que ça fonctionne facilement avec PureBasic.
"Qui baise trop bouffe un poil." P. Desproges
C'est de plus en plus du chinois (désolé pour KCCKarLKoX a écrit :Salut,
.Net est assez particulier, une solution serait de créer un Activex (tuto ici), le wrapper rendra publique les fonctions dont tu as besoin (et que tu auras créé pour l'occasion), c'est ça, un wrapper.
A utiliser avec Comate pour que ça fonctionne facilement avec PureBasic.




Bon j'ai essayé ça :
Code : Tout sélectionner
Enumeration
#Bibliotheque
EndEnumeration
NomFichier$ = "D:\telechargement\Domotique\Velbus\VelbusLib\Velbus\bin\Release\Velleman.Velbus.dll"
IncludeFile "Common.pb"
Resultat = OpenLibrary(#Bibliotheque, NomFichier$)
Debug Resultat
Resultat = OpenLibrary(#Bibliotheque, NomFichier$)
Debug Resultat --> OK
Debug IsLibrary(#Bibliotheque) --> OK
Debug CountLibraryFunctions(#Bibliotheque) --> 0 (!)
Debug ExamineLibraryFunctions(#Bibliotheque) --> -1 (!)
Debug GetFunction(#Bibliotheque, "Velleman.Velbus.bus.SendBlocking") --> 0 (!)
Debug GetFunction(#Bibliotheque, "bus.SendBlocking") --> 0 (!)

Pourquoi ça marche pas ???

Purebasic 5.30 full sous Windows XP (x86) et Win7 (64 bits), Linux Debian. Orientation réseaux, domotique
http://golfy.olympe.in/Teo-Tea/
http://golfy.olympe.in/Teo-Tea/
Re: Programmation PuraBasic et domotique Velbus
Ca y est, j'ai enfin pu lire des valeurs (sans passer la DLL .NET)
J'utilise la fonction OpenSerialPort et comme elle n'est pas très décrite dans le forum, je place mon code (très crade, désolé
) sur ce topic
A noter : j'utilise PureBasic 4.40 beta pour le timer windows (AddWindowTimer) car sinon, il faut bouger la souris pour que la lecture du port soit faite



J'utilise la fonction OpenSerialPort et comme elle n'est pas très décrite dans le forum, je place mon code (très crade, désolé

A noter : j'utilise PureBasic 4.40 beta pour le timer windows (AddWindowTimer) car sinon, il faut bouger la souris pour que la lecture du port soit faite

Code : Tout sélectionner
; PureBasic Visual Designer v3.95 build 1485 (PB4Code)
Enumeration
#CanalCOM
#Timer1
EndEnumeration
Global *Buffer = AllocateMemory(30000)
IncludeFile "Common.pb"
;ConnexionID = OpenNetworkConnection("127.0.0.1", 3788)
;Debug ConnexionID
Procedure.s Hexa2(string$,longueur)
Debug "Longueur Trame (proc Hexa2): "+ Str(longueur) + " ["+PeekS(*Buffer)+"]"
r$ = ""
For t = 0 To longueur
a$ = Trim(Hex(PeekB(*Buffer+t) & 255))+" "
If Len(a$) = 2
a$ = "0"+ a$
EndIf
r$ = r$ + a$
Next t
r$ = r$ + Chr(13)+Chr(10)
ProcedureReturn r$
EndProcedure
Procedure LecturePort()
Resultat = AvailableSerialPortInput(#CanalCOM)
If Resultat
Debug "Il a des octets à lire : "+Str(Resultat)
longueur = ReadSerialPortData(#CanalCOM, *Buffer, Resultat)
Debug "["+PeekS(*Buffer)+"] --> " + Str(longueur)
Commande$ = Hexa2(PeekS(*Buffer), longueur)
SetGadgetText(#Editor_0, GetGadgetText(#Editor_0)+Commande$)
Debug Commande$
EndIf
EndProcedure
If OpenSerialPort(#CanalCOM, "COM9", 9600, #PB_SerialPort_NoParity, 8, 1, #PB_SerialPort_NoHandshake, 1024, 1024)
Open_Window_0()
If IsWindow(#WIndow_0) = 0
CloseSerialPort(#CanalCOM)
End
EndIf
AddWindowTimer(#Window_0, #Timer1, 50)
Repeat
EventID = WaitWindowEvent()
;Resultat = ReceiveNetworkData(ConnexionID, *buffer, 20)
;Debug "data"
;SetGadgetText(#Editor_0, Hexa2(PeekS(*Buffer)))
If EventID = #PB_Event_Timer
If EventTimer() = #Timer1
LecturePort()
EndIf
EndIf
If EventID = #PB_Event_Gadget
Select EventGadget()
Case 0
Debug "Hello"
; Resultat = CallFunction(#Bibliotheque, NomFonction$ [,Parametre1 [, Parametre2...]])
EndSelect
EndIf
Until EventID = #PB_Event_CloseWindow
CloseSerialPort(#CanalCOM)
Else
MessageRequester("Erreur","Le port série n'a pas été initialisé",0)
EndIf
;CloseNetworkConnection(ConnexionID)
Purebasic 5.30 full sous Windows XP (x86) et Win7 (64 bits), Linux Debian. Orientation réseaux, domotique
http://golfy.olympe.in/Teo-Tea/
http://golfy.olympe.in/Teo-Tea/
Re: Programmation PuraBasic et domotique Velbus
rajoute 20 à WaitWindowEvent() WaitWindowEvent(20) 
