Радио модуль для Raspberry Pi
Хотите передавать данные с помощью вашей платы Raspberry Pi, управлять вашими радио-розетками (433МГц) или получать информацию от вашей портативной погодной станции за окном?Но у вас нет желания разогревать вашу паяльную станцию и паять подобное решение самостоятельно. Вы хотите иметь элегантное и профессиональное решение европейского качества?
Если - да, то тогда вы в правильном месте!
Наш новый модуль Pi433 позволит вам в мгновение ока расширить функционал вашей Raspberry Pi приемо-передатчиком работающим на частоте 433 МГц. Pi433 удобно и легко устанавливается на разъёмы общего назначения вашей Raspberry.
Он настолько компактен, что помещается практически во все доступные корпуса для Raspberry Pi.
Pi433 оборудован встроенной в печатную плату антенной, технические характеристики которой достаточны для большинства вариантов использования. Так же в модуле есть возможность подсоединения внешней антенны через U.FL разъём, что позволяет применять Pi433 в ещё более широком спектре технических решений.
Данный модуль открывает огромный простор для использования беспроводной коммуникации с вашей Raspberry Pi. Вы можете обмениваться беспроводной информацией, как между двумя Raspberry Pi, так и с другими устройствами работающими на 433МГц. Например радиоуправляемыми розетками, датчиками температуры, оконными ролетами и т.д.
Карта сайта
Особенности Pi433Техническая информация
Установка Pi433
Управление Pi433
Приобретение Pi433
Контактные данные
Особенности Pi433
- устанавливается на все вариатны серии плат Raspberry Pi (Pi zero требует дополнительной установки разъёма)
- возможно установить на множество других устройств имеющих совместимый разъём (GPIO)(Banana Pi, Orange Pi, ...)
- требует всего 10 пинов, все остальные могут быть исспользованы по вашему усмотрению
- поддерживает, как прием, так и передачу данных
- поддерживает несколько режимов модуляции сигнала (FSK, MSK, OOK)
- поддерживает подстраиваемую частоту 433 МГц в ISM диапазоне (433,05...434,79MHz)
- поддерживает режим FIFO, который позволяет сперва загрузить данные, а потом их передавать, без участия Raspberry Pi (нет необходимости делать pin toggeling)
- так же имеет другие возможности ( например: генерация и обнаружение преамбулы, фильтр адресов, AES, CRC)
- поддерживает подключение внешней антенны через U.FL разъём
- Linux kernel driver интегрированный в официальное дерево, начиная с Linux kernel 4.14
- cертификат CE
Техническая информация
Pi433 оснащен приемо-передатчиком RFM69 от фирмы HopeRf. Документация используемого модуля доступна в интернете, например здесь. Технические характеристики RFM69 практически полностью поддреживаются Pi433:- +13 дБм мощность выхода
- Высокая чуствительность: до -120 дБм на 1.2 Кб/с
- Высокая избирательность: 16-tap FIR фильтр канала
- Программируемая Pout: -18дБм to +13 дБм с шагом 1дБм
- Пропусканя способность FSK до 300 Кб/с
- Полностью интегрированный синтезатор с разрешением 61 Гц
- FSK, GFSK, MSK, GMSK и OOK модуляции
- Встроенный синхронизатор битов выполняющий восстановление синхросигнала
- Распознавание входного синхронизационного слова
- 115 дБ+ динамический диапазон RSSI
- Автоматический детектирование RF Sense с ультра-быстрым AFC
- Пакетный препроцессор с CRC-16, AES-128, 66-byte FIFO
- Встроенный температурный сенсор
| модуль | Raspberry Pi |
|---|---|
| DIO0 | GPIO24 |
| DIO1 | GPIO25 |
| DIO2 | GPIO7 |
Установка Pi433
Pi433 может быть установлена в GPIO разъём Raspberry Pi.На Raspberry Pi второго и третьего поколений, а так же в модели B+, Pi433 устанавливается в середине GPIO разъёма. Правильное положение - семь двойных пинов со стороны сетевого разъёма, с другой стороны восемь.
На первом поколении Raspberry Pi модуль устанавливается с краю разъёма GPIO со стороны разъёма RCA (video out).
Управление Pi433
Pi433 управляется через SPI интерфейс.Детальное описание регистров и вариантов работы можно найти в документации модуля RFM69CW.
Ниже вы найдете два примера, которые демонстрируют идею работы с Pi433 через SPI интерфейс. Первый пример реализует простой передатчик, который передает телеграмму длиной в 16 байт, каждый раз по нажатию кнопки. Второй пример демонстрирует приемник этой телеграммы. Эти два примера используют несколько дополнительных функций предоставляемых модулем RFM69 для проверки ошибок передачи: генерация/обнаружение преамбулы, генерация синхро-слова и CRC.
/*
* Pi433 tx demo
*
* Copyright (c) 2017 Marcus Wolf <marcus.wolf@wolf-entwicklungen.de>
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation; either version 2 of
* the License.
*
*/
#include <stdint.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <linux/types.h>
#include <linux/spi/spidev.h>
#define ARRAY_SIZE(a) (sizeof(a) / sizeof((a)[0]))
#define PAYLOAD_LEN 16
static void pabort(const char *s)
{
perror(s);
abort();
}
static uint8_t bits = 8;
static uint32_t speed = 500000;
static uint16_t delay = 0;
static int setupRFParameters(int fd)
{
int i, ret;
uint8_t tx[] = {
/* attention - do not modify this parameters */
unless you know what you do.
Wrong settings may violate yapplicable law */
0x81,0x04, // set standby mode (just for safety)
0x82,0x08, // OOK, packet, no shaping
0x91,0x9f, // set up power amps
0x98,0x08, // antenna impedance (default: 50Ohm)
0x87,0x6c, // frequency
0x88,0x7a, // frequency
0x89,0xe1, // frequency
0x83,0x1a, // bit rate
0x84,0x0a, // bit rate
0x85,0x00, // deviation (FSK only)
0x86,0x45, // deviation (FSK only)
0x92,0x09, // pa ramp (default: 40µs)
};
for (i = 0; i < ARRAY_SIZE(tx); i+=2)
{
struct spi_ioc_transfer tr =
{
.tx_buf = (int)tx+i,
.rx_buf = 0,
.len = 2,
.delay_usecs = delay,
.speed_hz = speed,
.bits_per_word = bits,
};
ret = ioctl(fd, SPI_IOC_MESSAGE(1), &tr);
if (ret < 1)
pabort("can't send spi message to \
setup RF parameters");
}
printf("RF parameters set up\n");
}
static int setupMessageParameters(int fd)
{
int i, ret;
uint8_t tx[] = {
0xBC,0x80, // startup condition (fifo not empty)
0xB8,PAYLOAD_LEN, // payload length
0xAC,0x00, // preamble size
0xAD,0x0a, // preamble size
0xB7,0x10, // fixed length, CRC on, no adress filtering
0xAE,0x98, // sync pattern on, 3 bytes
0xAF,0x01, // 1st sync byte
0xB0,0x02, // 2nd sync byte
0xB1,0x03, // 3rd sync byte
};
for (i = 0; i < ARRAY_SIZE(tx); i+=2)
{
struct spi_ioc_transfer tr =
{
.tx_buf = (int)tx+i,
.rx_buf = 0,
.len = 2,
.delay_usecs = delay,
.speed_hz = speed,
.bits_per_word = bits,
};
ret = ioctl(fd, SPI_IOC_MESSAGE(1), &tr);
if (ret < 1)
pabort("can't send spi message to setup \
message parameters");
}
printf("message parameters set up\n");
}
static int transferData(int fd, unsigned int packetNr)
{
int i, ret;
uint8_t tx[] = {
0x81,0x04, // stop transmission (in case stil active)
/* load fifo */
0x80,(packetNr & 0xff00) >> 8,
0x80,packetNr & 0xff,
0x80,0xAA,
0x80,0x55,
0x80,0x88,
0x80,0x88,
0x80,0x88,
0x80,0x88,
0x80,0x88,
0x80,0x8E,
0x80,0x8E,
0x80,0x88,
0x80,0x8E,
0x80,0x8E,
0x80,0x47,
0x80,0x11,
0x81,0x0c, // start transmission
};
for (i = 0; i < ARRAY_SIZE(tx); i+=2)
{
struct spi_ioc_transfer tr =
{
.tx_buf = (int)tx+i,
.rx_buf = 0,
.len = 2,
.delay_usecs = delay,
.speed_hz = speed,
.bits_per_word = bits,
};
ret = ioctl(fd, SPI_IOC_MESSAGE(1), &tr);
if (ret < 1)
pabort("can't send spi message \
to trasmit data");
}
printf("Transmission started\n");
}
int main(int argc, char *argv[])
{
int i;
int fd;
int packetNr = 0;
printf("*** Pi433 TX demo by Marcus Wolf ***\n");
printf("Press enter to send further telegrams.\n");
printf("Enter 'q' to quit\n\n");
/* open and configure SPI interface */
fd = open("/dev/spidev0.0", O_RDWR);
if (fd < 0)
pabort("can't open spi. Maybe you need to enable \
spi by calling \"raspi-config\"");
setupRFParameters(fd);
setupMessageParameters(fd);
do
{
transferData(fd,packetNr++);
sleep(1); // wait for transmission to complete
} while(getchar() != 'q');
close(fd);
return 0;
}
/*
* Pi433 rx demo
*
* Copyright (c) 2017 Marcus Wolf <marcus.wolf@wolf-entwicklungen.de>
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation; either version 2 of
* the License.
*
*/
#include <string.h>
#include <stdint.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <linux/types.h>
#include <linux/spi/spidev.h>
#define ARRAY_SIZE(a) (sizeof(a) / sizeof((a)[0]))
#define PAYLOAD_LEN 16
static void pabort(const char *s)
{
perror(s);
abort();
}
static uint8_t bits = 8;
static uint32_t speed = 500000;
static uint16_t delay = 0;
static int setupRFParameters(int fd)
{
int i, ret;
uint8_t tx[] = {
/* attention - do not modify this parameters */
unless you know what you do.
Wrong settings may violate yapplicable law */
0x81,0x04, // set standby mode (just for safety)
0x82,0x08, // OOK, packet, no shaping
0x91,0x9f, // set up power amps
0x98,0x08, // antenna impedance (default: 50Ohm)
0x87,0x6c, // frequency
0x88,0x7a, // frequency
0x89,0xe1, // frequency
0x83,0x1a, // bit rate
0x84,0x0a, // bit rate
0x85,0x00, // deviation (FSK only)
0x86,0x45, // deviation (FSK only)
0xA9,0x90, // RSSI threshold
0x9B,0x43, // OOK threshold
0x99,0x90, // bandwidth configuration
0x9A,0x90, // bandwidth configuration
0xEF,0x00, // continuous Dagc in normal mode
};
for (i = 0; i < ARRAY_SIZE(tx); i+=2)
{
struct spi_ioc_transfer tr =
{
.tx_buf = (int)tx+i,
.rx_buf = 0,
.len = 2,
.delay_usecs = delay,
.speed_hz = speed,
.bits_per_word = bits,
};
ret = ioctl(fd, SPI_IOC_MESSAGE(1), &tr);
if (ret < 1)
pabort("can't send spi message \
to setup RF parameters");
}
printf("RF parameters set up\n");
}
static int setupMessageParameters(int fd)
{
int i, ret;
uint8_t tx[] = {
0xBC,0x80, // startup condition (fifo not empty)
0xB8,PAYLOAD_LEN, // payload length
0xAC,0x00, // preamble size
0xAD,0x0a, // preamble size
0xB7,0x10, // fixed length, CRC on, no adress filtering
0xAE,0x98, // sync pattern on, 3 bytes
0xAF,0x01, // 1st sync byte
0xB0,0x02, // 2nd sync byte
0xB1,0x03, // 3rd sync byte
};
for (i = 0; i < ARRAY_SIZE(tx); i+=2)
{
struct spi_ioc_transfer tr =
{
.tx_buf = (int)tx+i,
.rx_buf = 0,
.len = 2,
.delay_usecs = delay,
.speed_hz = speed,
.bits_per_word = bits,
};
ret = ioctl(fd, SPI_IOC_MESSAGE(1), &tr);
if (ret < 1)
pabort("can't send spi message to \
setup message parameters");
}
printf("message parameters set up\n");
}
static int receiveData(int fd)
{
int i, ret;
struct spi_ioc_transfer tr;
struct data_struct {
uint8_t reg;
uint8_t value;
};
union data_union {
struct data_struct strct;
uint8_t array[2];
} data;
uint8_t rx[66];
int messageLen;
/* prepare tr struct */
memset(&tr, 0, sizeof(tr));
tr.tx_buf = (int)data.array;
tr.rx_buf = (int)rx;
tr.len = 2;
tr.delay_usecs = delay;
tr.speed_hz = speed;
tr.bits_per_word = bits;
/* start reception */
data.strct.reg = 0x81; data.strct.value = 0x10;
ret = ioctl(fd, SPI_IOC_MESSAGE(1), &tr);
if (ret < 1)
pabort("can't send spi message to \
start reception\n");
/* wait for CRC ok */
rx[1]=0x00;
while( (rx[1] & 0x02) == 0 )
{
data.strct.reg = 0x28; data.strct.value = 0;
ret = ioctl(fd, SPI_IOC_MESSAGE(1), &tr);
if (ret < 1)
pabort("can't send spi message to \
read flag register\n");
}
/* read fifo */
data.strct.reg = 0x00; data.strct.value = 0;
for (i = 0; i < ARRAY_SIZE(rx); i+=2)
{
tr.rx_buf = (int)rx+i;
ret = ioctl(fd, SPI_IOC_MESSAGE(1), &tr);
if (ret < 1)
pabort("can't send spi message to read fifo");
}
/* set standby mode */
data.strct.reg = 0x81; data.strct.value = 0x04;
ret = ioctl(fd, SPI_IOC_MESSAGE(1), &tr);
if (ret < 1)
pabort("can't send spi message to switch to standby\n");
/* every second value in buffer contains a valid value */
for (i = 0; i < PAYLOAD_LEN*2; i+=2)
{
printf("0x%x ",rx[i+1]);
}
printf("\n");
}
int main(int argc, char *argv[])
{
int i;
int fd;
int packetNr = 0;
printf("*** Pi433 RX demo by Marcus Wolf ***\n");
/* open and configure SPI interface */
fd = open("/dev/spidev0.0", O_RDWR);
if (fd < 0)
pabort("can't open spi. Maybe you need to enable \
spi by calling \"raspi-config\"");
setupRFParameters(fd);
setupMessageParameters(fd);
/* receive */
printf("entering endless loop to receive telegrams\n");
while (1)
receiveData(fd);
/* these lines will never be reaced */
close(fd);
return 0;
}
Загрузить пример кода передатчика.
Загрузить пример кода приемника.
Следующий пример демонстрирует механизм контроля радиоуправляемой розетки. Пример написан для розеток с чипсетом PT2262 (или совместимых, например HX2262 и SC5272). Для управления другими типами розеток необходимо будет внести изменение в код. Текущий пример оптимизирован для работы с розетками PFS-3 от Pollin electronics.
/*
* Pi433 socket demo (for sockets with PT2262 or compatible)
*
* Copyright (c) 2017 Marcus Wolf <marcus.wolf@wolf-entwicklungen.de>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License.
*
*/
#include <stdint.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <linux/types.h>
#include <linux/spi/spidev.h>
#define ARRAY_SIZE(a) (sizeof(a) / sizeof((a)[0]))
#define REPETITIONS 4
#define PAYLOAD_LEN 32*REPETITIONS
static void pabort(const char *s)
{
perror(s);
abort();
}
static uint8_t bits = 8;
static uint32_t speed = 500000;
static uint16_t delay = 0;
static uint8_t tx[PAYLOAD_LEN + 4];
static int setupRFParameters(int fd)
{
int i, ret;
uint8_t tx[] = {
/* attention - do not modify this parameters unless you */
/* know what you do */
/* wrong settings may lead to violation of law */
0x81,0x04, // set standby mode (just for safety)
0x82,0x08, // OOK, packet, no shaping
0x91,0x9f, // set up power amps
0x98,0x08, // antenna impedance (default: 50Ohm)
0x87,0x6c, // frequency
0x88,0x7a, // frequency
0x89,0xe1, // frequency
0x83,0x25, // bit rate
0x84,0xe0, // bit rate
0x92,0x09, // pa ramp (default: 40µs)
};
for (i = 0; i %lt; ARRAY_SIZE(tx); i+=2)
{
struct spi_ioc_transfer tr =
{
.tx_buf = (int)tx+i,
.rx_buf = 0,
.len = 2,
.delay_usecs = delay,
.speed_hz = speed,
.bits_per_word = bits,
};
ret = ioctl(fd, SPI_IOC_MESSAGE(1), &tr);
if (ret < 1)
pabort("can't send spi message");
}
printf("RF parameter set up\n");
}
static int setupMessageParameters(int fd)
{
int i, ret;
uint8_t tx[] = {
0xBC,0x80, // startup condition: fifo not empty
0xB8,PAYLOAD_LEN, // payload length
0xAC,0x00, // preamble size
0xAD,0x00, // preamble size
0xB7,0x10, // fixed length, CRC off, no adress filtering
0xAE,0x80, // sync pattern config: off
};
for (i = 0; i < ARRAY_SIZE(tx); i+=2)
{
struct spi_ioc_transfer tr =
{
.tx_buf = (int)tx+i,
.rx_buf = 0,
.len = 2,
.delay_usecs = delay,
.speed_hz = speed,
.bits_per_word = bits,
};
ret = ioctl(fd, SPI_IOC_MESSAGE(1), &tr);
if (ret < 1)
pabort("can't send spi message");
}
printf("message parameter set up\n");
}
static int prepareTxDataOn(void)
{
int i;
/* stop transmission (in case stil active) */
tx[0] = 0x81; tx[1] = 0x04;
/* load fifo */
for (i=0; i < REPETITIONS; i++)
{
/* This dataset is intended to control sockets
equipped with a PT2262 chip or comparable.
The second column contains the data.
0x88 = on, 0x8E = high-z.
Sockets of different companies use different
wiring on the PT chip. So maybe you need to tune.
Left comments shows most commen combination */
tx[32*i+ 2] = 0x80; tx[32*i+ 3] = 0x88; // 1 // 8
tx[32*i+ 4] = 0x80; tx[32*i+ 5] = 0x88; // 2 // 7
tx[32*i+ 6] = 0x80; tx[32*i+ 7] = 0x88; // 3 // 6
tx[32*i+ 8] = 0x80; tx[32*i+ 9] = 0x88; // 4 // 5
tx[32*i+10] = 0x80; tx[32*i+11] = 0x88; // 5 // open
tx[32*i+12] = 0x80; tx[32*i+13] = 0x8E; // 6 // open
tx[32*i+14] = 0x80; tx[32*i+15] = 0x8E; // A // GND
tx[32*i+16] = 0x80; tx[32*i+17] = 0x88; // B // GND
tx[32*i+18] = 0x80; tx[32*i+19] = 0x8E; // C // Teste 1
tx[32*i+20] = 0x80; tx[32*i+21] = 0x8E; // D // Teste 2
tx[32*i+22] = 0x80; tx[32*i+23] = 0x88; // L // Taste 4?
tx[32*i+24] = 0x80; tx[32*i+25] = 0x8E; // R // Taste 2
tx[32*i+26] = 0x80; tx[32*i+27] = 0x80; // S1 // S1
tx[32*i+28] = 0x80; tx[32*i+29] = 0x00; // S2 // S2
tx[32*i+30] = 0x80; tx[32*i+31] = 0x00; // S3 // S3
tx[32*i+32] = 0x80; tx[32*i+33] = 0x00; // S4 // S4
}
/* start transmission */
tx[32*i+0] = 0x81; tx[32*i+1] = 0x0c;
}
static int prepareTxDataOff(void)
{
int i;
/* stop transmission (in case stil active) */
tx[0] = 0x81; tx[1] = 0x04;
/* load fifo */
for (i=0; i < REPETITIONS; i++)
{
/* This dataset is intended to control sockets
equipped with a PT2262 chip or comparable.
The second column contains the data.
0x88 = on, 0x8E = high-z.
Sockets of different companies use different
wiring on the PT chip. So maybe you need to tune.
Left comments shows most commen combination */
tx[32*i+ 2] = 0x80; tx[32*i+ 3] = 0x88; // 1 // 8
tx[32*i+ 4] = 0x80; tx[32*i+ 5] = 0x88; // 2 // 7
tx[32*i+ 6] = 0x80; tx[32*i+ 7] = 0x88; // 3 // 6
tx[32*i+ 8] = 0x80; tx[32*i+ 9] = 0x88; // 4 // 5
tx[32*i+10] = 0x80; tx[32*i+11] = 0x88; // 5 // open
tx[32*i+12] = 0x80; tx[32*i+13] = 0x8E; // 6 // open
tx[32*i+14] = 0x80; tx[32*i+15] = 0x8E; // A // GND
tx[32*i+16] = 0x80; tx[32*i+17] = 0x88; // B // GND
tx[32*i+18] = 0x80; tx[32*i+19] = 0x8E; // C // button 1
tx[32*i+20] = 0x80; tx[32*i+21] = 0x8E; // D // button 3
tx[32*i+22] = 0x80; tx[32*i+23] = 0x8E; // left button // button 4
tx[32*i+24] = 0x80; tx[32*i+25] = 0x88; // right button // button 2
tx[32*i+26] = 0x80; tx[32*i+27] = 0x80; // sync 1 // sync 1
tx[32*i+28] = 0x80; tx[32*i+29] = 0x00; // sync 2 // sync 2
tx[32*i+30] = 0x80; tx[32*i+31] = 0x00; // sync 3 // sync 3
tx[32*i+32] = 0x80; tx[32*i+33] = 0x00; // sync 4 // sync 4
}
/* start transmission */
tx[32*i+0] = 0x81; tx[32*i+1] = 0x0c;
}
static int transferData(int fd, unsigned int packetNr)
{
int i,ret;
for (i = 0; i < ARRAY_SIZE(tx); i+=2)
{
struct spi_ioc_transfer tr =
{
.tx_buf = (int)tx+i,
.rx_buf = 0,
.len = 2,
.delay_usecs = delay,
.speed_hz = speed,
.bits_per_word = bits,
};
ret = ioctl(fd, SPI_IOC_MESSAGE(1), &tr);
if (ret < 1)
pabort("can't send spi message");
}
}
int main(int argc, char *argv[])
{
int i;
int fd;
int packetNr = 0;
printf("*** Pi433 socket demo by Marcus Wolf ***\n");
/* open and configure SPI interface */
fd = open("/dev/spidev0.0", O_RDWR);
if (fd < 0)
pabort("can't open spi");
setupRFParameters(fd);
setupMessageParameters(fd);
printf("\nPress enter to toggle state of the socket.\n");
printf("^C to quit\n");
while(1)
{
sleep(1); // wait a sec for transmission to complete
getchar();
printf("On\n");
prepareTxDataOn();
transferData(fd,packetNr++);
sleep(1); // wait a sec for transmission to complete
getchar();
printf("Off\n");
prepareTxDataOff();
transferData(fd,packetNr++);
}
close(fd);
return 0;
}
Как альтернативный способ управления Pi433 через SPI интерфейс можно использовать драйвер Linux. На данный момент в разработке. Драйвер предоставит следующие возможности:
- удобное использование функций (open, read, write, close)
- де-факто непрерывную приемо-передачу
- доступ к Pi433 из нескольких приложений
- использование произвольной длины телеграмм
- легкое конфигурирование всех важных настроек модуля RFM69
Приобретение Pi433
Из-за правил утилизации (WEEE guideline of EU) Smarthome-Wolf принято решение о приостановке прямых продаж Pi433.
Бизнес партнёры (например: Онлайн магазины для продажи Raspberry-Pi и сопутствующих аксессуаров), которых интересует распространение Pi433 приглашаются к сотрудничеству.
Мы открыты к любым предложениям по сотрудничеству, как в Европе, так и за её пределами!
Pi433 - это продукт бренда Smarthome-Pi
Контактная информация
Smarthome-Wolf UG (haftungsbeschränkt)Helene-Lange-Weg 23
80637 München
Адрес электронной почты защищён от спам-ботов! Для просмотра необходимо разрешить исполнение JavaScript информация
© Smarthome-Wolf UG (haftungsbeschränkt)



