diff options
-rwxr-xr-x | Makefile | 23 | ||||
-rwxr-xr-x | Makefile.vars | 2 | ||||
-rwxr-xr-x | tools/write-wpkg.sh | 32 | ||||
-rw-r--r-- | weshd.x | 775 |
4 files changed, 390 insertions, 442 deletions
@@ -6,7 +6,7 @@ include Makefile.vars Makefile.msg # --- # Une target pour tout construire. -all: all-daemon all-lib all-client +all: all-libw all-daemon all-lib all-client # Une target pour tout nettoyer. @@ -30,7 +30,7 @@ re: clean all # Installation de tout. -install: install-daemon install-lib install-client +install: install-libw install-daemon install-lib install-client # Une target pour ne rien faire, histoire de tester des choses avec # des `$(info <contenu>)` principalement. @@ -92,8 +92,9 @@ install: install-daemon install-lib install-client # Dossiers d'installation. - $(IBINDIR) $(ILIBDIR) $(IPKGDIR) $(sort $(foreach x,$(L_INCp),\ - $(dir $(IINCDIR)/lib$(LIB)-$(VERSION)/$(x)))): + $(IBINDIR) $(ILIBDIR) $(IPKGDIR) \ + $(sort $(foreach x,$(L_INCp),$(dir $(IINCDIR)/lib$(LIB)-$(VERSION)/$(x)))) \ + $(sort $(foreach x,$(W_INCp),$(dir $(IINCDIR)/lib$(LIBW)-$(VERSION)/$(x)))): $(call qcmd,$(MD) "$@") # --- @@ -154,18 +155,18 @@ $(eval $(call make-lib-obj-rule,$(src)))) # Installation de la bibliothèque. - install-libw: $(CHECKCFG) | $(ILIBDIR) $(IPKGDIR) $(sort \ - $(foreach x,$(W_INCp),$(dir $(IINCDIR)/lib$(LIB)-$(VERSION)/$(x)))) + install-libw: $(CHECKCFG) $(W_DEST) | $(ILIBDIR) $(IPKGDIR) $(sort \ + $(foreach x,$(W_INCp),$(dir $(IINCDIR)/lib$(LIBW)-$(VERSION)/$(x)))) $(call imsg,Installation de la bibliothèque.) $(call qcmd,$(INST) -m 755 $(W_DEST) \ $(ILIBDIR)/$(notdir $(W_DEST).$(MAJOR))) $(call qcmd,$(LN) $(notdir $(W_DEST).$(MAJOR)) \ $(ILIBDIR)/$(notdir $(W_DEST))) $(call imsg,Installation du paquet pkg-config.) - $(call qcmd,tools/write-pkg.sh >$(IPKGDIR)/lib$(LIB).pc) + $(call qcmd,tools/write-wpkg.sh >$(IPKGDIR)/lib$(LIBW).pc) $(call imsg,Installation des headers.) $(foreach i,$(W_INCp),$(call qcmd,$(INST) -m 644 $(W_INCDIR)/$(i) \ - "$(IINCDIR)/lib$(LIB)-$(VERSION)/$(i)"$(\n))) + "$(IINCDIR)/lib$(LIBW)-$(VERSION)/$(i)"$(\n))) .PHONY: all-libw install-libw @@ -188,7 +189,7 @@ $(eval $(call make-daemon-obj-rule,$(src)))) # Installation du démon. - install-daemon: $(CHECKCFG) | $(IBINDIR) + install-daemon: $(CHECKCFG) $(D_DEST) | $(IBINDIR) $(call imsg,Installation du démon.) $(call qcmd,$(INST) -m 755 $(D_DEST) $(IBINDIR)/$(notdir $(D_DEST))) @@ -215,7 +216,7 @@ $(eval $(call make-lib-obj-rule,$(src)))) # Installation de la bibliothèque. - install-lib: $(CHECKCFG) | $(ILIBDIR) $(IPKGDIR) $(sort \ + install-lib: $(CHECKCFG) $(L_DEST) | $(ILIBDIR) $(IPKGDIR) $(sort \ $(foreach x,$(L_INCp),$(dir $(IINCDIR)/lib$(LIB)-$(VERSION)/$(x)))) $(call imsg,Installation de la bibliothèque.) $(call qcmd,$(INST) -m 755 $(L_DEST) \ @@ -245,7 +246,7 @@ $(eval $(call make-lib-obj-rule,$(src)))) # Installation du client. - install-client: $(CHECKCFG) | $(IBINDIR) + install-client: $(CHECKCFG) $(C_DEST) | $(IBINDIR) $(call imsg,Installation du client.) $(call qcmd,$(INST) -m 755 $(C_DEST) \ $(IBINDIR)/$(notdir $(C_DEST))) diff --git a/Makefile.vars b/Makefile.vars index 7f0001d..c70a6ac 100755 --- a/Makefile.vars +++ b/Makefile.vars @@ -120,7 +120,7 @@ $(W_SRCDIR)/**/*.c)) W_OBJ := $(W_SRC:%=$(W_OBJDIR)/%.o) W_INCp := $(patsubst $(W_INCDIR)/%,%,$(wildcard \ - $(W_INCDIR)/*.hpp $(W_INCDIR)/**/*.hpp)) + $(W_INCDIR)/*.h $(W_INCDIR)/**/*.h)) W_INC := $(W_INCp:%=$(W_INCDIR)/%) \ $(wildcard $(W_SRCDIR)/*.h $(W_SRCDIR)/**/*.h) diff --git a/tools/write-wpkg.sh b/tools/write-wpkg.sh new file mode 100755 index 0000000..2926ab4 --- /dev/null +++ b/tools/write-wpkg.sh @@ -0,0 +1,32 @@ +#!/bin/sh +cd "$(dirname "$0")" + +# --- +# Variables à utiliser. +# --- + +name="wes" +description="library for interacting with WES servers" +version="$(make -s -C .. getversion)" + +libdir="$(make -s -C .. getlibdir)" +[ $? -eq 0 ] || exit 1 +incdir="$(make -s -C .. getincdir)/lib${name}-${version}" +[ $? -eq 0 ] || exit 1 + +# --- +# Écriture du résultat. +# --- + +cat <<EOF +includedir=${incdir} +libdir=${libdir} + +Name: lib${name} +Description: ${description} +Version: ${version} +Libs: -L\${libdir} -l${name} +Cflags: -I\${includedir} +EOF + +# End of file. @@ -30,7 +30,8 @@ /* Ce fichier est une évolution du protocole vers une utilisation des * `union switch()` pour regrouper des objets entre eux. Puisque le protocole, * de pair avec le logiciel, est en cours de développement, celui-ci utilise - * toujours la version 1 (WESHD_VERS1). + * toujours la version 1 (WESHD_VERS1), puisque celle-ci n'est pas encore + * posée (et ne le sera pas avant la version 1.0). * * Pour retrouver d'anciennes versions du protocole, reculez dans l'historique * du dépôt git de développement, disponible via l'URL suivante : @@ -87,17 +88,16 @@ struct wespdt_t { /* Adresse IP (avec version). */ -enum wespiptype_t { - WESPIPTYPE_4 = 4, - WESPIPTYPE_6 = 6 +enum wespaddrtype_t { + WESPADDRTYPE_IP = 1, + WESPADDRTYPE_IP6 = 2 }; -union wespip_t switch (wespiptype_t type) { -case WESPIPTYPE_4: - unsigned char addr4[4]; - -case WESPIPTYPE_6: - unsigned char addr6[16]; +union wespaddr_t switch (wespaddrtype_t type) { +case WESPADDRTYPE_IP: + unsigned char ip[4]; +case WESPADDRTYPE_IP6: + unsigned char ip6[16]; }; /* --- @@ -113,10 +113,11 @@ case WESPIPTYPE_6: * - `MIS`: mismatch entre ce qu'on a et ce qui est attendu par le client, * utilisé pour les compteurs. * - * - `NOW`: la ressource n'existe pas. - * - `CON`: le serveur n'a pas pu être joint. + * - `NOR`: la ressource n'existe pas. + * - `CON`: le serveur où est hébergée la ressource n'a pas pu être joint. * - `LRG`: la période pour la récupération de données est trop large, - * le statut de la (sous-)ressource a changé entretemps. */ + * le statut de la (sous-)ressource a changé entretemps (e.g. + * tarif appliqué à un compteur via téléinfo, BASE puis HCHP). */ enum wespret_t { WESPRET_OK = 0, @@ -125,7 +126,7 @@ enum wespret_t { WESPRET_VAL = 3, WESPRET_MIS = 4, - WESPRET_NOW = 10, + WESPRET_NOR = 10, WESPRET_CON = 11, WESPRET_LRG = 12 }; @@ -143,9 +144,10 @@ typedef int wespid_t; /* Type de l'objet. */ enum wesptype_t { - WESPTYPE_WES = 0, - WESPTYPE_METER = 1, - WESPTYPE_SENSOR = 2 + WESPTYPE_NONE = 0, + WESPTYPE_WES = 1, + WESPTYPE_METER = 2, + WESPTYPE_SENSOR = 3 }; /* Sous-type de l'objet pour un objet de type `WESTYPE_WES`. @@ -182,55 +184,16 @@ enum wesptype_sensor_t { }; /* --- - * Objets de type WES (regroupement de compteurs et capteurs). - * --- */ - -/* Propriétés d'enregistrement spécifiques au serveur WES connecté par IP. */ - -struct wespoptions_ip_t { - /* Propriétés spécifiques au serveur WES connecté par IP. - * `ip`: adresse IP. - * `http_username`: utilisateur HTTP. - * `http_password`: mot de passe HTTP. - * `ftp_username`: utilisateur FTP. - * `ftp_password`: mot de passe FTP. */ - - wespip_t addr; - string http_username<>; - string http_password<>; - string ftp_username<>; - string ftp_password<>; -}; - -/* Propriétés d'enregistrement de la ressource selon son type. */ - -union wespoptions_t switch (wesptype_t type) { -case WESPTYPE_DUMMY: - /* À vrai dire, rien. C'est factice quoi. */ -case WESPTYPE_IP: - wespoptions_ip_t ip; -}; - -/* --- - * Ressources de type WES. + * Objets de type serveurs WES. * --- */ -/* Drapeaux pour savoir quoi définir. */ - -const WESP_NAME = 1; -const WESP_TIME = 2; +/* Propriétés supplémentaires concernant les serveurs WES connectés via IP. */ -const WESP_DHCP = 4; -const WESP_IP = 8; -const WESP_MASK = 16; -const WESP_GW = 32; -const WESP_DNS1 = 64; -const WESP_DNS2 = 128; -const WESP_MAC = 256; +struct wespcfg_wes_ip_t { + /* Heure locale du WES. */ -/* Propriétés pour les serveurs WES connectés via IP. */ + wespdt_t current_time; -struct wespipmore_t { /* Propriétés réseau. */ bool dhcp_enabled; @@ -242,77 +205,27 @@ struct wespipmore_t { unsigned char mac[6]; /* read-only! */ }; -/* Propriétés diverses selon le type. */ +/* Propriétés supplémentaires concernant les serveurs WES en général, inclus + * dans la définition de l'objet général. */ -union wespmore_t switch (wesptype_t type) { -case WESPTYPE_DUMMY: - /* Toujours rien. */ -case WESPTYPE_IP: - wespipmore_t ip; +union wespcfg_wesmore_t switch (wesptype_wes_t type) { +case WESPTYPE_WES_NONE: + /* Propriétés génériques uniquement. */ +case WESPTYPE_WES_DUMMY: + /* Rien pour le moment, mais l'on pourrait imaginer des tweaks + * de simulation. */ +case WESPTYPE_WES_IP: + wespcfg_wes_ip_t ip; }; -/* Serveur WES. */ - -struct wesp_t { - /* Propriétés à définir lors d'une affectation. */ - - unsigned long to_set; - - /* Propriétés de base. - * `name`: nom de la ressource. - * `current_time`: temps actuel sur la ressource. */ - - string name<>; - wespdt_t current_time; - - /* Autres propriétés dépendant du type. */ - - wespmore_t more; +struct wespcfg_wes_t { + wespcfg_wesmore_t more; }; /* --- - * Énumérations et sous-types divers concernant les compteurs. + * Objets de type compteur. * --- */ -/* Mode de consommation/production de chaque compteur. - * `CONSO`: consommation. - * `PROD`: production (panneaux solaires, …). */ - -enum wespmetermode_t { - WESPMETERMODE_CONSO = 0, - WESPMETERMODE_PROD = 1 -}; - -/* Grandeur mesurée par le compteur. - * `UNKNOWN`: inconnu. - * `WATER`: eau froide/chaude. - * `GAS`: gaz. - * `ELEC`: électricité. - * `FUEL`: fioul. */ - -enum wespmeterwhat_t { - WESPMETERWHAT_UNKNOWN = 0, - WESPMETERWHAT_WATER = 1, - WESPMETERWHAT_GAS = 2, - WESPMETERWHAT_ELEC = 3, - WESPMETERWHAT_FUEL = 4 -}; - -/* Unité utilisée pour les valeurs du compteur. - * `UNKNOWN`: Inconnu. - * `WH`: Watts par heure (Wh). - * `KWH`: Kilo-watts par heure (kWh). - * `LITER`: Litres (L). - * `CUBICMETER`: Mètres cube (m³). */ - -enum wespmeterunit_t { - WESPMETERUNIT_UNKNOWN = 0, - WESPMETERUNIT_WH = 1, - WESPMETERUNIT_KWH = 2, - WESPMETERUNIT_LITER = 3, - WESPMETERUNIT_CUBICMETER = 4 -}; - /* Type de tarif pour le protocole télé-informatique d'ERDF. * `BASE`: forfait Base (toutes heures), le prix du kWh ne varie pas en * fonction de la période de consommation ; @@ -368,70 +281,9 @@ enum wespticperiod_t { WESPTICPERIOD_PM = 2 }; -/* Méthode de mesure pour les compteurs à impulsions. - * `ILS`: impulsions mécaniques. - * `ELEC`: impulsions électroniques. */ - -enum wespplsmethod_t { - WESPPLSMETHOD_ILS = 0, - WESPPLSMETHOD_ELEC = 1 -}; +/* Propriétés supplémentaires pour un compteur relié via téléinfo. */ -/* Drapeaux pour savoir quoi définir ou ce qui est défini. */ - -const WESPMETER_NAME = 1; -const WESPMETER_READ = 2; -const WESPMETER_MODE = 4; -const WESPMETER_WHAT = 8; -const WESPMETER_TYPE = 16; -const WESPMETER_FIXED_COSTS = 32; -const WESPMETER_PRORATA = 64; - -const WESPMETER_COST = 128; -const WESPMETER_VOLTAGE = 256; - -const WESPMETER_METHOD = 256; -const WESPMETER_GROUP = 512; - -const WESPMETER_COSTS_BASE = 128; -const WESPMETER_COSTS_HCHP = 256; -const WESPMETER_COSTS_TEMPO = 512; -const WESPMETER_COSTS_EJP = 1024; -const WESPMETER_BDPV_ENABLED = 2048; -const WESPMETER_BDPV_IDS = 4096; -const WESPMETER_BDPV_TIME = 8192; - -/* --- - * Structures concernant les compteurs. - * --- */ - -struct wespmetermore_amper_t { - /* Propriétés relatives aux compteurs de type pinces ampèremétriques. - * `voltage`: voltage (en V). */ - - int voltage; - - /* Propriétés tarifaires. - * `cost`: coût de l'unité. */ - - double cost; -}; - -struct wespmetermore_pulse_t { - /* Propriétés relatives aux compteurs de type impulsions. - * `method`: méthode de comptage d'impulsions. - * `group_size`: taille d'un groupe d'impulsions pour faire une unité. */ - - wespplsmethod_t method; - int group_size; - - /* Propriétés tarifaires. - * `cost`: coût de l'unité. */ - - double cost; -}; - -struct wespmetermore_teleinfo_t { +struct wespcfg_meter_teleinfo_t { /* Propriétés relatives aux compteurs branchés via * le protocole télé-information défini par Enedis. * `cost_<abo>_<période>`: coût du kWh pendant une période lorsqu'un @@ -459,152 +311,96 @@ struct wespmetermore_teleinfo_t { string bdpv_password<>; }; -union wespmetermore_t switch (wespmetertype_t type) { -case WESPMETERTYPE_NONE: - /* Aucun paramètre supplémentaire. */ -case WESPMETERTYPE_AMPER: - wespmetermore_amper_t amper; -case WESPMETERTYPE_PULSE: - wespmetermore_pulse_t pulse; -case WESPMETERTYPE_TELEINFO: - wespmetermore_teleinfo_t teleinfo; -}; +/* Propriétés supplémentaires concernant un compteur de type + * pinces ampèremétriques. */ -/* Structure représentant un compteur (branché via télé-informatique, - * pinces ampèremétriques, impulsions). */ +struct wespcfg_meter_amper_t { + /* `voltage`: voltage (en V). */ -struct wespmeter_t { - /* Propriétés de base de tout compteur. - * `name`: nom du compteur tel que défini par le système distant. - * `rd`: le compteur est-il lu ou ignoré par le système ? - * `mode`: mode de consommation/production du compteur. - * `what`: grandeur mesurée. */ - - string name<>; - bool rd; - wespmetermode_t mode; - wespmeterwhat_t what; - - /* Informations concernant le coût. - * `fixed_cost`: coût fixe de l'abonnement, à l'année. - * `prorata`: l'abonnement est-il au prorata du prix de l'unité ? */ - - double fixed_cost; - bool prorata; - - /* Informations dépendant du type. */ - - wespmetermore_t more; -}; - -/* Valeurs du compteur pour une période donnée. */ - -struct wespmetermorevalues_index_base_t { - unsigned long th; -}; + int voltage; -struct wespmetermorevalues_index_hchp_t { - unsigned long hc; - unsigned long hp; -}; + /* Propriétés tarifaires. + * `cost`: coût de l'unité. */ -struct wespmetermorevalues_index_tempo_t { - unsigned long hcjb; - unsigned long hpjb; - unsigned long hcjw; - unsigned long hpjw; - unsigned long hcjr; - unsigned long hpjr; + double cost; }; -struct wespmetermorevalues_index_ejp_t { - unsigned long hn; - unsigned long pm; -}; +/* Méthode de mesure pour les compteurs à impulsions. + * `ILS`: impulsions mécaniques. + * `ELEC`: impulsions électroniques. */ -union wespmetermorevalues_index_t switch (wesptictarif_t tarif) { -case WESPTICTARIF_BASE: - wespmetermorevalues_index_base_t base; -case WESPTICTARIF_HCHP: - wespmetermorevalues_index_hchp_t hchp; -case WESPTICTARIF_TEMPO: - wespmetermorevalues_index_tempo_t tempo; -case WESPTICTARIF_EJP: - wespmetermorevalues_index_ejp_t ejp; +enum wespplsmethod_t { + WESPPLSMETHOD_ILS = 0, + WESPPLSMETHOD_ELEC = 1 }; -struct wespmetermorevalues_teleinfo_t { - /* Données relatives à un compteur branché via TÉLÉINFO. - * Si plusieurs compteurs ou plusieurs forfaits ont été connus - * sur la période donnée, l'erreur `WESPRET_LRG` sera renvoyée. - * - * `adco`: numéro ADCO du compteur (un chiffre direct par case). - * `phases`: nombre de phases (monophasé : 1, triphasé : 3). - * `period`: périodes tarifaires sur la période. - * `isousc`: intensité souscrite. - * `pa`: puissance apparente (en VA). - * `iinst`: intensité instantanée pour chaque phase. - * `imax`: intensité maximale pour chaque phase. */ - - unsigned char adco[12]; - int phases; - wespticperiod_t period; +/* Propriétés supplémentaires concernant un compteur d'impulsions. */ - unsigned int isousc; - unsigned int pa; - unsigned int iinst[3]; - unsigned int imax[3]; +struct wespcfg_meter_pulse_t { + /* Propriétés relatives aux compteurs de type impulsions. + * `method`: méthode de comptage d'impulsions. + * `group_size`: taille d'un groupe d'impulsions pour faire une unité. */ - /* Index pour chacun des tarifs, avec le tarif en vigueur. */ + wespplsmethod_t method; + int group_size; - wespmetermorevalues_index_t indexes; -}; + /* Propriétés tarifaires. + * `cost`: coût de l'unité. */ -union wespmetermorevalues_t switch (wespmetertype_t type) { -case WESPMETERTYPE_TELEINFO: - wespmetermorevalues_teleinfo_t teleinfo; + double cost; }; -struct wespmetervalues_t { - /* Valeur avec unité récupérée pour cette période. - * `active`: le compteur a-t-il été actif (branché, envoyant des valeurs) - * pour cette période ? - * `count`: nombre d'unités détectées pendant cette période. - * `unit`: unité de mesure pour la valeur précédente. */ - - bool active; - double count; - wespmeterunit_t unit; - - /* Davantage de valeurs selon le type. */ +/* Mode de consommation/production de chaque compteur. + * `CONSO`: consommation. + * `PROD`: production (panneaux solaires, …). */ - wespmetermorevalues_t more; +enum wespmetermode_t { + WESPMETERMODE_CONSO = 0, + WESPMETERMODE_PROD = 1 }; -/* --- - * Configuration d'un objet. - * --- */ - -/* Objet de type ressource WES. */ +/* Grandeur mesurée par le compteur. + * `UNKNOWN`: inconnu. + * `WATER`: eau froide/chaude. + * `GAS`: gaz. + * `ELEC`: électricité. + * `FUEL`: fioul. */ -union wespcfg_wesmore_t switch (wesptype_wes_t type) { -case WESPTYPE_WES_NONE: -case WESPTYPE_WES_DUMMY: -case WESPTYPE_WES_IP: - wespcfg_wes_ip_t ip; +enum wespmeterwhat_t { + WESPMETERWHAT_UNKNOWN = 0, + WESPMETERWHAT_WATER = 1, + WESPMETERWHAT_GAS = 2, + WESPMETERWHAT_ELEC = 3, + WESPMETERWHAT_FUEL = 4 }; -struct wespcfg_wes_t { - wespcfg_wesmore_t more; +/* Unité utilisée pour les valeurs du compteur. + * `UNKNOWN`: Inconnu. + * `WH`: Watts par heure (Wh). + * `KWH`: Kilo-watts par heure (kWh). + * `LITER`: Litres (L). + * `CUBICMETER`: Mètres cube (m³). */ + +enum wespmeterunit_t { + WESPMETERUNIT_UNKNOWN = 0, + WESPMETERUNIT_WH = 1, + WESPMETERUNIT_KWH = 2, + WESPMETERUNIT_LITER = 3, + WESPMETERUNIT_CUBICMETER = 4 }; -/* Objet de type compteur. */ +/* Propriétés supplémentaires concernant un compteur en général, utilisé dans + * la définition d'un objet. */ union wespcfg_metermore_t switch (wesptype_meter_t type) { case WESPTYPE_METER_NONE: + /* Paramètres génériques uniquement. */ case WESPTYPE_METER_TELEINFO: + wespcfg_meter_teleinfo_t teleinfo; case WESPTYPE_METER_AMPER: + wespcfg_meter_amper_t amper; case WESPTYPE_METER_PULSE: + wespcfg_meter_pulse_t pulse; }; struct wespcfg_meter_t { @@ -627,23 +423,57 @@ struct wespcfg_meter_t { wespcfg_metermore_t more; }; -/* Objet de type capteur. */ +/* --- + * Objets de type capteur. + * --- */ + +/* Types de capteurs reconnus par weshd. */ + +enum wespsensorwhat_t { + WESPSENSORTYPE_TEMP = 1 +}; + +/* Unité pouvant être utilisées par les capteurs. */ + +enum wespsensorunit_t { + WESPSENSORUNIT_CELSIUS = 1 +}; + +/* Propriétés supplémentaires pour un capteur relié via le bus 1-Wire. */ + +struct wespcfg_sensor_onewire_t { + unsigned char id[8]; +}; + +/* Propriétés supplémentaires pour un capteur en général. */ union wespcfg_sensormore_t switch (wesptype_sensor_t type) { case WESPTYPE_SENSOR_NONE: + /* Paramètres génériques uniquement. */ case WESPTYPE_SENSOR_ONEWIRE: + wespcfg_sensor_onewire_t onewire; }; struct wespcfg_sensor_t { + /* Propriétés de base de tout capteur. + * `what`: ce qui est mesuré par le capteur. + * `more`: plus d'informations par rapport au type de capteur. */ + + wespsensorwhat_t what; wespcfg_sensormore_t more; }; -/* Objet général de configuration. - * Les types sont donnés en plus dans `type` et `subtype` puisque ce n'est pas +/* --- + * Définition générale d'un objet dans le protocole pour weshd. + * --- */ + +/* Les types sont donnés en plus dans `type` et `subtype` puisque ce n'est pas * parce qu'on informe le client de ceux-ci que les données suivent * derrière. */ union wespcfgmore_t switch (wesptype_t type) { +case WESPTYPE_NONE: + /* Propriétés génériques uniquement. */ case WESPTYPE_WES: wespcfg_wes_t wes; case WESPTYPE_METER: @@ -661,180 +491,265 @@ struct wespcfg_t { }; /* --- - * Structures pour utilisation par le programme. + * Drapeaux pour la configuration. * --- */ -struct wespid_with_flags_t { - wespid_t id; - wespflags_t flags; -}; +/* Propriétés générales. */ -struct wespid_with_flags_and_cfg_t { - wespid_t id; - wespflags_t flags; - wespcfg_t cfg; -}; +const WESPCFG_NAME = 1; -struct wespquery_t { - wespid_t parent; - int offset; - int count; -}; +/* Propriétés d'un serveur WES connecté par IP. */ -struct wespid_and_span_t { - wespid_t id; - wespdt_t begin; - wespdt_t end; -}; +const WESPCFG_WES_IP_TIME = 2; +const WESPCFG_WES_IP_DHCP = 4; +const WESPCFG_WES_IP_ADDR = 8; +const WESPCFG_WES_IP_MASK = 16; +const WESPCFG_WES_IP_GW = 32; +const WESPCFG_WES_IP_DNS1 = 64; +const WESPCFG_WES_IP_DNS2 = 128; +const WESPCFG_WES_IP_MAC = 256; -struct wespret_with_cfg_t { - wespret_t ret; - wespcfg_t cfg; -}; +/* Propriétés générales d'un compteur. */ -struct wes +const WESPCFG_METER_READ = 2; +const WESPCFG_METER_MODE = 4; +const WESPCFG_METER_WHAT = 8; +const WESPCFG_METER_FIXED_COSTS = 16; +const WESPCFG_METER_PRORATA = 32; -struct wespret_with_list_t { +/* Propriétés concernant un compteur branché via téléinfo. */ -}; +const WESPCFG_METER_TELEINFO_COSTS_BASE = 64; +const WESPCFG_METER_TELEINFO_COSTS_HCHP = 128; +const WESPCFG_METER_TELEINFO_COSTS_TEMPO = 256; +const WESPCFG_METER_TELEINFO_COSTS_EJP = 512; +const WESPCFG_METER_TELEINFO_BDPV_ENABLED = 1024; +const WESPCFG_METER_TELEINFO_BDPV_IDS = 2048; +const WESPCFG_METER_TELEINFO_BDPV_TIME = 4096; -struct wespret_with_id_t { +/* Propriétés concernant les pinces ampèremétriques. */ -}; +const WESPCFG_METER_AMPER_VOLTAGE = 64; +const WESPCFG_METER_AMPER_COST = 128; -struct wespret_with_data_t { +/* Propriétés concernant un compteur d'impulsions. */ -}; +const WESPCFG_METER_PULSE_METHOD = 64; +const WESPCFG_METER_PULSE_GROUP = 128; +const WESPCFG_METER_PULSE_COST = 256; -/* Gestion des serveurs WES. */ +/* Propriétés concernant un capteur branché via 1-Wire. */ -struct wespid_with_wes_t { - wespid_t id; - wesp_t wes; -}; +const WESPCFG_SENSOR_ONEWIRE_ID = 2; -struct wespid_with_wes_flags_t { - wespid_t id; - unsigned long to_get; -}; +/* --- + * Objets de données. + * --- */ -struct wespquery_t { - int offset; - int count; /* min. 1, max. 10 ! */ -}; +/* Propriétés concernant les compteurs branchés via téléinfo. */ -struct wespret_with_id_t { - wespret_t ret; - wespid_t id; - string name<>; -}; +#define bbr_hcjb tempo_hcjb +#define bbr_hpjb tempo_hpjb +#define bbr_hcjw tempo_hcjw +#define bbr_hpjw tempo_hpjw +#define bbr_hcjr tempo_hcjr +#define bbr_hpjr tempo_hpjr -struct wespret_with_wes_t { - wespret_t ret; - wesp_t wes; -}; +struct wespdata_meter_teleinfo_t { + /* Données relatives à un compteur branché via téléinfo. + * Si plusieurs compteurs ou plusieurs forfaits ont été connus + * sur la période donnée, l'erreur `WESPRET_LRG` sera renvoyée. + * + * `adco`: numéro ADCO du compteur (un chiffre direct par case). + * `phases`: nombre de phases (monophasé : 1, triphasé : 3). + * `isousc`: intensité souscrite. + * `pa`: puissance apparente (en VA). + * `iinst`: intensité instantanée pour chaque phase. + * `imax`: intensité maximale pour chaque phase. */ -struct wespret_with_wes_list_t { - wespret_t ret; - wesp_t wes<>; -}; + unsigned char adco[12]; + int phases; -/* Gestion des compteurs. */ + unsigned int isousc; + unsigned int pa; + unsigned int iinst[3]; + unsigned int imax[3]; -struct wespid_with_meter_id_t { - wespid_t id; - wespmeterid_t meter_id; - wespmetertype_t expected_type; - unsigned long to_get; + /* `<forfait>_<période>`: nombre d'unités (partie commune) consommées + * par période tarifaire. */ + + double base_th; + double hchp_hc; + double hchp_hp; + double tempo_hcjb; + double tempo_hpjb; + double tempo_hcjw; + double tempo_hpjw; + double tempo_hcjr; + double tempo_hpjr; + double ejp_hn; + double ejp_pm; }; -struct wespid_with_meter_t { - wespid_t id; - wespmeterid_t meter_id; - wespmeter_t meter; +/* Propriétés concernant les compteurs. */ + +union wespdata_metermore_t switch (wesptype_meter_t type) { +case WESPTYPE_METER_AMPER: + /* Aucune donnée supplémentaire à fournir. */ +case WESPTYPE_METER_PULSE: + /* Aucune donnée supplémentaire à fournir. */ +case WESPTYPE_METER_TELEINFO: + wespdata_meter_teleinfo_t teleinfo; }; -struct wespid_with_meter_id_and_span_t { - wespid_t id; - wespmeterid_t meter_id; - wespdt_t from; - wespdt_t to; /* non inclus ! */ +struct wespdata_meter_t { + /* Un compteur est un objet qui compte le nombre d'unités consommées + * d'une énergie donnée, e.g. des litres d'eau ou des kVA d'électricité. + * + * `count`: nombre total d'unités consommées sur la période. + * `unit`: unité de la valeur précédente. */ + + double count; + wespmeterunit_t unit; + + wespdata_metermore_t more; }; -struct wespid_with_meter_query_t { - wespid_t id; - wespmetertype_t of_type; - int offset; - int count; /* min. 1, max. 10 ! */ +/* Propriétés concernant les capteurs. */ + +struct wespdata_sensor_t { + /* Un capteur est un objet dont seules les valeurs instantanées nous + * intéressent, et pour lesquels nous produirons donc des statistiques. + * + * `min`: valeur minimale sur la période. + * `avg`: moyenne sur la période. + * `max`: valeur maximale sur la période. + * `unit`: unité des valeurs précédentes. */ + + double min; + double avg; + double max; + wespsensorunit_t unit; }; -struct wespret_with_meter_t { - wespret_t ret; - wespmeter_t meter; +/* Objet général de données. */ + +union wespdatamore_t switch (wesptype_t type) { +case WESPTYPE_METER: + wespdata_meter_t meter; +case WESPTYPE_SENSOR: + wespdata_sensor_t sensor; }; -struct wespret_with_meter_data_t { - wespret_t ret; - wespmetervalues_t val; +struct wespdata_t { + /* Valeurs avec unité consommée pendant la période. + * `active`: temps cumulé d'activité (« uptime ») de la ressource, + * de 0 (jamais en activité) à 10000 (toujours en activité). + * `more`: plus d'informations selon le type de la ressource, compteur + * ou capteur. */ + + int active; + wespdatamore_t more; }; -struct wespmeter_list_element_t { - wespmeterid_t id; - wespmetertype_t type; +/* --- + * Propriétés d'enregistrement pour `GATHER_WES()`. + * --- */ + +struct wespgopts_ip_t { + /* Propriétés d'instanciation spécifiques au serveur WES connecté par IP. + * `addr` : adresse IP. + * `http_user`: utilisateur HTTP. + * `http_pass`: mot de passe HTTP. + * `ftp_user`: utilisateur FTP. + * `ftp_pass`: mot de passe FTP. */ + + wespaddr_t addr; + string http_user<>; + string http_pass<>; + string ftp_user<>; + string ftp_pass<>; }; -struct wespret_with_meter_list_t { - wespret_t ret; - wespmeter_list_element_t meters<>; +/* Type général. */ + +union wespgopts_t switch (westype_wes_t type) { +case WESPTYPE_WES_NONE: + /* Ce type ne peut pas être instancié. */ +case WESPTYPE_WES_DUMMY: + /* Ce type ne prend aucun paramètre. */ +case WESPTYPE_WES_IP: + wespgopts_ip_t ip; }; -/* Gestion des capteurs. */ +/* --- + * Arguments. + * --- */ -struct wespid_with_sensor_id_t { +struct wespid_with_flags_t { wespid_t id; - wespsensorid_t sensor_id; - wespmetertype_t expected_type; - unsigned long to_get; + wespflags_t flags; }; -struct wespid_with_sensor_t { +struct wespid_with_flags_and_cfg_t { wespid_t id; - wespsensorid_t sensor_id; - wespsensor_t sensor; + wespflags_t flags; + wespcfg_t cfg; }; -struct wespid_with_sensor_id_and_span_t { - wespid_t id; - wespsensorid_t sensor_id; - wespdt_t from; - wespdt_t to; /* non inclus ! */ +struct wespquery_t { + wespid_t parent; + int offset; + int count; /* 30 max. */ }; -struct wespid_with_sensor_query_t { +struct wespid_and_span_t { wespid_t id; - wespsensortype_t of_type; - int offset; - int count; /* min. 1, max. 10 */ + wespdt_t begin; + wespdt_t end; }; -struct wespret_with_sensor_t { - wespret_t ret; - wespsensor_t sensor; +/* --- + * Réponses. + * --- */ + +/* Type de la réponse. + * `NONE`: aucune donnée n'accompagne le code de retour. + * `ID`: un identifiant accompagne le code de retour. + * `CFG`: la configuration d'une ressource accompagne la réponse. + * `DATA`: des données (compteurs, capteurs) accompagnent la réponse. + * `LIST`: une liste de configurations avec identifiants accompagne + * la réponse. */ + +enum wespresp_type_t { + WESPRESPTYPE_NONE = 0, + WESPRESPTYPE_ID = 1, + WESPRESPTYPE_CFG = 2, + WESPRESPTYPE_DATA = 3, + WESPRESPTYPE_LIST = 4 }; -struct wespret_with_sensor_data_t { - wespret_t ret; - wespsensorvalues_t val; +struct wesplistelt_t { + wespid_t id; + wespcfg_t cfg; }; -struct wespsensor_list_element_t { - wespsensorid_t id; - wespsensortype_t type; +union wespresp_more_t switch (wespresp_type_t type) { +case WESPRESPTYPE_NONE: + /* Code de retour uniquement. */ +case WESPRESPTYPE_ID: + wespid_t id; +case WESPRESPTYPE_CFG: + wespcfg_t cfg; +case WESPRESPTYPE_DATA: + wespdata_t data; +case WESPRESPTYPE_LIST: + wesplistelt_t elements<30>; }; -struct wespret_with_sensor_list_t { +struct wespresp_t { wespret_t ret; - wespsensor_list_element_t sensors<>; + wespresp_more_t more; }; /* --- @@ -849,21 +764,21 @@ program WESHD_PROG { /* Récupération, suppression d'un ou plusieurs éléments. */ - wespret_with_cfg_t GET(wespid_with_flags_t args) = 1; - wespret_t SET(wespid_with_flags_and_cfg_t args) = 2; + wespresp_t GET(wespid_with_flags_t args) = 1; + wespresp_t SET(wespid_with_flags_and_cfg_t args) = 2; - wespret_with_list_t QUERY(wespquery_t args) = 3; - wespret_t REMOVE(wespid_t id) = 4; + wespresp_t QUERY(wespquery_t args) = 3; + wespresp_t REMOVE(wespid_t id) = 4; /* Opérations spécifiques aux serveurs WES. * `GATHER_WES()`: récupération (voire initialisation) d'un WES. */ - wespret_with_id_t GATHER_WES(wespoptions_t args) = 5; + wespresp_t GATHER_WES(wespgatheroptions_t args) = 5; /* Opérations spécifiques aux compteurs et capteurs. * `GET_DATA()`: récupération de données. */ - wespret_with_data_t GET_DATA(wespid_and_span_t args) = 6; + wespresp_t GET_DATA(wespid_and_span_t args) = 6; /* TODO: interactions avec le LCD */ } = 1; |